diff --git a/src/Fable.Cli/CHANGELOG.md b/src/Fable.Cli/CHANGELOG.md index 4f7d2f0573..4e8a827252 100644 --- a/src/Fable.Cli/CHANGELOG.md +++ b/src/Fable.Cli/CHANGELOG.md @@ -7,17 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## 5.0.0-alpha.2 - 2024-11-25 + +### Fixed + +* [All] Allow Fable 5 to be used with Fable 4 plugins (@ncave) + ## 5.0.0-alpha.1 - 2024-11-24 ### Added -* [All] Add `--legacyCracker` as a fallback +* [All] Add `--legacyCracker` as a fallback (@MangelMaxime) ### Changed -* [All] Make MSBuildCracker the default -* [All] Replace `FABLE_COMPILER_4` with `FABLE_COMPILER_5` as the compiler directive -* [All] Move TargetFramework to `net8.0` +* [All] Make MSBuildCracker the default (@MangelMaxime) +* [All] Replace `FABLE_COMPILER_4` with `FABLE_COMPILER_5` as the compiler directive (@MangelMaxime) +* [All] Move TargetFramework to `net8.0` (@ncave) ## 4.24.0 - 2024-11-19 diff --git a/src/Fable.Cli/Fable.Cli.fsproj b/src/Fable.Cli/Fable.Cli.fsproj index 9c1bc21337..5b04674224 100644 --- a/src/Fable.Cli/Fable.Cli.fsproj +++ b/src/Fable.Cli/Fable.Cli.fsproj @@ -4,16 +4,10 @@ true Exe net8.0 - 5.0.0-alpha.1 - ## Added + 5.0.0-alpha.2 + ## Fixed -- [All] Add `--legacyCracker` as a fallback - -## Changed - -- [All] Make MSBuildCracker the default -- [All] Replace `FABLE_COMPILER_4` with `FABLE_COMPILER_5` as the compiler directive -- [All] Move TargetFramework to `net8.0` +- [All] Allow Fable 5 to be used with Fable 4 plugins (@ncave) diff --git a/src/Fable.Compiler/CHANGELOG.md b/src/Fable.Compiler/CHANGELOG.md index 66bfe68a39..2d73446e0e 100644 --- a/src/Fable.Compiler/CHANGELOG.md +++ b/src/Fable.Compiler/CHANGELOG.md @@ -7,17 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## 5.0.0-alpha.2 - 2024-11-25 + +### Fixed + +* [All] Allow Fable 5 to be used with Fable 4 plugins (@ncave) + ## 5.0.0-alpha.1 - 2024-11-24 ### Added -* [All] Add `--legacyCracker` as a fallback +* [All] Add `--legacyCracker` as a fallback (@MangelMaxime) ### Changed -* [All] Make MSBuildCracker the default -* [All] Replace `FABLE_COMPILER_4` with `FABLE_COMPILER_5` as the compiler directive -* [All] Move TargetFramework to `net8.0` +* [All] Make MSBuildCracker the default (@MangelMaxime) +* [All] Replace `FABLE_COMPILER_4` with `FABLE_COMPILER_5` as the compiler directive (@MangelMaxime) +* [All] Move TargetFramework to `net8.0` (@ncave) ## 4.0.0-alpha-016 - 2024-11-19 diff --git a/src/Fable.Compiler/Fable.Compiler.fsproj b/src/Fable.Compiler/Fable.Compiler.fsproj index e8d9f60a01..99b6e30c91 100644 --- a/src/Fable.Compiler/Fable.Compiler.fsproj +++ b/src/Fable.Compiler/Fable.Compiler.fsproj @@ -6,16 +6,10 @@ true true Fable.Compiler - 5.0.0-alpha.1 - ## Added + 5.0.0-alpha.2 + ## Fixed -- [All] Add `--legacyCracker` as a fallback - -## Changed - -- [All] Make MSBuildCracker the default -- [All] Replace `FABLE_COMPILER_4` with `FABLE_COMPILER_5` as the compiler directive -- [All] Move TargetFramework to `net8.0` +- [All] Allow Fable 5 to be used with Fable 4 plugins (@ncave) embedded diff --git a/src/Fable.Transforms/Global/Compiler.fs b/src/Fable.Transforms/Global/Compiler.fs index 0a9fe91190..1bfc864114 100644 --- a/src/Fable.Transforms/Global/Compiler.fs +++ b/src/Fable.Transforms/Global/Compiler.fs @@ -2,7 +2,7 @@ namespace Fable module Literals = [] - let VERSION = "5.0.0-alpha.1" + let VERSION = "5.0.0-alpha.2" [] let JS_LIBRARY_VERSION = "1.7.0" diff --git a/src/fcs-fable/FSStrings.fs b/src/fcs-fable/FSStrings.fs index 42257eecac..594983da6a 100644 --- a/src/fcs-fable/FSStrings.fs +++ b/src/fcs-fable/FSStrings.fs @@ -14,6 +14,18 @@ let resources = ( "ConstraintSolverMissingConstraint", "A type parameter is missing a constraint '{0}'" ); + ( "ConstraintSolverNullnessWarningEquivWithTypes", + "Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability." + ); + ( "ConstraintSolverNullnessWarningWithTypes", + "Nullness warning: The types '{0}' and '{1}' do not have compatible nullability." + ); + ( "ConstraintSolverNullnessWarningWithType", + "Nullness warning: The type '{0}' does not support 'null'." + ); + ( "ConstraintSolverNullnessWarning", + "Nullness warning: {0}." + ); ( "ConstraintSolverTypesNotInEqualityRelation1", "The unit of measure '{0}' does not match the unit of measure '{1}'" ); @@ -69,7 +81,7 @@ let resources = "Duplicate definition of {0} '{1}'" ); ( "NameClash2", - "The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module" + "The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module" ); ( "Duplicate1", "Two members called '{0}' have the same signature" @@ -105,7 +117,7 @@ let resources = "A coercion from the value type \n {0} \nto the type \n {1} \nwill involve boxing. Consider using 'box' instead" ); ( "TypeIsImplicitlyAbstract", - "This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[]' attribute to your type." + "Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[]' attribute to your type." ); ( "NonRigidTypar1", "This construct causes code to be less generic than indicated by its type annotations. The type variable implied by the use of a '#', '_' or other type annotation at or near '{0}' has been constrained to be type '{1}'." @@ -299,6 +311,9 @@ let resources = ( "Parser.TOKEN.BAR.RBRACE", "symbol '|}'" ); + ( "Parser.TOKEN.BAR_JUST_BEFORE_NULL", + "symbol '|' (directly before 'null')" + ); ( "Parser.TOKEN.GREATER.RBRACE", "symbol '>}'" ); @@ -914,20 +929,11 @@ let resources = ( "MissingFields", "The following fields require values: {0}" ); - ( "ValueRestriction1", - "Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation." + ( "ValueRestrictionFunction", + """Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results.""" ); - ( "ValueRestriction2", - "Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation." - ); - ( "ValueRestriction3", - "Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved." - ); - ( "ValueRestriction4", - "Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation." - ); - ( "ValueRestriction5", - "Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation." + ( "ValueRestriction", + """Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results.""" ); ( "RecoverableParseError", "syntax error" @@ -945,7 +951,7 @@ let resources = "Override implementations should be given as part of the initial declaration of a type." ); ( "IntfImplInIntrinsicAugmentation", - "Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn \"69\" if you have checked this is not the case." + "Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn \"69\"' if you have checked this is not the case." ); ( "IntfImplInExtrinsicAugmentation", "Interface implementations should be given on the initial declaration of a type." @@ -957,10 +963,10 @@ let resources = "The type referenced through '{0}' is defined in an assembly that is not referenced. You must add a reference to assembly '{1}'." ); ( "HashIncludeNotAllowedInNonScript", - "#I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'." + "#I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'." ); ( "HashReferenceNotAllowedInNonScript", - "#r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'." + "#r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'." ); ( "HashDirectiveNotAllowedInNonScript", "This directive may only be used in F# script files (extensions .fsx or .fsscript). Either remove the directive, move this code to a script file or delimit the directive with '#if INTERACTIVE'/'#endif'." @@ -1007,6 +1013,9 @@ let resources = ( "ArgumentsInSigAndImplMismatch", "The argument names in the signature '{0}' and implementation '{1}' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling." ); + ( "DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer", + "The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3}" + ); ( "Parser.TOKEN.WHILE.BANG", "keyword 'while!'" ); diff --git a/src/fcs-fable/SR.fs b/src/fcs-fable/SR.fs index 39ca804f11..7d7cc160f4 100644 --- a/src/fcs-fable/SR.fs +++ b/src/fcs-fable/SR.fs @@ -5,11 +5,18 @@ namespace FSharp.Compiler module SR = - let GetString(name: string) = + let GetString (name: string) = match SR.Resources.resources.TryGetValue(name) with | true, value -> value | _ -> "Missing FSStrings error message for: " + name +module FSComp = + module SR = + let GetTextOpt (name: string) = + match SR.Resources.resources.TryGetValue(name) with + | true, value -> Some value + | _ -> None + module DiagnosticMessage = type ResourceString<'T>(sfmt: string, fmt: string) = member x.Format = diff --git a/src/fcs-fable/System.Collections.fs b/src/fcs-fable/System.Collections.fs index 5da3b027d9..080da974a3 100644 --- a/src/fcs-fable/System.Collections.fs +++ b/src/fcs-fable/System.Collections.fs @@ -7,15 +7,19 @@ namespace System.Collections module Immutable = open System.Collections.Generic - // not immutable, just a ResizeArray // TODO: immutable implementation - type ImmutableArray<'T> = - static member CreateBuilder() = ResizeArray<'T>() + // not immutable, just an Array // TODO: immutable implementation + type ImmutableArray<'T> = 'T array + + module ImmutableArray = + let CreateBuilder<'T>() = ResizeArray<'T>() + let Create<'T>(items: 'T[], start: int, length: int) = + items[start..(start + length - 1)] [] type ImmutableHashSet<'T when 'T: equality>(values: 'T seq) = let xs = HashSet<'T>(values) - static member Create<'T>(values) = ImmutableHashSet<'T>(values) + static member Create<'T>(values: 'T seq) = ImmutableHashSet<'T>(values) static member Empty = ImmutableHashSet<'T>(Array.empty) member _.Add (value: 'T) = @@ -187,3 +191,36 @@ module Concurrent = interface System.Collections.IEnumerable with member _.GetEnumerator() = (xs.GetEnumerator() :> System.Collections.IEnumerator) + + interface ICollection> with + member _.Add(item: KeyValuePair<'K, 'V>) : unit = + (xs :> ICollection<_>).Add(item) + + member _.Clear() : unit = (xs :> ICollection<_>).Clear() + + member _.Contains(item: KeyValuePair<'K, 'V>) : bool = + (xs :> ICollection<_>).Contains(item) + + member _.CopyTo(array: KeyValuePair<'K, 'V>[], arrayIndex: int) : unit = + (xs :> ICollection<_>).CopyTo(array, arrayIndex) + + member _.Count: int = (xs :> ICollection<_>).Count + member _.IsReadOnly: bool = (xs :> ICollection<_>).IsReadOnly + + member _.Remove(item: KeyValuePair<'K, 'V>) : bool = + (xs :> ICollection<_>).Remove(item) + + interface IDictionary<'K, 'V> with + member _.Add(key: 'K, value: 'V) = xs.Add(key, value) + member _.ContainsKey(key: 'K) = xs.ContainsKey(key) + + member _.Item + with get (key: 'K): 'V = xs.[key] + and set (key: 'K) (v: 'V): unit = xs.[key] <- v + + member _.TryGetValue(key: 'K, value: byref<'V>) = + xs.TryGetValue(key, &value) + + member _.Remove(key: 'K) = xs.Remove(key) + member _.Keys = xs.Keys + member _.Values = xs.Values diff --git a/src/fcs-fable/TcImports_shim.fs b/src/fcs-fable/TcImports_shim.fs index b3eda77d9a..cddf4c5c62 100644 --- a/src/fcs-fable/TcImports_shim.fs +++ b/src/fcs-fable/TcImports_shim.fs @@ -45,16 +45,14 @@ module TcImports = let tcImports = TcImports () let sigDataReaders ilModule = - [ for resource in ilModule.Resources.AsList() do - if IsSignatureDataResource resource then - let _ccuName, getBytes = GetResourceNameAndSignatureDataFunc resource - getBytes() ] + ilModule.Resources.AsList() + |> GetResourceNameAndSignatureDataFuncs + |> List.map snd let optDataReaders ilModule = - [ for resource in ilModule.Resources.AsList() do - if IsOptimizationDataResource resource then - let _ccuName, getBytes = GetResourceNameAndOptimizationDataFunc resource - getBytes() ] + ilModule.Resources.AsList() + |> GetResourceNameAndOptimizationDataFuncs + |> List.map snd let LoadMod (ccuName: string) = let fileName = @@ -71,11 +69,25 @@ module TcImports = let reader = ILBinaryReader.OpenILModuleReaderFromBytes fileName bytes opts reader.ILModuleDef //, reader.ILAssemblyRefs - let GetSignatureData (fileName:string, ilScopeRef, ilModule:ILModuleDef option, bytes: ReadOnlyByteMemory) = - unpickleObjWithDanglingCcus fileName ilScopeRef ilModule unpickleCcuInfo bytes + let GetSignatureData (file, ilScopeRef, ilModule, byteReaderA, byteReaderB) : PickledDataWithReferences = + let memA = byteReaderA () - let GetOptimizationData (fileName:string, ilScopeRef, ilModule:ILModuleDef option, bytes: ReadOnlyByteMemory) = - unpickleObjWithDanglingCcus fileName ilScopeRef ilModule Optimizer.u_CcuOptimizationInfo bytes + let memB = + (match byteReaderB with + | None -> ByteMemory.Empty.AsReadOnly() + | Some br -> br ()) + + unpickleObjWithDanglingCcus file ilScopeRef ilModule unpickleCcuInfo memA memB + + let GetOptimizationData (file:string, ilScopeRef, ilModule, byteReaderA, byteReaderB) = + let memA = byteReaderA () + + let memB = + (match byteReaderB with + | None -> ByteMemory.Empty.AsReadOnly() + | Some br -> br ()) + + unpickleObjWithDanglingCcus file ilScopeRef ilModule Optimizer.u_CcuOptimizationInfo memA memB let memoize_mod = new MemoizationTable<_,_> (LoadMod, keyComparer=HashIdentity.Structural) @@ -86,7 +98,7 @@ module TcImports = let fileName = ilModule.Name //TODO: try with ".sigdata" extension match sigDataReaders ilModule with | [] -> None - | bytes::_ -> Some (GetSignatureData (fileName, ilScopeRef, Some ilModule, bytes)) + | (readerA, readerB)::_ -> Some (GetSignatureData (fileName, ilScopeRef, Some ilModule, readerA, readerB)) let LoadOptData ccuName = let ilModule = memoize_mod.Apply ccuName @@ -95,7 +107,7 @@ module TcImports = let fileName = ilModule.Name //TODO: try with ".optdata" extension match optDataReaders ilModule with | [] -> None - | bytes::_ -> Some (GetOptimizationData (fileName, ilScopeRef, Some ilModule, bytes)) + | (readerA, readerB)::_ -> Some (GetOptimizationData (fileName, ilScopeRef, Some ilModule, readerA, readerB)) let memoize_sig = new MemoizationTable<_,_> (LoadSigData, keyComparer=HashIdentity.Structural) let memoize_opt = new MemoizationTable<_,_> (LoadOptData, keyComparer=HashIdentity.Structural) @@ -250,6 +262,7 @@ module TcImports = #endif None + let fslibCcu = fslibCcuInfo.FSharpViewOfMetadata let primaryScopeRef = primaryCcuInfo.ILScopeRef let fsharpCoreScopeRef = fslibCcuInfo.ILScopeRef let assembliesThatForwardToPrimaryAssembly = [] @@ -259,16 +272,19 @@ module TcImports = TcGlobals( tcConfig.compilingFSharpCore, ilGlobals, - fslibCcuInfo.FSharpViewOfMetadata, + fslibCcu, tcConfig.implicitIncludeDir, tcConfig.mlCompatibility, tcConfig.isInteractive, + tcConfig.checkNullness, tcConfig.useReflectionFreeCodeGen, tryFindSysTypeCcu, tcConfig.emitDebugInfoInQuotations, tcConfig.noDebugAttributes, tcConfig.pathMap, - tcConfig.langVersion + tcConfig.langVersion, + tcConfig.realsig, + tcConfig.compilationMode ) #if DEBUG diff --git a/src/fcs-fable/codegen/FSComp.fs b/src/fcs-fable/codegen/FSComp.fs index de38348d7c..8ccc32e84e 100644 --- a/src/fcs-fable/codegen/FSComp.fs +++ b/src/fcs-fable/codegen/FSComp.fs @@ -153,7 +153,6 @@ type internal SR private() = static member DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(a0 : System.String, a1 : System.String, a2 : System.String) = (315, sprintf "The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was required by the signature but was not specified by the implementation" a0 a1 a2) static member DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(a0 : System.String, a1 : System.String, a2 : System.String) = (316, sprintf "The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was present in the implementation but not in the signature" a0 a1 a2) static member DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (317, sprintf "The %s definitions for type '%s' in the signature and implementation are not compatible because the signature declares a %s while the implementation declares a %s" a0 a1 a2 a3) - static member DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (318, sprintf "The %s definitions for type '%s' in the signature and implementation are not compatible because the abbreviations differ: %s versus %s" a0 a1 a2 a3) static member DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig(a0 : System.String, a1 : System.String) = (319, sprintf "The %s definitions for type '%s' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature." a0 a1) static member DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation(a0 : System.String, a1 : System.String) = (320, sprintf "The %s definitions for type '%s' in the signature and implementation are not compatible because the signature has an abbreviation while the implementation does not" a0 a1) static member ModuleContainsConstructorButNamesDiffer(a0 : System.String, a1 : System.String) = (sprintf "The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe names differ" a0 a1) @@ -312,6 +311,7 @@ type internal SR private() = static member csExpectTypeWithOperatorButGivenTuple(a0 : System.String) = (sprintf "Expecting a type supporting the operator '%s' but given a tuple type" a0) static member csTypesDoNotSupportOperator(a0 : System.String, a1 : System.String) = (sprintf "None of the types '%s' support the operator '%s'" a0 a1) static member csTypeDoesNotSupportOperator(a0 : System.String, a1 : System.String) = (sprintf "The type '%s' does not support the operator '%s'" a0 a1) + static member csFunctionDoesNotSupportType(a0 : System.String, a1 : System.String, a2 : System.String) = (sprintf "'%s' does not support the type '%s', because the latter lacks the required (real or built-in) member '%s'" a0 a1 a2) static member csTypesDoNotSupportOperatorNullable(a0 : System.String, a1 : System.String) = (sprintf "None of the types '%s' support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'." a0 a1) static member csTypeDoesNotSupportOperatorNullable(a0 : System.String, a1 : System.String) = (sprintf "The type '%s' does not support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'." a0 a1) static member csTypeDoesNotSupportConversion(a0 : System.String, a1 : System.String) = (sprintf "The type '%s' does not support a conversion to the type '%s'" a0 a1) @@ -557,6 +557,7 @@ type internal SR private() = static member tcInvalidUnitsOfMeasurePrefix() = (706, sprintf "Units-of-measure cannot be used as prefix arguments to a type. Rewrite as postfix arguments in angle brackets." ) static member tcUnitsOfMeasureInvalidInTypeConstructor() = (707, sprintf "Unit-of-measure cannot be used in type constructor application" ) static member tcRequireBuilderMethod(a0 : System.String) = (708, sprintf "This control construct may only be used if the computation expression builder defines a '%s' method" a0) + static member tcEmptyBodyRequiresBuilderZeroMethod() = (708, sprintf "An empty body may only be used if the computation expression builder defines a 'Zero' method." ) static member tcTypeHasNoNestedTypes() = (709, sprintf "This type has no nested types" ) static member tcUnexpectedSymbolInTypeExpression(a0 : System.String) = (711, sprintf "Unexpected %s in type expression" a0) static member tcTypeParameterInvalidAsTypeConstructor() = (712, sprintf "Type parameter cannot be used as type constructor" ) @@ -674,7 +675,7 @@ type internal SR private() = static member tcAttributesAreNotPermittedOnLetBindings() = (824, sprintf "Attributes are not permitted on 'let' bindings in expressions" ) static member tcDefaultValueAttributeRequiresVal() = (825, sprintf "The 'DefaultValue' attribute may only be used on 'val' declarations" ) static member tcConditionalAttributeRequiresMembers() = (826, sprintf "The 'ConditionalAttribute' attribute may only be used on members" ) - static member tcInvalidActivePatternName() = (827, sprintf "This is not a valid name for an active pattern" ) + static member tcInvalidActivePatternName(a0 : System.String) = (827, sprintf "'%s' is not a valid method name. Use a 'let' binding instead." a0) static member tcEntryPointAttributeRequiresFunctionInModule() = (828, sprintf "The 'EntryPointAttribute' attribute may only be used on function definitions in modules" ) static member tcMutableValuesCannotBeInline() = (829, sprintf "Mutable values cannot be marked 'inline'" ) static member tcMutableValuesMayNotHaveGenericParameters() = (830, sprintf "Mutable values cannot have generic parameters" ) @@ -870,10 +871,11 @@ type internal SR private() = static member optsResource() = (sprintf "Embed the specified managed resource" ) static member optsLinkresource() = (sprintf "Link the specified resource to this assembly where the resinfo format is [,[,public|private]]" ) static member optsDebugPM() = (sprintf "Emit debug information (Short form: -g)" ) - static member optsDebug(a0 : System.String) = (sprintf "Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file)." a0) + static member optsDebug(a0 : System.String) = (sprintf "Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file)." a0) static member optsOptimize() = (sprintf "Enable optimizations (Short form: -O)" ) static member optsTailcalls() = (sprintf "Enable or disable tailcalls" ) static member optsDeterministic() = (sprintf "Produce a deterministic assembly (including module version GUID and timestamp)" ) + static member optsRealsig() = (sprintf "Generate assembly with IL visibility that matches the source code visibility" ) static member optsRefOnly() = (sprintf "Produce a reference assembly, instead of a full assembly, as the primary output" ) static member optsRefOut() = (sprintf "Produce a reference assembly with the specified file path." ) static member optsPathMap() = (sprintf "Maps physical paths to source path names output by the compiler" ) @@ -985,7 +987,6 @@ type internal SR private() = static member impImportedAssemblyUsesNotPublicType(a0 : System.String) = (1112, sprintf "An imported assembly uses the type '%s' but that type is not public" a0) static member optValueMarkedInlineButIncomplete(a0 : System.String) = (1113, sprintf "The value '%s' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible" a0) static member optValueMarkedInlineButWasNotBoundInTheOptEnv(a0 : System.String) = (1114, sprintf "The value '%s' was marked inline but was not bound in the optimization environment" a0) - static member optLocalValueNotFoundDuringOptimization(a0 : System.String) = (1115, sprintf "Local value %s not found during optimization" a0) static member optValueMarkedInlineHasUnexpectedValue() = (1116, sprintf "A value marked as 'inline' has an unexpected value" ) static member optValueMarkedInlineCouldNotBeInlined() = (1117, sprintf "A value marked as 'inline' could not be inlined" ) static member optFailedToInlineValue(a0 : System.String) = (1118, sprintf "Failed to inline the value '%s' marked 'inline', perhaps because a recursive value was marked 'inline'" a0) @@ -1009,7 +1010,7 @@ type internal SR private() = static member lexOutsideIntegerRange() = (1138, sprintf "This number is outside the allowable range for this integer type" ) static member lexCharNotAllowedInOperatorNames(a0 : System.String) = (sprintf "'%s' is not permitted as a character in operator names and is reserved for future use" a0) static member lexUnexpectedChar(a0 : System.String) = (sprintf "Unexpected character '%s'" a0) - static member lexByteArrayCannotEncode() = (1140, sprintf "This byte array literal contains characters that do not encode as a single byte" ) + static member lexByteArrayCannotEncode(a0 : System.Int32) = (1140, sprintf "This byte array literal contains %d characters that do not encode as a single byte" a0) static member lexIdentEndInMarkReserved(a0 : System.String) = (1141, sprintf "Identifiers followed by '%s' are reserved for future use" a0) static member lexOutsideEightBitSigned() = (1142, sprintf "This number is outside the allowable range for 8-bit signed integers" ) static member lexOutsideEightBitSignedHex() = (1143, sprintf "This number is outside the allowable range for hexadecimal 8-bit signed integers" ) @@ -1023,10 +1024,11 @@ type internal SR private() = static member lexOutsideNativeSigned() = (1151, sprintf "This number is outside the allowable range for signed native integers" ) static member lexOutsideNativeUnsigned() = (1152, sprintf "This number is outside the allowable range for unsigned native integers" ) static member lexInvalidFloat() = (1153, sprintf "Invalid floating point number" ) - static member lexOusideDecimal() = (1154, sprintf "This number is outside the allowable range for decimal literals" ) - static member lexOusideThirtyTwoBitFloat() = (1155, sprintf "This number is outside the allowable range for 32-bit floats" ) + static member lexOutsideDecimal() = (1154, sprintf "This number is outside the allowable range for decimal literals" ) + static member lexOutsideThirtyTwoBitFloat() = (1155, sprintf "This number is outside the allowable range for 32-bit floats" ) static member lexInvalidNumericLiteral() = (1156, sprintf "This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1.0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint)." ) - static member lexInvalidByteLiteral() = (1157, sprintf "This is not a valid byte literal" ) + static member lexInvalidAsciiByteLiteral() = (1157, sprintf "This is not a valid byte character literal. The value must be less than or equal to '\127'B." ) + static member lexInvalidTrigraphAsciiByteLiteral() = (1157, sprintf "This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error." ) static member lexInvalidCharLiteral() = (1158, sprintf "This is not a valid character literal" ) static member lexThisUnicodeOnlyInStringLiterals() = (1159, sprintf "This Unicode encoding is only valid in string literals" ) static member lexTokenReserved() = (1160, sprintf "This token is reserved for future use" ) @@ -1118,6 +1120,8 @@ type internal SR private() = static member lexUnmatchedRBracesInTripleQuote() = (1249, sprintf "The interpolated string contains unmatched closing braces." ) static member lexTooManyPercentsInTripleQuote() = (1250, sprintf "The interpolated triple quoted string literal does not start with enough '$' characters to allow this many consecutive '%%' characters." ) static member lexExtendedStringInterpolationNotSupported() = (1251, sprintf "Extended string interpolation is not supported in this version of F#." ) + static member lexInvalidCharLiteralInString(a0 : System.String, a1 : System.String) = (1252, sprintf "'%s' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '%s'. In a future F# version this warning will be promoted to an error." a0 a1) + static member lexByteArrayOutisdeAscii(a0 : System.Int32) = (1253, sprintf "This byte array literal contains %d non-ASCII characters. All characters should be < 128y." a0) static member toolLocationHelperUnsupportedFrameworkVersion(a0 : System.String) = (1300, sprintf "The specified .NET Framework version '%s' is not supported. Please specify a value from the enumeration Microsoft.Build.Utilities.TargetDotNetFrameworkVersion." a0) static member ilSignInvalidMagicValue() = (1301, sprintf "Invalid Magic value in CLR Header" ) static member ilSignBadImageFormat() = (1302, sprintf "Bad image format" ) @@ -1149,7 +1153,7 @@ type internal SR private() = static member fscKeyFileWarning() = (2018, sprintf "Option '--keyfile' overrides attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file or added module" ) static member fscKeyNameWarning() = (2019, sprintf "Option '--keycontainer' overrides attribute 'System.Reflection.AssemblyNameAttribute' given in a source file or added module" ) static member fscReferenceOnCommandLine(a0 : System.String) = (2020, sprintf "The assembly '%s' is listed on the command line. Assemblies should be referenced using a command line flag such as '-r'." a0) - static member fscRemotingError() = (2021, sprintf "The resident compilation service was not used because a problem occured in communicating with the server." ) + static member fscRemotingError() = (2021, sprintf "The resident compilation service was not used because a problem occurred in communicating with the server." ) static member pathIsInvalid(a0 : System.String) = (2022, sprintf "Problem with filename '%s': Illegal characters in path." a0) static member fscResxSourceFileDeprecated(a0 : System.String) = (2023, sprintf "Passing a .resx file (%s) as a source file to the compiler is deprecated. Use resgen.exe to transform the .resx file into a .resources file to pass as a --resource option. If you are using MSBuild, this can be done via an item in the .fsproj project file." a0) static member fscStaticLinkingNoProfileMismatches() = (2024, sprintf "Static linking may not be used on an assembly referencing mscorlib (e.g. a .NET Framework assembly) when generating an assembly that references System.Runtime (e.g. a .NET Core or Portable assembly)." ) @@ -1193,7 +1197,7 @@ type internal SR private() = static member etUnexpectedExceptionFromProvidedMemberMember(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3043, sprintf "Unexpected exception from member '%s' of provided type '%s' member '%s': %s" a0 a1 a2 a3) static member etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters() = (3044, sprintf "Nested provided types do not take static arguments or generic parameters" ) static member etInvalidStaticArgument(a0 : System.String) = (3045, sprintf "Invalid static argument to provided type. Expected an argument of kind '%s'." a0) - static member etErrorApplyingStaticArgumentsToType() = (3046, sprintf "An error occured applying the static arguments to a provided type" ) + static member etErrorApplyingStaticArgumentsToType() = (3046, sprintf "An error occurred applying the static arguments to a provided type" ) static member etUnknownStaticArgumentKind(a0 : System.String, a1 : System.String) = (3047, sprintf "Unknown static argument kind '%s' when resolving a reference to a provided type or method '%s'" a0 a1) static member etProviderHasDesignerAssemblyDependency(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3048, sprintf "The type provider designer assembly '%s' could not be loaded from folder '%s' because a dependency was missing or could not loaded. All dependencies of the type provider designer assembly must be located in the same folder as that assembly. The exception reported was: %s - %s" a0 a1 a2 a3) static member etProviderHasDesignerAssemblyException(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3049, sprintf "The type provider designer assembly '%s' could not be loaded from folder '%s'. The exception reported was: %s - %s" a0 a1 a2 a3) @@ -1208,7 +1212,7 @@ type internal SR private() = static member tcTypeCastErased(a0 : System.String, a1 : System.String) = (3061, sprintf "This downcast will erase the provided type '%s' to the type '%s'." a0 a1) static member tcTypeTestErased(a0 : System.String, a1 : System.String) = (3062, sprintf "This type test with a provided type '%s' is not allowed because this provided type will be erased to '%s' at runtime." a0 a1) static member tcCannotInheritFromErasedType() = (3063, sprintf "Cannot inherit from erased provided type" ) - static member etInvalidTypeProviderAssemblyName(a0 : System.String, a1 : System.String) = (3065, sprintf "Assembly '%s' hase TypeProviderAssembly attribute with invalid value '%s'. The value should be a valid assembly name" a0 a1) + static member etInvalidTypeProviderAssemblyName(a0 : System.String, a1 : System.String) = (3065, sprintf "Assembly '%s' has TypeProviderAssembly attribute with invalid value '%s'. The value should be a valid assembly name" a0 a1) static member tcInvalidMemberNameCtor() = (3066, sprintf "Invalid member name. Members may not have name '.ctor' or '.cctor'" ) static member tcInferredGenericTypeGivesRiseToInconsistency(a0 : System.String, a1 : System.String) = (3068, sprintf "The function or member '%s' is used in a way that requires further type annotations at its definition to ensure consistency of inferred types. The inferred signature is '%s'." a0 a1) static member tcInvalidTypeArgumentCount(a0 : System.Int32, a1 : System.Int32) = (3069, sprintf "The number of type arguments did not match: '%d' given, '%d' expected. This may be related to a previously reported error." a0 a1) @@ -1339,7 +1343,7 @@ type internal SR private() = static member fscSystemRuntimeInteropServicesIsRequired() = (3179, sprintf "System.Runtime.InteropServices assembly is required to use UnknownWrapper\DispatchWrapper classes." ) static member abImplicitHeapAllocation(a0 : System.String) = (3180, sprintf "The mutable local '%s' is implicitly allocated as a reference cell because it has been captured by a closure. This warning is for informational purposes only to indicate where implicit allocations are performed." a0) static member estApplyStaticArgumentsForMethodNotImplemented() = (sprintf "A type provider implemented GetStaticParametersForMethod, but ApplyStaticArgumentsForMethod was not implemented or invalid" ) - static member etErrorApplyingStaticArgumentsToMethod() = (3181, sprintf "An error occured applying the static arguments to a provided method" ) + static member etErrorApplyingStaticArgumentsToMethod() = (3181, sprintf "An error occurred applying the static arguments to a provided method" ) static member pplexUnexpectedChar(a0 : System.String) = (3182, sprintf "Unexpected character '%s' in preprocessor expression" a0) static member ppparsUnexpectedToken(a0 : System.String) = (3183, sprintf "Unexpected token '%s' in preprocessor expression" a0) static member ppparsIncompleteExpression() = (3184, sprintf "Incomplete preprocessor expression" ) @@ -1365,7 +1369,7 @@ type internal SR private() = static member tcUnsupportedMutRecDecl() = (3202, sprintf "This declaration is not supported in recursive declaration groups" ) static member parsInvalidUseOfRec() = (3203, sprintf "Invalid use of 'rec' keyword" ) static member tcStructUnionMultiCaseDistinctFields() = (3204, sprintf "If a multicase union type is a struct, then all union cases must have unique names. For example: 'type A = B of b: int | C of c: int'." ) - static member CallerMemberNameIsOverriden(a0 : System.String) = (3206, sprintf "The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute." a0) + static member CallerMemberNameIsOverridden(a0 : System.String) = (3206, sprintf "The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute." a0) static member tcFixedNotAllowed() = (3207, sprintf "Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is one of the following: an array, the address of an array element, a string, a byref, an inref, or a type implementing GetPinnableReference()" ) static member tcCouldNotFindOffsetToStringData() = (3208, sprintf "Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression." ) static member chkNoByrefAddressOfLocal(a0 : System.String) = (3209, sprintf "The address of the variable '%s' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope." a0) @@ -1444,7 +1448,7 @@ type internal SR private() = static member keywordDescriptionStruct() = (sprintf "Used to declare a structure type. Also used in generic parameter constraints." ) static member keywordDescriptionThen() = (sprintf "Used in conditional expressions. Also used to perform side effects after object construction." ) static member keywordDescriptionTo() = (sprintf "Used in for loops to indicate a range." ) - static member keywordDescriptionTry() = (sprintf "Used to introduce a block of code that might generate an exception. Used together with with or finally." ) + static member keywordDescriptionTry() = (sprintf "Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'." ) static member keywordDescriptionType() = (sprintf "Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation." ) static member keywordDescriptionTypeTest() = (sprintf "Used to check if an object is of the given type in a pattern or binding." ) static member keywordDescriptionUpcast() = (sprintf "Used to convert to a type that is higher in the inheritance chain." ) @@ -1504,6 +1508,19 @@ type internal SR private() = static member expressionHasNoName() = (3250, sprintf "Expression does not have a name." ) static member chkNoFirstClassNameOf() = (3251, sprintf "Using the 'nameof' operator as a first-class function value is not permitted." ) static member tcIllegalByrefsInOpenTypeDeclaration() = (3252, sprintf "Byref types are not allowed in an open type declaration." ) + static member tcTypeDoesNotHaveAnyNull(a0 : System.String) = (3260, sprintf "The type '%s' does not support a nullness qualification." a0) + static member tcPassingWithoutNullToANullableExpectingFunc(a0 : System.String) = (3262, sprintf "Value known to be without null passed to a function meant for nullables: %s" a0) + static member tcPassingWithoutNullToOptionOfObj() = (sprintf "You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value." ) + static member tcPassingWithoutNullToValueOptionOfObj() = (sprintf "You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value." ) + static member tcPassingWithoutNullToNonNullAP() = (sprintf "You can remove this |Null|NonNull| pattern usage." ) + static member tcPassingWithoutNullToNonNullQuickAP() = (sprintf "You can remove this |NonNullQuick| pattern usage." ) + static member tcPassingWithoutNullTononNullFunction() = (sprintf "You can remove this `nonNull` assertion." ) + static member tcNullableToStringOverride() = (3263, sprintf "With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function." ) + static member tcDowncastFromNullableToWithoutNull(a0 : System.String, a1 : System.String, a2 : System.String) = (3264, sprintf "Nullness warning: Downcasting from '%s' into '%s' can introduce unexpected null values. Cast to '%s|null' instead or handle the null before downcasting." a0 a1 a2) + static member csNullNotNullConstraintInconsistent() = (3268, sprintf "The constraints 'null' and 'not null' are inconsistent" ) + static member tcNullnessCheckingNotEnabled() = (3271, sprintf "The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored." ) + static member csTypeHasNullAsTrueValue(a0 : System.String) = (sprintf "The type '%s' uses 'null' as a representation value but a non-null type is expected" a0) + static member csTypeHasNullAsExtraValue(a0 : System.String) = (sprintf "The type '%s' supports 'null' but a non-null type is expected" a0) static member chkInvalidFunctionParameterType(a0 : System.String, a1 : System.String) = (3300, sprintf "The parameter '%s' has an invalid type '%s'. This is not permitted by the rules of Common IL." a0 a1) static member chkInvalidFunctionReturnType(a0 : System.String) = (3301, sprintf "The function or method has an invalid return type '%s'. This is not permitted by the rules of Common IL." a0) static member packageManagementRequiresVFive() = (3302, sprintf "The 'package management' feature requires language version 5.0 or above" ) @@ -1518,6 +1535,8 @@ type internal SR private() = static member typrelInterfaceMemberNoMostSpecificImplementation(a0 : System.String) = (3352, sprintf "Interface member '%s' does not have a most specific implementation." a0) static member fsiInvalidDirective(a0 : System.String, a1 : System.String) = (3353, sprintf "Invalid directive '#%s %s'" a0 a1) static member useSdkRefs() = (sprintf "Use reference assemblies for .NET framework references when available (Enabled by default)." ) + static member optsCheckNulls() = (sprintf "Enable nullness declarations and checks" ) + static member fSharpBannerVersion(a0 : System.String, a1 : System.String) = (sprintf "%s for F# %s" a0 a1) static member optsGetLangVersions() = (sprintf "Display the allowed values for language version." ) static member optsSetLangVersion() = (sprintf "Specify language version such as 'latest' or 'preview'." ) static member optsSupportedLangVersions() = (sprintf "Supported language versions:" ) @@ -1527,7 +1546,7 @@ type internal SR private() = static member formatDashItem(a0 : System.String) = (sprintf " - %s" a0) static member featureSingleUnderscorePattern() = (sprintf "single underscore pattern" ) static member featureWildCardInForLoop() = (sprintf "wild card in for loop" ) - static member featureRelaxWhitespace() = (sprintf "whitespace relexation" ) + static member featureRelaxWhitespace() = (sprintf "whitespace relaxation" ) static member featureNameOf() = (sprintf "nameof" ) static member featureImplicitYield() = (sprintf "implicit yield" ) static member featureOpenTypeDeclaration() = (sprintf "open type declaration" ) @@ -1536,6 +1555,7 @@ type internal SR private() = static member featureFromEndSlicing() = (sprintf "from-end slicing" ) static member featureFixedIndexSlice3d4d() = (sprintf "fixed-index slice 3d/4d" ) static member featureAndBang() = (sprintf "applicative computation expressions" ) + static member featureNullnessChecking() = (sprintf "nullness checking" ) static member featureResumableStateMachines() = (sprintf "resumable state machines" ) static member featureNullableOptionalInterop() = (sprintf "nullable optional interop" ) static member featureDefaultInterfaceMemberConsumption() = (sprintf "default interface member consumption" ) @@ -1575,6 +1595,11 @@ type internal SR private() = static member featureWarningIndexedPropertiesGetSetSameType() = (sprintf "Indexed properties getter and setter must have the same type" ) static member featureChkTailCallAttrOnNonRec() = (sprintf "Raises warnings if the 'TailCall' attribute is used on non-recursive functions." ) static member featureUnionIsPropertiesVisible() = (sprintf "Union case test properties" ) + static member featureBooleanReturningAndReturnTypeDirectedPartialActivePattern() = (sprintf "Boolean-returning and return-type-directed partial active patterns" ) + static member featureEnforceAttributeTargets() = (sprintf "Enforce AttributeTargets" ) + static member featureLowerInterpolatedStringToConcat() = (sprintf "Optimizes interpolated strings in certain cases, by lowering to concatenation" ) + static member featureLowerIntegralRangesToFastLoops() = (sprintf "Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops." ) + static member featureLowerSimpleMappingsInComprehensionsToFastLoops() = (sprintf "Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively." ) static member tcNotAFunctionButIndexerNamedIndexingNotYetEnabled(a0 : System.String, a1 : System.String) = (3354, sprintf "This value supports indexing, e.g. '%s.[index]'. The syntax '%s[index]' requires /langversion:preview. See https://aka.ms/fsharp-index-notation." a0 a1) static member tcNotAFunctionButIndexerIndexingNotYetEnabled() = (3354, sprintf "This expression supports indexing, e.g. 'expr.[index]'. The syntax 'expr[index]' requires /langversion:preview. See https://aka.ms/fsharp-index-notation." ) static member tcNotAnIndexerNamedIndexingNotYetEnabled(a0 : System.String) = (3355, sprintf "The value '%s' is not a function and does not support index notation." a0) @@ -1639,7 +1664,7 @@ type internal SR private() = static member tcResumableCodeFunctionMustBeInline() = (3501, sprintf "Invalid resumable code. Any method of function accepting or returning resumable code must be marked 'inline'" ) static member tcResumableCodeArgMustHaveRightName() = (3501, sprintf "Invalid resumable code. Resumable code parameter must have name beginning with '__expand'" ) static member tcResumableCodeArgMustHaveRightKind() = (3501, sprintf "Invalid resumable code. A resumable code parameter must be of delegate or function type" ) - static member tcResumableCodeContainsLetRec() = (3501, sprintf "Invalid resumable code. A 'let rec' occured in the resumable code specification" ) + static member tcResumableCodeContainsLetRec() = (3501, sprintf "Invalid resumable code. A 'let rec' occurred in the resumable code specification" ) static member tcResumableCodeNotSupported() = (3510, sprintf "Using resumable code or resumable state machines requires /langversion:preview" ) static member tcNoEagerConstraintApplicationAttribute() = (3510, sprintf "Using methods with 'NoEagerConstraintApplicationAttribute' requires /langversion:6.0 or later" ) static member reprStateMachineNotCompilable(a0 : System.String) = (3511, sprintf "This state machine is not statically compilable. %s. An alternative dynamic implementation will be used, which may be slower. Consider adjusting your code to ensure this state machine is statically compilable, or else suppress this warning." a0) @@ -1647,8 +1672,8 @@ type internal SR private() = static member tcResumableCodeInvocation() = (3513, sprintf "Resumable code invocation. Suppress this warning if you are defining new low-level resumable code in terms of existing resumable code." ) static member ilxGenUnknownDebugPoint(a0 : System.String, a1 : System.String) = (3514, sprintf "Unknown debug point '%s'. The available debug points are '%s'." a0 a1) static member reprResumableCodeInvokeNotReduced(a0 : System.String) = (sprintf "A resumable code invocation at '%s' could not be reduced" a0) - static member reprResumableCodeContainsLetRec() = (sprintf "A 'let rec' occured in the resumable code specification" ) - static member reprResumableCodeContainsConstrainedGenericLet() = (sprintf "A constrained generic construct occured in the resumable code specification" ) + static member reprResumableCodeContainsLetRec() = (sprintf "A 'let rec' occurred in the resumable code specification" ) + static member reprResumableCodeContainsConstrainedGenericLet() = (sprintf "A constrained generic construct occurred in the resumable code specification" ) static member reprResumableCodeContainsDynamicResumeAtInBody() = (sprintf "A target label for __resumeAt was not statically determined. A __resumeAt with a non-static target label may only appear at the start of a resumable code method" ) static member reprResumableCodeContainsResumptionInTryFinally() = (sprintf "A try/finally may not contain resumption points" ) static member reprResumableCodeContainsResumptionInHandlerOrFilter() = (sprintf "The 'with' block of a try/with may not contain resumption points" ) @@ -1672,7 +1697,7 @@ type internal SR private() = static member tcUsingInterfacesWithStaticAbstractMethods() = (3535, sprintf "Declaring \"interfaces with static abstract methods\" is an advanced feature. See https://aka.ms/fsharp-iwsams for guidance. You can disable this warning by using '#nowarn \"3535\"' or '--nowarn:3535'." ) static member tcUsingInterfaceWithStaticAbstractMethodAsType(a0 : System.String) = (3536, sprintf "'%s' is normally used as a type constraint in generic code, e.g. \"'T when ISomeInterface<'T>\" or \"let f (x: #ISomeInterface<_>)\". See https://aka.ms/fsharp-iwsams for guidance. You can disable this warning by using '#nowarn \"3536\"' or '--nowarn:3536'." a0) static member tcTraitHasMultipleSupportTypes(a0 : System.String) = (3537, sprintf "The trait '%s' invoked by this call has multiple support types. This invocation syntax is not permitted for such traits. See https://aka.ms/fsharp-srtp for guidance." a0) - static member tcMissingRequiredMembers(a0 : System.String) = (3545, sprintf "The following required properties have to be initalized:%s" a0) + static member tcMissingRequiredMembers(a0 : System.String) = (3545, sprintf "The following required properties have to be initialized:%s" a0) static member parsExpectingPattern() = (3546, sprintf "Expecting pattern" ) static member parsExpectedPatternAfterToken() = (3547, sprintf "Expected a pattern after this point" ) static member matchNotAllowedForUnionCaseWithNoData() = (3548, sprintf "Pattern discard is not allowed for union case that takes no data." ) @@ -1721,4 +1746,25 @@ type internal SR private() = static member chkStaticMembersOnObjectExpressions() = (3860, sprintf "Object expressions cannot implement interfaces with static abstract members or declare static members." ) static member chkTailCallAttrOnNonRec() = (3861, sprintf "The TailCall attribute should only be applied to recursive functions." ) static member parsStaticMemberImcompleteSyntax() = (3862, sprintf "Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration." ) - static member parsExpectingField() = (3863, sprintf "Expecting record field" ) + static member parsExpectingRecordField() = (3863, sprintf "Expecting record field" ) + static member tooManyMethodsInDotNetTypeWritingAssembly(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3864, sprintf "The type '%s' has too many methods. Found: '%d', maximum: '%d'" a0 a1 a2) + static member parsOnlySimplePatternsAreAllowedInConstructors() = (3865, sprintf "Only simple patterns are allowed in primary constructors" ) + static member chkStaticAbstractInterfaceMembers(a0 : System.String) = (3866, sprintf "A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.%s)." a0) + static member chkStaticAbstractMembersOnClasses() = (3867, sprintf "Classes cannot contain static abstract members." ) + static member tcActivePatternArgsCountNotMatchNoArgsNoPat(a0 : System.String, a1 : System.String) = (3868, sprintf "This active pattern does not expect any arguments, i.e., it should be used like '%s' instead of '%s x'." a0 a1) + static member tcActivePatternArgsCountNotMatchOnlyPat(a0 : System.String) = (3868, sprintf "This active pattern expects exactly one pattern argument, e.g., '%s pat'." a0) + static member tcActivePatternArgsCountNotMatchArgs(a0 : System.Int32, a1 : System.String, a2 : System.String) = (3868, sprintf "This active pattern expects %d expression argument(s), e.g., '%s%s'." a0 a1 a2) + static member tcActivePatternArgsCountNotMatchArgsAndPat(a0 : System.Int32, a1 : System.String, a2 : System.String) = (3868, sprintf "This active pattern expects %d expression argument(s) and a pattern argument, e.g., '%s%s pat'." a0 a1 a2) + static member featureParsedHashDirectiveArgumentNonString() = (sprintf "# directives with non-quoted string arguments" ) + static member featureParsedHashDirectiveUnexpectedInteger(a0 : System.Int32) = (3869, sprintf "Unexpected integer literal '%d'." a0) + static member featureParsedHashDirectiveUnexpectedIdentifier(a0 : System.String) = (3869, sprintf "Unexpected identifier '%s'." a0) + static member featureEmptyBodiedComputationExpressions() = (sprintf "Support for computation expressions with empty bodies: builder { }" ) + static member parsExpectingUnionCaseField() = (3870, sprintf "Expecting union case field" ) + static member featureAllowAccessModifiersToAutoPropertiesGettersAndSetters() = (sprintf "Allow access modifiers to auto properties getters and setters" ) + static member tcAccessModifiersNotAllowedInSRTPConstraint() = (3871, sprintf "Access modifiers cannot be applied to an SRTP constraint." ) + static member featureAllowObjectExpressionWithoutOverrides() = (sprintf "Allow object expressions without overrides" ) + static member featureUseTypeSubsumptionCache() = (sprintf "Use type conversion cache during compilation" ) + static member tcPartialActivePattern() = (3872, sprintf "Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern." ) + static member featureDontWarnOnUppercaseIdentifiersInBindingPatterns() = (sprintf "Don't warn on uppercase identifiers in binding patterns" ) + static member chkDeprecatePlacesWhereSeqCanBeOmitted() = (3873, sprintf "This construct is deprecated. Sequence expressions should be of the form 'seq { ... }'" ) + static member featureDeprecatePlacesWhereSeqCanBeOmitted() = (sprintf "Deprecate places where 'seq' can be omitted" ) diff --git a/src/fcs-fable/codegen/FSIstrings.fs b/src/fcs-fable/codegen/FSIstrings.fs index 2e258b4311..6182bd8ced 100644 --- a/src/fcs-fable/codegen/FSIstrings.fs +++ b/src/fcs-fable/codegen/FSIstrings.fs @@ -33,6 +33,7 @@ type internal SR private() = static member fsiIntroTextHashloadInfo() = (sprintf "Load the given file(s) as if compiled and referenced" ) static member fsiIntroTextHashtimeInfo() = (sprintf "Toggle timing on/off" ) static member fsiIntroTextHashhelpInfo() = (sprintf "Display help" ) + static member fsiIntroTextHashhelpdocInfo() = (sprintf "Display documentation for an identifier, e.g. #help \"List.map\";;" ) static member fsiIntroTextHashquitInfo() = (sprintf "Exit" ) static member fsiIntroTextHashclearInfo() = (sprintf "Clear screen" ) static member fsiIntroTextHeader2commandLine() = (sprintf " F# Interactive command line options:" ) @@ -58,3 +59,4 @@ type internal SR private() = static member fsiOperationFailed() = (sprintf "Operation failed. The error text has been printed in the error stream. To return the corresponding FSharpDiagnostic use the EvalInteractionNonThrowing, EvalScriptNonThrowing or EvalExpressionNonThrowing" ) static member fsiMultiAssemblyEmitOption() = (sprintf "Emit multiple assemblies (on by default)" ) static member fsiEntryPointWontBeInvoked(a0 : System.String, a1 : System.String, a2 : System.String) = (2304, sprintf "Functions with [] are not invoked in FSI. '%s' was not invoked. Execute '%s ' in order to invoke '%s' with the appropriate string array of command line arguments." a0 a1 a2) + static member fsiDetailedHelpLink() = (sprintf "See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details." ) diff --git a/src/fcs-fable/codegen/codegen.fsproj b/src/fcs-fable/codegen/codegen.fsproj index eb47fd5544..3a0aac2a09 100644 --- a/src/fcs-fable/codegen/codegen.fsproj +++ b/src/fcs-fable/codegen/codegen.fsproj @@ -7,7 +7,7 @@ Exe - net8.0 + net9.0 @@ -30,11 +30,11 @@ SyntaxTree/pplex.fsl - --module FSharp.Compiler.PPParser --open FSharp.Compiler.ParseHelpers --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char + --module FSharp.Compiler.PPParser --open FSharp.Compiler.ParseHelpers --open FSharp.Compiler.LexerStore --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char SyntaxTree/pppars.fsy - --module FSharp.Compiler.Lexer --open FSharp.Compiler.Lexhelp --open Internal.Utilities.Text.Lexing --open FSharp.Compiler.Parser --open FSharp.Compiler.Text --open FSharp.Compiler.ParseHelpers --internal --unicode --lexlib Internal.Utilities.Text.Lexing + --module FSharp.Compiler.Lexer --open FSharp.Compiler.Lexhelp --open Internal.Utilities.Text.Lexing --open FSharp.Compiler.Parser --open FSharp.Compiler.Text --open FSharp.Compiler.ParseHelpers --open FSharp.Compiler.LexerStore --internal --unicode --lexlib Internal.Utilities.Text.Lexing SyntaxTree/lex.fsl diff --git a/src/fcs-fable/codegen/illex.fs b/src/fcs-fable/codegen/illex.fs index a288e441d0..dcbb6ed565 100644 --- a/src/fcs-fable/codegen/illex.fs +++ b/src/fcs-fable/codegen/illex.fs @@ -442,7 +442,7 @@ and token lexbuf = ) | 12 -> ( //# 112 "src/Compiler/AbstractIL/illex.fsl" - ELIPSES + ELLIPSES //# 446 "illex.fs" ) | 13 -> ( @@ -462,7 +462,7 @@ and token lexbuf = ) | 16 -> ( //# 125 "src/Compiler/AbstractIL/illex.fsl" - VAL_INT32_ELIPSES(int32(lexemeTrimBoth lexbuf 0 3)) + VAL_INT32_ELLIPSES(int32(lexemeTrimBoth lexbuf 0 3)) //# 466 "illex.fs" ) | 17 -> ( diff --git a/src/fcs-fable/codegen/ilpars.fs b/src/fcs-fable/codegen/ilpars.fs index 0744b083a3..5b052f1e40 100644 --- a/src/fcs-fable/codegen/ilpars.fs +++ b/src/fcs-fable/codegen/ilpars.fs @@ -9,6 +9,7 @@ open Internal.Utilities.Text.Parsing.ParseHelpers #nowarn "1182" // the generated code often has unused variable "parseState" +#nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` open Internal.Utilities.Library @@ -24,7 +25,7 @@ let resolveCurrentMethodSpecScope obj = resolveMethodSpecScope obj mkILEmptyGenericParams -//# 27 "ilpars.fs" +//# 28 "ilpars.fs" // This type is the type of tokens accepted by the parser type token = | VOID @@ -62,7 +63,7 @@ type token = | FIELD | EXPLICIT | EOF - | ELIPSES + | ELLIPSES | DOT | DEFAULT | DCOLON @@ -89,7 +90,7 @@ type token = | INSTR_I32_I32 of (Int32Int32Instr) | INSTR_I of (Int32Instr) | VAL_FLOAT64 of (double) - | VAL_INT32_ELIPSES of (int32) + | VAL_INT32_ELLIPSES of (int32) | VAL_INT64 of (int64) // This type is used to give symbolic names to token indexes, useful for error messages type tokenId = @@ -128,7 +129,7 @@ type tokenId = | TOKEN_FIELD | TOKEN_EXPLICIT | TOKEN_EOF - | TOKEN_ELIPSES + | TOKEN_ELLIPSES | TOKEN_DOT | TOKEN_DEFAULT | TOKEN_DCOLON @@ -155,7 +156,7 @@ type tokenId = | TOKEN_INSTR_I32_I32 | TOKEN_INSTR_I | TOKEN_VAL_FLOAT64 - | TOKEN_VAL_INT32_ELIPSES + | TOKEN_VAL_INT32_ELLIPSES | TOKEN_VAL_INT64 | TOKEN_end_of_input | TOKEN_error @@ -226,7 +227,7 @@ let tagOfToken (t:token) = | FIELD -> 32 | EXPLICIT -> 33 | EOF -> 34 - | ELIPSES -> 35 + | ELLIPSES -> 35 | DOT -> 36 | DEFAULT -> 37 | DCOLON -> 38 @@ -253,7 +254,7 @@ let tagOfToken (t:token) = | INSTR_I32_I32 _ -> 59 | INSTR_I _ -> 60 | VAL_FLOAT64 _ -> 61 - | VAL_INT32_ELIPSES _ -> 62 + | VAL_INT32_ELLIPSES _ -> 62 | VAL_INT64 _ -> 63 // This function maps integer indexes to symbolic token ids @@ -294,7 +295,7 @@ let tokenTagToTokenId (tokenIdx:int) = | 32 -> TOKEN_FIELD | 33 -> TOKEN_EXPLICIT | 34 -> TOKEN_EOF - | 35 -> TOKEN_ELIPSES + | 35 -> TOKEN_ELLIPSES | 36 -> TOKEN_DOT | 37 -> TOKEN_DEFAULT | 38 -> TOKEN_DCOLON @@ -321,7 +322,7 @@ let tokenTagToTokenId (tokenIdx:int) = | 59 -> TOKEN_INSTR_I32_I32 | 60 -> TOKEN_INSTR_I | 61 -> TOKEN_VAL_FLOAT64 - | 62 -> TOKEN_VAL_INT32_ELIPSES + | 62 -> TOKEN_VAL_INT32_ELLIPSES | 63 -> TOKEN_VAL_INT64 | 66 -> TOKEN_end_of_input | 64 -> TOKEN_error @@ -459,7 +460,7 @@ let token_to_string (t:token) = | FIELD -> "FIELD" | EXPLICIT -> "EXPLICIT" | EOF -> "EOF" - | ELIPSES -> "ELIPSES" + | ELLIPSES -> "ELLIPSES" | DOT -> "DOT" | DEFAULT -> "DEFAULT" | DCOLON -> "DCOLON" @@ -486,7 +487,7 @@ let token_to_string (t:token) = | INSTR_I32_I32 _ -> "INSTR_I32_I32" | INSTR_I _ -> "INSTR_I" | VAL_FLOAT64 _ -> "VAL_FLOAT64" - | VAL_INT32_ELIPSES _ -> "VAL_INT32_ELIPSES" + | VAL_INT32_ELLIPSES _ -> "VAL_INT32_ELLIPSES" | VAL_INT64 _ -> "VAL_INT64" // This function gets the data carried by a token as an object @@ -527,7 +528,7 @@ let _fsyacc_dataOfToken (t:token) = | FIELD -> (null : System.Object) | EXPLICIT -> (null : System.Object) | EOF -> (null : System.Object) - | ELIPSES -> (null : System.Object) + | ELLIPSES -> (null : System.Object) | DOT -> (null : System.Object) | DEFAULT -> (null : System.Object) | DCOLON -> (null : System.Object) @@ -554,7 +555,7 @@ let _fsyacc_dataOfToken (t:token) = | INSTR_I32_I32 _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x | INSTR_I _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x | VAL_FLOAT64 _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x - | VAL_INT32_ELIPSES _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | VAL_INT32_ELLIPSES _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x | VAL_INT64 _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x let _fsyacc_gotos = [| 0us;65535us;0us;65535us;1us;65535us;2us;3us;1us;65535us;0us;1us;0us;65535us;0us;65535us;2us;65535us;0us;6us;8us;9us;2us;65535us;0us;8us;8us;8us;12us;65535us;21us;33us;24us;33us;26us;33us;28us;33us;36us;32us;37us;33us;40us;33us;52us;33us;55us;33us;57us;33us;108us;33us;112us;33us;9us;65535us;21us;44us;24us;44us;26us;44us;28us;44us;52us;42us;55us;42us;57us;42us;108us;44us;112us;44us;11us;65535us;21us;39us;24us;39us;26us;39us;28us;39us;37us;38us;40us;41us;52us;39us;55us;39us;57us;39us;108us;39us;112us;39us;3us;65535us;52us;53us;55us;56us;57us;58us;6us;65535us;21us;45us;24us;45us;26us;45us;28us;45us;108us;45us;112us;45us;6us;65535us;21us;22us;24us;25us;26us;27us;28us;29us;108us;111us;112us;113us;0us;65535us;0us;65535us;8us;65535us;2us;4us;21us;46us;24us;46us;26us;46us;28us;46us;47us;48us;108us;46us;112us;46us;1us;65535us;59us;61us;2us;65535us;59us;90us;91us;92us;13us;65535us;21us;30us;24us;30us;26us;30us;28us;30us;34us;35us;36us;30us;37us;30us;40us;30us;52us;30us;55us;30us;57us;30us;108us;30us;112us;30us;9us;65535us;11us;12us;13us;14us;14us;15us;23us;24us;59us;93us;88us;89us;91us;93us;94us;95us;96us;97us;3us;65535us;16us;17us;18us;20us;104us;105us;1us;65535us;18us;19us;1us;65535us;42us;43us;1us;65535us;42us;107us;1us;65535us;108us;109us;|] let _fsyacc_sparseGotoTableRowOffsets = [|0us;1us;2us;4us;6us;7us;8us;11us;14us;27us;37us;49us;53us;60us;67us;68us;69us;78us;80us;83us;97us;107us;111us;113us;115us;117us;|] @@ -567,7 +568,7 @@ let _fsyacc_reductionSymbolCounts = [|1us;1us;2us;2us;1us;3us;1us;2us;0us;1us;2u let _fsyacc_productionToNonTerminalTable = [|0us;1us;2us;3us;4us;4us;5us;6us;6us;7us;7us;7us;7us;7us;7us;7us;7us;7us;7us;8us;8us;8us;9us;9us;10us;10us;11us;12us;13us;13us;13us;14us;14us;14us;15us;15us;15us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;16us;17us;17us;18us;18us;18us;18us;18us;18us;19us;19us;20us;21us;22us;22us;23us;23us;24us;25us;25us;|] let _fsyacc_immediateActions = [|65535us;49152us;65535us;49152us;65535us;16386us;65535us;16387us;65535us;16391us;16393us;65535us;16394us;65535us;65535us;16395us;65535us;16396us;65535us;16397us;16398us;65535us;16399us;65535us;65535us;16400us;65535us;16401us;65535us;16402us;16403us;16404us;65535us;65535us;65535us;16405us;65535us;65535us;16406us;16407us;65535us;16409us;65535us;16410us;16411us;16412us;65535us;65535us;65535us;16414us;16421us;16422us;65535us;16423us;65535us;65535us;16424us;65535us;16425us;65535us;16426us;65535us;16427us;16428us;16429us;16430us;16431us;16432us;16433us;16434us;16435us;16436us;16437us;16438us;65535us;16439us;16440us;16441us;16442us;16443us;16444us;16445us;16446us;65535us;16447us;65535us;16448us;16449us;65535us;16450us;16451us;65535us;16452us;65535us;65535us;16455us;65535us;16457us;16459us;16460us;16461us;16462us;16463us;65535us;65535us;65535us;16464us;16466us;65535us;65535us;16467us;16468us;65535us;16469us;|] let _fsyacc_reductions = lazy [| -//# 570 "ilpars.fs" +//# 571 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILInstr array in Microsoft.FSharp.Core.Operators.box @@ -576,7 +577,7 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__startilInstrs)); -//# 579 "ilpars.fs" +//# 580 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILType in Microsoft.FSharp.Core.Operators.box @@ -585,108 +586,108 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__startilType)); -//# 588 "ilpars.fs" +//# 589 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILType ResolvedAtMethodSpecScope in Microsoft.FSharp.Core.Operators.box ( ( -//# 102 "src/Compiler/AbstractIL/ilpars.fsy" +//# 103 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScope _1 [] ) -//# 102 "src/Compiler/AbstractIL/ilpars.fsy" +//# 103 "src/Compiler/AbstractIL/ilpars.fsy" : ILType)); -//# 599 "ilpars.fs" +//# 600 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_instrs2 in Microsoft.FSharp.Core.Operators.box ( ( -//# 106 "src/Compiler/AbstractIL/ilpars.fsy" +//# 107 "src/Compiler/AbstractIL/ilpars.fsy" Array.ofList _1 ) -//# 106 "src/Compiler/AbstractIL/ilpars.fsy" +//# 107 "src/Compiler/AbstractIL/ilpars.fsy" : ILInstr array)); -//# 610 "ilpars.fs" +//# 611 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 110 "src/Compiler/AbstractIL/ilpars.fsy" +//# 111 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 110 "src/Compiler/AbstractIL/ilpars.fsy" +//# 111 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_compQstring)); -//# 621 "ilpars.fs" +//# 622 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_compQstring in let _3 = parseState.GetInput(3) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 111 "src/Compiler/AbstractIL/ilpars.fsy" +//# 112 "src/Compiler/AbstractIL/ilpars.fsy" _1 + _3 ) -//# 111 "src/Compiler/AbstractIL/ilpars.fsy" +//# 112 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_compQstring)); -//# 633 "ilpars.fs" +//# 634 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 113 "src/Compiler/AbstractIL/ilpars.fsy" +//# 114 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 113 "src/Compiler/AbstractIL/ilpars.fsy" +//# 114 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_methodName)); -//# 644 "ilpars.fs" +//# 645 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_instr in let _2 = parseState.GetInput(2) :?> 'gentype_instrs2 in Microsoft.FSharp.Core.Operators.box ( ( -//# 117 "src/Compiler/AbstractIL/ilpars.fsy" +//# 118 "src/Compiler/AbstractIL/ilpars.fsy" _1 :: _2 ) -//# 117 "src/Compiler/AbstractIL/ilpars.fsy" +//# 118 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instrs2)); -//# 656 "ilpars.fs" +//# 657 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 118 "src/Compiler/AbstractIL/ilpars.fsy" +//# 119 "src/Compiler/AbstractIL/ilpars.fsy" [] ) -//# 118 "src/Compiler/AbstractIL/ilpars.fsy" +//# 119 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instrs2)); -//# 666 "ilpars.fs" +//# 667 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> NoArgInstr in Microsoft.FSharp.Core.Operators.box ( ( -//# 122 "src/Compiler/AbstractIL/ilpars.fsy" +//# 123 "src/Compiler/AbstractIL/ilpars.fsy" (_1 ()) ) -//# 122 "src/Compiler/AbstractIL/ilpars.fsy" +//# 123 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 677 "ilpars.fs" +//# 678 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Int32Instr in let _2 = parseState.GetInput(2) :?> 'gentype_int32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 124 "src/Compiler/AbstractIL/ilpars.fsy" +//# 125 "src/Compiler/AbstractIL/ilpars.fsy" (_1 _2) ) -//# 124 "src/Compiler/AbstractIL/ilpars.fsy" +//# 125 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 689 "ilpars.fs" +//# 690 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Int32Int32Instr in let _2 = parseState.GetInput(2) :?> 'gentype_int32 in @@ -694,60 +695,60 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 126 "src/Compiler/AbstractIL/ilpars.fsy" +//# 127 "src/Compiler/AbstractIL/ilpars.fsy" (_1 (_2,_3)) ) -//# 126 "src/Compiler/AbstractIL/ilpars.fsy" +//# 127 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 702 "ilpars.fs" +//# 703 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Int64Instr in let _2 = parseState.GetInput(2) :?> 'gentype_int64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 128 "src/Compiler/AbstractIL/ilpars.fsy" +//# 129 "src/Compiler/AbstractIL/ilpars.fsy" (_1 _2) ) -//# 128 "src/Compiler/AbstractIL/ilpars.fsy" +//# 129 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 714 "ilpars.fs" +//# 715 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> DoubleInstr in let _2 = parseState.GetInput(2) :?> 'gentype_float64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 130 "src/Compiler/AbstractIL/ilpars.fsy" +//# 131 "src/Compiler/AbstractIL/ilpars.fsy" (_1 (ILConst.R8 _2)) ) -//# 130 "src/Compiler/AbstractIL/ilpars.fsy" +//# 131 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 726 "ilpars.fs" +//# 727 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> DoubleInstr in let _2 = parseState.GetInput(2) :?> 'gentype_int64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 132 "src/Compiler/AbstractIL/ilpars.fsy" +//# 133 "src/Compiler/AbstractIL/ilpars.fsy" (_1 (ILConst.R8 (float _2))) ) -//# 132 "src/Compiler/AbstractIL/ilpars.fsy" +//# 133 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 738 "ilpars.fs" +//# 739 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> TypeInstr in let _2 = parseState.GetInput(2) :?> 'gentype_typSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 134 "src/Compiler/AbstractIL/ilpars.fsy" +//# 135 "src/Compiler/AbstractIL/ilpars.fsy" _1 (resolveCurrentMethodSpecScope _2) ) -//# 134 "src/Compiler/AbstractIL/ilpars.fsy" +//# 135 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 750 "ilpars.fs" +//# 751 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> IntTypeInstr in let _2 = parseState.GetInput(2) :?> 'gentype_int32 in @@ -755,768 +756,768 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 136 "src/Compiler/AbstractIL/ilpars.fsy" +//# 137 "src/Compiler/AbstractIL/ilpars.fsy" _1 ( _2,resolveCurrentMethodSpecScope _3) ) -//# 136 "src/Compiler/AbstractIL/ilpars.fsy" +//# 137 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 763 "ilpars.fs" +//# 764 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ValueTypeInstr in let _2 = parseState.GetInput(2) :?> 'gentype_typSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 138 "src/Compiler/AbstractIL/ilpars.fsy" +//# 139 "src/Compiler/AbstractIL/ilpars.fsy" _1 (resolveCurrentMethodSpecScope _2) ) -//# 138 "src/Compiler/AbstractIL/ilpars.fsy" +//# 139 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 775 "ilpars.fs" +//# 776 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> TokenInstr in let _2 = parseState.GetInput(2) :?> 'gentype_typSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 140 "src/Compiler/AbstractIL/ilpars.fsy" +//# 141 "src/Compiler/AbstractIL/ilpars.fsy" (_1 (ILToken.ILType (resolveCurrentMethodSpecScope _2))) ) -//# 140 "src/Compiler/AbstractIL/ilpars.fsy" +//# 141 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_instr)); -//# 787 "ilpars.fs" +//# 788 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_id in Microsoft.FSharp.Core.Operators.box ( ( -//# 147 "src/Compiler/AbstractIL/ilpars.fsy" +//# 148 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 147 "src/Compiler/AbstractIL/ilpars.fsy" +//# 148 "src/Compiler/AbstractIL/ilpars.fsy" : string)); -//# 798 "ilpars.fs" +//# 799 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 149 "src/Compiler/AbstractIL/ilpars.fsy" +//# 150 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 149 "src/Compiler/AbstractIL/ilpars.fsy" +//# 150 "src/Compiler/AbstractIL/ilpars.fsy" : string)); -//# 809 "ilpars.fs" +//# 810 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_id in Microsoft.FSharp.Core.Operators.box ( ( -//# 151 "src/Compiler/AbstractIL/ilpars.fsy" +//# 152 "src/Compiler/AbstractIL/ilpars.fsy" _1 + "." + _3 ) -//# 151 "src/Compiler/AbstractIL/ilpars.fsy" +//# 152 "src/Compiler/AbstractIL/ilpars.fsy" : string)); -//# 821 "ilpars.fs" +//# 822 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> string in let _4 = parseState.GetInput(4) :?> 'gentype_slashedName in Microsoft.FSharp.Core.Operators.box ( ( -//# 155 "src/Compiler/AbstractIL/ilpars.fsy" +//# 156 "src/Compiler/AbstractIL/ilpars.fsy" let (enc,nm) = _4 ILScopeRef.PrimaryAssembly, enc, nm ) -//# 155 "src/Compiler/AbstractIL/ilpars.fsy" +//# 156 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_className)); -//# 834 "ilpars.fs" +//# 835 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_slashedName in Microsoft.FSharp.Core.Operators.box ( ( -//# 158 "src/Compiler/AbstractIL/ilpars.fsy" +//# 159 "src/Compiler/AbstractIL/ilpars.fsy" let enc, nm = _1 in (ILScopeRef.Local, enc, nm) ) -//# 158 "src/Compiler/AbstractIL/ilpars.fsy" +//# 159 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_className)); -//# 845 "ilpars.fs" +//# 846 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 162 "src/Compiler/AbstractIL/ilpars.fsy" +//# 163 "src/Compiler/AbstractIL/ilpars.fsy" ([],_1) ) -//# 162 "src/Compiler/AbstractIL/ilpars.fsy" +//# 163 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_slashedName)); -//# 856 "ilpars.fs" +//# 857 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_slashedName in Microsoft.FSharp.Core.Operators.box ( ( -//# 164 "src/Compiler/AbstractIL/ilpars.fsy" +//# 165 "src/Compiler/AbstractIL/ilpars.fsy" let (enc,nm) = _3 in (_1 :: enc, nm) ) -//# 164 "src/Compiler/AbstractIL/ilpars.fsy" +//# 165 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_slashedName)); -//# 868 "ilpars.fs" +//# 869 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_className in let _2 = parseState.GetInput(2) :?> 'gentype_opt_actual_tyargs in Microsoft.FSharp.Core.Operators.box ( ( -//# 168 "src/Compiler/AbstractIL/ilpars.fsy" +//# 169 "src/Compiler/AbstractIL/ilpars.fsy" let (a,b,c) = _1 resolveMethodSpecScopeThen _2 (fun inst -> noMethodSpecScope ( (mkILTySpec ( (mkILNestedTyRef (a,b,c)), inst)))) ) -//# 168 "src/Compiler/AbstractIL/ilpars.fsy" +//# 169 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_typeNameInst)); -//# 882 "ilpars.fs" +//# 883 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_className in Microsoft.FSharp.Core.Operators.box ( ( -//# 175 "src/Compiler/AbstractIL/ilpars.fsy" +//# 176 "src/Compiler/AbstractIL/ilpars.fsy" let (a,b,c) = _1 noMethodSpecScope ( (mkILTySpec ( (mkILNestedTyRef (a,b,c)), []))) ) -//# 175 "src/Compiler/AbstractIL/ilpars.fsy" +//# 176 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_typeName)); -//# 894 "ilpars.fs" +//# 895 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeName in Microsoft.FSharp.Core.Operators.box ( ( -//# 181 "src/Compiler/AbstractIL/ilpars.fsy" +//# 182 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun tref -> noMethodSpecScope (mkILBoxedType tref)) ) -//# 181 "src/Compiler/AbstractIL/ilpars.fsy" +//# 182 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_typSpec)); -//# 906 "ilpars.fs" +//# 907 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILType ResolvedAtMethodSpecScope in Microsoft.FSharp.Core.Operators.box ( ( -//# 184 "src/Compiler/AbstractIL/ilpars.fsy" +//# 185 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 184 "src/Compiler/AbstractIL/ilpars.fsy" +//# 185 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_typSpec)); -//# 917 "ilpars.fs" +//# 918 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> ILType ResolvedAtMethodSpecScope in Microsoft.FSharp.Core.Operators.box ( ( -//# 186 "src/Compiler/AbstractIL/ilpars.fsy" +//# 187 "src/Compiler/AbstractIL/ilpars.fsy" _2 ) -//# 186 "src/Compiler/AbstractIL/ilpars.fsy" +//# 187 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_typSpec)); -//# 928 "ilpars.fs" +//# 929 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_callKind in Microsoft.FSharp.Core.Operators.box ( ( -//# 191 "src/Compiler/AbstractIL/ilpars.fsy" +//# 192 "src/Compiler/AbstractIL/ilpars.fsy" Callconv (ILThisConvention.Instance,_2) ) -//# 191 "src/Compiler/AbstractIL/ilpars.fsy" +//# 192 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_callConv)); -//# 939 "ilpars.fs" +//# 940 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_callKind in Microsoft.FSharp.Core.Operators.box ( ( -//# 193 "src/Compiler/AbstractIL/ilpars.fsy" +//# 194 "src/Compiler/AbstractIL/ilpars.fsy" Callconv (ILThisConvention.InstanceExplicit,_2) ) -//# 193 "src/Compiler/AbstractIL/ilpars.fsy" +//# 194 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_callConv)); -//# 950 "ilpars.fs" +//# 951 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_callKind in Microsoft.FSharp.Core.Operators.box ( ( -//# 195 "src/Compiler/AbstractIL/ilpars.fsy" +//# 196 "src/Compiler/AbstractIL/ilpars.fsy" Callconv (ILThisConvention.Static,_1) ) -//# 195 "src/Compiler/AbstractIL/ilpars.fsy" +//# 196 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_callConv)); -//# 961 "ilpars.fs" +//# 962 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 199 "src/Compiler/AbstractIL/ilpars.fsy" +//# 200 "src/Compiler/AbstractIL/ilpars.fsy" ILArgConvention.Default ) -//# 199 "src/Compiler/AbstractIL/ilpars.fsy" +//# 200 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_callKind)); -//# 971 "ilpars.fs" +//# 972 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 201 "src/Compiler/AbstractIL/ilpars.fsy" +//# 202 "src/Compiler/AbstractIL/ilpars.fsy" ILArgConvention.Default ) -//# 201 "src/Compiler/AbstractIL/ilpars.fsy" +//# 202 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_callKind)); -//# 981 "ilpars.fs" +//# 982 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 203 "src/Compiler/AbstractIL/ilpars.fsy" +//# 204 "src/Compiler/AbstractIL/ilpars.fsy" ILArgConvention.VarArg ) -//# 203 "src/Compiler/AbstractIL/ilpars.fsy" +//# 204 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_callKind)); -//# 991 "ilpars.fs" +//# 992 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 212 "src/Compiler/AbstractIL/ilpars.fsy" +//# 213 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_String ) -//# 212 "src/Compiler/AbstractIL/ilpars.fsy" +//# 213 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1001 "ilpars.fs" +//# 1002 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 214 "src/Compiler/AbstractIL/ilpars.fsy" +//# 215 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Object ) -//# 214 "src/Compiler/AbstractIL/ilpars.fsy" +//# 215 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1011 "ilpars.fs" +//# 1012 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typeNameInst in Microsoft.FSharp.Core.Operators.box ( ( -//# 216 "src/Compiler/AbstractIL/ilpars.fsy" +//# 217 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _2 (fun tspec -> noMethodSpecScope (mkILBoxedType tspec)) ) -//# 216 "src/Compiler/AbstractIL/ilpars.fsy" +//# 217 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1023 "ilpars.fs" +//# 1024 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_typeNameInst in Microsoft.FSharp.Core.Operators.box ( ( -//# 219 "src/Compiler/AbstractIL/ilpars.fsy" +//# 220 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _3 (fun tspec -> noMethodSpecScope (ILType.Value tspec)) ) -//# 219 "src/Compiler/AbstractIL/ilpars.fsy" +//# 220 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1035 "ilpars.fs" +//# 1036 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typeNameInst in Microsoft.FSharp.Core.Operators.box ( ( -//# 222 "src/Compiler/AbstractIL/ilpars.fsy" +//# 223 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _2 (fun tspec -> noMethodSpecScope (ILType.Value tspec)) ) -//# 222 "src/Compiler/AbstractIL/ilpars.fsy" +//# 223 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1047 "ilpars.fs" +//# 1048 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILType ResolvedAtMethodSpecScope in Microsoft.FSharp.Core.Operators.box ( ( -//# 225 "src/Compiler/AbstractIL/ilpars.fsy" +//# 226 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun ty -> noMethodSpecScope (mkILArr1DTy ty)) ) -//# 225 "src/Compiler/AbstractIL/ilpars.fsy" +//# 226 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1058 "ilpars.fs" +//# 1059 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILType ResolvedAtMethodSpecScope in let _3 = parseState.GetInput(3) :?> 'gentype_bounds1 in Microsoft.FSharp.Core.Operators.box ( ( -//# 227 "src/Compiler/AbstractIL/ilpars.fsy" +//# 228 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun ty -> noMethodSpecScope (mkILArrTy (ty,ILArrayShape _3))) ) -//# 227 "src/Compiler/AbstractIL/ilpars.fsy" +//# 228 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1070 "ilpars.fs" +//# 1071 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILType ResolvedAtMethodSpecScope in Microsoft.FSharp.Core.Operators.box ( ( -//# 229 "src/Compiler/AbstractIL/ilpars.fsy" +//# 230 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun ty -> noMethodSpecScope (ILType.Byref ty)) ) -//# 229 "src/Compiler/AbstractIL/ilpars.fsy" +//# 230 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1081 "ilpars.fs" +//# 1082 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ILType ResolvedAtMethodSpecScope in Microsoft.FSharp.Core.Operators.box ( ( -//# 231 "src/Compiler/AbstractIL/ilpars.fsy" +//# 232 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun ty -> noMethodSpecScope (ILType.Ptr ty)) ) -//# 231 "src/Compiler/AbstractIL/ilpars.fsy" +//# 232 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1092 "ilpars.fs" +//# 1093 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 233 "src/Compiler/AbstractIL/ilpars.fsy" +//# 234 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Char ) -//# 233 "src/Compiler/AbstractIL/ilpars.fsy" +//# 234 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1102 "ilpars.fs" +//# 1103 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 235 "src/Compiler/AbstractIL/ilpars.fsy" +//# 236 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope ILType.Void ) -//# 235 "src/Compiler/AbstractIL/ilpars.fsy" +//# 236 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1112 "ilpars.fs" +//# 1113 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 237 "src/Compiler/AbstractIL/ilpars.fsy" +//# 238 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Bool ) -//# 237 "src/Compiler/AbstractIL/ilpars.fsy" +//# 238 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1122 "ilpars.fs" +//# 1123 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 239 "src/Compiler/AbstractIL/ilpars.fsy" +//# 240 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_SByte ) -//# 239 "src/Compiler/AbstractIL/ilpars.fsy" +//# 240 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1132 "ilpars.fs" +//# 1133 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 241 "src/Compiler/AbstractIL/ilpars.fsy" +//# 242 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Int16 ) -//# 241 "src/Compiler/AbstractIL/ilpars.fsy" +//# 242 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1142 "ilpars.fs" +//# 1143 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 243 "src/Compiler/AbstractIL/ilpars.fsy" +//# 244 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Int32 ) -//# 243 "src/Compiler/AbstractIL/ilpars.fsy" +//# 244 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1152 "ilpars.fs" +//# 1153 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 245 "src/Compiler/AbstractIL/ilpars.fsy" +//# 246 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Int64 ) -//# 245 "src/Compiler/AbstractIL/ilpars.fsy" +//# 246 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1162 "ilpars.fs" +//# 1163 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 247 "src/Compiler/AbstractIL/ilpars.fsy" +//# 248 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Single ) -//# 247 "src/Compiler/AbstractIL/ilpars.fsy" +//# 248 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1172 "ilpars.fs" +//# 1173 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 249 "src/Compiler/AbstractIL/ilpars.fsy" +//# 250 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Double ) -//# 249 "src/Compiler/AbstractIL/ilpars.fsy" +//# 250 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1182 "ilpars.fs" +//# 1183 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 251 "src/Compiler/AbstractIL/ilpars.fsy" +//# 252 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Byte ) -//# 251 "src/Compiler/AbstractIL/ilpars.fsy" +//# 252 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1192 "ilpars.fs" +//# 1193 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 253 "src/Compiler/AbstractIL/ilpars.fsy" +//# 254 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UInt16 ) -//# 253 "src/Compiler/AbstractIL/ilpars.fsy" +//# 254 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1202 "ilpars.fs" +//# 1203 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 255 "src/Compiler/AbstractIL/ilpars.fsy" +//# 256 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UInt32 ) -//# 255 "src/Compiler/AbstractIL/ilpars.fsy" +//# 256 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1212 "ilpars.fs" +//# 1213 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 257 "src/Compiler/AbstractIL/ilpars.fsy" +//# 258 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UInt64 ) -//# 257 "src/Compiler/AbstractIL/ilpars.fsy" +//# 258 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1222 "ilpars.fs" +//# 1223 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 259 "src/Compiler/AbstractIL/ilpars.fsy" +//# 260 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_Byte ) -//# 259 "src/Compiler/AbstractIL/ilpars.fsy" +//# 260 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1232 "ilpars.fs" +//# 1233 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 261 "src/Compiler/AbstractIL/ilpars.fsy" +//# 262 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UInt16 ) -//# 261 "src/Compiler/AbstractIL/ilpars.fsy" +//# 262 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1242 "ilpars.fs" +//# 1243 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 263 "src/Compiler/AbstractIL/ilpars.fsy" +//# 264 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UInt32 ) -//# 263 "src/Compiler/AbstractIL/ilpars.fsy" +//# 264 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1252 "ilpars.fs" +//# 1253 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 265 "src/Compiler/AbstractIL/ilpars.fsy" +//# 266 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UInt64 ) -//# 265 "src/Compiler/AbstractIL/ilpars.fsy" +//# 266 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1262 "ilpars.fs" +//# 1263 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 267 "src/Compiler/AbstractIL/ilpars.fsy" +//# 268 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_IntPtr ) -//# 267 "src/Compiler/AbstractIL/ilpars.fsy" +//# 268 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1272 "ilpars.fs" +//# 1273 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 269 "src/Compiler/AbstractIL/ilpars.fsy" +//# 270 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UIntPtr ) -//# 269 "src/Compiler/AbstractIL/ilpars.fsy" +//# 270 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1282 "ilpars.fs" +//# 1283 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 271 "src/Compiler/AbstractIL/ilpars.fsy" +//# 272 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope PrimaryAssemblyILGlobals.typ_UIntPtr ) -//# 271 "src/Compiler/AbstractIL/ilpars.fsy" +//# 272 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1292 "ilpars.fs" +//# 1293 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_int32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 274 "src/Compiler/AbstractIL/ilpars.fsy" +//# 275 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope (ILType.TypeVar (uint16 ( _2))) ) -//# 274 "src/Compiler/AbstractIL/ilpars.fsy" +//# 275 "src/Compiler/AbstractIL/ilpars.fsy" : ILType ResolvedAtMethodSpecScope)); -//# 1303 "ilpars.fs" +//# 1304 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_bound in Microsoft.FSharp.Core.Operators.box ( ( -//# 279 "src/Compiler/AbstractIL/ilpars.fsy" +//# 280 "src/Compiler/AbstractIL/ilpars.fsy" [_1] ) -//# 279 "src/Compiler/AbstractIL/ilpars.fsy" +//# 280 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bounds1)); -//# 1314 "ilpars.fs" +//# 1315 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_bounds1 in let _3 = parseState.GetInput(3) :?> 'gentype_bound in Microsoft.FSharp.Core.Operators.box ( ( -//# 281 "src/Compiler/AbstractIL/ilpars.fsy" +//# 282 "src/Compiler/AbstractIL/ilpars.fsy" _1 @ [_3] ) -//# 281 "src/Compiler/AbstractIL/ilpars.fsy" +//# 282 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bounds1)); -//# 1326 "ilpars.fs" +//# 1327 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 285 "src/Compiler/AbstractIL/ilpars.fsy" +//# 286 "src/Compiler/AbstractIL/ilpars.fsy" (None, None) ) -//# 285 "src/Compiler/AbstractIL/ilpars.fsy" +//# 286 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bound)); -//# 1336 "ilpars.fs" +//# 1337 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_int32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 287 "src/Compiler/AbstractIL/ilpars.fsy" +//# 288 "src/Compiler/AbstractIL/ilpars.fsy" (None, Some _1) ) -//# 287 "src/Compiler/AbstractIL/ilpars.fsy" +//# 288 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bound)); -//# 1347 "ilpars.fs" +//# 1348 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_int32 in let _3 = parseState.GetInput(3) :?> 'gentype_int32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 289 "src/Compiler/AbstractIL/ilpars.fsy" +//# 290 "src/Compiler/AbstractIL/ilpars.fsy" (Some _1, Some (_3 - _1 + 1)) ) -//# 289 "src/Compiler/AbstractIL/ilpars.fsy" +//# 290 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bound)); -//# 1359 "ilpars.fs" +//# 1360 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_int32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 291 "src/Compiler/AbstractIL/ilpars.fsy" +//# 292 "src/Compiler/AbstractIL/ilpars.fsy" (Some _1, None) ) -//# 291 "src/Compiler/AbstractIL/ilpars.fsy" +//# 292 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bound)); -//# 1370 "ilpars.fs" +//# 1371 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int32 in let _2 = parseState.GetInput(2) :?> 'gentype_int32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 298 "src/Compiler/AbstractIL/ilpars.fsy" +//# 299 "src/Compiler/AbstractIL/ilpars.fsy" (Some _1, Some (_2 - _1 + 1)) ) -//# 298 "src/Compiler/AbstractIL/ilpars.fsy" +//# 299 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bound)); -//# 1382 "ilpars.fs" +//# 1383 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 300 "src/Compiler/AbstractIL/ilpars.fsy" +//# 301 "src/Compiler/AbstractIL/ilpars.fsy" (Some _1, None) ) -//# 300 "src/Compiler/AbstractIL/ilpars.fsy" +//# 301 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_bound)); -//# 1393 "ilpars.fs" +//# 1394 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 304 "src/Compiler/AbstractIL/ilpars.fsy" +//# 305 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 304 "src/Compiler/AbstractIL/ilpars.fsy" +//# 305 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_id)); -//# 1404 "ilpars.fs" +//# 1405 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 306 "src/Compiler/AbstractIL/ilpars.fsy" +//# 307 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 306 "src/Compiler/AbstractIL/ilpars.fsy" +//# 307 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_id)); -//# 1415 "ilpars.fs" +//# 1416 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 310 "src/Compiler/AbstractIL/ilpars.fsy" +//# 311 "src/Compiler/AbstractIL/ilpars.fsy" int32 _1 ) -//# 310 "src/Compiler/AbstractIL/ilpars.fsy" +//# 311 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_int32)); -//# 1426 "ilpars.fs" +//# 1427 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 314 "src/Compiler/AbstractIL/ilpars.fsy" +//# 315 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 314 "src/Compiler/AbstractIL/ilpars.fsy" +//# 315 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_int64)); -//# 1437 "ilpars.fs" +//# 1438 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> double in Microsoft.FSharp.Core.Operators.box ( ( -//# 318 "src/Compiler/AbstractIL/ilpars.fsy" +//# 319 "src/Compiler/AbstractIL/ilpars.fsy" _1 ) -//# 318 "src/Compiler/AbstractIL/ilpars.fsy" +//# 319 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_float64)); -//# 1448 "ilpars.fs" +//# 1449 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_int64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 320 "src/Compiler/AbstractIL/ilpars.fsy" +//# 321 "src/Compiler/AbstractIL/ilpars.fsy" System.BitConverter.Int64BitsToDouble _3 ) -//# 320 "src/Compiler/AbstractIL/ilpars.fsy" +//# 321 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_float64)); -//# 1459 "ilpars.fs" +//# 1460 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 324 "src/Compiler/AbstractIL/ilpars.fsy" +//# 325 "src/Compiler/AbstractIL/ilpars.fsy" noMethodSpecScope [] ) -//# 324 "src/Compiler/AbstractIL/ilpars.fsy" +//# 325 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_opt_actual_tyargs)); -//# 1469 "ilpars.fs" +//# 1470 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_actual_tyargs in Microsoft.FSharp.Core.Operators.box ( ( -//# 326 "src/Compiler/AbstractIL/ilpars.fsy" +//# 327 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun res -> noMethodSpecScope res) ) -//# 326 "src/Compiler/AbstractIL/ilpars.fsy" +//# 327 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_opt_actual_tyargs)); -//# 1481 "ilpars.fs" +//# 1482 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_actualTypSpecs in Microsoft.FSharp.Core.Operators.box ( ( -//# 331 "src/Compiler/AbstractIL/ilpars.fsy" +//# 332 "src/Compiler/AbstractIL/ilpars.fsy" _2 ) -//# 331 "src/Compiler/AbstractIL/ilpars.fsy" +//# 332 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_actual_tyargs)); -//# 1492 "ilpars.fs" +//# 1493 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 335 "src/Compiler/AbstractIL/ilpars.fsy" +//# 336 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun res -> noMethodSpecScope [ res]) ) -//# 335 "src/Compiler/AbstractIL/ilpars.fsy" +//# 336 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_actualTypSpecs)); -//# 1504 "ilpars.fs" +//# 1505 "ilpars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_actualTypSpecs in let _3 = parseState.GetInput(3) :?> 'gentype_typSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 338 "src/Compiler/AbstractIL/ilpars.fsy" +//# 339 "src/Compiler/AbstractIL/ilpars.fsy" resolveMethodSpecScopeThen _1 (fun x -> resolveMethodSpecScopeThen _3 (fun y -> noMethodSpecScope (x @ [ y]))) ) -//# 338 "src/Compiler/AbstractIL/ilpars.fsy" +//# 339 "src/Compiler/AbstractIL/ilpars.fsy" : 'gentype_actualTypSpecs)); |] -//# 1519 "ilpars.fs" +//# 1520 "ilpars.fs" let tables : Internal.Utilities.Text.Parsing.Tables<_> = { reductions = _fsyacc_reductions.Value; endOfInputTag = _fsyacc_endOfInputTag; diff --git a/src/fcs-fable/codegen/ilpars.fsi b/src/fcs-fable/codegen/ilpars.fsi index 35bd74ce2d..7165a93c72 100644 --- a/src/fcs-fable/codegen/ilpars.fsi +++ b/src/fcs-fable/codegen/ilpars.fsi @@ -38,7 +38,7 @@ type token = | FIELD | EXPLICIT | EOF - | ELIPSES + | ELLIPSES | DOT | DEFAULT | DCOLON @@ -65,7 +65,7 @@ type token = | INSTR_I32_I32 of (Int32Int32Instr) | INSTR_I of (Int32Instr) | VAL_FLOAT64 of (double) - | VAL_INT32_ELIPSES of (int32) + | VAL_INT32_ELLIPSES of (int32) | VAL_INT64 of (int64) type tokenId = | TOKEN_VOID @@ -103,7 +103,7 @@ type tokenId = | TOKEN_FIELD | TOKEN_EXPLICIT | TOKEN_EOF - | TOKEN_ELIPSES + | TOKEN_ELLIPSES | TOKEN_DOT | TOKEN_DEFAULT | TOKEN_DCOLON @@ -130,7 +130,7 @@ type tokenId = | TOKEN_INSTR_I32_I32 | TOKEN_INSTR_I | TOKEN_VAL_FLOAT64 - | TOKEN_VAL_INT32_ELIPSES + | TOKEN_VAL_INT32_ELLIPSES | TOKEN_VAL_INT64 | TOKEN_end_of_input | TOKEN_error diff --git a/src/fcs-fable/codegen/lex.fs b/src/fcs-fable/codegen/lex.fs index dddb25db9b..f34e0f36c5 100644 --- a/src/fcs-fable/codegen/lex.fs +++ b/src/fcs-fable/codegen/lex.fs @@ -5,6 +5,7 @@ open Internal.Utilities.Text.Lexing open FSharp.Compiler.Parser open FSharp.Compiler.Text open FSharp.Compiler.ParseHelpers +open FSharp.Compiler.LexerStore //# 3 "src/Compiler/lex.fsl" @@ -184,10 +185,14 @@ let startString args (lexbuf: UnicodeLexing.Lexbuf) = if kind.IsInterpolated then fail args lexbuf (FSComp.SR.lexByteStringMayNotBeInterpolated()) () BYTEARRAY (Lexhelp.stringBufferAsBytes buf, synByteStringKind, cont) - elif Lexhelp.stringBufferIsBytes buf then - BYTEARRAY (Lexhelp.stringBufferAsBytes buf, synByteStringKind, cont) else - fail args lexbuf (FSComp.SR.lexByteArrayCannotEncode()) () + match Lexhelp.errorsInByteStringBuffer buf with + | Some (largerThanOneByte, largerThan127) -> + if largerThanOneByte > 0 then + fail args lexbuf (FSComp.SR.lexByteArrayCannotEncode(largerThanOneByte)) () + if largerThan127 > 0 then + warning (Error(FSComp.SR.lexByteArrayOutisdeAscii(largerThan127), lexbuf.LexemeRange)) + | None -> () BYTEARRAY (Lexhelp.stringBufferAsBytes buf, synByteStringKind, cont) elif kind.IsInterpolated then let s = Lexhelp.stringBufferAsString buf @@ -232,7 +237,7 @@ let trySaveXmlDoc (lexbuf: LexBuffer) (buff: (range * StringBuilder) optio | None -> () | Some (start, sb) -> let xmlCommentLineRange = mkFileIndexRange start.FileIndex start.Start (posOfLexPosition lexbuf.StartPos) - LexbufLocalXmlDocStore.SaveXmlDocLine (lexbuf, sb.ToString(), xmlCommentLineRange) + XmlDocStore.SaveXmlDocLine (lexbuf, sb.ToString(), xmlCommentLineRange) let tryAppendXmlDoc (buff: (range * StringBuilder) option) (s:string) = match buff with @@ -241,9 +246,8 @@ let tryAppendXmlDoc (buff: (range * StringBuilder) option) (s:string) = // Utilities for parsing #if/#else/#endif -let shouldStartLine args lexbuf (m:range) err tok = - if (m.StartColumn <> 0) then fail args lexbuf err tok - else tok +let shouldStartLine args lexbuf (m:range) err = + if (m.StartColumn <> 0) then fail args lexbuf err () let shouldStartFile args lexbuf (m:range) err tok = if (m.StartColumn <> 0 || m.StartLine <> 1) then fail args lexbuf err tok @@ -268,7 +272,7 @@ let evalFloat args lexbuf = fail args lexbuf (FSComp.SR.lexInvalidFloat()) 0.0f -//# 271 "lex.fs" +//# 275 "lex.fs" let trans : uint16[] array = [| (* State 0 *) @@ -1076,27 +1080,27 @@ let trans : uint16[] array = (* State 401 *) [| 448us;448us;448us;448us;448us;448us;448us;448us;448us;419us;421us;448us;448us;422us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;418us;446us;415us;424us;416us;442us;426us;413us;414us;428us;429us;444us;430us;431us;433us;420us;412us;411us;411us;411us;411us;411us;411us;411us;411us;411us;434us;436us;425us;437us;435us;432us;417us;402us;402us;402us;402us;403us;404us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;402us;438us;448us;440us;445us;402us;423us;405us;402us;402us;406us;402us;402us;402us;402us;402us;402us;402us;402us;407us;402us;402us;402us;402us;408us;402us;402us;402us;402us;409us;402us;410us;402us;439us;427us;441us;443us;448us;402us;402us;402us;402us;402us;448us;448us;448us;411us;402us;448us;448us;448us;448us;448us;448us;447us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;448us;449us;|]; (* State 402 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 403 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;822us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;824us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 404 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;819us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;821us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 405 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;816us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;818us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 406 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;814us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;816us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 407 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;809us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;811us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 408 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;803us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;805us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 409 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;798us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;800us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 410 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;793us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;795us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 411 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;717us;65535us;713us;713us;713us;713us;713us;713us;713us;713us;713us;713us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;726us;726us;726us;722us;723us;725us;726us;725us;726us;726us;719us;724us;725us;726us;726us;725us;725us;726us;726us;720us;726us;726us;726us;726us;725us;65535us;65535us;65535us;65535us;714us;65535us;726us;726us;726us;726us;722us;723us;726us;726us;726us;726us;726us;718us;724us;721us;726us;726us;726us;726us;716us;726us;715us;726us;726us;726us;712us;726us;65535us;65535us;65535us;65535us;65535us;726us;726us;726us;726us;726us;726us;726us;65535us;713us;726us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;719us;65535us;715us;715us;715us;715us;715us;715us;715us;715us;715us;715us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;728us;728us;728us;724us;725us;727us;728us;727us;728us;728us;721us;726us;727us;728us;728us;727us;727us;728us;728us;722us;728us;728us;728us;728us;727us;65535us;65535us;65535us;65535us;716us;65535us;728us;728us;728us;728us;724us;725us;728us;728us;728us;728us;728us;720us;726us;723us;728us;728us;728us;728us;718us;728us;717us;728us;728us;728us;714us;728us;65535us;65535us;65535us;65535us;65535us;728us;728us;728us;728us;728us;728us;728us;65535us;715us;728us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 412 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;717us;65535us;713us;713us;713us;713us;713us;713us;713us;713us;713us;713us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;768us;726us;726us;722us;723us;725us;726us;725us;726us;726us;719us;724us;725us;767us;726us;725us;725us;726us;726us;720us;726us;726us;766us;726us;725us;65535us;65535us;65535us;65535us;714us;65535us;726us;768us;726us;726us;722us;723us;726us;726us;726us;726us;726us;718us;724us;721us;767us;726us;726us;726us;716us;726us;715us;726us;726us;766us;712us;726us;65535us;65535us;65535us;65535us;65535us;726us;726us;726us;726us;726us;726us;726us;65535us;713us;726us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;719us;65535us;715us;715us;715us;715us;715us;715us;715us;715us;715us;715us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;770us;728us;728us;724us;725us;727us;728us;727us;728us;728us;721us;726us;727us;769us;728us;727us;727us;728us;728us;722us;728us;728us;768us;728us;727us;65535us;65535us;65535us;65535us;716us;65535us;728us;770us;728us;728us;724us;725us;728us;728us;728us;728us;728us;720us;726us;723us;769us;728us;728us;728us;718us;728us;717us;728us;728us;768us;714us;728us;65535us;65535us;65535us;65535us;65535us;728us;728us;728us;728us;728us;728us;728us;65535us;715us;728us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 413 *) [| 682us;682us;682us;682us;682us;682us;682us;682us;65535us;65535us;65535us;682us;682us;65535us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;683us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;682us;65535us;|]; (* State 414 *) @@ -1636,15 +1640,15 @@ let trans : uint16[] array = (* State 681 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 682 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;710us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;712us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 683 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;682us;65535us;65535us;65535us;65535us;682us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;684us;684us;684us;684us;684us;684us;684us;684us;684us;684us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;687us;65535us;65535us;65535us;65535us;65535us;65535us;682us;65535us;65535us;65535us;65535us;682us;682us;65535us;65535us;65535us;682us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;682us;65535us;65535us;65535us;682us;65535us;682us;685us;682us;65535us;686us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;684us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 684 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;706us;706us;706us;706us;706us;706us;706us;706us;706us;706us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;706us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;708us;708us;708us;708us;708us;708us;708us;708us;708us;708us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;708us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 685 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;700us;700us;700us;700us;700us;700us;700us;700us;700us;700us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;700us;700us;700us;700us;700us;700us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;700us;700us;700us;700us;700us;700us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;702us;702us;702us;702us;702us;702us;702us;702us;702us;702us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;702us;702us;702us;702us;702us;702us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;702us;702us;702us;702us;702us;702us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 686 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;697us;697us;697us;697us;697us;697us;697us;697us;697us;697us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;697us;697us;697us;697us;697us;697us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;697us;697us;697us;697us;697us;697us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;698us;698us;698us;698us;698us;698us;698us;698us;698us;698us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;698us;698us;698us;698us;698us;698us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;698us;698us;698us;698us;698us;698us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 687 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;688us;688us;688us;688us;688us;688us;688us;688us;688us;688us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;688us;688us;688us;688us;688us;688us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;688us;688us;688us;688us;688us;688us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 688 *) @@ -1664,396 +1668,400 @@ let trans : uint16[] array = (* State 695 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;696us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 696 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;697us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 697 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;698us;698us;698us;698us;698us;698us;698us;698us;698us;698us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;698us;698us;698us;698us;698us;698us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;698us;698us;698us;698us;698us;698us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 698 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;699us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;699us;699us;699us;699us;699us;699us;699us;699us;699us;699us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;699us;699us;699us;699us;699us;699us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;699us;699us;699us;699us;699us;699us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 699 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;700us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 700 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;701us;701us;701us;701us;701us;701us;701us;701us;701us;701us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;701us;701us;701us;701us;701us;701us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;701us;701us;701us;701us;701us;701us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;701us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 701 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;702us;702us;702us;702us;702us;702us;702us;702us;702us;702us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;702us;702us;702us;702us;702us;702us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;702us;702us;702us;702us;702us;702us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 702 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;703us;703us;703us;703us;703us;703us;703us;703us;703us;703us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;703us;703us;703us;703us;703us;703us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;703us;703us;703us;703us;703us;703us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 703 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;704us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;704us;704us;704us;704us;704us;704us;704us;704us;704us;704us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;704us;704us;704us;704us;704us;704us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;704us;704us;704us;704us;704us;704us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 704 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;705us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;705us;705us;705us;705us;705us;705us;705us;705us;705us;705us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;705us;705us;705us;705us;705us;705us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;705us;705us;705us;705us;705us;705us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 705 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;706us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 706 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;707us;707us;707us;707us;707us;707us;707us;707us;707us;707us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;707us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;707us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 707 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;708us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 708 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;709us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;709us;709us;709us;709us;709us;709us;709us;709us;709us;709us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;709us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 709 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;710us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 710 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;711us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 711 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 712 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;713us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 713 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;717us;65535us;756us;756us;756us;756us;756us;756us;756us;756us;756us;756us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;746us;764us;765us;740us;765us;740us;740us;761us;739us;765us;740us;740us;765us;765us;740us;740us;762us;740us;740us;740us;740us;765us;65535us;65535us;65535us;65535us;757us;65535us;740us;740us;740us;740us;746us;764us;740us;740us;740us;740us;740us;760us;739us;763us;740us;740us;740us;740us;759us;740us;758us;740us;740us;740us;755us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;756us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 714 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;753us;753us;753us;753us;753us;753us;753us;753us;753us;753us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;754us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;753us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 715 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;741us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;751us;727us;752us;727us;727us;727us;727us;750us;727us;727us;727us;727us;727us;749us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;719us;65535us;758us;758us;758us;758us;758us;758us;758us;758us;758us;758us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;748us;766us;767us;742us;767us;742us;742us;763us;741us;767us;742us;742us;767us;767us;742us;742us;764us;742us;742us;742us;742us;767us;65535us;65535us;65535us;65535us;759us;65535us;742us;742us;742us;742us;748us;766us;742us;742us;742us;742us;742us;762us;741us;765us;742us;742us;742us;742us;761us;742us;760us;742us;742us;742us;757us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;758us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 716 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;755us;755us;755us;755us;755us;755us;755us;755us;755us;755us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;756us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;755us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 717 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;743us;743us;743us;743us;743us;743us;743us;743us;743us;743us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;726us;726us;726us;722us;731us;726us;726us;726us;726us;726us;726us;724us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;65535us;65535us;65535us;65535us;726us;65535us;726us;726us;726us;726us;722us;731us;726us;726us;726us;726us;726us;726us;724us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;65535us;65535us;65535us;65535us;65535us;726us;726us;726us;726us;726us;726us;726us;65535us;743us;726us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;743us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;753us;729us;754us;729us;729us;729us;729us;752us;729us;729us;729us;729us;729us;751us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 718 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 719 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;744us;65535us;745us;745us;745us;745us;745us;745us;745us;745us;745us;745us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;728us;728us;728us;724us;733us;728us;728us;728us;728us;728us;728us;726us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;65535us;65535us;65535us;65535us;728us;65535us;728us;728us;728us;728us;724us;733us;728us;728us;728us;728us;728us;728us;726us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;65535us;65535us;65535us;65535us;65535us;728us;728us;728us;728us;728us;728us;728us;65535us;745us;728us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 720 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;741us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 721 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 722 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;729us;65535us;729us;65535us;65535us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;728us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;743us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 723 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 724 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;731us;65535us;731us;65535us;65535us;730us;730us;730us;730us;730us;730us;730us;730us;730us;730us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;730us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 725 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 726 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 727 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 728 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;737us;737us;737us;737us;737us;737us;737us;737us;737us;737us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;738us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;737us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 729 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;730us;730us;730us;730us;730us;730us;730us;730us;730us;730us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;730us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 730 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;732us;732us;732us;732us;732us;732us;732us;732us;732us;732us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;726us;726us;726us;726us;726us;731us;726us;726us;726us;726us;726us;726us;724us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;65535us;65535us;65535us;65535us;733us;65535us;726us;726us;726us;726us;726us;731us;726us;726us;726us;726us;726us;726us;724us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;726us;65535us;65535us;65535us;65535us;65535us;726us;726us;726us;726us;726us;726us;726us;65535us;732us;726us;65535us;65535us;65535us;65535us;65535us;726us;65535us;65535us;726us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;739us;739us;739us;739us;739us;739us;739us;739us;739us;739us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;740us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;739us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 731 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;732us;732us;732us;732us;732us;732us;732us;732us;732us;732us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;732us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 732 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;737us;737us;737us;737us;737us;737us;737us;737us;737us;737us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;738us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;737us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;734us;734us;734us;734us;734us;734us;734us;734us;734us;734us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;728us;728us;728us;728us;728us;733us;728us;728us;728us;728us;728us;728us;726us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;65535us;65535us;65535us;65535us;735us;65535us;728us;728us;728us;728us;728us;733us;728us;728us;728us;728us;728us;728us;726us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;65535us;65535us;65535us;65535us;65535us;728us;728us;728us;728us;728us;728us;728us;65535us;734us;728us;65535us;65535us;65535us;65535us;65535us;728us;65535us;65535us;728us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 733 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;734us;734us;734us;734us;734us;734us;734us;734us;734us;734us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;735us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;734us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 734 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;737us;737us;737us;737us;737us;737us;737us;737us;737us;737us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;738us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;737us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;739us;739us;739us;739us;739us;739us;739us;739us;739us;739us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;740us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;739us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 735 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;734us;734us;734us;734us;734us;734us;734us;734us;734us;734us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;735us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;734us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;736us;736us;736us;736us;736us;736us;736us;736us;736us;736us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;737us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;736us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 736 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;739us;739us;739us;739us;739us;739us;739us;739us;739us;739us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;740us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;739us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 737 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;737us;737us;737us;737us;737us;737us;737us;737us;737us;737us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;738us;65535us;740us;740us;740us;740us;740us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;737us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;736us;736us;736us;736us;736us;736us;736us;736us;736us;736us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;737us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;736us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 738 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;734us;734us;734us;734us;734us;734us;734us;734us;734us;734us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;735us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;734us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 739 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;739us;739us;739us;739us;739us;739us;739us;739us;739us;739us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;740us;65535us;742us;742us;742us;742us;742us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;739us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 740 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;736us;736us;736us;736us;736us;736us;736us;736us;736us;736us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;737us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;736us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 741 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 742 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 743 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;744us;744us;744us;744us;744us;744us;744us;744us;744us;744us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;746us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;745us;65535us;740us;740us;740us;740us;746us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;744us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 744 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;744us;744us;744us;744us;744us;744us;744us;744us;744us;744us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;746us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;745us;65535us;740us;740us;740us;740us;746us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;744us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 745 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;747us;747us;747us;747us;747us;747us;747us;747us;747us;747us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;748us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;747us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;746us;746us;746us;746us;746us;746us;746us;746us;746us;746us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;748us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;747us;65535us;742us;742us;742us;742us;748us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;746us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 746 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;729us;65535us;729us;65535us;65535us;728us;728us;728us;728us;728us;728us;728us;728us;728us;728us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;728us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;746us;746us;746us;746us;746us;746us;746us;746us;746us;746us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;748us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;747us;65535us;742us;742us;742us;742us;748us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;746us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 747 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;744us;744us;744us;744us;744us;744us;744us;744us;744us;744us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;746us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;745us;65535us;740us;740us;740us;740us;746us;736us;740us;740us;740us;740us;740us;740us;739us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;744us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;749us;749us;749us;749us;749us;749us;749us;749us;749us;749us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;750us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;749us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 748 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;747us;747us;747us;747us;747us;747us;747us;747us;747us;747us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;748us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;747us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;731us;65535us;731us;65535us;65535us;730us;730us;730us;730us;730us;730us;730us;730us;730us;730us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;730us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 749 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;746us;746us;746us;746us;746us;746us;746us;746us;746us;746us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;748us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;747us;65535us;742us;742us;742us;742us;748us;738us;742us;742us;742us;742us;742us;742us;741us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;746us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 750 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;749us;749us;749us;749us;749us;749us;749us;749us;749us;749us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;750us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;749us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 751 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 752 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 753 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;717us;65535us;756us;756us;756us;756us;756us;756us;756us;756us;756us;756us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;746us;764us;765us;740us;765us;740us;740us;761us;739us;765us;740us;740us;765us;765us;740us;740us;762us;740us;740us;740us;740us;765us;65535us;65535us;65535us;65535us;757us;65535us;740us;740us;740us;740us;746us;764us;740us;740us;740us;740us;740us;760us;739us;763us;740us;740us;740us;740us;759us;740us;758us;740us;740us;740us;755us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;756us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 754 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;753us;753us;753us;753us;753us;753us;753us;753us;753us;753us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;754us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;753us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 755 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;719us;65535us;758us;758us;758us;758us;758us;758us;758us;758us;758us;758us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;748us;766us;767us;742us;767us;742us;742us;763us;741us;767us;742us;742us;767us;767us;742us;742us;764us;742us;742us;742us;742us;767us;65535us;65535us;65535us;65535us;759us;65535us;742us;742us;742us;742us;748us;766us;742us;742us;742us;742us;742us;762us;741us;765us;742us;742us;742us;742us;761us;742us;760us;742us;742us;742us;757us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;758us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 756 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;717us;65535us;756us;756us;756us;756us;756us;756us;756us;756us;756us;756us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;746us;764us;765us;740us;765us;740us;740us;761us;739us;765us;740us;740us;765us;765us;740us;740us;762us;740us;740us;740us;740us;765us;65535us;65535us;65535us;65535us;757us;65535us;740us;740us;740us;740us;746us;764us;740us;740us;740us;740us;740us;760us;739us;763us;740us;740us;740us;740us;759us;740us;758us;740us;740us;740us;755us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;756us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;755us;755us;755us;755us;755us;755us;755us;755us;755us;755us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;756us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;755us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 757 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;753us;753us;753us;753us;753us;753us;753us;753us;753us;753us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;754us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;753us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 758 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;741us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;751us;727us;752us;727us;727us;727us;727us;750us;727us;727us;727us;727us;727us;749us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;719us;65535us;758us;758us;758us;758us;758us;758us;758us;758us;758us;758us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;748us;766us;767us;742us;767us;742us;742us;763us;741us;767us;742us;742us;767us;767us;742us;742us;764us;742us;742us;742us;742us;767us;65535us;65535us;65535us;65535us;759us;65535us;742us;742us;742us;742us;748us;766us;742us;742us;742us;742us;742us;762us;741us;765us;742us;742us;742us;742us;761us;742us;760us;742us;742us;742us;757us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;758us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 759 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;755us;755us;755us;755us;755us;755us;755us;755us;755us;755us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;756us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;755us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 760 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;743us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;753us;729us;754us;729us;729us;729us;729us;752us;729us;729us;729us;729us;729us;751us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 761 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 762 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;741us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 763 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 764 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;743us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 765 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 766 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;785us;785us;785us;785us;785us;785us;785us;785us;785us;785us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;785us;785us;785us;785us;785us;785us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;785us;785us;785us;785us;785us;785us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 767 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;780us;780us;780us;780us;780us;780us;780us;780us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 768 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;769us;769us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;787us;787us;787us;787us;787us;787us;787us;787us;787us;787us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;787us;787us;787us;787us;787us;787us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;787us;787us;787us;787us;787us;787us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 769 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;771us;771us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;772us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;782us;782us;782us;782us;782us;782us;782us;782us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 770 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;771us;771us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 771 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;771us;771us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;772us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;773us;773us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;774us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 772 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;778us;778us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;779us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 773 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;773us;773us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;774us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 774 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;777us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;780us;780us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;781us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 775 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;776us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 776 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;779us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 777 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;727us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;778us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 778 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;771us;771us;740us;740us;740us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;772us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 779 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;778us;778us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;779us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;729us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 780 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;781us;781us;781us;781us;781us;781us;781us;781us;740us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;782us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;773us;773us;742us;742us;742us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;774us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 781 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;781us;781us;781us;781us;781us;781us;781us;781us;740us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;782us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;780us;780us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;781us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 782 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;783us;783us;783us;783us;783us;783us;783us;783us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;784us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;783us;783us;783us;783us;783us;783us;783us;783us;742us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;784us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 783 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;781us;781us;781us;781us;781us;781us;781us;781us;740us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;782us;65535us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;783us;783us;783us;783us;783us;783us;783us;783us;742us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;784us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 784 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;783us;783us;783us;783us;783us;783us;783us;783us;727us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;784us;65535us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;785us;785us;785us;785us;785us;785us;785us;785us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;786us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 785 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;786us;786us;786us;786us;786us;786us;786us;786us;786us;786us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;786us;786us;786us;786us;786us;786us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;787us;65535us;786us;786us;786us;786us;786us;786us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;783us;783us;783us;783us;783us;783us;783us;783us;742us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;784us;65535us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 786 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;786us;786us;786us;786us;786us;786us;786us;786us;786us;786us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;786us;786us;786us;786us;786us;786us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;787us;65535us;786us;786us;786us;786us;786us;786us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;785us;785us;785us;785us;785us;785us;785us;785us;729us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;786us;65535us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 787 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;788us;788us;788us;788us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;789us;65535us;788us;788us;788us;788us;788us;788us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;788us;788us;788us;788us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;789us;65535us;788us;788us;788us;788us;788us;788us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 788 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;786us;786us;786us;786us;786us;786us;786us;786us;786us;786us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;786us;786us;786us;786us;786us;786us;740us;740us;740us;740us;740us;775us;740us;740us;740us;740us;740us;740us;740us;740us;762us;740us;740us;740us;740us;740us;65535us;65535us;65535us;65535us;787us;65535us;786us;786us;786us;786us;786us;786us;740us;740us;740us;740us;740us;774us;740us;763us;740us;740us;740us;740us;773us;740us;758us;740us;740us;740us;770us;740us;65535us;65535us;65535us;65535us;65535us;740us;740us;740us;740us;740us;740us;740us;65535us;740us;740us;65535us;65535us;65535us;65535us;65535us;740us;65535us;65535us;740us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;788us;788us;788us;788us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;789us;65535us;788us;788us;788us;788us;788us;788us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 789 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;788us;788us;788us;788us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;789us;65535us;788us;788us;788us;788us;788us;788us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;727us;727us;727us;727us;727us;727us;65535us;727us;727us;65535us;65535us;65535us;65535us;65535us;727us;65535us;65535us;727us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;791us;65535us;790us;790us;790us;790us;790us;790us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 790 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;788us;788us;788us;788us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;788us;788us;788us;788us;788us;788us;742us;742us;742us;742us;742us;777us;742us;742us;742us;742us;742us;742us;742us;742us;764us;742us;742us;742us;742us;742us;65535us;65535us;65535us;65535us;789us;65535us;788us;788us;788us;788us;788us;788us;742us;742us;742us;742us;742us;776us;742us;765us;742us;742us;742us;742us;775us;742us;760us;742us;742us;742us;772us;742us;65535us;65535us;65535us;65535us;65535us;742us;742us;742us;742us;742us;742us;742us;65535us;742us;742us;65535us;65535us;65535us;65535us;65535us;742us;65535us;65535us;742us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 791 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;791us;65535us;790us;790us;790us;790us;790us;790us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;729us;729us;729us;729us;729us;729us;65535us;729us;729us;65535us;65535us;65535us;65535us;65535us;729us;65535us;65535us;729us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 792 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 793 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;794us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 794 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;795us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 795 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;796us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;796us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 796 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;797us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;797us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 797 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;798us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 798 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;799us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;799us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 799 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;800us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 800 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;801us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;801us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 801 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;802us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;802us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 802 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;803us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 803 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;804us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;804us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 804 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;805us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 805 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;806us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;806us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 806 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;807us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;807us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 807 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;808us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;808us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 808 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;809us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 809 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;810us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;810us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 810 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;811us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 811 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;812us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;812us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 812 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;813us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;813us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 813 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;814us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 814 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;815us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;815us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 815 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 816 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;817us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;817us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 817 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;818us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; - (* State 818 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + (* State 818 *) + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;819us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 819 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;820us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;820us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 820 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;821us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; - (* State 821 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + (* State 821 *) + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;822us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 822 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;823us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;823us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 823 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;824us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 824 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;825us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;825us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 825 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;791us;65535us;792us;65535us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;826us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;790us;65535us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;790us;790us;790us;790us;790us;790us;65535us;790us;790us;65535us;65535us;65535us;65535us;65535us;790us;65535us;65535us;790us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;826us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 826 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;827us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;827us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 827 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;828us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;793us;65535us;794us;65535us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;828us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;792us;65535us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;792us;792us;792us;792us;792us;792us;65535us;792us;792us;65535us;65535us;65535us;65535us;65535us;792us;65535us;65535us;792us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 828 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;829us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;829us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 829 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;830us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;830us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 830 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;831us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;831us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 831 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;832us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;832us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 832 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;833us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;833us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 833 *) - [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;834us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;834us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; (* State 834 *) + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;835us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + (* State 835 *) + [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;836us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; + (* State 836 *) [| 65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;|]; |] -let actions : uint16[] = [|65535us;0us;1us;6us;6us;4us;4us;5us;4us;4us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;3us;65535us;65535us;65535us;65535us;2us;1us;65535us;4us;1us;1us;1us;1us;2us;4us;3us;4us;4us;2us;1us;1us;65535us;65535us;65535us;65535us;1us;1us;65535us;1us;1us;65535us;1us;1us;65535us;1us;65535us;0us;65535us;1us;2us;2us;2us;2us;3us;5us;4us;5us;5us;3us;2us;2us;65535us;65535us;65535us;65535us;2us;2us;65535us;2us;2us;65535us;2us;2us;65535us;2us;0us;65535us;5us;1us;1us;1us;1us;2us;3us;5us;4us;5us;5us;3us;1us;1us;65535us;65535us;65535us;65535us;1us;1us;65535us;1us;1us;65535us;1us;1us;65535us;1us;0us;65535us;1us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;0us;65535us;10us;1us;10us;10us;6us;10us;10us;8us;8us;8us;9us;10us;8us;8us;8us;7us;6us;5us;4us;3us;65535us;2us;65535us;65535us;0us;65535us;0us;3us;1us;2us;2us;2us;2us;2us;2us;2us;2us;0us;65535us;7us;1us;7us;2us;2us;2us;2us;3us;4us;5us;6us;7us;7us;5us;4us;3us;2us;2us;65535us;65535us;65535us;65535us;2us;2us;65535us;2us;2us;65535us;2us;2us;65535us;2us;1us;65535us;0us;65535us;9us;1us;9us;2us;3us;3us;4us;6us;7us;8us;9us;9us;5us;4us;3us;65535us;65535us;65535us;65535us;3us;3us;65535us;3us;3us;65535us;3us;3us;65535us;2us;1us;65535us;0us;65535us;1us;3us;11us;5us;6us;7us;8us;8us;9us;10us;11us;11us;9us;8us;65535us;65535us;65535us;65535us;8us;8us;65535us;8us;8us;65535us;8us;8us;65535us;7us;4us;3us;0us;2us;65535us;16us;6us;9us;10us;11us;16us;12us;13us;13us;14us;15us;16us;16us;14us;13us;65535us;65535us;65535us;65535us;13us;13us;65535us;13us;13us;65535us;13us;13us;65535us;12us;11us;8us;7us;0us;65535us;1us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;5us;65535us;65535us;65535us;4us;65535us;3us;65535us;2us;0us;65535us;0us;2us;1us;2us;2us;0us;65535us;4us;4us;4us;3us;4us;4us;4us;5us;4us;3us;4us;4us;4us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;2us;65535us;2us;2us;2us;65535us;1us;65535us;1us;1us;1us;65535us;0us;0us;0us;4us;4us;4us;4us;4us;4us;2us;4us;2us;2us;2us;4us;1us;4us;1us;1us;1us;4us;0us;0us;0us;65535us;0us;0us;0us;0us;0us;0us;0us;0us;0us;16us;16us;73us;74us;47us;110us;118us;54us;55us;116us;59us;133us;63us;69us;100us;70us;108us;75us;76us;77us;113us;79us;83us;84us;101us;94us;96us;97us;107us;103us;109us;111us;114us;117us;118us;123us;133us;133us;134us;119us;123us;119us;118us;117us;112us;116us;99us;98us;102us;119us;93us;120us;106us;120us;89us;85us;86us;91us;92us;90us;81us;116us;119us;65535us;116us;117us;118us;119us;123us;120us;121us;122us;123us;65535us;65535us;124us;65535us;124us;124us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;124us;65535us;124us;65535us;124us;65535us;65535us;65535us;65535us;122us;121us;116us;119us;119us;116us;117us;118us;119us;119us;119us;119us;119us;119us;119us;119us;119us;119us;118us;117us;116us;115us;115us;115us;115us;82us;80us;78us;72us;104us;105us;71us;65us;95us;66us;65535us;65535us;65535us;125us;65535us;65535us;65535us;65535us;65535us;65535us;130us;65535us;130us;132us;132us;130us;130us;65535us;129us;65535us;129us;132us;132us;129us;129us;65535us;131us;128us;132us;132us;128us;128us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;127us;126us;125us;65535us;65535us;65535us;65535us;126us;126us;132us;132us;126us;65535us;65535us;65535us;64us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;63us;62us;63us;63us;61us;62us;60us;59us;58us;57us;58us;56us;57us;56us;55us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;54us;52us;118us;67us;118us;68us;88us;87us;53us;50us;119us;118us;65535us;65535us;49us;65535us;48us;65535us;51us;45us;65535us;65535us;44us;41us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;46us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;40us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;39us;65535us;65535us;37us;65535us;65535us;65535us;65535us;38us;36us;65535us;65535us;34us;35us;32us;33us;9us;16us;31us;18us;12us;26us;17us;20us;31us;22us;31us;25us;27us;30us;31us;31us;26us;65535us;26us;24us;26us;31us;26us;31us;24us;26us;31us;27us;31us;21us;15us;26us;26us;31us;31us;26us;31us;11us;14us;19us;23us;16us;31us;9us;16us;31us;18us;12us;17us;20us;31us;22us;25us;30us;31us;31us;31us;16us;10us;16us;31us;13us;17us;20us;29us;28us;16us;31us;16us;16us;31us;16us;31us;16us;16us;31us;16us;31us;0us;7us;8us;0us;0us;0us;0us;2us;0us;0us;0us;0us;6us;0us;0us;0us;0us;0us;3us;0us;0us;0us;0us;4us;0us;1us;0us;0us;5us;8us;65535us;43us;0us;0us;0us;0us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;42us;|] +let actions : uint16[] = [|65535us;0us;1us;6us;6us;4us;4us;5us;4us;4us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;3us;65535us;65535us;65535us;65535us;2us;1us;65535us;4us;1us;1us;1us;1us;2us;4us;3us;4us;4us;2us;1us;1us;65535us;65535us;65535us;65535us;1us;1us;65535us;1us;1us;65535us;1us;1us;65535us;1us;65535us;0us;65535us;1us;2us;2us;2us;2us;3us;5us;4us;5us;5us;3us;2us;2us;65535us;65535us;65535us;65535us;2us;2us;65535us;2us;2us;65535us;2us;2us;65535us;2us;0us;65535us;5us;1us;1us;1us;1us;2us;3us;5us;4us;5us;5us;3us;1us;1us;65535us;65535us;65535us;65535us;1us;1us;65535us;1us;1us;65535us;1us;1us;65535us;1us;0us;65535us;1us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;0us;65535us;10us;1us;10us;10us;6us;10us;10us;8us;8us;8us;9us;10us;8us;8us;8us;7us;6us;5us;4us;3us;65535us;2us;65535us;65535us;0us;65535us;0us;3us;1us;2us;2us;2us;2us;2us;2us;2us;2us;0us;65535us;7us;1us;7us;2us;2us;2us;2us;3us;4us;5us;6us;7us;7us;5us;4us;3us;2us;2us;65535us;65535us;65535us;65535us;2us;2us;65535us;2us;2us;65535us;2us;2us;65535us;2us;1us;65535us;0us;65535us;9us;1us;9us;2us;3us;3us;4us;6us;7us;8us;9us;9us;5us;4us;3us;65535us;65535us;65535us;65535us;3us;3us;65535us;3us;3us;65535us;3us;3us;65535us;2us;1us;65535us;0us;65535us;1us;3us;11us;5us;6us;7us;8us;8us;9us;10us;11us;11us;9us;8us;65535us;65535us;65535us;65535us;8us;8us;65535us;8us;8us;65535us;8us;8us;65535us;7us;4us;3us;0us;2us;65535us;16us;6us;9us;10us;11us;16us;12us;13us;13us;14us;15us;16us;16us;14us;13us;65535us;65535us;65535us;65535us;13us;13us;65535us;13us;13us;65535us;13us;13us;65535us;12us;11us;8us;7us;0us;65535us;1us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;5us;65535us;65535us;65535us;4us;65535us;3us;65535us;2us;0us;65535us;0us;2us;1us;2us;2us;0us;65535us;4us;4us;4us;3us;4us;4us;4us;5us;4us;3us;4us;4us;4us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;2us;65535us;2us;2us;2us;65535us;1us;65535us;1us;1us;1us;65535us;0us;0us;0us;4us;4us;4us;4us;4us;4us;2us;4us;2us;2us;2us;4us;1us;4us;1us;1us;1us;4us;0us;0us;0us;65535us;0us;0us;0us;0us;0us;0us;0us;0us;0us;16us;16us;75us;76us;49us;112us;120us;56us;57us;118us;61us;135us;65us;71us;102us;72us;110us;77us;78us;79us;115us;81us;85us;86us;103us;96us;98us;99us;109us;105us;111us;113us;116us;119us;120us;125us;135us;135us;136us;121us;125us;121us;120us;119us;114us;118us;101us;100us;104us;121us;95us;122us;108us;122us;91us;87us;88us;93us;94us;92us;83us;118us;121us;65535us;118us;119us;120us;121us;125us;122us;123us;124us;125us;65535us;65535us;126us;65535us;126us;126us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;126us;65535us;126us;65535us;126us;65535us;65535us;65535us;65535us;124us;123us;118us;121us;121us;118us;119us;120us;121us;121us;121us;121us;121us;121us;121us;121us;121us;121us;120us;119us;118us;117us;117us;117us;117us;84us;82us;80us;74us;106us;107us;73us;67us;97us;68us;65535us;65535us;65535us;127us;65535us;65535us;65535us;65535us;65535us;65535us;132us;65535us;132us;134us;134us;132us;132us;65535us;131us;65535us;131us;134us;134us;131us;131us;65535us;133us;130us;134us;134us;130us;130us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;129us;128us;127us;65535us;65535us;65535us;65535us;128us;128us;134us;134us;128us;65535us;65535us;65535us;66us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65us;64us;65us;65us;63us;64us;62us;61us;60us;59us;60us;58us;59us;58us;57us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;56us;54us;120us;69us;120us;70us;90us;89us;55us;52us;121us;120us;65535us;65535us;51us;65535us;50us;65535us;53us;47us;65535us;65535us;46us;43us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;48us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;42us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;40us;41us;65535us;65535us;38us;39us;65535us;65535us;65535us;65535us;36us;37us;65535us;65535us;34us;35us;32us;33us;9us;16us;31us;18us;12us;26us;17us;20us;31us;22us;31us;25us;27us;30us;31us;31us;26us;65535us;26us;24us;26us;31us;26us;31us;24us;26us;31us;27us;31us;21us;15us;26us;26us;31us;31us;26us;31us;11us;14us;19us;23us;16us;31us;9us;16us;31us;18us;12us;17us;20us;31us;22us;25us;30us;31us;31us;31us;16us;10us;16us;31us;13us;17us;20us;29us;28us;16us;31us;16us;16us;31us;16us;31us;16us;16us;31us;16us;31us;0us;7us;8us;0us;0us;0us;0us;2us;0us;0us;0us;0us;6us;0us;0us;0us;0us;0us;3us;0us;0us;0us;0us;4us;0us;1us;0us;0us;5us;8us;65535us;45us;0us;0us;0us;0us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;44us;|] let _fslex_tables = Internal.Utilities.Text.Lexing.UnicodeTables.Create(trans,actions) let rec _fslex_dummy () = _fslex_dummy() // Rule token and token (args: LexArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(401,lexbuf) with | 0 -> ( -//# 383 "src/Compiler/lex.fsl" +//# 388 "src/Compiler/lex.fsl" Keywords.KeywordOrIdentifierToken args lexbuf (lexeme lexbuf) -//# 1954 "lex.fs" +//# 1962 "lex.fs" ) | 1 -> ( -//# 386 "src/Compiler/lex.fsl" +//# 391 "src/Compiler/lex.fsl" DO_BANG -//# 1959 "lex.fs" +//# 1967 "lex.fs" ) | 2 -> ( -//# 389 "src/Compiler/lex.fsl" +//# 394 "src/Compiler/lex.fsl" YIELD_BANG(true) -//# 1964 "lex.fs" +//# 1972 "lex.fs" ) | 3 -> ( -//# 392 "src/Compiler/lex.fsl" +//# 397 "src/Compiler/lex.fsl" YIELD_BANG(false) -//# 1969 "lex.fs" +//# 1977 "lex.fs" ) | 4 -> ( -//# 395 "src/Compiler/lex.fsl" +//# 400 "src/Compiler/lex.fsl" MATCH_BANG -//# 1974 "lex.fs" +//# 1982 "lex.fs" ) | 5 -> ( -//# 398 "src/Compiler/lex.fsl" +//# 403 "src/Compiler/lex.fsl" AND_BANG(false) -//# 1979 "lex.fs" +//# 1987 "lex.fs" ) | 6 -> ( -//# 401 "src/Compiler/lex.fsl" +//# 406 "src/Compiler/lex.fsl" WHILE_BANG -//# 1984 "lex.fs" +//# 1992 "lex.fs" ) | 7 -> ( -//# 404 "src/Compiler/lex.fsl" +//# 409 "src/Compiler/lex.fsl" let tok = Keywords.KeywordOrIdentifierToken args lexbuf (lexemeTrimRight lexbuf 1) match tok with | LET _ -> BINDER (lexemeTrimRight lexbuf 1) | _ -> fail args lexbuf (FSComp.SR.lexIdentEndInMarkReserved("!")) (Keywords.KeywordOrIdentifierToken args lexbuf (lexeme lexbuf)) -//# 1992 "lex.fs" +//# 2000 "lex.fs" ) | 8 -> ( -//# 410 "src/Compiler/lex.fsl" +//# 415 "src/Compiler/lex.fsl" fail args lexbuf (FSComp.SR.lexIdentEndInMarkReserved("#")) (Keywords.KeywordOrIdentifierToken args lexbuf (lexeme lexbuf)) -//# 1997 "lex.fs" +//# 2005 "lex.fs" ) | 9 -> ( -//# 413 "src/Compiler/lex.fsl" +//# 418 "src/Compiler/lex.fsl" let n = lexemeTrimRightToInt32 args lexbuf 1 // Allow to parse as min_int. Allowed only because we parse '-' as an operator. if Ranges.isInt8BadMax n then INT8(SByte.MinValue, true (* 'true' = 'bad'*) ) else if n > int SByte.MaxValue || n < int SByte.MinValue then fail args lexbuf (FSComp.SR.lexOutsideEightBitSigned()) (INT8(0y, false)) else INT8(sbyte n, false) -//# 2006 "lex.fs" +//# 2014 "lex.fs" ) | 10 -> ( -//# 420 "src/Compiler/lex.fsl" +//# 425 "src/Compiler/lex.fsl" let n = lexemeTrimRightToInt32 args lexbuf 1 if n > int Byte.MaxValue || n < 0 then fail args lexbuf (FSComp.SR.lexOutsideEightBitSignedHex()) (INT8(0y, false)) else INT8(sbyte(byte(n)), false) -//# 2013 "lex.fs" +//# 2021 "lex.fs" ) | 11 -> ( -//# 425 "src/Compiler/lex.fsl" +//# 430 "src/Compiler/lex.fsl" let n = lexemeTrimRightToInt32 args lexbuf 2 if n > int Byte.MaxValue || n < 0 then fail args lexbuf (FSComp.SR.lexOutsideEightBitUnsigned()) (UINT8(0uy)) else UINT8(byte n) -//# 2020 "lex.fs" +//# 2028 "lex.fs" ) | 12 -> ( -//# 430 "src/Compiler/lex.fsl" +//# 435 "src/Compiler/lex.fsl" let n = lexemeTrimRightToInt32 args lexbuf 1 // Allow to parse as min_int. Allowed only because we parse '-' as an operator. if Ranges.isInt16BadMax n then INT16(Int16.MinValue, true (* 'true' = 'bad'*) ) else if n > int Int16.MaxValue || n < int Int16.MinValue then fail args lexbuf (FSComp.SR.lexOutsideSixteenBitSigned()) (INT16(0s, false)) else INT16(int16 n, false) -//# 2029 "lex.fs" +//# 2037 "lex.fs" ) | 13 -> ( -//# 437 "src/Compiler/lex.fsl" +//# 442 "src/Compiler/lex.fsl" let n = lexemeTrimRightToInt32 args lexbuf 1 if n > int UInt16.MaxValue || n < 0 then fail args lexbuf (FSComp.SR.lexOutsideSixteenBitSigned()) (INT16(0s,false)) else INT16(int16(uint16(n)), false) -//# 2036 "lex.fs" +//# 2044 "lex.fs" ) | 14 -> ( -//# 442 "src/Compiler/lex.fsl" +//# 447 "src/Compiler/lex.fsl" let n = lexemeTrimRightToInt32 args lexbuf 2 if n > int UInt16.MaxValue || n < 0 then fail args lexbuf (FSComp.SR.lexOutsideSixteenBitUnsigned()) (UINT16(0us)) else UINT16(uint16 n) -//# 2043 "lex.fs" +//# 2051 "lex.fs" ) | 15 -> ( -//# 447 "src/Compiler/lex.fsl" +//# 452 "src/Compiler/lex.fsl" let s = removeUnderscores (lexemeTrimRight lexbuf 2) // Allow to parse as min_int. Allowed only because we parse '-' as an operator. if Ranges.isInt32BadMax s then INT32_DOT_DOT(Int32.MinValue, true (* 'true' = 'bad'*) ) else let n = try int32 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitSigned()) 0 INT32_DOT_DOT(n, false) -//# 2053 "lex.fs" +//# 2061 "lex.fs" ) | 16 -> ( -//# 456 "src/Compiler/lex.fsl" +//# 461 "src/Compiler/lex.fsl" let s = removeUnderscores (lexeme lexbuf) // Allow to parse as min_int. Allowed only because we parse '-' as an operator. if Ranges.isInt32BadMax s then INT32(Int32.MinValue, true (* 'true' = 'bad'*) ) else @@ -2061,10 +2069,10 @@ and token (args: LexArgs) (skip: bool) lexbuf = try int32 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitSigned()) 0 INT32(n, false) -//# 2064 "lex.fs" +//# 2072 "lex.fs" ) | 17 -> ( -//# 466 "src/Compiler/lex.fsl" +//# 471 "src/Compiler/lex.fsl" let s = removeUnderscores (lexemeTrimRight lexbuf 1) // Allow to parse as min_int. Allowed only because we parse '-' as an operator. if Ranges.isInt32BadMax s then INT32(Int32.MinValue, true (* 'true' = 'bad'*) ) else @@ -2072,30 +2080,30 @@ and token (args: LexArgs) (skip: bool) lexbuf = try int32 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitSigned()) 0 INT32(n, false) -//# 2075 "lex.fs" +//# 2083 "lex.fs" ) | 18 -> ( -//# 475 "src/Compiler/lex.fsl" +//# 480 "src/Compiler/lex.fsl" let s = removeUnderscores (lexemeTrimRight lexbuf 1) let n = try int64 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitUnsigned()) 0L if n > int64 UInt32.MaxValue || n < 0L then fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitUnsigned()) (UINT32(0u)) else UINT32(uint32 (uint64 n)) -//# 2085 "lex.fs" +//# 2093 "lex.fs" ) | 19 -> ( -//# 483 "src/Compiler/lex.fsl" +//# 488 "src/Compiler/lex.fsl" let s = removeUnderscores (lexemeTrimRight lexbuf 2) let n = try int64 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitUnsigned()) 0L if n > int64 UInt32.MaxValue || n < 0L then fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitUnsigned()) (UINT32(0u)) else UINT32(uint32 (uint64 n)) -//# 2095 "lex.fs" +//# 2103 "lex.fs" ) | 20 -> ( -//# 491 "src/Compiler/lex.fsl" +//# 496 "src/Compiler/lex.fsl" let s = removeUnderscores (lexemeTrimRight lexbuf 1) // Allow to parse as min_int. Stupid but allowed because we parse '-' as an operator. if Ranges.isInt64BadMax s then INT64(Int64.MinValue, true (* 'true' = 'bad'*) ) else @@ -2103,18 +2111,18 @@ and token (args: LexArgs) (skip: bool) lexbuf = try int64 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideSixtyFourBitSigned()) 0L INT64(n,false) -//# 2106 "lex.fs" +//# 2114 "lex.fs" ) | 21 -> ( -//# 500 "src/Compiler/lex.fsl" +//# 505 "src/Compiler/lex.fsl" let s = removeUnderscores (lexemeTrimRight lexbuf 2) let n = try uint64 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideSixtyFourBitUnsigned()) 0UL UINT64(n) -//# 2114 "lex.fs" +//# 2122 "lex.fs" ) | 22 -> ( -//# 506 "src/Compiler/lex.fsl" +//# 511 "src/Compiler/lex.fsl" let s = removeUnderscores (lexemeTrimRight lexbuf 1) // Allow to parse as min_nativeint. Stupid but allowed because we parse '-' as an operator. if Ranges.isInt64BadMax s then NATIVEINT(Int64.MinValue, true) else @@ -2122,48 +2130,48 @@ and token (args: LexArgs) (skip: bool) lexbuf = try int64 s with _ -> fail args lexbuf (FSComp.SR.lexOutsideNativeSigned()) 0L NATIVEINT(n,false) -//# 2125 "lex.fs" +//# 2133 "lex.fs" ) | 23 -> ( -//# 515 "src/Compiler/lex.fsl" +//# 520 "src/Compiler/lex.fsl" try UNATIVEINT(uint64 (removeUnderscores (lexemeTrimRight lexbuf 2))) with _ -> fail args lexbuf (FSComp.SR.lexOutsideNativeUnsigned()) (UNATIVEINT(0UL)) -//# 2132 "lex.fs" +//# 2140 "lex.fs" ) | 24 -> ( -//# 520 "src/Compiler/lex.fsl" +//# 525 "src/Compiler/lex.fsl" IEEE32 (evalFloat args lexbuf) -//# 2137 "lex.fs" +//# 2145 "lex.fs" ) | 25 -> ( -//# 523 "src/Compiler/lex.fsl" +//# 528 "src/Compiler/lex.fsl" if lexbuf.SupportsFeature LanguageFeature.DotlessFloat32Literal then IEEE32 (evalFloat args lexbuf) else fail args lexbuf (FSComp.SR.lexInvalidFloat()) (IEEE32 0.0f) -//# 2146 "lex.fs" +//# 2154 "lex.fs" ) | 26 -> ( -//# 530 "src/Compiler/lex.fsl" +//# 535 "src/Compiler/lex.fsl" IEEE64 (try float(lexeme lexbuf) with _ -> fail args lexbuf (FSComp.SR.lexInvalidFloat()) 0.0) -//# 2151 "lex.fs" +//# 2159 "lex.fs" ) | 27 -> ( -//# 533 "src/Compiler/lex.fsl" +//# 538 "src/Compiler/lex.fsl" try let s = removeUnderscores (lexemeTrimRight lexbuf 1) // This implements a range check for decimal literals let d = System.Decimal.Parse(s,System.Globalization.NumberStyles.AllowExponent ||| System.Globalization.NumberStyles.Number,System.Globalization.CultureInfo.InvariantCulture) DECIMAL d with - e -> fail args lexbuf (FSComp.SR.lexOusideDecimal()) (DECIMAL (decimal 0)) + e -> fail args lexbuf (FSComp.SR.lexOutsideDecimal()) (DECIMAL (decimal 0)) -//# 2163 "lex.fs" +//# 2171 "lex.fs" ) | 28 -> ( -//# 542 "src/Compiler/lex.fsl" +//# 547 "src/Compiler/lex.fsl" #if FABLE_COMPILER fail args lexbuf (FSComp.SR.lexInvalidFloat()) (IEEE32 0.0f) @@ -2171,14 +2179,14 @@ and token (args: LexArgs) (skip: bool) lexbuf = let s = removeUnderscores (lexemeTrimRight lexbuf 2) // Even though the intermediate step is an int64, display the "invalid float" message, since it will be less confusing to the user let n64 = (try (int64 s) with _ -> fail args lexbuf (FSComp.SR.lexInvalidFloat()) 0L) - if n64 > 0xFFFFFFFFL || n64 < 0L then fail args lexbuf (FSComp.SR.lexOusideThirtyTwoBitFloat()) (IEEE32 0.0f) else + if n64 > 0xFFFFFFFFL || n64 < 0L then fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitFloat()) (IEEE32 0.0f) else IEEE32 (System.BitConverter.ToSingle(System.BitConverter.GetBytes(int32 (uint32 (uint64 n64))),0)) #endif -//# 2178 "lex.fs" +//# 2186 "lex.fs" ) | 29 -> ( -//# 555 "src/Compiler/lex.fsl" +//# 560 "src/Compiler/lex.fsl" #if FABLE_COMPILER fail args lexbuf (FSComp.SR.lexInvalidFloat()) (IEEE64 0.0) @@ -2187,37 +2195,37 @@ and token (args: LexArgs) (skip: bool) lexbuf = IEEE64 (System.BitConverter.Int64BitsToDouble(n64)) #endif -//# 2190 "lex.fs" +//# 2198 "lex.fs" ) | 30 -> ( -//# 565 "src/Compiler/lex.fsl" +//# 570 "src/Compiler/lex.fsl" let s = lexeme lexbuf BIGNUM (removeUnderscores (lexemeTrimRight lexbuf 1), s.[s.Length-1..s.Length-1]) -//# 2196 "lex.fs" +//# 2204 "lex.fs" ) | 31 -> ( -//# 569 "src/Compiler/lex.fsl" +//# 574 "src/Compiler/lex.fsl" fail args lexbuf (FSComp.SR.lexInvalidNumericLiteral()) (INT32(0,false)) -//# 2201 "lex.fs" +//# 2209 "lex.fs" ) | 32 -> ( -//# 572 "src/Compiler/lex.fsl" +//# 577 "src/Compiler/lex.fsl" let s = lexeme lexbuf CHAR (if s.[1] = '\\' then escape s.[2] else s.[1]) -//# 2207 "lex.fs" +//# 2215 "lex.fs" ) | 33 -> ( -//# 576 "src/Compiler/lex.fsl" +//# 581 "src/Compiler/lex.fsl" let s = lexeme lexbuf let x = int32 (if s.[1] = '\\' then escape s.[2] else s.[1]) if x < 0 || x > 127 then - fail args lexbuf (FSComp.SR.lexInvalidByteLiteral()) (UINT8(byte 0)) + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) else UINT8 (byte(x)) -//# 2217 "lex.fs" +//# 2225 "lex.fs" ) | 34 -> ( -//# 584 "src/Compiler/lex.fsl" +//# 589 "src/Compiler/lex.fsl" let s = lexeme lexbuf let c = trigraph s.[2] s.[3] s.[4] let x = int32 c @@ -2225,104 +2233,132 @@ and token (args: LexArgs) (skip: bool) lexbuf = fail args lexbuf (FSComp.SR.lexInvalidCharLiteral()) (CHAR c) else CHAR c -//# 2228 "lex.fs" +//# 2236 "lex.fs" ) | 35 -> ( -//# 593 "src/Compiler/lex.fsl" +//# 598 "src/Compiler/lex.fsl" let s = lexeme lexbuf let x = int32 (trigraph s.[2] s.[3] s.[4]) if x < 0 || x > 255 then - fail args lexbuf (FSComp.SR.lexInvalidByteLiteral()) (UINT8(byte 0)) + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) + elif x > 127 then + // TODO: Promote to Error: + // * Adjust range check in `if` above to `x > 127` + // * Remove this `elif` expression + // * Remove `lexInvalidTrigraphAsciiByteLiteral` from `FSComp.txt` + warning (Error(FSComp.SR.lexInvalidTrigraphAsciiByteLiteral(), lexbuf.LexemeRange)) + UINT8 (byte(x)) else UINT8 (byte(x)) -//# 2238 "lex.fs" +//# 2253 "lex.fs" ) | 36 -> ( -//# 601 "src/Compiler/lex.fsl" +//# 612 "src/Compiler/lex.fsl" + CHAR (char (int32 (unicodeGraphShort (lexemeTrimBoth lexbuf 3 1)))) +//# 2258 "lex.fs" + ) + | 37 -> ( +//# 615 "src/Compiler/lex.fsl" let x = int32 (unicodeGraphShort (lexemeTrimBoth lexbuf 3 2)) if x < 0 || x > 127 then - fail args lexbuf (FSComp.SR.lexInvalidByteLiteral()) (UINT8(byte 0)) + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) else UINT8 (byte(x)) -//# 2247 "lex.fs" - ) - | 37 -> ( -//# 607 "src/Compiler/lex.fsl" - CHAR (char (int32 (hexGraphShort (lexemeTrimBoth lexbuf 3 1)))) -//# 2252 "lex.fs" +//# 2267 "lex.fs" ) | 38 -> ( -//# 609 "src/Compiler/lex.fsl" - CHAR (char (int32 (unicodeGraphShort (lexemeTrimBoth lexbuf 3 1)))) -//# 2257 "lex.fs" +//# 621 "src/Compiler/lex.fsl" + CHAR (char (int32 (hexGraphShort (lexemeTrimBoth lexbuf 3 1)))) +//# 2272 "lex.fs" ) | 39 -> ( -//# 612 "src/Compiler/lex.fsl" +//# 624 "src/Compiler/lex.fsl" + let x = int32 (hexGraphShort (lexemeTrimBoth lexbuf 3 2)) + if x < 0 || x > 127 then + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) + else + UINT8 (byte(x)) +//# 2281 "lex.fs" + ) + | 40 -> ( +//# 631 "src/Compiler/lex.fsl" match unicodeGraphLong (lexemeTrimBoth lexbuf 3 1) with | SingleChar(c) -> CHAR (char c) | _ -> fail args lexbuf (FSComp.SR.lexThisUnicodeOnlyInStringLiterals()) (CHAR (char 0)) -//# 2264 "lex.fs" +//# 2288 "lex.fs" ) - | 40 -> ( -//# 617 "src/Compiler/lex.fsl" + | 41 -> ( +//# 636 "src/Compiler/lex.fsl" + match unicodeGraphLong (lexemeTrimBoth lexbuf 3 2) with + | SingleChar(c) -> + let x = int32 c + if x < 0 || x > 127 then + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) + else + UINT8 (byte(x)) + | _ -> fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) +//# 2300 "lex.fs" + ) + | 42 -> ( +//# 646 "src/Compiler/lex.fsl" if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatWarning (FSComp.SR.lexIndentOffForML()) lexbuf.LexemeRange if not skip then COMMENT (LexCont.Token (args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2272 "lex.fs" +//# 2308 "lex.fs" ) - | 41 -> ( -//# 623 "src/Compiler/lex.fsl" + | 43 -> ( +//# 652 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Token (args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2278 "lex.fs" +//# 2314 "lex.fs" ) - | 42 -> ( -//# 627 "src/Compiler/lex.fsl" + | 44 -> ( +//# 656 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Token (args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2284 "lex.fs" +//# 2320 "lex.fs" ) - | 43 -> ( -//# 631 "src/Compiler/lex.fsl" + | 45 -> ( +//# 660 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Token (args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2290 "lex.fs" +//# 2326 "lex.fs" ) - | 44 -> ( -//# 635 "src/Compiler/lex.fsl" + | 46 -> ( +//# 664 "src/Compiler/lex.fsl" LPAREN_STAR_RPAREN -//# 2295 "lex.fs" +//# 2331 "lex.fs" ) - | 45 -> ( -//# 638 "src/Compiler/lex.fsl" + | 47 -> ( +//# 667 "src/Compiler/lex.fsl" let m = lexbuf.LexemeRange if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, 1, m)) else comment (1,m,args) skip lexbuf -//# 2302 "lex.fs" +//# 2338 "lex.fs" ) - | 46 -> ( -//# 643 "src/Compiler/lex.fsl" + | 48 -> ( +//# 672 "src/Compiler/lex.fsl" let m = lexbuf.LexemeRange if not skip then COMMENT (LexCont.MLOnly(args.ifdefStack, args.stringNest, m)) else mlOnly m args skip lexbuf -//# 2309 "lex.fs" +//# 2345 "lex.fs" ) - | 47 -> ( -//# 648 "src/Compiler/lex.fsl" + | 49 -> ( +//# 677 "src/Compiler/lex.fsl" let buf, fin, m = startString args lexbuf // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, LexerStringStyle.ExtendedInterpolated, _, _) :: _ - | (_, LexerStringStyle.TripleQuote, _, _) :: _ -> () + | (_, LexerStringStyle.ExtendedInterpolated, _, _, _) :: _ + | (_, LexerStringStyle.TripleQuote, _, _, _) :: _ -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | [] -> () if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, LexerStringKind.String, args.interpolationDelimiterLength, m)) else singleQuoteString (buf, fin, m, LexerStringKind.String, args) skip lexbuf -//# 2322 "lex.fs" +//# 2358 "lex.fs" ) - | 48 -> ( -//# 661 "src/Compiler/lex.fsl" + | 50 -> ( +//# 690 "src/Compiler/lex.fsl" let buf, fin, m = startString args lexbuf // Single quote in triple quote ok, others disallowed match args.stringNest with @@ -2331,10 +2367,10 @@ and token (args: LexArgs) (skip: bool) lexbuf = args.interpolationDelimiterLength <- 1 if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, LexerStringKind.InterpolatedStringFirst, 1, m)) else tripleQuoteString (buf, fin, m, LexerStringKind.InterpolatedStringFirst, args) skip lexbuf -//# 2334 "lex.fs" +//# 2370 "lex.fs" ) - | 49 -> ( -//# 673 "src/Compiler/lex.fsl" + | 51 -> ( +//# 702 "src/Compiler/lex.fsl" let buf, fin, m = startString args lexbuf if lexbuf.SupportsFeature LanguageFeature.ExtendedStringInterpolation then // Single quote in triple quote ok, others disallowed @@ -2354,24 +2390,24 @@ and token (args: LexArgs) (skip: bool) lexbuf = tripleQuoteString (buf, fin, m, LexerStringKind.InterpolatedStringFirst, args) skip lexbuf fail args lexbuf (FSComp.SR.lexExtendedStringInterpolationNotSupported()) result -//# 2357 "lex.fs" +//# 2393 "lex.fs" ) - | 50 -> ( -//# 696 "src/Compiler/lex.fsl" + | 52 -> ( +//# 725 "src/Compiler/lex.fsl" let buf,fin,m = startString args lexbuf // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, style, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () + | (_, style, _, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | _ -> () if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, LexerStringKind.InterpolatedStringFirst, args.interpolationDelimiterLength, m)) else singleQuoteString (buf, fin, m, LexerStringKind.InterpolatedStringFirst, args) skip lexbuf -//# 2371 "lex.fs" +//# 2407 "lex.fs" ) - | 51 -> ( -//# 710 "src/Compiler/lex.fsl" + | 53 -> ( +//# 739 "src/Compiler/lex.fsl" let buf, fin, m = startString args lexbuf args.interpolationDelimiterLength <- 0 // Single quote in triple quote ok, others disallowed @@ -2382,110 +2418,110 @@ and token (args: LexArgs) (skip: bool) lexbuf = STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, LexerStringKind.String, args.interpolationDelimiterLength, m)) else tripleQuoteString (buf, fin, m, LexerStringKind.String, args) skip lexbuf -//# 2385 "lex.fs" +//# 2421 "lex.fs" ) - | 52 -> ( -//# 725 "src/Compiler/lex.fsl" + | 54 -> ( +//# 754 "src/Compiler/lex.fsl" let buf, fin, m = startString args lexbuf // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, LexerStringStyle.ExtendedInterpolated, _, _) :: _ - | (_, LexerStringStyle.TripleQuote, _, _) :: _ -> () + | (_, LexerStringStyle.ExtendedInterpolated, _, _, _) :: _ + | (_, LexerStringStyle.TripleQuote, _, _, _) :: _ -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | _ -> () if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, LexerStringKind.String, args.interpolationDelimiterLength, m)) else verbatimString (buf, fin, m, LexerStringKind.String, args) skip lexbuf -//# 2400 "lex.fs" +//# 2436 "lex.fs" ) - | 53 -> ( -//# 740 "src/Compiler/lex.fsl" + | 55 -> ( +//# 769 "src/Compiler/lex.fsl" let buf, fin, m = startString args lexbuf // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, style, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () + | (_, style, _, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | _ -> () if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, LexerStringKind.InterpolatedStringFirst, args.interpolationDelimiterLength, m)) else verbatimString (buf, fin, m, LexerStringKind.InterpolatedStringFirst, args) skip lexbuf -//# 2414 "lex.fs" +//# 2450 "lex.fs" ) - | 54 -> ( -//# 754 "src/Compiler/lex.fsl" + | 56 -> ( +//# 783 "src/Compiler/lex.fsl" if skip then token args skip lexbuf else WHITESPACE (LexCont.Token(args.ifdefStack, args.stringNest)) -//# 2420 "lex.fs" +//# 2456 "lex.fs" ) - | 55 -> ( -//# 758 "src/Compiler/lex.fsl" + | 57 -> ( +//# 787 "src/Compiler/lex.fsl" if args.indentationSyntaxStatus.Status then errorR(Error(FSComp.SR.lexTabsNotAllowed(), lexbuf.LexemeRange)) if not skip then WHITESPACE (LexCont.Token(args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2427 "lex.fs" +//# 2463 "lex.fs" ) - | 56 -> ( -//# 763 "src/Compiler/lex.fsl" + | 58 -> ( +//# 792 "src/Compiler/lex.fsl" // 4+ slash are 1-line comments, online 3 slash are XmlDoc let m = lexbuf.LexemeRange - LexbufLocalXmlDocStore.AddGrabPointDelayed(lexbuf) + XmlDocStore.AddGrabPointDelayed(lexbuf) if not skip then LINE_COMMENT (LexCont.SingleLineComment(args.ifdefStack, args.stringNest, 1, m)) else singleLineComment (None,1,m,m,args) skip lexbuf -//# 2436 "lex.fs" +//# 2472 "lex.fs" ) - | 57 -> ( -//# 770 "src/Compiler/lex.fsl" + | 59 -> ( +//# 799 "src/Compiler/lex.fsl" // Match exactly 3 slash, 4+ slash caught by preceding rule let m = lexbuf.LexemeRange let doc = lexemeTrimLeft lexbuf 3 let sb = (new StringBuilder(100)).Append(doc) if not skip then LINE_COMMENT (LexCont.SingleLineComment(args.ifdefStack, args.stringNest, 1, m)) else singleLineComment (Some (m, sb),1,m,m,args) skip lexbuf -//# 2446 "lex.fs" +//# 2482 "lex.fs" ) - | 58 -> ( -//# 778 "src/Compiler/lex.fsl" + | 60 -> ( +//# 807 "src/Compiler/lex.fsl" // Need to read all operator symbols too, otherwise it might be parsed by a rule below let m = lexbuf.LexemeRange - LexbufLocalXmlDocStore.AddGrabPointDelayed(lexbuf) + XmlDocStore.AddGrabPointDelayed(lexbuf) if not skip then LINE_COMMENT (LexCont.SingleLineComment(args.ifdefStack, args.stringNest, 1, m)) else singleLineComment (None,1,m,m,args) skip lexbuf -//# 2455 "lex.fs" +//# 2491 "lex.fs" ) - | 59 -> ( -//# 785 "src/Compiler/lex.fsl" - newline lexbuf + | 61 -> ( +//# 814 "src/Compiler/lex.fsl" + incrLine lexbuf if not skip then WHITESPACE (LexCont.Token(args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2462 "lex.fs" +//# 2498 "lex.fs" ) - | 60 -> ( -//# 790 "src/Compiler/lex.fsl" + | 62 -> ( +//# 819 "src/Compiler/lex.fsl" Keywords.IdentifierToken args lexbuf (lexemeTrimBoth lexbuf 2 2) -//# 2467 "lex.fs" +//# 2503 "lex.fs" ) - | 61 -> ( -//# 793 "src/Compiler/lex.fsl" + | 63 -> ( +//# 822 "src/Compiler/lex.fsl" errorR(Error(FSComp.SR.lexInvalidIdentifier(), lexbuf.LexemeRange)) Keywords.IdentifierToken args lexbuf (lexemeTrimBoth lexbuf 2 1) -//# 2473 "lex.fs" +//# 2509 "lex.fs" ) - | 62 -> ( -//# 797 "src/Compiler/lex.fsl" + | 64 -> ( +//# 826 "src/Compiler/lex.fsl" errorR(Error(FSComp.SR.lexInvalidIdentifier(), lexbuf.LexemeRange)) Keywords.IdentifierToken args lexbuf (lexemeTrimLeft lexbuf 2) -//# 2479 "lex.fs" +//# 2515 "lex.fs" ) - | 63 -> ( -//# 801 "src/Compiler/lex.fsl" + | 65 -> ( +//# 830 "src/Compiler/lex.fsl" errorR(Error(FSComp.SR.lexInvalidIdentifier(), lexbuf.LexemeRange)) Keywords.IdentifierToken args lexbuf "" -//# 2485 "lex.fs" +//# 2521 "lex.fs" ) - | 64 -> ( -//# 805 "src/Compiler/lex.fsl" + | 66 -> ( +//# 834 "src/Compiler/lex.fsl" let pos = lexbuf.EndPos if skip then let s = lexeme lexbuf @@ -2525,256 +2561,265 @@ and token (args: LexArgs) (skip: bool) lexbuf = lexbuf.EndPos <- pos.ApplyLineDirective((match file with Some f -> FileIndex.fileIndexOfFile f | None -> pos.FileIndex), line) else // add a newline when we don't apply a directive since we consumed a newline getting here - newline lexbuf + incrLine lexbuf token args skip lexbuf else // add a newline when we don't apply a directive since we consumed a newline getting here - newline lexbuf + incrLine lexbuf HASH_LINE (LexCont.Token (args.ifdefStack, args.stringNest)) -//# 2535 "lex.fs" +//# 2571 "lex.fs" ) - | 65 -> ( -//# 861 "src/Compiler/lex.fsl" + | 67 -> ( +//# 890 "src/Compiler/lex.fsl" checkExprOp lexbuf; LQUOTE ("<@ @>", false) -//# 2540 "lex.fs" +//# 2576 "lex.fs" ) - | 66 -> ( -//# 863 "src/Compiler/lex.fsl" + | 68 -> ( +//# 892 "src/Compiler/lex.fsl" checkExprOp lexbuf; LQUOTE ("<@@ @@>", true) -//# 2545 "lex.fs" +//# 2581 "lex.fs" ) - | 67 -> ( -//# 865 "src/Compiler/lex.fsl" + | 69 -> ( +//# 894 "src/Compiler/lex.fsl" checkExprOp lexbuf; RQUOTE ("<@ @>", false) -//# 2550 "lex.fs" +//# 2586 "lex.fs" ) - | 68 -> ( -//# 867 "src/Compiler/lex.fsl" + | 70 -> ( +//# 896 "src/Compiler/lex.fsl" checkExprOp lexbuf; RQUOTE ("<@@ @@>", true) -//# 2555 "lex.fs" +//# 2591 "lex.fs" ) - | 69 -> ( -//# 869 "src/Compiler/lex.fsl" + | 71 -> ( +//# 898 "src/Compiler/lex.fsl" HASH -//# 2560 "lex.fs" +//# 2596 "lex.fs" ) - | 70 -> ( -//# 871 "src/Compiler/lex.fsl" + | 72 -> ( +//# 900 "src/Compiler/lex.fsl" AMP -//# 2565 "lex.fs" +//# 2601 "lex.fs" ) - | 71 -> ( -//# 873 "src/Compiler/lex.fsl" + | 73 -> ( +//# 902 "src/Compiler/lex.fsl" AMP_AMP -//# 2570 "lex.fs" +//# 2606 "lex.fs" ) - | 72 -> ( -//# 875 "src/Compiler/lex.fsl" + | 74 -> ( +//# 904 "src/Compiler/lex.fsl" BAR_BAR -//# 2575 "lex.fs" +//# 2611 "lex.fs" ) - | 73 -> ( -//# 877 "src/Compiler/lex.fsl" + | 75 -> ( +//# 906 "src/Compiler/lex.fsl" QUOTE -//# 2580 "lex.fs" +//# 2616 "lex.fs" ) - | 74 -> ( -//# 879 "src/Compiler/lex.fsl" + | 76 -> ( +//# 908 "src/Compiler/lex.fsl" LPAREN -//# 2585 "lex.fs" +//# 2621 "lex.fs" ) - | 75 -> ( -//# 881 "src/Compiler/lex.fsl" + | 77 -> ( +//# 910 "src/Compiler/lex.fsl" RPAREN -//# 2590 "lex.fs" +//# 2626 "lex.fs" ) - | 76 -> ( -//# 883 "src/Compiler/lex.fsl" + | 78 -> ( +//# 912 "src/Compiler/lex.fsl" STAR -//# 2595 "lex.fs" +//# 2631 "lex.fs" ) - | 77 -> ( -//# 885 "src/Compiler/lex.fsl" + | 79 -> ( +//# 914 "src/Compiler/lex.fsl" COMMA -//# 2600 "lex.fs" +//# 2636 "lex.fs" ) - | 78 -> ( -//# 887 "src/Compiler/lex.fsl" + | 80 -> ( +//# 916 "src/Compiler/lex.fsl" RARROW -//# 2605 "lex.fs" +//# 2641 "lex.fs" ) - | 79 -> ( -//# 889 "src/Compiler/lex.fsl" + | 81 -> ( +//# 918 "src/Compiler/lex.fsl" QMARK -//# 2610 "lex.fs" +//# 2646 "lex.fs" ) - | 80 -> ( -//# 891 "src/Compiler/lex.fsl" + | 82 -> ( +//# 920 "src/Compiler/lex.fsl" QMARK_QMARK -//# 2615 "lex.fs" +//# 2651 "lex.fs" ) - | 81 -> ( -//# 893 "src/Compiler/lex.fsl" + | 83 -> ( +//# 922 "src/Compiler/lex.fsl" DOT_DOT -//# 2620 "lex.fs" +//# 2656 "lex.fs" ) - | 82 -> ( -//# 895 "src/Compiler/lex.fsl" + | 84 -> ( +//# 924 "src/Compiler/lex.fsl" DOT_DOT_HAT -//# 2625 "lex.fs" +//# 2661 "lex.fs" ) - | 83 -> ( -//# 897 "src/Compiler/lex.fsl" + | 85 -> ( +//# 926 "src/Compiler/lex.fsl" DOT -//# 2630 "lex.fs" +//# 2666 "lex.fs" ) - | 84 -> ( -//# 899 "src/Compiler/lex.fsl" + | 86 -> ( +//# 928 "src/Compiler/lex.fsl" COLON -//# 2635 "lex.fs" +//# 2671 "lex.fs" ) - | 85 -> ( -//# 901 "src/Compiler/lex.fsl" + | 87 -> ( +//# 930 "src/Compiler/lex.fsl" COLON_COLON -//# 2640 "lex.fs" +//# 2676 "lex.fs" ) - | 86 -> ( -//# 903 "src/Compiler/lex.fsl" + | 88 -> ( +//# 932 "src/Compiler/lex.fsl" COLON_GREATER -//# 2645 "lex.fs" +//# 2681 "lex.fs" ) - | 87 -> ( -//# 905 "src/Compiler/lex.fsl" + | 89 -> ( +//# 934 "src/Compiler/lex.fsl" RQUOTE_DOT ("<@ @>",false) -//# 2650 "lex.fs" +//# 2686 "lex.fs" ) - | 88 -> ( -//# 907 "src/Compiler/lex.fsl" + | 90 -> ( +//# 936 "src/Compiler/lex.fsl" RQUOTE_DOT ("<@@ @@>",true) -//# 2655 "lex.fs" +//# 2691 "lex.fs" ) - | 89 -> ( -//# 909 "src/Compiler/lex.fsl" + | 91 -> ( +//# 938 "src/Compiler/lex.fsl" GREATER_BAR_RBRACK -//# 2660 "lex.fs" +//# 2696 "lex.fs" ) - | 90 -> ( -//# 911 "src/Compiler/lex.fsl" + | 92 -> ( +//# 940 "src/Compiler/lex.fsl" COLON_QMARK_GREATER -//# 2665 "lex.fs" +//# 2701 "lex.fs" ) - | 91 -> ( -//# 913 "src/Compiler/lex.fsl" + | 93 -> ( +//# 942 "src/Compiler/lex.fsl" COLON_QMARK -//# 2670 "lex.fs" +//# 2706 "lex.fs" ) - | 92 -> ( -//# 915 "src/Compiler/lex.fsl" + | 94 -> ( +//# 944 "src/Compiler/lex.fsl" COLON_EQUALS -//# 2675 "lex.fs" +//# 2711 "lex.fs" ) - | 93 -> ( -//# 917 "src/Compiler/lex.fsl" + | 95 -> ( +//# 946 "src/Compiler/lex.fsl" SEMICOLON_SEMICOLON -//# 2680 "lex.fs" +//# 2716 "lex.fs" ) - | 94 -> ( -//# 919 "src/Compiler/lex.fsl" + | 96 -> ( +//# 948 "src/Compiler/lex.fsl" SEMICOLON -//# 2685 "lex.fs" +//# 2721 "lex.fs" ) - | 95 -> ( -//# 921 "src/Compiler/lex.fsl" + | 97 -> ( +//# 950 "src/Compiler/lex.fsl" LARROW -//# 2690 "lex.fs" +//# 2726 "lex.fs" ) - | 96 -> ( -//# 923 "src/Compiler/lex.fsl" + | 98 -> ( +//# 952 "src/Compiler/lex.fsl" EQUALS -//# 2695 "lex.fs" +//# 2731 "lex.fs" ) - | 97 -> ( -//# 925 "src/Compiler/lex.fsl" + | 99 -> ( +//# 954 "src/Compiler/lex.fsl" LBRACK -//# 2700 "lex.fs" +//# 2736 "lex.fs" ) - | 98 -> ( -//# 927 "src/Compiler/lex.fsl" + | 100 -> ( +//# 956 "src/Compiler/lex.fsl" LBRACK_BAR -//# 2705 "lex.fs" +//# 2741 "lex.fs" ) - | 99 -> ( -//# 929 "src/Compiler/lex.fsl" + | 101 -> ( +//# 958 "src/Compiler/lex.fsl" LBRACE_BAR -//# 2710 "lex.fs" +//# 2746 "lex.fs" ) - | 100 -> ( -//# 931 "src/Compiler/lex.fsl" + | 102 -> ( +//# 960 "src/Compiler/lex.fsl" LESS false -//# 2715 "lex.fs" +//# 2751 "lex.fs" ) - | 101 -> ( -//# 933 "src/Compiler/lex.fsl" + | 103 -> ( +//# 962 "src/Compiler/lex.fsl" GREATER false -//# 2720 "lex.fs" +//# 2756 "lex.fs" ) - | 102 -> ( -//# 935 "src/Compiler/lex.fsl" + | 104 -> ( +//# 964 "src/Compiler/lex.fsl" LBRACK_LESS -//# 2725 "lex.fs" +//# 2761 "lex.fs" ) - | 103 -> ( -//# 937 "src/Compiler/lex.fsl" + | 105 -> ( +//# 966 "src/Compiler/lex.fsl" RBRACK -//# 2730 "lex.fs" +//# 2766 "lex.fs" ) - | 104 -> ( -//# 939 "src/Compiler/lex.fsl" + | 106 -> ( +//# 968 "src/Compiler/lex.fsl" BAR_RBRACK -//# 2735 "lex.fs" +//# 2771 "lex.fs" ) - | 105 -> ( -//# 941 "src/Compiler/lex.fsl" + | 107 -> ( +//# 970 "src/Compiler/lex.fsl" BAR_RBRACE -//# 2740 "lex.fs" +//# 2776 "lex.fs" ) - | 106 -> ( -//# 943 "src/Compiler/lex.fsl" + | 108 -> ( +//# 972 "src/Compiler/lex.fsl" GREATER_RBRACK -//# 2745 "lex.fs" +//# 2781 "lex.fs" ) - | 107 -> ( -//# 946 "src/Compiler/lex.fsl" + | 109 -> ( +//# 975 "src/Compiler/lex.fsl" match args.stringNest with | [] -> () - | (counter, style, d, m) :: rest -> + | (counter, style, d, _, m) :: rest -> // Note, we do not update the 'm', any incomplete-interpolation error // will be reported w.r.t. the first '{' - args.stringNest <- (counter + 1, style, d, m) :: rest + args.stringNest <- (counter + 1, style, d, None, m) :: rest // To continue token-by-token lexing may involve picking up the new args.stringNes let cont = LexCont.Token(args.ifdefStack, args.stringNest) LBRACE cont -//# 2760 "lex.fs" +//# 2796 "lex.fs" ) - | 108 -> ( -//# 958 "src/Compiler/lex.fsl" + | 110 -> ( +//# 987 "src/Compiler/lex.fsl" BAR -//# 2765 "lex.fs" +//# 2801 "lex.fs" ) - | 109 -> ( -//# 961 "src/Compiler/lex.fsl" + | 111 -> ( +//# 990 "src/Compiler/lex.fsl" // We encounter a '}' in the expression token stream. First check if we're in an interpolated string expression // and continue the string if necessary match args.stringNest with - | (1, LexerStringStyle.ExtendedInterpolated, delimLength, r) :: rest when delimLength > 1 -> - args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, delimLength - 1, r) :: rest + | (1, LexerStringStyle.ExtendedInterpolated, delimLength, altR, r) :: rest when delimLength > 1 -> + // On the first "}" of multiple "}", keep the range of the starting "}" for later processing in startString + let altStart = + match altR with + | None -> Some lexbuf.LexemeRange + | _ -> altR + args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, delimLength - 1, altStart, r) :: rest token args skip lexbuf - | (1, style, _, _) :: rest -> + | (1, style, _, altR, _r) :: rest -> args.stringNest <- rest + altR + |> Option.iter (fun r -> + let n = r.StartColumn - lexbuf.StartPos.Column + lexbuf.StartPos <- lexbuf.StartPos.ShiftColumnBy(n)) let buf, fin, m = startString args lexbuf if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, style, LexerStringKind.InterpolatedStringPart, args.interpolationDelimiterLength, m)) @@ -2784,105 +2829,105 @@ and token (args: LexArgs) (skip: bool) lexbuf = | LexerStringStyle.SingleQuote -> singleQuoteString (buf, fin, m, LexerStringKind.InterpolatedStringPart, args) skip lexbuf | LexerStringStyle.TripleQuote -> tripleQuoteString (buf, fin, m, LexerStringKind.InterpolatedStringPart, args) skip lexbuf | LexerStringStyle.ExtendedInterpolated -> extendedInterpolatedString (buf, fin, m, LexerStringKind.InterpolatedStringPart, args) skip lexbuf - | (counter, style, d, m) :: rest -> + | (counter, style, d, altR, m) :: rest -> // Note, we do not update the 'm', any incomplete-interpolation error // will be reported w.r.t. the first '{' - args.stringNest <- (counter - 1, style, d, m) :: rest + args.stringNest <- (counter - 1, style, d, altR, m) :: rest let cont = LexCont.Token(args.ifdefStack, args.stringNest) RBRACE cont | _ -> let cont = LexCont.Token(args.ifdefStack, args.stringNest) RBRACE cont -//# 2797 "lex.fs" +//# 2842 "lex.fs" ) - | 110 -> ( -//# 992 "src/Compiler/lex.fsl" + | 112 -> ( +//# 1029 "src/Compiler/lex.fsl" DOLLAR -//# 2802 "lex.fs" +//# 2847 "lex.fs" ) - | 111 -> ( -//# 994 "src/Compiler/lex.fsl" + | 113 -> ( +//# 1031 "src/Compiler/lex.fsl" PERCENT_OP("%") -//# 2807 "lex.fs" +//# 2852 "lex.fs" ) - | 112 -> ( -//# 996 "src/Compiler/lex.fsl" + | 114 -> ( +//# 1033 "src/Compiler/lex.fsl" PERCENT_OP("%%") -//# 2812 "lex.fs" +//# 2857 "lex.fs" ) - | 113 -> ( -//# 998 "src/Compiler/lex.fsl" + | 115 -> ( +//# 1035 "src/Compiler/lex.fsl" MINUS -//# 2817 "lex.fs" +//# 2862 "lex.fs" ) - | 114 -> ( -//# 1001 "src/Compiler/lex.fsl" + | 116 -> ( +//# 1038 "src/Compiler/lex.fsl" errorR (Error(FSComp.SR.lexInvalidIdentifier(), lexbuf.LexemeRange)) RESERVED -//# 2823 "lex.fs" +//# 2868 "lex.fs" ) - | 115 -> ( -//# 1004 "src/Compiler/lex.fsl" + | 117 -> ( +//# 1041 "src/Compiler/lex.fsl" checkExprOp lexbuf; INFIX_STAR_STAR_OP(lexeme lexbuf) -//# 2828 "lex.fs" +//# 2873 "lex.fs" ) - | 116 -> ( -//# 1006 "src/Compiler/lex.fsl" + | 118 -> ( +//# 1043 "src/Compiler/lex.fsl" checkExprOp lexbuf; INFIX_STAR_DIV_MOD_OP(lexeme lexbuf) -//# 2833 "lex.fs" +//# 2878 "lex.fs" ) - | 117 -> ( -//# 1008 "src/Compiler/lex.fsl" + | 119 -> ( +//# 1045 "src/Compiler/lex.fsl" checkExprOp lexbuf; PLUS_MINUS_OP(lexeme lexbuf) -//# 2838 "lex.fs" +//# 2883 "lex.fs" ) - | 118 -> ( -//# 1010 "src/Compiler/lex.fsl" + | 120 -> ( +//# 1047 "src/Compiler/lex.fsl" checkExprOp lexbuf; INFIX_AT_HAT_OP(lexeme lexbuf) -//# 2843 "lex.fs" +//# 2888 "lex.fs" ) - | 119 -> ( -//# 1012 "src/Compiler/lex.fsl" + | 121 -> ( +//# 1049 "src/Compiler/lex.fsl" checkExprOp lexbuf; INFIX_COMPARE_OP(lexeme lexbuf) -//# 2848 "lex.fs" +//# 2893 "lex.fs" ) - | 120 -> ( -//# 1014 "src/Compiler/lex.fsl" + | 122 -> ( +//# 1051 "src/Compiler/lex.fsl" checkExprGreaterColonOp lexbuf; INFIX_COMPARE_OP(lexeme lexbuf) -//# 2853 "lex.fs" +//# 2898 "lex.fs" ) - | 121 -> ( -//# 1016 "src/Compiler/lex.fsl" + | 123 -> ( +//# 1053 "src/Compiler/lex.fsl" checkExprOp lexbuf; INFIX_AMP_OP(lexeme lexbuf) -//# 2858 "lex.fs" +//# 2903 "lex.fs" ) - | 122 -> ( -//# 1018 "src/Compiler/lex.fsl" + | 124 -> ( +//# 1055 "src/Compiler/lex.fsl" checkExprOp lexbuf; INFIX_BAR_OP(lexeme lexbuf) -//# 2863 "lex.fs" +//# 2908 "lex.fs" ) - | 123 -> ( -//# 1020 "src/Compiler/lex.fsl" + | 125 -> ( +//# 1057 "src/Compiler/lex.fsl" checkExprOp lexbuf; PREFIX_OP(lexeme lexbuf) -//# 2868 "lex.fs" +//# 2913 "lex.fs" ) - | 124 -> ( -//# 1024 "src/Compiler/lex.fsl" + | 126 -> ( +//# 1061 "src/Compiler/lex.fsl" FUNKY_OPERATOR_NAME(lexeme lexbuf) -//# 2873 "lex.fs" +//# 2918 "lex.fs" ) - | 125 -> ( -//# 1027 "src/Compiler/lex.fsl" + | 127 -> ( +//# 1064 "src/Compiler/lex.fsl" // Treat shebangs like regular comments, but they are only allowed at the start of a file let m = lexbuf.LexemeRange let tok = LINE_COMMENT (LexCont.SingleLineComment(args.ifdefStack, args.stringNest, 1, m)) let tok = shouldStartFile args lexbuf m (0,FSComp.SR.lexHashBangMustBeFirstInFile()) tok if not skip then tok else singleLineComment (None,1,m,m,args) skip lexbuf -//# 2882 "lex.fs" +//# 2927 "lex.fs" ) - | 126 -> ( -//# 1035 "src/Compiler/lex.fsl" + | 128 -> ( +//# 1072 "src/Compiler/lex.fsl" if args.indentationSyntaxStatus.ExplicitlySet && args.indentationSyntaxStatus.WarnOnMultipleTokens then let s = lexeme lexbuf warning(Error((0, sprintf "%s should only be set once in an F# source file." s), lexbuf.LexemeRange)) @@ -2891,10 +2936,10 @@ and token (args: LexArgs) (skip: bool) lexbuf = args.indentationSyntaxStatus.Status <- true if not skip then HASH_LIGHT (LexCont.Token(args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2894 "lex.fs" +//# 2939 "lex.fs" ) - | 127 -> ( -//# 1045 "src/Compiler/lex.fsl" + | 129 -> ( +//# 1082 "src/Compiler/lex.fsl" args.indentationSyntaxStatus.Status <- false if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatError (FSComp.SR.mlCompatLightOffNoLongerSupported()) lexbuf.LexemeRange @@ -2902,105 +2947,97 @@ and token (args: LexArgs) (skip: bool) lexbuf = mlCompatWarning (FSComp.SR.lexIndentOffForML()) lexbuf.LexemeRange if not skip then HASH_LIGHT (LexCont.Token (args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 2905 "lex.fs" +//# 2950 "lex.fs" ) - | 128 -> ( -//# 1054 "src/Compiler/lex.fsl" + | 130 -> ( +//# 1091 "src/Compiler/lex.fsl" let m = lexbuf.LexemeRange + shouldStartLine args lexbuf m (FSComp.SR.lexHashIfMustBeFirst()) let lookup id = List.contains id args.conditionalDefines let lexed = lexeme lexbuf let isTrue, expr = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion lexbuf.StrictIndentation args lookup lexed args.ifdefStack <- (IfDefIf,m) :: args.ifdefStack - LexbufIfdefStore.SaveIfHash(lexbuf, lexed, expr, m) - // Get the token; make sure it starts at zero position & return - let cont, f = - if isTrue then - let cont = LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token) - let f = endline LexerEndlineContinuation.Token args skip - cont, f - else - let cont = LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(0, m)) - let f = endline (LexerEndlineContinuation.Skip(0, m)) args skip - cont, f - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashIfMustBeFirst()) (HASH_IF(m,lexed,cont)) - if not skip then tok else f lexbuf -//# 2927 "lex.fs" + IfdefStore.SaveIfHash(lexbuf, lexed, expr, m) + let contCase = if isTrue then LexerEndlineContinuation.Token else LexerEndlineContinuation.IfdefSkip(0, m) + let tok = HASH_IF(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, contCase)) + if skip then endline contCase args skip lexbuf else tok +//# 2964 "lex.fs" ) - | 129 -> ( -//# 1076 "src/Compiler/lex.fsl" + | 131 -> ( +//# 1103 "src/Compiler/lex.fsl" let lexed = (lexeme lexbuf) match args.ifdefStack with | [] -> LEX_FAILURE (FSComp.SR.lexHashElseNoMatchingIf()) | (IfDefElse,_) :: _rest -> LEX_FAILURE (FSComp.SR.lexHashEndifRequiredForElse()) | (IfDefIf,_) :: rest -> let m = lexbuf.LexemeRange + shouldStartLine args lexbuf m (FSComp.SR.lexHashElseMustBeFirst()) args.ifdefStack <- (IfDefElse,m) :: rest - LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) - let tok = HASH_ELSE(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(0, m))) - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashElseMustBeFirst()) tok - if not skip then tok else endline (LexerEndlineContinuation.Skip(0, m)) args skip lexbuf -//# 2942 "lex.fs" + IfdefStore.SaveElseHash(lexbuf, lexed, m) + let tok = HASH_ELSE(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(0, m))) + if skip then endline (LexerEndlineContinuation.IfdefSkip(0, m)) args skip lexbuf else tok +//# 2979 "lex.fs" ) - | 130 -> ( -//# 1089 "src/Compiler/lex.fsl" + | 132 -> ( +//# 1116 "src/Compiler/lex.fsl" let lexed = (lexeme lexbuf) let m = lexbuf.LexemeRange match args.ifdefStack with | []-> LEX_FAILURE (FSComp.SR.lexHashEndingNoMatchingIf()) | _ :: rest -> + shouldStartLine args lexbuf m (FSComp.SR.lexHashEndifMustBeFirst()) args.ifdefStack <- rest - LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) + IfdefStore.SaveEndIfHash(lexbuf, lexed, m) let tok = HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashEndifMustBeFirst()) tok if not skip then tok else endline LexerEndlineContinuation.Token args skip lexbuf -//# 2956 "lex.fs" +//# 2993 "lex.fs" ) - | 131 -> ( -//# 1101 "src/Compiler/lex.fsl" + | 133 -> ( +//# 1128 "src/Compiler/lex.fsl" let tok = WHITESPACE (LexCont.Token (args.ifdefStack, args.stringNest)) let tok = fail args lexbuf (FSComp.SR.lexHashIfMustHaveIdent()) tok - if not skip then tok else token args skip lexbuf -//# 2963 "lex.fs" + if skip then token args skip lexbuf else tok +//# 3000 "lex.fs" ) - | 132 -> ( -//# 1109 "src/Compiler/lex.fsl" + | 134 -> ( +//# 1137 "src/Compiler/lex.fsl" let n = (lexeme lexbuf).IndexOf('#') lexbuf.StartPos <- lexbuf.StartPos.ShiftColumnBy(n) HASH_IDENT(lexemeTrimLeft lexbuf (n+1)) -//# 2970 "lex.fs" +//# 3007 "lex.fs" ) - | 133 -> ( -//# 1116 "src/Compiler/lex.fsl" + | 135 -> ( +//# 1144 "src/Compiler/lex.fsl" unexpectedChar lexbuf -//# 2975 "lex.fs" +//# 3012 "lex.fs" ) - | 134 -> ( -//# 1119 "src/Compiler/lex.fsl" + | 136 -> ( +//# 1147 "src/Compiler/lex.fsl" EOF (LexCont.Token(args.ifdefStack, args.stringNest)) -//# 2980 "lex.fs" +//# 3017 "lex.fs" ) | _ -> failwith "token" // Rule ifdefSkip and ifdefSkip (n: int) (m: range) (args: LexArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(344,lexbuf) with | 0 -> ( -//# 1125 "src/Compiler/lex.fsl" +//# 1153 "src/Compiler/lex.fsl" let m = lexbuf.LexemeRange // If #if is the first thing on the line then increase depth, otherwise skip, because it is invalid (e.g. "(**) #if ...") if (m.StartColumn <> 0) then - if not skip then INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) - else ifdefSkip n m args skip lexbuf + if skip then ifdefSkip n m args skip lexbuf + else INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) else let lexed = lexeme lexbuf let lookup id = List.contains id args.conditionalDefines let _, expr = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion lexbuf.StrictIndentation args lookup lexed - LexbufIfdefStore.SaveIfHash(lexbuf, lexed, expr, m) - let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n+1, m))) - if not skip then tok else endline (LexerEndlineContinuation.Skip(n+1, m)) args skip lexbuf -//# 3000 "lex.fs" + IfdefStore.SaveIfHash(lexbuf, lexed, expr, m) + let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(n+1, m))) + if skip then endline (LexerEndlineContinuation.IfdefSkip(n+1, m)) args skip lexbuf else tok +//# 3037 "lex.fs" ) | 1 -> ( -//# 1140 "src/Compiler/lex.fsl" +//# 1168 "src/Compiler/lex.fsl" let lexed = (lexeme lexbuf) let m = lexbuf.LexemeRange // If #else is the first thing on the line then process it, otherwise ignore, because it is invalid (e.g. "(**) #else ...") @@ -3013,18 +3050,18 @@ and ifdefSkip (n: int) (m: range) (args: LexArgs) (skip: bool) lexbuf = | (IfDefElse,_) :: _rest -> LEX_FAILURE (FSComp.SR.lexHashEndifRequiredForElse()) | (IfDefIf,_) :: rest -> let m = lexbuf.LexemeRange - LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) + IfdefStore.SaveElseHash(lexbuf, lexed, m) args.ifdefStack <- (IfDefElse,m) :: rest if not skip then HASH_ELSE(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) else endline LexerEndlineContinuation.Token args skip lexbuf - else - LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) - if not skip then INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n, m))) - else endline (LexerEndlineContinuation.Skip(n, m)) args skip lexbuf -//# 3024 "lex.fs" + else + IfdefStore.SaveElseHash(lexbuf, lexed, m) + if not skip then INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(n, m))) + else endline (LexerEndlineContinuation.IfdefSkip(n, m)) args skip lexbuf +//# 3061 "lex.fs" ) | 2 -> ( -//# 1163 "src/Compiler/lex.fsl" +//# 1191 "src/Compiler/lex.fsl" let lexed = lexeme lexbuf let m = lexbuf.LexemeRange // If #endif is the first thing on the line then process it, otherwise ignore, because it is invalid (e.g. "(**) #endif ...") @@ -3035,76 +3072,76 @@ and ifdefSkip (n: int) (m: range) (args: LexArgs) (skip: bool) lexbuf = match args.ifdefStack with | [] -> LEX_FAILURE (FSComp.SR.lexHashEndingNoMatchingIf()) | _ :: rest -> - LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) + IfdefStore.SaveEndIfHash(lexbuf, lexed, m) args.ifdefStack <- rest if not skip then HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) else endline LexerEndlineContinuation.Token args skip lexbuf else - LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) - let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n-1, m))) - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexWrongNestedHashEndif()) tok - if not skip then tok else endline (LexerEndlineContinuation.Skip(n-1, m)) args skip lexbuf -//# 3047 "lex.fs" + shouldStartLine args lexbuf m (FSComp.SR.lexWrongNestedHashEndif()) + IfdefStore.SaveEndIfHash(lexbuf, lexed, m) + let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(n-1, m))) + if not skip then tok else endline (LexerEndlineContinuation.IfdefSkip(n-1, m)) args skip lexbuf +//# 3084 "lex.fs" ) | 3 -> ( -//# 1185 "src/Compiler/lex.fsl" - newline lexbuf; ifdefSkip n m args skip lexbuf -//# 3052 "lex.fs" +//# 1213 "src/Compiler/lex.fsl" + incrLine lexbuf; ifdefSkip n m args skip lexbuf +//# 3089 "lex.fs" ) | 4 -> ( -//# 1194 "src/Compiler/lex.fsl" +//# 1222 "src/Compiler/lex.fsl" // This tries to be nice and get tokens as 'words' because VS uses this when selecting stuff if not skip then INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) else ifdefSkip n m args skip lexbuf -//# 3059 "lex.fs" +//# 3096 "lex.fs" ) | 5 -> ( -//# 1199 "src/Compiler/lex.fsl" +//# 1227 "src/Compiler/lex.fsl" EOF (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) -//# 3064 "lex.fs" +//# 3101 "lex.fs" ) | _ -> failwith "ifdefSkip" // Rule endline and endline (cont: LexerEndlineContinuation) (args: LexArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(337,lexbuf) with | 0 -> ( -//# 1205 "src/Compiler/lex.fsl" - newline lexbuf +//# 1233 "src/Compiler/lex.fsl" + incrLine lexbuf match cont with | LexerEndlineContinuation.Token -> if not skip then WHITESPACE(LexCont.Token (args.ifdefStack, args.stringNest)) else token args skip lexbuf - | LexerEndlineContinuation.Skip(n, m) -> + | LexerEndlineContinuation.IfdefSkip(n, m) -> if not skip then INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) else ifdefSkip n m args skip lexbuf -//# 3081 "lex.fs" +//# 3118 "lex.fs" ) | 1 -> ( -//# 1217 "src/Compiler/lex.fsl" +//# 1245 "src/Compiler/lex.fsl" match cont with | LexerEndlineContinuation.Token -> EOF(LexCont.Token(args.ifdefStack, args.stringNest)) - | LexerEndlineContinuation.Skip(n, m) -> + | LexerEndlineContinuation.IfdefSkip(n, m) -> EOF(LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) -//# 3091 "lex.fs" +//# 3128 "lex.fs" ) | 2 -> ( -//# 1227 "src/Compiler/lex.fsl" +//# 1255 "src/Compiler/lex.fsl" let tok = WHITESPACE (LexCont.Token (args.ifdefStack, args.stringNest)) let tok = fail args lexbuf (FSComp.SR.pplexExpectedSingleLineComment()) tok if not skip then tok else token args skip lexbuf -//# 3098 "lex.fs" +//# 3135 "lex.fs" ) | _ -> failwith "endline" // Rule singleQuoteString and singleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(280,lexbuf) with | 0 -> ( -//# 1233 "src/Compiler/lex.fsl" +//# 1261 "src/Compiler/lex.fsl" let (_buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf let text = lexeme lexbuf let text2 = text |> String.filter (fun c -> c <> ' ' && c <> '\t') advanceColumnBy lexbuf (text.Length - text2.Length) @@ -3112,51 +3149,66 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3115 "lex.fs" +//# 3152 "lex.fs" ) | 1 -> ( -//# 1244 "src/Compiler/lex.fsl" +//# 1272 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addByteChar buf (escape (lexeme lexbuf).[1]) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3125 "lex.fs" +//# 3162 "lex.fs" ) | 2 -> ( -//# 1252 "src/Compiler/lex.fsl" +//# 1280 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let s = lexeme lexbuf - addByteChar buf (trigraph s.[1] s.[2] s.[3]) - if not skip then - STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) + let result() = + if not skip then + STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) + else + singleQuoteString sargs skip lexbuf + let c = trigraph s.[1] s.[2] s.[3] + let x = int c + if x < 0 || x > 255 then + // TODO: Promote to Error: + // * remove `addByteChar ...` + // * remove `warning ...` + // * Adjust `lexInvalidCharLiteralInString` in `FSComp.txt`: remove `Note` (incl. 2nd placeholder) + // * uncomment `fail ...` + addByteChar buf c + warning (Error(FSComp.SR.lexInvalidCharLiteralInString (s[0..3], sprintf "\\%03i" (x % 256)), lexbuf.LexemeRange)) + //fail args lexbuf (FSComp.SR.lexInvalidCharLiteralInString (s[0..3])) () + result() else - singleQuoteString sargs skip lexbuf -//# 3136 "lex.fs" + addByteChar buf c + result() +//# 3188 "lex.fs" ) | 3 -> ( -//# 1261 "src/Compiler/lex.fsl" +//# 1304 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeChar buf (int (hexGraphShort (lexemeTrimLeft lexbuf 2))) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3146 "lex.fs" +//# 3198 "lex.fs" ) | 4 -> ( -//# 1269 "src/Compiler/lex.fsl" +//# 1312 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeChar buf (int (unicodeGraphShort (lexemeTrimLeft lexbuf 2))) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3156 "lex.fs" +//# 3208 "lex.fs" ) | 5 -> ( -//# 1277 "src/Compiler/lex.fsl" +//# 1320 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let hexChars = lexemeTrimLeft lexbuf 2 let result() = @@ -3166,7 +3218,8 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = singleQuoteString sargs skip lexbuf match unicodeGraphLong hexChars with | Invalid -> - fail args lexbuf (FSComp.SR.lexInvalidUnicodeLiteral hexChars) (result()) + fail args lexbuf (FSComp.SR.lexInvalidUnicodeLiteral hexChars) () + result() | SingleChar(c) -> addUnicodeChar buf (int c) result() @@ -3174,26 +3227,26 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = addUnicodeChar buf (int hi) addUnicodeChar buf (int lo) result() -//# 3177 "lex.fs" +//# 3230 "lex.fs" ) | 6 -> ( -//# 1296 "src/Compiler/lex.fsl" +//# 1340 "src/Compiler/lex.fsl" let (buf, fin, _m, kind, args) = sargs let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind (LexerStringFinisherContext()) cont -//# 3185 "lex.fs" +//# 3238 "lex.fs" ) | 7 -> ( -//# 1302 "src/Compiler/lex.fsl" +//# 1346 "src/Compiler/lex.fsl" let (buf, fin, _m, kind, args) = sargs let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf { kind with IsByteString = true } (LexerStringFinisherContext()) cont -//# 3193 "lex.fs" +//# 3246 "lex.fs" ) | 8 -> ( -//# 1308 "src/Compiler/lex.fsl" +//# 1352 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let s = lexeme lexbuf addUnicodeString buf (if kind.IsInterpolated then s.[0..0] else s) @@ -3201,15 +3254,15 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3204 "lex.fs" +//# 3257 "lex.fs" ) | 9 -> ( -//# 1317 "src/Compiler/lex.fsl" +//# 1361 "src/Compiler/lex.fsl" let (buf, fin, m, kind, args) = sargs if kind.IsInterpolated then // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.SingleQuote, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.SingleQuote, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind LexerStringFinisherContext.InterpolatedPart cont else @@ -3219,10 +3272,10 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = else singleQuoteString sargs skip lexbuf -//# 3222 "lex.fs" +//# 3275 "lex.fs" ) | 10 -> ( -//# 1333 "src/Compiler/lex.fsl" +//# 1377 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let result() = if not skip then @@ -3234,108 +3287,108 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = else addUnicodeString buf (lexeme lexbuf) (result()) -//# 3237 "lex.fs" +//# 3290 "lex.fs" ) | 11 -> ( -//# 1346 "src/Compiler/lex.fsl" +//# 1390 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3248 "lex.fs" +//# 3301 "lex.fs" ) | 12 -> ( -//# 1355 "src/Compiler/lex.fsl" +//# 1399 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3258 "lex.fs" +//# 3311 "lex.fs" ) | 13 -> ( -//# 1364 "src/Compiler/lex.fsl" +//# 1408 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3268 "lex.fs" +//# 3321 "lex.fs" ) | 14 -> ( -//# 1372 "src/Compiler/lex.fsl" +//# 1416 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3278 "lex.fs" +//# 3331 "lex.fs" ) | 15 -> ( -//# 1380 "src/Compiler/lex.fsl" +//# 1424 "src/Compiler/lex.fsl" let (_buf, _fin, m, kind, args) = sargs EOF (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) -//# 3284 "lex.fs" +//# 3337 "lex.fs" ) | 16 -> ( -//# 1386 "src/Compiler/lex.fsl" +//# 1430 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) else singleQuoteString sargs skip lexbuf -//# 3294 "lex.fs" +//# 3347 "lex.fs" ) | _ -> failwith "singleQuoteString" // Rule verbatimString and verbatimString (sargs: LexerStringArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(247,lexbuf) with | 0 -> ( -//# 1395 "src/Compiler/lex.fsl" +//# 1439 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addByteChar buf '\"' if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) else verbatimString sargs skip lexbuf -//# 3308 "lex.fs" +//# 3361 "lex.fs" ) | 1 -> ( -//# 1403 "src/Compiler/lex.fsl" +//# 1447 "src/Compiler/lex.fsl" let (buf, fin, _m, kind, args) = sargs let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind LexerStringFinisherContext.Verbatim cont -//# 3316 "lex.fs" +//# 3369 "lex.fs" ) | 2 -> ( -//# 1409 "src/Compiler/lex.fsl" +//# 1453 "src/Compiler/lex.fsl" let (buf, fin, _m, kind, args) = sargs let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf { kind with IsByteString = true } LexerStringFinisherContext.Verbatim cont -//# 3324 "lex.fs" +//# 3377 "lex.fs" ) | 3 -> ( -//# 1415 "src/Compiler/lex.fsl" +//# 1459 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) else verbatimString sargs skip lexbuf -//# 3335 "lex.fs" +//# 3388 "lex.fs" ) | 4 -> ( -//# 1424 "src/Compiler/lex.fsl" +//# 1468 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let s = lexeme lexbuf addUnicodeString buf (if kind.IsInterpolated then s.[0..0] else s) @@ -3343,15 +3396,15 @@ and verbatimString (sargs: LexerStringArgs) (skip: bool) lexbuf = STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) else verbatimString sargs skip lexbuf -//# 3346 "lex.fs" +//# 3399 "lex.fs" ) | 5 -> ( -//# 1433 "src/Compiler/lex.fsl" +//# 1477 "src/Compiler/lex.fsl" let (buf, fin, m, kind, args) = sargs if kind.IsInterpolated then // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.Verbatim, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.Verbatim, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind (LexerStringFinisherContext.InterpolatedPart ||| LexerStringFinisherContext.Verbatim) cont else @@ -3361,10 +3414,10 @@ and verbatimString (sargs: LexerStringArgs) (skip: bool) lexbuf = else verbatimString sargs skip lexbuf -//# 3364 "lex.fs" +//# 3417 "lex.fs" ) | 6 -> ( -//# 1449 "src/Compiler/lex.fsl" +//# 1493 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let result() = if not skip then @@ -3377,109 +3430,109 @@ and verbatimString (sargs: LexerStringArgs) (skip: bool) lexbuf = addUnicodeString buf (lexeme lexbuf) (result()) -//# 3380 "lex.fs" +//# 3433 "lex.fs" ) | 7 -> ( -//# 1463 "src/Compiler/lex.fsl" +//# 1507 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) else verbatimString sargs skip lexbuf -//# 3390 "lex.fs" +//# 3443 "lex.fs" ) | 8 -> ( -//# 1472 "src/Compiler/lex.fsl" +//# 1516 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) else verbatimString sargs skip lexbuf -//# 3400 "lex.fs" +//# 3453 "lex.fs" ) | 9 -> ( -//# 1480 "src/Compiler/lex.fsl" +//# 1524 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) else verbatimString sargs skip lexbuf -//# 3410 "lex.fs" +//# 3463 "lex.fs" ) | 10 -> ( -//# 1488 "src/Compiler/lex.fsl" +//# 1532 "src/Compiler/lex.fsl" let (_buf, _fin, m, kind, args) = sargs EOF (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) -//# 3416 "lex.fs" +//# 3469 "lex.fs" ) | 11 -> ( -//# 1493 "src/Compiler/lex.fsl" +//# 1537 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) else verbatimString sargs skip lexbuf -//# 3426 "lex.fs" +//# 3479 "lex.fs" ) | _ -> failwith "verbatimString" // Rule tripleQuoteString and tripleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(214,lexbuf) with | 0 -> ( -//# 1502 "src/Compiler/lex.fsl" +//# 1546 "src/Compiler/lex.fsl" let (buf, fin, _m, kind, args) = sargs args.interpolationDelimiterLength <- 0 let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind LexerStringFinisherContext.TripleQuote cont -//# 3438 "lex.fs" +//# 3491 "lex.fs" ) | 1 -> ( -//# 1508 "src/Compiler/lex.fsl" +//# 1552 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) else tripleQuoteString sargs skip lexbuf -//# 3449 "lex.fs" +//# 3502 "lex.fs" ) | 2 -> ( -//# 1518 "src/Compiler/lex.fsl" +//# 1562 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) else tripleQuoteString sargs skip lexbuf -//# 3459 "lex.fs" +//# 3512 "lex.fs" ) | 3 -> ( -//# 1527 "src/Compiler/lex.fsl" +//# 1571 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) else tripleQuoteString sargs skip lexbuf -//# 3469 "lex.fs" +//# 3522 "lex.fs" ) | 4 -> ( -//# 1535 "src/Compiler/lex.fsl" +//# 1579 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) else tripleQuoteString sargs skip lexbuf -//# 3479 "lex.fs" +//# 3532 "lex.fs" ) | 5 -> ( -//# 1543 "src/Compiler/lex.fsl" +//# 1587 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let s = lexeme lexbuf addUnicodeString buf (if kind.IsInterpolated then s.[0..0] else s) @@ -3487,15 +3540,15 @@ and tripleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) else tripleQuoteString sargs skip lexbuf -//# 3490 "lex.fs" +//# 3543 "lex.fs" ) | 6 -> ( -//# 1552 "src/Compiler/lex.fsl" +//# 1596 "src/Compiler/lex.fsl" let (buf, fin, m, kind, args) = sargs if kind.IsInterpolated then // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.TripleQuote, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.TripleQuote, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind (LexerStringFinisherContext.InterpolatedPart ||| LexerStringFinisherContext.TripleQuote) cont else @@ -3505,10 +3558,10 @@ and tripleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = else tripleQuoteString sargs skip lexbuf -//# 3508 "lex.fs" +//# 3561 "lex.fs" ) | 7 -> ( -//# 1568 "src/Compiler/lex.fsl" +//# 1612 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let result() = if not skip then @@ -3521,59 +3574,59 @@ and tripleQuoteString (sargs: LexerStringArgs) (skip: bool) lexbuf = addUnicodeString buf (lexeme lexbuf) (result()) -//# 3524 "lex.fs" +//# 3577 "lex.fs" ) | 8 -> ( -//# 1582 "src/Compiler/lex.fsl" +//# 1626 "src/Compiler/lex.fsl" let (_buf, _fin, m, kind, args) = sargs EOF (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) -//# 3530 "lex.fs" +//# 3583 "lex.fs" ) | 9 -> ( -//# 1587 "src/Compiler/lex.fsl" +//# 1631 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) else tripleQuoteString sargs skip lexbuf -//# 3540 "lex.fs" +//# 3593 "lex.fs" ) | _ -> failwith "tripleQuoteString" // Rule extendedInterpolatedString and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(178,lexbuf) with | 0 -> ( -//# 1596 "src/Compiler/lex.fsl" +//# 1640 "src/Compiler/lex.fsl" let (buf, fin, _m, kind, args) = sargs args.interpolationDelimiterLength <- 0 let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind LexerStringFinisherContext.TripleQuote cont -//# 3552 "lex.fs" +//# 3605 "lex.fs" ) | 1 -> ( -//# 1602 "src/Compiler/lex.fsl" +//# 1646 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.ExtendedInterpolated, kind, args.interpolationDelimiterLength, m)) else extendedInterpolatedString sargs skip lexbuf -//# 3563 "lex.fs" +//# 3616 "lex.fs" ) | 2 -> ( -//# 1615 "src/Compiler/lex.fsl" +//# 1659 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.ExtendedInterpolated, kind, args.interpolationDelimiterLength, m)) else extendedInterpolatedString sargs skip lexbuf -//# 3573 "lex.fs" +//# 3626 "lex.fs" ) | 3 -> ( -//# 1623 "src/Compiler/lex.fsl" +//# 1667 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let numPercents = lexeme lexbuf |> String.length let result() = @@ -3602,10 +3655,10 @@ and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) lexbuf = let s = String.replicate percentsToEmit "%" addUnicodeString buf s result() -//# 3605 "lex.fs" +//# 3658 "lex.fs" ) | 4 -> ( -//# 1653 "src/Compiler/lex.fsl" +//# 1697 "src/Compiler/lex.fsl" let (buf, fin, m, kind, args) = sargs let numBraces = String.length (lexeme lexbuf) // Extended interpolated strings starts with at least 2 $ @@ -3614,7 +3667,7 @@ and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) lexbuf = let maxBraces = 2 * args.interpolationDelimiterLength - 1 if numBraces > maxBraces then let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fail args lexbuf (FSComp.SR.lexTooManyLBracesInTripleQuote()) @@ -3635,14 +3688,14 @@ and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) lexbuf = String.replicate extraBraces "{" |> addUnicodeString buf // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind (LexerStringFinisherContext.InterpolatedPart ||| LexerStringFinisherContext.TripleQuote) cont -//# 3642 "lex.fs" +//# 3695 "lex.fs" ) | 5 -> ( -//# 1688 "src/Compiler/lex.fsl" +//# 1732 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs let numBraces = lexeme lexbuf |> String.length let result() = @@ -3656,318 +3709,318 @@ and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) lexbuf = else fail args lexbuf (FSComp.SR.lexUnmatchedRBracesInTripleQuote()) (result()) -//# 3659 "lex.fs" +//# 3712 "lex.fs" ) | 6 -> ( -//# 1703 "src/Compiler/lex.fsl" +//# 1747 "src/Compiler/lex.fsl" let (_buf, _fin, m, kind, args) = sargs EOF (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.ExtendedInterpolated, kind, args.interpolationDelimiterLength, m)) -//# 3665 "lex.fs" +//# 3718 "lex.fs" ) | 7 -> ( -//# 1708 "src/Compiler/lex.fsl" +//# 1752 "src/Compiler/lex.fsl" let (buf, _fin, m, kind, args) = sargs addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.ExtendedInterpolated, kind, args.interpolationDelimiterLength, m)) else extendedInterpolatedString sargs skip lexbuf -//# 3675 "lex.fs" +//# 3728 "lex.fs" ) | _ -> failwith "extendedInterpolatedString" // Rule singleLineComment and singleLineComment (cargs: SingleLineCommentArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(165,lexbuf) with | 0 -> ( -//# 1718 "src/Compiler/lex.fsl" +//# 1762 "src/Compiler/lex.fsl" let buff,_n, mStart, mEnd, args = cargs trySaveXmlDoc lexbuf buff - newline lexbuf + incrLine lexbuf // Saves the documentation (if we're collecting any) into a buffer-local variable. if not skip then LINE_COMMENT (LexCont.Token(args.ifdefStack, args.stringNest)) else - if Option.isNone buff then LexbufCommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) + if Option.isNone buff then CommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) token args skip lexbuf -//# 3691 "lex.fs" +//# 3744 "lex.fs" ) | 1 -> ( -//# 1728 "src/Compiler/lex.fsl" +//# 1772 "src/Compiler/lex.fsl" let buff, _n, mStart, mEnd, args = cargs trySaveXmlDoc lexbuf buff - LexbufCommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) + CommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) // NOTE: it is legal to end a file with this comment, so we'll return EOF as a token EOF (LexCont.Token(args.ifdefStack, args.stringNest)) -//# 3700 "lex.fs" +//# 3753 "lex.fs" ) | 2 -> ( -//# 1736 "src/Compiler/lex.fsl" +//# 1780 "src/Compiler/lex.fsl" let buff, n, m, _, args = cargs // Append the current token to the XML documentation if we're collecting it tryAppendXmlDoc buff (lexeme lexbuf) if not skip then LINE_COMMENT (LexCont.SingleLineComment(args.ifdefStack, args.stringNest, n, m)) else singleLineComment (buff, n, m, lexbuf.LexemeRange, args) skip lexbuf -//# 3709 "lex.fs" +//# 3762 "lex.fs" ) | 3 -> ( -//# 1743 "src/Compiler/lex.fsl" +//# 1787 "src/Compiler/lex.fsl" let _, _n, _mStart, _mEnd, args = cargs if not skip then LINE_COMMENT (LexCont.Token(args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 3716 "lex.fs" +//# 3769 "lex.fs" ) | _ -> failwith "singleLineComment" // Rule comment and comment (cargs: BlockCommentArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(139,lexbuf) with | 0 -> ( -//# 1750 "src/Compiler/lex.fsl" +//# 1794 "src/Compiler/lex.fsl" let n, m, args = cargs if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment (n, m, args) skip lexbuf -//# 3727 "lex.fs" +//# 3780 "lex.fs" ) | 1 -> ( -//# 1755 "src/Compiler/lex.fsl" +//# 1799 "src/Compiler/lex.fsl" let n, m, args = cargs if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) else stringInComment n m args skip lexbuf -//# 3734 "lex.fs" +//# 3787 "lex.fs" ) | 2 -> ( -//# 1760 "src/Compiler/lex.fsl" +//# 1804 "src/Compiler/lex.fsl" let n, m, args = cargs if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, n, m)) else tripleQuoteStringInComment n m args skip lexbuf -//# 3741 "lex.fs" +//# 3794 "lex.fs" ) | 3 -> ( -//# 1765 "src/Compiler/lex.fsl" +//# 1809 "src/Compiler/lex.fsl" let n, m, args = cargs if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, n, m)) else verbatimStringInComment n m args skip lexbuf -//# 3748 "lex.fs" +//# 3801 "lex.fs" ) | 4 -> ( -//# 1770 "src/Compiler/lex.fsl" +//# 1814 "src/Compiler/lex.fsl" let n, m, args = cargs - LexbufLocalXmlDocStore.AddGrabPoint(lexbuf) + XmlDocStore.AddGrabPoint(lexbuf) if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment cargs skip lexbuf -//# 3756 "lex.fs" +//# 3809 "lex.fs" ) | 5 -> ( -//# 1776 "src/Compiler/lex.fsl" +//# 1820 "src/Compiler/lex.fsl" let n, m, args = cargs if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n+1, m)) else comment (n+1,m,args) skip lexbuf -//# 3763 "lex.fs" +//# 3816 "lex.fs" ) | 6 -> ( -//# 1781 "src/Compiler/lex.fsl" +//# 1825 "src/Compiler/lex.fsl" let n, m, args = cargs - newline lexbuf + incrLine lexbuf if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment cargs skip lexbuf -//# 3771 "lex.fs" +//# 3824 "lex.fs" ) | 7 -> ( -//# 1786 "src/Compiler/lex.fsl" +//# 1830 "src/Compiler/lex.fsl" let n, m, args = cargs if n > 1 then if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n-1, m)) else comment (n-1,m,args) skip lexbuf else - LexbufLocalXmlDocStore.AddGrabPointDelayed(lexbuf) + XmlDocStore.AddGrabPointDelayed(lexbuf) if not skip then COMMENT (LexCont.Token(args.ifdefStack, args.stringNest)) else - LexbufCommentStore.SaveBlockComment(lexbuf, m, lexbuf.LexemeRange) + CommentStore.SaveBlockComment(lexbuf, m, lexbuf.LexemeRange) token args skip lexbuf -//# 3786 "lex.fs" +//# 3839 "lex.fs" ) | 8 -> ( -//# 1800 "src/Compiler/lex.fsl" +//# 1844 "src/Compiler/lex.fsl" let n, m, args = cargs if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment cargs skip lexbuf -//# 3793 "lex.fs" +//# 3846 "lex.fs" ) | 9 -> ( -//# 1805 "src/Compiler/lex.fsl" +//# 1849 "src/Compiler/lex.fsl" let n, m, args = cargs EOF (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) -//# 3799 "lex.fs" +//# 3852 "lex.fs" ) | 10 -> ( -//# 1809 "src/Compiler/lex.fsl" +//# 1853 "src/Compiler/lex.fsl" let n, m, args = cargs if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment (n, m, args) skip lexbuf -//# 3806 "lex.fs" +//# 3859 "lex.fs" ) | _ -> failwith "comment" // Rule stringInComment and stringInComment (n: int) (m: range) (args: LexArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(90,lexbuf) with | 0 -> ( -//# 1816 "src/Compiler/lex.fsl" - newline lexbuf +//# 1860 "src/Compiler/lex.fsl" + incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) else stringInComment n m args skip lexbuf -//# 3817 "lex.fs" +//# 3870 "lex.fs" ) | 1 -> ( -//# 1829 "src/Compiler/lex.fsl" +//# 1873 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) else stringInComment n m args skip lexbuf -//# 3823 "lex.fs" +//# 3876 "lex.fs" ) | 2 -> ( -//# 1834 "src/Compiler/lex.fsl" +//# 1878 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment (n, m, args) skip lexbuf -//# 3829 "lex.fs" +//# 3882 "lex.fs" ) | 3 -> ( -//# 1838 "src/Compiler/lex.fsl" - newline lexbuf +//# 1882 "src/Compiler/lex.fsl" + incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) else stringInComment n m args skip lexbuf -//# 3836 "lex.fs" +//# 3889 "lex.fs" ) | 4 -> ( -//# 1843 "src/Compiler/lex.fsl" +//# 1887 "src/Compiler/lex.fsl" EOF (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) -//# 3841 "lex.fs" +//# 3894 "lex.fs" ) | 5 -> ( -//# 1847 "src/Compiler/lex.fsl" +//# 1891 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) else stringInComment n m args skip lexbuf -//# 3847 "lex.fs" +//# 3900 "lex.fs" ) | _ -> failwith "stringInComment" // Rule verbatimStringInComment and verbatimStringInComment (n: int) (m: range) (args: LexArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(61,lexbuf) with | 0 -> ( -//# 1853 "src/Compiler/lex.fsl" +//# 1897 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, n, m)) else verbatimStringInComment n m args skip lexbuf -//# 3857 "lex.fs" +//# 3910 "lex.fs" ) | 1 -> ( -//# 1857 "src/Compiler/lex.fsl" +//# 1901 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment (n, m, args) skip lexbuf -//# 3863 "lex.fs" +//# 3916 "lex.fs" ) | 2 -> ( -//# 1864 "src/Compiler/lex.fsl" +//# 1908 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, n, m)) else verbatimStringInComment n m args skip lexbuf -//# 3869 "lex.fs" +//# 3922 "lex.fs" ) | 3 -> ( -//# 1868 "src/Compiler/lex.fsl" - newline lexbuf +//# 1912 "src/Compiler/lex.fsl" + incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, n, m)) else verbatimStringInComment n m args skip lexbuf -//# 3876 "lex.fs" +//# 3929 "lex.fs" ) | 4 -> ( -//# 1873 "src/Compiler/lex.fsl" +//# 1917 "src/Compiler/lex.fsl" EOF (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, n, m)) -//# 3881 "lex.fs" +//# 3934 "lex.fs" ) | 5 -> ( -//# 1877 "src/Compiler/lex.fsl" +//# 1921 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, n, m)) else verbatimStringInComment n m args skip lexbuf -//# 3887 "lex.fs" +//# 3940 "lex.fs" ) | _ -> failwith "verbatimStringInComment" // Rule tripleQuoteStringInComment and tripleQuoteStringInComment (n: int) (m: range) (args: LexArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(31,lexbuf) with | 0 -> ( -//# 1883 "src/Compiler/lex.fsl" +//# 1927 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment (n, m, args) skip lexbuf -//# 3897 "lex.fs" +//# 3950 "lex.fs" ) | 1 -> ( -//# 1890 "src/Compiler/lex.fsl" +//# 1934 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, n, m)) else tripleQuoteStringInComment n m args skip lexbuf -//# 3903 "lex.fs" +//# 3956 "lex.fs" ) | 2 -> ( -//# 1894 "src/Compiler/lex.fsl" - newline lexbuf +//# 1938 "src/Compiler/lex.fsl" + incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, n, m)) else tripleQuoteStringInComment n m args skip lexbuf -//# 3910 "lex.fs" +//# 3963 "lex.fs" ) | 3 -> ( -//# 1899 "src/Compiler/lex.fsl" +//# 1943 "src/Compiler/lex.fsl" EOF (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, n, m)) -//# 3915 "lex.fs" +//# 3968 "lex.fs" ) | 4 -> ( -//# 1903 "src/Compiler/lex.fsl" +//# 1947 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, n, m)) else tripleQuoteStringInComment n m args skip lexbuf -//# 3921 "lex.fs" +//# 3974 "lex.fs" ) | _ -> failwith "tripleQuoteStringInComment" // Rule mlOnly and mlOnly (m: range) (args: LexArgs) (skip: bool) lexbuf = match _fslex_tables.Interpret(0,lexbuf) with | 0 -> ( -//# 1909 "src/Compiler/lex.fsl" +//# 1953 "src/Compiler/lex.fsl" let buf = ByteBuffer.Create StringCapacity let m2 = lexbuf.LexemeRange let _ = singleQuoteString (buf, LexerStringFinisher.Default, m2, LexerStringKind.String, args) skip lexbuf if not skip then COMMENT (LexCont.MLOnly(args.ifdefStack, args.stringNest, m)) else mlOnly m args skip lexbuf -//# 3934 "lex.fs" +//# 3987 "lex.fs" ) | 1 -> ( -//# 1916 "src/Compiler/lex.fsl" - newline lexbuf +//# 1960 "src/Compiler/lex.fsl" + incrLine lexbuf if not skip then COMMENT (LexCont.MLOnly(args.ifdefStack, args.stringNest, m)) else mlOnly m args skip lexbuf -//# 3941 "lex.fs" +//# 3994 "lex.fs" ) | 2 -> ( -//# 1921 "src/Compiler/lex.fsl" +//# 1965 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Token(args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 3947 "lex.fs" +//# 4000 "lex.fs" ) | 3 -> ( -//# 1925 "src/Compiler/lex.fsl" +//# 1969 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.Token(args.ifdefStack, args.stringNest)) else token args skip lexbuf -//# 3953 "lex.fs" +//# 4006 "lex.fs" ) | 4 -> ( -//# 1929 "src/Compiler/lex.fsl" +//# 1973 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.MLOnly(args.ifdefStack, args.stringNest, m)) else mlOnly m args skip lexbuf -//# 3959 "lex.fs" +//# 4012 "lex.fs" ) | 5 -> ( -//# 1933 "src/Compiler/lex.fsl" +//# 1977 "src/Compiler/lex.fsl" EOF (LexCont.MLOnly(args.ifdefStack, args.stringNest, m)) -//# 3964 "lex.fs" +//# 4017 "lex.fs" ) | 6 -> ( -//# 1937 "src/Compiler/lex.fsl" +//# 1981 "src/Compiler/lex.fsl" if not skip then COMMENT (LexCont.MLOnly(args.ifdefStack, args.stringNest, m)) else mlOnly m args skip lexbuf -//# 3970 "lex.fs" +//# 4023 "lex.fs" ) | _ -> failwith "mlOnly" diff --git a/src/fcs-fable/codegen/lex.fsi b/src/fcs-fable/codegen/lex.fsi index 1c9bc90684..ab2d5e3381 100644 --- a/src/fcs-fable/codegen/lex.fsi +++ b/src/fcs-fable/codegen/lex.fsi @@ -5,6 +5,7 @@ open Internal.Utilities.Text.Lexing open FSharp.Compiler.Parser open FSharp.Compiler.Text open FSharp.Compiler.ParseHelpers +open FSharp.Compiler.LexerStore /// Rule token val token: args: LexArgs -> skip: bool -> lexbuf: LexBuffer -> token diff --git a/src/fcs-fable/codegen/pars.fs b/src/fcs-fable/codegen/pars.fs index 9d1485fbea..a060fa430c 100644 --- a/src/fcs-fable/codegen/pars.fs +++ b/src/fcs-fable/codegen/pars.fs @@ -10,6 +10,7 @@ open Internal.Utilities.Text.Parsing.ParseHelpers #nowarn "1182" // generated code has lots of unused "parseState" +#nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` open System @@ -23,11 +24,13 @@ open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Features +open FSharp.Compiler.LexerStore open FSharp.Compiler.ParseHelpers open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.SyntaxTreeOps +open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range open FSharp.Compiler.Xml @@ -38,7 +41,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> errorR(SyntaxError(box ctxt, ctxt.ParseState.LexBuffer.LexemeRange))) -//# 41 "pars.fs" +//# 44 "pars.fs" // This type is the type of tokens accepted by the parser type token = | HASH_IF of (range * string * ParseHelpers.LexerContinuation) @@ -82,6 +85,7 @@ type token = | TYPE_IS_HERE | MODULE_COMING_SOON | MODULE_IS_HERE + | BAR_JUST_BEFORE_NULL | EXTERN | VOID | PUBLIC @@ -287,6 +291,7 @@ type tokenId = | TOKEN_TYPE_IS_HERE | TOKEN_MODULE_COMING_SOON | TOKEN_MODULE_IS_HERE + | TOKEN_BAR_JUST_BEFORE_NULL | TOKEN_EXTERN | TOKEN_VOID | TOKEN_PUBLIC @@ -568,6 +573,7 @@ type nonTerminalId = | NONTERM_explicitValTyparDeclsCore | NONTERM_explicitValTyparDecls | NONTERM_opt_explicitValTyparDecls + | NONTERM_hashConstraint | NONTERM_opt_typeConstraints | NONTERM_typeConstraints | NONTERM_intersectionConstraints @@ -618,10 +624,9 @@ type nonTerminalId = | NONTERM_atomicRationalConstant | NONTERM_constant | NONTERM_bindingPattern - | NONTERM_simplePattern - | NONTERM_simplePatternCommaList | NONTERM_opt_simplePatterns | NONTERM_simplePatterns + | NONTERM_barCanBeRightBeforeNull | NONTERM_headBindingPattern | NONTERM_tuplePatternElements | NONTERM_conjPatternElements @@ -719,7 +724,9 @@ type nonTerminalId = | NONTERM_intersectionType | NONTERM_appTypeCon | NONTERM_appTypeConPower - | NONTERM_appType + | NONTERM_appTypeCanBeNullable + | NONTERM_appTypeNullableInParens + | NONTERM_appTypeWithoutNull | NONTERM_arrayTypeSuffix | NONTERM_appTypePrefixArguments | NONTERM_typeArgListElements @@ -756,11 +763,9 @@ type nonTerminalId = | NONTERM_opt_declEnd | NONTERM_opt_ODECLEND | NONTERM_deprecated_opt_equals - | NONTERM_opt_equals | NONTERM_opt_OBLOCKSEP | NONTERM_opt_seps | NONTERM_opt_rec - | NONTERM_opt_bar | NONTERM_opt_inline | NONTERM_opt_mutable | NONTERM_doToken @@ -828,168 +833,169 @@ let tagOfToken (t:token) = | TYPE_IS_HERE -> 38 | MODULE_COMING_SOON -> 39 | MODULE_IS_HERE -> 40 - | EXTERN -> 41 - | VOID -> 42 - | PUBLIC -> 43 - | PRIVATE -> 44 - | INTERNAL -> 45 - | GLOBAL -> 46 - | STATIC -> 47 - | MEMBER -> 48 - | CLASS -> 49 - | ABSTRACT -> 50 - | OVERRIDE -> 51 - | DEFAULT -> 52 - | CONSTRUCTOR -> 53 - | INHERIT -> 54 - | GREATER_RBRACK -> 55 - | STRUCT -> 56 - | SIG -> 57 - | BAR -> 58 - | RBRACK -> 59 - | RBRACE_COMING_SOON -> 60 - | RBRACE_IS_HERE -> 61 - | MINUS -> 62 - | DOLLAR -> 63 - | BAR_RBRACK -> 64 - | BAR_RBRACE -> 65 - | UNDERSCORE -> 66 - | SEMICOLON_SEMICOLON -> 67 - | LARROW -> 68 - | EQUALS -> 69 - | LBRACK -> 70 - | LBRACK_BAR -> 71 - | LBRACE_BAR -> 72 - | LBRACK_LESS -> 73 - | QMARK -> 74 - | QMARK_QMARK -> 75 - | DOT -> 76 - | COLON -> 77 - | COLON_COLON -> 78 - | COLON_GREATER -> 79 - | COLON_QMARK_GREATER -> 80 - | COLON_QMARK -> 81 - | COLON_EQUALS -> 82 - | SEMICOLON -> 83 - | WHEN -> 84 - | WHILE -> 85 - | WHILE_BANG -> 86 - | WITH -> 87 - | HASH -> 88 - | AMP -> 89 - | AMP_AMP -> 90 - | QUOTE -> 91 - | LPAREN -> 92 - | RPAREN -> 93 - | RPAREN_COMING_SOON -> 94 - | RPAREN_IS_HERE -> 95 - | STAR -> 96 - | COMMA -> 97 - | RARROW -> 98 - | GREATER_BAR_RBRACK -> 99 - | LPAREN_STAR_RPAREN -> 100 - | OPEN -> 101 - | OR -> 102 - | REC -> 103 - | THEN -> 104 - | TO -> 105 - | TRUE -> 106 - | TRY -> 107 - | TYPE -> 108 - | VAL -> 109 - | INLINE -> 110 - | INTERFACE -> 111 - | INSTANCE -> 112 - | CONST -> 113 - | LAZY -> 114 - | OLAZY -> 115 - | MATCH -> 116 - | MATCH_BANG -> 117 - | MUTABLE -> 118 - | NEW -> 119 - | OF -> 120 - | EXCEPTION -> 121 - | FALSE -> 122 - | FOR -> 123 - | FUN -> 124 - | FUNCTION -> 125 - | IF -> 126 - | IN -> 127 - | JOIN_IN -> 128 - | FINALLY -> 129 - | DO_BANG -> 130 - | AND -> 131 - | AS -> 132 - | ASSERT -> 133 - | OASSERT -> 134 - | ASR -> 135 - | BEGIN -> 136 - | DO -> 137 - | DONE -> 138 - | DOWNTO -> 139 - | ELSE -> 140 - | ELIF -> 141 - | END -> 142 - | DOT_DOT -> 143 - | DOT_DOT_HAT -> 144 - | BAR_BAR -> 145 - | UPCAST -> 146 - | DOWNCAST -> 147 - | NULL -> 148 - | RESERVED -> 149 - | MODULE -> 150 - | NAMESPACE -> 151 - | DELEGATE -> 152 - | CONSTRAINT -> 153 - | BASE -> 154 - | LQUOTE _ -> 155 - | RQUOTE _ -> 156 - | RQUOTE_DOT _ -> 157 - | PERCENT_OP _ -> 158 - | BINDER _ -> 159 - | LESS _ -> 160 - | GREATER _ -> 161 - | LET _ -> 162 - | YIELD _ -> 163 - | YIELD_BANG _ -> 164 - | AND_BANG _ -> 165 - | BIGNUM _ -> 166 - | DECIMAL _ -> 167 - | CHAR _ -> 168 - | IEEE64 _ -> 169 - | IEEE32 _ -> 170 - | UNATIVEINT _ -> 171 - | UINT64 _ -> 172 - | UINT32 _ -> 173 - | UINT16 _ -> 174 - | UINT8 _ -> 175 - | NATIVEINT _ -> 176 - | INT64 _ -> 177 - | INT32 _ -> 178 - | INT32_DOT_DOT _ -> 179 - | INT16 _ -> 180 - | INT8 _ -> 181 - | FUNKY_OPERATOR_NAME _ -> 182 - | ADJACENT_PREFIX_OP _ -> 183 - | PLUS_MINUS_OP _ -> 184 - | INFIX_AMP_OP _ -> 185 - | INFIX_STAR_DIV_MOD_OP _ -> 186 - | PREFIX_OP _ -> 187 - | INFIX_BAR_OP _ -> 188 - | INFIX_AT_HAT_OP _ -> 189 - | INFIX_COMPARE_OP _ -> 190 - | INFIX_STAR_STAR_OP _ -> 191 - | HASH_IDENT _ -> 192 - | IDENT _ -> 193 - | KEYWORD_STRING _ -> 194 - | LBRACE _ -> 195 - | RBRACE _ -> 196 - | INTERP_STRING_END _ -> 197 - | INTERP_STRING_PART _ -> 198 - | INTERP_STRING_BEGIN_PART _ -> 199 - | INTERP_STRING_BEGIN_END _ -> 200 - | STRING _ -> 201 - | BYTEARRAY _ -> 202 + | BAR_JUST_BEFORE_NULL -> 41 + | EXTERN -> 42 + | VOID -> 43 + | PUBLIC -> 44 + | PRIVATE -> 45 + | INTERNAL -> 46 + | GLOBAL -> 47 + | STATIC -> 48 + | MEMBER -> 49 + | CLASS -> 50 + | ABSTRACT -> 51 + | OVERRIDE -> 52 + | DEFAULT -> 53 + | CONSTRUCTOR -> 54 + | INHERIT -> 55 + | GREATER_RBRACK -> 56 + | STRUCT -> 57 + | SIG -> 58 + | BAR -> 59 + | RBRACK -> 60 + | RBRACE_COMING_SOON -> 61 + | RBRACE_IS_HERE -> 62 + | MINUS -> 63 + | DOLLAR -> 64 + | BAR_RBRACK -> 65 + | BAR_RBRACE -> 66 + | UNDERSCORE -> 67 + | SEMICOLON_SEMICOLON -> 68 + | LARROW -> 69 + | EQUALS -> 70 + | LBRACK -> 71 + | LBRACK_BAR -> 72 + | LBRACE_BAR -> 73 + | LBRACK_LESS -> 74 + | QMARK -> 75 + | QMARK_QMARK -> 76 + | DOT -> 77 + | COLON -> 78 + | COLON_COLON -> 79 + | COLON_GREATER -> 80 + | COLON_QMARK_GREATER -> 81 + | COLON_QMARK -> 82 + | COLON_EQUALS -> 83 + | SEMICOLON -> 84 + | WHEN -> 85 + | WHILE -> 86 + | WHILE_BANG -> 87 + | WITH -> 88 + | HASH -> 89 + | AMP -> 90 + | AMP_AMP -> 91 + | QUOTE -> 92 + | LPAREN -> 93 + | RPAREN -> 94 + | RPAREN_COMING_SOON -> 95 + | RPAREN_IS_HERE -> 96 + | STAR -> 97 + | COMMA -> 98 + | RARROW -> 99 + | GREATER_BAR_RBRACK -> 100 + | LPAREN_STAR_RPAREN -> 101 + | OPEN -> 102 + | OR -> 103 + | REC -> 104 + | THEN -> 105 + | TO -> 106 + | TRUE -> 107 + | TRY -> 108 + | TYPE -> 109 + | VAL -> 110 + | INLINE -> 111 + | INTERFACE -> 112 + | INSTANCE -> 113 + | CONST -> 114 + | LAZY -> 115 + | OLAZY -> 116 + | MATCH -> 117 + | MATCH_BANG -> 118 + | MUTABLE -> 119 + | NEW -> 120 + | OF -> 121 + | EXCEPTION -> 122 + | FALSE -> 123 + | FOR -> 124 + | FUN -> 125 + | FUNCTION -> 126 + | IF -> 127 + | IN -> 128 + | JOIN_IN -> 129 + | FINALLY -> 130 + | DO_BANG -> 131 + | AND -> 132 + | AS -> 133 + | ASSERT -> 134 + | OASSERT -> 135 + | ASR -> 136 + | BEGIN -> 137 + | DO -> 138 + | DONE -> 139 + | DOWNTO -> 140 + | ELSE -> 141 + | ELIF -> 142 + | END -> 143 + | DOT_DOT -> 144 + | DOT_DOT_HAT -> 145 + | BAR_BAR -> 146 + | UPCAST -> 147 + | DOWNCAST -> 148 + | NULL -> 149 + | RESERVED -> 150 + | MODULE -> 151 + | NAMESPACE -> 152 + | DELEGATE -> 153 + | CONSTRAINT -> 154 + | BASE -> 155 + | LQUOTE _ -> 156 + | RQUOTE _ -> 157 + | RQUOTE_DOT _ -> 158 + | PERCENT_OP _ -> 159 + | BINDER _ -> 160 + | LESS _ -> 161 + | GREATER _ -> 162 + | LET _ -> 163 + | YIELD _ -> 164 + | YIELD_BANG _ -> 165 + | AND_BANG _ -> 166 + | BIGNUM _ -> 167 + | DECIMAL _ -> 168 + | CHAR _ -> 169 + | IEEE64 _ -> 170 + | IEEE32 _ -> 171 + | UNATIVEINT _ -> 172 + | UINT64 _ -> 173 + | UINT32 _ -> 174 + | UINT16 _ -> 175 + | UINT8 _ -> 176 + | NATIVEINT _ -> 177 + | INT64 _ -> 178 + | INT32 _ -> 179 + | INT32_DOT_DOT _ -> 180 + | INT16 _ -> 181 + | INT8 _ -> 182 + | FUNKY_OPERATOR_NAME _ -> 183 + | ADJACENT_PREFIX_OP _ -> 184 + | PLUS_MINUS_OP _ -> 185 + | INFIX_AMP_OP _ -> 186 + | INFIX_STAR_DIV_MOD_OP _ -> 187 + | PREFIX_OP _ -> 188 + | INFIX_BAR_OP _ -> 189 + | INFIX_AT_HAT_OP _ -> 190 + | INFIX_COMPARE_OP _ -> 191 + | INFIX_STAR_STAR_OP _ -> 192 + | HASH_IDENT _ -> 193 + | IDENT _ -> 194 + | KEYWORD_STRING _ -> 195 + | LBRACE _ -> 196 + | RBRACE _ -> 197 + | INTERP_STRING_END _ -> 198 + | INTERP_STRING_PART _ -> 199 + | INTERP_STRING_BEGIN_PART _ -> 200 + | INTERP_STRING_BEGIN_END _ -> 201 + | STRING _ -> 202 + | BYTEARRAY _ -> 203 // This function maps integer indexes to symbolic token ids let tokenTagToTokenId (tokenIdx:int) = @@ -1035,170 +1041,171 @@ let tokenTagToTokenId (tokenIdx:int) = | 38 -> TOKEN_TYPE_IS_HERE | 39 -> TOKEN_MODULE_COMING_SOON | 40 -> TOKEN_MODULE_IS_HERE - | 41 -> TOKEN_EXTERN - | 42 -> TOKEN_VOID - | 43 -> TOKEN_PUBLIC - | 44 -> TOKEN_PRIVATE - | 45 -> TOKEN_INTERNAL - | 46 -> TOKEN_GLOBAL - | 47 -> TOKEN_STATIC - | 48 -> TOKEN_MEMBER - | 49 -> TOKEN_CLASS - | 50 -> TOKEN_ABSTRACT - | 51 -> TOKEN_OVERRIDE - | 52 -> TOKEN_DEFAULT - | 53 -> TOKEN_CONSTRUCTOR - | 54 -> TOKEN_INHERIT - | 55 -> TOKEN_GREATER_RBRACK - | 56 -> TOKEN_STRUCT - | 57 -> TOKEN_SIG - | 58 -> TOKEN_BAR - | 59 -> TOKEN_RBRACK - | 60 -> TOKEN_RBRACE_COMING_SOON - | 61 -> TOKEN_RBRACE_IS_HERE - | 62 -> TOKEN_MINUS - | 63 -> TOKEN_DOLLAR - | 64 -> TOKEN_BAR_RBRACK - | 65 -> TOKEN_BAR_RBRACE - | 66 -> TOKEN_UNDERSCORE - | 67 -> TOKEN_SEMICOLON_SEMICOLON - | 68 -> TOKEN_LARROW - | 69 -> TOKEN_EQUALS - | 70 -> TOKEN_LBRACK - | 71 -> TOKEN_LBRACK_BAR - | 72 -> TOKEN_LBRACE_BAR - | 73 -> TOKEN_LBRACK_LESS - | 74 -> TOKEN_QMARK - | 75 -> TOKEN_QMARK_QMARK - | 76 -> TOKEN_DOT - | 77 -> TOKEN_COLON - | 78 -> TOKEN_COLON_COLON - | 79 -> TOKEN_COLON_GREATER - | 80 -> TOKEN_COLON_QMARK_GREATER - | 81 -> TOKEN_COLON_QMARK - | 82 -> TOKEN_COLON_EQUALS - | 83 -> TOKEN_SEMICOLON - | 84 -> TOKEN_WHEN - | 85 -> TOKEN_WHILE - | 86 -> TOKEN_WHILE_BANG - | 87 -> TOKEN_WITH - | 88 -> TOKEN_HASH - | 89 -> TOKEN_AMP - | 90 -> TOKEN_AMP_AMP - | 91 -> TOKEN_QUOTE - | 92 -> TOKEN_LPAREN - | 93 -> TOKEN_RPAREN - | 94 -> TOKEN_RPAREN_COMING_SOON - | 95 -> TOKEN_RPAREN_IS_HERE - | 96 -> TOKEN_STAR - | 97 -> TOKEN_COMMA - | 98 -> TOKEN_RARROW - | 99 -> TOKEN_GREATER_BAR_RBRACK - | 100 -> TOKEN_LPAREN_STAR_RPAREN - | 101 -> TOKEN_OPEN - | 102 -> TOKEN_OR - | 103 -> TOKEN_REC - | 104 -> TOKEN_THEN - | 105 -> TOKEN_TO - | 106 -> TOKEN_TRUE - | 107 -> TOKEN_TRY - | 108 -> TOKEN_TYPE - | 109 -> TOKEN_VAL - | 110 -> TOKEN_INLINE - | 111 -> TOKEN_INTERFACE - | 112 -> TOKEN_INSTANCE - | 113 -> TOKEN_CONST - | 114 -> TOKEN_LAZY - | 115 -> TOKEN_OLAZY - | 116 -> TOKEN_MATCH - | 117 -> TOKEN_MATCH_BANG - | 118 -> TOKEN_MUTABLE - | 119 -> TOKEN_NEW - | 120 -> TOKEN_OF - | 121 -> TOKEN_EXCEPTION - | 122 -> TOKEN_FALSE - | 123 -> TOKEN_FOR - | 124 -> TOKEN_FUN - | 125 -> TOKEN_FUNCTION - | 126 -> TOKEN_IF - | 127 -> TOKEN_IN - | 128 -> TOKEN_JOIN_IN - | 129 -> TOKEN_FINALLY - | 130 -> TOKEN_DO_BANG - | 131 -> TOKEN_AND - | 132 -> TOKEN_AS - | 133 -> TOKEN_ASSERT - | 134 -> TOKEN_OASSERT - | 135 -> TOKEN_ASR - | 136 -> TOKEN_BEGIN - | 137 -> TOKEN_DO - | 138 -> TOKEN_DONE - | 139 -> TOKEN_DOWNTO - | 140 -> TOKEN_ELSE - | 141 -> TOKEN_ELIF - | 142 -> TOKEN_END - | 143 -> TOKEN_DOT_DOT - | 144 -> TOKEN_DOT_DOT_HAT - | 145 -> TOKEN_BAR_BAR - | 146 -> TOKEN_UPCAST - | 147 -> TOKEN_DOWNCAST - | 148 -> TOKEN_NULL - | 149 -> TOKEN_RESERVED - | 150 -> TOKEN_MODULE - | 151 -> TOKEN_NAMESPACE - | 152 -> TOKEN_DELEGATE - | 153 -> TOKEN_CONSTRAINT - | 154 -> TOKEN_BASE - | 155 -> TOKEN_LQUOTE - | 156 -> TOKEN_RQUOTE - | 157 -> TOKEN_RQUOTE_DOT - | 158 -> TOKEN_PERCENT_OP - | 159 -> TOKEN_BINDER - | 160 -> TOKEN_LESS - | 161 -> TOKEN_GREATER - | 162 -> TOKEN_LET - | 163 -> TOKEN_YIELD - | 164 -> TOKEN_YIELD_BANG - | 165 -> TOKEN_AND_BANG - | 166 -> TOKEN_BIGNUM - | 167 -> TOKEN_DECIMAL - | 168 -> TOKEN_CHAR - | 169 -> TOKEN_IEEE64 - | 170 -> TOKEN_IEEE32 - | 171 -> TOKEN_UNATIVEINT - | 172 -> TOKEN_UINT64 - | 173 -> TOKEN_UINT32 - | 174 -> TOKEN_UINT16 - | 175 -> TOKEN_UINT8 - | 176 -> TOKEN_NATIVEINT - | 177 -> TOKEN_INT64 - | 178 -> TOKEN_INT32 - | 179 -> TOKEN_INT32_DOT_DOT - | 180 -> TOKEN_INT16 - | 181 -> TOKEN_INT8 - | 182 -> TOKEN_FUNKY_OPERATOR_NAME - | 183 -> TOKEN_ADJACENT_PREFIX_OP - | 184 -> TOKEN_PLUS_MINUS_OP - | 185 -> TOKEN_INFIX_AMP_OP - | 186 -> TOKEN_INFIX_STAR_DIV_MOD_OP - | 187 -> TOKEN_PREFIX_OP - | 188 -> TOKEN_INFIX_BAR_OP - | 189 -> TOKEN_INFIX_AT_HAT_OP - | 190 -> TOKEN_INFIX_COMPARE_OP - | 191 -> TOKEN_INFIX_STAR_STAR_OP - | 192 -> TOKEN_HASH_IDENT - | 193 -> TOKEN_IDENT - | 194 -> TOKEN_KEYWORD_STRING - | 195 -> TOKEN_LBRACE - | 196 -> TOKEN_RBRACE - | 197 -> TOKEN_INTERP_STRING_END - | 198 -> TOKEN_INTERP_STRING_PART - | 199 -> TOKEN_INTERP_STRING_BEGIN_PART - | 200 -> TOKEN_INTERP_STRING_BEGIN_END - | 201 -> TOKEN_STRING - | 202 -> TOKEN_BYTEARRAY - | 205 -> TOKEN_end_of_input - | 203 -> TOKEN_error + | 41 -> TOKEN_BAR_JUST_BEFORE_NULL + | 42 -> TOKEN_EXTERN + | 43 -> TOKEN_VOID + | 44 -> TOKEN_PUBLIC + | 45 -> TOKEN_PRIVATE + | 46 -> TOKEN_INTERNAL + | 47 -> TOKEN_GLOBAL + | 48 -> TOKEN_STATIC + | 49 -> TOKEN_MEMBER + | 50 -> TOKEN_CLASS + | 51 -> TOKEN_ABSTRACT + | 52 -> TOKEN_OVERRIDE + | 53 -> TOKEN_DEFAULT + | 54 -> TOKEN_CONSTRUCTOR + | 55 -> TOKEN_INHERIT + | 56 -> TOKEN_GREATER_RBRACK + | 57 -> TOKEN_STRUCT + | 58 -> TOKEN_SIG + | 59 -> TOKEN_BAR + | 60 -> TOKEN_RBRACK + | 61 -> TOKEN_RBRACE_COMING_SOON + | 62 -> TOKEN_RBRACE_IS_HERE + | 63 -> TOKEN_MINUS + | 64 -> TOKEN_DOLLAR + | 65 -> TOKEN_BAR_RBRACK + | 66 -> TOKEN_BAR_RBRACE + | 67 -> TOKEN_UNDERSCORE + | 68 -> TOKEN_SEMICOLON_SEMICOLON + | 69 -> TOKEN_LARROW + | 70 -> TOKEN_EQUALS + | 71 -> TOKEN_LBRACK + | 72 -> TOKEN_LBRACK_BAR + | 73 -> TOKEN_LBRACE_BAR + | 74 -> TOKEN_LBRACK_LESS + | 75 -> TOKEN_QMARK + | 76 -> TOKEN_QMARK_QMARK + | 77 -> TOKEN_DOT + | 78 -> TOKEN_COLON + | 79 -> TOKEN_COLON_COLON + | 80 -> TOKEN_COLON_GREATER + | 81 -> TOKEN_COLON_QMARK_GREATER + | 82 -> TOKEN_COLON_QMARK + | 83 -> TOKEN_COLON_EQUALS + | 84 -> TOKEN_SEMICOLON + | 85 -> TOKEN_WHEN + | 86 -> TOKEN_WHILE + | 87 -> TOKEN_WHILE_BANG + | 88 -> TOKEN_WITH + | 89 -> TOKEN_HASH + | 90 -> TOKEN_AMP + | 91 -> TOKEN_AMP_AMP + | 92 -> TOKEN_QUOTE + | 93 -> TOKEN_LPAREN + | 94 -> TOKEN_RPAREN + | 95 -> TOKEN_RPAREN_COMING_SOON + | 96 -> TOKEN_RPAREN_IS_HERE + | 97 -> TOKEN_STAR + | 98 -> TOKEN_COMMA + | 99 -> TOKEN_RARROW + | 100 -> TOKEN_GREATER_BAR_RBRACK + | 101 -> TOKEN_LPAREN_STAR_RPAREN + | 102 -> TOKEN_OPEN + | 103 -> TOKEN_OR + | 104 -> TOKEN_REC + | 105 -> TOKEN_THEN + | 106 -> TOKEN_TO + | 107 -> TOKEN_TRUE + | 108 -> TOKEN_TRY + | 109 -> TOKEN_TYPE + | 110 -> TOKEN_VAL + | 111 -> TOKEN_INLINE + | 112 -> TOKEN_INTERFACE + | 113 -> TOKEN_INSTANCE + | 114 -> TOKEN_CONST + | 115 -> TOKEN_LAZY + | 116 -> TOKEN_OLAZY + | 117 -> TOKEN_MATCH + | 118 -> TOKEN_MATCH_BANG + | 119 -> TOKEN_MUTABLE + | 120 -> TOKEN_NEW + | 121 -> TOKEN_OF + | 122 -> TOKEN_EXCEPTION + | 123 -> TOKEN_FALSE + | 124 -> TOKEN_FOR + | 125 -> TOKEN_FUN + | 126 -> TOKEN_FUNCTION + | 127 -> TOKEN_IF + | 128 -> TOKEN_IN + | 129 -> TOKEN_JOIN_IN + | 130 -> TOKEN_FINALLY + | 131 -> TOKEN_DO_BANG + | 132 -> TOKEN_AND + | 133 -> TOKEN_AS + | 134 -> TOKEN_ASSERT + | 135 -> TOKEN_OASSERT + | 136 -> TOKEN_ASR + | 137 -> TOKEN_BEGIN + | 138 -> TOKEN_DO + | 139 -> TOKEN_DONE + | 140 -> TOKEN_DOWNTO + | 141 -> TOKEN_ELSE + | 142 -> TOKEN_ELIF + | 143 -> TOKEN_END + | 144 -> TOKEN_DOT_DOT + | 145 -> TOKEN_DOT_DOT_HAT + | 146 -> TOKEN_BAR_BAR + | 147 -> TOKEN_UPCAST + | 148 -> TOKEN_DOWNCAST + | 149 -> TOKEN_NULL + | 150 -> TOKEN_RESERVED + | 151 -> TOKEN_MODULE + | 152 -> TOKEN_NAMESPACE + | 153 -> TOKEN_DELEGATE + | 154 -> TOKEN_CONSTRAINT + | 155 -> TOKEN_BASE + | 156 -> TOKEN_LQUOTE + | 157 -> TOKEN_RQUOTE + | 158 -> TOKEN_RQUOTE_DOT + | 159 -> TOKEN_PERCENT_OP + | 160 -> TOKEN_BINDER + | 161 -> TOKEN_LESS + | 162 -> TOKEN_GREATER + | 163 -> TOKEN_LET + | 164 -> TOKEN_YIELD + | 165 -> TOKEN_YIELD_BANG + | 166 -> TOKEN_AND_BANG + | 167 -> TOKEN_BIGNUM + | 168 -> TOKEN_DECIMAL + | 169 -> TOKEN_CHAR + | 170 -> TOKEN_IEEE64 + | 171 -> TOKEN_IEEE32 + | 172 -> TOKEN_UNATIVEINT + | 173 -> TOKEN_UINT64 + | 174 -> TOKEN_UINT32 + | 175 -> TOKEN_UINT16 + | 176 -> TOKEN_UINT8 + | 177 -> TOKEN_NATIVEINT + | 178 -> TOKEN_INT64 + | 179 -> TOKEN_INT32 + | 180 -> TOKEN_INT32_DOT_DOT + | 181 -> TOKEN_INT16 + | 182 -> TOKEN_INT8 + | 183 -> TOKEN_FUNKY_OPERATOR_NAME + | 184 -> TOKEN_ADJACENT_PREFIX_OP + | 185 -> TOKEN_PLUS_MINUS_OP + | 186 -> TOKEN_INFIX_AMP_OP + | 187 -> TOKEN_INFIX_STAR_DIV_MOD_OP + | 188 -> TOKEN_PREFIX_OP + | 189 -> TOKEN_INFIX_BAR_OP + | 190 -> TOKEN_INFIX_AT_HAT_OP + | 191 -> TOKEN_INFIX_COMPARE_OP + | 192 -> TOKEN_INFIX_STAR_STAR_OP + | 193 -> TOKEN_HASH_IDENT + | 194 -> TOKEN_IDENT + | 195 -> TOKEN_KEYWORD_STRING + | 196 -> TOKEN_LBRACE + | 197 -> TOKEN_RBRACE + | 198 -> TOKEN_INTERP_STRING_END + | 199 -> TOKEN_INTERP_STRING_PART + | 200 -> TOKEN_INTERP_STRING_BEGIN_PART + | 201 -> TOKEN_INTERP_STRING_BEGIN_END + | 202 -> TOKEN_STRING + | 203 -> TOKEN_BYTEARRAY + | 206 -> TOKEN_end_of_input + | 204 -> TOKEN_error | _ -> failwith "tokenTagToTokenId: bad token" /// This function maps production indexes returned in syntax errors to strings representing the non terminal that would be produced by that production @@ -1234,210 +1241,210 @@ let prodIdxToNonTerminal (prodIdx:int) = | 27 -> NONTERM_hashDirectiveArgs | 28 -> NONTERM_hashDirectiveArg | 29 -> NONTERM_hashDirectiveArg - | 30 -> NONTERM_signatureFile - | 31 -> NONTERM_signatureFile - | 32 -> NONTERM_signatureFile - | 33 -> NONTERM_moduleIntro - | 34 -> NONTERM_moduleIntro - | 35 -> NONTERM_moduleIntro - | 36 -> NONTERM_namespaceIntro - | 37 -> NONTERM_namespaceIntro - | 38 -> NONTERM_fileNamespaceSpecs - | 39 -> NONTERM_fileNamespaceSpecs - | 40 -> NONTERM_fileNamespaceSpecList - | 41 -> NONTERM_fileNamespaceSpecList - | 42 -> NONTERM_fileNamespaceSpec - | 43 -> NONTERM_fileModuleSpec - | 44 -> NONTERM_fileModuleSpec - | 45 -> NONTERM_moduleSpfnsPossiblyEmptyBlock - | 46 -> NONTERM_moduleSpfnsPossiblyEmptyBlock - | 47 -> NONTERM_moduleSpfnsPossiblyEmptyBlock + | 30 -> NONTERM_hashDirectiveArg + | 31 -> NONTERM_hashDirectiveArg + | 32 -> NONTERM_hashDirectiveArg + | 33 -> NONTERM_signatureFile + | 34 -> NONTERM_signatureFile + | 35 -> NONTERM_signatureFile + | 36 -> NONTERM_moduleIntro + | 37 -> NONTERM_moduleIntro + | 38 -> NONTERM_moduleIntro + | 39 -> NONTERM_namespaceIntro + | 40 -> NONTERM_namespaceIntro + | 41 -> NONTERM_fileNamespaceSpecs + | 42 -> NONTERM_fileNamespaceSpecs + | 43 -> NONTERM_fileNamespaceSpecList + | 44 -> NONTERM_fileNamespaceSpecList + | 45 -> NONTERM_fileNamespaceSpec + | 46 -> NONTERM_fileModuleSpec + | 47 -> NONTERM_fileModuleSpec | 48 -> NONTERM_moduleSpfnsPossiblyEmptyBlock - | 49 -> NONTERM_moduleSpfnsPossiblyEmpty - | 50 -> NONTERM_moduleSpfnsPossiblyEmpty - | 51 -> NONTERM_moduleSpfnsPossiblyEmpty - | 52 -> NONTERM_moduleSpfns - | 53 -> NONTERM_moduleSpfns - | 54 -> NONTERM_moduleSpfns - | 55 -> NONTERM_moduleSpfn - | 56 -> NONTERM_moduleSpfn - | 57 -> NONTERM_moduleSpfn + | 49 -> NONTERM_moduleSpfnsPossiblyEmptyBlock + | 50 -> NONTERM_moduleSpfnsPossiblyEmptyBlock + | 51 -> NONTERM_moduleSpfnsPossiblyEmptyBlock + | 52 -> NONTERM_moduleSpfnsPossiblyEmpty + | 53 -> NONTERM_moduleSpfnsPossiblyEmpty + | 54 -> NONTERM_moduleSpfnsPossiblyEmpty + | 55 -> NONTERM_moduleSpfns + | 56 -> NONTERM_moduleSpfns + | 57 -> NONTERM_moduleSpfns | 58 -> NONTERM_moduleSpfn | 59 -> NONTERM_moduleSpfn | 60 -> NONTERM_moduleSpfn | 61 -> NONTERM_moduleSpfn | 62 -> NONTERM_moduleSpfn - | 63 -> NONTERM_valSpfn - | 64 -> NONTERM_optLiteralValueSpfn - | 65 -> NONTERM_optLiteralValueSpfn - | 66 -> NONTERM_optLiteralValueSpfn - | 67 -> NONTERM_moduleSpecBlock - | 68 -> NONTERM_moduleSpecBlock - | 69 -> NONTERM_moduleSpecBlock - | 70 -> NONTERM_tyconSpfnList - | 71 -> NONTERM_tyconSpfnList - | 72 -> NONTERM_tyconSpfn - | 73 -> NONTERM_tyconSpfn - | 74 -> NONTERM_tyconSpfnRhsBlock - | 75 -> NONTERM_tyconSpfnRhsBlock - | 76 -> NONTERM_tyconSpfnRhs - | 77 -> NONTERM_tyconSpfnRhs - | 78 -> NONTERM_tyconSpfnRhs - | 79 -> NONTERM_tyconClassSpfn - | 80 -> NONTERM_tyconClassSpfn - | 81 -> NONTERM_tyconClassSpfn + | 63 -> NONTERM_moduleSpfn + | 64 -> NONTERM_moduleSpfn + | 65 -> NONTERM_moduleSpfn + | 66 -> NONTERM_valSpfn + | 67 -> NONTERM_optLiteralValueSpfn + | 68 -> NONTERM_optLiteralValueSpfn + | 69 -> NONTERM_optLiteralValueSpfn + | 70 -> NONTERM_moduleSpecBlock + | 71 -> NONTERM_moduleSpecBlock + | 72 -> NONTERM_moduleSpecBlock + | 73 -> NONTERM_tyconSpfnList + | 74 -> NONTERM_tyconSpfnList + | 75 -> NONTERM_tyconSpfn + | 76 -> NONTERM_tyconSpfn + | 77 -> NONTERM_tyconSpfnRhsBlock + | 78 -> NONTERM_tyconSpfnRhsBlock + | 79 -> NONTERM_tyconSpfnRhs + | 80 -> NONTERM_tyconSpfnRhs + | 81 -> NONTERM_tyconSpfnRhs | 82 -> NONTERM_tyconClassSpfn - | 83 -> NONTERM_classSpfnBlockKindUnspecified - | 84 -> NONTERM_classSpfnBlockKindUnspecified - | 85 -> NONTERM_classSpfnBlockKindUnspecified + | 83 -> NONTERM_tyconClassSpfn + | 84 -> NONTERM_tyconClassSpfn + | 85 -> NONTERM_tyconClassSpfn | 86 -> NONTERM_classSpfnBlockKindUnspecified - | 87 -> NONTERM_classSpfnBlock - | 88 -> NONTERM_classSpfnBlock - | 89 -> NONTERM_classSpfnBlock - | 90 -> NONTERM_classSpfnMembers - | 91 -> NONTERM_classSpfnMembers - | 92 -> NONTERM_classSpfnMembersAtLeastOne - | 93 -> NONTERM_classMemberSpfn - | 94 -> NONTERM_classMemberSpfn - | 95 -> NONTERM_classMemberSpfn + | 87 -> NONTERM_classSpfnBlockKindUnspecified + | 88 -> NONTERM_classSpfnBlockKindUnspecified + | 89 -> NONTERM_classSpfnBlockKindUnspecified + | 90 -> NONTERM_classSpfnBlock + | 91 -> NONTERM_classSpfnBlock + | 92 -> NONTERM_classSpfnBlock + | 93 -> NONTERM_classSpfnMembers + | 94 -> NONTERM_classSpfnMembers + | 95 -> NONTERM_classSpfnMembersAtLeastOne | 96 -> NONTERM_classMemberSpfn | 97 -> NONTERM_classMemberSpfn | 98 -> NONTERM_classMemberSpfn | 99 -> NONTERM_classMemberSpfn | 100 -> NONTERM_classMemberSpfn - | 101 -> NONTERM_classMemberSpfnGetSet - | 102 -> NONTERM_classMemberSpfnGetSet - | 103 -> NONTERM_classMemberSpfnGetSet + | 101 -> NONTERM_classMemberSpfn + | 102 -> NONTERM_classMemberSpfn + | 103 -> NONTERM_classMemberSpfn | 104 -> NONTERM_classMemberSpfnGetSet - | 105 -> NONTERM_classMemberSpfnGetSetElements - | 106 -> NONTERM_classMemberSpfnGetSetElements - | 107 -> NONTERM_classMemberSpfnGetSetElements + | 105 -> NONTERM_classMemberSpfnGetSet + | 106 -> NONTERM_classMemberSpfnGetSet + | 107 -> NONTERM_classMemberSpfnGetSet | 108 -> NONTERM_classMemberSpfnGetSetElements - | 109 -> NONTERM_memberSpecFlags - | 110 -> NONTERM_memberSpecFlags - | 111 -> NONTERM_exconSpfn - | 112 -> NONTERM_opt_classSpfn - | 113 -> NONTERM_opt_classSpfn - | 114 -> NONTERM_implementationFile - | 115 -> NONTERM_implementationFile - | 116 -> NONTERM_implementationFile - | 117 -> NONTERM_fileNamespaceImpls - | 118 -> NONTERM_fileNamespaceImpls - | 119 -> NONTERM_fileNamespaceImplList - | 120 -> NONTERM_fileNamespaceImplList - | 121 -> NONTERM_fileNamespaceImpl - | 122 -> NONTERM_fileModuleImpl - | 123 -> NONTERM_fileModuleImpl - | 124 -> NONTERM_moduleDefnsOrExprPossiblyEmptyOrBlock - | 125 -> NONTERM_moduleDefnsOrExprPossiblyEmptyOrBlock - | 126 -> NONTERM_moduleDefnsOrExprPossiblyEmptyOrBlock + | 109 -> NONTERM_classMemberSpfnGetSetElements + | 110 -> NONTERM_classMemberSpfnGetSetElements + | 111 -> NONTERM_classMemberSpfnGetSetElements + | 112 -> NONTERM_memberSpecFlags + | 113 -> NONTERM_memberSpecFlags + | 114 -> NONTERM_exconSpfn + | 115 -> NONTERM_opt_classSpfn + | 116 -> NONTERM_opt_classSpfn + | 117 -> NONTERM_implementationFile + | 118 -> NONTERM_implementationFile + | 119 -> NONTERM_implementationFile + | 120 -> NONTERM_fileNamespaceImpls + | 121 -> NONTERM_fileNamespaceImpls + | 122 -> NONTERM_fileNamespaceImplList + | 123 -> NONTERM_fileNamespaceImplList + | 124 -> NONTERM_fileNamespaceImpl + | 125 -> NONTERM_fileModuleImpl + | 126 -> NONTERM_fileModuleImpl | 127 -> NONTERM_moduleDefnsOrExprPossiblyEmptyOrBlock - | 128 -> NONTERM_moduleDefnsOrExprPossiblyEmpty - | 129 -> NONTERM_moduleDefnsOrExprPossiblyEmpty - | 130 -> NONTERM_moduleDefnsOrExpr - | 131 -> NONTERM_moduleDefnsOrExpr - | 132 -> NONTERM_moduleDefnsOrExpr + | 128 -> NONTERM_moduleDefnsOrExprPossiblyEmptyOrBlock + | 129 -> NONTERM_moduleDefnsOrExprPossiblyEmptyOrBlock + | 130 -> NONTERM_moduleDefnsOrExprPossiblyEmptyOrBlock + | 131 -> NONTERM_moduleDefnsOrExprPossiblyEmpty + | 132 -> NONTERM_moduleDefnsOrExprPossiblyEmpty | 133 -> NONTERM_moduleDefnsOrExpr | 134 -> NONTERM_moduleDefnsOrExpr - | 135 -> NONTERM_moduleDefns - | 136 -> NONTERM_moduleDefns - | 137 -> NONTERM_moduleDefns + | 135 -> NONTERM_moduleDefnsOrExpr + | 136 -> NONTERM_moduleDefnsOrExpr + | 137 -> NONTERM_moduleDefnsOrExpr | 138 -> NONTERM_moduleDefns | 139 -> NONTERM_moduleDefns - | 140 -> NONTERM_moduleDefnOrDirective - | 141 -> NONTERM_moduleDefnOrDirective - | 142 -> NONTERM_moduleDefn - | 143 -> NONTERM_moduleDefn - | 144 -> NONTERM_moduleDefn + | 140 -> NONTERM_moduleDefns + | 141 -> NONTERM_moduleDefns + | 142 -> NONTERM_moduleDefns + | 143 -> NONTERM_moduleDefnOrDirective + | 144 -> NONTERM_moduleDefnOrDirective | 145 -> NONTERM_moduleDefn | 146 -> NONTERM_moduleDefn | 147 -> NONTERM_moduleDefn | 148 -> NONTERM_moduleDefn | 149 -> NONTERM_moduleDefn | 150 -> NONTERM_moduleDefn - | 151 -> NONTERM_openDecl - | 152 -> NONTERM_openDecl - | 153 -> NONTERM_openDecl + | 151 -> NONTERM_moduleDefn + | 152 -> NONTERM_moduleDefn + | 153 -> NONTERM_moduleDefn | 154 -> NONTERM_openDecl - | 155 -> NONTERM_namedModuleAbbrevBlock - | 156 -> NONTERM_namedModuleAbbrevBlock - | 157 -> NONTERM_namedModuleDefnBlock - | 158 -> NONTERM_namedModuleDefnBlock - | 159 -> NONTERM_namedModuleDefnBlock + | 155 -> NONTERM_openDecl + | 156 -> NONTERM_openDecl + | 157 -> NONTERM_openDecl + | 158 -> NONTERM_namedModuleAbbrevBlock + | 159 -> NONTERM_namedModuleAbbrevBlock | 160 -> NONTERM_namedModuleDefnBlock | 161 -> NONTERM_namedModuleDefnBlock | 162 -> NONTERM_namedModuleDefnBlock | 163 -> NONTERM_namedModuleDefnBlock - | 164 -> NONTERM_wrappedNamedModuleDefn - | 165 -> NONTERM_wrappedNamedModuleDefn - | 166 -> NONTERM_wrappedNamedModuleDefn - | 167 -> NONTERM_tyconDefnAugmentation - | 168 -> NONTERM_opt_attributes - | 169 -> NONTERM_opt_attributes - | 170 -> NONTERM_attributes - | 171 -> NONTERM_attributes - | 172 -> NONTERM_attributeList - | 173 -> NONTERM_attributeList - | 174 -> NONTERM_attributeList + | 164 -> NONTERM_namedModuleDefnBlock + | 165 -> NONTERM_namedModuleDefnBlock + | 166 -> NONTERM_namedModuleDefnBlock + | 167 -> NONTERM_wrappedNamedModuleDefn + | 168 -> NONTERM_wrappedNamedModuleDefn + | 169 -> NONTERM_wrappedNamedModuleDefn + | 170 -> NONTERM_tyconDefnAugmentation + | 171 -> NONTERM_opt_attributes + | 172 -> NONTERM_opt_attributes + | 173 -> NONTERM_attributes + | 174 -> NONTERM_attributes | 175 -> NONTERM_attributeList - | 176 -> NONTERM_attributeListElements - | 177 -> NONTERM_attributeListElements - | 178 -> NONTERM_attribute - | 179 -> NONTERM_attribute - | 180 -> NONTERM_attribute - | 181 -> NONTERM_attributeTarget - | 182 -> NONTERM_attributeTarget - | 183 -> NONTERM_attributeTarget + | 176 -> NONTERM_attributeList + | 177 -> NONTERM_attributeList + | 178 -> NONTERM_attributeList + | 179 -> NONTERM_attributeListElements + | 180 -> NONTERM_attributeListElements + | 181 -> NONTERM_attribute + | 182 -> NONTERM_attribute + | 183 -> NONTERM_attribute | 184 -> NONTERM_attributeTarget - | 185 -> NONTERM_memberFlags - | 186 -> NONTERM_memberFlags - | 187 -> NONTERM_memberFlags + | 185 -> NONTERM_attributeTarget + | 186 -> NONTERM_attributeTarget + | 187 -> NONTERM_attributeTarget | 188 -> NONTERM_memberFlags | 189 -> NONTERM_memberFlags - | 190 -> NONTERM_typeNameInfo - | 191 -> NONTERM_tyconDefnList - | 192 -> NONTERM_tyconDefnList - | 193 -> NONTERM_tyconDefn - | 194 -> NONTERM_tyconDefn - | 195 -> NONTERM_tyconDefn + | 190 -> NONTERM_memberFlags + | 191 -> NONTERM_memberFlags + | 192 -> NONTERM_memberFlags + | 193 -> NONTERM_typeNameInfo + | 194 -> NONTERM_tyconDefnList + | 195 -> NONTERM_tyconDefnList | 196 -> NONTERM_tyconDefn - | 197 -> NONTERM_tyconDefnRhsBlock - | 198 -> NONTERM_tyconDefnRhsBlock - | 199 -> NONTERM_tyconDefnRhsBlock + | 197 -> NONTERM_tyconDefn + | 198 -> NONTERM_tyconDefn + | 199 -> NONTERM_tyconDefn | 200 -> NONTERM_tyconDefnRhsBlock - | 201 -> NONTERM_tyconDefnRhs - | 202 -> NONTERM_tyconDefnRhs - | 203 -> NONTERM_tyconDefnRhs - | 204 -> NONTERM_tyconClassDefn - | 205 -> NONTERM_tyconClassDefn - | 206 -> NONTERM_tyconClassDefn + | 201 -> NONTERM_tyconDefnRhsBlock + | 202 -> NONTERM_tyconDefnRhsBlock + | 203 -> NONTERM_tyconDefnRhsBlock + | 204 -> NONTERM_tyconDefnRhs + | 205 -> NONTERM_tyconDefnRhs + | 206 -> NONTERM_tyconDefnRhs | 207 -> NONTERM_tyconClassDefn - | 208 -> NONTERM_classDefnBlockKindUnspecified - | 209 -> NONTERM_classDefnBlockKindUnspecified - | 210 -> NONTERM_classDefnBlock - | 211 -> NONTERM_classDefnBlock - | 212 -> NONTERM_classDefnBlock - | 213 -> NONTERM_classDefnMembers - | 214 -> NONTERM_classDefnMembers - | 215 -> NONTERM_classDefnMembers - | 216 -> NONTERM_classDefnMembersAtLeastOne - | 217 -> NONTERM_classDefnMemberGetSet - | 218 -> NONTERM_classDefnMemberGetSet - | 219 -> NONTERM_classDefnMemberGetSet - | 220 -> NONTERM_classDefnMemberGetSetElements - | 221 -> NONTERM_classDefnMemberGetSetElements - | 222 -> NONTERM_classDefnMemberGetSetElement - | 223 -> NONTERM_memberCore - | 224 -> NONTERM_memberCore - | 225 -> NONTERM_memberCore + | 208 -> NONTERM_tyconClassDefn + | 209 -> NONTERM_tyconClassDefn + | 210 -> NONTERM_tyconClassDefn + | 211 -> NONTERM_classDefnBlockKindUnspecified + | 212 -> NONTERM_classDefnBlockKindUnspecified + | 213 -> NONTERM_classDefnBlock + | 214 -> NONTERM_classDefnBlock + | 215 -> NONTERM_classDefnBlock + | 216 -> NONTERM_classDefnMembers + | 217 -> NONTERM_classDefnMembers + | 218 -> NONTERM_classDefnMembers + | 219 -> NONTERM_classDefnMembersAtLeastOne + | 220 -> NONTERM_classDefnMemberGetSet + | 221 -> NONTERM_classDefnMemberGetSet + | 222 -> NONTERM_classDefnMemberGetSet + | 223 -> NONTERM_classDefnMemberGetSetElements + | 224 -> NONTERM_classDefnMemberGetSetElements + | 225 -> NONTERM_classDefnMemberGetSetElement | 226 -> NONTERM_memberCore - | 227 -> NONTERM_abstractMemberFlags - | 228 -> NONTERM_abstractMemberFlags - | 229 -> NONTERM_abstractMemberFlags + | 227 -> NONTERM_memberCore + | 228 -> NONTERM_memberCore + | 229 -> NONTERM_memberCore | 230 -> NONTERM_abstractMemberFlags - | 231 -> NONTERM_classDefnMember - | 232 -> NONTERM_classDefnMember - | 233 -> NONTERM_classDefnMember + | 231 -> NONTERM_abstractMemberFlags + | 232 -> NONTERM_abstractMemberFlags + | 233 -> NONTERM_abstractMemberFlags | 234 -> NONTERM_classDefnMember | 235 -> NONTERM_classDefnMember | 236 -> NONTERM_classDefnMember @@ -1451,295 +1458,295 @@ let prodIdxToNonTerminal (prodIdx:int) = | 244 -> NONTERM_classDefnMember | 245 -> NONTERM_classDefnMember | 246 -> NONTERM_classDefnMember - | 247 -> NONTERM_valDefnDecl - | 248 -> NONTERM_valDefnDecl - | 249 -> NONTERM_valDefnDecl + | 247 -> NONTERM_classDefnMember + | 248 -> NONTERM_classDefnMember + | 249 -> NONTERM_classDefnMember | 250 -> NONTERM_valDefnDecl - | 251 -> NONTERM_autoPropsDefnDecl - | 252 -> NONTERM_autoPropsDefnDecl - | 253 -> NONTERM_autoPropsDefnDecl + | 251 -> NONTERM_valDefnDecl + | 252 -> NONTERM_valDefnDecl + | 253 -> NONTERM_valDefnDecl | 254 -> NONTERM_autoPropsDefnDecl - | 255 -> NONTERM_opt_typ - | 256 -> NONTERM_opt_typ - | 257 -> NONTERM_opt_typ - | 258 -> NONTERM_atomicPatternLongIdent - | 259 -> NONTERM_atomicPatternLongIdent - | 260 -> NONTERM_atomicPatternLongIdent + | 255 -> NONTERM_autoPropsDefnDecl + | 256 -> NONTERM_autoPropsDefnDecl + | 257 -> NONTERM_autoPropsDefnDecl + | 258 -> NONTERM_opt_typ + | 259 -> NONTERM_opt_typ + | 260 -> NONTERM_opt_typ | 261 -> NONTERM_atomicPatternLongIdent | 262 -> NONTERM_atomicPatternLongIdent - | 263 -> NONTERM_opt_access - | 264 -> NONTERM_opt_access - | 265 -> NONTERM_access - | 266 -> NONTERM_access - | 267 -> NONTERM_access - | 268 -> NONTERM_opt_interfaceImplDefn - | 269 -> NONTERM_opt_interfaceImplDefn - | 270 -> NONTERM_opt_interfaceImplDefn - | 271 -> NONTERM_opt_classDefn - | 272 -> NONTERM_opt_classDefn - | 273 -> NONTERM_inheritsDefn - | 274 -> NONTERM_inheritsDefn - | 275 -> NONTERM_inheritsDefn - | 276 -> NONTERM_optAsSpec - | 277 -> NONTERM_optAsSpec - | 278 -> NONTERM_asSpec - | 279 -> NONTERM_asSpec - | 280 -> NONTERM_optBaseSpec - | 281 -> NONTERM_optBaseSpec - | 282 -> NONTERM_baseSpec - | 283 -> NONTERM_baseSpec - | 284 -> NONTERM_objectImplementationBlock - | 285 -> NONTERM_objectImplementationBlock - | 286 -> NONTERM_objectImplementationBlock - | 287 -> NONTERM_objectImplementationMembers - | 288 -> NONTERM_objectImplementationMembers - | 289 -> NONTERM_objectImplementationMember - | 290 -> NONTERM_objectImplementationMember - | 291 -> NONTERM_objectImplementationMember + | 263 -> NONTERM_atomicPatternLongIdent + | 264 -> NONTERM_atomicPatternLongIdent + | 265 -> NONTERM_atomicPatternLongIdent + | 266 -> NONTERM_opt_access + | 267 -> NONTERM_opt_access + | 268 -> NONTERM_access + | 269 -> NONTERM_access + | 270 -> NONTERM_access + | 271 -> NONTERM_opt_interfaceImplDefn + | 272 -> NONTERM_opt_interfaceImplDefn + | 273 -> NONTERM_opt_interfaceImplDefn + | 274 -> NONTERM_opt_classDefn + | 275 -> NONTERM_opt_classDefn + | 276 -> NONTERM_inheritsDefn + | 277 -> NONTERM_inheritsDefn + | 278 -> NONTERM_inheritsDefn + | 279 -> NONTERM_optAsSpec + | 280 -> NONTERM_optAsSpec + | 281 -> NONTERM_asSpec + | 282 -> NONTERM_asSpec + | 283 -> NONTERM_optBaseSpec + | 284 -> NONTERM_optBaseSpec + | 285 -> NONTERM_baseSpec + | 286 -> NONTERM_baseSpec + | 287 -> NONTERM_objectImplementationBlock + | 288 -> NONTERM_objectImplementationBlock + | 289 -> NONTERM_objectImplementationBlock + | 290 -> NONTERM_objectImplementationMembers + | 291 -> NONTERM_objectImplementationMembers | 292 -> NONTERM_objectImplementationMember - | 293 -> NONTERM_staticMemberOrMemberOrOverride - | 294 -> NONTERM_staticMemberOrMemberOrOverride - | 295 -> NONTERM_staticMemberOrMemberOrOverride - | 296 -> NONTERM_tyconDefnOrSpfnSimpleRepr - | 297 -> NONTERM_tyconDefnOrSpfnSimpleRepr - | 298 -> NONTERM_tyconDefnOrSpfnSimpleRepr + | 293 -> NONTERM_objectImplementationMember + | 294 -> NONTERM_objectImplementationMember + | 295 -> NONTERM_objectImplementationMember + | 296 -> NONTERM_staticMemberOrMemberOrOverride + | 297 -> NONTERM_staticMemberOrMemberOrOverride + | 298 -> NONTERM_staticMemberOrMemberOrOverride | 299 -> NONTERM_tyconDefnOrSpfnSimpleRepr | 300 -> NONTERM_tyconDefnOrSpfnSimpleRepr - | 301 -> NONTERM_braceFieldDeclList - | 302 -> NONTERM_braceFieldDeclList - | 303 -> NONTERM_braceFieldDeclList + | 301 -> NONTERM_tyconDefnOrSpfnSimpleRepr + | 302 -> NONTERM_tyconDefnOrSpfnSimpleRepr + | 303 -> NONTERM_tyconDefnOrSpfnSimpleRepr | 304 -> NONTERM_braceFieldDeclList - | 305 -> NONTERM_anonRecdType - | 306 -> NONTERM_anonRecdType - | 307 -> NONTERM_braceBarFieldDeclListCore - | 308 -> NONTERM_braceBarFieldDeclListCore - | 309 -> NONTERM_braceBarFieldDeclListCore - | 310 -> NONTERM_classOrInterfaceOrStruct - | 311 -> NONTERM_classOrInterfaceOrStruct - | 312 -> NONTERM_classOrInterfaceOrStruct - | 313 -> NONTERM_interfaceMember - | 314 -> NONTERM_interfaceMember - | 315 -> NONTERM_tyconNameAndTyparDecls - | 316 -> NONTERM_tyconNameAndTyparDecls - | 317 -> NONTERM_tyconNameAndTyparDecls + | 305 -> NONTERM_braceFieldDeclList + | 306 -> NONTERM_braceFieldDeclList + | 307 -> NONTERM_braceFieldDeclList + | 308 -> NONTERM_anonRecdType + | 309 -> NONTERM_anonRecdType + | 310 -> NONTERM_braceBarFieldDeclListCore + | 311 -> NONTERM_braceBarFieldDeclListCore + | 312 -> NONTERM_braceBarFieldDeclListCore + | 313 -> NONTERM_classOrInterfaceOrStruct + | 314 -> NONTERM_classOrInterfaceOrStruct + | 315 -> NONTERM_classOrInterfaceOrStruct + | 316 -> NONTERM_interfaceMember + | 317 -> NONTERM_interfaceMember | 318 -> NONTERM_tyconNameAndTyparDecls - | 319 -> NONTERM_prefixTyparDecls - | 320 -> NONTERM_prefixTyparDecls - | 321 -> NONTERM_typarDeclList - | 322 -> NONTERM_typarDeclList - | 323 -> NONTERM_typarDecl - | 324 -> NONTERM_typarDecl - | 325 -> NONTERM_postfixTyparDecls - | 326 -> NONTERM_explicitValTyparDeclsCore - | 327 -> NONTERM_explicitValTyparDeclsCore - | 328 -> NONTERM_explicitValTyparDeclsCore - | 329 -> NONTERM_explicitValTyparDecls - | 330 -> NONTERM_opt_explicitValTyparDecls - | 331 -> NONTERM_opt_explicitValTyparDecls - | 332 -> NONTERM_opt_typeConstraints - | 333 -> NONTERM_opt_typeConstraints - | 334 -> NONTERM_typeConstraints - | 335 -> NONTERM_typeConstraints - | 336 -> NONTERM_intersectionConstraints - | 337 -> NONTERM_intersectionConstraints - | 338 -> NONTERM_typeConstraint - | 339 -> NONTERM_typeConstraint - | 340 -> NONTERM_typeConstraint - | 341 -> NONTERM_typeConstraint - | 342 -> NONTERM_typeConstraint - | 343 -> NONTERM_typeConstraint + | 319 -> NONTERM_tyconNameAndTyparDecls + | 320 -> NONTERM_tyconNameAndTyparDecls + | 321 -> NONTERM_tyconNameAndTyparDecls + | 322 -> NONTERM_prefixTyparDecls + | 323 -> NONTERM_prefixTyparDecls + | 324 -> NONTERM_typarDeclList + | 325 -> NONTERM_typarDeclList + | 326 -> NONTERM_typarDecl + | 327 -> NONTERM_typarDecl + | 328 -> NONTERM_postfixTyparDecls + | 329 -> NONTERM_explicitValTyparDeclsCore + | 330 -> NONTERM_explicitValTyparDeclsCore + | 331 -> NONTERM_explicitValTyparDeclsCore + | 332 -> NONTERM_explicitValTyparDecls + | 333 -> NONTERM_opt_explicitValTyparDecls + | 334 -> NONTERM_opt_explicitValTyparDecls + | 335 -> NONTERM_hashConstraint + | 336 -> NONTERM_opt_typeConstraints + | 337 -> NONTERM_opt_typeConstraints + | 338 -> NONTERM_typeConstraints + | 339 -> NONTERM_typeConstraints + | 340 -> NONTERM_intersectionConstraints + | 341 -> NONTERM_intersectionConstraints + | 342 -> NONTERM_intersectionConstraints + | 343 -> NONTERM_intersectionConstraints | 344 -> NONTERM_typeConstraint | 345 -> NONTERM_typeConstraint | 346 -> NONTERM_typeConstraint | 347 -> NONTERM_typeConstraint | 348 -> NONTERM_typeConstraint - | 349 -> NONTERM_typeAlts - | 350 -> NONTERM_typeAlts - | 351 -> NONTERM_unionTypeRepr - | 352 -> NONTERM_unionTypeRepr - | 353 -> NONTERM_unionTypeRepr - | 354 -> NONTERM_barAndgrabXmlDoc - | 355 -> NONTERM_attrUnionCaseDecls - | 356 -> NONTERM_attrUnionCaseDecls - | 357 -> NONTERM_attrUnionCaseDecl - | 358 -> NONTERM_attrUnionCaseDecl - | 359 -> NONTERM_attrUnionCaseDecl - | 360 -> NONTERM_attrUnionCaseDecl - | 361 -> NONTERM_attrUnionCaseDecl - | 362 -> NONTERM_attrUnionCaseDecl - | 363 -> NONTERM_attrUnionCaseDecl + | 349 -> NONTERM_typeConstraint + | 350 -> NONTERM_typeConstraint + | 351 -> NONTERM_typeConstraint + | 352 -> NONTERM_typeConstraint + | 353 -> NONTERM_typeConstraint + | 354 -> NONTERM_typeConstraint + | 355 -> NONTERM_typeConstraint + | 356 -> NONTERM_typeAlts + | 357 -> NONTERM_typeAlts + | 358 -> NONTERM_unionTypeRepr + | 359 -> NONTERM_unionTypeRepr + | 360 -> NONTERM_unionTypeRepr + | 361 -> NONTERM_barAndgrabXmlDoc + | 362 -> NONTERM_attrUnionCaseDecls + | 363 -> NONTERM_attrUnionCaseDecls | 364 -> NONTERM_attrUnionCaseDecl | 365 -> NONTERM_attrUnionCaseDecl - | 366 -> NONTERM_unionCaseName - | 367 -> NONTERM_unionCaseName - | 368 -> NONTERM_unionCaseName - | 369 -> NONTERM_firstUnionCaseDeclOfMany - | 370 -> NONTERM_firstUnionCaseDeclOfMany - | 371 -> NONTERM_firstUnionCaseDeclOfMany - | 372 -> NONTERM_firstUnionCaseDecl - | 373 -> NONTERM_firstUnionCaseDecl - | 374 -> NONTERM_firstUnionCaseDecl - | 375 -> NONTERM_firstUnionCaseDecl - | 376 -> NONTERM_unionCaseReprElements - | 377 -> NONTERM_unionCaseReprElements - | 378 -> NONTERM_unionCaseReprElement - | 379 -> NONTERM_unionCaseReprElement - | 380 -> NONTERM_unionCaseReprElement - | 381 -> NONTERM_unionCaseReprElement - | 382 -> NONTERM_unionCaseRepr - | 383 -> NONTERM_unionCaseRepr - | 384 -> NONTERM_recdFieldDeclList - | 385 -> NONTERM_recdFieldDeclList - | 386 -> NONTERM_recdFieldDecl - | 387 -> NONTERM_fieldDecl - | 388 -> NONTERM_fieldDecl - | 389 -> NONTERM_fieldDecl - | 390 -> NONTERM_fieldDecl - | 391 -> NONTERM_exconDefn - | 392 -> NONTERM_exconCore - | 393 -> NONTERM_exconCore - | 394 -> NONTERM_exconIntro - | 395 -> NONTERM_exconIntro - | 396 -> NONTERM_exconIntro - | 397 -> NONTERM_exconRepr - | 398 -> NONTERM_exconRepr - | 399 -> NONTERM_defnBindings - | 400 -> NONTERM_defnBindings - | 401 -> NONTERM_doBinding - | 402 -> NONTERM_hardwhiteLetBindings - | 403 -> NONTERM_hardwhiteDoBinding - | 404 -> NONTERM_hardwhiteDoBinding - | 405 -> NONTERM_classDefnBindings - | 406 -> NONTERM_classDefnBindings - | 407 -> NONTERM_classDefnBindings - | 408 -> NONTERM_classDefnBindings - | 409 -> NONTERM_hardwhiteDefnBindingsTerminator - | 410 -> NONTERM_hardwhiteDefnBindingsTerminator - | 411 -> NONTERM_cPrototype - | 412 -> NONTERM_externArgs - | 413 -> NONTERM_externArgs - | 414 -> NONTERM_externArgs - | 415 -> NONTERM_externMoreArgs - | 416 -> NONTERM_externMoreArgs - | 417 -> NONTERM_externArg - | 418 -> NONTERM_externArg - | 419 -> NONTERM_cType - | 420 -> NONTERM_cType - | 421 -> NONTERM_cType - | 422 -> NONTERM_cType - | 423 -> NONTERM_cType - | 424 -> NONTERM_cRetType - | 425 -> NONTERM_cRetType - | 426 -> NONTERM_localBindings - | 427 -> NONTERM_moreLocalBindings - | 428 -> NONTERM_moreLocalBindings - | 429 -> NONTERM_attr_localBinding - | 430 -> NONTERM_attr_localBinding - | 431 -> NONTERM_localBinding - | 432 -> NONTERM_localBinding - | 433 -> NONTERM_localBinding - | 434 -> NONTERM_typedExprWithStaticOptimizationsBlock - | 435 -> NONTERM_typedExprWithStaticOptimizationsBlock - | 436 -> NONTERM_typedExprWithStaticOptimizationsBlock - | 437 -> NONTERM_typedExprWithStaticOptimizations - | 438 -> NONTERM_opt_staticOptimizations - | 439 -> NONTERM_opt_staticOptimizations - | 440 -> NONTERM_staticOptimization - | 441 -> NONTERM_staticOptimizationConditions - | 442 -> NONTERM_staticOptimizationConditions - | 443 -> NONTERM_staticOptimizationCondition - | 444 -> NONTERM_staticOptimizationCondition - | 445 -> NONTERM_rawConstant - | 446 -> NONTERM_rawConstant - | 447 -> NONTERM_rawConstant - | 448 -> NONTERM_rawConstant - | 449 -> NONTERM_rawConstant - | 450 -> NONTERM_rawConstant - | 451 -> NONTERM_rawConstant - | 452 -> NONTERM_rawConstant - | 453 -> NONTERM_rawConstant - | 454 -> NONTERM_rawConstant - | 455 -> NONTERM_rawConstant - | 456 -> NONTERM_rawConstant - | 457 -> NONTERM_rawConstant - | 458 -> NONTERM_rawConstant - | 459 -> NONTERM_rawConstant + | 366 -> NONTERM_attrUnionCaseDecl + | 367 -> NONTERM_attrUnionCaseDecl + | 368 -> NONTERM_attrUnionCaseDecl + | 369 -> NONTERM_attrUnionCaseDecl + | 370 -> NONTERM_attrUnionCaseDecl + | 371 -> NONTERM_attrUnionCaseDecl + | 372 -> NONTERM_attrUnionCaseDecl + | 373 -> NONTERM_attrUnionCaseDecl + | 374 -> NONTERM_unionCaseName + | 375 -> NONTERM_unionCaseName + | 376 -> NONTERM_unionCaseName + | 377 -> NONTERM_firstUnionCaseDeclOfMany + | 378 -> NONTERM_firstUnionCaseDeclOfMany + | 379 -> NONTERM_firstUnionCaseDeclOfMany + | 380 -> NONTERM_firstUnionCaseDeclOfMany + | 381 -> NONTERM_firstUnionCaseDecl + | 382 -> NONTERM_firstUnionCaseDecl + | 383 -> NONTERM_firstUnionCaseDecl + | 384 -> NONTERM_firstUnionCaseDecl + | 385 -> NONTERM_firstUnionCaseDecl + | 386 -> NONTERM_firstUnionCaseDecl + | 387 -> NONTERM_unionCaseReprElements + | 388 -> NONTERM_unionCaseReprElements + | 389 -> NONTERM_unionCaseReprElements + | 390 -> NONTERM_unionCaseReprElements + | 391 -> NONTERM_unionCaseReprElement + | 392 -> NONTERM_unionCaseReprElement + | 393 -> NONTERM_unionCaseReprElement + | 394 -> NONTERM_unionCaseReprElement + | 395 -> NONTERM_unionCaseReprElement + | 396 -> NONTERM_unionCaseRepr + | 397 -> NONTERM_unionCaseRepr + | 398 -> NONTERM_recdFieldDeclList + | 399 -> NONTERM_recdFieldDeclList + | 400 -> NONTERM_recdFieldDecl + | 401 -> NONTERM_fieldDecl + | 402 -> NONTERM_fieldDecl + | 403 -> NONTERM_fieldDecl + | 404 -> NONTERM_fieldDecl + | 405 -> NONTERM_exconDefn + | 406 -> NONTERM_exconCore + | 407 -> NONTERM_exconCore + | 408 -> NONTERM_exconIntro + | 409 -> NONTERM_exconIntro + | 410 -> NONTERM_exconIntro + | 411 -> NONTERM_exconRepr + | 412 -> NONTERM_exconRepr + | 413 -> NONTERM_defnBindings + | 414 -> NONTERM_defnBindings + | 415 -> NONTERM_doBinding + | 416 -> NONTERM_hardwhiteLetBindings + | 417 -> NONTERM_hardwhiteDoBinding + | 418 -> NONTERM_hardwhiteDoBinding + | 419 -> NONTERM_classDefnBindings + | 420 -> NONTERM_classDefnBindings + | 421 -> NONTERM_classDefnBindings + | 422 -> NONTERM_classDefnBindings + | 423 -> NONTERM_hardwhiteDefnBindingsTerminator + | 424 -> NONTERM_hardwhiteDefnBindingsTerminator + | 425 -> NONTERM_cPrototype + | 426 -> NONTERM_externArgs + | 427 -> NONTERM_externArgs + | 428 -> NONTERM_externArgs + | 429 -> NONTERM_externMoreArgs + | 430 -> NONTERM_externMoreArgs + | 431 -> NONTERM_externArg + | 432 -> NONTERM_externArg + | 433 -> NONTERM_cType + | 434 -> NONTERM_cType + | 435 -> NONTERM_cType + | 436 -> NONTERM_cType + | 437 -> NONTERM_cType + | 438 -> NONTERM_cType + | 439 -> NONTERM_cRetType + | 440 -> NONTERM_cRetType + | 441 -> NONTERM_localBindings + | 442 -> NONTERM_moreLocalBindings + | 443 -> NONTERM_moreLocalBindings + | 444 -> NONTERM_attr_localBinding + | 445 -> NONTERM_attr_localBinding + | 446 -> NONTERM_localBinding + | 447 -> NONTERM_localBinding + | 448 -> NONTERM_localBinding + | 449 -> NONTERM_typedExprWithStaticOptimizationsBlock + | 450 -> NONTERM_typedExprWithStaticOptimizationsBlock + | 451 -> NONTERM_typedExprWithStaticOptimizationsBlock + | 452 -> NONTERM_typedExprWithStaticOptimizations + | 453 -> NONTERM_opt_staticOptimizations + | 454 -> NONTERM_opt_staticOptimizations + | 455 -> NONTERM_staticOptimization + | 456 -> NONTERM_staticOptimizationConditions + | 457 -> NONTERM_staticOptimizationConditions + | 458 -> NONTERM_staticOptimizationCondition + | 459 -> NONTERM_staticOptimizationCondition | 460 -> NONTERM_rawConstant | 461 -> NONTERM_rawConstant | 462 -> NONTERM_rawConstant - | 463 -> NONTERM_rationalConstant - | 464 -> NONTERM_rationalConstant - | 465 -> NONTERM_rationalConstant - | 466 -> NONTERM_rationalConstant - | 467 -> NONTERM_atomicUnsignedRationalConstant - | 468 -> NONTERM_atomicUnsignedRationalConstant - | 469 -> NONTERM_atomicRationalConstant - | 470 -> NONTERM_atomicRationalConstant - | 471 -> NONTERM_constant - | 472 -> NONTERM_constant - | 473 -> NONTERM_bindingPattern - | 474 -> NONTERM_simplePattern - | 475 -> NONTERM_simplePattern - | 476 -> NONTERM_simplePattern - | 477 -> NONTERM_simplePattern - | 478 -> NONTERM_simplePattern - | 479 -> NONTERM_simplePatternCommaList - | 480 -> NONTERM_simplePatternCommaList - | 481 -> NONTERM_opt_simplePatterns - | 482 -> NONTERM_opt_simplePatterns - | 483 -> NONTERM_simplePatterns - | 484 -> NONTERM_simplePatterns - | 485 -> NONTERM_simplePatterns - | 486 -> NONTERM_simplePatterns - | 487 -> NONTERM_simplePatterns - | 488 -> NONTERM_headBindingPattern - | 489 -> NONTERM_headBindingPattern - | 490 -> NONTERM_headBindingPattern - | 491 -> NONTERM_headBindingPattern - | 492 -> NONTERM_headBindingPattern - | 493 -> NONTERM_headBindingPattern - | 494 -> NONTERM_tuplePatternElements - | 495 -> NONTERM_tuplePatternElements - | 496 -> NONTERM_tuplePatternElements - | 497 -> NONTERM_tuplePatternElements - | 498 -> NONTERM_tuplePatternElements - | 499 -> NONTERM_tuplePatternElements - | 500 -> NONTERM_conjPatternElements - | 501 -> NONTERM_conjPatternElements - | 502 -> NONTERM_namePatPairs - | 503 -> NONTERM_namePatPairs - | 504 -> NONTERM_namePatPairs - | 505 -> NONTERM_namePatPair - | 506 -> NONTERM_namePatPair - | 507 -> NONTERM_namePatPair - | 508 -> NONTERM_constrPattern - | 509 -> NONTERM_constrPattern - | 510 -> NONTERM_constrPattern - | 511 -> NONTERM_constrPattern - | 512 -> NONTERM_constrPattern - | 513 -> NONTERM_constrPattern - | 514 -> NONTERM_constrPattern - | 515 -> NONTERM_constrPattern - | 516 -> NONTERM_constrPattern - | 517 -> NONTERM_atomicPatsOrNamePatPairs - | 518 -> NONTERM_atomicPatsOrNamePatPairs - | 519 -> NONTERM_atomicPatterns - | 520 -> NONTERM_atomicPatterns - | 521 -> NONTERM_atomicPatterns - | 522 -> NONTERM_atomicPatterns - | 523 -> NONTERM_atomicPattern - | 524 -> NONTERM_atomicPattern - | 525 -> NONTERM_atomicPattern - | 526 -> NONTERM_atomicPattern - | 527 -> NONTERM_atomicPattern - | 528 -> NONTERM_atomicPattern - | 529 -> NONTERM_atomicPattern - | 530 -> NONTERM_atomicPattern - | 531 -> NONTERM_atomicPattern - | 532 -> NONTERM_atomicPattern - | 533 -> NONTERM_atomicPattern - | 534 -> NONTERM_atomicPattern - | 535 -> NONTERM_atomicPattern + | 463 -> NONTERM_rawConstant + | 464 -> NONTERM_rawConstant + | 465 -> NONTERM_rawConstant + | 466 -> NONTERM_rawConstant + | 467 -> NONTERM_rawConstant + | 468 -> NONTERM_rawConstant + | 469 -> NONTERM_rawConstant + | 470 -> NONTERM_rawConstant + | 471 -> NONTERM_rawConstant + | 472 -> NONTERM_rawConstant + | 473 -> NONTERM_rawConstant + | 474 -> NONTERM_rawConstant + | 475 -> NONTERM_rawConstant + | 476 -> NONTERM_rawConstant + | 477 -> NONTERM_rawConstant + | 478 -> NONTERM_rationalConstant + | 479 -> NONTERM_rationalConstant + | 480 -> NONTERM_rationalConstant + | 481 -> NONTERM_rationalConstant + | 482 -> NONTERM_atomicUnsignedRationalConstant + | 483 -> NONTERM_atomicUnsignedRationalConstant + | 484 -> NONTERM_atomicRationalConstant + | 485 -> NONTERM_atomicRationalConstant + | 486 -> NONTERM_constant + | 487 -> NONTERM_constant + | 488 -> NONTERM_bindingPattern + | 489 -> NONTERM_opt_simplePatterns + | 490 -> NONTERM_opt_simplePatterns + | 491 -> NONTERM_simplePatterns + | 492 -> NONTERM_simplePatterns + | 493 -> NONTERM_barCanBeRightBeforeNull + | 494 -> NONTERM_barCanBeRightBeforeNull + | 495 -> NONTERM_headBindingPattern + | 496 -> NONTERM_headBindingPattern + | 497 -> NONTERM_headBindingPattern + | 498 -> NONTERM_headBindingPattern + | 499 -> NONTERM_headBindingPattern + | 500 -> NONTERM_headBindingPattern + | 501 -> NONTERM_headBindingPattern + | 502 -> NONTERM_headBindingPattern + | 503 -> NONTERM_headBindingPattern + | 504 -> NONTERM_headBindingPattern + | 505 -> NONTERM_tuplePatternElements + | 506 -> NONTERM_tuplePatternElements + | 507 -> NONTERM_tuplePatternElements + | 508 -> NONTERM_tuplePatternElements + | 509 -> NONTERM_tuplePatternElements + | 510 -> NONTERM_tuplePatternElements + | 511 -> NONTERM_conjPatternElements + | 512 -> NONTERM_conjPatternElements + | 513 -> NONTERM_namePatPairs + | 514 -> NONTERM_namePatPairs + | 515 -> NONTERM_namePatPairs + | 516 -> NONTERM_namePatPair + | 517 -> NONTERM_namePatPair + | 518 -> NONTERM_namePatPair + | 519 -> NONTERM_constrPattern + | 520 -> NONTERM_constrPattern + | 521 -> NONTERM_constrPattern + | 522 -> NONTERM_constrPattern + | 523 -> NONTERM_constrPattern + | 524 -> NONTERM_constrPattern + | 525 -> NONTERM_constrPattern + | 526 -> NONTERM_constrPattern + | 527 -> NONTERM_constrPattern + | 528 -> NONTERM_constrPattern + | 529 -> NONTERM_constrPattern + | 530 -> NONTERM_atomicPatsOrNamePatPairs + | 531 -> NONTERM_atomicPatsOrNamePatPairs + | 532 -> NONTERM_atomicPatterns + | 533 -> NONTERM_atomicPatterns + | 534 -> NONTERM_atomicPatterns + | 535 -> NONTERM_atomicPatterns | 536 -> NONTERM_atomicPattern | 537 -> NONTERM_atomicPattern | 538 -> NONTERM_atomicPattern @@ -1747,75 +1754,75 @@ let prodIdxToNonTerminal (prodIdx:int) = | 540 -> NONTERM_atomicPattern | 541 -> NONTERM_atomicPattern | 542 -> NONTERM_atomicPattern - | 543 -> NONTERM_parenPatternBody - | 544 -> NONTERM_parenPatternBody - | 545 -> NONTERM_parenPattern - | 546 -> NONTERM_parenPattern - | 547 -> NONTERM_parenPattern - | 548 -> NONTERM_parenPattern - | 549 -> NONTERM_parenPattern - | 550 -> NONTERM_parenPattern - | 551 -> NONTERM_parenPattern - | 552 -> NONTERM_parenPattern - | 553 -> NONTERM_parenPattern - | 554 -> NONTERM_tupleParenPatternElements - | 555 -> NONTERM_tupleParenPatternElements - | 556 -> NONTERM_tupleParenPatternElements - | 557 -> NONTERM_tupleParenPatternElements - | 558 -> NONTERM_tupleParenPatternElements - | 559 -> NONTERM_tupleParenPatternElements - | 560 -> NONTERM_conjParenPatternElements - | 561 -> NONTERM_conjParenPatternElements - | 562 -> NONTERM_recordPatternElementsAux - | 563 -> NONTERM_recordPatternElementsAux - | 564 -> NONTERM_recordPatternElement - | 565 -> NONTERM_recordPatternElement - | 566 -> NONTERM_recordPatternElement - | 567 -> NONTERM_listPatternElements - | 568 -> NONTERM_listPatternElements - | 569 -> NONTERM_listPatternElements - | 570 -> NONTERM_typedSequentialExprBlock - | 571 -> NONTERM_typedSequentialExprBlock - | 572 -> NONTERM_typedSequentialExprBlock - | 573 -> NONTERM_typedSequentialExprBlock - | 574 -> NONTERM_declExprBlock - | 575 -> NONTERM_declExprBlock - | 576 -> NONTERM_declExprBlock - | 577 -> NONTERM_typedSequentialExprBlockR - | 578 -> NONTERM_typedSequentialExprBlockR - | 579 -> NONTERM_typedSequentialExprBlockR - | 580 -> NONTERM_typedSequentialExpr - | 581 -> NONTERM_typedSequentialExpr - | 582 -> NONTERM_typedSequentialExpr - | 583 -> NONTERM_typedSequentialExprEOF - | 584 -> NONTERM_sequentialExpr - | 585 -> NONTERM_sequentialExpr - | 586 -> NONTERM_sequentialExpr - | 587 -> NONTERM_sequentialExpr - | 588 -> NONTERM_sequentialExpr - | 589 -> NONTERM_sequentialExpr - | 590 -> NONTERM_recover - | 591 -> NONTERM_recover - | 592 -> NONTERM_moreBinders - | 593 -> NONTERM_moreBinders - | 594 -> NONTERM_moreBinders - | 595 -> NONTERM_declExpr - | 596 -> NONTERM_declExpr - | 597 -> NONTERM_declExpr - | 598 -> NONTERM_declExpr - | 599 -> NONTERM_declExpr - | 600 -> NONTERM_declExpr - | 601 -> NONTERM_declExpr - | 602 -> NONTERM_declExpr - | 603 -> NONTERM_declExpr - | 604 -> NONTERM_declExpr - | 605 -> NONTERM_declExpr - | 606 -> NONTERM_declExpr - | 607 -> NONTERM_declExpr - | 608 -> NONTERM_declExpr - | 609 -> NONTERM_declExpr - | 610 -> NONTERM_declExpr - | 611 -> NONTERM_declExpr + | 543 -> NONTERM_atomicPattern + | 544 -> NONTERM_atomicPattern + | 545 -> NONTERM_atomicPattern + | 546 -> NONTERM_atomicPattern + | 547 -> NONTERM_atomicPattern + | 548 -> NONTERM_atomicPattern + | 549 -> NONTERM_atomicPattern + | 550 -> NONTERM_atomicPattern + | 551 -> NONTERM_atomicPattern + | 552 -> NONTERM_atomicPattern + | 553 -> NONTERM_atomicPattern + | 554 -> NONTERM_atomicPattern + | 555 -> NONTERM_atomicPattern + | 556 -> NONTERM_parenPatternBody + | 557 -> NONTERM_parenPatternBody + | 558 -> NONTERM_parenPattern + | 559 -> NONTERM_parenPattern + | 560 -> NONTERM_parenPattern + | 561 -> NONTERM_parenPattern + | 562 -> NONTERM_parenPattern + | 563 -> NONTERM_parenPattern + | 564 -> NONTERM_parenPattern + | 565 -> NONTERM_parenPattern + | 566 -> NONTERM_parenPattern + | 567 -> NONTERM_parenPattern + | 568 -> NONTERM_parenPattern + | 569 -> NONTERM_parenPattern + | 570 -> NONTERM_parenPattern + | 571 -> NONTERM_tupleParenPatternElements + | 572 -> NONTERM_tupleParenPatternElements + | 573 -> NONTERM_tupleParenPatternElements + | 574 -> NONTERM_tupleParenPatternElements + | 575 -> NONTERM_tupleParenPatternElements + | 576 -> NONTERM_tupleParenPatternElements + | 577 -> NONTERM_conjParenPatternElements + | 578 -> NONTERM_conjParenPatternElements + | 579 -> NONTERM_recordPatternElementsAux + | 580 -> NONTERM_recordPatternElementsAux + | 581 -> NONTERM_recordPatternElement + | 582 -> NONTERM_recordPatternElement + | 583 -> NONTERM_recordPatternElement + | 584 -> NONTERM_listPatternElements + | 585 -> NONTERM_listPatternElements + | 586 -> NONTERM_listPatternElements + | 587 -> NONTERM_typedSequentialExprBlock + | 588 -> NONTERM_typedSequentialExprBlock + | 589 -> NONTERM_typedSequentialExprBlock + | 590 -> NONTERM_typedSequentialExprBlock + | 591 -> NONTERM_declExprBlock + | 592 -> NONTERM_declExprBlock + | 593 -> NONTERM_declExprBlock + | 594 -> NONTERM_typedSequentialExprBlockR + | 595 -> NONTERM_typedSequentialExprBlockR + | 596 -> NONTERM_typedSequentialExprBlockR + | 597 -> NONTERM_typedSequentialExpr + | 598 -> NONTERM_typedSequentialExpr + | 599 -> NONTERM_typedSequentialExpr + | 600 -> NONTERM_typedSequentialExprEOF + | 601 -> NONTERM_sequentialExpr + | 602 -> NONTERM_sequentialExpr + | 603 -> NONTERM_sequentialExpr + | 604 -> NONTERM_sequentialExpr + | 605 -> NONTERM_sequentialExpr + | 606 -> NONTERM_sequentialExpr + | 607 -> NONTERM_recover + | 608 -> NONTERM_recover + | 609 -> NONTERM_moreBinders + | 610 -> NONTERM_moreBinders + | 611 -> NONTERM_moreBinders | 612 -> NONTERM_declExpr | 613 -> NONTERM_declExpr | 614 -> NONTERM_declExpr @@ -1908,318 +1915,318 @@ let prodIdxToNonTerminal (prodIdx:int) = | 701 -> NONTERM_declExpr | 702 -> NONTERM_declExpr | 703 -> NONTERM_declExpr - | 704 -> NONTERM_whileExprCore - | 705 -> NONTERM_whileExprCore - | 706 -> NONTERM_whileExprCore - | 707 -> NONTERM_whileExprCore - | 708 -> NONTERM_whileExprCore - | 709 -> NONTERM_whileExprCore - | 710 -> NONTERM_dynamicArg - | 711 -> NONTERM_dynamicArg - | 712 -> NONTERM_withClauses - | 713 -> NONTERM_withClauses - | 714 -> NONTERM_withClauses - | 715 -> NONTERM_withClauses - | 716 -> NONTERM_withPatternClauses - | 717 -> NONTERM_withPatternClauses - | 718 -> NONTERM_withPatternClauses - | 719 -> NONTERM_withPatternClauses - | 720 -> NONTERM_patternAndGuard - | 721 -> NONTERM_patternClauses - | 722 -> NONTERM_patternClauses - | 723 -> NONTERM_patternClauses - | 724 -> NONTERM_patternClauses - | 725 -> NONTERM_patternClauses - | 726 -> NONTERM_patternClauses - | 727 -> NONTERM_patternGuard - | 728 -> NONTERM_patternGuard - | 729 -> NONTERM_patternResult - | 730 -> NONTERM_ifExprCases - | 731 -> NONTERM_ifExprThen - | 732 -> NONTERM_ifExprThen - | 733 -> NONTERM_ifExprThen - | 734 -> NONTERM_ifExprThen - | 735 -> NONTERM_ifExprElifs - | 736 -> NONTERM_ifExprElifs - | 737 -> NONTERM_ifExprElifs - | 738 -> NONTERM_ifExprElifs - | 739 -> NONTERM_ifExprElifs - | 740 -> NONTERM_tupleExpr - | 741 -> NONTERM_tupleExpr - | 742 -> NONTERM_tupleExpr - | 743 -> NONTERM_tupleExpr - | 744 -> NONTERM_tupleExpr - | 745 -> NONTERM_tupleExpr - | 746 -> NONTERM_tupleExpr - | 747 -> NONTERM_tupleExpr - | 748 -> NONTERM_minusExpr - | 749 -> NONTERM_minusExpr - | 750 -> NONTERM_minusExpr - | 751 -> NONTERM_minusExpr - | 752 -> NONTERM_minusExpr - | 753 -> NONTERM_minusExpr - | 754 -> NONTERM_minusExpr - | 755 -> NONTERM_minusExpr - | 756 -> NONTERM_minusExpr - | 757 -> NONTERM_minusExpr - | 758 -> NONTERM_minusExpr - | 759 -> NONTERM_minusExpr - | 760 -> NONTERM_minusExpr - | 761 -> NONTERM_minusExpr - | 762 -> NONTERM_appExpr - | 763 -> NONTERM_appExpr - | 764 -> NONTERM_argExpr - | 765 -> NONTERM_argExpr - | 766 -> NONTERM_atomicExpr - | 767 -> NONTERM_atomicExpr - | 768 -> NONTERM_atomicExpr - | 769 -> NONTERM_atomicExpr - | 770 -> NONTERM_atomicExpr - | 771 -> NONTERM_atomicExpr - | 772 -> NONTERM_atomicExpr - | 773 -> NONTERM_atomicExpr - | 774 -> NONTERM_atomicExpr - | 775 -> NONTERM_atomicExpr - | 776 -> NONTERM_atomicExpr - | 777 -> NONTERM_atomicExpr - | 778 -> NONTERM_atomicExpr - | 779 -> NONTERM_atomicExpr - | 780 -> NONTERM_atomicExpr - | 781 -> NONTERM_atomicExpr - | 782 -> NONTERM_atomicExpr - | 783 -> NONTERM_atomicExpr - | 784 -> NONTERM_atomicExpr + | 704 -> NONTERM_declExpr + | 705 -> NONTERM_declExpr + | 706 -> NONTERM_declExpr + | 707 -> NONTERM_declExpr + | 708 -> NONTERM_declExpr + | 709 -> NONTERM_declExpr + | 710 -> NONTERM_declExpr + | 711 -> NONTERM_declExpr + | 712 -> NONTERM_declExpr + | 713 -> NONTERM_declExpr + | 714 -> NONTERM_declExpr + | 715 -> NONTERM_declExpr + | 716 -> NONTERM_declExpr + | 717 -> NONTERM_declExpr + | 718 -> NONTERM_declExpr + | 719 -> NONTERM_declExpr + | 720 -> NONTERM_declExpr + | 721 -> NONTERM_whileExprCore + | 722 -> NONTERM_whileExprCore + | 723 -> NONTERM_whileExprCore + | 724 -> NONTERM_whileExprCore + | 725 -> NONTERM_whileExprCore + | 726 -> NONTERM_whileExprCore + | 727 -> NONTERM_dynamicArg + | 728 -> NONTERM_dynamicArg + | 729 -> NONTERM_withClauses + | 730 -> NONTERM_withClauses + | 731 -> NONTERM_withClauses + | 732 -> NONTERM_withClauses + | 733 -> NONTERM_withPatternClauses + | 734 -> NONTERM_withPatternClauses + | 735 -> NONTERM_withPatternClauses + | 736 -> NONTERM_withPatternClauses + | 737 -> NONTERM_withPatternClauses + | 738 -> NONTERM_patternAndGuard + | 739 -> NONTERM_patternClauses + | 740 -> NONTERM_patternClauses + | 741 -> NONTERM_patternClauses + | 742 -> NONTERM_patternClauses + | 743 -> NONTERM_patternClauses + | 744 -> NONTERM_patternClauses + | 745 -> NONTERM_patternClauses + | 746 -> NONTERM_patternGuard + | 747 -> NONTERM_patternGuard + | 748 -> NONTERM_patternResult + | 749 -> NONTERM_ifExprCases + | 750 -> NONTERM_ifExprThen + | 751 -> NONTERM_ifExprThen + | 752 -> NONTERM_ifExprThen + | 753 -> NONTERM_ifExprThen + | 754 -> NONTERM_ifExprElifs + | 755 -> NONTERM_ifExprElifs + | 756 -> NONTERM_ifExprElifs + | 757 -> NONTERM_ifExprElifs + | 758 -> NONTERM_ifExprElifs + | 759 -> NONTERM_tupleExpr + | 760 -> NONTERM_tupleExpr + | 761 -> NONTERM_tupleExpr + | 762 -> NONTERM_tupleExpr + | 763 -> NONTERM_tupleExpr + | 764 -> NONTERM_tupleExpr + | 765 -> NONTERM_tupleExpr + | 766 -> NONTERM_tupleExpr + | 767 -> NONTERM_minusExpr + | 768 -> NONTERM_minusExpr + | 769 -> NONTERM_minusExpr + | 770 -> NONTERM_minusExpr + | 771 -> NONTERM_minusExpr + | 772 -> NONTERM_minusExpr + | 773 -> NONTERM_minusExpr + | 774 -> NONTERM_minusExpr + | 775 -> NONTERM_minusExpr + | 776 -> NONTERM_minusExpr + | 777 -> NONTERM_minusExpr + | 778 -> NONTERM_minusExpr + | 779 -> NONTERM_minusExpr + | 780 -> NONTERM_minusExpr + | 781 -> NONTERM_appExpr + | 782 -> NONTERM_appExpr + | 783 -> NONTERM_argExpr + | 784 -> NONTERM_argExpr | 785 -> NONTERM_atomicExpr | 786 -> NONTERM_atomicExpr | 787 -> NONTERM_atomicExpr - | 788 -> NONTERM_atomicExprQualification - | 789 -> NONTERM_atomicExprQualification - | 790 -> NONTERM_atomicExprQualification - | 791 -> NONTERM_atomicExprQualification - | 792 -> NONTERM_atomicExprQualification - | 793 -> NONTERM_atomicExprQualification - | 794 -> NONTERM_atomicExprQualification - | 795 -> NONTERM_atomicExprQualification - | 796 -> NONTERM_atomicExprQualification - | 797 -> NONTERM_atomicExprQualification - | 798 -> NONTERM_atomicExprAfterType - | 799 -> NONTERM_atomicExprAfterType - | 800 -> NONTERM_atomicExprAfterType - | 801 -> NONTERM_atomicExprAfterType - | 802 -> NONTERM_atomicExprAfterType - | 803 -> NONTERM_atomicExprAfterType - | 804 -> NONTERM_atomicExprAfterType - | 805 -> NONTERM_atomicExprAfterType - | 806 -> NONTERM_atomicExprAfterType - | 807 -> NONTERM_atomicExprAfterType - | 808 -> NONTERM_atomicExprAfterType - | 809 -> NONTERM_beginEndExpr - | 810 -> NONTERM_beginEndExpr - | 811 -> NONTERM_beginEndExpr - | 812 -> NONTERM_beginEndExpr - | 813 -> NONTERM_quoteExpr - | 814 -> NONTERM_quoteExpr - | 815 -> NONTERM_quoteExpr - | 816 -> NONTERM_quoteExpr - | 817 -> NONTERM_arrayExpr - | 818 -> NONTERM_arrayExpr - | 819 -> NONTERM_arrayExpr - | 820 -> NONTERM_arrayExpr - | 821 -> NONTERM_parenExpr - | 822 -> NONTERM_parenExpr - | 823 -> NONTERM_parenExpr - | 824 -> NONTERM_parenExpr - | 825 -> NONTERM_parenExpr - | 826 -> NONTERM_parenExpr - | 827 -> NONTERM_parenExpr - | 828 -> NONTERM_parenExpr - | 829 -> NONTERM_parenExpr - | 830 -> NONTERM_parenExpr - | 831 -> NONTERM_parenExprBody - | 832 -> NONTERM_parenExprBody - | 833 -> NONTERM_parenExprBody - | 834 -> NONTERM_typars - | 835 -> NONTERM_typars - | 836 -> NONTERM_typarAlts - | 837 -> NONTERM_typarAlts - | 838 -> NONTERM_braceExpr - | 839 -> NONTERM_braceExpr - | 840 -> NONTERM_braceExpr - | 841 -> NONTERM_braceExpr - | 842 -> NONTERM_braceExpr - | 843 -> NONTERM_braceExprBody - | 844 -> NONTERM_braceExprBody - | 845 -> NONTERM_braceExprBody - | 846 -> NONTERM_listExprElements - | 847 -> NONTERM_listExprElements - | 848 -> NONTERM_arrayExprElements - | 849 -> NONTERM_arrayExprElements - | 850 -> NONTERM_computationExpr - | 851 -> NONTERM_arrowThenExprR - | 852 -> NONTERM_forLoopBinder - | 853 -> NONTERM_forLoopBinder - | 854 -> NONTERM_forLoopBinder - | 855 -> NONTERM_forLoopRange - | 856 -> NONTERM_forLoopDirection - | 857 -> NONTERM_forLoopDirection - | 858 -> NONTERM_inlineAssemblyExpr - | 859 -> NONTERM_optCurriedArgExprs - | 860 -> NONTERM_optCurriedArgExprs - | 861 -> NONTERM_opt_atomicExprAfterType - | 862 -> NONTERM_opt_atomicExprAfterType - | 863 -> NONTERM_opt_inlineAssemblyTypeArg - | 864 -> NONTERM_opt_inlineAssemblyTypeArg - | 865 -> NONTERM_optInlineAssemblyReturnTypes - | 866 -> NONTERM_optInlineAssemblyReturnTypes - | 867 -> NONTERM_optInlineAssemblyReturnTypes - | 868 -> NONTERM_recdExpr - | 869 -> NONTERM_recdExpr - | 870 -> NONTERM_recdExprCore - | 871 -> NONTERM_recdExprCore - | 872 -> NONTERM_recdExprCore - | 873 -> NONTERM_recdExprCore - | 874 -> NONTERM_recdExprCore - | 875 -> NONTERM_recdExprCore - | 876 -> NONTERM_recdExprCore - | 877 -> NONTERM_recdExprCore - | 878 -> NONTERM_recdExprCore - | 879 -> NONTERM_opt_seps_recd - | 880 -> NONTERM_opt_seps_recd - | 881 -> NONTERM_seps_recd - | 882 -> NONTERM_seps_recd - | 883 -> NONTERM_seps_recd - | 884 -> NONTERM_seps_recd - | 885 -> NONTERM_pathOrUnderscore - | 886 -> NONTERM_pathOrUnderscore - | 887 -> NONTERM_recdExprBindings - | 888 -> NONTERM_recdExprBindings - | 889 -> NONTERM_recdBinding - | 890 -> NONTERM_recdBinding - | 891 -> NONTERM_recdBinding - | 892 -> NONTERM_recdBinding - | 893 -> NONTERM_recdBinding - | 894 -> NONTERM_objExpr - | 895 -> NONTERM_objExpr - | 896 -> NONTERM_objExpr - | 897 -> NONTERM_objExprBaseCall - | 898 -> NONTERM_objExprBaseCall - | 899 -> NONTERM_objExprBaseCall - | 900 -> NONTERM_opt_objExprBindings - | 901 -> NONTERM_opt_objExprBindings - | 902 -> NONTERM_objExprBindings - | 903 -> NONTERM_objExprBindings - | 904 -> NONTERM_objExprBindings - | 905 -> NONTERM_objExprInterfaces - | 906 -> NONTERM_opt_objExprInterfaces - | 907 -> NONTERM_opt_objExprInterfaces - | 908 -> NONTERM_opt_objExprInterfaces - | 909 -> NONTERM_objExprInterface - | 910 -> NONTERM_braceBarExpr - | 911 -> NONTERM_braceBarExpr - | 912 -> NONTERM_braceBarExprCore - | 913 -> NONTERM_braceBarExprCore - | 914 -> NONTERM_braceBarExprCore - | 915 -> NONTERM_braceBarExprCore - | 916 -> NONTERM_braceBarExprCore - | 917 -> NONTERM_anonLambdaExpr - | 918 -> NONTERM_anonLambdaExpr - | 919 -> NONTERM_anonLambdaExpr - | 920 -> NONTERM_anonLambdaExpr - | 921 -> NONTERM_anonLambdaExpr - | 922 -> NONTERM_anonLambdaExpr - | 923 -> NONTERM_anonLambdaExpr - | 924 -> NONTERM_anonLambdaExpr - | 925 -> NONTERM_anonMatchingExpr - | 926 -> NONTERM_anonMatchingExpr - | 927 -> NONTERM_typeWithTypeConstraints - | 928 -> NONTERM_typeWithTypeConstraints - | 929 -> NONTERM_topTypeWithTypeConstraints - | 930 -> NONTERM_topTypeWithTypeConstraints - | 931 -> NONTERM_opt_topReturnTypeWithTypeConstraints - | 932 -> NONTERM_opt_topReturnTypeWithTypeConstraints - | 933 -> NONTERM_opt_topReturnTypeWithTypeConstraints - | 934 -> NONTERM_topType - | 935 -> NONTERM_topType - | 936 -> NONTERM_topType - | 937 -> NONTERM_topTupleType - | 938 -> NONTERM_topTupleType - | 939 -> NONTERM_topTupleType - | 940 -> NONTERM_topTupleType - | 941 -> NONTERM_topTupleTypeElements - | 942 -> NONTERM_topTupleTypeElements - | 943 -> NONTERM_topTupleTypeElements - | 944 -> NONTERM_topTupleTypeElements - | 945 -> NONTERM_topAppType - | 946 -> NONTERM_topAppType - | 947 -> NONTERM_topAppType - | 948 -> NONTERM_topAppType - | 949 -> NONTERM_topAppType - | 950 -> NONTERM_topAppType - | 951 -> NONTERM_topAppType - | 952 -> NONTERM_topAppType - | 953 -> NONTERM_topAppType - | 954 -> NONTERM_topAppType - | 955 -> NONTERM_invalidUseOfAppTypeFunction - | 956 -> NONTERM_invalidUseOfAppTypeFunction - | 957 -> NONTERM_invalidUseOfAppTypeFunction - | 958 -> NONTERM_invalidUseOfAppTypeFunction - | 959 -> NONTERM_typ - | 960 -> NONTERM_typ - | 961 -> NONTERM_typ - | 962 -> NONTERM_typ - | 963 -> NONTERM_typEOF - | 964 -> NONTERM_tupleType - | 965 -> NONTERM_tupleType - | 966 -> NONTERM_tupleType - | 967 -> NONTERM_tupleType - | 968 -> NONTERM_tupleType - | 969 -> NONTERM_tupleType - | 970 -> NONTERM_tupleType - | 971 -> NONTERM_tupleType - | 972 -> NONTERM_tupleOrQuotTypeElements - | 973 -> NONTERM_tupleOrQuotTypeElements - | 974 -> NONTERM_tupleOrQuotTypeElements - | 975 -> NONTERM_tupleOrQuotTypeElements - | 976 -> NONTERM_tupleOrQuotTypeElements - | 977 -> NONTERM_tupleOrQuotTypeElements - | 978 -> NONTERM_tupleOrQuotTypeElements - | 979 -> NONTERM_intersectionType - | 980 -> NONTERM_intersectionType - | 981 -> NONTERM_appTypeCon - | 982 -> NONTERM_appTypeCon - | 983 -> NONTERM_appTypeConPower - | 984 -> NONTERM_appTypeConPower - | 985 -> NONTERM_appType - | 986 -> NONTERM_appType - | 987 -> NONTERM_appType - | 988 -> NONTERM_appType - | 989 -> NONTERM_appType - | 990 -> NONTERM_appType - | 991 -> NONTERM_appType - | 992 -> NONTERM_appType - | 993 -> NONTERM_arrayTypeSuffix - | 994 -> NONTERM_arrayTypeSuffix - | 995 -> NONTERM_arrayTypeSuffix - | 996 -> NONTERM_arrayTypeSuffix - | 997 -> NONTERM_arrayTypeSuffix - | 998 -> NONTERM_arrayTypeSuffix - | 999 -> NONTERM_arrayTypeSuffix - | 1000 -> NONTERM_arrayTypeSuffix - | 1001 -> NONTERM_arrayTypeSuffix - | 1002 -> NONTERM_arrayTypeSuffix - | 1003 -> NONTERM_arrayTypeSuffix - | 1004 -> NONTERM_arrayTypeSuffix - | 1005 -> NONTERM_arrayTypeSuffix - | 1006 -> NONTERM_arrayTypeSuffix - | 1007 -> NONTERM_arrayTypeSuffix - | 1008 -> NONTERM_arrayTypeSuffix - | 1009 -> NONTERM_arrayTypeSuffix - | 1010 -> NONTERM_arrayTypeSuffix - | 1011 -> NONTERM_arrayTypeSuffix - | 1012 -> NONTERM_arrayTypeSuffix - | 1013 -> NONTERM_arrayTypeSuffix - | 1014 -> NONTERM_arrayTypeSuffix - | 1015 -> NONTERM_arrayTypeSuffix + | 788 -> NONTERM_atomicExpr + | 789 -> NONTERM_atomicExpr + | 790 -> NONTERM_atomicExpr + | 791 -> NONTERM_atomicExpr + | 792 -> NONTERM_atomicExpr + | 793 -> NONTERM_atomicExpr + | 794 -> NONTERM_atomicExpr + | 795 -> NONTERM_atomicExpr + | 796 -> NONTERM_atomicExpr + | 797 -> NONTERM_atomicExpr + | 798 -> NONTERM_atomicExpr + | 799 -> NONTERM_atomicExpr + | 800 -> NONTERM_atomicExpr + | 801 -> NONTERM_atomicExpr + | 802 -> NONTERM_atomicExpr + | 803 -> NONTERM_atomicExpr + | 804 -> NONTERM_atomicExpr + | 805 -> NONTERM_atomicExpr + | 806 -> NONTERM_atomicExpr + | 807 -> NONTERM_atomicExprQualification + | 808 -> NONTERM_atomicExprQualification + | 809 -> NONTERM_atomicExprQualification + | 810 -> NONTERM_atomicExprQualification + | 811 -> NONTERM_atomicExprQualification + | 812 -> NONTERM_atomicExprQualification + | 813 -> NONTERM_atomicExprQualification + | 814 -> NONTERM_atomicExprQualification + | 815 -> NONTERM_atomicExprQualification + | 816 -> NONTERM_atomicExprQualification + | 817 -> NONTERM_atomicExprAfterType + | 818 -> NONTERM_atomicExprAfterType + | 819 -> NONTERM_atomicExprAfterType + | 820 -> NONTERM_atomicExprAfterType + | 821 -> NONTERM_atomicExprAfterType + | 822 -> NONTERM_atomicExprAfterType + | 823 -> NONTERM_atomicExprAfterType + | 824 -> NONTERM_atomicExprAfterType + | 825 -> NONTERM_atomicExprAfterType + | 826 -> NONTERM_atomicExprAfterType + | 827 -> NONTERM_atomicExprAfterType + | 828 -> NONTERM_beginEndExpr + | 829 -> NONTERM_beginEndExpr + | 830 -> NONTERM_beginEndExpr + | 831 -> NONTERM_beginEndExpr + | 832 -> NONTERM_quoteExpr + | 833 -> NONTERM_quoteExpr + | 834 -> NONTERM_quoteExpr + | 835 -> NONTERM_quoteExpr + | 836 -> NONTERM_arrayExpr + | 837 -> NONTERM_arrayExpr + | 838 -> NONTERM_arrayExpr + | 839 -> NONTERM_arrayExpr + | 840 -> NONTERM_parenExpr + | 841 -> NONTERM_parenExpr + | 842 -> NONTERM_parenExpr + | 843 -> NONTERM_parenExpr + | 844 -> NONTERM_parenExpr + | 845 -> NONTERM_parenExpr + | 846 -> NONTERM_parenExpr + | 847 -> NONTERM_parenExpr + | 848 -> NONTERM_parenExpr + | 849 -> NONTERM_parenExpr + | 850 -> NONTERM_parenExprBody + | 851 -> NONTERM_parenExprBody + | 852 -> NONTERM_parenExprBody + | 853 -> NONTERM_typars + | 854 -> NONTERM_typars + | 855 -> NONTERM_typarAlts + | 856 -> NONTERM_typarAlts + | 857 -> NONTERM_braceExpr + | 858 -> NONTERM_braceExpr + | 859 -> NONTERM_braceExpr + | 860 -> NONTERM_braceExpr + | 861 -> NONTERM_braceExpr + | 862 -> NONTERM_braceExprBody + | 863 -> NONTERM_braceExprBody + | 864 -> NONTERM_braceExprBody + | 865 -> NONTERM_listExprElements + | 866 -> NONTERM_listExprElements + | 867 -> NONTERM_arrayExprElements + | 868 -> NONTERM_arrayExprElements + | 869 -> NONTERM_computationExpr + | 870 -> NONTERM_arrowThenExprR + | 871 -> NONTERM_forLoopBinder + | 872 -> NONTERM_forLoopBinder + | 873 -> NONTERM_forLoopBinder + | 874 -> NONTERM_forLoopRange + | 875 -> NONTERM_forLoopDirection + | 876 -> NONTERM_forLoopDirection + | 877 -> NONTERM_inlineAssemblyExpr + | 878 -> NONTERM_optCurriedArgExprs + | 879 -> NONTERM_optCurriedArgExprs + | 880 -> NONTERM_opt_atomicExprAfterType + | 881 -> NONTERM_opt_atomicExprAfterType + | 882 -> NONTERM_opt_inlineAssemblyTypeArg + | 883 -> NONTERM_opt_inlineAssemblyTypeArg + | 884 -> NONTERM_optInlineAssemblyReturnTypes + | 885 -> NONTERM_optInlineAssemblyReturnTypes + | 886 -> NONTERM_optInlineAssemblyReturnTypes + | 887 -> NONTERM_recdExpr + | 888 -> NONTERM_recdExpr + | 889 -> NONTERM_recdExprCore + | 890 -> NONTERM_recdExprCore + | 891 -> NONTERM_recdExprCore + | 892 -> NONTERM_recdExprCore + | 893 -> NONTERM_recdExprCore + | 894 -> NONTERM_recdExprCore + | 895 -> NONTERM_recdExprCore + | 896 -> NONTERM_recdExprCore + | 897 -> NONTERM_recdExprCore + | 898 -> NONTERM_opt_seps_recd + | 899 -> NONTERM_opt_seps_recd + | 900 -> NONTERM_seps_recd + | 901 -> NONTERM_seps_recd + | 902 -> NONTERM_seps_recd + | 903 -> NONTERM_seps_recd + | 904 -> NONTERM_pathOrUnderscore + | 905 -> NONTERM_pathOrUnderscore + | 906 -> NONTERM_recdExprBindings + | 907 -> NONTERM_recdExprBindings + | 908 -> NONTERM_recdBinding + | 909 -> NONTERM_recdBinding + | 910 -> NONTERM_recdBinding + | 911 -> NONTERM_recdBinding + | 912 -> NONTERM_recdBinding + | 913 -> NONTERM_objExpr + | 914 -> NONTERM_objExpr + | 915 -> NONTERM_objExpr + | 916 -> NONTERM_objExprBaseCall + | 917 -> NONTERM_objExprBaseCall + | 918 -> NONTERM_objExprBaseCall + | 919 -> NONTERM_opt_objExprBindings + | 920 -> NONTERM_opt_objExprBindings + | 921 -> NONTERM_objExprBindings + | 922 -> NONTERM_objExprBindings + | 923 -> NONTERM_objExprBindings + | 924 -> NONTERM_objExprInterfaces + | 925 -> NONTERM_opt_objExprInterfaces + | 926 -> NONTERM_opt_objExprInterfaces + | 927 -> NONTERM_opt_objExprInterfaces + | 928 -> NONTERM_objExprInterface + | 929 -> NONTERM_braceBarExpr + | 930 -> NONTERM_braceBarExpr + | 931 -> NONTERM_braceBarExprCore + | 932 -> NONTERM_braceBarExprCore + | 933 -> NONTERM_braceBarExprCore + | 934 -> NONTERM_braceBarExprCore + | 935 -> NONTERM_braceBarExprCore + | 936 -> NONTERM_anonLambdaExpr + | 937 -> NONTERM_anonLambdaExpr + | 938 -> NONTERM_anonLambdaExpr + | 939 -> NONTERM_anonLambdaExpr + | 940 -> NONTERM_anonLambdaExpr + | 941 -> NONTERM_anonLambdaExpr + | 942 -> NONTERM_anonLambdaExpr + | 943 -> NONTERM_anonLambdaExpr + | 944 -> NONTERM_anonMatchingExpr + | 945 -> NONTERM_anonMatchingExpr + | 946 -> NONTERM_typeWithTypeConstraints + | 947 -> NONTERM_typeWithTypeConstraints + | 948 -> NONTERM_topTypeWithTypeConstraints + | 949 -> NONTERM_topTypeWithTypeConstraints + | 950 -> NONTERM_opt_topReturnTypeWithTypeConstraints + | 951 -> NONTERM_opt_topReturnTypeWithTypeConstraints + | 952 -> NONTERM_opt_topReturnTypeWithTypeConstraints + | 953 -> NONTERM_topType + | 954 -> NONTERM_topType + | 955 -> NONTERM_topType + | 956 -> NONTERM_topTupleType + | 957 -> NONTERM_topTupleType + | 958 -> NONTERM_topTupleType + | 959 -> NONTERM_topTupleType + | 960 -> NONTERM_topTupleTypeElements + | 961 -> NONTERM_topTupleTypeElements + | 962 -> NONTERM_topTupleTypeElements + | 963 -> NONTERM_topTupleTypeElements + | 964 -> NONTERM_topAppType + | 965 -> NONTERM_topAppType + | 966 -> NONTERM_topAppType + | 967 -> NONTERM_topAppType + | 968 -> NONTERM_topAppType + | 969 -> NONTERM_topAppType + | 970 -> NONTERM_topAppType + | 971 -> NONTERM_topAppType + | 972 -> NONTERM_topAppType + | 973 -> NONTERM_topAppType + | 974 -> NONTERM_invalidUseOfAppTypeFunction + | 975 -> NONTERM_invalidUseOfAppTypeFunction + | 976 -> NONTERM_invalidUseOfAppTypeFunction + | 977 -> NONTERM_invalidUseOfAppTypeFunction + | 978 -> NONTERM_typ + | 979 -> NONTERM_typ + | 980 -> NONTERM_typ + | 981 -> NONTERM_typ + | 982 -> NONTERM_typEOF + | 983 -> NONTERM_tupleType + | 984 -> NONTERM_tupleType + | 985 -> NONTERM_tupleType + | 986 -> NONTERM_tupleType + | 987 -> NONTERM_tupleType + | 988 -> NONTERM_tupleType + | 989 -> NONTERM_tupleType + | 990 -> NONTERM_tupleType + | 991 -> NONTERM_tupleOrQuotTypeElements + | 992 -> NONTERM_tupleOrQuotTypeElements + | 993 -> NONTERM_tupleOrQuotTypeElements + | 994 -> NONTERM_tupleOrQuotTypeElements + | 995 -> NONTERM_tupleOrQuotTypeElements + | 996 -> NONTERM_tupleOrQuotTypeElements + | 997 -> NONTERM_tupleOrQuotTypeElements + | 998 -> NONTERM_intersectionType + | 999 -> NONTERM_intersectionType + | 1000 -> NONTERM_appTypeCon + | 1001 -> NONTERM_appTypeCon + | 1002 -> NONTERM_appTypeConPower + | 1003 -> NONTERM_appTypeConPower + | 1004 -> NONTERM_appTypeCanBeNullable + | 1005 -> NONTERM_appTypeCanBeNullable + | 1006 -> NONTERM_appTypeNullableInParens + | 1007 -> NONTERM_appTypeNullableInParens + | 1008 -> NONTERM_appTypeWithoutNull + | 1009 -> NONTERM_appTypeWithoutNull + | 1010 -> NONTERM_appTypeWithoutNull + | 1011 -> NONTERM_appTypeWithoutNull + | 1012 -> NONTERM_appTypeWithoutNull + | 1013 -> NONTERM_appTypeWithoutNull + | 1014 -> NONTERM_appTypeWithoutNull + | 1015 -> NONTERM_appTypeWithoutNull | 1016 -> NONTERM_arrayTypeSuffix | 1017 -> NONTERM_arrayTypeSuffix | 1018 -> NONTERM_arrayTypeSuffix @@ -2229,207 +2236,226 @@ let prodIdxToNonTerminal (prodIdx:int) = | 1022 -> NONTERM_arrayTypeSuffix | 1023 -> NONTERM_arrayTypeSuffix | 1024 -> NONTERM_arrayTypeSuffix - | 1025 -> NONTERM_appTypePrefixArguments - | 1026 -> NONTERM_typeArgListElements - | 1027 -> NONTERM_typeArgListElements - | 1028 -> NONTERM_typeArgListElements - | 1029 -> NONTERM_powerType - | 1030 -> NONTERM_powerType - | 1031 -> NONTERM_atomTypeNonAtomicDeprecated - | 1032 -> NONTERM_atomTypeNonAtomicDeprecated - | 1033 -> NONTERM_atomTypeOrAnonRecdType - | 1034 -> NONTERM_atomTypeOrAnonRecdType - | 1035 -> NONTERM_atomType - | 1036 -> NONTERM_atomType - | 1037 -> NONTERM_atomType - | 1038 -> NONTERM_atomType - | 1039 -> NONTERM_atomType - | 1040 -> NONTERM_atomType - | 1041 -> NONTERM_atomType - | 1042 -> NONTERM_atomType - | 1043 -> NONTERM_atomType - | 1044 -> NONTERM_atomType - | 1045 -> NONTERM_atomType - | 1046 -> NONTERM_atomType - | 1047 -> NONTERM_atomType - | 1048 -> NONTERM_atomType - | 1049 -> NONTERM_atomType - | 1050 -> NONTERM_atomType - | 1051 -> NONTERM_atomType - | 1052 -> NONTERM_atomType - | 1053 -> NONTERM_atomType - | 1054 -> NONTERM_atomType - | 1055 -> NONTERM_typeArgsNoHpaDeprecated - | 1056 -> NONTERM_typeArgsNoHpaDeprecated - | 1057 -> NONTERM_typeArgsActual - | 1058 -> NONTERM_typeArgsActual - | 1059 -> NONTERM_typeArgsActual - | 1060 -> NONTERM_typeArgsActual - | 1061 -> NONTERM_typeArgsActual - | 1062 -> NONTERM_typeArgsActual - | 1063 -> NONTERM_typeArgsActual - | 1064 -> NONTERM_typeArgActual - | 1065 -> NONTERM_typeArgActual - | 1066 -> NONTERM_typeArgActual - | 1067 -> NONTERM_typeArgActualOrDummyIfEmpty - | 1068 -> NONTERM_typeArgActualOrDummyIfEmpty - | 1069 -> NONTERM_dummyTypeArg - | 1070 -> NONTERM_measureTypeArg - | 1071 -> NONTERM_measureTypeArg - | 1072 -> NONTERM_measureTypeAtom - | 1073 -> NONTERM_measureTypeAtom - | 1074 -> NONTERM_measureTypeAtom - | 1075 -> NONTERM_measureTypePower - | 1076 -> NONTERM_measureTypePower - | 1077 -> NONTERM_measureTypePower - | 1078 -> NONTERM_measureTypeSeq - | 1079 -> NONTERM_measureTypeSeq - | 1080 -> NONTERM_measureTypeExpr - | 1081 -> NONTERM_measureTypeExpr - | 1082 -> NONTERM_measureTypeExpr - | 1083 -> NONTERM_measureTypeExpr - | 1084 -> NONTERM_typar - | 1085 -> NONTERM_typar - | 1086 -> NONTERM_ident - | 1087 -> NONTERM_path - | 1088 -> NONTERM_path - | 1089 -> NONTERM_path - | 1090 -> NONTERM_path - | 1091 -> NONTERM_opName - | 1092 -> NONTERM_opName - | 1093 -> NONTERM_opName - | 1094 -> NONTERM_opName - | 1095 -> NONTERM_opName - | 1096 -> NONTERM_operatorName - | 1097 -> NONTERM_operatorName - | 1098 -> NONTERM_operatorName - | 1099 -> NONTERM_operatorName - | 1100 -> NONTERM_operatorName - | 1101 -> NONTERM_operatorName - | 1102 -> NONTERM_operatorName - | 1103 -> NONTERM_operatorName - | 1104 -> NONTERM_operatorName - | 1105 -> NONTERM_operatorName - | 1106 -> NONTERM_operatorName - | 1107 -> NONTERM_operatorName - | 1108 -> NONTERM_operatorName - | 1109 -> NONTERM_operatorName - | 1110 -> NONTERM_operatorName - | 1111 -> NONTERM_operatorName - | 1112 -> NONTERM_operatorName - | 1113 -> NONTERM_operatorName - | 1114 -> NONTERM_operatorName - | 1115 -> NONTERM_operatorName - | 1116 -> NONTERM_operatorName - | 1117 -> NONTERM_operatorName - | 1118 -> NONTERM_operatorName + | 1025 -> NONTERM_arrayTypeSuffix + | 1026 -> NONTERM_arrayTypeSuffix + | 1027 -> NONTERM_arrayTypeSuffix + | 1028 -> NONTERM_arrayTypeSuffix + | 1029 -> NONTERM_arrayTypeSuffix + | 1030 -> NONTERM_arrayTypeSuffix + | 1031 -> NONTERM_arrayTypeSuffix + | 1032 -> NONTERM_arrayTypeSuffix + | 1033 -> NONTERM_arrayTypeSuffix + | 1034 -> NONTERM_arrayTypeSuffix + | 1035 -> NONTERM_arrayTypeSuffix + | 1036 -> NONTERM_arrayTypeSuffix + | 1037 -> NONTERM_arrayTypeSuffix + | 1038 -> NONTERM_arrayTypeSuffix + | 1039 -> NONTERM_arrayTypeSuffix + | 1040 -> NONTERM_arrayTypeSuffix + | 1041 -> NONTERM_arrayTypeSuffix + | 1042 -> NONTERM_arrayTypeSuffix + | 1043 -> NONTERM_arrayTypeSuffix + | 1044 -> NONTERM_arrayTypeSuffix + | 1045 -> NONTERM_arrayTypeSuffix + | 1046 -> NONTERM_arrayTypeSuffix + | 1047 -> NONTERM_arrayTypeSuffix + | 1048 -> NONTERM_appTypePrefixArguments + | 1049 -> NONTERM_typeArgListElements + | 1050 -> NONTERM_typeArgListElements + | 1051 -> NONTERM_typeArgListElements + | 1052 -> NONTERM_powerType + | 1053 -> NONTERM_powerType + | 1054 -> NONTERM_atomTypeNonAtomicDeprecated + | 1055 -> NONTERM_atomTypeNonAtomicDeprecated + | 1056 -> NONTERM_atomTypeOrAnonRecdType + | 1057 -> NONTERM_atomTypeOrAnonRecdType + | 1058 -> NONTERM_atomType + | 1059 -> NONTERM_atomType + | 1060 -> NONTERM_atomType + | 1061 -> NONTERM_atomType + | 1062 -> NONTERM_atomType + | 1063 -> NONTERM_atomType + | 1064 -> NONTERM_atomType + | 1065 -> NONTERM_atomType + | 1066 -> NONTERM_atomType + | 1067 -> NONTERM_atomType + | 1068 -> NONTERM_atomType + | 1069 -> NONTERM_atomType + | 1070 -> NONTERM_atomType + | 1071 -> NONTERM_atomType + | 1072 -> NONTERM_atomType + | 1073 -> NONTERM_atomType + | 1074 -> NONTERM_atomType + | 1075 -> NONTERM_atomType + | 1076 -> NONTERM_atomType + | 1077 -> NONTERM_atomType + | 1078 -> NONTERM_typeArgsNoHpaDeprecated + | 1079 -> NONTERM_typeArgsNoHpaDeprecated + | 1080 -> NONTERM_typeArgsActual + | 1081 -> NONTERM_typeArgsActual + | 1082 -> NONTERM_typeArgsActual + | 1083 -> NONTERM_typeArgsActual + | 1084 -> NONTERM_typeArgsActual + | 1085 -> NONTERM_typeArgsActual + | 1086 -> NONTERM_typeArgsActual + | 1087 -> NONTERM_typeArgActual + | 1088 -> NONTERM_typeArgActual + | 1089 -> NONTERM_typeArgActual + | 1090 -> NONTERM_typeArgActualOrDummyIfEmpty + | 1091 -> NONTERM_typeArgActualOrDummyIfEmpty + | 1092 -> NONTERM_dummyTypeArg + | 1093 -> NONTERM_measureTypeArg + | 1094 -> NONTERM_measureTypeArg + | 1095 -> NONTERM_measureTypeAtom + | 1096 -> NONTERM_measureTypeAtom + | 1097 -> NONTERM_measureTypeAtom + | 1098 -> NONTERM_measureTypePower + | 1099 -> NONTERM_measureTypePower + | 1100 -> NONTERM_measureTypePower + | 1101 -> NONTERM_measureTypeSeq + | 1102 -> NONTERM_measureTypeSeq + | 1103 -> NONTERM_measureTypeExpr + | 1104 -> NONTERM_measureTypeExpr + | 1105 -> NONTERM_measureTypeExpr + | 1106 -> NONTERM_measureTypeExpr + | 1107 -> NONTERM_typar + | 1108 -> NONTERM_typar + | 1109 -> NONTERM_ident + | 1110 -> NONTERM_path + | 1111 -> NONTERM_path + | 1112 -> NONTERM_path + | 1113 -> NONTERM_path + | 1114 -> NONTERM_opName + | 1115 -> NONTERM_opName + | 1116 -> NONTERM_opName + | 1117 -> NONTERM_opName + | 1118 -> NONTERM_opName | 1119 -> NONTERM_operatorName | 1120 -> NONTERM_operatorName | 1121 -> NONTERM_operatorName - | 1122 -> NONTERM_activePatternCaseName - | 1123 -> NONTERM_activePatternCaseNames - | 1124 -> NONTERM_activePatternCaseNames - | 1125 -> NONTERM_identOrOp - | 1126 -> NONTERM_identOrOp - | 1127 -> NONTERM_pathOp - | 1128 -> NONTERM_pathOp - | 1129 -> NONTERM_pathOp - | 1130 -> NONTERM_pathOp - | 1131 -> NONTERM_nameop - | 1132 -> NONTERM_identExpr - | 1133 -> NONTERM_identExpr - | 1134 -> NONTERM_topSeparator - | 1135 -> NONTERM_topSeparator - | 1136 -> NONTERM_topSeparator - | 1137 -> NONTERM_topSeparators - | 1138 -> NONTERM_topSeparators - | 1139 -> NONTERM_opt_topSeparators - | 1140 -> NONTERM_opt_topSeparators - | 1141 -> NONTERM_seps - | 1142 -> NONTERM_seps - | 1143 -> NONTERM_seps - | 1144 -> NONTERM_seps - | 1145 -> NONTERM_declEnd - | 1146 -> NONTERM_declEnd - | 1147 -> NONTERM_declEnd - | 1148 -> NONTERM_opt_declEnd - | 1149 -> NONTERM_opt_declEnd - | 1150 -> NONTERM_opt_declEnd - | 1151 -> NONTERM_opt_declEnd - | 1152 -> NONTERM_opt_ODECLEND - | 1153 -> NONTERM_opt_ODECLEND - | 1154 -> NONTERM_deprecated_opt_equals - | 1155 -> NONTERM_deprecated_opt_equals - | 1156 -> NONTERM_opt_equals - | 1157 -> NONTERM_opt_equals - | 1158 -> NONTERM_opt_OBLOCKSEP - | 1159 -> NONTERM_opt_OBLOCKSEP - | 1160 -> NONTERM_opt_seps - | 1161 -> NONTERM_opt_seps - | 1162 -> NONTERM_opt_rec - | 1163 -> NONTERM_opt_rec - | 1164 -> NONTERM_opt_bar - | 1165 -> NONTERM_opt_bar - | 1166 -> NONTERM_opt_inline - | 1167 -> NONTERM_opt_inline - | 1168 -> NONTERM_opt_mutable - | 1169 -> NONTERM_opt_mutable - | 1170 -> NONTERM_doToken - | 1171 -> NONTERM_doToken - | 1172 -> NONTERM_doneDeclEnd - | 1173 -> NONTERM_doneDeclEnd - | 1174 -> NONTERM_structOrBegin - | 1175 -> NONTERM_structOrBegin - | 1176 -> NONTERM_sigOrBegin - | 1177 -> NONTERM_sigOrBegin - | 1178 -> NONTERM_colonOrEquals - | 1179 -> NONTERM_colonOrEquals - | 1180 -> NONTERM_string - | 1181 -> NONTERM_sourceIdentifier - | 1182 -> NONTERM_interpolatedStringFill - | 1183 -> NONTERM_interpolatedStringFill - | 1184 -> NONTERM_interpolatedStringParts - | 1185 -> NONTERM_interpolatedStringParts - | 1186 -> NONTERM_interpolatedStringParts - | 1187 -> NONTERM_interpolatedString - | 1188 -> NONTERM_interpolatedString - | 1189 -> NONTERM_interpolatedString - | 1190 -> NONTERM_opt_HIGH_PRECEDENCE_APP - | 1191 -> NONTERM_opt_HIGH_PRECEDENCE_APP - | 1192 -> NONTERM_opt_HIGH_PRECEDENCE_APP - | 1193 -> NONTERM_opt_HIGH_PRECEDENCE_TYAPP - | 1194 -> NONTERM_opt_HIGH_PRECEDENCE_TYAPP - | 1195 -> NONTERM_typeKeyword - | 1196 -> NONTERM_typeKeyword - | 1197 -> NONTERM_typeKeyword - | 1198 -> NONTERM_moduleKeyword - | 1199 -> NONTERM_moduleKeyword - | 1200 -> NONTERM_moduleKeyword - | 1201 -> NONTERM_rbrace - | 1202 -> NONTERM_rbrace - | 1203 -> NONTERM_rbrace - | 1204 -> NONTERM_bar_rbrace - | 1205 -> NONTERM_rparen - | 1206 -> NONTERM_rparen - | 1207 -> NONTERM_rparen - | 1208 -> NONTERM_oblockend - | 1209 -> NONTERM_oblockend - | 1210 -> NONTERM_oblockend - | 1211 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover - | 1212 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover - | 1213 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover - | 1214 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover - | 1215 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover - | 1216 -> NONTERM_ends_coming_soon_or_recover - | 1217 -> NONTERM_ends_coming_soon_or_recover - | 1218 -> NONTERM_ends_coming_soon_or_recover - | 1219 -> NONTERM_ends_coming_soon_or_recover - | 1220 -> NONTERM_ends_coming_soon_or_recover - | 1221 -> NONTERM_ends_coming_soon_or_recover + | 1122 -> NONTERM_operatorName + | 1123 -> NONTERM_operatorName + | 1124 -> NONTERM_operatorName + | 1125 -> NONTERM_operatorName + | 1126 -> NONTERM_operatorName + | 1127 -> NONTERM_operatorName + | 1128 -> NONTERM_operatorName + | 1129 -> NONTERM_operatorName + | 1130 -> NONTERM_operatorName + | 1131 -> NONTERM_operatorName + | 1132 -> NONTERM_operatorName + | 1133 -> NONTERM_operatorName + | 1134 -> NONTERM_operatorName + | 1135 -> NONTERM_operatorName + | 1136 -> NONTERM_operatorName + | 1137 -> NONTERM_operatorName + | 1138 -> NONTERM_operatorName + | 1139 -> NONTERM_operatorName + | 1140 -> NONTERM_operatorName + | 1141 -> NONTERM_operatorName + | 1142 -> NONTERM_operatorName + | 1143 -> NONTERM_operatorName + | 1144 -> NONTERM_operatorName + | 1145 -> NONTERM_activePatternCaseName + | 1146 -> NONTERM_activePatternCaseNames + | 1147 -> NONTERM_activePatternCaseNames + | 1148 -> NONTERM_identOrOp + | 1149 -> NONTERM_identOrOp + | 1150 -> NONTERM_pathOp + | 1151 -> NONTERM_pathOp + | 1152 -> NONTERM_pathOp + | 1153 -> NONTERM_pathOp + | 1154 -> NONTERM_nameop + | 1155 -> NONTERM_identExpr + | 1156 -> NONTERM_identExpr + | 1157 -> NONTERM_topSeparator + | 1158 -> NONTERM_topSeparator + | 1159 -> NONTERM_topSeparator + | 1160 -> NONTERM_topSeparators + | 1161 -> NONTERM_topSeparators + | 1162 -> NONTERM_opt_topSeparators + | 1163 -> NONTERM_opt_topSeparators + | 1164 -> NONTERM_seps + | 1165 -> NONTERM_seps + | 1166 -> NONTERM_seps + | 1167 -> NONTERM_seps + | 1168 -> NONTERM_declEnd + | 1169 -> NONTERM_declEnd + | 1170 -> NONTERM_declEnd + | 1171 -> NONTERM_opt_declEnd + | 1172 -> NONTERM_opt_declEnd + | 1173 -> NONTERM_opt_declEnd + | 1174 -> NONTERM_opt_declEnd + | 1175 -> NONTERM_opt_ODECLEND + | 1176 -> NONTERM_opt_ODECLEND + | 1177 -> NONTERM_deprecated_opt_equals + | 1178 -> NONTERM_deprecated_opt_equals + | 1179 -> NONTERM_opt_OBLOCKSEP + | 1180 -> NONTERM_opt_OBLOCKSEP + | 1181 -> NONTERM_opt_seps + | 1182 -> NONTERM_opt_seps + | 1183 -> NONTERM_opt_rec + | 1184 -> NONTERM_opt_rec + | 1185 -> NONTERM_opt_inline + | 1186 -> NONTERM_opt_inline + | 1187 -> NONTERM_opt_mutable + | 1188 -> NONTERM_opt_mutable + | 1189 -> NONTERM_doToken + | 1190 -> NONTERM_doToken + | 1191 -> NONTERM_doneDeclEnd + | 1192 -> NONTERM_doneDeclEnd + | 1193 -> NONTERM_structOrBegin + | 1194 -> NONTERM_structOrBegin + | 1195 -> NONTERM_sigOrBegin + | 1196 -> NONTERM_sigOrBegin + | 1197 -> NONTERM_colonOrEquals + | 1198 -> NONTERM_colonOrEquals + | 1199 -> NONTERM_string + | 1200 -> NONTERM_sourceIdentifier + | 1201 -> NONTERM_interpolatedStringFill + | 1202 -> NONTERM_interpolatedStringFill + | 1203 -> NONTERM_interpolatedStringParts + | 1204 -> NONTERM_interpolatedStringParts + | 1205 -> NONTERM_interpolatedStringParts + | 1206 -> NONTERM_interpolatedString + | 1207 -> NONTERM_interpolatedString + | 1208 -> NONTERM_interpolatedString + | 1209 -> NONTERM_opt_HIGH_PRECEDENCE_APP + | 1210 -> NONTERM_opt_HIGH_PRECEDENCE_APP + | 1211 -> NONTERM_opt_HIGH_PRECEDENCE_APP + | 1212 -> NONTERM_opt_HIGH_PRECEDENCE_TYAPP + | 1213 -> NONTERM_opt_HIGH_PRECEDENCE_TYAPP + | 1214 -> NONTERM_typeKeyword + | 1215 -> NONTERM_typeKeyword + | 1216 -> NONTERM_typeKeyword + | 1217 -> NONTERM_moduleKeyword + | 1218 -> NONTERM_moduleKeyword + | 1219 -> NONTERM_moduleKeyword + | 1220 -> NONTERM_rbrace + | 1221 -> NONTERM_rbrace + | 1222 -> NONTERM_rbrace + | 1223 -> NONTERM_bar_rbrace + | 1224 -> NONTERM_rparen + | 1225 -> NONTERM_rparen + | 1226 -> NONTERM_rparen + | 1227 -> NONTERM_oblockend + | 1228 -> NONTERM_oblockend + | 1229 -> NONTERM_oblockend + | 1230 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover + | 1231 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover + | 1232 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover + | 1233 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover + | 1234 -> NONTERM_ends_other_than_rparen_coming_soon_or_recover + | 1235 -> NONTERM_ends_coming_soon_or_recover + | 1236 -> NONTERM_ends_coming_soon_or_recover + | 1237 -> NONTERM_ends_coming_soon_or_recover + | 1238 -> NONTERM_ends_coming_soon_or_recover + | 1239 -> NONTERM_ends_coming_soon_or_recover + | 1240 -> NONTERM_ends_coming_soon_or_recover | _ -> failwith "prodIdxToNonTerminal: bad production index" -let _fsyacc_endOfInputTag = 205 -let _fsyacc_tagOfErrorTerminal = 203 +let _fsyacc_endOfInputTag = 206 +let _fsyacc_tagOfErrorTerminal = 204 // This function gets the name of a token as a string let token_to_string (t:token) = @@ -2475,6 +2501,7 @@ let token_to_string (t:token) = | TYPE_IS_HERE -> "TYPE_IS_HERE" | MODULE_COMING_SOON -> "MODULE_COMING_SOON" | MODULE_IS_HERE -> "MODULE_IS_HERE" + | BAR_JUST_BEFORE_NULL -> "BAR_JUST_BEFORE_NULL" | EXTERN -> "EXTERN" | VOID -> "VOID" | PUBLIC -> "PUBLIC" @@ -2682,6 +2709,7 @@ let _fsyacc_dataOfToken (t:token) = | TYPE_IS_HERE -> (null : System.Object) | MODULE_COMING_SOON -> (null : System.Object) | MODULE_IS_HERE -> (null : System.Object) + | BAR_JUST_BEFORE_NULL -> (null : System.Object) | EXTERN -> (null : System.Object) | VOID -> (null : System.Object) | PUBLIC -> (null : System.Object) @@ -2844,18 +2872,18 @@ let _fsyacc_dataOfToken (t:token) = | INTERP_STRING_BEGIN_END _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x | STRING _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x | BYTEARRAY _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x -let _fsyacc_gotos = [| 0us;65535us;0us;65535us;0us;65535us;0us;65535us;0us;65535us;1us;65535us;4us;5us;7us;65535us;4us;15us;16us;17us;18us;19us;20us;21us;22us;15us;24us;15us;26us;15us;4us;65535us;4us;10us;22us;23us;24us;25us;26us;27us;5us;65535us;4us;16us;22us;16us;24us;16us;26us;16us;28us;29us;4us;65535us;4us;18us;22us;18us;24us;18us;26us;18us;4us;65535us;4us;20us;22us;20us;24us;20us;26us;20us;4us;65535us;16us;22us;18us;24us;20us;26us;34us;35us;4us;65535us;16us;34us;18us;34us;20us;34us;34us;34us;23us;65535us;0us;90us;2us;268us;4us;33us;22us;33us;24us;33us;26us;33us;66us;90us;70us;90us;74us;90us;85us;90us;88us;90us;120us;90us;123us;90us;127us;90us;234us;268us;238us;268us;241us;268us;253us;268us;257us;268us;259us;268us;265us;268us;296us;268us;306us;268us;1us;65535us;39us;40us;1us;65535us;40us;41us;1us;65535us;0us;1us;6us;65535us;31us;280us;69us;70us;93us;94us;237us;238us;251us;280us;270us;280us;4us;65535us;61us;65us;63us;65us;229us;233us;231us;233us;1us;65535us;0us;44us;2us;65535us;61us;62us;63us;64us;2us;65535us;61us;63us;63us;63us;2us;65535us;0us;61us;66us;67us;3us;65535us;0us;72us;66us;72us;70us;71us;6us;65535us;0us;73us;66us;73us;70us;73us;74us;75us;123us;124us;127us;128us;9us;65535us;0us;81us;66us;81us;70us;81us;74us;81us;85us;86us;88us;89us;120us;121us;123us;81us;127us;81us;9us;65535us;0us;84us;66us;84us;70us;84us;74us;84us;85us;84us;88us;84us;120us;84us;123us;84us;127us;84us;9us;65535us;0us;91us;66us;91us;70us;91us;74us;91us;85us;91us;88us;91us;120us;91us;123us;91us;127us;91us;2us;65535us;112us;113us;186us;187us;1us;65535us;95us;97us;2us;65535us;100us;101us;131us;132us;3us;65535us;99us;100us;130us;131us;198us;199us;1us;65535us;134us;135us;2us;65535us;134us;144us;137us;138us;2us;65535us;134us;147us;137us;147us;2us;65535us;134us;151us;137us;151us;3us;65535us;152us;153us;162us;163us;220us;221us;8us;65535us;137us;159us;139us;140us;152us;170us;158us;159us;162us;170us;166us;167us;173us;174us;220us;170us;8us;65535us;137us;171us;139us;171us;152us;171us;158us;171us;162us;171us;166us;171us;173us;171us;220us;171us;11us;65535us;137us;172us;139us;172us;152us;172us;158us;172us;162us;172us;166us;172us;173us;172us;220us;172us;650us;651us;657us;658us;1507us;1508us;3us;65535us;185us;186us;455us;456us;492us;493us;2us;65535us;203us;204us;205us;206us;2us;65535us;177us;179us;178us;179us;2us;65535us;69us;102us;93us;102us;5us;65535us;133us;136us;140us;141us;142us;143us;144us;145us;218us;219us;1us;65535us;2us;3us;1us;65535us;2us;223us;2us;65535us;229us;230us;231us;232us;2us;65535us;229us;231us;231us;231us;2us;65535us;2us;229us;234us;235us;3us;65535us;2us;240us;234us;240us;238us;239us;5us;65535us;2us;248us;234us;248us;238us;248us;241us;242us;306us;307us;9us;65535us;2us;249us;234us;249us;238us;249us;241us;249us;253us;254us;259us;260us;265us;266us;296us;300us;306us;249us;10us;65535us;2us;255us;234us;255us;238us;255us;241us;255us;253us;255us;257us;258us;259us;255us;265us;255us;296us;255us;306us;255us;10us;65535us;2us;257us;234us;257us;238us;257us;241us;257us;253us;257us;257us;257us;259us;257us;265us;257us;296us;257us;306us;257us;15us;65535us;2us;267us;4us;28us;22us;28us;24us;28us;26us;28us;28us;28us;234us;267us;238us;267us;241us;267us;253us;267us;257us;267us;259us;267us;265us;267us;296us;267us;306us;267us;24us;65535us;0us;103us;2us;286us;4us;286us;22us;286us;24us;286us;26us;286us;28us;286us;66us;103us;70us;103us;74us;103us;85us;103us;88us;103us;120us;103us;123us;103us;127us;103us;234us;286us;238us;286us;241us;286us;253us;286us;257us;286us;259us;286us;265us;286us;296us;286us;306us;286us;1us;65535us;95us;96us;1us;65535us;281us;282us;2us;65535us;281us;304us;296us;297us;1us;65535us;361us;362us;81us;65535us;0us;68us;2us;236us;4us;30us;22us;30us;24us;30us;26us;30us;28us;269us;50us;51us;66us;68us;70us;92us;74us;92us;85us;92us;88us;92us;99us;355us;104us;105us;120us;92us;123us;92us;127us;92us;130us;355us;134us;560us;137us;176us;139us;175us;152us;175us;158us;175us;162us;175us;166us;175us;173us;175us;198us;355us;220us;175us;234us;236us;238us;250us;241us;250us;253us;250us;257us;269us;259us;250us;265us;250us;276us;355us;296us;250us;306us;250us;311us;436us;358us;355us;361us;363us;368us;560us;371us;437us;373us;436us;388us;436us;392us;436us;394us;436us;398us;436us;404us;436us;407us;436us;418us;419us;475us;355us;516us;545us;519us;436us;537us;545us;543us;545us;574us;725us;584us;725us;602us;611us;607us;611us;608us;611us;616us;611us;621us;611us;650us;175us;657us;175us;667us;677us;670us;677us;675us;677us;722us;725us;737us;738us;750us;802us;756us;802us;769us;796us;774us;783us;779us;783us;781us;783us;799us;802us;1507us;175us;1606us;546us;1608us;802us;122us;65535us;0us;314us;2us;284us;4us;284us;22us;284us;24us;284us;26us;284us;28us;284us;50us;314us;66us;314us;70us;314us;74us;314us;85us;314us;88us;314us;99us;314us;104us;314us;111us;1679us;120us;314us;123us;314us;127us;314us;130us;314us;134us;314us;137us;314us;139us;314us;149us;1679us;152us;314us;158us;314us;162us;314us;166us;314us;173us;314us;184us;1679us;198us;314us;201us;1679us;220us;314us;234us;284us;238us;284us;241us;284us;253us;284us;257us;284us;259us;284us;265us;284us;276us;314us;296us;284us;306us;284us;311us;314us;315us;316us;358us;314us;361us;314us;368us;314us;371us;314us;373us;314us;385us;1679us;388us;314us;392us;314us;394us;314us;398us;314us;404us;314us;407us;314us;418us;314us;454us;1679us;475us;314us;516us;314us;519us;314us;537us;314us;543us;314us;574us;314us;584us;314us;602us;314us;607us;314us;608us;314us;616us;314us;621us;314us;650us;314us;657us;314us;667us;314us;670us;314us;675us;314us;688us;1679us;722us;314us;737us;314us;750us;314us;756us;314us;769us;314us;774us;314us;779us;314us;781us;314us;799us;314us;876us;876us;877us;876us;880us;876us;922us;1008us;941us;1008us;957us;1008us;960us;1008us;971us;1008us;979us;1008us;1002us;1008us;1008us;1008us;1009us;1008us;1011us;1008us;1012us;1008us;1015us;1008us;1017us;1008us;1018us;1008us;1024us;1008us;1028us;1008us;1135us;1008us;1305us;1008us;1307us;1008us;1313us;1008us;1320us;1008us;1322us;1008us;1507us;314us;1606us;314us;1608us;314us;1651us;1008us;1653us;1008us;1660us;1679us;1664us;1679us;1668us;1679us;1671us;1679us;1674us;1679us;1677us;1679us;122us;65535us;0us;315us;2us;315us;4us;315us;22us;315us;24us;315us;26us;315us;28us;315us;50us;315us;66us;315us;70us;315us;74us;315us;85us;315us;88us;315us;99us;315us;104us;315us;111us;315us;120us;315us;123us;315us;127us;315us;130us;315us;134us;315us;137us;315us;139us;315us;149us;315us;152us;315us;158us;315us;162us;315us;166us;315us;173us;315us;184us;315us;198us;315us;201us;315us;220us;315us;234us;315us;238us;315us;241us;315us;253us;315us;257us;315us;259us;315us;265us;315us;276us;315us;296us;315us;306us;315us;311us;315us;315us;315us;358us;315us;361us;315us;368us;315us;371us;315us;373us;315us;385us;315us;388us;315us;392us;315us;394us;315us;398us;315us;404us;315us;407us;315us;418us;315us;454us;315us;475us;315us;516us;315us;519us;315us;537us;315us;543us;315us;574us;315us;584us;315us;602us;315us;607us;315us;608us;315us;616us;315us;621us;315us;650us;315us;657us;315us;667us;315us;670us;315us;675us;315us;688us;315us;722us;315us;737us;315us;750us;315us;756us;315us;769us;315us;774us;315us;779us;315us;781us;315us;799us;315us;876us;315us;877us;315us;880us;315us;922us;315us;941us;315us;957us;315us;960us;315us;971us;315us;979us;315us;1002us;315us;1008us;315us;1009us;315us;1011us;315us;1012us;315us;1015us;315us;1017us;315us;1018us;315us;1024us;315us;1028us;315us;1135us;315us;1305us;315us;1307us;315us;1313us;315us;1320us;315us;1322us;315us;1507us;315us;1606us;315us;1608us;315us;1651us;315us;1653us;315us;1660us;315us;1664us;315us;1668us;315us;1671us;315us;1674us;315us;1677us;315us;1us;65535us;317us;318us;2us;65535us;317us;327us;328us;329us;2us;65535us;317us;333us;328us;333us;4us;65535us;177us;216us;178us;216us;438us;442us;439us;442us;6us;65535us;99us;133us;130us;133us;198us;133us;276us;361us;358us;361us;475us;361us;2us;65535us;277us;278us;359us;360us;3us;65535us;276us;277us;358us;359us;475us;476us;1us;65535us;368us;369us;2us;65535us;368us;380us;371us;372us;2us;65535us;368us;383us;371us;383us;2us;65535us;368us;387us;371us;387us;3us;65535us;311us;312us;388us;389us;519us;520us;8us;65535us;311us;402us;373us;374us;388us;402us;392us;405us;398us;399us;404us;405us;407us;408us;519us;402us;10us;65535us;311us;403us;371us;395us;373us;403us;388us;403us;392us;403us;394us;395us;398us;403us;404us;403us;407us;403us;519us;403us;1us;65535us;426us;431us;2us;65535us;409us;410us;411us;412us;3us;65535us;409us;415us;411us;415us;416us;417us;3us;65535us;442us;443us;547us;548us;553us;554us;4us;65535us;177us;217us;178us;217us;438us;450us;439us;450us;10us;65535us;311us;406us;371us;406us;373us;406us;388us;406us;392us;406us;394us;406us;398us;406us;404us;406us;407us;406us;519us;406us;3us;65535us;350us;461us;438us;459us;439us;459us;2us;65535us;442us;463us;547us;550us;1us;65535us;489us;490us;52us;65535us;419us;926us;424us;926us;465us;966us;806us;926us;899us;926us;901us;926us;902us;926us;906us;926us;907us;926us;910us;926us;912us;926us;913us;926us;922us;926us;926us;966us;927us;966us;929us;966us;931us;966us;934us;966us;936us;966us;941us;926us;945us;966us;947us;966us;949us;966us;957us;926us;960us;926us;971us;926us;979us;926us;1000us;926us;1002us;926us;1008us;926us;1009us;926us;1011us;926us;1012us;926us;1015us;926us;1017us;926us;1018us;926us;1024us;926us;1028us;926us;1078us;926us;1083us;926us;1135us;926us;1166us;926us;1173us;926us;1305us;926us;1307us;926us;1313us;926us;1320us;926us;1322us;926us;1634us;966us;1639us;966us;1651us;926us;1653us;926us;22us;65535us;30us;31us;51us;52us;68us;69us;92us;93us;107us;108us;175us;177us;176us;178us;180us;181us;236us;237us;250us;251us;269us;270us;355us;595us;363us;364us;436us;438us;437us;439us;478us;479us;487us;488us;560us;561us;677us;678us;727us;728us;738us;739us;770us;771us;74us;65535us;30us;512us;51us;512us;68us;512us;92us;512us;107us;512us;175us;512us;176us;512us;180us;512us;236us;512us;250us;512us;269us;512us;355us;512us;363us;512us;419us;507us;424us;507us;436us;512us;437us;512us;465us;507us;478us;512us;487us;512us;560us;512us;677us;512us;727us;512us;738us;512us;770us;512us;806us;507us;899us;507us;901us;507us;902us;507us;906us;507us;907us;507us;910us;507us;912us;507us;913us;507us;922us;507us;926us;507us;927us;507us;929us;507us;931us;507us;934us;507us;936us;507us;941us;507us;945us;507us;947us;507us;949us;507us;957us;507us;960us;507us;971us;507us;979us;507us;1000us;507us;1002us;507us;1008us;507us;1009us;507us;1011us;507us;1012us;507us;1015us;507us;1017us;507us;1018us;507us;1024us;507us;1028us;507us;1078us;507us;1083us;507us;1135us;507us;1166us;507us;1173us;507us;1305us;507us;1307us;507us;1313us;507us;1320us;507us;1322us;507us;1634us;507us;1639us;507us;1651us;507us;1653us;507us;1us;65535us;447us;448us;4us;65535us;374us;375us;376us;377us;380us;381us;735us;736us;2us;65535us;438us;458us;439us;458us;2us;65535us;366us;367us;466us;467us;2us;65535us;366us;529us;466us;529us;2us;65535us;523us;524us;526us;527us;3us;65535us;523us;533us;526us;533us;1381us;1604us;2us;65535us;516us;517us;1606us;1611us;4us;65535us;516us;541us;537us;538us;543us;544us;1606us;541us;4us;65535us;516us;542us;537us;542us;543us;542us;1606us;542us;2us;65535us;545us;547us;546us;547us;4us;65535us;134us;146us;137us;146us;368us;382us;371us;382us;9us;65535us;178us;568us;439us;568us;561us;568us;679us;719us;681us;719us;684us;719us;705us;719us;708us;719us;744us;719us;83us;65535us;8us;1843us;111us;1843us;149us;1843us;178us;1843us;184us;1843us;188us;1843us;190us;1843us;201us;1843us;290us;1843us;385us;1843us;439us;1843us;446us;1843us;454us;1843us;481us;1843us;497us;1843us;561us;1843us;569us;1843us;626us;1843us;630us;1843us;640us;1843us;643us;1843us;653us;1843us;664us;1843us;679us;1843us;681us;1843us;684us;1843us;688us;1843us;705us;1843us;708us;1843us;711us;1843us;714us;1843us;730us;1843us;744us;1843us;829us;1843us;873us;1843us;938us;1843us;1005us;1843us;1046us;1843us;1231us;1843us;1234us;1843us;1237us;1843us;1517us;1843us;1550us;1843us;1553us;1843us;1555us;1843us;1619us;1843us;1657us;1843us;1659us;1843us;1660us;1843us;1664us;1843us;1668us;1843us;1671us;1843us;1674us;1843us;1677us;1843us;1679us;1843us;1681us;1843us;1686us;1843us;1690us;1843us;1695us;1843us;1700us;1843us;1703us;1843us;1706us;1843us;1709us;1843us;1714us;1843us;1717us;1843us;1719us;1843us;1722us;1843us;1726us;1843us;1729us;1843us;1731us;1843us;1734us;1843us;1751us;1843us;1757us;1843us;1760us;1843us;1827us;1843us;1831us;1843us;1837us;1843us;1848us;1843us;1854us;1843us;1855us;1843us;1878us;1843us;1880us;1843us;1891us;1843us;84us;65535us;8us;583us;111us;583us;149us;583us;178us;583us;184us;583us;188us;583us;190us;583us;201us;583us;290us;583us;385us;583us;439us;583us;446us;583us;454us;583us;481us;583us;497us;583us;561us;583us;569us;583us;581us;582us;626us;583us;630us;583us;640us;583us;643us;583us;653us;583us;664us;583us;679us;583us;681us;583us;684us;583us;688us;583us;705us;583us;708us;583us;711us;583us;714us;583us;730us;583us;744us;583us;829us;583us;873us;583us;938us;583us;1005us;583us;1046us;583us;1231us;583us;1234us;583us;1237us;583us;1517us;583us;1550us;583us;1553us;583us;1555us;583us;1619us;583us;1657us;583us;1659us;583us;1660us;583us;1664us;583us;1668us;583us;1671us;583us;1674us;583us;1677us;583us;1679us;583us;1681us;583us;1686us;583us;1690us;583us;1695us;583us;1700us;583us;1703us;583us;1706us;583us;1709us;583us;1714us;583us;1717us;583us;1719us;583us;1722us;583us;1726us;583us;1729us;583us;1731us;583us;1734us;583us;1751us;583us;1757us;583us;1760us;583us;1827us;583us;1831us;583us;1837us;583us;1848us;583us;1854us;583us;1855us;583us;1878us;583us;1880us;583us;1891us;583us;4us;65535us;134us;152us;137us;152us;368us;388us;371us;388us;9us;65535us;177us;188us;178us;188us;438us;446us;439us;446us;1600us;1619us;1602us;1619us;1613us;1619us;1615us;1619us;1617us;1619us;1us;65535us;355us;356us;1us;65535us;595us;597us;3us;65535us;602us;603us;616us;605us;621us;606us;5us;65535us;602us;610us;607us;609us;608us;609us;616us;610us;621us;610us;1us;65535us;596us;599us;1us;65535us;621us;622us;4us;65535us;109us;625us;182us;625us;452us;625us;926us;927us;3us;65535us;109us;110us;182us;183us;452us;453us;3us;65535us;356us;357us;605us;617us;622us;623us;3us;65535us;626us;627us;1657us;628us;1659us;629us;3us;65535us;613us;614us;1737us;633us;1739us;634us;4us;65535us;626us;632us;630us;631us;1657us;632us;1659us;632us;1us;65535us;653us;654us;3us;65535us;178us;567us;439us;567us;561us;567us;5us;65535us;178us;667us;439us;667us;561us;667us;669us;670us;674us;675us;3us;65535us;667us;668us;670us;671us;675us;676us;3us;65535us;667us;674us;670us;674us;675us;674us;1us;65535us;678us;679us;3us;65535us;178us;669us;439us;669us;561us;669us;3us;65535us;178us;672us;439us;672us;561us;672us;7us;65535us;679us;720us;681us;720us;684us;720us;705us;720us;708us;720us;711us;712us;744us;720us;7us;65535us;679us;710us;681us;710us;684us;710us;705us;710us;708us;710us;711us;710us;744us;710us;6us;65535us;679us;683us;681us;682us;684us;685us;705us;706us;708us;709us;744us;745us;3us;65535us;574us;575us;584us;585us;722us;723us;3us;65535us;574us;721us;584us;721us;722us;721us;3us;65535us;193us;194us;196us;197us;725us;726us;4us;65535us;31us;279us;237us;279us;251us;279us;270us;279us;6us;65535us;31us;735us;69us;218us;93us;218us;237us;735us;251us;735us;270us;735us;1us;65535us;739us;740us;1us;65535us;740us;741us;120us;65535us;6us;1089us;31us;272us;114us;1089us;116us;1089us;237us;272us;251us;272us;270us;271us;274us;1089us;350us;763us;422us;1089us;427us;1089us;438us;763us;439us;763us;468us;1089us;491us;1089us;753us;1089us;759us;1089us;809us;1089us;813us;1089us;823us;1089us;1030us;1089us;1036us;1089us;1052us;1089us;1054us;1089us;1057us;1089us;1060us;1089us;1079us;1089us;1084us;1089us;1090us;1089us;1093us;1089us;1096us;1089us;1102us;1089us;1106us;1089us;1110us;1089us;1116us;1089us;1118us;1089us;1123us;1089us;1125us;1089us;1127us;1089us;1129us;1089us;1131us;1089us;1133us;1089us;1137us;1089us;1147us;1089us;1154us;1089us;1160us;1089us;1162us;1089us;1167us;1089us;1171us;1089us;1174us;1089us;1178us;1089us;1181us;1089us;1184us;1089us;1186us;1089us;1189us;1089us;1191us;1089us;1240us;1089us;1242us;1089us;1246us;1089us;1248us;1089us;1250us;1089us;1252us;1089us;1254us;1089us;1256us;1089us;1258us;1089us;1260us;1089us;1262us;1089us;1264us;1089us;1266us;1089us;1268us;1089us;1270us;1089us;1272us;1089us;1274us;1089us;1276us;1089us;1278us;1089us;1280us;1089us;1282us;1089us;1284us;1089us;1286us;1089us;1287us;1089us;1288us;1089us;1289us;1089us;1292us;1089us;1302us;1089us;1327us;1089us;1328us;1089us;1332us;1089us;1334us;1089us;1337us;1089us;1338us;1089us;1340us;1089us;1343us;1089us;1345us;1089us;1347us;1089us;1349us;1089us;1431us;1089us;1438us;1089us;1445us;1089us;1452us;1089us;1469us;1089us;1476us;1089us;1477us;1089us;1483us;1089us;1489us;1089us;1490us;1089us;1491us;1089us;1503us;1089us;1509us;1089us;1519us;1089us;1532us;1089us;1534us;1089us;1537us;1089us;1538us;1089us;1564us;1089us;1569us;1089us;1594us;1089us;1636us;1089us;1641us;1089us;2021us;1089us;2025us;1089us;7us;65535us;31us;275us;237us;275us;251us;275us;270us;275us;350us;764us;438us;764us;439us;764us;120us;65535us;6us;1060us;31us;274us;114us;1093us;116us;1093us;237us;274us;251us;274us;270us;273us;274us;1060us;350us;765us;422us;1060us;427us;1060us;438us;765us;439us;765us;468us;1060us;491us;1060us;753us;1060us;759us;1060us;809us;1060us;813us;1060us;823us;1060us;1030us;1060us;1036us;1060us;1052us;1060us;1054us;1060us;1057us;1060us;1060us;1060us;1079us;1060us;1084us;1060us;1090us;1060us;1093us;1060us;1096us;1060us;1102us;1060us;1106us;1060us;1110us;1060us;1116us;1060us;1118us;1093us;1123us;1093us;1125us;1093us;1127us;1093us;1129us;1093us;1131us;1093us;1133us;1093us;1137us;1060us;1147us;1060us;1154us;1060us;1160us;1093us;1162us;1093us;1167us;1060us;1171us;1060us;1174us;1060us;1178us;1060us;1181us;1060us;1184us;1060us;1186us;1060us;1189us;1093us;1191us;1060us;1240us;1093us;1242us;1093us;1246us;1093us;1248us;1093us;1250us;1093us;1252us;1093us;1254us;1093us;1256us;1093us;1258us;1093us;1260us;1093us;1262us;1093us;1264us;1093us;1266us;1093us;1268us;1093us;1270us;1093us;1272us;1093us;1274us;1093us;1276us;1093us;1278us;1093us;1280us;1093us;1282us;1093us;1284us;1093us;1286us;1093us;1287us;1093us;1288us;1093us;1289us;1093us;1292us;1060us;1302us;1060us;1327us;1093us;1328us;1060us;1332us;1093us;1334us;1060us;1337us;1093us;1338us;1060us;1340us;1093us;1343us;1093us;1345us;1093us;1347us;1093us;1349us;1093us;1431us;1060us;1438us;1093us;1445us;1060us;1452us;1060us;1469us;1060us;1476us;1060us;1477us;1060us;1483us;1060us;1489us;1060us;1490us;1060us;1491us;1060us;1503us;1093us;1509us;1060us;1519us;1060us;1532us;1060us;1534us;1093us;1537us;1093us;1538us;1093us;1564us;1093us;1569us;1093us;1594us;1093us;1636us;1060us;1641us;1060us;2021us;1093us;2025us;1093us;119us;65535us;6us;1099us;31us;1099us;114us;1099us;116us;1099us;237us;1099us;251us;1099us;274us;1099us;350us;766us;422us;1099us;427us;1099us;438us;766us;439us;766us;468us;1099us;491us;1099us;753us;1099us;759us;1099us;809us;1099us;813us;1099us;823us;1099us;1030us;1099us;1036us;1099us;1052us;1099us;1054us;1099us;1057us;1099us;1060us;1099us;1079us;1099us;1084us;1099us;1090us;1099us;1093us;1099us;1096us;1099us;1102us;1099us;1106us;1099us;1110us;1099us;1116us;1099us;1118us;1099us;1123us;1099us;1125us;1099us;1127us;1099us;1129us;1099us;1131us;1099us;1133us;1099us;1137us;1099us;1147us;1099us;1154us;1099us;1160us;1099us;1162us;1099us;1167us;1099us;1171us;1099us;1174us;1099us;1178us;1099us;1181us;1099us;1184us;1099us;1186us;1099us;1189us;1099us;1191us;1099us;1240us;1099us;1242us;1099us;1246us;1099us;1248us;1099us;1250us;1099us;1252us;1099us;1254us;1099us;1256us;1099us;1258us;1099us;1260us;1099us;1262us;1099us;1264us;1099us;1266us;1099us;1268us;1099us;1270us;1099us;1272us;1099us;1274us;1099us;1276us;1099us;1278us;1099us;1280us;1099us;1282us;1099us;1284us;1099us;1286us;1099us;1287us;1099us;1288us;1099us;1289us;1099us;1292us;1099us;1302us;1099us;1327us;1099us;1328us;1099us;1332us;1099us;1334us;1099us;1337us;1099us;1338us;1099us;1340us;1099us;1343us;1099us;1345us;1099us;1347us;1099us;1349us;1099us;1431us;1099us;1438us;1099us;1445us;1099us;1452us;1099us;1469us;1099us;1476us;1099us;1477us;1099us;1483us;1099us;1489us;1099us;1490us;1099us;1491us;1099us;1503us;1099us;1509us;1099us;1519us;1099us;1532us;1099us;1534us;1099us;1537us;1099us;1538us;1099us;1564us;1099us;1569us;1099us;1594us;1099us;1636us;1099us;1641us;1099us;2021us;1099us;2025us;1099us;3us;65535us;350us;441us;438us;440us;439us;440us;5us;65535us;757us;758us;760us;761us;1085us;1086us;1175us;1176us;1187us;1188us;120us;65535us;6us;752us;31us;752us;114us;752us;116us;752us;237us;752us;251us;752us;270us;752us;274us;752us;350us;752us;422us;752us;427us;752us;438us;752us;439us;752us;468us;752us;491us;752us;753us;752us;759us;752us;809us;752us;813us;752us;823us;752us;1030us;752us;1036us;752us;1052us;752us;1054us;752us;1057us;752us;1060us;752us;1079us;752us;1084us;752us;1090us;752us;1093us;752us;1096us;752us;1102us;752us;1106us;752us;1110us;752us;1116us;752us;1118us;752us;1123us;752us;1125us;752us;1127us;752us;1129us;752us;1131us;752us;1133us;752us;1137us;752us;1147us;752us;1154us;752us;1160us;752us;1162us;752us;1167us;752us;1171us;752us;1174us;752us;1178us;752us;1181us;752us;1184us;752us;1186us;752us;1189us;752us;1191us;752us;1240us;752us;1242us;752us;1246us;752us;1248us;752us;1250us;752us;1252us;752us;1254us;752us;1256us;752us;1258us;752us;1260us;752us;1262us;752us;1264us;752us;1266us;752us;1268us;752us;1270us;752us;1272us;752us;1274us;752us;1276us;752us;1278us;752us;1280us;752us;1282us;752us;1284us;752us;1286us;752us;1287us;752us;1288us;752us;1289us;752us;1292us;752us;1302us;752us;1327us;752us;1328us;752us;1332us;752us;1334us;752us;1337us;752us;1338us;752us;1340us;752us;1343us;752us;1345us;752us;1347us;752us;1349us;752us;1431us;752us;1438us;752us;1445us;752us;1452us;752us;1469us;752us;1476us;752us;1477us;752us;1483us;752us;1489us;752us;1490us;752us;1491us;752us;1503us;752us;1509us;752us;1519us;752us;1532us;752us;1534us;752us;1537us;752us;1538us;752us;1564us;752us;1569us;752us;1594us;752us;1636us;752us;1641us;752us;2021us;752us;2025us;752us;1us;65535us;774us;775us;1us;65535us;774us;777us;3us;65535us;774us;778us;779us;780us;781us;782us;2us;65535us;783us;784us;796us;787us;1us;65535us;769us;770us;4us;65535us;750us;751us;756us;757us;1606us;1607us;1608us;1609us;2us;65535us;797us;798us;800us;801us;5us;65535us;750us;797us;756us;797us;799us;800us;1606us;797us;1608us;797us;2us;65535us;546us;803us;802us;803us;1us;65535us;809us;810us;2us;65535us;809us;817us;813us;814us;1us;65535us;818us;819us;1us;65535us;819us;820us;1us;65535us;821us;822us;2us;65535us;821us;827us;825us;826us;300us;65535us;6us;864us;8us;1862us;31us;864us;111us;1862us;114us;864us;116us;864us;149us;1862us;178us;1862us;184us;1862us;188us;1862us;190us;1862us;201us;1862us;237us;864us;251us;864us;274us;864us;290us;1862us;331us;864us;335us;864us;340us;864us;385us;1862us;419us;864us;422us;864us;424us;864us;427us;864us;439us;1862us;446us;1862us;454us;1862us;465us;864us;468us;864us;481us;1862us;491us;864us;497us;1862us;522us;1862us;525us;864us;561us;1862us;569us;1862us;570us;1862us;613us;1862us;626us;1862us;630us;1862us;635us;1862us;640us;1862us;643us;1862us;653us;1862us;664us;1862us;679us;1862us;681us;1862us;684us;1862us;688us;1862us;690us;864us;701us;864us;705us;1862us;708us;1862us;711us;1862us;714us;1862us;730us;1862us;744us;1862us;753us;864us;759us;864us;806us;864us;809us;864us;813us;864us;823us;864us;829us;1862us;873us;1862us;899us;864us;901us;864us;902us;864us;906us;864us;907us;864us;910us;864us;912us;864us;913us;864us;922us;864us;926us;864us;927us;864us;929us;864us;931us;864us;934us;864us;936us;864us;938us;1862us;941us;864us;945us;864us;947us;864us;949us;864us;957us;864us;960us;864us;971us;864us;979us;864us;1000us;864us;1002us;864us;1005us;1862us;1008us;864us;1009us;864us;1011us;864us;1012us;864us;1015us;864us;1017us;864us;1018us;864us;1024us;864us;1028us;864us;1030us;864us;1036us;864us;1046us;1862us;1052us;864us;1054us;864us;1057us;864us;1060us;864us;1078us;864us;1079us;864us;1083us;864us;1084us;864us;1090us;864us;1093us;864us;1096us;864us;1102us;864us;1106us;864us;1110us;864us;1116us;864us;1118us;864us;1123us;864us;1125us;864us;1127us;864us;1129us;864us;1131us;864us;1133us;864us;1135us;864us;1137us;864us;1147us;864us;1154us;864us;1160us;864us;1162us;864us;1166us;864us;1167us;864us;1171us;864us;1173us;864us;1174us;864us;1178us;864us;1181us;864us;1184us;864us;1186us;864us;1189us;864us;1191us;864us;1231us;1862us;1234us;1862us;1237us;1862us;1240us;864us;1242us;864us;1246us;864us;1248us;864us;1250us;864us;1252us;864us;1254us;864us;1256us;864us;1258us;864us;1260us;864us;1262us;864us;1264us;864us;1266us;864us;1268us;864us;1270us;864us;1272us;864us;1274us;864us;1276us;864us;1278us;864us;1280us;864us;1282us;864us;1284us;864us;1286us;864us;1287us;864us;1288us;864us;1289us;864us;1292us;864us;1302us;864us;1305us;864us;1307us;864us;1313us;864us;1320us;864us;1322us;864us;1327us;864us;1328us;864us;1332us;864us;1334us;864us;1337us;864us;1338us;864us;1340us;864us;1343us;864us;1345us;864us;1347us;864us;1349us;864us;1351us;864us;1352us;864us;1353us;864us;1354us;864us;1356us;864us;1357us;864us;1359us;864us;1360us;864us;1362us;864us;1363us;864us;1365us;864us;1366us;864us;1368us;864us;1369us;864us;1371us;864us;1372us;864us;1374us;1862us;1375us;1862us;1378us;864us;1379us;864us;1386us;864us;1388us;864us;1390us;864us;1391us;864us;1392us;864us;1395us;864us;1400us;864us;1408us;864us;1409us;864us;1412us;864us;1413us;864us;1431us;864us;1438us;864us;1445us;864us;1452us;864us;1469us;864us;1476us;864us;1477us;864us;1483us;864us;1489us;864us;1490us;864us;1491us;864us;1503us;864us;1509us;864us;1517us;1862us;1519us;864us;1532us;864us;1534us;864us;1537us;864us;1538us;864us;1544us;864us;1550us;1862us;1553us;1862us;1555us;1862us;1557us;1862us;1559us;864us;1564us;864us;1569us;864us;1594us;864us;1619us;1862us;1627us;864us;1634us;864us;1636us;864us;1639us;864us;1641us;864us;1651us;864us;1653us;864us;1657us;1862us;1659us;1862us;1660us;1862us;1664us;1862us;1668us;1862us;1671us;1862us;1674us;1862us;1677us;1862us;1679us;1862us;1681us;1862us;1686us;1862us;1690us;1862us;1695us;1862us;1700us;1862us;1703us;1862us;1706us;1862us;1709us;1862us;1714us;1862us;1717us;1862us;1719us;1862us;1722us;1862us;1726us;1862us;1729us;1862us;1731us;1862us;1734us;1862us;1737us;1862us;1739us;1862us;1751us;1862us;1757us;1862us;1760us;1862us;1827us;1862us;1831us;1862us;1837us;1862us;1844us;1862us;1848us;1862us;1854us;1862us;1855us;1862us;1864us;864us;1878us;1862us;1880us;1862us;1891us;1862us;2021us;864us;2025us;864us;1us;65535us;858us;859us;4us;65535us;862us;863us;1744us;861us;1835us;861us;1906us;861us;3us;65535us;1744us;1745us;1835us;1836us;1906us;1907us;207us;65535us;6us;1458us;31us;1458us;114us;1458us;116us;1458us;237us;1458us;251us;1458us;274us;1458us;331us;1458us;335us;1458us;340us;1458us;419us;967us;422us;1458us;424us;967us;427us;1458us;465us;967us;468us;1458us;491us;1458us;525us;1458us;690us;1458us;701us;1458us;753us;1458us;759us;1458us;806us;967us;809us;1458us;813us;1458us;823us;1458us;899us;967us;901us;967us;902us;967us;906us;967us;907us;967us;910us;967us;912us;967us;913us;967us;922us;967us;926us;967us;927us;967us;929us;967us;931us;967us;934us;967us;936us;967us;941us;967us;945us;967us;947us;967us;949us;967us;957us;967us;960us;967us;971us;967us;979us;967us;1000us;967us;1002us;967us;1008us;967us;1009us;967us;1011us;967us;1012us;967us;1015us;967us;1017us;967us;1018us;967us;1024us;967us;1028us;967us;1030us;1458us;1036us;1458us;1052us;1458us;1054us;1458us;1057us;1458us;1060us;1458us;1078us;967us;1079us;1458us;1083us;967us;1084us;1458us;1090us;1458us;1093us;1458us;1096us;1458us;1102us;1458us;1106us;1458us;1110us;1458us;1116us;1458us;1118us;1458us;1123us;1458us;1125us;1458us;1127us;1458us;1129us;1458us;1131us;1458us;1133us;1458us;1135us;967us;1137us;1458us;1147us;1458us;1154us;1458us;1160us;1458us;1162us;1458us;1166us;967us;1167us;1458us;1171us;1458us;1173us;967us;1174us;1458us;1178us;1458us;1181us;1458us;1184us;1458us;1186us;1458us;1189us;1458us;1191us;1458us;1240us;1458us;1242us;1458us;1246us;1458us;1248us;1458us;1250us;1458us;1252us;1458us;1254us;1458us;1256us;1458us;1258us;1458us;1260us;1458us;1262us;1458us;1264us;1458us;1266us;1458us;1268us;1458us;1270us;1458us;1272us;1458us;1274us;1458us;1276us;1458us;1278us;1458us;1280us;1458us;1282us;1458us;1284us;1458us;1286us;1458us;1287us;1458us;1288us;1458us;1289us;1458us;1292us;1458us;1302us;1458us;1305us;967us;1307us;967us;1313us;967us;1320us;967us;1322us;967us;1327us;1458us;1328us;1458us;1332us;1458us;1334us;1458us;1337us;1458us;1338us;1458us;1340us;1458us;1343us;1458us;1345us;1458us;1347us;1458us;1349us;1458us;1351us;1458us;1352us;1458us;1353us;1458us;1354us;1458us;1356us;1458us;1357us;1458us;1359us;1458us;1360us;1458us;1362us;1458us;1363us;1458us;1365us;1458us;1366us;1458us;1368us;1458us;1369us;1458us;1371us;1458us;1372us;1458us;1378us;1458us;1379us;1458us;1386us;1458us;1388us;1458us;1390us;1458us;1391us;1458us;1392us;1458us;1395us;1458us;1400us;1458us;1408us;1458us;1409us;1458us;1412us;1458us;1413us;1458us;1431us;1458us;1438us;1458us;1445us;1458us;1452us;1458us;1469us;1458us;1476us;1458us;1477us;1458us;1483us;1458us;1489us;1458us;1490us;1458us;1491us;1458us;1503us;1458us;1509us;1458us;1519us;1458us;1532us;1458us;1534us;1458us;1537us;1458us;1538us;1458us;1544us;1458us;1559us;1458us;1564us;1458us;1569us;1458us;1594us;1458us;1627us;1458us;1634us;967us;1636us;1458us;1639us;967us;1641us;1458us;1651us;967us;1653us;967us;1864us;1458us;2021us;1458us;2025us;1458us;3us;65535us;419us;420us;424us;425us;806us;807us;3us;65535us;876us;871us;877us;872us;880us;872us;2us;65535us;877us;878us;880us;881us;1us;65535us;365us;366us;1us;65535us;365us;879us;14us;65535us;419us;867us;424us;867us;806us;867us;901us;888us;902us;889us;906us;890us;907us;891us;910us;892us;912us;893us;913us;894us;1078us;895us;1083us;896us;1166us;897us;1173us;898us;14us;65535us;419us;903us;424us;903us;806us;903us;901us;903us;902us;903us;906us;903us;907us;903us;910us;903us;912us;903us;913us;903us;1078us;903us;1083us;903us;1166us;903us;1173us;903us;14us;65535us;419us;904us;424us;904us;806us;904us;901us;904us;902us;904us;906us;904us;907us;904us;910us;904us;912us;904us;913us;904us;1078us;904us;1083us;904us;1166us;904us;1173us;904us;3us;65535us;916us;917us;918us;919us;941us;942us;3us;65535us;916us;914us;918us;914us;941us;914us;40us;65535us;419us;905us;424us;905us;806us;905us;899us;900us;901us;905us;902us;905us;906us;905us;907us;905us;910us;905us;912us;905us;913us;905us;922us;1010us;941us;1010us;957us;1010us;960us;1010us;971us;1010us;979us;1010us;1000us;1001us;1002us;1010us;1008us;1010us;1009us;1010us;1011us;1010us;1012us;1010us;1015us;1010us;1017us;1010us;1018us;1010us;1024us;1010us;1028us;1010us;1078us;905us;1083us;905us;1135us;1010us;1166us;905us;1173us;905us;1305us;1010us;1307us;1010us;1313us;1010us;1320us;1010us;1322us;1010us;1651us;1010us;1653us;1010us;6us;65535us;926us;933us;927us;928us;929us;930us;931us;932us;934us;935us;936us;937us;11us;65535us;926us;944us;927us;944us;929us;944us;931us;944us;934us;944us;936us;944us;945us;946us;947us;948us;949us;950us;1634us;1635us;1639us;1640us;52us;65535us;419us;940us;424us;940us;465us;466us;806us;940us;899us;940us;901us;940us;902us;940us;906us;940us;907us;940us;910us;940us;912us;940us;913us;940us;922us;940us;926us;945us;927us;945us;929us;945us;931us;945us;934us;945us;936us;945us;941us;940us;945us;945us;947us;945us;949us;945us;957us;940us;960us;940us;971us;940us;979us;940us;1000us;940us;1002us;940us;1008us;940us;1009us;940us;1011us;940us;1012us;940us;1015us;940us;1017us;940us;1018us;940us;1024us;940us;1028us;940us;1078us;940us;1083us;940us;1135us;940us;1166us;940us;1173us;940us;1305us;940us;1307us;940us;1313us;940us;1320us;940us;1322us;940us;1634us;945us;1639us;945us;1651us;940us;1653us;940us;2us;65535us;941us;972us;971us;972us;24us;65535us;922us;923us;941us;986us;957us;997us;960us;997us;971us;986us;979us;994us;1002us;987us;1008us;988us;1009us;989us;1011us;990us;1012us;991us;1015us;992us;1017us;993us;1018us;995us;1024us;996us;1028us;997us;1135us;998us;1305us;999us;1307us;999us;1313us;999us;1320us;999us;1322us;999us;1651us;999us;1653us;999us;24us;65535us;922us;1003us;941us;1003us;957us;1003us;960us;1003us;971us;1003us;979us;980us;1002us;1003us;1008us;1003us;1009us;1003us;1011us;1003us;1012us;1003us;1015us;1003us;1017us;1003us;1018us;1003us;1024us;1003us;1028us;1003us;1135us;1003us;1305us;1003us;1307us;1003us;1313us;1003us;1320us;1003us;1322us;1003us;1651us;1003us;1653us;1003us;24us;65535us;922us;1004us;941us;1004us;957us;1004us;960us;1004us;971us;1004us;979us;1004us;1002us;1004us;1008us;1004us;1009us;1004us;1011us;1004us;1012us;1004us;1015us;1004us;1017us;1004us;1018us;1004us;1024us;1004us;1028us;1004us;1135us;1004us;1305us;1004us;1307us;1004us;1313us;1004us;1320us;1004us;1322us;1004us;1651us;1004us;1653us;1004us;2us;65535us;952us;953us;1021us;1022us;2us;65535us;952us;1019us;1021us;1019us;3us;65535us;957us;958us;960us;961us;1028us;1029us;27us;65535us;274us;1094us;422us;423us;427us;428us;468us;469us;491us;492us;753us;754us;759us;760us;823us;824us;1060us;1094us;1079us;1080us;1084us;1085us;1093us;1094us;1096us;1097us;1116us;1117us;1137us;1138us;1147us;1148us;1154us;1155us;1167us;1168us;1171us;1172us;1174us;1175us;1178us;1179us;1184us;1185us;1186us;1187us;1292us;1293us;1334us;1335us;1338us;1339us;1636us;1637us;6us;65535us;1127us;1128us;1129us;1130us;1242us;1243us;1564us;1565us;1569us;1570us;1594us;1595us;5us;65535us;1110us;1111us;1191us;1192us;1328us;1329us;1532us;1533us;1641us;1642us;52us;65535us;6us;1049us;274us;1035us;422us;1035us;427us;1035us;468us;1035us;491us;1035us;753us;1035us;759us;1035us;809us;818us;813us;818us;823us;1035us;1030us;1031us;1036us;1037us;1057us;1058us;1060us;1035us;1079us;1035us;1084us;1035us;1090us;1091us;1093us;1035us;1096us;1035us;1102us;1103us;1106us;1107us;1110us;1041us;1116us;1035us;1137us;1035us;1147us;1035us;1154us;1035us;1167us;1035us;1171us;1035us;1174us;1035us;1178us;1035us;1181us;1182us;1184us;1035us;1186us;1035us;1191us;1041us;1292us;1035us;1302us;1303us;1328us;1041us;1334us;1035us;1338us;1035us;1445us;1450us;1452us;1453us;1469us;1470us;1476us;1478us;1477us;1478us;1489us;1511us;1490us;1511us;1491us;1511us;1509us;1510us;1532us;1041us;1636us;1035us;1641us;1041us;1us;65535us;6us;7us;57us;65535us;6us;1045us;274us;1045us;422us;1045us;427us;1045us;468us;1045us;491us;1045us;753us;1045us;759us;1045us;809us;1045us;813us;1045us;823us;1045us;1030us;1045us;1036us;1045us;1052us;1053us;1054us;1055us;1057us;1045us;1060us;1045us;1079us;1045us;1084us;1045us;1090us;1045us;1093us;1045us;1096us;1045us;1102us;1045us;1106us;1045us;1110us;1045us;1116us;1045us;1137us;1045us;1147us;1045us;1154us;1045us;1167us;1045us;1171us;1045us;1174us;1045us;1178us;1045us;1181us;1045us;1184us;1045us;1186us;1045us;1191us;1045us;1292us;1045us;1302us;1045us;1328us;1045us;1334us;1045us;1338us;1045us;1431us;1529us;1445us;1045us;1452us;1045us;1469us;1045us;1476us;1045us;1477us;1045us;1483us;1530us;1489us;1045us;1490us;1045us;1491us;1045us;1509us;1045us;1519us;1531us;1532us;1045us;1636us;1045us;1641us;1045us;196us;65535us;53us;56us;58us;60us;75us;78us;153us;155us;159us;161us;163us;165us;167us;169us;190us;192us;210us;212us;242us;245us;284us;285us;287us;289us;290us;292us;297us;299us;300us;302us;307us;309us;317us;2066us;319us;2066us;367us;370us;375us;378us;389us;2066us;395us;396us;399us;400us;426us;430us;442us;445us;446us;449us;465us;473us;467us;2066us;479us;485us;480us;484us;481us;483us;488us;496us;490us;2066us;497us;499us;522us;2066us;530us;532us;538us;540us;564us;565us;575us;577us;585us;587us;595us;600us;678us;680us;681us;687us;684us;686us;705us;707us;728us;734us;729us;733us;730us;732us;739us;742us;744us;746us;757us;768us;760us;768us;808us;812us;814us;816us;873us;875us;880us;887us;881us;884us;906us;2066us;907us;2066us;910us;2066us;920us;925us;921us;925us;922us;924us;941us;977us;971us;977us;972us;974us;979us;985us;980us;982us;998us;1159us;1005us;1007us;1011us;2066us;1012us;2066us;1015us;2066us;1023us;1026us;1024us;1025us;1031us;1033us;1046us;1048us;1085us;768us;1103us;1105us;1107us;1109us;1110us;1043us;1111us;1113us;1118us;1122us;1119us;1121us;1131us;1299us;1133us;1299us;1135us;2066us;1136us;2066us;1137us;2066us;1138us;2066us;1146us;1153us;1147us;1152us;1148us;1150us;1160us;1164us;1162us;1165us;1175us;768us;1187us;768us;1191us;1043us;1216us;1298us;1220us;1342us;1231us;1233us;1234us;1236us;1237us;1239us;1245us;1440us;1246us;2066us;1248us;2066us;1250us;2066us;1252us;2066us;1254us;2066us;1256us;2066us;1258us;2066us;1260us;2066us;1262us;2066us;1264us;2066us;1266us;2066us;1268us;2066us;1270us;2066us;1272us;2066us;1274us;2066us;1276us;2066us;1278us;2066us;1280us;2066us;1282us;2066us;1284us;2066us;1293us;1295us;1307us;1311us;1308us;1310us;1318us;1326us;1319us;1325us;1320us;1324us;1328us;1043us;1332us;1333us;1334us;1336us;1343us;2066us;1345us;2066us;1347us;2066us;1349us;2066us;1382us;1444us;1398us;1403us;1399us;1403us;1400us;1402us;1419us;1444us;1422us;1444us;1431us;1436us;1432us;1434us;1452us;1457us;1453us;1455us;1470us;1472us;1476us;1482us;1477us;1482us;1478us;1480us;1483us;1488us;1484us;1486us;1489us;1502us;1490us;1502us;1491us;1502us;1493us;2060us;1519us;1524us;1520us;1522us;1532us;1043us;1534us;2066us;1564us;1568us;1593us;2066us;1594us;2066us;1627us;1632us;1628us;1630us;1641us;1044us;1642us;1644us;1660us;1662us;1664us;1666us;1668us;1670us;1674us;1676us;1681us;1683us;1686us;1688us;1690us;1692us;1695us;1697us;1700us;1702us;1706us;1708us;1714us;1716us;1719us;1721us;1722us;1724us;1726us;1728us;1731us;1733us;1746us;1860us;1830us;1883us;1849us;1852us;1850us;1852us;1854us;1861us;1855us;1859us;1856us;1858us;1873us;2066us;1878us;1889us;1880us;2066us;1885us;2066us;1926us;2066us;1976us;2066us;4us;65535us;1081us;1082us;1087us;1088us;1170us;1171us;1177us;1178us;116us;65535us;6us;1051us;31us;32us;114us;115us;116us;117us;237us;252us;251us;252us;274us;1051us;422us;1051us;427us;1051us;468us;1051us;491us;1051us;753us;1051us;759us;1051us;809us;1051us;813us;1051us;823us;1051us;1030us;1051us;1036us;1051us;1052us;1051us;1054us;1051us;1057us;1051us;1060us;1051us;1079us;1051us;1084us;1051us;1090us;1051us;1093us;1051us;1096us;1051us;1102us;1051us;1106us;1051us;1110us;1051us;1116us;1051us;1118us;1119us;1123us;1124us;1125us;1126us;1127us;1040us;1129us;1040us;1131us;1216us;1133us;1216us;1137us;1051us;1147us;1051us;1154us;1051us;1160us;1161us;1162us;1163us;1167us;1051us;1171us;1051us;1174us;1051us;1178us;1051us;1181us;1051us;1184us;1051us;1186us;1051us;1189us;1190us;1191us;1051us;1240us;1193us;1242us;1040us;1246us;1194us;1248us;1195us;1250us;1196us;1252us;1197us;1254us;1198us;1256us;1199us;1258us;1200us;1260us;1201us;1262us;1202us;1264us;1203us;1266us;1204us;1268us;1205us;1270us;1206us;1272us;1207us;1274us;1208us;1276us;1209us;1278us;1210us;1280us;1211us;1282us;1212us;1284us;1213us;1286us;1214us;1287us;1215us;1288us;1215us;1289us;1215us;1292us;1051us;1302us;1051us;1327us;1217us;1328us;1051us;1332us;1218us;1334us;1051us;1337us;1219us;1338us;1051us;1340us;1220us;1343us;1221us;1345us;1222us;1347us;1223us;1349us;1225us;1431us;1051us;1438us;1224us;1445us;1051us;1452us;1051us;1469us;1051us;1476us;1051us;1477us;1051us;1483us;1051us;1489us;1051us;1490us;1051us;1491us;1051us;1503us;1226us;1509us;1051us;1519us;1051us;1532us;1051us;1534us;1227us;1537us;1228us;1538us;1229us;1564us;1040us;1569us;1040us;1594us;1040us;1636us;1051us;1641us;1051us;2021us;1230us;2025us;1230us;2us;65535us;1131us;1132us;1133us;1134us;1us;65535us;1427us;1428us;4us;65535us;1103us;1104us;1107us;1108us;1111us;1112us;1114us;1115us;4us;65535us;1305us;1306us;1307us;1308us;1651us;1652us;1653us;1654us;7us;65535us;1305us;1318us;1307us;1318us;1313us;1318us;1320us;1318us;1322us;1318us;1651us;1318us;1653us;1318us;7us;65535us;1305us;1312us;1307us;1312us;1313us;1314us;1320us;1321us;1322us;1323us;1651us;1312us;1653us;1312us;1us;65535us;999us;1317us;1us;65535us;1318us;1319us;2us;65535us;1119us;1120us;1220us;1341us;2us;65535us;1119us;1330us;1220us;1330us;1us;65535us;1330us;1331us;116us;65535us;6us;1244us;31us;1244us;114us;1244us;116us;1244us;237us;1244us;251us;1244us;274us;1244us;422us;1244us;427us;1244us;468us;1244us;491us;1244us;753us;1244us;759us;1244us;809us;1244us;813us;1244us;823us;1244us;1030us;1244us;1036us;1244us;1052us;1244us;1054us;1244us;1057us;1244us;1060us;1244us;1079us;1244us;1084us;1244us;1090us;1244us;1093us;1244us;1096us;1244us;1102us;1244us;1106us;1244us;1110us;1244us;1116us;1244us;1118us;1244us;1123us;1244us;1125us;1244us;1127us;1244us;1129us;1244us;1131us;1244us;1133us;1244us;1137us;1244us;1147us;1244us;1154us;1244us;1160us;1244us;1162us;1244us;1167us;1244us;1171us;1244us;1174us;1244us;1178us;1244us;1181us;1244us;1184us;1244us;1186us;1244us;1189us;1244us;1191us;1244us;1240us;1244us;1242us;1244us;1246us;1244us;1248us;1244us;1250us;1244us;1252us;1244us;1254us;1244us;1256us;1244us;1258us;1244us;1260us;1244us;1262us;1244us;1264us;1244us;1266us;1244us;1268us;1244us;1270us;1244us;1272us;1244us;1274us;1244us;1276us;1244us;1278us;1244us;1280us;1244us;1282us;1244us;1284us;1244us;1286us;1244us;1287us;1244us;1288us;1244us;1289us;1244us;1292us;1244us;1302us;1244us;1327us;1244us;1328us;1244us;1332us;1244us;1334us;1244us;1337us;1244us;1338us;1244us;1340us;1244us;1343us;1244us;1345us;1244us;1347us;1244us;1349us;1244us;1431us;1244us;1438us;1245us;1445us;1244us;1452us;1244us;1469us;1244us;1476us;1244us;1477us;1244us;1483us;1244us;1489us;1244us;1490us;1244us;1491us;1244us;1503us;1244us;1509us;1244us;1519us;1244us;1532us;1244us;1534us;1244us;1537us;1244us;1538us;1244us;1564us;1244us;1569us;1244us;1594us;1244us;1636us;1244us;1641us;1244us;2021us;1244us;2025us;1244us;134us;65535us;6us;1241us;31us;1241us;114us;1241us;116us;1241us;237us;1241us;251us;1241us;274us;1241us;422us;1241us;427us;1241us;468us;1241us;491us;1241us;753us;1241us;759us;1241us;809us;1241us;813us;1241us;823us;1241us;1030us;1241us;1036us;1241us;1052us;1241us;1054us;1241us;1057us;1241us;1060us;1241us;1079us;1241us;1084us;1241us;1090us;1241us;1093us;1241us;1096us;1241us;1102us;1241us;1106us;1241us;1110us;1241us;1116us;1241us;1118us;1241us;1123us;1241us;1125us;1241us;1127us;1241us;1129us;1241us;1131us;1241us;1133us;1241us;1137us;1241us;1147us;1241us;1154us;1241us;1160us;1241us;1162us;1241us;1167us;1241us;1171us;1241us;1174us;1241us;1178us;1241us;1181us;1241us;1184us;1241us;1186us;1241us;1189us;1241us;1191us;1241us;1240us;1241us;1242us;1241us;1246us;1241us;1248us;1241us;1250us;1241us;1252us;1241us;1254us;1241us;1256us;1241us;1258us;1241us;1260us;1241us;1262us;1241us;1264us;1241us;1266us;1241us;1268us;1241us;1270us;1241us;1272us;1241us;1274us;1241us;1276us;1241us;1278us;1241us;1280us;1241us;1282us;1241us;1284us;1241us;1286us;1241us;1287us;1241us;1288us;1241us;1289us;1241us;1292us;1241us;1302us;1241us;1327us;1241us;1328us;1241us;1332us;1241us;1334us;1241us;1337us;1241us;1338us;1241us;1340us;1241us;1343us;1241us;1345us;1241us;1347us;1241us;1349us;1241us;1351us;1355us;1352us;1355us;1353us;1355us;1354us;1355us;1356us;1358us;1357us;1358us;1359us;1361us;1360us;1361us;1362us;1364us;1363us;1364us;1365us;1367us;1366us;1367us;1368us;1370us;1369us;1370us;1371us;1373us;1372us;1373us;1386us;1387us;1388us;1389us;1431us;1241us;1438us;1241us;1445us;1241us;1452us;1241us;1469us;1241us;1476us;1241us;1477us;1241us;1483us;1241us;1489us;1241us;1490us;1241us;1491us;1241us;1503us;1241us;1509us;1241us;1519us;1241us;1532us;1241us;1534us;1241us;1537us;1241us;1538us;1241us;1564us;1241us;1569us;1241us;1594us;1241us;1636us;1241us;1641us;1241us;2021us;1241us;2025us;1241us;135us;65535us;6us;1390us;31us;1390us;114us;1390us;116us;1390us;237us;1390us;251us;1390us;274us;1390us;422us;1390us;427us;1390us;468us;1390us;491us;1390us;753us;1390us;759us;1390us;809us;1390us;813us;1390us;823us;1390us;1030us;1390us;1036us;1390us;1052us;1390us;1054us;1390us;1057us;1390us;1060us;1390us;1079us;1390us;1084us;1390us;1090us;1390us;1093us;1390us;1096us;1390us;1102us;1390us;1106us;1390us;1110us;1390us;1116us;1390us;1118us;1390us;1123us;1390us;1125us;1390us;1127us;1390us;1129us;1390us;1131us;1390us;1133us;1390us;1137us;1390us;1147us;1390us;1154us;1390us;1160us;1390us;1162us;1390us;1167us;1390us;1171us;1390us;1174us;1390us;1178us;1390us;1181us;1390us;1184us;1390us;1186us;1390us;1189us;1390us;1191us;1390us;1240us;1390us;1242us;1390us;1246us;1390us;1248us;1390us;1250us;1390us;1252us;1390us;1254us;1390us;1256us;1390us;1258us;1390us;1260us;1390us;1262us;1390us;1264us;1390us;1266us;1390us;1268us;1390us;1270us;1390us;1272us;1390us;1274us;1390us;1276us;1390us;1278us;1390us;1280us;1390us;1282us;1390us;1284us;1390us;1286us;1390us;1287us;1390us;1288us;1390us;1289us;1390us;1292us;1390us;1302us;1390us;1327us;1390us;1328us;1390us;1332us;1390us;1334us;1390us;1337us;1390us;1338us;1390us;1340us;1390us;1343us;1390us;1345us;1390us;1347us;1390us;1349us;1390us;1351us;1390us;1352us;1390us;1353us;1390us;1354us;1390us;1356us;1390us;1357us;1390us;1359us;1390us;1360us;1390us;1362us;1390us;1363us;1390us;1365us;1390us;1366us;1390us;1368us;1390us;1369us;1390us;1371us;1390us;1372us;1390us;1386us;1390us;1388us;1390us;1431us;1390us;1438us;1390us;1445us;1390us;1452us;1390us;1469us;1390us;1476us;1390us;1477us;1390us;1483us;1390us;1489us;1390us;1490us;1390us;1491us;1390us;1503us;1390us;1509us;1390us;1519us;1391us;1532us;1390us;1534us;1390us;1537us;1390us;1538us;1390us;1564us;1390us;1569us;1390us;1594us;1390us;1627us;1392us;1636us;1390us;1641us;1390us;2021us;1390us;2025us;1390us;4us;65535us;1390us;1393us;1391us;1393us;1392us;1393us;1544us;1547us;148us;65535us;6us;1394us;31us;1394us;114us;1394us;116us;1394us;237us;1394us;251us;1394us;274us;1394us;422us;1394us;427us;1394us;468us;1394us;491us;1394us;690us;691us;701us;702us;753us;1394us;759us;1394us;809us;1394us;813us;1394us;823us;1394us;1030us;1394us;1036us;1394us;1052us;1394us;1054us;1394us;1057us;1394us;1060us;1394us;1079us;1394us;1084us;1394us;1090us;1394us;1093us;1394us;1096us;1394us;1102us;1394us;1106us;1394us;1110us;1394us;1116us;1394us;1118us;1394us;1123us;1394us;1125us;1394us;1127us;1394us;1129us;1394us;1131us;1394us;1133us;1394us;1137us;1394us;1147us;1394us;1154us;1394us;1160us;1394us;1162us;1394us;1167us;1394us;1171us;1394us;1174us;1394us;1178us;1394us;1181us;1394us;1184us;1394us;1186us;1394us;1189us;1394us;1191us;1394us;1240us;1394us;1242us;1394us;1246us;1394us;1248us;1394us;1250us;1394us;1252us;1394us;1254us;1394us;1256us;1394us;1258us;1394us;1260us;1394us;1262us;1394us;1264us;1394us;1266us;1394us;1268us;1394us;1270us;1394us;1272us;1394us;1274us;1394us;1276us;1394us;1278us;1394us;1280us;1394us;1282us;1394us;1284us;1394us;1286us;1394us;1287us;1394us;1288us;1394us;1289us;1394us;1292us;1394us;1302us;1394us;1327us;1394us;1328us;1394us;1332us;1394us;1334us;1394us;1337us;1394us;1338us;1394us;1340us;1394us;1343us;1394us;1345us;1394us;1347us;1394us;1349us;1394us;1351us;1394us;1352us;1394us;1353us;1394us;1354us;1394us;1356us;1394us;1357us;1394us;1359us;1394us;1360us;1394us;1362us;1394us;1363us;1394us;1365us;1394us;1366us;1394us;1368us;1394us;1369us;1394us;1371us;1394us;1372us;1394us;1386us;1394us;1388us;1394us;1390us;1397us;1391us;1397us;1392us;1397us;1395us;1396us;1400us;1401us;1408us;1404us;1409us;1405us;1412us;1406us;1413us;1406us;1431us;1394us;1438us;1394us;1445us;1394us;1452us;1394us;1469us;1394us;1476us;1394us;1477us;1394us;1483us;1394us;1489us;1394us;1490us;1394us;1491us;1394us;1503us;1394us;1509us;1394us;1519us;1394us;1532us;1394us;1534us;1394us;1537us;1394us;1538us;1394us;1544us;1397us;1564us;1394us;1569us;1394us;1594us;1394us;1627us;1394us;1636us;1394us;1641us;1394us;1864us;1407us;2021us;1394us;2025us;1394us;3us;65535us;1382us;1383us;1419us;1420us;1422us;1423us;155us;65535us;6us;1441us;31us;1441us;114us;1441us;116us;1441us;237us;1441us;251us;1441us;274us;1441us;331us;1548us;335us;1548us;340us;1548us;422us;1441us;427us;1441us;468us;1441us;491us;1441us;525us;526us;690us;1441us;701us;1441us;753us;1441us;759us;1441us;809us;1441us;813us;1441us;823us;1441us;1030us;1441us;1036us;1441us;1052us;1441us;1054us;1441us;1057us;1441us;1060us;1441us;1079us;1441us;1084us;1441us;1090us;1441us;1093us;1441us;1096us;1441us;1102us;1441us;1106us;1441us;1110us;1441us;1116us;1441us;1118us;1441us;1123us;1441us;1125us;1441us;1127us;1441us;1129us;1441us;1131us;1441us;1133us;1441us;1137us;1441us;1147us;1441us;1154us;1441us;1160us;1441us;1162us;1441us;1167us;1441us;1171us;1441us;1174us;1441us;1178us;1441us;1181us;1441us;1184us;1441us;1186us;1441us;1189us;1441us;1191us;1441us;1240us;1441us;1242us;1441us;1246us;1441us;1248us;1441us;1250us;1441us;1252us;1441us;1254us;1441us;1256us;1441us;1258us;1441us;1260us;1441us;1262us;1441us;1264us;1441us;1266us;1441us;1268us;1441us;1270us;1441us;1272us;1441us;1274us;1441us;1276us;1441us;1278us;1441us;1280us;1441us;1282us;1441us;1284us;1441us;1286us;1441us;1287us;1441us;1288us;1441us;1289us;1441us;1292us;1441us;1302us;1441us;1327us;1441us;1328us;1441us;1332us;1441us;1334us;1441us;1337us;1441us;1338us;1441us;1340us;1441us;1343us;1441us;1345us;1441us;1347us;1441us;1349us;1441us;1351us;1441us;1352us;1441us;1353us;1441us;1354us;1441us;1356us;1441us;1357us;1441us;1359us;1441us;1360us;1441us;1362us;1441us;1363us;1441us;1365us;1441us;1366us;1441us;1368us;1441us;1369us;1441us;1371us;1441us;1372us;1441us;1378us;1380us;1379us;1381us;1386us;1441us;1388us;1441us;1390us;1441us;1391us;1441us;1392us;1441us;1395us;1441us;1400us;1441us;1408us;1441us;1409us;1441us;1412us;1441us;1413us;1441us;1431us;1441us;1438us;1441us;1445us;1441us;1452us;1441us;1469us;1441us;1476us;1441us;1477us;1441us;1483us;1441us;1489us;1441us;1490us;1441us;1491us;1441us;1503us;1441us;1509us;1441us;1519us;1441us;1532us;1441us;1534us;1441us;1537us;1441us;1538us;1441us;1544us;1441us;1559us;1548us;1564us;1441us;1569us;1441us;1594us;1441us;1627us;1441us;1636us;1441us;1641us;1441us;1864us;1441us;2021us;1441us;2025us;1441us;155us;65535us;6us;1468us;31us;1468us;114us;1468us;116us;1468us;237us;1468us;251us;1468us;274us;1468us;331us;1468us;335us;1468us;340us;1468us;422us;1468us;427us;1468us;468us;1468us;491us;1468us;525us;1468us;690us;1468us;701us;1468us;753us;1468us;759us;1468us;809us;1468us;813us;1468us;823us;1468us;1030us;1468us;1036us;1468us;1052us;1468us;1054us;1468us;1057us;1468us;1060us;1468us;1079us;1468us;1084us;1468us;1090us;1468us;1093us;1468us;1096us;1468us;1102us;1468us;1106us;1468us;1110us;1468us;1116us;1468us;1118us;1468us;1123us;1468us;1125us;1468us;1127us;1468us;1129us;1468us;1131us;1468us;1133us;1468us;1137us;1468us;1147us;1468us;1154us;1468us;1160us;1468us;1162us;1468us;1167us;1468us;1171us;1468us;1174us;1468us;1178us;1468us;1181us;1468us;1184us;1468us;1186us;1468us;1189us;1468us;1191us;1468us;1240us;1468us;1242us;1468us;1246us;1468us;1248us;1468us;1250us;1468us;1252us;1468us;1254us;1468us;1256us;1468us;1258us;1468us;1260us;1468us;1262us;1468us;1264us;1468us;1266us;1468us;1268us;1468us;1270us;1468us;1272us;1468us;1274us;1468us;1276us;1468us;1278us;1468us;1280us;1468us;1282us;1468us;1284us;1468us;1286us;1468us;1287us;1468us;1288us;1468us;1289us;1468us;1292us;1468us;1302us;1468us;1327us;1468us;1328us;1468us;1332us;1468us;1334us;1468us;1337us;1468us;1338us;1468us;1340us;1468us;1343us;1468us;1345us;1468us;1347us;1468us;1349us;1468us;1351us;1468us;1352us;1468us;1353us;1468us;1354us;1468us;1356us;1468us;1357us;1468us;1359us;1468us;1360us;1468us;1362us;1468us;1363us;1468us;1365us;1468us;1366us;1468us;1368us;1468us;1369us;1468us;1371us;1468us;1372us;1468us;1378us;1468us;1379us;1468us;1386us;1468us;1388us;1468us;1390us;1468us;1391us;1468us;1392us;1468us;1395us;1468us;1400us;1468us;1408us;1468us;1409us;1468us;1412us;1468us;1413us;1468us;1431us;1468us;1438us;1468us;1445us;1468us;1452us;1468us;1469us;1468us;1476us;1468us;1477us;1468us;1483us;1468us;1489us;1468us;1490us;1468us;1491us;1468us;1503us;1468us;1509us;1468us;1519us;1468us;1532us;1468us;1534us;1468us;1537us;1468us;1538us;1468us;1544us;1468us;1559us;1468us;1564us;1468us;1569us;1468us;1594us;1468us;1627us;1468us;1636us;1468us;1641us;1468us;1864us;1468us;2021us;1468us;2025us;1468us;207us;65535us;6us;1466us;31us;1466us;114us;1466us;116us;1466us;237us;1466us;251us;1466us;274us;1466us;331us;1466us;335us;1466us;340us;1466us;419us;951us;422us;1466us;424us;951us;427us;1466us;465us;951us;468us;1466us;491us;1466us;525us;1466us;690us;1466us;701us;1466us;753us;1466us;759us;1466us;806us;951us;809us;1466us;813us;1466us;823us;1466us;899us;951us;901us;951us;902us;951us;906us;951us;907us;951us;910us;951us;912us;951us;913us;951us;922us;951us;926us;951us;927us;951us;929us;951us;931us;951us;934us;951us;936us;951us;941us;951us;945us;951us;947us;951us;949us;951us;957us;951us;960us;951us;971us;951us;979us;951us;1000us;951us;1002us;951us;1008us;951us;1009us;951us;1011us;951us;1012us;951us;1015us;951us;1017us;951us;1018us;951us;1024us;951us;1028us;951us;1030us;1466us;1036us;1466us;1052us;1466us;1054us;1466us;1057us;1466us;1060us;1466us;1078us;951us;1079us;1466us;1083us;951us;1084us;1466us;1090us;1466us;1093us;1466us;1096us;1466us;1102us;1466us;1106us;1466us;1110us;1466us;1116us;1466us;1118us;1466us;1123us;1466us;1125us;1466us;1127us;1466us;1129us;1466us;1131us;1466us;1133us;1466us;1135us;951us;1137us;1466us;1147us;1466us;1154us;1466us;1160us;1466us;1162us;1466us;1166us;951us;1167us;1466us;1171us;1466us;1173us;951us;1174us;1466us;1178us;1466us;1181us;1466us;1184us;1466us;1186us;1466us;1189us;1466us;1191us;1466us;1240us;1466us;1242us;1466us;1246us;1466us;1248us;1466us;1250us;1466us;1252us;1466us;1254us;1466us;1256us;1466us;1258us;1466us;1260us;1466us;1262us;1466us;1264us;1466us;1266us;1466us;1268us;1466us;1270us;1466us;1272us;1466us;1274us;1466us;1276us;1466us;1278us;1466us;1280us;1466us;1282us;1466us;1284us;1466us;1286us;1466us;1287us;1466us;1288us;1466us;1289us;1466us;1292us;1466us;1302us;1466us;1305us;951us;1307us;951us;1313us;951us;1320us;951us;1322us;951us;1327us;1466us;1328us;1466us;1332us;1466us;1334us;1466us;1337us;1466us;1338us;1466us;1340us;1466us;1343us;1466us;1345us;1466us;1347us;1466us;1349us;1466us;1351us;1466us;1352us;1466us;1353us;1466us;1354us;1466us;1356us;1466us;1357us;1466us;1359us;1466us;1360us;1466us;1362us;1466us;1363us;1466us;1365us;1466us;1366us;1466us;1368us;1466us;1369us;1466us;1371us;1466us;1372us;1466us;1378us;1466us;1379us;1466us;1386us;1466us;1388us;1466us;1390us;1466us;1391us;1466us;1392us;1466us;1395us;1466us;1400us;1466us;1408us;1466us;1409us;1466us;1412us;1466us;1413us;1466us;1431us;1466us;1438us;1466us;1445us;1466us;1452us;1466us;1469us;1466us;1476us;1466us;1477us;1466us;1483us;1466us;1489us;1466us;1490us;1466us;1491us;1466us;1503us;1466us;1509us;1466us;1519us;1466us;1532us;1466us;1534us;1466us;1537us;1466us;1538us;1466us;1544us;1466us;1559us;1466us;1564us;1466us;1569us;1466us;1594us;1466us;1627us;1466us;1634us;951us;1636us;1466us;1639us;951us;1641us;1466us;1651us;951us;1653us;951us;1864us;1466us;2021us;1466us;2025us;1466us;155us;65535us;6us;1467us;31us;1467us;114us;1467us;116us;1467us;237us;1467us;251us;1467us;274us;1467us;331us;1467us;335us;1467us;340us;1467us;422us;1467us;427us;1467us;468us;1467us;491us;1467us;525us;1467us;690us;1467us;701us;1467us;753us;1467us;759us;1467us;809us;1467us;813us;1467us;823us;1467us;1030us;1467us;1036us;1467us;1052us;1467us;1054us;1467us;1057us;1467us;1060us;1467us;1079us;1467us;1084us;1467us;1090us;1467us;1093us;1467us;1096us;1467us;1102us;1467us;1106us;1467us;1110us;1467us;1116us;1467us;1118us;1467us;1123us;1467us;1125us;1467us;1127us;1467us;1129us;1467us;1131us;1467us;1133us;1467us;1137us;1467us;1147us;1467us;1154us;1467us;1160us;1467us;1162us;1467us;1167us;1467us;1171us;1467us;1174us;1467us;1178us;1467us;1181us;1467us;1184us;1467us;1186us;1467us;1189us;1467us;1191us;1467us;1240us;1467us;1242us;1467us;1246us;1467us;1248us;1467us;1250us;1467us;1252us;1467us;1254us;1467us;1256us;1467us;1258us;1467us;1260us;1467us;1262us;1467us;1264us;1467us;1266us;1467us;1268us;1467us;1270us;1467us;1272us;1467us;1274us;1467us;1276us;1467us;1278us;1467us;1280us;1467us;1282us;1467us;1284us;1467us;1286us;1467us;1287us;1467us;1288us;1467us;1289us;1467us;1292us;1467us;1302us;1467us;1327us;1467us;1328us;1467us;1332us;1467us;1334us;1467us;1337us;1467us;1338us;1467us;1340us;1467us;1343us;1467us;1345us;1467us;1347us;1467us;1349us;1467us;1351us;1467us;1352us;1467us;1353us;1467us;1354us;1467us;1356us;1467us;1357us;1467us;1359us;1467us;1360us;1467us;1362us;1467us;1363us;1467us;1365us;1467us;1366us;1467us;1368us;1467us;1369us;1467us;1371us;1467us;1372us;1467us;1378us;1467us;1379us;1467us;1386us;1467us;1388us;1467us;1390us;1467us;1391us;1467us;1392us;1467us;1395us;1467us;1400us;1467us;1408us;1467us;1409us;1467us;1412us;1467us;1413us;1467us;1431us;1467us;1438us;1467us;1445us;1467us;1452us;1467us;1469us;1467us;1476us;1467us;1477us;1467us;1483us;1467us;1489us;1467us;1490us;1467us;1491us;1467us;1503us;1467us;1509us;1467us;1519us;1467us;1532us;1467us;1534us;1467us;1537us;1467us;1538us;1467us;1544us;1467us;1559us;1467us;1564us;1467us;1569us;1467us;1594us;1467us;1627us;1467us;1636us;1467us;1641us;1467us;1864us;1467us;2021us;1467us;2025us;1467us;155us;65535us;6us;1459us;31us;1459us;114us;1459us;116us;1459us;237us;1459us;251us;1459us;274us;1459us;331us;1459us;335us;1459us;340us;1459us;422us;1459us;427us;1459us;468us;1459us;491us;1459us;525us;1459us;690us;1459us;701us;1459us;753us;1459us;759us;1459us;809us;1459us;813us;1459us;823us;1459us;1030us;1459us;1036us;1459us;1052us;1459us;1054us;1459us;1057us;1459us;1060us;1459us;1079us;1459us;1084us;1459us;1090us;1459us;1093us;1459us;1096us;1459us;1102us;1459us;1106us;1459us;1110us;1459us;1116us;1459us;1118us;1459us;1123us;1459us;1125us;1459us;1127us;1459us;1129us;1459us;1131us;1459us;1133us;1459us;1137us;1459us;1147us;1459us;1154us;1459us;1160us;1459us;1162us;1459us;1167us;1459us;1171us;1459us;1174us;1459us;1178us;1459us;1181us;1459us;1184us;1459us;1186us;1459us;1189us;1459us;1191us;1459us;1240us;1459us;1242us;1459us;1246us;1459us;1248us;1459us;1250us;1459us;1252us;1459us;1254us;1459us;1256us;1459us;1258us;1459us;1260us;1459us;1262us;1459us;1264us;1459us;1266us;1459us;1268us;1459us;1270us;1459us;1272us;1459us;1274us;1459us;1276us;1459us;1278us;1459us;1280us;1459us;1282us;1459us;1284us;1459us;1286us;1459us;1287us;1459us;1288us;1459us;1289us;1459us;1292us;1459us;1302us;1459us;1327us;1459us;1328us;1459us;1332us;1459us;1334us;1459us;1337us;1459us;1338us;1459us;1340us;1459us;1343us;1459us;1345us;1459us;1347us;1459us;1349us;1459us;1351us;1459us;1352us;1459us;1353us;1459us;1354us;1459us;1356us;1459us;1357us;1459us;1359us;1459us;1360us;1459us;1362us;1459us;1363us;1459us;1365us;1459us;1366us;1459us;1368us;1459us;1369us;1459us;1371us;1459us;1372us;1459us;1378us;1459us;1379us;1459us;1386us;1459us;1388us;1459us;1390us;1459us;1391us;1459us;1392us;1459us;1395us;1459us;1400us;1459us;1408us;1459us;1409us;1459us;1412us;1459us;1413us;1459us;1431us;1459us;1438us;1459us;1445us;1459us;1452us;1459us;1469us;1459us;1476us;1459us;1477us;1459us;1483us;1459us;1489us;1459us;1490us;1459us;1491us;1459us;1503us;1459us;1509us;1459us;1519us;1459us;1532us;1459us;1534us;1459us;1537us;1459us;1538us;1459us;1544us;1459us;1559us;1459us;1564us;1459us;1569us;1459us;1594us;1459us;1627us;1459us;1636us;1459us;1641us;1459us;1864us;1459us;2021us;1459us;2025us;1459us;3us;65535us;1489us;1493us;1490us;1493us;1491us;1493us;3us;65535us;1489us;1505us;1490us;1505us;1491us;1505us;1us;65535us;1490us;1515us;155us;65535us;6us;1460us;31us;1460us;114us;1460us;116us;1460us;237us;1460us;251us;1460us;274us;1460us;331us;1460us;335us;1460us;340us;1460us;422us;1460us;427us;1460us;468us;1460us;491us;1460us;525us;1460us;690us;1460us;701us;1460us;753us;1460us;759us;1460us;809us;1460us;813us;1460us;823us;1460us;1030us;1460us;1036us;1460us;1052us;1460us;1054us;1460us;1057us;1460us;1060us;1460us;1079us;1460us;1084us;1460us;1090us;1460us;1093us;1460us;1096us;1460us;1102us;1460us;1106us;1460us;1110us;1460us;1116us;1460us;1118us;1460us;1123us;1460us;1125us;1460us;1127us;1460us;1129us;1460us;1131us;1460us;1133us;1460us;1137us;1460us;1147us;1460us;1154us;1460us;1160us;1460us;1162us;1460us;1167us;1460us;1171us;1460us;1174us;1460us;1178us;1460us;1181us;1460us;1184us;1460us;1186us;1460us;1189us;1460us;1191us;1460us;1240us;1460us;1242us;1460us;1246us;1460us;1248us;1460us;1250us;1460us;1252us;1460us;1254us;1460us;1256us;1460us;1258us;1460us;1260us;1460us;1262us;1460us;1264us;1460us;1266us;1460us;1268us;1460us;1270us;1460us;1272us;1460us;1274us;1460us;1276us;1460us;1278us;1460us;1280us;1460us;1282us;1460us;1284us;1460us;1286us;1460us;1287us;1460us;1288us;1460us;1289us;1460us;1292us;1460us;1302us;1460us;1327us;1460us;1328us;1460us;1332us;1460us;1334us;1460us;1337us;1460us;1338us;1460us;1340us;1460us;1343us;1460us;1345us;1460us;1347us;1460us;1349us;1460us;1351us;1460us;1352us;1460us;1353us;1460us;1354us;1460us;1356us;1460us;1357us;1460us;1359us;1460us;1360us;1460us;1362us;1460us;1363us;1460us;1365us;1460us;1366us;1460us;1368us;1460us;1369us;1460us;1371us;1460us;1372us;1460us;1378us;1460us;1379us;1460us;1386us;1460us;1388us;1460us;1390us;1460us;1391us;1460us;1392us;1460us;1395us;1460us;1400us;1460us;1408us;1460us;1409us;1460us;1412us;1460us;1413us;1460us;1431us;1460us;1438us;1460us;1445us;1460us;1452us;1460us;1469us;1460us;1476us;1460us;1477us;1460us;1483us;1460us;1489us;1460us;1490us;1460us;1491us;1460us;1503us;1460us;1509us;1460us;1519us;1460us;1532us;1460us;1534us;1460us;1537us;1460us;1538us;1460us;1544us;1460us;1559us;1460us;1564us;1460us;1569us;1460us;1594us;1460us;1627us;1460us;1636us;1460us;1641us;1460us;1864us;1460us;2021us;1460us;2025us;1460us;1us;65535us;1519us;1520us;1us;65535us;1431us;1432us;1us;65535us;1483us;1484us;1us;65535us;1519us;1528us;1us;65535us;1144us;1145us;1us;65535us;1135us;1136us;1us;65535us;1135us;1146us;1us;65535us;1228us;1538us;3us;65535us;1489us;1512us;1490us;1512us;1491us;1512us;1us;65535us;1543us;1544us;4us;65535us;331us;332us;335us;336us;340us;341us;1559us;1560us;1us;65535us;1542us;1543us;1us;65535us;1544us;1545us;1us;65535us;1519us;1526us;2us;65535us;1519us;1563us;1627us;1628us;6us;65535us;1561us;1562us;1566us;1567us;1571us;1572us;1575us;1576us;1577us;1578us;1581us;1582us;6us;65535us;1561us;1585us;1566us;1585us;1571us;1585us;1575us;1585us;1577us;1584us;1581us;1585us;3us;65535us;1573us;1593us;1577us;1593us;1585us;1593us;5us;65535us;1560us;1561us;1565us;1566us;1570us;1571us;1574us;1575us;1580us;1581us;3us;65535us;1573us;1574us;1577us;1580us;1585us;1592us;1us;65535us;1519us;1527us;1us;65535us;1519us;1598us;1us;65535us;1620us;1621us;2us;65535us;1598us;1599us;1620us;1605us;1us;65535us;1602us;1603us;4us;65535us;1600us;1601us;1613us;1614us;1615us;1616us;1617us;1618us;5us;65535us;1600us;1615us;1602us;1613us;1613us;1615us;1615us;1615us;1617us;1615us;155us;65535us;6us;1461us;31us;1461us;114us;1461us;116us;1461us;237us;1461us;251us;1461us;274us;1461us;331us;1461us;335us;1461us;340us;1461us;422us;1461us;427us;1461us;468us;1461us;491us;1461us;525us;1461us;690us;1461us;701us;1461us;753us;1461us;759us;1461us;809us;1461us;813us;1461us;823us;1461us;1030us;1461us;1036us;1461us;1052us;1461us;1054us;1461us;1057us;1461us;1060us;1461us;1079us;1461us;1084us;1461us;1090us;1461us;1093us;1461us;1096us;1461us;1102us;1461us;1106us;1461us;1110us;1461us;1116us;1461us;1118us;1461us;1123us;1461us;1125us;1461us;1127us;1461us;1129us;1461us;1131us;1461us;1133us;1461us;1137us;1461us;1147us;1461us;1154us;1461us;1160us;1461us;1162us;1461us;1167us;1461us;1171us;1461us;1174us;1461us;1178us;1461us;1181us;1461us;1184us;1461us;1186us;1461us;1189us;1461us;1191us;1461us;1240us;1461us;1242us;1461us;1246us;1461us;1248us;1461us;1250us;1461us;1252us;1461us;1254us;1461us;1256us;1461us;1258us;1461us;1260us;1461us;1262us;1461us;1264us;1461us;1266us;1461us;1268us;1461us;1270us;1461us;1272us;1461us;1274us;1461us;1276us;1461us;1278us;1461us;1280us;1461us;1282us;1461us;1284us;1461us;1286us;1461us;1287us;1461us;1288us;1461us;1289us;1461us;1292us;1461us;1302us;1461us;1327us;1461us;1328us;1461us;1332us;1461us;1334us;1461us;1337us;1461us;1338us;1461us;1340us;1461us;1343us;1461us;1345us;1461us;1347us;1461us;1349us;1461us;1351us;1461us;1352us;1461us;1353us;1461us;1354us;1461us;1356us;1461us;1357us;1461us;1359us;1461us;1360us;1461us;1362us;1461us;1363us;1461us;1365us;1461us;1366us;1461us;1368us;1461us;1369us;1461us;1371us;1461us;1372us;1461us;1378us;1461us;1379us;1461us;1386us;1461us;1388us;1461us;1390us;1461us;1391us;1461us;1392us;1461us;1395us;1461us;1400us;1461us;1408us;1461us;1409us;1461us;1412us;1461us;1413us;1461us;1431us;1461us;1438us;1461us;1445us;1461us;1452us;1461us;1469us;1461us;1476us;1461us;1477us;1461us;1483us;1461us;1489us;1461us;1490us;1461us;1491us;1461us;1503us;1461us;1509us;1461us;1519us;1461us;1532us;1461us;1534us;1461us;1537us;1461us;1538us;1461us;1544us;1461us;1559us;1461us;1564us;1461us;1569us;1461us;1594us;1461us;1627us;1461us;1636us;1461us;1641us;1461us;1864us;1461us;2021us;1461us;2025us;1461us;157us;65535us;6us;1626us;31us;1626us;114us;1626us;116us;1626us;237us;1626us;251us;1626us;274us;1626us;331us;1626us;335us;1626us;340us;1626us;422us;1626us;427us;1626us;468us;1626us;491us;1626us;525us;1626us;690us;1626us;701us;1626us;753us;1626us;759us;1626us;809us;1626us;813us;1626us;823us;1626us;1030us;1626us;1036us;1626us;1052us;1626us;1054us;1626us;1057us;1626us;1060us;1626us;1079us;1626us;1084us;1626us;1090us;1626us;1093us;1626us;1096us;1626us;1102us;1626us;1106us;1626us;1110us;1626us;1116us;1626us;1118us;1626us;1123us;1626us;1125us;1626us;1127us;1626us;1129us;1626us;1131us;1626us;1133us;1626us;1137us;1626us;1147us;1626us;1154us;1626us;1160us;1626us;1162us;1626us;1167us;1626us;1171us;1626us;1174us;1626us;1178us;1626us;1181us;1626us;1184us;1626us;1186us;1626us;1189us;1626us;1191us;1626us;1240us;1626us;1242us;1626us;1246us;1626us;1248us;1626us;1250us;1626us;1252us;1626us;1254us;1626us;1256us;1626us;1258us;1626us;1260us;1626us;1262us;1626us;1264us;1626us;1266us;1626us;1268us;1626us;1270us;1626us;1272us;1626us;1274us;1626us;1276us;1626us;1278us;1626us;1280us;1626us;1282us;1626us;1284us;1626us;1286us;1626us;1287us;1626us;1288us;1626us;1289us;1626us;1292us;1626us;1302us;1626us;1327us;1626us;1328us;1626us;1332us;1626us;1334us;1626us;1337us;1626us;1338us;1626us;1340us;1626us;1343us;1626us;1345us;1626us;1347us;1626us;1349us;1626us;1351us;1626us;1352us;1626us;1353us;1626us;1354us;1626us;1356us;1626us;1357us;1626us;1359us;1626us;1360us;1626us;1362us;1626us;1363us;1626us;1365us;1626us;1366us;1626us;1368us;1626us;1369us;1626us;1371us;1626us;1372us;1626us;1378us;1626us;1379us;1626us;1386us;1626us;1388us;1626us;1390us;1626us;1391us;1626us;1392us;1626us;1395us;1626us;1400us;1626us;1408us;1626us;1409us;1626us;1412us;1626us;1413us;1626us;1431us;1626us;1437us;1625us;1438us;1626us;1445us;1626us;1452us;1626us;1469us;1626us;1476us;1626us;1477us;1626us;1483us;1626us;1489us;1626us;1490us;1626us;1491us;1626us;1503us;1626us;1509us;1626us;1519us;1626us;1532us;1626us;1534us;1626us;1537us;1626us;1538us;1626us;1544us;1626us;1559us;1626us;1564us;1626us;1569us;1626us;1594us;1626us;1624us;1625us;1627us;1626us;1636us;1626us;1641us;1626us;1864us;1626us;2021us;1626us;2025us;1626us;116us;65535us;6us;1101us;31us;1101us;114us;1101us;116us;1101us;237us;1101us;251us;1101us;274us;1101us;422us;1101us;427us;1101us;468us;1101us;491us;1101us;753us;1101us;759us;1101us;809us;1101us;813us;1101us;823us;1101us;1030us;1101us;1036us;1101us;1052us;1101us;1054us;1101us;1057us;1101us;1060us;1101us;1079us;1101us;1084us;1101us;1090us;1101us;1093us;1101us;1096us;1101us;1102us;1101us;1106us;1101us;1110us;1101us;1116us;1101us;1118us;1101us;1123us;1101us;1125us;1101us;1127us;1101us;1129us;1101us;1131us;1101us;1133us;1101us;1137us;1101us;1147us;1101us;1154us;1101us;1160us;1101us;1162us;1101us;1167us;1101us;1171us;1101us;1174us;1101us;1178us;1101us;1181us;1101us;1184us;1101us;1186us;1101us;1189us;1101us;1191us;1101us;1240us;1101us;1242us;1101us;1246us;1101us;1248us;1101us;1250us;1101us;1252us;1101us;1254us;1101us;1256us;1101us;1258us;1101us;1260us;1101us;1262us;1101us;1264us;1101us;1266us;1101us;1268us;1101us;1270us;1101us;1272us;1101us;1274us;1101us;1276us;1101us;1278us;1101us;1280us;1101us;1282us;1101us;1284us;1101us;1286us;1101us;1287us;1101us;1288us;1101us;1289us;1101us;1292us;1101us;1302us;1101us;1327us;1101us;1328us;1101us;1332us;1101us;1334us;1101us;1337us;1101us;1338us;1101us;1340us;1101us;1343us;1101us;1345us;1101us;1347us;1101us;1349us;1101us;1431us;1101us;1438us;1101us;1445us;1101us;1452us;1101us;1469us;1101us;1476us;1101us;1477us;1101us;1483us;1101us;1489us;1101us;1490us;1101us;1491us;1101us;1503us;1101us;1509us;1101us;1519us;1101us;1532us;1101us;1534us;1101us;1537us;1101us;1538us;1101us;1564us;1101us;1569us;1101us;1594us;1101us;1636us;1101us;1641us;1101us;2021us;1101us;2025us;1101us;116us;65535us;6us;1100us;31us;1100us;114us;1100us;116us;1100us;237us;1100us;251us;1100us;274us;1100us;422us;1100us;427us;1100us;468us;1100us;491us;1100us;753us;1100us;759us;1100us;809us;1100us;813us;1100us;823us;1100us;1030us;1100us;1036us;1100us;1052us;1100us;1054us;1100us;1057us;1100us;1060us;1100us;1079us;1100us;1084us;1100us;1090us;1100us;1093us;1100us;1096us;1100us;1102us;1100us;1106us;1100us;1110us;1100us;1116us;1100us;1118us;1100us;1123us;1100us;1125us;1100us;1127us;1100us;1129us;1100us;1131us;1100us;1133us;1100us;1137us;1100us;1147us;1100us;1154us;1100us;1160us;1100us;1162us;1100us;1167us;1100us;1171us;1100us;1174us;1100us;1178us;1100us;1181us;1100us;1184us;1100us;1186us;1100us;1189us;1100us;1191us;1100us;1240us;1100us;1242us;1100us;1246us;1100us;1248us;1100us;1250us;1100us;1252us;1100us;1254us;1100us;1256us;1100us;1258us;1100us;1260us;1100us;1262us;1100us;1264us;1100us;1266us;1100us;1268us;1100us;1270us;1100us;1272us;1100us;1274us;1100us;1276us;1100us;1278us;1100us;1280us;1100us;1282us;1100us;1284us;1100us;1286us;1100us;1287us;1100us;1288us;1100us;1289us;1100us;1292us;1100us;1302us;1100us;1327us;1100us;1328us;1100us;1332us;1100us;1334us;1100us;1337us;1100us;1338us;1100us;1340us;1100us;1343us;1100us;1345us;1100us;1347us;1100us;1349us;1100us;1431us;1100us;1438us;1100us;1445us;1100us;1452us;1100us;1469us;1100us;1476us;1100us;1477us;1100us;1483us;1100us;1489us;1100us;1490us;1100us;1491us;1100us;1503us;1100us;1509us;1100us;1519us;1100us;1532us;1100us;1534us;1100us;1537us;1100us;1538us;1100us;1564us;1100us;1569us;1100us;1594us;1100us;1636us;1100us;1641us;1100us;2021us;1100us;2025us;1100us;3us;65535us;873us;874us;1005us;1006us;1046us;1047us;5us;65535us;111us;112us;184us;185us;201us;202us;454us;455us;1660us;1661us;3us;65535us;420us;421us;425us;426us;807us;808us;9us;65535us;111us;1658us;149us;150us;184us;1658us;201us;1658us;385us;386us;454us;1658us;688us;689us;1660us;1658us;1664us;1665us;9us;65535us;111us;1663us;149us;1663us;184us;1663us;201us;1663us;385us;1663us;454us;1663us;688us;1663us;1660us;1663us;1664us;1663us;4us;65535us;1668us;1669us;1671us;1672us;1674us;1675us;1677us;1678us;13us;65535us;111us;1667us;149us;1667us;184us;1667us;201us;1667us;385us;1667us;454us;1667us;688us;1667us;1660us;1667us;1664us;1667us;1668us;1673us;1671us;1673us;1674us;1673us;1677us;1673us;10us;65535us;679us;718us;681us;718us;684us;718us;705us;718us;708us;718us;711us;718us;714us;717us;744us;718us;1700us;1701us;1703us;1704us;33us;65535us;8us;1711us;178us;566us;439us;566us;481us;482us;497us;498us;561us;566us;569us;1850us;640us;641us;643us;644us;653us;1850us;730us;731us;829us;830us;873us;1656us;1005us;1656us;1046us;1656us;1231us;1232us;1234us;1235us;1237us;1238us;1550us;1551us;1553us;1554us;1555us;1850us;1706us;1707us;1709us;1710us;1751us;1850us;1757us;1758us;1760us;1761us;1827us;1890us;1831us;1890us;1837us;1850us;1848us;1849us;1878us;1890us;1880us;1890us;1891us;1892us;1us;65535us;8us;9us;33us;65535us;8us;1705us;178us;1705us;439us;1705us;481us;1705us;497us;1705us;561us;1705us;569us;1705us;640us;1705us;643us;1705us;653us;1705us;730us;1705us;829us;1705us;873us;1705us;1005us;1705us;1046us;1705us;1231us;1705us;1234us;1705us;1237us;1705us;1550us;1705us;1553us;1705us;1555us;1705us;1706us;1705us;1709us;1705us;1751us;1705us;1757us;1705us;1760us;1705us;1827us;1705us;1831us;1705us;1837us;1705us;1848us;1705us;1878us;1705us;1880us;1705us;1891us;1705us;9us;65535us;1714us;1715us;1717us;1718us;1719us;1720us;1722us;1723us;1726us;1727us;1729us;1730us;1731us;1732us;1734us;1735us;1855us;1856us;82us;65535us;8us;1756us;111us;1756us;149us;1756us;178us;1756us;184us;1756us;188us;1756us;190us;1756us;201us;1756us;290us;1756us;385us;1756us;439us;1756us;446us;1756us;454us;1756us;481us;1756us;497us;1756us;561us;1756us;569us;1756us;626us;1756us;630us;1756us;640us;1756us;643us;1756us;653us;1756us;664us;1756us;679us;1756us;681us;1756us;684us;1756us;688us;1756us;705us;1756us;708us;1756us;711us;1756us;714us;1756us;730us;1756us;744us;1756us;829us;1756us;873us;1756us;1005us;1756us;1046us;1756us;1231us;1756us;1234us;1756us;1237us;1756us;1517us;1756us;1550us;1756us;1553us;1756us;1555us;1756us;1619us;1756us;1657us;1756us;1659us;1756us;1660us;1756us;1664us;1756us;1668us;1756us;1671us;1756us;1674us;1756us;1677us;1756us;1679us;1756us;1681us;1756us;1686us;1756us;1690us;1756us;1695us;1756us;1700us;1756us;1703us;1756us;1706us;1756us;1709us;1756us;1714us;1756us;1717us;1756us;1719us;1756us;1722us;1756us;1726us;1756us;1729us;1756us;1731us;1756us;1734us;1756us;1751us;1756us;1757us;1756us;1760us;1756us;1827us;1756us;1831us;1756us;1837us;1756us;1848us;1756us;1854us;1756us;1855us;1756us;1878us;1756us;1880us;1756us;1891us;1756us;117us;65535us;8us;1743us;111us;1743us;149us;1743us;178us;1743us;184us;1743us;188us;1743us;189us;1742us;190us;1743us;191us;1742us;201us;1743us;290us;1743us;291us;1742us;385us;1743us;439us;1743us;446us;1743us;447us;1742us;454us;1743us;481us;1743us;497us;1743us;522us;1743us;561us;1743us;569us;1743us;570us;1743us;613us;1743us;626us;1743us;630us;1743us;635us;1743us;640us;1743us;643us;1743us;653us;1743us;663us;1742us;664us;1743us;665us;1742us;666us;1742us;679us;1743us;681us;1743us;684us;1743us;688us;1743us;705us;1743us;708us;1743us;711us;1743us;714us;1743us;715us;1742us;716us;1742us;730us;1743us;744us;1743us;829us;1743us;873us;1743us;938us;1743us;1005us;1743us;1046us;1743us;1231us;1743us;1234us;1743us;1237us;1743us;1374us;1743us;1375us;1743us;1517us;1743us;1518us;1742us;1550us;1743us;1553us;1743us;1555us;1743us;1557us;1743us;1619us;1743us;1620us;1742us;1657us;1743us;1659us;1743us;1660us;1743us;1664us;1743us;1668us;1743us;1671us;1743us;1674us;1743us;1677us;1743us;1679us;1743us;1680us;1742us;1681us;1743us;1682us;1742us;1686us;1743us;1687us;1742us;1689us;1742us;1690us;1743us;1691us;1742us;1695us;1743us;1696us;1742us;1698us;1742us;1699us;1742us;1700us;1743us;1703us;1743us;1706us;1743us;1709us;1743us;1713us;1742us;1714us;1743us;1717us;1743us;1719us;1743us;1722us;1743us;1725us;1742us;1726us;1743us;1729us;1743us;1731us;1743us;1734us;1743us;1737us;1743us;1739us;1743us;1746us;1742us;1751us;1743us;1753us;1742us;1757us;1743us;1760us;1743us;1827us;1743us;1831us;1743us;1837us;1743us;1839us;1742us;1844us;1743us;1848us;1743us;1854us;1743us;1855us;1743us;1878us;1743us;1880us;1743us;1891us;1743us;117us;65535us;8us;1846us;111us;1846us;149us;1846us;178us;1846us;184us;1846us;188us;1846us;189us;1750us;190us;1846us;191us;1750us;201us;1846us;290us;1846us;291us;1750us;385us;1846us;439us;1846us;446us;1846us;447us;1750us;454us;1846us;481us;1846us;497us;1846us;522us;1846us;561us;1846us;569us;1846us;570us;1846us;613us;1846us;626us;1846us;630us;1846us;635us;1846us;640us;1846us;643us;1846us;653us;1846us;663us;1750us;664us;1846us;665us;1750us;666us;1750us;679us;1846us;681us;1846us;684us;1846us;688us;1846us;705us;1846us;708us;1846us;711us;1846us;714us;1846us;715us;1750us;716us;1750us;730us;1846us;744us;1846us;829us;1846us;873us;1846us;938us;1846us;1005us;1846us;1046us;1846us;1231us;1846us;1234us;1846us;1237us;1846us;1374us;1846us;1375us;1846us;1517us;1846us;1518us;1750us;1550us;1846us;1553us;1846us;1555us;1846us;1557us;1846us;1619us;1846us;1620us;1750us;1657us;1846us;1659us;1846us;1660us;1846us;1664us;1846us;1668us;1846us;1671us;1846us;1674us;1846us;1677us;1846us;1679us;1846us;1680us;1750us;1681us;1846us;1682us;1750us;1686us;1846us;1687us;1750us;1689us;1750us;1690us;1846us;1691us;1750us;1695us;1846us;1696us;1750us;1698us;1750us;1699us;1750us;1700us;1846us;1703us;1846us;1706us;1846us;1709us;1846us;1713us;1750us;1714us;1846us;1717us;1846us;1719us;1846us;1722us;1846us;1725us;1750us;1726us;1846us;1729us;1846us;1731us;1846us;1734us;1846us;1737us;1846us;1739us;1846us;1746us;1750us;1751us;1846us;1753us;1754us;1757us;1846us;1760us;1846us;1827us;1846us;1831us;1846us;1837us;1846us;1839us;1840us;1844us;1846us;1848us;1846us;1854us;1846us;1855us;1846us;1878us;1846us;1880us;1846us;1891us;1846us;82us;65535us;8us;1713us;111us;1689us;149us;1689us;178us;1713us;184us;1689us;188us;189us;190us;191us;201us;1689us;290us;291us;385us;1689us;439us;1713us;446us;447us;454us;1689us;481us;1713us;497us;1713us;561us;1713us;569us;1713us;626us;663us;630us;663us;640us;1713us;643us;1713us;653us;666us;664us;665us;679us;716us;681us;716us;684us;716us;688us;1689us;705us;716us;708us;716us;711us;716us;714us;715us;730us;1713us;744us;716us;829us;1713us;873us;1713us;1005us;1713us;1046us;1713us;1231us;1713us;1234us;1713us;1237us;1713us;1517us;1518us;1550us;1713us;1553us;1713us;1555us;1713us;1619us;1620us;1657us;663us;1659us;663us;1660us;1689us;1664us;1689us;1668us;1689us;1671us;1689us;1674us;1689us;1677us;1689us;1679us;1680us;1681us;1682us;1686us;1687us;1690us;1691us;1695us;1696us;1700us;1698us;1703us;1699us;1706us;1713us;1709us;1713us;1714us;1725us;1717us;1725us;1719us;1725us;1722us;1725us;1726us;1725us;1729us;1725us;1731us;1725us;1734us;1725us;1751us;1713us;1757us;1713us;1760us;1713us;1827us;1713us;1831us;1713us;1837us;1713us;1848us;1713us;1854us;1746us;1855us;1725us;1878us;1713us;1880us;1713us;1891us;1713us;23us;65535us;189us;1747us;191us;1747us;291us;1747us;447us;1747us;663us;1747us;665us;1747us;666us;1747us;715us;1747us;716us;1747us;1518us;1747us;1620us;1747us;1680us;1747us;1682us;1747us;1687us;1747us;1689us;1747us;1691us;1747us;1696us;1747us;1698us;1747us;1699us;1747us;1713us;1747us;1725us;1747us;1746us;1747us;1748us;1749us;5us;65535us;569us;1752us;653us;1752us;1555us;1752us;1751us;1752us;1837us;1838us;2us;65535us;1828us;1829us;1881us;1830us;82us;65535us;8us;1755us;111us;1755us;149us;1755us;178us;1755us;184us;1755us;188us;1755us;190us;1755us;201us;1755us;290us;1755us;385us;1755us;439us;1755us;446us;1755us;454us;1755us;481us;1755us;497us;1755us;561us;1755us;569us;1755us;626us;1755us;630us;1755us;640us;1755us;643us;1755us;653us;1755us;664us;1755us;679us;1755us;681us;1755us;684us;1755us;688us;1755us;705us;1755us;708us;1755us;711us;1755us;714us;1755us;730us;1755us;744us;1755us;829us;1755us;873us;1755us;1005us;1755us;1046us;1755us;1231us;1755us;1234us;1755us;1237us;1755us;1517us;1755us;1550us;1755us;1553us;1755us;1555us;1755us;1619us;1755us;1657us;1755us;1659us;1755us;1660us;1755us;1664us;1755us;1668us;1755us;1671us;1755us;1674us;1755us;1677us;1755us;1679us;1755us;1681us;1755us;1686us;1755us;1690us;1755us;1695us;1755us;1700us;1755us;1703us;1755us;1706us;1755us;1709us;1755us;1714us;1755us;1717us;1755us;1719us;1755us;1722us;1755us;1726us;1755us;1729us;1755us;1731us;1755us;1734us;1755us;1751us;1755us;1757us;1755us;1760us;1755us;1827us;1755us;1831us;1755us;1837us;1755us;1848us;1755us;1854us;1755us;1855us;1755us;1878us;1755us;1880us;1755us;1891us;1755us;4us;65535us;522us;523us;1374us;1376us;1375us;1377us;1557us;1558us;83us;65535us;8us;1834us;111us;1834us;149us;1834us;178us;1834us;184us;1834us;188us;1834us;190us;1834us;201us;1834us;290us;1834us;385us;1834us;439us;1834us;446us;1834us;454us;1834us;481us;1834us;497us;1834us;561us;1834us;569us;1834us;626us;1834us;630us;1834us;640us;1834us;643us;1834us;653us;1834us;664us;1834us;679us;1834us;681us;1834us;684us;1834us;688us;1834us;705us;1834us;708us;1834us;711us;1834us;714us;1834us;730us;1834us;744us;1834us;829us;1834us;873us;1834us;938us;939us;1005us;1834us;1046us;1834us;1231us;1834us;1234us;1834us;1237us;1834us;1517us;1834us;1550us;1834us;1553us;1834us;1555us;1834us;1619us;1834us;1657us;1834us;1659us;1834us;1660us;1834us;1664us;1834us;1668us;1834us;1671us;1834us;1674us;1834us;1677us;1834us;1679us;1834us;1681us;1834us;1686us;1834us;1690us;1834us;1695us;1834us;1700us;1834us;1703us;1834us;1706us;1834us;1709us;1834us;1714us;1834us;1717us;1834us;1719us;1834us;1722us;1834us;1726us;1834us;1729us;1834us;1731us;1834us;1734us;1834us;1751us;1834us;1757us;1834us;1760us;1834us;1827us;1834us;1831us;1834us;1837us;1834us;1848us;1834us;1854us;1834us;1855us;1834us;1878us;1834us;1880us;1834us;1891us;1834us;93us;65535us;8us;1738us;111us;1738us;149us;1738us;178us;1738us;184us;1738us;188us;1738us;190us;1738us;201us;1738us;290us;1738us;385us;1738us;439us;1738us;446us;1738us;454us;1738us;481us;1738us;497us;1738us;522us;1841us;561us;1738us;569us;1738us;570us;1845us;613us;637us;626us;1738us;630us;1738us;635us;636us;640us;1738us;643us;1738us;653us;1738us;664us;1738us;679us;1738us;681us;1738us;684us;1738us;688us;1738us;705us;1738us;708us;1738us;711us;1738us;714us;1738us;730us;1738us;744us;1738us;829us;1738us;873us;1738us;938us;1842us;1005us;1738us;1046us;1738us;1231us;1738us;1234us;1738us;1237us;1738us;1374us;1841us;1375us;1841us;1517us;1738us;1550us;1738us;1553us;1738us;1555us;1738us;1557us;1841us;1619us;1738us;1657us;1738us;1659us;1738us;1660us;1738us;1664us;1738us;1668us;1738us;1671us;1738us;1674us;1738us;1677us;1738us;1679us;1738us;1681us;1738us;1686us;1738us;1690us;1738us;1695us;1738us;1700us;1738us;1703us;1738us;1706us;1738us;1709us;1738us;1714us;1738us;1717us;1738us;1719us;1738us;1722us;1738us;1726us;1738us;1729us;1738us;1731us;1738us;1734us;1738us;1737us;637us;1739us;637us;1751us;1738us;1757us;1738us;1760us;1738us;1827us;1738us;1831us;1738us;1837us;1738us;1844us;1845us;1848us;1738us;1854us;1738us;1855us;1738us;1878us;1738us;1880us;1738us;1891us;1738us;4us;65535us;647us;662us;660us;661us;1743us;1869us;1871us;1872us;6us;65535us;647us;1875us;660us;1875us;1410us;1411us;1743us;1875us;1871us;1875us;1876us;1877us;9us;65535us;569us;1826us;653us;1826us;1555us;1826us;1751us;1826us;1827us;1828us;1831us;1832us;1837us;1826us;1878us;1885us;1880us;1893us;2us;65535us;1878us;1879us;1880us;1881us;3us;65535us;1831us;1833us;1878us;1894us;1880us;1894us;1us;65535us;865us;866us;6us;65535us;1895us;1905us;1902us;1905us;1909us;1905us;1915us;1905us;1916us;1905us;1917us;1905us;6us;65535us;1895us;1909us;1902us;1909us;1909us;1909us;1915us;1909us;1916us;1909us;1917us;1909us;6us;65535us;1895us;1911us;1902us;1911us;1909us;1910us;1915us;1911us;1916us;1911us;1917us;1911us;5us;65535us;1895us;1896us;1902us;1903us;1915us;1912us;1916us;1913us;1917us;1914us;131us;65535us;8us;1736us;111us;1736us;149us;1736us;178us;1736us;184us;1736us;188us;1736us;189us;1741us;190us;1736us;191us;1741us;201us;1736us;290us;1736us;291us;1741us;385us;1736us;439us;1736us;446us;1736us;447us;1741us;454us;1736us;481us;1736us;497us;1736us;522us;1741us;561us;1736us;569us;1736us;570us;1741us;595us;601us;611us;612us;613us;1741us;626us;642us;630us;642us;635us;1741us;638us;639us;640us;1736us;643us;1736us;653us;1736us;663us;1741us;664us;1736us;665us;1741us;666us;1741us;679us;1736us;681us;1736us;684us;1736us;688us;1736us;705us;1736us;708us;1736us;711us;1736us;714us;1736us;715us;1741us;716us;1741us;730us;1736us;744us;1736us;821us;828us;825us;828us;829us;1736us;873us;1736us;938us;1741us;1005us;1736us;1046us;1736us;1231us;1736us;1234us;1736us;1237us;1736us;1374us;1741us;1375us;1741us;1489us;1513us;1490us;1514us;1491us;1513us;1517us;1736us;1518us;1741us;1550us;1736us;1553us;1736us;1555us;1736us;1557us;1741us;1619us;1736us;1620us;1741us;1657us;642us;1659us;642us;1660us;1736us;1664us;1736us;1668us;1736us;1671us;1736us;1674us;1736us;1677us;1736us;1679us;1736us;1680us;1741us;1681us;1736us;1682us;1741us;1686us;1736us;1687us;1741us;1689us;1741us;1690us;1736us;1691us;1741us;1695us;1736us;1696us;1741us;1698us;1741us;1699us;1741us;1700us;1736us;1703us;1736us;1706us;1736us;1709us;1736us;1713us;1741us;1714us;1736us;1717us;1736us;1719us;1736us;1722us;1736us;1725us;1741us;1726us;1736us;1729us;1736us;1731us;1736us;1734us;1736us;1737us;1741us;1739us;1741us;1746us;1741us;1751us;1736us;1753us;1741us;1757us;1736us;1760us;1736us;1827us;1736us;1831us;1736us;1837us;1736us;1839us;1741us;1844us;1741us;1848us;1736us;1854us;1736us;1855us;1736us;1878us;1736us;1880us;1736us;1891us;1736us;1895us;1901us;1902us;1901us;1909us;1901us;1915us;1901us;1916us;1901us;1917us;1901us;385us;65535us;6us;1980us;8us;1925us;31us;1980us;53us;1925us;58us;1925us;95us;1925us;108us;1972us;111us;1925us;114us;1980us;116us;1980us;120us;1925us;149us;1925us;178us;699us;181us;1972us;184us;1925us;188us;1925us;189us;1925us;190us;1925us;191us;1925us;201us;1925us;203us;1972us;205us;1972us;210us;1972us;237us;1980us;251us;1980us;274us;1980us;281us;1925us;287us;1925us;290us;1925us;291us;1925us;317us;346us;328us;346us;333us;1925us;337us;1925us;385us;1925us;419us;1974us;422us;1980us;424us;1974us;427us;1980us;439us;699us;446us;1925us;447us;1925us;451us;1972us;454us;1925us;465us;1974us;468us;1980us;479us;480us;481us;1925us;488us;489us;491us;1980us;497us;1925us;501us;1974us;504us;1974us;507us;1974us;509us;1974us;522us;1925us;530us;531us;534us;535us;561us;699us;569us;1925us;570us;1925us;595us;1925us;597us;1925us;613us;1925us;626us;1925us;630us;1925us;635us;1925us;640us;1925us;643us;1925us;653us;1925us;663us;1925us;664us;1925us;665us;1925us;666us;1925us;678us;1972us;679us;713us;681us;713us;684us;713us;688us;1925us;690us;1980us;701us;1980us;705us;713us;708us;713us;711us;713us;714us;1925us;715us;1925us;716us;1925us;728us;729us;730us;1925us;739us;743us;744us;713us;747us;1925us;753us;1980us;759us;1980us;771us;772us;783us;1925us;784us;785us;796us;1925us;806us;1974us;809us;1980us;813us;1980us;823us;1980us;829us;1925us;869us;870us;873us;1925us;876us;868us;877us;868us;880us;868us;899us;1974us;901us;1974us;902us;1974us;906us;1974us;907us;1974us;910us;1974us;912us;1974us;913us;1974us;916us;920us;918us;920us;922us;1974us;926us;1974us;927us;1974us;929us;1974us;931us;1974us;934us;1974us;936us;1974us;938us;1925us;941us;921us;945us;1974us;947us;1974us;949us;1974us;952us;1925us;957us;1974us;960us;1974us;963us;965us;964us;965us;971us;1974us;979us;1974us;1000us;1974us;1002us;1974us;1005us;1925us;1008us;1974us;1009us;1974us;1011us;1974us;1012us;1974us;1015us;1974us;1017us;1974us;1018us;1974us;1021us;1925us;1024us;1974us;1028us;1974us;1030us;1980us;1036us;1980us;1046us;1925us;1052us;1980us;1054us;1980us;1057us;1980us;1060us;1980us;1078us;1974us;1079us;1980us;1083us;1974us;1084us;1980us;1090us;1980us;1093us;1980us;1096us;1980us;1102us;1980us;1106us;1980us;1110us;1980us;1116us;1980us;1118us;1980us;1123us;1980us;1125us;1980us;1127us;1980us;1129us;1980us;1131us;1980us;1133us;1980us;1135us;1974us;1137us;1980us;1147us;1980us;1154us;1980us;1160us;1980us;1162us;1980us;1166us;1974us;1167us;1980us;1171us;1980us;1173us;1974us;1174us;1980us;1178us;1980us;1181us;1980us;1184us;1980us;1186us;1980us;1189us;1980us;1191us;1980us;1231us;1925us;1234us;1925us;1237us;1925us;1240us;1980us;1242us;1980us;1246us;1980us;1248us;1980us;1250us;1980us;1252us;1980us;1254us;1980us;1256us;1980us;1258us;1980us;1260us;1980us;1262us;1980us;1264us;1980us;1266us;1980us;1268us;1980us;1270us;1980us;1272us;1980us;1274us;1980us;1276us;1980us;1278us;1980us;1280us;1980us;1282us;1980us;1284us;1980us;1286us;1980us;1287us;1980us;1288us;1980us;1289us;1980us;1292us;1980us;1302us;1980us;1305us;1974us;1307us;1974us;1313us;1974us;1320us;1974us;1322us;1974us;1327us;1980us;1328us;1980us;1332us;1980us;1334us;1980us;1337us;1980us;1338us;1980us;1340us;1980us;1343us;1980us;1345us;1980us;1347us;1980us;1349us;1980us;1351us;1980us;1352us;1922us;1353us;1922us;1354us;1980us;1356us;1980us;1357us;1980us;1359us;1980us;1360us;1980us;1362us;1980us;1363us;1980us;1365us;1980us;1366us;1980us;1368us;1980us;1369us;1980us;1371us;1980us;1372us;1980us;1374us;1925us;1375us;1925us;1382us;1972us;1386us;1980us;1388us;1980us;1390us;1980us;1391us;1980us;1392us;1980us;1395us;1980us;1400us;1980us;1408us;1980us;1409us;1980us;1412us;1980us;1413us;1980us;1414us;1416us;1415us;1417us;1419us;1972us;1422us;1972us;1424us;1972us;1425us;1972us;1431us;1980us;1438us;1980us;1445us;1980us;1452us;1980us;1469us;1980us;1476us;1980us;1477us;1980us;1483us;1980us;1489us;1980us;1490us;1980us;1491us;1980us;1503us;1980us;1509us;1980us;1517us;1925us;1518us;1925us;1519us;1980us;1532us;1980us;1534us;1980us;1537us;1980us;1538us;1980us;1544us;1980us;1550us;1925us;1553us;1925us;1555us;1925us;1557us;1925us;1564us;1980us;1569us;1980us;1573us;1925us;1577us;1925us;1585us;1925us;1594us;1980us;1619us;1925us;1620us;1925us;1627us;1980us;1634us;1974us;1636us;1980us;1639us;1974us;1641us;1980us;1651us;1974us;1653us;1974us;1657us;1925us;1659us;1925us;1660us;1925us;1664us;1925us;1668us;1925us;1671us;1925us;1674us;1925us;1677us;1925us;1679us;1925us;1680us;1925us;1681us;1925us;1682us;1925us;1684us;1685us;1686us;1925us;1687us;1925us;1689us;1925us;1690us;1925us;1691us;1925us;1693us;1694us;1695us;1925us;1696us;1925us;1698us;1925us;1699us;1925us;1700us;1925us;1703us;1925us;1706us;1925us;1709us;1925us;1713us;1925us;1714us;1925us;1717us;1925us;1719us;1925us;1722us;1925us;1725us;1925us;1726us;1925us;1729us;1925us;1731us;1925us;1734us;1925us;1737us;1925us;1739us;1925us;1746us;1925us;1751us;1925us;1753us;1925us;1757us;1925us;1760us;1925us;1827us;1925us;1831us;1925us;1837us;1925us;1839us;1925us;1844us;1925us;1848us;1925us;1854us;1925us;1855us;1925us;1864us;1980us;1870us;1925us;1878us;1925us;1880us;1925us;1891us;1925us;1895us;1925us;1902us;1925us;1909us;1925us;1915us;1925us;1916us;1925us;1917us;1925us;1918us;1919us;1920us;1921us;1926us;1927us;1976us;1974us;2018us;2019us;2021us;1980us;2025us;1980us;144us;65535us;8us;1740us;53us;54us;58us;59us;95us;295us;111us;1740us;120us;293us;149us;1740us;178us;562us;184us;1740us;188us;1740us;189us;1740us;190us;1740us;191us;1740us;201us;1740us;281us;305us;287us;288us;290us;1740us;291us;1740us;317us;330us;328us;330us;333us;334us;337us;338us;385us;1740us;439us;562us;446us;1740us;447us;1740us;454us;1740us;481us;1740us;497us;1740us;522us;1740us;561us;562us;569us;1740us;570us;1740us;595us;596us;597us;598us;613us;1740us;626us;1740us;630us;1740us;635us;1740us;640us;1740us;643us;1740us;653us;1740us;663us;1740us;664us;1740us;665us;1740us;666us;1740us;679us;1740us;681us;1740us;684us;1740us;688us;1740us;705us;1740us;708us;1740us;711us;1740us;714us;1740us;715us;1740us;716us;1740us;730us;1740us;744us;1740us;747us;748us;783us;786us;796us;786us;829us;1740us;873us;1740us;938us;1740us;952us;1023us;1005us;1740us;1021us;1023us;1046us;1740us;1231us;1740us;1234us;1740us;1237us;1740us;1374us;1740us;1375us;1740us;1517us;1740us;1518us;1740us;1550us;1740us;1553us;1740us;1555us;1740us;1557us;1740us;1573us;1590us;1577us;1590us;1585us;1590us;1619us;1740us;1620us;1740us;1657us;1740us;1659us;1740us;1660us;1740us;1664us;1740us;1668us;1740us;1671us;1740us;1674us;1740us;1677us;1740us;1679us;1740us;1680us;1740us;1681us;1740us;1682us;1740us;1686us;1740us;1687us;1740us;1689us;1740us;1690us;1740us;1691us;1740us;1695us;1740us;1696us;1740us;1698us;1740us;1699us;1740us;1700us;1740us;1703us;1740us;1706us;1740us;1709us;1740us;1713us;1740us;1714us;1740us;1717us;1740us;1719us;1740us;1722us;1740us;1725us;1740us;1726us;1740us;1729us;1740us;1731us;1740us;1734us;1740us;1737us;1740us;1739us;1740us;1746us;1740us;1751us;1740us;1753us;1740us;1757us;1740us;1760us;1740us;1827us;1740us;1831us;1740us;1837us;1740us;1839us;1740us;1844us;1740us;1848us;1740us;1854us;1740us;1855us;1740us;1870us;1871us;1878us;1740us;1880us;1740us;1891us;1740us;1895us;1900us;1902us;1900us;1909us;1900us;1915us;1900us;1916us;1900us;1917us;1900us;217us;65535us;6us;1981us;31us;1981us;108us;1973us;114us;1981us;116us;1981us;181us;1973us;203us;1973us;205us;1973us;210us;1973us;237us;1981us;251us;1981us;274us;1981us;419us;1975us;422us;1981us;424us;1975us;427us;1981us;451us;1973us;465us;1975us;468us;1981us;491us;1981us;501us;1975us;504us;1975us;507us;1975us;509us;1975us;678us;1973us;690us;1981us;701us;1981us;753us;1981us;759us;1981us;806us;1975us;809us;1981us;813us;1981us;823us;1981us;899us;1975us;901us;1975us;902us;1975us;906us;1975us;907us;1975us;910us;1975us;912us;1975us;913us;1975us;922us;1975us;926us;1975us;927us;1975us;929us;1975us;931us;1975us;934us;1975us;936us;1975us;941us;1975us;945us;1975us;947us;1975us;949us;1975us;957us;1975us;960us;1975us;971us;1975us;979us;1975us;1000us;1975us;1002us;1975us;1008us;1975us;1009us;1975us;1011us;1975us;1012us;1975us;1015us;1975us;1017us;1975us;1018us;1975us;1024us;1975us;1028us;1975us;1030us;1981us;1036us;1981us;1052us;1981us;1054us;1981us;1057us;1981us;1060us;1981us;1078us;1975us;1079us;1981us;1083us;1975us;1084us;1981us;1090us;1981us;1093us;1981us;1096us;1981us;1102us;1981us;1106us;1981us;1110us;1981us;1116us;1981us;1118us;1981us;1123us;1981us;1125us;1981us;1127us;1981us;1129us;1981us;1131us;1981us;1133us;1981us;1135us;1975us;1137us;1981us;1147us;1981us;1154us;1981us;1160us;1981us;1162us;1981us;1166us;1975us;1167us;1981us;1171us;1981us;1173us;1975us;1174us;1981us;1178us;1981us;1181us;1981us;1184us;1981us;1186us;1981us;1189us;1981us;1191us;1981us;1240us;1981us;1242us;1981us;1246us;1981us;1248us;1981us;1250us;1981us;1252us;1981us;1254us;1981us;1256us;1981us;1258us;1981us;1260us;1981us;1262us;1981us;1264us;1981us;1266us;1981us;1268us;1981us;1270us;1981us;1272us;1981us;1274us;1981us;1276us;1981us;1278us;1981us;1280us;1981us;1282us;1981us;1284us;1981us;1286us;1981us;1287us;1981us;1288us;1981us;1289us;1981us;1292us;1981us;1302us;1981us;1305us;1975us;1307us;1975us;1313us;1975us;1320us;1975us;1322us;1975us;1327us;1981us;1328us;1981us;1332us;1981us;1334us;1981us;1337us;1981us;1338us;1981us;1340us;1981us;1343us;1981us;1345us;1981us;1347us;1981us;1349us;1981us;1351us;1981us;1352us;1981us;1353us;1981us;1354us;1981us;1356us;1981us;1357us;1981us;1359us;1981us;1360us;1981us;1362us;1981us;1363us;1981us;1365us;1981us;1366us;1981us;1368us;1981us;1369us;1981us;1371us;1981us;1372us;1981us;1382us;1973us;1386us;1981us;1388us;1981us;1390us;1981us;1391us;1981us;1392us;1981us;1395us;1981us;1400us;1981us;1408us;1981us;1409us;1981us;1412us;1981us;1413us;1981us;1419us;1973us;1422us;1973us;1424us;1973us;1425us;1973us;1431us;1981us;1438us;1981us;1445us;1981us;1452us;1981us;1469us;1981us;1476us;1981us;1477us;1981us;1483us;1981us;1489us;1981us;1490us;1981us;1491us;1981us;1503us;1981us;1509us;1981us;1519us;1981us;1532us;1981us;1534us;1981us;1537us;1981us;1538us;1981us;1544us;1981us;1564us;1981us;1569us;1981us;1594us;1981us;1627us;1981us;1634us;1975us;1636us;1981us;1639us;1975us;1641us;1981us;1651us;1975us;1653us;1975us;1864us;1981us;1976us;1975us;2021us;1981us;2025us;1981us;7us;65535us;693us;1930us;941us;1930us;971us;1930us;1445us;1930us;1490us;1930us;1491us;1930us;1929us;1930us;2us;65535us;1936us;1971us;1969us;1970us;7us;65535us;693us;1935us;941us;1935us;971us;1935us;1445us;1935us;1490us;1935us;1491us;1935us;1929us;1935us;12us;65535us;108us;1979us;181us;1979us;203us;1979us;205us;1979us;210us;1979us;451us;1979us;678us;1979us;1382us;1442us;1419us;1442us;1422us;1442us;1424us;1979us;1425us;1979us;57us;65535us;419us;506us;424us;506us;465us;506us;501us;502us;504us;505us;507us;511us;509us;510us;806us;506us;899us;506us;901us;506us;902us;506us;906us;506us;907us;506us;910us;506us;912us;506us;913us;506us;922us;506us;926us;506us;927us;506us;929us;506us;931us;506us;934us;506us;936us;506us;941us;506us;945us;506us;947us;506us;949us;506us;957us;506us;960us;506us;971us;506us;979us;506us;1000us;506us;1002us;506us;1008us;506us;1009us;506us;1011us;506us;1012us;506us;1015us;506us;1017us;506us;1018us;506us;1024us;506us;1028us;506us;1078us;506us;1083us;506us;1135us;506us;1166us;506us;1173us;506us;1305us;506us;1307us;506us;1313us;506us;1320us;506us;1322us;506us;1634us;506us;1639us;506us;1651us;506us;1653us;506us;1976us;1977us;9us;65535us;108us;109us;181us;182us;203us;209us;205us;209us;210us;211us;451us;452us;678us;692us;1424us;1426us;1425us;1426us;148us;65535us;6us;1430us;31us;1430us;114us;1430us;116us;1430us;237us;1430us;251us;1430us;274us;1430us;422us;1430us;427us;1430us;468us;1430us;491us;1430us;690us;1430us;701us;1430us;753us;1430us;759us;1430us;809us;1430us;813us;1430us;823us;1430us;1030us;1430us;1036us;1430us;1052us;1430us;1054us;1430us;1057us;1430us;1060us;1430us;1079us;1430us;1084us;1430us;1090us;1430us;1093us;1430us;1096us;1430us;1102us;1430us;1106us;1430us;1110us;1430us;1116us;1430us;1118us;1430us;1123us;1430us;1125us;1430us;1127us;1430us;1129us;1430us;1131us;1430us;1133us;1430us;1137us;1430us;1147us;1430us;1154us;1430us;1160us;1430us;1162us;1430us;1167us;1430us;1171us;1430us;1174us;1430us;1178us;1430us;1181us;1430us;1184us;1430us;1186us;1430us;1189us;1430us;1191us;1430us;1240us;1430us;1242us;1430us;1246us;1430us;1248us;1430us;1250us;1430us;1252us;1430us;1254us;1430us;1256us;1430us;1258us;1430us;1260us;1430us;1262us;1430us;1264us;1430us;1266us;1430us;1268us;1430us;1270us;1430us;1272us;1430us;1274us;1430us;1276us;1430us;1278us;1430us;1280us;1430us;1282us;1430us;1284us;1430us;1286us;1430us;1287us;1430us;1288us;1430us;1289us;1430us;1292us;1430us;1302us;1430us;1327us;1430us;1328us;1430us;1332us;1430us;1334us;1430us;1337us;1430us;1338us;1430us;1340us;1430us;1343us;1430us;1345us;1430us;1347us;1430us;1349us;1430us;1351us;1430us;1352us;1430us;1353us;1430us;1354us;1430us;1356us;1430us;1357us;1430us;1359us;1430us;1360us;1430us;1362us;1430us;1363us;1430us;1365us;1430us;1366us;1430us;1368us;1430us;1369us;1430us;1371us;1430us;1372us;1430us;1386us;1430us;1388us;1430us;1390us;1430us;1391us;1430us;1392us;1430us;1395us;1430us;1400us;1430us;1408us;1430us;1409us;1430us;1412us;1430us;1413us;1430us;1431us;1430us;1438us;1430us;1445us;1430us;1452us;1430us;1469us;1430us;1476us;1430us;1477us;1430us;1483us;1430us;1489us;1430us;1490us;1430us;1491us;1430us;1503us;1430us;1509us;1430us;1519us;1430us;1532us;1430us;1534us;1430us;1537us;1430us;1538us;1430us;1544us;1430us;1564us;1430us;1569us;1430us;1594us;1430us;1627us;1430us;1636us;1430us;1641us;1430us;1864us;1430us;2021us;1430us;2025us;1430us;16us;65535us;48us;1985us;79us;1985us;82us;1985us;83us;1985us;84us;1987us;87us;1985us;227us;1985us;246us;1985us;252us;1985us;257us;1985us;261us;1985us;262us;1985us;263us;1985us;264us;1985us;1985us;1985us;1987us;1987us;14us;65535us;48us;88us;79us;88us;82us;88us;83us;88us;87us;88us;227us;265us;246us;265us;252us;253us;257us;259us;261us;265us;262us;265us;263us;265us;264us;265us;1985us;1986us;2us;65535us;84us;85us;1987us;1988us;10us;65535us;172us;2002us;318us;328us;406us;2002us;542us;2002us;721us;722us;914us;916us;916us;918us;997us;1028us;1019us;1021us;1051us;1052us;4us;65535us;221us;222us;312us;313us;517us;518us;520us;521us;2us;65535us;1611us;1612us;1621us;1622us;10us;65535us;118us;119us;443us;444us;456us;457us;459us;460us;461us;462us;463us;464us;469us;470us;548us;549us;550us;551us;554us;555us;2us;65535us;65us;66us;233us;234us;0us;65535us;18us;65535us;76us;77us;138us;139us;243us;244us;320us;321us;323us;324us;372us;373us;473us;474us;672us;704us;699us;700us;702us;703us;1086us;1087us;1136us;1144us;1169us;1170us;1176us;1177us;1183us;1184us;1598us;1602us;1599us;1600us;1622us;1623us;8us;65535us;172us;173us;318us;319us;406us;407us;542us;543us;721us;724us;914us;915us;997us;1027us;1019us;1020us;4us;65535us;52us;53us;57us;58us;749us;750us;755us;756us;0us;65535us;11us;65535us;105us;106us;179us;180us;409us;418us;411us;418us;416us;418us;442us;424us;450us;451us;546us;805us;547us;424us;553us;424us;802us;805us;7us;65535us;106us;107us;193us;727us;196us;727us;477us;478us;486us;487us;725us;727us;805us;806us;4us;65535us;1064us;1154us;1136us;1137us;1146us;1147us;1216us;1292us;9us;65535us;1062us;1141us;1063us;1151us;1065us;1158us;1066us;1300us;1138us;1139us;1148us;1149us;1155us;1156us;1293us;1294us;1296us;1297us;2us;65535us;281us;306us;296us;306us;2us;65535us;95us;127us;120us;123us;2us;65535us;70us;95us;94us;95us;302us;65535us;6us;847us;8us;847us;31us;847us;40us;42us;111us;847us;114us;847us;116us;847us;149us;847us;178us;847us;184us;847us;188us;847us;190us;847us;201us;847us;237us;847us;251us;847us;274us;847us;290us;847us;331us;847us;335us;847us;340us;847us;385us;847us;419us;847us;422us;847us;424us;847us;427us;847us;439us;847us;446us;847us;454us;847us;465us;847us;468us;847us;481us;847us;491us;847us;497us;847us;522us;847us;525us;847us;561us;847us;569us;847us;570us;571us;613us;847us;626us;847us;630us;847us;635us;847us;640us;847us;643us;847us;653us;847us;664us;847us;679us;847us;681us;847us;684us;847us;688us;847us;690us;847us;701us;847us;705us;847us;708us;847us;711us;847us;714us;847us;730us;847us;744us;847us;753us;847us;759us;847us;806us;847us;809us;847us;813us;847us;823us;847us;829us;847us;873us;847us;899us;847us;901us;847us;902us;847us;906us;847us;907us;847us;910us;847us;912us;847us;913us;847us;922us;847us;926us;847us;927us;847us;929us;847us;931us;847us;934us;847us;936us;847us;938us;847us;941us;847us;945us;847us;947us;847us;949us;847us;957us;847us;960us;847us;971us;847us;979us;847us;1000us;847us;1002us;847us;1005us;847us;1008us;847us;1009us;847us;1011us;847us;1012us;847us;1015us;847us;1017us;847us;1018us;847us;1024us;847us;1028us;847us;1030us;847us;1036us;847us;1046us;847us;1052us;847us;1054us;847us;1057us;847us;1060us;847us;1078us;847us;1079us;847us;1083us;847us;1084us;847us;1090us;847us;1093us;847us;1096us;847us;1102us;847us;1106us;847us;1110us;847us;1116us;847us;1118us;847us;1123us;847us;1125us;847us;1127us;847us;1129us;847us;1131us;847us;1133us;847us;1135us;847us;1137us;847us;1147us;847us;1154us;847us;1160us;847us;1162us;847us;1166us;847us;1167us;847us;1171us;847us;1173us;847us;1174us;847us;1178us;847us;1181us;847us;1184us;847us;1186us;847us;1189us;847us;1191us;847us;1231us;847us;1234us;847us;1237us;847us;1240us;847us;1242us;847us;1246us;847us;1248us;847us;1250us;847us;1252us;847us;1254us;847us;1256us;847us;1258us;847us;1260us;847us;1262us;847us;1264us;847us;1266us;847us;1268us;847us;1270us;847us;1272us;847us;1274us;847us;1276us;847us;1278us;847us;1280us;847us;1282us;847us;1284us;847us;1286us;847us;1287us;847us;1288us;847us;1289us;847us;1292us;847us;1302us;847us;1305us;847us;1307us;847us;1313us;847us;1320us;847us;1322us;847us;1327us;847us;1328us;847us;1332us;847us;1334us;847us;1337us;847us;1338us;847us;1340us;847us;1343us;847us;1345us;847us;1347us;847us;1349us;847us;1351us;847us;1352us;847us;1353us;847us;1354us;847us;1356us;847us;1357us;847us;1359us;847us;1360us;847us;1362us;847us;1363us;847us;1365us;847us;1366us;847us;1368us;847us;1369us;847us;1371us;847us;1372us;847us;1374us;847us;1375us;847us;1378us;847us;1379us;847us;1386us;847us;1388us;847us;1390us;847us;1391us;847us;1392us;847us;1395us;847us;1400us;847us;1408us;847us;1409us;847us;1412us;847us;1413us;847us;1431us;847us;1438us;847us;1445us;847us;1452us;847us;1469us;847us;1476us;847us;1477us;847us;1483us;847us;1489us;847us;1490us;847us;1491us;847us;1503us;847us;1509us;847us;1517us;847us;1519us;847us;1532us;847us;1534us;847us;1537us;847us;1538us;847us;1541us;1542us;1544us;847us;1550us;847us;1553us;847us;1555us;847us;1557us;847us;1559us;847us;1564us;847us;1569us;847us;1594us;847us;1619us;847us;1627us;847us;1634us;847us;1636us;847us;1639us;847us;1641us;847us;1651us;847us;1653us;847us;1657us;847us;1659us;847us;1660us;847us;1664us;847us;1668us;847us;1671us;847us;1674us;847us;1677us;847us;1679us;847us;1681us;847us;1686us;847us;1690us;847us;1695us;847us;1700us;847us;1703us;847us;1706us;847us;1709us;847us;1714us;847us;1717us;847us;1719us;847us;1722us;847us;1726us;847us;1729us;847us;1731us;847us;1734us;847us;1737us;847us;1739us;847us;1751us;847us;1757us;847us;1760us;847us;1827us;847us;1831us;847us;1837us;847us;1844us;847us;1848us;847us;1854us;847us;1855us;847us;1864us;847us;1878us;847us;1880us;847us;1891us;847us;2021us;847us;2025us;847us;301us;65535us;6us;848us;8us;848us;31us;848us;40us;43us;111us;848us;114us;848us;116us;848us;149us;848us;178us;848us;184us;848us;188us;848us;190us;848us;201us;848us;237us;848us;251us;848us;274us;848us;290us;848us;331us;848us;335us;848us;340us;848us;385us;848us;419us;848us;422us;848us;424us;848us;427us;848us;439us;848us;446us;848us;454us;848us;465us;848us;468us;848us;481us;848us;491us;848us;497us;848us;522us;848us;525us;848us;561us;848us;569us;848us;570us;848us;613us;848us;626us;848us;630us;848us;635us;848us;640us;848us;643us;848us;653us;848us;664us;848us;679us;848us;681us;848us;684us;848us;688us;848us;690us;848us;701us;848us;705us;848us;708us;848us;711us;848us;714us;848us;730us;848us;744us;848us;753us;848us;759us;848us;806us;848us;809us;848us;813us;848us;823us;848us;829us;848us;873us;848us;899us;848us;901us;848us;902us;848us;906us;848us;907us;848us;910us;848us;912us;848us;913us;848us;922us;848us;926us;848us;927us;848us;929us;848us;931us;848us;934us;848us;936us;848us;938us;848us;941us;848us;945us;848us;947us;848us;949us;848us;957us;848us;960us;848us;971us;848us;979us;848us;1000us;848us;1002us;848us;1005us;848us;1008us;848us;1009us;848us;1011us;848us;1012us;848us;1015us;848us;1017us;848us;1018us;848us;1024us;848us;1028us;848us;1030us;848us;1036us;848us;1046us;848us;1052us;848us;1054us;848us;1057us;848us;1060us;848us;1078us;848us;1079us;848us;1083us;848us;1084us;848us;1090us;848us;1093us;848us;1096us;848us;1102us;848us;1106us;848us;1110us;848us;1116us;848us;1118us;848us;1123us;848us;1125us;848us;1127us;848us;1129us;848us;1131us;848us;1133us;848us;1135us;848us;1137us;848us;1147us;848us;1154us;848us;1160us;848us;1162us;848us;1166us;848us;1167us;848us;1171us;848us;1173us;848us;1174us;848us;1178us;848us;1181us;848us;1184us;848us;1186us;848us;1189us;848us;1191us;848us;1231us;848us;1234us;848us;1237us;848us;1240us;848us;1242us;848us;1246us;848us;1248us;848us;1250us;848us;1252us;848us;1254us;848us;1256us;848us;1258us;848us;1260us;848us;1262us;848us;1264us;848us;1266us;848us;1268us;848us;1270us;848us;1272us;848us;1274us;848us;1276us;848us;1278us;848us;1280us;848us;1282us;848us;1284us;848us;1286us;848us;1287us;848us;1288us;848us;1289us;848us;1292us;848us;1302us;848us;1305us;848us;1307us;848us;1313us;848us;1320us;848us;1322us;848us;1327us;848us;1328us;848us;1332us;848us;1334us;848us;1337us;848us;1338us;848us;1340us;848us;1343us;848us;1345us;848us;1347us;848us;1349us;848us;1351us;848us;1352us;848us;1353us;848us;1354us;848us;1356us;848us;1357us;848us;1359us;848us;1360us;848us;1362us;848us;1363us;848us;1365us;848us;1366us;848us;1368us;848us;1369us;848us;1371us;848us;1372us;848us;1374us;848us;1375us;848us;1378us;848us;1379us;848us;1386us;848us;1388us;848us;1390us;848us;1391us;848us;1392us;848us;1395us;848us;1400us;848us;1408us;848us;1409us;848us;1412us;848us;1413us;848us;1431us;848us;1438us;848us;1445us;848us;1452us;848us;1469us;848us;1476us;848us;1477us;848us;1483us;848us;1489us;848us;1490us;848us;1491us;848us;1503us;848us;1509us;848us;1517us;848us;1519us;848us;1532us;848us;1534us;848us;1537us;848us;1538us;848us;1544us;848us;1550us;848us;1553us;848us;1555us;848us;1557us;848us;1559us;848us;1564us;848us;1569us;848us;1594us;848us;1619us;848us;1627us;848us;1634us;848us;1636us;848us;1639us;848us;1641us;848us;1651us;848us;1653us;848us;1657us;848us;1659us;848us;1660us;848us;1664us;848us;1668us;848us;1671us;848us;1674us;848us;1677us;848us;1679us;848us;1681us;848us;1686us;848us;1690us;848us;1695us;848us;1700us;848us;1703us;848us;1706us;848us;1709us;848us;1714us;848us;1717us;848us;1719us;848us;1722us;848us;1726us;848us;1729us;848us;1731us;848us;1734us;848us;1737us;848us;1739us;848us;1751us;848us;1757us;848us;1760us;848us;1827us;848us;1831us;848us;1837us;848us;1844us;848us;1848us;848us;1854us;848us;1855us;848us;1864us;848us;1878us;848us;1880us;848us;1891us;848us;2021us;848us;2025us;848us;2us;65535us;2021us;2022us;2025us;2026us;4us;65535us;2021us;2024us;2022us;2023us;2025us;2029us;2026us;2027us;155us;65535us;6us;1462us;31us;1462us;114us;1462us;116us;1462us;237us;1462us;251us;1462us;274us;1462us;331us;1462us;335us;1462us;340us;1462us;422us;1462us;427us;1462us;468us;1462us;491us;1462us;525us;1462us;690us;1462us;701us;1462us;753us;1462us;759us;1462us;809us;1462us;813us;1462us;823us;1462us;1030us;1462us;1036us;1462us;1052us;1462us;1054us;1462us;1057us;1462us;1060us;1462us;1079us;1462us;1084us;1462us;1090us;1462us;1093us;1462us;1096us;1462us;1102us;1462us;1106us;1462us;1110us;1462us;1116us;1462us;1118us;1462us;1123us;1462us;1125us;1462us;1127us;1462us;1129us;1462us;1131us;1462us;1133us;1462us;1137us;1462us;1147us;1462us;1154us;1462us;1160us;1462us;1162us;1462us;1167us;1462us;1171us;1462us;1174us;1462us;1178us;1462us;1181us;1462us;1184us;1462us;1186us;1462us;1189us;1462us;1191us;1462us;1240us;1462us;1242us;1462us;1246us;1462us;1248us;1462us;1250us;1462us;1252us;1462us;1254us;1462us;1256us;1462us;1258us;1462us;1260us;1462us;1262us;1462us;1264us;1462us;1266us;1462us;1268us;1462us;1270us;1462us;1272us;1462us;1274us;1462us;1276us;1462us;1278us;1462us;1280us;1462us;1282us;1462us;1284us;1462us;1286us;1462us;1287us;1462us;1288us;1462us;1289us;1462us;1292us;1462us;1302us;1462us;1327us;1462us;1328us;1462us;1332us;1462us;1334us;1462us;1337us;1462us;1338us;1462us;1340us;1462us;1343us;1462us;1345us;1462us;1347us;1462us;1349us;1462us;1351us;1462us;1352us;1462us;1353us;1462us;1354us;1462us;1356us;1462us;1357us;1462us;1359us;1462us;1360us;1462us;1362us;1462us;1363us;1462us;1365us;1462us;1366us;1462us;1368us;1462us;1369us;1462us;1371us;1462us;1372us;1462us;1378us;1462us;1379us;1462us;1386us;1462us;1388us;1462us;1390us;1462us;1391us;1462us;1392us;1462us;1395us;1462us;1400us;1462us;1408us;1462us;1409us;1462us;1412us;1462us;1413us;1462us;1431us;1462us;1438us;1462us;1445us;1462us;1452us;1462us;1469us;1462us;1476us;1462us;1477us;1462us;1483us;1462us;1489us;1462us;1490us;1462us;1491us;1462us;1503us;1462us;1509us;1462us;1519us;1462us;1532us;1462us;1534us;1462us;1537us;1462us;1538us;1462us;1544us;1462us;1559us;1462us;1564us;1462us;1569us;1462us;1594us;1462us;1627us;1462us;1636us;1462us;1641us;1462us;1864us;1462us;2021us;1462us;2025us;1462us;11us;65535us;330us;331us;334us;335us;339us;340us;364us;365us;523us;525us;772us;773us;784us;788us;787us;788us;1376us;1378us;1377us;1379us;1558us;1559us;5us;65535us;109us;620us;182us;620us;452us;620us;596us;615us;926us;620us;14us;65535us;31us;276us;69us;99us;93us;99us;195us;198us;237us;276us;251us;276us;270us;276us;287us;290us;317us;344us;328us;344us;350us;475us;1542us;1549us;2033us;2035us;2034us;2035us;10us;65535us;31us;50us;69us;50us;93us;50us;237us;50us;251us;50us;270us;50us;317us;342us;328us;342us;2038us;2040us;2039us;2040us;9us;65535us;574us;580us;575us;576us;578us;579us;953us;954us;955us;956us;1075us;1523us;1519us;1525us;1520us;1521us;2043us;2044us;5us;65535us;585us;586us;588us;589us;1076us;1631us;1627us;1633us;1628us;1629us;44us;65535us;572us;573us;603us;604us;651us;652us;654us;655us;658us;659us;694us;695us;697us;698us;775us;776us;859us;860us;880us;883us;881us;882us;885us;886us;942us;943us;972us;973us;975us;976us;980us;981us;983us;984us;1073us;1496us;1074us;1497us;1226us;1504us;1245us;1439us;1303us;1304us;1446us;1447us;1450us;1451us;1489us;1492us;1490us;1492us;1491us;1492us;1493us;1494us;1508us;1509us;1515us;1516us;1551us;1552us;1555us;1556us;1752us;1753us;1838us;1839us;1849us;1851us;1850us;1851us;1856us;1857us;1867us;1868us;1903us;1904us;1930us;1931us;1932us;1933us;1936us;1937us;1939us;1940us;2048us;2049us;28us;65535us;75us;76us;79us;80us;117us;118us;121us;122us;125us;126us;141us;142us;159us;160us;167us;168us;213us;214us;242us;243us;246us;247us;263us;303us;293us;294us;297us;298us;300us;301us;338us;339us;371us;379us;375us;376us;395us;397us;399us;401us;538us;539us;814us;815us;1030us;1034us;1031us;1032us;1036us;1039us;1037us;1038us;1058us;1059us;2052us;2053us;1us;65535us;1493us;1495us;49us;65535us;317us;326us;319us;325us;389us;391us;467us;471us;490us;494us;522us;528us;906us;908us;907us;909us;910us;911us;998us;1536us;1011us;1013us;1012us;1014us;1015us;1016us;1135us;1157us;1136us;1143us;1137us;1142us;1138us;1140us;1246us;1247us;1248us;1249us;1250us;1251us;1252us;1253us;1254us;1255us;1256us;1257us;1258us;1259us;1260us;1261us;1262us;1263us;1264us;1265us;1266us;1267us;1268us;1269us;1270us;1271us;1272us;1273us;1274us;1275us;1276us;1277us;1278us;1279us;1280us;1281us;1282us;1283us;1284us;1285us;1343us;1344us;1345us;1346us;1347us;1348us;1349us;1350us;1534us;1535us;1593us;1597us;1594us;1596us;1873us;1874us;1880us;1884us;1885us;1887us;1926us;1928us;1976us;1978us;|] -let _fsyacc_sparseGotoTableRowOffsets = [|0us;1us;2us;3us;4us;5us;7us;15us;20us;26us;31us;36us;41us;46us;70us;72us;74us;76us;83us;88us;90us;93us;96us;99us;103us;110us;120us;130us;140us;143us;145us;148us;152us;154us;157us;160us;163us;167us;176us;185us;197us;201us;204us;207us;210us;216us;218us;220us;223us;226us;229us;233us;239us;249us;260us;271us;287us;312us;314us;316us;319us;321us;403us;526us;649us;651us;654us;657us;662us;669us;672us;676us;678us;681us;684us;687us;691us;700us;711us;713us;716us;720us;724us;729us;740us;744us;747us;749us;802us;825us;900us;902us;907us;910us;913us;916us;919us;923us;926us;931us;936us;939us;944us;954us;1038us;1123us;1128us;1138us;1140us;1142us;1146us;1152us;1154us;1156us;1161us;1165us;1169us;1173us;1177us;1182us;1184us;1188us;1194us;1198us;1202us;1204us;1208us;1212us;1220us;1228us;1235us;1239us;1243us;1247us;1252us;1259us;1261us;1263us;1384us;1392us;1513us;1633us;1637us;1643us;1764us;1766us;1768us;1772us;1775us;1777us;1782us;1785us;1791us;1794us;1796us;1799us;1801us;1803us;1805us;1808us;2109us;2111us;2116us;2120us;2328us;2332us;2336us;2339us;2341us;2343us;2358us;2373us;2388us;2392us;2396us;2437us;2444us;2456us;2509us;2512us;2537us;2562us;2587us;2590us;2593us;2597us;2625us;2632us;2638us;2691us;2693us;2751us;2948us;2953us;3070us;3073us;3075us;3080us;3085us;3093us;3101us;3103us;3105us;3108us;3111us;3113us;3230us;3365us;3501us;3506us;3655us;3659us;3815us;3971us;4179us;4335us;4491us;4495us;4499us;4501us;4657us;4659us;4661us;4663us;4665us;4667us;4669us;4671us;4673us;4677us;4679us;4684us;4686us;4688us;4690us;4693us;4700us;4707us;4711us;4717us;4721us;4723us;4725us;4727us;4730us;4732us;4737us;4743us;4899us;5057us;5174us;5291us;5295us;5301us;5305us;5315us;5325us;5330us;5344us;5355us;5389us;5391us;5425us;5435us;5518us;5636us;5754us;5837us;5861us;5867us;5870us;5953us;5958us;6042us;6136us;6141us;6148us;6158us;6161us;6165us;6167us;6174us;6181us;6188us;6194us;6326us;6712us;6857us;7075us;7083us;7086us;7094us;7107us;7165us;7175us;7324us;7341us;7356us;7359us;7370us;7375us;7378us;7389us;7392us;7393us;7412us;7421us;7426us;7427us;7439us;7447us;7452us;7462us;7465us;7468us;7471us;7774us;8076us;8079us;8084us;8240us;8252us;8258us;8273us;8284us;8294us;8300us;8345us;8374us;8376us;|] -let _fsyacc_stateToProdIdxsTableElements = [| 1us;0us;1us;0us;1us;1us;1us;1us;1us;2us;1us;2us;1us;3us;1us;3us;1us;4us;1us;4us;1us;5us;1us;6us;1us;7us;1us;8us;1us;9us;1us;10us;2us;11us;14us;1us;11us;2us;12us;15us;1us;12us;2us;13us;16us;1us;13us;1us;14us;1us;14us;1us;15us;1us;15us;1us;16us;1us;16us;2us;17us;18us;1us;18us;8us;19us;142us;143us;144us;145us;146us;147us;148us;8us;19us;142us;143us;144us;145us;146us;147us;148us;54us;19us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1us;20us;2us;21us;22us;1us;22us;1us;23us;1us;24us;1us;25us;1us;25us;2us;25us;27us;1us;27us;1us;28us;1us;29us;2us;30us;31us;1us;30us;1us;31us;1us;31us;3us;32us;50us;53us;1us;32us;3us;33us;34us;35us;3us;33us;34us;35us;3us;33us;34us;35us;3us;33us;34us;35us;3us;33us;1089us;1090us;1us;34us;1us;35us;2us;36us;37us;2us;36us;37us;3us;36us;1089us;1090us;1us;37us;2us;38us;39us;1us;39us;2us;40us;41us;1us;40us;1us;42us;1us;42us;1us;42us;7us;43us;57us;58us;59us;60us;61us;63us;7us;43us;57us;58us;59us;60us;61us;63us;4us;43us;57us;58us;59us;1us;43us;1us;44us;1us;45us;3us;46us;47us;48us;2us;46us;47us;1us;46us;1us;46us;1us;47us;3us;48us;50us;53us;1us;48us;1us;49us;2us;50us;53us;3us;50us;53us;59us;2us;52us;54us;2us;52us;54us;1us;52us;1us;53us;1us;53us;1us;53us;1us;55us;1us;56us;6us;57us;58us;59us;60us;61us;63us;6us;57us;58us;59us;60us;61us;63us;3us;57us;58us;59us;2us;57us;58us;1us;57us;1us;58us;1us;59us;1us;60us;1us;60us;1us;60us;1us;61us;1us;62us;1us;63us;1us;63us;1us;63us;1us;63us;1us;63us;1us;63us;1us;63us;1us;63us;1us;63us;1us;63us;2us;65us;66us;54us;65us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1us;66us;54us;66us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1us;66us;1us;66us;3us;67us;68us;155us;1us;67us;1us;67us;1us;68us;1us;68us;1us;68us;1us;68us;1us;69us;1us;69us;1us;69us;1us;70us;1us;70us;1us;70us;2us;72us;73us;1us;72us;1us;72us;1us;73us;3us;74us;83us;84us;1us;74us;1us;74us;1us;74us;1us;74us;1us;74us;1us;74us;1us;75us;1us;75us;1us;76us;1us;77us;1us;78us;1us;78us;1us;78us;1us;79us;3us;80us;81us;82us;2us;80us;81us;1us;80us;1us;81us;1us;82us;1us;82us;2us;83us;84us;2us;83us;84us;1us;83us;1us;84us;2us;85us;86us;2us;85us;86us;1us;85us;1us;86us;2us;87us;88us;2us;87us;88us;1us;87us;1us;88us;1us;89us;1us;90us;1us;92us;1us;92us;1us;92us;8us;93us;94us;95us;96us;97us;98us;99us;100us;13us;93us;94us;95us;96us;97us;98us;99us;100us;296us;297us;298us;299us;300us;8us;93us;94us;95us;96us;97us;98us;99us;100us;13us;93us;94us;95us;96us;97us;98us;99us;100us;296us;297us;298us;299us;300us;1us;93us;1us;93us;1us;93us;1us;93us;1us;93us;1us;93us;1us;93us;1us;93us;1us;93us;1us;94us;4us;94us;985us;986us;987us;2us;95us;96us;4us;95us;985us;986us;987us;1us;96us;1us;97us;1us;97us;6us;98us;99us;185us;186us;229us;230us;1us;98us;1us;98us;1us;99us;1us;99us;1us;100us;1us;100us;1us;100us;1us;102us;1us;102us;2us;103us;104us;2us;103us;104us;1us;103us;1us;104us;3us;105us;106us;107us;2us;106us;107us;1us;106us;1us;107us;1us;108us;1us;108us;1us;108us;1us;109us;1us;110us;1us;111us;1us;111us;1us;112us;1us;112us;1us;112us;2us;114us;115us;1us;114us;1us;115us;1us;115us;2us;116us;139us;1us;116us;2us;117us;118us;1us;118us;2us;119us;120us;1us;119us;1us;121us;1us;121us;1us;121us;12us;122us;130us;131us;132us;134us;142us;143us;144us;145us;146us;147us;148us;11us;122us;130us;131us;132us;142us;143us;144us;145us;146us;147us;148us;3us;122us;147us;148us;1us;122us;1us;123us;3us;124us;125us;126us;2us;124us;125us;1us;124us;1us;124us;1us;125us;2us;126us;139us;1us;126us;1us;127us;1us;128us;11us;130us;131us;132us;134us;142us;143us;144us;145us;146us;147us;148us;10us;130us;131us;132us;142us;143us;144us;145us;146us;147us;148us;56us;130us;131us;132us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;2us;130us;131us;1us;130us;1us;133us;1us;134us;4us;135us;136us;137us;138us;1us;135us;2us;136us;138us;1us;136us;1us;139us;2us;139us;148us;2us;139us;161us;2us;139us;166us;1us;139us;1us;139us;1us;140us;1us;141us;7us;142us;143us;144us;145us;146us;147us;148us;7us;142us;143us;144us;145us;146us;147us;148us;1us;142us;3us;142us;595us;596us;1us;143us;5us;143us;597us;598us;599us;600us;1us;144us;1us;145us;1us;145us;1us;145us;1us;146us;2us;147us;148us;1us;147us;1us;147us;1us;148us;2us;149us;168us;1us;149us;1us;150us;4us;151us;152us;153us;154us;3us;151us;1089us;1090us;1us;152us;2us;153us;154us;4us;153us;985us;986us;987us;1us;154us;3us;155us;1089us;1090us;1us;155us;3us;156us;1089us;1090us;5us;157us;158us;159us;160us;161us;2us;157us;158us;1us;157us;1us;158us;2us;159us;160us;1us;159us;1us;160us;1us;161us;1us;162us;3us;163us;1089us;1090us;3us;164us;165us;166us;2us;164us;165us;1us;164us;1us;165us;1us;166us;1us;167us;1us;167us;1us;167us;1us;168us;2us;170us;171us;1us;171us;4us;172us;173us;174us;175us;3us;172us;174us;177us;2us;172us;174us;1us;172us;1us;172us;2us;173us;590us;1us;173us;1us;173us;1us;174us;1us;175us;1us;176us;2us;177us;1160us;1us;177us;3us;178us;1089us;1090us;1us;178us;1us;178us;2us;179us;180us;3us;179us;1089us;1090us;1us;179us;1us;179us;1us;180us;3us;180us;1089us;1090us;1us;180us;1us;180us;1us;180us;1us;181us;1us;181us;1us;182us;1us;182us;2us;183us;1088us;1us;183us;1us;184us;1us;184us;7us;185us;186us;229us;230us;232us;240us;246us;1us;185us;1us;187us;1us;188us;1us;189us;1us;190us;1us;190us;1us;190us;1us;191us;1us;191us;1us;191us;4us;193us;194us;195us;196us;1us;194us;2us;195us;196us;2us;195us;196us;2us;195us;196us;2us;195us;196us;2us;195us;196us;1us;195us;1us;195us;1us;196us;5us;197us;198us;199us;208us;209us;2us;197us;198us;2us;197us;198us;2us;197us;198us;2us;197us;198us;1us;197us;1us;197us;1us;198us;1us;199us;1us;200us;1us;200us;1us;201us;1us;202us;1us;203us;1us;203us;1us;203us;1us;204us;3us;205us;206us;207us;2us;205us;206us;1us;205us;1us;206us;2us;207us;214us;1us;207us;2us;208us;209us;2us;208us;209us;1us;208us;1us;209us;2us;210us;211us;2us;210us;211us;1us;210us;1us;211us;1us;212us;1us;213us;1us;214us;1us;214us;1us;216us;1us;216us;1us;216us;1us;217us;1us;217us;2us;218us;219us;2us;218us;219us;1us;218us;1us;219us;2us;220us;221us;1us;221us;1us;221us;1us;222us;1us;222us;1us;222us;1us;222us;1us;222us;1us;222us;4us;223us;224us;225us;226us;4us;223us;224us;225us;226us;4us;223us;224us;225us;226us;1us;223us;1us;223us;1us;224us;1us;225us;1us;226us;2us;227us;228us;1us;228us;2us;229us;230us;1us;230us;16us;231us;232us;233us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;21us;231us;232us;233us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;296us;297us;298us;299us;300us;16us;231us;232us;233us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;21us;231us;232us;233us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;296us;297us;298us;299us;300us;1us;231us;1us;232us;3us;233us;234us;241us;1us;233us;1us;233us;1us;234us;2us;235us;236us;4us;235us;985us;986us;987us;1us;235us;1us;236us;1us;237us;1us;237us;1us;237us;1us;237us;1us;237us;1us;237us;1us;237us;1us;237us;1us;238us;1us;239us;1us;239us;1us;240us;1us;240us;1us;241us;1us;241us;4us;242us;243us;244us;245us;3us;242us;243us;244us;3us;242us;243us;244us;1us;242us;1us;242us;1us;242us;1us;243us;1us;244us;1us;245us;1us;245us;1us;246us;1us;246us;4us;247us;248us;249us;250us;4us;247us;248us;249us;250us;4us;247us;248us;249us;250us;3us;247us;248us;249us;2us;247us;248us;1us;247us;1us;248us;1us;249us;1us;250us;4us;251us;252us;253us;254us;4us;251us;252us;253us;254us;4us;251us;252us;253us;254us;3us;251us;252us;253us;3us;251us;252us;253us;1us;251us;1us;251us;1us;251us;1us;252us;1us;253us;1us;254us;2us;256us;257us;1us;256us;1us;257us;2us;258us;528us;1us;258us;1us;258us;1us;259us;1us;259us;1us;259us;1us;260us;2us;261us;262us;1us;261us;1us;261us;1us;261us;1us;262us;1us;264us;1us;265us;1us;266us;1us;267us;2us;268us;269us;1us;268us;1us;268us;1us;271us;1us;271us;1us;271us;3us;273us;274us;275us;2us;273us;274us;1us;273us;1us;274us;1us;274us;1us;274us;1us;275us;1us;276us;2us;278us;279us;1us;278us;1us;279us;1us;280us;2us;282us;283us;1us;282us;1us;283us;2us;284us;285us;2us;284us;285us;1us;284us;1us;285us;1us;286us;2us;287us;288us;2us;287us;288us;1us;287us;4us;289us;290us;291us;292us;5us;289us;290us;291us;292us;429us;3us;289us;290us;291us;1us;289us;1us;289us;1us;290us;1us;290us;1us;291us;1us;292us;1us;292us;1us;292us;1us;293us;1us;293us;1us;294us;1us;295us;5us;296us;297us;298us;299us;300us;5us;296us;297us;298us;299us;300us;4us;296us;981us;1089us;1090us;1us;296us;1us;296us;1us;296us;1us;297us;1us;298us;1us;299us;5us;300us;988us;1038us;1039us;1050us;2us;300us;1035us;2us;300us;460us;1us;300us;1us;300us;4us;301us;302us;303us;304us;2us;301us;302us;1us;301us;1us;302us;1us;303us;1us;303us;1us;304us;6us;305us;1040us;1041us;1042us;1043us;1044us;1us;305us;1us;306us;3us;307us;308us;309us;2us;307us;308us;1us;307us;1us;308us;1us;309us;1us;309us;1us;310us;1us;311us;1us;312us;1us;313us;1us;314us;4us;315us;316us;317us;318us;4us;315us;317us;1089us;1090us;1us;316us;3us;316us;1089us;1090us;1us;317us;1us;318us;1us;319us;1us;320us;2us;320us;321us;1us;320us;2us;321us;325us;3us;321us;326us;327us;1us;321us;2us;321us;326us;1us;321us;1us;322us;2us;323us;324us;2us;323us;324us;1us;324us;2us;324us;336us;1us;325us;1us;325us;1us;325us;1us;325us;1us;326us;1us;329us;1us;329us;1us;329us;1us;329us;1us;329us;1us;330us;1us;333us;2us;333us;334us;2us;334us;928us;2us;334us;930us;1us;334us;1us;334us;1us;335us;2us;336us;979us;2us;336us;980us;1us;336us;3us;336us;1052us;1053us;3us;337us;1052us;1053us;1us;338us;1us;338us;1us;338us;1us;338us;11us;339us;340us;341us;342us;343us;345us;346us;347us;979us;982us;991us;2us;339us;991us;2us;339us;991us;7us;340us;341us;342us;343us;345us;346us;347us;1us;340us;3us;341us;346us;347us;1us;341us;1us;342us;1us;343us;1us;343us;1us;343us;5us;344us;988us;1038us;1039us;1050us;2us;344us;349us;1us;344us;1us;344us;1us;344us;1us;344us;1us;344us;1us;345us;1us;345us;1us;346us;4us;348us;985us;986us;987us;1us;349us;4us;349us;985us;986us;987us;9us;350us;964us;965us;969us;970us;971us;985us;986us;987us;1us;351us;1us;351us;1us;352us;1us;352us;1us;352us;2us;353us;371us;1us;354us;2us;355us;356us;1us;355us;1us;355us;9us;357us;358us;359us;360us;361us;362us;363us;364us;365us;9us;357us;358us;359us;360us;361us;362us;363us;364us;365us;6us;357us;359us;360us;363us;364us;365us;1us;358us;2us;359us;363us;1us;359us;1us;360us;2us;361us;362us;1us;361us;1us;362us;1us;363us;1us;364us;1us;364us;1us;365us;6us;365us;769us;770us;771us;775us;778us;1us;366us;6us;367us;368us;1091us;1092us;1094us;1095us;1us;367us;1us;367us;1us;368us;1us;368us;1us;368us;6us;369us;370us;372us;373us;375us;1088us;1us;369us;2us;370us;375us;7us;370us;375us;769us;770us;771us;775us;778us;2us;370us;375us;1us;371us;2us;372us;373us;1us;372us;1us;373us;1us;374us;1us;374us;2us;376us;377us;1us;376us;1us;376us;3us;378us;380us;1088us;2us;378us;380us;8us;378us;955us;956us;957us;958us;985us;986us;987us;8us;379us;955us;956us;957us;958us;985us;986us;987us;1us;380us;1us;381us;1us;382us;1us;383us;2us;384us;385us;2us;384us;1160us;1us;384us;1us;385us;1us;386us;1us;386us;4us;387us;388us;389us;390us;4us;387us;388us;389us;390us;3us;387us;388us;389us;2us;387us;388us;1us;387us;1us;388us;1us;389us;1us;390us;1us;391us;1us;391us;2us;392us;393us;2us;392us;393us;2us;392us;393us;1us;392us;1us;392us;1us;393us;3us;394us;395us;396us;2us;395us;396us;1us;395us;1us;396us;1us;398us;3us;398us;1089us;1090us;1us;399us;1us;399us;1us;399us;1us;400us;1us;401us;1us;401us;1us;402us;1us;402us;1us;402us;1us;402us;2us;403us;404us;1us;403us;1us;403us;1us;404us;1us;405us;1us;406us;1us;407us;1us;408us;1us;409us;1us;410us;1us;411us;1us;411us;1us;411us;1us;411us;1us;411us;1us;411us;1us;411us;1us;411us;2us;412us;415us;2us;413us;416us;1us;415us;1us;415us;1us;416us;1us;416us;2us;417us;418us;5us;417us;418us;420us;421us;422us;1us;418us;3us;419us;1089us;1090us;4us;420us;421us;422us;424us;1us;420us;1us;420us;1us;420us;1us;421us;1us;422us;1us;423us;2us;423us;425us;1us;423us;2us;424us;425us;1us;426us;1us;426us;1us;427us;1us;427us;1us;427us;1us;429us;1us;429us;1us;430us;3us;431us;432us;433us;3us;431us;432us;433us;3us;431us;432us;433us;3us;431us;432us;433us;2us;431us;432us;1us;431us;1us;432us;1us;433us;2us;434us;435us;2us;434us;435us;1us;434us;1us;435us;1us;436us;1us;437us;2us;437us;438us;1us;438us;1us;440us;2us;440us;441us;1us;440us;1us;440us;1us;441us;1us;441us;1us;442us;2us;443us;444us;1us;443us;1us;443us;1us;444us;1us;445us;1us;446us;1us;447us;1us;448us;1us;449us;1us;450us;1us;451us;1us;452us;1us;453us;1us;454us;1us;455us;1us;456us;1us;457us;1us;458us;1us;459us;1us;460us;1us;461us;1us;462us;2us;463us;465us;1us;463us;1us;463us;2us;464us;466us;2us;464us;466us;1us;464us;1us;464us;1us;467us;1us;468us;1us;468us;1us;468us;1us;469us;1us;470us;1us;470us;2us;471us;472us;1us;472us;1us;472us;7us;473us;488us;489us;490us;495us;497us;501us;1us;474us;1us;475us;1us;475us;3us;476us;477us;478us;4us;476us;477us;479us;480us;2us;476us;477us;1us;476us;1us;477us;1us;478us;1us;480us;1us;480us;1us;481us;5us;483us;484us;485us;486us;487us;2us;483us;485us;1us;483us;1us;484us;1us;485us;2us;486us;590us;1us;486us;1us;487us;7us;488us;489us;489us;490us;495us;497us;501us;7us;488us;489us;490us;490us;495us;497us;501us;7us;488us;489us;490us;494us;495us;497us;501us;7us;488us;489us;490us;495us;495us;497us;501us;7us;488us;489us;490us;495us;497us;498us;501us;7us;488us;489us;490us;495us;497us;500us;501us;7us;488us;489us;490us;495us;497us;501us;501us;7us;488us;489us;490us;495us;497us;501us;592us;7us;488us;489us;490us;495us;497us;501us;593us;7us;488us;489us;490us;495us;497us;501us;643us;8us;488us;489us;490us;495us;497us;501us;644us;645us;1us;488us;1us;488us;1us;489us;1us;490us;3us;491us;494us;496us;2us;492us;500us;1us;493us;2us;494us;496us;2us;495us;497us;1us;496us;1us;497us;2us;498us;499us;1us;499us;1us;500us;1us;501us;3us;502us;503us;504us;1us;502us;3us;503us;504us;1160us;1us;503us;1us;504us;1us;504us;3us;505us;506us;507us;6us;505us;506us;507us;1127us;1129us;1130us;2us;505us;506us;9us;505us;545us;546us;549us;550us;552us;555us;557us;561us;1us;506us;1us;507us;8us;508us;509us;510us;511us;512us;513us;514us;530us;4us;508us;509us;510us;511us;1us;509us;1us;510us;1us;510us;1us;511us;1us;511us;1us;512us;1us;513us;1us;513us;1us;514us;1us;514us;1us;515us;1us;515us;1us;516us;9us;517us;535us;536us;537us;538us;1091us;1092us;1094us;1095us;1us;517us;1us;517us;1us;518us;4us;519us;520us;521us;522us;1us;519us;1us;520us;1us;520us;1us;521us;1us;521us;1us;523us;2us;524us;525us;1us;524us;1us;524us;1us;525us;1us;525us;1us;526us;1us;526us;1us;526us;1us;527us;1us;527us;1us;527us;1us;529us;2us;529us;1112us;1us;529us;1us;530us;1us;531us;1us;532us;1us;533us;1us;534us;8us;535us;536us;537us;538us;1091us;1092us;1094us;1095us;2us;535us;536us;1us;535us;1us;536us;3us;537us;590us;1092us;2us;537us;1092us;1us;538us;4us;539us;540us;541us;542us;4us;539us;540us;541us;542us;5us;539us;540us;547us;554us;556us;1us;539us;1us;540us;2us;541us;590us;1us;541us;1us;542us;9us;543us;545us;546us;549us;550us;552us;555us;557us;561us;9us;545us;546us;546us;549us;550us;552us;555us;557us;561us;9us;545us;546us;549us;550us;551us;552us;555us;557us;561us;9us;545us;546us;549us;550us;552us;552us;555us;557us;561us;9us;545us;546us;549us;550us;552us;554us;555us;557us;561us;9us;545us;546us;549us;550us;552us;555us;555us;557us;561us;9us;545us;546us;549us;550us;552us;555us;557us;558us;561us;9us;545us;546us;549us;550us;552us;555us;557us;560us;561us;8us;545us;546us;549us;550us;552us;555us;557us;561us;9us;545us;546us;549us;550us;552us;555us;557us;561us;561us;9us;545us;546us;549us;550us;552us;555us;557us;561us;564us;10us;545us;546us;549us;550us;552us;555us;557us;561us;568us;569us;14us;545us;546us;549us;550us;552us;555us;557us;561us;637us;638us;852us;853us;854us;855us;9us;545us;546us;549us;550us;552us;555us;557us;561us;720us;1us;545us;1us;545us;1us;546us;3us;547us;554us;556us;2us;548us;560us;2us;549us;550us;1us;549us;1us;550us;1us;551us;1us;552us;1us;553us;2us;554us;556us;2us;555us;557us;1us;556us;1us;557us;2us;558us;559us;1us;559us;1us;560us;1us;561us;2us;562us;563us;1us;562us;2us;563us;1160us;1us;563us;5us;564us;565us;566us;1089us;1090us;2us;564us;565us;1us;565us;1us;566us;1us;568us;2us;569us;1160us;1us;569us;3us;570us;571us;572us;2us;570us;571us;1us;570us;1us;571us;1us;572us;1us;573us;2us;574us;575us;1us;574us;1us;574us;1us;575us;54us;576us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;2us;577us;578us;1us;577us;1us;579us;2us;579us;922us;3us;580us;581us;582us;2us;580us;581us;1us;580us;1us;581us;1us;583us;1us;583us;58us;584us;585us;586us;587us;588us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;2us;584us;585us;1us;584us;1us;587us;1us;587us;1us;588us;1us;588us;1us;588us;1us;588us;5us;589us;597us;598us;599us;600us;1us;590us;2us;590us;626us;2us;590us;632us;2us;590us;635us;2us;590us;637us;2us;590us;709us;2us;590us;719us;2us;590us;723us;2us;590us;783us;2us;590us;796us;2us;590us;815us;2us;590us;819us;2us;590us;824us;3us;590us;824us;1092us;2us;590us;840us;2us;590us;914us;1us;591us;1us;592us;1us;592us;1us;592us;1us;592us;1us;592us;1us;593us;1us;593us;1us;593us;1us;593us;1us;593us;1us;593us;2us;595us;596us;2us;595us;596us;1us;595us;1us;596us;4us;597us;598us;599us;600us;1us;597us;1us;598us;2us;599us;600us;1us;599us;1us;600us;1us;601us;1us;602us;1us;603us;2us;604us;605us;2us;604us;605us;1us;604us;1us;605us;2us;606us;607us;2us;606us;607us;1us;606us;1us;607us;5us;608us;609us;610us;611us;612us;3us;608us;609us;612us;1us;608us;1us;609us;2us;610us;611us;1us;611us;1us;612us;1us;612us;3us;613us;614us;615us;55us;613us;614us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1us;613us;1us;614us;1us;615us;1us;616us;54us;616us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;2us;617us;618us;54us;617us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1us;619us;1us;619us;2us;620us;621us;1us;620us;1us;622us;1us;622us;1us;623us;1us;623us;15us;624us;625us;626us;627us;628us;629us;630us;631us;632us;633us;634us;635us;636us;637us;638us;6us;624us;625us;626us;627us;628us;629us;4us;624us;625us;626us;627us;2us;624us;625us;1us;624us;1us;625us;1us;626us;1us;627us;1us;628us;1us;629us;1us;629us;5us;630us;631us;632us;633us;634us;4us;630us;631us;632us;633us;2us;630us;631us;1us;630us;1us;631us;1us;632us;1us;633us;1us;634us;1us;635us;1us;635us;1us;635us;1us;636us;1us;637us;2us;638us;1221us;2us;639us;641us;54us;639us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;2us;640us;642us;54us;640us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1us;641us;1us;642us;1us;643us;1us;643us;1us;643us;1us;643us;1us;643us;1us;643us;1us;643us;2us;644us;645us;2us;644us;645us;2us;644us;645us;2us;644us;645us;2us;644us;645us;1us;644us;1us;644us;1us;645us;1us;646us;1us;646us;1us;646us;1us;646us;1us;646us;1us;647us;1us;647us;1us;647us;1us;648us;54us;648us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1us;649us;1us;649us;54us;650us;651us;652us;653us;654us;655us;656us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;744us;745us;746us;747us;57us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;704us;705us;706us;707us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;727us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;731us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;736us;744us;745us;746us;747us;55us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;738us;739us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;740us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;742us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;745us;746us;747us;53us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;747us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;830us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;852us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;855us;54us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;855us;55us;650us;651us;652us;653us;654us;655us;656us;659us;660us;661us;662us;663us;664us;665us;666us;667us;668us;669us;670us;671us;672us;673us;674us;675us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;744us;745us;746us;747us;1182us;1183us;2us;650us;651us;1us;650us;1us;651us;2us;652us;653us;1us;652us;1us;653us;2us;654us;655us;1us;654us;1us;655us;1us;656us;2us;657us;703us;1us;657us;1us;657us;5us;658us;740us;741us;742us;743us;7us;658us;740us;741us;742us;743us;785us;786us;2us;659us;660us;1us;660us;2us;661us;662us;1us;662us;2us;663us;664us;1us;664us;2us;665us;666us;1us;666us;2us;667us;668us;1us;668us;2us;669us;670us;1us;670us;2us;671us;672us;1us;672us;2us;673us;674us;1us;674us;2us;675us;676us;1us;676us;2us;677us;678us;1us;678us;2us;679us;680us;1us;680us;2us;681us;682us;1us;682us;2us;683us;684us;1us;684us;2us;685us;686us;1us;686us;2us;687us;688us;1us;688us;2us;689us;690us;1us;690us;2us;691us;692us;1us;692us;2us;693us;694us;1us;694us;2us;695us;696us;1us;696us;2us;697us;698us;1us;698us;2us;699us;700us;1us;701us;3us;701us;1119us;1120us;2us;701us;1120us;1us;702us;2us;702us;1107us;3us;704us;705us;706us;2us;704us;705us;1us;704us;1us;705us;1us;706us;1us;706us;1us;707us;1us;708us;1us;709us;1us;710us;1us;711us;1us;711us;1us;711us;1us;712us;1us;712us;3us;713us;714us;715us;2us;713us;714us;1us;713us;1us;714us;1us;715us;1us;716us;2us;717us;718us;1us;717us;1us;718us;1us;719us;1us;720us;6us;721us;722us;723us;724us;725us;726us;4us;721us;722us;724us;725us;2us;722us;724us;1us;722us;1us;723us;1us;723us;1us;724us;1us;725us;1us;726us;1us;727us;1us;729us;1us;729us;1us;730us;1us;730us;2us;731us;732us;1us;732us;2us;733us;734us;1us;733us;1us;734us;1us;736us;1us;737us;1us;737us;2us;738us;739us;1us;738us;1us;739us;4us;740us;741us;742us;743us;1us;741us;2us;742us;743us;1us;743us;4us;744us;745us;746us;747us;1us;744us;2us;746us;747us;1us;746us;1us;748us;2us;748us;1085us;3us;748us;1085us;1099us;2us;748us;1099us;1us;748us;1us;749us;2us;749us;1106us;1us;749us;1us;750us;2us;750us;1102us;1us;750us;1us;751us;2us;751us;1105us;1us;751us;1us;752us;2us;752us;1118us;1us;752us;1us;753us;2us;753us;1113us;1us;753us;1us;754us;2us;754us;1114us;1us;754us;4us;755us;756us;757us;758us;8us;755us;756us;757us;758us;896us;897us;898us;899us;3us;755us;756us;757us;7us;755us;756us;757us;896us;897us;898us;899us;3us;755us;756us;757us;5us;755us;756us;757us;897us;898us;2us;755us;756us;4us;755us;756us;897us;898us;1us;755us;1us;755us;1us;757us;1us;758us;1us;759us;1us;759us;1us;760us;1us;760us;2us;761us;762us;8us;761us;762us;870us;871us;872us;876us;877us;878us;7us;762us;870us;871us;872us;876us;877us;878us;1us;762us;6us;763us;769us;770us;771us;775us;778us;1us;764us;6us;764us;769us;770us;771us;775us;778us;6us;765us;769us;770us;771us;775us;778us;3us;766us;767us;768us;6us;766us;767us;768us;873us;874us;875us;2us;766us;767us;6us;766us;769us;770us;771us;775us;778us;1us;767us;1us;768us;6us;769us;769us;770us;771us;775us;778us;6us;769us;770us;770us;771us;775us;778us;6us;769us;770us;771us;772us;775us;778us;6us;769us;770us;771us;775us;778us;1047us;1us;769us;1us;770us;1us;771us;1us;771us;1us;772us;2us;772us;1096us;1us;773us;2us;773us;1084us;1us;773us;2us;773us;1084us;1us;774us;1us;775us;1us;775us;1us;776us;1us;776us;1us;776us;1us;777us;2us;777us;1112us;1us;777us;1us;778us;1us;778us;1us;779us;1us;780us;4us;781us;782us;783us;784us;2us;781us;782us;1us;781us;1us;782us;1us;783us;1us;784us;3us;785us;786us;910us;2us;785us;786us;1us;785us;1us;786us;1us;787us;1us;788us;1us;789us;1us;791us;6us;792us;793us;1091us;1092us;1094us;1095us;1us;792us;1us;792us;1us;792us;1us;792us;1us;793us;1us;793us;4us;794us;795us;796us;797us;2us;794us;795us;1us;794us;1us;795us;1us;796us;1us;797us;1us;798us;1us;799us;1us;800us;1us;801us;1us;802us;1us;803us;1us;804us;1us;805us;1us;806us;1us;807us;1us;808us;4us;809us;810us;811us;812us;2us;809us;810us;1us;809us;1us;810us;1us;811us;1us;811us;1us;812us;4us;813us;814us;815us;816us;5us;813us;814us;815us;816us;1121us;2us;813us;814us;1us;813us;1us;814us;1us;815us;1us;816us;4us;817us;818us;819us;820us;2us;817us;818us;1us;817us;1us;818us;1us;819us;1us;820us;10us;821us;822us;823us;824us;825us;826us;827us;828us;829us;830us;15us;821us;822us;823us;824us;825us;826us;827us;828us;829us;830us;835us;1091us;1092us;1094us;1095us;14us;821us;822us;823us;824us;825us;826us;827us;828us;829us;830us;1091us;1092us;1094us;1095us;1us;821us;2us;822us;823us;1us;822us;1us;823us;1us;824us;2us;824us;1092us;1us;825us;1us;826us;1us;827us;1us;828us;1us;829us;1us;830us;1us;830us;1us;831us;1us;831us;1us;831us;1us;831us;1us;831us;1us;831us;1us;832us;1us;833us;1us;834us;2us;834us;837us;2us;835us;836us;1us;835us;1us;836us;4us;836us;985us;986us;987us;5us;838us;839us;840us;841us;842us;2us;838us;839us;1us;838us;1us;839us;1us;840us;1us;841us;1us;842us;1us;843us;1us;844us;1us;845us;1us;846us;1us;848us;1us;850us;1us;851us;1us;851us;2us;852us;853us;1us;853us;1us;854us;1us;855us;1us;855us;1us;856us;1us;857us;1us;858us;1us;858us;1us;858us;2us;858us;859us;1us;858us;1us;858us;1us;859us;1us;862us;1us;864us;1us;864us;1us;864us;1us;864us;2us;866us;867us;1us;866us;5us;867us;988us;1038us;1039us;1050us;1us;867us;1us;868us;1us;868us;1us;868us;1us;868us;2us;868us;887us;1us;868us;1us;869us;2us;870us;871us;1us;870us;2us;870us;887us;1us;870us;1us;871us;2us;874us;875us;1us;875us;2us;875us;887us;1us;875us;1us;876us;1us;876us;2us;876us;887us;1us;876us;2us;877us;878us;1us;877us;1us;877us;1us;878us;2us;878us;887us;1us;878us;1us;878us;1us;879us;2us;879us;887us;2us;881us;884us;2us;882us;883us;1us;883us;1us;884us;3us;885us;1089us;1090us;1us;886us;1us;887us;5us;889us;890us;891us;892us;893us;3us;889us;890us;891us;1us;889us;1us;891us;1us;893us;2us;894us;895us;1us;894us;1us;894us;1us;894us;1us;895us;1us;895us;1us;897us;1us;900us;2us;902us;904us;1us;902us;1us;903us;1us;903us;1us;903us;1us;904us;1us;904us;1us;905us;1us;905us;1us;907us;1us;907us;1us;908us;1us;908us;1us;909us;4us;909us;985us;986us;987us;1us;909us;1us;909us;1us;909us;1us;910us;1us;910us;1us;911us;5us;912us;913us;914us;915us;916us;2us;912us;913us;1us;912us;1us;913us;1us;914us;1us;915us;1us;916us;2us;917us;918us;2us;917us;918us;2us;917us;918us;1us;917us;1us;918us;6us;919us;920us;921us;922us;923us;924us;5us;919us;920us;921us;922us;923us;4us;919us;920us;921us;922us;2us;919us;920us;1us;919us;1us;920us;1us;921us;1us;921us;1us;923us;1us;923us;1us;924us;1us;924us;1us;925us;1us;925us;1us;926us;1us;926us;1us;926us;2us;927us;928us;1us;928us;2us;929us;930us;1us;930us;2us;932us;933us;1us;932us;1us;933us;3us;934us;935us;936us;2us;934us;935us;1us;934us;1us;935us;3us;937us;938us;940us;2us;937us;938us;1us;937us;1us;938us;1us;939us;1us;939us;3us;941us;942us;944us;2us;941us;942us;1us;941us;1us;942us;1us;943us;1us;943us;5us;945us;946us;947us;948us;949us;6us;945us;946us;949us;985us;986us;987us;2us;945us;946us;4us;945us;985us;986us;987us;1us;946us;2us;947us;948us;2us;947us;948us;2us;947us;948us;4us;947us;985us;986us;987us;1us;948us;6us;950us;951us;954us;985us;986us;987us;2us;950us;951us;4us;950us;985us;986us;987us;1us;951us;2us;952us;953us;2us;952us;953us;2us;952us;953us;4us;952us;985us;986us;987us;1us;953us;8us;955us;956us;957us;958us;958us;985us;986us;987us;7us;955us;956us;957us;958us;985us;986us;987us;4us;955us;956us;957us;958us;1us;955us;1us;956us;1us;957us;1us;957us;4us;959us;960us;961us;962us;3us;959us;960us;961us;1us;959us;1us;960us;1us;961us;1us;961us;1us;963us;1us;963us;8us;964us;965us;969us;970us;971us;985us;986us;987us;2us;964us;965us;1us;964us;1us;965us;1us;966us;1us;966us;2us;967us;968us;1us;967us;1us;968us;2us;969us;970us;1us;969us;1us;970us;8us;972us;973us;975us;976us;978us;985us;986us;987us;2us;972us;973us;1us;972us;1us;973us;1us;974us;1us;974us;2us;975us;976us;1us;975us;1us;976us;1us;977us;1us;977us;3us;979us;982us;991us;1us;979us;4us;980us;1033us;1052us;1053us;1us;980us;3us;981us;1089us;1090us;1us;982us;2us;983us;984us;4us;983us;984us;1051us;1054us;1us;983us;1us;983us;7us;985us;986us;987us;1040us;1041us;1042us;1043us;1us;985us;1us;986us;1us;986us;1us;987us;4us;988us;1038us;1039us;1050us;1us;988us;1us;988us;1us;988us;1us;989us;1us;990us;1us;991us;1us;991us;2us;992us;1037us;1us;992us;1us;992us;32us;993us;994us;995us;996us;997us;998us;999us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;993us;31us;994us;995us;996us;997us;998us;999us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;994us;30us;995us;996us;997us;998us;999us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;995us;29us;996us;997us;998us;999us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;996us;28us;997us;998us;999us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;997us;27us;998us;999us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;998us;26us;999us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;999us;25us;1000us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1000us;24us;1001us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1001us;23us;1002us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1002us;22us;1003us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1003us;21us;1004us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1004us;20us;1005us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1005us;19us;1006us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1006us;18us;1007us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1007us;17us;1008us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1008us;16us;1009us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1009us;15us;1010us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1010us;14us;1011us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1011us;13us;1012us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1012us;12us;1013us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1013us;11us;1014us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1014us;10us;1015us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1015us;9us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1016us;8us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1017us;7us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1018us;6us;1019us;1020us;1021us;1022us;1023us;1024us;1us;1019us;5us;1020us;1021us;1022us;1023us;1024us;1us;1020us;4us;1021us;1022us;1023us;1024us;1us;1021us;3us;1022us;1023us;1024us;1us;1022us;2us;1023us;1024us;1us;1023us;1us;1024us;1us;1024us;1us;1025us;1us;1025us;1us;1025us;3us;1025us;1026us;1027us;4us;1026us;1027us;1057us;1058us;2us;1026us;1027us;1us;1026us;1us;1027us;2us;1029us;1030us;1us;1030us;1us;1030us;4us;1031us;1038us;1039us;1050us;1us;1031us;1us;1031us;1us;1031us;3us;1032us;1052us;1053us;3us;1033us;1052us;1053us;1us;1034us;1us;1035us;3us;1035us;1052us;1053us;1us;1036us;1us;1037us;3us;1038us;1039us;1050us;2us;1038us;1039us;5us;1038us;1039us;1064us;1065us;1066us;1us;1038us;1us;1039us;5us;1040us;1041us;1042us;1043us;1044us;5us;1040us;1041us;1042us;1043us;1044us;3us;1040us;1041us;1042us;2us;1040us;1041us;1us;1040us;1us;1041us;1us;1042us;1us;1043us;1us;1044us;1us;1045us;1us;1046us;1us;1047us;1us;1048us;1us;1049us;1us;1050us;1us;1050us;1us;1051us;2us;1052us;1053us;4us;1052us;1053us;1089us;1090us;1us;1053us;1us;1054us;1us;1054us;1us;1055us;1us;1056us;1us;1056us;7us;1057us;1058us;1059us;1060us;1061us;1062us;1063us;3us;1057us;1058us;1059us;3us;1057us;1058us;1059us;2us;1057us;1058us;1us;1057us;1us;1058us;1us;1059us;3us;1060us;1061us;1067us;1us;1060us;1us;1061us;1us;1062us;1us;1063us;3us;1064us;1065us;1066us;2us;1065us;1066us;1us;1065us;1us;1067us;1us;1068us;2us;1070us;1071us;3us;1070us;1081us;1082us;1us;1070us;1us;1071us;1us;1071us;3us;1072us;1089us;1090us;1us;1073us;1us;1074us;3us;1074us;1081us;1082us;1us;1074us;2us;1075us;1076us;1us;1076us;1us;1076us;1us;1077us;2us;1078us;1079us;1us;1079us;1us;1080us;3us;1081us;1081us;1082us;3us;1081us;1082us;1082us;3us;1081us;1082us;1083us;1us;1081us;1us;1082us;1us;1083us;1us;1084us;1us;1084us;1us;1085us;1us;1085us;2us;1085us;1132us;1us;1086us;1us;1087us;1us;1088us;2us;1089us;1090us;1us;1089us;1us;1090us;4us;1091us;1092us;1094us;1095us;1us;1091us;1us;1091us;1us;1092us;1us;1092us;1us;1093us;3us;1094us;1095us;1124us;3us;1094us;1095us;1124us;1us;1094us;1us;1095us;1us;1095us;1us;1095us;1us;1096us;1us;1097us;1us;1098us;1us;1099us;1us;1100us;1us;1101us;1us;1102us;1us;1103us;1us;1104us;1us;1105us;1us;1106us;1us;1107us;1us;1108us;1us;1109us;1us;1110us;1us;1111us;1us;1112us;1us;1113us;1us;1114us;1us;1115us;1us;1116us;1us;1117us;1us;1118us;2us;1119us;1120us;1us;1120us;1us;1121us;1us;1121us;1us;1122us;1us;1123us;1us;1123us;1us;1124us;1us;1125us;1us;1126us;3us;1127us;1129us;1130us;1us;1128us;2us;1129us;1130us;1us;1129us;1us;1130us;1us;1131us;1us;1132us;1us;1133us;1us;1134us;1us;1135us;1us;1136us;2us;1137us;1138us;1us;1138us;1us;1139us;1us;1139us;2us;1141us;1143us;2us;1142us;1144us;1us;1143us;1us;1144us;1us;1145us;1us;1146us;1us;1147us;1us;1148us;1us;1149us;1us;1150us;1us;1152us;1us;1154us;1us;1158us;1us;1160us;1us;1162us;1us;1166us;1us;1168us;1us;1170us;1us;1171us;1us;1172us;1us;1173us;1us;1174us;1us;1175us;1us;1176us;1us;1177us;1us;1178us;1us;1179us;1us;1180us;1us;1181us;1us;1183us;1us;1183us;1us;1184us;2us;1185us;1186us;1us;1185us;1us;1185us;1us;1186us;2us;1187us;1189us;1us;1187us;1us;1187us;1us;1188us;1us;1189us;1us;1190us;1us;1191us;1us;1193us;1us;1195us;2us;1195us;1216us;1us;1195us;1us;1196us;1us;1197us;1us;1198us;2us;1198us;1217us;1us;1198us;1us;1199us;1us;1200us;1us;1201us;1us;1201us;1us;1202us;1us;1203us;1us;1204us;1us;1205us;1us;1205us;1us;1206us;1us;1207us;1us;1208us;1us;1208us;1us;1209us;1us;1210us;1us;1211us;1us;1212us;1us;1213us;1us;1214us;1us;1215us;1us;1216us;1us;1217us;1us;1218us;1us;1219us;1us;1220us;1us;1221us;|] -let _fsyacc_stateToProdIdxsTableRowOffsets = [|0us;2us;4us;6us;8us;10us;12us;14us;16us;18us;20us;22us;24us;26us;28us;30us;32us;35us;37us;40us;42us;45us;47us;49us;51us;53us;55us;57us;59us;62us;64us;73us;82us;137us;139us;142us;144us;146us;148us;150us;152us;155us;157us;159us;161us;164us;166us;168us;170us;174us;176us;180us;184us;188us;192us;196us;198us;200us;203us;206us;210us;212us;215us;217us;220us;222us;224us;226us;228us;236us;244us;249us;251us;253us;255us;259us;262us;264us;266us;268us;272us;274us;276us;279us;283us;286us;289us;291us;293us;295us;297us;299us;301us;308us;315us;319us;322us;324us;326us;328us;330us;332us;334us;336us;338us;340us;342us;344us;346us;348us;350us;352us;354us;356us;358us;361us;416us;418us;473us;475us;477us;481us;483us;485us;487us;489us;491us;493us;495us;497us;499us;501us;503us;505us;508us;510us;512us;514us;518us;520us;522us;524us;526us;528us;530us;532us;534us;536us;538us;540us;542us;544us;546us;550us;553us;555us;557us;559us;561us;564us;567us;569us;571us;574us;577us;579us;581us;584us;587us;589us;591us;593us;595us;597us;599us;601us;610us;624us;633us;647us;649us;651us;653us;655us;657us;659us;661us;663us;665us;667us;672us;675us;680us;682us;684us;686us;693us;695us;697us;699us;701us;703us;705us;707us;709us;711us;714us;717us;719us;721us;725us;728us;730us;732us;734us;736us;738us;740us;742us;744us;746us;748us;750us;752us;755us;757us;759us;761us;764us;766us;769us;771us;774us;776us;778us;780us;782us;795us;807us;811us;813us;815us;819us;822us;824us;826us;828us;831us;833us;835us;837us;849us;860us;917us;920us;922us;924us;926us;931us;933us;936us;938us;940us;943us;946us;949us;951us;953us;955us;957us;965us;973us;975us;979us;981us;987us;989us;991us;993us;995us;997us;1000us;1002us;1004us;1006us;1009us;1011us;1013us;1018us;1022us;1024us;1027us;1032us;1034us;1038us;1040us;1044us;1050us;1053us;1055us;1057us;1060us;1062us;1064us;1066us;1068us;1072us;1076us;1079us;1081us;1083us;1085us;1087us;1089us;1091us;1093us;1096us;1098us;1103us;1107us;1110us;1112us;1114us;1117us;1119us;1121us;1123us;1125us;1127us;1130us;1132us;1136us;1138us;1140us;1143us;1147us;1149us;1151us;1153us;1157us;1159us;1161us;1163us;1165us;1167us;1169us;1171us;1174us;1176us;1178us;1180us;1188us;1190us;1192us;1194us;1196us;1198us;1200us;1202us;1204us;1206us;1208us;1213us;1215us;1218us;1221us;1224us;1227us;1230us;1232us;1234us;1236us;1242us;1245us;1248us;1251us;1254us;1256us;1258us;1260us;1262us;1264us;1266us;1268us;1270us;1272us;1274us;1276us;1278us;1282us;1285us;1287us;1289us;1292us;1294us;1297us;1300us;1302us;1304us;1307us;1310us;1312us;1314us;1316us;1318us;1320us;1322us;1324us;1326us;1328us;1330us;1332us;1335us;1338us;1340us;1342us;1345us;1347us;1349us;1351us;1353us;1355us;1357us;1359us;1361us;1366us;1371us;1376us;1378us;1380us;1382us;1384us;1386us;1389us;1391us;1394us;1396us;1413us;1435us;1452us;1474us;1476us;1478us;1482us;1484us;1486us;1488us;1491us;1496us;1498us;1500us;1502us;1504us;1506us;1508us;1510us;1512us;1514us;1516us;1518us;1520us;1522us;1524us;1526us;1528us;1530us;1535us;1539us;1543us;1545us;1547us;1549us;1551us;1553us;1555us;1557us;1559us;1561us;1566us;1571us;1576us;1580us;1583us;1585us;1587us;1589us;1591us;1596us;1601us;1606us;1610us;1614us;1616us;1618us;1620us;1622us;1624us;1626us;1629us;1631us;1633us;1636us;1638us;1640us;1642us;1644us;1646us;1648us;1651us;1653us;1655us;1657us;1659us;1661us;1663us;1665us;1667us;1670us;1672us;1674us;1676us;1678us;1680us;1684us;1687us;1689us;1691us;1693us;1695us;1697us;1699us;1702us;1704us;1706us;1708us;1711us;1713us;1715us;1718us;1721us;1723us;1725us;1727us;1730us;1733us;1735us;1740us;1746us;1750us;1752us;1754us;1756us;1758us;1760us;1762us;1764us;1766us;1768us;1770us;1772us;1774us;1780us;1786us;1791us;1793us;1795us;1797us;1799us;1801us;1803us;1809us;1812us;1815us;1817us;1819us;1824us;1827us;1829us;1831us;1833us;1835us;1837us;1844us;1846us;1848us;1852us;1855us;1857us;1859us;1861us;1863us;1865us;1867us;1869us;1871us;1873us;1878us;1883us;1885us;1889us;1891us;1893us;1895us;1897us;1900us;1902us;1905us;1909us;1911us;1914us;1916us;1918us;1921us;1924us;1926us;1929us;1931us;1933us;1935us;1937us;1939us;1941us;1943us;1945us;1947us;1949us;1951us;1953us;1956us;1959us;1962us;1964us;1966us;1968us;1971us;1974us;1976us;1980us;1984us;1986us;1988us;1990us;1992us;2004us;2007us;2010us;2018us;2020us;2024us;2026us;2028us;2030us;2032us;2034us;2040us;2043us;2045us;2047us;2049us;2051us;2053us;2055us;2057us;2059us;2064us;2066us;2071us;2081us;2083us;2085us;2087us;2089us;2091us;2094us;2096us;2099us;2101us;2103us;2113us;2123us;2130us;2132us;2135us;2137us;2139us;2142us;2144us;2146us;2148us;2150us;2152us;2154us;2161us;2163us;2170us;2172us;2174us;2176us;2178us;2180us;2187us;2189us;2192us;2200us;2203us;2205us;2208us;2210us;2212us;2214us;2216us;2219us;2221us;2223us;2227us;2230us;2239us;2248us;2250us;2252us;2254us;2256us;2259us;2262us;2264us;2266us;2268us;2270us;2275us;2280us;2284us;2287us;2289us;2291us;2293us;2295us;2297us;2299us;2302us;2305us;2308us;2310us;2312us;2314us;2318us;2321us;2323us;2325us;2327us;2331us;2333us;2335us;2337us;2339us;2341us;2343us;2345us;2347us;2349us;2351us;2354us;2356us;2358us;2360us;2362us;2364us;2366us;2368us;2370us;2372us;2374us;2376us;2378us;2380us;2382us;2384us;2386us;2388us;2391us;2394us;2396us;2398us;2400us;2402us;2405us;2411us;2413us;2417us;2422us;2424us;2426us;2428us;2430us;2432us;2434us;2437us;2439us;2442us;2444us;2446us;2448us;2450us;2452us;2454us;2456us;2458us;2462us;2466us;2470us;2474us;2477us;2479us;2481us;2483us;2486us;2489us;2491us;2493us;2495us;2497us;2500us;2502us;2504us;2507us;2509us;2511us;2513us;2515us;2517us;2520us;2522us;2524us;2526us;2528us;2530us;2532us;2534us;2536us;2538us;2540us;2542us;2544us;2546us;2548us;2550us;2552us;2554us;2556us;2558us;2560us;2562us;2565us;2567us;2569us;2572us;2575us;2577us;2579us;2581us;2583us;2585us;2587us;2589us;2591us;2593us;2596us;2598us;2600us;2608us;2610us;2612us;2614us;2618us;2623us;2626us;2628us;2630us;2632us;2634us;2636us;2638us;2644us;2647us;2649us;2651us;2653us;2656us;2658us;2660us;2668us;2676us;2684us;2692us;2700us;2708us;2716us;2724us;2732us;2740us;2749us;2751us;2753us;2755us;2757us;2761us;2764us;2766us;2769us;2772us;2774us;2776us;2779us;2781us;2783us;2785us;2789us;2791us;2795us;2797us;2799us;2801us;2805us;2812us;2815us;2825us;2827us;2829us;2838us;2843us;2845us;2847us;2849us;2851us;2853us;2855us;2857us;2859us;2861us;2863us;2865us;2867us;2869us;2879us;2881us;2883us;2885us;2890us;2892us;2894us;2896us;2898us;2900us;2902us;2905us;2907us;2909us;2911us;2913us;2915us;2917us;2919us;2921us;2923us;2925us;2927us;2930us;2932us;2934us;2936us;2938us;2940us;2942us;2951us;2954us;2956us;2958us;2962us;2965us;2967us;2972us;2977us;2983us;2985us;2987us;2990us;2992us;2994us;3004us;3014us;3024us;3034us;3044us;3054us;3064us;3074us;3083us;3093us;3103us;3114us;3129us;3139us;3141us;3143us;3145us;3149us;3152us;3155us;3157us;3159us;3161us;3163us;3165us;3168us;3171us;3173us;3175us;3178us;3180us;3182us;3184us;3187us;3189us;3192us;3194us;3200us;3203us;3205us;3207us;3209us;3212us;3214us;3218us;3221us;3223us;3225us;3227us;3229us;3232us;3234us;3236us;3238us;3293us;3296us;3298us;3300us;3303us;3307us;3310us;3312us;3314us;3316us;3318us;3377us;3380us;3382us;3384us;3386us;3388us;3390us;3392us;3394us;3400us;3402us;3405us;3408us;3411us;3414us;3417us;3420us;3423us;3426us;3429us;3432us;3435us;3438us;3442us;3445us;3448us;3450us;3452us;3454us;3456us;3458us;3460us;3462us;3464us;3466us;3468us;3470us;3472us;3475us;3478us;3480us;3482us;3487us;3489us;3491us;3494us;3496us;3498us;3500us;3502us;3504us;3507us;3510us;3512us;3514us;3517us;3520us;3522us;3524us;3530us;3534us;3536us;3538us;3541us;3543us;3545us;3547us;3551us;3607us;3609us;3611us;3613us;3615us;3670us;3673us;3728us;3730us;3732us;3735us;3737us;3739us;3741us;3743us;3745us;3761us;3768us;3773us;3776us;3778us;3780us;3782us;3784us;3786us;3788us;3790us;3796us;3801us;3804us;3806us;3808us;3810us;3812us;3814us;3816us;3818us;3820us;3822us;3824us;3827us;3830us;3885us;3888us;3943us;3945us;3947us;3949us;3951us;3953us;3955us;3957us;3959us;3961us;3964us;3967us;3970us;3973us;3976us;3978us;3980us;3982us;3984us;3986us;3988us;3990us;3992us;3994us;3996us;3998us;4000us;4055us;4057us;4059us;4114us;4169us;4224us;4279us;4334us;4389us;4444us;4499us;4554us;4609us;4664us;4719us;4774us;4829us;4884us;4939us;4994us;5049us;5104us;5159us;5214us;5269us;5324us;5382us;5437us;5492us;5547us;5603us;5658us;5713us;5768us;5822us;5877us;5932us;5987us;6042us;6097us;6153us;6156us;6158us;6160us;6163us;6165us;6167us;6170us;6172us;6174us;6176us;6179us;6181us;6183us;6189us;6197us;6200us;6202us;6205us;6207us;6210us;6212us;6215us;6217us;6220us;6222us;6225us;6227us;6230us;6232us;6235us;6237us;6240us;6242us;6245us;6247us;6250us;6252us;6255us;6257us;6260us;6262us;6265us;6267us;6270us;6272us;6275us;6277us;6280us;6282us;6285us;6287us;6290us;6292us;6295us;6297us;6300us;6302us;6306us;6309us;6311us;6314us;6318us;6321us;6323us;6325us;6327us;6329us;6331us;6333us;6335us;6337us;6339us;6341us;6343us;6345us;6347us;6351us;6354us;6356us;6358us;6360us;6362us;6365us;6367us;6369us;6371us;6373us;6380us;6385us;6388us;6390us;6392us;6394us;6396us;6398us;6400us;6402us;6404us;6406us;6408us;6410us;6413us;6415us;6418us;6420us;6422us;6424us;6426us;6428us;6431us;6433us;6435us;6440us;6442us;6445us;6447us;6452us;6454us;6457us;6459us;6461us;6464us;6468us;6471us;6473us;6475us;6478us;6480us;6482us;6485us;6487us;6489us;6492us;6494us;6496us;6499us;6501us;6503us;6506us;6508us;6510us;6513us;6515us;6520us;6529us;6533us;6541us;6545us;6551us;6554us;6559us;6561us;6563us;6565us;6567us;6569us;6571us;6573us;6575us;6578us;6587us;6595us;6597us;6604us;6606us;6613us;6620us;6624us;6631us;6634us;6641us;6643us;6645us;6652us;6659us;6666us;6673us;6675us;6677us;6679us;6681us;6683us;6686us;6688us;6691us;6693us;6696us;6698us;6700us;6702us;6704us;6706us;6708us;6710us;6713us;6715us;6717us;6719us;6721us;6723us;6728us;6731us;6733us;6735us;6737us;6739us;6743us;6746us;6748us;6750us;6752us;6754us;6756us;6758us;6765us;6767us;6769us;6771us;6773us;6775us;6777us;6782us;6785us;6787us;6789us;6791us;6793us;6795us;6797us;6799us;6801us;6803us;6805us;6807us;6809us;6811us;6813us;6815us;6820us;6823us;6825us;6827us;6829us;6831us;6833us;6838us;6844us;6847us;6849us;6851us;6853us;6855us;6860us;6863us;6865us;6867us;6869us;6871us;6882us;6898us;6913us;6915us;6918us;6920us;6922us;6924us;6927us;6929us;6931us;6933us;6935us;6937us;6939us;6941us;6943us;6945us;6947us;6949us;6951us;6953us;6955us;6957us;6959us;6962us;6965us;6967us;6969us;6974us;6980us;6983us;6985us;6987us;6989us;6991us;6993us;6995us;6997us;6999us;7001us;7003us;7005us;7007us;7009us;7012us;7014us;7016us;7018us;7020us;7022us;7024us;7026us;7028us;7030us;7033us;7035us;7037us;7039us;7041us;7043us;7045us;7047us;7049us;7052us;7054us;7060us;7062us;7064us;7066us;7068us;7070us;7073us;7075us;7077us;7080us;7082us;7085us;7087us;7089us;7092us;7094us;7097us;7099us;7101us;7103us;7106us;7108us;7111us;7113us;7115us;7117us;7120us;7122us;7124us;7126us;7129us;7132us;7135us;7137us;7139us;7143us;7145us;7147us;7153us;7157us;7159us;7161us;7163us;7166us;7168us;7170us;7172us;7174us;7176us;7178us;7180us;7183us;7185us;7187us;7189us;7191us;7193us;7195us;7197us;7199us;7201us;7203us;7205us;7207us;7209us;7214us;7216us;7218us;7220us;7222us;7224us;7226us;7232us;7235us;7237us;7239us;7241us;7243us;7245us;7248us;7251us;7254us;7256us;7258us;7265us;7271us;7276us;7279us;7281us;7283us;7285us;7287us;7289us;7291us;7293us;7295us;7297us;7299us;7301us;7303us;7305us;7308us;7310us;7313us;7315us;7318us;7320us;7322us;7326us;7329us;7331us;7333us;7337us;7340us;7342us;7344us;7346us;7348us;7352us;7355us;7357us;7359us;7361us;7363us;7369us;7376us;7379us;7384us;7386us;7389us;7392us;7395us;7400us;7402us;7409us;7412us;7417us;7419us;7422us;7425us;7428us;7433us;7435us;7444us;7452us;7457us;7459us;7461us;7463us;7465us;7470us;7474us;7476us;7478us;7480us;7482us;7484us;7486us;7495us;7498us;7500us;7502us;7504us;7506us;7509us;7511us;7513us;7516us;7518us;7520us;7529us;7532us;7534us;7536us;7538us;7540us;7543us;7545us;7547us;7549us;7551us;7555us;7557us;7562us;7564us;7568us;7570us;7573us;7578us;7580us;7582us;7590us;7592us;7594us;7596us;7598us;7603us;7605us;7607us;7609us;7611us;7613us;7615us;7617us;7620us;7622us;7624us;7657us;7659us;7691us;7693us;7724us;7726us;7756us;7758us;7787us;7789us;7817us;7819us;7846us;7848us;7874us;7876us;7901us;7903us;7927us;7929us;7952us;7954us;7976us;7978us;7999us;8001us;8021us;8023us;8042us;8044us;8062us;8064us;8081us;8083us;8099us;8101us;8116us;8118us;8132us;8134us;8147us;8149us;8161us;8163us;8174us;8176us;8186us;8188us;8197us;8199us;8207us;8209us;8216us;8218us;8224us;8226us;8231us;8233us;8237us;8239us;8242us;8244us;8246us;8248us;8250us;8252us;8254us;8258us;8263us;8266us;8268us;8270us;8273us;8275us;8277us;8282us;8284us;8286us;8288us;8292us;8296us;8298us;8300us;8304us;8306us;8308us;8312us;8315us;8321us;8323us;8325us;8331us;8337us;8341us;8344us;8346us;8348us;8350us;8352us;8354us;8356us;8358us;8360us;8362us;8364us;8366us;8368us;8370us;8373us;8378us;8380us;8382us;8384us;8386us;8388us;8390us;8398us;8402us;8406us;8409us;8411us;8413us;8415us;8419us;8421us;8423us;8425us;8427us;8431us;8434us;8436us;8438us;8440us;8443us;8447us;8449us;8451us;8453us;8457us;8459us;8461us;8465us;8467us;8470us;8472us;8474us;8476us;8479us;8481us;8483us;8487us;8491us;8495us;8497us;8499us;8501us;8503us;8505us;8507us;8509us;8512us;8514us;8516us;8518us;8521us;8523us;8525us;8530us;8532us;8534us;8536us;8538us;8540us;8544us;8548us;8550us;8552us;8554us;8556us;8558us;8560us;8562us;8564us;8566us;8568us;8570us;8572us;8574us;8576us;8578us;8580us;8582us;8584us;8586us;8588us;8590us;8592us;8594us;8596us;8598us;8600us;8602us;8605us;8607us;8609us;8611us;8613us;8615us;8617us;8619us;8621us;8623us;8627us;8629us;8632us;8634us;8636us;8638us;8640us;8642us;8644us;8646us;8648us;8651us;8653us;8655us;8657us;8660us;8663us;8665us;8667us;8669us;8671us;8673us;8675us;8677us;8679us;8681us;8683us;8685us;8687us;8689us;8691us;8693us;8695us;8697us;8699us;8701us;8703us;8705us;8707us;8709us;8711us;8713us;8715us;8717us;8719us;8721us;8723us;8726us;8728us;8730us;8732us;8735us;8737us;8739us;8741us;8743us;8745us;8747us;8749us;8751us;8754us;8756us;8758us;8760us;8762us;8765us;8767us;8769us;8771us;8773us;8775us;8777us;8779us;8781us;8783us;8785us;8787us;8789us;8791us;8793us;8795us;8797us;8799us;8801us;8803us;8805us;8807us;8809us;8811us;8813us;8815us;8817us;|] -let _fsyacc_action_rows = 2067 -let _fsyacc_actionTableElements = [|16us;16435us;22us;74us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;43us;16553us;44us;16553us;45us;16553us;73us;317us;88us;38us;101us;287us;108us;16553us;109us;16553us;121us;16553us;150us;16553us;203us;48us;0us;49152us;95us;16513us;13us;16553us;22us;241us;24us;16553us;25us;16553us;29us;16553us;30us;16553us;32us;16553us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;56us;16553us;62us;16553us;66us;16553us;70us;16553us;71us;16553us;72us;16553us;73us;317us;74us;16553us;85us;16553us;86us;16553us;88us;38us;89us;16553us;90us;16553us;91us;16553us;92us;16553us;96us;16553us;98us;16553us;100us;16553us;101us;287us;106us;16553us;107us;16553us;108us;16553us;114us;16553us;115us;16553us;116us;16553us;117us;16553us;119us;16553us;121us;16553us;122us;16553us;123us;16553us;124us;16553us;125us;16553us;126us;16553us;130us;16553us;133us;16553us;134us;16553us;136us;16553us;137us;16553us;143us;16553us;146us;16553us;147us;16553us;148us;16553us;149us;16553us;150us;16553us;154us;16553us;155us;16553us;158us;16553us;159us;16553us;162us;16553us;163us;16553us;164us;16553us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;183us;16553us;184us;16553us;187us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;199us;16553us;200us;16553us;201us;16553us;202us;16553us;203us;227us;0us;49152us;7us;16553us;10us;14us;21us;12us;67us;13us;73us;317us;83us;11us;88us;38us;101us;287us;0us;49152us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;49152us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;49152us;0us;16389us;0us;16390us;0us;16391us;0us;16392us;0us;16393us;0us;16394us;4us;32768us;10us;14us;21us;37us;67us;13us;83us;36us;0us;16395us;4us;32768us;10us;14us;21us;37us;67us;13us;83us;36us;0us;16396us;4us;32768us;10us;14us;21us;37us;67us;13us;83us;36us;0us;16397us;5us;16553us;10us;14us;67us;13us;73us;317us;88us;38us;101us;287us;0us;16398us;5us;16553us;10us;14us;67us;13us;73us;317us;88us;38us;101us;287us;0us;16399us;5us;16553us;10us;14us;67us;13us;73us;317us;88us;38us;101us;287us;0us;16400us;16us;16401us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;73us;317us;101us;287us;108us;16553us;121us;16553us;137us;16553us;150us;16553us;162us;16553us;0us;16402us;3us;16647us;43us;514us;44us;513us;45us;515us;87us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2033us;38us;2036us;39us;2038us;40us;2041us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;108us;2037us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;121us;737us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;137us;753us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;150us;2042us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;26us;16403us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;0us;16404us;2us;16405us;21us;37us;83us;36us;0us;16406us;0us;16407us;0us;16408us;1us;32768us;193us;39us;0us;16410us;2us;16409us;194us;2017us;201us;2016us;0us;16411us;0us;16412us;0us;16413us;2us;32768us;10us;45us;203us;46us;0us;16414us;1us;32768us;10us;47us;0us;16415us;4us;16434us;10us;49us;21us;1984us;67us;1983us;83us;1982us;0us;16416us;1us;16553us;73us;317us;3us;16647us;43us;514us;44us;513us;45us;515us;1us;17547us;103us;2003us;5us;32768us;10us;1077us;21us;55us;46us;1924us;193us;1923us;203us;1061us;1us;16417us;76us;1926us;0us;16418us;0us;16419us;1us;17547us;103us;2003us;4us;32768us;10us;1077us;46us;1924us;193us;1923us;203us;1061us;1us;16420us;76us;1926us;0us;16421us;1us;16422us;151us;57us;0us;16423us;1us;16425us;151us;57us;0us;16424us;1us;17539us;69us;2000us;16us;16435us;22us;74us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;43us;16553us;44us;16553us;45us;16553us;73us;317us;88us;38us;101us;287us;108us;16553us;109us;16553us;121us;16553us;150us;16553us;203us;82us;0us;16426us;3us;16647us;43us;514us;44us;513us;45us;515us;8us;32768us;37us;2033us;38us;2036us;39us;2038us;40us;2041us;108us;2037us;109us;104us;121us;737us;150us;2042us;18us;16435us;22us;74us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;43us;16553us;44us;16553us;45us;16553us;69us;2015us;73us;317us;77us;2014us;88us;38us;101us;287us;108us;16553us;109us;16553us;121us;16553us;150us;16553us;203us;83us;0us;16427us;0us;16428us;0us;16429us;15us;16435us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;43us;16553us;44us;16553us;45us;16553us;73us;317us;88us;38us;101us;287us;108us;16553us;109us;16553us;121us;16553us;150us;16553us;203us;79us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;1us;17543us;21us;2001us;0us;16430us;0us;16431us;6us;16434us;15us;2052us;16us;2054us;17us;2055us;21us;1984us;67us;1983us;83us;1982us;0us;16432us;0us;16433us;3us;16434us;21us;1984us;67us;1983us;83us;1982us;17us;16434us;21us;1984us;37us;16443us;38us;16443us;39us;16443us;40us;16443us;43us;16443us;44us;16443us;45us;16443us;67us;1983us;73us;16443us;83us;1982us;88us;16443us;101us;16443us;108us;16443us;109us;16443us;121us;16443us;150us;16443us;3us;17524us;21us;1984us;67us;1983us;83us;1982us;15us;16438us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;43us;16553us;44us;16553us;45us;16553us;73us;317us;88us;38us;101us;287us;108us;16553us;109us;16553us;121us;16553us;150us;16553us;203us;87us;0us;16436us;3us;32768us;21us;1984us;67us;1983us;83us;1982us;4us;16553us;73us;317us;88us;38us;101us;287us;203us;87us;0us;16437us;0us;16439us;0us;16440us;3us;16647us;43us;514us;44us;513us;45us;515us;8us;32768us;37us;2033us;38us;2036us;39us;2038us;40us;2041us;108us;2037us;109us;104us;121us;737us;150us;2042us;3us;32768us;69us;2015us;77us;2014us;203us;98us;5us;32768us;22us;120us;46us;1924us;57us;2012us;136us;2013us;193us;1923us;0us;16441us;0us;16442us;0us;16443us;1us;16553us;73us;317us;1us;16455us;131us;130us;0us;16444us;0us;16445us;0us;16446us;1us;16553us;73us;317us;1us;17551us;110us;2004us;1us;17553us;118us;2005us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;32768us;92us;1929us;100us;1934us;193us;1923us;2us;16715us;34us;2032us;160us;17578us;1us;32768us;77us;111us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;16448us;69us;114us;0us;16447us;80us;32768us;13us;1189us;22us;116us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;26us;16449us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;29us;32768us;15us;2052us;16us;2054us;17us;2055us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;1us;17537us;19us;1999us;0us;16450us;8us;16553us;46us;1924us;57us;2012us;73us;317us;88us;38us;101us;287us;136us;2013us;193us;1923us;203us;87us;3us;32768us;15us;2052us;16us;2054us;17us;2055us;0us;16451us;15us;16435us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;43us;16553us;44us;16553us;45us;16553us;73us;317us;88us;38us;101us;287us;108us;16553us;109us;16553us;121us;16553us;150us;16553us;203us;82us;1us;32768us;142us;125us;3us;32768us;15us;2052us;16us;2054us;17us;2055us;0us;16452us;15us;16435us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;43us;16553us;44us;16553us;45us;16553us;73us;317us;88us;38us;101us;287us;108us;16553us;109us;16553us;121us;16553us;150us;16553us;203us;82us;1us;32768us;142us;129us;0us;16453us;1us;16553us;73us;317us;1us;16455us;131us;130us;0us;16454us;2us;16497us;69us;134us;87us;220us;7us;16553us;22us;137us;49us;590us;56us;592us;73us;317us;111us;591us;136us;162us;152us;148us;0us;16456us;0us;16457us;54us;16475us;14us;16553us;22us;158us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;47us;16553us;48us;16553us;49us;590us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;56us;592us;58us;16553us;66us;16553us;72us;16553us;73us;317us;88us;16553us;91us;16553us;92us;16553us;96us;16553us;106us;16553us;109us;16553us;111us;591us;113us;16553us;119us;16553us;120us;16553us;122us;16553us;136us;162us;148us;16553us;152us;148us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;186us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;201us;16553us;202us;16553us;1us;17543us;21us;2001us;14us;16475us;14us;16553us;43us;16553us;44us;16553us;45us;16553us;47us;16553us;48us;16553us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;73us;317us;109us;16553us;111us;16553us;119us;16553us;1us;16497us;87us;220us;3us;32768us;15us;2052us;16us;2054us;17us;2055us;1us;16497us;87us;220us;0us;16458us;1us;16497us;87us;220us;0us;16459us;0us;16460us;0us;16461us;1us;32768us;120us;149us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16462us;0us;16463us;16us;16475us;14us;16553us;22us;166us;43us;16553us;44us;16553us;45us;16553us;47us;16553us;48us;16553us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;73us;317us;109us;16553us;111us;16553us;119us;16553us;203us;156us;3us;32768us;10us;1077us;142us;154us;203us;1061us;0us;16464us;0us;16465us;1us;32768us;142us;157us;0us;16466us;14us;16475us;14us;16553us;43us;16553us;44us;16553us;45us;16553us;47us;16553us;48us;16553us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;73us;317us;109us;16553us;111us;16553us;119us;16553us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16467us;0us;16468us;15us;16475us;14us;16553us;22us;166us;43us;16553us;44us;16553us;45us;16553us;47us;16553us;48us;16553us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;73us;317us;109us;16553us;111us;16553us;119us;16553us;3us;32768us;10us;1077us;142us;164us;203us;1061us;0us;16469us;0us;16470us;14us;16475us;14us;16553us;43us;16553us;44us;16553us;45us;16553us;47us;16553us;48us;16553us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;73us;317us;109us;16553us;111us;16553us;119us;16553us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16471us;0us;16472us;0us;16473us;0us;16474us;2us;17545us;21us;1989us;83us;1990us;14us;16475us;14us;16553us;43us;16553us;44us;16553us;45us;16553us;47us;16553us;48us;16553us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;73us;317us;109us;16553us;111us;16553us;119us;16553us;0us;16476us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;16647us;43us;514us;44us;513us;45us;515us;10us;32768us;14us;594us;47us;195us;48us;352us;50us;432us;51us;353us;52us;354us;54us;190us;109us;193us;111us;593us;119us;200us;46us;32768us;14us;594us;46us;1924us;47us;195us;48us;352us;50us;432us;51us;353us;52us;354us;54us;190us;56us;581us;58us;673us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;569us;96us;1717us;106us;1866us;109us;193us;111us;593us;113us;1864us;119us;200us;120us;708us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;1us;17551us;110us;2004us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;32768us;92us;1929us;100us;1934us;193us;1923us;2us;16715us;34us;2032us;160us;17578us;1us;32768us;77us;184us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;2us;16485us;26us;205us;87us;203us;1us;16448us;69us;114us;0us;16477us;31us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;6us;16478us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;6us;16479us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;0us;16480us;1us;17553us;118us;2005us;0us;16481us;6us;16570us;37us;2033us;38us;2036us;48us;351us;50us;434us;108us;2037us;109us;196us;1us;17553us;118us;2005us;0us;16482us;1us;16553us;73us;317us;0us;16483us;1us;32768us;77us;201us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16484us;4us;32768us;22us;213us;92us;1929us;100us;1934us;193us;1923us;0us;16486us;4us;32768us;22us;213us;92us;1929us;100us;1934us;193us;1923us;2us;32768us;20us;207us;203us;208us;0us;16487us;0us;16488us;1us;16489us;97us;210us;5us;32768us;10us;1077us;92us;1929us;100us;1934us;193us;1923us;203us;1061us;0us;16490us;0us;16491us;3us;32768us;15us;2052us;16us;2054us;17us;2055us;1us;32768us;19us;215us;0us;16492us;0us;16493us;0us;16494us;1us;16497us;87us;220us;0us;16495us;15us;16475us;14us;16553us;22us;166us;43us;16553us;44us;16553us;45us;16553us;47us;16553us;48us;16553us;50us;16553us;51us;16553us;52us;16553us;54us;16553us;73us;317us;109us;16553us;111us;16553us;119us;16553us;3us;32768us;19us;1993us;20us;1994us;142us;1995us;0us;16496us;2us;32768us;10us;224us;203us;225us;0us;16498us;1us;32768us;10us;226us;0us;16499us;4us;32768us;10us;228us;21us;1984us;67us;1983us;83us;1982us;0us;16500us;1us;16501us;151us;57us;0us;16502us;1us;16504us;151us;57us;0us;16503us;1us;17539us;69us;2000us;95us;16513us;13us;16553us;22us;241us;24us;16553us;25us;16553us;29us;16553us;30us;16553us;32us;16553us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;56us;16553us;62us;16553us;66us;16553us;70us;16553us;71us;16553us;72us;16553us;73us;317us;74us;16553us;85us;16553us;86us;16553us;88us;38us;89us;16553us;90us;16553us;91us;16553us;92us;16553us;96us;16553us;98us;16553us;100us;16553us;101us;287us;106us;16553us;107us;16553us;108us;16553us;114us;16553us;115us;16553us;116us;16553us;117us;16553us;119us;16553us;121us;16553us;122us;16553us;123us;16553us;124us;16553us;125us;16553us;126us;16553us;130us;16553us;133us;16553us;134us;16553us;136us;16553us;137us;16553us;143us;16553us;146us;16553us;147us;16553us;148us;16553us;149us;16553us;150us;16553us;154us;16553us;155us;16553us;158us;16553us;159us;16553us;162us;16553us;163us;16553us;164us;16553us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;183us;16553us;184us;16553us;187us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;199us;16553us;200us;16553us;201us;16553us;202us;16553us;203us;261us;0us;16505us;4us;16647us;43us;514us;44us;513us;45us;515us;203us;256us;87us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2033us;38us;2036us;39us;2038us;40us;2041us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;108us;2037us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;121us;737us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;137us;753us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;150us;2042us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;96us;16513us;13us;16553us;22us;241us;24us;16553us;25us;16553us;29us;16553us;30us;16553us;32us;16553us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;56us;16553us;62us;16553us;66us;16553us;69us;281us;70us;16553us;71us;16553us;72us;16553us;73us;317us;74us;16553us;85us;16553us;86us;16553us;88us;38us;89us;16553us;90us;16553us;91us;16553us;92us;16553us;96us;16553us;98us;16553us;100us;16553us;101us;287us;106us;16553us;107us;16553us;108us;16553us;114us;16553us;115us;16553us;116us;16553us;117us;16553us;119us;16553us;121us;16553us;122us;16553us;123us;16553us;124us;16553us;125us;16553us;126us;16553us;130us;16553us;133us;16553us;134us;16553us;136us;16553us;137us;16553us;143us;16553us;146us;16553us;147us;16553us;148us;16553us;149us;16553us;150us;16553us;154us;16553us;155us;16553us;158us;16553us;159us;16553us;162us;16553us;163us;16553us;164us;16553us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;183us;16553us;184us;16553us;187us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;199us;16553us;200us;16553us;201us;16553us;202us;16553us;203us;262us;0us;16506us;0us;16507us;94us;16513us;13us;16553us;24us;16553us;25us;16553us;29us;16553us;30us;16553us;32us;16553us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;56us;16553us;62us;16553us;66us;16553us;70us;16553us;71us;16553us;72us;16553us;73us;317us;74us;16553us;85us;16553us;86us;16553us;88us;38us;89us;16553us;90us;16553us;91us;16553us;92us;16553us;96us;16553us;98us;16553us;100us;16553us;101us;287us;106us;16553us;107us;16553us;108us;16553us;114us;16553us;115us;16553us;116us;16553us;117us;16553us;119us;16553us;121us;16553us;122us;16553us;123us;16553us;124us;16553us;125us;16553us;126us;16553us;130us;16553us;133us;16553us;134us;16553us;136us;16553us;137us;16553us;143us;16553us;146us;16553us;147us;16553us;148us;16553us;149us;16553us;150us;16553us;154us;16553us;155us;16553us;158us;16553us;159us;16553us;162us;16553us;163us;16553us;164us;16553us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;183us;16553us;184us;16553us;187us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;199us;16553us;200us;16553us;201us;16553us;202us;16553us;203us;246us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;1us;17543us;21us;2001us;0us;16508us;0us;16509us;6us;32768us;15us;2052us;16us;2054us;17us;2055us;21us;1984us;67us;1983us;83us;1982us;0us;16510us;0us;16511us;0us;16512us;4us;16647us;43us;514us;44us;513us;45us;515us;203us;256us;87us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2033us;38us;2036us;39us;2038us;40us;2041us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;108us;2037us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;121us;737us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;137us;753us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;150us;2042us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;29us;16516us;21us;1984us;62us;1278us;63us;1264us;67us;1983us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;83us;1982us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;94us;16515us;13us;16553us;24us;16553us;25us;16553us;29us;16553us;30us;16553us;32us;16553us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;56us;16553us;62us;16553us;66us;16553us;70us;16553us;71us;16553us;72us;16553us;73us;317us;74us;16553us;85us;16553us;86us;16553us;88us;38us;89us;16553us;90us;16553us;91us;16553us;92us;16553us;96us;16553us;98us;16553us;100us;16553us;101us;287us;106us;16553us;107us;16553us;108us;16553us;114us;16553us;115us;16553us;116us;16553us;117us;16553us;119us;16553us;121us;16553us;122us;16553us;123us;16553us;124us;16553us;125us;16553us;126us;16553us;130us;16553us;133us;16553us;134us;16553us;136us;16553us;137us;16553us;143us;16553us;146us;16553us;147us;16553us;148us;16553us;149us;16553us;150us;16553us;154us;16553us;155us;16553us;158us;16553us;159us;16553us;162us;16553us;163us;16553us;164us;16553us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;183us;16553us;184us;16553us;187us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;199us;16553us;200us;16553us;201us;16553us;202us;16553us;203us;261us;0us;16514us;0us;16517us;0us;16518us;21us;16521us;21us;1984us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;67us;1983us;73us;317us;83us;1982us;88us;38us;101us;287us;108us;16553us;121us;16553us;137us;16553us;150us;16553us;162us;16553us;203us;261us;0us;16519us;94us;16522us;13us;16553us;24us;16553us;25us;16553us;29us;16553us;30us;16553us;32us;16553us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;56us;16553us;62us;16553us;66us;16553us;70us;16553us;71us;16553us;72us;16553us;73us;317us;74us;16553us;85us;16553us;86us;16553us;88us;38us;89us;16553us;90us;16553us;91us;16553us;92us;16553us;96us;16553us;98us;16553us;100us;16553us;101us;287us;106us;16553us;107us;16553us;108us;16553us;114us;16553us;115us;16553us;116us;16553us;117us;16553us;119us;16553us;121us;16553us;122us;16553us;123us;16553us;124us;16553us;125us;16553us;126us;16553us;130us;16553us;133us;16553us;134us;16553us;136us;16553us;137us;16553us;143us;16553us;146us;16553us;147us;16553us;148us;16553us;149us;16553us;150us;16553us;154us;16553us;155us;16553us;158us;16553us;159us;16553us;162us;16553us;163us;16553us;164us;16553us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;183us;16553us;184us;16553us;187us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;199us;16553us;200us;16553us;201us;16553us;202us;16553us;203us;261us;0us;16520us;3us;32768us;21us;1984us;67us;1983us;83us;1982us;3us;16532us;21us;1984us;67us;1983us;83us;1982us;6us;32768us;15us;2052us;16us;2054us;17us;2055us;21us;1984us;67us;1983us;83us;1982us;4us;32768us;21us;1984us;67us;1983us;83us;1982us;142us;310us;4us;16553us;73us;317us;88us;38us;101us;287us;203us;261us;0us;16523us;0us;16524us;0us;16525us;3us;16647us;43us;514us;44us;513us;45us;515us;11us;32768us;33us;755us;37us;2033us;38us;2036us;39us;2038us;40us;2041us;41us;769us;108us;2037us;121us;737us;137us;753us;150us;2042us;162us;749us;0us;16526us;1us;16526us;127us;1090us;0us;16527us;80us;16527us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1095us;0us;16528us;1us;16553us;73us;317us;1us;16576us;131us;358us;0us;16529us;0us;16530us;2us;32768us;69us;281us;203us;283us;5us;32768us;22us;296us;46us;1924us;56us;2010us;136us;2011us;193us;1923us;0us;16531us;0us;16532us;2us;16552us;10us;1077us;203us;1061us;0us;16533us;0us;16534us;7us;32768us;10us;1077us;37us;2033us;38us;2036us;46us;1924us;108us;2037us;193us;1923us;203us;1061us;1us;16535us;76us;1926us;0us;16536us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;6us;16537us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;0us;16538us;4us;32768us;15us;2052us;16us;2054us;17us;2055us;76us;1926us;0us;16539us;1us;16540us;76us;1926us;6us;16553us;56us;2010us;73us;317us;88us;38us;101us;287us;136us;2011us;203us;263us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16541us;0us;16542us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16543us;0us;16544us;0us;16545us;0us;16546us;1us;16547us;76us;1926us;94us;16513us;13us;16553us;24us;16553us;25us;16553us;29us;16553us;30us;16553us;32us;16553us;33us;16553us;37us;16553us;38us;16553us;39us;16553us;40us;16553us;41us;16553us;43us;16553us;44us;16553us;45us;16553us;46us;16553us;56us;16553us;62us;16553us;66us;16553us;70us;16553us;71us;16553us;72us;16553us;73us;317us;74us;16553us;85us;16553us;86us;16553us;88us;38us;89us;16553us;90us;16553us;91us;16553us;92us;16553us;96us;16553us;98us;16553us;100us;16553us;101us;287us;106us;16553us;107us;16553us;108us;16553us;114us;16553us;115us;16553us;116us;16553us;117us;16553us;119us;16553us;121us;16553us;122us;16553us;123us;16553us;124us;16553us;125us;16553us;126us;16553us;130us;16553us;133us;16553us;134us;16553us;136us;16553us;137us;16553us;143us;16553us;146us;16553us;147us;16553us;148us;16553us;149us;16553us;150us;16553us;154us;16553us;155us;16553us;158us;16553us;159us;16553us;162us;16553us;163us;16553us;164us;16553us;166us;16553us;167us;16553us;168us;16553us;169us;16553us;170us;16553us;171us;16553us;172us;16553us;173us;16553us;174us;16553us;175us;16553us;176us;16553us;177us;16553us;178us;16553us;180us;16553us;181us;16553us;183us;16553us;184us;16553us;187us;16553us;189us;16553us;193us;16553us;194us;16553us;195us;16553us;199us;16553us;200us;16553us;201us;16553us;202us;16553us;203us;264us;3us;32768us;10us;1077us;142us;308us;203us;1061us;0us;16548us;0us;16549us;0us;16550us;6us;16553us;19us;16599us;20us;16599us;22us;398us;73us;317us;142us;16599us;203us;404us;3us;32768us;19us;1993us;20us;1994us;142us;1995us;0us;16551us;0us;16552us;1us;16554us;73us;317us;0us;16555us;14us;32768us;10us;1077us;15us;2065us;37us;2034us;38us;2036us;39us;2039us;40us;2041us;46us;1924us;60us;2063us;94us;2064us;108us;2037us;150us;2042us;163us;348us;193us;1923us;203us;322us;2us;17545us;21us;1989us;83us;1990us;8us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;55us;320us;60us;2063us;94us;2064us;203us;1061us;1us;17543us;21us;2001us;0us;16556us;1us;16974us;55us;323us;1us;17543us;21us;2001us;0us;16557us;0us;16558us;0us;16559us;0us;16560us;9us;17544us;37us;2033us;38us;2036us;39us;2038us;40us;2041us;46us;1924us;108us;2037us;150us;2042us;163us;348us;193us;1923us;0us;16561us;3us;17576us;35us;2031us;36us;2030us;76us;1926us;30us;17245us;56us;1624us;71us;1483us;72us;1627us;92us;1489us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16562us;3us;32768us;22us;337us;46us;1924us;193us;1923us;3us;17576us;35us;2031us;36us;2030us;76us;1926us;30us;17245us;56us;1624us;71us;1483us;72us;1627us;92us;1489us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16563us;2us;32768us;46us;1924us;193us;1923us;4us;32768us;15us;2052us;16us;2054us;17us;2055us;76us;1926us;2us;17576us;35us;2031us;36us;2030us;30us;17245us;56us;1624us;71us;1483us;72us;1627us;92us;1489us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16564us;1us;32768us;77us;343us;0us;16565us;1us;32768us;77us;345us;0us;16566us;1us;17472us;77us;347us;0us;16567us;1us;32768us;77us;349us;0us;16568us;11us;16570us;30us;759us;33us;755us;37us;2033us;38us;2036us;41us;769us;48us;351us;50us;434us;108us;2037us;109us;477us;137us;753us;162us;749us;0us;16569us;0us;16571us;0us;16572us;0us;16573us;3us;16647us;43us;514us;44us;513us;45us;515us;1us;16716us;84us;626us;0us;16574us;1us;16553us;73us;317us;1us;16576us;131us;358us;0us;16575us;39us;16553us;14us;16577us;15us;16577us;16us;16577us;17us;16577us;19us;16577us;20us;16577us;21us;16577us;30us;16577us;33us;16577us;37us;16577us;38us;16577us;39us;16577us;40us;16577us;41us;16577us;47us;16577us;48us;16577us;50us;16577us;51us;16577us;52us;16577us;54us;16577us;60us;16577us;67us;16577us;73us;317us;83us;16577us;87us;311us;88us;16577us;94us;16577us;101us;16577us;108us;16577us;109us;16577us;111us;16577us;119us;16577us;121us;16577us;131us;16577us;137us;16577us;142us;16577us;150us;16577us;151us;16577us;162us;16577us;0us;16578us;3us;16647us;43us;514us;44us;513us;45us;515us;2us;17576us;35us;2031us;36us;2030us;1us;16866us;92us;880us;1us;16661us;132us;530us;3us;32768us;10us;1077us;69us;368us;203us;1061us;6us;16553us;22us;371us;49us;590us;56us;592us;73us;317us;111us;591us;152us;384us;0us;16579us;0us;16580us;9us;16553us;15us;2052us;16us;2054us;17us;2055us;22us;394us;49us;590us;56us;592us;73us;317us;111us;591us;152us;384us;1us;17543us;21us;2001us;7us;16553us;10us;16599us;15us;16599us;16us;16599us;17us;16599us;73us;317us;87us;16599us;203us;404us;1us;16656us;87us;519us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;1us;16656us;87us;519us;0us;16581us;0us;16582us;0us;16583us;1us;16656us;87us;519us;0us;16584us;0us;16585us;0us;16586us;1us;32768us;120us;385us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16587us;0us;16588us;10us;16553us;10us;16599us;15us;16599us;22us;398us;37us;16599us;39us;16599us;60us;16599us;73us;317us;94us;16599us;142us;16599us;203us;392us;8us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;60us;2063us;94us;2064us;142us;390us;203us;1061us;0us;16589us;0us;16590us;9us;16553us;10us;16599us;15us;16599us;37us;16599us;39us;16599us;60us;16599us;73us;317us;94us;16599us;142us;393us;203us;404us;0us;16591us;1us;16553us;73us;317us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16592us;0us;16593us;6us;16553us;10us;16599us;15us;16599us;16us;16599us;17us;16599us;73us;317us;203us;404us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16594us;0us;16595us;0us;16596us;0us;16597us;14us;16553us;10us;16599us;15us;16599us;16us;16599us;17us;16599us;19us;16599us;20us;16599us;37us;16599us;39us;16599us;60us;16599us;73us;317us;87us;16599us;94us;16599us;142us;16599us;203us;404us;0us;16598us;2us;17545us;21us;1989us;83us;1990us;14us;16553us;10us;16599us;15us;16599us;16us;16599us;17us;16599us;19us;16599us;20us;16599us;37us;16599us;39us;16599us;60us;16599us;73us;317us;87us;16599us;94us;16599us;142us;16599us;203us;404us;0us;16600us;1us;17551us;110us;2004us;0us;16601us;1us;17551us;110us;2004us;2us;32768us;20us;413us;203us;414us;0us;16602us;0us;16603us;1us;16604us;131us;416us;1us;17551us;110us;2004us;0us;16605us;1us;16553us;73us;317us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;17315us;77us;1660us;1us;32768us;69us;422us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16606us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;17315us;77us;1660us;6us;32768us;10us;1077us;21us;429us;26us;411us;69us;427us;87us;409us;203us;1061us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16607us;0us;16608us;0us;16609us;0us;16610us;1us;16611us;48us;433us;0us;16612us;1us;16613us;48us;435us;0us;16614us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;16647us;43us;514us;44us;513us;45us;515us;15us;32768us;14us;594us;30us;759us;33us;755us;41us;769us;47us;350us;48us;352us;50us;432us;51us;353us;52us;354us;54us;522us;109us;477us;111us;593us;119us;465us;137us;753us;162us;749us;51us;32768us;14us;594us;30us;759us;33us;755us;41us;769us;46us;1924us;47us;350us;48us;352us;50us;432us;51us;353us;52us;354us;54us;522us;56us;581us;58us;673us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;569us;96us;1717us;106us;1866us;109us;477us;111us;593us;113us;1864us;119us;465us;120us;708us;122us;1865us;137us;753us;148us;1863us;162us;749us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;0us;16615us;0us;16616us;4us;17551us;10us;1077us;109us;486us;110us;2004us;203us;1061us;1us;17537us;19us;1999us;0us;16617us;0us;16618us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;7us;16654us;36us;1748us;46us;1924us;70us;1762us;87us;516us;91us;1918us;189us;1920us;193us;1923us;0us;16619us;0us;16620us;1us;17551us;110us;2004us;3us;32768us;92us;1929us;100us;1934us;193us;1923us;2us;16715us;34us;2032us;160us;17578us;1us;32768us;77us;454us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;2us;16485us;26us;205us;87us;203us;1us;17537us;19us;1999us;0us;16621us;0us;16622us;1us;17537us;19us;1999us;0us;16623us;1us;17537us;19us;1999us;0us;16624us;1us;17537us;19us;1999us;0us;16625us;37us;32768us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;1us;16661us;132us;530us;9us;32768us;10us;1077us;15us;2065us;21us;472us;37us;2061us;39us;2062us;60us;2063us;69us;468us;94us;2064us;203us;1061us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;17537us;19us;1999us;0us;16626us;0us;16627us;0us;16628us;1us;17543us;21us;2001us;0us;16629us;1us;16553us;73us;317us;0us;16630us;1us;17553us;118us;2005us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;32768us;10us;1077us;193us;1923us;203us;1061us;3us;32768us;10us;1077us;77us;481us;203us;1061us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;16631us;0us;16632us;0us;16633us;0us;16634us;1us;17553us;118us;2005us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;32768us;10us;1077us;193us;1923us;203us;1061us;1us;16639us;77us;497us;9us;32768us;10us;1077us;15us;2065us;21us;495us;37us;2061us;39us;2062us;60us;2063us;69us;491us;94us;2064us;203us;1061us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;2us;16485us;26us;205us;87us;203us;0us;16635us;0us;16636us;0us;16637us;0us;16638us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;16640us;0us;16641us;1us;16912us;76us;501us;3us;32768us;92us;1929us;100us;1934us;193us;1923us;0us;16642us;1us;32768us;76us;504us;3us;32768us;92us;1929us;100us;1934us;193us;1923us;0us;16643us;0us;16644us;4us;32768us;66us;508us;92us;1929us;100us;1934us;193us;1923us;1us;32768us;76us;509us;3us;32768us;92us;1929us;100us;1934us;193us;1923us;0us;16645us;0us;16646us;0us;16648us;0us;16649us;0us;16650us;0us;16651us;31us;16553us;10us;16653us;14us;16653us;15us;16653us;16us;16653us;17us;16653us;19us;16653us;20us;16653us;21us;16653us;22us;537us;30us;16653us;33us;16653us;37us;16653us;39us;16653us;41us;16653us;43us;16653us;44us;16653us;45us;16653us;50us;16653us;52us;16653us;54us;16653us;60us;16653us;73us;317us;83us;16653us;87us;16653us;94us;16653us;109us;16653us;111us;16653us;119us;16653us;137us;16653us;142us;16653us;162us;16653us;3us;32768us;19us;1993us;20us;1994us;142us;1995us;0us;16652us;6us;16553us;19us;16599us;20us;16599us;22us;398us;73us;317us;142us;16599us;203us;404us;3us;32768us;19us;1993us;20us;1994us;142us;1995us;0us;16655us;37us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;46us;1924us;56us;1853us;60us;2063us;66us;1847us;88us;1844us;91us;1918us;92us;1837us;94us;2064us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;33us;16665us;35us;2031us;36us;2030us;56us;17576us;71us;17576us;72us;17576us;92us;17576us;106us;17576us;122us;17576us;132us;534us;136us;17576us;148us;17576us;155us;17576us;166us;17576us;167us;17576us;168us;17576us;169us;17576us;170us;17576us;171us;17576us;172us;17576us;173us;17576us;174us;17576us;175us;17576us;176us;17576us;177us;17576us;178us;17576us;180us;17576us;181us;17576us;194us;17576us;195us;17576us;199us;17576us;200us;17576us;201us;17576us;202us;17576us;0us;16657us;30us;32768us;56us;1624us;71us;1483us;72us;1627us;92us;1489us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;16665us;132us;534us;0us;16658us;0us;16659us;0us;16660us;3us;32768us;10us;1077us;193us;1923us;203us;1061us;0us;16662us;0us;16663us;0us;16664us;2us;32768us;154us;536us;193us;1923us;0us;16666us;0us;16667us;1us;16553us;73us;317us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16668us;0us;16669us;0us;16670us;2us;17545us;21us;1989us;83us;1990us;14us;16553us;10us;16672us;14us;16672us;15us;16672us;16us;16672us;17us;16672us;19us;16672us;20us;16672us;21us;16672us;60us;16672us;61us;16672us;73us;317us;111us;16672us;142us;16672us;196us;16672us;0us;16671us;4us;32768us;47us;556us;48us;558us;51us;559us;203us;553us;5us;17551us;47us;556us;48us;558us;51us;559us;110us;2004us;203us;553us;3us;17551us;109us;486us;110us;2004us;203us;552us;1us;17537us;19us;1999us;0us;16673us;1us;17537us;19us;1999us;0us;16674us;0us;16675us;1us;17551us;110us;2004us;1us;17537us;19us;1999us;0us;16676us;1us;32768us;48us;557us;0us;16677us;0us;16678us;0us;16679us;3us;16647us;43us;514us;44us;513us;45us;515us;36us;32768us;46us;1924us;56us;581us;58us;673us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;569us;96us;1717us;106us;1866us;113us;1864us;120us;708us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;2us;17365us;76us;1926us;155us;563us;1us;32768us;201us;564us;2us;32768us;10us;1077us;203us;1061us;0us;16680us;0us;16681us;0us;16682us;0us;16683us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;570us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1867us;30us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1848us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;16844us;88us;572us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16684us;5us;16553us;60us;2043us;61us;2045us;73us;317us;196us;2046us;203us;578us;5us;32768us;10us;1077us;60us;2043us;61us;2045us;196us;2046us;203us;1061us;0us;16685us;0us;16686us;3us;32768us;60us;2043us;61us;2045us;196us;2046us;0us;16687us;0us;16688us;2us;32768us;72us;584us;92us;1854us;0us;16689us;0us;16690us;2us;16553us;73us;317us;203us;588us;3us;32768us;10us;1077us;65us;2047us;203us;1061us;0us;16691us;0us;16692us;1us;32768us;65us;2047us;0us;16693us;0us;16694us;0us;16695us;0us;16696us;0us;16697us;0us;16698us;7us;32768us;10us;1077us;46us;1924us;91us;1918us;92us;602us;189us;1920us;193us;1923us;203us;1061us;3us;16699us;34us;2032us;76us;1926us;160us;17578us;2us;32768us;46us;1924us;193us;1923us;1us;16700us;76us;1926us;0us;16701us;0us;16702us;0us;16703us;1us;16553us;73us;317us;4us;32768us;93us;2051us;94us;2048us;95us;2050us;97us;607us;0us;16704us;2us;16716us;84us;626us;97us;607us;1us;16711us;97us;608us;1us;16553us;73us;317us;2us;16553us;73us;317us;143us;619us;0us;16705us;0us;16706us;2us;32768us;91us;1918us;189us;1920us;1us;16707us;89us;613us;30us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1848us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;16708us;89us;635us;1us;32768us;160us;616us;1us;16553us;73us;317us;1us;32768us;161us;618us;0us;16709us;0us;16710us;1us;32768us;160us;621us;3us;16553us;73us;317us;84us;16712us;161us;16712us;1us;16716us;84us;626us;1us;32768us;161us;624us;0us;16713us;0us;16714us;32us;32768us;46us;1924us;52us;638us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;653us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;16717us;131us;630us;1us;17312us;131us;630us;1us;17314us;131us;630us;32us;32768us;46us;1924us;52us;638us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;653us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16718us;0us;16719us;1us;17363us;89us;635us;1us;17364us;89us;635us;30us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1848us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;16720us;76us;1870us;1us;16721us;76us;1870us;2us;32768us;91us;1918us;189us;1920us;1us;32768us;77us;640us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16722us;3us;17366us;77us;645us;79us;643us;89us;1737us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;4us;16723us;46us;17375us;70us;17375us;91us;17375us;193us;17375us;5us;32768us;56us;646us;92us;650us;148us;649us;152us;660us;193us;647us;0us;16724us;3us;16731us;34us;1876us;56us;648us;160us;1878us;0us;16725us;0us;16726us;1us;16553us;73us;317us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16727us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1867us;4us;32768us;93us;2051us;94us;2048us;95us;2050us;102us;664us;1us;32768us;77us;656us;1us;32768us;92us;657us;1us;16553us;73us;317us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16728us;2us;32768us;34us;1876us;160us;1878us;0us;16729us;0us;16730us;6us;16732us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;31us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;6us;16733us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;13us;16734us;10us;17355us;36us;1748us;46us;1924us;69us;17355us;70us;1762us;91us;1918us;96us;1714us;97us;17355us;98us;17355us;186us;1722us;189us;1920us;193us;1923us;203us;17355us;1us;16553us;73us;317us;0us;16735us;1us;32768us;58us;673us;1us;16553us;73us;317us;0us;16736us;2us;16737us;21us;2001us;58us;17543us;0us;16738us;1us;16740us;58us;673us;1us;16553us;73us;317us;0us;16739us;3us;16647us;43us;514us;44us;513us;45us;515us;6us;32768us;10us;1077us;92us;693us;100us;1934us;120us;684us;193us;1923us;203us;1061us;35us;16741us;46us;1924us;56us;581us;66us;1759us;69us;690us;72us;584us;77us;688us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;120us;681us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;0us;16742us;34us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;203us;1061us;0us;16743us;0us;16744us;34us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;203us;1061us;0us;16745us;0us;16746us;0us;16747us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16748us;40us;32768us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;5us;16749us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;0us;16750us;29us;32768us;58us;1969us;62us;1951us;63us;1949us;69us;1953us;70us;696us;74us;1957us;78us;694us;82us;1961us;89us;1958us;90us;1959us;96us;1952us;102us;1954us;143us;1964us;145us;1960us;155us;1966us;158us;1963us;160us;1955us;161us;1956us;182us;1962us;183us;1950us;184us;1947us;185us;1946us;186us;1948us;187us;1941us;188us;1945us;189us;1944us;190us;1943us;191us;1942us;203us;1932us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16751us;1us;32768us;59us;697us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16752us;4us;17472us;21us;2001us;58us;17543us;69us;701us;120us;705us;0us;16753us;40us;32768us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;6us;17543us;21us;2001us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;46us;16754us;10us;16759us;14us;16759us;15us;16759us;16us;16759us;17us;16759us;19us;16759us;20us;16759us;21us;16759us;30us;16759us;33us;16759us;37us;16759us;38us;16759us;39us;16759us;40us;16759us;41us;16759us;43us;16759us;44us;16759us;45us;16759us;47us;16759us;48us;16759us;50us;16759us;51us;16759us;52us;16759us;54us;16759us;60us;16759us;67us;16759us;73us;16759us;83us;16759us;87us;16759us;88us;16759us;93us;16759us;94us;16759us;95us;16759us;101us;16759us;108us;16759us;109us;16759us;111us;16759us;119us;16759us;121us;16759us;131us;16759us;137us;16759us;142us;16759us;150us;16759us;151us;16759us;162us;16759us;203us;16759us;0us;16755us;34us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;203us;1061us;0us;16756us;0us;16757us;32us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;0us;16758us;1us;16761us;96us;711us;31us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16760us;1us;17472us;77us;714us;31us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;7us;16762us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;98us;1700us;189us;1920us;193us;1923us;7us;16763us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;98us;1700us;189us;1920us;193us;1923us;0us;16764us;0us;16765us;0us;16766us;0us;16767us;2us;17545us;21us;1989us;83us;1990us;5us;16553us;60us;17544us;61us;17544us;65us;17544us;73us;317us;196us;17544us;0us;16768us;0us;16769us;1us;17553us;118us;2005us;0us;16770us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;32768us;10us;1077us;193us;1923us;203us;1061us;3us;32768us;10us;1077us;77us;730us;203us;1061us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;16771us;0us;16772us;0us;16773us;0us;16774us;1us;16656us;87us;519us;0us;16775us;1us;16553us;73us;317us;3us;16647us;43us;514us;44us;513us;45us;515us;3us;32768us;10us;1077us;193us;1923us;203us;1061us;1us;16781us;69us;747us;0us;16776us;0us;16777us;1us;16778us;120us;744us;34us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;195us;574us;201us;2016us;202us;849us;203us;1061us;0us;16779us;0us;16780us;2us;32768us;46us;1924us;193us;1923us;1us;16782us;76us;1926us;1us;17547us;103us;2003us;2us;16553us;73us;317us;203us;804us;0us;16783us;0us;16784us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16785us;1us;17547us;103us;2003us;2us;16553us;73us;317us;203us;804us;3us;32768us;10us;1077us;19us;767us;203us;1061us;0us;16786us;81us;32768us;13us;1189us;19us;762us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;3us;32768us;10us;1077us;19us;767us;203us;1061us;0us;16787us;0us;16788us;0us;16789us;0us;16790us;0us;16791us;0us;16792us;0us;16793us;0us;16794us;1us;16553us;73us;317us;3us;16647us;43us;514us;44us;513us;45us;515us;1us;32768us;193us;1923us;2us;17576us;35us;2031us;36us;2030us;1us;32768us;92us;774us;4us;16553us;73us;317us;93us;16798us;94us;16798us;95us;16798us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16795us;1us;16796us;97us;779us;1us;16797us;97us;781us;1us;16553us;73us;317us;0us;16799us;1us;16553us;73us;317us;0us;16800us;3us;32768us;42us;793us;46us;1924us;193us;1923us;6us;16801us;35us;2031us;36us;2030us;70us;17576us;89us;792us;96us;791us;193us;1923us;0us;16802us;1us;16803us;76us;1926us;5us;16808us;35us;2031us;36us;2030us;70us;17576us;89us;792us;96us;791us;1us;32768us;70us;789us;1us;32768us;59us;790us;0us;16804us;0us;16805us;0us;16806us;1us;32768us;96us;795us;1us;16809us;96us;795us;0us;16807us;3us;32768us;42us;794us;46us;1924us;193us;1923us;1us;16812us;131us;799us;0us;16810us;2us;16553us;73us;317us;203us;804us;1us;16812us;131us;799us;0us;16811us;1us;17551us;110us;2004us;0us;16813us;0us;16814us;1us;17553us;118us;2005us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;17315us;77us;1660us;3us;32768us;10us;1077us;69us;809us;203us;1061us;81us;32768us;13us;1189us;22us;813us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;811us;0us;16815us;0us;16816us;0us;16817us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16818us;0us;16819us;0us;16820us;0us;16823us;1us;16821us;84us;821us;0us;16822us;2us;32768us;91us;1918us;189us;1920us;2us;32768us;69us;823us;131us;825us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16824us;2us;32768us;91us;1918us;189us;1920us;0us;16825us;0us;16826us;2us;32768us;56us;831us;77us;829us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16827us;0us;16828us;0us;16829us;0us;16830us;0us;16831us;0us;16832us;0us;16833us;0us;16834us;0us;16835us;0us;16836us;0us;16837us;0us;16838us;0us;16839us;0us;16840us;0us;16841us;0us;16842us;0us;16843us;0us;16844us;0us;16845us;0us;16846us;1us;16849us;186us;851us;1us;32768us;178us;852us;0us;16847us;1us;32768us;178us;854us;1us;16850us;186us;855us;1us;32768us;178us;856us;0us;16848us;0us;16851us;2us;32768us;62us;853us;178us;850us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16852us;0us;16853us;2us;32768us;92us;858us;178us;857us;0us;16854us;1us;16855us;34us;865us;1us;32768us;160us;1895us;0us;16856us;5us;16857us;58us;901us;78us;902us;89us;913us;97us;907us;132us;899us;0us;16858us;1us;32768us;193us;1923us;0us;16859us;1us;16862us;77us;873us;2us;16863us;77us;873us;97us;877us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;16860us;0us;16861us;3us;32768us;73us;317us;74us;869us;193us;1923us;3us;32768us;73us;317us;74us;869us;193us;1923us;0us;16864us;0us;16865us;8us;32768us;10us;1077us;73us;317us;74us;869us;93us;2051us;94us;2048us;95us;2050us;193us;1923us;203us;885us;5us;32768us;10us;1077us;93us;2051us;94us;2048us;95us;2050us;203us;1061us;0us;16867us;0us;16868us;0us;16869us;3us;16974us;93us;2051us;94us;2048us;95us;2050us;0us;16870us;0us;16871us;3us;16873us;78us;902us;89us;913us;97us;907us;1us;16874us;78us;902us;2us;16878us;78us;902us;89us;913us;2us;16879us;78us;902us;89us;913us;2us;16882us;78us;902us;89us;913us;1us;16884us;78us;902us;1us;16885us;78us;902us;6us;32768us;58us;901us;69us;1079us;78us;902us;89us;913us;97us;907us;132us;899us;6us;32768us;58us;901us;69us;1084us;78us;902us;89us;913us;97us;907us;132us;899us;6us;32768us;58us;901us;69us;1167us;78us;902us;89us;913us;97us;907us;132us;899us;6us;32768us;58us;901us;69us;1174us;78us;902us;89us;913us;97us;907us;132us;899us;36us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16872us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;16875us;97us;906us;0us;16876us;0us;16877us;44us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;60us;2063us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;94us;2064us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;44us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;60us;2063us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;94us;2064us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;0us;16880us;0us;16881us;44us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;60us;2063us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;94us;2064us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;0us;16883us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;2us;17545us;21us;1989us;83us;1990us;0us;16886us;3us;17544us;21us;1989us;83us;1990us;193us;1923us;0us;16887us;1us;32768us;193us;1923us;0us;16888us;3us;32768us;10us;1077us;69us;922us;203us;1061us;4us;17511us;10us;1077us;69us;922us;76us;1976us;203us;1061us;40us;32768us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;6us;16889us;58us;1002us;77us;1005us;78us;1009us;89us;1018us;97us;1012us;132us;1000us;0us;16890us;0us;16891us;39us;16914us;34us;2032us;35us;934us;36us;936us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;941us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;160us;17578us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;37us;16892us;35us;929us;36us;931us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;941us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16893us;35us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;941us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16894us;35us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;941us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16895us;0us;16896us;35us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;941us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16897us;35us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;941us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16898us;31us;32768us;46us;1924us;56us;581us;66us;1847us;72us;584us;88us;1844us;91us;1918us;92us;1848us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;16899us;0us;16900us;64us;16928us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;58us;1969us;62us;1951us;63us;1949us;66us;500us;69us;1953us;70us;957us;71us;960us;73us;317us;74us;964us;81us;938us;82us;1961us;89us;1958us;90us;1959us;92us;971us;96us;1952us;97us;1015us;100us;1934us;102us;1954us;106us;969us;122us;968us;143us;1964us;145us;1960us;148us;970us;155us;1477us;158us;1963us;160us;1955us;161us;1956us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;182us;1962us;183us;1950us;184us;1947us;185us;1946us;186us;1948us;187us;1941us;188us;1945us;189us;1944us;190us;1943us;191us;1942us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;975us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;16901us;0us;16902us;37us;16906us;35us;949us;36us;947us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16903us;35us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16904us;35us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16905us;0us;16907us;3us;32768us;46us;1924us;193us;1923us;203us;955us;3us;32768us;60us;2043us;61us;2045us;196us;2046us;0us;16908us;3us;32768us;60us;2043us;61us;2045us;196us;2046us;0us;16909us;38us;16951us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;32768us;59us;959us;0us;16910us;38us;16951us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;32768us;64us;962us;0us;16911us;1us;32768us;193us;1923us;1us;17496us;193us;1923us;0us;16913us;0us;16914us;0us;16915us;0us;16916us;0us;16917us;0us;16918us;64us;16928us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;58us;1969us;62us;1951us;63us;1949us;66us;500us;69us;1953us;70us;957us;71us;960us;73us;317us;74us;964us;81us;938us;82us;1961us;89us;1958us;90us;1959us;92us;971us;96us;1952us;97us;1015us;100us;1934us;102us;1954us;106us;969us;122us;968us;143us;1964us;145us;1960us;148us;970us;155us;1477us;158us;1963us;160us;1955us;161us;1956us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;182us;1962us;183us;1950us;184us;1947us;185us;1946us;186us;1948us;187us;1941us;188us;1945us;189us;1944us;190us;1943us;191us;1942us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;975us;5us;32768us;10us;1077us;93us;2051us;94us;2048us;95us;2050us;203us;1061us;0us;16919us;0us;16920us;3us;16974us;93us;2051us;94us;2048us;95us;2050us;2us;16921us;34us;17476us;160us;17476us;0us;16922us;1us;32768us;92us;979us;40us;32768us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;983us;6us;16931us;10us;1077us;93us;2051us;94us;2048us;95us;2050us;97us;1011us;203us;1061us;0us;16923us;0us;16924us;3us;16974us;93us;2051us;94us;2048us;95us;2050us;0us;16925us;0us;16926us;6us;16927us;58us;1002us;77us;1005us;78us;1009us;89us;1018us;97us;1012us;132us;1000us;4us;16930us;77us;1005us;78us;1009us;89us;1018us;97us;1012us;3us;16935us;77us;1005us;78us;1009us;89us;1018us;2us;16936us;77us;1005us;78us;1009us;3us;16938us;77us;1005us;78us;1009us;89us;1018us;3us;16939us;77us;1005us;78us;1009us;89us;1018us;3us;16942us;77us;1005us;78us;1009us;89us;1018us;2us;16944us;77us;1005us;78us;1009us;6us;32768us;58us;1002us;77us;1005us;78us;1009us;89us;1018us;97us;1012us;132us;1000us;2us;16945us;77us;1005us;78us;1009us;6us;16948us;58us;1002us;77us;1005us;78us;1009us;89us;1018us;97us;1012us;132us;1000us;8us;17545us;21us;1989us;58us;1002us;77us;1005us;78us;1009us;83us;1990us;89us;1018us;97us;1012us;132us;1000us;15us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;58us;1002us;60us;2063us;69us;1537us;77us;1005us;78us;1009us;89us;1018us;94us;2064us;97us;1012us;127us;1534us;132us;1000us;203us;1065us;7us;17112us;58us;1002us;77us;1005us;78us;1009us;84us;1327us;89us;1018us;97us;1012us;132us;1000us;36us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16929us;38us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;16931us;97us;1011us;1us;16932us;89us;1017us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;16933us;0us;16934us;38us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;38us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16937us;45us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;60us;2063us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;94us;2064us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;45us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;60us;2063us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;94us;2064us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;0us;16940us;0us;16941us;45us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;60us;2063us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;94us;2064us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;0us;16943us;38us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;38us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;2us;17545us;21us;1989us;83us;1990us;0us;16946us;2us;17544us;46us;1924us;193us;1923us;0us;16947us;4us;32768us;10us;1077us;69us;1024us;76us;1926us;203us;1061us;40us;32768us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;0us;16949us;0us;16950us;0us;16952us;38us;16951us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;16953us;82us;32768us;13us;1189us;15us;2052us;16us;2054us;17us;2055us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;5us;32768us;10us;1077us;15us;2052us;16us;2054us;17us;2055us;203us;1061us;0us;16954us;0us;16955us;0us;16956us;0us;16957us;82us;32768us;13us;1189us;15us;2052us;16us;2054us;17us;2055us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;3us;32768us;15us;2052us;16us;2054us;17us;2055us;0us;16958us;0us;16959us;26us;16960us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;1us;16962us;18us;1042us;0us;16961us;0us;16963us;93us;16963us;14us;17306us;15us;17306us;16us;17306us;17us;17306us;18us;17306us;19us;17306us;21us;17306us;26us;17306us;27us;17306us;28us;17306us;30us;17306us;33us;17306us;37us;17306us;38us;17306us;39us;17306us;40us;17306us;41us;17306us;43us;17306us;44us;17306us;45us;17306us;47us;17306us;48us;17306us;50us;17306us;51us;17306us;52us;17306us;54us;17306us;58us;17306us;59us;17306us;60us;17306us;61us;17306us;62us;17306us;63us;17306us;64us;17306us;65us;17306us;67us;17306us;69us;17306us;73us;17306us;77us;17306us;78us;17306us;79us;17306us;80us;17306us;81us;17306us;82us;17306us;83us;17306us;84us;17306us;87us;17306us;88us;17306us;89us;17306us;90us;17306us;93us;17306us;94us;17306us;95us;17306us;96us;17306us;97us;17306us;98us;17306us;101us;17306us;102us;17306us;104us;17306us;105us;17306us;108us;17306us;109us;17306us;111us;17306us;119us;17306us;121us;17306us;127us;17306us;128us;17306us;129us;17306us;131us;17306us;137us;17306us;138us;17306us;139us;17306us;140us;17306us;141us;17306us;142us;17306us;143us;17306us;145us;17306us;150us;17306us;151us;17306us;156us;17306us;158us;17306us;160us;17306us;161us;17306us;162us;17306us;184us;17306us;185us;17306us;186us;17306us;188us;17306us;189us;17306us;190us;17306us;191us;17306us;196us;17306us;197us;17306us;198us;17306us;1us;16966us;77us;1046us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;16964us;0us;16965us;1us;32768us;10us;1050us;0us;16967us;30us;16970us;21us;1989us;28us;1056us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;83us;1990us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;104us;1054us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;79us;16969us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16968us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16971us;1us;32768us;22us;1057us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;3us;32768us;15us;2052us;16us;2054us;17us;2055us;0us;16972us;82us;16973us;13us;1189us;21us;1096us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1095us;0us;16974us;2us;16974us;19us;2009us;138us;2008us;2us;16974us;19us;2009us;138us;2008us;2us;16974us;30us;2007us;137us;2006us;2us;16974us;19us;2009us;138us;2008us;2us;16974us;19us;2009us;138us;2008us;0us;16974us;1us;16974us;58us;1322us;1us;16974us;59us;1435us;1us;16974us;59us;1456us;1us;16974us;156us;1481us;1us;16974us;64us;1487us;3us;16974us;93us;2051us;94us;2048us;95us;2050us;3us;16974us;93us;2051us;94us;2048us;95us;2050us;3us;16974us;60us;2043us;61us;2045us;196us;2046us;1us;16974us;65us;2047us;0us;16975us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;32768us;127us;1081us;2us;16978us;31us;1083us;165us;1078us;0us;16976us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;3us;32768us;10us;1077us;19us;767us;203us;1061us;1us;17543us;21us;2001us;2us;16978us;31us;1083us;165us;1078us;0us;16977us;1us;32768us;127us;1090us;80us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1092us;0us;16979us;0us;16980us;82us;32768us;13us;1189us;21us;1096us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1095us;0us;16981us;0us;16982us;81us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1098us;0us;16983us;0us;16984us;0us;16985us;0us;16986us;0us;16987us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;4us;32768us;10us;1077us;26us;1307us;87us;1305us;203us;1061us;0us;16988us;0us;16989us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;4us;32768us;10us;1077us;26us;1307us;87us;1305us;203us;1061us;0us;16990us;0us;16991us;82us;32768us;10us;1077us;13us;1189us;18us;1114us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;5us;32768us;10us;1077us;26us;1307us;87us;1305us;129us;1116us;203us;1061us;0us;16992us;0us;16993us;2us;16994us;26us;1307us;87us;1305us;0us;16995us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;16996us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;30us;32768us;10us;1077us;28us;1334us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;104us;1332us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;203us;1061us;0us;16997us;0us;16998us;0us;16999us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17000us;68us;17002us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;159us;1166us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17001us;80us;32768us;13us;1189us;22us;1036us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17003us;69us;17005us;13us;1189us;22us;1036us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;159us;1166us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17004us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1066us;0us;17006us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1066us;0us;17007us;45us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;60us;2063us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;94us;2064us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1064us;10us;17543us;10us;1077us;15us;2065us;21us;2001us;30us;2007us;37us;2061us;39us;2062us;60us;2063us;94us;2064us;137us;2006us;203us;1061us;87us;32768us;10us;1077us;13us;1189us;15us;2065us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1062us;9us;32768us;10us;1077us;15us;2065us;19us;2009us;37us;2061us;39us;2062us;60us;2063us;94us;2064us;138us;2008us;203us;1061us;0us;17008us;0us;17009us;0us;17010us;0us;17011us;0us;17012us;1us;32768us;98us;1532us;0us;17013us;4us;32768us;10us;1077us;30us;2007us;137us;2006us;203us;1061us;82us;32768us;10us;1077us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1063us;4us;32768us;10us;1077us;19us;2009us;138us;2008us;203us;1061us;0us;17014us;0us;17015us;0us;17016us;0us;17017us;0us;17018us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;2us;32768us;19us;2009us;138us;2008us;0us;17019us;0us;17020us;0us;17021us;0us;17022us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;26us;17023us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;26us;17024us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;0us;17025us;0us;17026us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;32768us;127us;1169us;1us;17543us;21us;2001us;2us;16978us;31us;1083us;165us;1078us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17027us;37us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;81us;938us;92us;971us;97us;910us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;3us;32768us;10us;1077us;19us;767us;203us;1061us;1us;17543us;21us;2001us;3us;16978us;31us;1083us;165us;1078us;203us;1180us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17028us;0us;17029us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;32768us;127us;1183us;1us;17543us;21us;2001us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17030us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;3us;32768us;10us;1077us;19us;767us;203us;1061us;0us;17031us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;26us;17032us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17033us;26us;17040us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;20us;17043us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;20us;17045us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;9us;17047us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;20us;17049us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;18us;17051us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;96us;1280us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;18us;17053us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;96us;1280us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;9us;17055us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;9us;17057us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;9us;17059us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;9us;17061us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;9us;17063us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;9us;17065us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;9us;17067us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;189us;1270us;191us;1284us;1us;17069us;191us;1284us;8us;17071us;62us;1278us;78us;1274us;81us;1231us;96us;1280us;158us;1272us;184us;1276us;186us;1282us;191us;1284us;4us;17073us;96us;1280us;158us;1272us;186us;1282us;191us;1284us;4us;17075us;96us;1280us;158us;1272us;186us;1282us;191us;1284us;1us;17077us;191us;1284us;1us;17079us;191us;1284us;1us;17081us;191us;1284us;23us;17083us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;102us;1252us;128us;1246us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;24us;17085us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;30us;32768us;10us;1077us;30us;2007us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;137us;2006us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;203us;1061us;26us;17111us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;26us;17115us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;26us;17120us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;30us;32768us;10us;1077us;28us;1334us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;104us;1332us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;203us;1061us;24us;17124us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;24us;17126us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;24us;17129us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;26us;32768us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;24us;17131us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;89us;1254us;90us;1256us;96us;1280us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;29us;32768us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;93us;2051us;94us;2048us;95us;2050us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;26us;17236us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;28us;32768us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;105us;1539us;128us;1246us;139us;1540us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;26us;17239us;62us;1278us;63us;1264us;69us;1260us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;27us;17566us;62us;1278us;63us;1264us;69us;1260us;77us;2018us;78us;1274us;79us;1234us;80us;1237us;81us;1231us;82us;1240us;89us;1254us;90us;1256us;96us;1280us;97us;1347us;102us;1252us;128us;1246us;143us;1286us;145us;1248us;158us;1272us;160us;1266us;161us;1268us;184us;1276us;185us;1258us;186us;1282us;188us;1250us;189us;1270us;190us;1262us;191us;1284us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17034us;0us;17035us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17036us;0us;17037us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17038us;0us;17039us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;17087us;68us;1242us;80us;32768us;13us;1189us;22us;1036us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17041us;1us;17042us;97us;1343us;6us;17042us;10us;1077us;93us;2051us;94us;2048us;95us;2050us;97us;1343us;203us;1061us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17044us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17046us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17048us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17050us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17052us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17054us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17056us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17058us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17060us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17062us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17064us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17066us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17068us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17070us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17072us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17074us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17076us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17078us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17080us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17082us;76us;17084us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;79us;17503us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1289us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;79us;17504us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17086us;0us;17086us;81us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1296us;4us;32768us;10us;1077us;19us;2009us;138us;2008us;203us;1061us;0us;17088us;0us;17089us;2us;32768us;19us;2009us;138us;2008us;0us;17090us;0us;17091us;0us;17092us;0us;17093us;0us;17094us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17095us;40us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;58us;1313us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1316us;0us;17096us;41us;32768us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;58us;1313us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1067us;3us;32768us;10us;1077us;20us;1309us;203us;1061us;0us;17097us;0us;17098us;0us;17099us;0us;17100us;39us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1315us;0us;17101us;0us;17102us;0us;17103us;0us;17104us;3us;32768us;10us;1077us;98us;1328us;203us;1068us;3us;17105us;10us;1077us;58us;1320us;203us;1061us;40us;32768us;10us;1077us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1061us;0us;17106us;38us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;0us;17107us;0us;17108us;0us;17109us;0us;17110us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17113us;3us;17119us;27us;1338us;140us;1337us;141us;1340us;0us;17114us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17116us;82us;32768us;10us;1077us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17117us;0us;17118us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;80us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17121us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17122us;0us;17123us;87us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;97us;1345us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17125us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17127us;87us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;97us;1349us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17128us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17130us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17483us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17483us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17132us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17490us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17133us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17486us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17134us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17489us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17135us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17502us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17136us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17497us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17137us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;50us;17498us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17138us;31us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1837us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1385us;31us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1837us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1385us;2us;17576us;35us;2031us;36us;2030us;37us;17280us;14us;17283us;21us;17283us;26us;17283us;35us;2031us;36us;2030us;56us;17576us;71us;17576us;72us;17576us;87us;17283us;92us;17576us;106us;17576us;111us;17283us;122us;17576us;136us;17576us;148us;17576us;155us;17576us;166us;17576us;167us;17576us;168us;17576us;169us;17576us;170us;17576us;171us;17576us;172us;17576us;173us;17576us;174us;17576us;175us;17576us;176us;17576us;177us;17576us;178us;17576us;180us;17576us;181us;17576us;194us;17576us;195us;17576us;199us;17576us;200us;17576us;201us;17576us;202us;17576us;31us;32768us;56us;1624us;71us;1483us;72us;1627us;92us;1489us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1384us;31us;32768us;56us;1624us;71us;1483us;72us;1627us;92us;1489us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1384us;1us;17140us;76us;1382us;6us;17140us;14us;17282us;26us;17282us;76us;1382us;87us;17282us;111us;17282us;132us;534us;7us;17174us;10us;1077us;46us;1443us;70us;1452us;92us;1445us;100us;1934us;193us;1923us;203us;1061us;0us;17139us;0us;17141us;0us;17142us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17143us;50us;32768us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;119us;1374us;122us;1464us;136us;1469us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17144us;41us;17145us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1395us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;44us;17145us;26us;1577us;46us;1429us;56us;1437us;66us;1398us;69us;1564us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;87us;1573us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1395us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;44us;17256us;26us;1577us;46us;1429us;56us;1437us;66us;1398us;69us;1564us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;87us;1573us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1395us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17146us;5us;17147us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;40us;32768us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;5us;17148us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;5us;17149us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;3us;32768us;10us;1077us;76us;1400us;203us;1061us;4us;17257us;10us;1077us;69us;1569us;76us;1400us;203us;1061us;42us;32768us;10us;1077us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;5us;17150us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;0us;17151us;0us;17152us;2us;17153us;34us;1410us;35us;1409us;1us;17154us;34us;1410us;5us;17156us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;5us;17431us;34us;1410us;35us;1409us;36us;1408us;74us;1427us;76us;1419us;40us;32768us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;40us;32768us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;32768us;160us;1878us;0us;17155us;40us;32768us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;40us;17480us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;32768us;193us;1923us;1us;32768us;193us;1923us;0us;17157us;0us;17157us;0us;17158us;7us;17174us;10us;1077us;46us;1443us;70us;1452us;92us;1445us;100us;1934us;193us;1923us;203us;1061us;0us;17159us;1us;32768us;76us;1422us;7us;17174us;10us;1077us;46us;1443us;70us;1452us;92us;1445us;100us;1934us;193us;1923us;203us;1061us;0us;17160us;3us;32768us;92us;1929us;100us;1934us;193us;1923us;3us;17496us;92us;1929us;100us;1934us;193us;1923us;0us;17161us;2us;32768us;92us;1302us;193us;1301us;0us;17162us;0us;17163us;0us;17164us;81us;17231us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1069us;3us;32768us;10us;1077us;59us;1433us;203us;1061us;0us;17165us;0us;17166us;0us;17167us;0us;17168us;2us;32768us;72us;1627us;92us;1438us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17169us;0us;17170us;0us;17171us;0us;17172us;0us;17173us;0us;17175us;95us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;58us;1969us;62us;1357us;63us;1949us;66us;1398us;69us;1953us;70us;1431us;71us;1483us;72us;1627us;74us;1425us;78us;1446us;82us;1961us;85us;1131us;86us;1133us;89us;1369us;90us;1372us;91us;1414us;92us;1491us;96us;1291us;98us;1191us;100us;1934us;102us;1954us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1288us;145us;1960us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1477us;158us;1366us;159us;1166us;160us;1955us;161us;1956us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;182us;1962us;183us;1363us;184us;1360us;185us;1946us;186us;1948us;187us;1413us;188us;1945us;189us;1354us;190us;1943us;191us;1942us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1932us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;1us;32768us;76us;1448us;1us;32768us;178us;1449us;0us;17176us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17177us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1070us;3us;32768us;10us;1077us;59us;1454us;203us;1061us;0us;17178us;0us;17179us;0us;17180us;0us;17181us;0us;17182us;0us;17183us;0us;17184us;0us;17185us;0us;17186us;0us;17187us;0us;17188us;0us;17189us;0us;17190us;0us;17191us;0us;17192us;81us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;142us;1475us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1473us;3us;32768us;10us;1077us;142us;1471us;203us;1061us;0us;17193us;0us;17194us;1us;32768us;142us;1474us;0us;17195us;0us;17196us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1071us;82us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;156us;1967us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1071us;3us;32768us;10us;1077us;156us;1479us;203us;1061us;0us;17197us;0us;17198us;0us;17199us;0us;17200us;81us;17233us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1072us;3us;32768us;10us;1077us;64us;1485us;203us;1061us;0us;17201us;0us;17202us;0us;17203us;0us;17204us;90us;32768us;10us;1077us;13us;1189us;15us;1501us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;1498us;39us;1499us;41us;769us;46us;1429us;56us;1437us;60us;1500us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;88us;1541us;89us;1368us;90us;1371us;91us;1415us;92us;1490us;93us;2051us;94us;2048us;95us;2050us;96us;1290us;97us;1503us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1352us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1073us;104us;32768us;10us;1077us;13us;1189us;15us;1501us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;1498us;39us;1499us;41us;769us;46us;1429us;56us;1437us;58us;1969us;60us;1500us;62us;1357us;63us;1949us;66us;1398us;69us;1953us;70us;1431us;71us;1483us;72us;1627us;74us;1425us;82us;1961us;85us;1131us;86us;1133us;88us;1541us;89us;1369us;90us;1372us;91us;1415us;92us;1490us;93us;2051us;94us;2048us;95us;2050us;96us;1291us;97us;1503us;98us;1191us;100us;1934us;102us;1954us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1288us;145us;1960us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1477us;158us;1366us;159us;1166us;160us;1955us;161us;1956us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;182us;1962us;183us;1363us;184us;1360us;185us;1946us;186us;1948us;187us;1413us;188us;1945us;189us;1353us;190us;1943us;191us;1942us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1074us;104us;32768us;10us;1077us;13us;1189us;15us;1501us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;1498us;39us;1499us;41us;769us;46us;1429us;56us;1437us;58us;1969us;60us;1500us;62us;1357us;63us;1949us;66us;1398us;69us;1953us;70us;1431us;71us;1483us;72us;1627us;74us;1425us;82us;1961us;85us;1131us;86us;1133us;88us;1541us;89us;1369us;90us;1372us;91us;1415us;92us;1490us;93us;2051us;94us;2048us;95us;2050us;96us;1291us;97us;1503us;98us;1191us;100us;1934us;102us;1954us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1288us;145us;1960us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1477us;158us;1366us;159us;1166us;160us;1955us;161us;1956us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;182us;1962us;183us;1363us;184us;1360us;185us;1946us;186us;1948us;187us;1413us;188us;1945us;189us;1353us;190us;1943us;191us;1942us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1074us;0us;17205us;9us;32768us;10us;1077us;15us;2059us;37us;2056us;39us;2057us;60us;2058us;93us;2051us;94us;2048us;95us;2050us;203us;1061us;0us;17206us;0us;17207us;0us;17208us;0us;17208us;0us;17209us;0us;17210us;0us;17211us;0us;17212us;0us;17213us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17214us;1us;32768us;77us;1506us;1us;32768us;92us;1507us;1us;16553us;73us;317us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17215us;0us;17216us;0us;17217us;0us;17218us;4us;17218us;93us;17221us;94us;17221us;95us;17221us;102us;17221us;4us;32768us;93us;2051us;94us;2048us;95us;2050us;102us;1517us;0us;17219us;31us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;6us;17220us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;85us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;54us;1557us;56us;1437us;60us;2043us;61us;2045us;62us;1356us;66us;1399us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1375us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;196us;2046us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1075us;5us;32768us;10us;1077us;60us;2043us;61us;2045us;196us;2046us;203us;1061us;0us;17222us;0us;17223us;0us;17224us;0us;17225us;0us;17226us;0us;17227us;0us;17228us;0us;17229us;0us;17230us;0us;17232us;0us;17234us;81us;32768us;10us;1077us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17235us;86us;32768us;10us;1077us;13us;1189us;15us;2065us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17237us;0us;17238us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;79us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17240us;0us;17241us;1us;32768us;201us;2016us;3us;17247us;37us;2033us;38us;2036us;108us;2037us;0us;17244us;42us;17249us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;77us;1553us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1395us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;1us;32768us;88us;1546us;0us;17242us;0us;17243us;0us;17246us;1us;32768us;92us;1550us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17248us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1555us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17250us;37us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;93us;2051us;94us;2048us;95us;2050us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1867us;0us;17251us;30us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1837us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;2us;17576us;35us;2031us;36us;2030us;30us;17245us;56us;1624us;71us;1483us;72us;1627us;92us;1489us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17272us;2us;17264us;21us;1586us;83us;1587us;0us;17252us;0us;17253us;82us;32768us;10us;1077us;13us;1189us;22us;1036us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17272us;2us;17264us;21us;1586us;83us;1587us;0us;17254us;0us;17255us;80us;17258us;13us;1189us;22us;1036us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17272us;2us;17264us;21us;1586us;83us;1587us;0us;17259us;3us;32768us;46us;1924us;66us;1591us;193us;1923us;0us;17272us;2us;17264us;21us;1586us;83us;1587us;0us;17260us;5us;17264us;21us;1586us;46us;1924us;66us;1591us;83us;1587us;193us;1923us;1us;32768us;20us;1579us;0us;17261us;0us;17272us;2us;17264us;21us;1586us;83us;1587us;1us;32768us;20us;1583us;0us;17262us;0us;17263us;3us;17263us;46us;1924us;66us;1591us;193us;1923us;1us;17265us;83us;1589us;1us;17266us;21us;1588us;0us;17267us;0us;17268us;1us;17269us;76us;1926us;0us;17270us;0us;17271us;8us;17276us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;60us;2063us;69us;1594us;94us;2064us;203us;1061us;87us;17274us;10us;1077us;13us;1189us;15us;2065us;22us;1036us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;37us;2061us;39us;2062us;41us;769us;46us;1429us;56us;1437us;60us;2063us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;94us;2064us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;0us;17273us;0us;17275us;0us;17277us;3us;17543us;21us;2001us;26us;1608us;87us;1606us;1us;17543us;21us;2001us;3us;17290us;14us;594us;111us;593us;203us;1617us;0us;17278us;2us;32768us;14us;594us;111us;593us;0us;17279us;0us;17281us;0us;17284us;3us;16553us;22us;537us;73us;317us;203us;804us;0us;17286us;2us;16553us;73us;317us;203us;804us;1us;32768us;20us;1610us;0us;17287us;3us;17535us;19us;1996us;20us;1997us;142us;1998us;0us;17288us;3us;17290us;14us;594us;111us;593us;203us;1617us;0us;17289us;3us;17290us;14us;594us;111us;593us;203us;1617us;0us;17291us;3us;17290us;14us;594us;111us;593us;203us;1617us;0us;17292us;31us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;8us;17285us;26us;1608us;36us;1748us;46us;1924us;70us;1762us;87us;1606us;91us;1918us;189us;1920us;193us;1923us;3us;17535us;19us;1996us;20us;1997us;142us;1998us;1us;17543us;21us;2001us;0us;17293us;1us;32768us;72us;1627us;0us;17294us;0us;17295us;43us;32768us;10us;1077us;46us;1429us;56us;1437us;65us;2047us;66us;1399us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1076us;3us;32768us;10us;1077us;65us;2047us;203us;1061us;0us;17296us;0us;17297us;0us;17298us;0us;17299us;0us;17300us;35us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;1us;32768us;98us;1636us;81us;32768us;13us;1189us;22us;1030us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1638us;0us;17301us;0us;17302us;36us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;66us;500us;70us;957us;71us;960us;74us;963us;92us;971us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1649us;2us;32768us;98us;1641us;203us;1647us;82us;32768us;10us;1077us;13us;1189us;18us;1645us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;203us;1061us;3us;32768us;10us;1077us;20us;1643us;203us;1061us;0us;17303us;0us;17304us;1us;32768us;20us;1646us;0us;17305us;1us;32768us;20us;1648us;0us;17307us;1us;32768us;20us;1650us;0us;17308us;40us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;58us;1313us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1316us;0us;17309us;40us;32768us;43us;514us;44us;513us;45us;515us;46us;503us;56us;978us;58us;1313us;66us;500us;70us;957us;71us;960us;73us;317us;74us;963us;81us;938us;92us;971us;97us;1015us;100us;1934us;106us;969us;122us;968us;148us;970us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;193us;1923us;194us;2017us;195us;952us;201us;2016us;202us;849us;203us;1316us;1us;32768us;20us;1655us;0us;17310us;1us;17311us;84us;1657us;32us;32768us;46us;1924us;52us;638us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;653us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;17313us;84us;1659us;32us;32768us;46us;1924us;52us;638us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;653us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;36us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17316us;0us;17317us;1us;17320us;98us;1664us;36us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1671us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17318us;0us;17319us;1us;17324us;96us;1668us;36us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1677us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17321us;0us;17322us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1677us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17323us;1us;17328us;96us;1674us;36us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1677us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17325us;0us;17326us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;73us;317us;74us;1693us;88us;1844us;91us;1918us;92us;1751us;96us;1677us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17327us;32us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;74us;1684us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;7us;17333us;36us;1748us;46us;1924us;70us;1762us;77us;1681us;91us;1918us;189us;1920us;193us;1923us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;6us;17329us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;0us;17330us;1us;32768us;193us;1923us;1us;32768us;77us;1686us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;6us;17331us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;0us;17332us;7us;17338us;36us;1748us;46us;1924us;70us;1762us;77us;1690us;91us;1918us;189us;1920us;193us;1923us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;6us;17334us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;0us;17335us;1us;32768us;193us;1923us;1us;32768us;77us;1695us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;6us;17336us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;189us;1920us;193us;1923us;0us;17337us;7us;17342us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;98us;1700us;189us;1920us;193us;1923us;7us;32768us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;98us;1700us;189us;1920us;193us;1923us;34us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;98us;1703us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17339us;0us;17340us;31us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17341us;1us;17346us;98us;1706us;36us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;98us;1709us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17343us;0us;17344us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17345us;1us;32768us;10us;1712us;0us;17347us;8us;17355us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;96us;1714us;186us;1722us;189us;1920us;193us;1923us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17348us;0us;17349us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17350us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17351us;0us;17352us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17353us;0us;17354us;8us;17362us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;96us;1726us;186us;1731us;189us;1920us;193us;1923us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17356us;0us;17357us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17358us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17359us;0us;17360us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17361us;2us;17366us;79us;1757us;89us;1737us;30us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1848us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;2us;17417us;76us;1870us;89us;1739us;30us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1848us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;17365us;76us;1926us;0us;17366us;1us;17368us;189us;1744us;4us;17368us;34us;1876us;76us;1873us;160us;1878us;189us;1744us;3us;32768us;62us;862us;92us;858us;178us;857us;0us;17367us;9us;32768us;10us;1077us;36us;1748us;46us;1924us;70us;1762us;91us;1918us;96us;1855us;189us;1920us;193us;1923us;203us;1061us;0us;17369us;1us;32768us;70us;1762us;0us;17370us;0us;17371us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1867us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;4us;32768us;46us;1924us;91us;1918us;189us;1920us;193us;1923us;0us;17372us;0us;17373us;0us;17374us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17375us;1us;17421us;79us;1760us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17376us;2us;32768us;59us;1763us;97us;1764us;0us;17377us;2us;32768us;59us;1765us;97us;1766us;0us;17378us;2us;32768us;59us;1767us;97us;1768us;0us;17379us;2us;32768us;59us;1769us;97us;1770us;0us;17380us;2us;32768us;59us;1771us;97us;1772us;0us;17381us;2us;32768us;59us;1773us;97us;1774us;0us;17382us;2us;32768us;59us;1775us;97us;1776us;0us;17383us;2us;32768us;59us;1777us;97us;1778us;0us;17384us;2us;32768us;59us;1779us;97us;1780us;0us;17385us;2us;32768us;59us;1781us;97us;1782us;0us;17386us;2us;32768us;59us;1783us;97us;1784us;0us;17387us;2us;32768us;59us;1785us;97us;1786us;0us;17388us;2us;32768us;59us;1787us;97us;1788us;0us;17389us;2us;32768us;59us;1789us;97us;1790us;0us;17390us;2us;32768us;59us;1791us;97us;1792us;0us;17391us;2us;32768us;59us;1793us;97us;1794us;0us;17392us;2us;32768us;59us;1795us;97us;1796us;0us;17393us;2us;32768us;59us;1797us;97us;1798us;0us;17394us;2us;32768us;59us;1799us;97us;1800us;0us;17395us;2us;32768us;59us;1801us;97us;1802us;0us;17396us;2us;32768us;59us;1803us;97us;1804us;0us;17397us;2us;32768us;59us;1805us;97us;1806us;0us;17398us;2us;32768us;59us;1807us;97us;1808us;0us;17399us;2us;32768us;59us;1809us;97us;1810us;0us;17400us;2us;32768us;59us;1811us;97us;1812us;0us;17401us;2us;32768us;59us;1813us;97us;1814us;0us;17402us;2us;32768us;59us;1815us;97us;1816us;0us;17403us;2us;32768us;59us;1817us;97us;1818us;0us;17404us;2us;32768us;59us;1819us;97us;1820us;0us;17405us;2us;32768us;59us;1821us;97us;1822us;0us;17406us;2us;32768us;59us;1823us;97us;1824us;0us;17407us;1us;32768us;59us;1825us;0us;17408us;1us;32768us;97us;1827us;33us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17412us;1us;17409us;97us;1831us;4us;32768us;10us;1077us;97us;1831us;161us;1882us;203us;1061us;33us;17453us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17410us;0us;17411us;1us;17413us;189us;1835us;3us;32768us;62us;862us;92us;858us;178us;857us;0us;17414us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1867us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;4us;32768us;46us;1924us;91us;1918us;189us;1920us;193us;1923us;0us;17415us;1us;17416us;76us;1870us;1us;17417us;76us;1870us;0us;17418us;30us;32768us;46us;1924us;56us;1853us;66us;1847us;88us;1844us;91us;1918us;92us;1848us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;1us;17419us;76us;1870us;0us;17420us;0us;17421us;34us;32768us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1867us;5us;32768us;10us;1077us;93us;2051us;94us;2048us;95us;2050us;203us;1061us;6us;17448us;10us;1077us;69us;1891us;93us;2051us;94us;2048us;95us;2050us;203us;1061us;0us;17422us;0us;17423us;1us;32768us;92us;1854us;33us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;35us;32768us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1729us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1734us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;5us;32768us;10us;1077us;93us;2051us;94us;2048us;95us;2050us;203us;1061us;0us;17424us;0us;17425us;0us;17426us;0us;17427us;0us;17428us;0us;17429us;0us;17430us;40us;32768us;46us;1429us;56us;1437us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;91us;1414us;92us;1491us;100us;1934us;106us;1465us;122us;1464us;136us;1469us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;187us;1412us;193us;1923us;194us;2017us;195us;1519us;199us;2025us;200us;2028us;201us;2016us;202us;849us;0us;17432us;0us;17433us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17434us;0us;17435us;2us;32768us;46us;1924us;193us;1923us;3us;17436us;34us;1876us;76us;1926us;160us;1878us;0us;17437us;7us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;60us;2063us;94us;2064us;203us;1061us;0us;17438us;0us;17439us;1us;32768us;160us;1878us;0us;17440us;36us;17453us;10us;1077us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;161us;1888us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;1us;32768us;97us;1880us;40us;17453us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;46us;1924us;56us;581us;60us;2063us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;94us;2064us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;203us;1061us;0us;17412us;0us;17441us;0us;17442us;0us;17443us;8us;17451us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;60us;2063us;94us;2064us;161us;1886us;203us;1061us;0us;17444us;0us;17445us;0us;17446us;0us;17447us;1us;17448us;69us;1891us;33us;17450us;46us;1924us;56us;581us;66us;1759us;72us;584us;88us;1844us;91us;1918us;92us;1751us;96us;1717us;106us;1866us;113us;1864us;122us;1865us;148us;1863us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;186us;1719us;189us;1920us;193us;1923us;194us;2017us;201us;2016us;202us;849us;0us;17449us;0us;17451us;0us;17452us;8us;32768us;46us;1924us;66us;1898us;91us;1918us;92us;1902us;178us;1908us;186us;1917us;189us;1920us;193us;1923us;3us;32768us;96us;1915us;161us;1897us;186us;1916us;0us;17454us;1us;32768us;161us;1899us;0us;17455us;1us;17456us;76us;1926us;0us;17457us;7us;32768us;46us;1924us;91us;1918us;92us;1902us;178us;1908us;186us;1917us;189us;1920us;193us;1923us;5us;32768us;93us;2051us;94us;2048us;95us;2050us;96us;1915us;186us;1916us;0us;17458us;1us;17459us;189us;1906us;3us;32768us;62us;862us;92us;858us;178us;857us;0us;17460us;0us;17461us;6us;17462us;46us;1924us;91us;1918us;92us;1902us;178us;1908us;189us;1920us;193us;1923us;0us;17463us;0us;17464us;0us;17465us;0us;17466us;0us;17467us;7us;32768us;46us;1924us;91us;1918us;92us;1902us;178us;1908us;186us;1917us;189us;1920us;193us;1923us;7us;32768us;46us;1924us;91us;1918us;92us;1902us;178us;1908us;186us;1917us;189us;1920us;193us;1923us;7us;32768us;46us;1924us;91us;1918us;92us;1902us;178us;1908us;186us;1917us;189us;1920us;193us;1923us;1us;32768us;193us;1923us;0us;17468us;1us;32768us;193us;1923us;0us;17469us;81us;17469us;10us;17516us;15us;17516us;21us;17516us;28us;17516us;34us;17516us;35us;17516us;36us;17516us;37us;17516us;39us;17516us;46us;17516us;56us;17516us;60us;17516us;62us;17516us;63us;17516us;66us;17516us;68us;17516us;69us;17516us;70us;17516us;71us;17516us;72us;17516us;74us;17516us;76us;17516us;78us;17516us;79us;17516us;80us;17516us;81us;17516us;82us;17516us;83us;17516us;89us;17516us;90us;17516us;91us;17516us;92us;17516us;96us;17516us;97us;17516us;100us;17516us;104us;17516us;106us;17516us;122us;17516us;128us;17516us;136us;17516us;143us;17516us;145us;17516us;148us;17516us;149us;17516us;154us;17516us;155us;17516us;158us;17516us;160us;17516us;161us;17516us;166us;17516us;167us;17516us;168us;17516us;169us;17516us;170us;17516us;171us;17516us;172us;17516us;173us;17516us;174us;17516us;175us;17516us;176us;17516us;177us;17516us;178us;17516us;180us;17516us;181us;17516us;183us;17516us;184us;17516us;185us;17516us;186us;17516us;187us;17516us;188us;17516us;189us;17516us;190us;17516us;191us;17516us;193us;17516us;194us;17516us;195us;17516us;199us;17516us;200us;17516us;201us;17516us;202us;17516us;203us;17516us;0us;17470us;0us;17471us;0us;17472us;8us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;60us;2063us;94us;2064us;193us;1923us;203us;1061us;0us;17473us;0us;17474us;27us;32768us;58us;1969us;62us;1951us;63us;1949us;69us;1953us;74us;1957us;82us;1961us;89us;1958us;90us;1959us;96us;1952us;102us;1954us;143us;1964us;145us;1960us;155us;1966us;158us;1963us;160us;1955us;161us;1956us;182us;1962us;183us;1950us;184us;1947us;185us;1946us;186us;1948us;187us;1941us;188us;1945us;189us;1944us;190us;1943us;191us;1942us;203us;1932us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17475us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17476us;0us;17477us;1us;32768us;58us;1936us;5us;32768us;66us;1938us;93us;2051us;94us;2048us;95us;2050us;193us;1968us;0us;17478us;1us;32768us;58us;1939us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17479us;0us;17480us;0us;17481us;0us;17482us;0us;17483us;0us;17484us;0us;17485us;0us;17486us;0us;17487us;0us;17488us;0us;17489us;0us;17490us;0us;17491us;0us;17492us;0us;17493us;0us;17494us;0us;17495us;0us;17496us;0us;17497us;0us;17498us;0us;17499us;0us;17500us;0us;17501us;0us;17502us;1us;17503us;143us;1965us;0us;17504us;1us;32768us;156us;1967us;0us;17505us;0us;17506us;1us;32768us;193us;1968us;0us;17507us;0us;17508us;0us;17509us;0us;17510us;1us;17511us;76us;1976us;0us;17512us;10us;32768us;10us;1077us;15us;2065us;37us;2061us;39us;2062us;60us;2063us;92us;1929us;94us;2064us;100us;1934us;193us;1923us;203us;1061us;0us;17513us;0us;17514us;0us;17515us;0us;17516us;0us;17517us;0us;17518us;0us;17519us;0us;17520us;3us;17521us;21us;1984us;67us;1983us;83us;1982us;0us;17522us;3us;17524us;21us;1984us;67us;1983us;83us;1982us;0us;17523us;1us;17525us;83us;1991us;1us;17526us;21us;1992us;0us;17527us;0us;17528us;0us;17529us;0us;17530us;0us;17531us;0us;17532us;0us;17533us;0us;17534us;0us;17536us;0us;17538us;0us;17542us;0us;17544us;0us;17546us;0us;17550us;0us;17552us;0us;17554us;0us;17555us;0us;17556us;0us;17557us;0us;17558us;0us;17559us;0us;17560us;0us;17561us;0us;17562us;0us;17563us;0us;17564us;0us;17565us;1us;32768us;193us;1923us;0us;17567us;0us;17568us;81us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;197us;2020us;198us;2021us;199us;2025us;200us;2028us;201us;2016us;202us;849us;2us;32768us;197us;2020us;198us;2021us;0us;17569us;0us;17570us;81us;32768us;13us;1189us;24us;1639us;25us;1653us;29us;1186us;30us;759us;32us;1173us;33us;755us;41us;769us;46us;1429us;56us;1437us;62us;1356us;66us;1398us;70us;1431us;71us;1483us;72us;1627us;74us;1424us;85us;1131us;86us;1133us;89us;1368us;90us;1371us;91us;1414us;92us;1491us;96us;1290us;98us;1191us;100us;1934us;106us;1465us;107us;1110us;114us;1123us;115us;1127us;116us;1102us;117us;1106us;119us;1374us;122us;1464us;123us;1135us;124us;1634us;125us;1651us;126us;1118us;130us;1181us;133us;1125us;134us;1129us;136us;1469us;143us;1287us;146us;1386us;147us;1388us;148us;1463us;149us;1418us;154us;1421us;155us;1476us;158us;1365us;159us;1166us;162us;749us;163us;1160us;164us;1162us;166us;846us;167us;845us;168us;844us;169us;843us;170us;842us;171us;841us;172us;839us;173us;837us;174us;835us;175us;833us;176us;840us;177us;838us;178us;836us;180us;834us;181us;832us;183us;1362us;184us;1359us;187us;1412us;189us;1351us;193us;1923us;194us;2017us;195us;1519us;197us;2020us;198us;2021us;199us;2025us;200us;2028us;201us;2016us;202us;849us;2us;32768us;197us;2020us;198us;2021us;0us;17571us;0us;17572us;0us;17573us;0us;17574us;0us;17575us;0us;17577us;3us;32768us;37us;2033us;38us;2036us;108us;2037us;3us;17600us;37us;2033us;38us;2036us;108us;2037us;0us;17579us;0us;17580us;0us;17581us;3us;32768us;39us;2038us;40us;2041us;150us;2042us;3us;17601us;39us;2038us;40us;2041us;150us;2042us;0us;17582us;0us;17583us;0us;17584us;3us;32768us;60us;2043us;61us;2045us;196us;2046us;0us;17585us;0us;17586us;0us;17587us;0us;17588us;3us;32768us;93us;2051us;94us;2048us;95us;2050us;0us;17589us;0us;17590us;0us;17591us;3us;32768us;15us;2052us;16us;2054us;17us;2055us;0us;17592us;0us;17593us;0us;17594us;0us;17595us;0us;17596us;0us;17597us;0us;17598us;0us;17599us;0us;17600us;0us;17601us;0us;17602us;0us;17603us;0us;17604us;0us;17605us;|] -let _fsyacc_actionTableRowOffsets = [|0us;17us;18us;114us;115us;123us;124us;204us;205us;239us;240us;241us;242us;243us;244us;245us;246us;251us;252us;257us;258us;263us;264us;270us;271us;277us;278us;284us;285us;302us;303us;307us;395us;422us;423us;426us;427us;428us;429us;431us;432us;435us;436us;437us;438us;441us;442us;444us;445us;450us;451us;453us;457us;459us;465us;467us;468us;469us;471us;476us;478us;479us;481us;482us;484us;485us;487us;504us;505us;509us;518us;537us;538us;539us;540us;556us;562us;564us;565us;566us;573us;574us;575us;579us;597us;601us;617us;618us;622us;627us;628us;629us;630us;634us;643us;647us;653us;654us;655us;656us;658us;660us;661us;662us;663us;665us;667us;669us;673us;677us;680us;682us;717us;719us;720us;801us;828us;908us;938us;940us;941us;950us;954us;955us;971us;973us;977us;978us;994us;996us;997us;999us;1001us;1002us;1005us;1013us;1014us;1015us;1070us;1072us;1087us;1089us;1093us;1095us;1096us;1098us;1099us;1100us;1101us;1103us;1138us;1139us;1140us;1157us;1161us;1162us;1163us;1165us;1166us;1181us;1187us;1188us;1189us;1205us;1209us;1210us;1211us;1226us;1232us;1233us;1234us;1235us;1236us;1239us;1254us;1255us;1259us;1263us;1274us;1321us;1323us;1327us;1331us;1334us;1336us;1371us;1374us;1376us;1377us;1409us;1416us;1450us;1457us;1458us;1460us;1461us;1468us;1470us;1471us;1473us;1474us;1476us;1511us;1512us;1517us;1518us;1523us;1526us;1527us;1528us;1530us;1536us;1537us;1538us;1542us;1544us;1545us;1546us;1547us;1549us;1550us;1566us;1570us;1571us;1574us;1575us;1577us;1578us;1583us;1584us;1586us;1587us;1589us;1590us;1592us;1688us;1689us;1694us;1782us;1879us;1880us;1881us;1976us;1982us;1984us;1985us;1986us;1993us;1994us;1995us;1996us;2001us;2089us;2119us;2214us;2215us;2216us;2217us;2239us;2240us;2335us;2336us;2340us;2344us;2351us;2356us;2361us;2362us;2363us;2364us;2368us;2380us;2381us;2383us;2384us;2465us;2466us;2468us;2470us;2471us;2472us;2475us;2481us;2482us;2483us;2486us;2487us;2488us;2496us;2498us;2499us;2533us;2540us;2541us;2546us;2547us;2549us;2556us;2562us;2563us;2564us;2570us;2571us;2572us;2573us;2574us;2576us;2671us;2675us;2676us;2677us;2678us;2685us;2689us;2690us;2691us;2693us;2694us;2709us;2712us;2721us;2723us;2724us;2726us;2728us;2729us;2730us;2731us;2732us;2742us;2743us;2747us;2778us;2779us;2783us;2787us;2818us;2819us;2822us;2827us;2830us;2861us;2862us;2864us;2865us;2867us;2868us;2870us;2871us;2873us;2874us;2886us;2887us;2888us;2889us;2890us;2894us;2896us;2897us;2899us;2901us;2902us;2942us;2943us;2947us;2950us;2952us;2954us;2958us;2965us;2966us;2967us;2977us;2979us;2987us;2989us;2995us;2997us;2998us;2999us;3000us;3002us;3003us;3004us;3005us;3007us;3042us;3043us;3044us;3055us;3064us;3065us;3066us;3076us;3077us;3079us;3085us;3086us;3087us;3094us;3100us;3101us;3102us;3103us;3104us;3119us;3120us;3123us;3138us;3139us;3141us;3142us;3144us;3147us;3148us;3149us;3151us;3153us;3154us;3156us;3194us;3196us;3198us;3279us;3280us;3318us;3320us;3327us;3408us;3409us;3410us;3411us;3412us;3414us;3415us;3417us;3418us;3422us;3426us;3442us;3494us;3495us;3496us;3501us;3503us;3504us;3505us;3539us;3547us;3548us;3549us;3551us;3555us;3558us;3560us;3595us;3598us;3600us;3601us;3602us;3604us;3605us;3607us;3608us;3610us;3611us;3649us;3651us;3661us;3742us;3744us;3745us;3746us;3747us;3749us;3750us;3752us;3753us;3755us;3759us;3763us;3767us;3803us;3804us;3805us;3806us;3807us;3809us;3813us;3817us;3819us;3829us;3910us;3913us;3914us;3915us;3916us;3917us;3953us;3954us;3955us;3957us;3961us;3962us;3964us;3968us;3969us;3970us;3975us;3977us;3981us;3982us;3983us;3984us;3985us;3986us;3987us;4019us;4023us;4024us;4031us;4035us;4036us;4074us;4108us;4109us;4140us;4142us;4143us;4144us;4145us;4149us;4150us;4151us;4152us;4155us;4156us;4157us;4159us;4165us;4166us;4167us;4168us;4171us;4186us;4187us;4192us;4198us;4202us;4204us;4205us;4207us;4208us;4209us;4211us;4213us;4214us;4216us;4217us;4218us;4219us;4223us;4260us;4263us;4265us;4268us;4269us;4270us;4271us;4272us;4307us;4338us;4340us;4344us;4345us;4351us;4357us;4358us;4359us;4363us;4364us;4365us;4368us;4369us;4370us;4373us;4377us;4378us;4379us;4381us;4382us;4383us;4384us;4385us;4386us;4387us;4395us;4399us;4402us;4404us;4405us;4406us;4407us;4409us;4414us;4415us;4418us;4420us;4422us;4425us;4426us;4427us;4430us;4432us;4463us;4465us;4467us;4469us;4471us;4472us;4473us;4475us;4479us;4481us;4483us;4484us;4485us;4518us;4520us;4522us;4524us;4557us;4558us;4559us;4561us;4563us;4594us;4596us;4598us;4601us;4603us;4637us;4638us;4642us;4676us;4681us;4687us;4688us;4692us;4693us;4694us;4696us;4700us;4701us;4736us;4741us;4743us;4745us;4747us;4751us;4752us;4755us;4756us;4757us;4764us;4796us;4803us;4817us;4819us;4820us;4822us;4824us;4825us;4828us;4829us;4831us;4833us;4834us;4838us;4845us;4881us;4882us;4917us;4918us;4919us;4954us;4955us;4956us;4957us;4992us;4993us;5034us;5040us;5041us;5071us;5075us;5076us;5078us;5082us;5083us;5088us;5089us;5130us;5137us;5184us;5185us;5220us;5221us;5222us;5255us;5256us;5258us;5290us;5291us;5293us;5325us;5333us;5341us;5342us;5343us;5344us;5345us;5348us;5354us;5355us;5356us;5358us;5359us;5363us;5367us;5371us;5407us;5408us;5409us;5410us;5411us;5413us;5414us;5416us;5420us;5424us;5426us;5427us;5428us;5430us;5465us;5466us;5467us;5470us;5472us;5474us;5477us;5478us;5479us;5560us;5561us;5563us;5566us;5570us;5571us;5653us;5657us;5658us;5659us;5660us;5661us;5662us;5663us;5664us;5665us;5667us;5671us;5673us;5676us;5678us;5683us;5687us;5688us;5690us;5692us;5694us;5695us;5697us;5698us;5702us;5709us;5710us;5712us;5718us;5720us;5722us;5723us;5724us;5725us;5727us;5729us;5730us;5734us;5736us;5737us;5740us;5742us;5743us;5745us;5746us;5747us;5749us;5787us;5789us;5793us;5875us;5876us;5877us;5878us;5958us;5964us;5965us;5966us;5967us;5968us;5970us;5971us;5974us;5977us;6058us;6059us;6062us;6063us;6064us;6067us;6101us;6102us;6103us;6104us;6105us;6106us;6107us;6108us;6109us;6110us;6111us;6112us;6113us;6114us;6115us;6116us;6117us;6118us;6119us;6120us;6121us;6123us;6125us;6126us;6128us;6130us;6132us;6133us;6134us;6137us;6141us;6142us;6143us;6146us;6147us;6149us;6151us;6152us;6158us;6159us;6161us;6162us;6164us;6167us;6203us;6204us;6205us;6209us;6213us;6214us;6215us;6224us;6230us;6231us;6232us;6233us;6237us;6238us;6239us;6243us;6245us;6248us;6251us;6254us;6256us;6258us;6265us;6272us;6279us;6286us;6323us;6324us;6362us;6400us;6402us;6403us;6404us;6449us;6494us;6495us;6496us;6541us;6542us;6580us;6618us;6621us;6622us;6626us;6627us;6629us;6630us;6634us;6639us;6680us;6687us;6688us;6689us;6729us;6767us;6768us;6804us;6805us;6841us;6842us;6843us;6879us;6880us;6916us;6917us;6949us;6950us;6951us;7016us;7020us;7021us;7022us;7060us;7061us;7097us;7098us;7134us;7135us;7136us;7140us;7144us;7145us;7149us;7150us;7189us;7191us;7192us;7231us;7233us;7234us;7236us;7238us;7239us;7240us;7241us;7242us;7243us;7244us;7309us;7315us;7316us;7317us;7321us;7324us;7325us;7327us;7368us;7375us;7376us;7377us;7381us;7382us;7383us;7390us;7395us;7399us;7402us;7406us;7410us;7414us;7417us;7424us;7427us;7434us;7443us;7459us;7467us;7504us;7505us;7544us;7546us;7548us;7584us;7585us;7586us;7625us;7664us;7665us;7711us;7757us;7758us;7759us;7805us;7806us;7845us;7884us;7887us;7888us;7891us;7892us;7897us;7938us;7939us;7940us;7941us;7980us;7981us;8064us;8070us;8071us;8072us;8073us;8074us;8157us;8161us;8162us;8163us;8190us;8192us;8193us;8194us;8288us;8290us;8326us;8327us;8328us;8330us;8331us;8362us;8442us;8443us;8523us;8524us;8526us;8606us;8610us;8611us;8694us;8695us;8698us;8701us;8704us;8707us;8710us;8711us;8713us;8715us;8717us;8719us;8721us;8725us;8729us;8733us;8735us;8736us;8774us;8855us;8857us;8860us;8861us;8899us;8980us;8984us;8986us;8989us;8990us;8992us;9073us;9074us;9075us;9158us;9159us;9160us;9242us;9243us;9244us;9245us;9246us;9247us;9327us;9332us;9333us;9334us;9414us;9419us;9420us;9421us;9504us;9510us;9511us;9512us;9515us;9516us;9597us;9598us;9680us;9711us;9712us;9713us;9714us;9794us;9795us;9864us;9865us;9946us;9947us;10017us;10018us;10100us;10101us;10183us;10184us;10230us;10241us;10329us;10339us;10340us;10341us;10342us;10343us;10344us;10346us;10347us;10352us;10435us;10440us;10441us;10442us;10443us;10444us;10445us;10526us;10529us;10530us;10531us;10532us;10533us;10615us;10642us;10724us;10751us;10752us;10753us;10791us;10872us;10874us;10876us;10879us;10960us;10961us;10999us;11080us;11084us;11086us;11090us;11171us;11172us;11173us;11253us;11255us;11257us;11338us;11339us;11420us;11424us;11425us;11505us;11532us;11614us;11615us;11642us;11663us;11684us;11694us;11715us;11734us;11753us;11763us;11773us;11783us;11793us;11803us;11813us;11823us;11825us;11834us;11839us;11844us;11846us;11848us;11850us;11874us;11899us;11930us;11957us;11984us;12011us;12042us;12067us;12092us;12117us;12144us;12169us;12199us;12226us;12255us;12282us;12310us;12346us;12347us;12348us;12384us;12385us;12386us;12422us;12423us;12424us;12504us;12506us;12587us;12588us;12590us;12597us;12684us;12685us;12772us;12773us;12860us;12861us;12948us;12949us;13036us;13037us;13124us;13125us;13212us;13213us;13300us;13301us;13388us;13389us;13476us;13477us;13564us;13565us;13652us;13653us;13740us;13741us;13828us;13829us;13916us;13917us;14004us;14005us;14092us;14093us;14180us;14181us;14268us;14269us;14356us;14357us;14434us;14514us;14594us;14674us;14675us;14676us;14758us;14763us;14764us;14765us;14768us;14769us;14770us;14771us;14772us;14773us;14853us;14857us;14858us;14899us;14900us;14942us;14946us;14947us;14948us;14949us;14950us;14990us;14991us;14992us;14993us;14994us;14998us;15002us;15043us;15044us;15083us;15084us;15085us;15086us;15087us;15167us;15249us;15250us;15254us;15255us;15337us;15338us;15421us;15422us;15423us;15503us;15584us;15585us;15665us;15666us;15667us;15755us;15756us;15843us;15844us;15932us;15933us;16020us;16021us;16072us;16123us;16174us;16225us;16226us;16277us;16328us;16329us;16380us;16431us;16432us;16483us;16534us;16535us;16586us;16637us;16638us;16689us;16740us;16741us;16792us;16843us;16844us;16876us;16908us;16911us;16949us;16981us;17013us;17015us;17022us;17030us;17031us;17032us;17033us;17084us;17085us;17136us;17137us;17179us;17224us;17269us;17270us;17276us;17317us;17323us;17329us;17333us;17338us;17381us;17387us;17388us;17389us;17392us;17394us;17400us;17406us;17447us;17488us;17490us;17491us;17532us;17573us;17575us;17577us;17578us;17579us;17580us;17588us;17589us;17591us;17599us;17600us;17604us;17608us;17609us;17612us;17613us;17614us;17615us;17697us;17701us;17702us;17703us;17704us;17705us;17708us;17788us;17789us;17790us;17791us;17792us;17793us;17794us;17890us;17894us;17896us;17898us;17899us;17903us;17904us;17986us;17990us;17991us;17992us;17993us;17994us;17995us;17996us;17997us;17998us;17999us;18000us;18001us;18002us;18003us;18004us;18005us;18087us;18091us;18092us;18093us;18095us;18096us;18097us;18179us;18262us;18266us;18267us;18268us;18269us;18270us;18352us;18356us;18357us;18358us;18359us;18360us;18451us;18556us;18661us;18662us;18672us;18673us;18674us;18675us;18676us;18677us;18678us;18679us;18680us;18681us;18761us;18762us;18764us;18766us;18768us;18772us;18852us;18853us;18854us;18855us;18856us;18861us;18866us;18867us;18899us;18906us;18992us;18998us;18999us;19000us;19001us;19002us;19003us;19004us;19005us;19006us;19007us;19008us;19009us;19091us;19092us;19179us;19180us;19181us;19261us;19341us;19342us;19343us;19345us;19349us;19350us;19393us;19395us;19396us;19397us;19398us;19400us;19434us;19438us;19439us;19473us;19474us;19512us;19513us;19544us;19547us;19578us;19579us;19582us;19583us;19584us;19667us;19668us;19671us;19672us;19673us;19754us;19755us;19758us;19759us;19763us;19764us;19767us;19768us;19774us;19776us;19777us;19778us;19781us;19783us;19784us;19785us;19789us;19791us;19793us;19794us;19795us;19797us;19798us;19799us;19808us;19896us;19897us;19898us;19899us;19903us;19905us;19909us;19910us;19913us;19914us;19915us;19916us;19920us;19921us;19924us;19926us;19927us;19931us;19932us;19936us;19937us;19941us;19942us;19946us;19947us;19979us;19988us;19992us;19994us;19995us;19997us;19998us;19999us;20043us;20047us;20048us;20049us;20050us;20051us;20052us;20088us;20090us;20172us;20173us;20174us;20211us;20214us;20297us;20301us;20302us;20303us;20305us;20306us;20308us;20309us;20311us;20312us;20353us;20354us;20395us;20397us;20398us;20400us;20433us;20435us;20468us;20505us;20506us;20507us;20509us;20546us;20547us;20548us;20550us;20587us;20588us;20589us;20624us;20625us;20627us;20664us;20665us;20666us;20701us;20702us;20735us;20743us;20777us;20784us;20785us;20787us;20789us;20823us;20830us;20831us;20839us;20873us;20880us;20881us;20883us;20885us;20919us;20926us;20927us;20935us;20943us;20978us;20979us;20980us;21012us;21013us;21015us;21052us;21053us;21054us;21088us;21089us;21091us;21092us;21101us;21137us;21138us;21139us;21173us;21174us;21210us;21211us;21212us;21248us;21249us;21250us;21259us;21295us;21296us;21297us;21331us;21332us;21368us;21369us;21370us;21404us;21405us;21408us;21439us;21442us;21473us;21475us;21476us;21478us;21483us;21487us;21488us;21498us;21499us;21501us;21502us;21503us;21538us;21542us;21547us;21548us;21549us;21550us;21584us;21585us;21587us;21621us;21622us;21625us;21626us;21629us;21630us;21633us;21634us;21637us;21638us;21641us;21642us;21645us;21646us;21649us;21650us;21653us;21654us;21657us;21658us;21661us;21662us;21665us;21666us;21669us;21670us;21673us;21674us;21677us;21678us;21681us;21682us;21685us;21686us;21689us;21690us;21693us;21694us;21697us;21698us;21701us;21702us;21705us;21706us;21709us;21710us;21713us;21714us;21717us;21718us;21721us;21722us;21725us;21726us;21729us;21730us;21733us;21734us;21737us;21738us;21741us;21742us;21745us;21746us;21748us;21749us;21751us;21785us;21786us;21788us;21793us;21827us;21828us;21829us;21831us;21835us;21836us;21871us;21875us;21880us;21881us;21883us;21885us;21886us;21917us;21919us;21920us;21921us;21956us;21962us;21969us;21970us;21971us;21973us;22007us;22043us;22049us;22050us;22051us;22052us;22053us;22054us;22055us;22056us;22097us;22098us;22099us;22103us;22104us;22105us;22108us;22112us;22113us;22121us;22122us;22123us;22125us;22126us;22163us;22165us;22206us;22207us;22208us;22209us;22210us;22219us;22220us;22221us;22222us;22223us;22225us;22259us;22260us;22261us;22262us;22271us;22275us;22276us;22278us;22279us;22281us;22282us;22290us;22296us;22297us;22299us;22303us;22304us;22305us;22312us;22313us;22314us;22315us;22316us;22317us;22325us;22333us;22341us;22343us;22344us;22346us;22347us;22429us;22430us;22431us;22432us;22441us;22442us;22443us;22471us;22475us;22476us;22480us;22481us;22482us;22484us;22490us;22491us;22493us;22497us;22498us;22499us;22500us;22501us;22502us;22503us;22504us;22505us;22506us;22507us;22508us;22509us;22510us;22511us;22512us;22513us;22514us;22515us;22516us;22517us;22518us;22519us;22520us;22521us;22523us;22524us;22526us;22527us;22528us;22530us;22531us;22532us;22533us;22534us;22536us;22537us;22548us;22549us;22550us;22551us;22552us;22553us;22554us;22555us;22556us;22560us;22561us;22565us;22566us;22568us;22570us;22571us;22572us;22573us;22574us;22575us;22576us;22577us;22578us;22579us;22580us;22581us;22582us;22583us;22584us;22585us;22586us;22587us;22588us;22589us;22590us;22591us;22592us;22593us;22594us;22595us;22596us;22597us;22599us;22600us;22601us;22683us;22686us;22687us;22688us;22770us;22773us;22774us;22775us;22776us;22777us;22778us;22779us;22783us;22787us;22788us;22789us;22790us;22794us;22798us;22799us;22800us;22801us;22805us;22806us;22807us;22808us;22809us;22813us;22814us;22815us;22816us;22820us;22821us;22822us;22823us;22824us;22825us;22826us;22827us;22828us;22829us;22830us;22831us;22832us;22833us;|] -let _fsyacc_reductionSymbolCounts = [|1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;2us;2us;2us;3us;3us;3us;1us;2us;3us;1us;1us;2us;1us;1us;3us;0us;2us;1us;1us;2us;3us;2us;5us;5us;5us;3us;3us;1us;2us;2us;1us;3us;4us;1us;1us;4us;3us;3us;1us;1us;0us;3us;3us;2us;1us;1us;5us;5us;4us;5us;3us;1us;12us;0us;2us;5us;3us;5us;3us;3us;0us;3us;2us;7us;2us;1us;1us;3us;1us;3us;3us;3us;3us;3us;3us;3us;3us;3us;1us;1us;0us;3us;11us;4us;4us;4us;4us;5us;5us;5us;0us;2us;3us;3us;1us;3us;3us;3us;1us;1us;2us;3us;0us;2us;3us;2us;1us;2us;2us;1us;3us;4us;1us;4us;3us;3us;1us;1us;0us;5us;4us;3us;1us;2us;2us;3us;1us;2us;3us;1us;1us;3us;3us;3us;5us;3us;5us;4us;2us;1us;2us;2us;3us;3us;3us;1us;3us;3us;3us;3us;3us;1us;1us;3us;3us;3us;3us;1us;0us;1us;2us;5us;4us;4us;2us;1us;3us;3us;4us;6us;2us;2us;2us;2us;2us;1us;1us;1us;1us;3us;3us;0us;1us;2us;8us;7us;7us;6us;2us;2us;1us;1us;3us;1us;3us;3us;3us;3us;3us;3us;3us;1us;1us;2us;0us;3us;2us;3us;3us;1us;3us;6us;5us;4us;4us;4us;1us;2us;2us;3us;3us;4us;5us;4us;5us;4us;10us;3us;4us;5us;5us;8us;6us;6us;5us;5us;6us;6us;5us;4us;8us;6us;6us;4us;0us;2us;2us;3us;3us;1us;4us;2us;0us;1us;1us;1us;1us;3us;1us;0us;3us;0us;3us;5us;2us;1us;0us;2us;2us;1us;0us;2us;2us;3us;3us;1us;3us;2us;4us;4us;3us;4us;2us;1us;1us;6us;3us;3us;3us;7us;3us;3us;3us;2us;2us;1us;3us;3us;3us;1us;1us;1us;1us;1us;2us;3us;3us;2us;1us;3us;3us;1us;2us;4us;5us;3us;1us;0us;5us;1us;0us;0us;2us;3us;1us;3us;1us;4us;3us;3us;4us;3us;5us;7us;4us;4us;3us;1us;3us;1us;2us;3us;1us;1us;3us;1us;3us;3us;5us;4us;4us;4us;5us;5us;5us;1us;3us;4us;2us;4us;2us;3us;3us;2us;4us;3us;1us;3us;1us;3us;1us;1us;1us;3us;2us;2us;5us;5us;4us;3us;2us;5us;4us;1us;3us;3us;0us;2us;3us;1us;2us;4us;3us;2us;1us;1us;1us;1us;1us;1us;8us;1us;1us;0us;3us;3us;2us;3us;1us;4us;2us;2us;2us;2us;2us;2us;3us;0us;2us;1us;6us;6us;5us;3us;3us;1us;2us;2us;0us;4us;3us;1us;3us;2us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;3us;4us;1us;2us;1us;3us;1us;2us;1us;3us;1us;1us;2us;3us;3us;2us;1us;3us;1us;0us;3us;2us;3us;3us;2us;3us;3us;3us;1us;1us;1us;3us;3us;3us;3us;2us;2us;3us;3us;2us;3us;4us;3us;3us;2us;2us;3us;4us;4us;2us;3us;3us;2us;1us;3us;1us;2us;3us;3us;1us;1us;3us;3us;3us;3us;1us;2us;1us;1us;1us;1us;1us;3us;3us;3us;2us;4us;4us;4us;3us;1us;0us;3us;3us;1us;1us;3us;3us;2us;3us;1us;3us;3us;3us;3us;2us;2us;3us;3us;2us;3us;3us;3us;2us;0us;2us;3us;3us;3us;2us;1us;3us;2us;1us;2us;1us;1us;3us;3us;1us;2us;3us;2us;1us;3us;5us;1us;1us;1us;6us;7us;0us;3us;3us;2us;2us;3us;3us;1us;1us;1us;3us;3us;3us;3us;3us;3us;2us;3us;4us;3us;3us;2us;2us;2us;1us;2us;2us;1us;2us;2us;5us;5us;5us;4us;3us;4us;5us;5us;5us;4us;3us;5us;2us;4us;3us;2us;2us;2us;2us;8us;8us;7us;5us;3us;2us;2us;3us;3us;3us;3us;3us;3us;3us;3us;1us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;2us;2us;1us;1us;4us;4us;4us;2us;1us;2us;1us;3us;2us;3us;3us;2us;1us;2us;2us;1us;2us;2us;4us;4us;4us;3us;2us;2us;0us;2us;2us;2us;2us;2us;2us;0us;2us;2us;3us;3us;3us;3us;4us;4us;3us;3us;4us;4us;2us;2us;2us;2us;2us;2us;2us;6us;4us;4us;2us;2us;2us;1us;2us;1us;2us;1us;3us;3us;2us;3us;3us;3us;2us;2us;1us;3us;3us;2us;3us;1us;1us;3us;3us;3us;2us;4us;4us;1us;1us;1us;0us;1us;5us;3us;3us;3us;3us;2us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;3us;3us;3us;2us;3us;3us;3us;2us;3us;3us;3us;2us;2us;3us;3us;3us;2us;2us;2us;2us;2us;4us;6us;1us;1us;1us;3us;3us;1us;3us;3us;3us;2us;2us;1us;1us;1us;1us;0us;1us;0us;1us;2us;3us;3us;2us;5us;1us;1us;6us;2us;0us;0us;1us;0us;4us;0us;2us;3us;6us;1us;5us;3us;1us;1us;2us;5us;5us;4us;6us;1us;0us;1us;1us;2us;2us;1us;1us;3us;0us;3us;2us;3us;1us;2us;4us;3us;2us;5us;4us;2us;1us;0us;2us;3us;3us;2us;0us;2us;2us;5us;2us;1us;3us;3us;3us;2us;2us;4us;4us;5us;5us;5us;4us;4us;3us;2us;3us;1us;3us;1us;3us;0us;2us;2us;3us;3us;1us;3us;3us;2us;1us;3us;3us;2us;1us;4us;4us;5us;5us;2us;3us;3us;4us;4us;1us;3us;3us;4us;3us;3us;3us;4us;1us;2us;3us;3us;2us;2us;2us;3us;3us;1us;3us;3us;2us;3us;3us;2us;1us;3us;3us;1us;1us;3us;1us;2us;3us;2us;4us;1us;1us;3us;3us;2us;3us;4us;5us;6us;7us;8us;9us;10us;11us;12us;13us;14us;15us;16us;17us;18us;19us;20us;21us;22us;23us;24us;25us;26us;27us;28us;29us;30us;31us;32us;33us;4us;3us;3us;0us;1us;3us;4us;1us;1us;1us;2us;1us;1us;3us;3us;6us;6us;5us;4us;3us;1us;1us;2us;1us;1us;3us;2us;3us;4us;3us;1us;2us;6us;6us;4us;3us;3us;2us;2us;1us;3us;2us;1us;1us;0us;3us;3us;1us;1us;3us;1us;3us;1us;1us;2us;1us;3us;3us;2us;2us;2us;1us;1us;1us;3us;3us;3us;3us;1us;4us;6us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;2us;2us;1us;2us;3us;1us;1us;1us;1us;3us;3us;1us;1us;1us;1us;1us;1us;1us;2us;2us;0us;1us;1us;2us;2us;1us;1us;1us;1us;1us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;3us;1us;3us;2us;3us;1us;2us;1us;1us;0us;1us;0us;2us;1us;1us;2us;1us;1us;2us;1us;1us;1us;2us;1us;1us;2us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;|] -let _fsyacc_productionToNonTerminalTable = [|0us;1us;2us;3us;4us;5us;5us;5us;6us;6us;7us;7us;7us;7us;7us;7us;7us;8us;8us;9us;10us;11us;11us;12us;12us;13us;14us;14us;15us;15us;16us;16us;16us;17us;17us;17us;18us;18us;19us;19us;20us;20us;21us;22us;22us;23us;23us;23us;23us;24us;24us;24us;25us;25us;25us;26us;26us;26us;26us;26us;26us;26us;26us;27us;28us;28us;28us;29us;29us;29us;30us;30us;31us;31us;32us;32us;33us;33us;33us;34us;34us;34us;34us;35us;35us;35us;35us;36us;36us;36us;37us;37us;38us;39us;39us;39us;39us;39us;39us;39us;39us;40us;40us;40us;40us;41us;41us;41us;41us;42us;42us;43us;44us;44us;45us;45us;45us;46us;46us;47us;47us;48us;49us;49us;50us;50us;50us;50us;51us;51us;52us;52us;52us;52us;52us;53us;53us;53us;53us;53us;54us;54us;55us;55us;55us;55us;55us;55us;55us;55us;55us;56us;56us;56us;56us;57us;57us;58us;58us;58us;58us;58us;58us;58us;59us;59us;59us;60us;61us;61us;62us;62us;63us;63us;63us;63us;64us;64us;65us;65us;65us;66us;66us;66us;66us;67us;67us;67us;67us;67us;68us;69us;69us;70us;70us;70us;70us;71us;71us;71us;71us;72us;72us;72us;73us;73us;73us;73us;74us;74us;75us;75us;75us;76us;76us;76us;77us;78us;78us;78us;79us;79us;80us;81us;81us;81us;81us;82us;82us;82us;82us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;84us;84us;84us;84us;85us;85us;85us;85us;86us;86us;86us;87us;87us;87us;87us;87us;88us;88us;89us;89us;89us;90us;90us;90us;91us;91us;92us;92us;92us;93us;93us;94us;94us;95us;95us;96us;96us;97us;97us;97us;98us;98us;99us;99us;99us;99us;100us;100us;100us;101us;101us;101us;101us;101us;102us;102us;102us;102us;103us;103us;104us;104us;104us;105us;105us;105us;106us;106us;107us;107us;107us;107us;108us;108us;109us;109us;110us;110us;111us;112us;112us;112us;113us;114us;114us;115us;115us;116us;116us;117us;117us;118us;118us;118us;118us;118us;118us;118us;118us;118us;118us;118us;119us;119us;120us;120us;120us;121us;122us;122us;123us;123us;123us;123us;123us;123us;123us;123us;123us;124us;124us;124us;125us;125us;125us;126us;126us;126us;126us;127us;127us;128us;128us;128us;128us;129us;129us;130us;130us;131us;132us;132us;132us;132us;133us;134us;134us;135us;135us;135us;136us;136us;137us;137us;138us;139us;140us;140us;141us;141us;141us;141us;142us;142us;143us;144us;144us;144us;145us;145us;146us;146us;147us;147us;147us;147us;147us;148us;148us;149us;150us;150us;151us;151us;152us;152us;152us;153us;153us;153us;154us;155us;155us;156us;157us;157us;158us;158us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;159us;160us;160us;160us;160us;161us;161us;162us;162us;163us;163us;164us;165us;165us;165us;165us;165us;166us;166us;167us;167us;168us;168us;168us;168us;168us;169us;169us;169us;169us;169us;169us;170us;170us;170us;170us;170us;170us;171us;171us;172us;172us;172us;173us;173us;173us;174us;174us;174us;174us;174us;174us;174us;174us;174us;175us;175us;176us;176us;176us;176us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;178us;178us;179us;179us;179us;179us;179us;179us;179us;179us;179us;180us;180us;180us;180us;180us;180us;181us;181us;182us;182us;183us;183us;183us;184us;184us;184us;185us;185us;185us;185us;186us;186us;186us;187us;187us;187us;188us;188us;188us;189us;190us;190us;190us;190us;190us;190us;191us;191us;192us;192us;192us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;194us;194us;194us;194us;194us;194us;195us;195us;196us;196us;196us;196us;197us;197us;197us;197us;198us;199us;199us;199us;199us;199us;199us;200us;200us;201us;202us;203us;203us;203us;203us;204us;204us;204us;204us;204us;205us;205us;205us;205us;205us;205us;205us;205us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;207us;207us;208us;208us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;210us;210us;210us;210us;210us;210us;210us;210us;210us;210us;211us;211us;211us;211us;211us;211us;211us;211us;211us;211us;211us;212us;212us;212us;212us;213us;213us;213us;213us;214us;214us;214us;214us;215us;215us;215us;215us;215us;215us;215us;215us;215us;215us;216us;216us;216us;217us;217us;218us;218us;219us;219us;219us;219us;219us;220us;220us;220us;221us;221us;222us;222us;223us;224us;225us;225us;225us;226us;227us;227us;228us;229us;229us;230us;230us;231us;231us;232us;232us;232us;233us;233us;234us;234us;234us;234us;234us;234us;234us;234us;234us;235us;235us;236us;236us;236us;236us;237us;237us;238us;238us;239us;239us;239us;239us;239us;240us;240us;240us;241us;241us;241us;242us;242us;243us;243us;243us;244us;245us;245us;245us;246us;247us;247us;248us;248us;248us;248us;248us;249us;249us;249us;249us;249us;249us;249us;249us;250us;250us;251us;251us;252us;252us;253us;253us;253us;254us;254us;254us;255us;255us;255us;255us;256us;256us;256us;256us;257us;257us;257us;257us;257us;257us;257us;257us;257us;257us;258us;258us;258us;258us;259us;259us;259us;259us;260us;261us;261us;261us;261us;261us;261us;261us;261us;262us;262us;262us;262us;262us;262us;262us;263us;263us;264us;264us;265us;265us;266us;266us;266us;266us;266us;266us;266us;266us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;267us;268us;269us;269us;269us;270us;270us;271us;271us;272us;272us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;273us;274us;274us;275us;275us;275us;275us;275us;275us;275us;276us;276us;276us;277us;277us;278us;279us;279us;280us;280us;280us;281us;281us;281us;282us;282us;283us;283us;283us;283us;284us;284us;285us;286us;286us;286us;286us;287us;287us;287us;287us;287us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;288us;289us;290us;290us;291us;291us;292us;292us;292us;292us;293us;294us;294us;295us;295us;295us;296us;296us;297us;297us;298us;298us;298us;298us;299us;299us;299us;300us;300us;300us;300us;301us;301us;302us;302us;303us;303us;304us;304us;305us;305us;306us;306us;307us;307us;308us;308us;309us;309us;310us;310us;311us;311us;312us;312us;313us;313us;314us;314us;315us;316us;317us;317us;318us;318us;318us;319us;319us;319us;320us;320us;320us;321us;321us;322us;322us;322us;323us;323us;323us;324us;324us;324us;325us;326us;326us;326us;327us;327us;327us;328us;328us;328us;328us;328us;329us;329us;329us;329us;329us;329us;|] -let _fsyacc_immediateActions = [|65535us;49152us;65535us;49152us;65535us;49152us;65535us;49152us;65535us;49152us;16389us;16390us;16391us;16392us;16393us;16394us;65535us;16395us;65535us;16396us;65535us;16397us;65535us;16398us;65535us;16399us;65535us;16400us;65535us;16402us;65535us;65535us;65535us;16404us;65535us;16406us;16407us;16408us;65535us;65535us;65535us;16411us;16412us;16413us;65535us;16414us;65535us;16415us;65535us;16416us;65535us;65535us;65535us;65535us;65535us;16418us;16419us;65535us;65535us;65535us;16421us;65535us;16423us;65535us;16424us;65535us;65535us;16426us;65535us;65535us;65535us;16427us;16428us;16429us;65535us;65535us;65535us;16430us;16431us;65535us;16432us;16433us;65535us;65535us;65535us;65535us;16436us;65535us;65535us;16437us;16439us;16440us;65535us;65535us;65535us;65535us;16441us;16442us;16443us;65535us;65535us;16444us;16445us;16446us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16447us;65535us;65535us;65535us;65535us;65535us;16450us;65535us;65535us;16451us;65535us;65535us;65535us;16452us;65535us;65535us;16453us;65535us;65535us;16454us;65535us;65535us;16456us;16457us;65535us;65535us;65535us;65535us;65535us;65535us;16458us;65535us;16459us;16460us;16461us;65535us;65535us;16462us;16463us;65535us;65535us;16464us;16465us;65535us;16466us;65535us;65535us;16467us;16468us;65535us;65535us;16469us;16470us;65535us;65535us;16471us;16472us;16473us;16474us;65535us;65535us;16476us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16477us;65535us;65535us;65535us;65535us;16480us;65535us;16481us;65535us;65535us;16482us;65535us;16483us;65535us;65535us;16484us;65535us;16486us;65535us;65535us;16487us;16488us;65535us;65535us;16490us;16491us;65535us;65535us;16492us;16493us;16494us;65535us;16495us;65535us;65535us;16496us;65535us;16498us;65535us;16499us;65535us;16500us;65535us;16502us;65535us;16503us;65535us;65535us;16505us;65535us;65535us;65535us;16506us;16507us;65535us;65535us;65535us;16508us;16509us;65535us;16510us;16511us;16512us;65535us;65535us;65535us;65535us;16514us;16517us;16518us;65535us;16519us;65535us;16520us;65535us;65535us;65535us;65535us;65535us;16523us;16524us;16525us;65535us;65535us;16526us;65535us;16527us;65535us;16528us;65535us;65535us;16529us;16530us;65535us;65535us;16531us;16532us;65535us;16533us;16534us;65535us;65535us;16536us;65535us;65535us;16538us;65535us;16539us;65535us;65535us;65535us;16541us;16542us;65535us;16543us;16544us;16545us;16546us;65535us;65535us;65535us;16548us;16549us;16550us;65535us;65535us;16551us;16552us;65535us;16555us;65535us;65535us;65535us;65535us;16556us;65535us;65535us;16557us;16558us;16559us;16560us;65535us;16561us;65535us;65535us;16562us;65535us;65535us;65535us;16563us;65535us;65535us;65535us;65535us;16564us;65535us;16565us;65535us;16566us;65535us;16567us;65535us;16568us;65535us;16569us;16571us;16572us;16573us;65535us;65535us;16574us;65535us;65535us;16575us;65535us;16578us;65535us;65535us;65535us;65535us;65535us;65535us;16579us;16580us;65535us;65535us;65535us;65535us;65535us;65535us;16581us;16582us;16583us;65535us;16584us;16585us;16586us;65535us;65535us;16587us;16588us;65535us;65535us;16589us;16590us;65535us;16591us;65535us;65535us;16592us;16593us;65535us;65535us;16594us;16595us;16596us;16597us;65535us;16598us;65535us;65535us;16600us;65535us;16601us;65535us;65535us;16602us;16603us;65535us;65535us;16605us;65535us;65535us;65535us;65535us;65535us;16606us;65535us;65535us;65535us;65535us;16607us;16608us;16609us;16610us;65535us;16612us;65535us;16614us;65535us;65535us;65535us;65535us;16615us;16616us;65535us;65535us;16617us;16618us;65535us;65535us;16619us;16620us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16621us;16622us;65535us;16623us;65535us;16624us;65535us;16625us;65535us;65535us;65535us;65535us;65535us;16626us;16627us;16628us;65535us;16629us;65535us;16630us;65535us;65535us;65535us;65535us;65535us;16631us;16632us;16633us;16634us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16635us;16636us;16637us;16638us;65535us;16640us;16641us;65535us;65535us;16642us;65535us;65535us;16643us;16644us;65535us;65535us;65535us;16645us;16646us;16648us;16649us;16650us;16651us;65535us;65535us;16652us;65535us;65535us;16655us;65535us;65535us;16657us;65535us;65535us;16658us;16659us;16660us;65535us;16662us;16663us;16664us;65535us;16666us;16667us;65535us;65535us;16668us;16669us;16670us;65535us;65535us;16671us;65535us;65535us;65535us;65535us;16673us;65535us;16674us;16675us;65535us;65535us;16676us;65535us;16677us;16678us;16679us;65535us;65535us;65535us;65535us;65535us;16680us;16681us;16682us;16683us;65535us;65535us;65535us;65535us;16684us;65535us;65535us;16685us;16686us;65535us;16687us;16688us;65535us;16689us;16690us;65535us;65535us;16691us;16692us;65535us;16693us;16694us;16695us;16696us;16697us;16698us;65535us;65535us;65535us;65535us;16701us;16702us;16703us;65535us;65535us;16704us;65535us;65535us;65535us;65535us;16705us;16706us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16709us;16710us;65535us;65535us;65535us;65535us;16713us;16714us;65535us;65535us;65535us;65535us;65535us;16718us;16719us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16722us;65535us;65535us;65535us;65535us;16724us;65535us;16725us;16726us;65535us;65535us;16727us;65535us;65535us;65535us;65535us;65535us;65535us;16728us;65535us;16729us;16730us;65535us;65535us;65535us;65535us;65535us;16735us;65535us;65535us;16736us;65535us;16738us;65535us;65535us;16739us;65535us;65535us;65535us;16742us;65535us;16743us;16744us;65535us;16745us;16746us;16747us;65535us;16748us;65535us;65535us;16750us;65535us;65535us;16751us;65535us;65535us;16752us;65535us;16753us;65535us;65535us;65535us;16755us;65535us;16756us;16757us;65535us;16758us;65535us;65535us;16760us;65535us;65535us;65535us;65535us;16764us;16765us;16766us;16767us;65535us;65535us;16768us;16769us;65535us;16770us;65535us;65535us;65535us;65535us;16771us;16772us;16773us;16774us;65535us;16775us;65535us;65535us;65535us;65535us;16776us;16777us;65535us;65535us;16779us;16780us;65535us;65535us;65535us;65535us;16783us;16784us;65535us;16785us;65535us;65535us;65535us;16786us;65535us;65535us;16787us;16788us;16789us;16790us;16791us;16792us;16793us;16794us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16795us;65535us;65535us;65535us;16799us;65535us;16800us;65535us;65535us;16802us;65535us;65535us;65535us;65535us;16804us;16805us;16806us;65535us;65535us;16807us;65535us;65535us;16810us;65535us;65535us;16811us;65535us;16813us;16814us;65535us;65535us;65535us;65535us;65535us;16815us;16816us;16817us;65535us;65535us;16818us;16819us;16820us;65535us;65535us;16822us;65535us;65535us;65535us;16824us;65535us;16825us;16826us;65535us;65535us;16827us;16828us;16829us;16830us;16831us;16832us;16833us;16834us;16835us;16836us;16837us;16838us;16839us;16840us;16841us;16842us;16843us;16844us;16845us;16846us;65535us;65535us;16847us;65535us;65535us;65535us;16848us;16851us;65535us;65535us;16852us;16853us;65535us;16854us;65535us;65535us;16856us;65535us;16858us;65535us;16859us;65535us;65535us;65535us;16860us;16861us;65535us;65535us;16864us;16865us;65535us;65535us;16867us;16868us;16869us;65535us;16870us;16871us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16872us;65535us;65535us;65535us;65535us;16877us;65535us;65535us;16880us;16881us;65535us;16883us;65535us;65535us;65535us;16886us;65535us;16887us;65535us;16888us;65535us;65535us;65535us;65535us;16890us;16891us;65535us;65535us;16893us;65535us;16894us;65535us;16895us;16896us;65535us;16897us;65535us;16898us;65535us;16899us;16900us;65535us;65535us;16901us;16902us;65535us;16903us;65535us;16904us;65535us;16905us;16907us;65535us;65535us;16908us;65535us;16909us;65535us;65535us;16910us;65535us;65535us;16911us;65535us;65535us;16913us;16914us;16915us;16916us;16917us;16918us;65535us;65535us;16919us;16920us;65535us;65535us;16922us;65535us;65535us;65535us;16923us;16924us;65535us;16925us;16926us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16929us;65535us;65535us;65535us;65535us;16933us;16934us;65535us;65535us;16937us;65535us;65535us;16940us;16941us;65535us;16943us;65535us;65535us;65535us;16946us;65535us;16947us;65535us;65535us;16949us;16950us;16952us;65535us;16953us;65535us;65535us;16954us;16955us;16956us;16957us;65535us;65535us;16958us;16959us;65535us;65535us;16961us;16963us;65535us;65535us;65535us;16964us;16965us;65535us;16967us;65535us;65535us;16968us;65535us;16971us;65535us;65535us;65535us;16972us;65535us;16974us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16975us;65535us;65535us;65535us;65535us;16976us;65535us;65535us;65535us;65535us;65535us;16977us;65535us;65535us;16979us;16980us;65535us;16981us;16982us;65535us;16983us;16984us;16985us;16986us;16987us;65535us;65535us;16988us;16989us;65535us;65535us;16990us;16991us;65535us;65535us;16992us;16993us;65535us;16995us;65535us;16996us;65535us;65535us;16997us;16998us;16999us;65535us;65535us;65535us;65535us;65535us;17003us;65535us;17004us;65535us;17006us;65535us;17007us;65535us;65535us;65535us;65535us;17008us;17009us;17010us;17011us;17012us;65535us;17013us;65535us;65535us;65535us;17014us;17015us;17016us;17017us;17018us;65535us;65535us;17019us;17020us;17021us;65535us;65535us;65535us;65535us;65535us;17025us;17026us;65535us;65535us;65535us;65535us;65535us;65535us;17027us;65535us;65535us;65535us;65535us;65535us;65535us;17028us;17029us;65535us;65535us;65535us;65535us;17030us;65535us;65535us;17031us;65535us;65535us;65535us;17033us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17034us;17035us;65535us;17036us;17037us;65535us;17038us;17039us;65535us;65535us;65535us;17041us;65535us;65535us;65535us;17044us;65535us;17046us;65535us;17048us;65535us;17050us;65535us;17052us;65535us;17054us;65535us;17056us;65535us;17058us;65535us;17060us;65535us;17062us;65535us;17064us;65535us;17066us;65535us;17068us;65535us;17070us;65535us;17072us;65535us;17074us;65535us;17076us;65535us;17078us;65535us;17080us;65535us;17082us;65535us;65535us;65535us;65535us;17086us;65535us;65535us;65535us;17088us;17089us;65535us;17090us;17091us;17092us;17093us;17094us;65535us;65535us;17095us;65535us;17096us;65535us;65535us;17097us;17098us;17099us;17100us;65535us;17101us;17102us;17103us;17104us;65535us;65535us;65535us;17106us;65535us;17107us;17108us;17109us;17110us;65535us;65535us;17113us;65535us;17114us;65535us;17116us;65535us;17117us;17118us;65535us;65535us;17121us;65535us;17122us;17123us;65535us;17125us;65535us;17127us;65535us;17128us;65535us;17130us;65535us;65535us;65535us;65535us;17132us;65535us;65535us;17133us;65535us;65535us;17134us;65535us;65535us;17135us;65535us;65535us;17136us;65535us;65535us;17137us;65535us;65535us;17138us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17139us;17141us;17142us;65535us;17143us;65535us;17144us;65535us;65535us;65535us;17146us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17151us;17152us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17155us;65535us;65535us;65535us;65535us;17157us;65535us;17158us;65535us;17159us;65535us;65535us;17160us;65535us;65535us;17161us;65535us;17162us;17163us;17164us;65535us;65535us;17165us;17166us;17167us;17168us;65535us;65535us;17169us;17170us;17171us;17172us;17173us;17175us;65535us;65535us;65535us;65535us;17176us;65535us;17177us;65535us;65535us;17178us;17179us;17180us;17181us;17182us;17183us;17184us;17185us;17186us;17187us;17188us;17189us;17190us;17191us;17192us;65535us;65535us;17193us;17194us;65535us;17195us;17196us;65535us;65535us;65535us;17197us;17198us;17199us;17200us;65535us;65535us;17201us;17202us;17203us;17204us;65535us;65535us;65535us;17205us;65535us;17206us;17207us;17208us;65535us;17209us;17210us;17211us;17212us;17213us;65535us;17214us;65535us;65535us;65535us;65535us;65535us;17215us;17216us;17217us;17218us;65535us;65535us;17219us;65535us;65535us;65535us;65535us;17222us;17223us;17224us;17225us;17226us;17227us;17228us;17229us;17230us;17232us;17234us;65535us;17235us;65535us;17237us;17238us;65535us;65535us;17240us;17241us;65535us;65535us;65535us;65535us;65535us;17242us;17243us;17246us;65535us;65535us;65535us;17248us;65535us;17250us;65535us;17251us;65535us;65535us;65535us;65535us;65535us;17252us;17253us;65535us;65535us;65535us;17254us;17255us;65535us;65535us;65535us;17259us;65535us;65535us;65535us;17260us;65535us;65535us;17261us;65535us;65535us;65535us;17262us;17263us;65535us;65535us;65535us;17267us;17268us;65535us;17270us;17271us;65535us;65535us;17273us;17275us;17277us;65535us;65535us;65535us;17278us;65535us;17279us;17281us;17284us;65535us;17286us;65535us;65535us;17287us;65535us;17288us;65535us;17289us;65535us;17291us;65535us;17292us;65535us;65535us;65535us;65535us;17293us;65535us;17294us;17295us;65535us;65535us;17296us;17297us;17298us;17299us;17300us;65535us;65535us;65535us;17301us;17302us;65535us;65535us;65535us;65535us;17303us;17304us;65535us;17305us;65535us;17307us;65535us;17308us;65535us;17309us;65535us;65535us;17310us;65535us;65535us;65535us;65535us;65535us;17316us;17317us;65535us;65535us;17318us;17319us;65535us;65535us;17321us;17322us;65535us;17323us;65535us;65535us;17325us;17326us;65535us;17327us;65535us;65535us;65535us;65535us;17330us;65535us;65535us;65535us;65535us;17332us;65535us;65535us;65535us;17335us;65535us;65535us;65535us;65535us;17337us;65535us;65535us;65535us;17339us;17340us;65535us;17341us;65535us;65535us;17343us;17344us;65535us;17345us;65535us;17347us;65535us;65535us;17348us;17349us;65535us;17350us;65535us;17351us;17352us;65535us;17353us;17354us;65535us;65535us;17356us;17357us;65535us;17358us;65535us;17359us;17360us;65535us;17361us;65535us;65535us;65535us;65535us;65535us;17366us;65535us;65535us;65535us;17367us;65535us;17369us;65535us;17370us;17371us;65535us;65535us;65535us;17372us;17373us;17374us;65535us;17375us;65535us;65535us;17376us;65535us;17377us;65535us;17378us;65535us;17379us;65535us;17380us;65535us;17381us;65535us;17382us;65535us;17383us;65535us;17384us;65535us;17385us;65535us;17386us;65535us;17387us;65535us;17388us;65535us;17389us;65535us;17390us;65535us;17391us;65535us;17392us;65535us;17393us;65535us;17394us;65535us;17395us;65535us;17396us;65535us;17397us;65535us;17398us;65535us;17399us;65535us;17400us;65535us;17401us;65535us;17402us;65535us;17403us;65535us;17404us;65535us;17405us;65535us;17406us;65535us;17407us;65535us;17408us;65535us;65535us;65535us;65535us;65535us;65535us;17410us;17411us;65535us;65535us;17414us;65535us;65535us;65535us;17415us;65535us;65535us;17418us;65535us;65535us;17420us;17421us;65535us;65535us;65535us;17422us;17423us;65535us;65535us;65535us;65535us;17424us;17425us;17426us;17427us;17428us;17429us;17430us;65535us;17432us;17433us;65535us;17434us;17435us;65535us;65535us;17437us;65535us;17438us;17439us;65535us;17440us;65535us;65535us;65535us;65535us;17441us;17442us;17443us;65535us;17444us;17445us;17446us;17447us;65535us;65535us;17449us;17451us;17452us;65535us;65535us;17454us;65535us;17455us;65535us;17457us;65535us;65535us;17458us;65535us;65535us;17460us;17461us;65535us;17463us;17464us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17468us;65535us;17469us;65535us;17470us;17471us;17472us;65535us;17473us;17474us;65535us;65535us;17475us;65535us;17476us;17477us;65535us;65535us;17478us;65535us;65535us;17479us;17480us;17481us;17482us;17483us;17484us;17485us;17486us;17487us;17488us;17489us;17490us;17491us;17492us;17493us;17494us;17495us;17496us;17497us;17498us;17499us;17500us;17501us;17502us;65535us;17504us;65535us;17505us;17506us;65535us;17507us;17508us;17509us;17510us;65535us;17512us;65535us;17513us;17514us;17515us;17516us;17517us;17518us;17519us;17520us;65535us;17522us;65535us;17523us;65535us;65535us;17527us;17528us;17529us;17530us;17531us;17532us;17533us;17534us;17536us;17538us;17542us;17544us;17546us;17550us;17552us;17554us;17555us;17556us;17557us;17558us;17559us;17560us;17561us;17562us;17563us;17564us;17565us;65535us;17567us;17568us;65535us;65535us;17569us;17570us;65535us;65535us;17571us;17572us;17573us;17574us;17575us;17577us;65535us;65535us;17579us;17580us;17581us;65535us;65535us;17582us;17583us;17584us;65535us;17585us;17586us;17587us;17588us;65535us;17589us;17590us;17591us;65535us;17592us;17593us;17594us;17595us;17596us;17597us;17598us;17599us;17600us;17601us;17602us;17603us;17604us;17605us;|] +let _fsyacc_gotos = [| 0us;65535us;0us;65535us;0us;65535us;0us;65535us;0us;65535us;1us;65535us;4us;5us;7us;65535us;4us;15us;16us;17us;18us;19us;20us;21us;22us;15us;24us;15us;26us;15us;4us;65535us;4us;10us;22us;23us;24us;25us;26us;27us;5us;65535us;4us;16us;22us;16us;24us;16us;26us;16us;28us;29us;4us;65535us;4us;18us;22us;18us;24us;18us;26us;18us;4us;65535us;4us;20us;22us;20us;24us;20us;26us;20us;4us;65535us;16us;22us;18us;24us;20us;26us;34us;35us;4us;65535us;16us;34us;18us;34us;20us;34us;34us;34us;23us;65535us;0us;93us;2us;273us;4us;33us;22us;33us;24us;33us;26us;33us;69us;93us;73us;93us;77us;93us;88us;93us;91us;93us;123us;93us;126us;93us;130us;93us;239us;273us;243us;273us;246us;273us;258us;273us;262us;273us;264us;273us;270us;273us;301us;273us;311us;273us;1us;65535us;39us;40us;1us;65535us;40us;41us;1us;65535us;0us;1us;6us;65535us;31us;285us;72us;73us;96us;97us;242us;243us;256us;285us;275us;285us;4us;65535us;64us;68us;66us;68us;234us;238us;236us;238us;1us;65535us;0us;47us;2us;65535us;64us;65us;66us;67us;2us;65535us;64us;66us;66us;66us;2us;65535us;0us;64us;69us;70us;3us;65535us;0us;75us;69us;75us;73us;74us;6us;65535us;0us;76us;69us;76us;73us;76us;77us;78us;126us;127us;130us;131us;9us;65535us;0us;84us;69us;84us;73us;84us;77us;84us;88us;89us;91us;92us;123us;124us;126us;84us;130us;84us;9us;65535us;0us;87us;69us;87us;73us;87us;77us;87us;88us;87us;91us;87us;123us;87us;126us;87us;130us;87us;9us;65535us;0us;94us;69us;94us;73us;94us;77us;94us;88us;94us;91us;94us;123us;94us;126us;94us;130us;94us;2us;65535us;115us;116us;189us;190us;1us;65535us;98us;100us;2us;65535us;103us;104us;134us;135us;3us;65535us;102us;103us;133us;134us;201us;202us;1us;65535us;137us;138us;2us;65535us;137us;147us;140us;141us;2us;65535us;137us;150us;140us;150us;2us;65535us;137us;154us;140us;154us;3us;65535us;155us;156us;165us;166us;225us;226us;8us;65535us;140us;162us;142us;143us;155us;173us;161us;162us;165us;173us;169us;170us;176us;177us;225us;173us;8us;65535us;140us;174us;142us;174us;155us;174us;161us;174us;165us;174us;169us;174us;176us;174us;225us;174us;11us;65535us;140us;175us;142us;175us;155us;175us;161us;175us;165us;175us;169us;175us;176us;175us;225us;175us;661us;662us;668us;669us;1528us;1529us;3us;65535us;188us;189us;461us;462us;498us;499us;2us;65535us;206us;207us;208us;209us;2us;65535us;180us;182us;181us;182us;2us;65535us;72us;105us;96us;105us;5us;65535us;136us;139us;143us;144us;145us;146us;147us;148us;223us;224us;1us;65535us;2us;3us;1us;65535us;2us;228us;2us;65535us;234us;235us;236us;237us;2us;65535us;234us;236us;236us;236us;2us;65535us;2us;234us;239us;240us;3us;65535us;2us;245us;239us;245us;243us;244us;5us;65535us;2us;253us;239us;253us;243us;253us;246us;247us;311us;312us;9us;65535us;2us;254us;239us;254us;243us;254us;246us;254us;258us;259us;264us;265us;270us;271us;301us;305us;311us;254us;10us;65535us;2us;260us;239us;260us;243us;260us;246us;260us;258us;260us;262us;263us;264us;260us;270us;260us;301us;260us;311us;260us;10us;65535us;2us;262us;239us;262us;243us;262us;246us;262us;258us;262us;262us;262us;264us;262us;270us;262us;301us;262us;311us;262us;15us;65535us;2us;272us;4us;28us;22us;28us;24us;28us;26us;28us;28us;28us;239us;272us;243us;272us;246us;272us;258us;272us;262us;272us;264us;272us;270us;272us;301us;272us;311us;272us;24us;65535us;0us;106us;2us;291us;4us;291us;22us;291us;24us;291us;26us;291us;28us;291us;69us;106us;73us;106us;77us;106us;88us;106us;91us;106us;123us;106us;126us;106us;130us;106us;239us;291us;243us;291us;246us;291us;258us;291us;262us;291us;264us;291us;270us;291us;301us;291us;311us;291us;1us;65535us;98us;99us;1us;65535us;286us;287us;2us;65535us;286us;309us;301us;302us;1us;65535us;366us;367us;81us;65535us;0us;71us;2us;241us;4us;30us;22us;30us;24us;30us;26us;30us;28us;274us;53us;54us;69us;71us;73us;95us;77us;95us;88us;95us;91us;95us;102us;360us;107us;108us;123us;95us;126us;95us;130us;95us;133us;360us;137us;566us;140us;179us;142us;178us;155us;178us;161us;178us;165us;178us;169us;178us;176us;178us;201us;360us;225us;178us;239us;241us;243us;255us;246us;255us;258us;255us;262us;274us;264us;255us;270us;255us;281us;360us;301us;255us;311us;255us;316us;441us;363us;360us;366us;368us;373us;566us;376us;442us;378us;441us;393us;441us;397us;441us;399us;441us;403us;441us;409us;441us;412us;441us;423us;424us;481us;360us;522us;551us;525us;441us;543us;551us;549us;551us;580us;746us;590us;746us;608us;617us;613us;617us;614us;617us;622us;617us;627us;617us;661us;178us;668us;178us;678us;688us;681us;688us;686us;688us;743us;746us;758us;759us;771us;825us;777us;825us;790us;819us;795us;804us;800us;804us;802us;804us;822us;825us;1528us;178us;1627us;552us;1629us;825us;123us;65535us;0us;319us;2us;289us;4us;289us;22us;289us;24us;289us;26us;289us;28us;289us;53us;319us;69us;319us;73us;319us;77us;319us;88us;319us;91us;319us;102us;319us;107us;319us;114us;1700us;123us;319us;126us;319us;130us;319us;133us;319us;137us;319us;140us;319us;142us;319us;152us;1700us;155us;319us;161us;319us;165us;319us;169us;319us;176us;319us;187us;1700us;201us;319us;204us;1700us;225us;319us;239us;289us;243us;289us;246us;289us;258us;289us;262us;289us;264us;289us;270us;289us;281us;319us;301us;289us;311us;289us;316us;319us;320us;321us;363us;319us;366us;319us;373us;319us;376us;319us;378us;319us;390us;1700us;393us;319us;397us;319us;399us;319us;403us;319us;409us;319us;412us;319us;423us;319us;460us;1700us;481us;319us;522us;319us;525us;319us;543us;319us;549us;319us;580us;319us;590us;319us;608us;319us;613us;319us;614us;319us;622us;319us;627us;319us;661us;319us;668us;319us;678us;319us;681us;319us;686us;319us;699us;1700us;722us;1700us;743us;319us;758us;319us;771us;319us;777us;319us;790us;319us;795us;319us;800us;319us;802us;319us;822us;319us;892us;1024us;936us;1024us;956us;1024us;972us;1024us;975us;1024us;986us;1024us;994us;1024us;1018us;1024us;1024us;1024us;1025us;1024us;1028us;1024us;1029us;1024us;1032us;1024us;1034us;1024us;1035us;1024us;1041us;1024us;1045us;1024us;1152us;1024us;1322us;1024us;1324us;1024us;1330us;1024us;1332us;1024us;1339us;1024us;1341us;1024us;1343us;1024us;1528us;319us;1627us;319us;1629us;319us;1672us;1024us;1674us;1024us;1681us;1700us;1685us;1700us;1689us;1700us;1692us;1700us;1695us;1700us;1698us;1700us;123us;65535us;0us;320us;2us;320us;4us;320us;22us;320us;24us;320us;26us;320us;28us;320us;53us;320us;69us;320us;73us;320us;77us;320us;88us;320us;91us;320us;102us;320us;107us;320us;114us;320us;123us;320us;126us;320us;130us;320us;133us;320us;137us;320us;140us;320us;142us;320us;152us;320us;155us;320us;161us;320us;165us;320us;169us;320us;176us;320us;187us;320us;201us;320us;204us;320us;225us;320us;239us;320us;243us;320us;246us;320us;258us;320us;262us;320us;264us;320us;270us;320us;281us;320us;301us;320us;311us;320us;316us;320us;320us;320us;363us;320us;366us;320us;373us;320us;376us;320us;378us;320us;390us;320us;393us;320us;397us;320us;399us;320us;403us;320us;409us;320us;412us;320us;423us;320us;460us;320us;481us;320us;522us;320us;525us;320us;543us;320us;549us;320us;580us;320us;590us;320us;608us;320us;613us;320us;614us;320us;622us;320us;627us;320us;661us;320us;668us;320us;678us;320us;681us;320us;686us;320us;699us;320us;722us;320us;743us;320us;758us;320us;771us;320us;777us;320us;790us;320us;795us;320us;800us;320us;802us;320us;822us;320us;892us;320us;936us;320us;956us;320us;972us;320us;975us;320us;986us;320us;994us;320us;1018us;320us;1024us;320us;1025us;320us;1028us;320us;1029us;320us;1032us;320us;1034us;320us;1035us;320us;1041us;320us;1045us;320us;1152us;320us;1322us;320us;1324us;320us;1330us;320us;1332us;320us;1339us;320us;1341us;320us;1343us;320us;1528us;320us;1627us;320us;1629us;320us;1672us;320us;1674us;320us;1681us;320us;1685us;320us;1689us;320us;1692us;320us;1695us;320us;1698us;320us;1us;65535us;322us;323us;2us;65535us;322us;332us;333us;334us;2us;65535us;322us;338us;333us;338us;4us;65535us;180us;221us;181us;221us;443us;447us;444us;447us;6us;65535us;102us;136us;133us;136us;201us;136us;281us;366us;363us;366us;481us;366us;2us;65535us;282us;283us;364us;365us;3us;65535us;281us;282us;363us;364us;481us;482us;1us;65535us;373us;374us;2us;65535us;373us;385us;376us;377us;2us;65535us;373us;388us;376us;388us;2us;65535us;373us;392us;376us;392us;3us;65535us;316us;317us;393us;394us;525us;526us;8us;65535us;316us;407us;378us;379us;393us;407us;397us;410us;403us;404us;409us;410us;412us;413us;525us;407us;10us;65535us;316us;408us;376us;400us;378us;408us;393us;408us;397us;408us;399us;400us;403us;408us;409us;408us;412us;408us;525us;408us;1us;65535us;431us;436us;2us;65535us;414us;415us;416us;417us;3us;65535us;414us;420us;416us;420us;421us;422us;3us;65535us;447us;448us;553us;554us;559us;560us;4us;65535us;180us;222us;181us;222us;443us;455us;444us;455us;10us;65535us;316us;411us;376us;411us;378us;411us;393us;411us;397us;411us;399us;411us;403us;411us;409us;411us;412us;411us;525us;411us;3us;65535us;355us;467us;443us;465us;444us;465us;2us;65535us;447us;469us;553us;556us;1us;65535us;495us;496us;55us;65535us;424us;940us;429us;940us;471us;981us;829us;940us;892us;940us;911us;940us;914us;940us;915us;940us;920us;940us;921us;940us;924us;940us;926us;940us;927us;940us;936us;940us;940us;981us;941us;981us;943us;981us;945us;981us;948us;981us;950us;981us;956us;940us;960us;981us;962us;981us;964us;981us;972us;940us;975us;940us;986us;940us;994us;940us;1015us;940us;1018us;940us;1024us;940us;1025us;940us;1028us;940us;1029us;940us;1032us;940us;1034us;940us;1035us;940us;1041us;940us;1045us;940us;1095us;940us;1100us;940us;1152us;940us;1183us;940us;1190us;940us;1322us;940us;1324us;940us;1330us;940us;1332us;940us;1339us;940us;1341us;940us;1343us;940us;1655us;981us;1660us;981us;1672us;940us;1674us;940us;26us;65535us;30us;31us;54us;55us;71us;72us;95us;96us;110us;111us;178us;180us;179us;181us;183us;184us;206us;212us;208us;212us;214us;215us;241us;242us;255us;256us;274us;275us;360us;601us;368us;369us;441us;443us;442us;444us;455us;456us;484us;485us;493us;494us;566us;567us;688us;689us;748us;749us;759us;760us;791us;792us;81us;65535us;30us;518us;54us;518us;71us;518us;95us;518us;110us;518us;178us;518us;179us;518us;183us;518us;206us;518us;208us;518us;214us;518us;241us;518us;255us;518us;274us;518us;360us;518us;368us;518us;424us;513us;429us;513us;441us;518us;442us;518us;455us;518us;471us;513us;484us;518us;493us;518us;566us;518us;688us;518us;748us;518us;759us;518us;791us;518us;829us;513us;892us;513us;911us;513us;914us;513us;915us;513us;920us;513us;921us;513us;924us;513us;926us;513us;927us;513us;936us;513us;940us;513us;941us;513us;943us;513us;945us;513us;948us;513us;950us;513us;956us;513us;960us;513us;962us;513us;964us;513us;972us;513us;975us;513us;986us;513us;994us;513us;1015us;513us;1018us;513us;1024us;513us;1025us;513us;1028us;513us;1029us;513us;1032us;513us;1034us;513us;1035us;513us;1041us;513us;1045us;513us;1095us;513us;1100us;513us;1152us;513us;1183us;513us;1190us;513us;1322us;513us;1324us;513us;1330us;513us;1332us;513us;1339us;513us;1341us;513us;1343us;513us;1655us;513us;1660us;513us;1672us;513us;1674us;513us;1us;65535us;452us;453us;4us;65535us;379us;380us;381us;382us;385us;386us;756us;757us;2us;65535us;443us;464us;444us;464us;2us;65535us;371us;372us;472us;473us;2us;65535us;371us;535us;472us;535us;2us;65535us;529us;530us;532us;533us;3us;65535us;529us;539us;532us;539us;1402us;1625us;2us;65535us;522us;523us;1627us;1632us;4us;65535us;522us;547us;543us;544us;549us;550us;1627us;547us;4us;65535us;522us;548us;543us;548us;549us;548us;1627us;548us;2us;65535us;551us;553us;552us;553us;4us;65535us;137us;149us;140us;149us;373us;387us;376us;387us;9us;65535us;181us;574us;444us;574us;567us;574us;690us;740us;692us;740us;695us;740us;719us;740us;725us;740us;765us;740us;87us;65535us;8us;1872us;114us;1872us;152us;1872us;181us;1872us;187us;1872us;191us;1872us;193us;1872us;204us;1872us;295us;1872us;390us;1872us;444us;1872us;451us;1872us;460us;1872us;487us;1872us;503us;1872us;567us;1872us;575us;1872us;634us;1872us;638us;1872us;650us;1872us;653us;1872us;664us;1872us;675us;1872us;690us;1872us;692us;1872us;695us;1872us;699us;1872us;719us;1872us;722us;1872us;725us;1872us;728us;1872us;731us;1872us;734us;1872us;751us;1872us;765us;1872us;852us;1872us;952us;1872us;1021us;1872us;1063us;1872us;1248us;1872us;1251us;1872us;1254us;1872us;1538us;1872us;1571us;1872us;1574us;1872us;1576us;1872us;1640us;1872us;1678us;1872us;1680us;1872us;1681us;1872us;1685us;1872us;1689us;1872us;1692us;1872us;1695us;1872us;1698us;1872us;1700us;1872us;1702us;1872us;1707us;1872us;1711us;1872us;1716us;1872us;1722us;1872us;1725us;1872us;1728us;1872us;1731us;1872us;1737us;1872us;1740us;1872us;1741us;1872us;1743us;1872us;1744us;1872us;1747us;1872us;1751us;1872us;1754us;1872us;1756us;1872us;1759us;1872us;1774us;1872us;1780us;1872us;1786us;1872us;1789us;1872us;1856us;1872us;1860us;1872us;1866us;1872us;1876us;1872us;1882us;1872us;1884us;1872us;1909us;1872us;1911us;1872us;1922us;1872us;88us;65535us;8us;589us;114us;589us;152us;589us;181us;589us;187us;589us;191us;589us;193us;589us;204us;589us;295us;589us;390us;589us;444us;589us;451us;589us;460us;589us;487us;589us;503us;589us;567us;589us;575us;589us;587us;588us;634us;589us;638us;589us;650us;589us;653us;589us;664us;589us;675us;589us;690us;589us;692us;589us;695us;589us;699us;589us;719us;589us;722us;589us;725us;589us;728us;589us;731us;589us;734us;589us;751us;589us;765us;589us;852us;589us;952us;589us;1021us;589us;1063us;589us;1248us;589us;1251us;589us;1254us;589us;1538us;589us;1571us;589us;1574us;589us;1576us;589us;1640us;589us;1678us;589us;1680us;589us;1681us;589us;1685us;589us;1689us;589us;1692us;589us;1695us;589us;1698us;589us;1700us;589us;1702us;589us;1707us;589us;1711us;589us;1716us;589us;1722us;589us;1725us;589us;1728us;589us;1731us;589us;1737us;589us;1740us;589us;1741us;589us;1743us;589us;1744us;589us;1747us;589us;1751us;589us;1754us;589us;1756us;589us;1759us;589us;1774us;589us;1780us;589us;1786us;589us;1789us;589us;1856us;589us;1860us;589us;1866us;589us;1876us;589us;1882us;589us;1884us;589us;1909us;589us;1911us;589us;1922us;589us;4us;65535us;137us;155us;140us;155us;373us;393us;376us;393us;9us;65535us;180us;191us;181us;191us;443us;451us;444us;451us;1621us;1640us;1623us;1640us;1634us;1640us;1636us;1640us;1638us;1640us;1us;65535us;360us;361us;1us;65535us;601us;603us;3us;65535us;608us;609us;622us;611us;627us;612us;5us;65535us;608us;616us;613us;615us;614us;615us;622us;616us;627us;616us;1us;65535us;602us;605us;1us;65535us;627us;628us;4us;65535us;112us;631us;185us;631us;458us;631us;940us;941us;3us;65535us;112us;113us;185us;186us;458us;459us;97us;65535us;8us;1763us;114us;1763us;152us;1763us;181us;1763us;187us;1763us;191us;1763us;193us;1763us;204us;1763us;295us;1763us;390us;1763us;444us;1763us;451us;1763us;460us;1763us;487us;1763us;503us;1763us;528us;1873us;567us;1763us;575us;1763us;576us;1873us;619us;646us;632us;1873us;634us;1763us;638us;1763us;643us;644us;650us;1763us;653us;1763us;664us;1763us;675us;1763us;690us;1763us;692us;1763us;695us;1763us;699us;1763us;719us;1763us;722us;1763us;725us;1763us;728us;1763us;731us;1763us;734us;1763us;751us;1763us;765us;1763us;852us;1763us;952us;1873us;1021us;1763us;1063us;1763us;1248us;1763us;1251us;1763us;1254us;1763us;1395us;1873us;1396us;1873us;1538us;1763us;1571us;1763us;1574us;1763us;1576us;1763us;1578us;1873us;1640us;1763us;1678us;1763us;1680us;1763us;1681us;1763us;1685us;1763us;1689us;1763us;1692us;1763us;1695us;1763us;1698us;1763us;1700us;1763us;1702us;1763us;1707us;1763us;1711us;1763us;1716us;1763us;1722us;1763us;1725us;1763us;1728us;1763us;1731us;1763us;1737us;1763us;1740us;1763us;1741us;1763us;1743us;1763us;1744us;1763us;1747us;1763us;1751us;1763us;1754us;1763us;1756us;1763us;1759us;1763us;1762us;646us;1764us;646us;1774us;1763us;1780us;1763us;1786us;1763us;1789us;1763us;1856us;1763us;1860us;1763us;1866us;1763us;1876us;1763us;1882us;1763us;1884us;1763us;1909us;1763us;1911us;1763us;1922us;1763us;3us;65535us;361us;362us;611us;623us;628us;629us;3us;65535us;634us;635us;1678us;636us;1680us;637us;3us;65535us;619us;620us;1762us;641us;1764us;642us;4us;65535us;634us;640us;638us;639us;1678us;640us;1680us;640us;1us;65535us;664us;665us;3us;65535us;181us;573us;444us;573us;567us;573us;5us;65535us;181us;678us;444us;678us;567us;678us;680us;681us;685us;686us;3us;65535us;678us;679us;681us;682us;686us;687us;3us;65535us;678us;685us;681us;685us;686us;685us;4us;65535us;181us;721us;444us;721us;567us;721us;689us;690us;3us;65535us;181us;680us;444us;680us;567us;680us;3us;65535us;181us;683us;444us;683us;567us;683us;8us;65535us;690us;741us;692us;741us;695us;741us;719us;741us;725us;741us;728us;729us;731us;732us;765us;741us;8us;65535us;690us;727us;692us;727us;695us;727us;719us;727us;725us;727us;728us;727us;731us;727us;765us;727us;6us;65535us;690us;694us;692us;693us;695us;696us;719us;720us;725us;726us;765us;766us;3us;65535us;580us;581us;590us;591us;743us;744us;3us;65535us;580us;742us;590us;742us;743us;742us;3us;65535us;196us;197us;199us;200us;746us;747us;4us;65535us;31us;284us;242us;284us;256us;284us;275us;284us;6us;65535us;31us;756us;72us;223us;96us;223us;242us;756us;256us;756us;275us;756us;1us;65535us;760us;761us;1us;65535us;761us;762us;120us;65535us;6us;1106us;31us;277us;117us;1106us;119us;1106us;242us;277us;256us;277us;275us;276us;279us;1106us;355us;784us;427us;1106us;432us;1106us;443us;784us;444us;784us;474us;1106us;497us;1106us;774us;1106us;780us;1106us;832us;1106us;836us;1106us;846us;1106us;1047us;1106us;1053us;1106us;1069us;1106us;1071us;1106us;1074us;1106us;1077us;1106us;1096us;1106us;1101us;1106us;1107us;1106us;1110us;1106us;1113us;1106us;1119us;1106us;1123us;1106us;1127us;1106us;1133us;1106us;1135us;1106us;1140us;1106us;1142us;1106us;1144us;1106us;1146us;1106us;1148us;1106us;1150us;1106us;1154us;1106us;1164us;1106us;1171us;1106us;1177us;1106us;1179us;1106us;1184us;1106us;1188us;1106us;1191us;1106us;1195us;1106us;1198us;1106us;1201us;1106us;1203us;1106us;1206us;1106us;1208us;1106us;1257us;1106us;1259us;1106us;1263us;1106us;1265us;1106us;1267us;1106us;1269us;1106us;1271us;1106us;1273us;1106us;1275us;1106us;1277us;1106us;1279us;1106us;1281us;1106us;1283us;1106us;1285us;1106us;1287us;1106us;1289us;1106us;1291us;1106us;1293us;1106us;1295us;1106us;1297us;1106us;1299us;1106us;1301us;1106us;1303us;1106us;1304us;1106us;1305us;1106us;1306us;1106us;1309us;1106us;1319us;1106us;1348us;1106us;1349us;1106us;1353us;1106us;1355us;1106us;1358us;1106us;1359us;1106us;1361us;1106us;1364us;1106us;1366us;1106us;1368us;1106us;1370us;1106us;1452us;1106us;1459us;1106us;1466us;1106us;1473us;1106us;1490us;1106us;1497us;1106us;1498us;1106us;1504us;1106us;1510us;1106us;1511us;1106us;1512us;1106us;1524us;1106us;1530us;1106us;1540us;1106us;1553us;1106us;1555us;1106us;1558us;1106us;1559us;1106us;1585us;1106us;1590us;1106us;1615us;1106us;1657us;1106us;1662us;1106us;2053us;1106us;2057us;1106us;7us;65535us;31us;280us;242us;280us;256us;280us;275us;280us;355us;785us;443us;785us;444us;785us;120us;65535us;6us;1077us;31us;279us;117us;1110us;119us;1110us;242us;279us;256us;279us;275us;278us;279us;1077us;355us;786us;427us;1077us;432us;1077us;443us;786us;444us;786us;474us;1077us;497us;1077us;774us;1077us;780us;1077us;832us;1077us;836us;1077us;846us;1077us;1047us;1077us;1053us;1077us;1069us;1077us;1071us;1077us;1074us;1077us;1077us;1077us;1096us;1077us;1101us;1077us;1107us;1077us;1110us;1077us;1113us;1077us;1119us;1077us;1123us;1077us;1127us;1077us;1133us;1077us;1135us;1110us;1140us;1110us;1142us;1110us;1144us;1110us;1146us;1110us;1148us;1110us;1150us;1110us;1154us;1077us;1164us;1077us;1171us;1077us;1177us;1110us;1179us;1110us;1184us;1077us;1188us;1077us;1191us;1077us;1195us;1077us;1198us;1077us;1201us;1077us;1203us;1077us;1206us;1110us;1208us;1077us;1257us;1110us;1259us;1110us;1263us;1110us;1265us;1110us;1267us;1110us;1269us;1110us;1271us;1110us;1273us;1110us;1275us;1110us;1277us;1110us;1279us;1110us;1281us;1110us;1283us;1110us;1285us;1110us;1287us;1110us;1289us;1110us;1291us;1110us;1293us;1110us;1295us;1110us;1297us;1110us;1299us;1110us;1301us;1110us;1303us;1110us;1304us;1110us;1305us;1110us;1306us;1110us;1309us;1077us;1319us;1077us;1348us;1110us;1349us;1077us;1353us;1110us;1355us;1077us;1358us;1110us;1359us;1077us;1361us;1110us;1364us;1110us;1366us;1110us;1368us;1110us;1370us;1110us;1452us;1077us;1459us;1110us;1466us;1077us;1473us;1077us;1490us;1077us;1497us;1077us;1498us;1077us;1504us;1077us;1510us;1077us;1511us;1077us;1512us;1077us;1524us;1110us;1530us;1077us;1540us;1077us;1553us;1077us;1555us;1110us;1558us;1110us;1559us;1110us;1585us;1110us;1590us;1110us;1615us;1110us;1657us;1077us;1662us;1077us;2053us;1110us;2057us;1110us;119us;65535us;6us;1116us;31us;1116us;117us;1116us;119us;1116us;242us;1116us;256us;1116us;279us;1116us;355us;787us;427us;1116us;432us;1116us;443us;787us;444us;787us;474us;1116us;497us;1116us;774us;1116us;780us;1116us;832us;1116us;836us;1116us;846us;1116us;1047us;1116us;1053us;1116us;1069us;1116us;1071us;1116us;1074us;1116us;1077us;1116us;1096us;1116us;1101us;1116us;1107us;1116us;1110us;1116us;1113us;1116us;1119us;1116us;1123us;1116us;1127us;1116us;1133us;1116us;1135us;1116us;1140us;1116us;1142us;1116us;1144us;1116us;1146us;1116us;1148us;1116us;1150us;1116us;1154us;1116us;1164us;1116us;1171us;1116us;1177us;1116us;1179us;1116us;1184us;1116us;1188us;1116us;1191us;1116us;1195us;1116us;1198us;1116us;1201us;1116us;1203us;1116us;1206us;1116us;1208us;1116us;1257us;1116us;1259us;1116us;1263us;1116us;1265us;1116us;1267us;1116us;1269us;1116us;1271us;1116us;1273us;1116us;1275us;1116us;1277us;1116us;1279us;1116us;1281us;1116us;1283us;1116us;1285us;1116us;1287us;1116us;1289us;1116us;1291us;1116us;1293us;1116us;1295us;1116us;1297us;1116us;1299us;1116us;1301us;1116us;1303us;1116us;1304us;1116us;1305us;1116us;1306us;1116us;1309us;1116us;1319us;1116us;1348us;1116us;1349us;1116us;1353us;1116us;1355us;1116us;1358us;1116us;1359us;1116us;1361us;1116us;1364us;1116us;1366us;1116us;1368us;1116us;1370us;1116us;1452us;1116us;1459us;1116us;1466us;1116us;1473us;1116us;1490us;1116us;1497us;1116us;1498us;1116us;1504us;1116us;1510us;1116us;1511us;1116us;1512us;1116us;1524us;1116us;1530us;1116us;1540us;1116us;1553us;1116us;1555us;1116us;1558us;1116us;1559us;1116us;1585us;1116us;1590us;1116us;1615us;1116us;1657us;1116us;1662us;1116us;2053us;1116us;2057us;1116us;3us;65535us;355us;446us;443us;445us;444us;445us;5us;65535us;778us;779us;781us;782us;1102us;1103us;1192us;1193us;1204us;1205us;120us;65535us;6us;773us;31us;773us;117us;773us;119us;773us;242us;773us;256us;773us;275us;773us;279us;773us;355us;773us;427us;773us;432us;773us;443us;773us;444us;773us;474us;773us;497us;773us;774us;773us;780us;773us;832us;773us;836us;773us;846us;773us;1047us;773us;1053us;773us;1069us;773us;1071us;773us;1074us;773us;1077us;773us;1096us;773us;1101us;773us;1107us;773us;1110us;773us;1113us;773us;1119us;773us;1123us;773us;1127us;773us;1133us;773us;1135us;773us;1140us;773us;1142us;773us;1144us;773us;1146us;773us;1148us;773us;1150us;773us;1154us;773us;1164us;773us;1171us;773us;1177us;773us;1179us;773us;1184us;773us;1188us;773us;1191us;773us;1195us;773us;1198us;773us;1201us;773us;1203us;773us;1206us;773us;1208us;773us;1257us;773us;1259us;773us;1263us;773us;1265us;773us;1267us;773us;1269us;773us;1271us;773us;1273us;773us;1275us;773us;1277us;773us;1279us;773us;1281us;773us;1283us;773us;1285us;773us;1287us;773us;1289us;773us;1291us;773us;1293us;773us;1295us;773us;1297us;773us;1299us;773us;1301us;773us;1303us;773us;1304us;773us;1305us;773us;1306us;773us;1309us;773us;1319us;773us;1348us;773us;1349us;773us;1353us;773us;1355us;773us;1358us;773us;1359us;773us;1361us;773us;1364us;773us;1366us;773us;1368us;773us;1370us;773us;1452us;773us;1459us;773us;1466us;773us;1473us;773us;1490us;773us;1497us;773us;1498us;773us;1504us;773us;1510us;773us;1511us;773us;1512us;773us;1524us;773us;1530us;773us;1540us;773us;1553us;773us;1555us;773us;1558us;773us;1559us;773us;1585us;773us;1590us;773us;1615us;773us;1657us;773us;1662us;773us;2053us;773us;2057us;773us;1us;65535us;795us;796us;1us;65535us;795us;798us;3us;65535us;795us;799us;800us;801us;802us;803us;2us;65535us;804us;805us;819us;808us;1us;65535us;790us;791us;4us;65535us;771us;772us;777us;778us;1627us;1628us;1629us;1630us;2us;65535us;820us;821us;823us;824us;5us;65535us;771us;820us;777us;820us;822us;823us;1627us;820us;1629us;820us;2us;65535us;552us;826us;825us;826us;1us;65535us;832us;833us;2us;65535us;832us;840us;836us;837us;1us;65535us;841us;842us;1us;65535us;842us;843us;1us;65535us;844us;845us;2us;65535us;844us;850us;848us;849us;307us;65535us;6us;887us;8us;1891us;31us;887us;114us;1891us;117us;887us;119us;887us;152us;1891us;181us;1891us;187us;1891us;191us;1891us;193us;1891us;204us;1891us;242us;887us;256us;887us;279us;887us;295us;1891us;336us;887us;340us;887us;345us;887us;390us;1891us;424us;887us;427us;887us;429us;887us;432us;887us;444us;1891us;451us;1891us;460us;1891us;471us;887us;474us;887us;487us;1891us;497us;887us;503us;1891us;528us;1891us;531us;887us;567us;1891us;575us;1891us;576us;1891us;619us;1891us;632us;1891us;634us;1891us;638us;1891us;643us;1891us;650us;1891us;653us;1891us;664us;1891us;675us;1891us;690us;1891us;692us;1891us;695us;1891us;699us;1891us;701us;887us;713us;887us;719us;1891us;722us;1891us;725us;1891us;728us;1891us;731us;1891us;734us;1891us;751us;1891us;765us;1891us;774us;887us;780us;887us;829us;887us;832us;887us;836us;887us;846us;887us;852us;1891us;892us;887us;911us;887us;914us;887us;915us;887us;920us;887us;921us;887us;924us;887us;926us;887us;927us;887us;936us;887us;940us;887us;941us;887us;943us;887us;945us;887us;948us;887us;950us;887us;952us;1891us;956us;887us;960us;887us;962us;887us;964us;887us;972us;887us;975us;887us;986us;887us;994us;887us;1015us;887us;1018us;887us;1021us;1891us;1024us;887us;1025us;887us;1028us;887us;1029us;887us;1032us;887us;1034us;887us;1035us;887us;1041us;887us;1045us;887us;1047us;887us;1053us;887us;1063us;1891us;1069us;887us;1071us;887us;1074us;887us;1077us;887us;1095us;887us;1096us;887us;1100us;887us;1101us;887us;1107us;887us;1110us;887us;1113us;887us;1119us;887us;1123us;887us;1127us;887us;1133us;887us;1135us;887us;1140us;887us;1142us;887us;1144us;887us;1146us;887us;1148us;887us;1150us;887us;1152us;887us;1154us;887us;1164us;887us;1171us;887us;1177us;887us;1179us;887us;1183us;887us;1184us;887us;1188us;887us;1190us;887us;1191us;887us;1195us;887us;1198us;887us;1201us;887us;1203us;887us;1206us;887us;1208us;887us;1248us;1891us;1251us;1891us;1254us;1891us;1257us;887us;1259us;887us;1263us;887us;1265us;887us;1267us;887us;1269us;887us;1271us;887us;1273us;887us;1275us;887us;1277us;887us;1279us;887us;1281us;887us;1283us;887us;1285us;887us;1287us;887us;1289us;887us;1291us;887us;1293us;887us;1295us;887us;1297us;887us;1299us;887us;1301us;887us;1303us;887us;1304us;887us;1305us;887us;1306us;887us;1309us;887us;1319us;887us;1322us;887us;1324us;887us;1330us;887us;1332us;887us;1339us;887us;1341us;887us;1343us;887us;1348us;887us;1349us;887us;1353us;887us;1355us;887us;1358us;887us;1359us;887us;1361us;887us;1364us;887us;1366us;887us;1368us;887us;1370us;887us;1372us;887us;1373us;887us;1374us;887us;1375us;887us;1377us;887us;1378us;887us;1380us;887us;1381us;887us;1383us;887us;1384us;887us;1386us;887us;1387us;887us;1389us;887us;1390us;887us;1392us;887us;1393us;887us;1395us;1891us;1396us;1891us;1399us;887us;1400us;887us;1407us;887us;1409us;887us;1411us;887us;1412us;887us;1413us;887us;1416us;887us;1421us;887us;1429us;887us;1430us;887us;1433us;887us;1434us;887us;1452us;887us;1459us;887us;1466us;887us;1473us;887us;1490us;887us;1497us;887us;1498us;887us;1504us;887us;1510us;887us;1511us;887us;1512us;887us;1524us;887us;1530us;887us;1538us;1891us;1540us;887us;1553us;887us;1555us;887us;1558us;887us;1559us;887us;1565us;887us;1571us;1891us;1574us;1891us;1576us;1891us;1578us;1891us;1580us;887us;1585us;887us;1590us;887us;1615us;887us;1640us;1891us;1648us;887us;1655us;887us;1657us;887us;1660us;887us;1662us;887us;1672us;887us;1674us;887us;1678us;1891us;1680us;1891us;1681us;1891us;1685us;1891us;1689us;1891us;1692us;1891us;1695us;1891us;1698us;1891us;1700us;1891us;1702us;1891us;1707us;1891us;1711us;1891us;1716us;1891us;1722us;1891us;1725us;1891us;1728us;1891us;1731us;1891us;1737us;1891us;1740us;1891us;1741us;1891us;1743us;1891us;1744us;1891us;1747us;1891us;1751us;1891us;1754us;1891us;1756us;1891us;1759us;1891us;1762us;1891us;1764us;1891us;1774us;1891us;1780us;1891us;1786us;1891us;1789us;1891us;1856us;1891us;1860us;1891us;1866us;1891us;1876us;1891us;1882us;1891us;1884us;1891us;1893us;887us;1909us;1891us;1911us;1891us;1922us;1891us;2053us;887us;2057us;887us;1us;65535us;881us;882us;4us;65535us;885us;886us;1769us;884us;1864us;884us;1937us;884us;3us;65535us;1769us;1770us;1864us;1865us;1937us;1938us;210us;65535us;6us;1479us;31us;1479us;117us;1479us;119us;1479us;242us;1479us;256us;1479us;279us;1479us;336us;1479us;340us;1479us;345us;1479us;424us;982us;427us;1479us;429us;982us;432us;1479us;471us;982us;474us;1479us;497us;1479us;531us;1479us;701us;1479us;713us;1479us;774us;1479us;780us;1479us;829us;982us;832us;1479us;836us;1479us;846us;1479us;892us;982us;911us;982us;914us;982us;915us;982us;920us;982us;921us;982us;924us;982us;926us;982us;927us;982us;936us;982us;940us;982us;941us;982us;943us;982us;945us;982us;948us;982us;950us;982us;956us;982us;960us;982us;962us;982us;964us;982us;972us;982us;975us;982us;986us;982us;994us;982us;1015us;982us;1018us;982us;1024us;982us;1025us;982us;1028us;982us;1029us;982us;1032us;982us;1034us;982us;1035us;982us;1041us;982us;1045us;982us;1047us;1479us;1053us;1479us;1069us;1479us;1071us;1479us;1074us;1479us;1077us;1479us;1095us;982us;1096us;1479us;1100us;982us;1101us;1479us;1107us;1479us;1110us;1479us;1113us;1479us;1119us;1479us;1123us;1479us;1127us;1479us;1133us;1479us;1135us;1479us;1140us;1479us;1142us;1479us;1144us;1479us;1146us;1479us;1148us;1479us;1150us;1479us;1152us;982us;1154us;1479us;1164us;1479us;1171us;1479us;1177us;1479us;1179us;1479us;1183us;982us;1184us;1479us;1188us;1479us;1190us;982us;1191us;1479us;1195us;1479us;1198us;1479us;1201us;1479us;1203us;1479us;1206us;1479us;1208us;1479us;1257us;1479us;1259us;1479us;1263us;1479us;1265us;1479us;1267us;1479us;1269us;1479us;1271us;1479us;1273us;1479us;1275us;1479us;1277us;1479us;1279us;1479us;1281us;1479us;1283us;1479us;1285us;1479us;1287us;1479us;1289us;1479us;1291us;1479us;1293us;1479us;1295us;1479us;1297us;1479us;1299us;1479us;1301us;1479us;1303us;1479us;1304us;1479us;1305us;1479us;1306us;1479us;1309us;1479us;1319us;1479us;1322us;982us;1324us;982us;1330us;982us;1332us;982us;1339us;982us;1341us;982us;1343us;982us;1348us;1479us;1349us;1479us;1353us;1479us;1355us;1479us;1358us;1479us;1359us;1479us;1361us;1479us;1364us;1479us;1366us;1479us;1368us;1479us;1370us;1479us;1372us;1479us;1373us;1479us;1374us;1479us;1375us;1479us;1377us;1479us;1378us;1479us;1380us;1479us;1381us;1479us;1383us;1479us;1384us;1479us;1386us;1479us;1387us;1479us;1389us;1479us;1390us;1479us;1392us;1479us;1393us;1479us;1399us;1479us;1400us;1479us;1407us;1479us;1409us;1479us;1411us;1479us;1412us;1479us;1413us;1479us;1416us;1479us;1421us;1479us;1429us;1479us;1430us;1479us;1433us;1479us;1434us;1479us;1452us;1479us;1459us;1479us;1466us;1479us;1473us;1479us;1490us;1479us;1497us;1479us;1498us;1479us;1504us;1479us;1510us;1479us;1511us;1479us;1512us;1479us;1524us;1479us;1530us;1479us;1540us;1479us;1553us;1479us;1555us;1479us;1558us;1479us;1559us;1479us;1565us;1479us;1580us;1479us;1585us;1479us;1590us;1479us;1615us;1479us;1648us;1479us;1655us;982us;1657us;1479us;1660us;982us;1662us;1479us;1672us;982us;1674us;982us;1893us;1479us;2053us;1479us;2057us;1479us;3us;65535us;424us;425us;429us;430us;829us;830us;1us;65535us;370us;371us;1us;65535us;370us;891us;36us;65535us;890us;914us;893us;1018us;897us;1332us;898us;1341us;900us;914us;901us;914us;902us;914us;903us;914us;904us;914us;905us;914us;906us;914us;907us;914us;908us;914us;909us;914us;910us;914us;937us;1018us;1001us;1018us;1002us;1018us;1003us;1018us;1004us;1018us;1005us;1018us;1006us;1018us;1007us;1018us;1008us;1018us;1009us;1018us;1010us;1018us;1011us;1018us;1012us;1018us;1013us;1018us;1014us;1018us;1085us;1343us;1322us;1330us;1324us;1330us;1338us;1339us;1672us;1330us;1674us;1330us;14us;65535us;424us;890us;429us;890us;829us;890us;914us;900us;915us;901us;920us;902us;921us;903us;924us;904us;926us;905us;927us;906us;1095us;907us;1100us;908us;1183us;909us;1190us;910us;14us;65535us;424us;917us;429us;917us;829us;917us;914us;917us;915us;917us;920us;917us;921us;917us;924us;917us;926us;917us;927us;917us;1095us;917us;1100us;917us;1183us;917us;1190us;917us;14us;65535us;424us;918us;429us;918us;829us;918us;914us;918us;915us;918us;920us;918us;921us;918us;924us;918us;926us;918us;927us;918us;1095us;918us;1100us;918us;1183us;918us;1190us;918us;3us;65535us;930us;931us;932us;933us;956us;957us;3us;65535us;930us;928us;932us;928us;956us;928us;43us;65535us;424us;919us;429us;919us;829us;919us;892us;1027us;911us;912us;914us;919us;915us;919us;920us;919us;921us;919us;924us;919us;926us;919us;927us;919us;936us;1027us;956us;1027us;972us;1027us;975us;1027us;986us;1027us;994us;1027us;1015us;1016us;1018us;1027us;1024us;1027us;1025us;1027us;1028us;1027us;1029us;1027us;1032us;1027us;1034us;1027us;1035us;1027us;1041us;1027us;1045us;1027us;1095us;919us;1100us;919us;1152us;1027us;1183us;919us;1190us;919us;1322us;1027us;1324us;1027us;1330us;1027us;1332us;1027us;1339us;1027us;1341us;1027us;1343us;1027us;1672us;1027us;1674us;1027us;6us;65535us;940us;947us;941us;942us;943us;944us;945us;946us;948us;949us;950us;951us;11us;65535us;940us;959us;941us;959us;943us;959us;945us;959us;948us;959us;950us;959us;960us;961us;962us;963us;964us;965us;1655us;1656us;1660us;1661us;55us;65535us;424us;955us;429us;955us;471us;472us;829us;955us;892us;955us;911us;955us;914us;955us;915us;955us;920us;955us;921us;955us;924us;955us;926us;955us;927us;955us;936us;955us;940us;960us;941us;960us;943us;960us;945us;960us;948us;960us;950us;960us;956us;955us;960us;960us;962us;960us;964us;960us;972us;955us;975us;955us;986us;955us;994us;955us;1015us;955us;1018us;955us;1024us;955us;1025us;955us;1028us;955us;1029us;955us;1032us;955us;1034us;955us;1035us;955us;1041us;955us;1045us;955us;1095us;955us;1100us;955us;1152us;955us;1183us;955us;1190us;955us;1322us;955us;1324us;955us;1330us;955us;1332us;955us;1339us;955us;1341us;955us;1343us;955us;1655us;960us;1660us;960us;1672us;955us;1674us;955us;2us;65535us;956us;987us;986us;987us;27us;65535us;892us;893us;936us;937us;956us;1001us;972us;1012us;975us;1012us;986us;1001us;994us;1009us;1018us;1002us;1024us;1003us;1025us;1004us;1028us;1005us;1029us;1006us;1032us;1007us;1034us;1008us;1035us;1010us;1041us;1011us;1045us;1012us;1152us;1013us;1322us;1014us;1324us;1014us;1330us;1014us;1332us;1014us;1339us;1014us;1341us;1014us;1343us;1014us;1672us;1014us;1674us;1014us;27us;65535us;892us;1019us;936us;1019us;956us;1019us;972us;1019us;975us;1019us;986us;1019us;994us;995us;1018us;1019us;1024us;1019us;1025us;1019us;1028us;1019us;1029us;1019us;1032us;1019us;1034us;1019us;1035us;1019us;1041us;1019us;1045us;1019us;1152us;1019us;1322us;1019us;1324us;1019us;1330us;1019us;1332us;1019us;1339us;1019us;1341us;1019us;1343us;1019us;1672us;1019us;1674us;1019us;27us;65535us;892us;1020us;936us;1020us;956us;1020us;972us;1020us;975us;1020us;986us;1020us;994us;1020us;1018us;1020us;1024us;1020us;1025us;1020us;1028us;1020us;1029us;1020us;1032us;1020us;1034us;1020us;1035us;1020us;1041us;1020us;1045us;1020us;1152us;1020us;1322us;1020us;1324us;1020us;1330us;1020us;1332us;1020us;1339us;1020us;1341us;1020us;1343us;1020us;1672us;1020us;1674us;1020us;2us;65535us;967us;968us;1038us;1039us;2us;65535us;967us;1036us;1038us;1036us;3us;65535us;972us;973us;975us;976us;1045us;1046us;27us;65535us;279us;1111us;427us;428us;432us;433us;474us;475us;497us;498us;774us;775us;780us;781us;846us;847us;1077us;1111us;1096us;1097us;1101us;1102us;1110us;1111us;1113us;1114us;1133us;1134us;1154us;1155us;1164us;1165us;1171us;1172us;1184us;1185us;1188us;1189us;1191us;1192us;1195us;1196us;1201us;1202us;1203us;1204us;1309us;1310us;1355us;1356us;1359us;1360us;1657us;1658us;6us;65535us;1144us;1145us;1146us;1147us;1259us;1260us;1585us;1586us;1590us;1591us;1615us;1616us;5us;65535us;1127us;1128us;1208us;1209us;1349us;1350us;1553us;1554us;1662us;1663us;52us;65535us;6us;1066us;279us;1052us;427us;1052us;432us;1052us;474us;1052us;497us;1052us;774us;1052us;780us;1052us;832us;841us;836us;841us;846us;1052us;1047us;1048us;1053us;1054us;1074us;1075us;1077us;1052us;1096us;1052us;1101us;1052us;1107us;1108us;1110us;1052us;1113us;1052us;1119us;1120us;1123us;1124us;1127us;1058us;1133us;1052us;1154us;1052us;1164us;1052us;1171us;1052us;1184us;1052us;1188us;1052us;1191us;1052us;1195us;1052us;1198us;1199us;1201us;1052us;1203us;1052us;1208us;1058us;1309us;1052us;1319us;1320us;1349us;1058us;1355us;1052us;1359us;1052us;1466us;1471us;1473us;1474us;1490us;1491us;1497us;1499us;1498us;1499us;1510us;1532us;1511us;1532us;1512us;1532us;1530us;1531us;1553us;1058us;1657us;1052us;1662us;1058us;1us;65535us;6us;7us;57us;65535us;6us;1062us;279us;1062us;427us;1062us;432us;1062us;474us;1062us;497us;1062us;774us;1062us;780us;1062us;832us;1062us;836us;1062us;846us;1062us;1047us;1062us;1053us;1062us;1069us;1070us;1071us;1072us;1074us;1062us;1077us;1062us;1096us;1062us;1101us;1062us;1107us;1062us;1110us;1062us;1113us;1062us;1119us;1062us;1123us;1062us;1127us;1062us;1133us;1062us;1154us;1062us;1164us;1062us;1171us;1062us;1184us;1062us;1188us;1062us;1191us;1062us;1195us;1062us;1198us;1062us;1201us;1062us;1203us;1062us;1208us;1062us;1309us;1062us;1319us;1062us;1349us;1062us;1355us;1062us;1359us;1062us;1452us;1550us;1466us;1062us;1473us;1062us;1490us;1062us;1497us;1062us;1498us;1062us;1504us;1551us;1510us;1062us;1511us;1062us;1512us;1062us;1530us;1062us;1540us;1552us;1553us;1062us;1657us;1062us;1662us;1062us;204us;65535us;56us;59us;61us;63us;78us;81us;156us;158us;162us;164us;166us;168us;170us;172us;193us;195us;214us;217us;247us;250us;289us;290us;292us;294us;295us;297us;302us;304us;305us;307us;312us;314us;322us;2098us;324us;2098us;372us;375us;380us;383us;394us;2098us;400us;401us;404us;405us;431us;2098us;447us;450us;451us;454us;471us;479us;473us;2098us;485us;491us;486us;490us;487us;489us;494us;502us;496us;2098us;503us;505us;528us;2098us;536us;538us;544us;546us;553us;558us;570us;571us;581us;583us;591us;593us;601us;606us;689us;691us;692us;698us;695us;697us;701us;703us;713us;716us;719us;724us;728us;730us;734us;736us;749us;755us;750us;754us;751us;753us;760us;763us;765us;767us;778us;789us;781us;789us;831us;835us;837us;839us;911us;913us;915us;2098us;920us;2098us;921us;2098us;924us;2098us;934us;939us;935us;939us;936us;938us;952us;954us;956us;992us;986us;992us;987us;989us;994us;1000us;995us;997us;1013us;1176us;1015us;1017us;1021us;1023us;1025us;1026us;1028us;2098us;1029us;2098us;1032us;2098us;1040us;1043us;1041us;1042us;1048us;1050us;1063us;1065us;1102us;789us;1120us;1122us;1124us;1126us;1127us;1060us;1128us;1130us;1135us;1139us;1136us;1138us;1148us;1316us;1150us;1316us;1152us;2098us;1153us;2098us;1154us;2098us;1155us;2098us;1163us;1170us;1164us;1169us;1165us;1167us;1177us;1181us;1179us;1182us;1192us;789us;1204us;789us;1208us;1060us;1233us;1315us;1237us;1363us;1248us;1250us;1251us;1253us;1254us;1256us;1262us;1461us;1263us;2098us;1265us;2098us;1267us;2098us;1269us;2098us;1271us;2098us;1273us;2098us;1275us;2098us;1277us;2098us;1279us;2098us;1281us;2098us;1283us;2098us;1285us;2098us;1287us;2098us;1289us;2098us;1291us;2098us;1293us;2098us;1295us;2098us;1297us;2098us;1299us;2098us;1301us;2098us;1310us;1312us;1324us;1328us;1325us;1327us;1337us;1347us;1338us;1346us;1339us;1345us;1349us;1060us;1353us;1354us;1355us;1357us;1364us;2098us;1366us;2098us;1368us;2098us;1370us;2098us;1403us;1465us;1419us;1424us;1420us;1424us;1421us;1423us;1440us;1465us;1443us;1465us;1452us;1457us;1453us;1455us;1473us;1478us;1474us;1476us;1491us;1493us;1497us;1503us;1498us;1503us;1499us;1501us;1504us;1509us;1505us;1507us;1510us;1523us;1511us;1523us;1512us;1523us;1514us;2092us;1540us;1545us;1541us;1543us;1553us;1060us;1555us;2098us;1585us;1589us;1614us;2098us;1615us;2098us;1648us;1653us;1649us;1651us;1662us;1061us;1663us;1665us;1681us;1683us;1685us;1687us;1689us;1691us;1695us;1697us;1702us;1704us;1707us;1709us;1711us;1713us;1716us;1718us;1722us;1724us;1728us;1730us;1737us;1739us;1743us;1746us;1744us;1746us;1747us;1749us;1751us;1753us;1756us;1758us;1859us;1914us;1877us;1880us;1878us;1880us;1882us;1890us;1883us;1889us;1884us;1888us;1885us;1887us;1904us;2098us;1909us;1920us;1911us;2098us;1916us;2098us;1958us;2098us;2008us;2098us;4us;65535us;1098us;1099us;1104us;1105us;1187us;1188us;1194us;1195us;116us;65535us;6us;1068us;31us;32us;117us;118us;119us;120us;242us;257us;256us;257us;279us;1068us;427us;1068us;432us;1068us;474us;1068us;497us;1068us;774us;1068us;780us;1068us;832us;1068us;836us;1068us;846us;1068us;1047us;1068us;1053us;1068us;1069us;1068us;1071us;1068us;1074us;1068us;1077us;1068us;1096us;1068us;1101us;1068us;1107us;1068us;1110us;1068us;1113us;1068us;1119us;1068us;1123us;1068us;1127us;1068us;1133us;1068us;1135us;1136us;1140us;1141us;1142us;1143us;1144us;1057us;1146us;1057us;1148us;1233us;1150us;1233us;1154us;1068us;1164us;1068us;1171us;1068us;1177us;1178us;1179us;1180us;1184us;1068us;1188us;1068us;1191us;1068us;1195us;1068us;1198us;1068us;1201us;1068us;1203us;1068us;1206us;1207us;1208us;1068us;1257us;1210us;1259us;1057us;1263us;1211us;1265us;1212us;1267us;1213us;1269us;1214us;1271us;1215us;1273us;1216us;1275us;1217us;1277us;1218us;1279us;1219us;1281us;1220us;1283us;1221us;1285us;1222us;1287us;1223us;1289us;1224us;1291us;1225us;1293us;1226us;1295us;1227us;1297us;1228us;1299us;1229us;1301us;1230us;1303us;1231us;1304us;1232us;1305us;1232us;1306us;1232us;1309us;1068us;1319us;1068us;1348us;1234us;1349us;1068us;1353us;1235us;1355us;1068us;1358us;1236us;1359us;1068us;1361us;1237us;1364us;1238us;1366us;1239us;1368us;1240us;1370us;1242us;1452us;1068us;1459us;1241us;1466us;1068us;1473us;1068us;1490us;1068us;1497us;1068us;1498us;1068us;1504us;1068us;1510us;1068us;1511us;1068us;1512us;1068us;1524us;1243us;1530us;1068us;1540us;1068us;1553us;1068us;1555us;1244us;1558us;1245us;1559us;1246us;1585us;1057us;1590us;1057us;1615us;1057us;1657us;1068us;1662us;1068us;2053us;1247us;2057us;1247us;2us;65535us;1148us;1149us;1150us;1151us;1us;65535us;1448us;1449us;4us;65535us;1120us;1121us;1124us;1125us;1128us;1129us;1131us;1132us;4us;65535us;1322us;1323us;1324us;1325us;1672us;1673us;1674us;1675us;9us;65535us;1322us;1337us;1324us;1337us;1330us;1337us;1332us;1337us;1339us;1337us;1341us;1337us;1343us;1337us;1672us;1337us;1674us;1337us;9us;65535us;1322us;1329us;1324us;1329us;1330us;1331us;1332us;1333us;1339us;1340us;1341us;1342us;1343us;1344us;1672us;1329us;1674us;1329us;1us;65535us;1014us;1336us;1us;65535us;1337us;1338us;2us;65535us;1136us;1137us;1237us;1362us;2us;65535us;1136us;1351us;1237us;1351us;1us;65535us;1351us;1352us;116us;65535us;6us;1261us;31us;1261us;117us;1261us;119us;1261us;242us;1261us;256us;1261us;279us;1261us;427us;1261us;432us;1261us;474us;1261us;497us;1261us;774us;1261us;780us;1261us;832us;1261us;836us;1261us;846us;1261us;1047us;1261us;1053us;1261us;1069us;1261us;1071us;1261us;1074us;1261us;1077us;1261us;1096us;1261us;1101us;1261us;1107us;1261us;1110us;1261us;1113us;1261us;1119us;1261us;1123us;1261us;1127us;1261us;1133us;1261us;1135us;1261us;1140us;1261us;1142us;1261us;1144us;1261us;1146us;1261us;1148us;1261us;1150us;1261us;1154us;1261us;1164us;1261us;1171us;1261us;1177us;1261us;1179us;1261us;1184us;1261us;1188us;1261us;1191us;1261us;1195us;1261us;1198us;1261us;1201us;1261us;1203us;1261us;1206us;1261us;1208us;1261us;1257us;1261us;1259us;1261us;1263us;1261us;1265us;1261us;1267us;1261us;1269us;1261us;1271us;1261us;1273us;1261us;1275us;1261us;1277us;1261us;1279us;1261us;1281us;1261us;1283us;1261us;1285us;1261us;1287us;1261us;1289us;1261us;1291us;1261us;1293us;1261us;1295us;1261us;1297us;1261us;1299us;1261us;1301us;1261us;1303us;1261us;1304us;1261us;1305us;1261us;1306us;1261us;1309us;1261us;1319us;1261us;1348us;1261us;1349us;1261us;1353us;1261us;1355us;1261us;1358us;1261us;1359us;1261us;1361us;1261us;1364us;1261us;1366us;1261us;1368us;1261us;1370us;1261us;1452us;1261us;1459us;1262us;1466us;1261us;1473us;1261us;1490us;1261us;1497us;1261us;1498us;1261us;1504us;1261us;1510us;1261us;1511us;1261us;1512us;1261us;1524us;1261us;1530us;1261us;1540us;1261us;1553us;1261us;1555us;1261us;1558us;1261us;1559us;1261us;1585us;1261us;1590us;1261us;1615us;1261us;1657us;1261us;1662us;1261us;2053us;1261us;2057us;1261us;134us;65535us;6us;1258us;31us;1258us;117us;1258us;119us;1258us;242us;1258us;256us;1258us;279us;1258us;427us;1258us;432us;1258us;474us;1258us;497us;1258us;774us;1258us;780us;1258us;832us;1258us;836us;1258us;846us;1258us;1047us;1258us;1053us;1258us;1069us;1258us;1071us;1258us;1074us;1258us;1077us;1258us;1096us;1258us;1101us;1258us;1107us;1258us;1110us;1258us;1113us;1258us;1119us;1258us;1123us;1258us;1127us;1258us;1133us;1258us;1135us;1258us;1140us;1258us;1142us;1258us;1144us;1258us;1146us;1258us;1148us;1258us;1150us;1258us;1154us;1258us;1164us;1258us;1171us;1258us;1177us;1258us;1179us;1258us;1184us;1258us;1188us;1258us;1191us;1258us;1195us;1258us;1198us;1258us;1201us;1258us;1203us;1258us;1206us;1258us;1208us;1258us;1257us;1258us;1259us;1258us;1263us;1258us;1265us;1258us;1267us;1258us;1269us;1258us;1271us;1258us;1273us;1258us;1275us;1258us;1277us;1258us;1279us;1258us;1281us;1258us;1283us;1258us;1285us;1258us;1287us;1258us;1289us;1258us;1291us;1258us;1293us;1258us;1295us;1258us;1297us;1258us;1299us;1258us;1301us;1258us;1303us;1258us;1304us;1258us;1305us;1258us;1306us;1258us;1309us;1258us;1319us;1258us;1348us;1258us;1349us;1258us;1353us;1258us;1355us;1258us;1358us;1258us;1359us;1258us;1361us;1258us;1364us;1258us;1366us;1258us;1368us;1258us;1370us;1258us;1372us;1376us;1373us;1376us;1374us;1376us;1375us;1376us;1377us;1379us;1378us;1379us;1380us;1382us;1381us;1382us;1383us;1385us;1384us;1385us;1386us;1388us;1387us;1388us;1389us;1391us;1390us;1391us;1392us;1394us;1393us;1394us;1407us;1408us;1409us;1410us;1452us;1258us;1459us;1258us;1466us;1258us;1473us;1258us;1490us;1258us;1497us;1258us;1498us;1258us;1504us;1258us;1510us;1258us;1511us;1258us;1512us;1258us;1524us;1258us;1530us;1258us;1540us;1258us;1553us;1258us;1555us;1258us;1558us;1258us;1559us;1258us;1585us;1258us;1590us;1258us;1615us;1258us;1657us;1258us;1662us;1258us;2053us;1258us;2057us;1258us;135us;65535us;6us;1411us;31us;1411us;117us;1411us;119us;1411us;242us;1411us;256us;1411us;279us;1411us;427us;1411us;432us;1411us;474us;1411us;497us;1411us;774us;1411us;780us;1411us;832us;1411us;836us;1411us;846us;1411us;1047us;1411us;1053us;1411us;1069us;1411us;1071us;1411us;1074us;1411us;1077us;1411us;1096us;1411us;1101us;1411us;1107us;1411us;1110us;1411us;1113us;1411us;1119us;1411us;1123us;1411us;1127us;1411us;1133us;1411us;1135us;1411us;1140us;1411us;1142us;1411us;1144us;1411us;1146us;1411us;1148us;1411us;1150us;1411us;1154us;1411us;1164us;1411us;1171us;1411us;1177us;1411us;1179us;1411us;1184us;1411us;1188us;1411us;1191us;1411us;1195us;1411us;1198us;1411us;1201us;1411us;1203us;1411us;1206us;1411us;1208us;1411us;1257us;1411us;1259us;1411us;1263us;1411us;1265us;1411us;1267us;1411us;1269us;1411us;1271us;1411us;1273us;1411us;1275us;1411us;1277us;1411us;1279us;1411us;1281us;1411us;1283us;1411us;1285us;1411us;1287us;1411us;1289us;1411us;1291us;1411us;1293us;1411us;1295us;1411us;1297us;1411us;1299us;1411us;1301us;1411us;1303us;1411us;1304us;1411us;1305us;1411us;1306us;1411us;1309us;1411us;1319us;1411us;1348us;1411us;1349us;1411us;1353us;1411us;1355us;1411us;1358us;1411us;1359us;1411us;1361us;1411us;1364us;1411us;1366us;1411us;1368us;1411us;1370us;1411us;1372us;1411us;1373us;1411us;1374us;1411us;1375us;1411us;1377us;1411us;1378us;1411us;1380us;1411us;1381us;1411us;1383us;1411us;1384us;1411us;1386us;1411us;1387us;1411us;1389us;1411us;1390us;1411us;1392us;1411us;1393us;1411us;1407us;1411us;1409us;1411us;1452us;1411us;1459us;1411us;1466us;1411us;1473us;1411us;1490us;1411us;1497us;1411us;1498us;1411us;1504us;1411us;1510us;1411us;1511us;1411us;1512us;1411us;1524us;1411us;1530us;1411us;1540us;1412us;1553us;1411us;1555us;1411us;1558us;1411us;1559us;1411us;1585us;1411us;1590us;1411us;1615us;1411us;1648us;1413us;1657us;1411us;1662us;1411us;2053us;1411us;2057us;1411us;4us;65535us;1411us;1414us;1412us;1414us;1413us;1414us;1565us;1568us;148us;65535us;6us;1415us;31us;1415us;117us;1415us;119us;1415us;242us;1415us;256us;1415us;279us;1415us;427us;1415us;432us;1415us;474us;1415us;497us;1415us;701us;702us;713us;714us;774us;1415us;780us;1415us;832us;1415us;836us;1415us;846us;1415us;1047us;1415us;1053us;1415us;1069us;1415us;1071us;1415us;1074us;1415us;1077us;1415us;1096us;1415us;1101us;1415us;1107us;1415us;1110us;1415us;1113us;1415us;1119us;1415us;1123us;1415us;1127us;1415us;1133us;1415us;1135us;1415us;1140us;1415us;1142us;1415us;1144us;1415us;1146us;1415us;1148us;1415us;1150us;1415us;1154us;1415us;1164us;1415us;1171us;1415us;1177us;1415us;1179us;1415us;1184us;1415us;1188us;1415us;1191us;1415us;1195us;1415us;1198us;1415us;1201us;1415us;1203us;1415us;1206us;1415us;1208us;1415us;1257us;1415us;1259us;1415us;1263us;1415us;1265us;1415us;1267us;1415us;1269us;1415us;1271us;1415us;1273us;1415us;1275us;1415us;1277us;1415us;1279us;1415us;1281us;1415us;1283us;1415us;1285us;1415us;1287us;1415us;1289us;1415us;1291us;1415us;1293us;1415us;1295us;1415us;1297us;1415us;1299us;1415us;1301us;1415us;1303us;1415us;1304us;1415us;1305us;1415us;1306us;1415us;1309us;1415us;1319us;1415us;1348us;1415us;1349us;1415us;1353us;1415us;1355us;1415us;1358us;1415us;1359us;1415us;1361us;1415us;1364us;1415us;1366us;1415us;1368us;1415us;1370us;1415us;1372us;1415us;1373us;1415us;1374us;1415us;1375us;1415us;1377us;1415us;1378us;1415us;1380us;1415us;1381us;1415us;1383us;1415us;1384us;1415us;1386us;1415us;1387us;1415us;1389us;1415us;1390us;1415us;1392us;1415us;1393us;1415us;1407us;1415us;1409us;1415us;1411us;1418us;1412us;1418us;1413us;1418us;1416us;1417us;1421us;1422us;1429us;1425us;1430us;1426us;1433us;1427us;1434us;1427us;1452us;1415us;1459us;1415us;1466us;1415us;1473us;1415us;1490us;1415us;1497us;1415us;1498us;1415us;1504us;1415us;1510us;1415us;1511us;1415us;1512us;1415us;1524us;1415us;1530us;1415us;1540us;1415us;1553us;1415us;1555us;1415us;1558us;1415us;1559us;1415us;1565us;1418us;1585us;1415us;1590us;1415us;1615us;1415us;1648us;1415us;1657us;1415us;1662us;1415us;1893us;1428us;2053us;1415us;2057us;1415us;3us;65535us;1403us;1404us;1440us;1441us;1443us;1444us;155us;65535us;6us;1462us;31us;1462us;117us;1462us;119us;1462us;242us;1462us;256us;1462us;279us;1462us;336us;1569us;340us;1569us;345us;1569us;427us;1462us;432us;1462us;474us;1462us;497us;1462us;531us;532us;701us;1462us;713us;1462us;774us;1462us;780us;1462us;832us;1462us;836us;1462us;846us;1462us;1047us;1462us;1053us;1462us;1069us;1462us;1071us;1462us;1074us;1462us;1077us;1462us;1096us;1462us;1101us;1462us;1107us;1462us;1110us;1462us;1113us;1462us;1119us;1462us;1123us;1462us;1127us;1462us;1133us;1462us;1135us;1462us;1140us;1462us;1142us;1462us;1144us;1462us;1146us;1462us;1148us;1462us;1150us;1462us;1154us;1462us;1164us;1462us;1171us;1462us;1177us;1462us;1179us;1462us;1184us;1462us;1188us;1462us;1191us;1462us;1195us;1462us;1198us;1462us;1201us;1462us;1203us;1462us;1206us;1462us;1208us;1462us;1257us;1462us;1259us;1462us;1263us;1462us;1265us;1462us;1267us;1462us;1269us;1462us;1271us;1462us;1273us;1462us;1275us;1462us;1277us;1462us;1279us;1462us;1281us;1462us;1283us;1462us;1285us;1462us;1287us;1462us;1289us;1462us;1291us;1462us;1293us;1462us;1295us;1462us;1297us;1462us;1299us;1462us;1301us;1462us;1303us;1462us;1304us;1462us;1305us;1462us;1306us;1462us;1309us;1462us;1319us;1462us;1348us;1462us;1349us;1462us;1353us;1462us;1355us;1462us;1358us;1462us;1359us;1462us;1361us;1462us;1364us;1462us;1366us;1462us;1368us;1462us;1370us;1462us;1372us;1462us;1373us;1462us;1374us;1462us;1375us;1462us;1377us;1462us;1378us;1462us;1380us;1462us;1381us;1462us;1383us;1462us;1384us;1462us;1386us;1462us;1387us;1462us;1389us;1462us;1390us;1462us;1392us;1462us;1393us;1462us;1399us;1401us;1400us;1402us;1407us;1462us;1409us;1462us;1411us;1462us;1412us;1462us;1413us;1462us;1416us;1462us;1421us;1462us;1429us;1462us;1430us;1462us;1433us;1462us;1434us;1462us;1452us;1462us;1459us;1462us;1466us;1462us;1473us;1462us;1490us;1462us;1497us;1462us;1498us;1462us;1504us;1462us;1510us;1462us;1511us;1462us;1512us;1462us;1524us;1462us;1530us;1462us;1540us;1462us;1553us;1462us;1555us;1462us;1558us;1462us;1559us;1462us;1565us;1462us;1580us;1569us;1585us;1462us;1590us;1462us;1615us;1462us;1648us;1462us;1657us;1462us;1662us;1462us;1893us;1462us;2053us;1462us;2057us;1462us;155us;65535us;6us;1489us;31us;1489us;117us;1489us;119us;1489us;242us;1489us;256us;1489us;279us;1489us;336us;1489us;340us;1489us;345us;1489us;427us;1489us;432us;1489us;474us;1489us;497us;1489us;531us;1489us;701us;1489us;713us;1489us;774us;1489us;780us;1489us;832us;1489us;836us;1489us;846us;1489us;1047us;1489us;1053us;1489us;1069us;1489us;1071us;1489us;1074us;1489us;1077us;1489us;1096us;1489us;1101us;1489us;1107us;1489us;1110us;1489us;1113us;1489us;1119us;1489us;1123us;1489us;1127us;1489us;1133us;1489us;1135us;1489us;1140us;1489us;1142us;1489us;1144us;1489us;1146us;1489us;1148us;1489us;1150us;1489us;1154us;1489us;1164us;1489us;1171us;1489us;1177us;1489us;1179us;1489us;1184us;1489us;1188us;1489us;1191us;1489us;1195us;1489us;1198us;1489us;1201us;1489us;1203us;1489us;1206us;1489us;1208us;1489us;1257us;1489us;1259us;1489us;1263us;1489us;1265us;1489us;1267us;1489us;1269us;1489us;1271us;1489us;1273us;1489us;1275us;1489us;1277us;1489us;1279us;1489us;1281us;1489us;1283us;1489us;1285us;1489us;1287us;1489us;1289us;1489us;1291us;1489us;1293us;1489us;1295us;1489us;1297us;1489us;1299us;1489us;1301us;1489us;1303us;1489us;1304us;1489us;1305us;1489us;1306us;1489us;1309us;1489us;1319us;1489us;1348us;1489us;1349us;1489us;1353us;1489us;1355us;1489us;1358us;1489us;1359us;1489us;1361us;1489us;1364us;1489us;1366us;1489us;1368us;1489us;1370us;1489us;1372us;1489us;1373us;1489us;1374us;1489us;1375us;1489us;1377us;1489us;1378us;1489us;1380us;1489us;1381us;1489us;1383us;1489us;1384us;1489us;1386us;1489us;1387us;1489us;1389us;1489us;1390us;1489us;1392us;1489us;1393us;1489us;1399us;1489us;1400us;1489us;1407us;1489us;1409us;1489us;1411us;1489us;1412us;1489us;1413us;1489us;1416us;1489us;1421us;1489us;1429us;1489us;1430us;1489us;1433us;1489us;1434us;1489us;1452us;1489us;1459us;1489us;1466us;1489us;1473us;1489us;1490us;1489us;1497us;1489us;1498us;1489us;1504us;1489us;1510us;1489us;1511us;1489us;1512us;1489us;1524us;1489us;1530us;1489us;1540us;1489us;1553us;1489us;1555us;1489us;1558us;1489us;1559us;1489us;1565us;1489us;1580us;1489us;1585us;1489us;1590us;1489us;1615us;1489us;1648us;1489us;1657us;1489us;1662us;1489us;1893us;1489us;2053us;1489us;2057us;1489us;210us;65535us;6us;1487us;31us;1487us;117us;1487us;119us;1487us;242us;1487us;256us;1487us;279us;1487us;336us;1487us;340us;1487us;345us;1487us;424us;966us;427us;1487us;429us;966us;432us;1487us;471us;966us;474us;1487us;497us;1487us;531us;1487us;701us;1487us;713us;1487us;774us;1487us;780us;1487us;829us;966us;832us;1487us;836us;1487us;846us;1487us;892us;966us;911us;966us;914us;966us;915us;966us;920us;966us;921us;966us;924us;966us;926us;966us;927us;966us;936us;966us;940us;966us;941us;966us;943us;966us;945us;966us;948us;966us;950us;966us;956us;966us;960us;966us;962us;966us;964us;966us;972us;966us;975us;966us;986us;966us;994us;966us;1015us;966us;1018us;966us;1024us;966us;1025us;966us;1028us;966us;1029us;966us;1032us;966us;1034us;966us;1035us;966us;1041us;966us;1045us;966us;1047us;1487us;1053us;1487us;1069us;1487us;1071us;1487us;1074us;1487us;1077us;1487us;1095us;966us;1096us;1487us;1100us;966us;1101us;1487us;1107us;1487us;1110us;1487us;1113us;1487us;1119us;1487us;1123us;1487us;1127us;1487us;1133us;1487us;1135us;1487us;1140us;1487us;1142us;1487us;1144us;1487us;1146us;1487us;1148us;1487us;1150us;1487us;1152us;966us;1154us;1487us;1164us;1487us;1171us;1487us;1177us;1487us;1179us;1487us;1183us;966us;1184us;1487us;1188us;1487us;1190us;966us;1191us;1487us;1195us;1487us;1198us;1487us;1201us;1487us;1203us;1487us;1206us;1487us;1208us;1487us;1257us;1487us;1259us;1487us;1263us;1487us;1265us;1487us;1267us;1487us;1269us;1487us;1271us;1487us;1273us;1487us;1275us;1487us;1277us;1487us;1279us;1487us;1281us;1487us;1283us;1487us;1285us;1487us;1287us;1487us;1289us;1487us;1291us;1487us;1293us;1487us;1295us;1487us;1297us;1487us;1299us;1487us;1301us;1487us;1303us;1487us;1304us;1487us;1305us;1487us;1306us;1487us;1309us;1487us;1319us;1487us;1322us;966us;1324us;966us;1330us;966us;1332us;966us;1339us;966us;1341us;966us;1343us;966us;1348us;1487us;1349us;1487us;1353us;1487us;1355us;1487us;1358us;1487us;1359us;1487us;1361us;1487us;1364us;1487us;1366us;1487us;1368us;1487us;1370us;1487us;1372us;1487us;1373us;1487us;1374us;1487us;1375us;1487us;1377us;1487us;1378us;1487us;1380us;1487us;1381us;1487us;1383us;1487us;1384us;1487us;1386us;1487us;1387us;1487us;1389us;1487us;1390us;1487us;1392us;1487us;1393us;1487us;1399us;1487us;1400us;1487us;1407us;1487us;1409us;1487us;1411us;1487us;1412us;1487us;1413us;1487us;1416us;1487us;1421us;1487us;1429us;1487us;1430us;1487us;1433us;1487us;1434us;1487us;1452us;1487us;1459us;1487us;1466us;1487us;1473us;1487us;1490us;1487us;1497us;1487us;1498us;1487us;1504us;1487us;1510us;1487us;1511us;1487us;1512us;1487us;1524us;1487us;1530us;1487us;1540us;1487us;1553us;1487us;1555us;1487us;1558us;1487us;1559us;1487us;1565us;1487us;1580us;1487us;1585us;1487us;1590us;1487us;1615us;1487us;1648us;1487us;1655us;966us;1657us;1487us;1660us;966us;1662us;1487us;1672us;966us;1674us;966us;1893us;1487us;2053us;1487us;2057us;1487us;155us;65535us;6us;1488us;31us;1488us;117us;1488us;119us;1488us;242us;1488us;256us;1488us;279us;1488us;336us;1488us;340us;1488us;345us;1488us;427us;1488us;432us;1488us;474us;1488us;497us;1488us;531us;1488us;701us;1488us;713us;1488us;774us;1488us;780us;1488us;832us;1488us;836us;1488us;846us;1488us;1047us;1488us;1053us;1488us;1069us;1488us;1071us;1488us;1074us;1488us;1077us;1488us;1096us;1488us;1101us;1488us;1107us;1488us;1110us;1488us;1113us;1488us;1119us;1488us;1123us;1488us;1127us;1488us;1133us;1488us;1135us;1488us;1140us;1488us;1142us;1488us;1144us;1488us;1146us;1488us;1148us;1488us;1150us;1488us;1154us;1488us;1164us;1488us;1171us;1488us;1177us;1488us;1179us;1488us;1184us;1488us;1188us;1488us;1191us;1488us;1195us;1488us;1198us;1488us;1201us;1488us;1203us;1488us;1206us;1488us;1208us;1488us;1257us;1488us;1259us;1488us;1263us;1488us;1265us;1488us;1267us;1488us;1269us;1488us;1271us;1488us;1273us;1488us;1275us;1488us;1277us;1488us;1279us;1488us;1281us;1488us;1283us;1488us;1285us;1488us;1287us;1488us;1289us;1488us;1291us;1488us;1293us;1488us;1295us;1488us;1297us;1488us;1299us;1488us;1301us;1488us;1303us;1488us;1304us;1488us;1305us;1488us;1306us;1488us;1309us;1488us;1319us;1488us;1348us;1488us;1349us;1488us;1353us;1488us;1355us;1488us;1358us;1488us;1359us;1488us;1361us;1488us;1364us;1488us;1366us;1488us;1368us;1488us;1370us;1488us;1372us;1488us;1373us;1488us;1374us;1488us;1375us;1488us;1377us;1488us;1378us;1488us;1380us;1488us;1381us;1488us;1383us;1488us;1384us;1488us;1386us;1488us;1387us;1488us;1389us;1488us;1390us;1488us;1392us;1488us;1393us;1488us;1399us;1488us;1400us;1488us;1407us;1488us;1409us;1488us;1411us;1488us;1412us;1488us;1413us;1488us;1416us;1488us;1421us;1488us;1429us;1488us;1430us;1488us;1433us;1488us;1434us;1488us;1452us;1488us;1459us;1488us;1466us;1488us;1473us;1488us;1490us;1488us;1497us;1488us;1498us;1488us;1504us;1488us;1510us;1488us;1511us;1488us;1512us;1488us;1524us;1488us;1530us;1488us;1540us;1488us;1553us;1488us;1555us;1488us;1558us;1488us;1559us;1488us;1565us;1488us;1580us;1488us;1585us;1488us;1590us;1488us;1615us;1488us;1648us;1488us;1657us;1488us;1662us;1488us;1893us;1488us;2053us;1488us;2057us;1488us;155us;65535us;6us;1480us;31us;1480us;117us;1480us;119us;1480us;242us;1480us;256us;1480us;279us;1480us;336us;1480us;340us;1480us;345us;1480us;427us;1480us;432us;1480us;474us;1480us;497us;1480us;531us;1480us;701us;1480us;713us;1480us;774us;1480us;780us;1480us;832us;1480us;836us;1480us;846us;1480us;1047us;1480us;1053us;1480us;1069us;1480us;1071us;1480us;1074us;1480us;1077us;1480us;1096us;1480us;1101us;1480us;1107us;1480us;1110us;1480us;1113us;1480us;1119us;1480us;1123us;1480us;1127us;1480us;1133us;1480us;1135us;1480us;1140us;1480us;1142us;1480us;1144us;1480us;1146us;1480us;1148us;1480us;1150us;1480us;1154us;1480us;1164us;1480us;1171us;1480us;1177us;1480us;1179us;1480us;1184us;1480us;1188us;1480us;1191us;1480us;1195us;1480us;1198us;1480us;1201us;1480us;1203us;1480us;1206us;1480us;1208us;1480us;1257us;1480us;1259us;1480us;1263us;1480us;1265us;1480us;1267us;1480us;1269us;1480us;1271us;1480us;1273us;1480us;1275us;1480us;1277us;1480us;1279us;1480us;1281us;1480us;1283us;1480us;1285us;1480us;1287us;1480us;1289us;1480us;1291us;1480us;1293us;1480us;1295us;1480us;1297us;1480us;1299us;1480us;1301us;1480us;1303us;1480us;1304us;1480us;1305us;1480us;1306us;1480us;1309us;1480us;1319us;1480us;1348us;1480us;1349us;1480us;1353us;1480us;1355us;1480us;1358us;1480us;1359us;1480us;1361us;1480us;1364us;1480us;1366us;1480us;1368us;1480us;1370us;1480us;1372us;1480us;1373us;1480us;1374us;1480us;1375us;1480us;1377us;1480us;1378us;1480us;1380us;1480us;1381us;1480us;1383us;1480us;1384us;1480us;1386us;1480us;1387us;1480us;1389us;1480us;1390us;1480us;1392us;1480us;1393us;1480us;1399us;1480us;1400us;1480us;1407us;1480us;1409us;1480us;1411us;1480us;1412us;1480us;1413us;1480us;1416us;1480us;1421us;1480us;1429us;1480us;1430us;1480us;1433us;1480us;1434us;1480us;1452us;1480us;1459us;1480us;1466us;1480us;1473us;1480us;1490us;1480us;1497us;1480us;1498us;1480us;1504us;1480us;1510us;1480us;1511us;1480us;1512us;1480us;1524us;1480us;1530us;1480us;1540us;1480us;1553us;1480us;1555us;1480us;1558us;1480us;1559us;1480us;1565us;1480us;1580us;1480us;1585us;1480us;1590us;1480us;1615us;1480us;1648us;1480us;1657us;1480us;1662us;1480us;1893us;1480us;2053us;1480us;2057us;1480us;3us;65535us;1510us;1514us;1511us;1514us;1512us;1514us;3us;65535us;1510us;1526us;1511us;1526us;1512us;1526us;1us;65535us;1511us;1536us;155us;65535us;6us;1481us;31us;1481us;117us;1481us;119us;1481us;242us;1481us;256us;1481us;279us;1481us;336us;1481us;340us;1481us;345us;1481us;427us;1481us;432us;1481us;474us;1481us;497us;1481us;531us;1481us;701us;1481us;713us;1481us;774us;1481us;780us;1481us;832us;1481us;836us;1481us;846us;1481us;1047us;1481us;1053us;1481us;1069us;1481us;1071us;1481us;1074us;1481us;1077us;1481us;1096us;1481us;1101us;1481us;1107us;1481us;1110us;1481us;1113us;1481us;1119us;1481us;1123us;1481us;1127us;1481us;1133us;1481us;1135us;1481us;1140us;1481us;1142us;1481us;1144us;1481us;1146us;1481us;1148us;1481us;1150us;1481us;1154us;1481us;1164us;1481us;1171us;1481us;1177us;1481us;1179us;1481us;1184us;1481us;1188us;1481us;1191us;1481us;1195us;1481us;1198us;1481us;1201us;1481us;1203us;1481us;1206us;1481us;1208us;1481us;1257us;1481us;1259us;1481us;1263us;1481us;1265us;1481us;1267us;1481us;1269us;1481us;1271us;1481us;1273us;1481us;1275us;1481us;1277us;1481us;1279us;1481us;1281us;1481us;1283us;1481us;1285us;1481us;1287us;1481us;1289us;1481us;1291us;1481us;1293us;1481us;1295us;1481us;1297us;1481us;1299us;1481us;1301us;1481us;1303us;1481us;1304us;1481us;1305us;1481us;1306us;1481us;1309us;1481us;1319us;1481us;1348us;1481us;1349us;1481us;1353us;1481us;1355us;1481us;1358us;1481us;1359us;1481us;1361us;1481us;1364us;1481us;1366us;1481us;1368us;1481us;1370us;1481us;1372us;1481us;1373us;1481us;1374us;1481us;1375us;1481us;1377us;1481us;1378us;1481us;1380us;1481us;1381us;1481us;1383us;1481us;1384us;1481us;1386us;1481us;1387us;1481us;1389us;1481us;1390us;1481us;1392us;1481us;1393us;1481us;1399us;1481us;1400us;1481us;1407us;1481us;1409us;1481us;1411us;1481us;1412us;1481us;1413us;1481us;1416us;1481us;1421us;1481us;1429us;1481us;1430us;1481us;1433us;1481us;1434us;1481us;1452us;1481us;1459us;1481us;1466us;1481us;1473us;1481us;1490us;1481us;1497us;1481us;1498us;1481us;1504us;1481us;1510us;1481us;1511us;1481us;1512us;1481us;1524us;1481us;1530us;1481us;1540us;1481us;1553us;1481us;1555us;1481us;1558us;1481us;1559us;1481us;1565us;1481us;1580us;1481us;1585us;1481us;1590us;1481us;1615us;1481us;1648us;1481us;1657us;1481us;1662us;1481us;1893us;1481us;2053us;1481us;2057us;1481us;1us;65535us;1540us;1541us;1us;65535us;1452us;1453us;1us;65535us;1504us;1505us;1us;65535us;1540us;1549us;1us;65535us;1161us;1162us;1us;65535us;1152us;1153us;1us;65535us;1152us;1163us;1us;65535us;1245us;1559us;3us;65535us;1510us;1533us;1511us;1533us;1512us;1533us;1us;65535us;1564us;1565us;4us;65535us;336us;337us;340us;341us;345us;346us;1580us;1581us;1us;65535us;1563us;1564us;1us;65535us;1565us;1566us;1us;65535us;1540us;1547us;2us;65535us;1540us;1584us;1648us;1649us;6us;65535us;1582us;1583us;1587us;1588us;1592us;1593us;1596us;1597us;1598us;1599us;1602us;1603us;6us;65535us;1582us;1606us;1587us;1606us;1592us;1606us;1596us;1606us;1598us;1605us;1602us;1606us;3us;65535us;1594us;1614us;1598us;1614us;1606us;1614us;5us;65535us;1581us;1582us;1586us;1587us;1591us;1592us;1595us;1596us;1601us;1602us;3us;65535us;1594us;1595us;1598us;1601us;1606us;1613us;1us;65535us;1540us;1548us;1us;65535us;1540us;1619us;1us;65535us;1641us;1642us;2us;65535us;1619us;1620us;1641us;1626us;1us;65535us;1623us;1624us;4us;65535us;1621us;1622us;1634us;1635us;1636us;1637us;1638us;1639us;5us;65535us;1621us;1636us;1623us;1634us;1634us;1636us;1636us;1636us;1638us;1636us;155us;65535us;6us;1482us;31us;1482us;117us;1482us;119us;1482us;242us;1482us;256us;1482us;279us;1482us;336us;1482us;340us;1482us;345us;1482us;427us;1482us;432us;1482us;474us;1482us;497us;1482us;531us;1482us;701us;1482us;713us;1482us;774us;1482us;780us;1482us;832us;1482us;836us;1482us;846us;1482us;1047us;1482us;1053us;1482us;1069us;1482us;1071us;1482us;1074us;1482us;1077us;1482us;1096us;1482us;1101us;1482us;1107us;1482us;1110us;1482us;1113us;1482us;1119us;1482us;1123us;1482us;1127us;1482us;1133us;1482us;1135us;1482us;1140us;1482us;1142us;1482us;1144us;1482us;1146us;1482us;1148us;1482us;1150us;1482us;1154us;1482us;1164us;1482us;1171us;1482us;1177us;1482us;1179us;1482us;1184us;1482us;1188us;1482us;1191us;1482us;1195us;1482us;1198us;1482us;1201us;1482us;1203us;1482us;1206us;1482us;1208us;1482us;1257us;1482us;1259us;1482us;1263us;1482us;1265us;1482us;1267us;1482us;1269us;1482us;1271us;1482us;1273us;1482us;1275us;1482us;1277us;1482us;1279us;1482us;1281us;1482us;1283us;1482us;1285us;1482us;1287us;1482us;1289us;1482us;1291us;1482us;1293us;1482us;1295us;1482us;1297us;1482us;1299us;1482us;1301us;1482us;1303us;1482us;1304us;1482us;1305us;1482us;1306us;1482us;1309us;1482us;1319us;1482us;1348us;1482us;1349us;1482us;1353us;1482us;1355us;1482us;1358us;1482us;1359us;1482us;1361us;1482us;1364us;1482us;1366us;1482us;1368us;1482us;1370us;1482us;1372us;1482us;1373us;1482us;1374us;1482us;1375us;1482us;1377us;1482us;1378us;1482us;1380us;1482us;1381us;1482us;1383us;1482us;1384us;1482us;1386us;1482us;1387us;1482us;1389us;1482us;1390us;1482us;1392us;1482us;1393us;1482us;1399us;1482us;1400us;1482us;1407us;1482us;1409us;1482us;1411us;1482us;1412us;1482us;1413us;1482us;1416us;1482us;1421us;1482us;1429us;1482us;1430us;1482us;1433us;1482us;1434us;1482us;1452us;1482us;1459us;1482us;1466us;1482us;1473us;1482us;1490us;1482us;1497us;1482us;1498us;1482us;1504us;1482us;1510us;1482us;1511us;1482us;1512us;1482us;1524us;1482us;1530us;1482us;1540us;1482us;1553us;1482us;1555us;1482us;1558us;1482us;1559us;1482us;1565us;1482us;1580us;1482us;1585us;1482us;1590us;1482us;1615us;1482us;1648us;1482us;1657us;1482us;1662us;1482us;1893us;1482us;2053us;1482us;2057us;1482us;157us;65535us;6us;1647us;31us;1647us;117us;1647us;119us;1647us;242us;1647us;256us;1647us;279us;1647us;336us;1647us;340us;1647us;345us;1647us;427us;1647us;432us;1647us;474us;1647us;497us;1647us;531us;1647us;701us;1647us;713us;1647us;774us;1647us;780us;1647us;832us;1647us;836us;1647us;846us;1647us;1047us;1647us;1053us;1647us;1069us;1647us;1071us;1647us;1074us;1647us;1077us;1647us;1096us;1647us;1101us;1647us;1107us;1647us;1110us;1647us;1113us;1647us;1119us;1647us;1123us;1647us;1127us;1647us;1133us;1647us;1135us;1647us;1140us;1647us;1142us;1647us;1144us;1647us;1146us;1647us;1148us;1647us;1150us;1647us;1154us;1647us;1164us;1647us;1171us;1647us;1177us;1647us;1179us;1647us;1184us;1647us;1188us;1647us;1191us;1647us;1195us;1647us;1198us;1647us;1201us;1647us;1203us;1647us;1206us;1647us;1208us;1647us;1257us;1647us;1259us;1647us;1263us;1647us;1265us;1647us;1267us;1647us;1269us;1647us;1271us;1647us;1273us;1647us;1275us;1647us;1277us;1647us;1279us;1647us;1281us;1647us;1283us;1647us;1285us;1647us;1287us;1647us;1289us;1647us;1291us;1647us;1293us;1647us;1295us;1647us;1297us;1647us;1299us;1647us;1301us;1647us;1303us;1647us;1304us;1647us;1305us;1647us;1306us;1647us;1309us;1647us;1319us;1647us;1348us;1647us;1349us;1647us;1353us;1647us;1355us;1647us;1358us;1647us;1359us;1647us;1361us;1647us;1364us;1647us;1366us;1647us;1368us;1647us;1370us;1647us;1372us;1647us;1373us;1647us;1374us;1647us;1375us;1647us;1377us;1647us;1378us;1647us;1380us;1647us;1381us;1647us;1383us;1647us;1384us;1647us;1386us;1647us;1387us;1647us;1389us;1647us;1390us;1647us;1392us;1647us;1393us;1647us;1399us;1647us;1400us;1647us;1407us;1647us;1409us;1647us;1411us;1647us;1412us;1647us;1413us;1647us;1416us;1647us;1421us;1647us;1429us;1647us;1430us;1647us;1433us;1647us;1434us;1647us;1452us;1647us;1458us;1646us;1459us;1647us;1466us;1647us;1473us;1647us;1490us;1647us;1497us;1647us;1498us;1647us;1504us;1647us;1510us;1647us;1511us;1647us;1512us;1647us;1524us;1647us;1530us;1647us;1540us;1647us;1553us;1647us;1555us;1647us;1558us;1647us;1559us;1647us;1565us;1647us;1580us;1647us;1585us;1647us;1590us;1647us;1615us;1647us;1645us;1646us;1648us;1647us;1657us;1647us;1662us;1647us;1893us;1647us;2053us;1647us;2057us;1647us;116us;65535us;6us;1118us;31us;1118us;117us;1118us;119us;1118us;242us;1118us;256us;1118us;279us;1118us;427us;1118us;432us;1118us;474us;1118us;497us;1118us;774us;1118us;780us;1118us;832us;1118us;836us;1118us;846us;1118us;1047us;1118us;1053us;1118us;1069us;1118us;1071us;1118us;1074us;1118us;1077us;1118us;1096us;1118us;1101us;1118us;1107us;1118us;1110us;1118us;1113us;1118us;1119us;1118us;1123us;1118us;1127us;1118us;1133us;1118us;1135us;1118us;1140us;1118us;1142us;1118us;1144us;1118us;1146us;1118us;1148us;1118us;1150us;1118us;1154us;1118us;1164us;1118us;1171us;1118us;1177us;1118us;1179us;1118us;1184us;1118us;1188us;1118us;1191us;1118us;1195us;1118us;1198us;1118us;1201us;1118us;1203us;1118us;1206us;1118us;1208us;1118us;1257us;1118us;1259us;1118us;1263us;1118us;1265us;1118us;1267us;1118us;1269us;1118us;1271us;1118us;1273us;1118us;1275us;1118us;1277us;1118us;1279us;1118us;1281us;1118us;1283us;1118us;1285us;1118us;1287us;1118us;1289us;1118us;1291us;1118us;1293us;1118us;1295us;1118us;1297us;1118us;1299us;1118us;1301us;1118us;1303us;1118us;1304us;1118us;1305us;1118us;1306us;1118us;1309us;1118us;1319us;1118us;1348us;1118us;1349us;1118us;1353us;1118us;1355us;1118us;1358us;1118us;1359us;1118us;1361us;1118us;1364us;1118us;1366us;1118us;1368us;1118us;1370us;1118us;1452us;1118us;1459us;1118us;1466us;1118us;1473us;1118us;1490us;1118us;1497us;1118us;1498us;1118us;1504us;1118us;1510us;1118us;1511us;1118us;1512us;1118us;1524us;1118us;1530us;1118us;1540us;1118us;1553us;1118us;1555us;1118us;1558us;1118us;1559us;1118us;1585us;1118us;1590us;1118us;1615us;1118us;1657us;1118us;1662us;1118us;2053us;1118us;2057us;1118us;116us;65535us;6us;1117us;31us;1117us;117us;1117us;119us;1117us;242us;1117us;256us;1117us;279us;1117us;427us;1117us;432us;1117us;474us;1117us;497us;1117us;774us;1117us;780us;1117us;832us;1117us;836us;1117us;846us;1117us;1047us;1117us;1053us;1117us;1069us;1117us;1071us;1117us;1074us;1117us;1077us;1117us;1096us;1117us;1101us;1117us;1107us;1117us;1110us;1117us;1113us;1117us;1119us;1117us;1123us;1117us;1127us;1117us;1133us;1117us;1135us;1117us;1140us;1117us;1142us;1117us;1144us;1117us;1146us;1117us;1148us;1117us;1150us;1117us;1154us;1117us;1164us;1117us;1171us;1117us;1177us;1117us;1179us;1117us;1184us;1117us;1188us;1117us;1191us;1117us;1195us;1117us;1198us;1117us;1201us;1117us;1203us;1117us;1206us;1117us;1208us;1117us;1257us;1117us;1259us;1117us;1263us;1117us;1265us;1117us;1267us;1117us;1269us;1117us;1271us;1117us;1273us;1117us;1275us;1117us;1277us;1117us;1279us;1117us;1281us;1117us;1283us;1117us;1285us;1117us;1287us;1117us;1289us;1117us;1291us;1117us;1293us;1117us;1295us;1117us;1297us;1117us;1299us;1117us;1301us;1117us;1303us;1117us;1304us;1117us;1305us;1117us;1306us;1117us;1309us;1117us;1319us;1117us;1348us;1117us;1349us;1117us;1353us;1117us;1355us;1117us;1358us;1117us;1359us;1117us;1361us;1117us;1364us;1117us;1366us;1117us;1368us;1117us;1370us;1117us;1452us;1117us;1459us;1117us;1466us;1117us;1473us;1117us;1490us;1117us;1497us;1117us;1498us;1117us;1504us;1117us;1510us;1117us;1511us;1117us;1512us;1117us;1524us;1117us;1530us;1117us;1540us;1117us;1553us;1117us;1555us;1117us;1558us;1117us;1559us;1117us;1585us;1117us;1590us;1117us;1615us;1117us;1657us;1117us;1662us;1117us;2053us;1117us;2057us;1117us;2us;65535us;1021us;1022us;1063us;1064us;5us;65535us;114us;115us;187us;188us;204us;205us;460us;461us;1681us;1682us;3us;65535us;425us;426us;430us;431us;830us;831us;10us;65535us;114us;1679us;152us;153us;187us;1679us;204us;1679us;390us;391us;460us;1679us;699us;700us;722us;723us;1681us;1679us;1685us;1686us;10us;65535us;114us;1684us;152us;1684us;187us;1684us;204us;1684us;390us;1684us;460us;1684us;699us;1684us;722us;1684us;1681us;1684us;1685us;1684us;4us;65535us;1689us;1690us;1692us;1693us;1695us;1696us;1698us;1699us;14us;65535us;114us;1688us;152us;1688us;187us;1688us;204us;1688us;390us;1688us;460us;1688us;699us;1688us;722us;1688us;1681us;1688us;1685us;1688us;1689us;1694us;1692us;1694us;1695us;1694us;1698us;1694us;11us;65535us;690us;739us;692us;739us;695us;739us;719us;739us;725us;739us;728us;739us;731us;739us;734us;738us;765us;739us;1722us;1723us;1725us;1726us;33us;65535us;8us;1733us;181us;572us;444us;572us;487us;488us;503us;504us;567us;572us;575us;1878us;650us;651us;653us;654us;664us;1878us;751us;752us;852us;853us;1021us;1677us;1063us;1677us;1248us;1249us;1251us;1252us;1254us;1255us;1571us;1572us;1574us;1575us;1576us;1878us;1728us;1729us;1731us;1732us;1774us;1878us;1780us;1878us;1786us;1787us;1789us;1790us;1856us;1921us;1860us;1921us;1866us;1878us;1876us;1877us;1909us;1921us;1911us;1921us;1922us;1923us;1us;65535us;8us;9us;33us;65535us;8us;1727us;181us;1727us;444us;1727us;487us;1727us;503us;1727us;567us;1727us;575us;1727us;650us;1727us;653us;1727us;664us;1727us;751us;1727us;852us;1727us;1021us;1727us;1063us;1727us;1248us;1727us;1251us;1727us;1254us;1727us;1571us;1727us;1574us;1727us;1576us;1727us;1728us;1727us;1731us;1727us;1774us;1727us;1780us;1727us;1786us;1727us;1789us;1727us;1856us;1727us;1860us;1727us;1866us;1727us;1876us;1727us;1909us;1727us;1911us;1727us;1922us;1727us;11us;65535us;1737us;1738us;1740us;1742us;1741us;1742us;1743us;1745us;1744us;1745us;1747us;1748us;1751us;1752us;1754us;1755us;1756us;1757us;1759us;1760us;1884us;1885us;86us;65535us;8us;1785us;114us;1785us;152us;1785us;181us;1785us;187us;1785us;191us;1785us;193us;1785us;204us;1785us;295us;1785us;390us;1785us;444us;1785us;451us;1785us;460us;1785us;487us;1785us;503us;1785us;567us;1785us;575us;1785us;634us;1785us;638us;1785us;650us;1785us;653us;1785us;664us;1785us;675us;1785us;690us;1785us;692us;1785us;695us;1785us;699us;1785us;719us;1785us;722us;1785us;725us;1785us;728us;1785us;731us;1785us;734us;1785us;751us;1785us;765us;1785us;852us;1785us;1021us;1785us;1063us;1785us;1248us;1785us;1251us;1785us;1254us;1785us;1538us;1785us;1571us;1785us;1574us;1785us;1576us;1785us;1640us;1785us;1678us;1785us;1680us;1785us;1681us;1785us;1685us;1785us;1689us;1785us;1692us;1785us;1695us;1785us;1698us;1785us;1700us;1785us;1702us;1785us;1707us;1785us;1711us;1785us;1716us;1785us;1722us;1785us;1725us;1785us;1728us;1785us;1731us;1785us;1737us;1785us;1740us;1785us;1741us;1785us;1743us;1785us;1744us;1785us;1747us;1785us;1751us;1785us;1754us;1785us;1756us;1785us;1759us;1785us;1774us;1785us;1780us;1785us;1786us;1785us;1789us;1785us;1856us;1785us;1860us;1785us;1866us;1785us;1876us;1785us;1882us;1785us;1884us;1785us;1909us;1785us;1911us;1785us;1922us;1785us;111us;65535us;8us;1768us;114us;1768us;152us;1768us;181us;1768us;187us;1768us;191us;1768us;192us;1767us;193us;1768us;194us;1767us;204us;1768us;295us;1768us;296us;1767us;390us;1768us;444us;1768us;451us;1768us;452us;1767us;460us;1768us;487us;1768us;503us;1768us;528us;1768us;567us;1768us;575us;1768us;576us;1768us;619us;1768us;632us;1768us;634us;1768us;638us;1768us;643us;1768us;650us;1768us;653us;1768us;664us;1768us;674us;1767us;675us;1768us;676us;1767us;677us;1767us;690us;1768us;692us;1768us;695us;1768us;699us;1768us;719us;1768us;722us;1768us;725us;1768us;728us;1768us;731us;1768us;734us;1768us;751us;1768us;765us;1768us;852us;1768us;952us;1768us;1021us;1768us;1063us;1768us;1248us;1768us;1251us;1768us;1254us;1768us;1395us;1768us;1396us;1768us;1538us;1768us;1571us;1768us;1574us;1768us;1576us;1768us;1578us;1768us;1640us;1768us;1641us;1767us;1678us;1768us;1680us;1768us;1681us;1768us;1685us;1768us;1689us;1768us;1692us;1768us;1695us;1768us;1698us;1768us;1700us;1768us;1702us;1768us;1707us;1768us;1711us;1768us;1716us;1768us;1719us;1767us;1720us;1767us;1721us;1767us;1722us;1768us;1725us;1768us;1728us;1768us;1731us;1768us;1737us;1768us;1740us;1768us;1741us;1768us;1743us;1768us;1744us;1768us;1747us;1768us;1751us;1768us;1754us;1768us;1756us;1768us;1759us;1768us;1762us;1768us;1764us;1768us;1771us;1767us;1774us;1768us;1780us;1768us;1782us;1767us;1786us;1768us;1789us;1768us;1856us;1768us;1860us;1768us;1866us;1768us;1868us;1767us;1876us;1768us;1882us;1768us;1884us;1768us;1909us;1768us;1911us;1768us;1922us;1768us;111us;65535us;8us;1874us;114us;1874us;152us;1874us;181us;1874us;187us;1874us;191us;1874us;192us;1779us;193us;1874us;194us;1779us;204us;1874us;295us;1874us;296us;1779us;390us;1874us;444us;1874us;451us;1874us;452us;1779us;460us;1874us;487us;1874us;503us;1874us;528us;1874us;567us;1874us;575us;1874us;576us;1874us;619us;1874us;632us;1874us;634us;1874us;638us;1874us;643us;1874us;650us;1874us;653us;1874us;664us;1874us;674us;1779us;675us;1874us;676us;1779us;677us;1779us;690us;1874us;692us;1874us;695us;1874us;699us;1874us;719us;1874us;722us;1874us;725us;1874us;728us;1874us;731us;1874us;734us;1874us;751us;1874us;765us;1874us;852us;1874us;952us;1874us;1021us;1874us;1063us;1874us;1248us;1874us;1251us;1874us;1254us;1874us;1395us;1874us;1396us;1874us;1538us;1874us;1571us;1874us;1574us;1874us;1576us;1874us;1578us;1874us;1640us;1874us;1641us;1779us;1678us;1874us;1680us;1874us;1681us;1874us;1685us;1874us;1689us;1874us;1692us;1874us;1695us;1874us;1698us;1874us;1700us;1874us;1702us;1874us;1707us;1874us;1711us;1874us;1716us;1874us;1719us;1779us;1720us;1779us;1721us;1779us;1722us;1874us;1725us;1874us;1728us;1874us;1731us;1874us;1737us;1874us;1740us;1874us;1741us;1874us;1743us;1874us;1744us;1874us;1747us;1874us;1751us;1874us;1754us;1874us;1756us;1874us;1759us;1874us;1762us;1874us;1764us;1874us;1771us;1779us;1774us;1874us;1780us;1874us;1782us;1783us;1786us;1874us;1789us;1874us;1856us;1874us;1860us;1874us;1866us;1874us;1868us;1869us;1876us;1874us;1882us;1874us;1884us;1874us;1909us;1874us;1911us;1874us;1922us;1874us;65us;65535us;8us;1735us;114us;1710us;152us;1710us;181us;1735us;187us;1710us;204us;1710us;390us;1710us;444us;1735us;460us;1710us;487us;1735us;503us;1735us;567us;1735us;575us;1735us;650us;1735us;653us;1735us;664us;1735us;699us;1710us;722us;1710us;751us;1735us;852us;1735us;1021us;1735us;1063us;1735us;1248us;1735us;1251us;1735us;1254us;1735us;1538us;1539us;1571us;1735us;1574us;1735us;1576us;1735us;1681us;1710us;1685us;1710us;1689us;1710us;1692us;1710us;1695us;1710us;1698us;1710us;1700us;1701us;1702us;1703us;1707us;1708us;1711us;1712us;1716us;1717us;1728us;1735us;1731us;1735us;1737us;1750us;1740us;1750us;1741us;1750us;1743us;1750us;1744us;1750us;1747us;1750us;1751us;1750us;1754us;1750us;1756us;1750us;1759us;1750us;1774us;1736us;1780us;1735us;1786us;1735us;1789us;1735us;1856us;1735us;1860us;1735us;1866us;1735us;1876us;1735us;1882us;1883us;1884us;1750us;1909us;1735us;1911us;1735us;1922us;1735us;9us;65535us;690us;737us;692us;737us;695us;737us;719us;737us;725us;737us;728us;737us;731us;737us;734us;735us;765us;737us;86us;65535us;8us;1771us;114us;1771us;152us;1771us;181us;1771us;187us;1771us;191us;192us;193us;194us;204us;1771us;295us;296us;390us;1771us;444us;1771us;451us;452us;460us;1771us;487us;1771us;503us;1771us;567us;1771us;575us;1771us;634us;674us;638us;674us;650us;1771us;653us;1771us;664us;677us;675us;676us;690us;1720us;692us;1720us;695us;1720us;699us;1771us;719us;1720us;722us;1771us;725us;1720us;728us;1720us;731us;1720us;734us;1720us;751us;1771us;765us;1720us;852us;1771us;1021us;1771us;1063us;1771us;1248us;1771us;1251us;1771us;1254us;1771us;1538us;1771us;1571us;1771us;1574us;1771us;1576us;1771us;1640us;1641us;1678us;674us;1680us;674us;1681us;1771us;1685us;1771us;1689us;1771us;1692us;1771us;1695us;1771us;1698us;1771us;1700us;1771us;1702us;1771us;1707us;1771us;1711us;1771us;1716us;1771us;1722us;1719us;1725us;1721us;1728us;1771us;1731us;1771us;1737us;1771us;1740us;1771us;1741us;1771us;1743us;1771us;1744us;1771us;1747us;1771us;1751us;1771us;1754us;1771us;1756us;1771us;1759us;1771us;1774us;1771us;1780us;1771us;1786us;1771us;1789us;1771us;1856us;1771us;1860us;1771us;1866us;1771us;1876us;1771us;1882us;1771us;1884us;1771us;1909us;1771us;1911us;1771us;1922us;1771us;13us;65535us;192us;1776us;194us;1776us;296us;1776us;452us;1776us;674us;1776us;676us;1776us;677us;1776us;1641us;1776us;1719us;1776us;1720us;1776us;1721us;1776us;1771us;1776us;1777us;1778us;6us;65535us;575us;1781us;664us;1781us;1576us;1781us;1774us;1781us;1780us;1781us;1866us;1867us;2us;65535us;1857us;1858us;1912us;1859us;86us;65535us;8us;1784us;114us;1784us;152us;1784us;181us;1784us;187us;1784us;191us;1784us;193us;1784us;204us;1784us;295us;1784us;390us;1784us;444us;1784us;451us;1784us;460us;1784us;487us;1784us;503us;1784us;567us;1784us;575us;1784us;634us;1784us;638us;1784us;650us;1784us;653us;1784us;664us;1784us;675us;1784us;690us;1784us;692us;1784us;695us;1784us;699us;1784us;719us;1784us;722us;1784us;725us;1784us;728us;1784us;731us;1784us;734us;1784us;751us;1784us;765us;1784us;852us;1784us;1021us;1784us;1063us;1784us;1248us;1784us;1251us;1784us;1254us;1784us;1538us;1784us;1571us;1784us;1574us;1784us;1576us;1784us;1640us;1784us;1678us;1784us;1680us;1784us;1681us;1784us;1685us;1784us;1689us;1784us;1692us;1784us;1695us;1784us;1698us;1784us;1700us;1784us;1702us;1784us;1707us;1784us;1711us;1784us;1716us;1784us;1722us;1784us;1725us;1784us;1728us;1784us;1731us;1784us;1737us;1784us;1740us;1784us;1741us;1784us;1743us;1784us;1744us;1784us;1747us;1784us;1751us;1784us;1754us;1784us;1756us;1784us;1759us;1784us;1774us;1784us;1780us;1784us;1786us;1784us;1789us;1784us;1856us;1784us;1860us;1784us;1866us;1784us;1876us;1784us;1882us;1784us;1884us;1784us;1909us;1784us;1911us;1784us;1922us;1784us;4us;65535us;528us;529us;1395us;1397us;1396us;1398us;1578us;1579us;87us;65535us;8us;1863us;114us;1863us;152us;1863us;181us;1863us;187us;1863us;191us;1863us;193us;1863us;204us;1863us;295us;1863us;390us;1863us;444us;1863us;451us;1863us;460us;1863us;487us;1863us;503us;1863us;567us;1863us;575us;1863us;634us;1863us;638us;1863us;650us;1863us;653us;1863us;664us;1863us;675us;1863us;690us;1863us;692us;1863us;695us;1863us;699us;1863us;719us;1863us;722us;1863us;725us;1863us;728us;1863us;731us;1863us;734us;1863us;751us;1863us;765us;1863us;852us;1863us;952us;953us;1021us;1863us;1063us;1863us;1248us;1863us;1251us;1863us;1254us;1863us;1538us;1863us;1571us;1863us;1574us;1863us;1576us;1863us;1640us;1863us;1678us;1863us;1680us;1863us;1681us;1863us;1685us;1863us;1689us;1863us;1692us;1863us;1695us;1863us;1698us;1863us;1700us;1863us;1702us;1863us;1707us;1863us;1711us;1863us;1716us;1863us;1722us;1863us;1725us;1863us;1728us;1863us;1731us;1863us;1737us;1863us;1740us;1863us;1741us;1863us;1743us;1863us;1744us;1863us;1747us;1863us;1751us;1863us;1754us;1863us;1756us;1863us;1759us;1863us;1774us;1863us;1780us;1863us;1786us;1863us;1789us;1863us;1856us;1863us;1860us;1863us;1866us;1863us;1876us;1863us;1882us;1863us;1884us;1863us;1909us;1863us;1911us;1863us;1922us;1863us;97us;65535us;8us;1871us;114us;1871us;152us;1871us;181us;1871us;187us;1871us;191us;1871us;193us;1871us;204us;1871us;295us;1871us;390us;1871us;444us;1871us;451us;1871us;460us;1871us;487us;1871us;503us;1871us;528us;1870us;567us;1871us;575us;1871us;576us;633us;619us;647us;632us;633us;634us;1871us;638us;1871us;643us;645us;650us;1871us;653us;1871us;664us;1871us;675us;1871us;690us;1871us;692us;1871us;695us;1871us;699us;1871us;719us;1871us;722us;1871us;725us;1871us;728us;1871us;731us;1871us;734us;1871us;751us;1871us;765us;1871us;852us;1871us;952us;1871us;1021us;1871us;1063us;1871us;1248us;1871us;1251us;1871us;1254us;1871us;1395us;1870us;1396us;1870us;1538us;1871us;1571us;1871us;1574us;1871us;1576us;1871us;1578us;1870us;1640us;1871us;1678us;1871us;1680us;1871us;1681us;1871us;1685us;1871us;1689us;1871us;1692us;1871us;1695us;1871us;1698us;1871us;1700us;1871us;1702us;1871us;1707us;1871us;1711us;1871us;1716us;1871us;1722us;1871us;1725us;1871us;1728us;1871us;1731us;1871us;1737us;1871us;1740us;1871us;1741us;1871us;1743us;1871us;1744us;1871us;1747us;1871us;1751us;1871us;1754us;1871us;1756us;1871us;1759us;1871us;1762us;647us;1764us;647us;1774us;1871us;1780us;1871us;1786us;1871us;1789us;1871us;1856us;1871us;1860us;1871us;1866us;1871us;1876us;1871us;1882us;1871us;1884us;1871us;1909us;1871us;1911us;1871us;1922us;1871us;4us;65535us;657us;673us;671us;672us;1768us;1900us;1902us;1903us;6us;65535us;657us;1906us;671us;1906us;1431us;1432us;1768us;1906us;1902us;1906us;1907us;1908us;10us;65535us;575us;1855us;664us;1855us;1576us;1855us;1774us;1855us;1780us;1855us;1856us;1857us;1860us;1861us;1866us;1855us;1909us;1916us;1911us;1924us;2us;65535us;1909us;1910us;1911us;1912us;3us;65535us;1860us;1862us;1909us;1925us;1911us;1925us;1us;65535us;888us;889us;6us;65535us;1926us;1936us;1933us;1936us;1940us;1936us;1946us;1936us;1947us;1936us;1948us;1936us;6us;65535us;1926us;1940us;1933us;1940us;1940us;1940us;1946us;1940us;1947us;1940us;1948us;1940us;6us;65535us;1926us;1942us;1933us;1942us;1940us;1941us;1946us;1942us;1947us;1942us;1948us;1942us;5us;65535us;1926us;1927us;1933us;1934us;1946us;1943us;1947us;1944us;1948us;1945us;125us;65535us;8us;1761us;114us;1761us;152us;1761us;181us;1761us;187us;1761us;191us;1761us;192us;1766us;193us;1761us;194us;1766us;204us;1761us;295us;1761us;296us;1766us;390us;1761us;444us;1761us;451us;1761us;452us;1766us;460us;1761us;487us;1761us;503us;1761us;528us;1766us;567us;1761us;575us;1761us;576us;1766us;601us;607us;617us;618us;619us;1766us;632us;1766us;634us;652us;638us;652us;643us;1766us;648us;649us;650us;1761us;653us;1761us;664us;1761us;674us;1766us;675us;1761us;676us;1766us;677us;1766us;690us;1761us;692us;1761us;695us;1761us;699us;1761us;719us;1761us;722us;1761us;725us;1761us;728us;1761us;731us;1761us;734us;1761us;751us;1761us;765us;1761us;844us;851us;848us;851us;852us;1761us;952us;1766us;1021us;1761us;1063us;1761us;1248us;1761us;1251us;1761us;1254us;1761us;1395us;1766us;1396us;1766us;1510us;1534us;1511us;1535us;1512us;1534us;1538us;1761us;1571us;1761us;1574us;1761us;1576us;1761us;1578us;1766us;1640us;1761us;1641us;1766us;1678us;652us;1680us;652us;1681us;1761us;1685us;1761us;1689us;1761us;1692us;1761us;1695us;1761us;1698us;1761us;1700us;1761us;1702us;1761us;1707us;1761us;1711us;1761us;1716us;1761us;1719us;1766us;1720us;1766us;1721us;1766us;1722us;1761us;1725us;1761us;1728us;1761us;1731us;1761us;1737us;1761us;1740us;1761us;1741us;1761us;1743us;1761us;1744us;1761us;1747us;1761us;1751us;1761us;1754us;1761us;1756us;1761us;1759us;1761us;1762us;1766us;1764us;1766us;1771us;1766us;1774us;1761us;1780us;1761us;1782us;1766us;1786us;1761us;1789us;1761us;1856us;1761us;1860us;1761us;1866us;1761us;1868us;1766us;1876us;1761us;1882us;1761us;1884us;1761us;1909us;1761us;1911us;1761us;1922us;1761us;1926us;1932us;1933us;1932us;1940us;1932us;1946us;1932us;1947us;1932us;1948us;1932us;379us;65535us;6us;2012us;8us;1957us;31us;2012us;40us;2006us;56us;1957us;61us;1957us;98us;1957us;111us;2004us;114us;1957us;117us;2012us;119us;2012us;123us;1957us;152us;1957us;181us;711us;184us;2004us;187us;1957us;191us;1957us;192us;1957us;193us;1957us;194us;1957us;204us;1957us;212us;2004us;215us;2004us;242us;2012us;256us;2012us;279us;2012us;286us;1957us;292us;1957us;295us;1957us;296us;1957us;322us;351us;333us;351us;338us;1957us;342us;1957us;390us;1957us;424us;2006us;427us;2012us;429us;2006us;432us;2012us;444us;711us;451us;1957us;452us;1957us;457us;2004us;460us;1957us;471us;2006us;474us;2012us;485us;486us;487us;1957us;494us;495us;497us;2012us;503us;1957us;507us;2006us;510us;2006us;513us;2006us;515us;2006us;528us;1957us;536us;537us;540us;541us;567us;711us;575us;1957us;576us;1957us;601us;1957us;603us;1957us;619us;1957us;632us;1957us;634us;1957us;638us;1957us;643us;1957us;650us;1957us;653us;1957us;664us;1957us;674us;1957us;675us;1957us;676us;1957us;677us;1957us;689us;2004us;690us;733us;692us;733us;695us;733us;699us;1957us;701us;2012us;713us;2012us;719us;733us;722us;1957us;725us;733us;728us;733us;731us;733us;734us;1957us;749us;750us;751us;1957us;760us;764us;765us;733us;768us;1957us;774us;2012us;780us;2012us;792us;793us;804us;1957us;805us;806us;819us;1957us;829us;2006us;832us;2012us;836us;2012us;846us;2012us;852us;1957us;892us;2006us;911us;2006us;914us;2006us;915us;2006us;920us;2006us;921us;2006us;924us;2006us;926us;2006us;927us;2006us;930us;934us;932us;934us;936us;2006us;940us;2006us;941us;2006us;943us;2006us;945us;2006us;948us;2006us;950us;2006us;952us;1957us;956us;935us;960us;2006us;962us;2006us;964us;2006us;967us;1957us;972us;2006us;975us;2006us;978us;980us;979us;980us;986us;2006us;994us;2006us;1015us;2006us;1018us;2006us;1021us;1957us;1024us;2006us;1025us;2006us;1028us;2006us;1029us;2006us;1032us;2006us;1034us;2006us;1035us;2006us;1038us;1957us;1041us;2006us;1045us;2006us;1047us;2012us;1053us;2012us;1063us;1957us;1069us;2012us;1071us;2012us;1074us;2012us;1077us;2012us;1095us;2006us;1096us;2012us;1100us;2006us;1101us;2012us;1107us;2012us;1110us;2012us;1113us;2012us;1119us;2012us;1123us;2012us;1127us;2012us;1133us;2012us;1135us;2012us;1140us;2012us;1142us;2012us;1144us;2012us;1146us;2012us;1148us;2012us;1150us;2012us;1152us;2006us;1154us;2012us;1164us;2012us;1171us;2012us;1177us;2012us;1179us;2012us;1183us;2006us;1184us;2012us;1188us;2012us;1190us;2006us;1191us;2012us;1195us;2012us;1198us;2012us;1201us;2012us;1203us;2012us;1206us;2012us;1208us;2012us;1248us;1957us;1251us;1957us;1254us;1957us;1257us;2012us;1259us;2012us;1263us;2012us;1265us;2012us;1267us;2012us;1269us;2012us;1271us;2012us;1273us;2012us;1275us;2012us;1277us;2012us;1279us;2012us;1281us;2012us;1283us;2012us;1285us;2012us;1287us;2012us;1289us;2012us;1291us;2012us;1293us;2012us;1295us;2012us;1297us;2012us;1299us;2012us;1301us;2012us;1303us;2012us;1304us;2012us;1305us;2012us;1306us;2012us;1309us;2012us;1319us;2012us;1322us;2006us;1324us;2006us;1330us;2006us;1332us;2006us;1339us;2006us;1341us;2006us;1343us;2006us;1348us;2012us;1349us;2012us;1353us;2012us;1355us;2012us;1358us;2012us;1359us;2012us;1361us;2012us;1364us;2012us;1366us;2012us;1368us;2012us;1370us;2012us;1372us;2012us;1373us;1954us;1374us;1954us;1375us;2012us;1377us;2012us;1378us;2012us;1380us;2012us;1381us;2012us;1383us;2012us;1384us;2012us;1386us;2012us;1387us;2012us;1389us;2012us;1390us;2012us;1392us;2012us;1393us;2012us;1395us;1957us;1396us;1957us;1403us;2004us;1407us;2012us;1409us;2012us;1411us;2012us;1412us;2012us;1413us;2012us;1416us;2012us;1421us;2012us;1429us;2012us;1430us;2012us;1433us;2012us;1434us;2012us;1435us;1437us;1436us;1438us;1440us;2004us;1443us;2004us;1445us;2004us;1446us;2004us;1452us;2012us;1459us;2012us;1466us;2012us;1473us;2012us;1490us;2012us;1497us;2012us;1498us;2012us;1504us;2012us;1510us;2012us;1511us;2012us;1512us;2012us;1524us;2012us;1530us;2012us;1538us;1957us;1540us;2012us;1553us;2012us;1555us;2012us;1558us;2012us;1559us;2012us;1565us;2012us;1571us;1957us;1574us;1957us;1576us;1957us;1578us;1957us;1585us;2012us;1590us;2012us;1594us;1957us;1598us;1957us;1606us;1957us;1615us;2012us;1640us;1957us;1641us;1957us;1648us;2012us;1655us;2006us;1657us;2012us;1660us;2006us;1662us;2012us;1672us;2006us;1674us;2006us;1678us;1957us;1680us;1957us;1681us;1957us;1685us;1957us;1689us;1957us;1692us;1957us;1695us;1957us;1698us;1957us;1700us;1957us;1702us;1957us;1705us;1706us;1707us;1957us;1711us;1957us;1714us;1715us;1716us;1957us;1719us;1957us;1720us;1957us;1721us;1957us;1722us;1957us;1725us;1957us;1728us;1957us;1731us;1957us;1737us;1957us;1740us;1957us;1741us;1957us;1743us;1957us;1744us;1957us;1747us;1957us;1751us;1957us;1754us;1957us;1756us;1957us;1759us;1957us;1762us;1957us;1764us;1957us;1771us;1957us;1774us;1957us;1780us;1957us;1782us;1957us;1786us;1957us;1789us;1957us;1856us;1957us;1860us;1957us;1866us;1957us;1868us;1957us;1876us;1957us;1882us;1957us;1884us;1957us;1893us;2012us;1901us;1957us;1909us;1957us;1911us;1957us;1922us;1957us;1926us;1957us;1933us;1957us;1940us;1957us;1946us;1957us;1947us;1957us;1948us;1957us;1949us;1950us;1951us;1953us;1952us;1953us;1958us;1959us;2008us;2006us;2050us;2051us;2053us;2012us;2057us;2012us;138us;65535us;8us;1765us;56us;57us;61us;62us;98us;300us;114us;1765us;123us;298us;152us;1765us;181us;568us;187us;1765us;191us;1765us;192us;1765us;193us;1765us;194us;1765us;204us;1765us;286us;310us;292us;293us;295us;1765us;296us;1765us;322us;335us;333us;335us;338us;339us;342us;343us;390us;1765us;444us;568us;451us;1765us;452us;1765us;460us;1765us;487us;1765us;503us;1765us;528us;1765us;567us;568us;575us;1765us;576us;1765us;601us;602us;603us;604us;619us;1765us;632us;1765us;634us;1765us;638us;1765us;643us;1765us;650us;1765us;653us;1765us;664us;1765us;674us;1765us;675us;1765us;676us;1765us;677us;1765us;690us;1765us;692us;1765us;695us;1765us;699us;1765us;719us;1765us;722us;1765us;725us;1765us;728us;1765us;731us;1765us;734us;1765us;751us;1765us;765us;1765us;768us;769us;804us;807us;819us;807us;852us;1765us;952us;1765us;967us;1040us;1021us;1765us;1038us;1040us;1063us;1765us;1248us;1765us;1251us;1765us;1254us;1765us;1395us;1765us;1396us;1765us;1538us;1765us;1571us;1765us;1574us;1765us;1576us;1765us;1578us;1765us;1594us;1611us;1598us;1611us;1606us;1611us;1640us;1765us;1641us;1765us;1678us;1765us;1680us;1765us;1681us;1765us;1685us;1765us;1689us;1765us;1692us;1765us;1695us;1765us;1698us;1765us;1700us;1765us;1702us;1765us;1707us;1765us;1711us;1765us;1716us;1765us;1719us;1765us;1720us;1765us;1721us;1765us;1722us;1765us;1725us;1765us;1728us;1765us;1731us;1765us;1737us;1765us;1740us;1765us;1741us;1765us;1743us;1765us;1744us;1765us;1747us;1765us;1751us;1765us;1754us;1765us;1756us;1765us;1759us;1765us;1762us;1765us;1764us;1765us;1771us;1765us;1774us;1765us;1780us;1765us;1782us;1765us;1786us;1765us;1789us;1765us;1856us;1765us;1860us;1765us;1866us;1765us;1868us;1765us;1876us;1765us;1882us;1765us;1884us;1765us;1901us;1902us;1909us;1765us;1911us;1765us;1922us;1765us;1926us;1931us;1933us;1931us;1940us;1931us;1946us;1931us;1947us;1931us;1948us;1931us;223us;65535us;6us;2013us;31us;2013us;40us;2007us;111us;2005us;117us;2013us;119us;2013us;181us;2005us;184us;2005us;212us;2005us;215us;2005us;242us;2013us;256us;2013us;279us;2013us;424us;2007us;427us;2013us;429us;2007us;432us;2013us;444us;2005us;457us;2005us;471us;2007us;474us;2013us;497us;2013us;507us;2007us;510us;2007us;513us;2007us;515us;2007us;567us;2005us;689us;2005us;701us;2013us;713us;2013us;774us;2013us;780us;2013us;829us;2007us;832us;2013us;836us;2013us;846us;2013us;892us;2007us;911us;2007us;914us;2007us;915us;2007us;920us;2007us;921us;2007us;924us;2007us;926us;2007us;927us;2007us;936us;2007us;940us;2007us;941us;2007us;943us;2007us;945us;2007us;948us;2007us;950us;2007us;956us;2007us;960us;2007us;962us;2007us;964us;2007us;972us;2007us;975us;2007us;986us;2007us;994us;2007us;1015us;2007us;1018us;2007us;1024us;2007us;1025us;2007us;1028us;2007us;1029us;2007us;1032us;2007us;1034us;2007us;1035us;2007us;1041us;2007us;1045us;2007us;1047us;2013us;1053us;2013us;1069us;2013us;1071us;2013us;1074us;2013us;1077us;2013us;1095us;2007us;1096us;2013us;1100us;2007us;1101us;2013us;1107us;2013us;1110us;2013us;1113us;2013us;1119us;2013us;1123us;2013us;1127us;2013us;1133us;2013us;1135us;2013us;1140us;2013us;1142us;2013us;1144us;2013us;1146us;2013us;1148us;2013us;1150us;2013us;1152us;2007us;1154us;2013us;1164us;2013us;1171us;2013us;1177us;2013us;1179us;2013us;1183us;2007us;1184us;2013us;1188us;2013us;1190us;2007us;1191us;2013us;1195us;2013us;1198us;2013us;1201us;2013us;1203us;2013us;1206us;2013us;1208us;2013us;1257us;2013us;1259us;2013us;1263us;2013us;1265us;2013us;1267us;2013us;1269us;2013us;1271us;2013us;1273us;2013us;1275us;2013us;1277us;2013us;1279us;2013us;1281us;2013us;1283us;2013us;1285us;2013us;1287us;2013us;1289us;2013us;1291us;2013us;1293us;2013us;1295us;2013us;1297us;2013us;1299us;2013us;1301us;2013us;1303us;2013us;1304us;2013us;1305us;2013us;1306us;2013us;1309us;2013us;1319us;2013us;1322us;2007us;1324us;2007us;1330us;2007us;1332us;2007us;1339us;2007us;1341us;2007us;1343us;2007us;1348us;2013us;1349us;2013us;1353us;2013us;1355us;2013us;1358us;2013us;1359us;2013us;1361us;2013us;1364us;2013us;1366us;2013us;1368us;2013us;1370us;2013us;1372us;2013us;1373us;2013us;1374us;2013us;1375us;2013us;1377us;2013us;1378us;2013us;1380us;2013us;1381us;2013us;1383us;2013us;1384us;2013us;1386us;2013us;1387us;2013us;1389us;2013us;1390us;2013us;1392us;2013us;1393us;2013us;1403us;2005us;1407us;2013us;1409us;2013us;1411us;2013us;1412us;2013us;1413us;2013us;1416us;2013us;1421us;2013us;1429us;2013us;1430us;2013us;1433us;2013us;1434us;2013us;1440us;2005us;1443us;2005us;1445us;2005us;1446us;2005us;1452us;2013us;1459us;2013us;1466us;2013us;1473us;2013us;1490us;2013us;1497us;2013us;1498us;2013us;1504us;2013us;1510us;2013us;1511us;2013us;1512us;2013us;1524us;2013us;1530us;2013us;1540us;2013us;1553us;2013us;1555us;2013us;1558us;2013us;1559us;2013us;1565us;2013us;1585us;2013us;1590us;2013us;1615us;2013us;1648us;2013us;1655us;2007us;1657us;2013us;1660us;2007us;1662us;2013us;1672us;2007us;1674us;2007us;1893us;2013us;2008us;2007us;2053us;2013us;2057us;2013us;8us;65535us;575us;1962us;705us;1962us;956us;1962us;986us;1962us;1466us;1962us;1511us;1962us;1512us;1962us;1961us;1962us;2us;65535us;1968us;2003us;2001us;2002us;8us;65535us;575us;1967us;705us;1967us;956us;1967us;986us;1967us;1466us;1967us;1511us;1967us;1512us;1967us;1961us;1967us;14us;65535us;111us;2011us;181us;2011us;184us;2011us;212us;2011us;215us;2011us;444us;2011us;457us;2011us;567us;2011us;689us;2011us;1403us;1463us;1440us;1463us;1443us;1463us;1445us;2011us;1446us;2011us;61us;65535us;40us;45us;424us;512us;429us;512us;471us;512us;507us;508us;510us;511us;513us;517us;515us;516us;829us;512us;892us;512us;911us;512us;914us;512us;915us;512us;920us;512us;921us;512us;924us;512us;926us;512us;927us;512us;936us;512us;940us;512us;941us;512us;943us;512us;945us;512us;948us;512us;950us;512us;956us;512us;960us;512us;962us;512us;964us;512us;972us;512us;975us;512us;986us;512us;994us;512us;1015us;512us;1018us;512us;1024us;512us;1025us;512us;1028us;512us;1029us;512us;1032us;512us;1034us;512us;1035us;512us;1041us;512us;1045us;512us;1095us;512us;1100us;512us;1152us;512us;1183us;512us;1190us;512us;1322us;512us;1324us;512us;1330us;512us;1332us;512us;1339us;512us;1341us;512us;1343us;512us;1655us;512us;1660us;512us;1672us;512us;1674us;512us;2008us;2009us;11us;65535us;111us;112us;181us;704us;184us;185us;212us;213us;215us;216us;444us;704us;457us;458us;567us;704us;689us;704us;1445us;1447us;1446us;1447us;148us;65535us;6us;1451us;31us;1451us;117us;1451us;119us;1451us;242us;1451us;256us;1451us;279us;1451us;427us;1451us;432us;1451us;474us;1451us;497us;1451us;701us;1451us;713us;1451us;774us;1451us;780us;1451us;832us;1451us;836us;1451us;846us;1451us;1047us;1451us;1053us;1451us;1069us;1451us;1071us;1451us;1074us;1451us;1077us;1451us;1096us;1451us;1101us;1451us;1107us;1451us;1110us;1451us;1113us;1451us;1119us;1451us;1123us;1451us;1127us;1451us;1133us;1451us;1135us;1451us;1140us;1451us;1142us;1451us;1144us;1451us;1146us;1451us;1148us;1451us;1150us;1451us;1154us;1451us;1164us;1451us;1171us;1451us;1177us;1451us;1179us;1451us;1184us;1451us;1188us;1451us;1191us;1451us;1195us;1451us;1198us;1451us;1201us;1451us;1203us;1451us;1206us;1451us;1208us;1451us;1257us;1451us;1259us;1451us;1263us;1451us;1265us;1451us;1267us;1451us;1269us;1451us;1271us;1451us;1273us;1451us;1275us;1451us;1277us;1451us;1279us;1451us;1281us;1451us;1283us;1451us;1285us;1451us;1287us;1451us;1289us;1451us;1291us;1451us;1293us;1451us;1295us;1451us;1297us;1451us;1299us;1451us;1301us;1451us;1303us;1451us;1304us;1451us;1305us;1451us;1306us;1451us;1309us;1451us;1319us;1451us;1348us;1451us;1349us;1451us;1353us;1451us;1355us;1451us;1358us;1451us;1359us;1451us;1361us;1451us;1364us;1451us;1366us;1451us;1368us;1451us;1370us;1451us;1372us;1451us;1373us;1451us;1374us;1451us;1375us;1451us;1377us;1451us;1378us;1451us;1380us;1451us;1381us;1451us;1383us;1451us;1384us;1451us;1386us;1451us;1387us;1451us;1389us;1451us;1390us;1451us;1392us;1451us;1393us;1451us;1407us;1451us;1409us;1451us;1411us;1451us;1412us;1451us;1413us;1451us;1416us;1451us;1421us;1451us;1429us;1451us;1430us;1451us;1433us;1451us;1434us;1451us;1452us;1451us;1459us;1451us;1466us;1451us;1473us;1451us;1490us;1451us;1497us;1451us;1498us;1451us;1504us;1451us;1510us;1451us;1511us;1451us;1512us;1451us;1524us;1451us;1530us;1451us;1540us;1451us;1553us;1451us;1555us;1451us;1558us;1451us;1559us;1451us;1565us;1451us;1585us;1451us;1590us;1451us;1615us;1451us;1648us;1451us;1657us;1451us;1662us;1451us;1893us;1451us;2053us;1451us;2057us;1451us;16us;65535us;51us;2017us;82us;2017us;85us;2017us;86us;2017us;87us;2019us;90us;2017us;232us;2017us;251us;2017us;257us;2017us;262us;2017us;266us;2017us;267us;2017us;268us;2017us;269us;2017us;2017us;2017us;2019us;2019us;14us;65535us;51us;91us;82us;91us;85us;91us;86us;91us;90us;91us;232us;270us;251us;270us;257us;258us;262us;264us;266us;270us;267us;270us;268us;270us;269us;270us;2017us;2018us;2us;65535us;87us;88us;2019us;2020us;10us;65535us;175us;2034us;323us;333us;411us;2034us;548us;2034us;742us;743us;928us;930us;930us;932us;1012us;1045us;1036us;1038us;1068us;1069us;4us;65535us;226us;227us;317us;318us;523us;524us;526us;527us;2us;65535us;1632us;1633us;1642us;1643us;10us;65535us;121us;122us;448us;449us;462us;463us;465us;466us;467us;468us;469us;470us;475us;476us;554us;555us;556us;557us;560us;561us;2us;65535us;68us;69us;238us;239us;19us;65535us;79us;80us;141us;142us;248us;249us;325us;326us;328us;329us;377us;378us;479us;480us;683us;718us;711us;712us;714us;715us;716us;717us;1103us;1104us;1153us;1161us;1186us;1187us;1193us;1194us;1200us;1201us;1619us;1623us;1620us;1621us;1643us;1644us;8us;65535us;175us;176us;323us;324us;411us;412us;548us;549us;742us;745us;928us;929us;1012us;1044us;1036us;1037us;4us;65535us;55us;56us;60us;61us;770us;771us;776us;777us;11us;65535us;108us;109us;182us;183us;414us;423us;416us;423us;421us;423us;447us;429us;456us;457us;552us;828us;553us;429us;559us;429us;825us;828us;7us;65535us;109us;110us;196us;748us;199us;748us;483us;484us;492us;493us;746us;748us;828us;829us;4us;65535us;1081us;1171us;1153us;1154us;1163us;1164us;1233us;1309us;9us;65535us;1079us;1158us;1080us;1168us;1082us;1175us;1083us;1317us;1155us;1156us;1165us;1166us;1172us;1173us;1310us;1311us;1313us;1314us;2us;65535us;286us;311us;301us;311us;2us;65535us;98us;130us;123us;126us;2us;65535us;73us;98us;97us;98us;309us;65535us;6us;870us;8us;870us;31us;870us;40us;42us;114us;870us;117us;870us;119us;870us;152us;870us;181us;870us;187us;870us;191us;870us;193us;870us;204us;870us;242us;870us;256us;870us;279us;870us;295us;870us;336us;870us;340us;870us;345us;870us;390us;870us;424us;870us;427us;870us;429us;870us;432us;870us;444us;870us;451us;870us;460us;870us;471us;870us;474us;870us;487us;870us;497us;870us;503us;870us;528us;870us;531us;870us;567us;870us;575us;870us;576us;577us;619us;870us;632us;870us;634us;870us;638us;870us;643us;870us;650us;870us;653us;870us;664us;870us;675us;870us;690us;870us;692us;870us;695us;870us;699us;870us;701us;870us;713us;870us;719us;870us;722us;870us;725us;870us;728us;870us;731us;870us;734us;870us;751us;870us;765us;870us;774us;870us;780us;870us;829us;870us;832us;870us;836us;870us;846us;870us;852us;870us;892us;870us;911us;870us;914us;870us;915us;870us;920us;870us;921us;870us;924us;870us;926us;870us;927us;870us;936us;870us;940us;870us;941us;870us;943us;870us;945us;870us;948us;870us;950us;870us;952us;870us;956us;870us;960us;870us;962us;870us;964us;870us;972us;870us;975us;870us;986us;870us;994us;870us;1015us;870us;1018us;870us;1021us;870us;1024us;870us;1025us;870us;1028us;870us;1029us;870us;1032us;870us;1034us;870us;1035us;870us;1041us;870us;1045us;870us;1047us;870us;1053us;870us;1063us;870us;1069us;870us;1071us;870us;1074us;870us;1077us;870us;1095us;870us;1096us;870us;1100us;870us;1101us;870us;1107us;870us;1110us;870us;1113us;870us;1119us;870us;1123us;870us;1127us;870us;1133us;870us;1135us;870us;1140us;870us;1142us;870us;1144us;870us;1146us;870us;1148us;870us;1150us;870us;1152us;870us;1154us;870us;1164us;870us;1171us;870us;1177us;870us;1179us;870us;1183us;870us;1184us;870us;1188us;870us;1190us;870us;1191us;870us;1195us;870us;1198us;870us;1201us;870us;1203us;870us;1206us;870us;1208us;870us;1248us;870us;1251us;870us;1254us;870us;1257us;870us;1259us;870us;1263us;870us;1265us;870us;1267us;870us;1269us;870us;1271us;870us;1273us;870us;1275us;870us;1277us;870us;1279us;870us;1281us;870us;1283us;870us;1285us;870us;1287us;870us;1289us;870us;1291us;870us;1293us;870us;1295us;870us;1297us;870us;1299us;870us;1301us;870us;1303us;870us;1304us;870us;1305us;870us;1306us;870us;1309us;870us;1319us;870us;1322us;870us;1324us;870us;1330us;870us;1332us;870us;1339us;870us;1341us;870us;1343us;870us;1348us;870us;1349us;870us;1353us;870us;1355us;870us;1358us;870us;1359us;870us;1361us;870us;1364us;870us;1366us;870us;1368us;870us;1370us;870us;1372us;870us;1373us;870us;1374us;870us;1375us;870us;1377us;870us;1378us;870us;1380us;870us;1381us;870us;1383us;870us;1384us;870us;1386us;870us;1387us;870us;1389us;870us;1390us;870us;1392us;870us;1393us;870us;1395us;870us;1396us;870us;1399us;870us;1400us;870us;1407us;870us;1409us;870us;1411us;870us;1412us;870us;1413us;870us;1416us;870us;1421us;870us;1429us;870us;1430us;870us;1433us;870us;1434us;870us;1452us;870us;1459us;870us;1466us;870us;1473us;870us;1490us;870us;1497us;870us;1498us;870us;1504us;870us;1510us;870us;1511us;870us;1512us;870us;1524us;870us;1530us;870us;1538us;870us;1540us;870us;1553us;870us;1555us;870us;1558us;870us;1559us;870us;1562us;1563us;1565us;870us;1571us;870us;1574us;870us;1576us;870us;1578us;870us;1580us;870us;1585us;870us;1590us;870us;1615us;870us;1640us;870us;1648us;870us;1655us;870us;1657us;870us;1660us;870us;1662us;870us;1672us;870us;1674us;870us;1678us;870us;1680us;870us;1681us;870us;1685us;870us;1689us;870us;1692us;870us;1695us;870us;1698us;870us;1700us;870us;1702us;870us;1707us;870us;1711us;870us;1716us;870us;1722us;870us;1725us;870us;1728us;870us;1731us;870us;1737us;870us;1740us;870us;1741us;870us;1743us;870us;1744us;870us;1747us;870us;1751us;870us;1754us;870us;1756us;870us;1759us;870us;1762us;870us;1764us;870us;1774us;870us;1780us;870us;1786us;870us;1789us;870us;1856us;870us;1860us;870us;1866us;870us;1876us;870us;1882us;870us;1884us;870us;1893us;870us;1909us;870us;1911us;870us;1922us;870us;2053us;870us;2057us;870us;308us;65535us;6us;871us;8us;871us;31us;871us;40us;46us;114us;871us;117us;871us;119us;871us;152us;871us;181us;871us;187us;871us;191us;871us;193us;871us;204us;871us;242us;871us;256us;871us;279us;871us;295us;871us;336us;871us;340us;871us;345us;871us;390us;871us;424us;871us;427us;871us;429us;871us;432us;871us;444us;871us;451us;871us;460us;871us;471us;871us;474us;871us;487us;871us;497us;871us;503us;871us;528us;871us;531us;871us;567us;871us;575us;871us;576us;871us;619us;871us;632us;871us;634us;871us;638us;871us;643us;871us;650us;871us;653us;871us;664us;871us;675us;871us;690us;871us;692us;871us;695us;871us;699us;871us;701us;871us;713us;871us;719us;871us;722us;871us;725us;871us;728us;871us;731us;871us;734us;871us;751us;871us;765us;871us;774us;871us;780us;871us;829us;871us;832us;871us;836us;871us;846us;871us;852us;871us;892us;871us;911us;871us;914us;871us;915us;871us;920us;871us;921us;871us;924us;871us;926us;871us;927us;871us;936us;871us;940us;871us;941us;871us;943us;871us;945us;871us;948us;871us;950us;871us;952us;871us;956us;871us;960us;871us;962us;871us;964us;871us;972us;871us;975us;871us;986us;871us;994us;871us;1015us;871us;1018us;871us;1021us;871us;1024us;871us;1025us;871us;1028us;871us;1029us;871us;1032us;871us;1034us;871us;1035us;871us;1041us;871us;1045us;871us;1047us;871us;1053us;871us;1063us;871us;1069us;871us;1071us;871us;1074us;871us;1077us;871us;1095us;871us;1096us;871us;1100us;871us;1101us;871us;1107us;871us;1110us;871us;1113us;871us;1119us;871us;1123us;871us;1127us;871us;1133us;871us;1135us;871us;1140us;871us;1142us;871us;1144us;871us;1146us;871us;1148us;871us;1150us;871us;1152us;871us;1154us;871us;1164us;871us;1171us;871us;1177us;871us;1179us;871us;1183us;871us;1184us;871us;1188us;871us;1190us;871us;1191us;871us;1195us;871us;1198us;871us;1201us;871us;1203us;871us;1206us;871us;1208us;871us;1248us;871us;1251us;871us;1254us;871us;1257us;871us;1259us;871us;1263us;871us;1265us;871us;1267us;871us;1269us;871us;1271us;871us;1273us;871us;1275us;871us;1277us;871us;1279us;871us;1281us;871us;1283us;871us;1285us;871us;1287us;871us;1289us;871us;1291us;871us;1293us;871us;1295us;871us;1297us;871us;1299us;871us;1301us;871us;1303us;871us;1304us;871us;1305us;871us;1306us;871us;1309us;871us;1319us;871us;1322us;871us;1324us;871us;1330us;871us;1332us;871us;1339us;871us;1341us;871us;1343us;871us;1348us;871us;1349us;871us;1353us;871us;1355us;871us;1358us;871us;1359us;871us;1361us;871us;1364us;871us;1366us;871us;1368us;871us;1370us;871us;1372us;871us;1373us;871us;1374us;871us;1375us;871us;1377us;871us;1378us;871us;1380us;871us;1381us;871us;1383us;871us;1384us;871us;1386us;871us;1387us;871us;1389us;871us;1390us;871us;1392us;871us;1393us;871us;1395us;871us;1396us;871us;1399us;871us;1400us;871us;1407us;871us;1409us;871us;1411us;871us;1412us;871us;1413us;871us;1416us;871us;1421us;871us;1429us;871us;1430us;871us;1433us;871us;1434us;871us;1452us;871us;1459us;871us;1466us;871us;1473us;871us;1490us;871us;1497us;871us;1498us;871us;1504us;871us;1510us;871us;1511us;871us;1512us;871us;1524us;871us;1530us;871us;1538us;871us;1540us;871us;1553us;871us;1555us;871us;1558us;871us;1559us;871us;1565us;871us;1571us;871us;1574us;871us;1576us;871us;1578us;871us;1580us;871us;1585us;871us;1590us;871us;1615us;871us;1640us;871us;1648us;871us;1655us;871us;1657us;871us;1660us;871us;1662us;871us;1672us;871us;1674us;871us;1678us;871us;1680us;871us;1681us;871us;1685us;871us;1689us;871us;1692us;871us;1695us;871us;1698us;871us;1700us;871us;1702us;871us;1707us;871us;1711us;871us;1716us;871us;1722us;871us;1725us;871us;1728us;871us;1731us;871us;1737us;871us;1740us;871us;1741us;871us;1743us;871us;1744us;871us;1747us;871us;1751us;871us;1754us;871us;1756us;871us;1759us;871us;1762us;871us;1764us;871us;1774us;871us;1780us;871us;1786us;871us;1789us;871us;1856us;871us;1860us;871us;1866us;871us;1876us;871us;1882us;871us;1884us;871us;1893us;871us;1909us;871us;1911us;871us;1922us;871us;2053us;871us;2057us;871us;2us;65535us;2053us;2054us;2057us;2058us;4us;65535us;2053us;2056us;2054us;2055us;2057us;2061us;2058us;2059us;155us;65535us;6us;1483us;31us;1483us;117us;1483us;119us;1483us;242us;1483us;256us;1483us;279us;1483us;336us;1483us;340us;1483us;345us;1483us;427us;1483us;432us;1483us;474us;1483us;497us;1483us;531us;1483us;701us;1483us;713us;1483us;774us;1483us;780us;1483us;832us;1483us;836us;1483us;846us;1483us;1047us;1483us;1053us;1483us;1069us;1483us;1071us;1483us;1074us;1483us;1077us;1483us;1096us;1483us;1101us;1483us;1107us;1483us;1110us;1483us;1113us;1483us;1119us;1483us;1123us;1483us;1127us;1483us;1133us;1483us;1135us;1483us;1140us;1483us;1142us;1483us;1144us;1483us;1146us;1483us;1148us;1483us;1150us;1483us;1154us;1483us;1164us;1483us;1171us;1483us;1177us;1483us;1179us;1483us;1184us;1483us;1188us;1483us;1191us;1483us;1195us;1483us;1198us;1483us;1201us;1483us;1203us;1483us;1206us;1483us;1208us;1483us;1257us;1483us;1259us;1483us;1263us;1483us;1265us;1483us;1267us;1483us;1269us;1483us;1271us;1483us;1273us;1483us;1275us;1483us;1277us;1483us;1279us;1483us;1281us;1483us;1283us;1483us;1285us;1483us;1287us;1483us;1289us;1483us;1291us;1483us;1293us;1483us;1295us;1483us;1297us;1483us;1299us;1483us;1301us;1483us;1303us;1483us;1304us;1483us;1305us;1483us;1306us;1483us;1309us;1483us;1319us;1483us;1348us;1483us;1349us;1483us;1353us;1483us;1355us;1483us;1358us;1483us;1359us;1483us;1361us;1483us;1364us;1483us;1366us;1483us;1368us;1483us;1370us;1483us;1372us;1483us;1373us;1483us;1374us;1483us;1375us;1483us;1377us;1483us;1378us;1483us;1380us;1483us;1381us;1483us;1383us;1483us;1384us;1483us;1386us;1483us;1387us;1483us;1389us;1483us;1390us;1483us;1392us;1483us;1393us;1483us;1399us;1483us;1400us;1483us;1407us;1483us;1409us;1483us;1411us;1483us;1412us;1483us;1413us;1483us;1416us;1483us;1421us;1483us;1429us;1483us;1430us;1483us;1433us;1483us;1434us;1483us;1452us;1483us;1459us;1483us;1466us;1483us;1473us;1483us;1490us;1483us;1497us;1483us;1498us;1483us;1504us;1483us;1510us;1483us;1511us;1483us;1512us;1483us;1524us;1483us;1530us;1483us;1540us;1483us;1553us;1483us;1555us;1483us;1558us;1483us;1559us;1483us;1565us;1483us;1580us;1483us;1585us;1483us;1590us;1483us;1615us;1483us;1648us;1483us;1657us;1483us;1662us;1483us;1893us;1483us;2053us;1483us;2057us;1483us;11us;65535us;335us;336us;339us;340us;344us;345us;369us;370us;529us;531us;793us;794us;805us;809us;808us;809us;1397us;1399us;1398us;1400us;1579us;1580us;5us;65535us;112us;626us;185us;626us;458us;626us;602us;621us;940us;626us;14us;65535us;31us;281us;72us;102us;96us;102us;198us;201us;242us;281us;256us;281us;275us;281us;292us;295us;322us;349us;333us;349us;355us;481us;1563us;1570us;2065us;2067us;2066us;2067us;10us;65535us;31us;53us;72us;53us;96us;53us;242us;53us;256us;53us;275us;53us;322us;347us;333us;347us;2070us;2072us;2071us;2072us;9us;65535us;580us;586us;581us;582us;584us;585us;968us;969us;970us;971us;1092us;1544us;1540us;1546us;1541us;1542us;2075us;2076us;5us;65535us;591us;592us;594us;595us;1093us;1652us;1648us;1654us;1649us;1650us;45us;65535us;578us;579us;609us;610us;662us;663us;665us;666us;669us;670us;706us;707us;709us;710us;796us;797us;882us;883us;892us;895us;893us;894us;957us;958us;987us;988us;990us;991us;995us;996us;998us;999us;1090us;1517us;1091us;1518us;1243us;1525us;1262us;1460us;1320us;1321us;1467us;1468us;1471us;1472us;1510us;1513us;1511us;1513us;1512us;1513us;1514us;1515us;1529us;1530us;1536us;1537us;1572us;1573us;1576us;1577us;1736us;1775us;1781us;1782us;1867us;1868us;1877us;1879us;1878us;1879us;1885us;1886us;1896us;1898us;1897us;1899us;1934us;1935us;1962us;1963us;1964us;1965us;1968us;1969us;1971us;1972us;2080us;2081us;28us;65535us;78us;79us;82us;83us;120us;121us;124us;125us;128us;129us;144us;145us;162us;163us;170us;171us;218us;219us;247us;248us;251us;252us;268us;308us;298us;299us;302us;303us;305us;306us;343us;344us;376us;384us;380us;381us;400us;402us;404us;406us;544us;545us;837us;838us;1047us;1051us;1048us;1049us;1053us;1056us;1054us;1055us;1075us;1076us;2084us;2085us;1us;65535us;1514us;1516us;51us;65535us;322us;331us;324us;330us;394us;396us;431us;435us;473us;477us;496us;500us;528us;534us;915us;916us;920us;922us;921us;923us;924us;925us;1013us;1557us;1028us;1030us;1029us;1031us;1032us;1033us;1152us;1174us;1153us;1160us;1154us;1159us;1155us;1157us;1263us;1264us;1265us;1266us;1267us;1268us;1269us;1270us;1271us;1272us;1273us;1274us;1275us;1276us;1277us;1278us;1279us;1280us;1281us;1282us;1283us;1284us;1285us;1286us;1287us;1288us;1289us;1290us;1291us;1292us;1293us;1294us;1295us;1296us;1297us;1298us;1299us;1300us;1301us;1302us;1364us;1365us;1366us;1367us;1368us;1369us;1370us;1371us;1555us;1556us;1614us;1618us;1615us;1617us;1904us;1905us;1911us;1915us;1916us;1918us;1958us;1960us;2008us;2010us;|] +let _fsyacc_sparseGotoTableRowOffsets = [|0us;1us;2us;3us;4us;5us;7us;15us;20us;26us;31us;36us;41us;46us;70us;72us;74us;76us;83us;88us;90us;93us;96us;99us;103us;110us;120us;130us;140us;143us;145us;148us;152us;154us;157us;160us;163us;167us;176us;185us;197us;201us;204us;207us;210us;216us;218us;220us;223us;226us;229us;233us;239us;249us;260us;271us;287us;312us;314us;316us;319us;321us;403us;527us;651us;653us;656us;659us;664us;671us;674us;678us;680us;683us;686us;689us;693us;702us;713us;715us;718us;722us;726us;731us;742us;746us;749us;751us;807us;834us;916us;918us;923us;926us;929us;932us;935us;939us;942us;947us;952us;955us;960us;970us;1058us;1147us;1152us;1162us;1164us;1166us;1170us;1176us;1178us;1180us;1185us;1189us;1287us;1291us;1295us;1299us;1304us;1306us;1310us;1316us;1320us;1324us;1329us;1333us;1337us;1346us;1355us;1362us;1366us;1370us;1374us;1379us;1386us;1388us;1390us;1511us;1519us;1640us;1760us;1764us;1770us;1891us;1893us;1895us;1899us;1902us;1904us;1909us;1912us;1918us;1921us;1923us;1926us;1928us;1930us;1932us;1935us;2243us;2245us;2250us;2254us;2465us;2469us;2471us;2473us;2510us;2525us;2540us;2555us;2559us;2563us;2607us;2614us;2626us;2682us;2685us;2713us;2741us;2769us;2772us;2775us;2779us;2807us;2814us;2820us;2873us;2875us;2933us;3138us;3143us;3260us;3263us;3265us;3270us;3275us;3285us;3295us;3297us;3299us;3302us;3305us;3307us;3424us;3559us;3695us;3700us;3849us;3853us;4009us;4165us;4376us;4532us;4688us;4692us;4696us;4698us;4854us;4856us;4858us;4860us;4862us;4864us;4866us;4868us;4870us;4874us;4876us;4881us;4883us;4885us;4887us;4890us;4897us;4904us;4908us;4914us;4918us;4920us;4922us;4924us;4927us;4929us;4934us;4940us;5096us;5254us;5371us;5488us;5491us;5497us;5501us;5512us;5523us;5528us;5543us;5555us;5589us;5591us;5625us;5637us;5724us;5836us;5948us;6014us;6024us;6111us;6125us;6132us;6135us;6222us;6227us;6315us;6413us;6418us;6425us;6436us;6439us;6443us;6445us;6452us;6459us;6466us;6472us;6598us;6978us;7117us;7341us;7350us;7353us;7362us;7377us;7439us;7451us;7600us;7617us;7632us;7635us;7646us;7651us;7654us;7665us;7668us;7688us;7697us;7702us;7714us;7722us;7727us;7737us;7740us;7743us;7746us;8056us;8365us;8368us;8373us;8529us;8541us;8547us;8562us;8573us;8583us;8589us;8635us;8664us;8666us;|] +let _fsyacc_stateToProdIdxsTableElements = [| 1us;0us;1us;0us;1us;1us;1us;1us;1us;2us;1us;2us;1us;3us;1us;3us;1us;4us;1us;4us;1us;5us;1us;6us;1us;7us;1us;8us;1us;9us;1us;10us;2us;11us;14us;1us;11us;2us;12us;15us;1us;12us;2us;13us;16us;1us;13us;1us;14us;1us;14us;1us;15us;1us;15us;1us;16us;1us;16us;2us;17us;18us;1us;18us;8us;19us;145us;146us;147us;148us;149us;150us;151us;8us;19us;145us;146us;147us;148us;149us;150us;151us;54us;19us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1us;20us;2us;21us;22us;1us;22us;1us;23us;1us;24us;1us;25us;1us;25us;2us;25us;27us;1us;27us;1us;28us;1us;29us;2us;30us;1109us;1us;31us;1us;32us;2us;33us;34us;1us;33us;1us;34us;1us;34us;3us;35us;53us;56us;1us;35us;3us;36us;37us;38us;3us;36us;37us;38us;3us;36us;37us;38us;3us;36us;37us;38us;3us;36us;1112us;1113us;1us;37us;1us;38us;2us;39us;40us;2us;39us;40us;3us;39us;1112us;1113us;1us;40us;2us;41us;42us;1us;42us;2us;43us;44us;1us;43us;1us;45us;1us;45us;1us;45us;7us;46us;60us;61us;62us;63us;64us;66us;7us;46us;60us;61us;62us;63us;64us;66us;4us;46us;60us;61us;62us;1us;46us;1us;47us;1us;48us;3us;49us;50us;51us;2us;49us;50us;1us;49us;1us;49us;1us;50us;3us;51us;53us;56us;1us;51us;1us;52us;2us;53us;56us;3us;53us;56us;62us;2us;55us;57us;2us;55us;57us;1us;55us;1us;56us;1us;56us;1us;56us;1us;58us;1us;59us;6us;60us;61us;62us;63us;64us;66us;6us;60us;61us;62us;63us;64us;66us;3us;60us;61us;62us;2us;60us;61us;1us;60us;1us;61us;1us;62us;1us;63us;1us;63us;1us;63us;1us;64us;1us;65us;1us;66us;1us;66us;1us;66us;1us;66us;1us;66us;1us;66us;1us;66us;1us;66us;1us;66us;1us;66us;2us;68us;69us;54us;68us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1us;69us;54us;69us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1us;69us;1us;69us;3us;70us;71us;158us;1us;70us;1us;70us;1us;71us;1us;71us;1us;71us;1us;71us;1us;72us;1us;72us;1us;72us;1us;73us;1us;73us;1us;73us;2us;75us;76us;1us;75us;1us;75us;1us;76us;3us;77us;86us;87us;1us;77us;1us;77us;1us;77us;1us;77us;1us;77us;1us;77us;1us;78us;1us;78us;1us;79us;1us;80us;1us;81us;1us;81us;1us;81us;1us;82us;3us;83us;84us;85us;2us;83us;84us;1us;83us;1us;84us;1us;85us;1us;85us;2us;86us;87us;2us;86us;87us;1us;86us;1us;87us;2us;88us;89us;2us;88us;89us;1us;88us;1us;89us;2us;90us;91us;2us;90us;91us;1us;90us;1us;91us;1us;92us;1us;93us;1us;95us;1us;95us;1us;95us;8us;96us;97us;98us;99us;100us;101us;102us;103us;13us;96us;97us;98us;99us;100us;101us;102us;103us;299us;300us;301us;302us;303us;8us;96us;97us;98us;99us;100us;101us;102us;103us;13us;96us;97us;98us;99us;100us;101us;102us;103us;299us;300us;301us;302us;303us;1us;96us;1us;96us;1us;96us;1us;96us;1us;96us;1us;96us;1us;96us;1us;96us;1us;96us;1us;97us;4us;97us;1008us;1009us;1010us;2us;98us;99us;4us;98us;1008us;1009us;1010us;1us;99us;1us;100us;1us;100us;6us;101us;102us;188us;189us;232us;233us;1us;101us;1us;101us;1us;102us;1us;102us;1us;103us;1us;103us;1us;103us;1us;105us;1us;105us;2us;106us;107us;2us;106us;107us;1us;106us;1us;107us;3us;108us;109us;110us;3us;108us;109us;110us;2us;109us;110us;1us;109us;1us;109us;1us;110us;1us;111us;1us;111us;1us;111us;1us;112us;1us;113us;1us;114us;1us;114us;1us;115us;1us;115us;1us;115us;2us;117us;118us;1us;117us;1us;118us;1us;118us;2us;119us;142us;1us;119us;2us;120us;121us;1us;121us;2us;122us;123us;1us;122us;1us;124us;1us;124us;1us;124us;12us;125us;133us;134us;135us;137us;145us;146us;147us;148us;149us;150us;151us;11us;125us;133us;134us;135us;145us;146us;147us;148us;149us;150us;151us;3us;125us;150us;151us;1us;125us;1us;126us;3us;127us;128us;129us;2us;127us;128us;1us;127us;1us;127us;1us;128us;2us;129us;142us;1us;129us;1us;130us;1us;131us;11us;133us;134us;135us;137us;145us;146us;147us;148us;149us;150us;151us;10us;133us;134us;135us;145us;146us;147us;148us;149us;150us;151us;56us;133us;134us;135us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;2us;133us;134us;1us;133us;1us;136us;1us;137us;4us;138us;139us;140us;141us;1us;138us;2us;139us;141us;1us;139us;1us;142us;2us;142us;151us;2us;142us;164us;2us;142us;169us;1us;142us;1us;142us;1us;143us;1us;144us;7us;145us;146us;147us;148us;149us;150us;151us;7us;145us;146us;147us;148us;149us;150us;151us;1us;145us;3us;145us;612us;613us;1us;146us;5us;146us;614us;615us;616us;617us;1us;147us;1us;148us;1us;148us;1us;148us;1us;149us;2us;150us;151us;1us;150us;1us;150us;1us;151us;2us;152us;171us;1us;152us;1us;153us;4us;154us;155us;156us;157us;3us;154us;1112us;1113us;1us;155us;2us;156us;157us;4us;156us;1008us;1009us;1010us;1us;157us;3us;158us;1112us;1113us;1us;158us;3us;159us;1112us;1113us;5us;160us;161us;162us;163us;164us;2us;160us;161us;1us;160us;1us;161us;2us;162us;163us;1us;162us;1us;163us;1us;164us;1us;165us;3us;166us;1112us;1113us;3us;167us;168us;169us;2us;167us;168us;1us;167us;1us;168us;1us;169us;1us;170us;1us;170us;1us;170us;1us;171us;2us;173us;174us;1us;174us;4us;175us;176us;177us;178us;3us;175us;177us;180us;2us;175us;177us;1us;175us;1us;175us;2us;176us;607us;1us;176us;1us;176us;1us;177us;1us;178us;1us;179us;2us;180us;1181us;1us;180us;3us;181us;1112us;1113us;1us;181us;1us;181us;2us;182us;183us;3us;182us;1112us;1113us;1us;182us;1us;182us;1us;183us;3us;183us;1112us;1113us;1us;183us;1us;183us;1us;183us;1us;184us;1us;184us;1us;185us;1us;185us;2us;186us;1111us;1us;186us;1us;187us;1us;187us;7us;188us;189us;232us;233us;235us;243us;249us;1us;188us;1us;190us;1us;191us;1us;192us;1us;193us;1us;193us;1us;193us;1us;194us;1us;194us;1us;194us;4us;196us;197us;198us;199us;1us;197us;2us;198us;199us;2us;198us;199us;2us;198us;199us;2us;198us;199us;2us;198us;199us;1us;198us;1us;198us;1us;199us;5us;200us;201us;202us;211us;212us;2us;200us;201us;2us;200us;201us;2us;200us;201us;2us;200us;201us;1us;200us;1us;200us;1us;201us;1us;202us;1us;203us;1us;203us;1us;204us;1us;205us;1us;206us;1us;206us;1us;206us;1us;207us;3us;208us;209us;210us;2us;208us;209us;1us;208us;1us;209us;2us;210us;217us;1us;210us;2us;211us;212us;2us;211us;212us;1us;211us;1us;212us;2us;213us;214us;2us;213us;214us;1us;213us;1us;214us;1us;215us;1us;216us;1us;217us;1us;217us;1us;219us;1us;219us;1us;219us;1us;220us;1us;220us;2us;221us;222us;2us;221us;222us;1us;221us;1us;222us;2us;223us;224us;1us;224us;1us;224us;1us;225us;1us;225us;1us;225us;1us;225us;1us;225us;1us;225us;4us;226us;227us;228us;229us;4us;226us;227us;228us;229us;4us;226us;227us;228us;229us;1us;226us;1us;226us;1us;227us;1us;228us;1us;229us;2us;230us;231us;1us;231us;2us;232us;233us;1us;233us;16us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;247us;248us;249us;21us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;247us;248us;249us;299us;300us;301us;302us;303us;16us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;247us;248us;249us;21us;234us;235us;236us;237us;238us;239us;240us;241us;242us;243us;244us;245us;246us;247us;248us;249us;299us;300us;301us;302us;303us;1us;234us;1us;235us;3us;236us;237us;244us;1us;236us;1us;236us;1us;237us;2us;238us;239us;4us;238us;1008us;1009us;1010us;1us;238us;1us;239us;1us;240us;1us;240us;1us;240us;1us;240us;1us;240us;1us;240us;1us;240us;1us;240us;1us;240us;1us;241us;1us;242us;1us;242us;1us;243us;1us;243us;1us;244us;1us;244us;4us;245us;246us;247us;248us;3us;245us;246us;247us;3us;245us;246us;247us;1us;245us;1us;245us;1us;245us;1us;246us;1us;247us;1us;248us;1us;248us;1us;249us;1us;249us;4us;250us;251us;252us;253us;4us;250us;251us;252us;253us;4us;250us;251us;252us;253us;3us;250us;251us;252us;2us;250us;251us;1us;250us;1us;251us;1us;252us;1us;253us;4us;254us;255us;256us;257us;4us;254us;255us;256us;257us;4us;254us;255us;256us;257us;3us;254us;255us;256us;3us;254us;255us;256us;1us;254us;1us;254us;1us;254us;1us;255us;1us;256us;1us;257us;2us;259us;260us;1us;259us;1us;260us;2us;261us;541us;1us;261us;1us;261us;1us;262us;1us;262us;1us;262us;1us;263us;2us;264us;265us;1us;264us;1us;264us;1us;264us;1us;265us;1us;267us;1us;268us;1us;269us;1us;270us;2us;271us;272us;1us;271us;1us;271us;1us;274us;1us;274us;1us;274us;3us;276us;277us;278us;2us;276us;277us;1us;276us;1us;277us;1us;277us;1us;277us;1us;278us;1us;279us;2us;281us;282us;1us;281us;1us;282us;1us;283us;2us;285us;286us;1us;285us;1us;286us;2us;287us;288us;2us;287us;288us;1us;287us;1us;288us;1us;289us;2us;290us;291us;2us;290us;291us;1us;290us;4us;292us;293us;294us;295us;5us;292us;293us;294us;295us;444us;3us;292us;293us;294us;1us;292us;1us;292us;1us;293us;1us;293us;1us;294us;1us;295us;1us;295us;1us;295us;1us;296us;1us;296us;1us;297us;1us;298us;5us;299us;300us;301us;302us;303us;5us;299us;300us;301us;302us;303us;4us;299us;1000us;1112us;1113us;1us;299us;1us;299us;1us;299us;1us;300us;1us;301us;1us;302us;11us;303us;375us;376us;1011us;1061us;1062us;1073us;1114us;1115us;1117us;1118us;2us;303us;335us;2us;303us;475us;1us;303us;1us;303us;4us;304us;305us;306us;307us;2us;304us;305us;1us;304us;1us;305us;1us;306us;1us;306us;1us;307us;6us;308us;1063us;1064us;1065us;1066us;1067us;1us;308us;1us;309us;3us;310us;311us;312us;2us;310us;311us;1us;310us;1us;311us;1us;312us;1us;312us;1us;313us;1us;314us;1us;315us;1us;316us;1us;317us;4us;318us;319us;320us;321us;4us;318us;320us;1112us;1113us;1us;319us;3us;319us;1112us;1113us;1us;320us;1us;321us;1us;322us;1us;323us;2us;323us;324us;1us;323us;2us;324us;328us;3us;324us;329us;330us;1us;324us;2us;324us;329us;1us;324us;1us;325us;2us;326us;327us;2us;326us;327us;1us;327us;3us;327us;340us;341us;1us;328us;1us;328us;1us;328us;1us;328us;1us;329us;1us;332us;1us;332us;1us;332us;1us;332us;1us;332us;1us;333us;1us;335us;3us;335us;1075us;1076us;1us;337us;2us;337us;338us;2us;338us;947us;2us;338us;949us;1us;338us;1us;338us;1us;339us;3us;340us;341us;998us;3us;340us;341us;999us;2us;340us;341us;2us;340us;1058us;3us;341us;1075us;1076us;2us;342us;1058us;3us;343us;1075us;1076us;1us;344us;1us;344us;1us;344us;1us;344us;12us;345us;346us;347us;348us;349us;350us;352us;353us;354us;998us;1001us;1014us;2us;345us;1014us;2us;345us;1014us;8us;346us;347us;348us;349us;350us;352us;353us;354us;1us;346us;4us;347us;349us;353us;354us;1us;347us;1us;348us;1us;349us;1us;350us;1us;350us;1us;350us;5us;351us;1011us;1061us;1062us;1073us;2us;351us;356us;1us;351us;1us;351us;1us;351us;1us;351us;1us;351us;1us;352us;1us;352us;1us;353us;4us;355us;1008us;1009us;1010us;1us;356us;4us;356us;1008us;1009us;1010us;6us;357us;1004us;1005us;1008us;1009us;1010us;1us;358us;1us;358us;1us;359us;1us;359us;1us;359us;2us;360us;380us;1us;361us;2us;362us;363us;1us;362us;1us;362us;10us;364us;365us;366us;367us;368us;369us;370us;371us;372us;373us;10us;364us;365us;366us;367us;368us;369us;370us;371us;372us;373us;7us;364us;366us;367us;370us;371us;372us;373us;1us;365us;2us;366us;370us;1us;366us;1us;367us;2us;368us;369us;1us;368us;1us;369us;1us;370us;1us;371us;1us;371us;2us;372us;373us;6us;372us;788us;789us;790us;794us;797us;1us;373us;1us;374us;6us;375us;376us;1114us;1115us;1117us;1118us;1us;375us;1us;375us;1us;376us;1us;376us;1us;376us;9us;377us;378us;379us;381us;383us;385us;386us;1111us;1148us;1us;377us;4us;378us;379us;385us;386us;7us;378us;385us;788us;789us;790us;794us;797us;2us;378us;385us;2us;379us;386us;2us;379us;386us;1us;380us;2us;381us;383us;1us;381us;1us;382us;1us;382us;1us;382us;1us;383us;1us;384us;1us;384us;3us;387us;388us;390us;2us;387us;388us;1us;387us;1us;388us;1us;389us;1us;389us;4us;391us;392us;394us;1111us;3us;391us;392us;394us;1us;391us;1us;392us;1us;393us;1us;394us;1us;395us;1us;396us;1us;397us;2us;398us;399us;2us;398us;1181us;1us;398us;1us;399us;1us;400us;1us;400us;4us;401us;402us;403us;404us;4us;401us;402us;403us;404us;3us;401us;402us;403us;2us;401us;402us;1us;401us;1us;402us;1us;403us;1us;404us;1us;405us;1us;405us;2us;406us;407us;2us;406us;407us;2us;406us;407us;1us;406us;1us;406us;1us;407us;3us;408us;409us;410us;2us;409us;410us;1us;409us;1us;410us;1us;412us;3us;412us;1112us;1113us;1us;413us;1us;413us;1us;413us;1us;414us;1us;415us;1us;415us;1us;416us;1us;416us;1us;416us;1us;416us;2us;417us;418us;1us;417us;1us;417us;1us;418us;1us;419us;1us;420us;1us;421us;1us;422us;1us;423us;1us;424us;1us;425us;1us;425us;1us;425us;1us;425us;1us;425us;1us;425us;1us;425us;1us;425us;2us;426us;429us;2us;427us;430us;1us;429us;1us;429us;1us;430us;1us;430us;2us;431us;432us;6us;431us;432us;434us;435us;436us;437us;1us;432us;3us;433us;1112us;1113us;5us;434us;435us;436us;437us;439us;1us;434us;1us;434us;1us;434us;1us;435us;1us;436us;1us;436us;1us;437us;1us;438us;2us;438us;440us;1us;438us;2us;439us;440us;1us;441us;1us;441us;1us;442us;1us;442us;1us;442us;1us;444us;1us;444us;1us;445us;3us;446us;447us;448us;3us;446us;447us;448us;3us;446us;447us;448us;3us;446us;447us;448us;2us;446us;447us;1us;446us;1us;447us;1us;448us;2us;449us;450us;2us;449us;450us;1us;449us;1us;450us;1us;451us;1us;452us;2us;452us;453us;1us;453us;1us;455us;2us;455us;456us;1us;455us;1us;455us;1us;456us;1us;456us;1us;457us;2us;458us;459us;1us;458us;1us;458us;1us;459us;1us;460us;1us;461us;1us;462us;1us;463us;1us;464us;1us;465us;1us;466us;1us;467us;1us;468us;1us;469us;1us;470us;1us;471us;1us;472us;1us;473us;1us;474us;1us;475us;1us;476us;1us;477us;2us;478us;480us;1us;478us;1us;478us;2us;479us;481us;2us;479us;481us;1us;479us;1us;479us;1us;482us;1us;483us;1us;483us;1us;483us;1us;484us;1us;485us;1us;485us;2us;486us;487us;1us;487us;1us;487us;11us;488us;495us;496us;497us;498us;499us;500us;501us;506us;508us;512us;1us;489us;2us;491us;492us;13us;491us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;1us;491us;1us;492us;1us;493us;2us;493us;735us;2us;493us;741us;1us;494us;11us;495us;496us;497us;498us;498us;499us;500us;501us;506us;508us;512us;11us;495us;496us;497us;498us;499us;499us;500us;501us;506us;508us;512us;11us;495us;496us;497us;498us;499us;500us;501us;505us;506us;508us;512us;11us;495us;496us;497us;498us;499us;500us;501us;506us;506us;508us;512us;11us;495us;496us;497us;498us;499us;500us;501us;506us;508us;509us;512us;11us;495us;496us;497us;498us;499us;500us;501us;506us;508us;511us;512us;11us;495us;496us;497us;498us;499us;500us;501us;506us;508us;512us;512us;11us;495us;496us;497us;498us;499us;500us;501us;506us;508us;512us;609us;11us;495us;496us;497us;498us;499us;500us;501us;506us;508us;512us;610us;11us;495us;496us;497us;498us;499us;500us;501us;506us;508us;512us;660us;12us;495us;496us;497us;498us;499us;500us;501us;506us;508us;512us;661us;662us;3us;495us;496us;497us;1us;495us;1us;496us;1us;498us;3us;499us;500us;501us;1us;500us;3us;502us;505us;507us;2us;503us;511us;1us;504us;2us;505us;507us;2us;506us;508us;1us;507us;1us;508us;2us;509us;510us;1us;510us;1us;511us;1us;512us;3us;513us;514us;515us;1us;513us;3us;514us;515us;1181us;1us;514us;1us;515us;1us;515us;3us;516us;517us;518us;6us;516us;517us;518us;1150us;1152us;1153us;2us;516us;517us;13us;516us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;1us;517us;1us;518us;8us;519us;520us;521us;522us;523us;524us;525us;543us;4us;519us;520us;521us;522us;1us;520us;1us;521us;1us;521us;1us;522us;1us;522us;1us;523us;1us;524us;1us;524us;1us;525us;1us;525us;3us;526us;527us;528us;1us;526us;1us;527us;1us;529us;9us;530us;548us;549us;550us;551us;1114us;1115us;1117us;1118us;1us;530us;1us;530us;1us;531us;4us;532us;533us;534us;535us;1us;532us;1us;533us;1us;533us;1us;534us;1us;534us;1us;536us;2us;537us;538us;1us;537us;1us;537us;1us;538us;1us;538us;1us;539us;1us;539us;1us;539us;1us;540us;1us;540us;1us;540us;1us;542us;2us;542us;1135us;1us;542us;1us;543us;1us;544us;1us;545us;1us;546us;1us;547us;8us;548us;549us;550us;551us;1114us;1115us;1117us;1118us;2us;548us;549us;1us;548us;1us;549us;3us;550us;607us;1115us;2us;550us;1115us;1us;551us;4us;552us;553us;554us;555us;4us;552us;553us;554us;555us;5us;552us;553us;562us;571us;573us;1us;552us;1us;553us;2us;554us;607us;1us;554us;1us;555us;13us;556us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;13us;558us;559us;560us;561us;561us;564us;565us;567us;568us;569us;572us;574us;578us;13us;558us;559us;560us;561us;564us;565us;566us;567us;568us;569us;572us;574us;578us;13us;558us;559us;560us;561us;564us;565us;567us;567us;568us;569us;572us;574us;578us;13us;558us;559us;560us;561us;564us;565us;567us;568us;569us;571us;572us;574us;578us;13us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;572us;574us;578us;13us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;575us;578us;13us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;577us;578us;12us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;13us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;578us;13us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;581us;14us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;585us;586us;18us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;654us;655us;871us;872us;873us;874us;13us;558us;559us;560us;561us;564us;565us;567us;568us;569us;572us;574us;578us;738us;3us;558us;559us;560us;1us;558us;1us;559us;1us;561us;3us;562us;571us;573us;2us;563us;577us;2us;564us;565us;1us;564us;1us;565us;1us;566us;3us;567us;568us;569us;1us;568us;1us;570us;2us;571us;573us;2us;572us;574us;1us;573us;1us;574us;2us;575us;576us;1us;576us;1us;577us;1us;578us;2us;579us;580us;1us;579us;2us;580us;1181us;1us;580us;5us;581us;582us;583us;1112us;1113us;2us;581us;582us;1us;582us;1us;583us;1us;585us;2us;586us;1181us;1us;586us;3us;587us;588us;589us;2us;587us;588us;1us;587us;1us;588us;1us;589us;1us;590us;2us;591us;592us;1us;591us;1us;591us;1us;592us;54us;593us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;2us;594us;595us;1us;594us;1us;596us;2us;596us;941us;3us;597us;598us;599us;2us;597us;598us;1us;597us;1us;598us;1us;600us;1us;600us;58us;601us;602us;603us;604us;605us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;2us;601us;602us;1us;601us;1us;604us;1us;604us;1us;605us;1us;605us;1us;605us;1us;605us;5us;606us;614us;615us;616us;617us;1us;607us;2us;607us;643us;2us;607us;649us;2us;607us;652us;2us;607us;654us;2us;607us;726us;2us;607us;737us;2us;607us;742us;2us;607us;802us;2us;607us;815us;2us;607us;834us;2us;607us;838us;2us;607us;843us;3us;607us;843us;1115us;2us;607us;859us;2us;607us;933us;1us;608us;1us;609us;1us;609us;1us;609us;1us;609us;1us;609us;1us;610us;1us;610us;1us;610us;1us;610us;1us;610us;1us;610us;2us;612us;613us;2us;612us;613us;1us;612us;1us;613us;4us;614us;615us;616us;617us;1us;614us;1us;615us;2us;616us;617us;1us;616us;1us;617us;1us;618us;1us;619us;1us;620us;2us;621us;622us;2us;621us;622us;1us;621us;1us;622us;2us;623us;624us;2us;623us;624us;1us;623us;1us;624us;5us;625us;626us;627us;628us;629us;3us;625us;626us;629us;1us;625us;1us;626us;2us;627us;628us;1us;628us;1us;629us;1us;629us;3us;630us;631us;632us;55us;630us;631us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1us;630us;1us;631us;1us;632us;1us;633us;54us;633us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;2us;634us;635us;54us;634us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1us;636us;1us;636us;2us;637us;638us;1us;637us;1us;639us;1us;639us;1us;640us;1us;640us;15us;641us;642us;643us;644us;645us;646us;647us;648us;649us;650us;651us;652us;653us;654us;655us;6us;641us;642us;643us;644us;645us;646us;4us;641us;642us;643us;644us;2us;641us;642us;1us;641us;1us;642us;1us;643us;1us;644us;1us;645us;1us;646us;1us;646us;5us;647us;648us;649us;650us;651us;4us;647us;648us;649us;650us;2us;647us;648us;1us;647us;1us;648us;1us;649us;1us;650us;1us;651us;1us;652us;1us;652us;1us;652us;1us;653us;1us;654us;2us;655us;1240us;2us;656us;658us;54us;656us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;2us;657us;659us;54us;657us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1us;658us;1us;659us;1us;660us;1us;660us;1us;660us;1us;660us;1us;660us;1us;660us;1us;660us;2us;661us;662us;2us;661us;662us;2us;661us;662us;2us;661us;662us;2us;661us;662us;1us;661us;1us;661us;1us;662us;1us;663us;1us;663us;1us;663us;1us;663us;1us;663us;1us;664us;1us;664us;1us;664us;1us;665us;54us;665us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1us;666us;1us;666us;54us;667us;668us;669us;670us;671us;672us;673us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;718us;763us;764us;765us;766us;57us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;721us;722us;723us;724us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;746us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;750us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;755us;763us;764us;765us;766us;55us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;757us;758us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;759us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;761us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;764us;765us;766us;53us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;766us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;849us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;871us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;874us;54us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;874us;55us;667us;668us;669us;670us;671us;672us;673us;676us;677us;678us;679us;680us;681us;682us;683us;684us;685us;686us;687us;688us;689us;690us;691us;692us;693us;694us;695us;696us;697us;698us;699us;700us;701us;702us;703us;704us;705us;706us;707us;708us;709us;710us;711us;712us;713us;714us;715us;716us;717us;763us;764us;765us;766us;1201us;1202us;2us;667us;668us;1us;667us;1us;668us;2us;669us;670us;1us;669us;1us;670us;2us;671us;672us;1us;671us;1us;672us;1us;673us;2us;674us;720us;1us;674us;1us;674us;5us;675us;759us;760us;761us;762us;7us;675us;759us;760us;761us;762us;804us;805us;2us;676us;677us;1us;677us;2us;678us;679us;1us;679us;2us;680us;681us;1us;681us;2us;682us;683us;1us;683us;2us;684us;685us;1us;685us;2us;686us;687us;1us;687us;2us;688us;689us;1us;689us;2us;690us;691us;1us;691us;2us;692us;693us;1us;693us;2us;694us;695us;1us;695us;2us;696us;697us;1us;697us;2us;698us;699us;1us;699us;2us;700us;701us;1us;701us;2us;702us;703us;1us;703us;2us;704us;705us;1us;705us;2us;706us;707us;1us;707us;2us;708us;709us;1us;709us;2us;710us;711us;1us;711us;2us;712us;713us;1us;713us;2us;714us;715us;1us;715us;2us;716us;717us;1us;718us;3us;718us;1142us;1143us;2us;718us;1143us;1us;719us;2us;719us;1130us;3us;721us;722us;723us;2us;721us;722us;1us;721us;1us;722us;1us;723us;1us;723us;1us;724us;1us;725us;1us;726us;1us;727us;1us;728us;1us;728us;1us;728us;1us;729us;1us;729us;3us;730us;731us;732us;2us;730us;731us;1us;730us;1us;731us;1us;732us;1us;733us;2us;734us;736us;1us;734us;1us;735us;1us;735us;1us;736us;1us;737us;1us;738us;7us;739us;740us;741us;742us;743us;744us;745us;5us;739us;740us;741us;743us;744us;2us;740us;743us;1us;740us;1us;741us;1us;741us;1us;742us;1us;742us;1us;743us;1us;744us;1us;745us;1us;746us;1us;748us;1us;748us;1us;749us;1us;749us;2us;750us;751us;1us;751us;2us;752us;753us;1us;752us;1us;753us;1us;755us;1us;756us;1us;756us;2us;757us;758us;1us;757us;1us;758us;4us;759us;760us;761us;762us;1us;760us;2us;761us;762us;1us;762us;4us;763us;764us;765us;766us;1us;763us;2us;765us;766us;1us;765us;1us;767us;2us;767us;1108us;3us;767us;1108us;1122us;2us;767us;1122us;1us;767us;1us;768us;2us;768us;1129us;1us;768us;1us;769us;2us;769us;1125us;1us;769us;1us;770us;2us;770us;1128us;1us;770us;1us;771us;2us;771us;1141us;1us;771us;1us;772us;2us;772us;1136us;1us;772us;1us;773us;2us;773us;1137us;1us;773us;4us;774us;775us;776us;777us;8us;774us;775us;776us;777us;915us;916us;917us;918us;3us;774us;775us;776us;7us;774us;775us;776us;915us;916us;917us;918us;3us;774us;775us;776us;5us;774us;775us;776us;916us;917us;2us;774us;775us;4us;774us;775us;916us;917us;1us;774us;1us;774us;1us;776us;1us;777us;1us;778us;1us;778us;1us;779us;1us;779us;2us;780us;781us;8us;780us;781us;889us;890us;891us;895us;896us;897us;7us;781us;889us;890us;891us;895us;896us;897us;1us;781us;6us;782us;788us;789us;790us;794us;797us;1us;783us;6us;783us;788us;789us;790us;794us;797us;6us;784us;788us;789us;790us;794us;797us;3us;785us;786us;787us;6us;785us;786us;787us;892us;893us;894us;2us;785us;786us;6us;785us;788us;789us;790us;794us;797us;1us;786us;1us;787us;6us;788us;788us;789us;790us;794us;797us;6us;788us;789us;789us;790us;794us;797us;6us;788us;789us;790us;791us;794us;797us;6us;788us;789us;790us;794us;797us;1070us;1us;788us;1us;789us;1us;790us;1us;790us;1us;791us;2us;791us;1119us;1us;792us;2us;792us;1107us;1us;792us;2us;792us;1107us;1us;793us;1us;794us;1us;794us;1us;795us;1us;795us;1us;795us;1us;796us;2us;796us;1135us;1us;796us;1us;797us;1us;797us;1us;798us;1us;799us;4us;800us;801us;802us;803us;2us;800us;801us;1us;800us;1us;801us;1us;802us;1us;803us;3us;804us;805us;929us;2us;804us;805us;1us;804us;1us;805us;1us;806us;1us;807us;1us;808us;1us;810us;6us;811us;812us;1114us;1115us;1117us;1118us;1us;811us;1us;811us;1us;811us;1us;811us;1us;812us;1us;812us;4us;813us;814us;815us;816us;2us;813us;814us;1us;813us;1us;814us;1us;815us;1us;816us;1us;817us;1us;818us;1us;819us;1us;820us;1us;821us;1us;822us;1us;823us;1us;824us;1us;825us;1us;826us;1us;827us;4us;828us;829us;830us;831us;2us;828us;829us;1us;828us;1us;829us;1us;830us;1us;830us;1us;831us;4us;832us;833us;834us;835us;5us;832us;833us;834us;835us;1144us;2us;832us;833us;1us;832us;1us;833us;1us;834us;1us;835us;4us;836us;837us;838us;839us;2us;836us;837us;1us;836us;1us;837us;1us;838us;1us;839us;10us;840us;841us;842us;843us;844us;845us;846us;847us;848us;849us;15us;840us;841us;842us;843us;844us;845us;846us;847us;848us;849us;854us;1114us;1115us;1117us;1118us;14us;840us;841us;842us;843us;844us;845us;846us;847us;848us;849us;1114us;1115us;1117us;1118us;1us;840us;2us;841us;842us;1us;841us;1us;842us;1us;843us;2us;843us;1115us;1us;844us;1us;845us;1us;846us;1us;847us;1us;848us;1us;849us;1us;849us;1us;850us;1us;850us;1us;850us;1us;850us;1us;850us;1us;850us;1us;851us;1us;852us;1us;853us;2us;853us;856us;2us;854us;855us;1us;854us;1us;855us;1us;855us;5us;857us;858us;859us;860us;861us;2us;857us;858us;1us;857us;1us;858us;1us;859us;1us;860us;1us;861us;1us;862us;1us;863us;1us;864us;1us;865us;1us;867us;1us;869us;1us;870us;1us;870us;2us;871us;872us;1us;872us;1us;873us;1us;874us;1us;874us;1us;875us;1us;876us;1us;877us;1us;877us;1us;877us;2us;877us;878us;1us;877us;1us;877us;1us;878us;1us;881us;1us;883us;1us;883us;1us;883us;1us;883us;2us;885us;886us;1us;885us;5us;886us;1011us;1061us;1062us;1073us;1us;886us;1us;887us;1us;887us;1us;887us;1us;887us;2us;887us;906us;1us;887us;1us;888us;2us;889us;890us;1us;889us;2us;889us;906us;1us;889us;1us;890us;2us;893us;894us;1us;894us;2us;894us;906us;1us;894us;1us;895us;1us;895us;2us;895us;906us;1us;895us;2us;896us;897us;1us;896us;1us;896us;1us;897us;2us;897us;906us;1us;897us;1us;897us;1us;898us;2us;898us;906us;2us;900us;903us;2us;901us;902us;1us;902us;1us;903us;3us;904us;1112us;1113us;1us;905us;1us;906us;5us;908us;909us;910us;911us;912us;3us;908us;909us;910us;1us;908us;1us;910us;1us;912us;2us;913us;914us;1us;913us;1us;913us;1us;913us;1us;914us;1us;914us;1us;916us;1us;919us;2us;921us;923us;1us;921us;1us;922us;1us;922us;1us;922us;1us;923us;1us;923us;1us;924us;1us;924us;1us;926us;1us;926us;1us;927us;1us;927us;1us;928us;4us;928us;1008us;1009us;1010us;1us;928us;1us;928us;1us;928us;1us;929us;1us;929us;1us;930us;5us;931us;932us;933us;934us;935us;2us;931us;932us;1us;931us;1us;932us;1us;933us;1us;934us;1us;935us;2us;936us;937us;2us;936us;937us;2us;936us;937us;1us;936us;1us;937us;6us;938us;939us;940us;941us;942us;943us;5us;938us;939us;940us;941us;942us;4us;938us;939us;940us;941us;2us;938us;939us;1us;938us;1us;939us;1us;940us;1us;940us;1us;942us;1us;942us;1us;943us;1us;943us;1us;944us;1us;944us;1us;945us;1us;945us;1us;945us;2us;946us;947us;1us;947us;2us;948us;949us;1us;949us;2us;951us;952us;1us;951us;1us;952us;3us;953us;954us;955us;2us;953us;954us;1us;953us;1us;954us;3us;956us;957us;959us;2us;956us;957us;1us;956us;1us;957us;1us;958us;1us;958us;3us;960us;961us;963us;2us;960us;961us;1us;960us;1us;961us;1us;962us;1us;962us;5us;964us;965us;966us;967us;968us;3us;964us;965us;968us;2us;964us;965us;1us;964us;1us;965us;2us;966us;967us;2us;966us;967us;2us;966us;967us;1us;966us;1us;967us;3us;969us;970us;973us;2us;969us;970us;1us;969us;1us;970us;2us;971us;972us;2us;971us;972us;2us;971us;972us;1us;971us;1us;972us;8us;974us;975us;976us;977us;977us;1008us;1009us;1010us;8us;974us;975us;976us;977us;1006us;1008us;1009us;1010us;7us;974us;975us;976us;977us;1008us;1009us;1010us;4us;974us;975us;976us;977us;1us;974us;1us;975us;1us;976us;1us;976us;4us;978us;979us;980us;981us;3us;978us;979us;980us;1us;978us;1us;979us;1us;980us;1us;980us;1us;982us;1us;982us;5us;983us;984us;988us;989us;990us;6us;983us;984us;988us;989us;990us;1007us;2us;983us;984us;1us;983us;1us;984us;1us;985us;2us;985us;1130us;1us;985us;2us;986us;987us;3us;986us;987us;1126us;1us;986us;1us;987us;2us;988us;989us;1us;988us;1us;989us;5us;991us;992us;994us;995us;997us;2us;991us;992us;1us;991us;1us;992us;1us;993us;1us;993us;2us;994us;995us;1us;994us;1us;995us;1us;996us;1us;996us;3us;998us;1001us;1014us;1us;998us;2us;999us;1058us;1us;999us;3us;1000us;1112us;1113us;1us;1001us;2us;1002us;1003us;4us;1002us;1003us;1074us;1077us;1us;1002us;1us;1002us;5us;1004us;1005us;1008us;1009us;1010us;1us;1004us;1us;1004us;5us;1007us;1011us;1061us;1062us;1073us;1us;1007us;1us;1008us;1us;1009us;1us;1009us;1us;1010us;4us;1011us;1061us;1062us;1073us;1us;1011us;1us;1011us;1us;1011us;1us;1012us;1us;1013us;1us;1014us;1us;1014us;2us;1015us;1060us;1us;1015us;1us;1015us;32us;1016us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1016us;31us;1017us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1017us;30us;1018us;1019us;1020us;1021us;1022us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1018us;29us;1019us;1020us;1021us;1022us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1019us;28us;1020us;1021us;1022us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1020us;27us;1021us;1022us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1021us;26us;1022us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1022us;25us;1023us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1023us;24us;1024us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1024us;23us;1025us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1025us;22us;1026us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1026us;21us;1027us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1027us;20us;1028us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1028us;19us;1029us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1029us;18us;1030us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1030us;17us;1031us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1031us;16us;1032us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1032us;15us;1033us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1033us;14us;1034us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1034us;13us;1035us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1035us;12us;1036us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1036us;11us;1037us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1037us;10us;1038us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1038us;9us;1039us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1039us;8us;1040us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1040us;7us;1041us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1041us;6us;1042us;1043us;1044us;1045us;1046us;1047us;1us;1042us;5us;1043us;1044us;1045us;1046us;1047us;1us;1043us;4us;1044us;1045us;1046us;1047us;1us;1044us;3us;1045us;1046us;1047us;1us;1045us;2us;1046us;1047us;1us;1046us;1us;1047us;1us;1047us;1us;1048us;1us;1048us;1us;1048us;3us;1048us;1049us;1050us;4us;1049us;1050us;1080us;1081us;2us;1049us;1050us;1us;1049us;1us;1050us;2us;1052us;1053us;1us;1053us;1us;1053us;4us;1054us;1061us;1062us;1073us;1us;1054us;1us;1054us;1us;1054us;3us;1055us;1075us;1076us;3us;1056us;1075us;1076us;1us;1057us;1us;1058us;1us;1059us;1us;1060us;3us;1061us;1062us;1073us;2us;1061us;1062us;5us;1061us;1062us;1087us;1088us;1089us;1us;1061us;1us;1062us;5us;1063us;1064us;1065us;1066us;1067us;5us;1063us;1064us;1065us;1066us;1067us;4us;1063us;1064us;1065us;1066us;3us;1063us;1064us;1065us;2us;1063us;1064us;1us;1063us;1us;1064us;1us;1065us;1us;1066us;1us;1067us;1us;1068us;1us;1069us;1us;1070us;1us;1071us;1us;1072us;1us;1073us;2us;1073us;1115us;1us;1073us;2us;1073us;1115us;1us;1074us;2us;1075us;1076us;4us;1075us;1076us;1112us;1113us;1us;1076us;1us;1077us;1us;1077us;1us;1078us;1us;1079us;1us;1079us;7us;1080us;1081us;1082us;1083us;1084us;1085us;1086us;3us;1080us;1081us;1082us;3us;1080us;1081us;1082us;2us;1080us;1081us;1us;1080us;1us;1081us;1us;1082us;3us;1083us;1084us;1090us;1us;1083us;1us;1084us;1us;1085us;1us;1086us;3us;1087us;1088us;1089us;2us;1088us;1089us;1us;1088us;1us;1090us;1us;1091us;2us;1093us;1094us;3us;1093us;1104us;1105us;1us;1093us;1us;1094us;1us;1094us;3us;1095us;1112us;1113us;1us;1096us;1us;1097us;3us;1097us;1104us;1105us;1us;1097us;2us;1098us;1099us;1us;1099us;1us;1099us;1us;1100us;2us;1101us;1102us;1us;1102us;1us;1103us;3us;1104us;1104us;1105us;3us;1104us;1105us;1105us;3us;1104us;1105us;1106us;1us;1104us;1us;1105us;1us;1106us;1us;1107us;1us;1107us;1us;1108us;2us;1108us;1122us;1us;1108us;2us;1108us;1155us;1us;1109us;1us;1110us;1us;1111us;2us;1112us;1113us;1us;1112us;1us;1113us;4us;1114us;1115us;1117us;1118us;1us;1114us;1us;1114us;1us;1115us;1us;1115us;1us;1116us;3us;1117us;1118us;1147us;3us;1117us;1118us;1147us;1us;1117us;1us;1118us;1us;1118us;1us;1118us;1us;1119us;1us;1120us;1us;1121us;1us;1122us;1us;1123us;1us;1124us;1us;1125us;1us;1126us;1us;1127us;1us;1128us;1us;1129us;1us;1130us;1us;1131us;1us;1132us;1us;1133us;1us;1134us;1us;1135us;1us;1136us;1us;1137us;1us;1138us;1us;1139us;1us;1140us;1us;1141us;2us;1142us;1143us;1us;1143us;1us;1144us;1us;1144us;1us;1145us;1us;1146us;1us;1146us;1us;1147us;1us;1148us;1us;1149us;3us;1150us;1152us;1153us;1us;1151us;2us;1152us;1153us;1us;1152us;1us;1153us;1us;1154us;1us;1155us;1us;1156us;1us;1157us;1us;1158us;1us;1159us;2us;1160us;1161us;1us;1161us;1us;1162us;1us;1162us;2us;1164us;1166us;2us;1165us;1167us;1us;1166us;1us;1167us;1us;1168us;1us;1169us;1us;1170us;1us;1171us;1us;1172us;1us;1173us;1us;1175us;1us;1177us;1us;1179us;1us;1181us;1us;1183us;1us;1185us;1us;1187us;1us;1189us;1us;1190us;1us;1191us;1us;1192us;1us;1193us;1us;1194us;1us;1195us;1us;1196us;1us;1197us;1us;1198us;1us;1199us;1us;1200us;1us;1202us;1us;1202us;1us;1203us;2us;1204us;1205us;1us;1204us;1us;1204us;1us;1205us;2us;1206us;1208us;1us;1206us;1us;1206us;1us;1207us;1us;1208us;1us;1209us;1us;1210us;1us;1212us;1us;1214us;2us;1214us;1235us;1us;1214us;1us;1215us;1us;1216us;1us;1217us;2us;1217us;1236us;1us;1217us;1us;1218us;1us;1219us;1us;1220us;1us;1220us;1us;1221us;1us;1222us;1us;1223us;1us;1224us;1us;1224us;1us;1225us;1us;1226us;1us;1227us;1us;1227us;1us;1228us;1us;1229us;1us;1230us;1us;1231us;1us;1232us;1us;1233us;1us;1234us;1us;1235us;1us;1236us;1us;1237us;1us;1238us;1us;1239us;1us;1240us;|] +let _fsyacc_stateToProdIdxsTableRowOffsets = [|0us;2us;4us;6us;8us;10us;12us;14us;16us;18us;20us;22us;24us;26us;28us;30us;32us;35us;37us;40us;42us;45us;47us;49us;51us;53us;55us;57us;59us;62us;64us;73us;82us;137us;139us;142us;144us;146us;148us;150us;152us;155us;157us;159us;161us;164us;166us;168us;171us;173us;175us;177us;181us;183us;187us;191us;195us;199us;203us;205us;207us;210us;213us;217us;219us;222us;224us;227us;229us;231us;233us;235us;243us;251us;256us;258us;260us;262us;266us;269us;271us;273us;275us;279us;281us;283us;286us;290us;293us;296us;298us;300us;302us;304us;306us;308us;315us;322us;326us;329us;331us;333us;335us;337us;339us;341us;343us;345us;347us;349us;351us;353us;355us;357us;359us;361us;363us;365us;368us;423us;425us;480us;482us;484us;488us;490us;492us;494us;496us;498us;500us;502us;504us;506us;508us;510us;512us;515us;517us;519us;521us;525us;527us;529us;531us;533us;535us;537us;539us;541us;543us;545us;547us;549us;551us;553us;557us;560us;562us;564us;566us;568us;571us;574us;576us;578us;581us;584us;586us;588us;591us;594us;596us;598us;600us;602us;604us;606us;608us;617us;631us;640us;654us;656us;658us;660us;662us;664us;666us;668us;670us;672us;674us;679us;682us;687us;689us;691us;693us;700us;702us;704us;706us;708us;710us;712us;714us;716us;718us;721us;724us;726us;728us;732us;736us;739us;741us;743us;745us;747us;749us;751us;753us;755us;757us;759us;761us;763us;765us;768us;770us;772us;774us;777us;779us;782us;784us;787us;789us;791us;793us;795us;808us;820us;824us;826us;828us;832us;835us;837us;839us;841us;844us;846us;848us;850us;862us;873us;930us;933us;935us;937us;939us;944us;946us;949us;951us;953us;956us;959us;962us;964us;966us;968us;970us;978us;986us;988us;992us;994us;1000us;1002us;1004us;1006us;1008us;1010us;1013us;1015us;1017us;1019us;1022us;1024us;1026us;1031us;1035us;1037us;1040us;1045us;1047us;1051us;1053us;1057us;1063us;1066us;1068us;1070us;1073us;1075us;1077us;1079us;1081us;1085us;1089us;1092us;1094us;1096us;1098us;1100us;1102us;1104us;1106us;1109us;1111us;1116us;1120us;1123us;1125us;1127us;1130us;1132us;1134us;1136us;1138us;1140us;1143us;1145us;1149us;1151us;1153us;1156us;1160us;1162us;1164us;1166us;1170us;1172us;1174us;1176us;1178us;1180us;1182us;1184us;1187us;1189us;1191us;1193us;1201us;1203us;1205us;1207us;1209us;1211us;1213us;1215us;1217us;1219us;1221us;1226us;1228us;1231us;1234us;1237us;1240us;1243us;1245us;1247us;1249us;1255us;1258us;1261us;1264us;1267us;1269us;1271us;1273us;1275us;1277us;1279us;1281us;1283us;1285us;1287us;1289us;1291us;1295us;1298us;1300us;1302us;1305us;1307us;1310us;1313us;1315us;1317us;1320us;1323us;1325us;1327us;1329us;1331us;1333us;1335us;1337us;1339us;1341us;1343us;1345us;1348us;1351us;1353us;1355us;1358us;1360us;1362us;1364us;1366us;1368us;1370us;1372us;1374us;1379us;1384us;1389us;1391us;1393us;1395us;1397us;1399us;1402us;1404us;1407us;1409us;1426us;1448us;1465us;1487us;1489us;1491us;1495us;1497us;1499us;1501us;1504us;1509us;1511us;1513us;1515us;1517us;1519us;1521us;1523us;1525us;1527us;1529us;1531us;1533us;1535us;1537us;1539us;1541us;1543us;1545us;1550us;1554us;1558us;1560us;1562us;1564us;1566us;1568us;1570us;1572us;1574us;1576us;1581us;1586us;1591us;1595us;1598us;1600us;1602us;1604us;1606us;1611us;1616us;1621us;1625us;1629us;1631us;1633us;1635us;1637us;1639us;1641us;1644us;1646us;1648us;1651us;1653us;1655us;1657us;1659us;1661us;1663us;1666us;1668us;1670us;1672us;1674us;1676us;1678us;1680us;1682us;1685us;1687us;1689us;1691us;1693us;1695us;1699us;1702us;1704us;1706us;1708us;1710us;1712us;1714us;1717us;1719us;1721us;1723us;1726us;1728us;1730us;1733us;1736us;1738us;1740us;1742us;1745us;1748us;1750us;1755us;1761us;1765us;1767us;1769us;1771us;1773us;1775us;1777us;1779us;1781us;1783us;1785us;1787us;1789us;1795us;1801us;1806us;1808us;1810us;1812us;1814us;1816us;1818us;1830us;1833us;1836us;1838us;1840us;1845us;1848us;1850us;1852us;1854us;1856us;1858us;1865us;1867us;1869us;1873us;1876us;1878us;1880us;1882us;1884us;1886us;1888us;1890us;1892us;1894us;1899us;1904us;1906us;1910us;1912us;1914us;1916us;1918us;1921us;1923us;1926us;1930us;1932us;1935us;1937us;1939us;1942us;1945us;1947us;1951us;1953us;1955us;1957us;1959us;1961us;1963us;1965us;1967us;1969us;1971us;1973us;1975us;1979us;1981us;1984us;1987us;1990us;1992us;1994us;1996us;2000us;2004us;2007us;2010us;2014us;2017us;2021us;2023us;2025us;2027us;2029us;2042us;2045us;2048us;2057us;2059us;2064us;2066us;2068us;2070us;2072us;2074us;2076us;2082us;2085us;2087us;2089us;2091us;2093us;2095us;2097us;2099us;2101us;2106us;2108us;2113us;2120us;2122us;2124us;2126us;2128us;2130us;2133us;2135us;2138us;2140us;2142us;2153us;2164us;2172us;2174us;2177us;2179us;2181us;2184us;2186us;2188us;2190us;2192us;2194us;2197us;2204us;2206us;2208us;2215us;2217us;2219us;2221us;2223us;2225us;2235us;2237us;2242us;2250us;2253us;2256us;2259us;2261us;2264us;2266us;2268us;2270us;2272us;2274us;2276us;2278us;2282us;2285us;2287us;2289us;2291us;2293us;2298us;2302us;2304us;2306us;2308us;2310us;2312us;2314us;2316us;2319us;2322us;2324us;2326us;2328us;2330us;2335us;2340us;2344us;2347us;2349us;2351us;2353us;2355us;2357us;2359us;2362us;2365us;2368us;2370us;2372us;2374us;2378us;2381us;2383us;2385us;2387us;2391us;2393us;2395us;2397us;2399us;2401us;2403us;2405us;2407us;2409us;2411us;2414us;2416us;2418us;2420us;2422us;2424us;2426us;2428us;2430us;2432us;2434us;2436us;2438us;2440us;2442us;2444us;2446us;2448us;2451us;2454us;2456us;2458us;2460us;2462us;2465us;2472us;2474us;2478us;2484us;2486us;2488us;2490us;2492us;2494us;2496us;2498us;2500us;2503us;2505us;2508us;2510us;2512us;2514us;2516us;2518us;2520us;2522us;2524us;2528us;2532us;2536us;2540us;2543us;2545us;2547us;2549us;2552us;2555us;2557us;2559us;2561us;2563us;2566us;2568us;2570us;2573us;2575us;2577us;2579us;2581us;2583us;2586us;2588us;2590us;2592us;2594us;2596us;2598us;2600us;2602us;2604us;2606us;2608us;2610us;2612us;2614us;2616us;2618us;2620us;2622us;2624us;2626us;2628us;2631us;2633us;2635us;2638us;2641us;2643us;2645us;2647us;2649us;2651us;2653us;2655us;2657us;2659us;2662us;2664us;2666us;2678us;2680us;2683us;2697us;2699us;2701us;2703us;2706us;2709us;2711us;2723us;2735us;2747us;2759us;2771us;2783us;2795us;2807us;2819us;2831us;2844us;2848us;2850us;2852us;2854us;2858us;2860us;2864us;2867us;2869us;2872us;2875us;2877us;2879us;2882us;2884us;2886us;2888us;2892us;2894us;2898us;2900us;2902us;2904us;2908us;2915us;2918us;2932us;2934us;2936us;2945us;2950us;2952us;2954us;2956us;2958us;2960us;2962us;2964us;2966us;2968us;2970us;2974us;2976us;2978us;2980us;2990us;2992us;2994us;2996us;3001us;3003us;3005us;3007us;3009us;3011us;3013us;3016us;3018us;3020us;3022us;3024us;3026us;3028us;3030us;3032us;3034us;3036us;3038us;3041us;3043us;3045us;3047us;3049us;3051us;3053us;3062us;3065us;3067us;3069us;3073us;3076us;3078us;3083us;3088us;3094us;3096us;3098us;3101us;3103us;3105us;3119us;3133us;3147us;3161us;3175us;3189us;3203us;3217us;3230us;3244us;3258us;3273us;3292us;3306us;3310us;3312us;3314us;3316us;3320us;3323us;3326us;3328us;3330us;3332us;3336us;3338us;3340us;3343us;3346us;3348us;3350us;3353us;3355us;3357us;3359us;3362us;3364us;3367us;3369us;3375us;3378us;3380us;3382us;3384us;3387us;3389us;3393us;3396us;3398us;3400us;3402us;3404us;3407us;3409us;3411us;3413us;3468us;3471us;3473us;3475us;3478us;3482us;3485us;3487us;3489us;3491us;3493us;3552us;3555us;3557us;3559us;3561us;3563us;3565us;3567us;3569us;3575us;3577us;3580us;3583us;3586us;3589us;3592us;3595us;3598us;3601us;3604us;3607us;3610us;3613us;3617us;3620us;3623us;3625us;3627us;3629us;3631us;3633us;3635us;3637us;3639us;3641us;3643us;3645us;3647us;3650us;3653us;3655us;3657us;3662us;3664us;3666us;3669us;3671us;3673us;3675us;3677us;3679us;3682us;3685us;3687us;3689us;3692us;3695us;3697us;3699us;3705us;3709us;3711us;3713us;3716us;3718us;3720us;3722us;3726us;3782us;3784us;3786us;3788us;3790us;3845us;3848us;3903us;3905us;3907us;3910us;3912us;3914us;3916us;3918us;3920us;3936us;3943us;3948us;3951us;3953us;3955us;3957us;3959us;3961us;3963us;3965us;3971us;3976us;3979us;3981us;3983us;3985us;3987us;3989us;3991us;3993us;3995us;3997us;3999us;4002us;4005us;4060us;4063us;4118us;4120us;4122us;4124us;4126us;4128us;4130us;4132us;4134us;4136us;4139us;4142us;4145us;4148us;4151us;4153us;4155us;4157us;4159us;4161us;4163us;4165us;4167us;4169us;4171us;4173us;4175us;4230us;4232us;4234us;4289us;4344us;4399us;4454us;4509us;4564us;4619us;4674us;4729us;4784us;4839us;4894us;4949us;5004us;5059us;5114us;5169us;5224us;5279us;5334us;5389us;5444us;5499us;5557us;5612us;5667us;5722us;5778us;5833us;5888us;5943us;5997us;6052us;6107us;6162us;6217us;6272us;6328us;6331us;6333us;6335us;6338us;6340us;6342us;6345us;6347us;6349us;6351us;6354us;6356us;6358us;6364us;6372us;6375us;6377us;6380us;6382us;6385us;6387us;6390us;6392us;6395us;6397us;6400us;6402us;6405us;6407us;6410us;6412us;6415us;6417us;6420us;6422us;6425us;6427us;6430us;6432us;6435us;6437us;6440us;6442us;6445us;6447us;6450us;6452us;6455us;6457us;6460us;6462us;6465us;6467us;6470us;6472us;6475us;6477us;6481us;6484us;6486us;6489us;6493us;6496us;6498us;6500us;6502us;6504us;6506us;6508us;6510us;6512us;6514us;6516us;6518us;6520us;6522us;6526us;6529us;6531us;6533us;6535us;6537us;6540us;6542us;6544us;6546us;6548us;6550us;6552us;6560us;6566us;6569us;6571us;6573us;6575us;6577us;6579us;6581us;6583us;6585us;6587us;6589us;6591us;6593us;6595us;6598us;6600us;6603us;6605us;6607us;6609us;6611us;6613us;6616us;6618us;6620us;6625us;6627us;6630us;6632us;6637us;6639us;6642us;6644us;6646us;6649us;6653us;6656us;6658us;6660us;6663us;6665us;6667us;6670us;6672us;6674us;6677us;6679us;6681us;6684us;6686us;6688us;6691us;6693us;6695us;6698us;6700us;6705us;6714us;6718us;6726us;6730us;6736us;6739us;6744us;6746us;6748us;6750us;6752us;6754us;6756us;6758us;6760us;6763us;6772us;6780us;6782us;6789us;6791us;6798us;6805us;6809us;6816us;6819us;6826us;6828us;6830us;6837us;6844us;6851us;6858us;6860us;6862us;6864us;6866us;6868us;6871us;6873us;6876us;6878us;6881us;6883us;6885us;6887us;6889us;6891us;6893us;6895us;6898us;6900us;6902us;6904us;6906us;6908us;6913us;6916us;6918us;6920us;6922us;6924us;6928us;6931us;6933us;6935us;6937us;6939us;6941us;6943us;6950us;6952us;6954us;6956us;6958us;6960us;6962us;6967us;6970us;6972us;6974us;6976us;6978us;6980us;6982us;6984us;6986us;6988us;6990us;6992us;6994us;6996us;6998us;7000us;7005us;7008us;7010us;7012us;7014us;7016us;7018us;7023us;7029us;7032us;7034us;7036us;7038us;7040us;7045us;7048us;7050us;7052us;7054us;7056us;7067us;7083us;7098us;7100us;7103us;7105us;7107us;7109us;7112us;7114us;7116us;7118us;7120us;7122us;7124us;7126us;7128us;7130us;7132us;7134us;7136us;7138us;7140us;7142us;7144us;7147us;7150us;7152us;7154us;7156us;7162us;7165us;7167us;7169us;7171us;7173us;7175us;7177us;7179us;7181us;7183us;7185us;7187us;7189us;7191us;7194us;7196us;7198us;7200us;7202us;7204us;7206us;7208us;7210us;7212us;7215us;7217us;7219us;7221us;7223us;7225us;7227us;7229us;7231us;7234us;7236us;7242us;7244us;7246us;7248us;7250us;7252us;7255us;7257us;7259us;7262us;7264us;7267us;7269us;7271us;7274us;7276us;7279us;7281us;7283us;7285us;7288us;7290us;7293us;7295us;7297us;7299us;7302us;7304us;7306us;7308us;7311us;7314us;7317us;7319us;7321us;7325us;7327us;7329us;7335us;7339us;7341us;7343us;7345us;7348us;7350us;7352us;7354us;7356us;7358us;7360us;7362us;7365us;7367us;7369us;7371us;7373us;7375us;7377us;7379us;7381us;7383us;7385us;7387us;7389us;7391us;7396us;7398us;7400us;7402us;7404us;7406us;7408us;7414us;7417us;7419us;7421us;7423us;7425us;7427us;7430us;7433us;7436us;7438us;7440us;7447us;7453us;7458us;7461us;7463us;7465us;7467us;7469us;7471us;7473us;7475us;7477us;7479us;7481us;7483us;7485us;7487us;7490us;7492us;7495us;7497us;7500us;7502us;7504us;7508us;7511us;7513us;7515us;7519us;7522us;7524us;7526us;7528us;7530us;7534us;7537us;7539us;7541us;7543us;7545us;7551us;7555us;7558us;7560us;7562us;7565us;7568us;7571us;7573us;7575us;7579us;7582us;7584us;7586us;7589us;7592us;7595us;7597us;7599us;7608us;7617us;7625us;7630us;7632us;7634us;7636us;7638us;7643us;7647us;7649us;7651us;7653us;7655us;7657us;7659us;7665us;7672us;7675us;7677us;7679us;7681us;7684us;7686us;7689us;7693us;7695us;7697us;7700us;7702us;7704us;7710us;7713us;7715us;7717us;7719us;7721us;7724us;7726us;7728us;7730us;7732us;7736us;7738us;7741us;7743us;7747us;7749us;7752us;7757us;7759us;7761us;7767us;7769us;7771us;7777us;7779us;7781us;7783us;7785us;7787us;7792us;7794us;7796us;7798us;7800us;7802us;7804us;7806us;7809us;7811us;7813us;7846us;7848us;7880us;7882us;7913us;7915us;7945us;7947us;7976us;7978us;8006us;8008us;8035us;8037us;8063us;8065us;8090us;8092us;8116us;8118us;8141us;8143us;8165us;8167us;8188us;8190us;8210us;8212us;8231us;8233us;8251us;8253us;8270us;8272us;8288us;8290us;8305us;8307us;8321us;8323us;8336us;8338us;8350us;8352us;8363us;8365us;8375us;8377us;8386us;8388us;8396us;8398us;8405us;8407us;8413us;8415us;8420us;8422us;8426us;8428us;8431us;8433us;8435us;8437us;8439us;8441us;8443us;8447us;8452us;8455us;8457us;8459us;8462us;8464us;8466us;8471us;8473us;8475us;8477us;8481us;8485us;8487us;8489us;8491us;8493us;8497us;8500us;8506us;8508us;8510us;8516us;8522us;8527us;8531us;8534us;8536us;8538us;8540us;8542us;8544us;8546us;8548us;8550us;8552us;8554us;8556us;8559us;8561us;8564us;8566us;8569us;8574us;8576us;8578us;8580us;8582us;8584us;8586us;8594us;8598us;8602us;8605us;8607us;8609us;8611us;8615us;8617us;8619us;8621us;8623us;8627us;8630us;8632us;8634us;8636us;8639us;8643us;8645us;8647us;8649us;8653us;8655us;8657us;8661us;8663us;8666us;8668us;8670us;8672us;8675us;8677us;8679us;8683us;8687us;8691us;8693us;8695us;8697us;8699us;8701us;8703us;8706us;8708us;8711us;8713us;8715us;8717us;8720us;8722us;8724us;8729us;8731us;8733us;8735us;8737us;8739us;8743us;8747us;8749us;8751us;8753us;8755us;8757us;8759us;8761us;8763us;8765us;8767us;8769us;8771us;8773us;8775us;8777us;8779us;8781us;8783us;8785us;8787us;8789us;8791us;8793us;8795us;8797us;8799us;8801us;8804us;8806us;8808us;8810us;8812us;8814us;8816us;8818us;8820us;8822us;8826us;8828us;8831us;8833us;8835us;8837us;8839us;8841us;8843us;8845us;8847us;8850us;8852us;8854us;8856us;8859us;8862us;8864us;8866us;8868us;8870us;8872us;8874us;8876us;8878us;8880us;8882us;8884us;8886us;8888us;8890us;8892us;8894us;8896us;8898us;8900us;8902us;8904us;8906us;8908us;8910us;8912us;8914us;8916us;8918us;8920us;8922us;8925us;8927us;8929us;8931us;8934us;8936us;8938us;8940us;8942us;8944us;8946us;8948us;8950us;8953us;8955us;8957us;8959us;8961us;8964us;8966us;8968us;8970us;8972us;8974us;8976us;8978us;8980us;8982us;8984us;8986us;8988us;8990us;8992us;8994us;8996us;8998us;9000us;9002us;9004us;9006us;9008us;9010us;9012us;9014us;9016us;|] +let _fsyacc_action_rows = 2099 +let _fsyacc_actionTableElements = [|16us;16438us;22us;77us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;44us;16556us;45us;16556us;46us;16556us;74us;322us;89us;38us;102us;292us;109us;16556us;110us;16556us;122us;16556us;151us;16556us;204us;51us;0us;49152us;95us;16516us;13us;16556us;22us;246us;24us;16556us;25us;16556us;29us;16556us;30us;16556us;32us;16556us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;57us;16556us;63us;16556us;67us;16556us;71us;16556us;72us;16556us;73us;16556us;74us;322us;75us;16556us;86us;16556us;87us;16556us;89us;38us;90us;16556us;91us;16556us;92us;16556us;93us;16556us;97us;16556us;99us;16556us;101us;16556us;102us;292us;107us;16556us;108us;16556us;109us;16556us;115us;16556us;116us;16556us;117us;16556us;118us;16556us;120us;16556us;122us;16556us;123us;16556us;124us;16556us;125us;16556us;126us;16556us;127us;16556us;131us;16556us;134us;16556us;135us;16556us;137us;16556us;138us;16556us;144us;16556us;147us;16556us;148us;16556us;149us;16556us;150us;16556us;151us;16556us;155us;16556us;156us;16556us;159us;16556us;160us;16556us;163us;16556us;164us;16556us;165us;16556us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;184us;16556us;185us;16556us;188us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;200us;16556us;201us;16556us;202us;16556us;203us;16556us;204us;232us;0us;49152us;7us;16556us;10us;14us;21us;12us;68us;13us;74us;322us;84us;11us;89us;38us;102us;292us;0us;49152us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;49152us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;49152us;0us;16389us;0us;16390us;0us;16391us;0us;16392us;0us;16393us;0us;16394us;4us;32768us;10us;14us;21us;37us;68us;13us;84us;36us;0us;16395us;4us;32768us;10us;14us;21us;37us;68us;13us;84us;36us;0us;16396us;4us;32768us;10us;14us;21us;37us;68us;13us;84us;36us;0us;16397us;5us;16556us;10us;14us;68us;13us;74us;322us;89us;38us;102us;292us;0us;16398us;5us;16556us;10us;14us;68us;13us;74us;322us;89us;38us;102us;292us;0us;16399us;5us;16556us;10us;14us;68us;13us;74us;322us;89us;38us;102us;292us;0us;16400us;16us;16401us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;74us;322us;102us;292us;109us;16556us;122us;16556us;138us;16556us;151us;16556us;163us;16556us;0us;16402us;3us;16650us;44us;520us;45us;519us;46us;521us;87us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2065us;38us;2068us;39us;2070us;40us;2073us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;109us;2069us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;122us;758us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;138us;774us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;151us;2074us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;26us;16403us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;0us;16404us;2us;16405us;21us;37us;84us;36us;0us;16406us;0us;16407us;0us;16408us;1us;32768us;194us;39us;0us;16410us;6us;16409us;93us;1961us;101us;1966us;179us;43us;194us;44us;195us;2049us;202us;2048us;0us;16411us;0us;16412us;0us;16413us;1us;16414us;77us;17493us;0us;16415us;0us;16416us;2us;32768us;10us;48us;204us;49us;0us;16417us;1us;32768us;10us;50us;0us;16418us;4us;16437us;10us;52us;21us;2016us;68us;2015us;84us;2014us;0us;16419us;1us;16556us;74us;322us;3us;16650us;44us;520us;45us;519us;46us;521us;1us;17568us;104us;2035us;5us;32768us;10us;1094us;21us;58us;47us;1956us;194us;1955us;204us;1078us;1us;16420us;77us;1958us;0us;16421us;0us;16422us;1us;17568us;104us;2035us;4us;32768us;10us;1094us;47us;1956us;194us;1955us;204us;1078us;1us;16423us;77us;1958us;0us;16424us;1us;16425us;152us;60us;0us;16426us;1us;16428us;152us;60us;0us;16427us;1us;17562us;70us;2032us;16us;16438us;22us;77us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;44us;16556us;45us;16556us;46us;16556us;74us;322us;89us;38us;102us;292us;109us;16556us;110us;16556us;122us;16556us;151us;16556us;204us;85us;0us;16429us;3us;16650us;44us;520us;45us;519us;46us;521us;8us;32768us;37us;2065us;38us;2068us;39us;2070us;40us;2073us;109us;2069us;110us;107us;122us;758us;151us;2074us;18us;16438us;22us;77us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;44us;16556us;45us;16556us;46us;16556us;70us;2047us;74us;322us;78us;2046us;89us;38us;102us;292us;109us;16556us;110us;16556us;122us;16556us;151us;16556us;204us;86us;0us;16430us;0us;16431us;0us;16432us;15us;16438us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;44us;16556us;45us;16556us;46us;16556us;74us;322us;89us;38us;102us;292us;109us;16556us;110us;16556us;122us;16556us;151us;16556us;204us;82us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;1us;17564us;21us;2033us;0us;16433us;0us;16434us;6us;16437us;15us;2084us;16us;2086us;17us;2087us;21us;2016us;68us;2015us;84us;2014us;0us;16435us;0us;16436us;3us;16437us;21us;2016us;68us;2015us;84us;2014us;17us;16437us;21us;2016us;37us;16446us;38us;16446us;39us;16446us;40us;16446us;44us;16446us;45us;16446us;46us;16446us;68us;2015us;74us;16446us;84us;2014us;89us;16446us;102us;16446us;109us;16446us;110us;16446us;122us;16446us;151us;16446us;3us;17547us;21us;2016us;68us;2015us;84us;2014us;15us;16441us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;44us;16556us;45us;16556us;46us;16556us;74us;322us;89us;38us;102us;292us;109us;16556us;110us;16556us;122us;16556us;151us;16556us;204us;90us;0us;16439us;3us;32768us;21us;2016us;68us;2015us;84us;2014us;4us;16556us;74us;322us;89us;38us;102us;292us;204us;90us;0us;16440us;0us;16442us;0us;16443us;3us;16650us;44us;520us;45us;519us;46us;521us;8us;32768us;37us;2065us;38us;2068us;39us;2070us;40us;2073us;109us;2069us;110us;107us;122us;758us;151us;2074us;3us;32768us;70us;2047us;78us;2046us;204us;101us;5us;32768us;22us;123us;47us;1956us;58us;2044us;137us;2045us;194us;1955us;0us;16444us;0us;16445us;0us;16446us;1us;16556us;74us;322us;1us;16458us;132us;133us;0us;16447us;0us;16448us;0us;16449us;1us;16556us;74us;322us;1us;17570us;111us;2036us;1us;17572us;119us;2037us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;2us;16718us;34us;2064us;161us;17597us;1us;32768us;78us;114us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;16451us;70us;117us;0us;16450us;80us;32768us;13us;1206us;22us;119us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;26us;16452us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;29us;32768us;15us;2084us;16us;2086us;17us;2087us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;1us;17560us;19us;2031us;0us;16453us;8us;16556us;47us;1956us;58us;2044us;74us;322us;89us;38us;102us;292us;137us;2045us;194us;1955us;204us;90us;3us;32768us;15us;2084us;16us;2086us;17us;2087us;0us;16454us;15us;16438us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;44us;16556us;45us;16556us;46us;16556us;74us;322us;89us;38us;102us;292us;109us;16556us;110us;16556us;122us;16556us;151us;16556us;204us;85us;1us;32768us;143us;128us;3us;32768us;15us;2084us;16us;2086us;17us;2087us;0us;16455us;15us;16438us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;44us;16556us;45us;16556us;46us;16556us;74us;322us;89us;38us;102us;292us;109us;16556us;110us;16556us;122us;16556us;151us;16556us;204us;85us;1us;32768us;143us;132us;0us;16456us;1us;16556us;74us;322us;1us;16458us;132us;133us;0us;16457us;2us;16500us;70us;137us;88us;225us;7us;16556us;22us;140us;50us;596us;57us;598us;74us;322us;112us;597us;137us;165us;153us;151us;0us;16459us;0us;16460us;55us;16478us;14us;16556us;22us;161us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;48us;16556us;49us;16556us;50us;596us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;57us;598us;59us;16556us;67us;16556us;73us;16556us;74us;322us;89us;16556us;92us;16556us;93us;16556us;97us;16556us;101us;16556us;107us;16556us;110us;16556us;112us;597us;114us;16556us;120us;16556us;121us;16556us;123us;16556us;137us;165us;149us;16556us;153us;151us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;187us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;202us;16556us;203us;16556us;1us;17564us;21us;2033us;14us;16478us;14us;16556us;44us;16556us;45us;16556us;46us;16556us;48us;16556us;49us;16556us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;74us;322us;110us;16556us;112us;16556us;120us;16556us;1us;16500us;88us;225us;3us;32768us;15us;2084us;16us;2086us;17us;2087us;1us;16500us;88us;225us;0us;16461us;1us;16500us;88us;225us;0us;16462us;0us;16463us;0us;16464us;1us;32768us;121us;152us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16465us;0us;16466us;16us;16478us;14us;16556us;22us;169us;44us;16556us;45us;16556us;46us;16556us;48us;16556us;49us;16556us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;74us;322us;110us;16556us;112us;16556us;120us;16556us;204us;159us;3us;32768us;10us;1094us;143us;157us;204us;1078us;0us;16467us;0us;16468us;1us;32768us;143us;160us;0us;16469us;14us;16478us;14us;16556us;44us;16556us;45us;16556us;46us;16556us;48us;16556us;49us;16556us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;74us;322us;110us;16556us;112us;16556us;120us;16556us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16470us;0us;16471us;15us;16478us;14us;16556us;22us;169us;44us;16556us;45us;16556us;46us;16556us;48us;16556us;49us;16556us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;74us;322us;110us;16556us;112us;16556us;120us;16556us;3us;32768us;10us;1094us;143us;167us;204us;1078us;0us;16472us;0us;16473us;14us;16478us;14us;16556us;44us;16556us;45us;16556us;46us;16556us;48us;16556us;49us;16556us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;74us;322us;110us;16556us;112us;16556us;120us;16556us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16474us;0us;16475us;0us;16476us;0us;16477us;2us;17566us;21us;2021us;84us;2022us;14us;16478us;14us;16556us;44us;16556us;45us;16556us;46us;16556us;48us;16556us;49us;16556us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;74us;322us;110us;16556us;112us;16556us;120us;16556us;0us;16479us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;16650us;44us;520us;45us;519us;46us;521us;10us;32768us;14us;600us;48us;198us;49us;357us;51us;437us;52us;358us;53us;359us;55us;193us;110us;196us;112us;599us;120us;203us;47us;32768us;14us;600us;47us;1956us;48us;198us;49us;357us;51us;437us;52us;358us;53us;359us;55us;193us;57us;587us;59us;684us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;575us;97us;1740us;101us;1966us;107us;1895us;110us;196us;112us;599us;114us;1893us;120us;203us;121us;725us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;1us;17570us;111us;2036us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;2us;16718us;34us;2064us;161us;17597us;1us;32768us;78us;187us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;2us;16488us;26us;208us;88us;206us;1us;16451us;70us;117us;0us;16480us;31us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;6us;16481us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;190us;1951us;194us;1955us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;6us;16482us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;190us;1951us;194us;1955us;0us;16483us;1us;17572us;119us;2037us;0us;16484us;6us;16573us;37us;2065us;38us;2068us;49us;356us;51us;439us;109us;2069us;110us;199us;1us;17572us;119us;2037us;0us;16485us;1us;16556us;74us;322us;0us;16486us;1us;32768us;78us;204us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16487us;4us;16650us;22us;218us;44us;520us;45us;519us;46us;521us;0us;16489us;4us;16650us;22us;218us;44us;520us;45us;519us;46us;521us;2us;32768us;20us;210us;204us;211us;0us;16490us;0us;16491us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;1us;16492us;98us;214us;5us;16650us;10us;1094us;44us;520us;45us;519us;46us;521us;204us;1078us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;0us;16493us;0us;16494us;3us;32768us;15us;2084us;16us;2086us;17us;2087us;1us;32768us;19us;220us;0us;16495us;0us;16496us;0us;16497us;1us;16500us;88us;225us;0us;16498us;15us;16478us;14us;16556us;22us;169us;44us;16556us;45us;16556us;46us;16556us;48us;16556us;49us;16556us;51us;16556us;52us;16556us;53us;16556us;55us;16556us;74us;322us;110us;16556us;112us;16556us;120us;16556us;3us;32768us;19us;2025us;20us;2026us;143us;2027us;0us;16499us;2us;32768us;10us;229us;204us;230us;0us;16501us;1us;32768us;10us;231us;0us;16502us;4us;32768us;10us;233us;21us;2016us;68us;2015us;84us;2014us;0us;16503us;1us;16504us;152us;60us;0us;16505us;1us;16507us;152us;60us;0us;16506us;1us;17562us;70us;2032us;95us;16516us;13us;16556us;22us;246us;24us;16556us;25us;16556us;29us;16556us;30us;16556us;32us;16556us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;57us;16556us;63us;16556us;67us;16556us;71us;16556us;72us;16556us;73us;16556us;74us;322us;75us;16556us;86us;16556us;87us;16556us;89us;38us;90us;16556us;91us;16556us;92us;16556us;93us;16556us;97us;16556us;99us;16556us;101us;16556us;102us;292us;107us;16556us;108us;16556us;109us;16556us;115us;16556us;116us;16556us;117us;16556us;118us;16556us;120us;16556us;122us;16556us;123us;16556us;124us;16556us;125us;16556us;126us;16556us;127us;16556us;131us;16556us;134us;16556us;135us;16556us;137us;16556us;138us;16556us;144us;16556us;147us;16556us;148us;16556us;149us;16556us;150us;16556us;151us;16556us;155us;16556us;156us;16556us;159us;16556us;160us;16556us;163us;16556us;164us;16556us;165us;16556us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;184us;16556us;185us;16556us;188us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;200us;16556us;201us;16556us;202us;16556us;203us;16556us;204us;266us;0us;16508us;4us;16650us;44us;520us;45us;519us;46us;521us;204us;261us;87us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2065us;38us;2068us;39us;2070us;40us;2073us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;109us;2069us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;122us;758us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;138us;774us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;151us;2074us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;96us;16516us;13us;16556us;22us;246us;24us;16556us;25us;16556us;29us;16556us;30us;16556us;32us;16556us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;57us;16556us;63us;16556us;67us;16556us;70us;286us;71us;16556us;72us;16556us;73us;16556us;74us;322us;75us;16556us;86us;16556us;87us;16556us;89us;38us;90us;16556us;91us;16556us;92us;16556us;93us;16556us;97us;16556us;99us;16556us;101us;16556us;102us;292us;107us;16556us;108us;16556us;109us;16556us;115us;16556us;116us;16556us;117us;16556us;118us;16556us;120us;16556us;122us;16556us;123us;16556us;124us;16556us;125us;16556us;126us;16556us;127us;16556us;131us;16556us;134us;16556us;135us;16556us;137us;16556us;138us;16556us;144us;16556us;147us;16556us;148us;16556us;149us;16556us;150us;16556us;151us;16556us;155us;16556us;156us;16556us;159us;16556us;160us;16556us;163us;16556us;164us;16556us;165us;16556us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;184us;16556us;185us;16556us;188us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;200us;16556us;201us;16556us;202us;16556us;203us;16556us;204us;267us;0us;16509us;0us;16510us;94us;16516us;13us;16556us;24us;16556us;25us;16556us;29us;16556us;30us;16556us;32us;16556us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;57us;16556us;63us;16556us;67us;16556us;71us;16556us;72us;16556us;73us;16556us;74us;322us;75us;16556us;86us;16556us;87us;16556us;89us;38us;90us;16556us;91us;16556us;92us;16556us;93us;16556us;97us;16556us;99us;16556us;101us;16556us;102us;292us;107us;16556us;108us;16556us;109us;16556us;115us;16556us;116us;16556us;117us;16556us;118us;16556us;120us;16556us;122us;16556us;123us;16556us;124us;16556us;125us;16556us;126us;16556us;127us;16556us;131us;16556us;134us;16556us;135us;16556us;137us;16556us;138us;16556us;144us;16556us;147us;16556us;148us;16556us;149us;16556us;150us;16556us;151us;16556us;155us;16556us;156us;16556us;159us;16556us;160us;16556us;163us;16556us;164us;16556us;165us;16556us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;184us;16556us;185us;16556us;188us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;200us;16556us;201us;16556us;202us;16556us;203us;16556us;204us;251us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;1us;17564us;21us;2033us;0us;16511us;0us;16512us;6us;32768us;15us;2084us;16us;2086us;17us;2087us;21us;2016us;68us;2015us;84us;2014us;0us;16513us;0us;16514us;0us;16515us;4us;16650us;44us;520us;45us;519us;46us;521us;204us;261us;87us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2065us;38us;2068us;39us;2070us;40us;2073us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;109us;2069us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;122us;758us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;138us;774us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;151us;2074us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;29us;16519us;21us;2016us;63us;1295us;64us;1281us;68us;2015us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;84us;2014us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;94us;16518us;13us;16556us;24us;16556us;25us;16556us;29us;16556us;30us;16556us;32us;16556us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;57us;16556us;63us;16556us;67us;16556us;71us;16556us;72us;16556us;73us;16556us;74us;322us;75us;16556us;86us;16556us;87us;16556us;89us;38us;90us;16556us;91us;16556us;92us;16556us;93us;16556us;97us;16556us;99us;16556us;101us;16556us;102us;292us;107us;16556us;108us;16556us;109us;16556us;115us;16556us;116us;16556us;117us;16556us;118us;16556us;120us;16556us;122us;16556us;123us;16556us;124us;16556us;125us;16556us;126us;16556us;127us;16556us;131us;16556us;134us;16556us;135us;16556us;137us;16556us;138us;16556us;144us;16556us;147us;16556us;148us;16556us;149us;16556us;150us;16556us;151us;16556us;155us;16556us;156us;16556us;159us;16556us;160us;16556us;163us;16556us;164us;16556us;165us;16556us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;184us;16556us;185us;16556us;188us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;200us;16556us;201us;16556us;202us;16556us;203us;16556us;204us;266us;0us;16517us;0us;16520us;0us;16521us;21us;16524us;21us;2016us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;68us;2015us;74us;322us;84us;2014us;89us;38us;102us;292us;109us;16556us;122us;16556us;138us;16556us;151us;16556us;163us;16556us;204us;266us;0us;16522us;94us;16525us;13us;16556us;24us;16556us;25us;16556us;29us;16556us;30us;16556us;32us;16556us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;57us;16556us;63us;16556us;67us;16556us;71us;16556us;72us;16556us;73us;16556us;74us;322us;75us;16556us;86us;16556us;87us;16556us;89us;38us;90us;16556us;91us;16556us;92us;16556us;93us;16556us;97us;16556us;99us;16556us;101us;16556us;102us;292us;107us;16556us;108us;16556us;109us;16556us;115us;16556us;116us;16556us;117us;16556us;118us;16556us;120us;16556us;122us;16556us;123us;16556us;124us;16556us;125us;16556us;126us;16556us;127us;16556us;131us;16556us;134us;16556us;135us;16556us;137us;16556us;138us;16556us;144us;16556us;147us;16556us;148us;16556us;149us;16556us;150us;16556us;151us;16556us;155us;16556us;156us;16556us;159us;16556us;160us;16556us;163us;16556us;164us;16556us;165us;16556us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;184us;16556us;185us;16556us;188us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;200us;16556us;201us;16556us;202us;16556us;203us;16556us;204us;266us;0us;16523us;3us;32768us;21us;2016us;68us;2015us;84us;2014us;3us;16535us;21us;2016us;68us;2015us;84us;2014us;6us;32768us;15us;2084us;16us;2086us;17us;2087us;21us;2016us;68us;2015us;84us;2014us;4us;32768us;21us;2016us;68us;2015us;84us;2014us;143us;315us;4us;16556us;74us;322us;89us;38us;102us;292us;204us;266us;0us;16526us;0us;16527us;0us;16528us;3us;16650us;44us;520us;45us;519us;46us;521us;11us;32768us;33us;776us;37us;2065us;38us;2068us;39us;2070us;40us;2073us;42us;790us;109us;2069us;122us;758us;138us;774us;151us;2074us;163us;770us;0us;16529us;1us;16529us;128us;1107us;0us;16530us;80us;16530us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1112us;0us;16531us;1us;16556us;74us;322us;1us;16579us;132us;363us;0us;16532us;0us;16533us;2us;32768us;70us;286us;204us;288us;5us;32768us;22us;301us;47us;1956us;57us;2042us;137us;2043us;194us;1955us;0us;16534us;0us;16535us;2us;16555us;10us;1094us;204us;1078us;0us;16536us;0us;16537us;7us;32768us;10us;1094us;37us;2065us;38us;2068us;47us;1956us;109us;2069us;194us;1955us;204us;1078us;1us;16538us;77us;1958us;0us;16539us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;6us;16540us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;190us;1951us;194us;1955us;0us;16541us;4us;32768us;15us;2084us;16us;2086us;17us;2087us;77us;1958us;0us;16542us;1us;16543us;77us;1958us;6us;16556us;57us;2042us;74us;322us;89us;38us;102us;292us;137us;2043us;204us;268us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16544us;0us;16545us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16546us;0us;16547us;0us;16548us;0us;16549us;1us;16550us;77us;1958us;94us;16516us;13us;16556us;24us;16556us;25us;16556us;29us;16556us;30us;16556us;32us;16556us;33us;16556us;37us;16556us;38us;16556us;39us;16556us;40us;16556us;42us;16556us;44us;16556us;45us;16556us;46us;16556us;47us;16556us;57us;16556us;63us;16556us;67us;16556us;71us;16556us;72us;16556us;73us;16556us;74us;322us;75us;16556us;86us;16556us;87us;16556us;89us;38us;90us;16556us;91us;16556us;92us;16556us;93us;16556us;97us;16556us;99us;16556us;101us;16556us;102us;292us;107us;16556us;108us;16556us;109us;16556us;115us;16556us;116us;16556us;117us;16556us;118us;16556us;120us;16556us;122us;16556us;123us;16556us;124us;16556us;125us;16556us;126us;16556us;127us;16556us;131us;16556us;134us;16556us;135us;16556us;137us;16556us;138us;16556us;144us;16556us;147us;16556us;148us;16556us;149us;16556us;150us;16556us;151us;16556us;155us;16556us;156us;16556us;159us;16556us;160us;16556us;163us;16556us;164us;16556us;165us;16556us;167us;16556us;168us;16556us;169us;16556us;170us;16556us;171us;16556us;172us;16556us;173us;16556us;174us;16556us;175us;16556us;176us;16556us;177us;16556us;178us;16556us;179us;16556us;181us;16556us;182us;16556us;184us;16556us;185us;16556us;188us;16556us;190us;16556us;194us;16556us;195us;16556us;196us;16556us;200us;16556us;201us;16556us;202us;16556us;203us;16556us;204us;269us;3us;32768us;10us;1094us;143us;313us;204us;1078us;0us;16551us;0us;16552us;0us;16553us;6us;16556us;19us;16602us;20us;16602us;22us;403us;74us;322us;143us;16602us;204us;409us;3us;32768us;19us;2025us;20us;2026us;143us;2027us;0us;16554us;0us;16555us;1us;16557us;74us;322us;0us;16558us;14us;32768us;10us;1094us;15us;2097us;37us;2066us;38us;2068us;39us;2071us;40us;2073us;47us;1956us;61us;2095us;95us;2096us;109us;2069us;151us;2074us;164us;353us;194us;1955us;204us;327us;2us;17566us;21us;2021us;84us;2022us;8us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;56us;325us;61us;2095us;95us;2096us;204us;1078us;1us;17564us;21us;2033us;0us;16559us;1us;16991us;56us;328us;1us;17564us;21us;2033us;0us;16560us;0us;16561us;0us;16562us;0us;16563us;9us;17565us;37us;2065us;38us;2068us;39us;2070us;40us;2073us;47us;1956us;109us;2069us;151us;2074us;164us;353us;194us;1955us;0us;16564us;3us;17595us;35us;2063us;36us;2062us;77us;1958us;30us;17264us;57us;1645us;72us;1504us;73us;1648us;93us;1510us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16565us;3us;32768us;22us;342us;47us;1956us;194us;1955us;3us;17595us;35us;2063us;36us;2062us;77us;1958us;30us;17264us;57us;1645us;72us;1504us;73us;1648us;93us;1510us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16566us;2us;32768us;47us;1956us;194us;1955us;4us;32768us;15us;2084us;16us;2086us;17us;2087us;77us;1958us;2us;17595us;35us;2063us;36us;2062us;30us;17264us;57us;1645us;72us;1504us;73us;1648us;93us;1510us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16567us;1us;32768us;78us;348us;0us;16568us;1us;32768us;78us;350us;0us;16569us;1us;17495us;78us;352us;0us;16570us;1us;32768us;78us;354us;0us;16571us;11us;16573us;30us;780us;33us;776us;37us;2065us;38us;2068us;42us;790us;49us;356us;51us;439us;109us;2069us;110us;483us;138us;774us;163us;770us;0us;16572us;0us;16574us;0us;16575us;0us;16576us;3us;16650us;44us;520us;45us;519us;46us;521us;1us;16720us;85us;634us;0us;16577us;1us;16556us;74us;322us;1us;16579us;132us;363us;0us;16578us;39us;16556us;14us;16580us;15us;16580us;16us;16580us;17us;16580us;19us;16580us;20us;16580us;21us;16580us;30us;16580us;33us;16580us;37us;16580us;38us;16580us;39us;16580us;40us;16580us;42us;16580us;48us;16580us;49us;16580us;51us;16580us;52us;16580us;53us;16580us;55us;16580us;61us;16580us;68us;16580us;74us;322us;84us;16580us;88us;316us;89us;16580us;95us;16580us;102us;16580us;109us;16580us;110us;16580us;112us;16580us;120us;16580us;122us;16580us;132us;16580us;138us;16580us;143us;16580us;151us;16580us;152us;16580us;163us;16580us;0us;16581us;3us;16650us;44us;520us;45us;519us;46us;521us;2us;17595us;35us;2063us;36us;2062us;1us;16874us;93us;892us;1us;16664us;133us;536us;3us;32768us;10us;1094us;70us;373us;204us;1078us;6us;16556us;22us;376us;50us;596us;57us;598us;74us;322us;112us;597us;153us;389us;0us;16582us;0us;16583us;9us;16556us;15us;2084us;16us;2086us;17us;2087us;22us;399us;50us;596us;57us;598us;74us;322us;112us;597us;153us;389us;1us;17564us;21us;2033us;7us;16556us;10us;16602us;15us;16602us;16us;16602us;17us;16602us;74us;322us;88us;16602us;204us;409us;1us;16659us;88us;525us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;1us;16659us;88us;525us;0us;16584us;0us;16585us;0us;16586us;1us;16659us;88us;525us;0us;16587us;0us;16588us;0us;16589us;1us;32768us;121us;390us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16590us;0us;16591us;10us;16556us;10us;16602us;15us;16602us;22us;403us;37us;16602us;39us;16602us;61us;16602us;74us;322us;95us;16602us;143us;16602us;204us;397us;8us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;61us;2095us;95us;2096us;143us;395us;204us;1078us;0us;16592us;0us;16593us;9us;16556us;10us;16602us;15us;16602us;37us;16602us;39us;16602us;61us;16602us;74us;322us;95us;16602us;143us;398us;204us;409us;0us;16594us;1us;16556us;74us;322us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16595us;0us;16596us;6us;16556us;10us;16602us;15us;16602us;16us;16602us;17us;16602us;74us;322us;204us;409us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16597us;0us;16598us;0us;16599us;0us;16600us;14us;16556us;10us;16602us;15us;16602us;16us;16602us;17us;16602us;19us;16602us;20us;16602us;37us;16602us;39us;16602us;61us;16602us;74us;322us;88us;16602us;95us;16602us;143us;16602us;204us;409us;0us;16601us;2us;17566us;21us;2021us;84us;2022us;14us;16556us;10us;16602us;15us;16602us;16us;16602us;17us;16602us;19us;16602us;20us;16602us;37us;16602us;39us;16602us;61us;16602us;74us;322us;88us;16602us;95us;16602us;143us;16602us;204us;409us;0us;16603us;1us;17570us;111us;2036us;0us;16604us;1us;17570us;111us;2036us;2us;32768us;20us;418us;204us;419us;0us;16605us;0us;16606us;1us;16607us;132us;421us;1us;17570us;111us;2036us;0us;16608us;1us;16556us;74us;322us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;1us;17334us;78us;1681us;1us;32768us;70us;427us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16609us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;1us;17334us;78us;1681us;11us;32768us;10us;1094us;15us;2097us;21us;434us;26us;416us;37us;2093us;39us;2094us;61us;2095us;70us;432us;88us;414us;95us;2096us;204us;1078us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16610us;0us;16611us;0us;16612us;0us;16613us;1us;16614us;49us;438us;0us;16615us;1us;16616us;49us;440us;0us;16617us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;16650us;44us;520us;45us;519us;46us;521us;15us;32768us;14us;600us;30us;780us;33us;776us;42us;790us;48us;355us;49us;357us;51us;437us;52us;358us;53us;359us;55us;528us;110us;483us;112us;599us;120us;471us;138us;774us;163us;770us;52us;32768us;14us;600us;30us;780us;33us;776us;42us;790us;47us;1956us;48us;355us;49us;357us;51us;437us;52us;358us;53us;359us;55us;528us;57us;587us;59us;684us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;575us;97us;1740us;101us;1966us;107us;1895us;110us;483us;112us;599us;114us;1893us;120us;471us;121us;725us;123us;1894us;138us;774us;149us;1892us;163us;770us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;0us;16618us;0us;16619us;4us;17570us;10us;1094us;110us;492us;111us;2036us;204us;1078us;1us;17560us;19us;2031us;0us;16620us;0us;16621us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;7us;16657us;36us;1777us;47us;1956us;71us;1791us;88us;522us;92us;1949us;190us;1951us;194us;1955us;0us;16622us;0us;16623us;3us;16650us;44us;520us;45us;519us;46us;521us;1us;17570us;111us;2036us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;2us;16718us;34us;2064us;161us;17597us;1us;32768us;78us;460us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;2us;16488us;26us;208us;88us;206us;1us;17560us;19us;2031us;0us;16624us;0us;16625us;1us;17560us;19us;2031us;0us;16626us;1us;17560us;19us;2031us;0us;16627us;1us;17560us;19us;2031us;0us;16628us;37us;32768us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;1us;16664us;133us;536us;9us;32768us;10us;1094us;15us;2097us;21us;478us;37us;2093us;39us;2094us;61us;2095us;70us;474us;95us;2096us;204us;1078us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;17560us;19us;2031us;0us;16629us;0us;16630us;0us;16631us;1us;17564us;21us;2033us;0us;16632us;1us;16556us;74us;322us;0us;16633us;1us;17572us;119us;2037us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;32768us;10us;1094us;194us;1955us;204us;1078us;3us;32768us;10us;1094us;78us;487us;204us;1078us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16634us;0us;16635us;0us;16636us;0us;16637us;1us;17572us;119us;2037us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;32768us;10us;1094us;194us;1955us;204us;1078us;1us;16642us;78us;503us;9us;32768us;10us;1094us;15us;2097us;21us;501us;37us;2093us;39us;2094us;61us;2095us;70us;497us;95us;2096us;204us;1078us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;2us;16488us;26us;208us;88us;206us;0us;16638us;0us;16639us;0us;16640us;0us;16641us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16643us;0us;16644us;1us;16925us;77us;507us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;0us;16645us;1us;32768us;77us;510us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;0us;16646us;0us;16647us;4us;32768us;67us;514us;93us;1961us;101us;1966us;194us;1955us;1us;32768us;77us;515us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;0us;16648us;0us;16649us;0us;16651us;0us;16652us;0us;16653us;0us;16654us;31us;16556us;10us;16656us;14us;16656us;15us;16656us;16us;16656us;17us;16656us;19us;16656us;20us;16656us;21us;16656us;22us;543us;30us;16656us;33us;16656us;37us;16656us;39us;16656us;42us;16656us;44us;16656us;45us;16656us;46us;16656us;51us;16656us;53us;16656us;55us;16656us;61us;16656us;74us;322us;84us;16656us;88us;16656us;95us;16656us;110us;16656us;112us;16656us;120us;16656us;138us;16656us;143us;16656us;163us;16656us;3us;32768us;19us;2025us;20us;2026us;143us;2027us;0us;16655us;6us;16556us;19us;16602us;20us;16602us;22us;403us;74us;322us;143us;16602us;204us;409us;3us;32768us;19us;2025us;20us;2026us;143us;2027us;0us;16658us;37us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;47us;1956us;57us;1881us;61us;2095us;67us;1875us;89us;632us;92us;1949us;93us;1866us;95us;2096us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;33us;16668us;35us;2063us;36us;2062us;57us;17595us;72us;17595us;73us;17595us;93us;17595us;107us;17595us;123us;17595us;133us;540us;137us;17595us;149us;17595us;156us;17595us;167us;17595us;168us;17595us;169us;17595us;170us;17595us;171us;17595us;172us;17595us;173us;17595us;174us;17595us;175us;17595us;176us;17595us;177us;17595us;178us;17595us;179us;17595us;181us;17595us;182us;17595us;195us;17595us;196us;17595us;200us;17595us;201us;17595us;202us;17595us;203us;17595us;0us;16660us;30us;32768us;57us;1645us;72us;1504us;73us;1648us;93us;1510us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;16668us;133us;540us;0us;16661us;0us;16662us;0us;16663us;3us;32768us;10us;1094us;194us;1955us;204us;1078us;0us;16665us;0us;16666us;0us;16667us;2us;32768us;155us;542us;194us;1955us;0us;16669us;0us;16670us;1us;16556us;74us;322us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16671us;0us;16672us;0us;16673us;2us;17566us;21us;2021us;84us;2022us;14us;16556us;10us;16675us;14us;16675us;15us;16675us;16us;16675us;17us;16675us;19us;16675us;20us;16675us;21us;16675us;61us;16675us;62us;16675us;74us;322us;112us;16675us;143us;16675us;197us;16675us;0us;16674us;4us;32768us;48us;562us;49us;564us;52us;565us;204us;559us;5us;17570us;48us;562us;49us;564us;52us;565us;111us;2036us;204us;559us;4us;17570us;10us;1094us;110us;492us;111us;2036us;204us;1078us;1us;17560us;19us;2031us;0us;16676us;1us;17560us;19us;2031us;0us;16677us;0us;16678us;1us;17570us;111us;2036us;1us;17560us;19us;2031us;0us;16679us;1us;32768us;49us;563us;0us;16680us;0us;16681us;0us;16682us;3us;16650us;44us;520us;45us;519us;46us;521us;37us;32768us;47us;1956us;57us;587us;59us;684us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;575us;97us;1740us;101us;1966us;107us;1895us;114us;1893us;121us;725us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;2us;17384us;77us;1958us;156us;569us;1us;32768us;202us;570us;2us;32768us;10us;1094us;204us;1078us;0us;16683us;0us;16684us;0us;16685us;0us;16686us;59us;32768us;47us;1956us;57us;587us;59us;2001us;63us;1983us;64us;1981us;67us;1788us;70us;1985us;71us;708us;73us;590us;75us;1989us;79us;706us;83us;1993us;89us;576us;90us;1990us;91us;1991us;92us;1949us;93us;1780us;97us;1741us;103us;1986us;107us;1895us;114us;1893us;123us;1894us;144us;1996us;146us;1992us;149us;1892us;156us;1998us;159us;1995us;161us;1987us;162us;1988us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;183us;1994us;184us;1982us;185us;1979us;186us;1978us;187us;1744us;188us;1973us;189us;1977us;190us;1952us;191us;1975us;192us;1974us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1897us;30us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1876us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;16859us;89us;578us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16687us;5us;16556us;61us;2075us;62us;2077us;74us;322us;197us;2078us;204us;584us;5us;32768us;10us;1094us;61us;2075us;62us;2077us;197us;2078us;204us;1078us;0us;16688us;0us;16689us;3us;32768us;61us;2075us;62us;2077us;197us;2078us;0us;16690us;0us;16691us;2us;32768us;73us;590us;93us;1882us;0us;16692us;0us;16693us;2us;16556us;74us;322us;204us;594us;3us;32768us;10us;1094us;66us;2079us;204us;1078us;0us;16694us;0us;16695us;1us;32768us;66us;2079us;0us;16696us;0us;16697us;0us;16698us;0us;16699us;0us;16700us;0us;16701us;7us;32768us;10us;1094us;47us;1956us;92us;1949us;93us;608us;190us;1951us;194us;1955us;204us;1078us;3us;16702us;34us;2064us;77us;1958us;161us;17597us;2us;32768us;47us;1956us;194us;1955us;1us;16703us;77us;1958us;0us;16704us;0us;16705us;0us;16706us;1us;16556us;74us;322us;4us;32768us;94us;2083us;95us;2080us;96us;2082us;98us;613us;0us;16707us;2us;16720us;85us;634us;98us;613us;1us;16714us;98us;614us;1us;16556us;74us;322us;2us;16556us;74us;322us;144us;625us;0us;16708us;0us;16709us;2us;32768us;92us;1949us;190us;1951us;1us;16710us;90us;619us;30us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1876us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;16711us;90us;643us;1us;32768us;161us;622us;1us;16556us;74us;322us;1us;32768us;162us;624us;0us;16712us;0us;16713us;1us;32768us;161us;627us;3us;16556us;74us;322us;85us;16715us;162us;16715us;1us;16720us;85us;634us;1us;32768us;162us;630us;0us;16716us;0us;16717us;30us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1876us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;16719us;77us;1901us;32us;32768us;47us;1956us;53us;648us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;664us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;16721us;132us;638us;1us;17331us;132us;638us;1us;17333us;132us;638us;32us;32768us;47us;1956us;53us;648us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;664us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16722us;0us;16723us;1us;17382us;90us;643us;1us;17383us;90us;643us;30us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1876us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;16724us;77us;17442us;1us;16725us;77us;1901us;1us;16726us;77us;17442us;1us;16727us;77us;1901us;2us;32768us;92us;1949us;190us;1951us;1us;32768us;78us;650us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16728us;3us;17385us;78us;655us;80us;653us;90us;1762us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;4us;16729us;47us;17398us;71us;17398us;92us;17398us;194us;17398us;5us;32768us;57us;656us;93us;661us;149us;659us;153us;671us;194us;657us;0us;16730us;4us;16738us;34us;1907us;57us;658us;149us;660us;161us;1909us;0us;16731us;0us;16732us;0us;16733us;1us;16556us;74us;322us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16734us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1896us;4us;32768us;94us;2083us;95us;2080us;96us;2082us;103us;675us;1us;32768us;78us;667us;1us;32768us;93us;668us;1us;16556us;74us;322us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16735us;2us;32768us;34us;1907us;161us;1909us;0us;16736us;0us;16737us;6us;16739us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;190us;1951us;194us;1955us;31us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;6us;16740us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;190us;1951us;194us;1955us;14us;16741us;10us;17389us;36us;1777us;41us;1772us;47us;1956us;70us;17389us;71us;1791us;92us;1949us;97us;17389us;98us;17389us;99us;17389us;187us;17389us;190us;1951us;194us;1955us;204us;17389us;1us;16556us;74us;322us;0us;16742us;1us;32768us;59us;684us;1us;16556us;74us;322us;0us;16743us;2us;16744us;21us;2033us;59us;17564us;0us;16745us;1us;16747us;59us;684us;1us;16556us;74us;322us;0us;16746us;3us;16650us;44us;520us;45us;519us;46us;521us;6us;32768us;10us;1094us;93us;705us;101us;1966us;121us;695us;194us;1955us;204us;1078us;36us;16748us;47us;1956us;57us;587us;67us;1788us;70us;701us;73us;590us;78us;699us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;121us;692us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;0us;16749us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;204us;1078us;0us;16750us;0us;16751us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;204us;1078us;0us;16752us;0us;16753us;0us;16754us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16755us;42us;32768us;10us;1094us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;5us;16756us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;0us;16757us;0us;16758us;29us;32768us;59us;2001us;63us;1983us;64us;1981us;70us;1985us;71us;708us;75us;1989us;79us;706us;83us;1993us;90us;1990us;91us;1991us;97us;1984us;103us;1986us;144us;1996us;146us;1992us;156us;1998us;159us;1995us;161us;1987us;162us;1988us;183us;1994us;184us;1982us;185us;1979us;186us;1978us;187us;1980us;188us;1973us;189us;1977us;190us;1976us;191us;1975us;192us;1974us;204us;1964us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16759us;1us;32768us;60us;709us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16760us;5us;17495us;21us;2033us;59us;17564us;70us;713us;78us;17532us;121us;719us;0us;16761us;42us;32768us;10us;1094us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;6us;17564us;21us;2033us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;46us;16762us;10us;16769us;14us;16769us;15us;16769us;16us;16769us;17us;16769us;19us;16769us;20us;16769us;21us;16769us;30us;16769us;33us;16769us;37us;16769us;38us;16769us;39us;16769us;40us;16769us;42us;16769us;44us;16769us;45us;16769us;46us;16769us;48us;16769us;49us;16769us;51us;16769us;52us;16769us;53us;16769us;55us;16769us;61us;16769us;68us;16769us;74us;16769us;84us;16769us;88us;16769us;89us;16769us;94us;16769us;95us;16769us;96us;16769us;102us;16769us;109us;16769us;110us;16769us;112us;16769us;120us;16769us;122us;16769us;132us;16769us;138us;16769us;143us;16769us;151us;16769us;152us;16769us;163us;16769us;204us;16769us;1us;17564us;21us;2033us;46us;16763us;10us;16770us;14us;16770us;15us;16770us;16us;16770us;17us;16770us;19us;16770us;20us;16770us;21us;16770us;30us;16770us;33us;16770us;37us;16770us;38us;16770us;39us;16770us;40us;16770us;42us;16770us;44us;16770us;45us;16770us;46us;16770us;48us;16770us;49us;16770us;51us;16770us;52us;16770us;53us;16770us;55us;16770us;61us;16770us;68us;16770us;74us;16770us;84us;16770us;88us;16770us;89us;16770us;94us;16770us;95us;16770us;96us;16770us;102us;16770us;109us;16770us;110us;16770us;112us;16770us;120us;16770us;122us;16770us;132us;16770us;138us;16770us;143us;16770us;151us;16770us;152us;16770us;163us;16770us;204us;16770us;0us;16764us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;204us;1078us;0us;16765us;1us;32768us;78us;722us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16766us;0us;16767us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;0us;16768us;1us;16774us;97us;728us;34us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16771us;0us;16772us;32us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16773us;1us;17495us;78us;734us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16775us;0us;16776us;0us;16777us;0us;16778us;0us;16779us;0us;16780us;0us;16781us;2us;17566us;21us;2021us;84us;2022us;5us;16556us;61us;17565us;62us;17565us;66us;17565us;74us;322us;197us;17565us;0us;16782us;0us;16783us;1us;17572us;119us;2037us;0us;16784us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;32768us;10us;1094us;194us;1955us;204us;1078us;3us;32768us;10us;1094us;78us;751us;204us;1078us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16785us;0us;16786us;0us;16787us;0us;16788us;1us;16659us;88us;525us;0us;16789us;1us;16556us;74us;322us;3us;16650us;44us;520us;45us;519us;46us;521us;3us;32768us;10us;1094us;194us;1955us;204us;1078us;1us;16795us;70us;768us;0us;16790us;0us;16791us;1us;16792us;121us;765us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1774us;97us;731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;196us;580us;202us;2048us;203us;872us;204us;1078us;0us;16793us;0us;16794us;2us;32768us;47us;1956us;194us;1955us;1us;16796us;77us;1958us;1us;17568us;104us;2035us;2us;16556us;74us;322us;204us;827us;0us;16797us;0us;16798us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16799us;1us;17568us;104us;2035us;2us;16556us;74us;322us;204us;827us;3us;32768us;10us;1094us;19us;788us;204us;1078us;0us;16800us;81us;32768us;13us;1206us;19us;783us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;3us;32768us;10us;1094us;19us;788us;204us;1078us;0us;16801us;0us;16802us;0us;16803us;0us;16804us;0us;16805us;0us;16806us;0us;16807us;0us;16808us;1us;16556us;74us;322us;3us;16650us;44us;520us;45us;519us;46us;521us;1us;32768us;194us;1955us;2us;17595us;35us;2063us;36us;2062us;1us;32768us;93us;795us;4us;16556us;74us;322us;94us;16812us;95us;16812us;96us;16812us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16809us;1us;16810us;98us;800us;1us;16811us;98us;802us;1us;16556us;74us;322us;0us;16813us;1us;16556us;74us;322us;0us;16814us;3us;32768us;43us;816us;47us;1956us;194us;1955us;7us;16815us;35us;2063us;36us;2062us;41us;813us;71us;17595us;90us;815us;97us;812us;194us;1955us;0us;16816us;1us;16817us;77us;1958us;6us;16823us;35us;2063us;36us;2062us;41us;813us;71us;17595us;90us;815us;97us;812us;1us;32768us;71us;810us;1us;32768us;60us;811us;0us;16818us;0us;16819us;1us;32768us;149us;814us;0us;16820us;0us;16821us;1us;32768us;97us;818us;1us;16824us;97us;818us;0us;16822us;3us;32768us;43us;817us;47us;1956us;194us;1955us;1us;16827us;132us;822us;0us;16825us;2us;16556us;74us;322us;204us;827us;1us;16827us;132us;822us;0us;16826us;1us;17570us;111us;2036us;0us;16828us;0us;16829us;1us;17572us;119us;2037us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;1us;17334us;78us;1681us;3us;32768us;10us;1094us;70us;832us;204us;1078us;81us;32768us;13us;1206us;22us;836us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;834us;0us;16830us;0us;16831us;0us;16832us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16833us;0us;16834us;0us;16835us;0us;16838us;1us;16836us;85us;844us;0us;16837us;2us;32768us;92us;1949us;190us;1951us;2us;32768us;70us;846us;132us;848us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16839us;2us;32768us;92us;1949us;190us;1951us;0us;16840us;0us;16841us;2us;32768us;57us;854us;78us;852us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;16842us;0us;16843us;0us;16844us;0us;16845us;0us;16846us;0us;16847us;0us;16848us;0us;16849us;0us;16850us;0us;16851us;0us;16852us;0us;16853us;0us;16854us;0us;16855us;0us;16856us;0us;16857us;0us;16858us;0us;16859us;0us;16860us;0us;16861us;1us;16864us;187us;874us;1us;32768us;179us;875us;0us;16862us;1us;32768us;179us;877us;1us;16865us;187us;878us;1us;32768us;179us;879us;0us;16863us;0us;16866us;2us;32768us;63us;876us;179us;873us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16867us;0us;16868us;2us;32768us;93us;881us;179us;880us;0us;16869us;1us;16870us;34us;888us;1us;32768us;161us;1926us;0us;16871us;6us;16872us;41us;899us;59us;896us;79us;915us;90us;927us;98us;921us;133us;911us;0us;16873us;41us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;94us;2083us;95us;2080us;96us;2082us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;10us;32768us;41us;899us;59us;896us;78us;1021us;79us;1025us;90us;1035us;94us;2083us;95us;2080us;96us;2082us;98us;1029us;133us;1015us;0us;16875us;0us;16876us;0us;16877us;2us;16877us;41us;899us;59us;896us;2us;16877us;41us;899us;59us;896us;0us;16878us;3us;16882us;79us;915us;90us;927us;98us;921us;1us;16883us;79us;915us;2us;16889us;79us;915us;90us;927us;2us;16890us;79us;915us;90us;927us;2us;16893us;79us;915us;90us;927us;1us;16895us;79us;915us;1us;16896us;79us;915us;7us;32768us;41us;899us;59us;896us;70us;1096us;79us;915us;90us;927us;98us;921us;133us;911us;7us;32768us;41us;899us;59us;896us;70us;1101us;79us;915us;90us;927us;98us;921us;133us;911us;7us;32768us;41us;899us;59us;896us;70us;1184us;79us;915us;90us;927us;98us;921us;133us;911us;7us;32768us;41us;899us;59us;896us;70us;1191us;79us;915us;90us;927us;98us;921us;133us;911us;38us;16881us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16879us;0us;16880us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;42us;16885us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16884us;1us;16886us;98us;920us;0us;16887us;0us;16888us;44us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;95us;2096us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;44us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;95us;2096us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16891us;0us;16892us;44us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;95us;2096us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16894us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;2us;17566us;21us;2021us;84us;2022us;0us;16897us;3us;17565us;21us;2021us;84us;2022us;194us;1955us;0us;16898us;1us;32768us;194us;1955us;0us;16899us;3us;32768us;10us;1094us;70us;936us;204us;1078us;4us;17534us;10us;1094us;70us;936us;77us;2008us;204us;1078us;40us;32768us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;7us;16900us;41us;899us;59us;896us;78us;1021us;79us;1025us;90us;1035us;98us;1029us;133us;1015us;0us;16901us;0us;16902us;39us;16927us;34us;2064us;35us;948us;36us;950us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;956us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;161us;17597us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;37us;16903us;35us;943us;36us;945us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;956us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16904us;35us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;956us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16905us;35us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;956us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16906us;0us;16907us;35us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;956us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16908us;35us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;956us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16909us;33us;16912us;10us;1094us;47us;1956us;57us;587us;67us;1875us;73us;590us;89us;632us;92us;1949us;93us;1876us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16910us;0us;16911us;0us;16913us;64us;16941us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;59us;2001us;63us;1983us;64us;1981us;67us;506us;70us;1985us;71us;972us;72us;975us;74us;322us;75us;979us;82us;952us;83us;1993us;90us;1990us;91us;1991us;93us;986us;97us;1984us;98us;1032us;101us;1966us;103us;1986us;107us;984us;123us;983us;144us;1996us;146us;1992us;149us;985us;156us;1498us;159us;1995us;161us;1987us;162us;1988us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;183us;1994us;184us;1982us;185us;1979us;186us;1978us;187us;1980us;188us;1973us;189us;1977us;190us;1976us;191us;1975us;192us;1974us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;990us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;16914us;0us;16915us;37us;16919us;35us;964us;36us;962us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16916us;35us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16917us;35us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16918us;0us;16920us;3us;32768us;47us;1956us;194us;1955us;204us;970us;3us;32768us;61us;2075us;62us;2077us;197us;2078us;0us;16921us;3us;32768us;61us;2075us;62us;2077us;197us;2078us;0us;16922us;38us;16968us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;1us;32768us;60us;974us;0us;16923us;38us;16968us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;1us;32768us;65us;977us;0us;16924us;1us;32768us;194us;1955us;1us;17519us;194us;1955us;0us;16926us;0us;16927us;0us;16928us;0us;16929us;0us;16930us;0us;16931us;64us;16941us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;59us;2001us;63us;1983us;64us;1981us;67us;506us;70us;1985us;71us;972us;72us;975us;74us;322us;75us;979us;82us;952us;83us;1993us;90us;1990us;91us;1991us;93us;986us;97us;1984us;98us;1032us;101us;1966us;103us;1986us;107us;984us;123us;983us;144us;1996us;146us;1992us;149us;985us;156us;1498us;159us;1995us;161us;1987us;162us;1988us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;183us;1994us;184us;1982us;185us;1979us;186us;1978us;187us;1980us;188us;1973us;189us;1977us;190us;1976us;191us;1975us;192us;1974us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;990us;5us;32768us;10us;1094us;94us;2083us;95us;2080us;96us;2082us;204us;1078us;0us;16932us;0us;16933us;3us;16991us;94us;2083us;95us;2080us;96us;2082us;2us;16934us;34us;17499us;161us;17499us;0us;16935us;1us;32768us;93us;994us;40us;32768us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;998us;6us;16946us;10us;1094us;94us;2083us;95us;2080us;96us;2082us;98us;1028us;204us;1078us;0us;16936us;0us;16937us;3us;16991us;94us;2083us;95us;2080us;96us;2082us;0us;16938us;0us;16939us;7us;16940us;41us;899us;59us;896us;78us;1021us;79us;1025us;90us;1035us;98us;1029us;133us;1015us;4us;16945us;78us;1021us;79us;1025us;90us;1035us;98us;1029us;3us;16950us;78us;1021us;79us;1025us;90us;1035us;2us;16951us;78us;1021us;79us;1025us;3us;16955us;78us;1021us;79us;1025us;90us;1035us;3us;16956us;78us;1021us;79us;1025us;90us;1035us;3us;16959us;78us;1021us;79us;1025us;90us;1035us;2us;16961us;78us;1021us;79us;1025us;7us;32768us;41us;899us;59us;896us;78us;1021us;79us;1025us;90us;1035us;98us;1029us;133us;1015us;2us;16962us;78us;1021us;79us;1025us;7us;16965us;41us;899us;59us;896us;78us;1021us;79us;1025us;90us;1035us;98us;1029us;133us;1015us;9us;17566us;21us;2021us;41us;899us;59us;896us;78us;1021us;79us;1025us;84us;2022us;90us;1035us;98us;1029us;133us;1015us;16us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;41us;899us;59us;896us;61us;2095us;70us;1558us;78us;1021us;79us;1025us;90us;1035us;95us;2096us;98us;1029us;128us;1555us;133us;1015us;204us;1082us;8us;17131us;41us;899us;59us;896us;78us;1021us;79us;1025us;85us;1348us;90us;1035us;98us;1029us;133us;1015us;38us;16944us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16942us;0us;16943us;38us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;1us;16946us;98us;1028us;1us;16947us;90us;1034us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16948us;0us;16949us;38us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;39us;16953us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16952us;0us;16954us;45us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;95us;2096us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;45us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;95us;2096us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16957us;0us;16958us;45us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;95us;2096us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16960us;38us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;38us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;2us;17566us;21us;2021us;84us;2022us;0us;16963us;2us;17565us;47us;1956us;194us;1955us;0us;16964us;4us;32768us;10us;1094us;70us;1041us;77us;1958us;204us;1078us;40us;32768us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;16966us;0us;16967us;0us;16969us;38us;16968us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;16970us;82us;32768us;13us;1206us;15us;2084us;16us;2086us;17us;2087us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;5us;32768us;10us;1094us;15us;2084us;16us;2086us;17us;2087us;204us;1078us;0us;16971us;0us;16972us;0us;16973us;0us;16974us;82us;32768us;13us;1206us;15us;2084us;16us;2086us;17us;2087us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;3us;32768us;15us;2084us;16us;2086us;17us;2087us;0us;16975us;0us;16976us;26us;16977us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;1us;16979us;18us;1059us;0us;16978us;0us;16980us;94us;16980us;14us;17325us;15us;17325us;16us;17325us;17us;17325us;18us;17325us;19us;17325us;21us;17325us;26us;17325us;27us;17325us;28us;17325us;30us;17325us;33us;17325us;37us;17325us;38us;17325us;39us;17325us;40us;17325us;41us;17325us;42us;17325us;44us;17325us;45us;17325us;46us;17325us;48us;17325us;49us;17325us;51us;17325us;52us;17325us;53us;17325us;55us;17325us;59us;17325us;60us;17325us;61us;17325us;62us;17325us;63us;17325us;64us;17325us;65us;17325us;66us;17325us;68us;17325us;70us;17325us;74us;17325us;78us;17325us;79us;17325us;80us;17325us;81us;17325us;82us;17325us;83us;17325us;84us;17325us;85us;17325us;88us;17325us;89us;17325us;90us;17325us;91us;17325us;94us;17325us;95us;17325us;96us;17325us;97us;17325us;98us;17325us;99us;17325us;102us;17325us;103us;17325us;105us;17325us;106us;17325us;109us;17325us;110us;17325us;112us;17325us;120us;17325us;122us;17325us;128us;17325us;129us;17325us;130us;17325us;132us;17325us;138us;17325us;139us;17325us;140us;17325us;141us;17325us;142us;17325us;143us;17325us;144us;17325us;146us;17325us;151us;17325us;152us;17325us;157us;17325us;159us;17325us;161us;17325us;162us;17325us;163us;17325us;185us;17325us;186us;17325us;187us;17325us;189us;17325us;190us;17325us;191us;17325us;192us;17325us;197us;17325us;198us;17325us;199us;17325us;1us;16983us;78us;1063us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;16981us;0us;16982us;1us;32768us;10us;1067us;0us;16984us;30us;16987us;21us;2021us;28us;1073us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;84us;2022us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;105us;1071us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;79us;16986us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16985us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;16988us;1us;32768us;22us;1074us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;3us;32768us;15us;2084us;16us;2086us;17us;2087us;0us;16989us;82us;16990us;13us;1206us;21us;1113us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1112us;0us;16991us;2us;16991us;19us;2041us;139us;2040us;2us;16991us;19us;2041us;139us;2040us;2us;16991us;30us;2039us;138us;2038us;2us;16991us;19us;2041us;139us;2040us;2us;16991us;19us;2041us;139us;2040us;0us;16991us;2us;16991us;41us;899us;59us;896us;1us;16991us;60us;1456us;1us;16991us;60us;1477us;1us;16991us;157us;1502us;1us;16991us;65us;1508us;3us;16991us;94us;2083us;95us;2080us;96us;2082us;3us;16991us;94us;2083us;95us;2080us;96us;2082us;3us;16991us;61us;2075us;62us;2077us;197us;2078us;1us;16991us;66us;2079us;0us;16992us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;32768us;128us;1098us;2us;16995us;31us;1100us;166us;1095us;0us;16993us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;3us;32768us;10us;1094us;19us;788us;204us;1078us;1us;17564us;21us;2033us;2us;16995us;31us;1100us;166us;1095us;0us;16994us;1us;32768us;128us;1107us;80us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1109us;0us;16996us;0us;16997us;82us;32768us;13us;1206us;21us;1113us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1112us;0us;16998us;0us;16999us;81us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1115us;0us;17000us;0us;17001us;0us;17002us;0us;17003us;0us;17004us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;4us;32768us;10us;1094us;26us;1324us;88us;1322us;204us;1078us;0us;17005us;0us;17006us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;4us;32768us;10us;1094us;26us;1324us;88us;1322us;204us;1078us;0us;17007us;0us;17008us;82us;32768us;10us;1094us;13us;1206us;18us;1131us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;5us;32768us;10us;1094us;26us;1324us;88us;1322us;130us;1133us;204us;1078us;0us;17009us;0us;17010us;2us;17011us;26us;1324us;88us;1322us;0us;17012us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17013us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;30us;32768us;10us;1094us;28us;1355us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;105us;1353us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;204us;1078us;0us;17014us;0us;17015us;0us;17016us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17017us;68us;17019us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;160us;1183us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17018us;80us;32768us;13us;1206us;22us;1053us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17020us;69us;17022us;13us;1206us;22us;1053us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;160us;1183us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17021us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1083us;0us;17023us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1083us;0us;17024us;45us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;61us;2095us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;95us;2096us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1081us;10us;17564us;10us;1094us;15us;2097us;21us;2033us;30us;2039us;37us;2093us;39us;2094us;61us;2095us;95us;2096us;138us;2038us;204us;1078us;87us;32768us;10us;1094us;13us;1206us;15us;2097us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1079us;9us;32768us;10us;1094us;15us;2097us;19us;2041us;37us;2093us;39us;2094us;61us;2095us;95us;2096us;139us;2040us;204us;1078us;0us;17025us;0us;17026us;0us;17027us;0us;17028us;0us;17029us;1us;32768us;99us;1553us;0us;17030us;4us;32768us;10us;1094us;30us;2039us;138us;2038us;204us;1078us;82us;32768us;10us;1094us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1080us;4us;32768us;10us;1094us;19us;2041us;139us;2040us;204us;1078us;0us;17031us;0us;17032us;0us;17033us;0us;17034us;0us;17035us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;2us;32768us;19us;2041us;139us;2040us;0us;17036us;0us;17037us;0us;17038us;0us;17039us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;26us;17040us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;26us;17041us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;0us;17042us;0us;17043us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;32768us;128us;1186us;1us;17564us;21us;2033us;2us;16995us;31us;1100us;166us;1095us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17044us;37us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;82us;952us;93us;986us;98us;924us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;3us;32768us;10us;1094us;19us;788us;204us;1078us;1us;17564us;21us;2033us;3us;16995us;31us;1100us;166us;1095us;204us;1197us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17045us;0us;17046us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;32768us;128us;1200us;1us;17564us;21us;2033us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17047us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;3us;32768us;10us;1094us;19us;788us;204us;1078us;0us;17048us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;26us;17049us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17050us;26us;17057us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;20us;17060us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;20us;17062us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;9us;17064us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;20us;17066us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;18us;17068us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;97us;1297us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;18us;17070us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;97us;1297us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;9us;17072us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;9us;17074us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;9us;17076us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;9us;17078us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;9us;17080us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;9us;17082us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;9us;17084us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;190us;1287us;192us;1301us;1us;17086us;192us;1301us;8us;17088us;63us;1295us;79us;1291us;82us;1248us;97us;1297us;159us;1289us;185us;1293us;187us;1299us;192us;1301us;4us;17090us;97us;1297us;159us;1289us;187us;1299us;192us;1301us;4us;17092us;97us;1297us;159us;1289us;187us;1299us;192us;1301us;1us;17094us;192us;1301us;1us;17096us;192us;1301us;1us;17098us;192us;1301us;23us;17100us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;103us;1269us;129us;1263us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;24us;17102us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;30us;32768us;10us;1094us;30us;2039us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;138us;2038us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;204us;1078us;26us;17130us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;26us;17134us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;26us;17139us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;30us;32768us;10us;1094us;28us;1355us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;105us;1353us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;204us;1078us;24us;17143us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;24us;17145us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;24us;17148us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;26us;32768us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;24us;17150us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;90us;1271us;91us;1273us;97us;1297us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;29us;32768us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;94us;2083us;95us;2080us;96us;2082us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;26us;17255us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;28us;32768us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;106us;1560us;129us;1263us;140us;1561us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;26us;17258us;63us;1295us;64us;1281us;70us;1277us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;27us;17585us;63us;1295us;64us;1281us;70us;1277us;78us;2050us;79us;1291us;80us;1251us;81us;1254us;82us;1248us;83us;1257us;90us;1271us;91us;1273us;97us;1297us;98us;1368us;103us;1269us;129us;1263us;144us;1303us;146us;1265us;159us;1289us;161us;1283us;162us;1285us;185us;1293us;186us;1275us;187us;1299us;189us;1267us;190us;1287us;191us;1279us;192us;1301us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17051us;0us;17052us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17053us;0us;17054us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17055us;0us;17056us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;17104us;69us;1259us;80us;32768us;13us;1206us;22us;1053us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17058us;1us;17059us;98us;1364us;6us;17059us;10us;1094us;94us;2083us;95us;2080us;96us;2082us;98us;1364us;204us;1078us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17061us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17063us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17065us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17067us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17069us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17071us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17073us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17075us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17077us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17079us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17081us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17083us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17085us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17087us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17089us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17091us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17093us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17095us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17097us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17099us;76us;17101us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;79us;17526us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1306us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;79us;17527us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17103us;0us;17103us;81us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1313us;4us;32768us;10us;1094us;19us;2041us;139us;2040us;204us;1078us;0us;17105us;0us;17106us;2us;32768us;19us;2041us;139us;2040us;0us;17107us;0us;17108us;0us;17109us;0us;17110us;0us;17111us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17112us;41us;32768us;41us;899us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;59us;897us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1335us;0us;17113us;42us;32768us;10us;1094us;41us;899us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;59us;897us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1084us;3us;32768us;10us;1094us;20us;1326us;204us;1078us;0us;17114us;0us;17115us;0us;17116us;0us;17117us;39us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1334us;0us;17118us;38us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;17119us;0us;17120us;0us;17121us;0us;17122us;3us;32768us;10us;1094us;99us;1349us;204us;1085us;4us;17123us;10us;1094us;41us;899us;59us;898us;204us;1078us;40us;32768us;10us;1094us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1078us;0us;17124us;38us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;17125us;38us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;0us;17126us;0us;17127us;0us;17128us;0us;17129us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17132us;3us;17138us;27us;1359us;141us;1358us;142us;1361us;0us;17133us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17135us;82us;32768us;10us;1094us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17136us;0us;17137us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;80us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17140us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17141us;0us;17142us;87us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;98us;1366us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17144us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17146us;87us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;98us;1370us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17147us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17149us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17506us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17506us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17151us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17513us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17152us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17509us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17153us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17512us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17154us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17525us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17155us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17520us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17156us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;50us;17521us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17157us;31us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1866us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1406us;31us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1866us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1406us;2us;17595us;35us;2063us;36us;2062us;37us;17299us;14us;17302us;21us;17302us;26us;17302us;35us;2063us;36us;2062us;57us;17595us;72us;17595us;73us;17595us;88us;17302us;93us;17595us;107us;17595us;112us;17302us;123us;17595us;137us;17595us;149us;17595us;156us;17595us;167us;17595us;168us;17595us;169us;17595us;170us;17595us;171us;17595us;172us;17595us;173us;17595us;174us;17595us;175us;17595us;176us;17595us;177us;17595us;178us;17595us;179us;17595us;181us;17595us;182us;17595us;195us;17595us;196us;17595us;200us;17595us;201us;17595us;202us;17595us;203us;17595us;31us;32768us;57us;1645us;72us;1504us;73us;1648us;93us;1510us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1405us;31us;32768us;57us;1645us;72us;1504us;73us;1648us;93us;1510us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1405us;1us;17159us;77us;1403us;6us;17159us;14us;17301us;26us;17301us;77us;1403us;88us;17301us;112us;17301us;133us;540us;7us;17193us;10us;1094us;47us;1464us;71us;1473us;93us;1466us;101us;1966us;194us;1955us;204us;1078us;0us;17158us;0us;17160us;0us;17161us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17162us;50us;32768us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;120us;1395us;123us;1485us;137us;1490us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17163us;41us;17164us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1416us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;44us;17164us;26us;1598us;47us;1450us;57us;1458us;67us;1419us;70us;1585us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;88us;1594us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1416us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;44us;17275us;26us;1598us;47us;1450us;57us;1458us;67us;1419us;70us;1585us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;88us;1594us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1416us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17165us;5us;17166us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;40us;32768us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;5us;17167us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;5us;17168us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;3us;32768us;10us;1094us;77us;1421us;204us;1078us;4us;17276us;10us;1094us;70us;1590us;77us;1421us;204us;1078us;42us;32768us;10us;1094us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;5us;17169us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;0us;17170us;0us;17171us;2us;17172us;34us;1431us;35us;1430us;1us;17173us;34us;1431us;5us;17175us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;5us;17454us;34us;1431us;35us;1430us;36us;1429us;75us;1448us;77us;1440us;40us;32768us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;40us;32768us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;32768us;161us;1909us;0us;17174us;40us;32768us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;40us;17503us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;32768us;194us;1955us;1us;32768us;194us;1955us;0us;17176us;0us;17176us;0us;17177us;7us;17193us;10us;1094us;47us;1464us;71us;1473us;93us;1466us;101us;1966us;194us;1955us;204us;1078us;0us;17178us;1us;32768us;77us;1443us;7us;17193us;10us;1094us;47us;1464us;71us;1473us;93us;1466us;101us;1966us;194us;1955us;204us;1078us;0us;17179us;3us;32768us;93us;1961us;101us;1966us;194us;1955us;3us;17519us;93us;1961us;101us;1966us;194us;1955us;0us;17180us;2us;32768us;93us;1319us;194us;1318us;0us;17181us;0us;17182us;0us;17183us;81us;17250us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1086us;3us;32768us;10us;1094us;60us;1454us;204us;1078us;0us;17184us;0us;17185us;0us;17186us;0us;17187us;2us;32768us;73us;1648us;93us;1459us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17188us;0us;17189us;0us;17190us;0us;17191us;0us;17192us;0us;17194us;95us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;59us;2001us;63us;1378us;64us;1981us;67us;1419us;70us;1985us;71us;1452us;72us;1504us;73us;1648us;75us;1446us;79us;1467us;83us;1993us;86us;1148us;87us;1150us;90us;1390us;91us;1393us;92us;1435us;93us;1512us;97us;1308us;99us;1208us;101us;1966us;103us;1986us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1305us;146us;1992us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1498us;159us;1387us;160us;1183us;161us;1987us;162us;1988us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;183us;1994us;184us;1384us;185us;1381us;186us;1978us;187us;1980us;188us;1434us;189us;1977us;190us;1375us;191us;1975us;192us;1974us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1964us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;1us;32768us;77us;1469us;1us;32768us;179us;1470us;0us;17195us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17196us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1087us;3us;32768us;10us;1094us;60us;1475us;204us;1078us;0us;17197us;0us;17198us;0us;17199us;0us;17200us;0us;17201us;0us;17202us;0us;17203us;0us;17204us;0us;17205us;0us;17206us;0us;17207us;0us;17208us;0us;17209us;0us;17210us;0us;17211us;81us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;143us;1496us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1494us;3us;32768us;10us;1094us;143us;1492us;204us;1078us;0us;17212us;0us;17213us;1us;32768us;143us;1495us;0us;17214us;0us;17215us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1088us;82us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;157us;1999us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1088us;3us;32768us;10us;1094us;157us;1500us;204us;1078us;0us;17216us;0us;17217us;0us;17218us;0us;17219us;81us;17252us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1089us;3us;32768us;10us;1094us;65us;1506us;204us;1078us;0us;17220us;0us;17221us;0us;17222us;0us;17223us;90us;32768us;10us;1094us;13us;1206us;15us;1522us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;1519us;39us;1520us;42us;790us;47us;1450us;57us;1458us;61us;1521us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;89us;1562us;90us;1389us;91us;1392us;92us;1436us;93us;1511us;94us;2083us;95us;2080us;96us;2082us;97us;1307us;98us;1524us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1373us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1090us;104us;32768us;10us;1094us;13us;1206us;15us;1522us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;1519us;39us;1520us;42us;790us;47us;1450us;57us;1458us;59us;2001us;61us;1521us;63us;1378us;64us;1981us;67us;1419us;70us;1985us;71us;1452us;72us;1504us;73us;1648us;75us;1446us;83us;1993us;86us;1148us;87us;1150us;89us;1562us;90us;1390us;91us;1393us;92us;1436us;93us;1511us;94us;2083us;95us;2080us;96us;2082us;97us;1308us;98us;1524us;99us;1208us;101us;1966us;103us;1986us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1305us;146us;1992us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1498us;159us;1387us;160us;1183us;161us;1987us;162us;1988us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;183us;1994us;184us;1384us;185us;1381us;186us;1978us;187us;1980us;188us;1434us;189us;1977us;190us;1374us;191us;1975us;192us;1974us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1091us;104us;32768us;10us;1094us;13us;1206us;15us;1522us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;1519us;39us;1520us;42us;790us;47us;1450us;57us;1458us;59us;2001us;61us;1521us;63us;1378us;64us;1981us;67us;1419us;70us;1985us;71us;1452us;72us;1504us;73us;1648us;75us;1446us;83us;1993us;86us;1148us;87us;1150us;89us;1562us;90us;1390us;91us;1393us;92us;1436us;93us;1511us;94us;2083us;95us;2080us;96us;2082us;97us;1308us;98us;1524us;99us;1208us;101us;1966us;103us;1986us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1305us;146us;1992us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1498us;159us;1387us;160us;1183us;161us;1987us;162us;1988us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;183us;1994us;184us;1384us;185us;1381us;186us;1978us;187us;1980us;188us;1434us;189us;1977us;190us;1374us;191us;1975us;192us;1974us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1091us;0us;17224us;9us;32768us;10us;1094us;15us;2091us;37us;2088us;39us;2089us;61us;2090us;94us;2083us;95us;2080us;96us;2082us;204us;1078us;0us;17225us;0us;17226us;0us;17227us;0us;17227us;0us;17228us;0us;17229us;0us;17230us;0us;17231us;0us;17232us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17233us;1us;32768us;78us;1527us;1us;32768us;93us;1528us;1us;16556us;74us;322us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17234us;0us;17235us;0us;17236us;0us;17237us;4us;17237us;94us;17240us;95us;17240us;96us;17240us;103us;17240us;4us;32768us;94us;2083us;95us;2080us;96us;2082us;103us;1538us;0us;17238us;31us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17239us;85us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;55us;1578us;57us;1458us;61us;2075us;62us;2077us;63us;1377us;67us;1420us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1396us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;197us;2078us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1092us;5us;32768us;10us;1094us;61us;2075us;62us;2077us;197us;2078us;204us;1078us;0us;17241us;0us;17242us;0us;17243us;0us;17244us;0us;17245us;0us;17246us;0us;17247us;0us;17248us;0us;17249us;0us;17251us;0us;17253us;81us;32768us;10us;1094us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17254us;86us;32768us;10us;1094us;13us;1206us;15us;2097us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17256us;0us;17257us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;79us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17259us;0us;17260us;1us;32768us;202us;2048us;3us;17266us;37us;2065us;38us;2068us;109us;2069us;0us;17263us;42us;17268us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;78us;1574us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1416us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;1us;32768us;89us;1567us;0us;17261us;0us;17262us;0us;17265us;1us;32768us;93us;1571us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17267us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1576us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17269us;37us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;94us;2083us;95us;2080us;96us;2082us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1896us;0us;17270us;30us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1866us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;2us;17595us;35us;2063us;36us;2062us;30us;17264us;57us;1645us;72us;1504us;73us;1648us;93us;1510us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17291us;2us;17283us;21us;1607us;84us;1608us;0us;17271us;0us;17272us;82us;32768us;10us;1094us;13us;1206us;22us;1053us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17291us;2us;17283us;21us;1607us;84us;1608us;0us;17273us;0us;17274us;80us;17277us;13us;1206us;22us;1053us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17291us;2us;17283us;21us;1607us;84us;1608us;0us;17278us;3us;32768us;47us;1956us;67us;1612us;194us;1955us;0us;17291us;2us;17283us;21us;1607us;84us;1608us;0us;17279us;5us;17283us;21us;1607us;47us;1956us;67us;1612us;84us;1608us;194us;1955us;1us;32768us;20us;1600us;0us;17280us;0us;17291us;2us;17283us;21us;1607us;84us;1608us;1us;32768us;20us;1604us;0us;17281us;0us;17282us;3us;17282us;47us;1956us;67us;1612us;194us;1955us;1us;17284us;84us;1610us;1us;17285us;21us;1609us;0us;17286us;0us;17287us;1us;17288us;77us;1958us;0us;17289us;0us;17290us;8us;17295us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;61us;2095us;70us;1615us;95us;2096us;204us;1078us;87us;17293us;10us;1094us;13us;1206us;15us;2097us;22us;1053us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;37us;2093us;39us;2094us;42us;790us;47us;1450us;57us;1458us;61us;2095us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;95us;2096us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;0us;17292us;0us;17294us;0us;17296us;3us;17564us;21us;2033us;26us;1629us;88us;1627us;1us;17564us;21us;2033us;3us;17309us;14us;600us;112us;599us;204us;1638us;0us;17297us;2us;32768us;14us;600us;112us;599us;0us;17298us;0us;17300us;0us;17303us;3us;16556us;22us;543us;74us;322us;204us;827us;0us;17305us;2us;16556us;74us;322us;204us;827us;1us;32768us;20us;1631us;0us;17306us;3us;17558us;19us;2028us;20us;2029us;143us;2030us;0us;17307us;3us;17309us;14us;600us;112us;599us;204us;1638us;0us;17308us;3us;17309us;14us;600us;112us;599us;204us;1638us;0us;17310us;3us;17309us;14us;600us;112us;599us;204us;1638us;0us;17311us;31us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;8us;17304us;26us;1629us;36us;1777us;47us;1956us;71us;1791us;88us;1627us;92us;1949us;190us;1951us;194us;1955us;3us;17558us;19us;2028us;20us;2029us;143us;2030us;1us;17564us;21us;2033us;0us;17312us;1us;32768us;73us;1648us;0us;17313us;0us;17314us;43us;32768us;10us;1094us;47us;1450us;57us;1458us;66us;2079us;67us;1420us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1093us;3us;32768us;10us;1094us;66us;2079us;204us;1078us;0us;17315us;0us;17316us;0us;17317us;0us;17318us;0us;17319us;35us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;1us;32768us;99us;1657us;81us;32768us;13us;1206us;22us;1047us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1659us;0us;17320us;0us;17321us;36us;32768us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;67us;506us;71us;972us;72us;975us;75us;978us;93us;986us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1670us;2us;32768us;99us;1662us;204us;1668us;82us;32768us;10us;1094us;13us;1206us;18us;1666us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;204us;1078us;3us;32768us;10us;1094us;20us;1664us;204us;1078us;0us;17322us;0us;17323us;1us;32768us;20us;1667us;0us;17324us;1us;32768us;20us;1669us;0us;17326us;1us;32768us;20us;1671us;0us;17327us;41us;32768us;41us;899us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;59us;897us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1335us;0us;17328us;41us;32768us;41us;899us;44us;520us;45us;519us;46us;521us;47us;509us;57us;993us;59us;897us;67us;506us;71us;972us;72us;975us;74us;322us;75us;978us;82us;952us;93us;986us;98us;1032us;101us;1966us;107us;984us;123us;983us;149us;985us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;194us;1955us;195us;2049us;196us;967us;202us;2048us;203us;872us;204us;1335us;1us;32768us;20us;1676us;0us;17329us;1us;17330us;85us;1678us;32us;32768us;47us;1956us;53us;648us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;664us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;17332us;85us;1680us;32us;32768us;47us;1956us;53us;648us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;664us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;36us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17335us;0us;17336us;1us;17339us;99us;1685us;36us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1692us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17337us;0us;17338us;1us;17343us;97us;1689us;36us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1698us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17340us;0us;17341us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1698us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17342us;1us;17347us;97us;1695us;36us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1698us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17344us;0us;17345us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;74us;322us;75us;1714us;89us;632us;92us;1949us;93us;1780us;97us;1698us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17346us;32us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;75us;1705us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;17352us;78us;1702us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17348us;0us;17349us;1us;32768us;194us;1955us;1us;32768us;78us;1707us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17350us;0us;17351us;1us;17357us;78us;1711us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17353us;0us;17354us;1us;32768us;194us;1955us;1us;32768us;78us;1716us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17355us;0us;17356us;7us;17361us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;99us;1722us;190us;1951us;194us;1955us;7us;17390us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;99us;1722us;190us;1951us;194us;1955us;7us;32768us;36us;1777us;47us;1956us;71us;1791us;92us;1949us;99us;1722us;190us;1951us;194us;1955us;34us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;99us;1725us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17358us;0us;17359us;31us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17360us;1us;17365us;99us;1728us;36us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;99us;1731us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17362us;0us;17363us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17364us;1us;32768us;10us;1734us;0us;17366us;2us;17374us;97us;1737us;187us;1747us;2us;17374us;97us;1737us;187us;1747us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17367us;0us;17368us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;33us;17514us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17369us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;35us;17510us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17370us;0us;17371us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17372us;0us;17373us;2us;17381us;97us;1751us;187us;1756us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17375us;0us;17376us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17377us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17378us;0us;17379us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17380us;2us;17385us;80us;1786us;90us;1762us;30us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1876us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;17442us;90us;1764us;30us;32768us;47us;1956us;57us;1881us;67us;1875us;89us;632us;92us;1949us;93us;1876us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;1us;17384us;77us;1958us;0us;17385us;1us;17387us;190us;1769us;4us;17387us;34us;1907us;77us;1904us;161us;1909us;190us;1769us;3us;32768us;63us;885us;93us;881us;179us;880us;0us;17386us;7us;17389us;36us;1777us;41us;1772us;47us;1956us;71us;1791us;92us;1949us;190us;1951us;194us;1955us;1us;32768us;149us;1773us;0us;17388us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1896us;0us;17391us;0us;17392us;1us;32768us;71us;1791us;0us;17393us;0us;17394us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1896us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;4us;32768us;47us;1956us;92us;1949us;190us;1951us;194us;1955us;0us;17395us;0us;17396us;0us;17397us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17398us;1us;17444us;80us;1789us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17399us;2us;32768us;60us;1792us;98us;1793us;0us;17400us;2us;32768us;60us;1794us;98us;1795us;0us;17401us;2us;32768us;60us;1796us;98us;1797us;0us;17402us;2us;32768us;60us;1798us;98us;1799us;0us;17403us;2us;32768us;60us;1800us;98us;1801us;0us;17404us;2us;32768us;60us;1802us;98us;1803us;0us;17405us;2us;32768us;60us;1804us;98us;1805us;0us;17406us;2us;32768us;60us;1806us;98us;1807us;0us;17407us;2us;32768us;60us;1808us;98us;1809us;0us;17408us;2us;32768us;60us;1810us;98us;1811us;0us;17409us;2us;32768us;60us;1812us;98us;1813us;0us;17410us;2us;32768us;60us;1814us;98us;1815us;0us;17411us;2us;32768us;60us;1816us;98us;1817us;0us;17412us;2us;32768us;60us;1818us;98us;1819us;0us;17413us;2us;32768us;60us;1820us;98us;1821us;0us;17414us;2us;32768us;60us;1822us;98us;1823us;0us;17415us;2us;32768us;60us;1824us;98us;1825us;0us;17416us;2us;32768us;60us;1826us;98us;1827us;0us;17417us;2us;32768us;60us;1828us;98us;1829us;0us;17418us;2us;32768us;60us;1830us;98us;1831us;0us;17419us;2us;32768us;60us;1832us;98us;1833us;0us;17420us;2us;32768us;60us;1834us;98us;1835us;0us;17421us;2us;32768us;60us;1836us;98us;1837us;0us;17422us;2us;32768us;60us;1838us;98us;1839us;0us;17423us;2us;32768us;60us;1840us;98us;1841us;0us;17424us;2us;32768us;60us;1842us;98us;1843us;0us;17425us;2us;32768us;60us;1844us;98us;1845us;0us;17426us;2us;32768us;60us;1846us;98us;1847us;0us;17427us;2us;32768us;60us;1848us;98us;1849us;0us;17428us;2us;32768us;60us;1850us;98us;1851us;0us;17429us;2us;32768us;60us;1852us;98us;1853us;0us;17430us;1us;32768us;60us;1854us;0us;17431us;1us;32768us;98us;1856us;33us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17435us;1us;17432us;98us;1860us;4us;32768us;10us;1094us;98us;1860us;162us;1913us;204us;1078us;33us;17476us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17433us;0us;17434us;1us;17436us;190us;1864us;3us;32768us;63us;885us;93us;881us;179us;880us;0us;17437us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1896us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;4us;32768us;47us;1956us;92us;1949us;190us;1951us;194us;1955us;0us;17438us;1us;17439us;77us;1901us;1us;17440us;77us;1901us;0us;17441us;0us;17442us;0us;17443us;0us;17444us;34us;32768us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1896us;5us;32768us;10us;1094us;94us;2083us;95us;2080us;96us;2082us;204us;1078us;6us;17471us;10us;1094us;70us;1922us;94us;2083us;95us;2080us;96us;2082us;204us;1078us;0us;17445us;0us;17446us;1us;32768us;93us;1882us;33us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;3us;32768us;10us;1094us;97us;1884us;204us;1078us;35us;32768us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1754us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1759us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;5us;32768us;10us;1094us;94us;2083us;95us;2080us;96us;2082us;204us;1078us;0us;17447us;0us;17448us;0us;17449us;0us;17450us;0us;17451us;0us;17452us;0us;17453us;40us;32768us;47us;1450us;57us;1458us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;92us;1435us;93us;1512us;101us;1966us;107us;1486us;123us;1485us;137us;1490us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;188us;1433us;194us;1955us;195us;2049us;196us;1540us;200us;2057us;201us;2060us;202us;2048us;203us;872us;0us;17455us;0us;17456us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17457us;1us;17457us;78us;17499us;0us;17458us;2us;32768us;47us;1956us;194us;1955us;3us;17459us;34us;1907us;77us;1958us;161us;1909us;0us;17460us;7us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;61us;2095us;95us;2096us;204us;1078us;0us;17461us;0us;17462us;1us;32768us;161us;1909us;0us;17463us;36us;17476us;10us;1094us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;162us;1919us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;1us;32768us;98us;1911us;40us;17476us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;47us;1956us;57us;587us;61us;2095us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;95us;2096us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;204us;1078us;0us;17435us;0us;17464us;0us;17465us;0us;17466us;8us;17474us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;61us;2095us;95us;2096us;162us;1917us;204us;1078us;0us;17467us;0us;17468us;0us;17469us;0us;17470us;1us;17471us;70us;1922us;33us;17473us;47us;1956us;57us;587us;67us;1788us;73us;590us;89us;632us;92us;1949us;93us;1780us;97us;1740us;107us;1895us;114us;1893us;123us;1894us;149us;1892us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;187us;1743us;190us;1951us;194us;1955us;195us;2049us;202us;2048us;203us;872us;0us;17472us;0us;17474us;0us;17475us;8us;32768us;47us;1956us;67us;1929us;92us;1949us;93us;1933us;179us;1939us;187us;1948us;190us;1951us;194us;1955us;3us;32768us;97us;1946us;162us;1928us;187us;1947us;0us;17477us;1us;32768us;162us;1930us;0us;17478us;1us;17479us;77us;1958us;0us;17480us;7us;32768us;47us;1956us;92us;1949us;93us;1933us;179us;1939us;187us;1948us;190us;1951us;194us;1955us;5us;32768us;94us;2083us;95us;2080us;96us;2082us;97us;1946us;187us;1947us;0us;17481us;1us;17482us;190us;1937us;3us;32768us;63us;885us;93us;881us;179us;880us;0us;17483us;0us;17484us;6us;17485us;47us;1956us;92us;1949us;93us;1933us;179us;1939us;190us;1951us;194us;1955us;0us;17486us;0us;17487us;0us;17488us;0us;17489us;0us;17490us;7us;32768us;47us;1956us;92us;1949us;93us;1933us;179us;1939us;187us;1948us;190us;1951us;194us;1955us;7us;32768us;47us;1956us;92us;1949us;93us;1933us;179us;1939us;187us;1948us;190us;1951us;194us;1955us;7us;32768us;47us;1956us;92us;1949us;93us;1933us;179us;1939us;187us;1948us;190us;1951us;194us;1955us;1us;32768us;194us;1955us;0us;17491us;1us;32768us;194us;1955us;1us;17506us;194us;1955us;0us;17492us;81us;17492us;10us;17539us;15us;17539us;21us;17539us;28us;17539us;34us;17539us;35us;17539us;36us;17539us;37us;17539us;39us;17539us;47us;17539us;57us;17539us;61us;17539us;63us;17539us;64us;17539us;67us;17539us;69us;17539us;70us;17539us;71us;17539us;72us;17539us;73us;17539us;75us;17539us;77us;17539us;79us;17539us;80us;17539us;81us;17539us;82us;17539us;83us;17539us;84us;17539us;90us;17539us;91us;17539us;92us;17539us;93us;17539us;97us;17539us;98us;17539us;101us;17539us;105us;17539us;107us;17539us;123us;17539us;129us;17539us;137us;17539us;144us;17539us;146us;17539us;149us;17539us;150us;17539us;155us;17539us;156us;17539us;159us;17539us;161us;17539us;162us;17539us;167us;17539us;168us;17539us;169us;17539us;170us;17539us;171us;17539us;172us;17539us;173us;17539us;174us;17539us;175us;17539us;176us;17539us;177us;17539us;178us;17539us;179us;17539us;181us;17539us;182us;17539us;184us;17539us;185us;17539us;186us;17539us;187us;17539us;188us;17539us;189us;17539us;190us;17539us;191us;17539us;192us;17539us;194us;17539us;195us;17539us;196us;17539us;200us;17539us;201us;17539us;202us;17539us;203us;17539us;204us;17539us;0us;17493us;0us;17494us;0us;17495us;8us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;61us;2095us;95us;2096us;194us;1955us;204us;1078us;0us;17496us;0us;17497us;27us;32768us;59us;2001us;63us;1983us;64us;1981us;70us;1985us;75us;1989us;83us;1993us;90us;1990us;91us;1991us;97us;1984us;103us;1986us;144us;1996us;146us;1992us;156us;1998us;159us;1995us;161us;1987us;162us;1988us;183us;1994us;184us;1982us;185us;1979us;186us;1978us;187us;1980us;188us;1973us;189us;1977us;190us;1976us;191us;1975us;192us;1974us;204us;1964us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17498us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17499us;0us;17500us;1us;32768us;59us;1968us;5us;32768us;67us;1970us;94us;2083us;95us;2080us;96us;2082us;194us;2000us;0us;17501us;1us;32768us;59us;1971us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17502us;0us;17503us;0us;17504us;0us;17505us;0us;17506us;0us;17507us;0us;17508us;0us;17509us;0us;17510us;0us;17511us;0us;17512us;0us;17513us;0us;17514us;0us;17515us;0us;17516us;0us;17517us;0us;17518us;0us;17519us;0us;17520us;0us;17521us;0us;17522us;0us;17523us;0us;17524us;0us;17525us;1us;17526us;144us;1997us;0us;17527us;1us;32768us;157us;1999us;0us;17528us;0us;17529us;1us;32768us;194us;2000us;0us;17530us;0us;17531us;0us;17532us;0us;17533us;1us;17534us;77us;2008us;0us;17535us;10us;32768us;10us;1094us;15us;2097us;37us;2093us;39us;2094us;61us;2095us;93us;1961us;95us;2096us;101us;1966us;194us;1955us;204us;1078us;0us;17536us;0us;17537us;0us;17538us;0us;17539us;0us;17540us;0us;17541us;0us;17542us;0us;17543us;3us;17544us;21us;2016us;68us;2015us;84us;2014us;0us;17545us;3us;17547us;21us;2016us;68us;2015us;84us;2014us;0us;17546us;1us;17548us;84us;2023us;1us;17549us;21us;2024us;0us;17550us;0us;17551us;0us;17552us;0us;17553us;0us;17554us;0us;17555us;0us;17556us;0us;17557us;0us;17559us;0us;17561us;0us;17563us;0us;17565us;0us;17567us;0us;17569us;0us;17571us;0us;17573us;0us;17574us;0us;17575us;0us;17576us;0us;17577us;0us;17578us;0us;17579us;0us;17580us;0us;17581us;0us;17582us;0us;17583us;0us;17584us;1us;32768us;194us;1955us;0us;17586us;0us;17587us;81us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;198us;2052us;199us;2053us;200us;2057us;201us;2060us;202us;2048us;203us;872us;2us;32768us;198us;2052us;199us;2053us;0us;17588us;0us;17589us;81us;32768us;13us;1206us;24us;1660us;25us;1674us;29us;1203us;30us;780us;32us;1190us;33us;776us;42us;790us;47us;1450us;57us;1458us;63us;1377us;67us;1419us;71us;1452us;72us;1504us;73us;1648us;75us;1445us;86us;1148us;87us;1150us;90us;1389us;91us;1392us;92us;1435us;93us;1512us;97us;1307us;99us;1208us;101us;1966us;107us;1486us;108us;1127us;115us;1140us;116us;1144us;117us;1119us;118us;1123us;120us;1395us;123us;1485us;124us;1152us;125us;1655us;126us;1672us;127us;1135us;131us;1198us;134us;1142us;135us;1146us;137us;1490us;144us;1304us;147us;1407us;148us;1409us;149us;1484us;150us;1439us;155us;1442us;156us;1497us;159us;1386us;160us;1183us;163us;770us;164us;1177us;165us;1179us;167us;869us;168us;868us;169us;867us;170us;866us;171us;865us;172us;864us;173us;862us;174us;860us;175us;858us;176us;856us;177us;863us;178us;861us;179us;859us;181us;857us;182us;855us;184us;1383us;185us;1380us;188us;1433us;190us;1372us;194us;1955us;195us;2049us;196us;1540us;198us;2052us;199us;2053us;200us;2057us;201us;2060us;202us;2048us;203us;872us;2us;32768us;198us;2052us;199us;2053us;0us;17590us;0us;17591us;0us;17592us;0us;17593us;0us;17594us;0us;17596us;3us;32768us;37us;2065us;38us;2068us;109us;2069us;3us;17619us;37us;2065us;38us;2068us;109us;2069us;0us;17598us;0us;17599us;0us;17600us;3us;32768us;39us;2070us;40us;2073us;151us;2074us;3us;17620us;39us;2070us;40us;2073us;151us;2074us;0us;17601us;0us;17602us;0us;17603us;3us;32768us;61us;2075us;62us;2077us;197us;2078us;0us;17604us;0us;17605us;0us;17606us;0us;17607us;3us;32768us;94us;2083us;95us;2080us;96us;2082us;0us;17608us;0us;17609us;0us;17610us;3us;32768us;15us;2084us;16us;2086us;17us;2087us;0us;17611us;0us;17612us;0us;17613us;0us;17614us;0us;17615us;0us;17616us;0us;17617us;0us;17618us;0us;17619us;0us;17620us;0us;17621us;0us;17622us;0us;17623us;0us;17624us;|] +let _fsyacc_actionTableRowOffsets = [|0us;17us;18us;114us;115us;123us;124us;204us;205us;239us;240us;241us;242us;243us;244us;245us;246us;251us;252us;257us;258us;263us;264us;270us;271us;277us;278us;284us;285us;302us;303us;307us;395us;422us;423us;426us;427us;428us;429us;431us;432us;439us;440us;441us;442us;444us;445us;446us;449us;450us;452us;453us;458us;459us;461us;465us;467us;473us;475us;476us;477us;479us;484us;486us;487us;489us;490us;492us;493us;495us;512us;513us;517us;526us;545us;546us;547us;548us;564us;570us;572us;573us;574us;581us;582us;583us;587us;605us;609us;625us;626us;630us;635us;636us;637us;638us;642us;651us;655us;661us;662us;663us;664us;666us;668us;669us;670us;671us;673us;675us;677us;681us;685us;688us;690us;725us;727us;728us;809us;836us;916us;946us;948us;949us;958us;962us;963us;979us;981us;985us;986us;1002us;1004us;1005us;1007us;1009us;1010us;1013us;1021us;1022us;1023us;1079us;1081us;1096us;1098us;1102us;1104us;1105us;1107us;1108us;1109us;1110us;1112us;1147us;1148us;1149us;1166us;1170us;1171us;1172us;1174us;1175us;1190us;1196us;1197us;1198us;1214us;1218us;1219us;1220us;1235us;1241us;1242us;1243us;1244us;1245us;1248us;1263us;1264us;1268us;1272us;1283us;1331us;1333us;1337us;1341us;1344us;1346us;1381us;1384us;1386us;1387us;1419us;1426us;1460us;1467us;1468us;1470us;1471us;1478us;1480us;1481us;1483us;1484us;1486us;1521us;1522us;1527us;1528us;1533us;1536us;1537us;1538us;1542us;1544us;1550us;1554us;1555us;1556us;1560us;1562us;1563us;1564us;1565us;1567us;1568us;1584us;1588us;1589us;1592us;1593us;1595us;1596us;1601us;1602us;1604us;1605us;1607us;1608us;1610us;1706us;1707us;1712us;1800us;1897us;1898us;1899us;1994us;2000us;2002us;2003us;2004us;2011us;2012us;2013us;2014us;2019us;2107us;2137us;2232us;2233us;2234us;2235us;2257us;2258us;2353us;2354us;2358us;2362us;2369us;2374us;2379us;2380us;2381us;2382us;2386us;2398us;2399us;2401us;2402us;2483us;2484us;2486us;2488us;2489us;2490us;2493us;2499us;2500us;2501us;2504us;2505us;2506us;2514us;2516us;2517us;2551us;2558us;2559us;2564us;2565us;2567us;2574us;2580us;2581us;2582us;2588us;2589us;2590us;2591us;2592us;2594us;2689us;2693us;2694us;2695us;2696us;2703us;2707us;2708us;2709us;2711us;2712us;2727us;2730us;2739us;2741us;2742us;2744us;2746us;2747us;2748us;2749us;2750us;2760us;2761us;2765us;2796us;2797us;2801us;2805us;2836us;2837us;2840us;2845us;2848us;2879us;2880us;2882us;2883us;2885us;2886us;2888us;2889us;2891us;2892us;2904us;2905us;2906us;2907us;2908us;2912us;2914us;2915us;2917us;2919us;2920us;2960us;2961us;2965us;2968us;2970us;2972us;2976us;2983us;2984us;2985us;2995us;2997us;3005us;3007us;3013us;3015us;3016us;3017us;3018us;3020us;3021us;3022us;3023us;3025us;3060us;3061us;3062us;3073us;3082us;3083us;3084us;3094us;3095us;3097us;3103us;3104us;3105us;3112us;3118us;3119us;3120us;3121us;3122us;3137us;3138us;3141us;3156us;3157us;3159us;3160us;3162us;3165us;3166us;3167us;3169us;3171us;3172us;3174us;3212us;3214us;3216us;3297us;3298us;3336us;3338us;3350us;3431us;3432us;3433us;3434us;3435us;3437us;3438us;3440us;3441us;3445us;3449us;3465us;3518us;3519us;3520us;3525us;3527us;3528us;3529us;3563us;3571us;3572us;3573us;3577us;3579us;3583us;3586us;3588us;3623us;3626us;3628us;3629us;3630us;3632us;3633us;3635us;3636us;3638us;3639us;3677us;3679us;3689us;3770us;3772us;3773us;3774us;3775us;3777us;3778us;3780us;3781us;3783us;3787us;3791us;3795us;3831us;3832us;3833us;3834us;3835us;3837us;3841us;3845us;3847us;3857us;3938us;3941us;3942us;3943us;3944us;3945us;3981us;3982us;3983us;3985us;3989us;3990us;3992us;3996us;3997us;3998us;4003us;4005us;4009us;4010us;4011us;4012us;4013us;4014us;4015us;4047us;4051us;4052us;4059us;4063us;4064us;4102us;4136us;4137us;4168us;4170us;4171us;4172us;4173us;4177us;4178us;4179us;4180us;4183us;4184us;4185us;4187us;4193us;4194us;4195us;4196us;4199us;4214us;4215us;4220us;4226us;4231us;4233us;4234us;4236us;4237us;4238us;4240us;4242us;4243us;4245us;4246us;4247us;4248us;4252us;4290us;4293us;4295us;4298us;4299us;4300us;4301us;4302us;4362us;4393us;4395us;4399us;4400us;4406us;4412us;4413us;4414us;4418us;4419us;4420us;4423us;4424us;4425us;4428us;4432us;4433us;4434us;4436us;4437us;4438us;4439us;4440us;4441us;4442us;4450us;4454us;4457us;4459us;4460us;4461us;4462us;4464us;4469us;4470us;4473us;4475us;4477us;4480us;4481us;4482us;4485us;4487us;4518us;4520us;4522us;4524us;4526us;4527us;4528us;4530us;4534us;4536us;4538us;4539us;4540us;4571us;4573us;4606us;4608us;4610us;4612us;4645us;4646us;4647us;4649us;4651us;4682us;4684us;4686us;4688us;4690us;4693us;4695us;4729us;4730us;4734us;4768us;4773us;4779us;4780us;4785us;4786us;4787us;4788us;4790us;4794us;4795us;4830us;4835us;4837us;4839us;4841us;4845us;4846us;4849us;4850us;4851us;4858us;4890us;4897us;4912us;4914us;4915us;4917us;4919us;4920us;4923us;4924us;4926us;4928us;4929us;4933us;4940us;4977us;4978us;5014us;5015us;5016us;5052us;5053us;5054us;5055us;5090us;5091us;5134us;5140us;5141us;5142us;5172us;5176us;5177us;5179us;5183us;5184us;5190us;5191us;5234us;5241us;5288us;5290us;5337us;5338us;5374us;5375us;5377us;5412us;5413us;5414us;5448us;5449us;5451us;5486us;5487us;5488us;5521us;5522us;5524us;5558us;5559us;5560us;5561us;5562us;5563us;5564us;5565us;5568us;5574us;5575us;5576us;5578us;5579us;5583us;5587us;5591us;5627us;5628us;5629us;5630us;5631us;5633us;5634us;5636us;5640us;5644us;5646us;5647us;5648us;5650us;5686us;5687us;5688us;5691us;5693us;5695us;5698us;5699us;5700us;5781us;5782us;5784us;5787us;5791us;5792us;5874us;5878us;5879us;5880us;5881us;5882us;5883us;5884us;5885us;5886us;5888us;5892us;5894us;5897us;5899us;5904us;5908us;5909us;5911us;5913us;5915us;5916us;5918us;5919us;5923us;5931us;5932us;5934us;5941us;5943us;5945us;5946us;5947us;5949us;5950us;5951us;5953us;5955us;5956us;5960us;5962us;5963us;5966us;5968us;5969us;5971us;5972us;5973us;5975us;6013us;6015us;6019us;6101us;6102us;6103us;6104us;6184us;6190us;6191us;6192us;6193us;6194us;6196us;6197us;6200us;6203us;6284us;6285us;6288us;6289us;6290us;6293us;6327us;6328us;6329us;6330us;6331us;6332us;6333us;6334us;6335us;6336us;6337us;6338us;6339us;6340us;6341us;6342us;6343us;6344us;6345us;6346us;6347us;6349us;6351us;6352us;6354us;6356us;6358us;6359us;6360us;6363us;6367us;6368us;6369us;6372us;6373us;6375us;6377us;6378us;6385us;6386us;6428us;6439us;6440us;6441us;6442us;6445us;6448us;6449us;6453us;6455us;6458us;6461us;6464us;6466us;6468us;6476us;6484us;6492us;6500us;6539us;6540us;6541us;6579us;6622us;6623us;6625us;6626us;6627us;6672us;6717us;6718us;6719us;6764us;6765us;6803us;6841us;6844us;6845us;6849us;6850us;6852us;6853us;6857us;6862us;6903us;6911us;6912us;6913us;6953us;6991us;6992us;7028us;7029us;7065us;7066us;7067us;7103us;7104us;7140us;7141us;7175us;7176us;7177us;7178us;7243us;7247us;7248us;7249us;7287us;7288us;7324us;7325us;7361us;7362us;7363us;7367us;7371us;7372us;7376us;7377us;7416us;7418us;7419us;7458us;7460us;7461us;7463us;7465us;7466us;7467us;7468us;7469us;7470us;7471us;7536us;7542us;7543us;7544us;7548us;7551us;7552us;7554us;7595us;7602us;7603us;7604us;7608us;7609us;7610us;7618us;7623us;7627us;7630us;7634us;7638us;7642us;7645us;7653us;7656us;7664us;7674us;7691us;7700us;7739us;7740us;7741us;7780us;7782us;7784us;7820us;7821us;7822us;7861us;7901us;7902us;7903us;7949us;7995us;7996us;7997us;8043us;8044us;8083us;8122us;8125us;8126us;8129us;8130us;8135us;8176us;8177us;8178us;8179us;8218us;8219us;8302us;8308us;8309us;8310us;8311us;8312us;8395us;8399us;8400us;8401us;8428us;8430us;8431us;8432us;8527us;8529us;8565us;8566us;8567us;8569us;8570us;8601us;8681us;8682us;8762us;8763us;8765us;8845us;8849us;8850us;8933us;8934us;8937us;8940us;8943us;8946us;8949us;8950us;8953us;8955us;8957us;8959us;8961us;8965us;8969us;8973us;8975us;8976us;9014us;9095us;9097us;9100us;9101us;9139us;9220us;9224us;9226us;9229us;9230us;9232us;9313us;9314us;9315us;9398us;9399us;9400us;9482us;9483us;9484us;9485us;9486us;9487us;9567us;9572us;9573us;9574us;9654us;9659us;9660us;9661us;9744us;9750us;9751us;9752us;9755us;9756us;9837us;9838us;9920us;9951us;9952us;9953us;9954us;10034us;10035us;10104us;10105us;10186us;10187us;10257us;10258us;10340us;10341us;10423us;10424us;10470us;10481us;10569us;10579us;10580us;10581us;10582us;10583us;10584us;10586us;10587us;10592us;10675us;10680us;10681us;10682us;10683us;10684us;10685us;10766us;10769us;10770us;10771us;10772us;10773us;10855us;10882us;10964us;10991us;10992us;10993us;11031us;11112us;11114us;11116us;11119us;11200us;11201us;11239us;11320us;11324us;11326us;11330us;11411us;11412us;11413us;11493us;11495us;11497us;11578us;11579us;11660us;11664us;11665us;11745us;11772us;11854us;11855us;11882us;11903us;11924us;11934us;11955us;11974us;11993us;12003us;12013us;12023us;12033us;12043us;12053us;12063us;12065us;12074us;12079us;12084us;12086us;12088us;12090us;12114us;12139us;12170us;12197us;12224us;12251us;12282us;12307us;12332us;12357us;12384us;12409us;12439us;12466us;12495us;12522us;12550us;12586us;12587us;12588us;12624us;12625us;12626us;12662us;12663us;12664us;12744us;12746us;12827us;12828us;12830us;12837us;12924us;12925us;13012us;13013us;13100us;13101us;13188us;13189us;13276us;13277us;13364us;13365us;13452us;13453us;13540us;13541us;13628us;13629us;13716us;13717us;13804us;13805us;13892us;13893us;13980us;13981us;14068us;14069us;14156us;14157us;14244us;14245us;14332us;14333us;14420us;14421us;14508us;14509us;14596us;14597us;14674us;14754us;14834us;14914us;14915us;14916us;14998us;15003us;15004us;15005us;15008us;15009us;15010us;15011us;15012us;15013us;15093us;15097us;15098us;15140us;15141us;15184us;15188us;15189us;15190us;15191us;15192us;15232us;15233us;15272us;15273us;15274us;15275us;15276us;15280us;15285us;15326us;15327us;15366us;15367us;15406us;15407us;15408us;15409us;15410us;15490us;15572us;15573us;15577us;15578us;15660us;15661us;15744us;15745us;15746us;15826us;15907us;15908us;15988us;15989us;15990us;16078us;16079us;16166us;16167us;16255us;16256us;16343us;16344us;16395us;16446us;16497us;16548us;16549us;16600us;16651us;16652us;16703us;16754us;16755us;16806us;16857us;16858us;16909us;16960us;16961us;17012us;17063us;17064us;17115us;17166us;17167us;17199us;17231us;17234us;17272us;17304us;17336us;17338us;17345us;17353us;17354us;17355us;17356us;17407us;17408us;17459us;17460us;17502us;17547us;17592us;17593us;17599us;17640us;17646us;17652us;17656us;17661us;17704us;17710us;17711us;17712us;17715us;17717us;17723us;17729us;17770us;17811us;17813us;17814us;17855us;17896us;17898us;17900us;17901us;17902us;17903us;17911us;17912us;17914us;17922us;17923us;17927us;17931us;17932us;17935us;17936us;17937us;17938us;18020us;18024us;18025us;18026us;18027us;18028us;18031us;18111us;18112us;18113us;18114us;18115us;18116us;18117us;18213us;18217us;18219us;18221us;18222us;18226us;18227us;18309us;18313us;18314us;18315us;18316us;18317us;18318us;18319us;18320us;18321us;18322us;18323us;18324us;18325us;18326us;18327us;18328us;18410us;18414us;18415us;18416us;18418us;18419us;18420us;18502us;18585us;18589us;18590us;18591us;18592us;18593us;18675us;18679us;18680us;18681us;18682us;18683us;18774us;18879us;18984us;18985us;18995us;18996us;18997us;18998us;18999us;19000us;19001us;19002us;19003us;19004us;19084us;19085us;19087us;19089us;19091us;19095us;19175us;19176us;19177us;19178us;19179us;19184us;19189us;19190us;19222us;19223us;19309us;19315us;19316us;19317us;19318us;19319us;19320us;19321us;19322us;19323us;19324us;19325us;19326us;19408us;19409us;19496us;19497us;19498us;19578us;19658us;19659us;19660us;19662us;19666us;19667us;19710us;19712us;19713us;19714us;19715us;19717us;19751us;19755us;19756us;19790us;19791us;19829us;19830us;19861us;19864us;19895us;19896us;19899us;19900us;19901us;19984us;19985us;19988us;19989us;19990us;20071us;20072us;20075us;20076us;20080us;20081us;20084us;20085us;20091us;20093us;20094us;20095us;20098us;20100us;20101us;20102us;20106us;20108us;20110us;20111us;20112us;20114us;20115us;20116us;20125us;20213us;20214us;20215us;20216us;20220us;20222us;20226us;20227us;20230us;20231us;20232us;20233us;20237us;20238us;20241us;20243us;20244us;20248us;20249us;20253us;20254us;20258us;20259us;20263us;20264us;20296us;20305us;20309us;20311us;20312us;20314us;20315us;20316us;20360us;20364us;20365us;20366us;20367us;20368us;20369us;20405us;20407us;20489us;20490us;20491us;20528us;20531us;20614us;20618us;20619us;20620us;20622us;20623us;20625us;20626us;20628us;20629us;20671us;20672us;20714us;20716us;20717us;20719us;20752us;20754us;20787us;20824us;20825us;20826us;20828us;20865us;20866us;20867us;20869us;20906us;20907us;20908us;20943us;20944us;20946us;20983us;20984us;20985us;21020us;21021us;21054us;21056us;21090us;21091us;21092us;21094us;21096us;21130us;21131us;21132us;21134us;21168us;21169us;21170us;21172us;21174us;21208us;21209us;21210us;21218us;21226us;21234us;21269us;21270us;21271us;21303us;21304us;21306us;21343us;21344us;21345us;21379us;21380us;21382us;21383us;21386us;21389us;21425us;21426us;21427us;21461us;21495us;21496us;21532us;21568us;21569us;21570us;21606us;21607us;21608us;21611us;21647us;21648us;21649us;21683us;21684us;21720us;21721us;21722us;21756us;21757us;21760us;21791us;21793us;21824us;21826us;21827us;21829us;21834us;21838us;21839us;21847us;21849us;21850us;21885us;21886us;21887us;21889us;21890us;21891us;21926us;21930us;21935us;21936us;21937us;21938us;21972us;21973us;21975us;22009us;22010us;22013us;22014us;22017us;22018us;22021us;22022us;22025us;22026us;22029us;22030us;22033us;22034us;22037us;22038us;22041us;22042us;22045us;22046us;22049us;22050us;22053us;22054us;22057us;22058us;22061us;22062us;22065us;22066us;22069us;22070us;22073us;22074us;22077us;22078us;22081us;22082us;22085us;22086us;22089us;22090us;22093us;22094us;22097us;22098us;22101us;22102us;22105us;22106us;22109us;22110us;22113us;22114us;22117us;22118us;22121us;22122us;22125us;22126us;22129us;22130us;22133us;22134us;22136us;22137us;22139us;22173us;22174us;22176us;22181us;22215us;22216us;22217us;22219us;22223us;22224us;22259us;22263us;22268us;22269us;22271us;22273us;22274us;22275us;22276us;22277us;22312us;22318us;22325us;22326us;22327us;22329us;22363us;22367us;22403us;22409us;22410us;22411us;22412us;22413us;22414us;22415us;22416us;22457us;22458us;22459us;22463us;22467us;22468us;22470us;22471us;22474us;22478us;22479us;22487us;22488us;22489us;22491us;22492us;22529us;22531us;22572us;22573us;22574us;22575us;22576us;22585us;22586us;22587us;22588us;22589us;22591us;22625us;22626us;22627us;22628us;22637us;22641us;22642us;22644us;22645us;22647us;22648us;22656us;22662us;22663us;22665us;22669us;22670us;22671us;22678us;22679us;22680us;22681us;22682us;22683us;22691us;22699us;22707us;22709us;22710us;22712us;22714us;22715us;22797us;22798us;22799us;22800us;22809us;22810us;22811us;22839us;22843us;22844us;22848us;22849us;22850us;22852us;22858us;22859us;22861us;22865us;22866us;22867us;22868us;22869us;22870us;22871us;22872us;22873us;22874us;22875us;22876us;22877us;22878us;22879us;22880us;22881us;22882us;22883us;22884us;22885us;22886us;22887us;22888us;22889us;22891us;22892us;22894us;22895us;22896us;22898us;22899us;22900us;22901us;22902us;22904us;22905us;22916us;22917us;22918us;22919us;22920us;22921us;22922us;22923us;22924us;22928us;22929us;22933us;22934us;22936us;22938us;22939us;22940us;22941us;22942us;22943us;22944us;22945us;22946us;22947us;22948us;22949us;22950us;22951us;22952us;22953us;22954us;22955us;22956us;22957us;22958us;22959us;22960us;22961us;22962us;22963us;22964us;22965us;22967us;22968us;22969us;23051us;23054us;23055us;23056us;23138us;23141us;23142us;23143us;23144us;23145us;23146us;23147us;23151us;23155us;23156us;23157us;23158us;23162us;23166us;23167us;23168us;23169us;23173us;23174us;23175us;23176us;23177us;23181us;23182us;23183us;23184us;23188us;23189us;23190us;23191us;23192us;23193us;23194us;23195us;23196us;23197us;23198us;23199us;23200us;23201us;|] +let _fsyacc_reductionSymbolCounts = [|1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;2us;2us;2us;3us;3us;3us;1us;2us;3us;1us;1us;2us;1us;1us;3us;0us;2us;1us;1us;1us;1us;1us;2us;3us;2us;5us;5us;5us;3us;3us;1us;2us;2us;1us;3us;4us;1us;1us;4us;3us;3us;1us;1us;0us;3us;3us;2us;1us;1us;5us;5us;4us;5us;3us;1us;12us;0us;2us;5us;3us;5us;3us;3us;0us;3us;2us;7us;2us;1us;1us;3us;1us;3us;3us;3us;3us;3us;3us;3us;3us;3us;1us;1us;0us;3us;11us;4us;4us;4us;4us;5us;5us;5us;0us;2us;3us;3us;2us;5us;4us;3us;1us;1us;2us;3us;0us;2us;3us;2us;1us;2us;2us;1us;3us;4us;1us;4us;3us;3us;1us;1us;0us;5us;4us;3us;1us;2us;2us;3us;1us;2us;3us;1us;1us;3us;3us;3us;5us;3us;5us;4us;2us;1us;2us;2us;3us;3us;3us;1us;3us;3us;3us;3us;3us;1us;1us;3us;3us;3us;3us;1us;0us;1us;2us;5us;4us;4us;2us;1us;3us;3us;4us;6us;2us;2us;2us;2us;2us;1us;1us;1us;1us;3us;3us;0us;1us;2us;8us;7us;7us;6us;2us;2us;1us;1us;3us;1us;3us;3us;3us;3us;3us;3us;3us;1us;1us;2us;0us;3us;2us;3us;3us;1us;3us;6us;5us;4us;4us;4us;1us;2us;2us;3us;3us;4us;5us;4us;5us;4us;11us;3us;4us;5us;5us;8us;6us;6us;5us;5us;6us;6us;5us;4us;8us;6us;6us;4us;0us;2us;2us;3us;3us;1us;4us;2us;0us;1us;1us;1us;1us;3us;1us;0us;3us;0us;3us;5us;2us;1us;0us;2us;2us;1us;0us;2us;2us;3us;3us;1us;3us;2us;4us;4us;3us;4us;2us;1us;1us;6us;3us;3us;3us;7us;3us;3us;3us;2us;2us;1us;3us;3us;3us;1us;1us;1us;1us;1us;2us;3us;3us;2us;1us;3us;3us;1us;2us;4us;5us;3us;1us;0us;5us;1us;0us;2us;0us;2us;3us;1us;3us;3us;1us;1us;4us;3us;3us;4us;3us;4us;5us;7us;4us;4us;3us;1us;3us;1us;2us;3us;1us;1us;3us;1us;3us;3us;5us;4us;4us;4us;5us;5us;5us;5us;1us;3us;4us;2us;4us;4us;2us;3us;3us;3us;2us;4us;4us;3us;3us;2us;1us;3us;3us;1us;3us;1us;1us;1us;3us;2us;2us;5us;5us;4us;3us;2us;5us;4us;1us;3us;3us;0us;2us;3us;1us;2us;4us;3us;2us;1us;1us;1us;1us;1us;1us;8us;1us;1us;0us;3us;3us;2us;3us;1us;4us;2us;3us;2us;2us;2us;2us;2us;3us;0us;2us;1us;6us;6us;5us;3us;3us;1us;2us;2us;0us;4us;3us;1us;3us;2us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;3us;4us;1us;2us;1us;3us;1us;2us;1us;3us;1us;1us;0us;3us;2us;1us;1us;3us;3us;2us;3us;3us;3us;2us;1us;1us;1us;3us;3us;3us;3us;2us;2us;3us;3us;2us;3us;4us;3us;3us;2us;2us;3us;4us;4us;2us;3us;3us;2us;2us;1us;1us;3us;1us;2us;3us;3us;1us;1us;3us;3us;3us;3us;1us;2us;1us;1us;1us;1us;1us;3us;3us;3us;2us;4us;4us;4us;3us;1us;0us;3us;3us;2us;3us;1us;1us;3us;3us;2us;3us;3us;2us;1us;3us;3us;3us;3us;2us;2us;3us;3us;2us;3us;3us;3us;2us;0us;2us;3us;3us;3us;2us;1us;3us;2us;1us;2us;1us;1us;3us;3us;1us;2us;3us;2us;1us;3us;5us;1us;1us;1us;6us;7us;0us;3us;3us;2us;2us;3us;3us;1us;1us;1us;3us;3us;3us;3us;3us;3us;2us;3us;4us;3us;3us;2us;2us;2us;1us;2us;2us;1us;2us;2us;5us;5us;5us;4us;3us;4us;5us;5us;5us;4us;3us;5us;2us;4us;3us;2us;2us;2us;2us;8us;8us;7us;5us;3us;2us;2us;3us;3us;3us;3us;3us;3us;3us;3us;1us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;3us;2us;2us;1us;1us;4us;4us;4us;2us;1us;2us;1us;3us;2us;3us;3us;2us;1us;2us;3us;2us;1us;2us;2us;4us;5us;4us;4us;3us;2us;2us;0us;2us;2us;2us;2us;2us;2us;0us;2us;2us;3us;3us;3us;3us;4us;4us;3us;3us;4us;4us;2us;2us;2us;2us;2us;2us;2us;6us;4us;4us;2us;2us;2us;1us;2us;1us;2us;1us;3us;3us;2us;3us;3us;3us;2us;2us;1us;3us;3us;2us;3us;1us;1us;3us;3us;3us;2us;4us;4us;1us;1us;1us;0us;1us;5us;3us;3us;3us;3us;2us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;3us;3us;3us;2us;3us;3us;3us;2us;3us;3us;3us;2us;2us;3us;3us;3us;2us;2us;2us;2us;2us;4us;6us;1us;1us;1us;3us;3us;1us;3us;3us;3us;2us;2us;1us;1us;1us;1us;0us;1us;0us;1us;2us;3us;3us;2us;5us;1us;1us;6us;2us;0us;0us;1us;0us;4us;0us;2us;3us;6us;1us;5us;3us;1us;1us;2us;5us;5us;4us;6us;1us;0us;1us;1us;2us;2us;1us;1us;3us;0us;3us;2us;3us;1us;2us;4us;3us;2us;5us;4us;2us;1us;0us;2us;3us;3us;2us;0us;2us;2us;5us;2us;1us;3us;3us;3us;2us;2us;4us;4us;5us;5us;5us;4us;4us;3us;2us;3us;1us;3us;1us;3us;0us;2us;2us;3us;3us;1us;3us;3us;2us;1us;3us;3us;2us;1us;4us;4us;5us;5us;2us;3us;3us;4us;4us;1us;3us;3us;4us;3us;3us;3us;4us;1us;2us;3us;3us;2us;2us;2us;3us;3us;1us;3us;3us;2us;3us;3us;2us;1us;3us;3us;1us;1us;3us;1us;3us;1us;1us;3us;2us;3us;2us;4us;1us;1us;3us;3us;2us;3us;4us;5us;6us;7us;8us;9us;10us;11us;12us;13us;14us;15us;16us;17us;18us;19us;20us;21us;22us;23us;24us;25us;26us;27us;28us;29us;30us;31us;32us;33us;4us;3us;3us;0us;1us;3us;4us;1us;1us;1us;1us;1us;1us;3us;3us;6us;6us;5us;4us;3us;1us;1us;2us;1us;1us;3us;2us;3us;4us;3us;1us;2us;6us;6us;4us;3us;3us;2us;2us;1us;3us;2us;1us;1us;0us;3us;3us;1us;1us;3us;1us;3us;1us;1us;2us;1us;3us;3us;2us;2us;2us;1us;1us;1us;3us;3us;3us;3us;1us;4us;6us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;2us;2us;1us;2us;3us;1us;1us;1us;1us;3us;3us;1us;1us;1us;1us;1us;1us;1us;2us;2us;0us;1us;1us;2us;2us;1us;1us;1us;1us;1us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;0us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;3us;1us;3us;2us;3us;1us;2us;1us;1us;0us;1us;0us;2us;1us;1us;2us;1us;1us;2us;1us;1us;1us;2us;1us;1us;2us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;1us;|] +let _fsyacc_productionToNonTerminalTable = [|0us;1us;2us;3us;4us;5us;5us;5us;6us;6us;7us;7us;7us;7us;7us;7us;7us;8us;8us;9us;10us;11us;11us;12us;12us;13us;14us;14us;15us;15us;15us;15us;15us;16us;16us;16us;17us;17us;17us;18us;18us;19us;19us;20us;20us;21us;22us;22us;23us;23us;23us;23us;24us;24us;24us;25us;25us;25us;26us;26us;26us;26us;26us;26us;26us;26us;27us;28us;28us;28us;29us;29us;29us;30us;30us;31us;31us;32us;32us;33us;33us;33us;34us;34us;34us;34us;35us;35us;35us;35us;36us;36us;36us;37us;37us;38us;39us;39us;39us;39us;39us;39us;39us;39us;40us;40us;40us;40us;41us;41us;41us;41us;42us;42us;43us;44us;44us;45us;45us;45us;46us;46us;47us;47us;48us;49us;49us;50us;50us;50us;50us;51us;51us;52us;52us;52us;52us;52us;53us;53us;53us;53us;53us;54us;54us;55us;55us;55us;55us;55us;55us;55us;55us;55us;56us;56us;56us;56us;57us;57us;58us;58us;58us;58us;58us;58us;58us;59us;59us;59us;60us;61us;61us;62us;62us;63us;63us;63us;63us;64us;64us;65us;65us;65us;66us;66us;66us;66us;67us;67us;67us;67us;67us;68us;69us;69us;70us;70us;70us;70us;71us;71us;71us;71us;72us;72us;72us;73us;73us;73us;73us;74us;74us;75us;75us;75us;76us;76us;76us;77us;78us;78us;78us;79us;79us;80us;81us;81us;81us;81us;82us;82us;82us;82us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;83us;84us;84us;84us;84us;85us;85us;85us;85us;86us;86us;86us;87us;87us;87us;87us;87us;88us;88us;89us;89us;89us;90us;90us;90us;91us;91us;92us;92us;92us;93us;93us;94us;94us;95us;95us;96us;96us;97us;97us;97us;98us;98us;99us;99us;99us;99us;100us;100us;100us;101us;101us;101us;101us;101us;102us;102us;102us;102us;103us;103us;104us;104us;104us;105us;105us;105us;106us;106us;107us;107us;107us;107us;108us;108us;109us;109us;110us;110us;111us;112us;112us;112us;113us;114us;114us;115us;116us;116us;117us;117us;118us;118us;118us;118us;119us;119us;119us;119us;119us;119us;119us;119us;119us;119us;119us;119us;120us;120us;121us;121us;121us;122us;123us;123us;124us;124us;124us;124us;124us;124us;124us;124us;124us;124us;125us;125us;125us;126us;126us;126us;126us;127us;127us;127us;127us;127us;127us;128us;128us;128us;128us;129us;129us;129us;129us;129us;130us;130us;131us;131us;132us;133us;133us;133us;133us;134us;135us;135us;136us;136us;136us;137us;137us;138us;138us;139us;140us;141us;141us;142us;142us;142us;142us;143us;143us;144us;145us;145us;145us;146us;146us;147us;147us;148us;148us;148us;148us;148us;148us;149us;149us;150us;151us;151us;152us;152us;153us;153us;153us;154us;154us;154us;155us;156us;156us;157us;158us;158us;159us;159us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;160us;161us;161us;161us;161us;162us;162us;163us;163us;164us;164us;165us;166us;166us;167us;167us;168us;168us;169us;169us;169us;169us;169us;169us;169us;169us;169us;169us;170us;170us;170us;170us;170us;170us;171us;171us;172us;172us;172us;173us;173us;173us;174us;174us;174us;174us;174us;174us;174us;174us;174us;174us;174us;175us;175us;176us;176us;176us;176us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;177us;178us;178us;179us;179us;179us;179us;179us;179us;179us;179us;179us;179us;179us;179us;179us;180us;180us;180us;180us;180us;180us;181us;181us;182us;182us;183us;183us;183us;184us;184us;184us;185us;185us;185us;185us;186us;186us;186us;187us;187us;187us;188us;188us;188us;189us;190us;190us;190us;190us;190us;190us;191us;191us;192us;192us;192us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;193us;194us;194us;194us;194us;194us;194us;195us;195us;196us;196us;196us;196us;197us;197us;197us;197us;197us;198us;199us;199us;199us;199us;199us;199us;199us;200us;200us;201us;202us;203us;203us;203us;203us;204us;204us;204us;204us;204us;205us;205us;205us;205us;205us;205us;205us;205us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;206us;207us;207us;208us;208us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;209us;210us;210us;210us;210us;210us;210us;210us;210us;210us;210us;211us;211us;211us;211us;211us;211us;211us;211us;211us;211us;211us;212us;212us;212us;212us;213us;213us;213us;213us;214us;214us;214us;214us;215us;215us;215us;215us;215us;215us;215us;215us;215us;215us;216us;216us;216us;217us;217us;218us;218us;219us;219us;219us;219us;219us;220us;220us;220us;221us;221us;222us;222us;223us;224us;225us;225us;225us;226us;227us;227us;228us;229us;229us;230us;230us;231us;231us;232us;232us;232us;233us;233us;234us;234us;234us;234us;234us;234us;234us;234us;234us;235us;235us;236us;236us;236us;236us;237us;237us;238us;238us;239us;239us;239us;239us;239us;240us;240us;240us;241us;241us;241us;242us;242us;243us;243us;243us;244us;245us;245us;245us;246us;247us;247us;248us;248us;248us;248us;248us;249us;249us;249us;249us;249us;249us;249us;249us;250us;250us;251us;251us;252us;252us;253us;253us;253us;254us;254us;254us;255us;255us;255us;255us;256us;256us;256us;256us;257us;257us;257us;257us;257us;257us;257us;257us;257us;257us;258us;258us;258us;258us;259us;259us;259us;259us;260us;261us;261us;261us;261us;261us;261us;261us;261us;262us;262us;262us;262us;262us;262us;262us;263us;263us;264us;264us;265us;265us;266us;266us;267us;267us;268us;268us;268us;268us;268us;268us;268us;268us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;269us;270us;271us;271us;271us;272us;272us;273us;273us;274us;274us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;275us;276us;276us;277us;277us;277us;277us;277us;277us;277us;278us;278us;278us;279us;279us;280us;281us;281us;282us;282us;282us;283us;283us;283us;284us;284us;285us;285us;285us;285us;286us;286us;287us;288us;288us;288us;288us;289us;289us;289us;289us;289us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;290us;291us;292us;292us;293us;293us;294us;294us;294us;294us;295us;296us;296us;297us;297us;297us;298us;298us;299us;299us;300us;300us;300us;300us;301us;301us;301us;302us;302us;302us;302us;303us;303us;304us;304us;305us;305us;306us;306us;307us;307us;308us;308us;309us;309us;310us;310us;311us;311us;312us;312us;313us;313us;314us;314us;315us;316us;317us;317us;318us;318us;318us;319us;319us;319us;320us;320us;320us;321us;321us;322us;322us;322us;323us;323us;323us;324us;324us;324us;325us;326us;326us;326us;327us;327us;327us;328us;328us;328us;328us;328us;329us;329us;329us;329us;329us;329us;|] +let _fsyacc_immediateActions = [|65535us;49152us;65535us;49152us;65535us;49152us;65535us;49152us;65535us;49152us;16389us;16390us;16391us;16392us;16393us;16394us;65535us;16395us;65535us;16396us;65535us;16397us;65535us;16398us;65535us;16399us;65535us;16400us;65535us;16402us;65535us;65535us;65535us;16404us;65535us;16406us;16407us;16408us;65535us;65535us;65535us;16411us;16412us;16413us;65535us;16415us;16416us;65535us;16417us;65535us;16418us;65535us;16419us;65535us;65535us;65535us;65535us;65535us;16421us;16422us;65535us;65535us;65535us;16424us;65535us;16426us;65535us;16427us;65535us;65535us;16429us;65535us;65535us;65535us;16430us;16431us;16432us;65535us;65535us;65535us;16433us;16434us;65535us;16435us;16436us;65535us;65535us;65535us;65535us;16439us;65535us;65535us;16440us;16442us;16443us;65535us;65535us;65535us;65535us;16444us;16445us;16446us;65535us;65535us;16447us;16448us;16449us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16450us;65535us;65535us;65535us;65535us;65535us;16453us;65535us;65535us;16454us;65535us;65535us;65535us;16455us;65535us;65535us;16456us;65535us;65535us;16457us;65535us;65535us;16459us;16460us;65535us;65535us;65535us;65535us;65535us;65535us;16461us;65535us;16462us;16463us;16464us;65535us;65535us;16465us;16466us;65535us;65535us;16467us;16468us;65535us;16469us;65535us;65535us;16470us;16471us;65535us;65535us;16472us;16473us;65535us;65535us;16474us;16475us;16476us;16477us;65535us;65535us;16479us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16480us;65535us;65535us;65535us;65535us;16483us;65535us;16484us;65535us;65535us;16485us;65535us;16486us;65535us;65535us;16487us;65535us;16489us;65535us;65535us;16490us;16491us;65535us;65535us;65535us;65535us;16493us;16494us;65535us;65535us;16495us;16496us;16497us;65535us;16498us;65535us;65535us;16499us;65535us;16501us;65535us;16502us;65535us;16503us;65535us;16505us;65535us;16506us;65535us;65535us;16508us;65535us;65535us;65535us;16509us;16510us;65535us;65535us;65535us;16511us;16512us;65535us;16513us;16514us;16515us;65535us;65535us;65535us;65535us;16517us;16520us;16521us;65535us;16522us;65535us;16523us;65535us;65535us;65535us;65535us;65535us;16526us;16527us;16528us;65535us;65535us;16529us;65535us;16530us;65535us;16531us;65535us;65535us;16532us;16533us;65535us;65535us;16534us;16535us;65535us;16536us;16537us;65535us;65535us;16539us;65535us;65535us;16541us;65535us;16542us;65535us;65535us;65535us;16544us;16545us;65535us;16546us;16547us;16548us;16549us;65535us;65535us;65535us;16551us;16552us;16553us;65535us;65535us;16554us;16555us;65535us;16558us;65535us;65535us;65535us;65535us;16559us;65535us;65535us;16560us;16561us;16562us;16563us;65535us;16564us;65535us;65535us;16565us;65535us;65535us;65535us;16566us;65535us;65535us;65535us;65535us;16567us;65535us;16568us;65535us;16569us;65535us;16570us;65535us;16571us;65535us;16572us;16574us;16575us;16576us;65535us;65535us;16577us;65535us;65535us;16578us;65535us;16581us;65535us;65535us;65535us;65535us;65535us;65535us;16582us;16583us;65535us;65535us;65535us;65535us;65535us;65535us;16584us;16585us;16586us;65535us;16587us;16588us;16589us;65535us;65535us;16590us;16591us;65535us;65535us;16592us;16593us;65535us;16594us;65535us;65535us;16595us;16596us;65535us;65535us;16597us;16598us;16599us;16600us;65535us;16601us;65535us;65535us;16603us;65535us;16604us;65535us;65535us;16605us;16606us;65535us;65535us;16608us;65535us;65535us;65535us;65535us;65535us;16609us;65535us;65535us;65535us;65535us;16610us;16611us;16612us;16613us;65535us;16615us;65535us;16617us;65535us;65535us;65535us;65535us;16618us;16619us;65535us;65535us;16620us;16621us;65535us;65535us;16622us;16623us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16624us;16625us;65535us;16626us;65535us;16627us;65535us;16628us;65535us;65535us;65535us;65535us;65535us;16629us;16630us;16631us;65535us;16632us;65535us;16633us;65535us;65535us;65535us;65535us;65535us;16634us;16635us;16636us;16637us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16638us;16639us;16640us;16641us;65535us;16643us;16644us;65535us;65535us;16645us;65535us;65535us;16646us;16647us;65535us;65535us;65535us;16648us;16649us;16651us;16652us;16653us;16654us;65535us;65535us;16655us;65535us;65535us;16658us;65535us;65535us;16660us;65535us;65535us;16661us;16662us;16663us;65535us;16665us;16666us;16667us;65535us;16669us;16670us;65535us;65535us;16671us;16672us;16673us;65535us;65535us;16674us;65535us;65535us;65535us;65535us;16676us;65535us;16677us;16678us;65535us;65535us;16679us;65535us;16680us;16681us;16682us;65535us;65535us;65535us;65535us;65535us;16683us;16684us;16685us;16686us;65535us;65535us;65535us;65535us;16687us;65535us;65535us;16688us;16689us;65535us;16690us;16691us;65535us;16692us;16693us;65535us;65535us;16694us;16695us;65535us;16696us;16697us;16698us;16699us;16700us;16701us;65535us;65535us;65535us;65535us;16704us;16705us;16706us;65535us;65535us;16707us;65535us;65535us;65535us;65535us;16708us;16709us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16712us;16713us;65535us;65535us;65535us;65535us;16716us;16717us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16722us;16723us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16728us;65535us;65535us;65535us;65535us;16730us;65535us;16731us;16732us;16733us;65535us;65535us;16734us;65535us;65535us;65535us;65535us;65535us;65535us;16735us;65535us;16736us;16737us;65535us;65535us;65535us;65535us;65535us;16742us;65535us;65535us;16743us;65535us;16745us;65535us;65535us;16746us;65535us;65535us;65535us;16749us;65535us;16750us;16751us;65535us;16752us;16753us;16754us;65535us;16755us;65535us;65535us;16757us;16758us;65535us;65535us;16759us;65535us;65535us;16760us;65535us;16761us;65535us;65535us;65535us;65535us;65535us;16764us;65535us;16765us;65535us;65535us;16766us;16767us;65535us;16768us;65535us;65535us;16771us;16772us;65535us;16773us;65535us;65535us;16775us;16776us;16777us;16778us;16779us;16780us;16781us;65535us;65535us;16782us;16783us;65535us;16784us;65535us;65535us;65535us;65535us;16785us;16786us;16787us;16788us;65535us;16789us;65535us;65535us;65535us;65535us;16790us;16791us;65535us;65535us;16793us;16794us;65535us;65535us;65535us;65535us;16797us;16798us;65535us;16799us;65535us;65535us;65535us;16800us;65535us;65535us;16801us;16802us;16803us;16804us;16805us;16806us;16807us;16808us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16809us;65535us;65535us;65535us;16813us;65535us;16814us;65535us;65535us;16816us;65535us;65535us;65535us;65535us;16818us;16819us;65535us;16820us;16821us;65535us;65535us;16822us;65535us;65535us;16825us;65535us;65535us;16826us;65535us;16828us;16829us;65535us;65535us;65535us;65535us;65535us;16830us;16831us;16832us;65535us;65535us;16833us;16834us;16835us;65535us;65535us;16837us;65535us;65535us;65535us;16839us;65535us;16840us;16841us;65535us;65535us;16842us;16843us;16844us;16845us;16846us;16847us;16848us;16849us;16850us;16851us;16852us;16853us;16854us;16855us;16856us;16857us;16858us;16859us;16860us;16861us;65535us;65535us;16862us;65535us;65535us;65535us;16863us;16866us;65535us;65535us;16867us;16868us;65535us;16869us;65535us;65535us;16871us;65535us;16873us;65535us;65535us;16875us;16876us;16877us;65535us;65535us;16878us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16879us;16880us;65535us;65535us;16884us;65535us;65535us;16888us;65535us;65535us;16891us;16892us;65535us;16894us;65535us;65535us;65535us;16897us;65535us;16898us;65535us;16899us;65535us;65535us;65535us;65535us;16901us;16902us;65535us;65535us;16904us;65535us;16905us;65535us;16906us;16907us;65535us;16908us;65535us;16909us;65535us;16910us;16911us;16913us;65535us;65535us;16914us;16915us;65535us;16916us;65535us;16917us;65535us;16918us;16920us;65535us;65535us;16921us;65535us;16922us;65535us;65535us;16923us;65535us;65535us;16924us;65535us;65535us;16926us;16927us;16928us;16929us;16930us;16931us;65535us;65535us;16932us;16933us;65535us;65535us;16935us;65535us;65535us;65535us;16936us;16937us;65535us;16938us;16939us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16942us;16943us;65535us;65535us;65535us;65535us;16948us;16949us;65535us;65535us;16952us;16954us;65535us;65535us;16957us;16958us;65535us;16960us;65535us;65535us;65535us;16963us;65535us;16964us;65535us;65535us;16966us;16967us;16969us;65535us;16970us;65535us;65535us;16971us;16972us;16973us;16974us;65535us;65535us;16975us;16976us;65535us;65535us;16978us;16980us;65535us;65535us;65535us;16981us;16982us;65535us;16984us;65535us;65535us;16985us;65535us;16988us;65535us;65535us;65535us;16989us;65535us;16991us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16992us;65535us;65535us;65535us;65535us;16993us;65535us;65535us;65535us;65535us;65535us;16994us;65535us;65535us;16996us;16997us;65535us;16998us;16999us;65535us;17000us;17001us;17002us;17003us;17004us;65535us;65535us;17005us;17006us;65535us;65535us;17007us;17008us;65535us;65535us;17009us;17010us;65535us;17012us;65535us;17013us;65535us;65535us;17014us;17015us;17016us;65535us;65535us;65535us;65535us;65535us;17020us;65535us;17021us;65535us;17023us;65535us;17024us;65535us;65535us;65535us;65535us;17025us;17026us;17027us;17028us;17029us;65535us;17030us;65535us;65535us;65535us;17031us;17032us;17033us;17034us;17035us;65535us;65535us;17036us;17037us;17038us;65535us;65535us;65535us;65535us;65535us;17042us;17043us;65535us;65535us;65535us;65535us;65535us;65535us;17044us;65535us;65535us;65535us;65535us;65535us;65535us;17045us;17046us;65535us;65535us;65535us;65535us;17047us;65535us;65535us;17048us;65535us;65535us;65535us;17050us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17051us;17052us;65535us;17053us;17054us;65535us;17055us;17056us;65535us;65535us;65535us;17058us;65535us;65535us;65535us;17061us;65535us;17063us;65535us;17065us;65535us;17067us;65535us;17069us;65535us;17071us;65535us;17073us;65535us;17075us;65535us;17077us;65535us;17079us;65535us;17081us;65535us;17083us;65535us;17085us;65535us;17087us;65535us;17089us;65535us;17091us;65535us;17093us;65535us;17095us;65535us;17097us;65535us;17099us;65535us;65535us;65535us;65535us;17103us;65535us;65535us;65535us;17105us;17106us;65535us;17107us;17108us;17109us;17110us;17111us;65535us;65535us;17112us;65535us;17113us;65535us;65535us;17114us;17115us;17116us;17117us;65535us;17118us;65535us;17119us;17120us;17121us;17122us;65535us;65535us;65535us;17124us;65535us;17125us;65535us;17126us;17127us;17128us;17129us;65535us;65535us;17132us;65535us;17133us;65535us;17135us;65535us;17136us;17137us;65535us;65535us;17140us;65535us;17141us;17142us;65535us;17144us;65535us;17146us;65535us;17147us;65535us;17149us;65535us;65535us;65535us;65535us;17151us;65535us;65535us;17152us;65535us;65535us;17153us;65535us;65535us;17154us;65535us;65535us;17155us;65535us;65535us;17156us;65535us;65535us;17157us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17158us;17160us;17161us;65535us;17162us;65535us;17163us;65535us;65535us;65535us;17165us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17170us;17171us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17174us;65535us;65535us;65535us;65535us;17176us;65535us;17177us;65535us;17178us;65535us;65535us;17179us;65535us;65535us;17180us;65535us;17181us;17182us;17183us;65535us;65535us;17184us;17185us;17186us;17187us;65535us;65535us;17188us;17189us;17190us;17191us;17192us;17194us;65535us;65535us;65535us;65535us;17195us;65535us;17196us;65535us;65535us;17197us;17198us;17199us;17200us;17201us;17202us;17203us;17204us;17205us;17206us;17207us;17208us;17209us;17210us;17211us;65535us;65535us;17212us;17213us;65535us;17214us;17215us;65535us;65535us;65535us;17216us;17217us;17218us;17219us;65535us;65535us;17220us;17221us;17222us;17223us;65535us;65535us;65535us;17224us;65535us;17225us;17226us;17227us;65535us;17228us;17229us;17230us;17231us;17232us;65535us;17233us;65535us;65535us;65535us;65535us;65535us;17234us;17235us;17236us;17237us;65535us;65535us;17238us;65535us;17239us;65535us;65535us;17241us;17242us;17243us;17244us;17245us;17246us;17247us;17248us;17249us;17251us;17253us;65535us;17254us;65535us;17256us;17257us;65535us;65535us;17259us;17260us;65535us;65535us;65535us;65535us;65535us;17261us;17262us;17265us;65535us;65535us;65535us;17267us;65535us;17269us;65535us;17270us;65535us;65535us;65535us;65535us;65535us;17271us;17272us;65535us;65535us;65535us;17273us;17274us;65535us;65535us;65535us;17278us;65535us;65535us;65535us;17279us;65535us;65535us;17280us;65535us;65535us;65535us;17281us;17282us;65535us;65535us;65535us;17286us;17287us;65535us;17289us;17290us;65535us;65535us;17292us;17294us;17296us;65535us;65535us;65535us;17297us;65535us;17298us;17300us;17303us;65535us;17305us;65535us;65535us;17306us;65535us;17307us;65535us;17308us;65535us;17310us;65535us;17311us;65535us;65535us;65535us;65535us;17312us;65535us;17313us;17314us;65535us;65535us;17315us;17316us;17317us;17318us;17319us;65535us;65535us;65535us;17320us;17321us;65535us;65535us;65535us;65535us;17322us;17323us;65535us;17324us;65535us;17326us;65535us;17327us;65535us;17328us;65535us;65535us;17329us;65535us;65535us;65535us;65535us;65535us;17335us;17336us;65535us;65535us;17337us;17338us;65535us;65535us;17340us;17341us;65535us;17342us;65535us;65535us;17344us;17345us;65535us;17346us;65535us;65535us;65535us;17348us;17349us;65535us;65535us;65535us;17350us;17351us;65535us;65535us;17353us;17354us;65535us;65535us;65535us;17355us;17356us;65535us;65535us;65535us;65535us;17358us;17359us;65535us;17360us;65535us;65535us;17362us;17363us;65535us;17364us;65535us;17366us;65535us;65535us;65535us;17367us;17368us;65535us;65535us;17369us;65535us;65535us;17370us;17371us;65535us;17372us;17373us;65535us;65535us;17375us;17376us;65535us;17377us;65535us;17378us;17379us;65535us;17380us;65535us;65535us;65535us;65535us;65535us;17385us;65535us;65535us;65535us;17386us;65535us;65535us;17388us;65535us;17391us;17392us;65535us;17393us;17394us;65535us;65535us;65535us;17395us;17396us;17397us;65535us;17398us;65535us;65535us;17399us;65535us;17400us;65535us;17401us;65535us;17402us;65535us;17403us;65535us;17404us;65535us;17405us;65535us;17406us;65535us;17407us;65535us;17408us;65535us;17409us;65535us;17410us;65535us;17411us;65535us;17412us;65535us;17413us;65535us;17414us;65535us;17415us;65535us;17416us;65535us;17417us;65535us;17418us;65535us;17419us;65535us;17420us;65535us;17421us;65535us;17422us;65535us;17423us;65535us;17424us;65535us;17425us;65535us;17426us;65535us;17427us;65535us;17428us;65535us;17429us;65535us;17430us;65535us;17431us;65535us;65535us;65535us;65535us;65535us;65535us;17433us;17434us;65535us;65535us;17437us;65535us;65535us;65535us;17438us;65535us;65535us;17441us;17442us;17443us;17444us;65535us;65535us;65535us;17445us;17446us;65535us;65535us;65535us;65535us;65535us;17447us;17448us;17449us;17450us;17451us;17452us;17453us;65535us;17455us;17456us;65535us;65535us;17457us;65535us;17458us;65535us;65535us;17460us;65535us;17461us;17462us;65535us;17463us;65535us;65535us;65535us;65535us;17464us;17465us;17466us;65535us;17467us;17468us;17469us;17470us;65535us;65535us;17472us;17474us;17475us;65535us;65535us;17477us;65535us;17478us;65535us;17480us;65535us;65535us;17481us;65535us;65535us;17483us;17484us;65535us;17486us;17487us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;17491us;65535us;65535us;17492us;65535us;17493us;17494us;17495us;65535us;17496us;17497us;65535us;65535us;17498us;65535us;17499us;17500us;65535us;65535us;17501us;65535us;65535us;17502us;17503us;17504us;17505us;17506us;17507us;17508us;17509us;17510us;17511us;17512us;17513us;17514us;17515us;17516us;17517us;17518us;17519us;17520us;17521us;17522us;17523us;17524us;17525us;65535us;17527us;65535us;17528us;17529us;65535us;17530us;17531us;17532us;17533us;65535us;17535us;65535us;17536us;17537us;17538us;17539us;17540us;17541us;17542us;17543us;65535us;17545us;65535us;17546us;65535us;65535us;17550us;17551us;17552us;17553us;17554us;17555us;17556us;17557us;17559us;17561us;17563us;17565us;17567us;17569us;17571us;17573us;17574us;17575us;17576us;17577us;17578us;17579us;17580us;17581us;17582us;17583us;17584us;65535us;17586us;17587us;65535us;65535us;17588us;17589us;65535us;65535us;17590us;17591us;17592us;17593us;17594us;17596us;65535us;65535us;17598us;17599us;17600us;65535us;65535us;17601us;17602us;17603us;65535us;17604us;17605us;17606us;17607us;65535us;17608us;17609us;17610us;65535us;17611us;17612us;17613us;17614us;17615us;17616us;17617us;17618us;17619us;17620us;17621us;17622us;17623us;17624us;|] let _fsyacc_reductions = lazy [| -//# 2858 "pars.fs" +//# 2886 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParsedSigFile in Microsoft.FSharp.Core.Operators.box @@ -2864,7 +2892,7 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__startsignatureFile)); -//# 2867 "pars.fs" +//# 2895 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParsedImplFile in Microsoft.FSharp.Core.Operators.box @@ -2873,7 +2901,7 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__startimplementationFile)); -//# 2876 "pars.fs" +//# 2904 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParsedScriptInteraction in Microsoft.FSharp.Core.Operators.box @@ -2882,7 +2910,7 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__startinteraction)); -//# 2885 "pars.fs" +//# 2913 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box @@ -2891,7 +2919,7 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__starttypedSequentialExprEOF)); -//# 2894 "pars.fs" +//# 2922 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynType in Microsoft.FSharp.Core.Operators.box @@ -2900,107 +2928,107 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__starttypEOF)); -//# 2903 "pars.fs" +//# 2931 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveItemsTerminator in Microsoft.FSharp.Core.Operators.box ( ( -//# 388 "src/Compiler/pars.fsy" +//# 395 "src/Compiler/pars.fsy" ParsedScriptInteraction.Definitions(_1, lhs parseState) ) -//# 388 "src/Compiler/pars.fsy" +//# 395 "src/Compiler/pars.fsy" : ParsedScriptInteraction)); -//# 2914 "pars.fs" +//# 2942 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 391 "src/Compiler/pars.fsy" +//# 398 "src/Compiler/pars.fsy" warning(Error(FSComp.SR.parsUnexpectedSemicolon(), rhs parseState 1)) ParsedScriptInteraction.Definitions([], lhs parseState) ) -//# 391 "src/Compiler/pars.fsy" +//# 398 "src/Compiler/pars.fsy" : ParsedScriptInteraction)); -//# 2925 "pars.fs" +//# 2953 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 395 "src/Compiler/pars.fsy" +//# 402 "src/Compiler/pars.fsy" ParsedScriptInteraction.Definitions([], lhs parseState) ) -//# 395 "src/Compiler/pars.fsy" +//# 402 "src/Compiler/pars.fsy" : ParsedScriptInteraction)); -//# 2935 "pars.fs" +//# 2963 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 399 "src/Compiler/pars.fsy" +//# 406 "src/Compiler/pars.fsy" ) -//# 399 "src/Compiler/pars.fsy" +//# 406 "src/Compiler/pars.fsy" : 'gentype_interactiveTerminator)); -//# 2945 "pars.fs" +//# 2973 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 400 "src/Compiler/pars.fsy" +//# 407 "src/Compiler/pars.fsy" checkEndOfFileError _1 ) -//# 400 "src/Compiler/pars.fsy" +//# 407 "src/Compiler/pars.fsy" : 'gentype_interactiveTerminator)); -//# 2956 "pars.fs" +//# 2984 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveTerminator in Microsoft.FSharp.Core.Operators.box ( ( -//# 414 "src/Compiler/pars.fsy" +//# 421 "src/Compiler/pars.fsy" [] ) -//# 414 "src/Compiler/pars.fsy" +//# 421 "src/Compiler/pars.fsy" : 'gentype_interactiveItemsTerminator)); -//# 2967 "pars.fs" +//# 2995 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveDefns in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveTerminator in Microsoft.FSharp.Core.Operators.box ( ( -//# 417 "src/Compiler/pars.fsy" +//# 424 "src/Compiler/pars.fsy" _1 ) -//# 417 "src/Compiler/pars.fsy" +//# 424 "src/Compiler/pars.fsy" : 'gentype_interactiveItemsTerminator)); -//# 2979 "pars.fs" +//# 3007 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveExpr in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveTerminator in Microsoft.FSharp.Core.Operators.box ( ( -//# 420 "src/Compiler/pars.fsy" +//# 427 "src/Compiler/pars.fsy" _1 ) -//# 420 "src/Compiler/pars.fsy" +//# 427 "src/Compiler/pars.fsy" : 'gentype_interactiveItemsTerminator)); -//# 2991 "pars.fs" +//# 3019 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveHash in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveTerminator in Microsoft.FSharp.Core.Operators.box ( ( -//# 423 "src/Compiler/pars.fsy" +//# 430 "src/Compiler/pars.fsy" _1 ) -//# 423 "src/Compiler/pars.fsy" +//# 430 "src/Compiler/pars.fsy" : 'gentype_interactiveItemsTerminator)); -//# 3003 "pars.fs" +//# 3031 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveDefns in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveSeparators in @@ -3008,12 +3036,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 426 "src/Compiler/pars.fsy" +//# 433 "src/Compiler/pars.fsy" _1 @ _3 ) -//# 426 "src/Compiler/pars.fsy" +//# 433 "src/Compiler/pars.fsy" : 'gentype_interactiveItemsTerminator)); -//# 3016 "pars.fs" +//# 3044 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveExpr in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveSeparators in @@ -3021,12 +3049,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 429 "src/Compiler/pars.fsy" +//# 436 "src/Compiler/pars.fsy" _1 @ _3 ) -//# 429 "src/Compiler/pars.fsy" +//# 436 "src/Compiler/pars.fsy" : 'gentype_interactiveItemsTerminator)); -//# 3029 "pars.fs" +//# 3057 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveHash in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveSeparators in @@ -3034,35 +3062,35 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 432 "src/Compiler/pars.fsy" +//# 439 "src/Compiler/pars.fsy" _1 @ _3 ) -//# 432 "src/Compiler/pars.fsy" +//# 439 "src/Compiler/pars.fsy" : 'gentype_interactiveItemsTerminator)); -//# 3042 "pars.fs" +//# 3070 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefn in Microsoft.FSharp.Core.Operators.box ( ( -//# 438 "src/Compiler/pars.fsy" +//# 445 "src/Compiler/pars.fsy" _1 ) -//# 438 "src/Compiler/pars.fsy" +//# 445 "src/Compiler/pars.fsy" : 'gentype_interactiveDefns)); -//# 3053 "pars.fs" +//# 3081 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefn in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveDefns in Microsoft.FSharp.Core.Operators.box ( ( -//# 441 "src/Compiler/pars.fsy" +//# 448 "src/Compiler/pars.fsy" _1 @ _2 ) -//# 441 "src/Compiler/pars.fsy" +//# 448 "src/Compiler/pars.fsy" : 'gentype_interactiveDefns)); -//# 3065 "pars.fs" +//# 3093 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3070,165 +3098,201 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 447 "src/Compiler/pars.fsy" +//# 454 "src/Compiler/pars.fsy" match _2 with | Some vis -> errorR(Error(FSComp.SR.parsUnexpectedVisibilityDeclaration(vis.ToString()), rhs parseState 3)) | _ -> () let attrDecls = if not (isNil _1) then [ SynModuleDecl.Attributes(_1, rangeOfNonNilAttrs _1) ] else [] attrDecls @ [ mkSynExprDecl _3 ] ) -//# 447 "src/Compiler/pars.fsy" +//# 454 "src/Compiler/pars.fsy" : 'gentype_interactiveExpr)); -//# 3082 "pars.fs" +//# 3110 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hashDirective in Microsoft.FSharp.Core.Operators.box ( ( -//# 456 "src/Compiler/pars.fsy" +//# 463 "src/Compiler/pars.fsy" [SynModuleDecl.HashDirective(_1, rhs parseState 1)] ) -//# 456 "src/Compiler/pars.fsy" +//# 463 "src/Compiler/pars.fsy" : 'gentype_interactiveHash)); -//# 3093 "pars.fs" +//# 3121 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveSeparator in Microsoft.FSharp.Core.Operators.box ( ( -//# 460 "src/Compiler/pars.fsy" +//# 467 "src/Compiler/pars.fsy" ) -//# 460 "src/Compiler/pars.fsy" +//# 467 "src/Compiler/pars.fsy" : 'gentype_interactiveSeparators)); -//# 3104 "pars.fs" +//# 3132 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interactiveSeparator in let _2 = parseState.GetInput(2) :?> 'gentype_interactiveSeparators in Microsoft.FSharp.Core.Operators.box ( ( -//# 462 "src/Compiler/pars.fsy" +//# 469 "src/Compiler/pars.fsy" ) -//# 462 "src/Compiler/pars.fsy" +//# 469 "src/Compiler/pars.fsy" : 'gentype_interactiveSeparators)); -//# 3116 "pars.fs" +//# 3144 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 466 "src/Compiler/pars.fsy" +//# 473 "src/Compiler/pars.fsy" ) -//# 466 "src/Compiler/pars.fsy" +//# 473 "src/Compiler/pars.fsy" : 'gentype_interactiveSeparator)); -//# 3126 "pars.fs" +//# 3154 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 467 "src/Compiler/pars.fsy" +//# 474 "src/Compiler/pars.fsy" ) -//# 467 "src/Compiler/pars.fsy" +//# 474 "src/Compiler/pars.fsy" : 'gentype_interactiveSeparator)); -//# 3136 "pars.fs" +//# 3164 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_hashDirectiveArgs in Microsoft.FSharp.Core.Operators.box ( ( -//# 476 "src/Compiler/pars.fsy" +//# 483 "src/Compiler/pars.fsy" let m = match _3 with [] -> rhs2 parseState 1 2 | _ -> rhs2 parseState 1 3 ParsedHashDirective(_2, _3, m) ) -//# 476 "src/Compiler/pars.fsy" +//# 483 "src/Compiler/pars.fsy" : 'gentype_hashDirective)); -//# 3149 "pars.fs" +//# 3177 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 483 "src/Compiler/pars.fsy" +//# 490 "src/Compiler/pars.fsy" [] ) -//# 483 "src/Compiler/pars.fsy" +//# 490 "src/Compiler/pars.fsy" : 'gentype_hashDirectiveArgs)); -//# 3159 "pars.fs" +//# 3187 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hashDirectiveArgs in let _2 = parseState.GetInput(2) :?> 'gentype_hashDirectiveArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 486 "src/Compiler/pars.fsy" +//# 493 "src/Compiler/pars.fsy" _1 @ [_2] ) -//# 486 "src/Compiler/pars.fsy" +//# 493 "src/Compiler/pars.fsy" : 'gentype_hashDirectiveArgs)); -//# 3171 "pars.fs" +//# 3199 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_string in Microsoft.FSharp.Core.Operators.box ( ( -//# 492 "src/Compiler/pars.fsy" +//# 499 "src/Compiler/pars.fsy" let s, kind = _1 ParsedHashDirectiveArgument.String(s, kind, lhs parseState) ) -//# 492 "src/Compiler/pars.fsy" +//# 499 "src/Compiler/pars.fsy" + : 'gentype_hashDirectiveArg)); +//# 3211 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> int32 * bool in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 502 "src/Compiler/pars.fsy" + let n, _ = _1 + ParsedHashDirectiveArgument.Int32(n, lhs parseState) + ) +//# 502 "src/Compiler/pars.fsy" + : 'gentype_hashDirectiveArg)); +//# 3223 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 505 "src/Compiler/pars.fsy" + let m = rhs parseState 1 + ParsedHashDirectiveArgument.Ident(Ident(_1, m), lhs parseState) + ) +//# 505 "src/Compiler/pars.fsy" + : 'gentype_hashDirectiveArg)); +//# 3235 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> SynLongIdent in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 508 "src/Compiler/pars.fsy" + let path = _1 + ParsedHashDirectiveArgument.LongIdent(path, lhs parseState) + ) +//# 508 "src/Compiler/pars.fsy" : 'gentype_hashDirectiveArg)); -//# 3183 "pars.fs" +//# 3247 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sourceIdentifier in Microsoft.FSharp.Core.Operators.box ( ( -//# 495 "src/Compiler/pars.fsy" +//# 511 "src/Compiler/pars.fsy" let c, v = _1 ParsedHashDirectiveArgument.SourceIdentifier(c, v, lhs parseState) ) -//# 495 "src/Compiler/pars.fsy" +//# 511 "src/Compiler/pars.fsy" : 'gentype_hashDirectiveArg)); -//# 3195 "pars.fs" +//# 3259 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceSpecs in let _2 = parseState.GetInput(2) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 505 "src/Compiler/pars.fsy" +//# 521 "src/Compiler/pars.fsy" checkEndOfFileError _2; _1 ) -//# 505 "src/Compiler/pars.fsy" +//# 521 "src/Compiler/pars.fsy" : ParsedSigFile)); -//# 3207 "pars.fs" +//# 3271 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceSpecs in let _3 = parseState.GetInput(3) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 508 "src/Compiler/pars.fsy" +//# 524 "src/Compiler/pars.fsy" _1 ) -//# 508 "src/Compiler/pars.fsy" +//# 524 "src/Compiler/pars.fsy" : ParsedSigFile)); -//# 3219 "pars.fs" +//# 3283 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 514 "src/Compiler/pars.fsy" +//# 530 "src/Compiler/pars.fsy" let emptySigFileFrag = ParsedSigFileFragment.AnonModule([], rhs parseState 1) ParsedSigFile([], [emptySigFileFrag]) ) -//# 514 "src/Compiler/pars.fsy" +//# 530 "src/Compiler/pars.fsy" : ParsedSigFile)); -//# 3231 "pars.fs" +//# 3295 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleKeyword in let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in @@ -3238,15 +3302,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 521 "src/Compiler/pars.fsy" +//# 537 "src/Compiler/pars.fsy" if not (isNil _2) then parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.AttributesToRightOfModuleKeyword (rhs parseState 4) let mModule = rhs parseState 1 mModule, _4, _5.LongIdent, _3, _2 ) -//# 521 "src/Compiler/pars.fsy" +//# 537 "src/Compiler/pars.fsy" : 'gentype_moduleIntro)); -//# 3249 "pars.fs" +//# 3313 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleKeyword in let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in @@ -3255,15 +3319,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 527 "src/Compiler/pars.fsy" +//# 543 "src/Compiler/pars.fsy" if not (isNil _2) then parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.AttributesToRightOfModuleKeyword (rhs parseState 4) let mModule = rhs parseState 1 mModule, _4, [], _3, _2 ) -//# 527 "src/Compiler/pars.fsy" +//# 543 "src/Compiler/pars.fsy" : 'gentype_moduleIntro)); -//# 3266 "pars.fs" +//# 3330 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleKeyword in let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in @@ -3273,59 +3337,59 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 533 "src/Compiler/pars.fsy" +//# 549 "src/Compiler/pars.fsy" if not (isNil _2) then parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.AttributesToRightOfModuleKeyword (rhs parseState 4) let mModule = rhs parseState 1 mModule, _4, [], _3, _2 ) -//# 533 "src/Compiler/pars.fsy" +//# 549 "src/Compiler/pars.fsy" : 'gentype_moduleIntro)); -//# 3284 "pars.fs" +//# 3348 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_rec in let _3 = parseState.GetInput(3) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 541 "src/Compiler/pars.fsy" +//# 557 "src/Compiler/pars.fsy" let mNamespace = rhs parseState 1 mNamespace, _2, _3.LongIdent, grabXmlDoc(parseState, [], 1) ) -//# 541 "src/Compiler/pars.fsy" +//# 557 "src/Compiler/pars.fsy" : 'gentype_namespaceIntro)); -//# 3297 "pars.fs" +//# 3361 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_rec in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 545 "src/Compiler/pars.fsy" +//# 561 "src/Compiler/pars.fsy" let mNamespace = rhs parseState 1 mNamespace, _2, [], grabXmlDoc(parseState, [], 1) ) -//# 545 "src/Compiler/pars.fsy" +//# 561 "src/Compiler/pars.fsy" : 'gentype_namespaceIntro)); -//# 3310 "pars.fs" +//# 3374 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileModuleSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 552 "src/Compiler/pars.fsy" +//# 568 "src/Compiler/pars.fsy" ParsedSigFile([], [ (_1 (None, false, [], PreXmlDoc.Empty)) ]) ) -//# 552 "src/Compiler/pars.fsy" +//# 568 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceSpecs)); -//# 3321 "pars.fs" +//# 3385 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileModuleSpec in let _2 = parseState.GetInput(2) :?> 'gentype_fileNamespaceSpecList in Microsoft.FSharp.Core.Operators.box ( ( -//# 555 "src/Compiler/pars.fsy" +//# 571 "src/Compiler/pars.fsy" // If there are namespaces, the first fileModuleImpl may only contain # directives let decls = match (_1 (None, false, [], PreXmlDoc.Empty)) with @@ -3341,32 +3405,32 @@ let _fsyacc_reductions = lazy [| []) ParsedSigFile(decls, _2) ) -//# 555 "src/Compiler/pars.fsy" +//# 571 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceSpecs)); -//# 3346 "pars.fs" +//# 3410 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceSpec in let _2 = parseState.GetInput(2) :?> 'gentype_fileNamespaceSpecList in Microsoft.FSharp.Core.Operators.box ( ( -//# 573 "src/Compiler/pars.fsy" +//# 589 "src/Compiler/pars.fsy" _1 :: _2 ) -//# 573 "src/Compiler/pars.fsy" +//# 589 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceSpecList)); -//# 3358 "pars.fs" +//# 3422 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 576 "src/Compiler/pars.fsy" +//# 592 "src/Compiler/pars.fsy" [_1] ) -//# 576 "src/Compiler/pars.fsy" +//# 592 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceSpecList)); -//# 3369 "pars.fs" +//# 3433 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_namespaceIntro in let _2 = parseState.GetInput(2) :?> 'gentype_deprecated_opt_equals in @@ -3374,13 +3438,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 580 "src/Compiler/pars.fsy" +//# 596 "src/Compiler/pars.fsy" let mNamespace, isRec, path, xml = _1 _3 (Some mNamespace, isRec, path, xml) ) -//# 580 "src/Compiler/pars.fsy" +//# 596 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceSpec)); -//# 3383 "pars.fs" +//# 3447 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3389,7 +3453,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 587 "src/Compiler/pars.fsy" +//# 603 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let m2 = rhs parseState 3 let mDeclsAndAttrs = (List.map (fun (a: SynAttributeList) -> a.Range) _1) @ (List.map (fun (d: SynModuleSigDecl) -> d.Range) _4) @@ -3402,15 +3466,15 @@ let _fsyacc_reductions = lazy [| let trivia: SynModuleOrNamespaceSigTrivia = { LeadingKeyword = SynModuleOrNamespaceLeadingKeyword.Module mModule } ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, (isRec || isRec2), SynModuleOrNamespaceKind.NamedModule, _4, xmlDoc, _1 @ attribs2, vis, m, trivia))) ) -//# 587 "src/Compiler/pars.fsy" +//# 603 "src/Compiler/pars.fsy" : 'gentype_fileModuleSpec)); -//# 3407 "pars.fs" +//# 3471 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleSpfnsPossiblyEmptyBlock in Microsoft.FSharp.Core.Operators.box ( ( -//# 600 "src/Compiler/pars.fsy" +//# 616 "src/Compiler/pars.fsy" let m = (rhs parseState 1) (fun (mNamespaceOpt, isRec, path, xml) -> match path with @@ -3425,20 +3489,20 @@ let _fsyacc_reductions = lazy [| | Some mNamespace -> { LeadingKeyword = SynModuleOrNamespaceLeadingKeyword.Namespace mNamespace } ParsedSigFileFragment.NamespaceFragment(path, isRec, SynModuleOrNamespaceKind.DeclaredNamespace, _1, PreXmlDoc.Empty, [], m, trivia)) ) -//# 600 "src/Compiler/pars.fsy" +//# 616 "src/Compiler/pars.fsy" : 'gentype_fileModuleSpec)); -//# 3430 "pars.fs" +//# 3494 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleSpfnsPossiblyEmpty in Microsoft.FSharp.Core.Operators.box ( ( -//# 617 "src/Compiler/pars.fsy" +//# 633 "src/Compiler/pars.fsy" _1 ) -//# 617 "src/Compiler/pars.fsy" +//# 633 "src/Compiler/pars.fsy" : 'gentype_moduleSpfnsPossiblyEmptyBlock)); -//# 3441 "pars.fs" +//# 3505 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleSpfnsPossiblyEmpty in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in @@ -3446,69 +3510,69 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 620 "src/Compiler/pars.fsy" +//# 636 "src/Compiler/pars.fsy" _2 ) -//# 620 "src/Compiler/pars.fsy" +//# 636 "src/Compiler/pars.fsy" : 'gentype_moduleSpfnsPossiblyEmptyBlock)); -//# 3454 "pars.fs" +//# 3518 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleSpfnsPossiblyEmpty in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 623 "src/Compiler/pars.fsy" +//# 639 "src/Compiler/pars.fsy" // The lex filter ensures we can only get a mismatch in OBLOCKBEGIN/OBLOCKEND tokens if there was some other kind of error, hence we don't need to report this error // reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnClosedBlockInHashLight()) _2 ) -//# 623 "src/Compiler/pars.fsy" +//# 639 "src/Compiler/pars.fsy" : 'gentype_moduleSpfnsPossiblyEmptyBlock)); -//# 3469 "pars.fs" +//# 3533 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 629 "src/Compiler/pars.fsy" +//# 645 "src/Compiler/pars.fsy" [] ) -//# 629 "src/Compiler/pars.fsy" +//# 645 "src/Compiler/pars.fsy" : 'gentype_moduleSpfnsPossiblyEmptyBlock)); -//# 3480 "pars.fs" +//# 3544 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleSpfns in Microsoft.FSharp.Core.Operators.box ( ( -//# 634 "src/Compiler/pars.fsy" +//# 650 "src/Compiler/pars.fsy" _1 ) -//# 634 "src/Compiler/pars.fsy" +//# 650 "src/Compiler/pars.fsy" : 'gentype_moduleSpfnsPossiblyEmpty)); -//# 3491 "pars.fs" +//# 3555 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 637 "src/Compiler/pars.fsy" +//# 653 "src/Compiler/pars.fsy" [] ) -//# 637 "src/Compiler/pars.fsy" +//# 653 "src/Compiler/pars.fsy" : 'gentype_moduleSpfnsPossiblyEmpty)); -//# 3501 "pars.fs" +//# 3565 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 640 "src/Compiler/pars.fsy" +//# 656 "src/Compiler/pars.fsy" [] ) -//# 640 "src/Compiler/pars.fsy" +//# 656 "src/Compiler/pars.fsy" : 'gentype_moduleSpfnsPossiblyEmpty)); -//# 3511 "pars.fs" +//# 3575 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleSpfn in let _2 = parseState.GetInput(2) :?> 'gentype_opt_topSeparators in @@ -3516,58 +3580,58 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 645 "src/Compiler/pars.fsy" +//# 661 "src/Compiler/pars.fsy" _1 :: _3 ) -//# 645 "src/Compiler/pars.fsy" +//# 661 "src/Compiler/pars.fsy" : 'gentype_moduleSpfns)); -//# 3524 "pars.fs" +//# 3588 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_topSeparators in let _3 = parseState.GetInput(3) :?> 'gentype_moduleSpfns in Microsoft.FSharp.Core.Operators.box ( ( -//# 648 "src/Compiler/pars.fsy" +//# 664 "src/Compiler/pars.fsy" (* silent recovery *) _3 ) -//# 648 "src/Compiler/pars.fsy" +//# 664 "src/Compiler/pars.fsy" : 'gentype_moduleSpfns)); -//# 3536 "pars.fs" +//# 3600 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleSpfn in let _2 = parseState.GetInput(2) :?> 'gentype_opt_topSeparators in Microsoft.FSharp.Core.Operators.box ( ( -//# 651 "src/Compiler/pars.fsy" +//# 667 "src/Compiler/pars.fsy" [_1] ) -//# 651 "src/Compiler/pars.fsy" +//# 667 "src/Compiler/pars.fsy" : 'gentype_moduleSpfns)); -//# 3548 "pars.fs" +//# 3612 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hashDirective in Microsoft.FSharp.Core.Operators.box ( ( -//# 656 "src/Compiler/pars.fsy" +//# 672 "src/Compiler/pars.fsy" SynModuleSigDecl.HashDirective(_1, rhs2 parseState 1 1) ) -//# 656 "src/Compiler/pars.fsy" +//# 672 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3559 "pars.fs" +//# 3623 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_valSpfn in Microsoft.FSharp.Core.Operators.box ( ( -//# 659 "src/Compiler/pars.fsy" +//# 675 "src/Compiler/pars.fsy" _1 ) -//# 659 "src/Compiler/pars.fsy" +//# 675 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3570 "pars.fs" +//# 3634 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3577,7 +3641,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 662 "src/Compiler/pars.fsy" +//# 678 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let mModule, isRec, path, vis, attribs2 = _3 if isRec then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsInvalidUseOfRec()) @@ -3591,9 +3655,9 @@ let _fsyacc_reductions = lazy [| let m = unionRanges mModule lid.Range SynModuleSigDecl.ModuleAbbrev(List.head path, lid.LongIdent, m) ) -//# 662 "src/Compiler/pars.fsy" +//# 678 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3596 "pars.fs" +//# 3660 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3603,7 +3667,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 676 "src/Compiler/pars.fsy" +//# 692 "src/Compiler/pars.fsy" let mModule, isRec, path, vis, attribs2 = _3 let xmlDoc = grabXmlDoc(parseState, _1, 1) if not (isSingleton path) then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsModuleDefnMustBeSimpleName()) @@ -3618,9 +3682,9 @@ let _fsyacc_reductions = lazy [| let trivia: SynModuleSigDeclNestedModuleTrivia = { ModuleKeyword = Some mModule; EqualsRange = _4 } SynModuleSigDecl.NestedModule(info, isRec, decls, m, trivia) ) -//# 676 "src/Compiler/pars.fsy" +//# 692 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3623 "pars.fs" +//# 3687 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3628,7 +3692,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 691 "src/Compiler/pars.fsy" +//# 707 "src/Compiler/pars.fsy" let mModule, isRec, path, vis, attribs2 = _3 let xmlDoc = grabXmlDoc(parseState, _1, 1) if not (isSingleton path) then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsModuleDefnMustBeSimpleName()) @@ -3639,9 +3703,9 @@ let _fsyacc_reductions = lazy [| let trivia: SynModuleSigDeclNestedModuleTrivia = { ModuleKeyword = Some mModule; EqualsRange = None } SynModuleSigDecl.NestedModule(info, isRec, [], mWhole, trivia) ) -//# 691 "src/Compiler/pars.fsy" +//# 707 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3644 "pars.fs" +//# 3708 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3651,7 +3715,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 702 "src/Compiler/pars.fsy" +//# 718 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR (Error (FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) let leadingKeyword = SynTypeDefnLeadingKeyword.Type(rhs parseState 3) let (SynTypeDefnSig (SynComponentInfo (cas, a, cs, b, _xmlDoc, d, d2, d3), typeRepr, members, range, trivia)) = _4 leadingKeyword @@ -3666,9 +3730,9 @@ let _fsyacc_reductions = lazy [| let m = (mDefn, _5) ||> unionRangeWithListBy (fun (a: SynTypeDefnSig) -> a.Range) |> unionRanges (rhs parseState 3) SynModuleSigDecl.Types(tc :: _5, m) ) -//# 702 "src/Compiler/pars.fsy" +//# 718 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3671 "pars.fs" +//# 3735 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3676,7 +3740,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 717 "src/Compiler/pars.fsy" +//# 733 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let (SynExceptionSig(SynExceptionDefnRepr(cas, a, b, c, d, d2), withKeyword, members, range)) = _3 let xmlDoc = grabXmlDoc(parseState, _1, 1) @@ -3685,20 +3749,20 @@ let _fsyacc_reductions = lazy [| let synExnDefn = SynExceptionSig(SynExceptionDefnRepr(_1@cas, a, b, xmlDoc, d, mDefnReprWithAttributes), withKeyword, members, mWhole) SynModuleSigDecl.Exception(synExnDefn, mWhole) ) -//# 717 "src/Compiler/pars.fsy" +//# 733 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3690 "pars.fs" +//# 3754 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_openDecl in Microsoft.FSharp.Core.Operators.box ( ( -//# 726 "src/Compiler/pars.fsy" +//# 742 "src/Compiler/pars.fsy" SynModuleSigDecl.Open _1 ) -//# 726 "src/Compiler/pars.fsy" +//# 742 "src/Compiler/pars.fsy" : 'gentype_moduleSpfn)); -//# 3701 "pars.fs" +//# 3765 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -3713,9 +3777,10 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 730 "src/Compiler/pars.fsy" +//# 746 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let attr1, attr2, isInline, isMutable, vis2, id, doc, explicitValTyparDecls, (ty, arity), (mEquals, konst: SynExpr option) = (_1), (_4), (Option.isSome _5), (Option.isSome _6), (_7), (_8), grabXmlDoc(parseState, _1, 1), (_9), (_11), (_12) + let vis2 = SynValSigAccess.Single(vis2) if not (isNil attr2) then errorR(Deprecated(FSComp.SR.parsAttributesMustComeBeforeVal(), rhs parseState 4)) let m = rhs2 parseState 1 11 @@ -3730,31 +3795,31 @@ let _fsyacc_reductions = lazy [| SynModuleSigDecl.Val(valSpfn, m) ) -//# 730 "src/Compiler/pars.fsy" +//# 746 "src/Compiler/pars.fsy" : 'gentype_valSpfn)); -//# 3735 "pars.fs" +//# 3800 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 749 "src/Compiler/pars.fsy" +//# 766 "src/Compiler/pars.fsy" None, None ) -//# 749 "src/Compiler/pars.fsy" +//# 766 "src/Compiler/pars.fsy" : 'gentype_optLiteralValueSpfn)); -//# 3745 "pars.fs" +//# 3810 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 752 "src/Compiler/pars.fsy" +//# 769 "src/Compiler/pars.fsy" let mEquals = rhs parseState 1 Some(mEquals), Some(_2) ) -//# 752 "src/Compiler/pars.fsy" +//# 769 "src/Compiler/pars.fsy" : 'gentype_optLiteralValueSpfn)); -//# 3757 "pars.fs" +//# 3822 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynExpr in let _4 = parseState.GetInput(4) :?> 'gentype_oblockend in @@ -3762,25 +3827,25 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 756 "src/Compiler/pars.fsy" +//# 773 "src/Compiler/pars.fsy" let mEquals = rhs parseState 1 Some(mEquals), Some(_3) ) -//# 756 "src/Compiler/pars.fsy" +//# 773 "src/Compiler/pars.fsy" : 'gentype_optLiteralValueSpfn)); -//# 3771 "pars.fs" +//# 3836 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleSpfns in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 765 "src/Compiler/pars.fsy" +//# 782 "src/Compiler/pars.fsy" _2, None ) -//# 765 "src/Compiler/pars.fsy" +//# 782 "src/Compiler/pars.fsy" : 'gentype_moduleSpecBlock)); -//# 3783 "pars.fs" +//# 3848 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_sigOrBegin in let _3 = parseState.GetInput(3) :?> 'gentype_moduleSpfnsPossiblyEmpty in @@ -3788,33 +3853,33 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 769 "src/Compiler/pars.fsy" +//# 786 "src/Compiler/pars.fsy" let mEnd = rhs parseState 4 _3, Some mEnd ) -//# 769 "src/Compiler/pars.fsy" +//# 786 "src/Compiler/pars.fsy" : 'gentype_moduleSpecBlock)); -//# 3797 "pars.fs" +//# 3862 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sigOrBegin in let _2 = parseState.GetInput(2) :?> 'gentype_moduleSpfnsPossiblyEmpty in Microsoft.FSharp.Core.Operators.box ( ( -//# 774 "src/Compiler/pars.fsy" +//# 791 "src/Compiler/pars.fsy" let mEnd = rhs parseState 3 _2, Some mEnd ) -//# 774 "src/Compiler/pars.fsy" +//# 791 "src/Compiler/pars.fsy" : 'gentype_moduleSpecBlock)); -//# 3810 "pars.fs" +//# 3875 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_tyconSpfn in let _3 = parseState.GetInput(3) :?> SynTypeDefnSig list in Microsoft.FSharp.Core.Operators.box ( ( -//# 780 "src/Compiler/pars.fsy" +//# 797 "src/Compiler/pars.fsy" let xmlDoc = grabXmlDoc(parseState, [], 1) let tyconSpfn = let leadingKeyword = SynTypeDefnLeadingKeyword.And(rhs parseState 1) @@ -3831,40 +3896,40 @@ let _fsyacc_reductions = lazy [| SynTypeDefnSig(componentInfo, typeRepr, members, range, trivia) tyconSpfn :: _3 ) -//# 780 "src/Compiler/pars.fsy" +//# 797 "src/Compiler/pars.fsy" : SynTypeDefnSig list)); -//# 3836 "pars.fs" +//# 3901 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 798 "src/Compiler/pars.fsy" +//# 815 "src/Compiler/pars.fsy" [] ) -//# 798 "src/Compiler/pars.fsy" +//# 815 "src/Compiler/pars.fsy" : SynTypeDefnSig list)); -//# 3846 "pars.fs" +//# 3911 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeNameInfo in let _3 = parseState.GetInput(3) :?> 'gentype_tyconSpfnRhsBlock in Microsoft.FSharp.Core.Operators.box ( ( -//# 804 "src/Compiler/pars.fsy" +//# 821 "src/Compiler/pars.fsy" let mLhs = rhs parseState 1 let mEquals = rhs parseState 2 fun leadingKeyword -> _3 leadingKeyword mLhs _1 (Some mEquals) ) -//# 804 "src/Compiler/pars.fsy" +//# 821 "src/Compiler/pars.fsy" : 'gentype_tyconSpfn)); -//# 3860 "pars.fs" +//# 3925 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeNameInfo in let _2 = parseState.GetInput(2) :?> 'gentype_opt_classSpfn in Microsoft.FSharp.Core.Operators.box ( ( -//# 808 "src/Compiler/pars.fsy" +//# 825 "src/Compiler/pars.fsy" let mWithKwd, members = _2 let (SynComponentInfo(range = range)) = _1 let m = @@ -3879,9 +3944,9 @@ let _fsyacc_reductions = lazy [| let trivia: SynTypeDefnSigTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = None; WithKeyword = mWithKwd } SynTypeDefnSig(_1, SynTypeDefnSigRepr.Simple(SynTypeDefnSimpleRepr.None m, m), members, m, trivia) ) -//# 808 "src/Compiler/pars.fsy" +//# 825 "src/Compiler/pars.fsy" : 'gentype_tyconSpfn)); -//# 3884 "pars.fs" +//# 3949 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_tyconSpfnRhs in let _3 = parseState.GetInput(3) :?> 'gentype_opt_OBLOCKSEP in @@ -3892,51 +3957,51 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 834 "src/Compiler/pars.fsy" +//# 851 "src/Compiler/pars.fsy" let m = lhs parseState (fun leadingKeyword mLhs nameInfo mEquals -> let members = _4 @ (snd _5) _2 leadingKeyword mLhs nameInfo mEquals (checkForMultipleAugmentations m members (snd _7))) ) -//# 834 "src/Compiler/pars.fsy" +//# 851 "src/Compiler/pars.fsy" : 'gentype_tyconSpfnRhsBlock)); -//# 3903 "pars.fs" +//# 3968 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tyconSpfnRhs in let _2 = parseState.GetInput(2) :?> 'gentype_opt_classSpfn in Microsoft.FSharp.Core.Operators.box ( ( -//# 840 "src/Compiler/pars.fsy" +//# 857 "src/Compiler/pars.fsy" let m = lhs parseState (fun leadingKeyword mLhs nameInfo mEquals -> let _, members = _2 _1 leadingKeyword mLhs nameInfo mEquals members) ) -//# 840 "src/Compiler/pars.fsy" +//# 857 "src/Compiler/pars.fsy" : 'gentype_tyconSpfnRhsBlock)); -//# 3918 "pars.fs" +//# 3983 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypeDefnSimpleRepr in Microsoft.FSharp.Core.Operators.box ( ( -//# 849 "src/Compiler/pars.fsy" +//# 866 "src/Compiler/pars.fsy" (fun leadingKeyword mLhs nameInfo mEquals augmentation -> let declRange = unionRanges mLhs _1.Range let mWhole = (declRange, augmentation) ||> unionRangeWithListBy (fun (mem: SynMemberSig) -> mem.Range) let trivia: SynTypeDefnSigTrivia = { LeadingKeyword = leadingKeyword; WithKeyword = None; EqualsRange = mEquals } SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.Simple(_1, _1.Range), augmentation, mWhole, trivia)) ) -//# 849 "src/Compiler/pars.fsy" +//# 866 "src/Compiler/pars.fsy" : 'gentype_tyconSpfnRhs)); -//# 3933 "pars.fs" +//# 3998 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tyconClassSpfn in Microsoft.FSharp.Core.Operators.box ( ( -//# 856 "src/Compiler/pars.fsy" +//# 873 "src/Compiler/pars.fsy" let needsCheck, (kind, decls) = _1 let objectModelRange = match decls with @@ -3952,19 +4017,20 @@ let _fsyacc_reductions = lazy [| let trivia: SynTypeDefnSigTrivia = { LeadingKeyword = leadingKeyword; WithKeyword = None; EqualsRange = mEquals } SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel(kind, decls, objectModelRange), augmentation, mWhole, trivia)) ) -//# 856 "src/Compiler/pars.fsy" +//# 873 "src/Compiler/pars.fsy" : 'gentype_tyconSpfnRhs)); -//# 3957 "pars.fs" +//# 4022 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_topType in Microsoft.FSharp.Core.Operators.box ( ( -//# 874 "src/Compiler/pars.fsy" +//# 891 "src/Compiler/pars.fsy" let m = lhs parseState let ty, arity = _3 let flags = AbstractMemberFlags true SynMemberKind.Member - let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero) + let vis2 = SynValSigAccess.Single(None) + let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, vis2, None, m, SynValSigTrivia.Zero) let invoke = SynMemberSig.Member(valSig, flags, m, SynMemberSigMemberTrivia.Zero) (fun leadingKeyword nameRange nameInfo mEquals augmentation -> if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) @@ -3972,33 +4038,33 @@ let _fsyacc_reductions = lazy [| let trivia: SynTypeDefnSigTrivia = { LeadingKeyword = leadingKeyword; WithKeyword = None; EqualsRange = mEquals } SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel(SynTypeDefnKind.Delegate(ty, arity), [invoke], m), [], mWhole, trivia)) ) -//# 874 "src/Compiler/pars.fsy" +//# 891 "src/Compiler/pars.fsy" : 'gentype_tyconSpfnRhs)); -//# 3977 "pars.fs" +//# 4043 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classSpfnBlockKindUnspecified in Microsoft.FSharp.Core.Operators.box ( ( -//# 889 "src/Compiler/pars.fsy" +//# 908 "src/Compiler/pars.fsy" let needsCheck, decls = _1 needsCheck, (SynTypeDefnKind.Unspecified, decls) ) -//# 889 "src/Compiler/pars.fsy" +//# 908 "src/Compiler/pars.fsy" : 'gentype_tyconClassSpfn)); -//# 3989 "pars.fs" +//# 4055 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classOrInterfaceOrStruct in let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnBlock in Microsoft.FSharp.Core.Operators.box ( ( -//# 893 "src/Compiler/pars.fsy" +//# 912 "src/Compiler/pars.fsy" false, (_1, _2) ) -//# 893 "src/Compiler/pars.fsy" +//# 912 "src/Compiler/pars.fsy" : 'gentype_tyconClassSpfn)); -//# 4001 "pars.fs" +//# 4067 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classOrInterfaceOrStruct in let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnBlock in @@ -4006,130 +4072,130 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 896 "src/Compiler/pars.fsy" +//# 915 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedClassInterfaceOrStruct()) false, (_1, _2) ) -//# 896 "src/Compiler/pars.fsy" +//# 915 "src/Compiler/pars.fsy" : 'gentype_tyconClassSpfn)); -//# 4015 "pars.fs" +//# 4081 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classOrInterfaceOrStruct in Microsoft.FSharp.Core.Operators.box ( ( -//# 900 "src/Compiler/pars.fsy" +//# 919 "src/Compiler/pars.fsy" // silent recovery false, (_1, []) ) -//# 900 "src/Compiler/pars.fsy" +//# 919 "src/Compiler/pars.fsy" : 'gentype_tyconClassSpfn)); -//# 4027 "pars.fs" +//# 4093 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnMembers in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 907 "src/Compiler/pars.fsy" +//# 926 "src/Compiler/pars.fsy" true, _2 ) -//# 907 "src/Compiler/pars.fsy" +//# 926 "src/Compiler/pars.fsy" : 'gentype_classSpfnBlockKindUnspecified)); -//# 4039 "pars.fs" +//# 4105 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnMembers in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 910 "src/Compiler/pars.fsy" +//# 929 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileTypeSignature()) false, _2 ) -//# 910 "src/Compiler/pars.fsy" +//# 929 "src/Compiler/pars.fsy" : 'gentype_classSpfnBlockKindUnspecified)); -//# 4052 "pars.fs" +//# 4118 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnBlock in Microsoft.FSharp.Core.Operators.box ( ( -//# 915 "src/Compiler/pars.fsy" +//# 934 "src/Compiler/pars.fsy" false, _2 ) -//# 915 "src/Compiler/pars.fsy" +//# 934 "src/Compiler/pars.fsy" : 'gentype_classSpfnBlockKindUnspecified)); -//# 4063 "pars.fs" +//# 4129 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnBlock in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 918 "src/Compiler/pars.fsy" +//# 937 "src/Compiler/pars.fsy" false, _2 ) -//# 918 "src/Compiler/pars.fsy" +//# 937 "src/Compiler/pars.fsy" : 'gentype_classSpfnBlockKindUnspecified)); -//# 4075 "pars.fs" +//# 4141 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnMembers in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 924 "src/Compiler/pars.fsy" +//# 943 "src/Compiler/pars.fsy" _2 ) -//# 924 "src/Compiler/pars.fsy" +//# 943 "src/Compiler/pars.fsy" : 'gentype_classSpfnBlock)); -//# 4087 "pars.fs" +//# 4153 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnMembers in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 927 "src/Compiler/pars.fsy" +//# 946 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileTypeSignature()) _2 ) -//# 927 "src/Compiler/pars.fsy" +//# 946 "src/Compiler/pars.fsy" : 'gentype_classSpfnBlock)); -//# 4100 "pars.fs" +//# 4166 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classSpfnMembers in Microsoft.FSharp.Core.Operators.box ( ( -//# 930 "src/Compiler/pars.fsy" +//# 949 "src/Compiler/pars.fsy" _1 ) -//# 930 "src/Compiler/pars.fsy" +//# 949 "src/Compiler/pars.fsy" : 'gentype_classSpfnBlock)); -//# 4111 "pars.fs" +//# 4177 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classSpfnMembersAtLeastOne in Microsoft.FSharp.Core.Operators.box ( ( -//# 935 "src/Compiler/pars.fsy" +//# 954 "src/Compiler/pars.fsy" _1 ) -//# 935 "src/Compiler/pars.fsy" +//# 954 "src/Compiler/pars.fsy" : 'gentype_classSpfnMembers)); -//# 4122 "pars.fs" +//# 4188 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 938 "src/Compiler/pars.fsy" +//# 957 "src/Compiler/pars.fsy" [] ) -//# 938 "src/Compiler/pars.fsy" +//# 957 "src/Compiler/pars.fsy" : 'gentype_classSpfnMembers)); -//# 4132 "pars.fs" +//# 4198 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classMemberSpfn in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in @@ -4137,12 +4203,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 944 "src/Compiler/pars.fsy" +//# 963 "src/Compiler/pars.fsy" _1 :: _3 ) -//# 944 "src/Compiler/pars.fsy" +//# 963 "src/Compiler/pars.fsy" : 'gentype_classSpfnMembersAtLeastOne)); -//# 4145 "pars.fs" +//# 4211 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4157,10 +4223,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 950 "src/Compiler/pars.fsy" +//# 969 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let isInline, doc, vis2, id, explicitValTyparDecls, (ty, arity), (mEquals, optLiteralValue) = (Option.isSome _4), grabXmlDoc(parseState, _1, 1), _5, _6, _7, _9, _11 - let mWith, (getSet, getSetRangeOpt) = _10 + let mWith, (getSet, getSetRangeOpt, getterAccess, setterAccess) = _10 + let vis2 = + match getterAccess, setterAccess with + | None, None -> SynValSigAccess.Single(vis2) + | _ -> SynValSigAccess.GetSet(vis2, getterAccess, setterAccess) let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet let mWhole = let m = rhs parseState 3 @@ -4173,45 +4243,49 @@ let _fsyacc_reductions = lazy [| match optLiteralValue with | None -> m | Some e -> unionRanges m e.Range + let flags, leadingKeyword = _3 + if leadingKeywordIsAbstract leadingKeyword then + [ _2; _5; getterAccess; setterAccess ] + |> List.iter (function None -> () | Some access -> errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), access.Range))) let flags = flags (getSetAdjuster arity) let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = _4; WithKeyword = mWith; EqualsRange = mEquals } let valSpfn = SynValSig(_1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWhole, trivia) let trivia: SynMemberSigMemberTrivia = { GetSetKeywords = getSetRangeOpt } SynMemberSig.Member(valSpfn, flags, mWhole, trivia) ) -//# 950 "src/Compiler/pars.fsy" +//# 969 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4185 "pars.fs" +//# 4259 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in let _3 = parseState.GetInput(3) :?> 'gentype_interfaceMember in - let _4 = parseState.GetInput(4) :?> 'gentype_appType in + let _4 = parseState.GetInput(4) :?> 'gentype_appTypeWithoutNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 974 "src/Compiler/pars.fsy" +//# 1002 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) SynMemberSig.Interface(_4, unionRanges (rhs parseState 3) (_4).Range) ) -//# 974 "src/Compiler/pars.fsy" +//# 1002 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4200 "pars.fs" +//# 4274 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in - let _4 = parseState.GetInput(4) :?> 'gentype_appType in + let _4 = parseState.GetInput(4) :?> 'gentype_appTypeWithoutNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 978 "src/Compiler/pars.fsy" +//# 1006 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR (Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) SynMemberSig.Inherit(_4, unionRanges (rhs parseState 1) _4.Range) ) -//# 978 "src/Compiler/pars.fsy" +//# 1006 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4214 "pars.fs" +//# 4288 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4219,15 +4293,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 982 "src/Compiler/pars.fsy" +//# 1010 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR (Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) let mInherit = rhs parseState 3 let ty = SynType.FromParseError(mInherit.EndRange) SynMemberSig.Inherit(ty, unionRanges (rhs parseState 1) mInherit) ) -//# 982 "src/Compiler/pars.fsy" +//# 1010 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4230 "pars.fs" +//# 4304 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4235,7 +4309,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 988 "src/Compiler/pars.fsy" +//# 1016 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR (Error (FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) let mStart = rhs parseState 1 @@ -4244,9 +4318,9 @@ let _fsyacc_reductions = lazy [| let (SynField(xmlDoc = xmlDoc; range = range)) as field = _4 _1 None mStart leadingKeyword SynMemberSig.ValField(field, range) ) -//# 988 "src/Compiler/pars.fsy" +//# 1016 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4249 "pars.fs" +//# 4323 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4254,7 +4328,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 997 "src/Compiler/pars.fsy" +//# 1025 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR (Error (FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) let mStart = rhs parseState 1 @@ -4264,9 +4338,9 @@ let _fsyacc_reductions = lazy [| let (SynField(xmlDoc = xmlDoc; range = range)) as field = _5 _1 (Some mStatic) mStart leadingKeyword SynMemberSig.ValField(field, range) ) -//# 997 "src/Compiler/pars.fsy" +//# 1025 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4269 "pars.fs" +//# 4343 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4275,14 +4349,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1007 "src/Compiler/pars.fsy" +//# 1035 "src/Compiler/pars.fsy" let leadingKeyword = SynTypeDefnLeadingKeyword.StaticType(rhs parseState 3, rhs parseState 4) if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) SynMemberSig.NestedType(_5 leadingKeyword, rhs2 parseState 1 5) ) -//# 1007 "src/Compiler/pars.fsy" +//# 1035 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4285 "pars.fs" +//# 4359 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4290,245 +4364,250 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1012 "src/Compiler/pars.fsy" +//# 1040 "src/Compiler/pars.fsy" let vis, doc, (ty, valSynInfo) = _2, grabXmlDoc(parseState, _1, 1), _5 + let vis2 = SynValSigAccess.Single(vis) let mNew = rhs parseState 3 let m = unionRanges (rhs parseState 1) ty.Range |> unionRangeWithXmlDoc doc let isInline = false let trivia: SynValSigTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; WithKeyword = None; EqualsRange = None } - let valSpfn = SynValSig (_1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, m, trivia) + let valSpfn = SynValSig (_1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, valSynInfo, isInline, false, doc, vis2, None, m, trivia) SynMemberSig.Member(valSpfn, CtorMemberFlags, m, SynMemberSigMemberTrivia.Zero) ) -//# 1012 "src/Compiler/pars.fsy" +//# 1040 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfn)); -//# 4304 "pars.fs" +//# 4379 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1024 "src/Compiler/pars.fsy" - None, (SynMemberKind.Member, None) +//# 1053 "src/Compiler/pars.fsy" + None, (SynMemberKind.Member, None, None, None) ) -//# 1024 "src/Compiler/pars.fsy" +//# 1053 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSet)); -//# 4314 "pars.fs" +//# 4389 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classMemberSpfnGetSetElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 1027 "src/Compiler/pars.fsy" +//# 1056 "src/Compiler/pars.fsy" let mWith = rhs parseState 1 Some mWith, _2 ) -//# 1027 "src/Compiler/pars.fsy" +//# 1056 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSet)); -//# 4326 "pars.fs" +//# 4401 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classMemberSpfnGetSetElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 1031 "src/Compiler/pars.fsy" +//# 1060 "src/Compiler/pars.fsy" let mWith = rhs parseState 1 Some mWith, _2 ) -//# 1031 "src/Compiler/pars.fsy" +//# 1060 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSet)); -//# 4338 "pars.fs" +//# 4413 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classMemberSpfnGetSetElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 1035 "src/Compiler/pars.fsy" +//# 1064 "src/Compiler/pars.fsy" let mWith = rhs parseState 1 reportParseErrorAt mWith (FSComp.SR.parsUnmatchedWith()) Some mWith, _2 ) -//# 1035 "src/Compiler/pars.fsy" +//# 1064 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSet)); -//# 4351 "pars.fs" +//# 4426 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_nameop in + let _1 = parseState.GetInput(1) :?> 'gentype_opt_access in + let _2 = parseState.GetInput(2) :?> 'gentype_nameop in Microsoft.FSharp.Core.Operators.box ( ( -//# 1043 "src/Compiler/pars.fsy" - (let (SynIdent(id:Ident, _)) = _1 +//# 1072 "src/Compiler/pars.fsy" + (let (SynIdent(id:Ident, _)) = _2 if id.idText = "get" then - SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange) + SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange), _1, None else if id.idText = "set" then - SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange) + SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange), None, _1 else raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) ) -//# 1043 "src/Compiler/pars.fsy" +//# 1072 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSetElements)); -//# 4368 "pars.fs" +//# 4444 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_nameop in - let _3 = parseState.GetInput(3) :?> 'gentype_nameop in + let _1 = parseState.GetInput(1) :?> 'gentype_opt_access in + let _2 = parseState.GetInput(2) :?> 'gentype_nameop in + let _4 = parseState.GetInput(4) :?> 'gentype_opt_access in + let _5 = parseState.GetInput(5) :?> 'gentype_nameop in Microsoft.FSharp.Core.Operators.box ( ( -//# 1052 "src/Compiler/pars.fsy" - let (SynIdent(id, _)) = _1 - let (SynIdent(id2, _)) = _3 +//# 1081 "src/Compiler/pars.fsy" + let (SynIdent(id, _)) = _2 + let (SynIdent(id2, _)) = _5 if not ((id.idText = "get" && id2.idText = "set") || (id.idText = "set" && id2.idText = "get")) then raiseParseErrorAt (rhs2 parseState 1 3) (FSComp.SR.parsGetOrSetRequired()) if id.idText = "get" then - SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id.idRange, id2.idRange)) + SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id.idRange, id2.idRange)), _1, _4 else - SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id2.idRange, id.idRange)) + SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id2.idRange, id.idRange)), _4, _1 ) -//# 1052 "src/Compiler/pars.fsy" +//# 1081 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSetElements)); -//# 4388 "pars.fs" +//# 4466 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_nameop in - let _3 = parseState.GetInput(3) :?> 'gentype_recover in + let _1 = parseState.GetInput(1) :?> 'gentype_opt_access in + let _2 = parseState.GetInput(2) :?> 'gentype_nameop in + let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1064 "src/Compiler/pars.fsy" - (let (SynIdent(id:Ident, _)) = _1 +//# 1093 "src/Compiler/pars.fsy" + (let (SynIdent(id:Ident, _)) = _2 if id.idText = "get" then - SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange) + SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange), _1, None else if id.idText = "set" then - SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange) + SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange), None, _1 else - raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) + raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsGetOrSetRequired())) ) -//# 1064 "src/Compiler/pars.fsy" +//# 1093 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSetElements)); -//# 4406 "pars.fs" +//# 4485 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_oblockend in let _3 = parseState.GetInput(3) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 1073 "src/Compiler/pars.fsy" +//# 1102 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsIdentifierExpected()) - SynMemberKind.Member, None + SynMemberKind.Member, None, None, None ) -//# 1073 "src/Compiler/pars.fsy" +//# 1102 "src/Compiler/pars.fsy" : 'gentype_classMemberSpfnGetSetElements)); -//# 4419 "pars.fs" +//# 4498 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_memberFlags in Microsoft.FSharp.Core.Operators.box ( ( -//# 1077 "src/Compiler/pars.fsy" +//# 1106 "src/Compiler/pars.fsy" _1 ) -//# 1077 "src/Compiler/pars.fsy" +//# 1106 "src/Compiler/pars.fsy" : 'gentype_memberSpecFlags)); -//# 4430 "pars.fs" +//# 4509 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_abstractMemberFlags in Microsoft.FSharp.Core.Operators.box ( ( -//# 1078 "src/Compiler/pars.fsy" +//# 1107 "src/Compiler/pars.fsy" _1 ) -//# 1078 "src/Compiler/pars.fsy" +//# 1107 "src/Compiler/pars.fsy" : 'gentype_memberSpecFlags)); -//# 4441 "pars.fs" +//# 4520 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExceptionDefnRepr in let _2 = parseState.GetInput(2) :?> 'gentype_opt_classSpfn in Microsoft.FSharp.Core.Operators.box ( ( -//# 1084 "src/Compiler/pars.fsy" +//# 1113 "src/Compiler/pars.fsy" let mWithKwd, members = _2 SynExceptionSig(_1, mWithKwd, members, lhs parseState) ) -//# 1084 "src/Compiler/pars.fsy" +//# 1113 "src/Compiler/pars.fsy" : 'gentype_exconSpfn)); -//# 4454 "pars.fs" +//# 4533 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classSpfnBlock in let _3 = parseState.GetInput(3) :?> 'gentype_declEnd in Microsoft.FSharp.Core.Operators.box ( ( -//# 1091 "src/Compiler/pars.fsy" +//# 1120 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 (Some mWithKwd), _2 ) -//# 1091 "src/Compiler/pars.fsy" +//# 1120 "src/Compiler/pars.fsy" : 'gentype_opt_classSpfn)); -//# 4467 "pars.fs" +//# 4546 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1095 "src/Compiler/pars.fsy" +//# 1124 "src/Compiler/pars.fsy" None, [] ) -//# 1095 "src/Compiler/pars.fsy" +//# 1124 "src/Compiler/pars.fsy" : 'gentype_opt_classSpfn)); -//# 4477 "pars.fs" +//# 4556 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceImpls in let _2 = parseState.GetInput(2) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 1104 "src/Compiler/pars.fsy" +//# 1133 "src/Compiler/pars.fsy" checkEndOfFileError _2; _1 ) -//# 1104 "src/Compiler/pars.fsy" +//# 1133 "src/Compiler/pars.fsy" : ParsedImplFile)); -//# 4489 "pars.fs" +//# 4568 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceImpls in let _3 = parseState.GetInput(3) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 1107 "src/Compiler/pars.fsy" +//# 1136 "src/Compiler/pars.fsy" _1 ) -//# 1107 "src/Compiler/pars.fsy" +//# 1136 "src/Compiler/pars.fsy" : ParsedImplFile)); -//# 4501 "pars.fs" +//# 4580 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 1113 "src/Compiler/pars.fsy" +//# 1142 "src/Compiler/pars.fsy" let emptyImplFileFrag = ParsedImplFileFragment.AnonModule([], rhs parseState 1) ParsedImplFile ([], [emptyImplFileFrag]) ) -//# 1113 "src/Compiler/pars.fsy" +//# 1142 "src/Compiler/pars.fsy" : ParsedImplFile)); -//# 4513 "pars.fs" +//# 4592 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileModuleImpl in Microsoft.FSharp.Core.Operators.box ( ( -//# 1120 "src/Compiler/pars.fsy" +//# 1149 "src/Compiler/pars.fsy" ParsedImplFile ([], [ (_1 (None, false, [], PreXmlDoc.Empty)) ]) ) -//# 1120 "src/Compiler/pars.fsy" +//# 1149 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceImpls)); -//# 4524 "pars.fs" +//# 4603 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileModuleImpl in let _2 = parseState.GetInput(2) :?> 'gentype_fileNamespaceImplList in Microsoft.FSharp.Core.Operators.box ( ( -//# 1123 "src/Compiler/pars.fsy" +//# 1152 "src/Compiler/pars.fsy" // If there are namespaces, the first fileModuleImpl may only contain # directives let decls = match (_1 (None, false, [], PreXmlDoc.Empty)) with @@ -4544,32 +4623,32 @@ let _fsyacc_reductions = lazy [| []) ParsedImplFile (decls, _2) ) -//# 1123 "src/Compiler/pars.fsy" +//# 1152 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceImpls)); -//# 4549 "pars.fs" +//# 4628 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceImpl in let _2 = parseState.GetInput(2) :?> 'gentype_fileNamespaceImplList in Microsoft.FSharp.Core.Operators.box ( ( -//# 1142 "src/Compiler/pars.fsy" +//# 1171 "src/Compiler/pars.fsy" _1 :: _2 ) -//# 1142 "src/Compiler/pars.fsy" +//# 1171 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceImplList)); -//# 4561 "pars.fs" +//# 4640 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_fileNamespaceImpl in Microsoft.FSharp.Core.Operators.box ( ( -//# 1145 "src/Compiler/pars.fsy" +//# 1174 "src/Compiler/pars.fsy" [_1] ) -//# 1145 "src/Compiler/pars.fsy" +//# 1174 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceImplList)); -//# 4572 "pars.fs" +//# 4651 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_namespaceIntro in let _2 = parseState.GetInput(2) :?> 'gentype_deprecated_opt_equals in @@ -4577,13 +4656,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1151 "src/Compiler/pars.fsy" +//# 1180 "src/Compiler/pars.fsy" let mNamespace, isRec, path, xml = _1 _3 (Some mNamespace, isRec, path, xml) ) -//# 1151 "src/Compiler/pars.fsy" +//# 1180 "src/Compiler/pars.fsy" : 'gentype_fileNamespaceImpl)); -//# 4586 "pars.fs" +//# 4665 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4592,7 +4671,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1158 "src/Compiler/pars.fsy" +//# 1187 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let m2 = rhs parseState 3 let mDeclsAndAttrs = (List.map (fun (a: SynAttributeList) -> a.Range) _1) @ (List.map (fun (d: SynModuleDecl) -> d.Range) _4) @@ -4605,15 +4684,15 @@ let _fsyacc_reductions = lazy [| let trivia: SynModuleOrNamespaceTrivia = { LeadingKeyword = SynModuleOrNamespaceLeadingKeyword.Module mModule } ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, (isRec || isRec2), SynModuleOrNamespaceKind.NamedModule, _4, xmlDoc, _1@attribs2, vis, m, trivia))) ) -//# 1158 "src/Compiler/pars.fsy" +//# 1187 "src/Compiler/pars.fsy" : 'gentype_fileModuleImpl)); -//# 4610 "pars.fs" +//# 4689 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynModuleDecl list in Microsoft.FSharp.Core.Operators.box ( ( -//# 1171 "src/Compiler/pars.fsy" +//# 1200 "src/Compiler/pars.fsy" let m = (rhs parseState 1) (fun (mNamespaceOpt, isRec, path, xml) -> match path, mNamespaceOpt with @@ -4628,9 +4707,9 @@ let _fsyacc_reductions = lazy [| | Some mNamespace -> { LeadingKeyword = SynModuleOrNamespaceLeadingKeyword.Namespace mNamespace } ParsedImplFileFragment.NamespaceFragment(path, isRec, SynModuleOrNamespaceKind.DeclaredNamespace, _1, PreXmlDoc.Empty, [], m, trivia)) ) -//# 1171 "src/Compiler/pars.fsy" +//# 1200 "src/Compiler/pars.fsy" : 'gentype_fileModuleImpl)); -//# 4633 "pars.fs" +//# 4712 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleDefnsOrExprPossiblyEmpty in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in @@ -4638,69 +4717,69 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1189 "src/Compiler/pars.fsy" +//# 1218 "src/Compiler/pars.fsy" _2 ) -//# 1189 "src/Compiler/pars.fsy" +//# 1218 "src/Compiler/pars.fsy" : SynModuleDecl list)); -//# 4646 "pars.fs" +//# 4725 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleDefnsOrExprPossiblyEmpty in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1192 "src/Compiler/pars.fsy" +//# 1221 "src/Compiler/pars.fsy" // The lex filter ensures we can only get a mismatch in OBLOCKBEGIN/OBLOCKEND tokens if there was some other kind of error, hence we don't need to report this error // reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnClosedBlockInHashLight()) _2 ) -//# 1192 "src/Compiler/pars.fsy" +//# 1221 "src/Compiler/pars.fsy" : SynModuleDecl list)); -//# 4660 "pars.fs" +//# 4739 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1197 "src/Compiler/pars.fsy" +//# 1226 "src/Compiler/pars.fsy" [] ) -//# 1197 "src/Compiler/pars.fsy" +//# 1226 "src/Compiler/pars.fsy" : SynModuleDecl list)); -//# 4671 "pars.fs" +//# 4750 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefnsOrExprPossiblyEmpty in Microsoft.FSharp.Core.Operators.box ( ( -//# 1200 "src/Compiler/pars.fsy" +//# 1229 "src/Compiler/pars.fsy" _1 ) -//# 1200 "src/Compiler/pars.fsy" +//# 1229 "src/Compiler/pars.fsy" : SynModuleDecl list)); -//# 4682 "pars.fs" +//# 4761 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefnsOrExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 1206 "src/Compiler/pars.fsy" +//# 1235 "src/Compiler/pars.fsy" _1 ) -//# 1206 "src/Compiler/pars.fsy" +//# 1235 "src/Compiler/pars.fsy" : 'gentype_moduleDefnsOrExprPossiblyEmpty)); -//# 4693 "pars.fs" +//# 4772 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1209 "src/Compiler/pars.fsy" +//# 1238 "src/Compiler/pars.fsy" [] ) -//# 1209 "src/Compiler/pars.fsy" +//# 1238 "src/Compiler/pars.fsy" : 'gentype_moduleDefnsOrExprPossiblyEmpty)); -//# 4703 "pars.fs" +//# 4782 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4710,16 +4789,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1216 "src/Compiler/pars.fsy" +//# 1245 "src/Compiler/pars.fsy" match _2 with | Some vis -> errorR(Error(FSComp.SR.parsUnexpectedVisibilityDeclaration(vis.ToString()), rhs parseState 3)) | _ -> () let attrDecls = if not (isNil _1) then [ SynModuleDecl.Attributes(_1, rangeOfNonNilAttrs _1) ] else [] attrDecls @ mkSynExprDecl _3 :: _5 ) -//# 1216 "src/Compiler/pars.fsy" +//# 1245 "src/Compiler/pars.fsy" : 'gentype_moduleDefnsOrExpr)); -//# 4722 "pars.fs" +//# 4801 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4728,16 +4807,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1223 "src/Compiler/pars.fsy" +//# 1252 "src/Compiler/pars.fsy" match _2 with | Some vis -> errorR(Error(FSComp.SR.parsUnexpectedVisibilityDeclaration(vis.ToString()), rhs parseState 3)) | _ -> () let attrDecls = if not (isNil _1) then [ SynModuleDecl.Attributes(_1, rangeOfNonNilAttrs _1) ] else [] attrDecls @ [ mkSynExprDecl _3 ] ) -//# 1223 "src/Compiler/pars.fsy" +//# 1252 "src/Compiler/pars.fsy" : 'gentype_moduleDefnsOrExpr)); -//# 4740 "pars.fs" +//# 4819 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4745,50 +4824,50 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1230 "src/Compiler/pars.fsy" +//# 1259 "src/Compiler/pars.fsy" match _2 with | Some vis -> errorR(Error(FSComp.SR.parsUnexpectedVisibilityDeclaration(vis.ToString()), rhs parseState 3)) | _ -> () let attrDecls = if not (isNil _1) then [ SynModuleDecl.Attributes(_1, rangeOfNonNilAttrs _1) ] else [] attrDecls @ [ mkSynExprDecl _3 ] ) -//# 1230 "src/Compiler/pars.fsy" +//# 1259 "src/Compiler/pars.fsy" : 'gentype_moduleDefnsOrExpr)); -//# 4757 "pars.fs" +//# 4836 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefns in Microsoft.FSharp.Core.Operators.box ( ( -//# 1237 "src/Compiler/pars.fsy" +//# 1266 "src/Compiler/pars.fsy" _1 ) -//# 1237 "src/Compiler/pars.fsy" +//# 1266 "src/Compiler/pars.fsy" : 'gentype_moduleDefnsOrExpr)); -//# 4768 "pars.fs" +//# 4847 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in Microsoft.FSharp.Core.Operators.box ( ( -//# 1240 "src/Compiler/pars.fsy" +//# 1269 "src/Compiler/pars.fsy" if not (isNil _1) then [ SynModuleDecl.Attributes(_1, rangeOfNonNilAttrs _1) ] else [] ) -//# 1240 "src/Compiler/pars.fsy" +//# 1269 "src/Compiler/pars.fsy" : 'gentype_moduleDefnsOrExpr)); -//# 4779 "pars.fs" +//# 4858 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefnOrDirective in let _2 = parseState.GetInput(2) :?> 'gentype_moduleDefns in Microsoft.FSharp.Core.Operators.box ( ( -//# 1246 "src/Compiler/pars.fsy" +//# 1275 "src/Compiler/pars.fsy" _1 @ _2 ) -//# 1246 "src/Compiler/pars.fsy" +//# 1275 "src/Compiler/pars.fsy" : 'gentype_moduleDefns)); -//# 4791 "pars.fs" +//# 4870 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefnOrDirective in let _2 = parseState.GetInput(2) :?> 'gentype_topSeparators in @@ -4796,69 +4875,69 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1249 "src/Compiler/pars.fsy" +//# 1278 "src/Compiler/pars.fsy" _1 @ _3 ) -//# 1249 "src/Compiler/pars.fsy" +//# 1278 "src/Compiler/pars.fsy" : 'gentype_moduleDefns)); -//# 4804 "pars.fs" +//# 4883 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefnOrDirective in Microsoft.FSharp.Core.Operators.box ( ( -//# 1252 "src/Compiler/pars.fsy" +//# 1281 "src/Compiler/pars.fsy" _1 ) -//# 1252 "src/Compiler/pars.fsy" +//# 1281 "src/Compiler/pars.fsy" : 'gentype_moduleDefns)); -//# 4815 "pars.fs" +//# 4894 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefnOrDirective in let _2 = parseState.GetInput(2) :?> 'gentype_topSeparators in Microsoft.FSharp.Core.Operators.box ( ( -//# 1255 "src/Compiler/pars.fsy" +//# 1284 "src/Compiler/pars.fsy" _1 ) -//# 1255 "src/Compiler/pars.fsy" +//# 1284 "src/Compiler/pars.fsy" : 'gentype_moduleDefns)); -//# 4827 "pars.fs" +//# 4906 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_topSeparators in let _3 = parseState.GetInput(3) :?> 'gentype_moduleDefnsOrExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 1258 "src/Compiler/pars.fsy" +//# 1287 "src/Compiler/pars.fsy" _3 ) -//# 1258 "src/Compiler/pars.fsy" +//# 1287 "src/Compiler/pars.fsy" : 'gentype_moduleDefns)); -//# 4839 "pars.fs" +//# 4918 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleDefn in Microsoft.FSharp.Core.Operators.box ( ( -//# 1264 "src/Compiler/pars.fsy" +//# 1293 "src/Compiler/pars.fsy" _1 ) -//# 1264 "src/Compiler/pars.fsy" +//# 1293 "src/Compiler/pars.fsy" : 'gentype_moduleDefnOrDirective)); -//# 4850 "pars.fs" +//# 4929 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hashDirective in Microsoft.FSharp.Core.Operators.box ( ( -//# 1267 "src/Compiler/pars.fsy" +//# 1296 "src/Compiler/pars.fsy" [ SynModuleDecl.HashDirective(_1, rhs2 parseState 1 1) ] ) -//# 1267 "src/Compiler/pars.fsy" +//# 1296 "src/Compiler/pars.fsy" : 'gentype_moduleDefnOrDirective)); -//# 4861 "pars.fs" +//# 4940 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4866,15 +4945,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1276 "src/Compiler/pars.fsy" +//# 1305 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) - parseState.ResetSynArgNameGenerator() + (getSynArgNameGenerator parseState.LexBuffer).Reset() let (BindingSetPreAttrs(_, _, _, _, mWhole)) = _3 mkDefnBindings (mWhole, _3, _1, _2, mWhole) ) -//# 1276 "src/Compiler/pars.fsy" +//# 1305 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 4877 "pars.fs" +//# 4956 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4882,15 +4961,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1283 "src/Compiler/pars.fsy" +//# 1312 "src/Compiler/pars.fsy" let hwlb, m, _ = _3 if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) - parseState.ResetSynArgNameGenerator() + (getSynArgNameGenerator parseState.LexBuffer).Reset() mkDefnBindings (m, hwlb, _1, _2, m) ) -//# 1283 "src/Compiler/pars.fsy" +//# 1312 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 4893 "pars.fs" +//# 4972 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4898,14 +4977,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1290 "src/Compiler/pars.fsy" +//# 1319 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let mWhole = rhs parseState 3 mkDefnBindings (mWhole, _3, _1, _2, mWhole) ) -//# 1290 "src/Compiler/pars.fsy" +//# 1319 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 4908 "pars.fs" +//# 4987 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4915,7 +4994,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1296 "src/Compiler/pars.fsy" +//# 1325 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let xmlDoc = grabXmlDoc(parseState, _1, 1) let leadingKeyword = SynTypeDefnLeadingKeyword.Type(rhs parseState 3) @@ -4927,9 +5006,9 @@ let _fsyacc_reductions = lazy [| let types = tc :: _5 [ SynModuleDecl.Types(types, (rhs parseState 3, types) ||> unionRangeWithListBy (fun t -> t.Range)) ] ) -//# 1296 "src/Compiler/pars.fsy" +//# 1325 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 4932 "pars.fs" +//# 5011 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4937,7 +5016,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1309 "src/Compiler/pars.fsy" +//# 1338 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let (SynExceptionDefn(SynExceptionDefnRepr(cas, a, b, c, d, d2), withKeyword, e, f)) = _3 let xmlDoc = grabXmlDoc(parseState, _1, 1) @@ -4946,9 +5025,9 @@ let _fsyacc_reductions = lazy [| let synExnDefn = SynExceptionDefn(SynExceptionDefnRepr(_1@cas, a, b, xmlDoc, d, defnReprRange), withKeyword, e, mWhole) [ SynModuleDecl.Exception(synExnDefn, mWhole) ] ) -//# 1309 "src/Compiler/pars.fsy" +//# 1338 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 4951 "pars.fs" +//# 5030 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4957,7 +5036,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1319 "src/Compiler/pars.fsy" +//# 1348 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let attribs, (mModule, isRec, path, vis, attribs2) = _1, _3 let xmlDoc = grabXmlDoc(parseState, _1, 1) @@ -4984,9 +5063,9 @@ let _fsyacc_reductions = lazy [| let m = match mEndOpt with | None -> m | Some mEnd -> unionRanges m mEnd [ SynModuleDecl.NestedModule(info, isRec, def, false, m, trivia) ] ) -//# 1319 "src/Compiler/pars.fsy" +//# 1348 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 4989 "pars.fs" +//# 5068 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -4994,7 +5073,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1347 "src/Compiler/pars.fsy" +//# 1376 "src/Compiler/pars.fsy" let xmlDoc = grabXmlDoc(parseState, _1, 1) let mWhole = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc let attribs, (mModule, isRec, path, vis, attribs2) = _1, _3 @@ -5002,140 +5081,140 @@ let _fsyacc_reductions = lazy [| let trivia: SynModuleDeclNestedModuleTrivia = { ModuleKeyword = Some mModule; EqualsRange = None } [ SynModuleDecl.NestedModule(info, isRec, [], false, mWhole, trivia) ] ) -//# 1347 "src/Compiler/pars.fsy" +//# 1376 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 5007 "pars.fs" +//# 5086 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1356 "src/Compiler/pars.fsy" +//# 1385 "src/Compiler/pars.fsy" errorR(Error(FSComp.SR.parsAttributeOnIncompleteCode(), rhs parseState 1)) [ SynModuleDecl.Attributes(_1, rhs parseState 1) ] ) -//# 1356 "src/Compiler/pars.fsy" +//# 1385 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 5020 "pars.fs" +//# 5099 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_openDecl in Microsoft.FSharp.Core.Operators.box ( ( -//# 1361 "src/Compiler/pars.fsy" +//# 1390 "src/Compiler/pars.fsy" [ SynModuleDecl.Open _1 ] ) -//# 1361 "src/Compiler/pars.fsy" +//# 1390 "src/Compiler/pars.fsy" : 'gentype_moduleDefn)); -//# 5031 "pars.fs" +//# 5110 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 1365 "src/Compiler/pars.fsy" +//# 1394 "src/Compiler/pars.fsy" let mOpen = rhs parseState 1 let mPath = _2.Range SynOpenDeclTarget.ModuleOrNamespace(_2, mPath), unionRanges mOpen mPath ) -//# 1365 "src/Compiler/pars.fsy" +//# 1394 "src/Compiler/pars.fsy" : 'gentype_openDecl)); -//# 5044 "pars.fs" +//# 5123 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1370 "src/Compiler/pars.fsy" +//# 1399 "src/Compiler/pars.fsy" let mOpen = rhs parseState 1 SynOpenDeclTarget.ModuleOrNamespace(SynLongIdent([], [], []), mOpen.EndRange), mOpen ) -//# 1370 "src/Compiler/pars.fsy" +//# 1399 "src/Compiler/pars.fsy" : 'gentype_openDecl)); -//# 5056 "pars.fs" +//# 5135 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typeKeyword in - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeWithoutNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 1374 "src/Compiler/pars.fsy" +//# 1403 "src/Compiler/pars.fsy" let mOpen = rhs parseState 1 let mPath = _3.Range SynOpenDeclTarget.Type(_3, mPath), unionRanges mOpen mPath ) -//# 1374 "src/Compiler/pars.fsy" +//# 1403 "src/Compiler/pars.fsy" : 'gentype_openDecl)); -//# 5070 "pars.fs" +//# 5149 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typeKeyword in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1379 "src/Compiler/pars.fsy" +//# 1408 "src/Compiler/pars.fsy" let m = rhs2 parseState 1 2 SynOpenDeclTarget.ModuleOrNamespace(SynLongIdent([], [], []), m.EndRange), m ) -//# 1379 "src/Compiler/pars.fsy" +//# 1408 "src/Compiler/pars.fsy" : 'gentype_openDecl)); -//# 5083 "pars.fs" +//# 5162 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynLongIdent in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1387 "src/Compiler/pars.fsy" +//# 1416 "src/Compiler/pars.fsy" _2 ) -//# 1387 "src/Compiler/pars.fsy" +//# 1416 "src/Compiler/pars.fsy" : 'gentype_namedModuleAbbrevBlock)); -//# 5095 "pars.fs" +//# 5174 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 1390 "src/Compiler/pars.fsy" +//# 1419 "src/Compiler/pars.fsy" _1 ) -//# 1390 "src/Compiler/pars.fsy" +//# 1419 "src/Compiler/pars.fsy" : 'gentype_namedModuleAbbrevBlock)); -//# 5106 "pars.fs" +//# 5185 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_wrappedNamedModuleDefn in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1396 "src/Compiler/pars.fsy" +//# 1425 "src/Compiler/pars.fsy" Choice2Of2 _2 ) -//# 1396 "src/Compiler/pars.fsy" +//# 1425 "src/Compiler/pars.fsy" : 'gentype_namedModuleDefnBlock)); -//# 5118 "pars.fs" +//# 5197 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_wrappedNamedModuleDefn in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1399 "src/Compiler/pars.fsy" +//# 1428 "src/Compiler/pars.fsy" // The lex filter ensures we can only get a mismatch in OBLOCKBEGIN/OBLOCKEND tokens if there was some other kind of error, hence we don't need to report this error Choice2Of2 _2 ) -//# 1399 "src/Compiler/pars.fsy" +//# 1428 "src/Compiler/pars.fsy" : 'gentype_namedModuleDefnBlock)); -//# 5131 "pars.fs" +//# 5210 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleDefnsOrExpr in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1403 "src/Compiler/pars.fsy" +//# 1432 "src/Compiler/pars.fsy" // There is an ambiguity here // In particular, consider the following two: // @@ -5146,9 +5225,9 @@ let _fsyacc_reductions = lazy [| // The second is a module abbreviation, the first a module containing a single expression. // The resolution is in favour of the module abbreviation, i.e. anything of the form // module M2 = ID.ID.ID.ID - // will be taken as a module abbreviation, regardles of the identifiers themselves. + // will be taken as a module abbreviation, regardless of the identifiers themselves. // - // This is similar to the ambiguitty between + // This is similar to the ambiguity between // type X = int // and // type X = OneValue @@ -5160,70 +5239,70 @@ let _fsyacc_reductions = lazy [| Choice2Of2 (_2, None) ) -//# 1403 "src/Compiler/pars.fsy" +//# 1432 "src/Compiler/pars.fsy" : 'gentype_namedModuleDefnBlock)); -//# 5165 "pars.fs" +//# 5244 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleDefnsOrExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1429 "src/Compiler/pars.fsy" +//# 1458 "src/Compiler/pars.fsy" // The lex filter ensures we can only get a mismatch in OBLOCKBEGIN/OBLOCKEND tokens if there was some other kind of error, hence we don't need to report this error // reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnClosedBlockInHashLight()) Choice2Of2 (_2, None) ) -//# 1429 "src/Compiler/pars.fsy" +//# 1458 "src/Compiler/pars.fsy" : 'gentype_namedModuleDefnBlock)); -//# 5179 "pars.fs" +//# 5258 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1434 "src/Compiler/pars.fsy" +//# 1463 "src/Compiler/pars.fsy" let mEnd = rhs parseState 3 Choice2Of2 ([], Some mEnd) ) -//# 1434 "src/Compiler/pars.fsy" +//# 1463 "src/Compiler/pars.fsy" : 'gentype_namedModuleDefnBlock)); -//# 5191 "pars.fs" +//# 5270 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_wrappedNamedModuleDefn in Microsoft.FSharp.Core.Operators.box ( ( -//# 1438 "src/Compiler/pars.fsy" +//# 1467 "src/Compiler/pars.fsy" Choice2Of2 _1 ) -//# 1438 "src/Compiler/pars.fsy" +//# 1467 "src/Compiler/pars.fsy" : 'gentype_namedModuleDefnBlock)); -//# 5202 "pars.fs" +//# 5281 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 1441 "src/Compiler/pars.fsy" +//# 1470 "src/Compiler/pars.fsy" Choice1Of2 _1.LongIdent ) -//# 1441 "src/Compiler/pars.fsy" +//# 1470 "src/Compiler/pars.fsy" : 'gentype_namedModuleDefnBlock)); -//# 5213 "pars.fs" +//# 5292 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_structOrBegin in let _2 = parseState.GetInput(2) :?> 'gentype_moduleDefnsOrExprPossiblyEmpty in Microsoft.FSharp.Core.Operators.box ( ( -//# 1447 "src/Compiler/pars.fsy" +//# 1476 "src/Compiler/pars.fsy" let mEnd = rhs parseState 3 _2, Some mEnd ) -//# 1447 "src/Compiler/pars.fsy" +//# 1476 "src/Compiler/pars.fsy" : 'gentype_wrappedNamedModuleDefn)); -//# 5226 "pars.fs" +//# 5305 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_structOrBegin in let _2 = parseState.GetInput(2) :?> 'gentype_moduleDefnsOrExprPossiblyEmpty in @@ -5231,82 +5310,82 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1451 "src/Compiler/pars.fsy" +//# 1480 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBeginOrStruct()) _2, None ) -//# 1451 "src/Compiler/pars.fsy" +//# 1480 "src/Compiler/pars.fsy" : 'gentype_wrappedNamedModuleDefn)); -//# 5240 "pars.fs" +//# 5319 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_structOrBegin in Microsoft.FSharp.Core.Operators.box ( ( -//# 1455 "src/Compiler/pars.fsy" +//# 1484 "src/Compiler/pars.fsy" let mEnd = rhs parseState 3 [], Some mEnd ) -//# 1455 "src/Compiler/pars.fsy" +//# 1484 "src/Compiler/pars.fsy" : 'gentype_wrappedNamedModuleDefn)); -//# 5252 "pars.fs" +//# 5331 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnBlock in let _3 = parseState.GetInput(3) :?> 'gentype_declEnd in Microsoft.FSharp.Core.Operators.box ( ( -//# 1461 "src/Compiler/pars.fsy" +//# 1490 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 mWithKwd, _2 ) -//# 1461 "src/Compiler/pars.fsy" +//# 1490 "src/Compiler/pars.fsy" : range * SynMemberDefns)); -//# 5265 "pars.fs" +//# 5344 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in Microsoft.FSharp.Core.Operators.box ( ( -//# 1468 "src/Compiler/pars.fsy" +//# 1497 "src/Compiler/pars.fsy" _1 ) -//# 1468 "src/Compiler/pars.fsy" +//# 1497 "src/Compiler/pars.fsy" : 'gentype_opt_attributes)); -//# 5276 "pars.fs" +//# 5355 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1471 "src/Compiler/pars.fsy" +//# 1500 "src/Compiler/pars.fsy" [] ) -//# 1471 "src/Compiler/pars.fsy" +//# 1500 "src/Compiler/pars.fsy" : 'gentype_opt_attributes)); -//# 5286 "pars.fs" +//# 5365 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributeList in Microsoft.FSharp.Core.Operators.box ( ( -//# 1476 "src/Compiler/pars.fsy" +//# 1505 "src/Compiler/pars.fsy" _1 ) -//# 1476 "src/Compiler/pars.fsy" +//# 1505 "src/Compiler/pars.fsy" : 'gentype_attributes)); -//# 5297 "pars.fs" +//# 5376 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributeList in let _2 = parseState.GetInput(2) :?> 'gentype_attributes in Microsoft.FSharp.Core.Operators.box ( ( -//# 1479 "src/Compiler/pars.fsy" +//# 1508 "src/Compiler/pars.fsy" _1 @ _2 ) -//# 1479 "src/Compiler/pars.fsy" +//# 1508 "src/Compiler/pars.fsy" : 'gentype_attributes)); -//# 5309 "pars.fs" +//# 5388 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_attributeListElements in let _3 = parseState.GetInput(3) :?> 'gentype_opt_seps in @@ -5314,23 +5393,23 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1485 "src/Compiler/pars.fsy" +//# 1514 "src/Compiler/pars.fsy" mkAttributeList _2 (rhs2 parseState 1 4) ) -//# 1485 "src/Compiler/pars.fsy" +//# 1514 "src/Compiler/pars.fsy" : 'gentype_attributeList)); -//# 5322 "pars.fs" +//# 5401 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _4 = parseState.GetInput(4) :?> 'gentype_opt_OBLOCKSEP in Microsoft.FSharp.Core.Operators.box ( ( -//# 1488 "src/Compiler/pars.fsy" +//# 1517 "src/Compiler/pars.fsy" mkAttributeList [] (rhs2 parseState 1 3) ) -//# 1488 "src/Compiler/pars.fsy" +//# 1517 "src/Compiler/pars.fsy" : 'gentype_attributeList)); -//# 5333 "pars.fs" +//# 5412 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_attributeListElements in let _3 = parseState.GetInput(3) :?> 'gentype_opt_seps in @@ -5338,36 +5417,36 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1491 "src/Compiler/pars.fsy" +//# 1520 "src/Compiler/pars.fsy" if not _4 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedLBrackLess()) mkAttributeList _2 (rhs2 parseState 1 2) ) -//# 1491 "src/Compiler/pars.fsy" +//# 1520 "src/Compiler/pars.fsy" : 'gentype_attributeList)); -//# 5347 "pars.fs" +//# 5426 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1495 "src/Compiler/pars.fsy" +//# 1524 "src/Compiler/pars.fsy" if not _2 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedLBrackLess()) mkAttributeList [] (rhs parseState 1) ) -//# 1495 "src/Compiler/pars.fsy" +//# 1524 "src/Compiler/pars.fsy" : 'gentype_attributeList)); -//# 5359 "pars.fs" +//# 5438 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attribute in Microsoft.FSharp.Core.Operators.box ( ( -//# 1502 "src/Compiler/pars.fsy" +//# 1531 "src/Compiler/pars.fsy" [_1] ) -//# 1502 "src/Compiler/pars.fsy" +//# 1531 "src/Compiler/pars.fsy" : 'gentype_attributeListElements)); -//# 5370 "pars.fs" +//# 5449 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributeListElements in let _2 = parseState.GetInput(2) :?> 'gentype_seps in @@ -5375,12 +5454,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1505 "src/Compiler/pars.fsy" +//# 1534 "src/Compiler/pars.fsy" _1 @ [_3] ) -//# 1505 "src/Compiler/pars.fsy" +//# 1534 "src/Compiler/pars.fsy" : 'gentype_attributeListElements)); -//# 5383 "pars.fs" +//# 5462 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in let _2 = parseState.GetInput(2) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in @@ -5388,14 +5467,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1512 "src/Compiler/pars.fsy" +//# 1541 "src/Compiler/pars.fsy" let arg = match _3 with None -> mkSynUnit _1.Range | Some e -> e let m = unionRanges _1.Range arg.Range ({ TypeName = _1; ArgExpr = arg; Target = None; AppliesToGetterAndSetter = false; Range = m }: SynAttribute) ) -//# 1512 "src/Compiler/pars.fsy" +//# 1541 "src/Compiler/pars.fsy" : 'gentype_attribute)); -//# 5398 "pars.fs" +//# 5477 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributeTarget in let _2 = parseState.GetInput(2) :?> SynLongIdent in @@ -5404,15 +5483,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1518 "src/Compiler/pars.fsy" +//# 1547 "src/Compiler/pars.fsy" let arg = match _4 with None -> mkSynUnit _2.Range | Some e -> e let startRange = match _1 with Some(ident:Ident) -> ident.idRange | None -> _2.Range let m = unionRanges startRange arg.Range ({ TypeName = _2; ArgExpr = arg; Target = _1; AppliesToGetterAndSetter = false; Range = m }: SynAttribute) ) -//# 1518 "src/Compiler/pars.fsy" +//# 1547 "src/Compiler/pars.fsy" : 'gentype_attribute)); -//# 5415 "pars.fs" +//# 5494 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributeTarget in let _3 = parseState.GetInput(3) :?> SynLongIdent in @@ -5422,117 +5501,117 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1525 "src/Compiler/pars.fsy" +//# 1554 "src/Compiler/pars.fsy" let arg = match _6 with None -> mkSynUnit _3.Range | Some e -> e let startRange = match _1 with Some ident -> ident.idRange | None -> _3.Range let m = unionRanges startRange arg.Range ({ TypeName = _3; ArgExpr = arg; Target = _1; AppliesToGetterAndSetter = false; Range = m }: SynAttribute) ) -//# 1525 "src/Compiler/pars.fsy" +//# 1554 "src/Compiler/pars.fsy" : 'gentype_attribute)); -//# 5433 "pars.fs" +//# 5512 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_moduleKeyword in Microsoft.FSharp.Core.Operators.box ( ( -//# 1534 "src/Compiler/pars.fsy" +//# 1563 "src/Compiler/pars.fsy" Some(ident("module", (rhs parseState 1))) ) -//# 1534 "src/Compiler/pars.fsy" +//# 1563 "src/Compiler/pars.fsy" : 'gentype_attributeTarget)); -//# 5444 "pars.fs" +//# 5523 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeKeyword in Microsoft.FSharp.Core.Operators.box ( ( -//# 1537 "src/Compiler/pars.fsy" +//# 1566 "src/Compiler/pars.fsy" Some(ident("type", (rhs parseState 1))) ) -//# 1537 "src/Compiler/pars.fsy" +//# 1566 "src/Compiler/pars.fsy" : 'gentype_attributeTarget)); -//# 5455 "pars.fs" +//# 5534 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 1539 "src/Compiler/pars.fsy" +//# 1568 "src/Compiler/pars.fsy" Some(_1) ) -//# 1539 "src/Compiler/pars.fsy" +//# 1568 "src/Compiler/pars.fsy" : 'gentype_attributeTarget)); -//# 5466 "pars.fs" +//# 5545 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 1543 "src/Compiler/pars.fsy" +//# 1572 "src/Compiler/pars.fsy" if _1 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsSyntaxError()) Some(ident("return", (rhs parseState 1))) ) -//# 1543 "src/Compiler/pars.fsy" +//# 1572 "src/Compiler/pars.fsy" : 'gentype_attributeTarget)); -//# 5478 "pars.fs" +//# 5557 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1549 "src/Compiler/pars.fsy" +//# 1578 "src/Compiler/pars.fsy" let mStatic = rhs parseState 1 let mMember = rhs parseState 2 StaticMemberFlags, SynLeadingKeyword.StaticMember(mStatic, mMember) ) -//# 1549 "src/Compiler/pars.fsy" +//# 1578 "src/Compiler/pars.fsy" : 'gentype_memberFlags)); -//# 5490 "pars.fs" +//# 5569 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1554 "src/Compiler/pars.fsy" +//# 1583 "src/Compiler/pars.fsy" let mStatic = rhs parseState 1 // todo: it should be possible to make it work better for both `abstract` and `member` in the type checker StaticMemberFlags, SynLeadingKeyword.Static(mStatic) ) -//# 1554 "src/Compiler/pars.fsy" +//# 1583 "src/Compiler/pars.fsy" : 'gentype_memberFlags)); -//# 5502 "pars.fs" +//# 5581 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1559 "src/Compiler/pars.fsy" +//# 1588 "src/Compiler/pars.fsy" let mMember = rhs parseState 1 NonVirtualMemberFlags, SynLeadingKeyword.Member mMember ) -//# 1559 "src/Compiler/pars.fsy" +//# 1588 "src/Compiler/pars.fsy" : 'gentype_memberFlags)); -//# 5513 "pars.fs" +//# 5592 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1563 "src/Compiler/pars.fsy" +//# 1592 "src/Compiler/pars.fsy" let mOverride = rhs parseState 1 OverrideMemberFlags, SynLeadingKeyword.Override mOverride ) -//# 1563 "src/Compiler/pars.fsy" +//# 1592 "src/Compiler/pars.fsy" : 'gentype_memberFlags)); -//# 5524 "pars.fs" +//# 5603 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1567 "src/Compiler/pars.fsy" +//# 1596 "src/Compiler/pars.fsy" let mDefault = rhs parseState 1 OverrideMemberFlags, SynLeadingKeyword.Default mDefault ) -//# 1567 "src/Compiler/pars.fsy" +//# 1596 "src/Compiler/pars.fsy" : 'gentype_memberFlags)); -//# 5535 "pars.fs" +//# 5614 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_tyconNameAndTyparDecls in @@ -5540,22 +5619,22 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1573 "src/Compiler/pars.fsy" +//# 1602 "src/Compiler/pars.fsy" let typars, lid, fixity, vis = _2 let xmlDoc = grabXmlDoc(parseState, _1, 1) let m = match lid with [] -> rhs parseState 2 | _ -> rangeOfLid lid SynComponentInfo (_1, typars, _3, lid, xmlDoc, fixity, vis, m) ) -//# 1573 "src/Compiler/pars.fsy" +//# 1602 "src/Compiler/pars.fsy" : 'gentype_typeNameInfo)); -//# 5551 "pars.fs" +//# 5630 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_tyconDefn in let _3 = parseState.GetInput(3) :?> 'gentype_tyconDefnList in Microsoft.FSharp.Core.Operators.box ( ( -//# 1581 "src/Compiler/pars.fsy" +//# 1610 "src/Compiler/pars.fsy" let xmlDoc = grabXmlDoc(parseState, [], 1) let tyconDefn = let leadingKeyword = SynTypeDefnLeadingKeyword.And(rhs parseState 1) @@ -5572,48 +5651,48 @@ let _fsyacc_reductions = lazy [| SynTypeDefn(componentInfo, typeRepr, members, implicitConstructor, range, trivia) tyconDefn :: _3 ) -//# 1581 "src/Compiler/pars.fsy" +//# 1610 "src/Compiler/pars.fsy" : 'gentype_tyconDefnList)); -//# 5577 "pars.fs" +//# 5656 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1598 "src/Compiler/pars.fsy" +//# 1627 "src/Compiler/pars.fsy" [] ) -//# 1598 "src/Compiler/pars.fsy" +//# 1627 "src/Compiler/pars.fsy" : 'gentype_tyconDefnList)); -//# 5587 "pars.fs" +//# 5666 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeNameInfo in Microsoft.FSharp.Core.Operators.box ( ( -//# 1603 "src/Compiler/pars.fsy" +//# 1632 "src/Compiler/pars.fsy" fun leadingKeyword -> let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = None; WithKeyword = None } SynTypeDefn(_1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(_1.Range), _1.Range), [], None, _1.Range, trivia) ) -//# 1603 "src/Compiler/pars.fsy" +//# 1632 "src/Compiler/pars.fsy" : 'gentype_tyconDefn)); -//# 5600 "pars.fs" +//# 5679 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeNameInfo in let _2 = parseState.GetInput(2) :?> range * SynMemberDefns in Microsoft.FSharp.Core.Operators.box ( ( -//# 1608 "src/Compiler/pars.fsy" +//# 1637 "src/Compiler/pars.fsy" let mWithKwd, classDefns = _2 let m = (rhs parseState 1, classDefns) ||> unionRangeWithListBy (fun mem -> mem.Range) fun leadingKeyword -> let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = None; WithKeyword = None } SynTypeDefn(_1, SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Augmentation mWithKwd, [], m), classDefns, None, m, trivia) ) -//# 1608 "src/Compiler/pars.fsy" +//# 1637 "src/Compiler/pars.fsy" : 'gentype_tyconDefn)); -//# 5616 "pars.fs" +//# 5695 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeNameInfo in let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in @@ -5625,8 +5704,8 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1615 "src/Compiler/pars.fsy" - let vis, spats, az = _3, _5, _6 +//# 1644 "src/Compiler/pars.fsy" + let vis, pat, az = _3, _5, _6 let nameRange = rhs parseState 1 let (tcDefRepr, mWith, members) = _8 nameRange let (SynComponentInfo(_, _, _, lid, _, _, _, _)) = _1 @@ -5635,8 +5714,8 @@ let _fsyacc_reductions = lazy [| let xmlDoc = grabXmlDoc (parseState, _2, 2) let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid let memberCtorPattern = - spats |> Option.map (fun spats -> - SynMemberDefn.ImplicitCtor(vis, _2, spats, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) + pat |> Option.map (fun pat -> + SynMemberDefn.ImplicitCtor(vis, _2, pat, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) ) let tcDefRepr = match tcDefRepr, memberCtorPattern with @@ -5665,9 +5744,9 @@ let _fsyacc_reductions = lazy [| let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = Some mEquals; WithKeyword = mWith } SynTypeDefn(_1, tcDefRepr, members, memberCtorPattern, mWhole, trivia) ) -//# 1615 "src/Compiler/pars.fsy" +//# 1644 "src/Compiler/pars.fsy" : 'gentype_tyconDefn)); -//# 5670 "pars.fs" +//# 5749 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeNameInfo in let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in @@ -5679,17 +5758,17 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1666 "src/Compiler/pars.fsy" - let vis, spats, az = _3, _5, _6 +//# 1689 "src/Compiler/pars.fsy" + let vis, pat, az = _3, _5, _6 let (SynComponentInfo(longId = lid)) = _1 // Gets the XML doc comments prior to the implicit constructor let xmlDoc = grabXmlDoc (parseState, _2, 2) let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid let mName = _1.Range let members, mWhole = - match spats, vis, az with - | Some spats, _, _ -> - let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, _2, spats, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) + match pat, vis, az with + | Some pat, _, _ -> + let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, _2, pat, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) [memberCtorPattern], unionRanges mName memberCtorPattern.Range | _, _, Some(mAs, asId) -> let mAs = @@ -5707,9 +5786,9 @@ let _fsyacc_reductions = lazy [| let trivia = { SynTypeDefnTrivia.Zero with LeadingKeyword = leadingKeyword } SynTypeDefn(_1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mWhole, trivia) ) -//# 1666 "src/Compiler/pars.fsy" +//# 1689 "src/Compiler/pars.fsy" : 'gentype_tyconDefn)); -//# 5712 "pars.fs" +//# 5791 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_tyconDefnRhs in let _3 = parseState.GetInput(3) :?> 'gentype_opt_OBLOCKSEP in @@ -5720,7 +5799,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1710 "src/Compiler/pars.fsy" +//# 1728 "src/Compiler/pars.fsy" let mWith, optClassDefn = _5 let mWith2, optClassDefn2 = _7 let m = unionRanges (rhs parseState 1) (match optClassDefn2 with [] -> (match optClassDefn with [] -> (rhs parseState 4) | _ -> (rhs parseState 5)) | _ -> (rhs parseState 7)) @@ -5729,9 +5808,9 @@ let _fsyacc_reductions = lazy [| let mWith = Option.orElse mWith2 mWith tcDefRepr, mWith, members) ) -//# 1710 "src/Compiler/pars.fsy" +//# 1728 "src/Compiler/pars.fsy" : 'gentype_tyconDefnRhsBlock)); -//# 5734 "pars.fs" +//# 5813 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_tyconDefnRhs in let _3 = parseState.GetInput(3) :?> 'gentype_opt_OBLOCKSEP in @@ -5741,7 +5820,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1719 "src/Compiler/pars.fsy" +//# 1737 "src/Compiler/pars.fsy" if not _6 then reportParseErrorAt (rhs parseState 6) (FSComp.SR.parsUnexpectedEndOfFileTypeDefinition()) let mWith, optClassDefn = _5 let m = unionRanges (rhs parseState 1) (match optClassDefn with [] -> (rhs parseState 4) | _ -> (rhs parseState 5)) @@ -5749,55 +5828,55 @@ let _fsyacc_reductions = lazy [| let tcDefRepr, members = _2 nameRange (checkForMultipleAugmentations m (_4 @ optClassDefn) []) tcDefRepr, mWith, members) ) -//# 1719 "src/Compiler/pars.fsy" +//# 1737 "src/Compiler/pars.fsy" : 'gentype_tyconDefnRhsBlock)); -//# 5754 "pars.fs" +//# 5833 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1727 "src/Compiler/pars.fsy" +//# 1745 "src/Compiler/pars.fsy" fun mName -> SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None mName, mName), None, [] ) -//# 1727 "src/Compiler/pars.fsy" +//# 1745 "src/Compiler/pars.fsy" : 'gentype_tyconDefnRhsBlock)); -//# 5766 "pars.fs" +//# 5845 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tyconDefnRhs in let _2 = parseState.GetInput(2) :?> 'gentype_opt_classDefn in Microsoft.FSharp.Core.Operators.box ( ( -//# 1731 "src/Compiler/pars.fsy" +//# 1749 "src/Compiler/pars.fsy" let m = rhs parseState 1 let mWith, optClassDefn = _2 (fun nameRange -> let tcDefRepr, members = _1 nameRange optClassDefn tcDefRepr, mWith, members) ) -//# 1731 "src/Compiler/pars.fsy" +//# 1749 "src/Compiler/pars.fsy" : 'gentype_tyconDefnRhsBlock)); -//# 5782 "pars.fs" +//# 5861 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypeDefnSimpleRepr in Microsoft.FSharp.Core.Operators.box ( ( -//# 1743 "src/Compiler/pars.fsy" +//# 1761 "src/Compiler/pars.fsy" let m = _1.Range (fun nameRange augmentation -> SynTypeDefnRepr.Simple(_1, m), augmentation) ) -//# 1743 "src/Compiler/pars.fsy" +//# 1761 "src/Compiler/pars.fsy" : 'gentype_tyconDefnRhs)); -//# 5794 "pars.fs" +//# 5873 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tyconClassDefn in Microsoft.FSharp.Core.Operators.box ( ( -//# 1748 "src/Compiler/pars.fsy" +//# 1766 "src/Compiler/pars.fsy" let needsCheck, (kind, decls), mopt = _1 let m = match mopt with | None -> (lhs parseState).StartRange // create a zero-width range @@ -5807,51 +5886,52 @@ let _fsyacc_reductions = lazy [| reportParseErrorAt nameRange (FSComp.SR.parsEmptyTypeDefinition()) SynTypeDefnRepr.ObjectModel(kind, decls, m), augmentation) ) -//# 1748 "src/Compiler/pars.fsy" +//# 1766 "src/Compiler/pars.fsy" : 'gentype_tyconDefnRhs)); -//# 5812 "pars.fs" +//# 5891 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_topType in Microsoft.FSharp.Core.Operators.box ( ( -//# 1759 "src/Compiler/pars.fsy" +//# 1777 "src/Compiler/pars.fsy" let m = lhs parseState let ty, arity = _3 (fun nameRange augmentation -> - let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero) + let vis2 = SynValSigAccess.Single(None) + let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, vis2, None, m, SynValSigTrivia.Zero) let flags = AbstractMemberFlags true SynMemberKind.Member let invoke = SynMemberDefn.AbstractSlot(valSig, flags, m, SynMemberDefnAbstractSlotTrivia.Zero) if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Delegate(ty, arity), [invoke], m), []) ) -//# 1759 "src/Compiler/pars.fsy" +//# 1777 "src/Compiler/pars.fsy" : 'gentype_tyconDefnRhs)); -//# 5830 "pars.fs" +//# 5910 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classDefnBlockKindUnspecified in Microsoft.FSharp.Core.Operators.box ( ( -//# 1772 "src/Compiler/pars.fsy" +//# 1791 "src/Compiler/pars.fsy" let needsCheck, decls, mopt = _1 needsCheck, (SynTypeDefnKind.Unspecified, decls), mopt ) -//# 1772 "src/Compiler/pars.fsy" +//# 1791 "src/Compiler/pars.fsy" : 'gentype_tyconClassDefn)); -//# 5842 "pars.fs" +//# 5922 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classOrInterfaceOrStruct in let _2 = parseState.GetInput(2) :?> 'gentype_classDefnBlock in Microsoft.FSharp.Core.Operators.box ( ( -//# 1776 "src/Compiler/pars.fsy" +//# 1795 "src/Compiler/pars.fsy" false, (_1, _2), Some(rhs2 parseState 1 3) ) -//# 1776 "src/Compiler/pars.fsy" +//# 1795 "src/Compiler/pars.fsy" : 'gentype_tyconClassDefn)); -//# 5854 "pars.fs" +//# 5934 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classOrInterfaceOrStruct in let _2 = parseState.GetInput(2) :?> 'gentype_classDefnBlock in @@ -5859,33 +5939,33 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1779 "src/Compiler/pars.fsy" +//# 1798 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedClassInterfaceOrStruct()) let m = (rhs parseState 1, _2) ||> unionRangeWithListBy (fun (d: SynMemberDefn) -> d.Range) false, (_1, _2), Some(m) ) -//# 1779 "src/Compiler/pars.fsy" +//# 1798 "src/Compiler/pars.fsy" : 'gentype_tyconClassDefn)); -//# 5869 "pars.fs" +//# 5949 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classOrInterfaceOrStruct in Microsoft.FSharp.Core.Operators.box ( ( -//# 1784 "src/Compiler/pars.fsy" +//# 1803 "src/Compiler/pars.fsy" // silent recovery false, (_1, []), Some(rhs2 parseState 1 3) ) -//# 1784 "src/Compiler/pars.fsy" +//# 1803 "src/Compiler/pars.fsy" : 'gentype_tyconClassDefn)); -//# 5881 "pars.fs" +//# 5961 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMembersAtLeastOne in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1791 "src/Compiler/pars.fsy" +//# 1810 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileTypeDefinition()) let mopt = match _2 with @@ -5893,93 +5973,93 @@ let _fsyacc_reductions = lazy [| | _ -> None false, _2, mopt ) -//# 1791 "src/Compiler/pars.fsy" +//# 1810 "src/Compiler/pars.fsy" : 'gentype_classDefnBlockKindUnspecified)); -//# 5898 "pars.fs" +//# 5978 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMembersAtLeastOne in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1799 "src/Compiler/pars.fsy" +//# 1818 "src/Compiler/pars.fsy" let mopt = match _2 with | _ :: _ -> Some((rhs parseState 1, _2) ||> unionRangeWithListBy (fun (d: SynMemberDefn) -> d.Range)) | _ -> None true, _2, mopt ) -//# 1799 "src/Compiler/pars.fsy" +//# 1818 "src/Compiler/pars.fsy" : 'gentype_classDefnBlockKindUnspecified)); -//# 5914 "pars.fs" +//# 5994 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMembers in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1809 "src/Compiler/pars.fsy" +//# 1828 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileTypeDefinition()) _2 ) -//# 1809 "src/Compiler/pars.fsy" +//# 1828 "src/Compiler/pars.fsy" : 'gentype_classDefnBlock)); -//# 5927 "pars.fs" +//# 6007 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMembers in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 1813 "src/Compiler/pars.fsy" +//# 1832 "src/Compiler/pars.fsy" _2 ) -//# 1813 "src/Compiler/pars.fsy" +//# 1832 "src/Compiler/pars.fsy" : 'gentype_classDefnBlock)); -//# 5939 "pars.fs" +//# 6019 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classDefnMembers in Microsoft.FSharp.Core.Operators.box ( ( -//# 1816 "src/Compiler/pars.fsy" +//# 1835 "src/Compiler/pars.fsy" _1 ) -//# 1816 "src/Compiler/pars.fsy" +//# 1835 "src/Compiler/pars.fsy" : 'gentype_classDefnBlock)); -//# 5950 "pars.fs" +//# 6030 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classDefnMembersAtLeastOne in Microsoft.FSharp.Core.Operators.box ( ( -//# 1822 "src/Compiler/pars.fsy" +//# 1841 "src/Compiler/pars.fsy" _1 ) -//# 1822 "src/Compiler/pars.fsy" +//# 1841 "src/Compiler/pars.fsy" : 'gentype_classDefnMembers)); -//# 5961 "pars.fs" +//# 6041 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMembers in Microsoft.FSharp.Core.Operators.box ( ( -//# 1826 "src/Compiler/pars.fsy" +//# 1845 "src/Compiler/pars.fsy" _2 ) -//# 1826 "src/Compiler/pars.fsy" +//# 1845 "src/Compiler/pars.fsy" : 'gentype_classDefnMembers)); -//# 5972 "pars.fs" +//# 6052 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1829 "src/Compiler/pars.fsy" +//# 1848 "src/Compiler/pars.fsy" [] ) -//# 1829 "src/Compiler/pars.fsy" +//# 1848 "src/Compiler/pars.fsy" : 'gentype_classDefnMembers)); -//# 5982 "pars.fs" +//# 6062 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classDefnMember in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in @@ -5987,7 +6067,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1835 "src/Compiler/pars.fsy" +//# 1854 "src/Compiler/pars.fsy" match _1, _3 with | [ SynMemberDefn.Interface(members=Some []; range=m) ], nextMember :: _ -> let strictIndentation = parseState.LexBuffer.SupportsFeature LanguageFeature.StrictIndentation @@ -5996,70 +6076,70 @@ let _fsyacc_reductions = lazy [| | _ -> () _1 @ _3 ) -//# 1835 "src/Compiler/pars.fsy" +//# 1854 "src/Compiler/pars.fsy" : 'gentype_classDefnMembersAtLeastOne)); -//# 6001 "pars.fs" +//# 6081 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMemberGetSetElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 1847 "src/Compiler/pars.fsy" +//# 1866 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 mWithKwd, _2 ) -//# 1847 "src/Compiler/pars.fsy" +//# 1866 "src/Compiler/pars.fsy" : 'gentype_classDefnMemberGetSet)); -//# 6013 "pars.fs" +//# 6093 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMemberGetSetElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 1851 "src/Compiler/pars.fsy" +//# 1870 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 mWithKwd, _2 ) -//# 1851 "src/Compiler/pars.fsy" +//# 1870 "src/Compiler/pars.fsy" : 'gentype_classDefnMemberGetSet)); -//# 6025 "pars.fs" +//# 6105 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnMemberGetSetElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 1855 "src/Compiler/pars.fsy" +//# 1874 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedWith()) mWithKwd, _2 ) -//# 1855 "src/Compiler/pars.fsy" +//# 1874 "src/Compiler/pars.fsy" : 'gentype_classDefnMemberGetSet)); -//# 6038 "pars.fs" +//# 6118 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classDefnMemberGetSetElement in Microsoft.FSharp.Core.Operators.box ( ( -//# 1862 "src/Compiler/pars.fsy" +//# 1881 "src/Compiler/pars.fsy" [_1], None ) -//# 1862 "src/Compiler/pars.fsy" +//# 1881 "src/Compiler/pars.fsy" : 'gentype_classDefnMemberGetSetElements)); -//# 6049 "pars.fs" +//# 6129 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_classDefnMemberGetSetElement in let _3 = parseState.GetInput(3) :?> 'gentype_classDefnMemberGetSetElement in Microsoft.FSharp.Core.Operators.box ( ( -//# 1865 "src/Compiler/pars.fsy" +//# 1884 "src/Compiler/pars.fsy" let mAnd = rhs parseState 2 [_1;_3], Some mAnd ) -//# 1865 "src/Compiler/pars.fsy" +//# 1884 "src/Compiler/pars.fsy" : 'gentype_classDefnMemberGetSetElements)); -//# 6062 "pars.fs" +//# 6142 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in @@ -6069,14 +6149,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1870 "src/Compiler/pars.fsy" +//# 1889 "src/Compiler/pars.fsy" let mEquals = rhs parseState 5 let mRhs = (_6: SynExpr).Range (_1, _2, _3, _4, Some mEquals, _6, mRhs) ) -//# 1870 "src/Compiler/pars.fsy" +//# 1889 "src/Compiler/pars.fsy" : 'gentype_classDefnMemberGetSetElement)); -//# 6079 "pars.fs" +//# 6159 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_bindingPattern in @@ -6085,7 +6165,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1879 "src/Compiler/pars.fsy" +//# 1898 "src/Compiler/pars.fsy" let mRhs = _5.Range let optReturnType = _3 let mEquals = rhs parseState 4 @@ -6100,9 +6180,9 @@ let _fsyacc_reductions = lazy [| let memberRange = unionRanges rangeStart mRhs |> unionRangeWithXmlDoc xmlDoc [ SynMemberDefn.Member(binding, memberRange) ]) ) -//# 1879 "src/Compiler/pars.fsy" +//# 1898 "src/Compiler/pars.fsy" : 'gentype_memberCore)); -//# 6105 "pars.fs" +//# 6185 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_bindingPattern in @@ -6110,7 +6190,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1894 "src/Compiler/pars.fsy" +//# 1913 "src/Compiler/pars.fsy" let optReturnType = _3 let bindingPat, mBindLhs = _2 let mEnd = @@ -6129,18 +6209,18 @@ let _fsyacc_reductions = lazy [| let memberRange = unionRanges rangeStart mEnd |> unionRangeWithXmlDoc xmlDoc [ SynMemberDefn.Member (binding, memberRange) ] ) -//# 1894 "src/Compiler/pars.fsy" +//# 1913 "src/Compiler/pars.fsy" : 'gentype_memberCore)); -//# 6134 "pars.fs" +//# 6214 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_bindingPattern in let _3 = parseState.GetInput(3) :?> 'gentype_opt_topReturnTypeWithTypeConstraints in - let _4 = parseState.GetInput(4) :?> 'gentype_recover in + let _4 = parseState.GetInput(4) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 1914 "src/Compiler/pars.fsy" +//# 1933 "src/Compiler/pars.fsy" let optReturnType = _3 let bindingPat, mBindLhs = _2 let mEnd = @@ -6148,6 +6228,7 @@ let _fsyacc_reductions = lazy [| | Some(_, ty) -> ty.Range.EndRange | _ -> bindingPat.Range.EndRange let expr = arbExpr ("memberCore2", mEnd) + errorR (Error(FSComp.SR.parsMissingMemberBody(), rhs parseState 4)) fun vis flagsBuilderAndLeadingKeyword attrs rangeStart -> let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, rangeStart) let memFlagsBuilder, leadingKeyword = flagsBuilderAndLeadingKeyword @@ -6158,9 +6239,9 @@ let _fsyacc_reductions = lazy [| let memberRange = unionRanges rangeStart mEnd |> unionRangeWithXmlDoc xmlDoc [ SynMemberDefn.Member (binding, memberRange) ] ) -//# 1914 "src/Compiler/pars.fsy" +//# 1933 "src/Compiler/pars.fsy" : 'gentype_memberCore)); -//# 6163 "pars.fs" +//# 6244 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_bindingPattern in @@ -6169,7 +6250,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1934 "src/Compiler/pars.fsy" +//# 1954 "src/Compiler/pars.fsy" let mWith, (classDefnMemberGetSetElements, mAnd) = _4 let mWhole = (rhs parseState 2, classDefnMemberGetSetElements) ||> unionRangeWithListBy (fun (_, _, _, _, _, _, m2) -> m2) let propertyNameBindingPat, _ = _2 @@ -6184,37 +6265,37 @@ let _fsyacc_reductions = lazy [| propertyNameBindingPat optPropertyType ) -//# 1934 "src/Compiler/pars.fsy" +//# 1954 "src/Compiler/pars.fsy" : 'gentype_memberCore)); -//# 6189 "pars.fs" +//# 6270 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1951 "src/Compiler/pars.fsy" +//# 1971 "src/Compiler/pars.fsy" let mAbstract = rhs parseState 1 AbstractMemberFlags true, SynLeadingKeyword.Abstract mAbstract ) -//# 1951 "src/Compiler/pars.fsy" +//# 1971 "src/Compiler/pars.fsy" : 'gentype_abstractMemberFlags)); -//# 6200 "pars.fs" +//# 6281 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1955 "src/Compiler/pars.fsy" +//# 1975 "src/Compiler/pars.fsy" let mAbstract = rhs parseState 1 let mMember = rhs parseState 2 AbstractMemberFlags true, SynLeadingKeyword.AbstractMember(mAbstract, mMember) ) -//# 1955 "src/Compiler/pars.fsy" +//# 1975 "src/Compiler/pars.fsy" : 'gentype_abstractMemberFlags)); -//# 6212 "pars.fs" +//# 6293 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1960 "src/Compiler/pars.fsy" +//# 1980 "src/Compiler/pars.fsy" let mWhole = rhs2 parseState 1 2 parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.InterfacesWithAbstractStaticMembers mWhole if parseState.LexBuffer.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers then @@ -6223,14 +6304,14 @@ let _fsyacc_reductions = lazy [| let mAbstract = rhs parseState 2 AbstractMemberFlags false, SynLeadingKeyword.StaticAbstract(mStatic, mAbstract) ) -//# 1960 "src/Compiler/pars.fsy" +//# 1980 "src/Compiler/pars.fsy" : 'gentype_abstractMemberFlags)); -//# 6228 "pars.fs" +//# 6309 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 1969 "src/Compiler/pars.fsy" +//# 1989 "src/Compiler/pars.fsy" let mWhole = rhs2 parseState 1 2 parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.InterfacesWithAbstractStaticMembers mWhole if parseState.LexBuffer.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers then @@ -6240,9 +6321,9 @@ let _fsyacc_reductions = lazy [| let mMember = rhs parseState 3 AbstractMemberFlags false, SynLeadingKeyword.StaticAbstractMember(mStatic, mAbstract, mMember) ) -//# 1969 "src/Compiler/pars.fsy" +//# 1989 "src/Compiler/pars.fsy" : 'gentype_abstractMemberFlags)); -//# 6245 "pars.fs" +//# 6326 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6250,13 +6331,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1981 "src/Compiler/pars.fsy" +//# 2001 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) [mkClassMemberLocalBindings(false, None, _1, _2, _3)] ) -//# 1981 "src/Compiler/pars.fsy" +//# 2001 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6259 "pars.fs" +//# 6340 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6264,13 +6345,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1985 "src/Compiler/pars.fsy" +//# 2005 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) [mkClassMemberLocalBindings(true, Some(rhs parseState 3), _1, _2, _4)] ) -//# 1985 "src/Compiler/pars.fsy" +//# 2005 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6273 "pars.fs" +//# 6354 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6280,7 +6361,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1989 "src/Compiler/pars.fsy" +//# 2009 "src/Compiler/pars.fsy" let rangeStart = rhs parseState 1 if Option.isSome _2 then errorR (Error (FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) @@ -6290,9 +6371,9 @@ let _fsyacc_reductions = lazy [| | _ -> () _4 _2 flags _1 rangeStart ) -//# 1989 "src/Compiler/pars.fsy" +//# 2009 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6295 "pars.fs" +//# 6376 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6301,7 +6382,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 1999 "src/Compiler/pars.fsy" +//# 2019 "src/Compiler/pars.fsy" let rangeStart = rhs parseState 1 if Option.isSome _2 then errorR (Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) @@ -6320,19 +6401,19 @@ let _fsyacc_reductions = lazy [| (_2, (Option.isSome _2), false, mWhole, DebugPointAtBinding.NoneAtInvisible, None, expr, mEnd, [], _1, flags, trivia) [SynMemberDefn.Member(binding, mWhole)] ) -//# 1999 "src/Compiler/pars.fsy" +//# 2019 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6325 "pars.fs" +//# 6406 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in let _3 = parseState.GetInput(3) :?> 'gentype_interfaceMember in - let _4 = parseState.GetInput(4) :?> 'gentype_appType in + let _4 = parseState.GetInput(4) :?> 'gentype_appTypeWithoutNull in let _5 = parseState.GetInput(5) :?> 'gentype_opt_interfaceImplDefn in Microsoft.FSharp.Core.Operators.box ( ( -//# 2019 "src/Compiler/pars.fsy" +//# 2039 "src/Compiler/pars.fsy" if not (isNil _1) then errorR(Error(FSComp.SR.parsAttributesAreNotPermittedOnInterfaceImplementations(), rhs parseState 1)) if Option.isSome _2 then errorR(Error(FSComp.SR.parsInterfacesHaveSameVisibilityAsEnclosingType(), rhs parseState 3)) let mWithKwd, members, mWhole = @@ -6341,9 +6422,9 @@ let _fsyacc_reductions = lazy [| | Some(mWithKwd, members, m) -> Some mWithKwd, Some members, unionRanges (rhs2 parseState 1 4) m [ SynMemberDefn.Interface(_4, mWithKwd, members, mWhole) ] ) -//# 2019 "src/Compiler/pars.fsy" +//# 2039 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6346 "pars.fs" +//# 6427 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6352,33 +6433,35 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2028 "src/Compiler/pars.fsy" +//# 2048 "src/Compiler/pars.fsy" let mInterface = rhs parseState 3 if not (isNil _1) then errorR(Error(FSComp.SR.parsAttributesAreNotPermittedOnInterfaceImplementations(), rhs parseState 1)) if Option.isSome _2 then errorR(Error(FSComp.SR.parsInterfacesHaveSameVisibilityAsEnclosingType(), mInterface)) let ty = SynType.FromParseError(mInterface.EndRange) [ SynMemberDefn.Interface(ty, None, None, rhs2 parseState 1 3) ] ) -//# 2028 "src/Compiler/pars.fsy" +//# 2048 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6364 "pars.fs" +//# 6445 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in let _3 = parseState.GetInput(3) :?> 'gentype_abstractMemberFlags in - let _4 = parseState.GetInput(4) :?> 'gentype_opt_inline in - let _5 = parseState.GetInput(5) :?> 'gentype_nameop in - let _6 = parseState.GetInput(6) :?> 'gentype_opt_explicitValTyparDecls in - let _8 = parseState.GetInput(8) :?> 'gentype_topTypeWithTypeConstraints in - let _9 = parseState.GetInput(9) :?> 'gentype_classMemberSpfnGetSet in - let _10 = parseState.GetInput(10) :?> 'gentype_opt_ODECLEND in + let _4 = parseState.GetInput(4) :?> 'gentype_opt_access in + let _5 = parseState.GetInput(5) :?> 'gentype_opt_inline in + let _6 = parseState.GetInput(6) :?> 'gentype_nameop in + let _7 = parseState.GetInput(7) :?> 'gentype_opt_explicitValTyparDecls in + let _9 = parseState.GetInput(9) :?> 'gentype_topTypeWithTypeConstraints in + let _10 = parseState.GetInput(10) :?> 'gentype_classMemberSpfnGetSet in + let _11 = parseState.GetInput(11) :?> 'gentype_opt_ODECLEND in Microsoft.FSharp.Core.Operators.box ( ( -//# 2035 "src/Compiler/pars.fsy" - let ty, arity = _8 - let isInline, doc, id, explicitValTyparDecls = (Option.isSome _4), grabXmlDoc(parseState, _1, 1), _5, _6 - let mWith, (getSet, getSetRangeOpt) = _9 +//# 2055 "src/Compiler/pars.fsy" + if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) + let ty, arity = _9 + let isInline, doc, id, explicitValTyparDecls = (Option.isSome _5), grabXmlDoc(parseState, _1, 1), _6, _7 + let mWith, (getSet, getSetRangeOpt, getterAccess, setterAccess) = _10 let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet let mWhole = let m = rhs parseState 1 @@ -6386,16 +6469,18 @@ let _fsyacc_reductions = lazy [| | None -> unionRanges m ty.Range | Some gs -> unionRanges m gs.Range |> unionRangeWithXmlDoc doc - if Option.isSome _2 then errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), mWhole)) + [ _2; _4; getterAccess; setterAccess ] + |> List.iter (function None -> () | Some access -> errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), access.Range))) let mkFlags, leadingKeyword = _3 - let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = _4; WithKeyword = mWith; EqualsRange = None } - let valSpfn = SynValSig(_1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWhole, trivia) + let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = _5; WithKeyword = mWith; EqualsRange = None } + let vis2 = SynValSigAccess.Single(None) + let valSpfn = SynValSig(_1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, None, mWhole, trivia) let trivia: SynMemberDefnAbstractSlotTrivia = { GetSetKeywords = getSetRangeOpt } [ SynMemberDefn.AbstractSlot(valSpfn, mkFlags (getSetAdjuster arity), mWhole, trivia) ] ) -//# 2035 "src/Compiler/pars.fsy" +//# 2055 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6398 "pars.fs" +//# 6483 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6403,14 +6488,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2053 "src/Compiler/pars.fsy" +//# 2078 "src/Compiler/pars.fsy" if not (isNil _1) then errorR(Error(FSComp.SR.parsAttributesIllegalOnInherit(), rhs parseState 1)) if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityIllegalOnInherit(), rhs parseState 1)) [ _3 ] ) -//# 2053 "src/Compiler/pars.fsy" +//# 2078 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6413 "pars.fs" +//# 6498 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6419,14 +6504,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2058 "src/Compiler/pars.fsy" +//# 2083 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let rangeStart = rhs parseState 1 _3 rangeStart _1 None ) -//# 2058 "src/Compiler/pars.fsy" +//# 2083 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6429 "pars.fs" +//# 6514 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6435,15 +6520,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2063 "src/Compiler/pars.fsy" +//# 2088 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let mStatic = rhs parseState 3 let rangeStart = rhs parseState 1 _4 rangeStart _1 (Some mStatic) ) -//# 2063 "src/Compiler/pars.fsy" +//# 2088 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6446 "pars.fs" +//# 6531 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6453,16 +6538,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2069 "src/Compiler/pars.fsy" +//# 2094 "src/Compiler/pars.fsy" let rangeStart = rhs parseState 1 if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let flags = _3 _4 _1 flags rangeStart ) -//# 2069 "src/Compiler/pars.fsy" +//# 2094 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6465 "pars.fs" +//# 6550 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6473,7 +6558,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2076 "src/Compiler/pars.fsy" +//# 2101 "src/Compiler/pars.fsy" let mWholeBindLhs = rhs2 parseState 1 (if Option.isSome _5 then 5 else 4) let mNew = rhs parseState 3 let xmlDoc = grabXmlDoc(parseState, _1, 1) @@ -6488,9 +6573,9 @@ let _fsyacc_reductions = lazy [| let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = Some mEquals } [ SynMemberDefn.Member(SynBinding (None, SynBindingKind.Normal, false, false, _1, xmlDoc, valSynData, declPat, None, expr, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] ) -//# 2076 "src/Compiler/pars.fsy" +//# 2101 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6493 "pars.fs" +//# 6578 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6500,7 +6585,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2091 "src/Compiler/pars.fsy" +//# 2116 "src/Compiler/pars.fsy" if not _6 then reportParseErrorAt (rhs parseState 6) (FSComp.SR.parsMissingMemberBody ()) let mNew = rhs parseState 3 let mAs = _5 |> Option.map (fun (mAs, id) -> id |> Option.map (fun id -> id.idRange) |> Option.defaultValue mAs) @@ -6514,9 +6599,9 @@ let _fsyacc_reductions = lazy [| let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = None } [ SynMemberDefn.Member(SynBinding(None, SynBindingKind.Normal, false, false, _1, xmlDoc, valSynData, declPat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] ) -//# 2091 "src/Compiler/pars.fsy" +//# 2116 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6519 "pars.fs" +//# 6604 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6525,7 +6610,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2105 "src/Compiler/pars.fsy" +//# 2130 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 5) (FSComp.SR.parsMissingMemberBody ()) let mNew = rhs parseState 3 let mAs = _5 |> Option.map (fun (mAs, id) -> id |> Option.map (fun id -> id.idRange) |> Option.defaultValue mAs) @@ -6539,9 +6624,9 @@ let _fsyacc_reductions = lazy [| let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = None } [ SynMemberDefn.Member(SynBinding (None, SynBindingKind.Normal, false, false, _1, xmlDoc, valSynData, declPat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] ) -//# 2105 "src/Compiler/pars.fsy" +//# 2130 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6544 "pars.fs" +//# 6629 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6550,7 +6635,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2119 "src/Compiler/pars.fsy" +//# 2144 "src/Compiler/pars.fsy" let m = rhs2 parseState 1 3 let mNew = rhs parseState 3 let xmlDoc = grabXmlDoc (parseState, _1, 1) @@ -6562,9 +6647,9 @@ let _fsyacc_reductions = lazy [| let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = None } [ SynMemberDefn.Member(SynBinding(None, SynBindingKind.Normal, false, false, _1, xmlDoc, valSynData, declPat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] ) -//# 2119 "src/Compiler/pars.fsy" +//# 2144 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6567 "pars.fs" +//# 6652 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -6573,14 +6658,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2131 "src/Compiler/pars.fsy" +//# 2156 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let leadingKeyword = SynTypeDefnLeadingKeyword.StaticType(rhs parseState 3, rhs parseState 4) [ SynMemberDefn.NestedType(_5 leadingKeyword, None, rhs2 parseState 1 5) ] ) -//# 2131 "src/Compiler/pars.fsy" +//# 2156 "src/Compiler/pars.fsy" : 'gentype_classDefnMember)); -//# 6583 "pars.fs" +//# 6668 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6589,14 +6674,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2139 "src/Compiler/pars.fsy" +//# 2164 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 fun rangeStart attribs mStaticOpt -> [ mkValField parseState mVal _2 _3 (Some _4) (Some _6) rangeStart attribs mStaticOpt ] ) -//# 2139 "src/Compiler/pars.fsy" +//# 2164 "src/Compiler/pars.fsy" : 'gentype_valDefnDecl)); -//# 6599 "pars.fs" +//# 6684 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6605,16 +6690,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2144 "src/Compiler/pars.fsy" +//# 2169 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 let mColon = rhs parseState 5 let ty = SynType.FromParseError(mColon.EndRange) fun rangeStart attribs mStaticOpt -> [ mkValField parseState mVal _2 _3 (Some _4) (Some ty) rangeStart attribs mStaticOpt ] ) -//# 2144 "src/Compiler/pars.fsy" +//# 2169 "src/Compiler/pars.fsy" : 'gentype_valDefnDecl)); -//# 6617 "pars.fs" +//# 6702 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6623,15 +6708,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2151 "src/Compiler/pars.fsy" +//# 2176 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 let ty = SynType.FromParseError(_4.idRange.EndRange) fun rangeStart attribs mStaticOpt -> [ mkValField parseState mVal _2 _3 (Some _4) (Some ty) rangeStart attribs mStaticOpt ] ) -//# 2151 "src/Compiler/pars.fsy" +//# 2176 "src/Compiler/pars.fsy" : 'gentype_valDefnDecl)); -//# 6634 "pars.fs" +//# 6719 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6639,14 +6724,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2157 "src/Compiler/pars.fsy" +//# 2182 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 fun rangeStart attribs mStaticOpt -> [ mkValField parseState mVal _2 _3 None None rangeStart attribs mStaticOpt ] ) -//# 2157 "src/Compiler/pars.fsy" +//# 2182 "src/Compiler/pars.fsy" : 'gentype_valDefnDecl)); -//# 6649 "pars.fs" +//# 6734 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6657,7 +6742,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2165 "src/Compiler/pars.fsy" +//# 2190 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 let mEquals = rhs parseState 6 if Option.isSome _2 then @@ -6666,9 +6751,9 @@ let _fsyacc_reductions = lazy [| let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) [ mkAutoPropDefn mVal _3 _4 _5 (Some mEquals) _7 _8 xmlDoc attribs flags rangeStart ] ) -//# 2165 "src/Compiler/pars.fsy" +//# 2190 "src/Compiler/pars.fsy" : 'gentype_autoPropsDefnDecl)); -//# 6671 "pars.fs" +//# 6756 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6678,7 +6763,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2174 "src/Compiler/pars.fsy" +//# 2199 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 let mEnd = match _5 with @@ -6689,11 +6774,11 @@ let _fsyacc_reductions = lazy [| errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) fun attribs flags rangeStart -> let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) - [ mkAutoPropDefn mVal _3 _4 _5 None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] + [ mkAutoPropDefn mVal _3 _4 _5 None expr (None, (SynMemberKind.Member, None, None, None)) xmlDoc attribs flags rangeStart ] ) -//# 2174 "src/Compiler/pars.fsy" +//# 2199 "src/Compiler/pars.fsy" : 'gentype_autoPropsDefnDecl)); -//# 6696 "pars.fs" +//# 6781 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6702,7 +6787,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2187 "src/Compiler/pars.fsy" +//# 2212 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 let mEnd = match _5 with @@ -6713,11 +6798,11 @@ let _fsyacc_reductions = lazy [| errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) fun attribs flags rangeStart -> let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) - [ mkAutoPropDefn mVal _3 _4 _5 None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] + [ mkAutoPropDefn mVal _3 _4 _5 None expr (None, (SynMemberKind.Member, None, None, None)) xmlDoc attribs flags rangeStart ] ) -//# 2187 "src/Compiler/pars.fsy" +//# 2212 "src/Compiler/pars.fsy" : 'gentype_autoPropsDefnDecl)); -//# 6720 "pars.fs" +//# 6805 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -6725,7 +6810,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2200 "src/Compiler/pars.fsy" +//# 2225 "src/Compiler/pars.fsy" let mVal = rhs parseState 1 let id = mkSynId mVal.EndRange "" let expr = arbExpr ("autoProp3", mVal.EndRange) @@ -6733,238 +6818,239 @@ let _fsyacc_reductions = lazy [| errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) fun attribs flags rangeStart -> let xmlDoc = grabXmlDocAtRangeStart(parseState, attribs, rangeStart) - [ mkAutoPropDefn mVal _3 id None None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] + [ mkAutoPropDefn mVal _3 id None None expr (None, (SynMemberKind.Member, None, None, None)) xmlDoc attribs flags rangeStart ] ) -//# 2200 "src/Compiler/pars.fsy" +//# 2225 "src/Compiler/pars.fsy" : 'gentype_autoPropsDefnDecl)); -//# 6740 "pars.fs" +//# 6825 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2212 "src/Compiler/pars.fsy" +//# 2237 "src/Compiler/pars.fsy" None ) -//# 2212 "src/Compiler/pars.fsy" +//# 2237 "src/Compiler/pars.fsy" : 'gentype_opt_typ)); -//# 6750 "pars.fs" +//# 6835 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 2215 "src/Compiler/pars.fsy" +//# 2240 "src/Compiler/pars.fsy" Some _2 ) -//# 2215 "src/Compiler/pars.fsy" +//# 2240 "src/Compiler/pars.fsy" : 'gentype_opt_typ)); -//# 6761 "pars.fs" +//# 6846 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2218 "src/Compiler/pars.fsy" +//# 2243 "src/Compiler/pars.fsy" let mColon = rhs parseState 1 let ty = SynType.FromParseError(mColon.EndRange) Some ty ) -//# 2218 "src/Compiler/pars.fsy" +//# 2243 "src/Compiler/pars.fsy" : 'gentype_opt_typ)); -//# 6774 "pars.fs" +//# 6859 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 2225 "src/Compiler/pars.fsy" +//# 2250 "src/Compiler/pars.fsy" if not (parseState.LexBuffer.SupportsFeature LanguageFeature.SingleUnderscorePattern) then raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedSymbolDot()) let underscore = ident("_", rhs parseState 1) let mDot = rhs parseState 2 None, prependIdentInLongIdentWithTrivia (SynIdent(underscore, None)) mDot _3 ) -//# 2225 "src/Compiler/pars.fsy" +//# 2250 "src/Compiler/pars.fsy" : 'gentype_atomicPatternLongIdent)); -//# 6789 "pars.fs" +//# 6874 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 2233 "src/Compiler/pars.fsy" +//# 2258 "src/Compiler/pars.fsy" let globalIdent = ident(MangledGlobalName, rhs parseState 1) let mDot = rhs parseState 2 None, prependIdentInLongIdentWithTrivia (SynIdent(globalIdent, (Some(IdentTrivia.OriginalNotation "global")))) mDot _3 ) -//# 2233 "src/Compiler/pars.fsy" +//# 2258 "src/Compiler/pars.fsy" : 'gentype_atomicPatternLongIdent)); -//# 6802 "pars.fs" +//# 6887 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 2238 "src/Compiler/pars.fsy" +//# 2263 "src/Compiler/pars.fsy" (None, _1) ) -//# 2238 "src/Compiler/pars.fsy" +//# 2263 "src/Compiler/pars.fsy" : 'gentype_atomicPatternLongIdent)); -//# 6813 "pars.fs" +//# 6898 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_access in let _4 = parseState.GetInput(4) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 2241 "src/Compiler/pars.fsy" +//# 2266 "src/Compiler/pars.fsy" if not (parseState.LexBuffer.SupportsFeature LanguageFeature.SingleUnderscorePattern) then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedSymbolDot()) let underscore = ident("_", rhs parseState 2) let mDot = rhs parseState 3 Some(_1), prependIdentInLongIdentWithTrivia (SynIdent(underscore, None)) mDot _4 ) -//# 2241 "src/Compiler/pars.fsy" +//# 2266 "src/Compiler/pars.fsy" : 'gentype_atomicPatternLongIdent)); -//# 6829 "pars.fs" +//# 6914 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_access in let _2 = parseState.GetInput(2) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 2249 "src/Compiler/pars.fsy" +//# 2274 "src/Compiler/pars.fsy" (Some(_1), _2) ) -//# 2249 "src/Compiler/pars.fsy" +//# 2274 "src/Compiler/pars.fsy" : 'gentype_atomicPatternLongIdent)); -//# 6841 "pars.fs" +//# 6926 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2254 "src/Compiler/pars.fsy" +//# 2279 "src/Compiler/pars.fsy" None ) -//# 2254 "src/Compiler/pars.fsy" +//# 2279 "src/Compiler/pars.fsy" : 'gentype_opt_access)); -//# 6851 "pars.fs" +//# 6936 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_access in Microsoft.FSharp.Core.Operators.box ( ( -//# 2257 "src/Compiler/pars.fsy" +//# 2282 "src/Compiler/pars.fsy" Some(_1) ) -//# 2257 "src/Compiler/pars.fsy" +//# 2282 "src/Compiler/pars.fsy" : 'gentype_opt_access)); -//# 6862 "pars.fs" +//# 6947 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2262 "src/Compiler/pars.fsy" +//# 2287 "src/Compiler/pars.fsy" let m = rhs parseState 1 SynAccess.Private m ) -//# 2262 "src/Compiler/pars.fsy" +//# 2287 "src/Compiler/pars.fsy" : 'gentype_access)); -//# 6873 "pars.fs" +//# 6958 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2266 "src/Compiler/pars.fsy" +//# 2291 "src/Compiler/pars.fsy" let m = rhs parseState 1 SynAccess.Public m ) -//# 2266 "src/Compiler/pars.fsy" +//# 2291 "src/Compiler/pars.fsy" : 'gentype_access)); -//# 6884 "pars.fs" +//# 6969 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2270 "src/Compiler/pars.fsy" +//# 2295 "src/Compiler/pars.fsy" let m = rhs parseState 1 SynAccess.Internal m ) -//# 2270 "src/Compiler/pars.fsy" +//# 2295 "src/Compiler/pars.fsy" : 'gentype_access)); -//# 6895 "pars.fs" +//# 6980 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_objectImplementationBlock in let _3 = parseState.GetInput(3) :?> 'gentype_declEnd in Microsoft.FSharp.Core.Operators.box ( ( -//# 2276 "src/Compiler/pars.fsy" +//# 2301 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 let members = _2 let m = (rhs parseState 1, members) ||> unionRangeWithListBy (fun (mem: SynMemberDefn) -> mem.Range) Some(mWithKwd, members, m) ) -//# 2276 "src/Compiler/pars.fsy" +//# 2301 "src/Compiler/pars.fsy" : 'gentype_opt_interfaceImplDefn)); -//# 6910 "pars.fs" +//# 6995 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2282 "src/Compiler/pars.fsy" +//# 2307 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 Some(mWithKwd, [], mWithKwd) ) -//# 2282 "src/Compiler/pars.fsy" +//# 2307 "src/Compiler/pars.fsy" : 'gentype_opt_interfaceImplDefn)); -//# 6921 "pars.fs" +//# 7006 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2286 "src/Compiler/pars.fsy" +//# 2311 "src/Compiler/pars.fsy" None ) -//# 2286 "src/Compiler/pars.fsy" +//# 2311 "src/Compiler/pars.fsy" : 'gentype_opt_interfaceImplDefn)); -//# 6931 "pars.fs" +//# 7016 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_classDefnBlock in let _3 = parseState.GetInput(3) :?> 'gentype_declEnd in Microsoft.FSharp.Core.Operators.box ( ( -//# 2291 "src/Compiler/pars.fsy" +//# 2316 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 (Some mWithKwd), _2 ) -//# 2291 "src/Compiler/pars.fsy" +//# 2316 "src/Compiler/pars.fsy" : 'gentype_opt_classDefn)); -//# 6944 "pars.fs" +//# 7029 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2295 "src/Compiler/pars.fsy" +//# 2320 "src/Compiler/pars.fsy" None, [] ) -//# 2295 "src/Compiler/pars.fsy" +//# 2320 "src/Compiler/pars.fsy" : 'gentype_opt_classDefn)); -//# 6954 "pars.fs" +//# 7039 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_optBaseSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 2301 "src/Compiler/pars.fsy" +//# 2326 "src/Compiler/pars.fsy" let mDecl = unionRanges (rhs parseState 1) _2.Range - SynMemberDefn.Inherit(_2, _3, mDecl) + let trivia = { InheritKeyword = rhs parseState 1 } + SynMemberDefn.Inherit(Some _2, _3, mDecl, trivia) ) -//# 2301 "src/Compiler/pars.fsy" +//# 2326 "src/Compiler/pars.fsy" : 'gentype_inheritsDefn)); -//# 6967 "pars.fs" +//# 7053 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in @@ -6973,150 +7059,152 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2305 "src/Compiler/pars.fsy" +//# 2331 "src/Compiler/pars.fsy" let mDecl = unionRanges (rhs parseState 1) _4.Range - SynMemberDefn.ImplicitInherit(_2, _4, _5, mDecl) + let trivia = { InheritKeyword = rhs parseState 1 } + SynMemberDefn.ImplicitInherit(_2, _4, _5, mDecl, trivia) ) -//# 2305 "src/Compiler/pars.fsy" +//# 2331 "src/Compiler/pars.fsy" : 'gentype_inheritsDefn)); -//# 6982 "pars.fs" +//# 7069 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2309 "src/Compiler/pars.fsy" +//# 2336 "src/Compiler/pars.fsy" let mDecl = (rhs parseState 1) + let trivia = { InheritKeyword = (rhs parseState 1) } if not _2 then errorR (Error(FSComp.SR.parsTypeNameCannotBeEmpty (), mDecl)) - SynMemberDefn.Inherit(SynType.LongIdent(SynLongIdent([], [], [])), None, mDecl) + SynMemberDefn.Inherit(None, None, mDecl, trivia) ) -//# 2309 "src/Compiler/pars.fsy" +//# 2336 "src/Compiler/pars.fsy" : 'gentype_inheritsDefn)); -//# 6995 "pars.fs" +//# 7083 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_asSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 2315 "src/Compiler/pars.fsy" +//# 2343 "src/Compiler/pars.fsy" Some(_1) ) -//# 2315 "src/Compiler/pars.fsy" +//# 2343 "src/Compiler/pars.fsy" : 'gentype_optAsSpec)); -//# 7006 "pars.fs" +//# 7094 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2318 "src/Compiler/pars.fsy" +//# 2346 "src/Compiler/pars.fsy" None ) -//# 2318 "src/Compiler/pars.fsy" +//# 2346 "src/Compiler/pars.fsy" : 'gentype_optAsSpec)); -//# 7016 "pars.fs" +//# 7104 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 2322 "src/Compiler/pars.fsy" +//# 2350 "src/Compiler/pars.fsy" rhs parseState 1, Some _2 ) -//# 2322 "src/Compiler/pars.fsy" +//# 2350 "src/Compiler/pars.fsy" : 'gentype_asSpec)); -//# 7027 "pars.fs" +//# 7115 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2325 "src/Compiler/pars.fsy" +//# 2353 "src/Compiler/pars.fsy" rhs parseState 1, None ) -//# 2325 "src/Compiler/pars.fsy" +//# 2353 "src/Compiler/pars.fsy" : 'gentype_asSpec)); -//# 7038 "pars.fs" +//# 7126 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_baseSpec in Microsoft.FSharp.Core.Operators.box ( ( -//# 2329 "src/Compiler/pars.fsy" +//# 2357 "src/Compiler/pars.fsy" Some(_1) ) -//# 2329 "src/Compiler/pars.fsy" +//# 2357 "src/Compiler/pars.fsy" : 'gentype_optBaseSpec)); -//# 7049 "pars.fs" +//# 7137 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2332 "src/Compiler/pars.fsy" +//# 2360 "src/Compiler/pars.fsy" None ) -//# 2332 "src/Compiler/pars.fsy" +//# 2360 "src/Compiler/pars.fsy" : 'gentype_optBaseSpec)); -//# 7059 "pars.fs" +//# 7147 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 2336 "src/Compiler/pars.fsy" +//# 2364 "src/Compiler/pars.fsy" if (_2).idText <> "base" then errorR(Error(FSComp.SR.parsInheritDeclarationsCannotHaveAsBindings(), rhs2 parseState 1 2)) ident("base", rhs parseState 2) ) -//# 2336 "src/Compiler/pars.fsy" +//# 2364 "src/Compiler/pars.fsy" : 'gentype_baseSpec)); -//# 7072 "pars.fs" +//# 7160 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2341 "src/Compiler/pars.fsy" +//# 2369 "src/Compiler/pars.fsy" errorR(Error(FSComp.SR.parsInheritDeclarationsCannotHaveAsBindings(), rhs2 parseState 1 2)) ident("base", rhs parseState 2) ) -//# 2341 "src/Compiler/pars.fsy" +//# 2369 "src/Compiler/pars.fsy" : 'gentype_baseSpec)); -//# 7083 "pars.fs" +//# 7171 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_objectImplementationMembers in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 2348 "src/Compiler/pars.fsy" +//# 2376 "src/Compiler/pars.fsy" _2 ) -//# 2348 "src/Compiler/pars.fsy" +//# 2376 "src/Compiler/pars.fsy" : 'gentype_objectImplementationBlock)); -//# 7095 "pars.fs" +//# 7183 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_objectImplementationMembers in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2351 "src/Compiler/pars.fsy" +//# 2379 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileObjectMembers()) _2 ) -//# 2351 "src/Compiler/pars.fsy" +//# 2379 "src/Compiler/pars.fsy" : 'gentype_objectImplementationBlock)); -//# 7108 "pars.fs" +//# 7196 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objectImplementationMembers in Microsoft.FSharp.Core.Operators.box ( ( -//# 2355 "src/Compiler/pars.fsy" +//# 2383 "src/Compiler/pars.fsy" _1 ) -//# 2355 "src/Compiler/pars.fsy" +//# 2383 "src/Compiler/pars.fsy" : 'gentype_objectImplementationBlock)); -//# 7119 "pars.fs" +//# 7207 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objectImplementationMember in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in @@ -7124,24 +7212,24 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2361 "src/Compiler/pars.fsy" +//# 2389 "src/Compiler/pars.fsy" _1 @ _3 ) -//# 2361 "src/Compiler/pars.fsy" +//# 2389 "src/Compiler/pars.fsy" : 'gentype_objectImplementationMembers)); -//# 7132 "pars.fs" +//# 7220 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objectImplementationMember in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in Microsoft.FSharp.Core.Operators.box ( ( -//# 2364 "src/Compiler/pars.fsy" +//# 2392 "src/Compiler/pars.fsy" _1 ) -//# 2364 "src/Compiler/pars.fsy" +//# 2392 "src/Compiler/pars.fsy" : 'gentype_objectImplementationMembers)); -//# 7144 "pars.fs" +//# 7232 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_staticMemberOrMemberOrOverride in @@ -7150,13 +7238,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2370 "src/Compiler/pars.fsy" +//# 2398 "src/Compiler/pars.fsy" let rangeStart = rhs parseState 1 _3 None _2 _1 rangeStart ) -//# 2370 "src/Compiler/pars.fsy" +//# 2398 "src/Compiler/pars.fsy" : 'gentype_objectImplementationMember)); -//# 7159 "pars.fs" +//# 7247 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_staticMemberOrMemberOrOverride in @@ -7165,25 +7253,40 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2374 "src/Compiler/pars.fsy" +//# 2402 "src/Compiler/pars.fsy" let rangeStart = rhs parseState 1 _3 _1 _2 rangeStart ) -//# 2374 "src/Compiler/pars.fsy" +//# 2402 "src/Compiler/pars.fsy" : 'gentype_objectImplementationMember)); -//# 7174 "pars.fs" +//# 7262 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_staticMemberOrMemberOrOverride in + let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2378 "src/Compiler/pars.fsy" - [] - ) -//# 2378 "src/Compiler/pars.fsy" - : 'gentype_objectImplementationMember)); -//# 7186 "pars.fs" +//# 2406 "src/Compiler/pars.fsy" + let rangeStart = rhs parseState 1 + let memFlagsBuilder, leadingKeyword = _2 + let flags = Some(memFlagsBuilder SynMemberKind.Member) + let xmlDoc = grabXmlDocAtRangeStart (parseState, _1, rangeStart) + let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = None; EqualsRange = None } + let mMember = rhs parseState 2 + let mEnd = mMember.EndRange + let bindingPat = patFromParseError (SynPat.Wild(mEnd)) + let expr = arbExpr ("objectImplementationMember1", mEnd) + let mWhole = rhs2 parseState 1 2 + let binding = + mkSynBinding + (xmlDoc, bindingPat) + (None, false, false, mWhole, DebugPointAtBinding.NoneAtInvisible, None, expr, mEnd, [], _1, flags, trivia) + [SynMemberDefn.Member(binding, mWhole)] + ) +//# 2406 "src/Compiler/pars.fsy" + : 'gentype_objectImplementationMember)); +//# 7289 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _3 = parseState.GetInput(3) :?> 'gentype_memberCore in @@ -7191,46 +7294,46 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2381 "src/Compiler/pars.fsy" +//# 2424 "src/Compiler/pars.fsy" [] ) -//# 2381 "src/Compiler/pars.fsy" +//# 2424 "src/Compiler/pars.fsy" : 'gentype_objectImplementationMember)); -//# 7199 "pars.fs" +//# 7302 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2386 "src/Compiler/pars.fsy" +//# 2429 "src/Compiler/pars.fsy" let mStatic = rhs parseState 1 let mMember = rhs parseState 2 ImplementStaticMemberFlags, (SynLeadingKeyword.StaticMember(mStatic, mMember)) ) -//# 2386 "src/Compiler/pars.fsy" +//# 2429 "src/Compiler/pars.fsy" : 'gentype_staticMemberOrMemberOrOverride)); -//# 7211 "pars.fs" +//# 7314 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2390 "src/Compiler/pars.fsy" +//# 2433 "src/Compiler/pars.fsy" let mMember = rhs parseState 1 OverrideMemberFlags, (SynLeadingKeyword.Member mMember) ) -//# 2390 "src/Compiler/pars.fsy" +//# 2433 "src/Compiler/pars.fsy" : 'gentype_staticMemberOrMemberOrOverride)); -//# 7222 "pars.fs" +//# 7325 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2393 "src/Compiler/pars.fsy" +//# 2436 "src/Compiler/pars.fsy" let mOverride = rhs parseState 1 OverrideMemberFlags, (SynLeadingKeyword.Override mOverride) ) -//# 2393 "src/Compiler/pars.fsy" +//# 2436 "src/Compiler/pars.fsy" : 'gentype_staticMemberOrMemberOrOverride)); -//# 7233 "pars.fs" +//# 7336 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -7241,13 +7344,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2402 "src/Compiler/pars.fsy" +//# 2445 "src/Compiler/pars.fsy" errorR(Error(FSComp.SR.parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString(), rhs parseState 4)) SynTypeDefnSimpleRepr.TypeAbbrev(ParserDetail.ErrorRecovery, SynType.LongIdent(_3), unionRanges (rhs parseState 1) _3.Range) ) -//# 2402 "src/Compiler/pars.fsy" +//# 2445 "src/Compiler/pars.fsy" : SynTypeDefnSimpleRepr)); -//# 7250 "pars.fs" +//# 7353 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -7255,14 +7358,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2407 "src/Compiler/pars.fsy" +//# 2450 "src/Compiler/pars.fsy" if not (isNil _1) then errorR(Error(FSComp.SR.parsAttributesIllegalHere(), rhs parseState 1)) if Option.isSome _2 then errorR(Error(FSComp.SR.parsTypeAbbreviationsCannotHaveVisibilityDeclarations(), rhs parseState 2)) SynTypeDefnSimpleRepr.TypeAbbrev(ParserDetail.Ok, _3, unionRanges (rhs parseState 1) _3.Range) ) -//# 2407 "src/Compiler/pars.fsy" +//# 2450 "src/Compiler/pars.fsy" : SynTypeDefnSimpleRepr)); -//# 7265 "pars.fs" +//# 7368 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -7270,7 +7373,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2413 "src/Compiler/pars.fsy" +//# 2456 "src/Compiler/pars.fsy" if not (isNil _1) then errorR(Error(FSComp.SR.parsAttributesIllegalHere(), rhs parseState 1)) let rangesOf3 = _3 |> List.map (function Choice1Of2 ec -> ec.Range | Choice2Of2 uc -> uc.Range) let mWhole = (rhs2 parseState 1 2, rangesOf3) ||> List.fold unionRanges @@ -7287,9 +7390,9 @@ let _fsyacc_reductions = lazy [| _3 |> List.choose (function Choice2Of2 data -> Some(data) | Choice1Of2 _ -> failwith "huh?"), mWhole) ) -//# 2413 "src/Compiler/pars.fsy" +//# 2456 "src/Compiler/pars.fsy" : SynTypeDefnSimpleRepr)); -//# 7292 "pars.fs" +//# 7395 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -7297,13 +7400,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2431 "src/Compiler/pars.fsy" +//# 2474 "src/Compiler/pars.fsy" if not (isNil _1) then errorR(Error(FSComp.SR.parsAttributesIllegalHere(), rhs parseState 1)) SynTypeDefnSimpleRepr.Record(_2, _3, lhs parseState) ) -//# 2431 "src/Compiler/pars.fsy" +//# 2474 "src/Compiler/pars.fsy" : SynTypeDefnSimpleRepr)); -//# 7306 "pars.fs" +//# 7409 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -7312,7 +7415,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2436 "src/Compiler/pars.fsy" +//# 2479 "src/Compiler/pars.fsy" if not (isNil _1) then errorR(Error(FSComp.SR.parsAttributesIllegalHere(), rhs parseState 1)) let mLhs = lhs parseState if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyError mLhs @@ -7321,9 +7424,9 @@ let _fsyacc_reductions = lazy [| let ilType = ParseAssemblyCodeType s parseState.LexBuffer.ReportLibraryOnlyFeatures parseState.LexBuffer.LanguageVersion parseState.LexBuffer.StrictIndentation (rhs parseState 5) SynTypeDefnSimpleRepr.LibraryOnlyILAssembly(box ilType, mLhs) ) -//# 2436 "src/Compiler/pars.fsy" +//# 2479 "src/Compiler/pars.fsy" : SynTypeDefnSimpleRepr)); -//# 7326 "pars.fs" +//# 7429 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_recdFieldDeclList in @@ -7331,12 +7434,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2448 "src/Compiler/pars.fsy" +//# 2491 "src/Compiler/pars.fsy" _2 ) -//# 2448 "src/Compiler/pars.fsy" +//# 2491 "src/Compiler/pars.fsy" : 'gentype_braceFieldDeclList)); -//# 7339 "pars.fs" +//# 7442 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_recdFieldDeclList in @@ -7344,158 +7447,158 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2451 "src/Compiler/pars.fsy" +//# 2494 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBrace()) _2 ) -//# 2451 "src/Compiler/pars.fsy" +//# 2494 "src/Compiler/pars.fsy" : 'gentype_braceFieldDeclList)); -//# 7353 "pars.fs" +//# 7456 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _3 = parseState.GetInput(3) :?> 'gentype_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 2455 "src/Compiler/pars.fsy" +//# 2498 "src/Compiler/pars.fsy" [] ) -//# 2455 "src/Compiler/pars.fsy" +//# 2498 "src/Compiler/pars.fsy" : 'gentype_braceFieldDeclList)); -//# 7365 "pars.fs" +//# 7468 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 2458 "src/Compiler/pars.fsy" - errorR (Error(FSComp.SR.parsExpectingField(), rhs parseState 2)) +//# 2501 "src/Compiler/pars.fsy" + errorR (Error(FSComp.SR.parsExpectingRecordField (), rhs parseState 2)) [] ) -//# 2458 "src/Compiler/pars.fsy" +//# 2501 "src/Compiler/pars.fsy" : 'gentype_braceFieldDeclList)); -//# 7378 "pars.fs" +//# 7481 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_braceBarFieldDeclListCore in Microsoft.FSharp.Core.Operators.box ( ( -//# 2463 "src/Compiler/pars.fsy" +//# 2506 "src/Compiler/pars.fsy" _2, true ) -//# 2463 "src/Compiler/pars.fsy" +//# 2506 "src/Compiler/pars.fsy" : 'gentype_anonRecdType)); -//# 7389 "pars.fs" +//# 7492 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_braceBarFieldDeclListCore in Microsoft.FSharp.Core.Operators.box ( ( -//# 2465 "src/Compiler/pars.fsy" +//# 2508 "src/Compiler/pars.fsy" _1, false ) -//# 2465 "src/Compiler/pars.fsy" +//# 2508 "src/Compiler/pars.fsy" : 'gentype_anonRecdType)); -//# 7400 "pars.fs" +//# 7503 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recdFieldDeclList in let _3 = parseState.GetInput(3) :?> 'gentype_bar_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 2470 "src/Compiler/pars.fsy" +//# 2513 "src/Compiler/pars.fsy" _2 ) -//# 2470 "src/Compiler/pars.fsy" +//# 2513 "src/Compiler/pars.fsy" : 'gentype_braceBarFieldDeclListCore)); -//# 7412 "pars.fs" +//# 7515 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recdFieldDeclList in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2473 "src/Compiler/pars.fsy" +//# 2516 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) _2 ) -//# 2473 "src/Compiler/pars.fsy" +//# 2516 "src/Compiler/pars.fsy" : 'gentype_braceBarFieldDeclListCore)); -//# 7425 "pars.fs" +//# 7528 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_bar_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 2477 "src/Compiler/pars.fsy" +//# 2520 "src/Compiler/pars.fsy" [] ) -//# 2477 "src/Compiler/pars.fsy" +//# 2520 "src/Compiler/pars.fsy" : 'gentype_braceBarFieldDeclListCore)); -//# 7436 "pars.fs" +//# 7539 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2481 "src/Compiler/pars.fsy" +//# 2524 "src/Compiler/pars.fsy" SynTypeDefnKind.Class ) -//# 2481 "src/Compiler/pars.fsy" +//# 2524 "src/Compiler/pars.fsy" : 'gentype_classOrInterfaceOrStruct)); -//# 7446 "pars.fs" +//# 7549 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2484 "src/Compiler/pars.fsy" +//# 2527 "src/Compiler/pars.fsy" SynTypeDefnKind.Interface ) -//# 2484 "src/Compiler/pars.fsy" +//# 2527 "src/Compiler/pars.fsy" : 'gentype_classOrInterfaceOrStruct)); -//# 7456 "pars.fs" +//# 7559 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2487 "src/Compiler/pars.fsy" +//# 2530 "src/Compiler/pars.fsy" SynTypeDefnKind.Struct ) -//# 2487 "src/Compiler/pars.fsy" +//# 2530 "src/Compiler/pars.fsy" : 'gentype_classOrInterfaceOrStruct)); -//# 7466 "pars.fs" +//# 7569 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2490 "src/Compiler/pars.fsy" +//# 2533 "src/Compiler/pars.fsy" ) -//# 2490 "src/Compiler/pars.fsy" +//# 2533 "src/Compiler/pars.fsy" : 'gentype_interfaceMember)); -//# 7476 "pars.fs" +//# 7579 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2491 "src/Compiler/pars.fsy" +//# 2534 "src/Compiler/pars.fsy" ) -//# 2491 "src/Compiler/pars.fsy" +//# 2534 "src/Compiler/pars.fsy" : 'gentype_interfaceMember)); -//# 7486 "pars.fs" +//# 7589 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_access in let _2 = parseState.GetInput(2) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 2495 "src/Compiler/pars.fsy" +//# 2538 "src/Compiler/pars.fsy" None, _2.LongIdent, false, _1 ) -//# 2495 "src/Compiler/pars.fsy" +//# 2538 "src/Compiler/pars.fsy" : 'gentype_tyconNameAndTyparDecls)); -//# 7498 "pars.fs" +//# 7601 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_access in let _2 = parseState.GetInput(2) :?> 'gentype_prefixTyparDecls in @@ -7503,12 +7606,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2498 "src/Compiler/pars.fsy" +//# 2541 "src/Compiler/pars.fsy" Some _2, _3.LongIdent, false, _1 ) -//# 2498 "src/Compiler/pars.fsy" +//# 2541 "src/Compiler/pars.fsy" : 'gentype_tyconNameAndTyparDecls)); -//# 7511 "pars.fs" +//# 7614 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_access in let _2 = parseState.GetInput(2) :?> SynLongIdent in @@ -7516,82 +7619,82 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2501 "src/Compiler/pars.fsy" +//# 2544 "src/Compiler/pars.fsy" Some _3, _2.LongIdent, true, _1 ) -//# 2501 "src/Compiler/pars.fsy" +//# 2544 "src/Compiler/pars.fsy" : 'gentype_tyconNameAndTyparDecls)); -//# 7524 "pars.fs" +//# 7627 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_access in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2504 "src/Compiler/pars.fsy" +//# 2547 "src/Compiler/pars.fsy" None, [], false, _1 ) -//# 2504 "src/Compiler/pars.fsy" +//# 2547 "src/Compiler/pars.fsy" : 'gentype_tyconNameAndTyparDecls)); -//# 7536 "pars.fs" +//# 7639 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 2508 "src/Compiler/pars.fsy" +//# 2551 "src/Compiler/pars.fsy" SynTyparDecls.SinglePrefix(SynTyparDecl([], _1, [], SynTyparDeclTrivia.Zero), rhs parseState 1) ) -//# 2508 "src/Compiler/pars.fsy" +//# 2551 "src/Compiler/pars.fsy" : 'gentype_prefixTyparDecls)); -//# 7547 "pars.fs" +//# 7650 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typarDeclList in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 2511 "src/Compiler/pars.fsy" +//# 2554 "src/Compiler/pars.fsy" SynTyparDecls.PrefixList(List.rev _2, rhs2 parseState 1 3) ) -//# 2511 "src/Compiler/pars.fsy" +//# 2554 "src/Compiler/pars.fsy" : 'gentype_prefixTyparDecls)); -//# 7559 "pars.fs" +//# 7662 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typarDeclList in let _3 = parseState.GetInput(3) :?> 'gentype_typarDecl in Microsoft.FSharp.Core.Operators.box ( ( -//# 2514 "src/Compiler/pars.fsy" +//# 2557 "src/Compiler/pars.fsy" _3 :: _1 ) -//# 2514 "src/Compiler/pars.fsy" +//# 2557 "src/Compiler/pars.fsy" : 'gentype_typarDeclList)); -//# 7571 "pars.fs" +//# 7674 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typarDecl in Microsoft.FSharp.Core.Operators.box ( ( -//# 2515 "src/Compiler/pars.fsy" +//# 2558 "src/Compiler/pars.fsy" [_1] ) -//# 2515 "src/Compiler/pars.fsy" +//# 2558 "src/Compiler/pars.fsy" : 'gentype_typarDeclList)); -//# 7582 "pars.fs" +//# 7685 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 2519 "src/Compiler/pars.fsy" +//# 2562 "src/Compiler/pars.fsy" SynTyparDecl(_1, _2, [], SynTyparDeclTrivia.Zero) ) -//# 2519 "src/Compiler/pars.fsy" +//# 2562 "src/Compiler/pars.fsy" : 'gentype_typarDecl)); -//# 7594 "pars.fs" +//# 7697 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> SynTypar in @@ -7599,14 +7702,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2522 "src/Compiler/pars.fsy" +//# 2565 "src/Compiler/pars.fsy" parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.ConstraintIntersectionOnFlexibleTypes (rhs2 parseState 3 4) let constraints, mAmpersands = _4 SynTyparDecl(_1, _2, List.rev constraints, { AmpersandRanges = rhs parseState 3 :: List.rev mAmpersands }) ) -//# 2522 "src/Compiler/pars.fsy" +//# 2565 "src/Compiler/pars.fsy" : 'gentype_typarDecl)); -//# 7609 "pars.fs" +//# 7712 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_HIGH_PRECEDENCE_TYAPP in let _2 = parseState.GetInput(2) :?> bool in @@ -7616,46 +7719,46 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2530 "src/Compiler/pars.fsy" +//# 2573 "src/Compiler/pars.fsy" let m = rhs2 parseState 2 5 if not _2 then warning(Error(FSComp.SR.parsNonAdjacentTypars(), m)) SynTyparDecls.PostfixList(List.rev _3, _4, m) ) -//# 2530 "src/Compiler/pars.fsy" +//# 2573 "src/Compiler/pars.fsy" : 'gentype_postfixTyparDecls)); -//# 7626 "pars.fs" +//# 7729 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typarDeclList in Microsoft.FSharp.Core.Operators.box ( ( -//# 2538 "src/Compiler/pars.fsy" +//# 2581 "src/Compiler/pars.fsy" (List.rev _1, true) ) -//# 2538 "src/Compiler/pars.fsy" +//# 2581 "src/Compiler/pars.fsy" : 'gentype_explicitValTyparDeclsCore)); -//# 7637 "pars.fs" +//# 7740 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typarDeclList in Microsoft.FSharp.Core.Operators.box ( ( -//# 2541 "src/Compiler/pars.fsy" +//# 2584 "src/Compiler/pars.fsy" (List.rev _1, false) ) -//# 2541 "src/Compiler/pars.fsy" +//# 2584 "src/Compiler/pars.fsy" : 'gentype_explicitValTyparDeclsCore)); -//# 7648 "pars.fs" +//# 7751 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2544 "src/Compiler/pars.fsy" +//# 2587 "src/Compiler/pars.fsy" ([], false) ) -//# 2544 "src/Compiler/pars.fsy" +//# 2587 "src/Compiler/pars.fsy" : 'gentype_explicitValTyparDeclsCore)); -//# 7658 "pars.fs" +//# 7761 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_HIGH_PRECEDENCE_TYAPP in let _2 = parseState.GetInput(2) :?> bool in @@ -7665,171 +7768,216 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2548 "src/Compiler/pars.fsy" +//# 2591 "src/Compiler/pars.fsy" let m = rhs2 parseState 2 5 if not _2 then warning(Error(FSComp.SR.parsNonAdjacentTypars(), m)) let tps, flex = _3 let tps = SynTyparDecls.PostfixList(tps, _4, m) SynValTyparDecls(Some tps, flex) ) -//# 2548 "src/Compiler/pars.fsy" +//# 2591 "src/Compiler/pars.fsy" : 'gentype_explicitValTyparDecls)); -//# 7677 "pars.fs" +//# 7780 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_explicitValTyparDecls in Microsoft.FSharp.Core.Operators.box ( ( -//# 2556 "src/Compiler/pars.fsy" +//# 2599 "src/Compiler/pars.fsy" _1 ) -//# 2556 "src/Compiler/pars.fsy" +//# 2599 "src/Compiler/pars.fsy" : 'gentype_opt_explicitValTyparDecls)); -//# 7688 "pars.fs" +//# 7791 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2558 "src/Compiler/pars.fsy" +//# 2601 "src/Compiler/pars.fsy" SynValTyparDecls(None, true) ) -//# 2558 "src/Compiler/pars.fsy" +//# 2601 "src/Compiler/pars.fsy" : 'gentype_opt_explicitValTyparDecls)); -//# 7698 "pars.fs" +//# 7801 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = parseState.GetInput(2) :?> 'gentype_atomType in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2605 "src/Compiler/pars.fsy" + SynType.HashConstraint(_2, lhs parseState) + ) +//# 2605 "src/Compiler/pars.fsy" + : 'gentype_hashConstraint)); +//# 7812 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2564 "src/Compiler/pars.fsy" +//# 2611 "src/Compiler/pars.fsy" [] ) -//# 2564 "src/Compiler/pars.fsy" +//# 2611 "src/Compiler/pars.fsy" : 'gentype_opt_typeConstraints)); -//# 7708 "pars.fs" +//# 7822 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typeConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 2567 "src/Compiler/pars.fsy" +//# 2614 "src/Compiler/pars.fsy" List.rev _2 ) -//# 2567 "src/Compiler/pars.fsy" +//# 2614 "src/Compiler/pars.fsy" : 'gentype_opt_typeConstraints)); -//# 7719 "pars.fs" +//# 7833 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeConstraints in let _3 = parseState.GetInput(3) :?> 'gentype_typeConstraint in Microsoft.FSharp.Core.Operators.box ( ( -//# 2573 "src/Compiler/pars.fsy" +//# 2620 "src/Compiler/pars.fsy" _3 :: _1 ) -//# 2573 "src/Compiler/pars.fsy" +//# 2620 "src/Compiler/pars.fsy" : 'gentype_typeConstraints)); -//# 7731 "pars.fs" +//# 7845 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeConstraint in Microsoft.FSharp.Core.Operators.box ( ( -//# 2576 "src/Compiler/pars.fsy" +//# 2623 "src/Compiler/pars.fsy" [_1] ) -//# 2576 "src/Compiler/pars.fsy" +//# 2623 "src/Compiler/pars.fsy" : 'gentype_typeConstraints)); -//# 7742 "pars.fs" +//# 7856 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_intersectionConstraints in + let _3 = parseState.GetInput(3) :?> 'gentype_hashConstraint in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2629 "src/Compiler/pars.fsy" + let constraints, mAmpersands = _1 + (_3 :: constraints), (rhs parseState 2 :: mAmpersands) + ) +//# 2629 "src/Compiler/pars.fsy" + : 'gentype_intersectionConstraints)); +//# 7869 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_intersectionConstraints in let _3 = parseState.GetInput(3) :?> 'gentype_atomType in Microsoft.FSharp.Core.Operators.box ( ( -//# 2582 "src/Compiler/pars.fsy" +//# 2633 "src/Compiler/pars.fsy" let constraints, mAmpersands = _1 - match _3 with - | SynType.HashConstraint _ -> () - | ty -> errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), ty.Range)) + errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), _3.Range)) (_3 :: constraints), (rhs parseState 2 :: mAmpersands) ) -//# 2582 "src/Compiler/pars.fsy" +//# 2633 "src/Compiler/pars.fsy" + : 'gentype_intersectionConstraints)); +//# 7883 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_hashConstraint in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2638 "src/Compiler/pars.fsy" + [ _1 ], [] + ) +//# 2638 "src/Compiler/pars.fsy" : 'gentype_intersectionConstraints)); -//# 7758 "pars.fs" +//# 7894 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomType in Microsoft.FSharp.Core.Operators.box ( ( -//# 2591 "src/Compiler/pars.fsy" - match _1 with - | SynType.HashConstraint _ -> () - | ty -> errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), ty.Range)) +//# 2641 "src/Compiler/pars.fsy" + errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), _1.Range)) [ _1 ], [] ) -//# 2591 "src/Compiler/pars.fsy" +//# 2641 "src/Compiler/pars.fsy" : 'gentype_intersectionConstraints)); -//# 7772 "pars.fs" +//# 7906 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynTypar in let _4 = parseState.GetInput(4) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 2601 "src/Compiler/pars.fsy" +//# 2648 "src/Compiler/pars.fsy" if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyError (lhs parseState) SynTypeConstraint.WhereTyparDefaultsToType(_2, _4, lhs parseState) ) -//# 2601 "src/Compiler/pars.fsy" +//# 2648 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7785 "pars.fs" +//# 7919 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 2605 "src/Compiler/pars.fsy" +//# 2652 "src/Compiler/pars.fsy" SynTypeConstraint.WhereTyparSubtypeOfType(_1, _3, lhs parseState) ) -//# 2605 "src/Compiler/pars.fsy" +//# 2652 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7797 "pars.fs" +//# 7931 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 2608 "src/Compiler/pars.fsy" +//# 2655 "src/Compiler/pars.fsy" SynTypeConstraint.WhereTyparIsValueType(_1, lhs parseState) ) -//# 2608 "src/Compiler/pars.fsy" +//# 2655 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7808 "pars.fs" +//# 7942 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _3 = parseState.GetInput(3) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 2611 "src/Compiler/pars.fsy" +//# 2658 "src/Compiler/pars.fsy" if _3 <> "not" then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(_3)) SynTypeConstraint.WhereTyparIsReferenceType(_1, lhs parseState) ) -//# 2611 "src/Compiler/pars.fsy" +//# 2658 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7821 "pars.fs" +//# 7955 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 2615 "src/Compiler/pars.fsy" +//# 2662 "src/Compiler/pars.fsy" SynTypeConstraint.WhereTyparSupportsNull(_1, lhs parseState) ) -//# 2615 "src/Compiler/pars.fsy" +//# 2662 "src/Compiler/pars.fsy" + : 'gentype_typeConstraint)); +//# 7966 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> SynTypar in + let _3 = parseState.GetInput(3) :?> string in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2665 "src/Compiler/pars.fsy" + if _3 <> "not" then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(_3 + " (2)")) + let trivia : SynTypeConstraintWhereTyparNotSupportsNullTrivia = { ColonRange = rhs parseState 2; NotRange = rhs parseState 3 } + SynTypeConstraint.WhereTyparNotSupportsNull(_1, lhs parseState, trivia) + ) +//# 2665 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7832 "pars.fs" +//# 7980 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _4 = parseState.GetInput(4) :?> 'gentype_classMemberSpfn in @@ -7837,13 +7985,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2618 "src/Compiler/pars.fsy" +//# 2670 "src/Compiler/pars.fsy" let tp = _1 SynTypeConstraint.WhereTyparSupportsMember(SynType.Var(tp, tp.Range), _4, lhs parseState) ) -//# 2618 "src/Compiler/pars.fsy" +//# 2670 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7846 "pars.fs" +//# 7994 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typeAlts in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in @@ -7852,27 +8000,27 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2622 "src/Compiler/pars.fsy" +//# 2674 "src/Compiler/pars.fsy" let mParen = rhs2 parseState 1 3 let t = SynType.Paren(_2, mParen) SynTypeConstraint.WhereTyparSupportsMember(t, _6, lhs parseState) ) -//# 2622 "src/Compiler/pars.fsy" +//# 2674 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7862 "pars.fs" +//# 8010 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _4 = parseState.GetInput(4) :?> range * range option * SynType list * range list * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 2627 "src/Compiler/pars.fsy" +//# 2679 "src/Compiler/pars.fsy" let _ltm, _gtm, args, _commas, mWhole = _4 SynTypeConstraint.WhereTyparIsDelegate(_1, args, unionRanges _1.Range mWhole) ) -//# 2627 "src/Compiler/pars.fsy" +//# 2679 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7875 "pars.fs" +//# 8023 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _3 = parseState.GetInput(3) :?> string in @@ -7880,80 +8028,80 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2631 "src/Compiler/pars.fsy" +//# 2683 "src/Compiler/pars.fsy" match _3 with | "enum" -> let _ltm, _gtm, args, _commas, mWhole = _4 SynTypeConstraint.WhereTyparIsEnum(_1, args, unionRanges _1.Range mWhole) - | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm)) + | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm + " (3)")) ) -//# 2631 "src/Compiler/pars.fsy" +//# 2683 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7892 "pars.fs" +//# 8040 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _3 = parseState.GetInput(3) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 2638 "src/Compiler/pars.fsy" +//# 2690 "src/Compiler/pars.fsy" match _3 with | "comparison" -> SynTypeConstraint.WhereTyparIsComparable(_1, lhs parseState) | "equality" -> SynTypeConstraint.WhereTyparIsEquatable(_1, lhs parseState) | "unmanaged" -> SynTypeConstraint.WhereTyparIsUnmanaged(_1, lhs parseState) - | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm)) + | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm + " (4)")) ) -//# 2638 "src/Compiler/pars.fsy" +//# 2690 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7908 "pars.fs" +//# 8056 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 2645 "src/Compiler/pars.fsy" +//# 2697 "src/Compiler/pars.fsy" SynTypeConstraint.WhereSelfConstrained(_1, lhs parseState) ) -//# 2645 "src/Compiler/pars.fsy" +//# 2697 "src/Compiler/pars.fsy" : 'gentype_typeConstraint)); -//# 7919 "pars.fs" +//# 8067 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeAlts in - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeWithoutNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 2649 "src/Compiler/pars.fsy" +//# 2701 "src/Compiler/pars.fsy" let mOr = rhs parseState 2 let m = unionRanges _1.Range _3.Range SynType.Or(_1, _3, m, { OrKeyword = mOr }) ) -//# 2649 "src/Compiler/pars.fsy" +//# 2701 "src/Compiler/pars.fsy" : 'gentype_typeAlts)); -//# 7933 "pars.fs" +//# 8081 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 2654 "src/Compiler/pars.fsy" +//# 2706 "src/Compiler/pars.fsy" _1 ) -//# 2654 "src/Compiler/pars.fsy" +//# 2706 "src/Compiler/pars.fsy" : 'gentype_typeAlts)); -//# 7944 "pars.fs" +//# 8092 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_barAndgrabXmlDoc in let _2 = parseState.GetInput(2) :?> 'gentype_attrUnionCaseDecls in Microsoft.FSharp.Core.Operators.box ( ( -//# 2661 "src/Compiler/pars.fsy" +//# 2713 "src/Compiler/pars.fsy" _2 _1 ) -//# 2661 "src/Compiler/pars.fsy" +//# 2713 "src/Compiler/pars.fsy" : Choice list)); -//# 7956 "pars.fs" +//# 8104 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_firstUnionCaseDeclOfMany in let _2 = parseState.GetInput(2) :?> 'gentype_barAndgrabXmlDoc in @@ -7961,34 +8109,34 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2664 "src/Compiler/pars.fsy" +//# 2716 "src/Compiler/pars.fsy" _1 :: _3 _2 ) -//# 2664 "src/Compiler/pars.fsy" +//# 2716 "src/Compiler/pars.fsy" : Choice list)); -//# 7969 "pars.fs" +//# 8117 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_firstUnionCaseDecl in Microsoft.FSharp.Core.Operators.box ( ( -//# 2667 "src/Compiler/pars.fsy" +//# 2719 "src/Compiler/pars.fsy" [_1] ) -//# 2667 "src/Compiler/pars.fsy" +//# 2719 "src/Compiler/pars.fsy" : Choice list)); -//# 7980 "pars.fs" +//# 8128 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2671 "src/Compiler/pars.fsy" +//# 2723 "src/Compiler/pars.fsy" let mBar = rhs parseState 1 grabXmlDoc(parseState, [], 1), mBar ) -//# 2671 "src/Compiler/pars.fsy" +//# 2723 "src/Compiler/pars.fsy" : 'gentype_barAndgrabXmlDoc)); -//# 7991 "pars.fs" +//# 8139 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attrUnionCaseDecl in let _2 = parseState.GetInput(2) :?> 'gentype_barAndgrabXmlDoc in @@ -7996,23 +8144,23 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2676 "src/Compiler/pars.fsy" +//# 2728 "src/Compiler/pars.fsy" (fun xmlDocAndBar -> _1 xmlDocAndBar :: _3 _2) ) -//# 2676 "src/Compiler/pars.fsy" +//# 2728 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecls)); -//# 8004 "pars.fs" +//# 8152 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attrUnionCaseDecl in Microsoft.FSharp.Core.Operators.box ( ( -//# 2679 "src/Compiler/pars.fsy" +//# 2731 "src/Compiler/pars.fsy" (fun xmlDocAndBar -> [ _1 xmlDocAndBar ]) ) -//# 2679 "src/Compiler/pars.fsy" +//# 2731 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecls)); -//# 8015 "pars.fs" +//# 8163 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8020,12 +8168,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2684 "src/Compiler/pars.fsy" +//# 2736 "src/Compiler/pars.fsy" mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.Fields []) (rhs2 parseState 1 3) >> Choice2Of2 ) -//# 2684 "src/Compiler/pars.fsy" +//# 2736 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8028 "pars.fs" +//# 8176 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8033,12 +8181,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2687 "src/Compiler/pars.fsy" +//# 2739 "src/Compiler/pars.fsy" fun (xmlDoc, mBar) -> mkSynUnionCase _1 _2 (SynIdent(mkSynId mBar.EndRange "", None)) (SynUnionCaseKind.Fields []) mBar (xmlDoc, mBar) |> Choice2Of2 ) -//# 2687 "src/Compiler/pars.fsy" +//# 2739 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8041 "pars.fs" +//# 8189 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8047,12 +8195,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2690 "src/Compiler/pars.fsy" - mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.Fields _5) (rhs2 parseState 1 5) >> Choice2Of2 +//# 2742 "src/Compiler/pars.fsy" + let mId = rhs parseState 3 + let fields, mFields = _5 + let mWhole = unionRanges mId mFields + mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.Fields fields) mWhole >> Choice2Of2 ) -//# 2690 "src/Compiler/pars.fsy" +//# 2742 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8055 "pars.fs" +//# 8206 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8061,13 +8212,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2693 "src/Compiler/pars.fsy" +//# 2748 "src/Compiler/pars.fsy" errorR (Error(FSComp.SR.parsMissingKeyword("of"), rhs2 parseState 3 4)) - mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.Fields _4) (rhs2 parseState 1 4) >> Choice2Of2 + let mAttributes = rhs parseState 1 + let fields, mFields = _4 + let mWhole = unionRanges mAttributes mFields + mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.Fields fields) mWhole >> Choice2Of2 ) -//# 2693 "src/Compiler/pars.fsy" +//# 2748 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8070 "pars.fs" +//# 8224 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8075,15 +8229,18 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2697 "src/Compiler/pars.fsy" +//# 2755 "src/Compiler/pars.fsy" + let mAttributes = rhs parseState 1 let mOf = rhs parseState 3 let mId = mOf.StartRange + let fields, mFields = _4 + let mWhole = unionRanges mAttributes mFields errorR (Error(FSComp.SR.parsMissingUnionCaseName(), mOf)) - mkSynUnionCase _1 _2 (SynIdent(mkSynId mId "", None)) (SynUnionCaseKind.Fields _4) (rhs2 parseState 1 4) >> Choice2Of2 + mkSynUnionCase _1 _2 (SynIdent(mkSynId mId "", None)) (SynUnionCaseKind.Fields fields) mWhole >> Choice2Of2 ) -//# 2697 "src/Compiler/pars.fsy" +//# 2755 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8086 "pars.fs" +//# 8243 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8091,15 +8248,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2703 "src/Compiler/pars.fsy" +//# 2764 "src/Compiler/pars.fsy" let mOf = rhs parseState 3 let mId = mOf.StartRange errorR (Error(FSComp.SR.parsMissingUnionCaseName(), mOf)) mkSynUnionCase _1 _2 (SynIdent(mkSynId mId "", None)) (SynUnionCaseKind.Fields []) (rhs2 parseState 1 3) >> Choice2Of2 ) -//# 2703 "src/Compiler/pars.fsy" +//# 2764 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8102 "pars.fs" +//# 8259 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8108,12 +8265,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2709 "src/Compiler/pars.fsy" +//# 2770 "src/Compiler/pars.fsy" mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.Fields []) (rhs2 parseState 1 4) >> Choice2Of2 ) -//# 2709 "src/Compiler/pars.fsy" +//# 2770 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8116 "pars.fs" +//# 8273 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8122,13 +8279,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2712 "src/Compiler/pars.fsy" +//# 2773 "src/Compiler/pars.fsy" + let mAttributes = rhs parseState 1 + let fullType, _ = _5 + let mWhole = unionRanges mAttributes fullType.Range if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyWarning(lhs parseState) - mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.FullType _5) (rhs2 parseState 1 5) >> Choice2Of2 + mkSynUnionCase _1 _2 _3 (SynUnionCaseKind.FullType _5) mWhole >> Choice2Of2 ) -//# 2712 "src/Compiler/pars.fsy" +//# 2773 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8131 "pars.fs" +//# 8291 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8137,70 +8297,93 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2716 "src/Compiler/pars.fsy" +//# 2780 "src/Compiler/pars.fsy" if Option.isSome _2 then errorR(Error(FSComp.SR.parsEnumFieldsCannotHaveVisibilityDeclarations(), rhs parseState 2)) let mEquals = rhs parseState 4 - let mDecl = rhs2 parseState 1 5 + let mAttributes = rhs parseState 1 + let expr, _ = _5 + let mDecl = unionRanges mAttributes expr.Range (fun (xmlDoc, mBar) -> let trivia: SynEnumCaseTrivia = { BarRange = Some mBar; EqualsRange = mEquals } let mDecl = unionRangeWithXmlDoc xmlDoc mDecl Choice1Of2 (SynEnumCase (_1, _3, fst _5, xmlDoc, mDecl, trivia))) ) -//# 2716 "src/Compiler/pars.fsy" +//# 2780 "src/Compiler/pars.fsy" + : 'gentype_attrUnionCaseDecl)); +//# 8313 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in + let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in + let _3 = parseState.GetInput(3) :?> 'gentype_unionCaseName in + let _5 = parseState.GetInput(5) :?> 'gentype_recover in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2791 "src/Compiler/pars.fsy" + if Option.isSome _2 then errorR(Error(FSComp.SR.parsEnumFieldsCannotHaveVisibilityDeclarations(), rhs parseState 2)) + let mEquals = rhs parseState 4 + let expr = arbExpr ("attrUnionCaseDecl", mEquals.EndRange) + let mDecl = rhs2 parseState 1 4 + fun (xmlDoc, mBar) -> + let trivia: SynEnumCaseTrivia = { BarRange = Some mBar; EqualsRange = mEquals } + let mDecl = unionRangeWithXmlDoc xmlDoc mDecl + Choice1Of2 (SynEnumCase (_1, _3, expr, xmlDoc, mDecl, trivia)) + ) +//# 2791 "src/Compiler/pars.fsy" : 'gentype_attrUnionCaseDecl)); -//# 8151 "pars.fs" +//# 8334 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_nameop in Microsoft.FSharp.Core.Operators.box ( ( -//# 2727 "src/Compiler/pars.fsy" +//# 2803 "src/Compiler/pars.fsy" _1 ) -//# 2727 "src/Compiler/pars.fsy" +//# 2803 "src/Compiler/pars.fsy" : 'gentype_unionCaseName)); -//# 8162 "pars.fs" +//# 8345 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 2730 "src/Compiler/pars.fsy" +//# 2806 "src/Compiler/pars.fsy" let lpr = rhs parseState 1 let rpr = rhs parseState 3 SynIdent(ident(opNameCons, rhs parseState 2), Some(IdentTrivia.OriginalNotationWithParen(lpr, "::", rpr))) ) -//# 2730 "src/Compiler/pars.fsy" +//# 2806 "src/Compiler/pars.fsy" : 'gentype_unionCaseName)); -//# 8175 "pars.fs" +//# 8358 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _4 = parseState.GetInput(4) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 2735 "src/Compiler/pars.fsy" +//# 2811 "src/Compiler/pars.fsy" let lpr = rhs parseState 1 let rpr = rhs parseState 3 SynIdent(ident(opNameNil, rhs2 parseState 2 3), Some(IdentTrivia.OriginalNotationWithParen(lpr, "[]", rpr))) ) -//# 2735 "src/Compiler/pars.fsy" +//# 2811 "src/Compiler/pars.fsy" : 'gentype_unionCaseName)); -//# 8188 "pars.fs" +//# 8371 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _2 = parseState.GetInput(2) :?> 'gentype_opt_OBLOCKSEP in Microsoft.FSharp.Core.Operators.box ( ( -//# 2741 "src/Compiler/pars.fsy" +//# 2817 "src/Compiler/pars.fsy" let trivia: SynUnionCaseTrivia = { BarRange = None } let xmlDoc = grabXmlDoc(parseState, [], 1) let mDecl = (rhs parseState 1) |> unionRangeWithXmlDoc xmlDoc Choice2Of2 (SynUnionCase ([], (SynIdent(_1, None)), SynUnionCaseKind.Fields [], xmlDoc, None, mDecl, trivia)) ) -//# 2741 "src/Compiler/pars.fsy" +//# 2817 "src/Compiler/pars.fsy" : 'gentype_firstUnionCaseDeclOfMany)); -//# 8203 "pars.fs" +//# 8386 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> SynExpr * bool in @@ -8208,76 +8391,115 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2747 "src/Compiler/pars.fsy" +//# 2823 "src/Compiler/pars.fsy" let mEquals = rhs parseState 2 let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } let xmlDoc = grabXmlDoc(parseState, [], 1) let mDecl = (rhs2 parseState 1 3) |> unionRangeWithXmlDoc xmlDoc Choice1Of2 (SynEnumCase ([], SynIdent(_1, None), fst _3, xmlDoc, mDecl, trivia)) ) -//# 2747 "src/Compiler/pars.fsy" +//# 2823 "src/Compiler/pars.fsy" + : 'gentype_firstUnionCaseDeclOfMany)); +//# 8403 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Ident in + let _3 = parseState.GetInput(3) :?> 'gentype_recover in + let _4 = parseState.GetInput(4) :?> 'gentype_opt_OBLOCKSEP in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2830 "src/Compiler/pars.fsy" + let mEquals = rhs parseState 2 + let expr = arbExpr ("firstUnionCaseDeclOfMany1", mEquals.EndRange) + let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } + let xmlDoc = grabXmlDoc(parseState, [], 1) + let mDecl = (rhs2 parseState 1 2) |> unionRangeWithXmlDoc xmlDoc + Choice1Of2 (SynEnumCase ([], SynIdent(_1, None), expr, xmlDoc, mDecl, trivia)) + ) +//# 2830 "src/Compiler/pars.fsy" : 'gentype_firstUnionCaseDeclOfMany)); -//# 8220 "pars.fs" +//# 8421 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_firstUnionCaseDecl in let _2 = parseState.GetInput(2) :?> 'gentype_opt_OBLOCKSEP in Microsoft.FSharp.Core.Operators.box ( ( -//# 2754 "src/Compiler/pars.fsy" +//# 2838 "src/Compiler/pars.fsy" _1 ) -//# 2754 "src/Compiler/pars.fsy" +//# 2838 "src/Compiler/pars.fsy" : 'gentype_firstUnionCaseDeclOfMany)); -//# 8232 "pars.fs" +//# 8433 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_unionCaseRepr in Microsoft.FSharp.Core.Operators.box ( ( -//# 2758 "src/Compiler/pars.fsy" +//# 2842 "src/Compiler/pars.fsy" + let fields, mFields = _3 + let trivia: SynUnionCaseTrivia = { BarRange = None } + let xmlDoc = grabXmlDoc (parseState, [], 1) + let mId = rhs parseState 1 + let mDecl = unionRanges mId mFields |> unionRangeWithXmlDoc xmlDoc + Choice2Of2(SynUnionCase([], SynIdent(_1, None), SynUnionCaseKind.Fields fields, xmlDoc, None, mDecl, trivia)) + ) +//# 2842 "src/Compiler/pars.fsy" + : 'gentype_firstUnionCaseDecl)); +//# 8450 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_unionCaseName in + let _3 = parseState.GetInput(3) :?> 'gentype_topType in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2850 "src/Compiler/pars.fsy" + if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyWarning(lhs parseState) let trivia: SynUnionCaseTrivia = { BarRange = None } let xmlDoc = grabXmlDoc (parseState, [], 1) - let mDecl = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc - Choice2Of2(SynUnionCase([], SynIdent(_1, None), SynUnionCaseKind.Fields _3, xmlDoc, None, mDecl, trivia)) + let mId = rhs parseState 1 + let fullType, _ = _3 + let mDecl = unionRanges mId fullType.Range |> unionRangeWithXmlDoc xmlDoc + Choice2Of2(SynUnionCase([], _1, SynUnionCaseKind.FullType _3, xmlDoc, None, mDecl, trivia)) ) -//# 2758 "src/Compiler/pars.fsy" +//# 2850 "src/Compiler/pars.fsy" : 'gentype_firstUnionCaseDecl)); -//# 8247 "pars.fs" +//# 8468 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2764 "src/Compiler/pars.fsy" +//# 2859 "src/Compiler/pars.fsy" let trivia: SynUnionCaseTrivia = { BarRange = None } let xmlDoc = grabXmlDoc (parseState, [], 1) let mDecl = rhs2 parseState 1 2 |> unionRangeWithXmlDoc xmlDoc Choice2Of2(SynUnionCase([], SynIdent(_1, None), SynUnionCaseKind.Fields [], xmlDoc, None, mDecl, trivia)) ) -//# 2764 "src/Compiler/pars.fsy" +//# 2859 "src/Compiler/pars.fsy" : 'gentype_firstUnionCaseDecl)); -//# 8262 "pars.fs" +//# 8483 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_unionCaseRepr in Microsoft.FSharp.Core.Operators.box ( ( -//# 2770 "src/Compiler/pars.fsy" +//# 2865 "src/Compiler/pars.fsy" let mOf = rhs parseState 1 let mId = mOf.StartRange + let fields, mFields = _2 errorR (Error(FSComp.SR.parsMissingUnionCaseName(), mOf)) let id = SynIdent(mkSynId mId "", None) let trivia: SynUnionCaseTrivia = { BarRange = None } let xmlDoc = grabXmlDoc (parseState, [], 1) - let mDecl = rhs2 parseState 1 2 |> unionRangeWithXmlDoc xmlDoc - Choice2Of2(SynUnionCase([], id, SynUnionCaseKind.Fields _2, xmlDoc, None, mDecl, trivia)) + let mDecl = unionRanges mOf mFields |> unionRangeWithXmlDoc xmlDoc + Choice2Of2(SynUnionCase([], id, SynUnionCaseKind.Fields fields, xmlDoc, None, mDecl, trivia)) ) -//# 2770 "src/Compiler/pars.fsy" +//# 2865 "src/Compiler/pars.fsy" : 'gentype_firstUnionCaseDecl)); -//# 8280 "pars.fs" +//# 8502 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> SynExpr * bool in @@ -8285,116 +8507,186 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2780 "src/Compiler/pars.fsy" +//# 2876 "src/Compiler/pars.fsy" + let mId = rhs parseState 1 let mEquals = rhs parseState 2 let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } let xmlDoc = grabXmlDoc (parseState, [], 1) - let mDecl = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc + let expr, _ = _3 + let mDecl = unionRanges mId expr.Range |> unionRangeWithXmlDoc xmlDoc Choice1Of2(SynEnumCase([], SynIdent(_1, None), fst _3, xmlDoc, mDecl, trivia)) ) -//# 2780 "src/Compiler/pars.fsy" +//# 2876 "src/Compiler/pars.fsy" : 'gentype_firstUnionCaseDecl)); -//# 8297 "pars.fs" +//# 8521 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> Ident in + let _3 = parseState.GetInput(3) :?> 'gentype_recover in + let _4 = parseState.GetInput(4) :?> 'gentype_opt_OBLOCKSEP in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2885 "src/Compiler/pars.fsy" + let mEquals = rhs parseState 2 + let expr = arbExpr ("firstUnionCaseDecl", mEquals.EndRange) + let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } + let xmlDoc = grabXmlDoc (parseState, [], 1) + let mDecl = rhs2 parseState 1 2 |> unionRangeWithXmlDoc xmlDoc + Choice1Of2(SynEnumCase([], SynIdent(_1, None), expr, xmlDoc, mDecl, trivia)) + ) +//# 2885 "src/Compiler/pars.fsy" + : 'gentype_firstUnionCaseDecl)); +//# 8539 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_unionCaseReprElement in let _3 = parseState.GetInput(3) :?> 'gentype_unionCaseReprElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 2788 "src/Compiler/pars.fsy" - _1 :: _3 +//# 2895 "src/Compiler/pars.fsy" + let mField = rhs parseState 1 + let fields, mFields = _3 + _1 :: fields, unionRanges mField mFields ) -//# 2788 "src/Compiler/pars.fsy" +//# 2895 "src/Compiler/pars.fsy" : 'gentype_unionCaseReprElements)); -//# 8309 "pars.fs" +//# 8553 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_unionCaseReprElement in + let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2791 "src/Compiler/pars.fsy" - [_1] +//# 2900 "src/Compiler/pars.fsy" + let mStar = rhs parseState 2 + let ty = SynType.FromParseError mStar.EndRange + let field = mkSynAnonField (ty, PreXmlDoc.Empty) + [_1; field], rhs2 parseState 1 2 ) -//# 2791 "src/Compiler/pars.fsy" +//# 2900 "src/Compiler/pars.fsy" + : 'gentype_unionCaseReprElements)); +//# 8568 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = parseState.GetInput(2) :?> 'gentype_unionCaseReprElements in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2906 "src/Compiler/pars.fsy" + let mStar = rhs parseState 1 + errorR (Error(FSComp.SR.parsExpectingUnionCaseField (), rhs parseState 1)) + let fields, mFields = _2 + let ty = SynType.FromParseError mStar.StartRange + let field = mkSynAnonField (ty, PreXmlDoc.Empty) + field :: fields, unionRanges mStar mFields + ) +//# 2906 "src/Compiler/pars.fsy" : 'gentype_unionCaseReprElements)); -//# 8320 "pars.fs" +//# 8584 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_unionCaseReprElement in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2914 "src/Compiler/pars.fsy" + [_1], _1.Range + ) +//# 2914 "src/Compiler/pars.fsy" + : 'gentype_unionCaseReprElements)); +//# 8595 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 2795 "src/Compiler/pars.fsy" - let xmlDoc = grabXmlDoc(parseState, [], 1) - let mWhole = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc +//# 2918 "src/Compiler/pars.fsy" + let xmlDoc = grabXmlDoc (parseState, [], 1) + let mId = rhs parseState 1 + let mWhole = unionRanges mId _3.Range |> unionRangeWithXmlDoc xmlDoc mkSynNamedField (_1, _3, xmlDoc, mWhole) ) -//# 2795 "src/Compiler/pars.fsy" +//# 2918 "src/Compiler/pars.fsy" : 'gentype_unionCaseReprElement)); -//# 8334 "pars.fs" +//# 8610 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> Ident in + let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2800 "src/Compiler/pars.fsy" - let xmlDoc = grabXmlDoc(parseState, [], 1) +//# 2924 "src/Compiler/pars.fsy" + let xmlDoc = grabXmlDoc (parseState, [], 1) + let mColon = rhs parseState 2 + let ty = SynType.FromParseError mColon.EndRange + let mWhole = rhs2 parseState 1 2 |> unionRangeWithXmlDoc xmlDoc + mkSynNamedField (_1, ty, xmlDoc, mWhole) + ) +//# 2924 "src/Compiler/pars.fsy" + : 'gentype_unionCaseReprElement)); +//# 8626 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> SynType in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 2931 "src/Compiler/pars.fsy" + let xmlDoc = grabXmlDoc (parseState, [], 1) mkSynAnonField (_1, xmlDoc) ) -//# 2800 "src/Compiler/pars.fsy" +//# 2931 "src/Compiler/pars.fsy" : 'gentype_unionCaseReprElement)); -//# 8346 "pars.fs" +//# 8638 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_invalidUseOfAppTypeFunction in Microsoft.FSharp.Core.Operators.box ( ( -//# 2804 "src/Compiler/pars.fsy" - let xmlDoc = grabXmlDoc(parseState, [], 1) +//# 2935 "src/Compiler/pars.fsy" + let xmlDoc = grabXmlDoc (parseState, [], 1) let mWhole = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc - reportParseErrorAt (_3 : SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField()) + reportParseErrorAt (_3: SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField ()) mkSynNamedField (_1, _3, xmlDoc, mWhole) ) -//# 2804 "src/Compiler/pars.fsy" +//# 2935 "src/Compiler/pars.fsy" : 'gentype_unionCaseReprElement)); -//# 8361 "pars.fs" +//# 8653 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_invalidUseOfAppTypeFunction in Microsoft.FSharp.Core.Operators.box ( ( -//# 2810 "src/Compiler/pars.fsy" - let xmlDoc = grabXmlDoc(parseState, [], 1) - reportParseErrorAt (_1 : SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField()) +//# 2941 "src/Compiler/pars.fsy" + let xmlDoc = grabXmlDoc (parseState, [], 1) + reportParseErrorAt (_1: SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField ()) mkSynAnonField (_1, xmlDoc) ) -//# 2810 "src/Compiler/pars.fsy" +//# 2941 "src/Compiler/pars.fsy" : 'gentype_unionCaseReprElement)); -//# 8374 "pars.fs" +//# 8666 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_braceFieldDeclList in Microsoft.FSharp.Core.Operators.box ( ( -//# 2816 "src/Compiler/pars.fsy" +//# 2947 "src/Compiler/pars.fsy" errorR(Deprecated(FSComp.SR.parsConsiderUsingSeparateRecordType(), lhs parseState)) - _1 + _1, rhs parseState 1 ) -//# 2816 "src/Compiler/pars.fsy" +//# 2947 "src/Compiler/pars.fsy" : 'gentype_unionCaseRepr)); -//# 8386 "pars.fs" +//# 8678 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_unionCaseReprElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 2820 "src/Compiler/pars.fsy" +//# 2951 "src/Compiler/pars.fsy" _1 ) -//# 2820 "src/Compiler/pars.fsy" +//# 2951 "src/Compiler/pars.fsy" : 'gentype_unionCaseRepr)); -//# 8397 "pars.fs" +//# 8689 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recdFieldDecl in let _2 = parseState.GetInput(2) :?> 'gentype_seps in @@ -8402,31 +8694,31 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2825 "src/Compiler/pars.fsy" +//# 2956 "src/Compiler/pars.fsy" _1 :: _3 ) -//# 2825 "src/Compiler/pars.fsy" +//# 2956 "src/Compiler/pars.fsy" : 'gentype_recdFieldDeclList)); -//# 8410 "pars.fs" +//# 8702 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recdFieldDecl in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in Microsoft.FSharp.Core.Operators.box ( ( -//# 2828 "src/Compiler/pars.fsy" +//# 2959 "src/Compiler/pars.fsy" [_1] ) -//# 2828 "src/Compiler/pars.fsy" +//# 2959 "src/Compiler/pars.fsy" : 'gentype_recdFieldDeclList)); -//# 8422 "pars.fs" +//# 8714 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_fieldDecl in Microsoft.FSharp.Core.Operators.box ( ( -//# 2833 "src/Compiler/pars.fsy" +//# 2964 "src/Compiler/pars.fsy" let rangeStart = rhs parseState 1 let fld = _2 _1 None rangeStart None let (SynField (a, b, c, d, e, xmlDoc, vis, mWhole, trivia)) = fld @@ -8434,9 +8726,9 @@ let _fsyacc_reductions = lazy [| let mWhole = unionRangeWithXmlDoc xmlDoc mWhole SynField (a, b, c, d, e, xmlDoc, None, mWhole, trivia) ) -//# 2833 "src/Compiler/pars.fsy" +//# 2964 "src/Compiler/pars.fsy" : 'gentype_recdFieldDecl)); -//# 8439 "pars.fs" +//# 8731 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_mutable in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8445,12 +8737,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2843 "src/Compiler/pars.fsy" +//# 2974 "src/Compiler/pars.fsy" mkSynField parseState (Some _3) (Some _5) _1 _2 ) -//# 2843 "src/Compiler/pars.fsy" +//# 2974 "src/Compiler/pars.fsy" : 'gentype_fieldDecl)); -//# 8453 "pars.fs" +//# 8745 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_mutable in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8459,14 +8751,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2846 "src/Compiler/pars.fsy" +//# 2977 "src/Compiler/pars.fsy" let mColon = rhs parseState 4 let t = SynType.FromParseError(mColon.EndRange) mkSynField parseState (Some _3) (Some t) _1 _2 ) -//# 2846 "src/Compiler/pars.fsy" +//# 2977 "src/Compiler/pars.fsy" : 'gentype_fieldDecl)); -//# 8469 "pars.fs" +//# 8761 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_mutable in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8475,13 +8767,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2851 "src/Compiler/pars.fsy" +//# 2982 "src/Compiler/pars.fsy" let t = SynType.FromParseError(_3.idRange.EndRange) mkSynField parseState (Some _3) (Some t) _1 _2 ) -//# 2851 "src/Compiler/pars.fsy" +//# 2982 "src/Compiler/pars.fsy" : 'gentype_fieldDecl)); -//# 8484 "pars.fs" +//# 8776 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_mutable in let _2 = parseState.GetInput(2) :?> 'gentype_opt_access in @@ -8489,25 +8781,25 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2855 "src/Compiler/pars.fsy" +//# 2986 "src/Compiler/pars.fsy" mkSynField parseState None None _1 _2 ) -//# 2855 "src/Compiler/pars.fsy" +//# 2986 "src/Compiler/pars.fsy" : 'gentype_fieldDecl)); -//# 8497 "pars.fs" +//# 8789 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExceptionDefnRepr in let _2 = parseState.GetInput(2) :?> 'gentype_opt_classDefn in Microsoft.FSharp.Core.Operators.box ( ( -//# 2860 "src/Compiler/pars.fsy" +//# 2991 "src/Compiler/pars.fsy" let mWith, optClassDefn = _2 SynExceptionDefn(_1, mWith, optClassDefn, (_1.Range, optClassDefn) ||> unionRangeWithListBy (fun cd -> cd.Range)) ) -//# 2860 "src/Compiler/pars.fsy" +//# 2991 "src/Compiler/pars.fsy" : SynExceptionDefn)); -//# 8510 "pars.fs" +//# 8802 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -8516,16 +8808,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2866 "src/Compiler/pars.fsy" +//# 2997 "src/Compiler/pars.fsy" let m = match _5 with | None -> rhs2 parseState 1 4 | Some p -> unionRanges (rangeOfLongIdent p) (rhs2 parseState 1 4) SynExceptionDefnRepr(_2, _4, _5, PreXmlDoc.Empty, _3, m) ) -//# 2866 "src/Compiler/pars.fsy" +//# 2997 "src/Compiler/pars.fsy" : SynExceptionDefnRepr)); -//# 8528 "pars.fs" +//# 8820 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_attributes in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -8533,7 +8825,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2873 "src/Compiler/pars.fsy" +//# 3004 "src/Compiler/pars.fsy" let m = match _3 with | Some access -> unionRanges (rhs parseState 1) access.Range @@ -8545,65 +8837,66 @@ let _fsyacc_reductions = lazy [| let unionCase = SynUnionCase([], id, SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, m, { BarRange = None }) SynExceptionDefnRepr(_2, unionCase, None, PreXmlDoc.Empty, _3, m) ) -//# 2873 "src/Compiler/pars.fsy" +//# 3004 "src/Compiler/pars.fsy" : SynExceptionDefnRepr)); -//# 8550 "pars.fs" +//# 8842 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 2890 "src/Compiler/pars.fsy" +//# 3021 "src/Compiler/pars.fsy" SynUnionCase([], SynIdent(_1, None), SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) ) -//# 2890 "src/Compiler/pars.fsy" +//# 3021 "src/Compiler/pars.fsy" : 'gentype_exconIntro)); -//# 8561 "pars.fs" +//# 8853 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_unionCaseRepr in Microsoft.FSharp.Core.Operators.box ( ( -//# 2893 "src/Compiler/pars.fsy" - SynUnionCase([], SynIdent(_1, None), SynUnionCaseKind.Fields _3, PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) +//# 3024 "src/Compiler/pars.fsy" + let fields, _ = _3 + SynUnionCase([], SynIdent(_1, None), SynUnionCaseKind.Fields fields, PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) ) -//# 2893 "src/Compiler/pars.fsy" +//# 3024 "src/Compiler/pars.fsy" : 'gentype_exconIntro)); -//# 8573 "pars.fs" +//# 8866 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 2896 "src/Compiler/pars.fsy" +//# 3028 "src/Compiler/pars.fsy" SynUnionCase([], SynIdent(_1, None), SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) ) -//# 2896 "src/Compiler/pars.fsy" +//# 3028 "src/Compiler/pars.fsy" : 'gentype_exconIntro)); -//# 8585 "pars.fs" +//# 8878 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 2900 "src/Compiler/pars.fsy" +//# 3032 "src/Compiler/pars.fsy" None ) -//# 2900 "src/Compiler/pars.fsy" +//# 3032 "src/Compiler/pars.fsy" : 'gentype_exconRepr)); -//# 8595 "pars.fs" +//# 8888 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 2903 "src/Compiler/pars.fsy" +//# 3035 "src/Compiler/pars.fsy" Some(_2.LongIdent) ) -//# 2903 "src/Compiler/pars.fsy" +//# 3035 "src/Compiler/pars.fsy" : 'gentype_exconRepr)); -//# 8606 "pars.fs" +//# 8899 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_opt_rec in @@ -8611,7 +8904,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2911 "src/Compiler/pars.fsy" +//# 3043 "src/Compiler/pars.fsy" let mLetKwd = rhs parseState 1 let isUse = _1 let isRec = _2 @@ -8637,36 +8930,36 @@ let _fsyacc_reductions = lazy [| [], binds), bindingSetRange) ) -//# 2911 "src/Compiler/pars.fsy" +//# 3043 "src/Compiler/pars.fsy" : 'gentype_defnBindings)); -//# 8642 "pars.fs" +//# 8935 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_cPrototype in Microsoft.FSharp.Core.Operators.box ( ( -//# 2940 "src/Compiler/pars.fsy" +//# 3072 "src/Compiler/pars.fsy" let bindRange = lhs parseState BindingSetPreAttrs(bindRange, false, false, _1, bindRange) ) -//# 2940 "src/Compiler/pars.fsy" +//# 3072 "src/Compiler/pars.fsy" : 'gentype_defnBindings)); -//# 8654 "pars.fs" +//# 8947 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 2947 "src/Compiler/pars.fsy" +//# 3079 "src/Compiler/pars.fsy" let mDoKwd = rhs parseState 1 let mWhole = unionRanges mDoKwd _2.Range // any attributes prior to the 'let' are left free, e.g. become top-level attributes // associated with the module, 'main' function or assembly depending on their target BindingSetPreAttrs(mDoKwd, false, false, (fun attrs vis -> attrs, [mkSynDoBinding (vis, mDoKwd, _2, mWhole)]), mWhole) ) -//# 2947 "src/Compiler/pars.fsy" +//# 3079 "src/Compiler/pars.fsy" : 'gentype_doBinding)); -//# 8669 "pars.fs" +//# 8962 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_opt_rec in @@ -8675,7 +8968,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 2957 "src/Compiler/pars.fsy" +//# 3089 "src/Compiler/pars.fsy" let mLetKwd = rhs parseState 1 let isUse = _1 let isRec = _2 @@ -8708,16 +9001,16 @@ let _fsyacc_reductions = lazy [| (unionRanges mLetKwd bindingSetRange), mIn ) -//# 2957 "src/Compiler/pars.fsy" +//# 3089 "src/Compiler/pars.fsy" : 'gentype_hardwhiteLetBindings)); -//# 8713 "pars.fs" +//# 9006 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_hardwhiteDefnBindingsTerminator in Microsoft.FSharp.Core.Operators.box ( ( -//# 2997 "src/Compiler/pars.fsy" +//# 3129 "src/Compiler/pars.fsy" let mDo = rhs parseState 1 let _, _, mDone = _3 let mAll = unionRanges mDo _2.Range @@ -8726,89 +9019,89 @@ let _fsyacc_reductions = lazy [| // associated with the module, 'main' function or assembly depending on their target BindingSetPreAttrs(mDo, false, false, (fun attrs vis -> attrs, [mkSynDoBinding (vis, mDo, _2, mAll)]), mAll), _2 ) -//# 2997 "src/Compiler/pars.fsy" +//# 3129 "src/Compiler/pars.fsy" : 'gentype_hardwhiteDoBinding)); -//# 8731 "pars.fs" +//# 9024 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 3006 "src/Compiler/pars.fsy" +//# 3138 "src/Compiler/pars.fsy" let mDo = rhs parseState 1 reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectingExpression ()) let seqPt = DebugPointAtBinding.NoneAtDo let expr = arbExpr ("hardwhiteDoBinding1", mDo.EndRange) BindingSetPreAttrs(mDo, false, false, (fun attrs vis -> attrs, [mkSynDoBinding (vis, mDo, expr, mDo)]), mDo), expr ) -//# 3006 "src/Compiler/pars.fsy" +//# 3138 "src/Compiler/pars.fsy" : 'gentype_hardwhiteDoBinding)); -//# 8746 "pars.fs" +//# 9039 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_defnBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3015 "src/Compiler/pars.fsy" +//# 3147 "src/Compiler/pars.fsy" _1 ) -//# 3015 "src/Compiler/pars.fsy" +//# 3147 "src/Compiler/pars.fsy" : 'gentype_classDefnBindings)); -//# 8757 "pars.fs" +//# 9050 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_doBinding in Microsoft.FSharp.Core.Operators.box ( ( -//# 3018 "src/Compiler/pars.fsy" +//# 3150 "src/Compiler/pars.fsy" _1 ) -//# 3018 "src/Compiler/pars.fsy" +//# 3150 "src/Compiler/pars.fsy" : 'gentype_classDefnBindings)); -//# 8768 "pars.fs" +//# 9061 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteLetBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3021 "src/Compiler/pars.fsy" +//# 3153 "src/Compiler/pars.fsy" let b, m, _ = _1 b ) -//# 3021 "src/Compiler/pars.fsy" +//# 3153 "src/Compiler/pars.fsy" : 'gentype_classDefnBindings)); -//# 8780 "pars.fs" +//# 9073 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteDoBinding in Microsoft.FSharp.Core.Operators.box ( ( -//# 3025 "src/Compiler/pars.fsy" +//# 3157 "src/Compiler/pars.fsy" fst _1 ) -//# 3025 "src/Compiler/pars.fsy" +//# 3157 "src/Compiler/pars.fsy" : 'gentype_classDefnBindings)); -//# 8791 "pars.fs" +//# 9084 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 3031 "src/Compiler/pars.fsy" +//# 3163 "src/Compiler/pars.fsy" let mToken = rhs parseState 1 // In LexFilter.fs the IN token could have been transformed to an ODECLEND one. let mIn = if (mToken.EndColumn - mToken.StartColumn) = 2 then Some mToken else None (fun _ m -> ()), mIn, Some _1 ) -//# 3031 "src/Compiler/pars.fsy" +//# 3163 "src/Compiler/pars.fsy" : 'gentype_hardwhiteDefnBindingsTerminator)); -//# 8805 "pars.fs" +//# 9098 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3037 "src/Compiler/pars.fsy" +//# 3169 "src/Compiler/pars.fsy" (fun kwd m -> let msg = match kwd with @@ -8818,9 +9111,9 @@ let _fsyacc_reductions = lazy [| | _ (*"let" *) -> FSComp.SR.parsUnmatchedLet() reportParseErrorAt m msg), None, None ) -//# 3037 "src/Compiler/pars.fsy" +//# 3169 "src/Compiler/pars.fsy" : 'gentype_hardwhiteDefnBindingsTerminator)); -//# 8823 "pars.fs" +//# 9116 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_cRetType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_access in @@ -8831,7 +9124,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3049 "src/Compiler/pars.fsy" +//# 3181 "src/Compiler/pars.fsy" let mExtern = rhs parseState 1 let rty, vis, nm, (args, commas) = _2, _3, _4, _7 let nmm = rhs parseState 3 @@ -8857,82 +9150,82 @@ let _fsyacc_reductions = lazy [| (vis, false, false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, Some(None, rty), rhsExpr, mRhs, [], attrs, None, trivia) [], [binding]) ) -//# 3049 "src/Compiler/pars.fsy" +//# 3181 "src/Compiler/pars.fsy" : 'gentype_cPrototype)); -//# 8862 "pars.fs" +//# 9155 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_externMoreArgs in Microsoft.FSharp.Core.Operators.box ( ( -//# 3077 "src/Compiler/pars.fsy" +//# 3209 "src/Compiler/pars.fsy" let args, commas = _1 List.rev args, (List.rev commas) ) -//# 3077 "src/Compiler/pars.fsy" +//# 3209 "src/Compiler/pars.fsy" : 'gentype_externArgs)); -//# 8874 "pars.fs" +//# 9167 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_externArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 3081 "src/Compiler/pars.fsy" +//# 3213 "src/Compiler/pars.fsy" [_1], [] ) -//# 3081 "src/Compiler/pars.fsy" +//# 3213 "src/Compiler/pars.fsy" : 'gentype_externArgs)); -//# 8885 "pars.fs" +//# 9178 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3083 "src/Compiler/pars.fsy" +//# 3215 "src/Compiler/pars.fsy" [], [] ) -//# 3083 "src/Compiler/pars.fsy" +//# 3215 "src/Compiler/pars.fsy" : 'gentype_externArgs)); -//# 8895 "pars.fs" +//# 9188 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_externMoreArgs in let _3 = parseState.GetInput(3) :?> 'gentype_externArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 3089 "src/Compiler/pars.fsy" +//# 3221 "src/Compiler/pars.fsy" let args, commas = _1 let mComma = rhs parseState 2 _3 :: args, (mComma :: commas) ) -//# 3089 "src/Compiler/pars.fsy" +//# 3221 "src/Compiler/pars.fsy" : 'gentype_externMoreArgs)); -//# 8909 "pars.fs" +//# 9202 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_externArg in let _3 = parseState.GetInput(3) :?> 'gentype_externArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 3094 "src/Compiler/pars.fsy" +//# 3226 "src/Compiler/pars.fsy" let mComma = rhs parseState 2 [_3; _1], [mComma] ) -//# 3094 "src/Compiler/pars.fsy" +//# 3226 "src/Compiler/pars.fsy" : 'gentype_externMoreArgs)); -//# 8922 "pars.fs" +//# 9215 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_cType in Microsoft.FSharp.Core.Operators.box ( ( -//# 3101 "src/Compiler/pars.fsy" +//# 3233 "src/Compiler/pars.fsy" let m = lhs parseState SynPat.Typed(SynPat.Wild m, _2, m) |> addAttribs _1 ) -//# 3101 "src/Compiler/pars.fsy" +//# 3233 "src/Compiler/pars.fsy" : 'gentype_externArg)); -//# 8935 "pars.fs" +//# 9228 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_cType in @@ -8940,104 +9233,115 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3105 "src/Compiler/pars.fsy" +//# 3237 "src/Compiler/pars.fsy" let m = lhs parseState SynPat.Typed(SynPat.Named(SynIdent(_3, None), false, None, m), _2, m) |> addAttribs _1 ) -//# 3105 "src/Compiler/pars.fsy" +//# 3237 "src/Compiler/pars.fsy" : 'gentype_externArg)); -//# 8949 "pars.fs" +//# 9242 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 3111 "src/Compiler/pars.fsy" +//# 3243 "src/Compiler/pars.fsy" let m = _1.Range SynType.App(SynType.LongIdent(_1), None, [], [], None, false, m) ) -//# 3111 "src/Compiler/pars.fsy" +//# 3243 "src/Compiler/pars.fsy" : 'gentype_cType)); -//# 8961 "pars.fs" +//# 9254 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_cType in let _2 = parseState.GetInput(2) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in Microsoft.FSharp.Core.Operators.box ( ( -//# 3115 "src/Compiler/pars.fsy" +//# 3247 "src/Compiler/pars.fsy" let m = lhs parseState SynType.App(SynType.LongIdent(SynLongIdent([ident("[]", m)], [], [None])), None, [_1], [], None, true, m) ) -//# 3115 "src/Compiler/pars.fsy" +//# 3247 "src/Compiler/pars.fsy" : 'gentype_cType)); -//# 8974 "pars.fs" +//# 9267 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_cType in Microsoft.FSharp.Core.Operators.box ( ( -//# 3119 "src/Compiler/pars.fsy" +//# 3251 "src/Compiler/pars.fsy" let m = lhs parseState SynType.App(SynType.LongIdent(SynLongIdent([ident("nativeptr", m)], [], [ Some(IdentTrivia.OriginalNotation "*") ])), None, [_1], [], None, true, m) ) -//# 3119 "src/Compiler/pars.fsy" +//# 3251 "src/Compiler/pars.fsy" + : 'gentype_cType)); +//# 9279 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_cType in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 3255 "src/Compiler/pars.fsy" + SynType.WithNull(_1, false, lhs parseState, { BarRange = rhs parseState 2 }) + ) +//# 3255 "src/Compiler/pars.fsy" : 'gentype_cType)); -//# 8986 "pars.fs" +//# 9290 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_cType in Microsoft.FSharp.Core.Operators.box ( ( -//# 3123 "src/Compiler/pars.fsy" +//# 3258 "src/Compiler/pars.fsy" let m = lhs parseState SynType.App(SynType.LongIdent(SynLongIdent([ident("byref", m)], [], [ Some(IdentTrivia.OriginalNotation "&") ])), None, [_1], [], None, true, m) ) -//# 3123 "src/Compiler/pars.fsy" +//# 3258 "src/Compiler/pars.fsy" : 'gentype_cType)); -//# 8998 "pars.fs" +//# 9302 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3127 "src/Compiler/pars.fsy" +//# 3262 "src/Compiler/pars.fsy" let m = lhs parseState SynType.App(SynType.LongIdent(SynLongIdent([ident("nativeint", m)], [], [ Some(IdentTrivia.OriginalNotation "void*") ])), None, [], [], None, true, m) ) -//# 3127 "src/Compiler/pars.fsy" +//# 3262 "src/Compiler/pars.fsy" : 'gentype_cType)); -//# 9009 "pars.fs" +//# 9313 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_cType in Microsoft.FSharp.Core.Operators.box ( ( -//# 3134 "src/Compiler/pars.fsy" +//# 3269 "src/Compiler/pars.fsy" SynReturnInfo((_2, SynArgInfo(_1, false, None)), rhs parseState 2) ) -//# 3134 "src/Compiler/pars.fsy" +//# 3269 "src/Compiler/pars.fsy" : 'gentype_cRetType)); -//# 9021 "pars.fs" +//# 9325 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in Microsoft.FSharp.Core.Operators.box ( ( -//# 3137 "src/Compiler/pars.fsy" +//# 3272 "src/Compiler/pars.fsy" let m = rhs parseState 2 SynReturnInfo((SynType.App(SynType.LongIdent(SynLongIdent([ident("unit", m)], [], [ Some(IdentTrivia.OriginalNotation "void") ])), None, [], [], None, false, m), SynArgInfo(_1, false, None)), m) ) -//# 3137 "src/Compiler/pars.fsy" +//# 3272 "src/Compiler/pars.fsy" : 'gentype_cRetType)); -//# 9033 "pars.fs" +//# 9337 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attr_localBinding in let _2 = parseState.GetInput(2) :?> 'gentype_moreLocalBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3143 "src/Compiler/pars.fsy" +//# 3278 "src/Compiler/pars.fsy" let (moreBindings, moreBindingRanges) = List.unzip _2 let moreLocalBindingsLastRange = if moreBindingRanges.IsEmpty then None else Some(List.last moreBindingRanges) match _1 with @@ -9050,16 +9354,16 @@ let _fsyacc_reductions = lazy [| | None -> moreLocalBindingsLastRange, (fun _xmlDoc _attrs _vis _leadingKeyword -> moreBindings) ) -//# 3143 "src/Compiler/pars.fsy" +//# 3278 "src/Compiler/pars.fsy" : 'gentype_localBindings)); -//# 9055 "pars.fs" +//# 9359 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_attr_localBinding in let _3 = parseState.GetInput(3) :?> 'gentype_moreLocalBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3158 "src/Compiler/pars.fsy" +//# 3293 "src/Compiler/pars.fsy" let leadingKeyword = SynLeadingKeyword.And(rhs parseState 1) (match _2 with | Some(localBindingRange, attrLocalBindingBuilder) -> @@ -9068,44 +9372,44 @@ let _fsyacc_reductions = lazy [| (attrLocalBindingBuilder xmlDoc [] None leadingKeyword false, localBindingRange) :: _3 | None -> _3) ) -//# 3158 "src/Compiler/pars.fsy" +//# 3293 "src/Compiler/pars.fsy" : 'gentype_moreLocalBindings)); -//# 9073 "pars.fs" +//# 9377 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3167 "src/Compiler/pars.fsy" +//# 3302 "src/Compiler/pars.fsy" [] ) -//# 3167 "src/Compiler/pars.fsy" +//# 3302 "src/Compiler/pars.fsy" : 'gentype_moreLocalBindings)); -//# 9083 "pars.fs" +//# 9387 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_localBinding in Microsoft.FSharp.Core.Operators.box ( ( -//# 3173 "src/Compiler/pars.fsy" +//# 3308 "src/Compiler/pars.fsy" let attrs2 = _1 let localBindingRange, localBindingBuilder = _2 let attrLocalBindingBuilder = (fun xmlDoc attrs vis leadingKeyword _ -> localBindingBuilder xmlDoc (attrs@attrs2) vis leadingKeyword) Some(localBindingRange, attrLocalBindingBuilder) ) -//# 3173 "src/Compiler/pars.fsy" +//# 3308 "src/Compiler/pars.fsy" : 'gentype_attr_localBinding)); -//# 9098 "pars.fs" +//# 9402 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3179 "src/Compiler/pars.fsy" +//# 3314 "src/Compiler/pars.fsy" None ) -//# 3179 "src/Compiler/pars.fsy" +//# 3314 "src/Compiler/pars.fsy" : 'gentype_attr_localBinding)); -//# 9108 "pars.fs" +//# 9412 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in @@ -9115,7 +9419,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3185 "src/Compiler/pars.fsy" +//# 3320 "src/Compiler/pars.fsy" let (expr: SynExpr), opts = _6 let mEquals = rhs parseState 5 let mRhs = expr.Range @@ -9131,9 +9435,9 @@ let _fsyacc_reductions = lazy [| mkSynBinding (xmlDoc, bindingPat) (vis, Option.isSome _1, Option.isSome _2, mWholeBindLhs, spBind, optReturnType, expr, mRhs, opts, attrs, None, trivia)) localBindingRange, localBindingBuilder ) -//# 3185 "src/Compiler/pars.fsy" +//# 3320 "src/Compiler/pars.fsy" : 'gentype_localBinding)); -//# 9136 "pars.fs" +//# 9440 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in @@ -9142,7 +9446,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3201 "src/Compiler/pars.fsy" +//# 3336 "src/Compiler/pars.fsy" let mWhole = rhs2 parseState 1 5 let mRhs = rhs parseState 5 let optReturnType = _4 @@ -9157,9 +9461,9 @@ let _fsyacc_reductions = lazy [| mkSynBinding (xmlDoc, bindingPat) (vis, Option.isSome _1, Option.isSome _2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia)) mWhole, localBindingBuilder ) -//# 3201 "src/Compiler/pars.fsy" +//# 3336 "src/Compiler/pars.fsy" : 'gentype_localBinding)); -//# 9162 "pars.fs" +//# 9466 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_inline in let _2 = parseState.GetInput(2) :?> 'gentype_opt_mutable in @@ -9169,12 +9473,18 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3216 "src/Compiler/pars.fsy" +//# 3351 "src/Compiler/pars.fsy" if not _5 then reportParseErrorAt (rhs parseState 5) (FSComp.SR.parsUnexpectedEndOfFileDefinition()) + let bindingPat, mBindLhs = _3 let optReturnType = _4 - let mWhole = rhs2 parseState 1 (match optReturnType with None -> 3 | _ -> 4) + let mWhole = + let mStart = rhs parseState 1 + let mEnd = + match optReturnType with + | None -> bindingPat.Range + | Some (_, returnInfo) -> returnInfo.Range + unionRanges mStart mEnd let mRhs = mWhole.EndRange // zero-width range at end of last good token - let bindingPat, mBindLhs = _3 let localBindingBuilder = (fun xmlDoc attrs vis (leadingKeyword: SynLeadingKeyword) -> let spBind = DebugPointAtBinding.Yes(unionRanges leadingKeyword.Range mRhs) @@ -9183,344 +9493,344 @@ let _fsyacc_reductions = lazy [| mkSynBinding (xmlDoc, bindingPat) (vis, Option.isSome _1, Option.isSome _2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia)) mWhole, localBindingBuilder ) -//# 3216 "src/Compiler/pars.fsy" +//# 3351 "src/Compiler/pars.fsy" : 'gentype_localBinding)); -//# 9188 "pars.fs" +//# 9498 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedExprWithStaticOptimizations in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 3232 "src/Compiler/pars.fsy" +//# 3373 "src/Compiler/pars.fsy" _2 ) -//# 3232 "src/Compiler/pars.fsy" +//# 3373 "src/Compiler/pars.fsy" : 'gentype_typedExprWithStaticOptimizationsBlock)); -//# 9200 "pars.fs" +//# 9510 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedExprWithStaticOptimizations in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3235 "src/Compiler/pars.fsy" +//# 3376 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFile()) let a, b = _2 (exprFromParseError a, b) ) -//# 3235 "src/Compiler/pars.fsy" +//# 3376 "src/Compiler/pars.fsy" : 'gentype_typedExprWithStaticOptimizationsBlock)); -//# 9214 "pars.fs" +//# 9524 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typedExprWithStaticOptimizations in Microsoft.FSharp.Core.Operators.box ( ( -//# 3240 "src/Compiler/pars.fsy" +//# 3381 "src/Compiler/pars.fsy" _1 ) -//# 3240 "src/Compiler/pars.fsy" +//# 3381 "src/Compiler/pars.fsy" : 'gentype_typedExprWithStaticOptimizationsBlock)); -//# 9225 "pars.fs" +//# 9535 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typedSequentialExpr in let _2 = parseState.GetInput(2) :?> 'gentype_opt_staticOptimizations in Microsoft.FSharp.Core.Operators.box ( ( -//# 3244 "src/Compiler/pars.fsy" +//# 3385 "src/Compiler/pars.fsy" _1, List.rev _2 ) -//# 3244 "src/Compiler/pars.fsy" +//# 3385 "src/Compiler/pars.fsy" : 'gentype_typedExprWithStaticOptimizations)); -//# 9237 "pars.fs" +//# 9547 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opt_staticOptimizations in let _2 = parseState.GetInput(2) :?> 'gentype_staticOptimization in Microsoft.FSharp.Core.Operators.box ( ( -//# 3248 "src/Compiler/pars.fsy" +//# 3389 "src/Compiler/pars.fsy" _2 :: _1 ) -//# 3248 "src/Compiler/pars.fsy" +//# 3389 "src/Compiler/pars.fsy" : 'gentype_opt_staticOptimizations)); -//# 9249 "pars.fs" +//# 9559 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3251 "src/Compiler/pars.fsy" +//# 3392 "src/Compiler/pars.fsy" [] ) -//# 3251 "src/Compiler/pars.fsy" +//# 3392 "src/Compiler/pars.fsy" : 'gentype_opt_staticOptimizations)); -//# 9259 "pars.fs" +//# 9569 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_staticOptimizationConditions in let _4 = parseState.GetInput(4) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3255 "src/Compiler/pars.fsy" +//# 3396 "src/Compiler/pars.fsy" (_2, _4) ) -//# 3255 "src/Compiler/pars.fsy" +//# 3396 "src/Compiler/pars.fsy" : 'gentype_staticOptimization)); -//# 9271 "pars.fs" +//# 9581 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_staticOptimizationConditions in let _3 = parseState.GetInput(3) :?> 'gentype_staticOptimizationCondition in Microsoft.FSharp.Core.Operators.box ( ( -//# 3259 "src/Compiler/pars.fsy" +//# 3400 "src/Compiler/pars.fsy" _3 :: _1 ) -//# 3259 "src/Compiler/pars.fsy" +//# 3400 "src/Compiler/pars.fsy" : 'gentype_staticOptimizationConditions)); -//# 9283 "pars.fs" +//# 9593 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_staticOptimizationCondition in Microsoft.FSharp.Core.Operators.box ( ( -//# 3262 "src/Compiler/pars.fsy" +//# 3403 "src/Compiler/pars.fsy" [_1 ] ) -//# 3262 "src/Compiler/pars.fsy" +//# 3403 "src/Compiler/pars.fsy" : 'gentype_staticOptimizationConditions)); -//# 9294 "pars.fs" +//# 9604 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 3266 "src/Compiler/pars.fsy" +//# 3407 "src/Compiler/pars.fsy" SynStaticOptimizationConstraint.WhenTyparTyconEqualsTycon(_1, _3, lhs parseState) ) -//# 3266 "src/Compiler/pars.fsy" +//# 3407 "src/Compiler/pars.fsy" : 'gentype_staticOptimizationCondition)); -//# 9306 "pars.fs" +//# 9616 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 3269 "src/Compiler/pars.fsy" +//# 3410 "src/Compiler/pars.fsy" SynStaticOptimizationConstraint.WhenTyparIsStruct(_1, lhs parseState) ) -//# 3269 "src/Compiler/pars.fsy" +//# 3410 "src/Compiler/pars.fsy" : 'gentype_staticOptimizationCondition)); -//# 9317 "pars.fs" +//# 9627 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> sbyte * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3273 "src/Compiler/pars.fsy" +//# 3414 "src/Compiler/pars.fsy" if snd _1 then errorR(Error(FSComp.SR.lexOutsideEightBitSigned(), lhs parseState)) SynConst.SByte(fst _1) ) -//# 3273 "src/Compiler/pars.fsy" +//# 3414 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9329 "pars.fs" +//# 9639 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> byte in Microsoft.FSharp.Core.Operators.box ( ( -//# 3277 "src/Compiler/pars.fsy" +//# 3418 "src/Compiler/pars.fsy" SynConst.Byte _1 ) -//# 3277 "src/Compiler/pars.fsy" +//# 3418 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9340 "pars.fs" +//# 9650 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int16 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3280 "src/Compiler/pars.fsy" +//# 3421 "src/Compiler/pars.fsy" if snd _1 then errorR(Error(FSComp.SR.lexOutsideSixteenBitSigned(), lhs parseState)) SynConst.Int16 (fst _1) ) -//# 3280 "src/Compiler/pars.fsy" +//# 3421 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9352 "pars.fs" +//# 9662 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> uint16 in Microsoft.FSharp.Core.Operators.box ( ( -//# 3284 "src/Compiler/pars.fsy" +//# 3425 "src/Compiler/pars.fsy" SynConst.UInt16 _1 ) -//# 3284 "src/Compiler/pars.fsy" +//# 3425 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9363 "pars.fs" +//# 9673 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int32 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3287 "src/Compiler/pars.fsy" +//# 3428 "src/Compiler/pars.fsy" if snd _1 then errorR(Error(FSComp.SR.lexOutsideThirtyTwoBitSigned(), lhs parseState)) SynConst.Int32 (fst _1) ) -//# 3287 "src/Compiler/pars.fsy" +//# 3428 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9375 "pars.fs" +//# 9685 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> uint32 in Microsoft.FSharp.Core.Operators.box ( ( -//# 3291 "src/Compiler/pars.fsy" +//# 3432 "src/Compiler/pars.fsy" SynConst.UInt32 _1 ) -//# 3291 "src/Compiler/pars.fsy" +//# 3432 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9386 "pars.fs" +//# 9696 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int64 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3294 "src/Compiler/pars.fsy" +//# 3435 "src/Compiler/pars.fsy" if snd _1 then errorR(Error(FSComp.SR.lexOutsideSixtyFourBitSigned(), lhs parseState)) SynConst.Int64 (fst _1) ) -//# 3294 "src/Compiler/pars.fsy" +//# 3435 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9398 "pars.fs" +//# 9708 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> uint64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 3298 "src/Compiler/pars.fsy" +//# 3439 "src/Compiler/pars.fsy" SynConst.UInt64 _1 ) -//# 3298 "src/Compiler/pars.fsy" +//# 3439 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9409 "pars.fs" +//# 9719 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int64 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3301 "src/Compiler/pars.fsy" +//# 3442 "src/Compiler/pars.fsy" if snd _1 then errorR(Error(FSComp.SR.lexOutsideNativeSigned(), lhs parseState)) SynConst.IntPtr(fst _1) ) -//# 3301 "src/Compiler/pars.fsy" +//# 3442 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9421 "pars.fs" +//# 9731 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> uint64 in Microsoft.FSharp.Core.Operators.box ( ( -//# 3305 "src/Compiler/pars.fsy" +//# 3446 "src/Compiler/pars.fsy" SynConst.UIntPtr _1 ) -//# 3305 "src/Compiler/pars.fsy" +//# 3446 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9432 "pars.fs" +//# 9742 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> single in Microsoft.FSharp.Core.Operators.box ( ( -//# 3308 "src/Compiler/pars.fsy" +//# 3449 "src/Compiler/pars.fsy" SynConst.Single _1 ) -//# 3308 "src/Compiler/pars.fsy" +//# 3449 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9443 "pars.fs" +//# 9753 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> double in Microsoft.FSharp.Core.Operators.box ( ( -//# 3311 "src/Compiler/pars.fsy" +//# 3452 "src/Compiler/pars.fsy" SynConst.Double _1 ) -//# 3311 "src/Compiler/pars.fsy" +//# 3452 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9454 "pars.fs" +//# 9764 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> char in Microsoft.FSharp.Core.Operators.box ( ( -//# 3314 "src/Compiler/pars.fsy" +//# 3455 "src/Compiler/pars.fsy" SynConst.Char _1 ) -//# 3314 "src/Compiler/pars.fsy" +//# 3455 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9465 "pars.fs" +//# 9775 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> System.Decimal in Microsoft.FSharp.Core.Operators.box ( ( -//# 3317 "src/Compiler/pars.fsy" +//# 3458 "src/Compiler/pars.fsy" SynConst.Decimal _1 ) -//# 3317 "src/Compiler/pars.fsy" +//# 3458 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9476 "pars.fs" +//# 9786 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> (string * string) in Microsoft.FSharp.Core.Operators.box ( ( -//# 3320 "src/Compiler/pars.fsy" +//# 3461 "src/Compiler/pars.fsy" SynConst.UserNum _1 ) -//# 3320 "src/Compiler/pars.fsy" +//# 3461 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9487 "pars.fs" +//# 9797 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_string in Microsoft.FSharp.Core.Operators.box ( ( -//# 3323 "src/Compiler/pars.fsy" +//# 3464 "src/Compiler/pars.fsy" let s, synStringKind = _1 SynConst.String(s, synStringKind, lhs parseState) ) -//# 3323 "src/Compiler/pars.fsy" +//# 3464 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9499 "pars.fs" +//# 9809 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sourceIdentifier in Microsoft.FSharp.Core.Operators.box ( ( -//# 3327 "src/Compiler/pars.fsy" +//# 3468 "src/Compiler/pars.fsy" let c, v = _1 SynConst.SourceIdentifier(c, v, lhs parseState) ) -//# 3327 "src/Compiler/pars.fsy" +//# 3468 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9511 "pars.fs" +//# 9821 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> byte[] * SynByteStringKind * ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 3331 "src/Compiler/pars.fsy" +//# 3472 "src/Compiler/pars.fsy" let (v, synByteStringKind, _) = _1 SynConst.Bytes(v, synByteStringKind, lhs parseState) ) -//# 3331 "src/Compiler/pars.fsy" +//# 3472 "src/Compiler/pars.fsy" : 'gentype_rawConstant)); -//# 9523 "pars.fs" +//# 9833 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int32 * bool in let _2 = parseState.GetInput(2) :?> string in @@ -9528,15 +9838,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3336 "src/Compiler/pars.fsy" +//# 3477 "src/Compiler/pars.fsy" if _2 <> "/" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedOperatorForUnitOfMeasure()) if fst _3 = 0 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsIllegalDenominatorForMeasureExponent()) if (snd _1) || (snd _3) then errorR(Error(FSComp.SR.lexOutsideThirtyTwoBitSigned(), lhs parseState)) SynRationalConst.Rational(fst _1, rhs parseState 1, rhs parseState 2, fst _3, rhs parseState 3, lhs parseState) ) -//# 3336 "src/Compiler/pars.fsy" +//# 3477 "src/Compiler/pars.fsy" : 'gentype_rationalConstant)); -//# 9539 "pars.fs" +//# 9849 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> int32 * bool in let _3 = parseState.GetInput(3) :?> string in @@ -9544,494 +9854,438 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3342 "src/Compiler/pars.fsy" +//# 3483 "src/Compiler/pars.fsy" if _3 <> "/" then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedOperatorForUnitOfMeasure()) if fst _4 = 0 then reportParseErrorAt (rhs parseState 4) (FSComp.SR.parsIllegalDenominatorForMeasureExponent()) if (snd _2) || (snd _4) then errorR(Error(FSComp.SR.lexOutsideThirtyTwoBitSigned(), lhs parseState)) SynRationalConst.Negate(SynRationalConst.Rational(fst _2, rhs parseState 2, rhs parseState 3, fst _4, rhs parseState 4, lhs parseState), lhs parseState) ) -//# 3342 "src/Compiler/pars.fsy" +//# 3483 "src/Compiler/pars.fsy" : 'gentype_rationalConstant)); -//# 9555 "pars.fs" +//# 9865 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int32 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3348 "src/Compiler/pars.fsy" +//# 3489 "src/Compiler/pars.fsy" if snd _1 then errorR(Error(FSComp.SR.lexOutsideThirtyTwoBitSigned(), lhs parseState)) SynRationalConst.Integer(fst _1, lhs parseState) ) -//# 3348 "src/Compiler/pars.fsy" +//# 3489 "src/Compiler/pars.fsy" : 'gentype_rationalConstant)); -//# 9567 "pars.fs" +//# 9877 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> int32 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3352 "src/Compiler/pars.fsy" +//# 3493 "src/Compiler/pars.fsy" if snd _2 then errorR(Error(FSComp.SR.lexOutsideThirtyTwoBitSigned(), lhs parseState)) SynRationalConst.Negate(SynRationalConst.Integer(fst _2, rhs parseState 2), lhs parseState) ) -//# 3352 "src/Compiler/pars.fsy" +//# 3493 "src/Compiler/pars.fsy" : 'gentype_rationalConstant)); -//# 9579 "pars.fs" +//# 9889 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int32 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 3356 "src/Compiler/pars.fsy" +//# 3497 "src/Compiler/pars.fsy" if snd _1 then errorR(Error(FSComp.SR.lexOutsideThirtyTwoBitSigned(), lhs parseState)) SynRationalConst.Integer(fst _1, lhs parseState) ) -//# 3356 "src/Compiler/pars.fsy" +//# 3497 "src/Compiler/pars.fsy" : 'gentype_atomicUnsignedRationalConstant)); -//# 9591 "pars.fs" +//# 9901 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_rationalConstant in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3360 "src/Compiler/pars.fsy" +//# 3501 "src/Compiler/pars.fsy" SynRationalConst.Paren(_2, rhs2 parseState 1 3) ) -//# 3360 "src/Compiler/pars.fsy" +//# 3501 "src/Compiler/pars.fsy" : 'gentype_atomicUnsignedRationalConstant)); -//# 9603 "pars.fs" +//# 9913 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicUnsignedRationalConstant in Microsoft.FSharp.Core.Operators.box ( ( -//# 3363 "src/Compiler/pars.fsy" +//# 3504 "src/Compiler/pars.fsy" _1 ) -//# 3363 "src/Compiler/pars.fsy" +//# 3504 "src/Compiler/pars.fsy" : 'gentype_atomicRationalConstant)); -//# 9614 "pars.fs" +//# 9924 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_atomicUnsignedRationalConstant in Microsoft.FSharp.Core.Operators.box ( ( -//# 3366 "src/Compiler/pars.fsy" +//# 3507 "src/Compiler/pars.fsy" SynRationalConst.Negate(_2, lhs parseState) ) -//# 3366 "src/Compiler/pars.fsy" +//# 3507 "src/Compiler/pars.fsy" : 'gentype_atomicRationalConstant)); -//# 9625 "pars.fs" +//# 9935 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_rawConstant in Microsoft.FSharp.Core.Operators.box ( ( -//# 3370 "src/Compiler/pars.fsy" +//# 3511 "src/Compiler/pars.fsy" _1, rhs parseState 1 ) -//# 3370 "src/Compiler/pars.fsy" +//# 3511 "src/Compiler/pars.fsy" : 'gentype_constant)); -//# 9636 "pars.fs" +//# 9946 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_rawConstant in let _3 = parseState.GetInput(3) :?> 'gentype_measureTypeArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 3373 "src/Compiler/pars.fsy" +//# 3514 "src/Compiler/pars.fsy" let synMeasure, trivia = _3 let mConstant = rhs parseState 1 let m = unionRanges mConstant trivia.GreaterRange SynConst.Measure(_1, rhs parseState 1, synMeasure, trivia), m ) -//# 3373 "src/Compiler/pars.fsy" +//# 3514 "src/Compiler/pars.fsy" : 'gentype_constant)); -//# 9651 "pars.fs" +//# 9961 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3380 "src/Compiler/pars.fsy" - _1, rhs parseState 1 +//# 3521 "src/Compiler/pars.fsy" + _1, _1.Range ) -//# 3380 "src/Compiler/pars.fsy" +//# 3521 "src/Compiler/pars.fsy" : 'gentype_bindingPattern)); -//# 9662 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> Ident in - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 3387 "src/Compiler/pars.fsy" - let m = rhs parseState 1 - SynPat.Named(SynIdent(_1, None), false, None, m) - ) -//# 3387 "src/Compiler/pars.fsy" - : 'gentype_simplePattern)); -//# 9674 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _2 = parseState.GetInput(2) :?> Ident in - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 3391 "src/Compiler/pars.fsy" - SynPat.OptionalVal(_2, rhs parseState 2) - ) -//# 3391 "src/Compiler/pars.fsy" - : 'gentype_simplePattern)); -//# 9685 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_simplePattern in - let _3 = parseState.GetInput(3) :?> 'gentype_typeWithTypeConstraints in - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 3394 "src/Compiler/pars.fsy" - SynPat.Typed(_1, _3, lhs parseState) - ) -//# 3394 "src/Compiler/pars.fsy" - : 'gentype_simplePattern)); -//# 9697 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_simplePattern in - let _3 = parseState.GetInput(3) :?> 'gentype_recover in - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 3397 "src/Compiler/pars.fsy" - let mColon = rhs parseState 2 - let ty = SynType.FromParseError(mColon.EndRange) - SynPat.Typed(_1, ty, unionRanges _1.Range mColon) - ) -//# 3397 "src/Compiler/pars.fsy" - : 'gentype_simplePattern)); -//# 9711 "pars.fs" +//# 9972 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_attributes in - let _2 = parseState.GetInput(2) :?> 'gentype_simplePattern in + let _1 = parseState.GetInput(1) :?> 'gentype_simplePatterns in Microsoft.FSharp.Core.Operators.box ( ( -//# 3402 "src/Compiler/pars.fsy" - SynPat.Attrib(_2, _1, lhs parseState) +//# 3525 "src/Compiler/pars.fsy" + Some _1 ) -//# 3402 "src/Compiler/pars.fsy" - : 'gentype_simplePattern)); -//# 9723 "pars.fs" +//# 3525 "src/Compiler/pars.fsy" + : 'gentype_opt_simplePatterns)); +//# 9983 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_simplePattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3406 "src/Compiler/pars.fsy" - _1 +//# 3527 "src/Compiler/pars.fsy" + None ) -//# 3406 "src/Compiler/pars.fsy" - : 'gentype_simplePatternCommaList)); -//# 9734 "pars.fs" +//# 3527 "src/Compiler/pars.fsy" + : 'gentype_opt_simplePatterns)); +//# 9993 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_simplePattern in - let _3 = parseState.GetInput(3) :?> 'gentype_simplePatternCommaList in + let _2 = parseState.GetInput(2) :?> 'gentype_parenPattern in + let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3409 "src/Compiler/pars.fsy" - let mComma = rhs parseState 2 - match _3 with - | SynPat.Tuple(_, pats, commas, _) -> SynPat.Tuple(false, _1 :: pats, mComma :: commas, rhs2 parseState 1 3) - | _ -> SynPat.Tuple(false, [_1; _3], [mComma], rhs2 parseState 1 3) +//# 3531 "src/Compiler/pars.fsy" + SynPat.Paren(_2, rhs2 parseState 1 3) ) -//# 3409 "src/Compiler/pars.fsy" - : 'gentype_simplePatternCommaList)); -//# 9749 "pars.fs" +//# 3531 "src/Compiler/pars.fsy" + : 'gentype_simplePatterns)); +//# 10005 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_simplePatterns in + let _2 = parseState.GetInput(2) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3416 "src/Compiler/pars.fsy" - Some _1 +//# 3534 "src/Compiler/pars.fsy" + SynPat.Const(SynConst.Unit, rhs2 parseState 1 2) ) -//# 3416 "src/Compiler/pars.fsy" - : 'gentype_opt_simplePatterns)); -//# 9760 "pars.fs" +//# 3534 "src/Compiler/pars.fsy" + : 'gentype_simplePatterns)); +//# 10016 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3418 "src/Compiler/pars.fsy" - None +//# 3538 "src/Compiler/pars.fsy" + ) -//# 3418 "src/Compiler/pars.fsy" - : 'gentype_opt_simplePatterns)); -//# 9770 "pars.fs" +//# 3538 "src/Compiler/pars.fsy" + : 'gentype_barCanBeRightBeforeNull)); +//# 10026 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _2 = parseState.GetInput(2) :?> 'gentype_simplePatternCommaList in - let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3422 "src/Compiler/pars.fsy" - let parenPat = SynPat.Paren(_2, rhs2 parseState 1 3) - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat - simplePats +//# 3540 "src/Compiler/pars.fsy" + ) -//# 3422 "src/Compiler/pars.fsy" - : 'gentype_simplePatterns)); -//# 9784 "pars.fs" +//# 3540 "src/Compiler/pars.fsy" + : 'gentype_barCanBeRightBeforeNull)); +//# 10036 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _2 = parseState.GetInput(2) :?> 'gentype_rparen in + let _1 = parseState.GetInput(1) :?> SynPat in + let _3 = parseState.GetInput(3) :?> 'gentype_constrPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3427 "src/Compiler/pars.fsy" - let pat = SynPat.Const(SynConst.Unit, rhs2 parseState 1 2) - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator pat - simplePats +//# 3545 "src/Compiler/pars.fsy" + SynPat.As(_1, _3, rhs2 parseState 1 3) ) -//# 3427 "src/Compiler/pars.fsy" - : 'gentype_simplePatterns)); -//# 9797 "pars.fs" +//# 3545 "src/Compiler/pars.fsy" + : SynPat)); +//# 10048 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _2 = parseState.GetInput(2) :?> 'gentype_simplePatternCommaList in + let _1 = parseState.GetInput(1) :?> SynPat in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3432 "src/Compiler/pars.fsy" - reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) - let parenPat = SynPat.Paren(SynPat.Tuple(false, [], [], rhs2 parseState 1 2), rhs2 parseState 1 2) // todo: report parsed pats anyway? - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat - simplePats +//# 3548 "src/Compiler/pars.fsy" + let mAs = rhs parseState 2 + let pat2 = SynPat.Wild(mAs.EndRange) + SynPat.As(_1, pat2, rhs2 parseState 1 2) ) -//# 3432 "src/Compiler/pars.fsy" - : 'gentype_simplePatterns)); -//# 9812 "pars.fs" +//# 3548 "src/Compiler/pars.fsy" + : SynPat)); +//# 10062 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _3 = parseState.GetInput(3) :?> 'gentype_rparen in + let _1 = parseState.GetInput(1) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3438 "src/Compiler/pars.fsy" - let parenPat = SynPat.Paren(SynPat.Wild(rhs parseState 2), rhs2 parseState 1 3) // silent recovery - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat - simplePats +//# 3553 "src/Compiler/pars.fsy" + let mAs = rhs parseState 2 + reportParseErrorAt mAs (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mAs.EndRange) + SynPat.As(_1, pat2, rhs2 parseState 1 2) ) -//# 3438 "src/Compiler/pars.fsy" - : 'gentype_simplePatterns)); -//# 9825 "pars.fs" +//# 3553 "src/Compiler/pars.fsy" + : SynPat)); +//# 10076 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _2 = parseState.GetInput(2) :?> 'gentype_recover in + let _1 = parseState.GetInput(1) :?> SynPat in + let _2 = parseState.GetInput(2) :?> 'gentype_barCanBeRightBeforeNull in + let _3 = parseState.GetInput(3) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3443 "src/Compiler/pars.fsy" - reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) - let pat = SynPat.Wild(lhs parseState) - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator pat - simplePats +//# 3559 "src/Compiler/pars.fsy" + let mBar = rhs parseState 2 + SynPat.Or(_1, _3, rhs2 parseState 1 3, { BarRange = mBar }) ) -//# 3443 "src/Compiler/pars.fsy" - : 'gentype_simplePatterns)); -//# 9839 "pars.fs" +//# 3559 "src/Compiler/pars.fsy" + : SynPat)); +//# 10090 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat in - let _3 = parseState.GetInput(3) :?> 'gentype_constrPattern in + let _3 = parseState.GetInput(3) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3451 "src/Compiler/pars.fsy" - SynPat.As(_1, _3, rhs2 parseState 1 3) +//# 3563 "src/Compiler/pars.fsy" + let mColonColon = rhs parseState 2 + SynPat.ListCons(_1, _3, rhs2 parseState 1 3, { ColonColonRange = mColonColon }) ) -//# 3451 "src/Compiler/pars.fsy" +//# 3563 "src/Compiler/pars.fsy" : SynPat)); -//# 9851 "pars.fs" +//# 10103 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat in - let _3 = parseState.GetInput(3) :?> SynPat in + let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3454 "src/Compiler/pars.fsy" - let mBar = rhs parseState 2 - SynPat.Or(_1, _3, rhs2 parseState 1 3, { BarRange = mBar }) +//# 3567 "src/Compiler/pars.fsy" + let mColonColon = rhs parseState 2 + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons(_1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) ) -//# 3454 "src/Compiler/pars.fsy" +//# 3567 "src/Compiler/pars.fsy" : SynPat)); -//# 9864 "pars.fs" +//# 10117 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat in - let _3 = parseState.GetInput(3) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3458 "src/Compiler/pars.fsy" +//# 3572 "src/Compiler/pars.fsy" let mColonColon = rhs parseState 2 - SynPat.ListCons(_1, _3, rhs2 parseState 1 3, { ColonColonRange = mColonColon }) + reportParseErrorAt mColonColon (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons(_1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) ) -//# 3458 "src/Compiler/pars.fsy" +//# 3572 "src/Compiler/pars.fsy" : SynPat)); -//# 9877 "pars.fs" +//# 10131 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tuplePatternElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 3462 "src/Compiler/pars.fsy" +//# 3578 "src/Compiler/pars.fsy" let pats, commas = _1 let pats, commas = normalizeTuplePat pats commas let m = (rhs parseState 1, pats) ||> unionRangeWithListBy (fun p -> p.Range) SynPat.Tuple(false, List.rev pats, List.rev commas, m) ) -//# 3462 "src/Compiler/pars.fsy" +//# 3578 "src/Compiler/pars.fsy" : SynPat)); -//# 9891 "pars.fs" +//# 10145 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_conjPatternElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 3468 "src/Compiler/pars.fsy" +//# 3584 "src/Compiler/pars.fsy" SynPat.Ands(List.rev _1, lhs parseState) ) -//# 3468 "src/Compiler/pars.fsy" +//# 3584 "src/Compiler/pars.fsy" : SynPat)); -//# 9902 "pars.fs" +//# 10156 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_constrPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3471 "src/Compiler/pars.fsy" +//# 3587 "src/Compiler/pars.fsy" _1 ) -//# 3471 "src/Compiler/pars.fsy" +//# 3587 "src/Compiler/pars.fsy" : SynPat)); -//# 9913 "pars.fs" +//# 10167 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tuplePatternElements in let _3 = parseState.GetInput(3) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3475 "src/Compiler/pars.fsy" +//# 3591 "src/Compiler/pars.fsy" let pats, commas = _1 _3 :: pats, (rhs parseState 2 :: commas) ) -//# 3475 "src/Compiler/pars.fsy" +//# 3591 "src/Compiler/pars.fsy" : 'gentype_tuplePatternElements)); -//# 9926 "pars.fs" +//# 10180 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat in let _3 = parseState.GetInput(3) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3479 "src/Compiler/pars.fsy" +//# 3595 "src/Compiler/pars.fsy" [_3; _1], [rhs parseState 2] ) -//# 3479 "src/Compiler/pars.fsy" +//# 3595 "src/Compiler/pars.fsy" : 'gentype_tuplePatternElements)); -//# 9938 "pars.fs" +//# 10192 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tuplePatternElements in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3482 "src/Compiler/pars.fsy" +//# 3598 "src/Compiler/pars.fsy" let pats, commas = _1 let commaRange = rhs parseState 2 reportParseErrorAt commaRange (FSComp.SR.parsExpectingPattern ()) let pat2 = SynPat.Wild(commaRange.EndRange) pat2 :: pats, (commaRange :: commas) ) -//# 3482 "src/Compiler/pars.fsy" +//# 3598 "src/Compiler/pars.fsy" : 'gentype_tuplePatternElements)); -//# 9954 "pars.fs" +//# 10208 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3489 "src/Compiler/pars.fsy" +//# 3605 "src/Compiler/pars.fsy" let commaRange = rhs parseState 2 reportParseErrorAt commaRange (FSComp.SR.parsExpectingPattern ()) let pat2 = SynPat.Wild(commaRange.EndRange) [pat2; _1], [commaRange] ) -//# 3489 "src/Compiler/pars.fsy" +//# 3605 "src/Compiler/pars.fsy" : 'gentype_tuplePatternElements)); -//# 9969 "pars.fs" +//# 10223 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3495 "src/Compiler/pars.fsy" +//# 3611 "src/Compiler/pars.fsy" let commaRange = rhs parseState 1 reportParseErrorAt commaRange (FSComp.SR.parsExpectingPattern ()) let pat1 = SynPat.Wild(commaRange.StartRange) [_2; pat1], [commaRange] ) -//# 3495 "src/Compiler/pars.fsy" +//# 3611 "src/Compiler/pars.fsy" : 'gentype_tuplePatternElements)); -//# 9983 "pars.fs" +//# 10237 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3501 "src/Compiler/pars.fsy" +//# 3617 "src/Compiler/pars.fsy" let commaRange = rhs parseState 1 if not _2 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedPatternAfterToken ()) let pat1 = SynPat.Wild(commaRange.StartRange) let pat2 = SynPat.Wild(commaRange.EndRange) [pat2; pat1], [commaRange] ) -//# 3501 "src/Compiler/pars.fsy" +//# 3617 "src/Compiler/pars.fsy" : 'gentype_tuplePatternElements)); -//# 9998 "pars.fs" +//# 10252 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_conjPatternElements in let _3 = parseState.GetInput(3) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3509 "src/Compiler/pars.fsy" +//# 3625 "src/Compiler/pars.fsy" _3 :: _1 ) -//# 3509 "src/Compiler/pars.fsy" +//# 3625 "src/Compiler/pars.fsy" : 'gentype_conjPatternElements)); -//# 10010 "pars.fs" +//# 10264 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat in let _3 = parseState.GetInput(3) :?> SynPat in Microsoft.FSharp.Core.Operators.box ( ( -//# 3512 "src/Compiler/pars.fsy" +//# 3628 "src/Compiler/pars.fsy" _3 :: _1 :: [] ) -//# 3512 "src/Compiler/pars.fsy" +//# 3628 "src/Compiler/pars.fsy" : 'gentype_conjPatternElements)); -//# 10022 "pars.fs" +//# 10276 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_namePatPair in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in Microsoft.FSharp.Core.Operators.box ( ( -//# 3516 "src/Compiler/pars.fsy" +//# 3632 "src/Compiler/pars.fsy" [_1] ) -//# 3516 "src/Compiler/pars.fsy" +//# 3632 "src/Compiler/pars.fsy" : 'gentype_namePatPairs)); -//# 10034 "pars.fs" +//# 10288 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_namePatPair in let _2 = parseState.GetInput(2) :?> 'gentype_seps in @@ -10039,12 +10293,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3519 "src/Compiler/pars.fsy" +//# 3635 "src/Compiler/pars.fsy" _1 :: _3 ) -//# 3519 "src/Compiler/pars.fsy" +//# 3635 "src/Compiler/pars.fsy" : 'gentype_namePatPairs)); -//# 10047 "pars.fs" +//# 10301 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_namePatPair in let _2 = parseState.GetInput(2) :?> 'gentype_seps in @@ -10053,64 +10307,64 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3522 "src/Compiler/pars.fsy" +//# 3638 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsExpectingPattern ()) (_1 :: _4) ) -//# 3522 "src/Compiler/pars.fsy" +//# 3638 "src/Compiler/pars.fsy" : 'gentype_namePatPairs)); -//# 10062 "pars.fs" +//# 10316 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3527 "src/Compiler/pars.fsy" +//# 3643 "src/Compiler/pars.fsy" let mEquals = rhs parseState 2 _1, Some mEquals, _3 ) -//# 3527 "src/Compiler/pars.fsy" +//# 3643 "src/Compiler/pars.fsy" : 'gentype_namePatPair)); -//# 10075 "pars.fs" +//# 10329 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3531 "src/Compiler/pars.fsy" +//# 3647 "src/Compiler/pars.fsy" let mEquals = rhs parseState 2 _1, Some mEquals, patFromParseError (SynPat.Wild mEquals.EndRange) ) -//# 3531 "src/Compiler/pars.fsy" +//# 3647 "src/Compiler/pars.fsy" : 'gentype_namePatPair)); -//# 10088 "pars.fs" +//# 10342 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3535 "src/Compiler/pars.fsy" +//# 3651 "src/Compiler/pars.fsy" _1, None, patFromParseError (SynPat.Wild _1.idRange.EndRange) ) -//# 3535 "src/Compiler/pars.fsy" +//# 3651 "src/Compiler/pars.fsy" : 'gentype_namePatPair)); -//# 10100 "pars.fs" +//# 10354 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in let _2 = parseState.GetInput(2) :?> 'gentype_explicitValTyparDecls in Microsoft.FSharp.Core.Operators.box ( ( -//# 3539 "src/Compiler/pars.fsy" +//# 3655 "src/Compiler/pars.fsy" let vis, lid = _1 SynPat.LongIdent(lid, None, Some _2, SynArgPats.Pats [], vis, lhs parseState) ) -//# 3539 "src/Compiler/pars.fsy" +//# 3655 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10113 "pars.fs" +//# 10367 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in let _2 = parseState.GetInput(2) :?> 'gentype_explicitValTyparDecls in @@ -10118,15 +10372,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3543 "src/Compiler/pars.fsy" +//# 3659 "src/Compiler/pars.fsy" let vis, lid = _1 let args, argsM = _3 let m = unionRanges (rhs2 parseState 1 2) argsM SynPat.LongIdent(lid, None, Some _2, args, vis, m) ) -//# 3543 "src/Compiler/pars.fsy" +//# 3659 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10129 "pars.fs" +//# 10383 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in let _2 = parseState.GetInput(2) :?> 'gentype_explicitValTyparDecls in @@ -10134,15 +10388,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3549 "src/Compiler/pars.fsy" +//# 3665 "src/Compiler/pars.fsy" let vis, lid = _1 let args, argsM = _4 let m = unionRanges (rhs2 parseState 1 2) argsM SynPat.LongIdent(lid, None, Some _2, args, vis, m) ) -//# 3549 "src/Compiler/pars.fsy" +//# 3665 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10145 "pars.fs" +//# 10399 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in let _2 = parseState.GetInput(2) :?> 'gentype_explicitValTyparDecls in @@ -10150,169 +10404,198 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3555 "src/Compiler/pars.fsy" +//# 3671 "src/Compiler/pars.fsy" let vis, lid = _1 let args, argsM = _4 let m = unionRanges (rhs2 parseState 1 2) argsM SynPat.LongIdent(lid, None, Some _2, args, vis, m) ) -//# 3555 "src/Compiler/pars.fsy" +//# 3671 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10161 "pars.fs" +//# 10415 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in let _2 = parseState.GetInput(2) :?> SynArgPats * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 3561 "src/Compiler/pars.fsy" +//# 3677 "src/Compiler/pars.fsy" let vis, lid = _1 let args, argsM = _2 let m = unionRanges (rhs parseState 1) argsM SynPat.LongIdent(lid, None, None, args, vis, m) ) -//# 3561 "src/Compiler/pars.fsy" +//# 3677 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10176 "pars.fs" +//# 10430 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in let _3 = parseState.GetInput(3) :?> SynArgPats * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 3567 "src/Compiler/pars.fsy" +//# 3683 "src/Compiler/pars.fsy" let vis, lid = _1 let args, argsM = _3 let m = unionRanges (rhs parseState 1) argsM SynPat.LongIdent(lid, None, None, args, vis, m) ) -//# 3567 "src/Compiler/pars.fsy" +//# 3683 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10191 "pars.fs" +//# 10445 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in let _3 = parseState.GetInput(3) :?> SynArgPats * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 3573 "src/Compiler/pars.fsy" +//# 3689 "src/Compiler/pars.fsy" let vis, lid = _1 let args, argsM = _3 let m = unionRanges (rhs parseState 1) argsM SynPat.LongIdent(lid, None, None, args, vis, m) ) -//# 3573 "src/Compiler/pars.fsy" +//# 3689 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10206 "pars.fs" +//# 10460 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _2 = parseState.GetInput(2) :?> 'gentype_atomTypeOrAnonRecdType in + let _2 = parseState.GetInput(2) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 3579 "src/Compiler/pars.fsy" - SynPat.IsInst(_2, lhs parseState) +//# 3695 "src/Compiler/pars.fsy" + let m = unionRanges (rhs parseState 1) _2.Range + SynPat.IsInst(_2, m) ) -//# 3579 "src/Compiler/pars.fsy" +//# 3695 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10217 "pars.fs" +//# 10472 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = parseState.GetInput(2) :?> 'gentype_recover in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 3699 "src/Compiler/pars.fsy" + let mColon = rhs parseState 1 + if not _2 then + reportParseErrorAt mColon (FSComp.SR.parsExpectingPattern ()) + let ty = SynType.FromParseError(mColon.EndRange) + SynPat.IsInst(ty, mColon) + ) +//# 3699 "src/Compiler/pars.fsy" + : 'gentype_constrPattern)); +//# 10487 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 3706 "src/Compiler/pars.fsy" + let mColon = rhs parseState 1 + let ty = SynType.FromParseError(mColon.EndRange) + reportParseErrorAt mColon (FSComp.SR.parsExpectingType ()) + SynPat.IsInst(ty, mColon) + ) +//# 3706 "src/Compiler/pars.fsy" + : 'gentype_constrPattern)); +//# 10500 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3582 "src/Compiler/pars.fsy" +//# 3712 "src/Compiler/pars.fsy" _1 ) -//# 3582 "src/Compiler/pars.fsy" +//# 3712 "src/Compiler/pars.fsy" : 'gentype_constrPattern)); -//# 10228 "pars.fs" +//# 10511 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_namePatPairs in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3586 "src/Compiler/pars.fsy" +//# 3716 "src/Compiler/pars.fsy" let mParen = rhs2 parseState 1 3 let trivia = { ParenRange = mParen } SynArgPats.NamePatPairs(_2, rhs parseState 2, trivia), mParen ) -//# 3586 "src/Compiler/pars.fsy" +//# 3716 "src/Compiler/pars.fsy" : SynArgPats * range)); -//# 10242 "pars.fs" +//# 10525 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynPat list in Microsoft.FSharp.Core.Operators.box ( ( -//# 3591 "src/Compiler/pars.fsy" +//# 3721 "src/Compiler/pars.fsy" let mParsed = rhs parseState 1 let mAll = (mParsed.StartRange, _1) ||> unionRangeWithListBy (fun p -> p.Range) SynArgPats.Pats _1, mAll ) -//# 3591 "src/Compiler/pars.fsy" +//# 3721 "src/Compiler/pars.fsy" : SynArgPats * range)); -//# 10255 "pars.fs" +//# 10538 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPattern in let _2 = parseState.GetInput(2) :?> SynPat list in Microsoft.FSharp.Core.Operators.box ( ( -//# 3597 "src/Compiler/pars.fsy" +//# 3727 "src/Compiler/pars.fsy" _1 :: _2 ) -//# 3597 "src/Compiler/pars.fsy" +//# 3727 "src/Compiler/pars.fsy" : SynPat list)); -//# 10267 "pars.fs" +//# 10550 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPattern in let _3 = parseState.GetInput(3) :?> SynPat list in Microsoft.FSharp.Core.Operators.box ( ( -//# 3600 "src/Compiler/pars.fsy" +//# 3730 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsSuccessivePatternsShouldBeSpacedOrTupled()) _1 :: _3 ) -//# 3600 "src/Compiler/pars.fsy" +//# 3730 "src/Compiler/pars.fsy" : SynPat list)); -//# 10280 "pars.fs" +//# 10563 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPattern in let _3 = parseState.GetInput(3) :?> SynPat list in Microsoft.FSharp.Core.Operators.box ( ( -//# 3604 "src/Compiler/pars.fsy" +//# 3734 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsSuccessivePatternsShouldBeSpacedOrTupled()) _1 :: _3 ) -//# 3604 "src/Compiler/pars.fsy" +//# 3734 "src/Compiler/pars.fsy" : SynPat list)); -//# 10293 "pars.fs" +//# 10576 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3608 "src/Compiler/pars.fsy" +//# 3738 "src/Compiler/pars.fsy" [_1] ) -//# 3608 "src/Compiler/pars.fsy" +//# 3738 "src/Compiler/pars.fsy" : SynPat list)); -//# 10304 "pars.fs" +//# 10587 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_quoteExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3613 "src/Compiler/pars.fsy" +//# 3743 "src/Compiler/pars.fsy" SynPat.QuoteExpr(_1, lhs parseState) ) -//# 3613 "src/Compiler/pars.fsy" +//# 3743 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10315 "pars.fs" +//# 10598 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_recordPatternElementsAux in @@ -10320,488 +10603,548 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3616 "src/Compiler/pars.fsy" +//# 3746 "src/Compiler/pars.fsy" SynPat.Record(_2, rhs2 parseState 1 3) ) -//# 3616 "src/Compiler/pars.fsy" +//# 3746 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10328 "pars.fs" +//# 10611 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _3 = parseState.GetInput(3) :?> 'gentype_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 3619 "src/Compiler/pars.fsy" +//# 3749 "src/Compiler/pars.fsy" SynPat.Record([], rhs2 parseState 1 3) ) -//# 3619 "src/Compiler/pars.fsy" +//# 3749 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10340 "pars.fs" +//# 10623 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_listPatternElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 3622 "src/Compiler/pars.fsy" +//# 3752 "src/Compiler/pars.fsy" SynPat.ArrayOrList(false, _2, lhs parseState) ) -//# 3622 "src/Compiler/pars.fsy" +//# 3752 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10351 "pars.fs" +//# 10634 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_listPatternElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 3625 "src/Compiler/pars.fsy" +//# 3755 "src/Compiler/pars.fsy" SynPat.ArrayOrList(true, _2, lhs parseState) ) -//# 3625 "src/Compiler/pars.fsy" +//# 3755 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10362 "pars.fs" +//# 10645 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3628 "src/Compiler/pars.fsy" +//# 3758 "src/Compiler/pars.fsy" SynPat.Wild(lhs parseState) ) -//# 3628 "src/Compiler/pars.fsy" +//# 3758 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10372 "pars.fs" +//# 10655 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 3631 "src/Compiler/pars.fsy" +//# 3761 "src/Compiler/pars.fsy" SynPat.OptionalVal(_2, lhs parseState) ) -//# 3631 "src/Compiler/pars.fsy" +//# 3761 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10383 "pars.fs" +//# 10666 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomicPatternLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 3634 "src/Compiler/pars.fsy" +//# 3764 "src/Compiler/pars.fsy" let vis, lidwd = _1 if not (isNilOrSingleton lidwd.LongIdent) || String.isLeadingIdentifierCharacterUpperCase (List.head lidwd.LongIdent).idText then mkSynPatMaybeVar lidwd vis (lhs parseState) else let synIdent = List.head lidwd.IdentsWithTrivia - let (SynIdent(id, _)) = synIdent - SynPat.Named(synIdent, false, vis, id.idRange) + SynPat.Named(synIdent, false, vis, synIdent.Range) ) -//# 3634 "src/Compiler/pars.fsy" +//# 3764 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10400 "pars.fs" +//# 10682 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_constant in Microsoft.FSharp.Core.Operators.box ( ( -//# 3643 "src/Compiler/pars.fsy" +//# 3772 "src/Compiler/pars.fsy" SynPat.Const(fst _1, snd _1) ) -//# 3643 "src/Compiler/pars.fsy" +//# 3772 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10411 "pars.fs" +//# 10693 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3646 "src/Compiler/pars.fsy" +//# 3775 "src/Compiler/pars.fsy" SynPat.Const(SynConst.Bool false, lhs parseState) ) -//# 3646 "src/Compiler/pars.fsy" +//# 3775 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10421 "pars.fs" +//# 10703 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3649 "src/Compiler/pars.fsy" +//# 3778 "src/Compiler/pars.fsy" SynPat.Const(SynConst.Bool true, lhs parseState) ) -//# 3649 "src/Compiler/pars.fsy" +//# 3778 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10431 "pars.fs" +//# 10713 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3652 "src/Compiler/pars.fsy" +//# 3781 "src/Compiler/pars.fsy" SynPat.Null(lhs parseState) ) -//# 3652 "src/Compiler/pars.fsy" +//# 3781 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10441 "pars.fs" +//# 10723 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_parenPatternBody in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3655 "src/Compiler/pars.fsy" +//# 3784 "src/Compiler/pars.fsy" let m = lhs parseState SynPat.Paren(_2 m, m) ) -//# 3655 "src/Compiler/pars.fsy" +//# 3784 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10454 "pars.fs" +//# 10736 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_parenPatternBody in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3659 "src/Compiler/pars.fsy" +//# 3788 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) let m = rhs2 parseState 1 2 let parenPat = SynPat.Paren(_2 m, m) patFromParseError parenPat ) -//# 3659 "src/Compiler/pars.fsy" +//# 3788 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10469 "pars.fs" +//# 10751 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3665 "src/Compiler/pars.fsy" +//# 3794 "src/Compiler/pars.fsy" let innerPat = patFromParseError (SynPat.Wild(rhs parseState 2)) SynPat.Paren(innerPat, lhs parseState) ) -//# 3665 "src/Compiler/pars.fsy" +//# 3794 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10481 "pars.fs" +//# 10763 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3669 "src/Compiler/pars.fsy" +//# 3798 "src/Compiler/pars.fsy" let parenM = rhs parseState 1 reportParseErrorAt parenM (FSComp.SR.parsUnmatchedParen()) let innerPat = patFromParseError (SynPat.Wild parenM.EndRange) let parenPat = SynPat.Paren(innerPat, parenM) patFromParseError parenPat ) -//# 3669 "src/Compiler/pars.fsy" +//# 3798 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10496 "pars.fs" +//# 10778 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_tupleParenPatternElements in let _4 = parseState.GetInput(4) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3676 "src/Compiler/pars.fsy" +//# 3805 "src/Compiler/pars.fsy" let pats, commas = _3 SynPat.Tuple(true, List.rev pats, List.rev commas, lhs parseState) ) -//# 3676 "src/Compiler/pars.fsy" +//# 3805 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10509 "pars.fs" +//# 10791 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_tupleParenPatternElements in let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3680 "src/Compiler/pars.fsy" +//# 3809 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) let pats, commas = _3 SynPat.Tuple(true, List.rev pats, List.rev commas, lhs parseState) ) -//# 3680 "src/Compiler/pars.fsy" +//# 3809 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10523 "pars.fs" +//# 10805 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _4 = parseState.GetInput(4) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 3685 "src/Compiler/pars.fsy" +//# 3814 "src/Compiler/pars.fsy" (* silent recovery *) SynPat.Wild(lhs parseState) ) -//# 3685 "src/Compiler/pars.fsy" +//# 3814 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10534 "pars.fs" +//# 10816 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3688 "src/Compiler/pars.fsy" +//# 3817 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) SynPat.Wild(lhs parseState) ) -//# 3688 "src/Compiler/pars.fsy" +//# 3817 "src/Compiler/pars.fsy" : 'gentype_atomicPattern)); -//# 10546 "pars.fs" +//# 10828 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3693 "src/Compiler/pars.fsy" +//# 3822 "src/Compiler/pars.fsy" (fun m -> _1) ) -//# 3693 "src/Compiler/pars.fsy" +//# 3822 "src/Compiler/pars.fsy" : 'gentype_parenPatternBody)); -//# 10557 "pars.fs" +//# 10839 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3696 "src/Compiler/pars.fsy" +//# 3825 "src/Compiler/pars.fsy" (fun m -> SynPat.Const(SynConst.Unit, m)) ) -//# 3696 "src/Compiler/pars.fsy" +//# 3825 "src/Compiler/pars.fsy" : 'gentype_parenPatternBody)); -//# 10567 "pars.fs" +//# 10849 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_constrPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3725 "src/Compiler/pars.fsy" +//# 3854 "src/Compiler/pars.fsy" SynPat.As(_1, _3, rhs2 parseState 1 3) ) -//# 3725 "src/Compiler/pars.fsy" +//# 3854 "src/Compiler/pars.fsy" + : 'gentype_parenPattern)); +//# 10861 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in + let _3 = parseState.GetInput(3) :?> 'gentype_recover in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 3857 "src/Compiler/pars.fsy" + let mAs = rhs parseState 2 + let pat2 = SynPat.Wild(mAs.EndRange) + SynPat.As(_1, pat2, rhs2 parseState 1 2) + ) +//# 3857 "src/Compiler/pars.fsy" + : 'gentype_parenPattern)); +//# 10875 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 3862 "src/Compiler/pars.fsy" + let mAs = rhs parseState 2 + let pat2 = SynPat.Wild(mAs.EndRange) + reportParseErrorAt mAs (FSComp.SR.parsExpectingPattern ()) + SynPat.As(_1, pat2, rhs2 parseState 1 2) + ) +//# 3862 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10579 "pars.fs" +//# 10889 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in + let _2 = parseState.GetInput(2) :?> 'gentype_barCanBeRightBeforeNull in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3728 "src/Compiler/pars.fsy" +//# 3868 "src/Compiler/pars.fsy" let mBar = rhs parseState 2 SynPat.Or(_1, _3, rhs2 parseState 1 3, { BarRange = mBar }) ) -//# 3728 "src/Compiler/pars.fsy" +//# 3868 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10592 "pars.fs" +//# 10903 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tupleParenPatternElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 3732 "src/Compiler/pars.fsy" +//# 3872 "src/Compiler/pars.fsy" let pats, commas = _1 let pats, commas = normalizeTuplePat pats commas let m = (rhs parseState 1, pats) ||> unionRangeWithListBy (fun p -> p.Range) SynPat.Tuple(false, List.rev pats, List.rev commas, m) ) -//# 3732 "src/Compiler/pars.fsy" +//# 3872 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10606 "pars.fs" +//# 10917 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_conjParenPatternElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 3738 "src/Compiler/pars.fsy" +//# 3878 "src/Compiler/pars.fsy" SynPat.Ands(List.rev _1, rhs2 parseState 1 3) ) -//# 3738 "src/Compiler/pars.fsy" +//# 3878 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10617 "pars.fs" +//# 10928 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_typeWithTypeConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 3741 "src/Compiler/pars.fsy" +//# 3881 "src/Compiler/pars.fsy" let mLhs = lhs parseState SynPat.Typed(_1, _3, mLhs) ) -//# 3741 "src/Compiler/pars.fsy" +//# 3881 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10630 "pars.fs" +//# 10941 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3745 "src/Compiler/pars.fsy" +//# 3885 "src/Compiler/pars.fsy" let mColon = rhs parseState 2 + if not _3 then + reportParseErrorAt mColon (FSComp.SR.parsExpectingPattern ()) let ty = SynType.FromParseError(mColon.EndRange) SynPat.Typed(_1, ty, unionRanges _1.Range mColon) ) -//# 3745 "src/Compiler/pars.fsy" +//# 3885 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10644 "pars.fs" +//# 10957 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in let _2 = parseState.GetInput(2) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3750 "src/Compiler/pars.fsy" +//# 3892 "src/Compiler/pars.fsy" let mLhs = lhs parseState SynPat.Attrib(_2, _1, mLhs) ) -//# 3750 "src/Compiler/pars.fsy" +//# 3892 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10657 "pars.fs" +//# 10970 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3754 "src/Compiler/pars.fsy" +//# 3896 "src/Compiler/pars.fsy" let mColonColon = rhs parseState 2 SynPat.ListCons(_1, _3, rhs2 parseState 1 3, { ColonColonRange = mColonColon }) ) -//# 3754 "src/Compiler/pars.fsy" +//# 3896 "src/Compiler/pars.fsy" + : 'gentype_parenPattern)); +//# 10983 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in + let _3 = parseState.GetInput(3) :?> 'gentype_recover in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 3900 "src/Compiler/pars.fsy" + let mColonColon = rhs parseState 2 + if not _3 then + reportParseErrorAt mColonColon (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons(_1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) + ) +//# 3900 "src/Compiler/pars.fsy" + : 'gentype_parenPattern)); +//# 10999 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 3907 "src/Compiler/pars.fsy" + let mColonColon = rhs parseState 2 + reportParseErrorAt mColonColon (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons(_1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) + ) +//# 3907 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10670 "pars.fs" +//# 11013 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_constrPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3757 "src/Compiler/pars.fsy" +//# 3912 "src/Compiler/pars.fsy" _1 ) -//# 3757 "src/Compiler/pars.fsy" +//# 3912 "src/Compiler/pars.fsy" : 'gentype_parenPattern)); -//# 10681 "pars.fs" +//# 11024 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tupleParenPatternElements in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3761 "src/Compiler/pars.fsy" +//# 3916 "src/Compiler/pars.fsy" let pats, commas = _1 let mComma = rhs parseState 2 _3 :: pats, (mComma :: commas) ) -//# 3761 "src/Compiler/pars.fsy" +//# 3916 "src/Compiler/pars.fsy" : 'gentype_tupleParenPatternElements)); -//# 10695 "pars.fs" +//# 11038 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3766 "src/Compiler/pars.fsy" +//# 3921 "src/Compiler/pars.fsy" let mComma = rhs parseState 2 [_3; _1], [mComma] ) -//# 3766 "src/Compiler/pars.fsy" +//# 3921 "src/Compiler/pars.fsy" : 'gentype_tupleParenPatternElements)); -//# 10708 "pars.fs" +//# 11051 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tupleParenPatternElements in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3770 "src/Compiler/pars.fsy" +//# 3925 "src/Compiler/pars.fsy" let pats, commas = _1 let commaRange = rhs parseState 2 reportParseErrorAt commaRange (FSComp.SR.parsExpectingPattern()) let pat2 = SynPat.Wild(commaRange.EndRange) pat2 :: pats, (commaRange :: commas) ) -//# 3770 "src/Compiler/pars.fsy" +//# 3925 "src/Compiler/pars.fsy" : 'gentype_tupleParenPatternElements)); -//# 10724 "pars.fs" +//# 11067 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3777 "src/Compiler/pars.fsy" +//# 3932 "src/Compiler/pars.fsy" let commaRange = rhs parseState 2 reportParseErrorAt commaRange (FSComp.SR.parsExpectingPattern()) let pat2 = SynPat.Wild(commaRange.EndRange) [pat2; _1], [commaRange] ) -//# 3777 "src/Compiler/pars.fsy" +//# 3932 "src/Compiler/pars.fsy" : 'gentype_tupleParenPatternElements)); -//# 10739 "pars.fs" +//# 11082 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3783 "src/Compiler/pars.fsy" +//# 3938 "src/Compiler/pars.fsy" let commaRange = rhs parseState 1 reportParseErrorAt commaRange (FSComp.SR.parsExpectingPattern()) let pat1 = SynPat.Wild(commaRange.StartRange) [_2; pat1], [commaRange] ) -//# 3783 "src/Compiler/pars.fsy" +//# 3938 "src/Compiler/pars.fsy" : 'gentype_tupleParenPatternElements)); -//# 10753 "pars.fs" +//# 11096 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3789 "src/Compiler/pars.fsy" +//# 3944 "src/Compiler/pars.fsy" let commaRange = rhs parseState 1 if not _2 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedPatternAfterToken ()) let pat1 = SynPat.Wild(commaRange.StartRange) let pat2 = SynPat.Wild(commaRange.EndRange) [pat2; pat1], [commaRange] ) -//# 3789 "src/Compiler/pars.fsy" +//# 3944 "src/Compiler/pars.fsy" : 'gentype_tupleParenPatternElements)); -//# 10768 "pars.fs" +//# 11111 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_conjParenPatternElements in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3797 "src/Compiler/pars.fsy" +//# 3952 "src/Compiler/pars.fsy" _3 :: _1 ) -//# 3797 "src/Compiler/pars.fsy" +//# 3952 "src/Compiler/pars.fsy" : 'gentype_conjParenPatternElements)); -//# 10780 "pars.fs" +//# 11123 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3800 "src/Compiler/pars.fsy" +//# 3955 "src/Compiler/pars.fsy" _3 :: _1 :: [] ) -//# 3800 "src/Compiler/pars.fsy" +//# 3955 "src/Compiler/pars.fsy" : 'gentype_conjParenPatternElements)); -//# 10792 "pars.fs" +//# 11135 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recordPatternElement in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in Microsoft.FSharp.Core.Operators.box ( ( -//# 3804 "src/Compiler/pars.fsy" +//# 3959 "src/Compiler/pars.fsy" [_1] ) -//# 3804 "src/Compiler/pars.fsy" +//# 3959 "src/Compiler/pars.fsy" : 'gentype_recordPatternElementsAux)); -//# 10804 "pars.fs" +//# 11147 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recordPatternElement in let _2 = parseState.GetInput(2) :?> 'gentype_seps in @@ -10809,77 +11152,77 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3807 "src/Compiler/pars.fsy" +//# 3962 "src/Compiler/pars.fsy" _1 :: _3 ) -//# 3807 "src/Compiler/pars.fsy" +//# 3962 "src/Compiler/pars.fsy" : 'gentype_recordPatternElementsAux)); -//# 10817 "pars.fs" +//# 11160 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in let _3 = parseState.GetInput(3) :?> 'gentype_parenPattern in Microsoft.FSharp.Core.Operators.box ( ( -//# 3811 "src/Compiler/pars.fsy" +//# 3966 "src/Compiler/pars.fsy" let mPath = _1.Range let mEquals = rhs parseState 2 let mPat = _3.Range List.frontAndBack _1.LongIdent, Some mEquals, _3 ) -//# 3811 "src/Compiler/pars.fsy" +//# 3966 "src/Compiler/pars.fsy" : 'gentype_recordPatternElement)); -//# 10832 "pars.fs" +//# 11175 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3817 "src/Compiler/pars.fsy" +//# 3972 "src/Compiler/pars.fsy" let mPath = _1.Range let mEquals = rhs parseState 2 let pat = SynPat.Wild(mEquals.EndRange) List.frontAndBack _1.LongIdent, Some mEquals, pat ) -//# 3817 "src/Compiler/pars.fsy" +//# 3972 "src/Compiler/pars.fsy" : 'gentype_recordPatternElement)); -//# 10847 "pars.fs" +//# 11190 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3823 "src/Compiler/pars.fsy" +//# 3978 "src/Compiler/pars.fsy" let pat = SynPat.Wild(_1.Range.EndRange) List.frontAndBack _1.LongIdent, None, pat ) -//# 3823 "src/Compiler/pars.fsy" +//# 3978 "src/Compiler/pars.fsy" : 'gentype_recordPatternElement)); -//# 10860 "pars.fs" +//# 11203 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3828 "src/Compiler/pars.fsy" +//# 3983 "src/Compiler/pars.fsy" [] ) -//# 3828 "src/Compiler/pars.fsy" +//# 3983 "src/Compiler/pars.fsy" : 'gentype_listPatternElements)); -//# 10870 "pars.fs" +//# 11213 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _2 = parseState.GetInput(2) :?> 'gentype_opt_seps in Microsoft.FSharp.Core.Operators.box ( ( -//# 3831 "src/Compiler/pars.fsy" +//# 3986 "src/Compiler/pars.fsy" [_1] ) -//# 3831 "src/Compiler/pars.fsy" +//# 3986 "src/Compiler/pars.fsy" : 'gentype_listPatternElements)); -//# 10882 "pars.fs" +//# 11225 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _2 = parseState.GetInput(2) :?> 'gentype_seps in @@ -10887,180 +11230,180 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3834 "src/Compiler/pars.fsy" +//# 3989 "src/Compiler/pars.fsy" _1 :: _3 ) -//# 3834 "src/Compiler/pars.fsy" +//# 3989 "src/Compiler/pars.fsy" : 'gentype_listPatternElements)); -//# 10895 "pars.fs" +//# 11238 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 3839 "src/Compiler/pars.fsy" +//# 3994 "src/Compiler/pars.fsy" _2 ) -//# 3839 "src/Compiler/pars.fsy" +//# 3994 "src/Compiler/pars.fsy" : SynExpr)); -//# 10907 "pars.fs" +//# 11250 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3842 "src/Compiler/pars.fsy" +//# 3997 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileExpression()) exprFromParseError _2 ) -//# 3842 "src/Compiler/pars.fsy" +//# 3997 "src/Compiler/pars.fsy" : SynExpr)); -//# 10920 "pars.fs" +//# 11263 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 3846 "src/Compiler/pars.fsy" +//# 4001 "src/Compiler/pars.fsy" let m = rhs parseState 1 reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectingExpression ()) arbExpr ("typedSequentialExprBlock1", m.EndRange) ) -//# 3846 "src/Compiler/pars.fsy" +//# 4001 "src/Compiler/pars.fsy" : SynExpr)); -//# 10933 "pars.fs" +//# 11276 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typedSequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3851 "src/Compiler/pars.fsy" +//# 4006 "src/Compiler/pars.fsy" _1 ) -//# 3851 "src/Compiler/pars.fsy" +//# 4006 "src/Compiler/pars.fsy" : SynExpr)); -//# 10944 "pars.fs" +//# 11287 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 3856 "src/Compiler/pars.fsy" +//# 4011 "src/Compiler/pars.fsy" _2 ) -//# 3856 "src/Compiler/pars.fsy" +//# 4011 "src/Compiler/pars.fsy" : SynExpr)); -//# 10956 "pars.fs" +//# 11299 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 3859 "src/Compiler/pars.fsy" +//# 4014 "src/Compiler/pars.fsy" let m = rhs parseState 1 reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectingExpression ()) arbExpr ("declExprBlock1", m.EndRange) ) -//# 3859 "src/Compiler/pars.fsy" +//# 4014 "src/Compiler/pars.fsy" : SynExpr)); -//# 10969 "pars.fs" +//# 11312 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3864 "src/Compiler/pars.fsy" +//# 4019 "src/Compiler/pars.fsy" _1 ) -//# 3864 "src/Compiler/pars.fsy" +//# 4019 "src/Compiler/pars.fsy" : SynExpr)); -//# 10980 "pars.fs" +//# 11323 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typedSequentialExpr in let _2 = parseState.GetInput(2) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 3870 "src/Compiler/pars.fsy" +//# 4025 "src/Compiler/pars.fsy" fun _ -> _1 ) -//# 3870 "src/Compiler/pars.fsy" +//# 4025 "src/Compiler/pars.fsy" : 'gentype_typedSequentialExprBlockR)); -//# 10992 "pars.fs" +//# 11335 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typedSequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3873 "src/Compiler/pars.fsy" +//# 4028 "src/Compiler/pars.fsy" fun _ -> _1 ) -//# 3873 "src/Compiler/pars.fsy" +//# 4028 "src/Compiler/pars.fsy" : 'gentype_typedSequentialExprBlockR)); -//# 11003 "pars.fs" +//# 11346 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3876 "src/Compiler/pars.fsy" +//# 4031 "src/Compiler/pars.fsy" fun (mStart: range) -> arbExpr ("typedSequentialExprBlockR1", mStart.EndRange) ) -//# 3876 "src/Compiler/pars.fsy" +//# 4031 "src/Compiler/pars.fsy" : 'gentype_typedSequentialExprBlockR)); -//# 11014 "pars.fs" +//# 11357 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_typeWithTypeConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 3880 "src/Compiler/pars.fsy" +//# 4035 "src/Compiler/pars.fsy" SynExpr.Typed(_1, _3, unionRanges _1.Range _3.Range) ) -//# 3880 "src/Compiler/pars.fsy" +//# 4035 "src/Compiler/pars.fsy" : 'gentype_typedSequentialExpr)); -//# 11026 "pars.fs" +//# 11369 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3883 "src/Compiler/pars.fsy" +//# 4038 "src/Compiler/pars.fsy" let mColon = rhs parseState 2 let ty = SynType.FromParseError(mColon.EndRange) SynExpr.Typed(_1, ty, unionRanges _1.Range mColon) ) -//# 3883 "src/Compiler/pars.fsy" +//# 4038 "src/Compiler/pars.fsy" : 'gentype_typedSequentialExpr)); -//# 11040 "pars.fs" +//# 11383 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3888 "src/Compiler/pars.fsy" +//# 4043 "src/Compiler/pars.fsy" _1 ) -//# 3888 "src/Compiler/pars.fsy" +//# 4043 "src/Compiler/pars.fsy" : 'gentype_typedSequentialExpr)); -//# 11051 "pars.fs" +//# 11394 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typedSequentialExpr in let _2 = parseState.GetInput(2) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 3892 "src/Compiler/pars.fsy" +//# 4047 "src/Compiler/pars.fsy" checkEndOfFileError _2; _1 ) -//# 3892 "src/Compiler/pars.fsy" +//# 4047 "src/Compiler/pars.fsy" : SynExpr)); -//# 11063 "pars.fs" +//# 11406 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> 'gentype_seps in @@ -11068,47 +11411,49 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3896 "src/Compiler/pars.fsy" - SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, true, _1, _3, unionRanges _1.Range _3.Range) +//# 4051 "src/Compiler/pars.fsy" + let trivia = { SeparatorRange = _2 } + SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, true, _1, _3, unionRanges _1.Range _3.Range, trivia) ) -//# 3896 "src/Compiler/pars.fsy" +//# 4051 "src/Compiler/pars.fsy" : 'gentype_sequentialExpr)); -//# 11076 "pars.fs" +//# 11420 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> 'gentype_seps in Microsoft.FSharp.Core.Operators.box ( ( -//# 3899 "src/Compiler/pars.fsy" +//# 4055 "src/Compiler/pars.fsy" _1 ) -//# 3899 "src/Compiler/pars.fsy" +//# 4055 "src/Compiler/pars.fsy" : 'gentype_sequentialExpr)); -//# 11088 "pars.fs" +//# 11432 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3902 "src/Compiler/pars.fsy" +//# 4058 "src/Compiler/pars.fsy" _1 ) -//# 3902 "src/Compiler/pars.fsy" +//# 4058 "src/Compiler/pars.fsy" : 'gentype_sequentialExpr)); -//# 11099 "pars.fs" +//# 11443 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_sequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3905 "src/Compiler/pars.fsy" - SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, _1, _3, unionRanges _1.Range _3.Range) +//# 4061 "src/Compiler/pars.fsy" + let trivia = { SeparatorRange = Some (rhs parseState 2) } + SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, _1, _3, unionRanges _1.Range _3.Range, trivia) ) -//# 3905 "src/Compiler/pars.fsy" +//# 4061 "src/Compiler/pars.fsy" : 'gentype_sequentialExpr)); -//# 11111 "pars.fs" +//# 11456 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _4 = parseState.GetInput(4) :?> 'gentype_typedSequentialExpr in @@ -11116,18 +11461,19 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3908 "src/Compiler/pars.fsy" - SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, _1, _4, unionRanges _1.Range _4.Range) +//# 4065 "src/Compiler/pars.fsy" + let trivia = { SeparatorRange = Some (rhs parseState 2) } + SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, _1, _4, unionRanges _1.Range _4.Range, trivia) ) -//# 3908 "src/Compiler/pars.fsy" +//# 4065 "src/Compiler/pars.fsy" : 'gentype_sequentialExpr)); -//# 11124 "pars.fs" +//# 11470 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteLetBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3911 "src/Compiler/pars.fsy" +//# 4069 "src/Compiler/pars.fsy" let hwlb, m, mIn = _1 let mLetKwd, isUse = match hwlb with (BindingSetPreAttrs(m, _, isUse, _, _)) -> m, isUse let usedKeyword = if isUse then "use" else "let" @@ -11135,30 +11481,30 @@ let _fsyacc_reductions = lazy [| let fauxRange = m.EndRange // zero width range at end of m mkLocalBindings (m, hwlb, mIn, arbExpr ("seqExpr", fauxRange)) ) -//# 3911 "src/Compiler/pars.fsy" +//# 4069 "src/Compiler/pars.fsy" : 'gentype_sequentialExpr)); -//# 11140 "pars.fs" +//# 11486 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3924 "src/Compiler/pars.fsy" +//# 4082 "src/Compiler/pars.fsy" debugPrint("recovering via error"); true ) -//# 3924 "src/Compiler/pars.fsy" +//# 4082 "src/Compiler/pars.fsy" : 'gentype_recover)); -//# 11150 "pars.fs" +//# 11496 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 3927 "src/Compiler/pars.fsy" +//# 4085 "src/Compiler/pars.fsy" debugPrint("recovering via EOF"); false ) -//# 3927 "src/Compiler/pars.fsy" +//# 4085 "src/Compiler/pars.fsy" : 'gentype_recover)); -//# 11161 "pars.fs" +//# 11507 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> SynPat in @@ -11167,16 +11513,17 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3931 "src/Compiler/pars.fsy" +//# 4089 "src/Compiler/pars.fsy" let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) (* TODO Pretty sure this is wrong *) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) _4.Range let mIn = rhs parseState 5 - SynExprAndBang(spBind, _1, true, _2, _4, m, { EqualsRange = mEquals; InKeyword = Some mIn }) :: _6 + let trivia = { AndBangKeyword = rhs parseState 1; EqualsRange = mEquals; InKeyword = Some mIn } + SynExprAndBang(spBind, _1, true, _2, _4, m, trivia) :: _6 ) -//# 3931 "src/Compiler/pars.fsy" +//# 4089 "src/Compiler/pars.fsy" : 'gentype_moreBinders)); -//# 11179 "pars.fs" +//# 11526 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> SynPat in @@ -11187,205 +11534,206 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 3938 "src/Compiler/pars.fsy" +//# 4097 "src/Compiler/pars.fsy" let report, mIn, _ = _5 report "and!" (rhs parseState 1) // report unterminated error let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) (* TODO Pretty sure this is wrong *) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) _4.Range - SynExprAndBang(spBind, _1, true, _2, _4, m, { EqualsRange = mEquals; InKeyword = mIn }) :: _7 + let trivia = { AndBangKeyword = rhs parseState 1; EqualsRange = mEquals; InKeyword = mIn } + SynExprAndBang(spBind, _1, true, _2, _4, m, trivia) :: _7 ) -//# 3938 "src/Compiler/pars.fsy" +//# 4097 "src/Compiler/pars.fsy" : 'gentype_moreBinders)); -//# 11200 "pars.fs" +//# 11548 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 3946 "src/Compiler/pars.fsy" +//# 4106 "src/Compiler/pars.fsy" [] ) -//# 3946 "src/Compiler/pars.fsy" +//# 4106 "src/Compiler/pars.fsy" : 'gentype_moreBinders)); -//# 11210 "pars.fs" +//# 11558 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_defnBindings in let _3 = parseState.GetInput(3) :?> 'gentype_typedSequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3950 "src/Compiler/pars.fsy" +//# 4110 "src/Compiler/pars.fsy" let mIn = rhs parseState 2 |> Some mkLocalBindings (unionRanges (rhs2 parseState 1 2) _3.Range, _1, mIn, _3) ) -//# 3950 "src/Compiler/pars.fsy" +//# 4110 "src/Compiler/pars.fsy" : SynExpr)); -//# 11223 "pars.fs" +//# 11571 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_defnBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3954 "src/Compiler/pars.fsy" +//# 4114 "src/Compiler/pars.fsy" let mIn = rhs parseState 2 |> Some mkLocalBindings (rhs2 parseState 1 2, _1, mIn, arbExpr ("declExpr1", (rhs parseState 3))) ) -//# 3954 "src/Compiler/pars.fsy" +//# 4114 "src/Compiler/pars.fsy" : SynExpr)); -//# 11235 "pars.fs" +//# 11583 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteLetBindings in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3961 "src/Compiler/pars.fsy" +//# 4121 "src/Compiler/pars.fsy" let hwlb, m, mIn = _1 mkLocalBindings (unionRanges m _2.Range, hwlb, mIn, _2) ) -//# 3961 "src/Compiler/pars.fsy" +//# 4121 "src/Compiler/pars.fsy" : SynExpr)); -//# 11248 "pars.fs" +//# 11596 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteLetBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3965 "src/Compiler/pars.fsy" +//# 4125 "src/Compiler/pars.fsy" let hwlb, m, mIn = _1 reportParseErrorAt (match hwlb with (BindingSetPreAttrs(m, _, _, _, _)) -> m) (FSComp.SR.parsErrorInReturnForLetIncorrectIndentation()) mkLocalBindings (m, hwlb, mIn, arbExpr ("declExpr2", (rhs parseState 2))) ) -//# 3965 "src/Compiler/pars.fsy" +//# 4125 "src/Compiler/pars.fsy" : SynExpr)); -//# 11261 "pars.fs" +//# 11609 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteLetBindings in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3970 "src/Compiler/pars.fsy" +//# 4130 "src/Compiler/pars.fsy" let hwlb, m, mIn = _1 mkLocalBindings (unionRanges m _3.Range, hwlb, mIn, _3) ) -//# 3970 "src/Compiler/pars.fsy" +//# 4130 "src/Compiler/pars.fsy" : SynExpr)); -//# 11274 "pars.fs" +//# 11622 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteLetBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 3974 "src/Compiler/pars.fsy" +//# 4134 "src/Compiler/pars.fsy" let hwlb, m, mIn = _1 //reportParseErrorAt (match hwlb with (BindingSetPreAttrs(m, _, _, _, _)) -> m) (FSComp.SR.parsErrorInReturnForLetIncorrectIndentation()) mkLocalBindings (unionRanges m (rhs parseState 3), hwlb, mIn, arbExpr ("declExpr3", (rhs parseState 3))) ) -//# 3974 "src/Compiler/pars.fsy" +//# 4134 "src/Compiler/pars.fsy" : SynExpr)); -//# 11287 "pars.fs" +//# 11635 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_hardwhiteDoBinding in Microsoft.FSharp.Core.Operators.box ( ( -//# 3979 "src/Compiler/pars.fsy" +//# 4139 "src/Compiler/pars.fsy" let (BindingSetPreAttrs(_, _, _, _, m)), e = _1 SynExpr.Do(e, unionRanges (rhs parseState 1).StartRange e.Range) ) -//# 3979 "src/Compiler/pars.fsy" +//# 4139 "src/Compiler/pars.fsy" : SynExpr)); -//# 11299 "pars.fs" +//# 11647 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_anonMatchingExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3983 "src/Compiler/pars.fsy" +//# 4143 "src/Compiler/pars.fsy" _1 ) -//# 3983 "src/Compiler/pars.fsy" +//# 4143 "src/Compiler/pars.fsy" : SynExpr)); -//# 11310 "pars.fs" +//# 11658 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_anonLambdaExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 3986 "src/Compiler/pars.fsy" +//# 4146 "src/Compiler/pars.fsy" _1 ) -//# 3986 "src/Compiler/pars.fsy" +//# 4146 "src/Compiler/pars.fsy" : SynExpr)); -//# 11321 "pars.fs" +//# 11669 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_withClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 3989 "src/Compiler/pars.fsy" +//# 4149 "src/Compiler/pars.fsy" let mMatch = rhs parseState 1 let mWith, (clauses, mLast) = _3 let spBind = DebugPointAtBinding.Yes(unionRanges mMatch mWith) let trivia = { MatchKeyword = mMatch; WithKeyword = mWith } SynExpr.Match(spBind, _2, clauses, unionRanges mMatch mLast, trivia) ) -//# 3989 "src/Compiler/pars.fsy" +//# 4149 "src/Compiler/pars.fsy" : SynExpr)); -//# 11337 "pars.fs" +//# 11685 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 3996 "src/Compiler/pars.fsy" +//# 4156 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileMatch()) // Produce approximate expression during error recovery exprFromParseError _2 ) -//# 3996 "src/Compiler/pars.fsy" +//# 4156 "src/Compiler/pars.fsy" : SynExpr)); -//# 11351 "pars.fs" +//# 11699 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_withClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4001 "src/Compiler/pars.fsy" +//# 4161 "src/Compiler/pars.fsy" let mMatch = (rhs parseState 1) let mWith, (clauses, mLast) = _3 let spBind = DebugPointAtBinding.Yes(unionRanges mMatch mWith) let trivia = { MatchBangKeyword = mMatch; WithKeyword = mWith } SynExpr.MatchBang(spBind, _2, clauses, unionRanges mMatch mLast, trivia) ) -//# 4001 "src/Compiler/pars.fsy" +//# 4161 "src/Compiler/pars.fsy" : SynExpr)); -//# 11367 "pars.fs" +//# 11715 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4008 "src/Compiler/pars.fsy" +//# 4168 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileMatch()) // Produce approximate expression during error recovery exprFromParseError _2 ) -//# 4008 "src/Compiler/pars.fsy" +//# 4168 "src/Compiler/pars.fsy" : SynExpr)); -//# 11381 "pars.fs" +//# 11729 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExprBlockR in let _3 = parseState.GetInput(3) :?> 'gentype_withClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4013 "src/Compiler/pars.fsy" +//# 4173 "src/Compiler/pars.fsy" let mTry = rhs parseState 1 let expr = _2 mTry let spTry = DebugPointAtTry.Yes mTry @@ -11401,16 +11749,16 @@ let _fsyacc_reductions = lazy [| WithToEndRange = mWithToLast } SynExpr.TryWith(expr, clauses, mTryToLast, spTry, spWith, trivia) ) -//# 4013 "src/Compiler/pars.fsy" +//# 4173 "src/Compiler/pars.fsy" : SynExpr)); -//# 11406 "pars.fs" +//# 11754 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExprBlockR in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4029 "src/Compiler/pars.fsy" +//# 4189 "src/Compiler/pars.fsy" let mTry = rhs parseState 1 let spTry = DebugPointAtTry.Yes mTry if not _3 then reportParseErrorAt mTry (FSComp.SR.parsUnexpectedEndOfFileTry ()) @@ -11426,15 +11774,15 @@ let _fsyacc_reductions = lazy [| WithToEndRange = mWhole } SynExpr.TryWith(expr, [], mWhole, spTry, spWith, trivia) ) -//# 4029 "src/Compiler/pars.fsy" +//# 4189 "src/Compiler/pars.fsy" : SynExpr)); -//# 11431 "pars.fs" +//# 11779 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 4045 "src/Compiler/pars.fsy" +//# 4205 "src/Compiler/pars.fsy" let mTry = rhs parseState 1 let mExpr = mTry.EndRange let expr = arbExpr ("try1", mExpr) @@ -11452,16 +11800,16 @@ let _fsyacc_reductions = lazy [| WithToEndRange = mWithToLast } SynExpr.TryWith(expr, clauses, mTryToLast, spTry, spWith, trivia) ) -//# 4045 "src/Compiler/pars.fsy" +//# 4205 "src/Compiler/pars.fsy" : SynExpr)); -//# 11457 "pars.fs" +//# 11805 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> range in let _3 = parseState.GetInput(3) :?> 'gentype_withClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4063 "src/Compiler/pars.fsy" +//# 4223 "src/Compiler/pars.fsy" let mTry = rhs parseState 1 let mExpr = mTry.EndRange let expr = arbExpr ("try2", mExpr) @@ -11479,16 +11827,16 @@ let _fsyacc_reductions = lazy [| WithToEndRange = mWithToLast } SynExpr.TryWith(expr, clauses, mTryToLast, spTry, spWith, trivia) ) -//# 4063 "src/Compiler/pars.fsy" +//# 4223 "src/Compiler/pars.fsy" : SynExpr)); -//# 11484 "pars.fs" +//# 11832 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExprBlockR in let _4 = parseState.GetInput(4) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4081 "src/Compiler/pars.fsy" +//# 4241 "src/Compiler/pars.fsy" let mTry = rhs parseState 1 let tryExpr = _2 mTry let spTry = DebugPointAtTry.Yes mTry @@ -11499,29 +11847,29 @@ let _fsyacc_reductions = lazy [| let trivia = { TryKeyword = mTry; FinallyKeyword = mFinally } SynExpr.TryFinally(tryExpr, finallyExpr, mTryToLast, spTry, spFinally, trivia) ) -//# 4081 "src/Compiler/pars.fsy" +//# 4241 "src/Compiler/pars.fsy" : SynExpr)); -//# 11504 "pars.fs" +//# 11852 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ifExprCases in Microsoft.FSharp.Core.Operators.box ( ( -//# 4092 "src/Compiler/pars.fsy" +//# 4252 "src/Compiler/pars.fsy" let mIf = rhs parseState 1 _3 _2 mIf false ) -//# 4092 "src/Compiler/pars.fsy" +//# 4252 "src/Compiler/pars.fsy" : SynExpr)); -//# 11517 "pars.fs" +//# 11865 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4096 "src/Compiler/pars.fsy" +//# 4256 "src/Compiler/pars.fsy" errorR (Error(FSComp.SR.parsIncompleteIf (), rhs parseState 1)) let ifExpr = _2 let mIf = rhs parseState 1 @@ -11531,15 +11879,15 @@ let _fsyacc_reductions = lazy [| let trivia = { IfKeyword = mIf; IsElif = false; ThenKeyword = mThen; ElseKeyword = None; IfToThenRange = m } SynExpr.IfThenElse(_2, arbExpr ("if1", mThen), None, spIfToThen, true, m, trivia) ) -//# 4096 "src/Compiler/pars.fsy" +//# 4256 "src/Compiler/pars.fsy" : SynExpr)); -//# 11536 "pars.fs" +//# 11884 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4106 "src/Compiler/pars.fsy" +//# 4266 "src/Compiler/pars.fsy" errorR (Error(FSComp.SR.parsIncompleteIf (), rhs parseState 1)) let m = rhs parseState 1 let mEnd = m.EndRange @@ -11547,97 +11895,97 @@ let _fsyacc_reductions = lazy [| let trivia = { IfKeyword = m; IsElif = false; ThenKeyword = m; ElseKeyword = None; IfToThenRange = m } SynExpr.IfThenElse(arbExpr ("if2", mEnd), arbExpr ("if3", mEnd), None, spIfToThen, true, m, trivia) ) -//# 4106 "src/Compiler/pars.fsy" +//# 4266 "src/Compiler/pars.fsy" : SynExpr)); -//# 11552 "pars.fs" +//# 11900 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4114 "src/Compiler/pars.fsy" +//# 4274 "src/Compiler/pars.fsy" SynExpr.Lazy(_2, unionRanges (rhs parseState 1) _2.Range) ) -//# 4114 "src/Compiler/pars.fsy" +//# 4274 "src/Compiler/pars.fsy" : SynExpr)); -//# 11563 "pars.fs" +//# 11911 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4117 "src/Compiler/pars.fsy" +//# 4277 "src/Compiler/pars.fsy" SynExpr.Assert(_2, unionRanges (rhs parseState 1) _2.Range) ) -//# 4117 "src/Compiler/pars.fsy" +//# 4277 "src/Compiler/pars.fsy" : SynExpr)); -//# 11574 "pars.fs" +//# 11922 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4120 "src/Compiler/pars.fsy" +//# 4280 "src/Compiler/pars.fsy" raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsAssertIsNotFirstClassValue()) ) -//# 4120 "src/Compiler/pars.fsy" +//# 4280 "src/Compiler/pars.fsy" : SynExpr)); -//# 11584 "pars.fs" +//# 11932 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4123 "src/Compiler/pars.fsy" +//# 4283 "src/Compiler/pars.fsy" SynExpr.Lazy(_2, unionRanges (rhs parseState 1) _2.Range) ) -//# 4123 "src/Compiler/pars.fsy" +//# 4283 "src/Compiler/pars.fsy" : SynExpr)); -//# 11595 "pars.fs" +//# 11943 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4126 "src/Compiler/pars.fsy" +//# 4286 "src/Compiler/pars.fsy" SynExpr.Assert(_2, unionRanges (rhs parseState 1) _2.Range) ) -//# 4126 "src/Compiler/pars.fsy" +//# 4286 "src/Compiler/pars.fsy" : SynExpr)); -//# 11606 "pars.fs" +//# 11954 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4129 "src/Compiler/pars.fsy" +//# 4289 "src/Compiler/pars.fsy" raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsAssertIsNotFirstClassValue()) ) -//# 4129 "src/Compiler/pars.fsy" +//# 4289 "src/Compiler/pars.fsy" : SynExpr)); -//# 11616 "pars.fs" +//# 11964 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_whileExprCore in Microsoft.FSharp.Core.Operators.box ( ( -//# 4132 "src/Compiler/pars.fsy" +//# 4292 "src/Compiler/pars.fsy" SynExpr.While (_2 (rhs parseState 1)) ) -//# 4132 "src/Compiler/pars.fsy" +//# 4292 "src/Compiler/pars.fsy" : SynExpr)); -//# 11627 "pars.fs" +//# 11975 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_whileExprCore in Microsoft.FSharp.Core.Operators.box ( ( -//# 4135 "src/Compiler/pars.fsy" +//# 4295 "src/Compiler/pars.fsy" let mKeyword = rhs parseState 1 parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.WhileBang mKeyword SynExpr.WhileBang (_2 mKeyword) ) -//# 4135 "src/Compiler/pars.fsy" +//# 4295 "src/Compiler/pars.fsy" : SynExpr)); -//# 11640 "pars.fs" +//# 11988 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopBinder in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11646,16 +11994,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4140 "src/Compiler/pars.fsy" +//# 4300 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 let mDo = rhs parseState 3 let spFor = DebugPointAtFor.Yes mFor let (pat, expr, _, spIn) = _2 SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, pat, expr, _4, unionRanges mFor _5) ) -//# 4140 "src/Compiler/pars.fsy" +//# 4300 "src/Compiler/pars.fsy" : SynExpr)); -//# 11658 "pars.fs" +//# 12006 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopBinder in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11664,16 +12012,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4147 "src/Compiler/pars.fsy" +//# 4307 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 if not _5 then reportParseErrorAt mFor (FSComp.SR.parsUnexpectedEndOfFileFor ()) let spFor = DebugPointAtFor.Yes mFor let (pat, expr, _, spIn) = _2 SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, pat, expr, _4, unionRanges mFor _4.Range) ) -//# 4147 "src/Compiler/pars.fsy" +//# 4307 "src/Compiler/pars.fsy" : SynExpr)); -//# 11676 "pars.fs" +//# 12024 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopBinder in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11681,16 +12029,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4154 "src/Compiler/pars.fsy" +//# 4314 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 let spFor = DebugPointAtFor.Yes mFor let (pat, expr, _, spIn) = _2 let bodyExpr = arbExpr ("forLoopBody2a", rhs parseState 4) SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, pat, expr, bodyExpr, unionRanges mFor _5) ) -//# 4154 "src/Compiler/pars.fsy" +//# 4314 "src/Compiler/pars.fsy" : SynExpr)); -//# 11693 "pars.fs" +//# 12041 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopBinder in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11698,7 +12046,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4161 "src/Compiler/pars.fsy" +//# 4321 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 if not _4 then reportParseErrorAt mFor (FSComp.SR.parsExpectedExpressionAfterToken ()) let spFor = DebugPointAtFor.Yes mFor @@ -11707,16 +12055,16 @@ let _fsyacc_reductions = lazy [| let bodyExpr = arbExpr ("forLoopBody2", mDo.EndRange) SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, pat, expr, bodyExpr, unionRanges mFor mDo) ) -//# 4161 "src/Compiler/pars.fsy" +//# 4321 "src/Compiler/pars.fsy" : SynExpr)); -//# 11712 "pars.fs" +//# 12060 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopBinder in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4170 "src/Compiler/pars.fsy" +//# 4330 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 let (pat, expr, ok, spIn) = _2 if not _3 then reportParseErrorAt mFor (FSComp.SR.parsForDoExpected ()) @@ -11726,9 +12074,9 @@ let _fsyacc_reductions = lazy [| let bodyExpr = arbExpr ("forLoopBody1", mForLoopBodyArb) SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, pat, expr, bodyExpr, unionRanges mFor mForLoopBodyArb) ) -//# 4170 "src/Compiler/pars.fsy" +//# 4330 "src/Compiler/pars.fsy" : SynExpr)); -//# 11731 "pars.fs" +//# 12079 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopBinder in let _3 = parseState.GetInput(3) :?> 'gentype_opt_OBLOCKSEP in @@ -11736,15 +12084,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4180 "src/Compiler/pars.fsy" +//# 4340 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 let spFor = DebugPointAtFor.Yes mFor let (pat, expr, _, spIn) = _2 SynExpr.ForEach(spFor, spIn, SeqExprOnly true, true, pat, expr, _4, unionRanges mFor _4.Range) ) -//# 4180 "src/Compiler/pars.fsy" +//# 4340 "src/Compiler/pars.fsy" : SynExpr)); -//# 11747 "pars.fs" +//# 12095 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopRange in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11753,15 +12101,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4186 "src/Compiler/pars.fsy" +//# 4346 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 let spFor = DebugPointAtFor.Yes mFor let (a, b, c, d, exprTo, spTo) = _2 SynExpr.For(spFor, spTo, a, b, c, d, exprTo, _4, unionRanges mFor _5) ) -//# 4186 "src/Compiler/pars.fsy" +//# 4346 "src/Compiler/pars.fsy" : SynExpr)); -//# 11764 "pars.fs" +//# 12112 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopRange in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11770,16 +12118,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4192 "src/Compiler/pars.fsy" +//# 4352 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 if not _5 then reportParseErrorAt mFor (FSComp.SR.parsUnexpectedEndOfFileFor ()) let spFor = DebugPointAtFor.Yes mFor let (a, b, c, d, exprTo, spTo) = _2 SynExpr.For(spFor, spTo, a, b, c, d, exprTo, _4, unionRanges mFor _4.Range) ) -//# 4192 "src/Compiler/pars.fsy" +//# 4352 "src/Compiler/pars.fsy" : SynExpr)); -//# 11782 "pars.fs" +//# 12130 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopRange in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11787,7 +12135,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4199 "src/Compiler/pars.fsy" +//# 4359 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 let spFor = DebugPointAtFor.Yes mFor let (a, b, c, d, exprTo, spTo) = _2 @@ -11795,9 +12143,9 @@ let _fsyacc_reductions = lazy [| let bodyExpr = arbExpr ("declExpr11", mForLoopBodyArb) SynExpr.For(spFor, spTo, a, b, c, d, exprTo, bodyExpr, unionRanges mFor _5) ) -//# 4199 "src/Compiler/pars.fsy" +//# 4359 "src/Compiler/pars.fsy" : SynExpr)); -//# 11800 "pars.fs" +//# 12148 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopRange in let _3 = parseState.GetInput(3) :?> 'gentype_doToken in @@ -11805,7 +12153,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4207 "src/Compiler/pars.fsy" +//# 4367 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 if not _4 then reportParseErrorAt mFor (FSComp.SR.parsUnexpectedEndOfFileFor ()) let spFor = DebugPointAtFor.Yes mFor @@ -11814,16 +12162,16 @@ let _fsyacc_reductions = lazy [| let bodyExpr = arbExpr ("declExpr11", mDo.EndRange) SynExpr.For(spFor, spTo, a, b, c, d, exprTo, bodyExpr, rhs2 parseState 1 3) ) -//# 4207 "src/Compiler/pars.fsy" +//# 4367 "src/Compiler/pars.fsy" : SynExpr)); -//# 11819 "pars.fs" +//# 12167 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_forLoopRange in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4216 "src/Compiler/pars.fsy" +//# 4376 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 if not _3 then reportParseErrorAt mFor (FSComp.SR.parsUnexpectedEndOfFileFor ()) let spFor = DebugPointAtFor.Yes mFor @@ -11832,9 +12180,9 @@ let _fsyacc_reductions = lazy [| let bodyExpr = arbExpr ("declExpr11", mExpr.EndRange) SynExpr.For(spFor, spTo, a, b, c, d, exprTo, bodyExpr, unionRanges mFor mExpr) ) -//# 4216 "src/Compiler/pars.fsy" +//# 4376 "src/Compiler/pars.fsy" : SynExpr)); -//# 11837 "pars.fs" +//# 12185 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_doToken in let _4 = parseState.GetInput(4) :?> SynExpr in @@ -11842,7 +12190,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4225 "src/Compiler/pars.fsy" +//# 4385 "src/Compiler/pars.fsy" let mFor = rhs parseState 1 let spToFake = DebugPointAtInOrTo.Yes mFor let spFor = DebugPointAtFor.Yes mFor @@ -11850,28 +12198,28 @@ let _fsyacc_reductions = lazy [| let expr2 = arbExpr ("endLoopRange1", rhs parseState 3) SynExpr.For(spFor, spToFake, mkSynId mFor "_loopVar", None, expr1, true, expr2, _4, unionRanges mFor _4.Range) ) -//# 4225 "src/Compiler/pars.fsy" +//# 4385 "src/Compiler/pars.fsy" : SynExpr)); -//# 11855 "pars.fs" +//# 12203 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4233 "src/Compiler/pars.fsy" +//# 4393 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsIdentifierExpected()) arbExpr ("declExpr12", (rhs parseState 1)) ) -//# 4233 "src/Compiler/pars.fsy" +//# 4393 "src/Compiler/pars.fsy" : SynExpr)); -//# 11867 "pars.fs" +//# 12215 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_parenPattern in let _4 = parseState.GetInput(4) :?> 'gentype_doneDeclEnd in Microsoft.FSharp.Core.Operators.box ( ( -//# 4237 "src/Compiler/pars.fsy" +//# 4397 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsInOrEqualExpected()) let mFor = rhs parseState 1 let spFor = DebugPointAtFor.Yes mFor @@ -11880,16 +12228,16 @@ let _fsyacc_reductions = lazy [| let mForLoopAll = rhs2 parseState 1 4 SynExpr.ForEach(spFor, spInFake, SeqExprOnly false, true, _2, arbExpr ("forLoopCollection", mFor), arbExpr ("forLoopBody3", mForLoopBodyArb), mForLoopAll) ) -//# 4237 "src/Compiler/pars.fsy" +//# 4397 "src/Compiler/pars.fsy" : SynExpr)); -//# 11885 "pars.fs" +//# 12233 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4246 "src/Compiler/pars.fsy" +//# 4406 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileFor()) let mFor = rhs parseState 1 let mIn = rhs parseState 1 @@ -11899,59 +12247,63 @@ let _fsyacc_reductions = lazy [| let mForLoopAll = rhs2 parseState 1 2 exprFromParseError (SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, _2, arbExpr ("forLoopCollection", mFor), arbExpr ("forLoopBody3", mForLoopBodyArb), mForLoopAll)) ) -//# 4246 "src/Compiler/pars.fsy" +//# 4406 "src/Compiler/pars.fsy" : SynExpr)); -//# 11904 "pars.fs" +//# 12252 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4256 "src/Compiler/pars.fsy" - SynExpr.YieldOrReturn((_1, not _1), _2, unionRanges (rhs parseState 1) _2.Range) +//# 4416 "src/Compiler/pars.fsy" + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn((_1, not _1), _2, (unionRanges (rhs parseState 1) _2.Range), trivia) ) -//# 4256 "src/Compiler/pars.fsy" +//# 4416 "src/Compiler/pars.fsy" : SynExpr)); -//# 11916 "pars.fs" +//# 12265 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4259 "src/Compiler/pars.fsy" - SynExpr.YieldOrReturnFrom((_1, not _1), _2, unionRanges (rhs parseState 1) _2.Range) +//# 4420 "src/Compiler/pars.fsy" + let trivia: SynExprYieldOrReturnFromTrivia = { YieldOrReturnFromKeyword = rhs parseState 1 } + SynExpr.YieldOrReturnFrom((_1, not _1), _2, (unionRanges (rhs parseState 1) _2.Range), trivia) ) -//# 4259 "src/Compiler/pars.fsy" +//# 4420 "src/Compiler/pars.fsy" : SynExpr)); -//# 11928 "pars.fs" +//# 12278 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4262 "src/Compiler/pars.fsy" +//# 4424 "src/Compiler/pars.fsy" let mYieldAll = rhs parseState 1 - SynExpr.YieldOrReturn((_1, not _1), arbExpr ("yield", mYieldAll), mYieldAll) + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn((_1, not _1), arbExpr ("yield", mYieldAll), mYieldAll, trivia) ) -//# 4262 "src/Compiler/pars.fsy" +//# 4424 "src/Compiler/pars.fsy" : SynExpr)); -//# 11941 "pars.fs" +//# 12292 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4266 "src/Compiler/pars.fsy" +//# 4429 "src/Compiler/pars.fsy" let mYieldAll = rhs parseState 1 - SynExpr.YieldOrReturnFrom((_1, not _1), arbExpr ("yield!", mYieldAll), mYieldAll) + let trivia: SynExprYieldOrReturnFromTrivia = { YieldOrReturnFromKeyword = rhs parseState 1 } + SynExpr.YieldOrReturnFrom((_1, not _1), arbExpr ("yield!", mYieldAll), mYieldAll, trivia) ) -//# 4266 "src/Compiler/pars.fsy" +//# 4429 "src/Compiler/pars.fsy" : SynExpr)); -//# 11954 "pars.fs" +//# 12306 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynPat in @@ -11962,16 +12314,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4270 "src/Compiler/pars.fsy" +//# 4434 "src/Compiler/pars.fsy" let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) _8.Range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, (_1 = "use"), true, _2, _4, _7, _8, m, trivia) ) -//# 4270 "src/Compiler/pars.fsy" +//# 4434 "src/Compiler/pars.fsy" : SynExpr)); -//# 11974 "pars.fs" +//# 12326 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynPat in @@ -11983,18 +12335,18 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4277 "src/Compiler/pars.fsy" +//# 4441 "src/Compiler/pars.fsy" let report, mIn, _ = _5 report (if _1 = "use" then "use!" else "let!") (rhs parseState 1) // report unterminated error let spBind = DebugPointAtBinding.Yes(unionRanges (rhs parseState 1) _4.Range) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) _8.Range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, (_1 = "use"), true, _2, _4, _7, _8, m, trivia) ) -//# 4277 "src/Compiler/pars.fsy" +//# 4441 "src/Compiler/pars.fsy" : SynExpr)); -//# 11997 "pars.fs" +//# 12349 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynPat in @@ -12004,18 +12356,18 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4286 "src/Compiler/pars.fsy" +//# 4450 "src/Compiler/pars.fsy" // error recovery that allows intellisense when writing incomplete computation expressions let spBind = DebugPointAtBinding.Yes(unionRanges (rhs parseState 1) _4.Range) let mEquals = rhs parseState 3 let mAll = unionRanges (rhs parseState 1) (rhs parseState 7) let m = _4.Range.EndRange // zero-width range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, (_1 = "use"), true, _2, _4, [], SynExpr.ImplicitZero m, mAll, trivia) ) -//# 4286 "src/Compiler/pars.fsy" +//# 4450 "src/Compiler/pars.fsy" : SynExpr)); -//# 12018 "pars.fs" +//# 12370 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _4 = parseState.GetInput(4) :?> 'gentype_opt_OBLOCKSEP in @@ -12023,218 +12375,222 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4295 "src/Compiler/pars.fsy" +//# 4459 "src/Compiler/pars.fsy" let spBind = DebugPointAtBinding.NoneAtDo - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = None } - SynExpr.LetOrUseBang(spBind, false, true, SynPat.Const(SynConst.Unit, _2.Range), _2, [], _5, unionRanges (rhs parseState 1) _5.Range, trivia) + let trivia: SynExprDoBangTrivia = { DoBangKeyword = rhs parseState 1 } + let m = unionRanges (rhs parseState 1) _5.Range + SynExpr.DoBang(_2, m, trivia) ) -//# 4295 "src/Compiler/pars.fsy" +//# 4459 "src/Compiler/pars.fsy" : SynExpr)); -//# 12033 "pars.fs" +//# 12386 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_hardwhiteDefnBindingsTerminator in Microsoft.FSharp.Core.Operators.box ( ( -//# 4300 "src/Compiler/pars.fsy" - SynExpr.DoBang(_2, unionRanges (rhs parseState 1) _2.Range) +//# 4465 "src/Compiler/pars.fsy" + let trivia: SynExprDoBangTrivia = { DoBangKeyword = rhs parseState 1 } + let m = unionRanges (rhs parseState 1) _2.Range + SynExpr.DoBang(_2, m, trivia) ) -//# 4300 "src/Compiler/pars.fsy" +//# 4465 "src/Compiler/pars.fsy" : SynExpr)); -//# 12045 "pars.fs" +//# 12400 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4303 "src/Compiler/pars.fsy" +//# 4470 "src/Compiler/pars.fsy" SynExpr.Fixed(_2, (unionRanges (rhs parseState 1) _2.Range)) ) -//# 4303 "src/Compiler/pars.fsy" +//# 4470 "src/Compiler/pars.fsy" : SynExpr)); -//# 12056 "pars.fs" +//# 12411 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExprBlockR in Microsoft.FSharp.Core.Operators.box ( ( -//# 4306 "src/Compiler/pars.fsy" +//# 4473 "src/Compiler/pars.fsy" errorR(Error(FSComp.SR.parsArrowUseIsLimited(), lhs parseState)) let mArrow = rhs parseState 1 let expr = _2 mArrow - SynExpr.YieldOrReturn((true, true), expr, (unionRanges mArrow expr.Range)) + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn((true, true), expr, (unionRanges mArrow expr.Range), trivia) ) -//# 4306 "src/Compiler/pars.fsy" +//# 4473 "src/Compiler/pars.fsy" : SynExpr)); -//# 12070 "pars.fs" +//# 12426 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 4312 "src/Compiler/pars.fsy" +//# 4480 "src/Compiler/pars.fsy" SynExpr.TypeTest(_1, _3, unionRanges _1.Range _3.Range) ) -//# 4312 "src/Compiler/pars.fsy" +//# 4480 "src/Compiler/pars.fsy" : SynExpr)); -//# 12082 "pars.fs" +//# 12438 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4315 "src/Compiler/pars.fsy" +//# 4483 "src/Compiler/pars.fsy" let mColon = rhs parseState 2 let ty = SynType.FromParseError(mColon.EndRange) SynExpr.TypeTest(_1, ty, unionRanges _1.Range mColon) ) -//# 4315 "src/Compiler/pars.fsy" +//# 4483 "src/Compiler/pars.fsy" : SynExpr)); -//# 12096 "pars.fs" +//# 12452 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 4320 "src/Compiler/pars.fsy" +//# 4488 "src/Compiler/pars.fsy" SynExpr.Upcast(_1, _3, unionRanges _1.Range _3.Range) ) -//# 4320 "src/Compiler/pars.fsy" +//# 4488 "src/Compiler/pars.fsy" : SynExpr)); -//# 12108 "pars.fs" +//# 12464 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4323 "src/Compiler/pars.fsy" +//# 4491 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 let ty = SynType.FromParseError(mOp.EndRange) SynExpr.Upcast(_1, ty, unionRanges _1.Range mOp) ) -//# 4323 "src/Compiler/pars.fsy" +//# 4491 "src/Compiler/pars.fsy" : SynExpr)); -//# 12122 "pars.fs" +//# 12478 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 4328 "src/Compiler/pars.fsy" +//# 4496 "src/Compiler/pars.fsy" SynExpr.Downcast(_1, _3, unionRanges _1.Range _3.Range) ) -//# 4328 "src/Compiler/pars.fsy" +//# 4496 "src/Compiler/pars.fsy" : SynExpr)); -//# 12134 "pars.fs" +//# 12490 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4331 "src/Compiler/pars.fsy" +//# 4499 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 let ty = SynType.FromParseError(mOp.EndRange) SynExpr.Downcast(_1, ty, unionRanges _1.Range mOp) ) -//# 4331 "src/Compiler/pars.fsy" +//# 4499 "src/Compiler/pars.fsy" : SynExpr)); -//# 12148 "pars.fs" +//# 12504 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4336 "src/Compiler/pars.fsy" +//# 4504 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 ":=" _3 ) -//# 4336 "src/Compiler/pars.fsy" +//# 4504 "src/Compiler/pars.fsy" : SynExpr)); -//# 12160 "pars.fs" +//# 12516 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4339 "src/Compiler/pars.fsy" +//# 4507 "src/Compiler/pars.fsy" mkSynAssign _1 _3 ) -//# 4339 "src/Compiler/pars.fsy" +//# 4507 "src/Compiler/pars.fsy" : SynExpr)); -//# 12172 "pars.fs" +//# 12528 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr list * range list in Microsoft.FSharp.Core.Operators.box ( ( -//# 4342 "src/Compiler/pars.fsy" +//# 4510 "src/Compiler/pars.fsy" let exprs, commas = _1 let m = unionRanges exprs.Head.Range (List.last exprs).Range SynExpr.Tuple(false, List.rev exprs, List.rev commas, m) ) -//# 4342 "src/Compiler/pars.fsy" +//# 4510 "src/Compiler/pars.fsy" : SynExpr)); -//# 12185 "pars.fs" +//# 12541 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4347 "src/Compiler/pars.fsy" +//# 4515 "src/Compiler/pars.fsy" SynExpr.JoinIn(_1, rhs parseState 2, _3, unionRanges _1.Range _3.Range) ) -//# 4347 "src/Compiler/pars.fsy" +//# 4515 "src/Compiler/pars.fsy" : SynExpr)); -//# 12197 "pars.fs" +//# 12553 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4350 "src/Compiler/pars.fsy" +//# 4518 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "in") mkSynInfix mOp _1 "@in" (arbExpr ("declExprInfixJoinIn", mOp.EndRange)) ) -//# 4350 "src/Compiler/pars.fsy" +//# 4518 "src/Compiler/pars.fsy" : SynExpr)); -//# 12211 "pars.fs" +//# 12567 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4355 "src/Compiler/pars.fsy" +//# 4523 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "||" _3 ) -//# 4355 "src/Compiler/pars.fsy" +//# 4523 "src/Compiler/pars.fsy" : SynExpr)); -//# 12223 "pars.fs" +//# 12579 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4358 "src/Compiler/pars.fsy" +//# 4526 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "||") mkSynInfix mOp _1 "||" (arbExpr ("declExprInfixBarBar", mOp.EndRange)) ) -//# 4358 "src/Compiler/pars.fsy" +//# 4526 "src/Compiler/pars.fsy" : SynExpr)); -//# 12237 "pars.fs" +//# 12593 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12242,12 +12598,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4363 "src/Compiler/pars.fsy" +//# 4531 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4363 "src/Compiler/pars.fsy" +//# 4531 "src/Compiler/pars.fsy" : SynExpr)); -//# 12250 "pars.fs" +//# 12606 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12255,91 +12611,91 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4366 "src/Compiler/pars.fsy" +//# 4534 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfixBarOp", mOp.EndRange)) ) -//# 4366 "src/Compiler/pars.fsy" +//# 4534 "src/Compiler/pars.fsy" : SynExpr)); -//# 12265 "pars.fs" +//# 12621 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4371 "src/Compiler/pars.fsy" +//# 4539 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "or" _3 ) -//# 4371 "src/Compiler/pars.fsy" +//# 4539 "src/Compiler/pars.fsy" : SynExpr)); -//# 12277 "pars.fs" +//# 12633 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4374 "src/Compiler/pars.fsy" +//# 4542 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression "or") mkSynInfix (rhs parseState 2) _1 "or" (arbExpr ("declExprInfixOr", (rhs parseState 3).StartRange)) ) -//# 4374 "src/Compiler/pars.fsy" +//# 4542 "src/Compiler/pars.fsy" : SynExpr)); -//# 12290 "pars.fs" +//# 12646 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4378 "src/Compiler/pars.fsy" +//# 4546 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "&" _3 ) -//# 4378 "src/Compiler/pars.fsy" +//# 4546 "src/Compiler/pars.fsy" : SynExpr)); -//# 12302 "pars.fs" +//# 12658 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4381 "src/Compiler/pars.fsy" +//# 4549 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "&") mkSynInfix mOp _1 "&" (arbExpr ("declExprInfixAmp", mOp.EndRange)) ) -//# 4381 "src/Compiler/pars.fsy" +//# 4549 "src/Compiler/pars.fsy" : SynExpr)); -//# 12316 "pars.fs" +//# 12672 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4386 "src/Compiler/pars.fsy" +//# 4554 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "&&" _3 ) -//# 4386 "src/Compiler/pars.fsy" +//# 4554 "src/Compiler/pars.fsy" : SynExpr)); -//# 12328 "pars.fs" +//# 12684 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4389 "src/Compiler/pars.fsy" +//# 4557 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "&&") mkSynInfix mOp _1 "&&" (arbExpr ("declExprInfixAmpAmp", mOp.EndRange)) ) -//# 4389 "src/Compiler/pars.fsy" +//# 4557 "src/Compiler/pars.fsy" : SynExpr)); -//# 12342 "pars.fs" +//# 12698 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12347,12 +12703,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4394 "src/Compiler/pars.fsy" +//# 4562 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4394 "src/Compiler/pars.fsy" +//# 4562 "src/Compiler/pars.fsy" : SynExpr)); -//# 12355 "pars.fs" +//# 12711 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12360,40 +12716,40 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4397 "src/Compiler/pars.fsy" +//# 4565 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfixAmpOp", (rhs parseState 3).StartRange)) ) -//# 4397 "src/Compiler/pars.fsy" +//# 4565 "src/Compiler/pars.fsy" : SynExpr)); -//# 12370 "pars.fs" +//# 12726 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4402 "src/Compiler/pars.fsy" +//# 4570 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "=" _3 ) -//# 4402 "src/Compiler/pars.fsy" +//# 4570 "src/Compiler/pars.fsy" : SynExpr)); -//# 12382 "pars.fs" +//# 12738 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4405 "src/Compiler/pars.fsy" +//# 4573 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "=") mkSynInfix mOp _1 "=" (arbExpr ("declExprInfixEquals", mOp.EndRange)) ) -//# 4405 "src/Compiler/pars.fsy" +//# 4573 "src/Compiler/pars.fsy" : SynExpr)); -//# 12396 "pars.fs" +//# 12752 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12401,12 +12757,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4410 "src/Compiler/pars.fsy" +//# 4578 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4410 "src/Compiler/pars.fsy" +//# 4578 "src/Compiler/pars.fsy" : SynExpr)); -//# 12409 "pars.fs" +//# 12765 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12414,40 +12770,40 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4413 "src/Compiler/pars.fsy" +//# 4581 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfix", mOp.EndRange)) ) -//# 4413 "src/Compiler/pars.fsy" +//# 4581 "src/Compiler/pars.fsy" : SynExpr)); -//# 12424 "pars.fs" +//# 12780 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4418 "src/Compiler/pars.fsy" +//# 4586 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "$" _3 ) -//# 4418 "src/Compiler/pars.fsy" +//# 4586 "src/Compiler/pars.fsy" : SynExpr)); -//# 12436 "pars.fs" +//# 12792 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4421 "src/Compiler/pars.fsy" +//# 4589 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "$") mkSynInfix mOp _1 "$" (arbExpr ("declExprInfixDollar", mOp.EndRange)) ) -//# 4421 "src/Compiler/pars.fsy" +//# 4589 "src/Compiler/pars.fsy" : SynExpr)); -//# 12450 "pars.fs" +//# 12806 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> bool in @@ -12455,12 +12811,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4426 "src/Compiler/pars.fsy" +//# 4594 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "<" _3 ) -//# 4426 "src/Compiler/pars.fsy" +//# 4594 "src/Compiler/pars.fsy" : SynExpr)); -//# 12463 "pars.fs" +//# 12819 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> bool in @@ -12468,14 +12824,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4429 "src/Compiler/pars.fsy" +//# 4597 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "<") mkSynInfix mOp _1 "<" (arbExpr ("declExprInfixLess", mOp.EndRange)) ) -//# 4429 "src/Compiler/pars.fsy" +//# 4597 "src/Compiler/pars.fsy" : SynExpr)); -//# 12478 "pars.fs" +//# 12834 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> bool in @@ -12483,12 +12839,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4434 "src/Compiler/pars.fsy" +//# 4602 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 ">" _3 ) -//# 4434 "src/Compiler/pars.fsy" +//# 4602 "src/Compiler/pars.fsy" : SynExpr)); -//# 12491 "pars.fs" +//# 12847 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> bool in @@ -12496,14 +12852,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4437 "src/Compiler/pars.fsy" +//# 4605 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression ">") mkSynInfix mOp _1 ">" (arbExpr ("declExprInfixGreater", mOp.EndRange)) ) -//# 4437 "src/Compiler/pars.fsy" +//# 4605 "src/Compiler/pars.fsy" : SynExpr)); -//# 12506 "pars.fs" +//# 12862 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12511,12 +12867,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4442 "src/Compiler/pars.fsy" +//# 4610 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4442 "src/Compiler/pars.fsy" +//# 4610 "src/Compiler/pars.fsy" : SynExpr)); -//# 12519 "pars.fs" +//# 12875 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12524,14 +12880,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4445 "src/Compiler/pars.fsy" +//# 4613 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfix", mOp.EndRange)) ) -//# 4445 "src/Compiler/pars.fsy" +//# 4613 "src/Compiler/pars.fsy" : SynExpr)); -//# 12534 "pars.fs" +//# 12890 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12539,12 +12895,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4450 "src/Compiler/pars.fsy" +//# 4618 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4450 "src/Compiler/pars.fsy" +//# 4618 "src/Compiler/pars.fsy" : SynExpr)); -//# 12547 "pars.fs" +//# 12903 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12552,37 +12908,37 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4453 "src/Compiler/pars.fsy" +//# 4621 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfixPercent", mOp.EndRange)) ) -//# 4453 "src/Compiler/pars.fsy" +//# 4621 "src/Compiler/pars.fsy" : SynExpr)); -//# 12562 "pars.fs" +//# 12918 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4458 "src/Compiler/pars.fsy" +//# 4626 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 let m = unionRanges _1.Range _3.Range let tupExpr = SynExpr.Tuple(false, [_1; _3], [mOp], m) let identExpr = mkSynOperator mOp "::" SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, m) ) -//# 4458 "src/Compiler/pars.fsy" +//# 4626 "src/Compiler/pars.fsy" : SynExpr)); -//# 12578 "pars.fs" +//# 12934 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4465 "src/Compiler/pars.fsy" +//# 4633 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 let m = unionRanges _1.Range mOp reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "::") @@ -12590,9 +12946,9 @@ let _fsyacc_reductions = lazy [| let tupExpr = SynExpr.Tuple(false, [_1; (arbExpr ("declExprInfixColonColon", mOp.EndRange))], [mOp], m) SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, m) ) -//# 4465 "src/Compiler/pars.fsy" +//# 4633 "src/Compiler/pars.fsy" : SynExpr)); -//# 12595 "pars.fs" +//# 12951 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12600,12 +12956,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4473 "src/Compiler/pars.fsy" +//# 4641 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4473 "src/Compiler/pars.fsy" +//# 4641 "src/Compiler/pars.fsy" : SynExpr)); -//# 12608 "pars.fs" +//# 12964 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12613,66 +12969,66 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4476 "src/Compiler/pars.fsy" +//# 4644 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfixPlusMinus", mOp.EndRange)) ) -//# 4476 "src/Compiler/pars.fsy" +//# 4644 "src/Compiler/pars.fsy" : SynExpr)); -//# 12623 "pars.fs" +//# 12979 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4481 "src/Compiler/pars.fsy" +//# 4649 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "-" _3 ) -//# 4481 "src/Compiler/pars.fsy" +//# 4649 "src/Compiler/pars.fsy" : SynExpr)); -//# 12635 "pars.fs" +//# 12991 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4484 "src/Compiler/pars.fsy" +//# 4652 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "-") mkSynInfix mOp _1 "-" (arbExpr ("declExprInfixMinus", mOp.EndRange)) ) -//# 4484 "src/Compiler/pars.fsy" +//# 4652 "src/Compiler/pars.fsy" : SynExpr)); -//# 12649 "pars.fs" +//# 13005 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4489 "src/Compiler/pars.fsy" +//# 4657 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 "*" _3 ) -//# 4489 "src/Compiler/pars.fsy" +//# 4657 "src/Compiler/pars.fsy" : SynExpr)); -//# 12661 "pars.fs" +//# 13017 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4492 "src/Compiler/pars.fsy" +//# 4660 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "*") mkSynInfix mOp _1 "*" (arbExpr ("declExprInfixStar", mOp.EndRange)) ) -//# 4492 "src/Compiler/pars.fsy" +//# 4660 "src/Compiler/pars.fsy" : SynExpr)); -//# 12675 "pars.fs" +//# 13031 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12680,12 +13036,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4497 "src/Compiler/pars.fsy" +//# 4665 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4497 "src/Compiler/pars.fsy" +//# 4665 "src/Compiler/pars.fsy" : SynExpr)); -//# 12688 "pars.fs" +//# 13044 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12693,14 +13049,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4500 "src/Compiler/pars.fsy" +//# 4668 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfixStarDivMod", mOp.EndRange)) ) -//# 4500 "src/Compiler/pars.fsy" +//# 4668 "src/Compiler/pars.fsy" : SynExpr)); -//# 12703 "pars.fs" +//# 13059 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12708,12 +13064,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4505 "src/Compiler/pars.fsy" +//# 4673 "src/Compiler/pars.fsy" mkSynInfix (rhs parseState 2) _1 _2 _3 ) -//# 4505 "src/Compiler/pars.fsy" +//# 4673 "src/Compiler/pars.fsy" : SynExpr)); -//# 12716 "pars.fs" +//# 13072 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> string in @@ -12721,76 +13077,76 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4508 "src/Compiler/pars.fsy" +//# 4676 "src/Compiler/pars.fsy" let mOp = rhs parseState 2 reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression _2) mkSynInfix mOp _1 _2 (arbExpr ("declExprInfixStarStar", mOp.EndRange)) ) -//# 4508 "src/Compiler/pars.fsy" +//# 4676 "src/Compiler/pars.fsy" : SynExpr)); -//# 12731 "pars.fs" +//# 13087 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4513 "src/Compiler/pars.fsy" +//# 4681 "src/Compiler/pars.fsy" let wholem = rhs2 parseState 1 3 let mOperator = rhs parseState 2 SynExpr.IndexRange(Some _1, mOperator, Some _3, rhs parseState 1, rhs parseState 3, wholem) ) -//# 4513 "src/Compiler/pars.fsy" +//# 4681 "src/Compiler/pars.fsy" : SynExpr)); -//# 12745 "pars.fs" +//# 13101 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4518 "src/Compiler/pars.fsy" +//# 4686 "src/Compiler/pars.fsy" let wholem = rhs2 parseState 1 2 let mOperator = rhs parseState 2 SynExpr.IndexRange(Some _1, mOperator, None, rhs parseState 1, mOperator, wholem) ) -//# 4518 "src/Compiler/pars.fsy" +//# 4686 "src/Compiler/pars.fsy" : SynExpr)); -//# 12758 "pars.fs" +//# 13114 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4523 "src/Compiler/pars.fsy" +//# 4691 "src/Compiler/pars.fsy" let wholem = rhs2 parseState 1 2 let mOperator = rhs parseState 1 SynExpr.IndexRange(None, mOperator, Some _2, mOperator, rhs parseState 2, wholem) ) -//# 4523 "src/Compiler/pars.fsy" +//# 4691 "src/Compiler/pars.fsy" : SynExpr)); -//# 12771 "pars.fs" +//# 13127 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4528 "src/Compiler/pars.fsy" +//# 4696 "src/Compiler/pars.fsy" let m = rhs parseState 1 SynExpr.IndexRange(None, m, None, m, m, m) ) -//# 4528 "src/Compiler/pars.fsy" +//# 4696 "src/Compiler/pars.fsy" : SynExpr)); -//# 12782 "pars.fs" +//# 13138 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4531 "src/Compiler/pars.fsy" +//# 4699 "src/Compiler/pars.fsy" _1 ) -//# 4531 "src/Compiler/pars.fsy" +//# 4699 "src/Compiler/pars.fsy" : SynExpr)); -//# 12793 "pars.fs" +//# 13149 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> 'gentype_doToken in @@ -12799,16 +13155,16 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4535 "src/Compiler/pars.fsy" +//# 4703 "src/Compiler/pars.fsy" fun mKeyword -> let mWhileHeader = unionRanges mKeyword _1.Range let spWhile = DebugPointAtWhile.Yes mWhileHeader let mWhileAll = unionRanges mKeyword _4 spWhile, _1, _3, mWhileAll ) -//# 4535 "src/Compiler/pars.fsy" +//# 4703 "src/Compiler/pars.fsy" : 'gentype_whileExprCore)); -//# 12811 "pars.fs" +//# 13167 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> 'gentype_doToken in @@ -12817,7 +13173,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4543 "src/Compiler/pars.fsy" +//# 4711 "src/Compiler/pars.fsy" fun mKeyword -> if not _4 then reportParseErrorAt mKeyword (FSComp.SR.parsUnexpectedEndOfFileWhile ()) let mWhileHeader = unionRanges mKeyword _1.Range @@ -12825,9 +13181,9 @@ let _fsyacc_reductions = lazy [| let mWhileAll = unionRanges mKeyword _3.Range spWhile, _1, _3, mWhileAll ) -//# 4543 "src/Compiler/pars.fsy" +//# 4711 "src/Compiler/pars.fsy" : 'gentype_whileExprCore)); -//# 12830 "pars.fs" +//# 13186 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> 'gentype_doToken in @@ -12835,7 +13191,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4552 "src/Compiler/pars.fsy" +//# 4720 "src/Compiler/pars.fsy" let mWhileBodyArb = rhs parseState 3 fun mKeyword -> @@ -12845,16 +13201,16 @@ let _fsyacc_reductions = lazy [| let bodyArb = arbExpr ("whileBody1", mWhileBodyArb) spWhile, _1, bodyArb, mWhileAll ) -//# 4552 "src/Compiler/pars.fsy" +//# 4720 "src/Compiler/pars.fsy" : 'gentype_whileExprCore)); -//# 12850 "pars.fs" +//# 13206 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4563 "src/Compiler/pars.fsy" +//# 4731 "src/Compiler/pars.fsy" fun mKeyword -> reportParseErrorAt mKeyword (FSComp.SR.parsWhileDoExpected()) let mWhileHeader = unionRanges mKeyword _1.Range @@ -12863,15 +13219,15 @@ let _fsyacc_reductions = lazy [| let bodyArb = arbExpr ("whileBody2", _1.Range.EndRange) spWhile, _1, bodyArb, mWhileAll ) -//# 4563 "src/Compiler/pars.fsy" +//# 4731 "src/Compiler/pars.fsy" : 'gentype_whileExprCore)); -//# 12868 "pars.fs" +//# 13224 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4573 "src/Compiler/pars.fsy" +//# 4741 "src/Compiler/pars.fsy" fun mKeyword -> if not _1 then reportParseErrorAt mKeyword (FSComp.SR.parsUnexpectedEndOfFileWhile ()) let spWhile = DebugPointAtWhile.Yes mKeyword @@ -12880,15 +13236,15 @@ let _fsyacc_reductions = lazy [| spWhile, expr1, expr2, mKeyword ) -//# 4573 "src/Compiler/pars.fsy" +//# 4741 "src/Compiler/pars.fsy" : 'gentype_whileExprCore)); -//# 12885 "pars.fs" +//# 13241 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_doneDeclEnd in Microsoft.FSharp.Core.Operators.box ( ( -//# 4582 "src/Compiler/pars.fsy" +//# 4750 "src/Compiler/pars.fsy" let mWhileBodyArb = rhs parseState 1 fun mKeyword -> @@ -12899,150 +13255,169 @@ let _fsyacc_reductions = lazy [| spWhile, expr1, expr2, mWhileAll ) -//# 4582 "src/Compiler/pars.fsy" +//# 4750 "src/Compiler/pars.fsy" : 'gentype_whileExprCore)); -//# 12904 "pars.fs" +//# 13260 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 4594 "src/Compiler/pars.fsy" +//# 4762 "src/Compiler/pars.fsy" let m = rhs parseState 1 SynExpr.Ident(Ident(_1, m)) ) -//# 4594 "src/Compiler/pars.fsy" +//# 4762 "src/Compiler/pars.fsy" : 'gentype_dynamicArg)); -//# 12916 "pars.fs" +//# 13272 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 4598 "src/Compiler/pars.fsy" +//# 4766 "src/Compiler/pars.fsy" let lpr = rhs parseState 1 let rpr = rhs parseState 3 let m = unionRanges lpr rpr SynExpr.Paren(_2, lpr, Some rpr, m) ) -//# 4598 "src/Compiler/pars.fsy" +//# 4766 "src/Compiler/pars.fsy" : 'gentype_dynamicArg)); -//# 12931 "pars.fs" +//# 13287 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_withPatternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4605 "src/Compiler/pars.fsy" +//# 4773 "src/Compiler/pars.fsy" rhs parseState 1, _2 ) -//# 4605 "src/Compiler/pars.fsy" +//# 4773 "src/Compiler/pars.fsy" : 'gentype_withClauses)); -//# 12942 "pars.fs" +//# 13298 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_withPatternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4608 "src/Compiler/pars.fsy" +//# 4776 "src/Compiler/pars.fsy" rhs parseState 1, _2 ) -//# 4608 "src/Compiler/pars.fsy" +//# 4776 "src/Compiler/pars.fsy" : 'gentype_withClauses)); -//# 12953 "pars.fs" +//# 13309 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_withPatternClauses in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4611 "src/Compiler/pars.fsy" +//# 4779 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileWith()) rhs parseState 1, _2 ) -//# 4611 "src/Compiler/pars.fsy" +//# 4779 "src/Compiler/pars.fsy" : 'gentype_withClauses)); -//# 12966 "pars.fs" +//# 13322 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4615 "src/Compiler/pars.fsy" +//# 4783 "src/Compiler/pars.fsy" let mWith = rhs parseState 1 if not _2 then reportParseErrorAt mWith (FSComp.SR.parsUnexpectedEndOfFileWith ()) mWith, ([], mWith.EndRange) ) -//# 4615 "src/Compiler/pars.fsy" +//# 4783 "src/Compiler/pars.fsy" : 'gentype_withClauses)); -//# 12979 "pars.fs" +//# 13335 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_patternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4621 "src/Compiler/pars.fsy" +//# 4789 "src/Compiler/pars.fsy" _1 None ) -//# 4621 "src/Compiler/pars.fsy" +//# 4789 "src/Compiler/pars.fsy" : 'gentype_withPatternClauses)); -//# 12990 "pars.fs" +//# 13346 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_barCanBeRightBeforeNull in let _2 = parseState.GetInput(2) :?> 'gentype_patternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4624 "src/Compiler/pars.fsy" +//# 4792 "src/Compiler/pars.fsy" let mBar = rhs parseState 1 |> Some _2 mBar ) -//# 4624 "src/Compiler/pars.fsy" +//# 4792 "src/Compiler/pars.fsy" + : 'gentype_withPatternClauses)); +//# 13359 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = parseState.GetInput(2) :?> 'gentype_barCanBeRightBeforeNull in + let _3 = parseState.GetInput(3) :?> 'gentype_patternClauses in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 4796 "src/Compiler/pars.fsy" + let mBar1 = rhs parseState 1 + let mBar2 = rhs parseState 2 + reportParseErrorAt mBar2 (FSComp.SR.parsExpectingPattern ()) + let clauses, mLast = Some mBar1 |> _3 + let clauses = addEmptyMatchClause mBar1 mBar2 clauses + clauses, mLast + ) +//# 4796 "src/Compiler/pars.fsy" : 'gentype_withPatternClauses)); -//# 13002 "pars.fs" +//# 13376 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_barCanBeRightBeforeNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 4628 "src/Compiler/pars.fsy" +//# 4804 "src/Compiler/pars.fsy" // silent recovery let mLast = rhs parseState 1 [], mLast ) -//# 4628 "src/Compiler/pars.fsy" +//# 4804 "src/Compiler/pars.fsy" : 'gentype_withPatternClauses)); -//# 13014 "pars.fs" +//# 13389 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4633 "src/Compiler/pars.fsy" +//# 4809 "src/Compiler/pars.fsy" // silent recovery let mLast = rhs parseState 1 [], mLast ) -//# 4633 "src/Compiler/pars.fsy" +//# 4809 "src/Compiler/pars.fsy" : 'gentype_withPatternClauses)); -//# 13026 "pars.fs" +//# 13401 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _2 = parseState.GetInput(2) :?> 'gentype_patternGuard in Microsoft.FSharp.Core.Operators.box ( ( -//# 4640 "src/Compiler/pars.fsy" +//# 4816 "src/Compiler/pars.fsy" _1, _2 ) -//# 4640 "src/Compiler/pars.fsy" +//# 4816 "src/Compiler/pars.fsy" : 'gentype_patternAndGuard)); -//# 13038 "pars.fs" +//# 13413 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_patternAndGuard in let _2 = parseState.GetInput(2) :?> range * SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4644 "src/Compiler/pars.fsy" +//# 4820 "src/Compiler/pars.fsy" let pat, guard = _1 let mArrow, resultExpr = _2 let mLast = resultExpr.Range @@ -13050,17 +13425,18 @@ let _fsyacc_reductions = lazy [| fun mBar -> [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], mLast ) -//# 4644 "src/Compiler/pars.fsy" +//# 4820 "src/Compiler/pars.fsy" : 'gentype_patternClauses)); -//# 13055 "pars.fs" +//# 13430 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_patternAndGuard in let _2 = parseState.GetInput(2) :?> range * SynExpr in + let _3 = parseState.GetInput(3) :?> 'gentype_barCanBeRightBeforeNull in let _4 = parseState.GetInput(4) :?> 'gentype_patternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4652 "src/Compiler/pars.fsy" +//# 4828 "src/Compiler/pars.fsy" let pat, guard = _1 let mArrow, resultExpr = _2 let mNextBar = rhs parseState 3 |> Some @@ -13069,16 +13445,41 @@ let _fsyacc_reductions = lazy [| fun mBar -> (SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar }) :: clauses), mLast ) -//# 4652 "src/Compiler/pars.fsy" +//# 4828 "src/Compiler/pars.fsy" : 'gentype_patternClauses)); -//# 13074 "pars.fs" +//# 13450 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_patternAndGuard in + let _2 = parseState.GetInput(2) :?> range * SynExpr in + let _4 = parseState.GetInput(4) :?> 'gentype_barCanBeRightBeforeNull in + let _5 = parseState.GetInput(5) :?> 'gentype_patternClauses in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 4837 "src/Compiler/pars.fsy" + let pat, guard = _1 + let mArrow, resultExpr = _2 + let mBar1 = rhs parseState 3 + let mBar2 = rhs parseState 4 + reportParseErrorAt mBar2 (FSComp.SR.parsExpectingPattern ()) + let clauses, mLast = Some mBar1 |> _5 + let clauses = addEmptyMatchClause mBar1 mBar2 clauses + fun mBar -> + let m = unionRanges resultExpr.Range pat.Range + let trivia = { ArrowRange = Some mArrow; BarRange = mBar } + SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, trivia) :: clauses, mLast + ) +//# 4837 "src/Compiler/pars.fsy" + : 'gentype_patternClauses)); +//# 13474 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_patternAndGuard in + let _3 = parseState.GetInput(3) :?> 'gentype_barCanBeRightBeforeNull in let _4 = parseState.GetInput(4) :?> 'gentype_patternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 4661 "src/Compiler/pars.fsy" +//# 4851 "src/Compiler/pars.fsy" let pat, guard = _1 let mNextBar = rhs parseState 3 |> Some let clauses, mLast = _4 mNextBar @@ -13087,17 +13488,18 @@ let _fsyacc_reductions = lazy [| fun _mBar -> (SynMatchClause(pat, guard, arbExpr ("patternClauses1", m.EndRange), m, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero) :: clauses), mLast ) -//# 4661 "src/Compiler/pars.fsy" +//# 4851 "src/Compiler/pars.fsy" : 'gentype_patternClauses)); -//# 13092 "pars.fs" +//# 13493 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_patternAndGuard in let _2 = parseState.GetInput(2) :?> range * SynExpr in + let _3 = parseState.GetInput(3) :?> 'gentype_barCanBeRightBeforeNull in let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4670 "src/Compiler/pars.fsy" +//# 4860 "src/Compiler/pars.fsy" let pat, guard = _1 let mArrow, resultExpr = _2 let mLast = rhs parseState 3 @@ -13105,9 +13507,9 @@ let _fsyacc_reductions = lazy [| fun mBar -> [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], mLast ) -//# 4670 "src/Compiler/pars.fsy" +//# 4860 "src/Compiler/pars.fsy" : 'gentype_patternClauses)); -//# 13110 "pars.fs" +//# 13512 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_patternAndGuard in let _2 = parseState.GetInput(2) :?> range * SynExpr in @@ -13115,73 +13517,73 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4678 "src/Compiler/pars.fsy" +//# 4868 "src/Compiler/pars.fsy" let pat, guard = _1 let mArrow, resultExpr = _2 let m = unionRanges resultExpr.Range pat.Range fun mBar -> [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], m ) -//# 4678 "src/Compiler/pars.fsy" +//# 4868 "src/Compiler/pars.fsy" : 'gentype_patternClauses)); -//# 13127 "pars.fs" +//# 13529 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_patternAndGuard in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4685 "src/Compiler/pars.fsy" +//# 4875 "src/Compiler/pars.fsy" let pat, guard = _1 let patm = pat.Range let m = guard |> Option.map (fun e -> unionRanges patm e.Range) |> Option.defaultValue patm fun mBar -> [SynMatchClause(pat, guard, arbExpr ("patternClauses2", m.EndRange), m, DebugPointAtTarget.Yes, { ArrowRange = None; BarRange = mBar })], m ) -//# 4685 "src/Compiler/pars.fsy" +//# 4875 "src/Compiler/pars.fsy" : 'gentype_patternClauses)); -//# 13143 "pars.fs" +//# 13545 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4693 "src/Compiler/pars.fsy" +//# 4883 "src/Compiler/pars.fsy" Some _2 ) -//# 4693 "src/Compiler/pars.fsy" +//# 4883 "src/Compiler/pars.fsy" : 'gentype_patternGuard)); -//# 13154 "pars.fs" +//# 13556 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4696 "src/Compiler/pars.fsy" +//# 4886 "src/Compiler/pars.fsy" None ) -//# 4696 "src/Compiler/pars.fsy" +//# 4886 "src/Compiler/pars.fsy" : 'gentype_patternGuard)); -//# 13164 "pars.fs" +//# 13566 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExprBlockR in Microsoft.FSharp.Core.Operators.box ( ( -//# 4700 "src/Compiler/pars.fsy" +//# 4890 "src/Compiler/pars.fsy" let mArrow = rhs parseState 1 let expr = _2 mArrow mArrow, expr ) -//# 4700 "src/Compiler/pars.fsy" +//# 4890 "src/Compiler/pars.fsy" : range * SynExpr)); -//# 13177 "pars.fs" +//# 13579 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_ifExprThen in let _2 = parseState.GetInput(2) :?> 'gentype_ifExprElifs in Microsoft.FSharp.Core.Operators.box ( ( -//# 4706 "src/Compiler/pars.fsy" +//# 4896 "src/Compiler/pars.fsy" let exprThen, mThen = _1 let mElse, elseExpr = _2 (fun exprGuard mIf isElif -> @@ -13192,96 +13594,96 @@ let _fsyacc_reductions = lazy [| let trivia = { IfKeyword = mIf; IsElif = isElif; ThenKeyword = mThen; ElseKeyword = mElse; IfToThenRange = mIfToThen } SynExpr.IfThenElse(exprGuard, exprThen, elseExpr, spIfToThen, false, mIfToEndOfLastBranch, trivia)) ) -//# 4706 "src/Compiler/pars.fsy" +//# 4896 "src/Compiler/pars.fsy" : 'gentype_ifExprCases)); -//# 13197 "pars.fs" +//# 13599 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4718 "src/Compiler/pars.fsy" +//# 4908 "src/Compiler/pars.fsy" _2, rhs parseState 1 ) -//# 4718 "src/Compiler/pars.fsy" +//# 4908 "src/Compiler/pars.fsy" : 'gentype_ifExprThen)); -//# 13208 "pars.fs" +//# 13610 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4721 "src/Compiler/pars.fsy" +//# 4911 "src/Compiler/pars.fsy" let mThen = rhs parseState 1 arbExpr ("ifThen1", mThen.EndRange), mThen ) -//# 4721 "src/Compiler/pars.fsy" +//# 4911 "src/Compiler/pars.fsy" : 'gentype_ifExprThen)); -//# 13220 "pars.fs" +//# 13622 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4725 "src/Compiler/pars.fsy" +//# 4915 "src/Compiler/pars.fsy" _2, rhs parseState 1 ) -//# 4725 "src/Compiler/pars.fsy" +//# 4915 "src/Compiler/pars.fsy" : 'gentype_ifExprThen)); -//# 13231 "pars.fs" +//# 13633 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4728 "src/Compiler/pars.fsy" +//# 4918 "src/Compiler/pars.fsy" let mThen = rhs parseState 1 arbExpr ("ifThen2", mThen.EndRange), mThen ) -//# 4728 "src/Compiler/pars.fsy" +//# 4918 "src/Compiler/pars.fsy" : 'gentype_ifExprThen)); -//# 13243 "pars.fs" +//# 13645 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4733 "src/Compiler/pars.fsy" +//# 4923 "src/Compiler/pars.fsy" None, None ) -//# 4733 "src/Compiler/pars.fsy" +//# 4923 "src/Compiler/pars.fsy" : 'gentype_ifExprElifs)); -//# 13253 "pars.fs" +//# 13655 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4736 "src/Compiler/pars.fsy" +//# 4926 "src/Compiler/pars.fsy" let mElse = rhs parseState 1 Some mElse, Some _2 ) -//# 4736 "src/Compiler/pars.fsy" +//# 4926 "src/Compiler/pars.fsy" : 'gentype_ifExprElifs)); -//# 13265 "pars.fs" +//# 13667 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4740 "src/Compiler/pars.fsy" +//# 4930 "src/Compiler/pars.fsy" let mElse = rhs parseState 1 Some mElse, Some _2 ) -//# 4740 "src/Compiler/pars.fsy" +//# 4930 "src/Compiler/pars.fsy" : 'gentype_ifExprElifs)); -//# 13277 "pars.fs" +//# 13679 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ifExprCases in Microsoft.FSharp.Core.Operators.box ( ( -//# 4744 "src/Compiler/pars.fsy" +//# 4934 "src/Compiler/pars.fsy" let mElif = rhs parseState 1 // verify if `ELIF` is not a merged token let length = mElif.EndColumn - mElif.StartColumn @@ -13292,57 +13694,57 @@ let _fsyacc_reductions = lazy [| else None, Some(_3 _2 mElif true) ) -//# 4744 "src/Compiler/pars.fsy" +//# 4934 "src/Compiler/pars.fsy" : 'gentype_ifExprElifs)); -//# 13297 "pars.fs" +//# 13699 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4755 "src/Compiler/pars.fsy" +//# 4945 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileElif()) None, Some(exprFromParseError _2) ) -//# 4755 "src/Compiler/pars.fsy" +//# 4945 "src/Compiler/pars.fsy" : 'gentype_ifExprElifs)); -//# 13310 "pars.fs" +//# 13712 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr list * range list in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4760 "src/Compiler/pars.fsy" +//# 4950 "src/Compiler/pars.fsy" let exprs, commas = _1 _3 :: exprs, (rhs parseState 2 :: commas) ) -//# 4760 "src/Compiler/pars.fsy" +//# 4950 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13323 "pars.fs" +//# 13725 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr list * range list in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4764 "src/Compiler/pars.fsy" +//# 4954 "src/Compiler/pars.fsy" let commaRange = rhs parseState 2 if not _3 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedExpressionAfterToken ()) let exprs, commas = _1 arbExpr ("tupleExpr1", commaRange.EndRange) :: exprs, commaRange :: commas ) -//# 4764 "src/Compiler/pars.fsy" +//# 4954 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13338 "pars.fs" +//# 13740 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr list * range list in let _4 = parseState.GetInput(4) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4770 "src/Compiler/pars.fsy" +//# 4960 "src/Compiler/pars.fsy" let exprs, commas = _1 let mComma1 = rhs parseState 2 let mComma2 = rhs parseState 3 @@ -13350,16 +13752,16 @@ let _fsyacc_reductions = lazy [| let expr = arbExpr ("tupleExpr2", mComma1.EndRange) _4 :: expr :: exprs, (mComma2 :: mComma1 :: commas) ) -//# 4770 "src/Compiler/pars.fsy" +//# 4960 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13355 "pars.fs" +//# 13757 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr list * range list in let _4 = parseState.GetInput(4) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4778 "src/Compiler/pars.fsy" +//# 4968 "src/Compiler/pars.fsy" let exprs, commas = _1 let mComma1 = rhs parseState 2 let mComma2 = rhs parseState 3 @@ -13369,42 +13771,42 @@ let _fsyacc_reductions = lazy [| let expr2 = arbExpr ("tupleExpr4", mComma2.EndRange) expr2 :: expr1 :: exprs, mComma2 :: mComma1 :: commas ) -//# 4778 "src/Compiler/pars.fsy" +//# 4968 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13374 "pars.fs" +//# 13776 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4788 "src/Compiler/pars.fsy" +//# 4978 "src/Compiler/pars.fsy" let commaRange = rhs parseState 2 if not _3 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedExpressionAfterToken ()) [arbExpr ("tupleExpr5", commaRange.EndRange); _1], [commaRange] ) -//# 4788 "src/Compiler/pars.fsy" +//# 4978 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13388 "pars.fs" +//# 13790 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4793 "src/Compiler/pars.fsy" +//# 4983 "src/Compiler/pars.fsy" [_3; _1], [rhs parseState 2] ) -//# 4793 "src/Compiler/pars.fsy" +//# 4983 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13400 "pars.fs" +//# 13802 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _4 = parseState.GetInput(4) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4796 "src/Compiler/pars.fsy" +//# 4986 "src/Compiler/pars.fsy" let mComma1 = rhs parseState 2 let mComma2 = rhs parseState 3 reportParseErrorAt mComma2 (FSComp.SR.parsExpectingExpression ()) @@ -13413,111 +13815,111 @@ let _fsyacc_reductions = lazy [| let expr2 = arbExpr ("tupleExpr7", mComma2.EndRange) [expr2; expr1; _1], [mComma2; mComma1] ) -//# 4796 "src/Compiler/pars.fsy" +//# 4986 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13418 "pars.fs" +//# 13820 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _4 = parseState.GetInput(4) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4805 "src/Compiler/pars.fsy" +//# 4995 "src/Compiler/pars.fsy" let mComma1 = rhs parseState 2 let mComma2 = rhs parseState 3 reportParseErrorAt mComma2 (FSComp.SR.parsExpectingExpression ()) let expr = arbExpr ("tupleExpr8", mComma1.EndRange) [_4; expr; _1], [mComma2; mComma1] ) -//# 4805 "src/Compiler/pars.fsy" +//# 4995 "src/Compiler/pars.fsy" : SynExpr list * range list)); -//# 13434 "pars.fs" +//# 13836 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4813 "src/Compiler/pars.fsy" +//# 5003 "src/Compiler/pars.fsy" if _1 <> "^" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidPrefixOperator()) let m = (rhs2 parseState 1 2) SynExpr.IndexFromEnd(_2, m) ) -//# 4813 "src/Compiler/pars.fsy" +//# 5003 "src/Compiler/pars.fsy" : SynExpr)); -//# 13448 "pars.fs" +//# 13850 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4818 "src/Compiler/pars.fsy" +//# 5008 "src/Compiler/pars.fsy" mkSynPrefix (rhs parseState 1) (unionRanges (rhs parseState 1) _2.Range) "~-" _2 ) -//# 4818 "src/Compiler/pars.fsy" +//# 5008 "src/Compiler/pars.fsy" : SynExpr)); -//# 13459 "pars.fs" +//# 13861 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4821 "src/Compiler/pars.fsy" +//# 5011 "src/Compiler/pars.fsy" if not (IsValidPrefixOperatorUse _1) then reportParseErrorAt _2.Range (FSComp.SR.parsInvalidPrefixOperator()) mkSynPrefix (rhs parseState 1) (unionRanges (rhs parseState 1) _2.Range) ("~" + (_1)) _2 ) -//# 4821 "src/Compiler/pars.fsy" +//# 5011 "src/Compiler/pars.fsy" : SynExpr)); -//# 13472 "pars.fs" +//# 13874 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4825 "src/Compiler/pars.fsy" +//# 5015 "src/Compiler/pars.fsy" if not (IsValidPrefixOperatorUse _1) then reportParseErrorAt _2.Range (FSComp.SR.parsInvalidPrefixOperator()) mkSynPrefix (rhs parseState 1) (unionRanges (rhs parseState 1) _2.Range) ("~" + (_1)) _2 ) -//# 4825 "src/Compiler/pars.fsy" +//# 5015 "src/Compiler/pars.fsy" : SynExpr)); -//# 13485 "pars.fs" +//# 13887 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4829 "src/Compiler/pars.fsy" +//# 5019 "src/Compiler/pars.fsy" if not (IsValidPrefixOperatorUse _1) then reportParseErrorAt _2.Range (FSComp.SR.parsInvalidPrefixOperator()) mkSynPrefix (rhs parseState 1) (unionRanges (rhs parseState 1) _2.Range) ("~" + (_1)) _2 ) -//# 4829 "src/Compiler/pars.fsy" +//# 5019 "src/Compiler/pars.fsy" : SynExpr)); -//# 13498 "pars.fs" +//# 13900 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4833 "src/Compiler/pars.fsy" +//# 5023 "src/Compiler/pars.fsy" SynExpr.AddressOf(true, _2, rhs parseState 1, unionRanges (rhs parseState 1) _2.Range) ) -//# 4833 "src/Compiler/pars.fsy" +//# 5023 "src/Compiler/pars.fsy" : SynExpr)); -//# 13509 "pars.fs" +//# 13911 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4836 "src/Compiler/pars.fsy" +//# 5026 "src/Compiler/pars.fsy" SynExpr.AddressOf(false, _2, rhs parseState 1, unionRanges (rhs parseState 1) _2.Range) ) -//# 4836 "src/Compiler/pars.fsy" +//# 5026 "src/Compiler/pars.fsy" : SynExpr)); -//# 13520 "pars.fs" +//# 13922 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in @@ -13526,14 +13928,14 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4839 "src/Compiler/pars.fsy" +//# 5029 "src/Compiler/pars.fsy" errorR (Error (FSComp.SR.parsNewExprMemberAccess (), rhs parseState 6)) let newExpr = SynExpr.New(false, _2, _4, unionRanges (rhs parseState 1) _4.Range) _6 newExpr (lhs parseState) (rhs parseState 5) ) -//# 4839 "src/Compiler/pars.fsy" +//# 5029 "src/Compiler/pars.fsy" : SynExpr)); -//# 13536 "pars.fs" +//# 13938 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in @@ -13541,125 +13943,125 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 4844 "src/Compiler/pars.fsy" +//# 5034 "src/Compiler/pars.fsy" SynExpr.New(false, _2, _4, unionRanges (rhs parseState 1) _4.Range) ) -//# 4844 "src/Compiler/pars.fsy" +//# 5034 "src/Compiler/pars.fsy" : SynExpr)); -//# 13549 "pars.fs" +//# 13951 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in Microsoft.FSharp.Core.Operators.box ( ( -//# 4847 "src/Compiler/pars.fsy" +//# 5037 "src/Compiler/pars.fsy" SynExpr.New(false, _2, arbExpr ("minusExpr", (rhs parseState 4)), unionRanges (rhs parseState 1) (_2).Range) ) -//# 4847 "src/Compiler/pars.fsy" +//# 5037 "src/Compiler/pars.fsy" : SynExpr)); -//# 13561 "pars.fs" +//# 13963 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4850 "src/Compiler/pars.fsy" +//# 5040 "src/Compiler/pars.fsy" arbExpr ("minusExpr2", (rhs parseState 1)) ) -//# 4850 "src/Compiler/pars.fsy" +//# 5040 "src/Compiler/pars.fsy" : SynExpr)); -//# 13571 "pars.fs" +//# 13973 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4853 "src/Compiler/pars.fsy" +//# 5043 "src/Compiler/pars.fsy" SynExpr.InferredUpcast(_2, unionRanges (rhs parseState 1) _2.Range) ) -//# 4853 "src/Compiler/pars.fsy" +//# 5043 "src/Compiler/pars.fsy" : SynExpr)); -//# 13582 "pars.fs" +//# 13984 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4856 "src/Compiler/pars.fsy" +//# 5046 "src/Compiler/pars.fsy" SynExpr.InferredDowncast(_2, unionRanges (rhs parseState 1) _2.Range) ) -//# 4856 "src/Compiler/pars.fsy" +//# 5046 "src/Compiler/pars.fsy" : SynExpr)); -//# 13593 "pars.fs" +//# 13995 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4859 "src/Compiler/pars.fsy" +//# 5049 "src/Compiler/pars.fsy" _1 ) -//# 4859 "src/Compiler/pars.fsy" +//# 5049 "src/Compiler/pars.fsy" : SynExpr)); -//# 13604 "pars.fs" +//# 14006 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4863 "src/Compiler/pars.fsy" +//# 5053 "src/Compiler/pars.fsy" SynExpr.App(ExprAtomicFlag.NonAtomic, false, _1, _2, unionRanges _1.Range _2.Range) ) -//# 4863 "src/Compiler/pars.fsy" +//# 5053 "src/Compiler/pars.fsy" : SynExpr)); -//# 13616 "pars.fs" +//# 14018 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 4866 "src/Compiler/pars.fsy" +//# 5056 "src/Compiler/pars.fsy" let arg, _ = _1 arg ) -//# 4866 "src/Compiler/pars.fsy" +//# 5056 "src/Compiler/pars.fsy" : SynExpr)); -//# 13628 "pars.fs" +//# 14030 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 4871 "src/Compiler/pars.fsy" +//# 5061 "src/Compiler/pars.fsy" let arg2, hpa2 = _2 if not (IsValidPrefixOperatorUse _1) then reportParseErrorAt arg2.Range (FSComp.SR.parsInvalidPrefixOperator()) if hpa2 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsSuccessiveArgsShouldBeSpacedOrTupled()) mkSynPrefix (rhs parseState 1) (unionRanges (rhs parseState 1) arg2.Range) ("~" + (_1)) arg2 ) -//# 4871 "src/Compiler/pars.fsy" +//# 5061 "src/Compiler/pars.fsy" : SynExpr)); -//# 13643 "pars.fs" +//# 14045 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 4877 "src/Compiler/pars.fsy" +//# 5067 "src/Compiler/pars.fsy" let arg, hpa = _1 if hpa then reportParseErrorAt arg.Range (FSComp.SR.parsSuccessiveArgsShouldBeSpacedOrTupled()) arg ) -//# 4877 "src/Compiler/pars.fsy" +//# 5067 "src/Compiler/pars.fsy" : SynExpr)); -//# 13656 "pars.fs" +//# 14058 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 4883 "src/Compiler/pars.fsy" +//# 5073 "src/Compiler/pars.fsy" let mUnderscore = rhs parseState 1 let mDot = rhs parseState 2 parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.AccessorFunctionShorthand (unionRanges mUnderscore mDot ) @@ -13667,15 +14069,15 @@ let _fsyacc_reductions = lazy [| let trivia: SynExprDotLambdaTrivia = { UnderscoreRange = mUnderscore ; DotRange = mDot } SynExpr.DotLambda(expr, unionRanges mUnderscore expr.Range, trivia), false ) -//# 4883 "src/Compiler/pars.fsy" +//# 5073 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13672 "pars.fs" +//# 14074 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4892 "src/Compiler/pars.fsy" +//# 5082 "src/Compiler/pars.fsy" let mUnderscore = rhs parseState 1 let mDot = rhs parseState 2 let mWhole = unionRanges mUnderscore mDot @@ -13686,341 +14088,341 @@ let _fsyacc_reductions = lazy [| let trivia: SynExprDotLambdaTrivia = { UnderscoreRange = mUnderscore ; DotRange = mDot } SynExpr.DotLambda(expr, mWhole, trivia), false ) -//# 4892 "src/Compiler/pars.fsy" +//# 5082 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13691 "pars.fs" +//# 14093 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4905 "src/Compiler/pars.fsy" +//# 5095 "src/Compiler/pars.fsy" let mUnderscore = rhs parseState 1 if not _2 then reportParseErrorAt mUnderscore (FSComp.SR.parsUnexpectedEndOfFileExpression()) let expr = SynExpr.Ident(Ident("_", mUnderscore)) SynExpr.FromParseError(expr, mUnderscore), false ) -//# 4905 "src/Compiler/pars.fsy" +//# 5095 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13705 "pars.fs" +//# 14107 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr * bool in let _3 = parseState.GetInput(3) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 4913 "src/Compiler/pars.fsy" +//# 5103 "src/Compiler/pars.fsy" let arg1, _ = _1 let arg2, hpa = _3 SynExpr.App(ExprAtomicFlag.Atomic, false, arg1, arg2, unionRanges arg1.Range arg2.Range), hpa ) -//# 4913 "src/Compiler/pars.fsy" +//# 5103 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13719 "pars.fs" +//# 14121 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr * bool in let _3 = parseState.GetInput(3) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 4918 "src/Compiler/pars.fsy" +//# 5108 "src/Compiler/pars.fsy" let arg1, _ = _1 let arg2, _ = _3 SynExpr.App(ExprAtomicFlag.Atomic, false, arg1, arg2, unionRanges arg1.Range arg2.Range), true ) -//# 4918 "src/Compiler/pars.fsy" +//# 5108 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13733 "pars.fs" +//# 14135 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr * bool in let _3 = parseState.GetInput(3) :?> range * range option * bool * SynType list * range list * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 4923 "src/Compiler/pars.fsy" +//# 5113 "src/Compiler/pars.fsy" let arg1, _ = _1 let mLessThan, mGreaterThan, _, args, commas, mTypeArgs = _3 let mWholeExpr = unionRanges arg1.Range mTypeArgs SynExpr.TypeApp(arg1, mLessThan, args, commas, mGreaterThan, mTypeArgs, mWholeExpr), false ) -//# 4923 "src/Compiler/pars.fsy" +//# 5113 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13748 "pars.fs" +//# 14150 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 4929 "src/Compiler/pars.fsy" +//# 5119 "src/Compiler/pars.fsy" let arg2, hpa2 = _2 if not (IsValidPrefixOperatorUse _1) then reportParseErrorAt arg2.Range (FSComp.SR.parsInvalidPrefixOperator()) mkSynPrefixPrim (rhs parseState 1) (unionRanges (rhs parseState 1) arg2.Range) _1 arg2, hpa2 ) -//# 4929 "src/Compiler/pars.fsy" +//# 5119 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13762 "pars.fs" +//# 14164 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 4934 "src/Compiler/pars.fsy" +//# 5124 "src/Compiler/pars.fsy" let id = mkSynId (lhs parseState) (_2).idText let typar = SynTypar(id, TyparStaticReq.None, false) let lhsm = rhs2 parseState 1 2 SynExpr.Typar(typar, lhsm), false ) -//# 4934 "src/Compiler/pars.fsy" +//# 5124 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13776 "pars.fs" +//# 14178 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4940 "src/Compiler/pars.fsy" +//# 5130 "src/Compiler/pars.fsy" arbExpr ("unfinished identifier", rhs parseState 1), false ) -//# 4940 "src/Compiler/pars.fsy" +//# 5130 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13786 "pars.fs" +//# 14188 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr * bool in let _3 = parseState.GetInput(3) :?> 'gentype_atomicExprQualification in Microsoft.FSharp.Core.Operators.box ( ( -//# 4943 "src/Compiler/pars.fsy" +//# 5133 "src/Compiler/pars.fsy" let arg1, hpa1 = _1 _3 arg1 (lhs parseState) (rhs parseState 2), hpa1 ) -//# 4943 "src/Compiler/pars.fsy" +//# 5133 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13799 "pars.fs" +//# 14201 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_atomicExprQualification in Microsoft.FSharp.Core.Operators.box ( ( -//# 4947 "src/Compiler/pars.fsy" +//# 5137 "src/Compiler/pars.fsy" let arg1 = SynExpr.Ident(ident("base", rhs parseState 1)) _3 arg1 (lhs parseState) (rhs parseState 2), false ) -//# 4947 "src/Compiler/pars.fsy" +//# 5137 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13811 "pars.fs" +//# 14213 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_nameop in Microsoft.FSharp.Core.Operators.box ( ( -//# 4951 "src/Compiler/pars.fsy" +//# 5141 "src/Compiler/pars.fsy" let (SynIdent(ident, trivia)) = _2 SynExpr.LongIdent(true, SynLongIdent([ident], [], [trivia]), None, rhs parseState 2), false ) -//# 4951 "src/Compiler/pars.fsy" +//# 5141 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13823 "pars.fs" +//# 14225 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr * bool in let _3 = parseState.GetInput(3) :?> 'gentype_dynamicArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 4955 "src/Compiler/pars.fsy" +//# 5145 "src/Compiler/pars.fsy" let m = rhs2 parseState 1 3 let mQmark = rhs parseState 2 let arg1, hpa1 = _1 SynExpr.Dynamic(arg1, mQmark, _3, m), hpa1 ) -//# 4955 "src/Compiler/pars.fsy" +//# 5145 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13838 "pars.fs" +//# 14240 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4961 "src/Compiler/pars.fsy" +//# 5151 "src/Compiler/pars.fsy" let m = rhs parseState 1 let ident = ident(MangledGlobalName, m) SynExpr.LongIdent(false, SynLongIdent([ident], [], [Some(IdentTrivia.OriginalNotation "global")]), None, m), false ) -//# 4961 "src/Compiler/pars.fsy" +//# 5151 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13850 "pars.fs" +//# 14252 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_identExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4966 "src/Compiler/pars.fsy" +//# 5156 "src/Compiler/pars.fsy" _1, false ) -//# 4966 "src/Compiler/pars.fsy" +//# 5156 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13861 "pars.fs" +//# 14263 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_listExprElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 4969 "src/Compiler/pars.fsy" +//# 5159 "src/Compiler/pars.fsy" _2 (lhs parseState), false ) -//# 4969 "src/Compiler/pars.fsy" +//# 5159 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13872 "pars.fs" +//# 14274 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_listExprElements in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4972 "src/Compiler/pars.fsy" +//# 5162 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracket()) exprFromParseError (_2 (rhs2 parseState 1 2)), false ) -//# 4972 "src/Compiler/pars.fsy" +//# 5162 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13885 "pars.fs" +//# 14287 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 4976 "src/Compiler/pars.fsy" +//# 5166 "src/Compiler/pars.fsy" // silent recovery SynExpr.ArrayOrList(false, [ ], lhs parseState), false ) -//# 4976 "src/Compiler/pars.fsy" +//# 5166 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13896 "pars.fs" +//# 14298 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4980 "src/Compiler/pars.fsy" +//# 5170 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracket()) // silent recovery exprFromParseError (SynExpr.ArrayOrList(false, [ ], rhs parseState 1)), false ) -//# 4980 "src/Compiler/pars.fsy" +//# 5170 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13909 "pars.fs" +//# 14311 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynExpr list * range list in let _4 = parseState.GetInput(4) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 4985 "src/Compiler/pars.fsy" +//# 5175 "src/Compiler/pars.fsy" let exprs, commas = _3 let m = rhs2 parseState 1 4 SynExpr.Tuple(true, List.rev exprs, List.rev commas, m), false ) -//# 4985 "src/Compiler/pars.fsy" +//# 5175 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13923 "pars.fs" +//# 14325 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynExpr list * range list in let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 4990 "src/Compiler/pars.fsy" +//# 5180 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedBracket()) let exprs, commas = _3 let m = (rhs parseState 1, exprs) ||> unionRangeWithListBy (fun e -> e.Range) SynExpr.Tuple(true, List.rev exprs, List.rev commas, m), false ) -//# 4990 "src/Compiler/pars.fsy" +//# 5180 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13938 "pars.fs" +//# 14340 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 4996 "src/Compiler/pars.fsy" +//# 5186 "src/Compiler/pars.fsy" _1, false ) -//# 4996 "src/Compiler/pars.fsy" +//# 5186 "src/Compiler/pars.fsy" : SynExpr * bool)); -//# 13949 "pars.fs" +//# 14351 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_identOrOp in Microsoft.FSharp.Core.Operators.box ( ( -//# 5000 "src/Compiler/pars.fsy" +//# 5190 "src/Compiler/pars.fsy" let idm = rhs parseState 1 (fun e mLhs mDot -> mkSynDot mDot mLhs e _1) ) -//# 5000 "src/Compiler/pars.fsy" +//# 5190 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 13961 "pars.fs" +//# 14363 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5004 "src/Compiler/pars.fsy" +//# 5194 "src/Compiler/pars.fsy" (fun e mLhs mDot -> reportParseErrorAt (rhs parseState 3) (FSComp.SR.nrGlobalUsedOnlyAsFirstName()) let fixedLhsm = withEnd mDot.End mLhs // previous mLhs is wrong after 'recover' mkSynDotMissing mDot fixedLhsm e) ) -//# 5004 "src/Compiler/pars.fsy" +//# 5194 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 13974 "pars.fs" +//# 14376 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5010 "src/Compiler/pars.fsy" +//# 5200 "src/Compiler/pars.fsy" (fun e mLhs mDot -> reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot()) let fixedLhsm = withEnd mDot.End mLhs // previous mLhs is wrong after 'recover' mkSynDotMissing mDot fixedLhsm e) ) -//# 5010 "src/Compiler/pars.fsy" +//# 5200 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 13987 "pars.fs" +//# 14389 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5015 "src/Compiler/pars.fsy" +//# 5205 "src/Compiler/pars.fsy" (fun e mLhs mDot -> reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot()) let fixedLhsm = withEnd mDot.End mLhs // previous mLhs is wrong after 'recover' // Include 'e' in the returned expression but throw it away mkSynDotMissing mDot fixedLhsm e) ) -//# 5015 "src/Compiler/pars.fsy" +//# 5205 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 14002 "pars.fs" +//# 14404 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_rparen in let _5 = parseState.GetInput(5) :?> int32 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 5021 "src/Compiler/pars.fsy" +//# 5211 "src/Compiler/pars.fsy" (fun e mLhs mDot -> if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyError(lhs parseState) SynExpr.LibraryOnlyUnionCaseFieldGet(e, mkSynCaseName mLhs opNameCons, (fst _5), mLhs)) ) -//# 5021 "src/Compiler/pars.fsy" +//# 5211 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 14016 "pars.fs" +//# 14418 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 5026 "src/Compiler/pars.fsy" +//# 5216 "src/Compiler/pars.fsy" let lpr = rhs parseState 1 let rpr = rhs parseState 3 (fun e mLhs mDot -> @@ -14036,219 +14438,219 @@ let _fsyacc_reductions = lazy [| mlCompatWarning (FSComp.SR.parsParenFormIsForML()) (lhs parseState) mkSynDotParenGet mLhs mDot e _2) ) -//# 5026 "src/Compiler/pars.fsy" +//# 5216 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 14041 "pars.fs" +//# 14443 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5042 "src/Compiler/pars.fsy" +//# 5232 "src/Compiler/pars.fsy" (fun e mLhs mDot -> mkSynDotBrackGet mLhs mDot e _2) ) -//# 5042 "src/Compiler/pars.fsy" +//# 5232 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 14052 "pars.fs" +//# 14454 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5045 "src/Compiler/pars.fsy" +//# 5235 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracket()) (fun e mLhs mDot -> exprFromParseError (mkSynDotBrackGet mLhs mDot e _2)) ) -//# 5045 "src/Compiler/pars.fsy" +//# 5235 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 14065 "pars.fs" +//# 14467 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5049 "src/Compiler/pars.fsy" +//# 5239 "src/Compiler/pars.fsy" let mArg = rhs2 parseState 1 3 (fun e mLhs mDot -> mkSynDotBrackGet mLhs mDot e (arbExpr ("indexerExpr1", mArg))) ) -//# 5049 "src/Compiler/pars.fsy" +//# 5239 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 14076 "pars.fs" +//# 14478 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5053 "src/Compiler/pars.fsy" +//# 5243 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracket()) let mArg = (rhs parseState 1).EndRange (fun e mLhs mDot -> exprFromParseError (mkSynDotBrackGet mLhs mDot e (arbExpr ("indexerExpr2", mArg)))) ) -//# 5053 "src/Compiler/pars.fsy" +//# 5243 "src/Compiler/pars.fsy" : 'gentype_atomicExprQualification)); -//# 14089 "pars.fs" +//# 14491 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_constant in Microsoft.FSharp.Core.Operators.box ( ( -//# 5060 "src/Compiler/pars.fsy" +//# 5250 "src/Compiler/pars.fsy" SynExpr.Const(fst _1, snd _1) ) -//# 5060 "src/Compiler/pars.fsy" +//# 5250 "src/Compiler/pars.fsy" : SynExpr)); -//# 14100 "pars.fs" +//# 14502 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5063 "src/Compiler/pars.fsy" +//# 5253 "src/Compiler/pars.fsy" _1 ) -//# 5063 "src/Compiler/pars.fsy" +//# 5253 "src/Compiler/pars.fsy" : SynExpr)); -//# 14111 "pars.fs" +//# 14513 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_braceExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5066 "src/Compiler/pars.fsy" +//# 5256 "src/Compiler/pars.fsy" _1 ) -//# 5066 "src/Compiler/pars.fsy" +//# 5256 "src/Compiler/pars.fsy" : SynExpr)); -//# 14122 "pars.fs" +//# 14524 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_braceBarExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5069 "src/Compiler/pars.fsy" +//# 5259 "src/Compiler/pars.fsy" _1 ) -//# 5069 "src/Compiler/pars.fsy" +//# 5259 "src/Compiler/pars.fsy" : SynExpr)); -//# 14133 "pars.fs" +//# 14535 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interpolatedString in Microsoft.FSharp.Core.Operators.box ( ( -//# 5072 "src/Compiler/pars.fsy" +//# 5262 "src/Compiler/pars.fsy" let parts, synStringKind = _1 SynExpr.InterpolatedString(parts, synStringKind, rhs parseState 1) ) -//# 5072 "src/Compiler/pars.fsy" +//# 5262 "src/Compiler/pars.fsy" : SynExpr)); -//# 14145 "pars.fs" +//# 14547 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5076 "src/Compiler/pars.fsy" +//# 5266 "src/Compiler/pars.fsy" SynExpr.Null(lhs parseState) ) -//# 5076 "src/Compiler/pars.fsy" +//# 5266 "src/Compiler/pars.fsy" : SynExpr)); -//# 14155 "pars.fs" +//# 14557 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5079 "src/Compiler/pars.fsy" +//# 5269 "src/Compiler/pars.fsy" SynExpr.Const(SynConst.Bool false, lhs parseState) ) -//# 5079 "src/Compiler/pars.fsy" +//# 5269 "src/Compiler/pars.fsy" : SynExpr)); -//# 14165 "pars.fs" +//# 14567 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5082 "src/Compiler/pars.fsy" +//# 5272 "src/Compiler/pars.fsy" SynExpr.Const(SynConst.Bool true, lhs parseState) ) -//# 5082 "src/Compiler/pars.fsy" +//# 5272 "src/Compiler/pars.fsy" : SynExpr)); -//# 14175 "pars.fs" +//# 14577 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_quoteExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5085 "src/Compiler/pars.fsy" +//# 5275 "src/Compiler/pars.fsy" _1 ) -//# 5085 "src/Compiler/pars.fsy" +//# 5275 "src/Compiler/pars.fsy" : SynExpr)); -//# 14186 "pars.fs" +//# 14588 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_arrayExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5088 "src/Compiler/pars.fsy" +//# 5278 "src/Compiler/pars.fsy" _1 ) -//# 5088 "src/Compiler/pars.fsy" +//# 5278 "src/Compiler/pars.fsy" : SynExpr)); -//# 14197 "pars.fs" +//# 14599 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_beginEndExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5091 "src/Compiler/pars.fsy" +//# 5281 "src/Compiler/pars.fsy" _1 ) -//# 5091 "src/Compiler/pars.fsy" +//# 5281 "src/Compiler/pars.fsy" : SynExpr)); -//# 14208 "pars.fs" +//# 14610 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5095 "src/Compiler/pars.fsy" +//# 5285 "src/Compiler/pars.fsy" SynExpr.Paren(_2, rhs parseState 1, Some(rhs parseState 3), rhs2 parseState 1 3) ) -//# 5095 "src/Compiler/pars.fsy" +//# 5285 "src/Compiler/pars.fsy" : 'gentype_beginEndExpr)); -//# 14219 "pars.fs" +//# 14621 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5098 "src/Compiler/pars.fsy" +//# 5288 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBegin()); exprFromParseError _2 ) -//# 5098 "src/Compiler/pars.fsy" +//# 5288 "src/Compiler/pars.fsy" : 'gentype_beginEndExpr)); -//# 14231 "pars.fs" +//# 14633 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5101 "src/Compiler/pars.fsy" +//# 5291 "src/Compiler/pars.fsy" (* silent recovery *) arbExpr ("beginEndExpr", (lhs parseState)) ) -//# 5101 "src/Compiler/pars.fsy" +//# 5291 "src/Compiler/pars.fsy" : 'gentype_beginEndExpr)); -//# 14241 "pars.fs" +//# 14643 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5104 "src/Compiler/pars.fsy" +//# 5294 "src/Compiler/pars.fsy" mkSynUnit (lhs parseState) ) -//# 5104 "src/Compiler/pars.fsy" +//# 5294 "src/Compiler/pars.fsy" : 'gentype_beginEndExpr)); -//# 14251 "pars.fs" +//# 14653 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * bool in let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in @@ -14256,13 +14658,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5108 "src/Compiler/pars.fsy" +//# 5298 "src/Compiler/pars.fsy" if _1 <> _3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsMismatchedQuote(fst _1)) (SynExpr.Quote(mkSynIdGet (lhs parseState) (CompileOpName (fst _1)), snd _1, _2, false, lhs parseState)) ) -//# 5108 "src/Compiler/pars.fsy" +//# 5298 "src/Compiler/pars.fsy" : 'gentype_quoteExpr)); -//# 14265 "pars.fs" +//# 14667 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * bool in let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExpr in @@ -14270,203 +14672,203 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5112 "src/Compiler/pars.fsy" +//# 5302 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatched(fst _1)) let mExpr = rhs2 parseState 1 2 exprFromParseError (SynExpr.Quote(mkSynIdGet (lhs parseState) (CompileOpName (fst _1)), snd _1, _2, false, mExpr)) ) -//# 5112 "src/Compiler/pars.fsy" +//# 5302 "src/Compiler/pars.fsy" : 'gentype_quoteExpr)); -//# 14280 "pars.fs" +//# 14682 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * bool in let _3 = parseState.GetInput(3) :?> string * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 5117 "src/Compiler/pars.fsy" +//# 5307 "src/Compiler/pars.fsy" (* silent recovery *) SynExpr.Quote(mkSynIdGet (lhs parseState) (CompileOpName (fst _1)), snd _1, arbExpr ("quoteExpr", (rhs parseState 2)), false, lhs parseState) ) -//# 5117 "src/Compiler/pars.fsy" +//# 5307 "src/Compiler/pars.fsy" : 'gentype_quoteExpr)); -//# 14292 "pars.fs" +//# 14694 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * bool in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5120 "src/Compiler/pars.fsy" +//# 5310 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatched(fst _1)) exprFromParseError (SynExpr.Quote(mkSynIdGet (lhs parseState) (CompileOpName (fst _1)), snd _1, arbExpr ("quoteExpr2", (rhs parseState 1).EndRange), false, rhs parseState 1)) ) -//# 5120 "src/Compiler/pars.fsy" +//# 5310 "src/Compiler/pars.fsy" : 'gentype_quoteExpr)); -//# 14305 "pars.fs" +//# 14707 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_arrayExprElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5125 "src/Compiler/pars.fsy" +//# 5315 "src/Compiler/pars.fsy" _2 (lhs parseState) ) -//# 5125 "src/Compiler/pars.fsy" +//# 5315 "src/Compiler/pars.fsy" : 'gentype_arrayExpr)); -//# 14316 "pars.fs" +//# 14718 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_arrayExprElements in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5128 "src/Compiler/pars.fsy" +//# 5318 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracketBar()) exprFromParseError (_2 (rhs2 parseState 1 2)) ) -//# 5128 "src/Compiler/pars.fsy" +//# 5318 "src/Compiler/pars.fsy" : 'gentype_arrayExpr)); -//# 14329 "pars.fs" +//# 14731 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5132 "src/Compiler/pars.fsy" +//# 5322 "src/Compiler/pars.fsy" (* silent recovery *) SynExpr.ArrayOrList(true, [ ], lhs parseState) ) -//# 5132 "src/Compiler/pars.fsy" +//# 5322 "src/Compiler/pars.fsy" : 'gentype_arrayExpr)); -//# 14339 "pars.fs" +//# 14741 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5135 "src/Compiler/pars.fsy" +//# 5325 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracketBar()) (* silent recovery *) exprFromParseError (SynExpr.ArrayOrList(true, [ ], rhs parseState 1)) ) -//# 5135 "src/Compiler/pars.fsy" +//# 5325 "src/Compiler/pars.fsy" : 'gentype_arrayExpr)); -//# 14352 "pars.fs" +//# 14754 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 5141 "src/Compiler/pars.fsy" +//# 5331 "src/Compiler/pars.fsy" SynExpr.Const(SynConst.Unit, (rhs2 parseState 1 2)) ) -//# 5141 "src/Compiler/pars.fsy" +//# 5331 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14363 "pars.fs" +//# 14765 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_parenExprBody in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 5144 "src/Compiler/pars.fsy" +//# 5334 "src/Compiler/pars.fsy" let m = rhs2 parseState 1 3 SynExpr.Paren(_2 m, rhs parseState 1, Some(rhs parseState 3), m) ) -//# 5144 "src/Compiler/pars.fsy" +//# 5334 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14376 "pars.fs" +//# 14778 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_parenExprBody in let _3 = parseState.GetInput(3) :?> 'gentype_ends_other_than_rparen_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5148 "src/Compiler/pars.fsy" +//# 5338 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) let mLhs = unionRangeWithPos (rhs parseState 1) (rhs parseState 2).End SynExpr.Paren(exprFromParseError (_2 mLhs), rhs parseState 1, None, mLhs) ) -//# 5148 "src/Compiler/pars.fsy" +//# 5338 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14390 "pars.fs" +//# 14792 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 5153 "src/Compiler/pars.fsy" +//# 5343 "src/Compiler/pars.fsy" // silent recovery SynExpr.Paren(arbExpr ("parenExpr1", (rhs parseState 1).EndRange), (rhs parseState 1), Some(rhs parseState 3), (rhs2 parseState 1 3)) ) -//# 5153 "src/Compiler/pars.fsy" +//# 5343 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14402 "pars.fs" +//# 14804 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5157 "src/Compiler/pars.fsy" +//# 5347 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) let mLhs = unionRangeWithPos (rhs parseState 1) (rhs parseState 2).Start arbExpr ("parenExpr2tcs", mLhs) ) -//# 5157 "src/Compiler/pars.fsy" +//# 5347 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14414 "pars.fs" +//# 14816 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5162 "src/Compiler/pars.fsy" +//# 5352 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) let mLhs = unionRangeWithPos (rhs parseState 1) (rhs parseState 2).Start arbExpr ("parenExpr2mcs", mLhs) ) -//# 5162 "src/Compiler/pars.fsy" +//# 5352 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14426 "pars.fs" +//# 14828 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5167 "src/Compiler/pars.fsy" +//# 5357 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) let mLhs = unionRangeWithPos (rhs parseState 1) (rhs parseState 2).Start arbExpr ("parenExpr2rbcs", mLhs) ) -//# 5167 "src/Compiler/pars.fsy" +//# 5357 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14438 "pars.fs" +//# 14840 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5172 "src/Compiler/pars.fsy" +//# 5362 "src/Compiler/pars.fsy" let lparenRange = (rhs parseState 1) reportParseErrorAt lparenRange (FSComp.SR.parsUnmatchedParen()) SynExpr.Paren(arbExpr ("parenExpr2obecs", lparenRange.EndRange), lparenRange, None, lparenRange) ) -//# 5172 "src/Compiler/pars.fsy" +//# 5362 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14450 "pars.fs" +//# 14852 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5177 "src/Compiler/pars.fsy" +//# 5367 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) arbExpr ("parenExpr2", (lhs parseState)) ) -//# 5177 "src/Compiler/pars.fsy" +//# 5367 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14462 "pars.fs" +//# 14864 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynExpr in let _4 = parseState.GetInput(4) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 5188 "src/Compiler/pars.fsy" +//# 5378 "src/Compiler/pars.fsy" let mComma = rhs parseState 2 let mLparen = rhs parseState 1 let mRparen = rhs parseState 3 @@ -14480,9 +14882,9 @@ let _fsyacc_reductions = lazy [| | expr -> SynExpr.Tuple(false, [errorExpr; expr], [mComma], mTuple) SynExpr.Paren(tupleExpr, mLparen, Some mRparen, rhs2 parseState 1 4) ) -//# 5188 "src/Compiler/pars.fsy" +//# 5378 "src/Compiler/pars.fsy" : 'gentype_parenExpr)); -//# 14485 "pars.fs" +//# 14887 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typars in let _4 = parseState.GetInput(4) :?> 'gentype_classMemberSpfn in @@ -14491,83 +14893,84 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5203 "src/Compiler/pars.fsy" +//# 5393 "src/Compiler/pars.fsy" (fun m -> SynExpr.TraitCall(_1, _4, _6, m)) ) -//# 5203 "src/Compiler/pars.fsy" +//# 5393 "src/Compiler/pars.fsy" : 'gentype_parenExprBody)); -//# 14499 "pars.fs" +//# 14901 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typedSequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5206 "src/Compiler/pars.fsy" +//# 5396 "src/Compiler/pars.fsy" (fun _m -> _1) ) -//# 5206 "src/Compiler/pars.fsy" +//# 5396 "src/Compiler/pars.fsy" : 'gentype_parenExprBody)); -//# 14510 "pars.fs" +//# 14912 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_inlineAssemblyExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5209 "src/Compiler/pars.fsy" +//# 5399 "src/Compiler/pars.fsy" _1 ) -//# 5209 "src/Compiler/pars.fsy" +//# 5399 "src/Compiler/pars.fsy" : 'gentype_parenExprBody)); -//# 14521 "pars.fs" +//# 14923 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 5213 "src/Compiler/pars.fsy" +//# 5403 "src/Compiler/pars.fsy" SynType.Var(_1, rhs parseState 1) ) -//# 5213 "src/Compiler/pars.fsy" +//# 5403 "src/Compiler/pars.fsy" : 'gentype_typars)); -//# 14532 "pars.fs" +//# 14934 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typarAlts in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 5216 "src/Compiler/pars.fsy" +//# 5406 "src/Compiler/pars.fsy" let m = rhs2 parseState 1 3 SynType.Paren(_2, m) ) -//# 5216 "src/Compiler/pars.fsy" +//# 5406 "src/Compiler/pars.fsy" : 'gentype_typars)); -//# 14545 "pars.fs" +//# 14947 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typarAlts in - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5221 "src/Compiler/pars.fsy" +//# 5411 "src/Compiler/pars.fsy" let mOr = rhs parseState 2 - let m = unionRanges _1.Range _3.Range + let appType : SynType = _3 + let m = unionRanges _1.Range appType.Range SynType.Or(_1, _3, m, { OrKeyword = mOr }) ) -//# 5221 "src/Compiler/pars.fsy" +//# 5411 "src/Compiler/pars.fsy" : 'gentype_typarAlts)); -//# 14559 "pars.fs" +//# 14962 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 5226 "src/Compiler/pars.fsy" +//# 5417 "src/Compiler/pars.fsy" SynType.Var(_1, rhs parseState 1) ) -//# 5226 "src/Compiler/pars.fsy" +//# 5417 "src/Compiler/pars.fsy" : 'gentype_typarAlts)); -//# 14570 "pars.fs" +//# 14973 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_braceExprBody in @@ -14575,13 +14978,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5230 "src/Compiler/pars.fsy" +//# 5421 "src/Compiler/pars.fsy" let m, r = _2 r (rhs2 parseState 1 3) ) -//# 5230 "src/Compiler/pars.fsy" +//# 5421 "src/Compiler/pars.fsy" : 'gentype_braceExpr)); -//# 14584 "pars.fs" +//# 14987 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_braceExprBody in @@ -14589,194 +14992,195 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5234 "src/Compiler/pars.fsy" +//# 5425 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBrace()) let m, r = _2 // Note, we can't use 'exprFromParseError' because the extra syntax node interferes with some syntax-directed transformations for computation expressions r (unionRanges (rhs parseState 1) m) ) -//# 5234 "src/Compiler/pars.fsy" +//# 5425 "src/Compiler/pars.fsy" : 'gentype_braceExpr)); -//# 14600 "pars.fs" +//# 15003 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _3 = parseState.GetInput(3) :?> 'gentype_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 5240 "src/Compiler/pars.fsy" +//# 5431 "src/Compiler/pars.fsy" // silent recovery arbExpr ("braceExpr", rhs2 parseState 1 3) ) -//# 5240 "src/Compiler/pars.fsy" +//# 5431 "src/Compiler/pars.fsy" : 'gentype_braceExpr)); -//# 14613 "pars.fs" +//# 15016 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5244 "src/Compiler/pars.fsy" +//# 5435 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBrace()) // Note, we can't use 'exprFromParseError' because the extra syntax node interferes with some syntax-directed transformations for computation expressions SynExpr.Record(None, None, [], rhs parseState 1) ) -//# 5244 "src/Compiler/pars.fsy" +//# 5435 "src/Compiler/pars.fsy" : 'gentype_braceExpr)); -//# 14627 "pars.fs" +//# 15030 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 5249 "src/Compiler/pars.fsy" +//# 5440 "src/Compiler/pars.fsy" let m = rhs2 parseState 1 2 SynExpr.Record(None, None, [], m) ) -//# 5249 "src/Compiler/pars.fsy" +//# 5440 "src/Compiler/pars.fsy" : 'gentype_braceExpr)); -//# 14640 "pars.fs" +//# 15043 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recdExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5254 "src/Compiler/pars.fsy" +//# 5445 "src/Compiler/pars.fsy" (lhs parseState), (fun m -> let a, b, c = _1 in SynExpr.Record(a, b, c, m)) ) -//# 5254 "src/Compiler/pars.fsy" +//# 5445 "src/Compiler/pars.fsy" : 'gentype_braceExprBody)); -//# 14651 "pars.fs" +//# 15054 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5257 "src/Compiler/pars.fsy" +//# 5448 "src/Compiler/pars.fsy" _1 ) -//# 5257 "src/Compiler/pars.fsy" +//# 5448 "src/Compiler/pars.fsy" : 'gentype_braceExprBody)); -//# 14662 "pars.fs" +//# 15065 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_computationExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5260 "src/Compiler/pars.fsy" +//# 5451 "src/Compiler/pars.fsy" _1 ) -//# 5260 "src/Compiler/pars.fsy" +//# 5451 "src/Compiler/pars.fsy" : 'gentype_braceExprBody)); -//# 14673 "pars.fs" +//# 15076 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5264 "src/Compiler/pars.fsy" +//# 5455 "src/Compiler/pars.fsy" (fun mLhs -> SynExpr.ArrayOrListComputed(false, _1, mLhs)) ) -//# 5264 "src/Compiler/pars.fsy" +//# 5455 "src/Compiler/pars.fsy" : 'gentype_listExprElements)); -//# 14684 "pars.fs" +//# 15087 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5267 "src/Compiler/pars.fsy" +//# 5458 "src/Compiler/pars.fsy" (fun mLhs -> SynExpr.ArrayOrList(false, [ ], mLhs)) ) -//# 5267 "src/Compiler/pars.fsy" +//# 5458 "src/Compiler/pars.fsy" : 'gentype_listExprElements)); -//# 14694 "pars.fs" +//# 15097 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5271 "src/Compiler/pars.fsy" +//# 5462 "src/Compiler/pars.fsy" (fun mLhs -> SynExpr.ArrayOrListComputed(true, _1, mLhs)) ) -//# 5271 "src/Compiler/pars.fsy" +//# 5462 "src/Compiler/pars.fsy" : 'gentype_arrayExprElements)); -//# 14705 "pars.fs" +//# 15108 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5274 "src/Compiler/pars.fsy" +//# 5465 "src/Compiler/pars.fsy" (fun mLhs -> SynExpr.ArrayOrList(true, [ ], mLhs)) ) -//# 5274 "src/Compiler/pars.fsy" +//# 5465 "src/Compiler/pars.fsy" : 'gentype_arrayExprElements)); -//# 14715 "pars.fs" +//# 15118 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_sequentialExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5278 "src/Compiler/pars.fsy" +//# 5469 "src/Compiler/pars.fsy" _1.Range, (fun mLhs -> SynExpr.ComputationExpr(false, _1, mLhs)) ) -//# 5278 "src/Compiler/pars.fsy" +//# 5469 "src/Compiler/pars.fsy" : 'gentype_computationExpr)); -//# 14726 "pars.fs" +//# 15129 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typedSequentialExprBlockR in Microsoft.FSharp.Core.Operators.box ( ( -//# 5282 "src/Compiler/pars.fsy" +//# 5473 "src/Compiler/pars.fsy" let mArrow = rhs parseState 1 let expr = _2 mArrow - SynExpr.YieldOrReturn((true, false), expr, unionRanges mArrow expr.Range) + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = mArrow } + SynExpr.YieldOrReturn((true, false), expr, (unionRanges mArrow expr.Range), trivia) ) -//# 5282 "src/Compiler/pars.fsy" +//# 5473 "src/Compiler/pars.fsy" : 'gentype_arrowThenExprR)); -//# 14739 "pars.fs" +//# 15143 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5288 "src/Compiler/pars.fsy" +//# 5480 "src/Compiler/pars.fsy" _1, _3, true, DebugPointAtInOrTo.Yes(rhs parseState 2) ) -//# 5288 "src/Compiler/pars.fsy" +//# 5480 "src/Compiler/pars.fsy" : 'gentype_forLoopBinder)); -//# 14751 "pars.fs" +//# 15155 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5291 "src/Compiler/pars.fsy" +//# 5483 "src/Compiler/pars.fsy" let mIn = rhs parseState 2 if not _3 then reportParseErrorAt mIn (FSComp.SR.parsExpectedExpressionAfterToken ()) _1, arbExpr ("forLoopBinder1", mIn.EndRange), false, DebugPointAtInOrTo.Yes mIn ) -//# 5291 "src/Compiler/pars.fsy" +//# 5483 "src/Compiler/pars.fsy" : 'gentype_forLoopBinder)); -//# 14765 "pars.fs" +//# 15169 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _2 = parseState.GetInput(2) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5296 "src/Compiler/pars.fsy" +//# 5488 "src/Compiler/pars.fsy" let mPat = rhs parseState 1 if not _2 then reportParseErrorAt mPat (FSComp.SR.parsInOrEqualExpected ()) _1, arbExpr ("forLoopBinder2", mPat.EndRange), false, DebugPointAtInOrTo.Yes(rhs parseState 2) ) -//# 5296 "src/Compiler/pars.fsy" +//# 5488 "src/Compiler/pars.fsy" : 'gentype_forLoopBinder)); -//# 14779 "pars.fs" +//# 15183 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_parenPattern in let _3 = parseState.GetInput(3) :?> SynExpr in @@ -14785,34 +15189,34 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5302 "src/Compiler/pars.fsy" +//# 5494 "src/Compiler/pars.fsy" let mEquals = rhs parseState 2 let spTo = DebugPointAtInOrTo.Yes(rhs parseState 4) idOfPat parseState (rhs parseState 1) _1, Some mEquals, _3, _4, _5, spTo ) -//# 5302 "src/Compiler/pars.fsy" +//# 5494 "src/Compiler/pars.fsy" : 'gentype_forLoopRange)); -//# 14795 "pars.fs" +//# 15199 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5307 "src/Compiler/pars.fsy" +//# 5499 "src/Compiler/pars.fsy" true ) -//# 5307 "src/Compiler/pars.fsy" +//# 5499 "src/Compiler/pars.fsy" : 'gentype_forLoopDirection)); -//# 14805 "pars.fs" +//# 15209 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5309 "src/Compiler/pars.fsy" +//# 5501 "src/Compiler/pars.fsy" false ) -//# 5309 "src/Compiler/pars.fsy" +//# 5501 "src/Compiler/pars.fsy" : 'gentype_forLoopDirection)); -//# 14815 "pars.fs" +//# 15219 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_string in let _3 = parseState.GetInput(3) :?> 'gentype_opt_inlineAssemblyTypeArg in @@ -14821,69 +15225,69 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5313 "src/Compiler/pars.fsy" +//# 5505 "src/Compiler/pars.fsy" if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyWarning (lhs parseState) let (s, _), sm = _2, rhs parseState 2 (fun m -> let ilInstrs = ParseAssemblyCodeInstructions s parseState.LexBuffer.ReportLibraryOnlyFeatures parseState.LexBuffer.LanguageVersion parseState.LexBuffer.StrictIndentation sm SynExpr.LibraryOnlyILAssembly(box ilInstrs, _3, List.rev _4, _5, m)) ) -//# 5313 "src/Compiler/pars.fsy" +//# 5505 "src/Compiler/pars.fsy" : 'gentype_inlineAssemblyExpr)); -//# 14833 "pars.fs" +//# 15237 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_optCurriedArgExprs in let _2 = parseState.GetInput(2) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5321 "src/Compiler/pars.fsy" +//# 5513 "src/Compiler/pars.fsy" _2 :: _1 ) -//# 5321 "src/Compiler/pars.fsy" +//# 5513 "src/Compiler/pars.fsy" : 'gentype_optCurriedArgExprs)); -//# 14845 "pars.fs" +//# 15249 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5324 "src/Compiler/pars.fsy" +//# 5516 "src/Compiler/pars.fsy" [] ) -//# 5324 "src/Compiler/pars.fsy" +//# 5516 "src/Compiler/pars.fsy" : 'gentype_optCurriedArgExprs)); -//# 14855 "pars.fs" +//# 15259 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5328 "src/Compiler/pars.fsy" +//# 5520 "src/Compiler/pars.fsy" None ) -//# 5328 "src/Compiler/pars.fsy" +//# 5520 "src/Compiler/pars.fsy" : 'gentype_opt_atomicExprAfterType)); -//# 14865 "pars.fs" +//# 15269 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5331 "src/Compiler/pars.fsy" +//# 5523 "src/Compiler/pars.fsy" Some(_1) ) -//# 5331 "src/Compiler/pars.fsy" +//# 5523 "src/Compiler/pars.fsy" : 'gentype_opt_atomicExprAfterType)); -//# 14876 "pars.fs" +//# 15280 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5335 "src/Compiler/pars.fsy" +//# 5527 "src/Compiler/pars.fsy" [] ) -//# 5335 "src/Compiler/pars.fsy" +//# 5527 "src/Compiler/pars.fsy" : 'gentype_opt_inlineAssemblyTypeArg)); -//# 14886 "pars.fs" +//# 15290 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeKeyword in let _3 = parseState.GetInput(3) :?> SynType in @@ -14891,44 +15295,44 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5338 "src/Compiler/pars.fsy" +//# 5530 "src/Compiler/pars.fsy" [_3] ) -//# 5338 "src/Compiler/pars.fsy" +//# 5530 "src/Compiler/pars.fsy" : 'gentype_opt_inlineAssemblyTypeArg)); -//# 14899 "pars.fs" +//# 15303 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5342 "src/Compiler/pars.fsy" +//# 5534 "src/Compiler/pars.fsy" [] ) -//# 5342 "src/Compiler/pars.fsy" +//# 5534 "src/Compiler/pars.fsy" : 'gentype_optInlineAssemblyReturnTypes)); -//# 14909 "pars.fs" +//# 15313 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5345 "src/Compiler/pars.fsy" +//# 5537 "src/Compiler/pars.fsy" [_2] ) -//# 5345 "src/Compiler/pars.fsy" +//# 5537 "src/Compiler/pars.fsy" : 'gentype_optInlineAssemblyReturnTypes)); -//# 14920 "pars.fs" +//# 15324 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 5348 "src/Compiler/pars.fsy" +//# 5540 "src/Compiler/pars.fsy" [] ) -//# 5348 "src/Compiler/pars.fsy" +//# 5540 "src/Compiler/pars.fsy" : 'gentype_optInlineAssemblyReturnTypes)); -//# 14931 "pars.fs" +//# 15335 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in @@ -14938,7 +15342,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5352 "src/Compiler/pars.fsy" +//# 5544 "src/Compiler/pars.fsy" let arg = match _4 with None -> mkSynUnit (lhs parseState) | Some e -> e let l = List.rev _5 let dummyField = mkRecdField (SynLongIdent([], [], [])) // dummy identifier, it will be discarded @@ -14947,21 +15351,21 @@ let _fsyacc_reductions = lazy [| let bindings = List.tail l (Some(_2, arg, rhs2 parseState 2 4, inheritsSep, rhs parseState 1), None, bindings) ) -//# 5352 "src/Compiler/pars.fsy" +//# 5544 "src/Compiler/pars.fsy" : 'gentype_recdExpr)); -//# 14952 "pars.fs" +//# 15356 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recdExprCore in Microsoft.FSharp.Core.Operators.box ( ( -//# 5361 "src/Compiler/pars.fsy" +//# 5553 "src/Compiler/pars.fsy" let a, b = _1 None, a, b ) -//# 5361 "src/Compiler/pars.fsy" +//# 5553 "src/Compiler/pars.fsy" : 'gentype_recdExpr)); -//# 14964 "pars.fs" +//# 15368 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> SynExpr in @@ -14970,7 +15374,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5366 "src/Compiler/pars.fsy" +//# 5558 "src/Compiler/pars.fsy" match _1 with | LongOrSingleIdent(false, (SynLongIdent _ as f), None, m) -> let f = mkRecdField f @@ -14980,16 +15384,16 @@ let _fsyacc_reductions = lazy [| (None, l) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsFieldBinding()) ) -//# 5366 "src/Compiler/pars.fsy" +//# 5558 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 14985 "pars.fs" +//# 15389 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5376 "src/Compiler/pars.fsy" +//# 5568 "src/Compiler/pars.fsy" match _1 with | LongOrSingleIdent(false, (SynLongIdent _ as f), None, m) -> let f = mkRecdField f @@ -14998,41 +15402,41 @@ let _fsyacc_reductions = lazy [| None, l | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsFieldBinding ()) ) -//# 5376 "src/Compiler/pars.fsy" +//# 5568 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15003 "pars.fs" +//# 15407 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5385 "src/Compiler/pars.fsy" +//# 5577 "src/Compiler/pars.fsy" let mExpr = rhs parseState 1 reportParseErrorAt mExpr (FSComp.SR.parsFieldBinding ()) Some(_1, (mExpr.EndRange, None)), [] ) -//# 5385 "src/Compiler/pars.fsy" +//# 5577 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15016 "pars.fs" +//# 15420 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5394 "src/Compiler/pars.fsy" +//# 5586 "src/Compiler/pars.fsy" let m = rhs parseState 1 reportParseErrorAt m (FSComp.SR.parsUnderscoreInvalidFieldName()) reportParseErrorAt m (FSComp.SR.parsFieldBinding()) let f = mkUnderscoreRecdField m (None, [ SynExprRecordField(f, None, None, None) ]) ) -//# 5394 "src/Compiler/pars.fsy" +//# 5586 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15030 "pars.fs" +//# 15434 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5401 "src/Compiler/pars.fsy" +//# 5593 "src/Compiler/pars.fsy" let m = rhs parseState 1 reportParseErrorAt m (FSComp.SR.parsUnderscoreInvalidFieldName()) let f = mkUnderscoreRecdField m @@ -15040,9 +15444,9 @@ let _fsyacc_reductions = lazy [| reportParseErrorAt (rhs2 parseState 1 2) (FSComp.SR.parsFieldBinding()) (None, [ SynExprRecordField(f, Some mEquals, None, None) ]) ) -//# 5401 "src/Compiler/pars.fsy" +//# 5593 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15045 "pars.fs" +//# 15449 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynExpr in let _4 = parseState.GetInput(4) :?> 'gentype_recdExprBindings in @@ -15050,7 +15454,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5410 "src/Compiler/pars.fsy" +//# 5602 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnderscoreInvalidFieldName()) let f = mkUnderscoreRecdField (rhs parseState 1) let mEquals = rhs parseState 2 @@ -15058,9 +15462,9 @@ let _fsyacc_reductions = lazy [| let l = rebindRanges (f, Some mEquals, Some _3) l _5 (None, l) ) -//# 5410 "src/Compiler/pars.fsy" +//# 5602 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15063 "pars.fs" +//# 15467 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recdBinding in @@ -15069,26 +15473,26 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5419 "src/Compiler/pars.fsy" +//# 5611 "src/Compiler/pars.fsy" let l = List.rev _4 let l = rebindRanges _3 l _5 (Some(_1, (rhs parseState 2, None)), l) ) -//# 5419 "src/Compiler/pars.fsy" +//# 5611 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15079 "pars.fs" +//# 15483 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_opt_seps_recd in Microsoft.FSharp.Core.Operators.box ( ( -//# 5424 "src/Compiler/pars.fsy" +//# 5616 "src/Compiler/pars.fsy" (Some(_1, (rhs parseState 2, None)), []) ) -//# 5424 "src/Compiler/pars.fsy" +//# 5616 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15091 "pars.fs" +//# 15495 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> 'gentype_recdBinding in @@ -15097,99 +15501,99 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5427 "src/Compiler/pars.fsy" +//# 5619 "src/Compiler/pars.fsy" let l = List.rev _4 let l = rebindRanges _3 l _5 (Some(_1, (rhs parseState 2, None)), l) ) -//# 5427 "src/Compiler/pars.fsy" +//# 5619 "src/Compiler/pars.fsy" : 'gentype_recdExprCore)); -//# 15107 "pars.fs" +//# 15511 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_seps_recd in Microsoft.FSharp.Core.Operators.box ( ( -//# 5433 "src/Compiler/pars.fsy" +//# 5625 "src/Compiler/pars.fsy" Some _1 ) -//# 5433 "src/Compiler/pars.fsy" +//# 5625 "src/Compiler/pars.fsy" : 'gentype_opt_seps_recd)); -//# 15118 "pars.fs" +//# 15522 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5436 "src/Compiler/pars.fsy" +//# 5628 "src/Compiler/pars.fsy" None ) -//# 5436 "src/Compiler/pars.fsy" +//# 5628 "src/Compiler/pars.fsy" : 'gentype_opt_seps_recd)); -//# 15128 "pars.fs" +//# 15532 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5440 "src/Compiler/pars.fsy" +//# 5632 "src/Compiler/pars.fsy" (rhs parseState 1), None ) -//# 5440 "src/Compiler/pars.fsy" +//# 5632 "src/Compiler/pars.fsy" : 'gentype_seps_recd)); -//# 15138 "pars.fs" +//# 15542 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5443 "src/Compiler/pars.fsy" +//# 5635 "src/Compiler/pars.fsy" let m = (rhs parseState 1) m, Some m.End ) -//# 5443 "src/Compiler/pars.fsy" +//# 5635 "src/Compiler/pars.fsy" : 'gentype_seps_recd)); -//# 15149 "pars.fs" +//# 15553 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5447 "src/Compiler/pars.fsy" +//# 5639 "src/Compiler/pars.fsy" (rhs2 parseState 1 2), Some (rhs parseState 1).End ) -//# 5447 "src/Compiler/pars.fsy" +//# 5639 "src/Compiler/pars.fsy" : 'gentype_seps_recd)); -//# 15159 "pars.fs" +//# 15563 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5450 "src/Compiler/pars.fsy" +//# 5642 "src/Compiler/pars.fsy" (rhs2 parseState 1 2), Some (rhs parseState 2).End ) -//# 5450 "src/Compiler/pars.fsy" +//# 5642 "src/Compiler/pars.fsy" : 'gentype_seps_recd)); -//# 15169 "pars.fs" +//# 15573 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 5456 "src/Compiler/pars.fsy" +//# 5648 "src/Compiler/pars.fsy" mkRecdField _1 ) -//# 5456 "src/Compiler/pars.fsy" +//# 5648 "src/Compiler/pars.fsy" : 'gentype_pathOrUnderscore)); -//# 15180 "pars.fs" +//# 15584 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5459 "src/Compiler/pars.fsy" +//# 5651 "src/Compiler/pars.fsy" let m = rhs parseState 1 reportParseErrorAt m (FSComp.SR.parsUnderscoreInvalidFieldName()) mkUnderscoreRecdField m ) -//# 5459 "src/Compiler/pars.fsy" +//# 5651 "src/Compiler/pars.fsy" : 'gentype_pathOrUnderscore)); -//# 15192 "pars.fs" +//# 15596 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recdExprBindings in let _2 = parseState.GetInput(2) :?> 'gentype_seps_recd in @@ -15197,87 +15601,87 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5465 "src/Compiler/pars.fsy" +//# 5657 "src/Compiler/pars.fsy" (_3, Some _2) :: _1 ) -//# 5465 "src/Compiler/pars.fsy" +//# 5657 "src/Compiler/pars.fsy" : 'gentype_recdExprBindings)); -//# 15205 "pars.fs" +//# 15609 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5468 "src/Compiler/pars.fsy" +//# 5660 "src/Compiler/pars.fsy" [] ) -//# 5468 "src/Compiler/pars.fsy" +//# 5660 "src/Compiler/pars.fsy" : 'gentype_recdExprBindings)); -//# 15215 "pars.fs" +//# 15619 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_pathOrUnderscore in let _3 = parseState.GetInput(3) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5472 "src/Compiler/pars.fsy" +//# 5664 "src/Compiler/pars.fsy" let mEquals = rhs parseState 2 (_1, Some mEquals, Some _3) ) -//# 5472 "src/Compiler/pars.fsy" +//# 5664 "src/Compiler/pars.fsy" : 'gentype_recdBinding)); -//# 15228 "pars.fs" +//# 15632 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_pathOrUnderscore in Microsoft.FSharp.Core.Operators.box ( ( -//# 5476 "src/Compiler/pars.fsy" +//# 5668 "src/Compiler/pars.fsy" let mEquals = rhs parseState 2 reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsFieldBinding()) (_1, Some mEquals, None) ) -//# 5476 "src/Compiler/pars.fsy" +//# 5668 "src/Compiler/pars.fsy" : 'gentype_recdBinding)); -//# 15241 "pars.fs" +//# 15645 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_pathOrUnderscore in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5481 "src/Compiler/pars.fsy" +//# 5673 "src/Compiler/pars.fsy" let mEquals = rhs parseState 2 reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsFieldBinding()) (_1, Some mEquals, None) ) -//# 5481 "src/Compiler/pars.fsy" +//# 5673 "src/Compiler/pars.fsy" : 'gentype_recdBinding)); -//# 15255 "pars.fs" +//# 15659 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_pathOrUnderscore in Microsoft.FSharp.Core.Operators.box ( ( -//# 5486 "src/Compiler/pars.fsy" +//# 5678 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsFieldBinding()) (_1, None, None) ) -//# 5486 "src/Compiler/pars.fsy" +//# 5678 "src/Compiler/pars.fsy" : 'gentype_recdBinding)); -//# 15267 "pars.fs" +//# 15671 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_pathOrUnderscore in let _2 = parseState.GetInput(2) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5490 "src/Compiler/pars.fsy" +//# 5682 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsFieldBinding()) (_1, None, None) ) -//# 5490 "src/Compiler/pars.fsy" +//# 5682 "src/Compiler/pars.fsy" : 'gentype_recdBinding)); -//# 15280 "pars.fs" +//# 15684 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objExprBaseCall in let _2 = parseState.GetInput(2) :?> 'gentype_objExprBindings in @@ -15286,15 +15690,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5501 "src/Compiler/pars.fsy" +//# 5693 "src/Compiler/pars.fsy" let mNewExpr = rhs parseState 1 let fullRange = match _4 with [] -> (rhs parseState 1) | _ -> (rhs2 parseState 1 4) let mWithKwd, bindings, members = _2 fullRange, (fun m -> let (a, b) = _1 in SynExpr.ObjExpr(a, b, Some mWithKwd, bindings, members, _4, mNewExpr, m)) ) -//# 5501 "src/Compiler/pars.fsy" +//# 5693 "src/Compiler/pars.fsy" : 'gentype_objExpr)); -//# 15297 "pars.fs" +//# 15701 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objExprBaseCall in let _2 = parseState.GetInput(2) :?> 'gentype_opt_OBLOCKSEP in @@ -15302,26 +15706,26 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5507 "src/Compiler/pars.fsy" +//# 5699 "src/Compiler/pars.fsy" let mNewExpr = rhs parseState 1 let fullRange = match _3 with [] -> (rhs parseState 1) | _ -> (rhs2 parseState 1 3) fullRange, (fun m -> let (a, b) = _1 in SynExpr.ObjExpr(a, b, None, [], [], _3, mNewExpr, m)) ) -//# 5507 "src/Compiler/pars.fsy" +//# 5699 "src/Compiler/pars.fsy" : 'gentype_objExpr)); -//# 15312 "pars.fs" +//# 15716 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5512 "src/Compiler/pars.fsy" +//# 5704 "src/Compiler/pars.fsy" let mNewExpr = rhs parseState 1 (rhs2 parseState 1 2), (fun m -> let (a, b) = _2, None in SynExpr.ObjExpr(a, b, None, [], [], [], mNewExpr, m)) ) -//# 5512 "src/Compiler/pars.fsy" +//# 5704 "src/Compiler/pars.fsy" : 'gentype_objExpr)); -//# 15324 "pars.fs" +//# 15728 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in @@ -15330,12 +15734,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5517 "src/Compiler/pars.fsy" +//# 5709 "src/Compiler/pars.fsy" (_2, Some(_4, Some(_5))) ) -//# 5517 "src/Compiler/pars.fsy" +//# 5709 "src/Compiler/pars.fsy" : 'gentype_objExprBaseCall)); -//# 15338 "pars.fs" +//# 15742 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_opt_HIGH_PRECEDENCE_APP in @@ -15343,78 +15747,78 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5520 "src/Compiler/pars.fsy" +//# 5712 "src/Compiler/pars.fsy" (_2, Some(_4, None)) ) -//# 5520 "src/Compiler/pars.fsy" +//# 5712 "src/Compiler/pars.fsy" : 'gentype_objExprBaseCall)); -//# 15351 "pars.fs" +//# 15755 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5523 "src/Compiler/pars.fsy" +//# 5715 "src/Compiler/pars.fsy" _2, None ) -//# 5523 "src/Compiler/pars.fsy" +//# 5715 "src/Compiler/pars.fsy" : 'gentype_objExprBaseCall)); -//# 15362 "pars.fs" +//# 15766 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objExprBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 5528 "src/Compiler/pars.fsy" +//# 5720 "src/Compiler/pars.fsy" let mWithKwd, bindings, members = _1 Some mWithKwd, bindings, members ) -//# 5528 "src/Compiler/pars.fsy" +//# 5720 "src/Compiler/pars.fsy" : 'gentype_opt_objExprBindings)); -//# 15374 "pars.fs" +//# 15778 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5532 "src/Compiler/pars.fsy" +//# 5724 "src/Compiler/pars.fsy" None, [], [] ) -//# 5532 "src/Compiler/pars.fsy" +//# 5724 "src/Compiler/pars.fsy" : 'gentype_opt_objExprBindings)); -//# 15384 "pars.fs" +//# 15788 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_localBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 5536 "src/Compiler/pars.fsy" +//# 5728 "src/Compiler/pars.fsy" let mWithKwd = (rhs parseState 1) let _localBindingsLastRange, localBindingsBuilder = _2 mWithKwd, (localBindingsBuilder PreXmlDoc.Empty [] None SynLeadingKeyword.Synthetic), [] ) -//# 5536 "src/Compiler/pars.fsy" +//# 5728 "src/Compiler/pars.fsy" : 'gentype_objExprBindings)); -//# 15397 "pars.fs" +//# 15801 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_localBindings in Microsoft.FSharp.Core.Operators.box ( ( -//# 5541 "src/Compiler/pars.fsy" +//# 5733 "src/Compiler/pars.fsy" let mWithKwd = (rhs parseState 1) let _localBindingsLastRange, localBindingsBuilder = _2 mWithKwd, (localBindingsBuilder PreXmlDoc.Empty [] None SynLeadingKeyword.Synthetic), [] ) -//# 5541 "src/Compiler/pars.fsy" +//# 5733 "src/Compiler/pars.fsy" : 'gentype_objExprBindings)); -//# 15410 "pars.fs" +//# 15814 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_objectImplementationBlock in let _3 = parseState.GetInput(3) :?> 'gentype_opt_declEnd in Microsoft.FSharp.Core.Operators.box ( ( -//# 5546 "src/Compiler/pars.fsy" +//# 5738 "src/Compiler/pars.fsy" let mWithKwd = rhs parseState 1 let memberDefns = _2 |> @@ -15424,64 +15828,64 @@ let _fsyacc_reductions = lazy [| | x -> errorR(Error(FSComp.SR.parsMemberIllegalInObjectImplementation(), x.Range)); None)) mWithKwd, [], memberDefns ) -//# 5546 "src/Compiler/pars.fsy" +//# 5738 "src/Compiler/pars.fsy" : 'gentype_objExprBindings)); -//# 15429 "pars.fs" +//# 15833 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objExprInterface in let _2 = parseState.GetInput(2) :?> 'gentype_opt_objExprInterfaces in Microsoft.FSharp.Core.Operators.box ( ( -//# 5556 "src/Compiler/pars.fsy" +//# 5748 "src/Compiler/pars.fsy" _1 :: _2 ) -//# 5556 "src/Compiler/pars.fsy" +//# 5748 "src/Compiler/pars.fsy" : 'gentype_objExprInterfaces)); -//# 15441 "pars.fs" +//# 15845 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5560 "src/Compiler/pars.fsy" +//# 5752 "src/Compiler/pars.fsy" [] ) -//# 5560 "src/Compiler/pars.fsy" +//# 5752 "src/Compiler/pars.fsy" : 'gentype_opt_objExprInterfaces)); -//# 15451 "pars.fs" +//# 15855 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_objExprInterface in let _2 = parseState.GetInput(2) :?> 'gentype_opt_objExprInterfaces in Microsoft.FSharp.Core.Operators.box ( ( -//# 5563 "src/Compiler/pars.fsy" +//# 5755 "src/Compiler/pars.fsy" _1 :: _2 ) -//# 5563 "src/Compiler/pars.fsy" +//# 5755 "src/Compiler/pars.fsy" : 'gentype_opt_objExprInterfaces)); -//# 15463 "pars.fs" +//# 15867 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_opt_objExprInterfaces in Microsoft.FSharp.Core.Operators.box ( ( -//# 5566 "src/Compiler/pars.fsy" +//# 5758 "src/Compiler/pars.fsy" (* silent recovery *) _2 ) -//# 5566 "src/Compiler/pars.fsy" +//# 5758 "src/Compiler/pars.fsy" : 'gentype_opt_objExprInterfaces)); -//# 15474 "pars.fs" +//# 15878 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_interfaceMember in - let _2 = parseState.GetInput(2) :?> 'gentype_appType in + let _2 = parseState.GetInput(2) :?> 'gentype_appTypeWithoutNull in let _3 = parseState.GetInput(3) :?> 'gentype_opt_objExprBindings in let _4 = parseState.GetInput(4) :?> 'gentype_opt_declEnd in let _5 = parseState.GetInput(5) :?> 'gentype_opt_OBLOCKSEP in Microsoft.FSharp.Core.Operators.box ( ( -//# 5570 "src/Compiler/pars.fsy" +//# 5762 "src/Compiler/pars.fsy" let mWithKwd, bindings, members = _3 let m = match List.tryLast members with @@ -15491,39 +15895,39 @@ let _fsyacc_reductions = lazy [| mkFileIndexRange mInterface.FileIndex mInterface.Start ms.Range.End SynInterfaceImpl(_2, mWithKwd, bindings, members, m) ) -//# 5570 "src/Compiler/pars.fsy" +//# 5762 "src/Compiler/pars.fsy" : 'gentype_objExprInterface)); -//# 15496 "pars.fs" +//# 15900 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_braceBarExprCore in Microsoft.FSharp.Core.Operators.box ( ( -//# 5581 "src/Compiler/pars.fsy" +//# 5773 "src/Compiler/pars.fsy" let mStruct = rhs parseState 1 _2 (Some mStruct) ) -//# 5581 "src/Compiler/pars.fsy" +//# 5773 "src/Compiler/pars.fsy" : 'gentype_braceBarExpr)); -//# 15508 "pars.fs" +//# 15912 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_braceBarExprCore in Microsoft.FSharp.Core.Operators.box ( ( -//# 5585 "src/Compiler/pars.fsy" +//# 5777 "src/Compiler/pars.fsy" _1 None ) -//# 5585 "src/Compiler/pars.fsy" +//# 5777 "src/Compiler/pars.fsy" : 'gentype_braceBarExpr)); -//# 15519 "pars.fs" +//# 15923 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recdExprCore in let _3 = parseState.GetInput(3) :?> 'gentype_bar_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 5589 "src/Compiler/pars.fsy" +//# 5781 "src/Compiler/pars.fsy" let orig, flds = _2 let flds = flds |> List.choose (function @@ -15537,16 +15941,16 @@ let _fsyacc_reductions = lazy [| let m = match mStruct with | None -> unionRanges mLeftBrace mRightBrace | Some mStruct -> unionRanges mStruct mRightBrace SynExpr.AnonRecd(mStruct.IsSome, orig, flds, m, { OpeningBraceRange = mLeftBrace })) ) -//# 5589 "src/Compiler/pars.fsy" +//# 5781 "src/Compiler/pars.fsy" : 'gentype_braceBarExprCore)); -//# 15542 "pars.fs" +//# 15946 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recdExprCore in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5603 "src/Compiler/pars.fsy" +//# 5795 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) let orig, flds = _2 let flds = @@ -15559,15 +15963,15 @@ let _fsyacc_reductions = lazy [| let m = match mStruct with | None -> unionRanges mLeftBrace mExpr | Some mStruct -> unionRanges mStruct mExpr SynExpr.AnonRecd(mStruct.IsSome, orig, flds, m, { OpeningBraceRange = mLeftBrace })) ) -//# 5603 "src/Compiler/pars.fsy" +//# 5795 "src/Compiler/pars.fsy" : 'gentype_braceBarExprCore)); -//# 15564 "pars.fs" +//# 15968 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_bar_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 5616 "src/Compiler/pars.fsy" +//# 5808 "src/Compiler/pars.fsy" // silent recovery let mLeftBrace = rhs parseState 1 let mRightBrace = rhs parseState 3 @@ -15575,81 +15979,81 @@ let _fsyacc_reductions = lazy [| let m = match mStruct with | None -> unionRanges mLeftBrace mRightBrace | Some mStruct -> unionRanges mStruct mRightBrace arbExpr ("braceBarExpr", m)) ) -//# 5616 "src/Compiler/pars.fsy" +//# 5808 "src/Compiler/pars.fsy" : 'gentype_braceBarExprCore)); -//# 15580 "pars.fs" +//# 15984 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5624 "src/Compiler/pars.fsy" +//# 5816 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) let mLeftBrace = rhs parseState 1 (fun (mStruct: range option) -> let m = match mStruct with | None -> mLeftBrace | Some mStruct -> unionRanges mStruct mLeftBrace SynExpr.AnonRecd(mStruct.IsSome, None, [], m, { OpeningBraceRange = mLeftBrace })) ) -//# 5624 "src/Compiler/pars.fsy" +//# 5816 "src/Compiler/pars.fsy" : 'gentype_braceBarExprCore)); -//# 15595 "pars.fs" +//# 15999 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_bar_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 5631 "src/Compiler/pars.fsy" +//# 5823 "src/Compiler/pars.fsy" let mLeftBrace = rhs parseState 1 let mRightBrace = rhs parseState 2 (fun (mStruct: range option) -> let m = match mStruct with | None -> unionRanges mLeftBrace mRightBrace | Some mStruct -> unionRanges mStruct mRightBrace SynExpr.AnonRecd(mStruct.IsSome, None, [], m, { OpeningBraceRange = mLeftBrace })) ) -//# 5631 "src/Compiler/pars.fsy" +//# 5823 "src/Compiler/pars.fsy" : 'gentype_braceBarExprCore)); -//# 15610 "pars.fs" +//# 16014 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat list in let _4 = parseState.GetInput(4) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 5639 "src/Compiler/pars.fsy" +//# 5831 "src/Compiler/pars.fsy" let mAll = unionRanges (rhs parseState 1) _4.Range let mArrow = Some(rhs parseState 3) - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll _2 mArrow _4 + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll _2 mArrow _4 ) -//# 5639 "src/Compiler/pars.fsy" +//# 5831 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15624 "pars.fs" +//# 16028 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat list in Microsoft.FSharp.Core.Operators.box ( ( -//# 5644 "src/Compiler/pars.fsy" +//# 5836 "src/Compiler/pars.fsy" let mAll = rhs2 parseState 1 3 let mArrow = Some(rhs parseState 3) - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll _2 mArrow (arbExpr ("anonLambdaExpr1", (rhs parseState 4))) + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll _2 mArrow (arbExpr ("anonLambdaExpr1", (rhs parseState 4))) ) -//# 5644 "src/Compiler/pars.fsy" +//# 5836 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15637 "pars.fs" +//# 16041 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat list in let _4 = parseState.GetInput(4) :?> 'gentype_typedSequentialExprBlockR in Microsoft.FSharp.Core.Operators.box ( ( -//# 5649 "src/Compiler/pars.fsy" +//# 5841 "src/Compiler/pars.fsy" let mArrow = rhs parseState 3 let expr = _4 mArrow let mAll = unionRanges (rhs parseState 1) expr.Range - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll _2 (Some mArrow) expr + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll _2 (Some mArrow) expr ) -//# 5649 "src/Compiler/pars.fsy" +//# 5841 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15652 "pars.fs" +//# 16056 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat list in let _4 = parseState.GetInput(4) :?> 'gentype_typedSequentialExprBlockR in @@ -15657,360 +16061,360 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5655 "src/Compiler/pars.fsy" +//# 5847 "src/Compiler/pars.fsy" if not _5 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileFunBody ()) let mArrow = rhs parseState 3 let expr = _4 mArrow let mAll = unionRanges (rhs parseState 1) expr.Range - exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll _2 (Some mArrow) expr) + exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll _2 (Some mArrow) expr) ) -//# 5655 "src/Compiler/pars.fsy" +//# 5847 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15669 "pars.fs" +//# 16073 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat list in let _4 = parseState.GetInput(4) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 5662 "src/Compiler/pars.fsy" +//# 5854 "src/Compiler/pars.fsy" let mLambda = rhs2 parseState 1 3 reportParseErrorAt mLambda (FSComp.SR.parsMissingFunctionBody()) let mArrow = Some(rhs parseState 3) - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mLambda _2 mArrow (arbExpr ("anonLambdaExpr2", mLambda.EndRange)) + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mLambda _2 mArrow (arbExpr ("anonLambdaExpr2", mLambda.EndRange)) ) -//# 5662 "src/Compiler/pars.fsy" +//# 5854 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15684 "pars.fs" +//# 16088 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat list in let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5668 "src/Compiler/pars.fsy" +//# 5860 "src/Compiler/pars.fsy" if not _4 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileFunBody()) let mLambda = rhs2 parseState 1 3 let mArrow = Some(rhs parseState 3) - exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false mLambda _2 mArrow (arbExpr ("anonLambdaExpr3", mLambda.EndRange))) + exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mLambda _2 mArrow (arbExpr ("anonLambdaExpr3", mLambda.EndRange))) ) -//# 5668 "src/Compiler/pars.fsy" +//# 5860 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15699 "pars.fs" +//# 16103 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynPat list in Microsoft.FSharp.Core.Operators.box ( ( -//# 5674 "src/Compiler/pars.fsy" +//# 5866 "src/Compiler/pars.fsy" let mLambda = rhs2 parseState 1 2 - exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false mLambda _2 None (arbExpr ("anonLambdaExpr4", mLambda.EndRange))) + exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mLambda _2 None (arbExpr ("anonLambdaExpr4", mLambda.EndRange))) ) -//# 5674 "src/Compiler/pars.fsy" +//# 5866 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15711 "pars.fs" +//# 16115 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5678 "src/Compiler/pars.fsy" - exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false (rhs parseState 1) [] None (arbExpr ("anonLambdaExpr5", (rhs parseState 2)))) +//# 5870 "src/Compiler/pars.fsy" + exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false (rhs parseState 1) [] None (arbExpr ("anonLambdaExpr5", (rhs parseState 2)))) ) -//# 5678 "src/Compiler/pars.fsy" +//# 5870 "src/Compiler/pars.fsy" : 'gentype_anonLambdaExpr)); -//# 15721 "pars.fs" +//# 16125 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_withPatternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 5682 "src/Compiler/pars.fsy" +//# 5874 "src/Compiler/pars.fsy" let clauses, mLast = _2 let mAll = unionRanges (rhs parseState 1) mLast SynExpr.MatchLambda(false, (rhs parseState 1), clauses, DebugPointAtBinding.NoneAtInvisible, mAll) ) -//# 5682 "src/Compiler/pars.fsy" +//# 5874 "src/Compiler/pars.fsy" : 'gentype_anonMatchingExpr)); -//# 15734 "pars.fs" +//# 16138 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_withPatternClauses in Microsoft.FSharp.Core.Operators.box ( ( -//# 5687 "src/Compiler/pars.fsy" +//# 5879 "src/Compiler/pars.fsy" let clauses, mLast = _2 let mAll = unionRanges (rhs parseState 1) mLast SynExpr.MatchLambda(false, (rhs parseState 1), clauses, DebugPointAtBinding.NoneAtInvisible, mAll) ) -//# 5687 "src/Compiler/pars.fsy" +//# 5879 "src/Compiler/pars.fsy" : 'gentype_anonMatchingExpr)); -//# 15747 "pars.fs" +//# 16151 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5696 "src/Compiler/pars.fsy" +//# 5888 "src/Compiler/pars.fsy" _1 ) -//# 5696 "src/Compiler/pars.fsy" +//# 5888 "src/Compiler/pars.fsy" : 'gentype_typeWithTypeConstraints)); -//# 15758 "pars.fs" +//# 16162 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_typeConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 5699 "src/Compiler/pars.fsy" +//# 5891 "src/Compiler/pars.fsy" SynType.WithGlobalConstraints(_1, List.rev _3, lhs parseState) ) -//# 5699 "src/Compiler/pars.fsy" +//# 5891 "src/Compiler/pars.fsy" : 'gentype_typeWithTypeConstraints)); -//# 15770 "pars.fs" +//# 16174 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5703 "src/Compiler/pars.fsy" +//# 5895 "src/Compiler/pars.fsy" _1 ) -//# 5703 "src/Compiler/pars.fsy" +//# 5895 "src/Compiler/pars.fsy" : 'gentype_topTypeWithTypeConstraints)); -//# 15781 "pars.fs" +//# 16185 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topType in let _3 = parseState.GetInput(3) :?> 'gentype_typeConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 5706 "src/Compiler/pars.fsy" +//# 5898 "src/Compiler/pars.fsy" let ty, arity = _1 // nb. it doesn't matter where the constraints go in the structure of the type. SynType.WithGlobalConstraints(ty, List.rev _3, lhs parseState), arity ) -//# 5706 "src/Compiler/pars.fsy" +//# 5898 "src/Compiler/pars.fsy" : 'gentype_topTypeWithTypeConstraints)); -//# 15795 "pars.fs" +//# 16199 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 5712 "src/Compiler/pars.fsy" +//# 5904 "src/Compiler/pars.fsy" None ) -//# 5712 "src/Compiler/pars.fsy" +//# 5904 "src/Compiler/pars.fsy" : 'gentype_opt_topReturnTypeWithTypeConstraints)); -//# 15805 "pars.fs" +//# 16209 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_topTypeWithTypeConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 5715 "src/Compiler/pars.fsy" +//# 5907 "src/Compiler/pars.fsy" let mColon = rhs parseState 1 let ty, arity = _2 let arity = (match arity with SynValInfo([], rmdata)-> rmdata | _ -> SynInfo.unnamedRetVal) Some(Some mColon, SynReturnInfo((ty, arity), rhs parseState 2)) ) -//# 5715 "src/Compiler/pars.fsy" +//# 5907 "src/Compiler/pars.fsy" : 'gentype_opt_topReturnTypeWithTypeConstraints)); -//# 15819 "pars.fs" +//# 16223 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5721 "src/Compiler/pars.fsy" +//# 5913 "src/Compiler/pars.fsy" let mColon = rhs parseState 1 let ty, arity = SynType.FromParseError(mColon.EndRange), SynInfo.unnamedRetVal Some(Some mColon, SynReturnInfo((ty, arity), mColon.EndRange)) ) -//# 5721 "src/Compiler/pars.fsy" +//# 5913 "src/Compiler/pars.fsy" : 'gentype_opt_topReturnTypeWithTypeConstraints)); -//# 15832 "pars.fs" +//# 16236 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topTupleType in let _3 = parseState.GetInput(3) :?> 'gentype_topType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5727 "src/Compiler/pars.fsy" +//# 5919 "src/Compiler/pars.fsy" let dty, dmdata = _1 let rty, (SynValInfo(dmdatas, rmdata)) = _3 let mArrow = rhs parseState 2 SynType.Fun(dty, rty, lhs parseState, { ArrowRange = mArrow }), SynValInfo(dmdata :: dmdatas, rmdata) ) -//# 5727 "src/Compiler/pars.fsy" +//# 5919 "src/Compiler/pars.fsy" : 'gentype_topType)); -//# 15847 "pars.fs" +//# 16251 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topTupleType in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5733 "src/Compiler/pars.fsy" +//# 5925 "src/Compiler/pars.fsy" let dty, dmdata = _1 let mArrow = rhs parseState 2 let rty = SynType.FromParseError(mArrow.EndRange) SynType.Fun(dty, rty, lhs parseState, { ArrowRange = mArrow }), SynValInfo([dmdata], SynInfo.unnamedRetVal) ) -//# 5733 "src/Compiler/pars.fsy" +//# 5925 "src/Compiler/pars.fsy" : 'gentype_topType)); -//# 15862 "pars.fs" +//# 16266 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topTupleType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5739 "src/Compiler/pars.fsy" +//# 5931 "src/Compiler/pars.fsy" let ty, rmdata = _1 ty, (SynValInfo([], (match rmdata with [md] -> md | _ -> SynInfo.unnamedRetVal))) ) -//# 5739 "src/Compiler/pars.fsy" +//# 5931 "src/Compiler/pars.fsy" : 'gentype_topType)); -//# 15874 "pars.fs" +//# 16278 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topAppType in let _3 = parseState.GetInput(3) :?> 'gentype_topTupleTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5744 "src/Compiler/pars.fsy" +//# 5936 "src/Compiler/pars.fsy" let t, argInfo = _1 let mStar = rhs parseState 2 let path = SynTupleTypeSegment.Type t :: SynTupleTypeSegment.Star mStar :: (List.map fst _3) let mdata = argInfo :: (List.choose snd _3) mkSynTypeTuple path, mdata ) -//# 5744 "src/Compiler/pars.fsy" +//# 5936 "src/Compiler/pars.fsy" : 'gentype_topTupleType)); -//# 15890 "pars.fs" +//# 16294 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topAppType in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5751 "src/Compiler/pars.fsy" +//# 5943 "src/Compiler/pars.fsy" let ty1, argInfo = _1 let mStar = rhs parseState 2 let ty2 = SynType.FromParseError(mStar.EndRange) let path = [SynTupleTypeSegment.Type ty1; SynTupleTypeSegment.Star mStar; SynTupleTypeSegment.Type ty2] mkSynTypeTuple path, [argInfo; SynInfo.emptySynArgInfo] ) -//# 5751 "src/Compiler/pars.fsy" +//# 5943 "src/Compiler/pars.fsy" : 'gentype_topTupleType)); -//# 15906 "pars.fs" +//# 16310 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_topTupleTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5758 "src/Compiler/pars.fsy" +//# 5950 "src/Compiler/pars.fsy" let mStar = rhs parseState 1 let ty = SynType.FromParseError(mStar.EndRange) reportParseErrorAt mStar (FSComp.SR.parsExpectingType ()) let path = SynTupleTypeSegment.Type ty :: SynTupleTypeSegment.Star mStar :: (List.map fst _2) mkSynTypeTuple path, List.choose snd _2 ) -//# 5758 "src/Compiler/pars.fsy" +//# 5950 "src/Compiler/pars.fsy" : 'gentype_topTupleType)); -//# 15921 "pars.fs" +//# 16325 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topAppType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5765 "src/Compiler/pars.fsy" +//# 5957 "src/Compiler/pars.fsy" let ty, mdata = _1 ty, [mdata] ) -//# 5765 "src/Compiler/pars.fsy" +//# 5957 "src/Compiler/pars.fsy" : 'gentype_topTupleType)); -//# 15933 "pars.fs" +//# 16337 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topAppType in let _3 = parseState.GetInput(3) :?> 'gentype_topTupleTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5770 "src/Compiler/pars.fsy" +//# 5962 "src/Compiler/pars.fsy" let t, argInfo = _1 let mStar = rhs parseState 2 (SynTupleTypeSegment.Type t, Some argInfo) :: (SynTupleTypeSegment.Star mStar, None) :: _3 ) -//# 5770 "src/Compiler/pars.fsy" +//# 5962 "src/Compiler/pars.fsy" : 'gentype_topTupleTypeElements)); -//# 15947 "pars.fs" +//# 16351 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topAppType in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5775 "src/Compiler/pars.fsy" +//# 5967 "src/Compiler/pars.fsy" let ty1, argInfo = _1 let mStar = rhs parseState 2 let ty2 = SynType.FromParseError(mStar.EndRange) [SynTupleTypeSegment.Type ty1, Some argInfo; SynTupleTypeSegment.Star mStar, None; SynTupleTypeSegment.Type ty2, Some SynInfo.emptySynArgInfo] ) -//# 5775 "src/Compiler/pars.fsy" +//# 5967 "src/Compiler/pars.fsy" : 'gentype_topTupleTypeElements)); -//# 15962 "pars.fs" +//# 16366 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_topTupleTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5781 "src/Compiler/pars.fsy" +//# 5973 "src/Compiler/pars.fsy" let mStar = rhs parseState 1 let ty = SynType.FromParseError(mStar.EndRange) reportParseErrorAt mStar (FSComp.SR.parsExpectingType ()) (SynTupleTypeSegment.Type ty, None) :: (SynTupleTypeSegment.Star mStar, None) :: _2 ) -//# 5781 "src/Compiler/pars.fsy" +//# 5973 "src/Compiler/pars.fsy" : 'gentype_topTupleTypeElements)); -//# 15976 "pars.fs" +//# 16380 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topAppType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5787 "src/Compiler/pars.fsy" +//# 5979 "src/Compiler/pars.fsy" let t, argInfo = _1 [ SynTupleTypeSegment.Type t, Some argInfo ] ) -//# 5787 "src/Compiler/pars.fsy" +//# 5979 "src/Compiler/pars.fsy" : 'gentype_topTupleTypeElements)); -//# 15988 "pars.fs" +//# 16392 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in - let _2 = parseState.GetInput(2) :?> 'gentype_appType in - let _4 = parseState.GetInput(4) :?> 'gentype_appType in + let _2 = parseState.GetInput(2) :?> 'gentype_appTypeCanBeNullable in + let _4 = parseState.GetInput(4) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5792 "src/Compiler/pars.fsy" +//# 5984 "src/Compiler/pars.fsy" match _2 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let m = unionRanges (rhs parseState 1) _4.Range SynType.SignatureParameter(_1, false, Some id, _4, m), SynArgInfo(_1, false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) ) -//# 5792 "src/Compiler/pars.fsy" +//# 5984 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16005 "pars.fs" +//# 16409 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in - let _2 = parseState.GetInput(2) :?> 'gentype_appType in + let _2 = parseState.GetInput(2) :?> 'gentype_appTypeCanBeNullable in let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5799 "src/Compiler/pars.fsy" +//# 5991 "src/Compiler/pars.fsy" match _2 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let mColon = rhs parseState 2 @@ -16019,23 +16423,23 @@ let _fsyacc_reductions = lazy [| SynType.SignatureParameter(_1, false, Some id, ty, m), SynArgInfo(_1, false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) ) -//# 5799 "src/Compiler/pars.fsy" +//# 5991 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16024 "pars.fs" +//# 16428 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in let _3 = parseState.GetInput(3) :?> Ident in - let _5 = parseState.GetInput(5) :?> 'gentype_appType in + let _5 = parseState.GetInput(5) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5808 "src/Compiler/pars.fsy" +//# 6000 "src/Compiler/pars.fsy" let m = unionRanges (rhs parseState 1) _5.Range SynType.SignatureParameter(_1, true, Some _3, _5, m), SynArgInfo(_1, true, Some _3) ) -//# 5808 "src/Compiler/pars.fsy" +//# 6000 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16038 "pars.fs" +//# 16442 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in let _3 = parseState.GetInput(3) :?> Ident in @@ -16043,51 +16447,51 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 5812 "src/Compiler/pars.fsy" +//# 6004 "src/Compiler/pars.fsy" let mColon = rhs parseState 4 let m = unionRanges (rhs parseState 1) mColon let ty = SynType.FromParseError(mColon.EndRange) SynType.SignatureParameter(_1, true, Some _3, ty, m), SynArgInfo(_1, true, Some _3) ) -//# 5812 "src/Compiler/pars.fsy" +//# 6004 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16054 "pars.fs" +//# 16458 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_attributes in - let _2 = parseState.GetInput(2) :?> 'gentype_appType in + let _2 = parseState.GetInput(2) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5818 "src/Compiler/pars.fsy" +//# 6010 "src/Compiler/pars.fsy" let m = unionRanges (rhs parseState 1) _2.Range SynType.SignatureParameter(_1, false, None, _2, m), SynArgInfo(_1, false, None) ) -//# 5818 "src/Compiler/pars.fsy" +//# 6010 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16067 "pars.fs" +//# 16471 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5822 "src/Compiler/pars.fsy" +//# 6014 "src/Compiler/pars.fsy" match _1 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let m = unionRanges (rhs parseState 1) _3.Range SynType.SignatureParameter([], false, Some id, _3, m), SynArgInfo([], false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) ) -//# 5822 "src/Compiler/pars.fsy" +//# 6014 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16083 "pars.fs" +//# 16487 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5829 "src/Compiler/pars.fsy" +//# 6021 "src/Compiler/pars.fsy" match _1 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let mColon = rhs parseState 2 @@ -16096,84 +16500,84 @@ let _fsyacc_reductions = lazy [| SynType.SignatureParameter([], false, Some id, ty, m), SynArgInfo([], false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) ) -//# 5829 "src/Compiler/pars.fsy" +//# 6021 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16101 "pars.fs" +//# 16505 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> Ident in - let _4 = parseState.GetInput(4) :?> 'gentype_appType in + let _4 = parseState.GetInput(4) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5838 "src/Compiler/pars.fsy" +//# 6030 "src/Compiler/pars.fsy" let m = unionRanges (rhs parseState 1) _4.Range SynType.SignatureParameter([], true, Some _2, _4, m), SynArgInfo([], true, Some _2) ) -//# 5838 "src/Compiler/pars.fsy" +//# 6030 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16114 "pars.fs" +//# 16518 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> Ident in let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5842 "src/Compiler/pars.fsy" +//# 6034 "src/Compiler/pars.fsy" let mColon = rhs parseState 3 let m = unionRanges (rhs parseState 1) mColon let ty = SynType.FromParseError(mColon.EndRange) SynType.SignatureParameter([], true, Some _2, ty, m), SynArgInfo([], true, Some _2) ) -//# 5842 "src/Compiler/pars.fsy" +//# 6034 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16129 "pars.fs" +//# 16533 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5848 "src/Compiler/pars.fsy" +//# 6040 "src/Compiler/pars.fsy" _1, SynArgInfo([], false, None) ) -//# 5848 "src/Compiler/pars.fsy" +//# 6040 "src/Compiler/pars.fsy" : 'gentype_topAppType)); -//# 16140 "pars.fs" +//# 16544 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in let _3 = parseState.GetInput(3) :?> 'gentype_invalidUseOfAppTypeFunction in Microsoft.FSharp.Core.Operators.box ( ( -//# 5854 "src/Compiler/pars.fsy" +//# 6046 "src/Compiler/pars.fsy" let mArrow = rhs parseState 2 let m = unionRanges (rhs2 parseState 1 2) _3.Range SynType.Fun(_1, _3, m, { ArrowRange = mArrow }) ) -//# 5854 "src/Compiler/pars.fsy" +//# 6046 "src/Compiler/pars.fsy" : 'gentype_invalidUseOfAppTypeFunction)); -//# 16154 "pars.fs" +//# 16558 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5858 "src/Compiler/pars.fsy" +//# 6051 "src/Compiler/pars.fsy" let mArrow = rhs parseState 2 let ty = SynType.FromParseError(mArrow.EndRange) let m = rhs2 parseState 1 2 SynType.Fun(_1, ty, m, { ArrowRange = mArrow }) ) -//# 5858 "src/Compiler/pars.fsy" +//# 6051 "src/Compiler/pars.fsy" : 'gentype_invalidUseOfAppTypeFunction)); -//# 16169 "pars.fs" +//# 16573 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in let _4 = parseState.GetInput(4) :?> 'gentype_invalidUseOfAppTypeFunction in Microsoft.FSharp.Core.Operators.box ( ( -//# 5863 "src/Compiler/pars.fsy" +//# 6057 "src/Compiler/pars.fsy" let mArrow1 = rhs parseState 2 let mArrow2 = rhs parseState 3 reportParseErrorAt mArrow2 (FSComp.SR.parsExpectingType ()) @@ -16182,59 +16586,59 @@ let _fsyacc_reductions = lazy [| let m2 = unionRanges mArrow2 _4.Range SynType.Fun(_1, SynType.Fun(ty, _4, m2, { ArrowRange = mArrow2 }), m1, { ArrowRange = mArrow1 }) ) -//# 5863 "src/Compiler/pars.fsy" +//# 6057 "src/Compiler/pars.fsy" : 'gentype_invalidUseOfAppTypeFunction)); -//# 16187 "pars.fs" +//# 16591 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeWithoutNull in Microsoft.FSharp.Core.Operators.box ( ( -//# 5871 "src/Compiler/pars.fsy" +//# 6066 "src/Compiler/pars.fsy" let mArrow = rhs parseState 2 let m = rhs2 parseState 1 3 SynType.Fun(_1, _3, m, { ArrowRange = mArrow }) ) -//# 5871 "src/Compiler/pars.fsy" +//# 6066 "src/Compiler/pars.fsy" : 'gentype_invalidUseOfAppTypeFunction)); -//# 16201 "pars.fs" +//# 16605 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tupleType in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5879 "src/Compiler/pars.fsy" +//# 6074 "src/Compiler/pars.fsy" let mArrow = rhs parseState 2 let m = unionRanges (rhs2 parseState 1 2) _3.Range SynType.Fun(_1, _3, m, { ArrowRange = mArrow }) ) -//# 5879 "src/Compiler/pars.fsy" +//# 6074 "src/Compiler/pars.fsy" : SynType)); -//# 16215 "pars.fs" +//# 16619 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tupleType in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5884 "src/Compiler/pars.fsy" +//# 6079 "src/Compiler/pars.fsy" let mArrow = rhs parseState 2 let ty = SynType.FromParseError(mArrow.EndRange) let m = rhs2 parseState 1 2 SynType.Fun(_1, ty, m, { ArrowRange = mArrow }) ) -//# 5884 "src/Compiler/pars.fsy" +//# 6079 "src/Compiler/pars.fsy" : SynType)); -//# 16230 "pars.fs" +//# 16634 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tupleType in let _4 = parseState.GetInput(4) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5890 "src/Compiler/pars.fsy" +//# 6085 "src/Compiler/pars.fsy" let mArrow1 = rhs parseState 2 let mArrow2 = rhs parseState 3 reportParseErrorAt mArrow2 (FSComp.SR.parsExpectingType ()) @@ -16243,298 +16647,298 @@ let _fsyacc_reductions = lazy [| let m2 = unionRanges mArrow2 _4.Range SynType.Fun(_1, SynType.Fun(ty, _4, m2, { ArrowRange = mArrow2 }), m1, { ArrowRange = mArrow1 }) ) -//# 5890 "src/Compiler/pars.fsy" +//# 6085 "src/Compiler/pars.fsy" : SynType)); -//# 16248 "pars.fs" +//# 16652 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_tupleType in Microsoft.FSharp.Core.Operators.box ( ( -//# 5899 "src/Compiler/pars.fsy" +//# 6094 "src/Compiler/pars.fsy" _1 ) -//# 5899 "src/Compiler/pars.fsy" +//# 6094 "src/Compiler/pars.fsy" : SynType)); -//# 16259 "pars.fs" +//# 16663 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynType in let _2 = parseState.GetInput(2) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 5902 "src/Compiler/pars.fsy" +//# 6097 "src/Compiler/pars.fsy" checkEndOfFileError _2; _1 ) -//# 5902 "src/Compiler/pars.fsy" +//# 6097 "src/Compiler/pars.fsy" : SynType)); -//# 16271 "pars.fs" +//# 16675 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _3 = parseState.GetInput(3) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5907 "src/Compiler/pars.fsy" +//# 6102 "src/Compiler/pars.fsy" let mStar = rhs parseState 2 let path = SynTupleTypeSegment.Type _1 :: SynTupleTypeSegment.Star mStar :: _3 mkSynTypeTuple path ) -//# 5907 "src/Compiler/pars.fsy" +//# 6102 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16285 "pars.fs" +//# 16689 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5912 "src/Compiler/pars.fsy" +//# 6107 "src/Compiler/pars.fsy" let mStar = rhs parseState 2 let ty = SynType.FromParseError(mStar.EndRange) let path = [SynTupleTypeSegment.Type _1; SynTupleTypeSegment.Star mStar; SynTupleTypeSegment.Type ty] mkSynTypeTuple path ) -//# 5912 "src/Compiler/pars.fsy" +//# 6107 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16300 "pars.fs" +//# 16704 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5918 "src/Compiler/pars.fsy" +//# 6113 "src/Compiler/pars.fsy" let mStar = rhs parseState 1 let ty = SynType.FromParseError(mStar.EndRange) reportParseErrorAt mStar (FSComp.SR.parsExpectingType ()) let path = SynTupleTypeSegment.Type ty :: SynTupleTypeSegment.Star mStar :: _2 mkSynTypeTuple path ) -//# 5918 "src/Compiler/pars.fsy" +//# 6113 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16315 "pars.fs" +//# 16719 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5925 "src/Compiler/pars.fsy" +//# 6120 "src/Compiler/pars.fsy" if _1 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 1 let path = SynTupleTypeSegment.Slash mSlash :: _2 mkSynTypeTuple path ) -//# 5925 "src/Compiler/pars.fsy" +//# 6120 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16330 "pars.fs" +//# 16734 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5931 "src/Compiler/pars.fsy" +//# 6126 "src/Compiler/pars.fsy" if _1 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 1 let ty = SynType.FromParseError(mSlash.EndRange) let path = [SynTupleTypeSegment.Slash mSlash; SynTupleTypeSegment.Type ty] mkSynTypeTuple path ) -//# 5931 "src/Compiler/pars.fsy" +//# 6126 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16346 "pars.fs" +//# 16750 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _2 = parseState.GetInput(2) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5938 "src/Compiler/pars.fsy" +//# 6133 "src/Compiler/pars.fsy" if _2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator()) let mSlash = rhs parseState 2 let path = SynTupleTypeSegment.Type _1 :: SynTupleTypeSegment.Slash mSlash :: _3 mkSynTypeTuple path ) -//# 5938 "src/Compiler/pars.fsy" +//# 6133 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16362 "pars.fs" +//# 16766 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _2 = parseState.GetInput(2) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5944 "src/Compiler/pars.fsy" +//# 6139 "src/Compiler/pars.fsy" if _2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 2 let ty = SynType.FromParseError(mSlash.EndRange) let path = [SynTupleTypeSegment.Type _1; SynTupleTypeSegment.Slash mSlash; SynTupleTypeSegment.Type ty] mkSynTypeTuple path ) -//# 5944 "src/Compiler/pars.fsy" +//# 6139 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16379 "pars.fs" +//# 16783 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5951 "src/Compiler/pars.fsy" +//# 6146 "src/Compiler/pars.fsy" _1 ) -//# 5951 "src/Compiler/pars.fsy" +//# 6146 "src/Compiler/pars.fsy" : 'gentype_tupleType)); -//# 16390 "pars.fs" +//# 16794 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _3 = parseState.GetInput(3) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5955 "src/Compiler/pars.fsy" +//# 6150 "src/Compiler/pars.fsy" let mStar = rhs parseState 2 SynTupleTypeSegment.Type _1 :: SynTupleTypeSegment.Star mStar :: _3 ) -//# 5955 "src/Compiler/pars.fsy" +//# 6150 "src/Compiler/pars.fsy" : 'gentype_tupleOrQuotTypeElements)); -//# 16403 "pars.fs" +//# 16807 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5959 "src/Compiler/pars.fsy" +//# 6154 "src/Compiler/pars.fsy" let mStar = rhs parseState 2 let ty = SynType.FromParseError(mStar.EndRange) [SynTupleTypeSegment.Type _1; SynTupleTypeSegment.Star mStar; SynTupleTypeSegment.Type ty] ) -//# 5959 "src/Compiler/pars.fsy" +//# 6154 "src/Compiler/pars.fsy" : 'gentype_tupleOrQuotTypeElements)); -//# 16417 "pars.fs" +//# 16821 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5964 "src/Compiler/pars.fsy" +//# 6159 "src/Compiler/pars.fsy" let mStar = rhs parseState 1 let ty = SynType.FromParseError(mStar.EndRange) reportParseErrorAt mStar (FSComp.SR.parsExpectingType ()) SynTupleTypeSegment.Type ty :: SynTupleTypeSegment.Star mStar :: _2 ) -//# 5964 "src/Compiler/pars.fsy" +//# 6159 "src/Compiler/pars.fsy" : 'gentype_tupleOrQuotTypeElements)); -//# 16431 "pars.fs" +//# 16835 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _2 = parseState.GetInput(2) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5970 "src/Compiler/pars.fsy" +//# 6165 "src/Compiler/pars.fsy" if _2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 2 SynTupleTypeSegment.Type _1 :: SynTupleTypeSegment.Slash mSlash :: _3 ) -//# 5970 "src/Compiler/pars.fsy" +//# 6165 "src/Compiler/pars.fsy" : 'gentype_tupleOrQuotTypeElements)); -//# 16446 "pars.fs" +//# 16850 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in let _2 = parseState.GetInput(2) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 5975 "src/Compiler/pars.fsy" +//# 6170 "src/Compiler/pars.fsy" if _2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 2 let ty = SynType.FromParseError(mSlash.EndRange) [SynTupleTypeSegment.Type _1; SynTupleTypeSegment.Slash mSlash; SynTupleTypeSegment.Type ty] ) -//# 5975 "src/Compiler/pars.fsy" +//# 6170 "src/Compiler/pars.fsy" : 'gentype_tupleOrQuotTypeElements)); -//# 16462 "pars.fs" +//# 16866 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> 'gentype_tupleOrQuotTypeElements in Microsoft.FSharp.Core.Operators.box ( ( -//# 5981 "src/Compiler/pars.fsy" +//# 6176 "src/Compiler/pars.fsy" if _1 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 1 let ty = SynType.FromParseError(mSlash.EndRange) reportParseErrorAt mSlash (FSComp.SR.parsExpectingType ()) SynTupleTypeSegment.Type ty :: SynTupleTypeSegment.Slash mSlash :: _2 ) -//# 5981 "src/Compiler/pars.fsy" +//# 6176 "src/Compiler/pars.fsy" : 'gentype_tupleOrQuotTypeElements)); -//# 16478 "pars.fs" +//# 16882 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCanBeNullable in Microsoft.FSharp.Core.Operators.box ( ( -//# 5988 "src/Compiler/pars.fsy" +//# 6183 "src/Compiler/pars.fsy" [ SynTupleTypeSegment.Type _1 ] ) -//# 5988 "src/Compiler/pars.fsy" +//# 6183 "src/Compiler/pars.fsy" : 'gentype_tupleOrQuotTypeElements)); -//# 16489 "pars.fs" +//# 16893 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _3 = parseState.GetInput(3) :?> 'gentype_intersectionConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 5992 "src/Compiler/pars.fsy" +//# 6187 "src/Compiler/pars.fsy" let constraints, mAmpersands = _3 SynType.Intersection(Some _1, List.rev constraints, lhs parseState, { AmpersandRanges = rhs parseState 2 :: List.rev mAmpersands }) ) -//# 5992 "src/Compiler/pars.fsy" +//# 6187 "src/Compiler/pars.fsy" : 'gentype_intersectionType)); -//# 16502 "pars.fs" +//# 16906 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_atomType in + let _1 = parseState.GetInput(1) :?> 'gentype_hashConstraint in let _3 = parseState.GetInput(3) :?> 'gentype_intersectionConstraints in Microsoft.FSharp.Core.Operators.box ( ( -//# 5996 "src/Compiler/pars.fsy" +//# 6191 "src/Compiler/pars.fsy" let constraints, mAmpersands = _3 SynType.Intersection(None, _1 :: List.rev constraints, lhs parseState, { AmpersandRanges = rhs parseState 2 :: List.rev mAmpersands }) ) -//# 5996 "src/Compiler/pars.fsy" +//# 6191 "src/Compiler/pars.fsy" : 'gentype_intersectionType)); -//# 16515 "pars.fs" +//# 16919 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 6001 "src/Compiler/pars.fsy" +//# 6196 "src/Compiler/pars.fsy" SynType.LongIdent(_1) ) -//# 6001 "src/Compiler/pars.fsy" +//# 6196 "src/Compiler/pars.fsy" : 'gentype_appTypeCon)); -//# 16526 "pars.fs" +//# 16930 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 6004 "src/Compiler/pars.fsy" +//# 6199 "src/Compiler/pars.fsy" SynType.Var(_1, lhs parseState) ) -//# 6004 "src/Compiler/pars.fsy" +//# 6199 "src/Compiler/pars.fsy" : 'gentype_appTypeCon)); -//# 16537 "pars.fs" +//# 16941 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCon in let _2 = parseState.GetInput(2) :?> string in @@ -16542,7 +16946,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6008 "src/Compiler/pars.fsy" +//# 6203 "src/Compiler/pars.fsy" if _2 <> "^" && _2 <> "^-" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedInfixOperator()) if _2 = "^-" then let afterMinus = (rhs parseState 2).EndRange @@ -16551,56 +16955,101 @@ let _fsyacc_reductions = lazy [| SynType.MeasurePower(_1, SynRationalConst.Negate(_3, m), lhs parseState) else SynType.MeasurePower(_1, _3, lhs parseState) ) -//# 6008 "src/Compiler/pars.fsy" +//# 6203 "src/Compiler/pars.fsy" : 'gentype_appTypeConPower)); -//# 16556 "pars.fs" +//# 16960 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCon in Microsoft.FSharp.Core.Operators.box ( ( -//# 6017 "src/Compiler/pars.fsy" +//# 6212 "src/Compiler/pars.fsy" _1 ) -//# 6017 "src/Compiler/pars.fsy" +//# 6212 "src/Compiler/pars.fsy" : 'gentype_appTypeConPower)); -//# 16567 "pars.fs" +//# 16971 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 6216 "src/Compiler/pars.fsy" + SynType.WithNull(_1, false, lhs parseState, { BarRange = rhs parseState 2 }) + ) +//# 6216 "src/Compiler/pars.fsy" + : 'gentype_appTypeCanBeNullable)); +//# 16982 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 6219 "src/Compiler/pars.fsy" + _1 + ) +//# 6219 "src/Compiler/pars.fsy" + : 'gentype_appTypeCanBeNullable)); +//# 16993 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 6223 "src/Compiler/pars.fsy" + _1 + ) +//# 6223 "src/Compiler/pars.fsy" + : SynType)); +//# 17004 "pars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = parseState.GetInput(2) :?> 'gentype_appTypeCanBeNullable in + let _3 = parseState.GetInput(3) :?> 'gentype_rparen in + Microsoft.FSharp.Core.Operators.box + ( + ( +//# 6226 "src/Compiler/pars.fsy" + SynType.Paren(_2, lhs parseState) + ) +//# 6226 "src/Compiler/pars.fsy" + : SynType)); +//# 17016 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in let _2 = parseState.GetInput(2) :?> 'gentype_arrayTypeSuffix in Microsoft.FSharp.Core.Operators.box ( ( -//# 6021 "src/Compiler/pars.fsy" +//# 6230 "src/Compiler/pars.fsy" SynType.Array(_2, _1, lhs parseState) ) -//# 6021 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16579 "pars.fs" +//# 6230 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17028 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in let _3 = parseState.GetInput(3) :?> 'gentype_arrayTypeSuffix in Microsoft.FSharp.Core.Operators.box ( ( -//# 6024 "src/Compiler/pars.fsy" +//# 6233 "src/Compiler/pars.fsy" SynType.Array(_3, _1, lhs parseState) ) -//# 6024 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16591 "pars.fs" +//# 6233 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17040 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_appType in + let _1 = parseState.GetInput(1) :?> 'gentype_appTypeWithoutNull in let _2 = parseState.GetInput(2) :?> 'gentype_appTypeConPower in Microsoft.FSharp.Core.Operators.box ( ( -//# 6028 "src/Compiler/pars.fsy" +//# 6237 "src/Compiler/pars.fsy" SynType.App(_2, None, [_1], [], None, true, unionRanges (rhs parseState 1) _2.Range) ) -//# 6028 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16603 "pars.fs" +//# 6237 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17052 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_appTypePrefixArguments in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in @@ -16608,7 +17057,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6031 "src/Compiler/pars.fsy" +//# 6240 "src/Compiler/pars.fsy" let args, commas = _2 if parseState.LexBuffer.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatError (FSComp.SR.mlCompatMultiPrefixTyparsNoLongerSupported()) (unionRanges (rhs parseState 1) _4.Range) @@ -16616,377 +17065,377 @@ let _fsyacc_reductions = lazy [| mlCompatWarning (FSComp.SR.parsMultiArgumentGenericTypeFormDeprecated()) (unionRanges (rhs parseState 1) _4.Range) SynType.App(_4, None, args, commas, None, true, unionRanges (rhs parseState 1) _4.Range) ) -//# 6031 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16621 "pars.fs" +//# 6240 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17070 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_powerType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6039 "src/Compiler/pars.fsy" +//# 6248 "src/Compiler/pars.fsy" _1 ) -//# 6039 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16632 "pars.fs" +//# 6248 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17081 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_intersectionType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6042 "src/Compiler/pars.fsy" +//# 6251 "src/Compiler/pars.fsy" parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.ConstraintIntersectionOnFlexibleTypes (lhs parseState) _1 ) -//# 6042 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16644 "pars.fs" +//# 6251 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17093 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6046 "src/Compiler/pars.fsy" +//# 6255 "src/Compiler/pars.fsy" let tp, typ = _1, _3 let m = lhs parseState SynType.WithGlobalConstraints(SynType.Var(tp, rhs parseState 1), [SynTypeConstraint.WhereTyparSubtypeOfType(tp, typ, m)], m) ) -//# 6046 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16658 "pars.fs" +//# 6255 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17107 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6051 "src/Compiler/pars.fsy" +//# 6260 "src/Compiler/pars.fsy" SynType.HashConstraint(_3, lhs parseState) ) -//# 6051 "src/Compiler/pars.fsy" - : 'gentype_appType)); -//# 16669 "pars.fs" +//# 6260 "src/Compiler/pars.fsy" + : 'gentype_appTypeWithoutNull)); +//# 17118 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6055 "src/Compiler/pars.fsy" +//# 6264 "src/Compiler/pars.fsy" 1 ) -//# 6055 "src/Compiler/pars.fsy" +//# 6264 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16679 "pars.fs" +//# 17128 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6058 "src/Compiler/pars.fsy" +//# 6267 "src/Compiler/pars.fsy" 2 ) -//# 6058 "src/Compiler/pars.fsy" +//# 6267 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16689 "pars.fs" +//# 17138 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6061 "src/Compiler/pars.fsy" +//# 6270 "src/Compiler/pars.fsy" 3 ) -//# 6061 "src/Compiler/pars.fsy" +//# 6270 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16699 "pars.fs" +//# 17148 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6064 "src/Compiler/pars.fsy" +//# 6273 "src/Compiler/pars.fsy" 4 ) -//# 6064 "src/Compiler/pars.fsy" +//# 6273 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16709 "pars.fs" +//# 17158 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6067 "src/Compiler/pars.fsy" +//# 6276 "src/Compiler/pars.fsy" 5 ) -//# 6067 "src/Compiler/pars.fsy" +//# 6276 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16719 "pars.fs" +//# 17168 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6070 "src/Compiler/pars.fsy" +//# 6279 "src/Compiler/pars.fsy" 6 ) -//# 6070 "src/Compiler/pars.fsy" +//# 6279 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16729 "pars.fs" +//# 17178 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6073 "src/Compiler/pars.fsy" +//# 6282 "src/Compiler/pars.fsy" 7 ) -//# 6073 "src/Compiler/pars.fsy" +//# 6282 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16739 "pars.fs" +//# 17188 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6076 "src/Compiler/pars.fsy" +//# 6285 "src/Compiler/pars.fsy" 8 ) -//# 6076 "src/Compiler/pars.fsy" +//# 6285 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16749 "pars.fs" +//# 17198 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6079 "src/Compiler/pars.fsy" +//# 6288 "src/Compiler/pars.fsy" 9 ) -//# 6079 "src/Compiler/pars.fsy" +//# 6288 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16759 "pars.fs" +//# 17208 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6082 "src/Compiler/pars.fsy" +//# 6291 "src/Compiler/pars.fsy" 10 ) -//# 6082 "src/Compiler/pars.fsy" +//# 6291 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16769 "pars.fs" +//# 17218 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6085 "src/Compiler/pars.fsy" +//# 6294 "src/Compiler/pars.fsy" 11 ) -//# 6085 "src/Compiler/pars.fsy" +//# 6294 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16779 "pars.fs" +//# 17228 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6088 "src/Compiler/pars.fsy" +//# 6297 "src/Compiler/pars.fsy" 12 ) -//# 6088 "src/Compiler/pars.fsy" +//# 6297 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16789 "pars.fs" +//# 17238 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6091 "src/Compiler/pars.fsy" +//# 6300 "src/Compiler/pars.fsy" 13 ) -//# 6091 "src/Compiler/pars.fsy" +//# 6300 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16799 "pars.fs" +//# 17248 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6094 "src/Compiler/pars.fsy" +//# 6303 "src/Compiler/pars.fsy" 14 ) -//# 6094 "src/Compiler/pars.fsy" +//# 6303 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16809 "pars.fs" +//# 17258 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6097 "src/Compiler/pars.fsy" +//# 6306 "src/Compiler/pars.fsy" 15 ) -//# 6097 "src/Compiler/pars.fsy" +//# 6306 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16819 "pars.fs" +//# 17268 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6100 "src/Compiler/pars.fsy" +//# 6309 "src/Compiler/pars.fsy" 16 ) -//# 6100 "src/Compiler/pars.fsy" +//# 6309 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16829 "pars.fs" +//# 17278 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6103 "src/Compiler/pars.fsy" +//# 6312 "src/Compiler/pars.fsy" 17 ) -//# 6103 "src/Compiler/pars.fsy" +//# 6312 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16839 "pars.fs" +//# 17288 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6106 "src/Compiler/pars.fsy" +//# 6315 "src/Compiler/pars.fsy" 18 ) -//# 6106 "src/Compiler/pars.fsy" +//# 6315 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16849 "pars.fs" +//# 17298 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6109 "src/Compiler/pars.fsy" +//# 6318 "src/Compiler/pars.fsy" 19 ) -//# 6109 "src/Compiler/pars.fsy" +//# 6318 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16859 "pars.fs" +//# 17308 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6112 "src/Compiler/pars.fsy" +//# 6321 "src/Compiler/pars.fsy" 20 ) -//# 6112 "src/Compiler/pars.fsy" +//# 6321 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16869 "pars.fs" +//# 17318 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6115 "src/Compiler/pars.fsy" +//# 6324 "src/Compiler/pars.fsy" 21 ) -//# 6115 "src/Compiler/pars.fsy" +//# 6324 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16879 "pars.fs" +//# 17328 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6118 "src/Compiler/pars.fsy" +//# 6327 "src/Compiler/pars.fsy" 22 ) -//# 6118 "src/Compiler/pars.fsy" +//# 6327 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16889 "pars.fs" +//# 17338 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6121 "src/Compiler/pars.fsy" +//# 6330 "src/Compiler/pars.fsy" 23 ) -//# 6121 "src/Compiler/pars.fsy" +//# 6330 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16899 "pars.fs" +//# 17348 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6124 "src/Compiler/pars.fsy" +//# 6333 "src/Compiler/pars.fsy" 24 ) -//# 6124 "src/Compiler/pars.fsy" +//# 6333 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16909 "pars.fs" +//# 17358 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6127 "src/Compiler/pars.fsy" +//# 6336 "src/Compiler/pars.fsy" 25 ) -//# 6127 "src/Compiler/pars.fsy" +//# 6336 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16919 "pars.fs" +//# 17368 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6130 "src/Compiler/pars.fsy" +//# 6339 "src/Compiler/pars.fsy" 26 ) -//# 6130 "src/Compiler/pars.fsy" +//# 6339 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16929 "pars.fs" +//# 17378 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6133 "src/Compiler/pars.fsy" +//# 6342 "src/Compiler/pars.fsy" 27 ) -//# 6133 "src/Compiler/pars.fsy" +//# 6342 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16939 "pars.fs" +//# 17388 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6136 "src/Compiler/pars.fsy" +//# 6345 "src/Compiler/pars.fsy" 28 ) -//# 6136 "src/Compiler/pars.fsy" +//# 6345 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16949 "pars.fs" +//# 17398 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6139 "src/Compiler/pars.fsy" +//# 6348 "src/Compiler/pars.fsy" 29 ) -//# 6139 "src/Compiler/pars.fsy" +//# 6348 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16959 "pars.fs" +//# 17408 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6142 "src/Compiler/pars.fsy" +//# 6351 "src/Compiler/pars.fsy" 30 ) -//# 6142 "src/Compiler/pars.fsy" +//# 6351 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16969 "pars.fs" +//# 17418 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6145 "src/Compiler/pars.fsy" +//# 6354 "src/Compiler/pars.fsy" 31 ) -//# 6145 "src/Compiler/pars.fsy" +//# 6354 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16979 "pars.fs" +//# 17428 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6148 "src/Compiler/pars.fsy" +//# 6357 "src/Compiler/pars.fsy" 32 ) -//# 6148 "src/Compiler/pars.fsy" +//# 6357 "src/Compiler/pars.fsy" : 'gentype_arrayTypeSuffix)); -//# 16989 "pars.fs" +//# 17438 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeArgActual in let _3 = parseState.GetInput(3) :?> 'gentype_typeArgActual in @@ -16994,69 +17443,69 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6152 "src/Compiler/pars.fsy" +//# 6361 "src/Compiler/pars.fsy" let typeArgs, commas = _4 _1 :: _3 :: List.rev typeArgs, (rhs parseState 2) :: (List.rev commas) ) -//# 6152 "src/Compiler/pars.fsy" +//# 6361 "src/Compiler/pars.fsy" : 'gentype_appTypePrefixArguments)); -//# 17003 "pars.fs" +//# 17452 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeArgListElements in let _3 = parseState.GetInput(3) :?> 'gentype_typeArgActual in Microsoft.FSharp.Core.Operators.box ( ( -//# 6157 "src/Compiler/pars.fsy" +//# 6366 "src/Compiler/pars.fsy" let typeArgs, commas = _1 _3 :: typeArgs, (rhs parseState 2) :: commas ) -//# 6157 "src/Compiler/pars.fsy" +//# 6366 "src/Compiler/pars.fsy" : 'gentype_typeArgListElements)); -//# 17016 "pars.fs" +//# 17465 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeArgListElements in let _3 = parseState.GetInput(3) :?> 'gentype_dummyTypeArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 6161 "src/Compiler/pars.fsy" +//# 6370 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsMissingTypeArgs()) let typeArgs, commas = _1 _3 :: typeArgs, (rhs parseState 2) :: commas ) -//# 6161 "src/Compiler/pars.fsy" +//# 6370 "src/Compiler/pars.fsy" : 'gentype_typeArgListElements)); -//# 17030 "pars.fs" +//# 17479 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6166 "src/Compiler/pars.fsy" +//# 6375 "src/Compiler/pars.fsy" [], [] ) -//# 6166 "src/Compiler/pars.fsy" +//# 6375 "src/Compiler/pars.fsy" : 'gentype_typeArgListElements)); -//# 17040 "pars.fs" +//# 17489 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_atomTypeOrAnonRecdType in + let _1 = parseState.GetInput(1) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6170 "src/Compiler/pars.fsy" +//# 6379 "src/Compiler/pars.fsy" _1 ) -//# 6170 "src/Compiler/pars.fsy" +//# 6379 "src/Compiler/pars.fsy" : 'gentype_powerType)); -//# 17051 "pars.fs" +//# 17500 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> 'gentype_atomTypeOrAnonRecdType in + let _1 = parseState.GetInput(1) :?> SynType in let _2 = parseState.GetInput(2) :?> string in let _3 = parseState.GetInput(3) :?> 'gentype_atomicRationalConstant in Microsoft.FSharp.Core.Operators.box ( ( -//# 6173 "src/Compiler/pars.fsy" +//# 6382 "src/Compiler/pars.fsy" if _2 <> "^" && _2 <> "^-" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedInfixOperator()) if _2 = "^-" then let afterMinus = (rhs parseState 2).EndRange @@ -17065,9 +17514,9 @@ let _fsyacc_reductions = lazy [| SynType.MeasurePower(_1, SynRationalConst.Negate(_3, m), lhs parseState) else SynType.MeasurePower(_1, _3, lhs parseState) ) -//# 6173 "src/Compiler/pars.fsy" +//# 6382 "src/Compiler/pars.fsy" : 'gentype_powerType)); -//# 17070 "pars.fs" +//# 17519 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_appTypePrefixArguments in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in @@ -17075,7 +17524,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6186 "src/Compiler/pars.fsy" +//# 6395 "src/Compiler/pars.fsy" let args, commas = _2 if parseState.LexBuffer.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatError (FSComp.SR.mlCompatMultiPrefixTyparsNoLongerSupported()) (unionRanges (rhs parseState 1) _4.Range) @@ -17083,37 +17532,37 @@ let _fsyacc_reductions = lazy [| mlCompatWarning (FSComp.SR.parsMultiArgumentGenericTypeFormDeprecated()) (unionRanges (rhs parseState 1) _4.Range) SynType.App(_4, None, args, commas, None, true, unionRanges (rhs parseState 1) _4.Range) ) -//# 6186 "src/Compiler/pars.fsy" +//# 6395 "src/Compiler/pars.fsy" : SynType)); -//# 17088 "pars.fs" +//# 17537 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6194 "src/Compiler/pars.fsy" +//# 6403 "src/Compiler/pars.fsy" _1 ) -//# 6194 "src/Compiler/pars.fsy" +//# 6403 "src/Compiler/pars.fsy" : SynType)); -//# 17099 "pars.fs" +//# 17548 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6198 "src/Compiler/pars.fsy" +//# 6407 "src/Compiler/pars.fsy" _1 ) -//# 6198 "src/Compiler/pars.fsy" - : 'gentype_atomTypeOrAnonRecdType)); -//# 17110 "pars.fs" +//# 6407 "src/Compiler/pars.fsy" + : SynType)); +//# 17559 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_anonRecdType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6201 "src/Compiler/pars.fsy" +//# 6410 "src/Compiler/pars.fsy" let flds, isStruct = _1 let flds2 = flds |> List.choose (function @@ -17121,227 +17570,227 @@ let _fsyacc_reductions = lazy [| | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) SynType.AnonRecd(isStruct, flds2, rhs parseState 1) ) -//# 6201 "src/Compiler/pars.fsy" - : 'gentype_atomTypeOrAnonRecdType)); -//# 17126 "pars.fs" +//# 6410 "src/Compiler/pars.fsy" + : SynType)); +//# 17575 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _2 = parseState.GetInput(2) :?> 'gentype_atomType in + let _1 = parseState.GetInput(1) :?> 'gentype_hashConstraint in Microsoft.FSharp.Core.Operators.box ( ( -//# 6212 "src/Compiler/pars.fsy" - SynType.HashConstraint(_2, lhs parseState) +//# 6421 "src/Compiler/pars.fsy" + _1 ) -//# 6212 "src/Compiler/pars.fsy" +//# 6421 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17137 "pars.fs" +//# 17586 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_appTypeConPower in Microsoft.FSharp.Core.Operators.box ( ( -//# 6215 "src/Compiler/pars.fsy" +//# 6424 "src/Compiler/pars.fsy" _1 ) -//# 6215 "src/Compiler/pars.fsy" +//# 6424 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17148 "pars.fs" +//# 17597 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6218 "src/Compiler/pars.fsy" +//# 6427 "src/Compiler/pars.fsy" SynType.Anon(lhs parseState) ) -//# 6218 "src/Compiler/pars.fsy" +//# 6427 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17158 "pars.fs" +//# 17607 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6221 "src/Compiler/pars.fsy" +//# 6430 "src/Compiler/pars.fsy" SynType.Paren(_2, lhs parseState) ) -//# 6221 "src/Compiler/pars.fsy" +//# 6430 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17170 "pars.fs" +//# 17619 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynType in let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6224 "src/Compiler/pars.fsy" +//# 6433 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen ()) SynType.Paren(_2, lhs parseState) ) -//# 6224 "src/Compiler/pars.fsy" +//# 6433 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17183 "pars.fs" +//# 17632 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeCanBeNullable in let _5 = parseState.GetInput(5) :?> 'gentype_tupleOrQuotTypeElements in let _6 = parseState.GetInput(6) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6228 "src/Compiler/pars.fsy" +//# 6437 "src/Compiler/pars.fsy" let mStar = rhs parseState 4 let path = SynTupleTypeSegment.Type _3 :: SynTupleTypeSegment.Star mStar :: _5 let m = rhs2 parseState 1 6 SynType.Tuple(true, path, m) ) -//# 6228 "src/Compiler/pars.fsy" +//# 6437 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17199 "pars.fs" +//# 17648 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeCanBeNullable in let _5 = parseState.GetInput(5) :?> 'gentype_tupleOrQuotTypeElements in let _6 = parseState.GetInput(6) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6234 "src/Compiler/pars.fsy" +//# 6443 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) let mStar = rhs parseState 4 let path = SynTupleTypeSegment.Type _3 :: SynTupleTypeSegment.Star mStar :: _5 let m = rhs2 parseState 1 5 SynType.Tuple(true, path, m) ) -//# 6234 "src/Compiler/pars.fsy" +//# 6443 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17216 "pars.fs" +//# 17665 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeCanBeNullable in let _5 = parseState.GetInput(5) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6241 "src/Compiler/pars.fsy" +//# 6450 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) SynType.Anon(lhs parseState) ) -//# 6241 "src/Compiler/pars.fsy" +//# 6450 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17229 "pars.fs" +//# 17678 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - let _3 = parseState.GetInput(3) :?> 'gentype_appType in + let _3 = parseState.GetInput(3) :?> 'gentype_appTypeCanBeNullable in let _4 = parseState.GetInput(4) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6245 "src/Compiler/pars.fsy" +//# 6454 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) SynType.Anon(lhs parseState) ) -//# 6245 "src/Compiler/pars.fsy" +//# 6454 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17242 "pars.fs" +//# 17691 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6249 "src/Compiler/pars.fsy" +//# 6458 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) SynType.Anon(lhs parseState) ) -//# 6249 "src/Compiler/pars.fsy" +//# 6458 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17254 "pars.fs" +//# 17703 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_rawConstant in Microsoft.FSharp.Core.Operators.box ( ( -//# 6253 "src/Compiler/pars.fsy" +//# 6462 "src/Compiler/pars.fsy" SynType.StaticConstant(_1, rhs parseState 1) ) -//# 6253 "src/Compiler/pars.fsy" +//# 6462 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17265 "pars.fs" +//# 17714 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6256 "src/Compiler/pars.fsy" +//# 6465 "src/Compiler/pars.fsy" let m = rhs parseState 1 - SynType.StaticConstant(SynConst.String(null, SynStringKind.Regular, m), m) + SynType.StaticConstantNull(m) ) -//# 6256 "src/Compiler/pars.fsy" +//# 6465 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17276 "pars.fs" +//# 17725 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> SynExpr * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 6260 "src/Compiler/pars.fsy" +//# 6469 "src/Compiler/pars.fsy" let e, _ = _2 SynType.StaticConstantExpr(e, lhs parseState) ) -//# 6260 "src/Compiler/pars.fsy" +//# 6469 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17288 "pars.fs" +//# 17737 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6264 "src/Compiler/pars.fsy" +//# 6473 "src/Compiler/pars.fsy" SynType.StaticConstant(SynConst.Bool false, lhs parseState) ) -//# 6264 "src/Compiler/pars.fsy" +//# 6473 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17298 "pars.fs" +//# 17747 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6267 "src/Compiler/pars.fsy" +//# 6476 "src/Compiler/pars.fsy" SynType.StaticConstant(SynConst.Bool true, lhs parseState) ) -//# 6267 "src/Compiler/pars.fsy" +//# 6476 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17308 "pars.fs" +//# 17757 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6270 "src/Compiler/pars.fsy" +//# 6479 "src/Compiler/pars.fsy" (* silent recovery *) SynType.Anon(lhs parseState) ) -//# 6270 "src/Compiler/pars.fsy" +//# 6479 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17319 "pars.fs" +//# 17768 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCon in let _2 = parseState.GetInput(2) :?> range * range option * SynType list * range list * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6273 "src/Compiler/pars.fsy" +//# 6482 "src/Compiler/pars.fsy" let mLessThan, mGreaterThan, args, commas, mWhole = _2 SynType.App(_1, Some(mLessThan), args, commas, mGreaterThan, false, unionRanges _1.Range mWhole) ) -//# 6273 "src/Compiler/pars.fsy" +//# 6482 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17332 "pars.fs" +//# 17781 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomType in let _3 = parseState.GetInput(3) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 6277 "src/Compiler/pars.fsy" +//# 6486 "src/Compiler/pars.fsy" SynType.LongIdentApp(_1, _3, None, [], [], None, unionRanges (rhs parseState 1) _3.Range) ) -//# 6277 "src/Compiler/pars.fsy" +//# 6486 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17344 "pars.fs" +//# 17793 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_atomType in let _3 = parseState.GetInput(3) :?> SynLongIdent in @@ -17349,52 +17798,52 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6280 "src/Compiler/pars.fsy" +//# 6489 "src/Compiler/pars.fsy" let mLessThan, mGreaterThan, args, commas, mWhole = _4 SynType.LongIdentApp(_1, _3, Some(mLessThan), args, commas, mGreaterThan, unionRanges _1.Range mWhole) ) -//# 6280 "src/Compiler/pars.fsy" +//# 6489 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17358 "pars.fs" +//# 17807 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_appTypeCon in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6284 "src/Compiler/pars.fsy" +//# 6493 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectedNameAfterToken()) _1 ) -//# 6284 "src/Compiler/pars.fsy" +//# 6493 "src/Compiler/pars.fsy" : 'gentype_atomType)); -//# 17371 "pars.fs" +//# 17820 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> range * range option * bool * SynType list * range list * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6289 "src/Compiler/pars.fsy" +//# 6498 "src/Compiler/pars.fsy" let mLessThan, mGreaterThan, parsedOk, args, commas, mAll = _1 if parsedOk then // if someone has "foo let _2 = parseState.GetInput(2) :?> range * range option * bool * SynType list * range list * range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6295 "src/Compiler/pars.fsy" +//# 6504 "src/Compiler/pars.fsy" let mLessThan, mGreaterThan, _, args, commas, mAll = _2 mLessThan, mGreaterThan, args, commas, mAll ) -//# 6295 "src/Compiler/pars.fsy" +//# 6504 "src/Compiler/pars.fsy" : range * range option * SynType list * range list * range)); -//# 17397 "pars.fs" +//# 17846 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_typeArgActualOrDummyIfEmpty in @@ -17404,13 +17853,13 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6300 "src/Compiler/pars.fsy" +//# 6509 "src/Compiler/pars.fsy" let typeArgs, commas = _5 (rhs parseState 1), Some(rhs parseState 6), true, (_2 :: _4 :: List.rev typeArgs), (rhs parseState 3) :: (List.rev commas), lhs parseState ) -//# 6300 "src/Compiler/pars.fsy" +//# 6509 "src/Compiler/pars.fsy" : range * range option * bool * SynType list * range list * range)); -//# 17413 "pars.fs" +//# 17862 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_typeArgActualOrDummyIfEmpty in @@ -17420,7 +17869,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6304 "src/Compiler/pars.fsy" +//# 6513 "src/Compiler/pars.fsy" if not _6 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileTypeArgs()) else @@ -17430,9 +17879,9 @@ let _fsyacc_reductions = lazy [| let zeroWidthAtStartOfNextToken = nextToken.StartRange (rhs parseState 1), None, false, (_2 :: _4 :: List.rev typeArgs), (rhs parseState 3) :: (List.rev commas), unionRanges (rhs parseState 1) zeroWidthAtStartOfNextToken ) -//# 6304 "src/Compiler/pars.fsy" +//# 6513 "src/Compiler/pars.fsy" : range * range option * bool * SynType list * range list * range)); -//# 17435 "pars.fs" +//# 17884 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_typeArgActualOrDummyIfEmpty in @@ -17440,15 +17889,15 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6314 "src/Compiler/pars.fsy" +//# 6523 "src/Compiler/pars.fsy" if not _4 then reportParseErrorAt (rhs parseState 4) (FSComp.SR.parsMissingTypeArgs()) let nextToken = rhs parseState 4 let zeroWidthAtStartOfNextToken = nextToken.StartRange (rhs parseState 1), None, false, [_2], [rhs parseState 3], unionRanges (rhs parseState 1) zeroWidthAtStartOfNextToken ) -//# 6314 "src/Compiler/pars.fsy" +//# 6523 "src/Compiler/pars.fsy" : range * range option * bool * SynType list * range list * range)); -//# 17451 "pars.fs" +//# 17900 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_typeArgActual in @@ -17456,12 +17905,12 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6320 "src/Compiler/pars.fsy" +//# 6529 "src/Compiler/pars.fsy" (rhs parseState 1), Some(rhs parseState 3), true, [_2], [], lhs parseState ) -//# 6320 "src/Compiler/pars.fsy" +//# 6529 "src/Compiler/pars.fsy" : range * range option * bool * SynType list * range list * range)); -//# 17464 "pars.fs" +//# 17913 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_typeArgActual in @@ -17469,34 +17918,34 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6323 "src/Compiler/pars.fsy" +//# 6532 "src/Compiler/pars.fsy" let nextToken = rhs parseState 3 if not _3 then reportParseErrorAt nextToken (FSComp.SR.parsMissingTypeArgs()) let zeroWidthAtStartOfNextToken = nextToken.StartRange (rhs parseState 1), None, false, [_2], [], unionRanges (rhs parseState 1) zeroWidthAtStartOfNextToken ) -//# 6323 "src/Compiler/pars.fsy" +//# 6532 "src/Compiler/pars.fsy" : range * range option * bool * SynType list * range list * range)); -//# 17480 "pars.fs" +//# 17929 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 6329 "src/Compiler/pars.fsy" +//# 6538 "src/Compiler/pars.fsy" (rhs parseState 1), Some(rhs parseState 2), true, [], [], lhs parseState ) -//# 6329 "src/Compiler/pars.fsy" +//# 6538 "src/Compiler/pars.fsy" : range * range option * bool * SynType list * range list * range)); -//# 17492 "pars.fs" +//# 17941 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6332 "src/Compiler/pars.fsy" +//# 6541 "src/Compiler/pars.fsy" if not _2 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsExpectedTypeAfterToken()) else @@ -17505,83 +17954,83 @@ let _fsyacc_reductions = lazy [| let zeroWidthAtStartOfNextToken = nextToken.StartRange (rhs parseState 1), None, false, [], [], unionRanges (rhs parseState 1) zeroWidthAtStartOfNextToken ) -//# 6332 "src/Compiler/pars.fsy" +//# 6541 "src/Compiler/pars.fsy" : range * range option * bool * SynType list * range list * range)); -//# 17510 "pars.fs" +//# 17959 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6342 "src/Compiler/pars.fsy" +//# 6551 "src/Compiler/pars.fsy" _1 ) -//# 6342 "src/Compiler/pars.fsy" +//# 6551 "src/Compiler/pars.fsy" : 'gentype_typeArgActual)); -//# 17521 "pars.fs" +//# 17970 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynType in let _3 = parseState.GetInput(3) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6345 "src/Compiler/pars.fsy" +//# 6554 "src/Compiler/pars.fsy" SynType.StaticConstantNamed(_1, _3, unionRanges _1.Range _3.Range) ) -//# 6345 "src/Compiler/pars.fsy" +//# 6554 "src/Compiler/pars.fsy" : 'gentype_typeArgActual)); -//# 17533 "pars.fs" +//# 17982 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynType in Microsoft.FSharp.Core.Operators.box ( ( -//# 6348 "src/Compiler/pars.fsy" +//# 6557 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsMissingTypeArgs()) let dummy = SynType.StaticConstant(SynConst.Int32(0), rhs parseState 2) SynType.StaticConstantNamed(_1, dummy, (rhs2 parseState 1 2)) ) -//# 6348 "src/Compiler/pars.fsy" +//# 6557 "src/Compiler/pars.fsy" : 'gentype_typeArgActual)); -//# 17547 "pars.fs" +//# 17996 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_typeArgActual in Microsoft.FSharp.Core.Operators.box ( ( -//# 6355 "src/Compiler/pars.fsy" +//# 6564 "src/Compiler/pars.fsy" _1 ) -//# 6355 "src/Compiler/pars.fsy" +//# 6564 "src/Compiler/pars.fsy" : 'gentype_typeArgActualOrDummyIfEmpty)); -//# 17558 "pars.fs" +//# 18007 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_dummyTypeArg in Microsoft.FSharp.Core.Operators.box ( ( -//# 6358 "src/Compiler/pars.fsy" +//# 6567 "src/Compiler/pars.fsy" reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsMissingTypeArgs()) _1 ) -//# 6358 "src/Compiler/pars.fsy" +//# 6567 "src/Compiler/pars.fsy" : 'gentype_typeArgActualOrDummyIfEmpty)); -//# 17570 "pars.fs" +//# 18019 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6363 "src/Compiler/pars.fsy" +//# 6572 "src/Compiler/pars.fsy" let m = rhs parseState 1 let dummyStatVal = SynType.StaticConstant(SynConst.Int32(0), m) let dummyName = SynType.LongIdent(SynLongIdent([ident("", m)], [], [None])) let dummyTypeArg = SynType.StaticConstantNamed(dummyName, dummyStatVal, m) dummyTypeArg ) -//# 6363 "src/Compiler/pars.fsy" +//# 6572 "src/Compiler/pars.fsy" : 'gentype_dummyTypeArg)); -//# 17584 "pars.fs" +//# 18033 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _2 = parseState.GetInput(2) :?> 'gentype_measureTypeExpr in @@ -17589,76 +18038,76 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6371 "src/Compiler/pars.fsy" +//# 6580 "src/Compiler/pars.fsy" let mLess = rhs parseState 1 let mGreater = rhs parseState 3 let trivia = { LessRange = mLess; GreaterRange = mGreater } _2, trivia ) -//# 6371 "src/Compiler/pars.fsy" +//# 6580 "src/Compiler/pars.fsy" : 'gentype_measureTypeArg)); -//# 17600 "pars.fs" +//# 18049 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in let _3 = parseState.GetInput(3) :?> bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 6377 "src/Compiler/pars.fsy" +//# 6586 "src/Compiler/pars.fsy" let mLess = rhs parseState 1 let mGreater = rhs parseState 3 let trivia = { LessRange = mLess; GreaterRange = mGreater } SynMeasure.Anon(rhs parseState 2), trivia ) -//# 6377 "src/Compiler/pars.fsy" +//# 6586 "src/Compiler/pars.fsy" : 'gentype_measureTypeArg)); -//# 17615 "pars.fs" +//# 18064 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 6384 "src/Compiler/pars.fsy" +//# 6593 "src/Compiler/pars.fsy" SynMeasure.Named(_1.LongIdent, _1.Range) ) -//# 6384 "src/Compiler/pars.fsy" +//# 6593 "src/Compiler/pars.fsy" : 'gentype_measureTypeAtom)); -//# 17626 "pars.fs" +//# 18075 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynTypar in Microsoft.FSharp.Core.Operators.box ( ( -//# 6387 "src/Compiler/pars.fsy" +//# 6596 "src/Compiler/pars.fsy" SynMeasure.Var(_1, lhs parseState) ) -//# 6387 "src/Compiler/pars.fsy" +//# 6596 "src/Compiler/pars.fsy" : 'gentype_measureTypeAtom)); -//# 17637 "pars.fs" +//# 18086 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_measureTypeExpr in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6390 "src/Compiler/pars.fsy" +//# 6599 "src/Compiler/pars.fsy" let mParen = rhs2 parseState 1 3 SynMeasure.Paren(_2, mParen) ) -//# 6390 "src/Compiler/pars.fsy" +//# 6599 "src/Compiler/pars.fsy" : 'gentype_measureTypeAtom)); -//# 17650 "pars.fs" +//# 18099 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_measureTypeAtom in Microsoft.FSharp.Core.Operators.box ( ( -//# 6395 "src/Compiler/pars.fsy" +//# 6604 "src/Compiler/pars.fsy" _1 ) -//# 6395 "src/Compiler/pars.fsy" +//# 6604 "src/Compiler/pars.fsy" : 'gentype_measureTypePower)); -//# 17661 "pars.fs" +//# 18110 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_measureTypeAtom in let _2 = parseState.GetInput(2) :?> string in @@ -17666,7 +18115,7 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6398 "src/Compiler/pars.fsy" +//# 6607 "src/Compiler/pars.fsy" if _2 <> "^" && _2 <> "^-" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedOperatorForUnitOfMeasure()) if _2 = "^-" then let mOp = rhs parseState 2 @@ -17677,68 +18126,68 @@ let _fsyacc_reductions = lazy [| SynMeasure.Power(_1, mCaret, SynRationalConst.Negate(_3, mNegate), lhs parseState) else SynMeasure.Power(_1, rhs parseState 2, _3, lhs parseState) ) -//# 6398 "src/Compiler/pars.fsy" +//# 6607 "src/Compiler/pars.fsy" : 'gentype_measureTypePower)); -//# 17682 "pars.fs" +//# 18131 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> int32 * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 6409 "src/Compiler/pars.fsy" +//# 6618 "src/Compiler/pars.fsy" if fst _1 <> 1 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedIntegerLiteralForUnitOfMeasure()) let m = rhs parseState 1 SynMeasure.One(m) ) -//# 6409 "src/Compiler/pars.fsy" +//# 6618 "src/Compiler/pars.fsy" : 'gentype_measureTypePower)); -//# 17695 "pars.fs" +//# 18144 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_measureTypePower in Microsoft.FSharp.Core.Operators.box ( ( -//# 6415 "src/Compiler/pars.fsy" +//# 6624 "src/Compiler/pars.fsy" [_1] ) -//# 6415 "src/Compiler/pars.fsy" +//# 6624 "src/Compiler/pars.fsy" : 'gentype_measureTypeSeq)); -//# 17706 "pars.fs" +//# 18155 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_measureTypePower in let _2 = parseState.GetInput(2) :?> 'gentype_measureTypeSeq in Microsoft.FSharp.Core.Operators.box ( ( -//# 6418 "src/Compiler/pars.fsy" +//# 6627 "src/Compiler/pars.fsy" _1 :: _2 ) -//# 6418 "src/Compiler/pars.fsy" +//# 6627 "src/Compiler/pars.fsy" : 'gentype_measureTypeSeq)); -//# 17718 "pars.fs" +//# 18167 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_measureTypeSeq in Microsoft.FSharp.Core.Operators.box ( ( -//# 6422 "src/Compiler/pars.fsy" +//# 6631 "src/Compiler/pars.fsy" SynMeasure.Seq(_1, lhs parseState) ) -//# 6422 "src/Compiler/pars.fsy" +//# 6631 "src/Compiler/pars.fsy" : 'gentype_measureTypeExpr)); -//# 17729 "pars.fs" +//# 18178 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_measureTypeExpr in let _3 = parseState.GetInput(3) :?> 'gentype_measureTypeExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 6425 "src/Compiler/pars.fsy" +//# 6634 "src/Compiler/pars.fsy" SynMeasure.Product(_1, rhs parseState 2, _3, lhs parseState) ) -//# 6425 "src/Compiler/pars.fsy" +//# 6634 "src/Compiler/pars.fsy" : 'gentype_measureTypeExpr)); -//# 17741 "pars.fs" +//# 18190 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_measureTypeExpr in let _2 = parseState.GetInput(2) :?> string in @@ -17746,1072 +18195,1031 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6428 "src/Compiler/pars.fsy" +//# 6637 "src/Compiler/pars.fsy" if _2 <> "*" && _2 <> "/" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedOperatorForUnitOfMeasure()) if _2 = "*" then SynMeasure.Product(_1, rhs parseState 2, _3, lhs parseState) else SynMeasure.Divide(Some _1, rhs parseState 2, _3, lhs parseState) ) -//# 6428 "src/Compiler/pars.fsy" +//# 6637 "src/Compiler/pars.fsy" : 'gentype_measureTypeExpr)); -//# 17756 "pars.fs" +//# 18205 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> 'gentype_measureTypeExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 6433 "src/Compiler/pars.fsy" +//# 6642 "src/Compiler/pars.fsy" if _1 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedOperatorForUnitOfMeasure()) SynMeasure.Divide(None, rhs parseState 1, _2, lhs parseState) ) -//# 6433 "src/Compiler/pars.fsy" +//# 6642 "src/Compiler/pars.fsy" : 'gentype_measureTypeExpr)); -//# 17769 "pars.fs" +//# 18218 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6438 "src/Compiler/pars.fsy" +//# 6647 "src/Compiler/pars.fsy" let id = mkSynId (lhs parseState) (_2).idText SynTypar(id, TyparStaticReq.None, false) ) -//# 6438 "src/Compiler/pars.fsy" +//# 6647 "src/Compiler/pars.fsy" : SynTypar)); -//# 17781 "pars.fs" +//# 18230 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in let _2 = parseState.GetInput(2) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6442 "src/Compiler/pars.fsy" +//# 6651 "src/Compiler/pars.fsy" if _1 <> "^" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.tcUnexpectedSymbolInTypeExpression(_1)) let id = mkSynId (lhs parseState) (_2).idText SynTypar(id, TyparStaticReq.HeadType, false) ) -//# 6442 "src/Compiler/pars.fsy" +//# 6651 "src/Compiler/pars.fsy" : SynTypar)); -//# 17795 "pars.fs" +//# 18244 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6448 "src/Compiler/pars.fsy" +//# 6657 "src/Compiler/pars.fsy" ident(_1, rhs parseState 1) ) -//# 6448 "src/Compiler/pars.fsy" +//# 6657 "src/Compiler/pars.fsy" : Ident)); -//# 17806 "pars.fs" +//# 18255 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6453 "src/Compiler/pars.fsy" +//# 6662 "src/Compiler/pars.fsy" SynLongIdent([ident(MangledGlobalName, rhs parseState 1)], [], [Some(IdentTrivia.OriginalNotation "global")]) ) -//# 6453 "src/Compiler/pars.fsy" +//# 6662 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 17816 "pars.fs" +//# 18265 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6456 "src/Compiler/pars.fsy" +//# 6665 "src/Compiler/pars.fsy" SynLongIdent([_1], [], [None]) ) -//# 6456 "src/Compiler/pars.fsy" +//# 6665 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 17827 "pars.fs" +//# 18276 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in let _3 = parseState.GetInput(3) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6459 "src/Compiler/pars.fsy" +//# 6668 "src/Compiler/pars.fsy" let (SynLongIdent(lid, dotms, trivia)) = _1 SynLongIdent(lid @ [_3], dotms @ [rhs parseState 2], trivia @ [None]) ) -//# 6459 "src/Compiler/pars.fsy" +//# 6668 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 17840 "pars.fs" +//# 18289 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynLongIdent in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6463 "src/Compiler/pars.fsy" +//# 6672 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectedNameAfterToken()) let (SynLongIdent(lid, dotms, trivia)) = _1 SynLongIdent(lid, dotms @ [rhs parseState 2], trivia) ) -//# 6463 "src/Compiler/pars.fsy" +//# 6672 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 17854 "pars.fs" +//# 18303 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_operatorName in let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6471 "src/Compiler/pars.fsy" +//# 6680 "src/Compiler/pars.fsy" let lpr = rhs parseState 1 let rpr = rhs parseState 3 ident(CompileOpName _2, rhs parseState 2), IdentTrivia.OriginalNotationWithParen(lpr, _2, rpr) ) -//# 6471 "src/Compiler/pars.fsy" +//# 6680 "src/Compiler/pars.fsy" : 'gentype_opName)); -//# 17868 "pars.fs" +//# 18317 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _3 = parseState.GetInput(3) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6476 "src/Compiler/pars.fsy" +//# 6685 "src/Compiler/pars.fsy" reportParseErrorAt (lhs parseState) (FSComp.SR.parsErrorParsingAsOperatorName()) let lpr = rhs parseState 1 let rpr = rhs parseState 3 ident(CompileOpName "****", rhs parseState 2), IdentTrivia.HasParenthesis(lpr, rpr) ) -//# 6476 "src/Compiler/pars.fsy" +//# 6685 "src/Compiler/pars.fsy" : 'gentype_opName)); -//# 17882 "pars.fs" +//# 18331 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6482 "src/Compiler/pars.fsy" +//# 6691 "src/Compiler/pars.fsy" let m = rhs parseState 1 let lpr = mkFileIndexRange m.FileIndex m.Start m.Start let rpr = mkFileIndexRange m.FileIndex m.End m.End ident(CompileOpName "*", rhs parseState 1), IdentTrivia.OriginalNotationWithParen(lpr, "*", rpr) ) -//# 6482 "src/Compiler/pars.fsy" +//# 6691 "src/Compiler/pars.fsy" : 'gentype_opName)); -//# 17895 "pars.fs" +//# 18344 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_activePatternCaseNames in let _4 = parseState.GetInput(4) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6489 "src/Compiler/pars.fsy" +//# 6698 "src/Compiler/pars.fsy" let lpr = rhs parseState 1 let text = ("|" + String.concat "|" (List.rev _2) + "|") let rpr = rhs parseState 4 ident(text, rhs2 parseState 2 3), IdentTrivia.HasParenthesis(lpr, rpr) ) -//# 6489 "src/Compiler/pars.fsy" +//# 6698 "src/Compiler/pars.fsy" : 'gentype_opName)); -//# 17910 "pars.fs" +//# 18359 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_activePatternCaseNames in let _6 = parseState.GetInput(6) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6496 "src/Compiler/pars.fsy" +//# 6705 "src/Compiler/pars.fsy" let lpr = rhs parseState 1 let text = ("|" + String.concat "|" (List.rev _2) + "|_|") let rpr = rhs parseState 6 ident(text, rhs2 parseState 2 5), IdentTrivia.HasParenthesis(lpr, rpr) ) -//# 6496 "src/Compiler/pars.fsy" +//# 6705 "src/Compiler/pars.fsy" : 'gentype_opName)); -//# 17925 "pars.fs" +//# 18374 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6504 "src/Compiler/pars.fsy" +//# 6713 "src/Compiler/pars.fsy" if not (IsValidPrefixOperatorDefinitionName _1) then reportParseErrorAt (lhs parseState) (FSComp.SR.parsInvalidPrefixOperatorDefinition()) _1 ) -//# 6504 "src/Compiler/pars.fsy" +//# 6713 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 17938 "pars.fs" +//# 18387 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6509 "src/Compiler/pars.fsy" +//# 6718 "src/Compiler/pars.fsy" _1 ) -//# 6509 "src/Compiler/pars.fsy" +//# 6718 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 17949 "pars.fs" +//# 18398 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6512 "src/Compiler/pars.fsy" +//# 6721 "src/Compiler/pars.fsy" _1 ) -//# 6512 "src/Compiler/pars.fsy" +//# 6721 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 17960 "pars.fs" +//# 18409 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6515 "src/Compiler/pars.fsy" +//# 6724 "src/Compiler/pars.fsy" _1 ) -//# 6515 "src/Compiler/pars.fsy" +//# 6724 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 17971 "pars.fs" +//# 18420 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6518 "src/Compiler/pars.fsy" +//# 6727 "src/Compiler/pars.fsy" _1 ) -//# 6518 "src/Compiler/pars.fsy" +//# 6727 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 17982 "pars.fs" +//# 18431 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6521 "src/Compiler/pars.fsy" +//# 6730 "src/Compiler/pars.fsy" _1 ) -//# 6521 "src/Compiler/pars.fsy" +//# 6730 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 17993 "pars.fs" +//# 18442 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6524 "src/Compiler/pars.fsy" +//# 6733 "src/Compiler/pars.fsy" _1 ) -//# 6524 "src/Compiler/pars.fsy" +//# 6733 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18004 "pars.fs" +//# 18453 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6527 "src/Compiler/pars.fsy" +//# 6736 "src/Compiler/pars.fsy" _1 ) -//# 6527 "src/Compiler/pars.fsy" +//# 6736 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18015 "pars.fs" +//# 18464 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6530 "src/Compiler/pars.fsy" +//# 6739 "src/Compiler/pars.fsy" "$" ) -//# 6530 "src/Compiler/pars.fsy" +//# 6739 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18025 "pars.fs" +//# 18474 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6533 "src/Compiler/pars.fsy" +//# 6742 "src/Compiler/pars.fsy" _1 ) -//# 6533 "src/Compiler/pars.fsy" +//# 6742 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18036 "pars.fs" +//# 18485 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6536 "src/Compiler/pars.fsy" +//# 6745 "src/Compiler/pars.fsy" "-" ) -//# 6536 "src/Compiler/pars.fsy" +//# 6745 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18046 "pars.fs" +//# 18495 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6539 "src/Compiler/pars.fsy" +//# 6748 "src/Compiler/pars.fsy" "*" ) -//# 6539 "src/Compiler/pars.fsy" +//# 6748 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18056 "pars.fs" +//# 18505 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6542 "src/Compiler/pars.fsy" +//# 6751 "src/Compiler/pars.fsy" "=" ) -//# 6542 "src/Compiler/pars.fsy" +//# 6751 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18066 "pars.fs" +//# 18515 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6545 "src/Compiler/pars.fsy" +//# 6754 "src/Compiler/pars.fsy" "or" ) -//# 6545 "src/Compiler/pars.fsy" +//# 6754 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18076 "pars.fs" +//# 18525 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 6548 "src/Compiler/pars.fsy" +//# 6757 "src/Compiler/pars.fsy" "<" ) -//# 6548 "src/Compiler/pars.fsy" +//# 6757 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18087 "pars.fs" +//# 18536 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 6551 "src/Compiler/pars.fsy" +//# 6760 "src/Compiler/pars.fsy" ">" ) -//# 6551 "src/Compiler/pars.fsy" +//# 6760 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18098 "pars.fs" +//# 18547 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6554 "src/Compiler/pars.fsy" +//# 6763 "src/Compiler/pars.fsy" "?" ) -//# 6554 "src/Compiler/pars.fsy" +//# 6763 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18108 "pars.fs" +//# 18557 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6557 "src/Compiler/pars.fsy" +//# 6766 "src/Compiler/pars.fsy" "&" ) -//# 6557 "src/Compiler/pars.fsy" +//# 6766 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18118 "pars.fs" +//# 18567 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6560 "src/Compiler/pars.fsy" +//# 6769 "src/Compiler/pars.fsy" "&&" ) -//# 6560 "src/Compiler/pars.fsy" +//# 6769 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18128 "pars.fs" +//# 18577 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6563 "src/Compiler/pars.fsy" +//# 6772 "src/Compiler/pars.fsy" "||" ) -//# 6563 "src/Compiler/pars.fsy" +//# 6772 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18138 "pars.fs" +//# 18587 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6566 "src/Compiler/pars.fsy" +//# 6775 "src/Compiler/pars.fsy" ":=" ) -//# 6566 "src/Compiler/pars.fsy" +//# 6775 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18148 "pars.fs" +//# 18597 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6569 "src/Compiler/pars.fsy" +//# 6778 "src/Compiler/pars.fsy" if _1 <> ".[]" && _1 <> ".()" && _1 <> ".()<-" then deprecatedOperator (lhs parseState) _1 ) -//# 6569 "src/Compiler/pars.fsy" +//# 6778 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18161 "pars.fs" +//# 18610 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6574 "src/Compiler/pars.fsy" +//# 6783 "src/Compiler/pars.fsy" _1 ) -//# 6574 "src/Compiler/pars.fsy" +//# 6783 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18172 "pars.fs" +//# 18621 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6577 "src/Compiler/pars.fsy" +//# 6786 "src/Compiler/pars.fsy" ".." ) -//# 6577 "src/Compiler/pars.fsy" +//# 6786 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18182 "pars.fs" +//# 18631 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6580 "src/Compiler/pars.fsy" +//# 6789 "src/Compiler/pars.fsy" ".. .." ) -//# 6580 "src/Compiler/pars.fsy" +//# 6789 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18192 "pars.fs" +//# 18641 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * bool in let _2 = parseState.GetInput(2) :?> string * bool in Microsoft.FSharp.Core.Operators.box ( ( -//# 6583 "src/Compiler/pars.fsy" +//# 6792 "src/Compiler/pars.fsy" if _1 <> _2 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsMismatchedQuotationName(fst _1)) fst _1 ) -//# 6583 "src/Compiler/pars.fsy" +//# 6792 "src/Compiler/pars.fsy" : 'gentype_operatorName)); -//# 18205 "pars.fs" +//# 18654 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6589 "src/Compiler/pars.fsy" +//# 6798 "src/Compiler/pars.fsy" if not (String.isLeadingIdentifierCharacterUpperCase _1) then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsActivePatternCaseMustBeginWithUpperCase()) if (_1.IndexOf('|') <> -1) then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsActivePatternCaseContainsPipe()) _1 ) -//# 6589 "src/Compiler/pars.fsy" +//# 6798 "src/Compiler/pars.fsy" : 'gentype_activePatternCaseName)); -//# 18218 "pars.fs" +//# 18667 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_activePatternCaseName in Microsoft.FSharp.Core.Operators.box ( ( -//# 6596 "src/Compiler/pars.fsy" +//# 6805 "src/Compiler/pars.fsy" [_2] ) -//# 6596 "src/Compiler/pars.fsy" +//# 6805 "src/Compiler/pars.fsy" : 'gentype_activePatternCaseNames)); -//# 18229 "pars.fs" +//# 18678 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_activePatternCaseNames in let _3 = parseState.GetInput(3) :?> 'gentype_activePatternCaseName in Microsoft.FSharp.Core.Operators.box ( ( -//# 6599 "src/Compiler/pars.fsy" +//# 6808 "src/Compiler/pars.fsy" _3 :: _1 ) -//# 6599 "src/Compiler/pars.fsy" +//# 6808 "src/Compiler/pars.fsy" : 'gentype_activePatternCaseNames)); -//# 18241 "pars.fs" +//# 18690 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6604 "src/Compiler/pars.fsy" +//# 6813 "src/Compiler/pars.fsy" SynIdent(_1, None) ) -//# 6604 "src/Compiler/pars.fsy" +//# 6813 "src/Compiler/pars.fsy" : 'gentype_identOrOp)); -//# 18252 "pars.fs" +//# 18701 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opName in Microsoft.FSharp.Core.Operators.box ( ( -//# 6607 "src/Compiler/pars.fsy" +//# 6816 "src/Compiler/pars.fsy" let ident, trivia = _1 SynIdent(ident, Some trivia) ) -//# 6607 "src/Compiler/pars.fsy" +//# 6816 "src/Compiler/pars.fsy" : 'gentype_identOrOp)); -//# 18264 "pars.fs" +//# 18713 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6614 "src/Compiler/pars.fsy" +//# 6823 "src/Compiler/pars.fsy" SynLongIdent([_1], [], [None]) ) -//# 6614 "src/Compiler/pars.fsy" +//# 6823 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 18275 "pars.fs" +//# 18724 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opName in Microsoft.FSharp.Core.Operators.box ( ( -//# 6617 "src/Compiler/pars.fsy" +//# 6826 "src/Compiler/pars.fsy" let ident, trivia = _1 SynLongIdent([ident], [], [Some trivia]) ) -//# 6617 "src/Compiler/pars.fsy" +//# 6826 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 18287 "pars.fs" +//# 18736 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> SynLongIdent in Microsoft.FSharp.Core.Operators.box ( ( -//# 6621 "src/Compiler/pars.fsy" +//# 6830 "src/Compiler/pars.fsy" prependIdentInLongIdentWithTrivia (SynIdent(_1, None)) (rhs parseState 2) _3 ) -//# 6621 "src/Compiler/pars.fsy" +//# 6830 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 18299 "pars.fs" +//# 18748 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in let _3 = parseState.GetInput(3) :?> 'gentype_ends_coming_soon_or_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6624 "src/Compiler/pars.fsy" +//# 6833 "src/Compiler/pars.fsy" if not _3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsIdentifierExpected()) SynLongIdent([_1], [rhs parseState 2], [None]) ) -//# 6624 "src/Compiler/pars.fsy" +//# 6833 "src/Compiler/pars.fsy" : SynLongIdent)); -//# 18312 "pars.fs" +//# 18761 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_identOrOp in Microsoft.FSharp.Core.Operators.box ( ( -//# 6630 "src/Compiler/pars.fsy" +//# 6839 "src/Compiler/pars.fsy" _1 ) -//# 6630 "src/Compiler/pars.fsy" +//# 6839 "src/Compiler/pars.fsy" : 'gentype_nameop)); -//# 18323 "pars.fs" +//# 18772 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6634 "src/Compiler/pars.fsy" +//# 6843 "src/Compiler/pars.fsy" if _1.idText = "" then SynExpr.FromParseError(SynExpr.Ident(_1), _1.idRange) else SynExpr.Ident(_1) ) -//# 6634 "src/Compiler/pars.fsy" +//# 6843 "src/Compiler/pars.fsy" : 'gentype_identExpr)); -//# 18337 "pars.fs" +//# 18786 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_opName in Microsoft.FSharp.Core.Operators.box ( ( -//# 6640 "src/Compiler/pars.fsy" +//# 6849 "src/Compiler/pars.fsy" let m = lhs parseState let ident, trivia = _1 SynExpr.LongIdent(false, SynLongIdent([ident], [], [Some trivia]), None, m) ) -//# 6640 "src/Compiler/pars.fsy" +//# 6849 "src/Compiler/pars.fsy" : 'gentype_identExpr)); -//# 18350 "pars.fs" +//# 18799 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6645 "src/Compiler/pars.fsy" +//# 6854 "src/Compiler/pars.fsy" ) -//# 6645 "src/Compiler/pars.fsy" +//# 6854 "src/Compiler/pars.fsy" : 'gentype_topSeparator)); -//# 18360 "pars.fs" +//# 18809 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6646 "src/Compiler/pars.fsy" +//# 6855 "src/Compiler/pars.fsy" ) -//# 6646 "src/Compiler/pars.fsy" +//# 6855 "src/Compiler/pars.fsy" : 'gentype_topSeparator)); -//# 18370 "pars.fs" +//# 18819 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6647 "src/Compiler/pars.fsy" +//# 6856 "src/Compiler/pars.fsy" ) -//# 6647 "src/Compiler/pars.fsy" +//# 6856 "src/Compiler/pars.fsy" : 'gentype_topSeparator)); -//# 18380 "pars.fs" +//# 18829 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topSeparator in Microsoft.FSharp.Core.Operators.box ( ( -//# 6650 "src/Compiler/pars.fsy" +//# 6859 "src/Compiler/pars.fsy" ) -//# 6650 "src/Compiler/pars.fsy" +//# 6859 "src/Compiler/pars.fsy" : 'gentype_topSeparators)); -//# 18391 "pars.fs" +//# 18840 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topSeparator in let _2 = parseState.GetInput(2) :?> 'gentype_topSeparators in Microsoft.FSharp.Core.Operators.box ( ( -//# 6651 "src/Compiler/pars.fsy" +//# 6860 "src/Compiler/pars.fsy" ) -//# 6651 "src/Compiler/pars.fsy" +//# 6860 "src/Compiler/pars.fsy" : 'gentype_topSeparators)); -//# 18403 "pars.fs" +//# 18852 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_topSeparator in let _2 = parseState.GetInput(2) :?> 'gentype_opt_topSeparators in Microsoft.FSharp.Core.Operators.box ( ( -//# 6654 "src/Compiler/pars.fsy" +//# 6863 "src/Compiler/pars.fsy" ) -//# 6654 "src/Compiler/pars.fsy" +//# 6863 "src/Compiler/pars.fsy" : 'gentype_opt_topSeparators)); -//# 18415 "pars.fs" +//# 18864 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6655 "src/Compiler/pars.fsy" +//# 6864 "src/Compiler/pars.fsy" ) -//# 6655 "src/Compiler/pars.fsy" +//# 6864 "src/Compiler/pars.fsy" : 'gentype_opt_topSeparators)); -//# 18425 "pars.fs" +//# 18874 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6659 "src/Compiler/pars.fsy" - +//# 6868 "src/Compiler/pars.fsy" + None ) -//# 6659 "src/Compiler/pars.fsy" +//# 6868 "src/Compiler/pars.fsy" : 'gentype_seps)); -//# 18435 "pars.fs" +//# 18884 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6660 "src/Compiler/pars.fsy" - +//# 6869 "src/Compiler/pars.fsy" + Some (rhs parseState 1) ) -//# 6660 "src/Compiler/pars.fsy" +//# 6869 "src/Compiler/pars.fsy" : 'gentype_seps)); -//# 18445 "pars.fs" +//# 18894 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6661 "src/Compiler/pars.fsy" - +//# 6870 "src/Compiler/pars.fsy" + Some (rhs parseState 2) ) -//# 6661 "src/Compiler/pars.fsy" +//# 6870 "src/Compiler/pars.fsy" : 'gentype_seps)); -//# 18455 "pars.fs" +//# 18904 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6662 "src/Compiler/pars.fsy" - +//# 6871 "src/Compiler/pars.fsy" + Some (rhs parseState 1) ) -//# 6662 "src/Compiler/pars.fsy" +//# 6871 "src/Compiler/pars.fsy" : 'gentype_seps)); -//# 18465 "pars.fs" +//# 18914 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6667 "src/Compiler/pars.fsy" +//# 6876 "src/Compiler/pars.fsy" ) -//# 6667 "src/Compiler/pars.fsy" +//# 6876 "src/Compiler/pars.fsy" : 'gentype_declEnd)); -//# 18476 "pars.fs" +//# 18925 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6669 "src/Compiler/pars.fsy" +//# 6878 "src/Compiler/pars.fsy" ) -//# 6669 "src/Compiler/pars.fsy" +//# 6878 "src/Compiler/pars.fsy" : 'gentype_declEnd)); -//# 18486 "pars.fs" +//# 18935 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6671 "src/Compiler/pars.fsy" +//# 6880 "src/Compiler/pars.fsy" ) -//# 6671 "src/Compiler/pars.fsy" +//# 6880 "src/Compiler/pars.fsy" : 'gentype_declEnd)); -//# 18496 "pars.fs" +//# 18945 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6676 "src/Compiler/pars.fsy" +//# 6885 "src/Compiler/pars.fsy" ) -//# 6676 "src/Compiler/pars.fsy" +//# 6885 "src/Compiler/pars.fsy" : 'gentype_opt_declEnd)); -//# 18507 "pars.fs" +//# 18956 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6678 "src/Compiler/pars.fsy" +//# 6887 "src/Compiler/pars.fsy" ) -//# 6678 "src/Compiler/pars.fsy" +//# 6887 "src/Compiler/pars.fsy" : 'gentype_opt_declEnd)); -//# 18517 "pars.fs" +//# 18966 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6680 "src/Compiler/pars.fsy" +//# 6889 "src/Compiler/pars.fsy" ) -//# 6680 "src/Compiler/pars.fsy" +//# 6889 "src/Compiler/pars.fsy" : 'gentype_opt_declEnd)); -//# 18527 "pars.fs" +//# 18976 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6682 "src/Compiler/pars.fsy" +//# 6891 "src/Compiler/pars.fsy" ) -//# 6682 "src/Compiler/pars.fsy" +//# 6891 "src/Compiler/pars.fsy" : 'gentype_opt_declEnd)); -//# 18537 "pars.fs" +//# 18986 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6685 "src/Compiler/pars.fsy" +//# 6894 "src/Compiler/pars.fsy" ) -//# 6685 "src/Compiler/pars.fsy" +//# 6894 "src/Compiler/pars.fsy" : 'gentype_opt_ODECLEND)); -//# 18548 "pars.fs" +//# 18997 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6686 "src/Compiler/pars.fsy" +//# 6895 "src/Compiler/pars.fsy" ) -//# 6686 "src/Compiler/pars.fsy" +//# 6895 "src/Compiler/pars.fsy" : 'gentype_opt_ODECLEND)); -//# 18558 "pars.fs" +//# 19007 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6689 "src/Compiler/pars.fsy" +//# 6898 "src/Compiler/pars.fsy" deprecatedWithError (FSComp.SR.parsNoEqualShouldFollowNamespace()) (lhs parseState); () ) -//# 6689 "src/Compiler/pars.fsy" +//# 6898 "src/Compiler/pars.fsy" : 'gentype_deprecated_opt_equals)); -//# 18568 "pars.fs" +//# 19017 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6690 "src/Compiler/pars.fsy" +//# 6899 "src/Compiler/pars.fsy" ) -//# 6690 "src/Compiler/pars.fsy" +//# 6899 "src/Compiler/pars.fsy" : 'gentype_deprecated_opt_equals)); -//# 18578 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 6694 "src/Compiler/pars.fsy" - let mEquals = rhs parseState 1 - Some mEquals - ) -//# 6694 "src/Compiler/pars.fsy" - : 'gentype_opt_equals)); -//# 18589 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 6696 "src/Compiler/pars.fsy" - None - ) -//# 6696 "src/Compiler/pars.fsy" - : 'gentype_opt_equals)); -//# 18599 "pars.fs" +//# 19027 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6699 "src/Compiler/pars.fsy" +//# 6902 "src/Compiler/pars.fsy" ) -//# 6699 "src/Compiler/pars.fsy" +//# 6902 "src/Compiler/pars.fsy" : 'gentype_opt_OBLOCKSEP)); -//# 18609 "pars.fs" +//# 19037 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6700 "src/Compiler/pars.fsy" +//# 6903 "src/Compiler/pars.fsy" ) -//# 6700 "src/Compiler/pars.fsy" +//# 6903 "src/Compiler/pars.fsy" : 'gentype_opt_OBLOCKSEP)); -//# 18619 "pars.fs" +//# 19047 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_seps in Microsoft.FSharp.Core.Operators.box ( ( -//# 6703 "src/Compiler/pars.fsy" +//# 6906 "src/Compiler/pars.fsy" ) -//# 6703 "src/Compiler/pars.fsy" +//# 6906 "src/Compiler/pars.fsy" : 'gentype_opt_seps)); -//# 18630 "pars.fs" +//# 19058 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6704 "src/Compiler/pars.fsy" +//# 6907 "src/Compiler/pars.fsy" ) -//# 6704 "src/Compiler/pars.fsy" +//# 6907 "src/Compiler/pars.fsy" : 'gentype_opt_seps)); -//# 18640 "pars.fs" +//# 19068 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6707 "src/Compiler/pars.fsy" +//# 6910 "src/Compiler/pars.fsy" true ) -//# 6707 "src/Compiler/pars.fsy" +//# 6910 "src/Compiler/pars.fsy" : 'gentype_opt_rec)); -//# 18650 "pars.fs" +//# 19078 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6708 "src/Compiler/pars.fsy" +//# 6911 "src/Compiler/pars.fsy" false ) -//# 6708 "src/Compiler/pars.fsy" +//# 6911 "src/Compiler/pars.fsy" : 'gentype_opt_rec)); -//# 18660 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 6711 "src/Compiler/pars.fsy" - - ) -//# 6711 "src/Compiler/pars.fsy" - : 'gentype_opt_bar)); -//# 18670 "pars.fs" +//# 19088 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6712 "src/Compiler/pars.fsy" - - ) -//# 6712 "src/Compiler/pars.fsy" - : 'gentype_opt_bar)); -//# 18680 "pars.fs" - (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> - Microsoft.FSharp.Core.Operators.box - ( - ( -//# 6715 "src/Compiler/pars.fsy" +//# 6914 "src/Compiler/pars.fsy" Some(rhs parseState 1) ) -//# 6715 "src/Compiler/pars.fsy" +//# 6914 "src/Compiler/pars.fsy" : 'gentype_opt_inline)); -//# 18690 "pars.fs" +//# 19098 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6716 "src/Compiler/pars.fsy" +//# 6915 "src/Compiler/pars.fsy" None ) -//# 6716 "src/Compiler/pars.fsy" +//# 6915 "src/Compiler/pars.fsy" : 'gentype_opt_inline)); -//# 18700 "pars.fs" +//# 19108 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6719 "src/Compiler/pars.fsy" +//# 6918 "src/Compiler/pars.fsy" Some(rhs parseState 1) ) -//# 6719 "src/Compiler/pars.fsy" +//# 6918 "src/Compiler/pars.fsy" : 'gentype_opt_mutable)); -//# 18710 "pars.fs" +//# 19118 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6720 "src/Compiler/pars.fsy" +//# 6919 "src/Compiler/pars.fsy" None ) -//# 6720 "src/Compiler/pars.fsy" +//# 6919 "src/Compiler/pars.fsy" : 'gentype_opt_mutable)); -//# 18720 "pars.fs" +//# 19128 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6724 "src/Compiler/pars.fsy" +//# 6923 "src/Compiler/pars.fsy" ) -//# 6724 "src/Compiler/pars.fsy" +//# 6923 "src/Compiler/pars.fsy" : 'gentype_doToken)); -//# 18730 "pars.fs" +//# 19138 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6725 "src/Compiler/pars.fsy" +//# 6924 "src/Compiler/pars.fsy" ) -//# 6725 "src/Compiler/pars.fsy" +//# 6924 "src/Compiler/pars.fsy" : 'gentype_doToken)); -//# 18740 "pars.fs" +//# 19148 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6729 "src/Compiler/pars.fsy" +//# 6928 "src/Compiler/pars.fsy" rhs parseState 1 ) -//# 6729 "src/Compiler/pars.fsy" +//# 6928 "src/Compiler/pars.fsy" : 'gentype_doneDeclEnd)); -//# 18750 "pars.fs" +//# 19158 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6731 "src/Compiler/pars.fsy" +//# 6930 "src/Compiler/pars.fsy" _1 ) -//# 6731 "src/Compiler/pars.fsy" +//# 6930 "src/Compiler/pars.fsy" : 'gentype_doneDeclEnd)); -//# 18761 "pars.fs" +//# 19169 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6735 "src/Compiler/pars.fsy" +//# 6934 "src/Compiler/pars.fsy" if parseState.LexBuffer.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatError (FSComp.SR.mlCompatStructEndNoLongerSupported()) (lhs parseState) else mlCompatWarning (FSComp.SR.parsSyntaxModuleStructEndDeprecated()) (lhs parseState) ) -//# 6735 "src/Compiler/pars.fsy" +//# 6934 "src/Compiler/pars.fsy" : 'gentype_structOrBegin)); -//# 18775 "pars.fs" +//# 19183 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6740 "src/Compiler/pars.fsy" +//# 6939 "src/Compiler/pars.fsy" ) -//# 6740 "src/Compiler/pars.fsy" +//# 6939 "src/Compiler/pars.fsy" : 'gentype_structOrBegin)); -//# 18785 "pars.fs" +//# 19193 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6744 "src/Compiler/pars.fsy" +//# 6943 "src/Compiler/pars.fsy" if parseState.LexBuffer.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatError (FSComp.SR.mlCompatSigEndNoLongerSupported())(lhs parseState) else mlCompatWarning (FSComp.SR.parsSyntaxModuleSigEndDeprecated()) (lhs parseState) ) -//# 6744 "src/Compiler/pars.fsy" +//# 6943 "src/Compiler/pars.fsy" : 'gentype_sigOrBegin)); -//# 18799 "pars.fs" +//# 19207 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6749 "src/Compiler/pars.fsy" +//# 6948 "src/Compiler/pars.fsy" ) -//# 6749 "src/Compiler/pars.fsy" +//# 6948 "src/Compiler/pars.fsy" : 'gentype_sigOrBegin)); -//# 18809 "pars.fs" +//# 19217 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6753 "src/Compiler/pars.fsy" +//# 6952 "src/Compiler/pars.fsy" if parseState.LexBuffer.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatError (FSComp.SR.mlCompatSigColonNoLongerSupported())(lhs parseState) else @@ -18819,77 +19227,77 @@ let _fsyacc_reductions = lazy [| None ) -//# 6753 "src/Compiler/pars.fsy" +//# 6952 "src/Compiler/pars.fsy" : 'gentype_colonOrEquals)); -//# 18824 "pars.fs" +//# 19232 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6760 "src/Compiler/pars.fsy" +//# 6959 "src/Compiler/pars.fsy" let mEquals = rhs parseState 1 Some mEquals ) -//# 6760 "src/Compiler/pars.fsy" +//# 6959 "src/Compiler/pars.fsy" : 'gentype_colonOrEquals)); -//# 18835 "pars.fs" +//# 19243 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * SynStringKind * ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 6766 "src/Compiler/pars.fsy" +//# 6965 "src/Compiler/pars.fsy" let (s, synStringKind, _) = _1 s, synStringKind ) -//# 6766 "src/Compiler/pars.fsy" +//# 6965 "src/Compiler/pars.fsy" : 'gentype_string)); -//# 18847 "pars.fs" +//# 19255 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * string in Microsoft.FSharp.Core.Operators.box ( ( -//# 6770 "src/Compiler/pars.fsy" +//# 6969 "src/Compiler/pars.fsy" _1 ) -//# 6770 "src/Compiler/pars.fsy" +//# 6969 "src/Compiler/pars.fsy" : 'gentype_sourceIdentifier)); -//# 18858 "pars.fs" +//# 19266 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in Microsoft.FSharp.Core.Operators.box ( ( -//# 6774 "src/Compiler/pars.fsy" +//# 6973 "src/Compiler/pars.fsy" (_1, None) ) -//# 6774 "src/Compiler/pars.fsy" +//# 6973 "src/Compiler/pars.fsy" : 'gentype_interpolatedStringFill)); -//# 18869 "pars.fs" +//# 19277 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> SynExpr in let _3 = parseState.GetInput(3) :?> Ident in Microsoft.FSharp.Core.Operators.box ( ( -//# 6777 "src/Compiler/pars.fsy" +//# 6976 "src/Compiler/pars.fsy" (_1, Some _3) ) -//# 6777 "src/Compiler/pars.fsy" +//# 6976 "src/Compiler/pars.fsy" : 'gentype_interpolatedStringFill)); -//# 18881 "pars.fs" +//# 19289 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 6781 "src/Compiler/pars.fsy" +//# 6980 "src/Compiler/pars.fsy" [ SynInterpolatedStringPart.String(fst _1, rhs parseState 1) ] ) -//# 6781 "src/Compiler/pars.fsy" +//# 6980 "src/Compiler/pars.fsy" : 'gentype_interpolatedStringParts)); -//# 18892 "pars.fs" +//# 19300 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_interpolatedStringFill in @@ -18897,27 +19305,27 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6784 "src/Compiler/pars.fsy" - SynInterpolatedStringPart.String(fst _1, rhs parseState 1) :: SynInterpolatedStringPart.FillExpr _2 :: _3 +//# 6983 "src/Compiler/pars.fsy" + SynInterpolatedStringPart.String(fst _1, rhs parseState 1) :: SynInterpolatedStringPart.FillExpr _2 :: _3 ) -//# 6784 "src/Compiler/pars.fsy" +//# 6983 "src/Compiler/pars.fsy" : 'gentype_interpolatedStringParts)); -//# 18905 "pars.fs" +//# 19313 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_interpolatedStringParts in Microsoft.FSharp.Core.Operators.box ( ( -//# 6787 "src/Compiler/pars.fsy" +//# 6986 "src/Compiler/pars.fsy" let rbrace = parseState.InputEndPosition 1 let lbrace = parseState.InputStartPosition 2 reportParseErrorAt (mkSynRange rbrace lbrace) (FSComp.SR.parsEmptyFillInInterpolatedString()) SynInterpolatedStringPart.String(fst _1, rhs parseState 1) :: _2 ) -//# 6787 "src/Compiler/pars.fsy" +//# 6986 "src/Compiler/pars.fsy" : 'gentype_interpolatedStringParts)); -//# 18920 "pars.fs" +//# 19328 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * SynStringKind * ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_interpolatedStringFill in @@ -18925,371 +19333,371 @@ let _fsyacc_reductions = lazy [| Microsoft.FSharp.Core.Operators.box ( ( -//# 6797 "src/Compiler/pars.fsy" +//# 6996 "src/Compiler/pars.fsy" let s, synStringKind, _ = _1 SynInterpolatedStringPart.String(s, rhs parseState 1) :: SynInterpolatedStringPart.FillExpr _2 :: _3, synStringKind ) -//# 6797 "src/Compiler/pars.fsy" +//# 6996 "src/Compiler/pars.fsy" : 'gentype_interpolatedString)); -//# 18934 "pars.fs" +//# 19342 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * SynStringKind * ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 6801 "src/Compiler/pars.fsy" +//# 7000 "src/Compiler/pars.fsy" let s, synStringKind, _ = _1 [ SynInterpolatedStringPart.String(s, rhs parseState 1) ], synStringKind ) -//# 6801 "src/Compiler/pars.fsy" +//# 7000 "src/Compiler/pars.fsy" : 'gentype_interpolatedString)); -//# 18946 "pars.fs" +//# 19354 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string * SynStringKind * ParseHelpers.LexerContinuation in let _2 = parseState.GetInput(2) :?> 'gentype_interpolatedStringParts in Microsoft.FSharp.Core.Operators.box ( ( -//# 6805 "src/Compiler/pars.fsy" +//# 7004 "src/Compiler/pars.fsy" let s, synStringKind, _ = _1 let rbrace = parseState.InputEndPosition 1 let lbrace = parseState.InputStartPosition 2 reportParseErrorAt (mkSynRange rbrace lbrace) (FSComp.SR.parsEmptyFillInInterpolatedString()) SynInterpolatedStringPart.String(s, rhs parseState 1) :: _2, synStringKind ) -//# 6805 "src/Compiler/pars.fsy" +//# 7004 "src/Compiler/pars.fsy" : 'gentype_interpolatedString)); -//# 18962 "pars.fs" +//# 19370 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6812 "src/Compiler/pars.fsy" +//# 7011 "src/Compiler/pars.fsy" ) -//# 6812 "src/Compiler/pars.fsy" +//# 7011 "src/Compiler/pars.fsy" : 'gentype_opt_HIGH_PRECEDENCE_APP)); -//# 18972 "pars.fs" +//# 19380 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6813 "src/Compiler/pars.fsy" +//# 7012 "src/Compiler/pars.fsy" ) -//# 6813 "src/Compiler/pars.fsy" +//# 7012 "src/Compiler/pars.fsy" : 'gentype_opt_HIGH_PRECEDENCE_APP)); -//# 18982 "pars.fs" +//# 19390 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6814 "src/Compiler/pars.fsy" +//# 7013 "src/Compiler/pars.fsy" ) -//# 6814 "src/Compiler/pars.fsy" +//# 7013 "src/Compiler/pars.fsy" : 'gentype_opt_HIGH_PRECEDENCE_APP)); -//# 18992 "pars.fs" +//# 19400 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6817 "src/Compiler/pars.fsy" +//# 7016 "src/Compiler/pars.fsy" ) -//# 6817 "src/Compiler/pars.fsy" +//# 7016 "src/Compiler/pars.fsy" : 'gentype_opt_HIGH_PRECEDENCE_TYAPP)); -//# 19002 "pars.fs" +//# 19410 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6818 "src/Compiler/pars.fsy" +//# 7017 "src/Compiler/pars.fsy" ) -//# 6818 "src/Compiler/pars.fsy" +//# 7017 "src/Compiler/pars.fsy" : 'gentype_opt_HIGH_PRECEDENCE_TYAPP)); -//# 19012 "pars.fs" +//# 19420 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_typeKeyword in Microsoft.FSharp.Core.Operators.box ( ( -//# 6822 "src/Compiler/pars.fsy" +//# 7021 "src/Compiler/pars.fsy" ) -//# 6822 "src/Compiler/pars.fsy" +//# 7021 "src/Compiler/pars.fsy" : 'gentype_typeKeyword)); -//# 19023 "pars.fs" +//# 19431 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6823 "src/Compiler/pars.fsy" +//# 7022 "src/Compiler/pars.fsy" ) -//# 6823 "src/Compiler/pars.fsy" +//# 7022 "src/Compiler/pars.fsy" : 'gentype_typeKeyword)); -//# 19033 "pars.fs" +//# 19441 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6824 "src/Compiler/pars.fsy" +//# 7023 "src/Compiler/pars.fsy" ) -//# 6824 "src/Compiler/pars.fsy" +//# 7023 "src/Compiler/pars.fsy" : 'gentype_typeKeyword)); -//# 19043 "pars.fs" +//# 19451 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_moduleKeyword in Microsoft.FSharp.Core.Operators.box ( ( -//# 6828 "src/Compiler/pars.fsy" +//# 7027 "src/Compiler/pars.fsy" ) -//# 6828 "src/Compiler/pars.fsy" +//# 7027 "src/Compiler/pars.fsy" : 'gentype_moduleKeyword)); -//# 19054 "pars.fs" +//# 19462 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6829 "src/Compiler/pars.fsy" +//# 7028 "src/Compiler/pars.fsy" ) -//# 6829 "src/Compiler/pars.fsy" +//# 7028 "src/Compiler/pars.fsy" : 'gentype_moduleKeyword)); -//# 19064 "pars.fs" +//# 19472 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6830 "src/Compiler/pars.fsy" +//# 7029 "src/Compiler/pars.fsy" ) -//# 6830 "src/Compiler/pars.fsy" +//# 7029 "src/Compiler/pars.fsy" : 'gentype_moduleKeyword)); -//# 19074 "pars.fs" +//# 19482 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_rbrace in Microsoft.FSharp.Core.Operators.box ( ( -//# 6833 "src/Compiler/pars.fsy" +//# 7032 "src/Compiler/pars.fsy" ) -//# 6833 "src/Compiler/pars.fsy" +//# 7032 "src/Compiler/pars.fsy" : 'gentype_rbrace)); -//# 19085 "pars.fs" +//# 19493 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6834 "src/Compiler/pars.fsy" +//# 7033 "src/Compiler/pars.fsy" ) -//# 6834 "src/Compiler/pars.fsy" +//# 7033 "src/Compiler/pars.fsy" : 'gentype_rbrace)); -//# 19095 "pars.fs" +//# 19503 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> ParseHelpers.LexerContinuation in Microsoft.FSharp.Core.Operators.box ( ( -//# 6835 "src/Compiler/pars.fsy" +//# 7034 "src/Compiler/pars.fsy" ) -//# 6835 "src/Compiler/pars.fsy" +//# 7034 "src/Compiler/pars.fsy" : 'gentype_rbrace)); -//# 19106 "pars.fs" +//# 19514 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6838 "src/Compiler/pars.fsy" +//# 7037 "src/Compiler/pars.fsy" ) -//# 6838 "src/Compiler/pars.fsy" +//# 7037 "src/Compiler/pars.fsy" : 'gentype_bar_rbrace)); -//# 19116 "pars.fs" +//# 19524 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_rparen in Microsoft.FSharp.Core.Operators.box ( ( -//# 6841 "src/Compiler/pars.fsy" +//# 7040 "src/Compiler/pars.fsy" ) -//# 6841 "src/Compiler/pars.fsy" +//# 7040 "src/Compiler/pars.fsy" : 'gentype_rparen)); -//# 19127 "pars.fs" +//# 19535 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6842 "src/Compiler/pars.fsy" +//# 7041 "src/Compiler/pars.fsy" ) -//# 6842 "src/Compiler/pars.fsy" +//# 7041 "src/Compiler/pars.fsy" : 'gentype_rparen)); -//# 19137 "pars.fs" +//# 19545 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6843 "src/Compiler/pars.fsy" +//# 7042 "src/Compiler/pars.fsy" ) -//# 6843 "src/Compiler/pars.fsy" +//# 7042 "src/Compiler/pars.fsy" : 'gentype_rparen)); -//# 19147 "pars.fs" +//# 19555 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_oblockend in Microsoft.FSharp.Core.Operators.box ( ( -//# 6846 "src/Compiler/pars.fsy" +//# 7045 "src/Compiler/pars.fsy" ) -//# 6846 "src/Compiler/pars.fsy" +//# 7045 "src/Compiler/pars.fsy" : 'gentype_oblockend)); -//# 19158 "pars.fs" +//# 19566 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6847 "src/Compiler/pars.fsy" +//# 7046 "src/Compiler/pars.fsy" ) -//# 6847 "src/Compiler/pars.fsy" +//# 7046 "src/Compiler/pars.fsy" : 'gentype_oblockend)); -//# 19168 "pars.fs" +//# 19576 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> range in Microsoft.FSharp.Core.Operators.box ( ( -//# 6848 "src/Compiler/pars.fsy" +//# 7047 "src/Compiler/pars.fsy" ) -//# 6848 "src/Compiler/pars.fsy" +//# 7047 "src/Compiler/pars.fsy" : 'gentype_oblockend)); -//# 19179 "pars.fs" +//# 19587 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6851 "src/Compiler/pars.fsy" +//# 7050 "src/Compiler/pars.fsy" false ) -//# 6851 "src/Compiler/pars.fsy" +//# 7050 "src/Compiler/pars.fsy" : 'gentype_ends_other_than_rparen_coming_soon_or_recover)); -//# 19189 "pars.fs" +//# 19597 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6852 "src/Compiler/pars.fsy" +//# 7051 "src/Compiler/pars.fsy" false ) -//# 6852 "src/Compiler/pars.fsy" +//# 7051 "src/Compiler/pars.fsy" : 'gentype_ends_other_than_rparen_coming_soon_or_recover)); -//# 19199 "pars.fs" +//# 19607 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6853 "src/Compiler/pars.fsy" +//# 7052 "src/Compiler/pars.fsy" false ) -//# 6853 "src/Compiler/pars.fsy" +//# 7052 "src/Compiler/pars.fsy" : 'gentype_ends_other_than_rparen_coming_soon_or_recover)); -//# 19209 "pars.fs" +//# 19617 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6854 "src/Compiler/pars.fsy" +//# 7053 "src/Compiler/pars.fsy" false ) -//# 6854 "src/Compiler/pars.fsy" +//# 7053 "src/Compiler/pars.fsy" : 'gentype_ends_other_than_rparen_coming_soon_or_recover)); -//# 19219 "pars.fs" +//# 19627 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6855 "src/Compiler/pars.fsy" +//# 7054 "src/Compiler/pars.fsy" _1 ) -//# 6855 "src/Compiler/pars.fsy" +//# 7054 "src/Compiler/pars.fsy" : 'gentype_ends_other_than_rparen_coming_soon_or_recover)); -//# 19230 "pars.fs" +//# 19638 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6858 "src/Compiler/pars.fsy" +//# 7057 "src/Compiler/pars.fsy" false ) -//# 6858 "src/Compiler/pars.fsy" +//# 7057 "src/Compiler/pars.fsy" : 'gentype_ends_coming_soon_or_recover)); -//# 19240 "pars.fs" +//# 19648 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6859 "src/Compiler/pars.fsy" +//# 7058 "src/Compiler/pars.fsy" false ) -//# 6859 "src/Compiler/pars.fsy" +//# 7058 "src/Compiler/pars.fsy" : 'gentype_ends_coming_soon_or_recover)); -//# 19250 "pars.fs" +//# 19658 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6860 "src/Compiler/pars.fsy" +//# 7059 "src/Compiler/pars.fsy" false ) -//# 6860 "src/Compiler/pars.fsy" +//# 7059 "src/Compiler/pars.fsy" : 'gentype_ends_coming_soon_or_recover)); -//# 19260 "pars.fs" +//# 19668 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6861 "src/Compiler/pars.fsy" +//# 7060 "src/Compiler/pars.fsy" false ) -//# 6861 "src/Compiler/pars.fsy" +//# 7060 "src/Compiler/pars.fsy" : 'gentype_ends_coming_soon_or_recover)); -//# 19270 "pars.fs" +//# 19678 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 6862 "src/Compiler/pars.fsy" +//# 7061 "src/Compiler/pars.fsy" false ) -//# 6862 "src/Compiler/pars.fsy" +//# 7061 "src/Compiler/pars.fsy" : 'gentype_ends_coming_soon_or_recover)); -//# 19280 "pars.fs" +//# 19688 "pars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 6863 "src/Compiler/pars.fsy" +//# 7062 "src/Compiler/pars.fsy" _1 ) -//# 6863 "src/Compiler/pars.fsy" +//# 7062 "src/Compiler/pars.fsy" : 'gentype_ends_coming_soon_or_recover)); |] -//# 19292 "pars.fs" +//# 19700 "pars.fs" let tables : Internal.Utilities.Text.Parsing.Tables<_> = { reductions = _fsyacc_reductions.Value; endOfInputTag = _fsyacc_endOfInputTag; @@ -19308,7 +19716,7 @@ let tables : Internal.Utilities.Text.Parsing.Tables<_> = match parse_error_rich with | Some f -> f ctxt | None -> parse_error ctxt.Message); - numTerminals = 206; + numTerminals = 207; productionToNonTerminalTable = _fsyacc_productionToNonTerminalTable } let engine lexer lexbuf startState = tables.Interpret(lexer, lexbuf, startState) let signatureFile lexer lexbuf : ParsedSigFile = diff --git a/src/fcs-fable/codegen/pars.fsi b/src/fcs-fable/codegen/pars.fsi index a3934b99e4..f2fd3e5356 100644 --- a/src/fcs-fable/codegen/pars.fsi +++ b/src/fcs-fable/codegen/pars.fsi @@ -45,6 +45,7 @@ type token = | TYPE_IS_HERE | MODULE_COMING_SOON | MODULE_IS_HERE + | BAR_JUST_BEFORE_NULL | EXTERN | VOID | PUBLIC @@ -249,6 +250,7 @@ type tokenId = | TOKEN_TYPE_IS_HERE | TOKEN_MODULE_COMING_SOON | TOKEN_MODULE_IS_HERE + | TOKEN_BAR_JUST_BEFORE_NULL | TOKEN_EXTERN | TOKEN_VOID | TOKEN_PUBLIC @@ -529,6 +531,7 @@ type nonTerminalId = | NONTERM_explicitValTyparDeclsCore | NONTERM_explicitValTyparDecls | NONTERM_opt_explicitValTyparDecls + | NONTERM_hashConstraint | NONTERM_opt_typeConstraints | NONTERM_typeConstraints | NONTERM_intersectionConstraints @@ -579,10 +582,9 @@ type nonTerminalId = | NONTERM_atomicRationalConstant | NONTERM_constant | NONTERM_bindingPattern - | NONTERM_simplePattern - | NONTERM_simplePatternCommaList | NONTERM_opt_simplePatterns | NONTERM_simplePatterns + | NONTERM_barCanBeRightBeforeNull | NONTERM_headBindingPattern | NONTERM_tuplePatternElements | NONTERM_conjPatternElements @@ -680,7 +682,9 @@ type nonTerminalId = | NONTERM_intersectionType | NONTERM_appTypeCon | NONTERM_appTypeConPower - | NONTERM_appType + | NONTERM_appTypeCanBeNullable + | NONTERM_appTypeNullableInParens + | NONTERM_appTypeWithoutNull | NONTERM_arrayTypeSuffix | NONTERM_appTypePrefixArguments | NONTERM_typeArgListElements @@ -717,11 +721,9 @@ type nonTerminalId = | NONTERM_opt_declEnd | NONTERM_opt_ODECLEND | NONTERM_deprecated_opt_equals - | NONTERM_opt_equals | NONTERM_opt_OBLOCKSEP | NONTERM_opt_seps | NONTERM_opt_rec - | NONTERM_opt_bar | NONTERM_opt_inline | NONTERM_opt_mutable | NONTERM_doToken diff --git a/src/fcs-fable/codegen/pppars.fs b/src/fcs-fable/codegen/pppars.fs index 3abdaac384..440d819eb3 100644 --- a/src/fcs-fable/codegen/pppars.fs +++ b/src/fcs-fable/codegen/pppars.fs @@ -2,12 +2,15 @@ module internal FSharp.Compiler.PPParser #nowarn "64";; // turn off warnings that type variables used in production annotations are instantiated to concrete type open FSharp.Compiler.ParseHelpers +open FSharp.Compiler.LexerStore open Internal.Utilities.Text.Lexing open Internal.Utilities.Text.Parsing.ParseHelpers //# 3 "src/Compiler/pppars.fsy" open FSharp.Compiler.DiagnosticsLogger +#nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` + let dummy = IfdefId("DUMMY") let doNothing _ dflt= @@ -19,7 +22,7 @@ let fail (ps : Internal.Utilities.Text.Parsing.IParseState) i e = errorR(Error(e,m)) dummy -//# 22 "pppars.fs" +//# 25 "pppars.fs" // This type is the type of tokens accepted by the parser type token = | OP_NOT @@ -138,7 +141,7 @@ let _fsyacc_reductionSymbolCounts = [|1us;1us;1us;3us;1us;3us;1us;2us;3us;3us;2u let _fsyacc_productionToNonTerminalTable = [|0us;1us;2us;3us;3us;4us;4us;4us;4us;4us;4us;4us;4us;4us;4us;4us;4us;4us;4us;|] let _fsyacc_immediateActions = [|65535us;49152us;16385us;16386us;65535us;65535us;65535us;16387us;16388us;65535us;65535us;16389us;16390us;65535us;65535us;65535us;65535us;65535us;65535us;65535us;16394us;65535us;16395us;16396us;16397us;65535us;16399us;65535us;16400us;16401us;16402us;|] let _fsyacc_reductions = lazy [| -//# 141 "pppars.fs" +//# 144 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> LexerIfdefExpression in Microsoft.FSharp.Core.Operators.box @@ -147,207 +150,207 @@ let _fsyacc_reductions = lazy [| raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__startstart)); -//# 150 "pppars.fs" +//# 153 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_Full in Microsoft.FSharp.Core.Operators.box ( ( -//# 36 "src/Compiler/pppars.fsy" +//# 38 "src/Compiler/pppars.fsy" _1 ) -//# 36 "src/Compiler/pppars.fsy" +//# 38 "src/Compiler/pppars.fsy" : LexerIfdefExpression )); -//# 161 "pppars.fs" +//# 164 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 39 "src/Compiler/pppars.fsy" +//# 41 "src/Compiler/pppars.fsy" doNothing parseState () ) -//# 39 "src/Compiler/pppars.fsy" +//# 41 "src/Compiler/pppars.fsy" : 'gentype_Recover)); -//# 171 "pppars.fs" +//# 174 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Expr in Microsoft.FSharp.Core.Operators.box ( ( -//# 42 "src/Compiler/pppars.fsy" +//# 44 "src/Compiler/pppars.fsy" _2 ) -//# 42 "src/Compiler/pppars.fsy" +//# 44 "src/Compiler/pppars.fsy" : 'gentype_Full)); -//# 182 "pppars.fs" +//# 185 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 43 "src/Compiler/pppars.fsy" +//# 45 "src/Compiler/pppars.fsy" fail parseState 1 (FSComp.SR.ppparsMissingToken("#if/#elif")) ) -//# 43 "src/Compiler/pppars.fsy" +//# 45 "src/Compiler/pppars.fsy" : 'gentype_Full)); -//# 193 "pppars.fs" +//# 196 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Expr in Microsoft.FSharp.Core.Operators.box ( ( -//# 46 "src/Compiler/pppars.fsy" +//# 48 "src/Compiler/pppars.fsy" _2 ) -//# 46 "src/Compiler/pppars.fsy" +//# 48 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 204 "pppars.fs" +//# 207 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -//# 47 "src/Compiler/pppars.fsy" +//# 49 "src/Compiler/pppars.fsy" IfdefId(_1) ) -//# 47 "src/Compiler/pppars.fsy" +//# 49 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 215 "pppars.fs" +//# 218 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Expr in Microsoft.FSharp.Core.Operators.box ( ( -//# 48 "src/Compiler/pppars.fsy" +//# 50 "src/Compiler/pppars.fsy" IfdefNot(_2) ) -//# 48 "src/Compiler/pppars.fsy" +//# 50 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 226 "pppars.fs" +//# 229 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_Expr in let _3 = parseState.GetInput(3) :?> 'gentype_Expr in Microsoft.FSharp.Core.Operators.box ( ( -//# 49 "src/Compiler/pppars.fsy" +//# 51 "src/Compiler/pppars.fsy" IfdefAnd(_1,_3) ) -//# 49 "src/Compiler/pppars.fsy" +//# 51 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 238 "pppars.fs" +//# 241 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_Expr in let _3 = parseState.GetInput(3) :?> 'gentype_Expr in Microsoft.FSharp.Core.Operators.box ( ( -//# 50 "src/Compiler/pppars.fsy" +//# 52 "src/Compiler/pppars.fsy" IfdefOr(_1,_3) ) -//# 50 "src/Compiler/pppars.fsy" +//# 52 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 250 "pppars.fs" +//# 253 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 52 "src/Compiler/pppars.fsy" +//# 54 "src/Compiler/pppars.fsy" fail parseState 1 (FSComp.SR.ppparsUnexpectedToken("&&")) ) -//# 52 "src/Compiler/pppars.fsy" +//# 54 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 261 "pppars.fs" +//# 264 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 53 "src/Compiler/pppars.fsy" +//# 55 "src/Compiler/pppars.fsy" fail parseState 1 (FSComp.SR.ppparsUnexpectedToken("||")) ) -//# 53 "src/Compiler/pppars.fsy" +//# 55 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 272 "pppars.fs" +//# 275 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 54 "src/Compiler/pppars.fsy" +//# 56 "src/Compiler/pppars.fsy" fail parseState 1 (FSComp.SR.ppparsUnexpectedToken("!")) ) -//# 54 "src/Compiler/pppars.fsy" +//# 56 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 283 "pppars.fs" +//# 286 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 55 "src/Compiler/pppars.fsy" +//# 57 "src/Compiler/pppars.fsy" doNothing parseState dummy ) -//# 55 "src/Compiler/pppars.fsy" +//# 57 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 293 "pppars.fs" +//# 296 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Expr in let _3 = parseState.GetInput(3) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 56 "src/Compiler/pppars.fsy" +//# 58 "src/Compiler/pppars.fsy" fail parseState 3 (FSComp.SR.ppparsMissingToken(")")) ) -//# 56 "src/Compiler/pppars.fsy" +//# 58 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 305 "pppars.fs" +//# 308 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 57 "src/Compiler/pppars.fsy" +//# 59 "src/Compiler/pppars.fsy" fail parseState 2 (FSComp.SR.ppparsIncompleteExpression()) ) -//# 57 "src/Compiler/pppars.fsy" +//# 59 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 316 "pppars.fs" +//# 319 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _2 = parseState.GetInput(2) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 58 "src/Compiler/pppars.fsy" +//# 60 "src/Compiler/pppars.fsy" fail parseState 1 (FSComp.SR.ppparsUnexpectedToken(")")) ) -//# 58 "src/Compiler/pppars.fsy" +//# 60 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 327 "pppars.fs" +//# 330 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_Expr in let _2 = parseState.GetInput(2) :?> 'gentype_Recover in Microsoft.FSharp.Core.Operators.box ( ( -//# 59 "src/Compiler/pppars.fsy" +//# 61 "src/Compiler/pppars.fsy" fail parseState 2 (FSComp.SR.ppparsIncompleteExpression()) ) -//# 59 "src/Compiler/pppars.fsy" +//# 61 "src/Compiler/pppars.fsy" : 'gentype_Expr)); -//# 339 "pppars.fs" +//# 342 "pppars.fs" (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -//# 60 "src/Compiler/pppars.fsy" +//# 62 "src/Compiler/pppars.fsy" fail parseState 1 (FSComp.SR.ppparsIncompleteExpression()) ) -//# 60 "src/Compiler/pppars.fsy" +//# 62 "src/Compiler/pppars.fsy" : 'gentype_Expr)); |] -//# 350 "pppars.fs" +//# 353 "pppars.fs" let tables : Internal.Utilities.Text.Parsing.Tables<_> = { reductions = _fsyacc_reductions.Value; endOfInputTag = _fsyacc_endOfInputTag; diff --git a/src/fcs-fable/codegen/pppars.fsi b/src/fcs-fable/codegen/pppars.fsi index 04ae14e888..7aab07d1c5 100644 --- a/src/fcs-fable/codegen/pppars.fsi +++ b/src/fcs-fable/codegen/pppars.fsi @@ -1,6 +1,7 @@ // Signature file for parser generated by fsyacc module internal FSharp.Compiler.PPParser open FSharp.Compiler.ParseHelpers +open FSharp.Compiler.LexerStore type token = | OP_NOT | OP_AND diff --git a/src/fcs-fable/fcs-fable.fsproj b/src/fcs-fable/fcs-fable.fsproj index ec9d66a412..94b28ae312 100644 --- a/src/fcs-fable/fcs-fable.fsproj +++ b/src/fcs-fable/fcs-fable.fsproj @@ -6,6 +6,7 @@ netstandard2.0 + $(DefineConstants);NO_CHECKNULLS $(DefineConstants);FABLE_COMPILER $(DefineConstants);COMPILER $(DefineConstants);FX_NO_WEAKTABLE @@ -27,8 +28,11 @@ + + + @@ -41,8 +45,6 @@ - - @@ -61,6 +63,8 @@ + + @@ -81,6 +85,8 @@ + + @@ -93,6 +99,8 @@ + + @@ -149,6 +157,8 @@ + + @@ -175,6 +185,7 @@ + @@ -182,6 +193,7 @@ + @@ -226,12 +238,15 @@ - - + + + - - + + + + @@ -342,6 +357,10 @@ + + + + @@ -360,6 +379,11 @@ + + + + + @@ -371,6 +395,8 @@ + + @@ -381,7 +407,7 @@ - + diff --git a/src/fcs-fable/service_slim.fs b/src/fcs-fable/service_slim.fs index 33643df0f4..57e106e09f 100644 --- a/src/fcs-fable/service_slim.fs +++ b/src/fcs-fable/service_slim.fs @@ -154,7 +154,7 @@ module internal ParseAndCheck = topAttrsOpt: TopAttribs option, tcImplFilesOpt: CheckedImplFile list option, compilerState) = let assemblyRef = mkSimpleAssemblyRef "stdin" let access = tcState.TcEnvFromImpls.AccessRights - let symbolUses = Choice2Of2 TcSymbolUses.Empty + let symbolUses = Choice2Of2 (async { return seq { } }) let dependencyFiles = parseResults |> Seq.map (fun x -> x.DependencyFiles) |> Array.concat let getAssemblyData () = None let details = (compilerState.tcGlobals, compilerState.tcImports, tcState.Ccu, tcState.CcuSig, symbolUses, topAttrsOpt, diff --git a/src/fcs-fable/src/Compiler/AbstractIL/il.fs b/src/fcs-fable/src/Compiler/AbstractIL/il.fs index 9528f2c01c..ad63a53a57 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/il.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/il.fs @@ -56,10 +56,10 @@ type PrimaryAssembly = static member IsPossiblePrimaryAssembly(fileName: string) = let name = System.IO.Path.GetFileNameWithoutExtension(fileName) - String.Compare(name, "mscorlib", true) <> 0 - || String.Compare(name, "System.Runtime", true) <> 0 - || String.Compare(name, "netstandard", true) <> 0 - || String.Compare(name, "System.Private.CoreLib", true) <> 0 + String.Equals(name, "System.Runtime", StringComparison.OrdinalIgnoreCase) + || String.Equals(name, "mscorlib", StringComparison.OrdinalIgnoreCase) + || String.Equals(name, "netstandard", StringComparison.OrdinalIgnoreCase) + || String.Equals(name, "System.Private.CoreLib", StringComparison.OrdinalIgnoreCase) // -------------------------------------------------------------------- // Utilities: type names @@ -92,22 +92,24 @@ let rec splitNamespaceAux (nm: string) = | -1 -> [ nm ] | idx -> let s1, s2 = splitNameAt nm idx - let s1 = memoizeNamespacePartTable.GetOrAdd(s1, id) + let s1 = memoizeNamespacePartTable.GetOrAdd(s1, s1) s1 :: splitNamespaceAux s2 +// Cache this as a delegate. +let splitNamespaceAuxDelegate = Func splitNamespaceAux + let splitNamespace nm = - memoizeNamespaceTable.GetOrAdd(nm, splitNamespaceAux) + memoizeNamespaceTable.GetOrAdd(nm, splitNamespaceAuxDelegate) // ++GLOBAL MUTABLE STATE (concurrency-safe) let memoizeNamespaceArrayTable = ConcurrentDictionary() +// Cache this as a delegate. +let splitNamespaceToArrayDelegate = + Func(splitNamespace >> Array.ofList) + let splitNamespaceToArray nm = - memoizeNamespaceArrayTable.GetOrAdd( - nm, - fun nm -> - let x = Array.ofList (splitNamespace nm) - x - ) + memoizeNamespaceArrayTable.GetOrAdd(nm, splitNamespaceToArrayDelegate) let splitILTypeName (nm: string) = match nm.LastIndexOf '.' with @@ -158,15 +160,23 @@ let splitTypeNameRightAux (nm: string) = let s1, s2 = splitNameAt nm idx Some s1, s2 +// Cache this as a delegate. +let splitTypeNameRightAuxDelegate = + Func splitTypeNameRightAux + let splitTypeNameRight nm = - memoizeNamespaceRightTable.GetOrAdd(nm, splitTypeNameRightAux) + memoizeNamespaceRightTable.GetOrAdd(nm, splitTypeNameRightAuxDelegate) // -------------------------------------------------------------------- // Ordered lists with a lookup table // -------------------------------------------------------------------- /// This is used to store event, property and field maps. -type LazyOrderedMultiMap<'Key, 'Data when 'Key: equality>(keyf: 'Data -> 'Key, lazyItems: InterruptibleLazy<'Data list>) = +type LazyOrderedMultiMap<'Key, 'Data when 'Key: equality +#if !NO_CHECKNULLS + and 'Key:not null +#endif + >(keyf: 'Data -> 'Key, lazyItems: InterruptibleLazy<'Data list>) = let quickMap = lazyItems @@ -473,11 +483,11 @@ type ILAssemblyRef(data) = override x.GetHashCode() = uniqueStamp override x.Equals yobj = - ((yobj :?> ILAssemblyRef).UniqueStamp = uniqueStamp) + ((!!yobj :?> ILAssemblyRef).UniqueStamp = uniqueStamp) interface IComparable with override x.CompareTo yobj = - compare (yobj :?> ILAssemblyRef).UniqueStamp uniqueStamp + compare (!!yobj :?> ILAssemblyRef).UniqueStamp uniqueStamp static member Create(name, hash, publicKey, retargetable, version, locale) = ILAssemblyRef @@ -512,7 +522,8 @@ type ILAssemblyRef(data) = let retargetable = aname.Flags = AssemblyNameFlags.Retargetable - ILAssemblyRef.Create(aname.Name, None, publicKey, retargetable, version, locale) + let name = match aname.Name with | null -> aname.FullName | name -> name + ILAssemblyRef.Create(name, None, publicKey, retargetable, version, locale) #endif //!FABLE_COMPILER member aref.QualifiedName = @@ -743,7 +754,7 @@ type ILTypeRef = override x.GetHashCode() = x.hashCode override x.Equals yobj = - let y = (yobj :?> ILTypeRef) + let y = (!!yobj :?> ILTypeRef) (x.ApproxId = y.ApproxId) && (x.Scope = y.Scope) @@ -786,7 +797,7 @@ type ILTypeRef = interface IComparable with override x.CompareTo yobj = - let y = (yobj :?> ILTypeRef) + let y = (!!yobj :?> ILTypeRef) let c = compare x.ApproxId y.ApproxId if c <> 0 then @@ -809,7 +820,7 @@ type ILTypeRef = member tref.AddQualifiedNameExtension basic = let sco = tref.Scope.QualifiedName - if sco = "" then + if String.IsNullOrEmpty(sco) then basic else String.concat ", " [ basic; sco ] @@ -821,7 +832,7 @@ type ILTypeRef = member x.DebugText = x.ToString() /// For debugging - override x.ToString() = x.FullName + override x.ToString() : string = x.FullName and [] ILTypeSpec = { @@ -873,7 +884,7 @@ and [" + x.TypeRef.FullName + if isNil x.GenericArgs then "" else "<...>" and [] ILType = | Void @@ -1015,8 +1026,9 @@ type ILMethodRef = [] member x.DebugText = x.ToString() - override x.ToString() = - x.DeclaringTypeRef.ToString() + "::" + x.Name + "(...)" + member x.FullName = x.DeclaringTypeRef.FullName + "::" + x.Name + "(...)" + + override x.ToString() = x.FullName [] type ILFieldRef = @@ -1031,7 +1043,7 @@ type ILFieldRef = member x.DebugText = x.ToString() override x.ToString() = - x.DeclaringTypeRef.ToString() + "::" + x.Name + x.DeclaringTypeRef.FullName + "::" + x.Name [] type ILMethodSpec = @@ -1070,7 +1082,7 @@ type ILMethodSpec = [] member x.DebugText = x.ToString() - override x.ToString() = x.MethodRef.ToString() + "(...)" + override x.ToString() = x.MethodRef.FullName + "(...)" [] type ILFieldSpec = @@ -1211,7 +1223,7 @@ type ILAttribute = [] member x.DebugText = x.ToString() - override x.ToString() = x.Method.ToString() + "(...)" + override x.ToString() = x.Method.MethodRef.FullName [] type ILAttributes(array: ILAttribute[]) = @@ -1256,6 +1268,9 @@ let storeILCustomAttrs (attrs: ILAttributes) = else ILAttributesStored.Given attrs +let mkILCustomAttrsComputed f = + ILAttributesStored.Reader(fun _ -> f ()) + let mkILCustomAttrsReader f = ILAttributesStored.Reader f type ILCodeLabel = int @@ -1566,7 +1581,7 @@ type ILFieldInit = | ILFieldInit.UInt64 u64 -> box u64 | ILFieldInit.Single ieee32 -> box ieee32 | ILFieldInit.Double ieee64 -> box ieee64 - | ILFieldInit.Null -> (null :> Object) + | ILFieldInit.Null -> (null :> objnull) // -------------------------------------------------------------------- // Native Types, for marshalling to the native C interface. @@ -1851,9 +1866,10 @@ type ILGenericParameterDef = Name: string Constraints: ILTypes Variance: ILGenericVariance - HasReferenceTypeConstraint: bool + HasReferenceTypeConstraint: bool HasNotNullableValueTypeConstraint: bool HasDefaultConstructorConstraint: bool + HasAllowsRefStruct: bool CustomAttrsStored: ILAttributesStored MetadataIndex: int32 } @@ -1897,6 +1913,23 @@ let inline conditionalAdd condition flagToAdd source = let NoMetadataIdx = -1 +type InterfaceImpl = + { Idx: int; Type: ILType; mutable CustomAttrsStored: ILAttributesStored } + + member x.CustomAttrs = + match x.CustomAttrsStored with + | ILAttributesStored.Reader f -> + let res = ILAttributes(f x.Idx) + x.CustomAttrsStored <- ILAttributesStored.Given res + res + | ILAttributesStored.Given attrs -> attrs + + static member Create(ilType: ILType, customAttrsStored: ILAttributesStored) = + { Idx = NoMetadataIdx; Type = ilType; CustomAttrsStored = customAttrsStored } + + static member Create(ilType: ILType) = InterfaceImpl.Create(ilType, emptyILCustomAttrsStored) + + [] type ILMethodDef ( @@ -2609,13 +2642,21 @@ let convertInitSemantics (init: ILTypeInit) = | ILTypeInit.BeforeField -> TypeAttributes.BeforeFieldInit | ILTypeInit.OnAny -> enum 0 +[] +type ILTypeDefAdditionalFlags = + | None = 0 + | IsKnownToBeAttribute = 1 + /// The type can contain extension methods, + /// or this information may not be available at the time the ILTypeDef is created + | CanContainExtensionMethods = 2 + [] type ILTypeDef ( name: string, attributes: TypeAttributes, layout: ILTypeDefLayout, - implements: ILTypes, + implements: InterruptibleLazy, genericParams: ILGenericParameterDefs, extends: ILType option, methods: ILMethodDefs, @@ -2624,7 +2665,7 @@ type ILTypeDef methodImpls: ILMethodImplDefs, events: ILEventDefs, properties: ILPropertyDefs, - isKnownToBeAttribute: bool, + additionalFlags: ILTypeDefAdditionalFlags, securityDeclsStored: ILSecurityDeclsStored, customAttrsStored: ILAttributesStored, metadataIndex: int32 @@ -2632,6 +2673,8 @@ type ILTypeDef let mutable customAttrsStored = customAttrsStored + let hasFlag flag = additionalFlags &&& flag = flag + new(name, attributes, layout, @@ -2644,7 +2687,7 @@ type ILTypeDef methodImpls, events, properties, - isKnownToBeAttribute, + additionalFlags, securityDecls, customAttrs) = ILTypeDef( @@ -2660,9 +2703,9 @@ type ILTypeDef methodImpls, events, properties, - isKnownToBeAttribute, + additionalFlags, storeILSecurityDecls securityDecls, - storeILCustomAttrs customAttrs, + customAttrs, NoMetadataIdx ) @@ -2692,7 +2735,10 @@ type ILTypeDef member _.Properties = properties - member _.IsKnownToBeAttribute = isKnownToBeAttribute + member _.IsKnownToBeAttribute = hasFlag ILTypeDefAdditionalFlags.IsKnownToBeAttribute + + member _.CanContainExtensionMethods = + hasFlag ILTypeDefAdditionalFlags.CanContainExtensionMethods member _.CustomAttrsStored = customAttrsStored @@ -2712,7 +2758,7 @@ type ILTypeDef ?methodImpls, ?events, ?properties, - ?isKnownToBeAttribute, + ?newAdditionalFlags, ?customAttrs, ?securityDecls ) = @@ -2730,11 +2776,11 @@ type ILTypeDef methodImpls = defaultArg methodImpls x.MethodImpls, events = defaultArg events x.Events, properties = defaultArg properties x.Properties, - isKnownToBeAttribute = defaultArg isKnownToBeAttribute x.IsKnownToBeAttribute, - customAttrs = defaultArg customAttrs x.CustomAttrs + additionalFlags = defaultArg newAdditionalFlags additionalFlags, + customAttrs = defaultArg customAttrs (x.CustomAttrsStored) ) - member x.CustomAttrs = + member x.CustomAttrs: ILAttributes = match customAttrsStored with | ILAttributesStored.Reader f -> let res = ILAttributes(f x.MetadataIndex) @@ -2875,35 +2921,17 @@ and [] ILPreTypeDef = /// This is a memory-critical class. Very many of these objects get allocated and held to represent the contents of .NET assemblies. and [] ILPreTypeDefImpl(nameSpace: string list, name: string, metadataIndex: int32, storage: ILTypeDefStored) = - let mutable store: ILTypeDef = Unchecked.defaultof<_> - let mutable storage = storage + let stored = + lazy + match storage with + | ILTypeDefStored.Given td -> td + | ILTypeDefStored.Computed f -> f () + | ILTypeDefStored.Reader f -> f metadataIndex interface ILPreTypeDef with member _.Namespace = nameSpace member _.Name = name - - member x.GetTypeDef() = - match box store with - | null -> - let syncObj = storage - Monitor.Enter(syncObj) - - try - match box store with - | null -> - let value = - match storage with - | ILTypeDefStored.Given td -> td - | ILTypeDefStored.Computed f -> f () - | ILTypeDefStored.Reader f -> f metadataIndex - - store <- value - storage <- Unchecked.defaultof<_> - value - | _ -> store - finally - Monitor.Exit(syncObj) - | _ -> store + member x.GetTypeDef() = stored.Value and ILTypeDefStored = | Given of ILTypeDef @@ -3268,6 +3296,7 @@ let mkILSimpleTypar nm = HasReferenceTypeConstraint = false HasNotNullableValueTypeConstraint = false HasDefaultConstructorConstraint = false + HasAllowsRefStruct = false CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs MetadataIndex = NoMetadataIdx } @@ -3316,6 +3345,8 @@ let mkILTypeDefs l = mkILTypeDefsFromArray (Array.ofList l) let mkILTypeDefsComputed f = ILTypeDefs f let emptyILTypeDefs = mkILTypeDefsFromArray [||] +let emptyILInterfaceImpls = InterruptibleLazy.FromValue([]) + // -------------------------------------------------------------------- // Operations on method tables. // -------------------------------------------------------------------- @@ -3437,6 +3468,11 @@ type ILGlobals(primaryScopeRef: ILScopeRef, equivPrimaryAssemblyRefs: ILAssembly let mkSysILTypeRef nm = mkILTyRef (primaryScopeRef, nm) + let byteIlType = ILType.Value(mkILNonGenericTySpec (mkSysILTypeRef tname_Byte)) + + let stringIlType = + mkILBoxedType (mkILNonGenericTySpec (mkSysILTypeRef tname_String)) + member _.primaryAssemblyScopeRef = primaryScopeRef member x.primaryAssemblyRef = @@ -3454,7 +3490,7 @@ type ILGlobals(primaryScopeRef: ILScopeRef, equivPrimaryAssemblyRefs: ILAssembly member val typ_Object = mkILBoxedType (mkILNonGenericTySpec (mkSysILTypeRef tname_Object)) - member val typ_String = mkILBoxedType (mkILNonGenericTySpec (mkSysILTypeRef tname_String)) + member val typ_String = stringIlType member val typ_Array = mkILBoxedType (mkILNonGenericTySpec (mkSysILTypeRef tname_Array)) @@ -3468,7 +3504,11 @@ type ILGlobals(primaryScopeRef: ILScopeRef, equivPrimaryAssemblyRefs: ILAssembly member val typ_Int64 = ILType.Value(mkILNonGenericTySpec (mkSysILTypeRef tname_Int64)) - member val typ_Byte = ILType.Value(mkILNonGenericTySpec (mkSysILTypeRef tname_Byte)) + member val typ_Byte = byteIlType + + member val typ_ByteArray = ILType.Array(ILArrayShape.SingleDimensional, byteIlType) + + member val typ_StringArray = ILType.Array(ILArrayShape.SingleDimensional, stringIlType) member val typ_UInt16 = ILType.Value(mkILNonGenericTySpec (mkSysILTypeRef tname_UInt16)) @@ -3972,6 +4012,29 @@ let mdef_code2code f (md: ILMethodDef) = let b = MethodBody.IL(notlazy ilCode) md.With(body = notlazy b) +let appendInstrsToCode (instrs: ILInstr list) (c2: ILCode) = + let instrs = Array.ofList instrs + + match + c2.Instrs + |> Array.tryFindIndexBack (fun instr -> + match instr with + | I_ret -> true + | _ -> false) + with + | Some 0 -> + { c2 with + Instrs = Array.concat [| instrs; c2.Instrs |] + } + | Some index -> + { c2 with + Instrs = Array.concat [| c2.Instrs[.. index - 1]; instrs; c2.Instrs[index..] |] + } + | None -> + { c2 with + Instrs = Array.append c2.Instrs instrs + } + let prependInstrsToCode (instrs: ILInstr list) (c2: ILCode) = let instrs = Array.ofList instrs let n = instrs.Length @@ -4005,6 +4068,9 @@ let prependInstrsToCode (instrs: ILInstr list) (c2: ILCode) = Instrs = Array.append instrs c2.Instrs } +let appendInstrsToMethod newCode md = + mdef_code2code (appendInstrsToCode newCode) md + let prependInstrsToMethod newCode md = mdef_code2code (prependInstrsToCode newCode) md @@ -4188,7 +4254,7 @@ let mkILSimpleStorageCtor (baseTySpec, ty, extraParams, flds, access, tag, impor let mkILStorageCtor (preblock, ty, flds, access, tag, imports) = mkILStorageCtorWithParamNames (preblock, ty, [], addParamNames flds, access, tag, imports) -let mkILGenericClass (nm, access, genparams, extends, impl, methods, fields, nestedTypes, props, events, attrs, init) = +let mkILGenericClass (nm, access, genparams, extends, impls, methods, fields, nestedTypes, props, events, attrs, init) = let attributes = convertTypeAccessFlags access ||| TypeAttributes.AutoLayout @@ -4202,17 +4268,17 @@ let mkILGenericClass (nm, access, genparams, extends, impl, methods, fields, nes name = nm, attributes = attributes, genericParams = genparams, - implements = impl, + implements = InterruptibleLazy.FromValue(impls), layout = ILTypeDefLayout.Auto, extends = Some extends, methods = methods, fields = fields, nestedTypes = nestedTypes, - customAttrs = attrs, + customAttrs = storeILCustomAttrs attrs, methodImpls = emptyILMethodImpls, properties = props, events = events, - isKnownToBeAttribute = false, + additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls ) @@ -4226,17 +4292,17 @@ let mkRawDataValueTypeDef (iltyp_ValueType: ILType) (nm, size, pack) = ||| TypeAttributes.ExplicitLayout ||| TypeAttributes.BeforeFieldInit ||| TypeAttributes.AnsiClass), - implements = [], + implements = emptyILInterfaceImpls, extends = Some iltyp_ValueType, layout = ILTypeDefLayout.Explicit { Size = Some size; Pack = Some pack }, methods = emptyILMethods, fields = emptyILFields, nestedTypes = emptyILTypeDefs, - customAttrs = emptyILCustomAttrs, + customAttrs = emptyILCustomAttrsStored, methodImpls = emptyILMethodImpls, properties = emptyILProperties, events = emptyILEvents, - isKnownToBeAttribute = false, + additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls ) @@ -4352,7 +4418,7 @@ let buildILCode (_methName: string) lab2pc instrs tryspecs localspecs : ILCode = // Detecting Delegates // -------------------------------------------------------------------- -let mkILDelegateMethods access (ilg: ILGlobals) (iltyp_AsyncCallback, iltyp_IAsyncResult) (parms, rtv: ILReturn) = +let mkILDelegateMethods access (ilg: ILGlobals) (iltyp_AsyncCallback, iltyp_IAsyncResult) (params_, rtv: ILReturn) = let retTy = rtv.Type let one nm args ret = @@ -4375,10 +4441,10 @@ let mkILDelegateMethods access (ilg: ILGlobals) (iltyp_AsyncCallback, iltyp_IAsy [ ctor - one "Invoke" parms retTy + one "Invoke" params_ retTy one "BeginInvoke" - (parms + (params_ @ [ mkILParamNamed ("callback", iltyp_AsyncCallback) mkILParamNamed ("objects", ilg.typ_Object) @@ -5546,7 +5612,7 @@ and refsOfILMethodImpl s m = and refsOfILTypeDef s (td: ILTypeDef) = refsOfILTypeDefs s td.NestedTypes refsOfILGenericParams s td.GenericParams - refsOfILTypes s td.Implements + refsOfILTypes s (td.Implements.Value |> List.map _.Type) Option.iter (refsOfILType s) td.Extends refsOfILMethodDefs s td.Methods refsOfILFieldDefs s (td.Fields.AsList()) @@ -5656,10 +5722,9 @@ let resolveILMethodRefWithRescope r (td: ILTypeDef) (mref: ILMethodRef) = possibles |> List.filter (fun md -> mref.CallingConv = md.CallingConv - && - // REVIEW: this uses equality on ILType. For CMOD_OPTIONAL this is not going to be correct - (md.Parameters, argTypes) - ||> List.lengthsEqAndForall2 (fun p1 p2 -> r p1.Type = p2) + && (md.Parameters, argTypes) + ||> List.lengthsEqAndForall2 (fun p1 p2 -> r p1.Type = p2) + && md.GenericParams.Length = mref.GenericArity && // REVIEW: this uses equality on ILType. For CMOD_OPTIONAL this is not going to be correct r md.Return.Type = retType) diff --git a/src/fcs-fable/src/Compiler/AbstractIL/il.fsi b/src/fcs-fable/src/Compiler/AbstractIL/il.fsi index 660b08a4a5..86a05a145e 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/il.fsi +++ b/src/fcs-fable/src/Compiler/AbstractIL/il.fsi @@ -4,6 +4,7 @@ module rec FSharp.Compiler.AbstractIL.IL +open System open FSharp.Compiler.IO open System.Collections.Generic open System.Reflection @@ -19,7 +20,7 @@ type internal PrimaryAssembly = member Name: string /// Checks if an assembly resolution may represent a primary assembly that actually contains the - /// definition of Sytem.Object. Note that the chosen target primary assembly may not actually be the one + /// definition of System.Object. Note that the chosen target primary assembly may not actually be the one /// that contains the definition of System.Object - it is just the one we are choosing to emit for. static member IsPossiblePrimaryAssembly: fileName: string -> bool @@ -238,6 +239,8 @@ type ILTypeRef = member internal EqualsWithPrimaryScopeRef: ILScopeRef * obj -> bool + override ToString: unit -> string + interface System.IComparable /// Type specs and types. @@ -326,6 +329,15 @@ type ILCallingSignature = ArgTypes: ILTypes ReturnType: ILType } +type InterfaceImpl = + { Idx: int + Type: ILType + mutable CustomAttrsStored: ILAttributesStored } + + member CustomAttrs: ILAttributes + static member Create: ilType: ILType * customAttrsStored: ILAttributesStored -> InterfaceImpl + static member Create: ilType: ILType -> InterfaceImpl + /// Actual generic parameters are always types. type ILGenericArgs = ILType list @@ -665,7 +677,7 @@ type ILFieldInit = | Double of double | Null - member AsObject: unit -> obj + member AsObject: unit -> objnull [] type internal ILNativeVariant = @@ -870,7 +882,13 @@ type ILAttributes = /// Represents the efficiency-oriented storage of ILAttributes in another item. [] -type ILAttributesStored +type ILAttributesStored = + /// Computed by ilread.fs based on metadata index + | Reader of (int32 -> ILAttribute[]) + /// Already computed + | Given of ILAttributes + + member GetCustomAttrs: int32 -> ILAttributes /// Method parameters and return values. [] @@ -1014,6 +1032,9 @@ type ILGenericParameterDef = /// Indicates the type argument must have a public nullary constructor. HasDefaultConstructorConstraint: bool + /// Indicates the type parameter allows ref struct, i.e. an anti constraint. + HasAllowsRefStruct: bool + /// Do not use this CustomAttrsStored: ILAttributesStored @@ -1071,6 +1092,8 @@ type ILMethodDef = member IsEntryPoint: bool member GenericParams: ILGenericParameterDefs member CustomAttrs: ILAttributes + member MetadataIndex: int32 + member CustomAttrsStored: ILAttributesStored member ParameterTypes: ILTypes member IsIL: bool member Code: ILCode option @@ -1244,6 +1267,10 @@ type ILFieldDef = member CustomAttrs: ILAttributes + member MetadataIndex: int32 + + member CustomAttrsStored: ILAttributesStored + member IsStatic: bool member IsSpecialName: bool @@ -1327,6 +1354,8 @@ type ILEventDef = member FireMethod: ILMethodRef option member OtherMethods: ILMethodRef list member CustomAttrs: ILAttributes + member MetadataIndex: int32 + member CustomAttrsStored: ILAttributesStored member IsSpecialName: bool member IsRTSpecialName: bool @@ -1389,6 +1418,8 @@ type ILPropertyDef = member Init: ILFieldInit option member Args: ILTypes member CustomAttrs: ILAttributes + member MetadataIndex: int32 + member CustomAttrsStored: ILAttributesStored member IsSpecialName: bool member IsRTSpecialName: bool @@ -1483,6 +1514,12 @@ type ILTypeDefs = /// Calls to ExistsByName will result in all the ILPreTypeDefs being read. member internal ExistsByName: string -> bool +[] +type ILTypeDefAdditionalFlags = + | None = 0 + | IsKnownToBeAttribute = 1 + | CanContainExtensionMethods = 2 + /// Represents IL Type Definitions. [] type ILTypeDef = @@ -1492,7 +1529,7 @@ type ILTypeDef = name: string * attributes: TypeAttributes * layout: ILTypeDefLayout * - implements: ILTypes * + implements: InterruptibleLazy * genericParams: ILGenericParameterDefs * extends: ILType option * methods: ILMethodDefs * @@ -1501,7 +1538,7 @@ type ILTypeDef = methodImpls: ILMethodImplDefs * events: ILEventDefs * properties: ILPropertyDefs * - isKnownToBeAttribute: bool * + additionalFlags: ILTypeDefAdditionalFlags * securityDeclsStored: ILSecurityDeclsStored * customAttrsStored: ILAttributesStored * metadataIndex: int32 -> @@ -1512,7 +1549,7 @@ type ILTypeDef = name: string * attributes: TypeAttributes * layout: ILTypeDefLayout * - implements: ILTypes * + implements: InterruptibleLazy * genericParams: ILGenericParameterDefs * extends: ILType option * methods: ILMethodDefs * @@ -1521,9 +1558,9 @@ type ILTypeDef = methodImpls: ILMethodImplDefs * events: ILEventDefs * properties: ILPropertyDefs * - isKnownToBeAttribute: bool * + additionalFlags: ILTypeDefAdditionalFlags * securityDecls: ILSecurityDecls * - customAttrs: ILAttributes -> + customAttrs: ILAttributesStored -> ILTypeDef member Name: string @@ -1531,7 +1568,7 @@ type ILTypeDef = member GenericParams: ILGenericParameterDefs member Layout: ILTypeDefLayout member NestedTypes: ILTypeDefs - member Implements: ILTypes + member Implements: InterruptibleLazy member Extends: ILType option member Methods: ILMethodDefs member SecurityDecls: ILSecurityDecls @@ -1540,6 +1577,8 @@ type ILTypeDef = member Events: ILEventDefs member Properties: ILPropertyDefs member CustomAttrs: ILAttributes + member MetadataIndex: int32 + member CustomAttrsStored: ILAttributesStored member IsClass: bool member IsStruct: bool member IsInterface: bool @@ -1558,6 +1597,7 @@ type ILTypeDef = member HasSecurity: bool member Encoding: ILDefaultPInvokeEncoding member IsKnownToBeAttribute: bool + member CanContainExtensionMethods: bool member internal WithAccess: ILTypeDefAccess -> ILTypeDef member internal WithNestedAccess: ILMemberAccess -> ILTypeDef @@ -1577,7 +1617,7 @@ type ILTypeDef = ?name: string * ?attributes: TypeAttributes * ?layout: ILTypeDefLayout * - ?implements: ILTypes * + ?implements: InterruptibleLazy * ?genericParams: ILGenericParameterDefs * ?extends: ILType option * ?methods: ILMethodDefs * @@ -1586,8 +1626,8 @@ type ILTypeDef = ?methodImpls: ILMethodImplDefs * ?events: ILEventDefs * ?properties: ILPropertyDefs * - ?isKnownToBeAttribute: bool * - ?customAttrs: ILAttributes * + ?newAdditionalFlags: ILTypeDefAdditionalFlags * + ?customAttrs: ILAttributesStored * ?securityDecls: ILSecurityDecls -> ILTypeDef @@ -1888,11 +1928,13 @@ type internal ILGlobals = member typ_Enum: ILType member typ_Object: ILType member typ_String: ILType + member typ_StringArray: ILType member typ_Type: ILType member typ_Array: ILType member typ_IntPtr: ILType member typ_UIntPtr: ILType member typ_Byte: ILType + member typ_ByteArray: ILType member typ_Int16: ILType member typ_Int32: ILType member typ_Int64: ILType @@ -2130,7 +2172,7 @@ val internal mkILGenericClass: ILTypeDefAccess * ILGenericParameterDefs * ILType * - ILType list * + InterfaceImpl list * ILMethodDefs * ILFieldDefs * ILTypeDefs * @@ -2168,8 +2210,9 @@ val internal mkRawDataValueTypeDef: ILType -> string * size: int32 * pack: uint1 /// the code, and the first instruction will be the new entry /// of the method. The instructions should be non-branching. +val internal appendInstrsToCode: ILInstr list -> ILCode -> ILCode +val internal appendInstrsToMethod: ILInstr list -> ILMethodDef -> ILMethodDef val internal prependInstrsToCode: ILInstr list -> ILCode -> ILCode - val internal prependInstrsToMethod: ILInstr list -> ILMethodDef -> ILMethodDef /// Injecting initialization code into a class. @@ -2213,12 +2256,16 @@ val internal mkCtorMethSpecForDelegate: ILGlobals -> ILType * bool -> ILMethodSp /// The toplevel "class" for a module or assembly. val internal mkILTypeForGlobalFunctions: ILScopeRef -> ILType +val emptyILInterfaceImpls: InterruptibleLazy + /// Making tables of custom attributes, etc. val mkILCustomAttrs: ILAttribute list -> ILAttributes val mkILCustomAttrsFromArray: ILAttribute[] -> ILAttributes val storeILCustomAttrs: ILAttributes -> ILAttributesStored +val mkILCustomAttrsComputed: (unit -> ILAttribute[]) -> ILAttributesStored val internal mkILCustomAttrsReader: (int32 -> ILAttribute[]) -> ILAttributesStored val emptyILCustomAttrs: ILAttributes +val emptyILCustomAttrsStored: ILAttributesStored val mkILSecurityDecls: ILSecurityDecl list -> ILSecurityDecls val emptyILSecurityDecls: ILSecurityDecls diff --git a/src/fcs-fable/src/Compiler/AbstractIL/illex.fsl b/src/fcs-fable/src/Compiler/AbstractIL/illex.fsl index 74c20658b1..588d28af20 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/illex.fsl +++ b/src/fcs-fable/src/Compiler/AbstractIL/illex.fsl @@ -109,7 +109,7 @@ rule token = parse | "/" { SLASH } | "<" { LESS } | ">" { GREATER } - | "..." { ELIPSES } + | "..." { ELLIPSES } | "::" { DCOLON } | "+" { PLUS } | (['0'-'9']) | (['0'-'9']['0'-'9']['0'-'9']+) @@ -119,10 +119,10 @@ rule token = parse (* ldc.r8 0. *) (* float64(-657435.) *) (* and int32[0...,0...] *) - (* The problem is telling an integer-followed-by-ellipses from a floating-point-nubmer-followed-by-dots *) + (* The problem is telling an integer-followed-by-ellipses from a floating-point-number-followed-by-dots *) | ((['0'-'9']) | (['0'-'9']['0'-'9']['0'-'9']+)) "..." - { VAL_INT32_ELIPSES(int32(lexemeTrimBoth lexbuf 0 3)) } + { VAL_INT32_ELLIPSES(int32(lexemeTrimBoth lexbuf 0 3)) } | ['0'-'9' 'A'-'F' 'a'-'f' ] ['0'-'9' 'A'-'F' 'a'-'f' ] { let c1 = (lexemeChar lexbuf 0) in let c2 = (lexemeChar lexbuf 1) in diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilmorph.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilmorph.fs index b430579107..9f2f3d0582 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilmorph.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilmorph.fs @@ -368,8 +368,13 @@ let rec tdef_ty2ty_ilmbody2ilmbody_mdefs2mdefs isInKnownSet enc fs (tdef: ILType let mdefsR = fMethodDefs (enc, tdef) tdef.Methods let fdefsR = fdefs_ty2ty fTyInCtxtR tdef.Fields + let implements = + tdef.Implements.Value + |> List.map (fun x -> { x with Type = fTyInCtxtR x.Type }) + |> InterruptibleLazy.FromValue + tdef.With( - implements = List.map fTyInCtxtR tdef.Implements, + implements = implements, genericParams = gparams_ty2ty fTyInCtxtR tdef.GenericParams, extends = Option.map fTyInCtxtR tdef.Extends, methods = mdefsR, @@ -378,7 +383,7 @@ let rec tdef_ty2ty_ilmbody2ilmbody_mdefs2mdefs isInKnownSet enc fs (tdef: ILType methodImpls = mimpls_ty2ty fTyInCtxtR tdef.MethodImpls, events = edefs_ty2ty fTyInCtxtR tdef.Events, properties = pdefs_ty2ty fTyInCtxtR tdef.Properties, - customAttrs = cattrs_ty2ty fTyInCtxtR tdef.CustomAttrs + customAttrs = storeILCustomAttrs (cattrs_ty2ty fTyInCtxtR tdef.CustomAttrs) ) and tdefs_ty2ty_ilmbody2ilmbody_mdefs2mdefs isInKnownSet enc fs tdefs = diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilnativeres.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilnativeres.fs index 0d0b6a1c98..62961613b3 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilnativeres.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilnativeres.fs @@ -1000,7 +1000,7 @@ type Directory(name, id) = member val ID = id member val NumberOfNamedEntries = Unchecked.defaultof with get, set member val NumberOfIdEntries = Unchecked.defaultof with get, set - member val Entries = List() + member val Entries = List() type NativeResourceWriter() = static member private CompareResources (left: Win32Resource) (right: Win32Resource) = @@ -1149,7 +1149,12 @@ type NativeResourceWriter() = dataWriter.WriteByte 0uy false - | e -> failwithf "Unknown entry %s" (if isNull e then "" else e.GetType().FullName) + | e -> + failwithf + "Unknown entry %s" + (match e with + | null -> "" + | e -> e.GetType().FullName |> string) if id >= 0 then writer.WriteInt32 id diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilpars.fsy b/src/fcs-fable/src/Compiler/AbstractIL/ilpars.fsy index 67c8e4d1fe..ca06f6570b 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilpars.fsy +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilpars.fsy @@ -3,6 +3,7 @@ %{ #nowarn "1182" // the generated code often has unused variable "parseState" +#nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` open Internal.Utilities.Library @@ -24,7 +25,7 @@ let resolveCurrentMethodSpecScope obj = *----------------------------------------------------------------------*/ %token VAL_INT64 /* 342534523534534 0x34FA434644554 */ -%token VAL_INT32_ELIPSES /* 342534523534534... */ +%token VAL_INT32_ELLIPSES /* 342534523534534... */ %token VAL_FLOAT64 /* -334234 24E-34 */ %token INSTR_I %token INSTR_I32_I32 @@ -51,7 +52,7 @@ let resolveCurrentMethodSpecScope obj = %token DCOLON %token DEFAULT %token DOT -%token ELIPSES +%token ELLIPSES %token EOF %token EXPLICIT %token FIELD @@ -285,18 +286,18 @@ bound: { (None, None) } | int32 { (None, Some $1) } - | int32 ELIPSES int32 + | int32 ELLIPSES int32 { (Some $1, Some ($3 - $1 + 1)) } - | int32 ELIPSES + | int32 ELLIPSES { (Some $1, None) } /* We need to be able to parse all of */ /* ldc.r8 0. */ /* float64(-657435.) */ /* and int32[0...,0...] */ -/* The problem is telling an integer-followed-by-ellipses from a floating-point-nubmer-followed-by-dots */ - | VAL_INT32_ELIPSES int32 +/* The problem is telling an integer-followed-by-ellipses from a floating-point-number-followed-by-dots */ + | VAL_INT32_ELLIPSES int32 { (Some $1, Some ($2 - $1 + 1)) } - | VAL_INT32_ELIPSES + | VAL_INT32_ELLIPSES { (Some $1, None) } id: diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilprint.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilprint.fs index 9d278dbe31..6ed8aec928 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilprint.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilprint.fs @@ -752,8 +752,9 @@ let goutput_superclass env os = output_string os "extends " (goutput_typ_with_shortened_class_syntax env) os typ -let goutput_implements env os (imp: ILTypes) = +let goutput_implements env os (imp: InterfaceImpl list) = if not (List.isEmpty imp) then + let imp = imp |> Seq.map _.Type output_string os "implements " output_seq ", " (goutput_typ_with_shortened_class_syntax env) os imp @@ -836,7 +837,7 @@ let rec goutput_tdef enc env contents os (cd: ILTypeDef) = output_string os "\n\t" goutput_superclass env os cd.Extends output_string os "\n\t" - goutput_implements env os cd.Implements + goutput_implements env os cd.Implements.Value output_string os "\n{\n " if contents then diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilread.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilread.fs index 854f6e0be9..12c48c2b38 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilread.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilread.fs @@ -212,7 +212,7 @@ type ByteFile(fileName: string, bytes: byte[]) = type PEFile(fileName: string, peReader: PEReader) as this = // We store a weak byte memory reference so we do not constantly create a lot of byte memory objects. - // We could just have a single ByteMemory stored in the PEFile, but we need to dispose of the stream via the finalizer; we cannot have a cicular reference. + // We could just have a single ByteMemory stored in the PEFile, but we need to dispose of the stream via the finalizer; we cannot have a circular reference. let mutable weakMemory = WeakReference(Unchecked.defaultof<_>) member _.FileName = fileName @@ -224,7 +224,7 @@ type PEFile(fileName: string, peReader: PEReader) as this = match weakMemory.TryGetTarget() with | true, m -> m.AsReadOnly() | _ -> - let block = peReader.GetEntireImage() // it's ok to call this everytime we do GetView as it is cached in the PEReader. + let block = peReader.GetEntireImage() // it's ok to call this every time we do GetView as it is cached in the PEReader. let m = ByteMemory.FromUnsafePointer(block.Pointer |> NativePtr.toNativeInt, block.Length, this) @@ -877,10 +877,10 @@ let hsCompare (TaggedIndex(t1: HasSemanticsTag, idx1: int)) (TaggedIndex(t2: Has elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let hcaCompare (TaggedIndex(t1: HasCustomAttributeTag, idx1: int)) (TaggedIndex(t2: HasCustomAttributeTag, idx2)) = - if idx1 < idx2 then -1 - elif idx1 > idx2 then 1 - else compare t1.Tag t2.Tag +let inline hcaCompare (t1: TaggedIndex) (t2: TaggedIndex) = + if t1.index < t2.index then -1 + elif t1.index > t2.index then 1 + else compare t1.tag t2.tag let mfCompare (TaggedIndex(t1: MemberForwardedTag, idx1: int)) (TaggedIndex(t2: MemberForwardedTag, idx2)) = if idx1 < idx2 then -1 @@ -902,7 +902,7 @@ let tomdCompare (TaggedIndex(t1: TypeOrMethodDefTag, idx1)) (TaggedIndex(t2: Typ elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let simpleIndexCompare (idx1: int) (idx2: int) = compare idx1 idx2 +let inline simpleIndexCompare (idx1: int) (idx2: int) = compare idx1 idx2 //--------------------------------------------------------------------- // The various keys for the various caches. @@ -945,58 +945,32 @@ type GenericParamsIdx = GenericParamsIdx of numTypars: int * TypeOrMethodDefTag // Polymorphic caches for row and heap readers //--------------------------------------------------------------------- -let mkCacheInt32 lowMem _inbase _nm _sz = +let mkCacheGeneric lowMem _inbase _nm (sz: int) = if lowMem then (fun f x -> f x) else let mutable cache = null - let mutable count = 0 #if STATISTICS - addReport (fun oc -> - if count <> 0 then - oc.WriteLine((_inbase + string count + " " + _nm + " cache hits"): string)) -#endif - fun f (idx: int32) -> - let cache = - match cache with - | Null -> - let v = ConcurrentDictionary(Environment.ProcessorCount, 11) - cache <- v - v - | NonNull v -> v + let mutable _count = 0 - match cache.TryGetValue idx with - | true, res -> - count <- count + 1 - res - | _ -> - let res = f idx - cache[idx] <- res - res - -let mkCacheGeneric lowMem _inbase _nm _sz = - if lowMem then - (fun f x -> f x) - else - let mutable cache = null - let mutable count = 0 -#if STATISTICS addReport (fun oc -> - if !count <> 0 then - oc.WriteLine((_inbase + string !count + " " + _nm + " cache hits"): string)) + if !_count <> 0 then + oc.WriteLine((_inbase + string !_count + " " + _nm + " cache hits"): string)) #endif fun f (idx: 'T) -> let cache = match cache with - | Null -> - let v = ConcurrentDictionary<_, _>(Environment.ProcessorCount, 11 (* sz: int *) ) + | null -> + let v = ConcurrentDictionary<_, _>(Environment.ProcessorCount, sz) cache <- v v - | NonNull v -> v + | v -> v match cache.TryGetValue idx with | true, v -> - count <- count + 1 +#if STATISTICS + _count <- _count + 1 +#endif v | _ -> let res = f idx @@ -1199,6 +1173,7 @@ type ILMetadataReader = customAttrsReader_Module: ILAttributesStored customAttrsReader_Assembly: ILAttributesStored customAttrsReader_TypeDef: ILAttributesStored + customAttrsReader_InterfaceImpl: ILAttributesStored customAttrsReader_GenericParam: ILAttributesStored customAttrsReader_FieldDef: ILAttributesStored customAttrsReader_MethodDef: ILAttributesStored @@ -1225,8 +1200,8 @@ type CustomAttributeRow = val mutable typeIndex: TaggedIndex val mutable valueIndex: int -let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowReader) = - let mutable row = ref Unchecked.defaultof +let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowReader<_, _, _>) = + let mutable row = ref Unchecked.defaultof<_> let mutable startRid = -1 let mutable endRid = -1 @@ -1316,7 +1291,7 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead startRid, endRid -let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader) = +let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<_, _, _>) = let startRid, endRid = seekReadIndexedRowsRange numRows binaryChop reader if startRid <= 0 || endRid < startRid then @@ -1324,7 +1299,7 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR else Array.init (endRid - startRid + 1) (fun i -> - let mutable row = ref Unchecked.defaultof + let mutable row = ref Unchecked.defaultof<_> reader.GetRow(startRid + i, row) reader.ConvertRow(row)) @@ -1472,11 +1447,10 @@ let seekReadParamRow (ctxt: ILMetadataReader) mdv idx = (flags, seq, nameIdx) /// Read Table InterfaceImpl. -let seekReadInterfaceImplRow (ctxt: ILMetadataReader) mdv idx = +let private seekReadInterfaceIdx (ctxt: ILMetadataReader) mdv idx = let mutable addr = rowAddr ctxt TableNames.InterfaceImpl idx - let tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv addr - let intfIdx = seekReadTypeDefOrRefOrSpecIdx ctxt mdv addr - (tidx, intfIdx) + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv addr + seekReadTypeDefOrRefOrSpecIdx ctxt mdv addr /// Read Table MemberRef. let seekReadMemberRefRow (ctxt: ILMetadataReader) mdv idx = @@ -1609,10 +1583,10 @@ let seekReadTypeSpecRow (ctxt: ILMetadataReader) mdv idx = let seekReadImplMapRow (ctxt: ILMetadataReader) mdv idx = let mutable addr = rowAddr ctxt TableNames.ImplMap idx let flags = seekReadUInt16AsInt32Adv mdv addr - let forwrdedIdx = seekReadMemberForwardedIdx ctxt mdv addr + let forwardedIdx = seekReadMemberForwardedIdx ctxt mdv addr let nameIdx = seekReadStringIdx ctxt mdv addr let scopeIdx = seekReadUntaggedIdx TableNames.ModuleRef ctxt mdv addr - (flags, forwrdedIdx, nameIdx, scopeIdx) + (flags, forwardedIdx, nameIdx, scopeIdx) /// Read Table FieldRVA. let seekReadFieldRVARow (ctxt: ILMetadataReader) mdv idx = @@ -1697,11 +1671,11 @@ let seekReadGenericParamRow (ctxt: ILMetadataReader) mdv idx = (idx, seq, flags, ownerIdx, nameIdx) // Read Table GenericParamConstraint. -let seekReadGenericParamConstraintRow (ctxt: ILMetadataReader) mdv idx = +let seekReadGenericParamConstraintIdx (ctxt: ILMetadataReader) mdv idx = let mutable addr = rowAddr ctxt TableNames.GenericParamConstraint idx - let pidx = seekReadUntaggedIdx TableNames.GenericParam ctxt mdv addr + let _pidx = seekReadUntaggedIdx TableNames.GenericParam ctxt mdv addr let constraintIdx = seekReadTypeDefOrRefOrSpecIdx ctxt mdv addr - (pidx, constraintIdx) + constraintIdx /// Read Table ILMethodSpec. let seekReadMethodSpecRow (ctxt: ILMetadataReader) mdv idx = @@ -1724,7 +1698,7 @@ let readStringHeapUncached ctxtH idx = let readStringHeap (ctxt: ILMetadataReader) idx = ctxt.readStringHeap idx -let readStringHeapOption (ctxt: ILMetadataReader) idx = +let inline readStringHeapOption (ctxt: ILMetadataReader) idx = if idx = 0 then None else Some(readStringHeap ctxt idx) let readBlobHeapUncached ctxtH idx = @@ -2163,14 +2137,81 @@ and typeDefReader ctxtH : ILTypeDefStored = let layout = typeLayoutOfFlags ctxt mdv flags idx let hasLayout = - (match layout with - | ILTypeDefLayout.Explicit _ -> true - | _ -> false) + match layout with + | ILTypeDefLayout.Explicit _ -> true + | _ -> false + + let containsExtensionMethods = + let mutable containsExtensionMethods = false + let searchedKey = TaggedIndex(hca_TypeDef, idx) + + let attributesSearcher = + { new ISeekReadIndexedRowReader with + member _.GetRow(i, rowIndex) = rowIndex.Value <- i + member _.GetKey(rowIndex) = rowIndex.Value + + member _.CompareKey(rowIndex) = + let mutable addr = rowAddr ctxt TableNames.CustomAttribute rowIndex + // read parentIndex + let key = seekReadHasCustomAttributeIdx ctxt mdv addr + hcaCompare searchedKey key + + member _.ConvertRow(i) = i.Value + } + + let attrsStartIdx, attrsEndIdx = + seekReadIndexedRowsRange + (ctxt.getNumRows TableNames.CustomAttribute) + (isSorted ctxt TableNames.CustomAttribute) + attributesSearcher + + if attrsStartIdx <= 0 || attrsEndIdx < attrsStartIdx then + false + else + let mutable attrIdx = attrsStartIdx + + while attrIdx <= attrsEndIdx && not containsExtensionMethods do + let mutable addr = rowAddr ctxt TableNames.CustomAttribute attrIdx + // skip parentIndex to read typeIndex + seekReadHasCustomAttributeIdx ctxt mdv addr |> ignore + let attrTypeIndex = seekReadCustomAttributeTypeIdx ctxt mdv addr + let attrCtorIdx = attrTypeIndex.index + + let name = + if attrTypeIndex.tag = cat_MethodDef then + // the ExtensionAttribute constructor can be cat_MethodDef if the metadata is read from the assembly + // in which the corresponding attribute is defined + let _, (_, nameIdx, namespaceIdx, _, _, _) = seekMethodDefParent ctxt attrCtorIdx + readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) + else + let mutable addr = rowAddr ctxt TableNames.MemberRef attrCtorIdx + let mrpTag = seekReadMemberRefParentIdx ctxt mdv addr + + if mrpTag.tag <> mrp_TypeRef then + "" + else + let _, nameIdx, namespaceIdx = seekReadTypeRefRow ctxt mdv mrpTag.index + readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) + + if name = "System.Runtime.CompilerServices.ExtensionAttribute" then + containsExtensionMethods <- true + + attrIdx <- attrIdx + 1 + + containsExtensionMethods + + let additionalFlags = + if containsExtensionMethods then + ILTypeDefAdditionalFlags.CanContainExtensionMethods + else + ILTypeDefAdditionalFlags.None let mdefs = seekReadMethods ctxt numTypars methodsIdx endMethodsIdx let fdefs = seekReadFields ctxt (numTypars, hasLayout) fieldsIdx endFieldsIdx let nested = seekReadNestedTypeDefs ctxt idx + let impls = seekReadInterfaceImpls ctxt mdv numTypars idx + let mimpls = seekReadMethodImpls ctxt numTypars idx let props = seekReadProperties ctxt numTypars idx let events = seekReadEvents ctxt numTypars idx @@ -2189,7 +2230,7 @@ and typeDefReader ctxtH : ILTypeDefStored = methodImpls = mimpls, events = events, properties = props, - isKnownToBeAttribute = false, + additionalFlags = additionalFlags, customAttrsStored = ctxt.customAttrsReader_TypeDef, metadataIndex = idx )) @@ -2215,14 +2256,26 @@ and seekReadNestedTypeDefs (ctxt: ILMetadataReader) tidx = |]) and seekReadInterfaceImpls (ctxt: ILMetadataReader) mdv numTypars tidx = - seekReadIndexedRows ( - ctxt.getNumRows TableNames.InterfaceImpl, - seekReadInterfaceImplRow ctxt mdv, - fst, - simpleIndexCompare tidx, - isSorted ctxt TableNames.InterfaceImpl, - (snd >> seekReadTypeDefOrRef ctxt numTypars AsObject []) - ) + InterruptibleLazy(fun () -> + seekReadIndexedRows ( + ctxt.getNumRows TableNames.InterfaceImpl, + id, + id, + (fun idx -> + let mutable addr = rowAddr ctxt TableNames.InterfaceImpl idx + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv addr + simpleIndexCompare tidx _tidx), + isSorted ctxt TableNames.InterfaceImpl, + (fun idx -> + let intfIdx = seekReadInterfaceIdx ctxt mdv idx + let ilType = seekReadTypeDefOrRef ctxt numTypars AsObject [] intfIdx + + { + Idx = idx + Type = ilType + CustomAttrsStored = ctxt.customAttrsReader_InterfaceImpl + }) + )) and seekReadGenericParams ctxt numTypars (a, b) : ILGenericParameterDefs = ctxt.seekReadGenericParams (GenericParamsIdx(numTypars, a, b)) @@ -2231,12 +2284,14 @@ and seekReadGenericParamsUncached ctxtH (GenericParamsIdx(numTypars, a, b)) = let (ctxt: ILMetadataReader) = getHole ctxtH let mdv = ctxt.mdfile.GetView() + let key = TaggedIndex(a, b) + let pars = seekReadIndexedRows ( ctxt.getNumRows TableNames.GenericParam, seekReadGenericParamRow ctxt mdv, (fun (_, _, _, tomd, _) -> tomd), - tomdCompare (TaggedIndex(a, b)), + tomdCompare key, isSorted ctxt TableNames.GenericParam, (fun (gpidx, seq, flags, _, nameIdx) -> let flags = int32 flags @@ -2260,6 +2315,7 @@ and seekReadGenericParamsUncached ctxtH (GenericParamsIdx(numTypars, a, b)) = HasReferenceTypeConstraint = (flags &&& 0x0004) <> 0 HasNotNullableValueTypeConstraint = (flags &&& 0x0008) <> 0 HasDefaultConstructorConstraint = (flags &&& 0x0010) <> 0 + HasAllowsRefStruct = (flags &&& 0x0020) <> 0 }) ) @@ -2268,11 +2324,16 @@ and seekReadGenericParamsUncached ctxtH (GenericParamsIdx(numTypars, a, b)) = and seekReadGenericParamConstraints (ctxt: ILMetadataReader) mdv numTypars gpidx = seekReadIndexedRows ( ctxt.getNumRows TableNames.GenericParamConstraint, - seekReadGenericParamConstraintRow ctxt mdv, - fst, - simpleIndexCompare gpidx, + id, + id, + (fun idx -> + let mutable addr = rowAddr ctxt TableNames.GenericParamConstraint idx + let pidx = seekReadUntaggedIdx TableNames.GenericParam ctxt mdv addr + simpleIndexCompare gpidx pidx), isSorted ctxt TableNames.GenericParamConstraint, - (snd >> seekReadTypeDefOrRef ctxt numTypars AsObject []) + (fun idx -> + let constraintIdx = seekReadGenericParamConstraintIdx ctxt mdv idx + seekReadTypeDefOrRef ctxt numTypars AsObject [] constraintIdx) ) and seekReadTypeDefAsType (ctxt: ILMetadataReader) boxity (ginst: ILTypes) idx = @@ -2283,6 +2344,8 @@ and seekReadTypeDefAsTypeUncached ctxtH (TypeDefAsTypIdx(boxity, ginst, idx)) = mkILTy boxity (ILTypeSpec.Create(seekReadTypeDefAsTypeRef ctxt idx, ginst)) and seekReadTypeDefAsTypeRef (ctxt: ILMetadataReader) idx = + let mdv = ctxt.mdfile.GetView() + let enc = if seekIsTopTypeDefOfIdx ctxt idx then [] @@ -2290,11 +2353,14 @@ and seekReadTypeDefAsTypeRef (ctxt: ILMetadataReader) idx = let enclIdx = seekReadIndexedRow ( ctxt.getNumRows TableNames.Nested, - seekReadNestedRow ctxt, - fst, - simpleIndexCompare idx, + id, + id, + (fun i -> + let mutable addr = rowAddr ctxt TableNames.Nested i + let nestedIdx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv addr + simpleIndexCompare idx nestedIdx), isSorted ctxt TableNames.Nested, - snd + (fun i -> seekReadNestedRow ctxt i |> snd) ) let tref = seekReadTypeDefAsTypeRef ctxt enclIdx @@ -2715,10 +2781,10 @@ and readBlobHeapAsPropertySigUncached ctxtH (BlobAsPropSigIdx(numTypars, blobIdx let sigptr = 0 let ccByte, sigptr = sigptrGetByte bytes sigptr let hasthis = byteAsHasThis ccByte - let ccMaxked = (ccByte &&& 0x0Fuy) + let ccMasked = (ccByte &&& 0x0Fuy) - if ccMaxked <> e_IMAGE_CEE_CS_CALLCONV_PROPERTY then - dprintn ("warning: property sig was " + string ccMaxked + " instead of CC_PROPERTY") + if ccMasked <> e_IMAGE_CEE_CS_CALLCONV_PROPERTY then + dprintn ("warning: property sig was " + string ccMasked + " instead of CC_PROPERTY") let struct (numparams, sigptr) = sigptrGetZInt32 bytes sigptr let retTy, sigptr = sigptrGetTy ctxt numTypars bytes sigptr @@ -2756,17 +2822,17 @@ and byteAsHasThis b = and byteAsCallConv b = let cc = - let ccMaxked = b &&& 0x0Fuy + let ccMasked = b &&& 0x0Fuy - if ccMaxked = e_IMAGE_CEE_CS_CALLCONV_FASTCALL then + if ccMasked = e_IMAGE_CEE_CS_CALLCONV_FASTCALL then ILArgConvention.FastCall - elif ccMaxked = e_IMAGE_CEE_CS_CALLCONV_STDCALL then + elif ccMasked = e_IMAGE_CEE_CS_CALLCONV_STDCALL then ILArgConvention.StdCall - elif ccMaxked = e_IMAGE_CEE_CS_CALLCONV_THISCALL then + elif ccMasked = e_IMAGE_CEE_CS_CALLCONV_THISCALL then ILArgConvention.ThisCall - elif ccMaxked = e_IMAGE_CEE_CS_CALLCONV_CDECL then + elif ccMasked = e_IMAGE_CEE_CS_CALLCONV_CDECL then ILArgConvention.CDecl - elif ccMaxked = e_IMAGE_CEE_CS_CALLCONV_VARARG then + elif ccMasked = e_IMAGE_CEE_CS_CALLCONV_VARARG then ILArgConvention.VarArg else ILArgConvention.Default @@ -2848,22 +2914,26 @@ and seekReadMemberRefAsFieldSpecUncached ctxtH (MemberRefAsFspecIdx(numTypars, i // method-range and field-range start/finish indexes and seekReadMethodDefAsMethodData ctxt idx = ctxt.seekReadMethodDefAsMethodData idx +and seekMethodDefParent (ctxt: ILMetadataReader) methodIdx = + seekReadIndexedRow ( + ctxt.getNumRows TableNames.TypeDef, + (fun i -> i, seekReadTypeDefRow ctxt i), + id, + (fun (i, (_, _, _, _, _, methodsIdx as info)) -> + if methodsIdx > methodIdx then + -1 + else + let struct (_, endMethodsIdx) = seekReadTypeDefRowExtents ctxt info i + if endMethodsIdx <= methodIdx then 1 else 0), + true, + id + ) + and seekReadMethodDefAsMethodDataUncached ctxtH idx = let (ctxt: ILMetadataReader) = getHole ctxtH let mdv = ctxt.mdfile.GetView() // Look for the method def parent. - let tidx = - seekReadIndexedRow ( - ctxt.getNumRows TableNames.TypeDef, - (fun i -> i, seekReadTypeDefRowWithExtents ctxt i), - id, - (fun (_, ((_, _, _, _, _, methodsIdx), (_, endMethodsIdx))) -> - if endMethodsIdx <= idx then 1 - elif methodsIdx <= idx && idx < endMethodsIdx then 0 - else -1), - true, - fst - ) + let tidx, _ = seekMethodDefParent ctxt idx // Create a formal instantiation if needed let typeGenericArgs = seekReadGenericParams ctxt 0 (tomd_TypeDef, tidx) let typeGenericArgsCount = typeGenericArgs.Length @@ -3051,15 +3121,18 @@ and seekReadMethodImpls (ctxt: ILMetadataReader) numTypars tidx = let mimpls = seekReadIndexedRows ( ctxt.getNumRows TableNames.MethodImpl, - seekReadMethodImplRow ctxt mdv, - (fun (a, _, _) -> a), - simpleIndexCompare tidx, + id, + id, + (fun i -> + let mutable addr = rowAddr ctxt TableNames.MethodImpl i + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv addr + simpleIndexCompare tidx _tidx), isSorted ctxt TableNames.MethodImpl, - (fun (_, b, c) -> b, c) + seekReadMethodImplRow ctxt mdv ) mimpls - |> List.map (fun (b, c) -> + |> List.map (fun (_, b, c) -> { OverrideBy = let (MethodData(enclTy, cc, nm, argTys, retTy, methInst)) = @@ -3128,11 +3201,14 @@ and seekReadEvents (ctxt: ILMetadataReader) numTypars tidx = match seekReadOptionalIndexedRow ( ctxt.getNumRows TableNames.EventMap, - (fun i -> i, seekReadEventMapRow ctxt mdv i), - (fun (_, row) -> fst row), - compare tidx, + id, + id, + (fun i -> + let mutable addr = rowAddr ctxt TableNames.EventMap i + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv addr + simpleIndexCompare tidx _tidx), false, - (fun (i, row) -> (i, snd row)) + (fun i -> i, seekReadEventMapRow ctxt mdv i |> snd) ) with | None -> [] @@ -3195,11 +3271,14 @@ and seekReadProperties (ctxt: ILMetadataReader) numTypars tidx = match seekReadOptionalIndexedRow ( ctxt.getNumRows TableNames.PropertyMap, - (fun i -> i, seekReadPropertyMapRow ctxt mdv i), - (fun (_, row) -> fst row), - compare tidx, + id, + id, + (fun i -> + let mutable addr = rowAddr ctxt TableNames.PropertyMap i + let _tidx = seekReadUntaggedIdx TableNames.TypeDef ctxt mdv addr + simpleIndexCompare tidx _tidx), false, - (fun (i, row) -> (i, snd row)) + (fun i -> i, seekReadPropertyMapRow ctxt mdv i |> snd) ) with | None -> [] @@ -3223,16 +3302,22 @@ and customAttrsReader ctxtH tag : ILAttributesStored = let (ctxt: ILMetadataReader) = getHole ctxtH let mdv = ctxt.mdfile.GetView() - let reader = - { new ISeekReadIndexedRowReader, ILAttribute> with - member _.GetRow(i, row) = - seekReadCustomAttributeRow ctxt mdv i row - - member _.GetKey(attrRow) = attrRow.Value.parentIndex - - member _.CompareKey(key) = hcaCompare (TaggedIndex(tag, idx)) key + let searchedKey = TaggedIndex(tag, idx) - member _.ConvertRow(attrRow) = + let reader = + { new ISeekReadIndexedRowReader with + member _.GetRow(i, rowIndex) = rowIndex.Value <- i + member _.GetKey(rowIndex) = rowIndex.Value + + member _.CompareKey(rowIndex) = + let mutable addr = rowAddr ctxt TableNames.CustomAttribute rowIndex + // read parentIndex + let key = seekReadHasCustomAttributeIdx ctxt mdv addr + hcaCompare searchedKey key + + member _.ConvertRow(rowIndex) = + let mutable attrRow = ref Unchecked.defaultof<_> + seekReadCustomAttributeRow ctxt mdv rowIndex.Value attrRow seekReadCustomAttr ctxt (attrRow.Value.typeIndex, attrRow.Value.valueIndex) } @@ -4406,7 +4491,7 @@ let openMetadataReader // All the caches. The sizes are guesstimates for the rough sharing-density of the assembly let cacheAssemblyRef = - mkCacheInt32 false inbase "ILAssemblyRef" (getNumRows TableNames.AssemblyRef) + mkCacheGeneric false inbase "ILAssemblyRef" (getNumRows TableNames.AssemblyRef) let cacheMethodSpecAsMethodData = mkCacheGeneric reduceMemoryUsage inbase "MethodSpecAsMethodData" (getNumRows TableNames.MethodSpec / 20 + 1) @@ -4418,7 +4503,7 @@ let openMetadataReader mkCacheGeneric reduceMemoryUsage inbase "CustomAttr" (getNumRows TableNames.CustomAttribute / 50 + 1) let cacheTypeRef = - mkCacheInt32 false inbase "ILTypeRef" (getNumRows TableNames.TypeRef / 20 + 1) + mkCacheGeneric false inbase "ILTypeRef" (getNumRows TableNames.TypeRef / 20 + 1) let cacheTypeRefAsType = mkCacheGeneric reduceMemoryUsage inbase "TypeRefAsType" (getNumRows TableNames.TypeRef / 20 + 1) @@ -4436,38 +4521,38 @@ let openMetadataReader mkCacheGeneric reduceMemoryUsage inbase "TypeDefAsType" (getNumRows TableNames.TypeDef / 20 + 1) let cacheMethodDefAsMethodData = - mkCacheInt32 reduceMemoryUsage inbase "MethodDefAsMethodData" (getNumRows TableNames.Method / 20 + 1) + mkCacheGeneric reduceMemoryUsage inbase "MethodDefAsMethodData" (getNumRows TableNames.Method / 20 + 1) let cacheGenericParams = mkCacheGeneric reduceMemoryUsage inbase "GenericParams" (getNumRows TableNames.GenericParam / 20 + 1) let cacheFieldDefAsFieldSpec = - mkCacheInt32 reduceMemoryUsage inbase "FieldDefAsFieldSpec" (getNumRows TableNames.Field / 20 + 1) + mkCacheGeneric reduceMemoryUsage inbase "FieldDefAsFieldSpec" (getNumRows TableNames.Field / 20 + 1) let cacheUserStringHeap = - mkCacheInt32 reduceMemoryUsage inbase "UserStringHeap" (userStringsStreamSize / 20 + 1) + mkCacheGeneric reduceMemoryUsage inbase "UserStringHeap" (userStringsStreamSize / 20 + 1) // nb. Lots and lots of cache hits on this cache, hence never optimize cache away let cacheStringHeap = - mkCacheInt32 false inbase "string heap" (stringsStreamSize / 50 + 1) + mkCacheGeneric false inbase "string heap" (stringsStreamSize / 50 + 1) let cacheBlobHeap = - mkCacheInt32 reduceMemoryUsage inbase "blob heap" (blobsStreamSize / 50 + 1) + mkCacheGeneric reduceMemoryUsage inbase "blob heap" (blobsStreamSize / 50 + 1) // These tables are not required to enforce sharing fo the final data // structure, but are very useful as searching these tables gives rise to many reads // in standard applications. let cacheNestedRow = - mkCacheInt32 reduceMemoryUsage inbase "Nested Table Rows" (getNumRows TableNames.Nested / 20 + 1) + mkCacheGeneric reduceMemoryUsage inbase "Nested Table Rows" (getNumRows TableNames.Nested / 20 + 1) let cacheConstantRow = - mkCacheInt32 reduceMemoryUsage inbase "Constant Rows" (getNumRows TableNames.Constant / 20 + 1) + mkCacheGeneric reduceMemoryUsage inbase "Constant Rows" (getNumRows TableNames.Constant / 20 + 1) let cacheMethodSemanticsRow = - mkCacheInt32 reduceMemoryUsage inbase "MethodSemantics Rows" (getNumRows TableNames.MethodSemantics / 20 + 1) + mkCacheGeneric reduceMemoryUsage inbase "MethodSemantics Rows" (getNumRows TableNames.MethodSemantics / 20 + 1) let cacheTypeDefRow = - mkCacheInt32 reduceMemoryUsage inbase "ILTypeDef Rows" (getNumRows TableNames.TypeDef / 20 + 1) + mkCacheGeneric reduceMemoryUsage inbase "ILTypeDef Rows" (getNumRows TableNames.TypeDef / 20 + 1) let rowAddr (tab: TableName) idx = tablePhysLocations[tab.Index] + (idx - 1) * tableRowSizes[tab.Index] @@ -4518,6 +4603,7 @@ let openMetadataReader customAttrsReader_Module = customAttrsReader ctxtH hca_Module customAttrsReader_Assembly = customAttrsReader ctxtH hca_Assembly customAttrsReader_TypeDef = customAttrsReader ctxtH hca_TypeDef + customAttrsReader_InterfaceImpl = customAttrsReader ctxtH hca_InterfaceImpl customAttrsReader_GenericParam = customAttrsReader ctxtH hca_GenericParam customAttrsReader_FieldDef = customAttrsReader ctxtH hca_FieldDef customAttrsReader_MethodDef = customAttrsReader ctxtH hca_MethodDef @@ -4664,10 +4750,10 @@ let openPEFileReader (fileName, pefile: BinaryFile, noFileOnDisk) = let _headerPhysSize = seekReadInt32 pev (peOptionalHeaderPhysLoc + 60) // Header Size Combined size of MS-DOS Header, PE Header, PE Optional Header and padding let subsys = seekReadUInt16 pev (peOptionalHeaderPhysLoc + 68) // SubSystem Subsystem required to run this image. - let useHighEnthropyVA = + let useHighEntropyVA = let n = seekReadUInt16 pev (peOptionalHeaderPhysLoc + 70) - let highEnthropyVA = 0x20us - (n &&& highEnthropyVA) = highEnthropyVA + let highEntropyVA = 0x20us + (n &&& highEntropyVA) = highEntropyVA (* x86: 000000e0 *) @@ -4867,7 +4953,7 @@ let openPEFileReader (fileName, pefile: BinaryFile, noFileOnDisk) = let peinfo = (subsys, (subsysMajor, subsysMinor), - useHighEnthropyVA, + useHighEntropyVA, ilOnly, only32, is32bitpreferred, diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilreflect.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilreflect.fs index 748ecafda2..c6c5e5ab99 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilreflect.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilreflect.fs @@ -163,7 +163,12 @@ type TypeBuilder with if logRefEmitCalls then printfn "typeBuilder%d.CreateType()" (abs <| hash typB) + //Buggy annotation in ns20, will not be fixed. +#if NETSTANDARD && !NO_CHECKNULLS + !!(typB.CreateTypeInfo()) :> Type +#else typB.CreateTypeInfo() :> Type +#endif member typB.DefineNestedTypeAndLog(name, attrs) = let res = typB.DefineNestedType(name, attrs) @@ -198,8 +203,8 @@ type TypeBuilder with typB.DefineGenericParameters gps - member typB.DefineConstructorAndLog(attrs, cconv, parms) = - let consB = typB.DefineConstructor(attrs, cconv, parms) + member typB.DefineConstructorAndLog(attrs, cconv, params_) = + let consB = typB.DefineConstructor(attrs, cconv, params_) if logRefEmitCalls then printfn @@ -208,7 +213,7 @@ type TypeBuilder with (abs <| hash typB) (LanguagePrimitives.EnumToValue attrs) cconv - parms + params_ consB @@ -270,10 +275,9 @@ type TypeBuilder with else null - if not (isNull m) then - m.Invoke(null, args) - else - raise (MissingMethodException nm) + match m with + | null -> raise (MissingMethodException nm) + | m -> m.Invoke(null, (args: obj array)) member typB.SetCustomAttributeAndLog(cinfo, bytes) = if logRefEmitCalls then @@ -284,9 +288,12 @@ type TypeBuilder with type OpCode with member opcode.RefEmitName = - (string (Char.ToUpper(opcode.Name[0])) + opcode.Name[1..]) - .Replace(".", "_") - .Replace("_i4", "_I4") + match opcode.Name with + | null -> "" + | name -> + (string (Char.ToUpper(name[0])) + name[1..]) + .Replace(".", "_") + .Replace("_i4", "_I4") type ILGenerator with @@ -320,7 +327,7 @@ type ILGenerator with ilG.BeginFinallyBlock() - member ilG.BeginCatchBlockAndLog ty = + member ilG.BeginCatchBlockAndLog(ty: Type) = if logRefEmitCalls then printfn "ilg%d.BeginCatchBlock(%A)" (abs <| hash ilG) ty @@ -396,7 +403,7 @@ type ILGenerator with member x.EmitAndLog(op: OpCode, v: ConstructorInfo) = if logRefEmitCalls then - printfn "ilg%d.Emit(OpCodes.%s, constructor_%s)" (abs <| hash x) op.RefEmitName v.DeclaringType.Name + printfn "ilg%d.Emit(OpCodes.%s, constructor_%s)" (abs <| hash x) op.RefEmitName (!!v.DeclaringType).Name x.Emit(op, v) @@ -693,7 +700,7 @@ let rec convTypeSpec cenv emEnv preferCreated (tspec: ILTypeSpec) = let typT = convTypeRef cenv emEnv preferCreated tspec.TypeRef let tyargs = List.map (convTypeAux cenv emEnv preferCreated) tspec.GenericArgs - let res = + let res: Type MaybeNull = match isNil tyargs, typT.IsGenericType with | _, true -> typT.MakeGenericType(List.toArray tyargs) | true, false -> typT @@ -706,7 +713,7 @@ let rec convTypeSpec cenv emEnv preferCreated (tspec: ILTypeSpec) = and convTypeAux cenv emEnv preferCreated ty = match ty with - | ILType.Void -> Type.GetType("System.Void") + | ILType.Void -> !! Type.GetType("System.Void") | ILType.Array(shape, eltType) -> let baseT = convTypeAux cenv emEnv preferCreated eltType let nDims = shape.Rank @@ -844,26 +851,10 @@ let queryableTypeGetField _emEnv (parentT: Type) (fref: ILFieldRef) = | NonNull res -> res let nonQueryableTypeGetField (parentTI: Type) (fieldInfo: FieldInfo) : FieldInfo = - let res = - if parentTI.IsGenericType then - TypeBuilder.GetField(parentTI, fieldInfo) - else - fieldInfo - - match res with - | Null -> - error ( - Error( - FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ( - "field", - fieldInfo.Name, - parentTI.AssemblyQualifiedName, - parentTI.Assembly.FullName - ), - range0 - ) - ) - | NonNull res -> res + if parentTI.IsGenericType then + TypeBuilder.GetField(parentTI, fieldInfo) + else + fieldInfo let convFieldSpec cenv emEnv fspec = let fref = fspec.FieldRef @@ -1012,21 +1003,16 @@ let queryableTypeGetMethod cenv emEnv parentT (mref: ILMethodRef) : MethodInfo = let methInfo = try - parentT.GetMethod( - mref.Name, - cconv ||| BindingFlags.Public ||| BindingFlags.NonPublic, - null, - argTs, - (null: ParameterModifier[] MaybeNull) - ) + parentT.GetMethod(mref.Name, cconv ||| BindingFlags.Public ||| BindingFlags.NonPublic, null, argTs, null) // This can fail if there is an ambiguity w.r.t. return type with _ -> null - if (isNotNull methInfo && equalTypes resT methInfo.ReturnType) then - methInfo - else - queryableTypeGetMethodBySearch cenv emEnv parentT mref + match methInfo with + | null -> queryableTypeGetMethodBySearch cenv emEnv parentT mref + | m when equalTypes resT m.ReturnType -> m + | _ -> queryableTypeGetMethodBySearch cenv emEnv parentT mref + else queryableTypeGetMethodBySearch cenv emEnv parentT mref @@ -1062,7 +1048,12 @@ let convMethodRef cenv emEnv (parentTI: Type) (mref: ILMethodRef) = | Null -> error ( Error( - FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ("method", mref.Name, parentTI.FullName, parentTI.Assembly.FullName), + FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ( + "method", + mref.Name, + parentTI.FullName |> string, + parentTI.Assembly.FullName |> string + ), range0 ) ) @@ -1103,7 +1094,12 @@ let queryableTypeGetConstructor cenv emEnv (parentT: Type) (mref: ILMethodRef) = | Null -> error ( Error( - FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ("constructor", mref.Name, parentT.FullName, parentT.Assembly.FullName), + FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ( + "constructor", + mref.Name, + parentT.FullName |> string, + parentT.Assembly.FullName |> string + ), range0 ) ) @@ -1138,7 +1134,12 @@ let convConstructorSpec cenv emEnv (mspec: ILMethodSpec) = | Null -> error ( Error( - FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ("constructor", "", parentTI.FullName, parentTI.Assembly.FullName), + FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ( + "constructor", + "", + parentTI.FullName |> string, + parentTI.Assembly.FullName |> string + ), range0 ) ) @@ -1490,7 +1491,7 @@ let rec emitInstr cenv (modB: ModuleBuilder) emEnv (ilG: ILGenerator) instr = ilG.EmitAndLog(OpCodes.Ldelema, convType cenv emEnv ty) else let arrayTy = convType cenv emEnv (ILType.Array(shape, ty)) - let elemTy = arrayTy.GetElementType() + let elemTy = !! arrayTy.GetElementType() let argTys = Array.create shape.Rank typeof let retTy = elemTy.MakeByRefType() @@ -1516,7 +1517,7 @@ let rec emitInstr cenv (modB: ModuleBuilder) emEnv (ilG: ILGenerator) instr = ilG.EmitAndLog(OpCodes.Stelem, convType cenv emEnv ty) else let arrayTy = convType cenv emEnv (ILType.Array(shape, ty)) - let elemTy = arrayTy.GetElementType() + let elemTy = !! arrayTy.GetElementType() let meth = modB.GetArrayMethodAndLog( @@ -1624,7 +1625,7 @@ let emitCode cenv modB emEnv (ilG: ILGenerator) (code: ILCode) = | ILExceptionClause.FilterCatch((startFilter, _), (startHandler, endHandler)) -> add startFilter ilG.BeginExceptFilterBlockAndLog - add startHandler (fun () -> ilG.BeginCatchBlockAndLog null) + add startHandler (fun () -> ilG.BeginCatchBlockAndLog Unchecked.defaultof<_>) add endHandler ilG.EndExceptionBlockAndLog | ILExceptionClause.TypeCatch(ty, (startHandler, endHandler)) -> @@ -1713,31 +1714,34 @@ let buildGenParamsPass1b cenv emEnv (genArgs: Type array) (gps: ILGenericParamet gp.CustomAttrs |> emitCustomAttrs cenv emEnv (wrapCustomAttr gpB.SetCustomAttribute) - let flags = GenericParameterAttributes.None - let flags = match gp.Variance with - | NonVariant -> flags - | CoVariant -> flags ||| GenericParameterAttributes.Covariant - | ContraVariant -> flags ||| GenericParameterAttributes.Contravariant + | NonVariant -> GenericParameterAttributes.None + | CoVariant -> GenericParameterAttributes.Covariant + | ContraVariant -> GenericParameterAttributes.Contravariant - let flags = - if gp.HasReferenceTypeConstraint then - flags ||| GenericParameterAttributes.ReferenceTypeConstraint - else - flags + let zero = GenericParameterAttributes.None let flags = - if gp.HasNotNullableValueTypeConstraint then - flags ||| GenericParameterAttributes.NotNullableValueTypeConstraint - else - flags - - let flags = - if gp.HasDefaultConstructorConstraint then - flags ||| GenericParameterAttributes.DefaultConstructorConstraint - else - flags + flags + ||| (if gp.HasReferenceTypeConstraint then + GenericParameterAttributes.ReferenceTypeConstraint + else + zero) + ||| (if gp.HasNotNullableValueTypeConstraint then + GenericParameterAttributes.NotNullableValueTypeConstraint + else + zero) + ||| (if gp.HasDefaultConstructorConstraint then + GenericParameterAttributes.DefaultConstructorConstraint + else + zero) + ||| + // GenericParameterAttributes.AllowByRefLike from net9, not present in ns20 + (if gp.HasAllowsRefStruct then + (enum 0x0020) + else + zero) gpB.SetGenericParameterAttributes flags) //---------------------------------------------------------------------------- @@ -1830,24 +1834,25 @@ let rec buildMethodPass2 cenv tref (typB: TypeBuilder) emEnv (mdef: ILMethodDef) let methB = System.Diagnostics.Debug.Assert(not (isNull definePInvokeMethod), "Runtime does not have DefinePInvokeMethod") // Absolutely can't happen - definePInvokeMethod.Invoke( - typB, - [| - mdef.Name - p.Where.Name - p.Name - attrs - cconv - retTy - null - null - argTys - null - null - pcc - pcs - |] - ) + !!(!!definePInvokeMethod) + .Invoke( + typB, + [| + mdef.Name + p.Where.Name + p.Name + attrs + cconv + retTy + null + null + argTys + null + null + pcc + pcs + |] + ) :?> MethodBuilder methB.SetImplementationFlagsAndLog implflags @@ -1918,7 +1923,7 @@ let rec buildMethodPass3 cenv tref modB (typB: TypeBuilder) emEnv (mdef: ILMetho | ".cctor" | ".ctor" -> let consB = envGetConsB emEnv mref - // Constructors can not have generic parameters + // Constructors cannot have generic parameters assert isNil mdef.GenericParams // Value parameters let defineParameter (i, attr, name) = @@ -2173,7 +2178,8 @@ let rec buildTypeDefPass2 cenv nesting emEnv (tdef: ILTypeDef) = let typB = envGetTypB emEnv tref let emEnv = envPushTyvars emEnv (getGenericArgumentsOfType typB) // add interface impls - tdef.Implements + tdef.Implements.Value + |> List.map _.Type |> convTypes cenv emEnv |> List.iter (fun implT -> typB.AddInterfaceImplementationAndLog implT) // add methods, properties @@ -2227,7 +2233,7 @@ let rec buildTypeDefPass3 cenv nesting modB emEnv (tdef: ILTypeDef) = // // The code in this phase is fragile. // -// THe background is that System.Reflection.Emit implementations can be finnickity about the +// The background is that System.Reflection.Emit implementations can be finickity about the // order that CreateType calls are made when types refer to each other. Some of these restrictions // are not well documented, or are related to historical bugs where the F# emit code worked around the // underlying problems. Ideally the SRE implementation would just "work this out as it goes along" but @@ -2334,7 +2340,8 @@ let createTypeRef (visited: Dictionary<_, _>, created: Dictionary<_, _>) emEnv t if verbose2 then dprintf "buildTypeDefPass4: Creating Interface Chain of %s\n" tdef.Name - tdef.Implements |> List.iter (traverseType CollectTypes.All) + tdef.Implements.Value + |> List.iter (fun x -> traverseType CollectTypes.All x.Type) if verbose2 then dprintf "buildTypeDefPass4: Do value types in fields of %s\n" tdef.Name @@ -2473,7 +2480,7 @@ let defineDynamicAssemblyAndLog (asmName, flags, asmDir: string) = asmB -let mkDynamicAssemblyAndModule (assemblyName, optimize, collectible) = +let mkDynamicAssemblyAndModule (assemblyName: string, optimize, collectible) = let asmDir = "." let asmName = AssemblyName() asmName.Name <- assemblyName @@ -2490,7 +2497,7 @@ let mkDynamicAssemblyAndModule (assemblyName, optimize, collectible) = let daType = typeof let daCtor = - daType.GetConstructor [| typeof |] + !! daType.GetConstructor([| typeof |]) let daBuilder = CustomAttributeBuilder( diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilsign.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilsign.fs index 7a383d4a07..ac06baa5d5 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilsign.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilsign.fs @@ -64,7 +64,9 @@ let hashAssembly (peReader: PEReader) (hashAlgorithm: IncrementalHash) = let checkSumOffset = peHeaderOffset + 0x40 // offsetof(IMAGE_OPTIONAL_HEADER, CheckSum) let securityDirectoryEntryOffset, peHeaderSize = - match peHeaders.PEHeader.Magic with + let header = peHeaders.PEHeader |> nullArgCheck (nameof peHeaders.PEHeader) + + match header.Magic with | PEMagic.PE32 -> peHeaderOffset + 0x80, 0xE0 // offsetof(IMAGE_OPTIONAL_HEADER32, DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]), sizeof(IMAGE_OPTIONAL_HEADER32) | PEMagic.PE32Plus -> peHeaderOffset + 0x90, 0xF0 // offsetof(IMAGE_OPTIONAL_HEADER64, DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]), sizeof(IMAGE_OPTIONAL_HEADER64) | _ -> raise (BadImageFormatException(getResourceString (FSComp.SR.ilSignInvalidMagicValue ()))) @@ -87,7 +89,9 @@ let hashAssembly (peReader: PEReader) (hashAlgorithm: IncrementalHash) = hashAlgorithm.AppendData(allHeaders, 0, allHeadersSize) // Hash content of all sections - let signatureDirectory = peHeaders.CorHeader.StrongNameSignatureDirectory + let signatureDirectory = + let corHeader = peHeaders.CorHeader |> nullArgCheck (nameof peHeaders.CorHeader) + corHeader.StrongNameSignatureDirectory let signatureStart = match peHeaders.TryGetDirectoryOffset signatureDirectory with @@ -140,7 +144,7 @@ type BlobReader = x._offset <- x._offset + length arr |> Array.rev -let RSAParamatersFromBlob blob keyType = +let RSAParametersFromBlob blob keyType = let mutable reader = BlobReader blob if reader.ReadInt32() <> 0x00000207 && keyType = KeyType.KeyPair then @@ -186,10 +190,10 @@ let toCLRKeyBlob (rsaParameters: RSAParameters) (algId: int) : byte array = if isNull rsaParameters.Modulus then raise (CryptographicException(String.Format(getResourceString (FSComp.SR.ilSignInvalidRSAParams ()), "Modulus"))) - if isNull rsaParameters.Exponent || rsaParameters.Exponent.Length > 4 then + if isNull rsaParameters.Exponent || (!!rsaParameters.Exponent).Length > 4 then raise (CryptographicException(String.Format(getResourceString (FSComp.SR.ilSignInvalidRSAParams ()), "Exponent"))) - let modulusLength = rsaParameters.Modulus.Length + let modulusLength = (!!rsaParameters.Modulus).Length let halfModulusLength = (modulusLength + 1) / 2 // We assume that if P != null, then so are Q, DP, DQ, InverseQ and D and indicate KeyPair RSA Parameters @@ -227,31 +231,39 @@ let toCLRKeyBlob (rsaParameters: RSAParameters) (algId: int) : byte array = let expAsDword = let mutable buffer = int 0 - for i in 0 .. rsaParameters.Exponent.Length - 1 do - buffer <- (buffer <<< 8) ||| int rsaParameters.Exponent[i] + match rsaParameters.Exponent with + | null -> () + | exp -> + for i in 0 .. exp.Length - 1 do + buffer <- (buffer <<< 8) ||| int exp[i] buffer + let safeArrayRev (buffer: _ MaybeNull) = + match buffer with + | Null -> Array.empty + | NonNull buffer -> buffer |> Array.rev + bw.Write expAsDword // RSAPubKey.pubExp - bw.Write(rsaParameters.Modulus |> Array.rev) // Copy over the modulus for both public and private + bw.Write(rsaParameters.Modulus |> safeArrayRev) // Copy over the modulus for both public and private if isPrivate then do - bw.Write(rsaParameters.P |> Array.rev) - bw.Write(rsaParameters.Q |> Array.rev) - bw.Write(rsaParameters.DP |> Array.rev) - bw.Write(rsaParameters.DQ |> Array.rev) - bw.Write(rsaParameters.InverseQ |> Array.rev) - bw.Write(rsaParameters.D |> Array.rev) + bw.Write(rsaParameters.P |> safeArrayRev) + bw.Write(rsaParameters.Q |> safeArrayRev) + bw.Write(rsaParameters.DP |> safeArrayRev) + bw.Write(rsaParameters.DQ |> safeArrayRev) + bw.Write(rsaParameters.InverseQ |> safeArrayRev) + bw.Write(rsaParameters.D |> safeArrayRev) bw.Flush() ms.ToArray() key -let createSignature hash keyBlob keyType = +let createSignature (hash: byte array) keyBlob keyType = use rsa = RSA.Create() - rsa.ImportParameters(RSAParamatersFromBlob keyBlob keyType) + rsa.ImportParameters(RSAParametersFromBlob keyBlob keyType) let signature = rsa.SignHash(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1) @@ -260,7 +272,8 @@ let createSignature hash keyBlob keyType = let patchSignature (stream: Stream) (peReader: PEReader) (signature: byte array) = let peHeaders = peReader.PEHeaders - let signatureDirectory = peHeaders.CorHeader.StrongNameSignatureDirectory + let corHeader = peHeaders.CorHeader |> nullArgCheck (nameof peHeaders.CorHeader) + let signatureDirectory = corHeader.StrongNameSignatureDirectory let signatureOffset = if signatureDirectory.Size > signature.Length then @@ -275,7 +288,7 @@ let patchSignature (stream: Stream) (peReader: PEReader) (signature: byte array) let corHeaderFlagsOffset = int64 (peHeaders.CorHeaderStartOffset + 16) // offsetof(IMAGE_COR20_HEADER, Flags) stream.Seek(corHeaderFlagsOffset, SeekOrigin.Begin) |> ignore - stream.WriteByte(byte (peHeaders.CorHeader.Flags ||| CorFlags.StrongNameSigned)) + stream.WriteByte(byte (corHeader.Flags ||| CorFlags.StrongNameSigned)) () let signStream stream keyBlob = @@ -307,7 +320,7 @@ let signatureSize (pk: byte array) = // Returns a CLR Format Blob public key let getPublicKeyForKeyPair keyBlob = use rsa = RSA.Create() - rsa.ImportParameters(RSAParamatersFromBlob keyBlob KeyType.KeyPair) + rsa.ImportParameters(RSAParametersFromBlob keyBlob KeyType.KeyPair) let rsaParameters = rsa.ExportParameters false toCLRKeyBlob rsaParameters CALG_RSA_KEYX diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fs index cd4e1bfe72..3cbdd3c752 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fs @@ -50,6 +50,13 @@ let emitBytesViaBuffer f = use bb = ByteBuffer.Create EmitBytesViaBufferCapacity /// Alignment and padding let align alignment n = ((n + alignment - 1) / alignment) * alignment + +/// Maximum number of methods in a dotnet type +/// This differs from the spec and file formats slightly which suggests 0xfffe is the maximum +/// this value was identified empirically. +[] +let maximumMethodsPerDotNetType = 0xfff0 + //--------------------------------------------------------------------- // Concrete token representations etc. used in PE files //--------------------------------------------------------------------- @@ -355,7 +362,11 @@ let envForOverrideSpec (ospec: ILOverridesSpec) = { EnclosingTyparCount=ospec.De //--------------------------------------------------------------------- [] -type MetadataTable<'T> = +type MetadataTable<'T +#if !NO_CHECKNULLS + when 'T:not null +#endif + > = { name: string dict: Dictionary<'T, int> // given a row, find its entry number mutable rows: ResizeArray<'T> } @@ -547,6 +558,8 @@ type cenv = methodDefIdxs: Dictionary + implementsIdxs: Dictionary + propertyDefs: MetadataTable eventDefs: MetadataTable @@ -652,7 +665,7 @@ let GetBytesAsBlobIdx cenv (bytes: byte[]) = else cenv.blobs.FindOrAddSharedEntry bytes let GetStringHeapIdx cenv s = - if s = "" then 0 + if String.IsNullOrEmpty(s) then 0 else cenv.strings.FindOrAddSharedEntry s let GetGuidIdx cenv info = cenv.guids.FindOrAddSharedEntry info @@ -672,8 +685,14 @@ let GetTypeNameAsElemPair cenv n = //===================================================================== let rec GenTypeDefPass1 enc cenv (tdef: ILTypeDef) = - ignore (cenv.typeDefs.AddUniqueEntry "type index" (fun (TdKey (_, n)) -> n) (TdKey (enc, tdef.Name))) - GenTypeDefsPass1 (enc@[tdef.Name]) cenv (tdef.NestedTypes.AsList()) + ignore (cenv.typeDefs.AddUniqueEntry "type index" (fun (TdKey (_, n)) -> n) (TdKey (enc, tdef.Name))) + + // Verify that the typedef contains fewer than maximumMethodsPerDotNetType + let count = tdef.Methods.AsArray().Length + if count > maximumMethodsPerDotNetType then + errorR(Error(FSComp.SR.tooManyMethodsInDotNetTypeWritingAssembly (tdef.Name, count, maximumMethodsPerDotNetType), rangeStartup)) + + GenTypeDefsPass1 (enc@[tdef.Name]) cenv (tdef.NestedTypes.AsList()) and GenTypeDefsPass1 enc cenv tdefs = List.iter (GenTypeDefPass1 enc cenv) tdefs @@ -682,7 +701,8 @@ and GenTypeDefsPass1 enc cenv tdefs = List.iter (GenTypeDefPass1 enc cenv) tdefs //===================================================================== let rec GetIdxForTypeDef cenv key = - try cenv.typeDefs.GetTableEntry key + try + cenv.typeDefs.GetTableEntry key with :? KeyNotFoundException -> let (TdKey (enc, n) ) = key @@ -1151,7 +1171,7 @@ let canGenMethodDef (tdef: ILTypeDef) cenv (mdef: ILMethodDef) = match mdef.Access with | ILMemberAccess.Public -> true // When emitting a reference assembly, do not emit methods that are private/protected/internal unless they are virtual/abstract or provide an explicit interface implementation. - // REVIEW: Addded(vlza, fixes #14937): + // REVIEW: Added(vlza, fixes #14937): // We also emit methods that are marked as HideBySig and static, // since they're not virtual or abstract, but we want (?) the same behaviour as normal instance implementations. | ILMemberAccess.Private | ILMemberAccess.Family | ILMemberAccess.Assembly | ILMemberAccess.FamilyOrAssembly @@ -1267,7 +1287,7 @@ and GetTypeAsImplementsRow cenv env tidx ty = TypeDefOrRefOrSpec (tdorTag, tdorRow) |] and GenImplementsPass2 cenv env tidx ty = - AddUnsharedRow cenv TableNames.InterfaceImpl (GetTypeAsImplementsRow cenv env tidx ty) |> ignore + AddUnsharedRow cenv TableNames.InterfaceImpl (GetTypeAsImplementsRow cenv env tidx ty) and GetKeyForEvent tidx (x: ILEventDef) = EventKey (tidx, x.Name) @@ -1303,7 +1323,8 @@ and GenTypeDefPass2 pidx enc cenv (tdef: ILTypeDef) = // Now generate or assign index numbers for tables referenced by the maps. // Don't yet generate contents of these tables - leave that to pass3, as // code may need to embed these entries. - tdef.Implements |> List.iter (GenImplementsPass2 cenv env tidx) + cenv.implementsIdxs[tidx] <- tdef.Implements.Value |> List.map (fun x -> GenImplementsPass2 cenv env tidx x.Type) + tdef.Fields.AsList() |> List.iter (GenFieldDefPass2 tdef cenv tidx) tdef.Methods |> Seq.iter (GenMethodDefPass2 tdef cenv tidx) // Generation of property & event definitions for **ref assemblies** is checking existence of generated method definitions. @@ -2492,7 +2513,8 @@ let rec GetGenericParamAsGenericParamRow cenv _env idx owner gp = | ContraVariant -> 0x0002) ||| (if gp.HasReferenceTypeConstraint then 0x0004 else 0x0000) ||| (if gp.HasNotNullableValueTypeConstraint then 0x0008 else 0x0000) ||| - (if gp.HasDefaultConstructorConstraint then 0x0010 else 0x0000) + (if gp.HasDefaultConstructorConstraint then 0x0010 else 0x0000) ||| + (if gp.HasAllowsRefStruct then 0x0020 else 0x0000) let mdVersionMajor, _ = metadataSchemaVersionSupportedByCLRVersion cenv.desiredMetadataVersion @@ -2852,6 +2874,11 @@ let rec GenTypeDefPass3 enc cenv (tdef: ILTypeDef) = try let env = envForTypeDef tdef let tidx = GetIdxForTypeDef cenv (TdKey(enc, tdef.Name)) + + tdef.Implements.Value + |> List.zip cenv.implementsIdxs[tidx] + |> List.iter (fun (impIdx, impl) -> GenCustomAttrsPass3Or4 cenv (hca_InterfaceImpl,impIdx) impl.CustomAttrs) + tdef.Properties.AsList() |> List.iter (GenPropertyPass3 cenv env) tdef.Events.AsList() |> List.iter (GenEventPass3 cenv env) tdef.Fields.AsList() |> List.iter (GenFieldDefPass3 tdef cenv env) @@ -3116,6 +3143,7 @@ let generateIL ( methodDefIdxsByKey = MetadataTable<_>.New("method defs", EqualityComparer.Default) // This uses reference identity on ILMethodDef objects methodDefIdxs = Dictionary<_, _>(100, HashIdentity.Reference) + implementsIdxs = Dictionary<_, _>(100, HashIdentity.Structural) propertyDefs = MetadataTable<_>.New("property defs", EqualityComparer.Default) eventDefs = MetadataTable<_>.New("event defs", EqualityComparer.Default) typeDefs = MetadataTable<_>.New("type defs", EqualityComparer.Default) @@ -3155,7 +3183,7 @@ let generateIL ( Methods = cenv.pdbinfo.ToArray() TableRowCounts = cenv.tables |> Seq.map(fun t -> t.Count) |> Seq.toArray } - let idxForNextedTypeDef (tdefs: ILTypeDef list, tdef: ILTypeDef) = + let idxForNestedTypeDef (tdefs: ILTypeDef list, tdef: ILTypeDef) = let enc = tdefs |> List.map (fun tdef -> tdef.Name) GetIdxForTypeDef cenv (TdKey(enc, tdef.Name)) @@ -3168,18 +3196,18 @@ let generateIL ( // turn idx tbls into token maps let mappings = { TypeDefTokenMap = (fun t -> - getUncodedToken TableNames.TypeDef (idxForNextedTypeDef t)) + getUncodedToken TableNames.TypeDef (idxForNestedTypeDef t)) FieldDefTokenMap = (fun t fd -> - let tidx = idxForNextedTypeDef t + let tidx = idxForNestedTypeDef t getUncodedToken TableNames.Field (GetFieldDefAsFieldDefIdx cenv tidx fd)) MethodDefTokenMap = (fun t mdef -> - let tidx = idxForNextedTypeDef t + let tidx = idxForNestedTypeDef t getUncodedToken TableNames.Method (FindMethodDefIdx cenv (GetKeyForMethodDef cenv tidx mdef))) PropertyTokenMap = (fun t pdef -> - let tidx = idxForNextedTypeDef t + let tidx = idxForNestedTypeDef t getUncodedToken TableNames.Property (cenv.propertyDefs.GetTableEntry (GetKeyForPropertyDef tidx pdef))) EventTokenMap = (fun t edef -> - let tidx = idxForNextedTypeDef t + let tidx = idxForNestedTypeDef t getUncodedToken TableNames.Event (cenv.eventDefs.GetTableEntry (EventKey (tidx, edef.Name)))) } reportTime "Finalize Module Generation Results" // New return the results diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fsi b/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fsi index 986f79d53f..d074f0bc58 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fsi +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilwrite.fsi @@ -31,6 +31,6 @@ type options = /// Write a binary to the file system. val WriteILBinaryFile: options: options * inputModule: ILModuleDef * (ILAssemblyRef -> ILAssemblyRef) -> unit -/// Write a binary to an array of bytes auitable for dynamic loading. +/// Write a binary to an array of bytes suitable for dynamic loading. val WriteILBinaryInMemory: options: options * inputModule: ILModuleDef * (ILAssemblyRef -> ILAssemblyRef) -> byte[] * byte[] option diff --git a/src/fcs-fable/src/Compiler/AbstractIL/ilwritepdb.fs b/src/fcs-fable/src/Compiler/AbstractIL/ilwritepdb.fs index 24082eea2b..8776330b7c 100644 --- a/src/fcs-fable/src/Compiler/AbstractIL/ilwritepdb.fs +++ b/src/fcs-fable/src/Compiler/AbstractIL/ilwritepdb.fs @@ -16,6 +16,7 @@ open Internal.Utilities open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.Support open Internal.Utilities.Library +open Internal.Utilities.Library.Extras open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.IO open FSharp.Compiler.Text.Range @@ -342,12 +343,9 @@ let scopeSorter (scope1: PdbMethodScope) (scope2: PdbMethodScope) = type PortablePdbGenerator (embedAllSource: bool, embedSourceList: string list, sourceLink: string, checksumAlgorithm, info: PdbData, pathMap: PathMap) = - let docs = - match info.Documents with - | Null -> Array.empty - | NonNull docs -> docs + let docs = info.Documents - // The metadata to wite to the PoortablePDB (Roslyn = _debugMetadataOpt) + // The metadata to wite to the PortablePDB (Roslyn = _debugMetadataOpt) let metadata = MetadataBuilder() @@ -392,7 +390,7 @@ type PortablePdbGenerator /// let sourceCompressionThreshold = 200 - let includeSource file = + let includeSource (file: string) = let isInList = embedSourceList |> List.exists (fun f -> String.Compare(file, f, StringComparison.OrdinalIgnoreCase) = 0) @@ -653,12 +651,9 @@ type PortablePdbGenerator let emitMethod minfo = let docHandle, sequencePointBlob = let sps = - match minfo.DebugPoints with - | Null -> Array.empty - | NonNull pts -> - match minfo.DebugRange with - | None -> Array.empty - | Some _ -> pts + match minfo.DebugRange with + | None -> Array.empty + | Some _ -> minfo.DebugPoints let builder = BlobBuilder() builder.WriteCompressedInteger(minfo.LocalSignatureToken) @@ -702,12 +697,12 @@ type PortablePdbGenerator else //============================================================================================================================================= // Sequence-point-record - // Validate these with magic numbers according to the portable pdb spec Sequence point dexcription: + // Validate these with magic numbers according to the portable pdb spec Sequence point description: // https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#methoddebuginformation-table-0x31 // // So the spec is actually bit iffy!!!!! (More like guidelines really. ) // It uses code similar to this to validate the values - // if (result < 0 || result >= ushort.MaxValue) // be errorfull + // if (result < 0 || result >= ushort.MaxValue) // be errorful // Spec Says 0x10000 and value max = 0xFFFF but it can't even be = to maxvalue, and so the range is 0 .. 0xfffe inclusive //============================================================================================================================================= @@ -871,7 +866,7 @@ let getInfoForEmbeddedPortablePdb (uncompressedLength: int64) (contentId: BlobContentId) (compressedStream: MemoryStream) - pdbfile + (pdbfile: string) cvChunk pdbChunk deterministicPdbChunk @@ -885,7 +880,7 @@ let getInfoForEmbeddedPortablePdb pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 contentId.Stamp) - fn + !!fn cvChunk (Some pdbChunk) deterministicPdbChunk @@ -1028,6 +1023,11 @@ let rec pushShadowedLocals (stackGuard: StackGuard) (localsToPush: PdbLocalVar[] // adding the text " (shadowed)" to the names of those with name conflicts. let unshadowScopes rootScope = // Avoid stack overflow when writing linearly nested scopes - let stackGuard = StackGuard(100, "ILPdbWriter.unshadowScopes") + let UnshadowScopesStackGuardDepth = + GetEnvInteger "FSHARP_ILPdb_UnshadowScopes_StackGuardDepth" 100 + + let stackGuard = + StackGuard(UnshadowScopesStackGuardDepth, "ILPdbWriter.unshadowScopes") + let result, _ = pushShadowedLocals stackGuard [||] rootScope result diff --git a/src/fcs-fable/src/Compiler/Checking/AccessibilityLogic.fs b/src/fcs-fable/src/Compiler/Checking/AccessibilityLogic.fs index 4a70f268dd..6aba2edcb4 100644 --- a/src/fcs-fable/src/Compiler/Checking/AccessibilityLogic.fs +++ b/src/fcs-fable/src/Compiler/Checking/AccessibilityLogic.fs @@ -243,8 +243,8 @@ let IsILEventInfoAccessible g amap m ad einfo = let private IsILMethInfoAccessible g amap m adType ad ilminfo = match ilminfo with - | ILMethInfo (_, ty, None, mdef, _) -> IsILTypeAndMemberAccessible g amap m adType ad (ILTypeInfo.FromType g ty) mdef.Access - | ILMethInfo (_, _, Some declaringTyconRef, mdef, _) -> IsILMemberAccessible g amap m declaringTyconRef ad mdef.Access + | ILMethInfo (_, IlType ty, mdef, _) -> IsILTypeAndMemberAccessible g amap m adType ad ty mdef.Access + | ILMethInfo (_, CSharpStyleExtension(declaring=declaringTyconRef), mdef, _) -> IsILMemberAccessible g amap m declaringTyconRef ad mdef.Access let GetILAccessOfILPropInfo (ILPropInfo(tinfo, pdef)) = let tdef = tinfo.RawMetadata @@ -256,7 +256,7 @@ let GetILAccessOfILPropInfo (ILPropInfo(tinfo, pdef)) = | Some mrefGet, Some mrefSet -> // // Dotnet properties have a getter and a setter method, each of which can have a separate visibility public, protected, private etc ... - // This code computes the visibility for the property by choosing the most visible method. This approximation is usefull for cases + // This code computes the visibility for the property by choosing the most visible method. This approximation is useful for cases // where the compiler needs to know the visibility of the property. // The specific ordering for choosing the most visible is: // ILMemberAccess.Public, @@ -351,9 +351,10 @@ let CheckILFieldInfoAccessible g amap m ad finfo = /// when calling x.SomeMethod() we need to use 'adTyp' do verify that type of x is accessible from C /// and 'ad' to determine accessibility of SomeMethod. /// I.e when calling x.Public() and x.Protected() -in both cases first check should succeed and second - should fail in the latter one. -let IsTypeAndMethInfoAccessible amap m accessDomainTy ad = function +let rec IsTypeAndMethInfoAccessible amap m accessDomainTy ad = function | ILMeth (g, x, _) -> IsILMethInfoAccessible g amap m accessDomainTy ad x | FSMeth (_, _, vref, _) -> IsValAccessible ad vref + | MethInfoWithModifiedReturnType(mi,_) -> IsTypeAndMethInfoAccessible amap m accessDomainTy ad mi | DefaultStructCtor(g, ty) -> IsTypeAccessible g amap m ad ty #if !NO_TYPEPROVIDERS | ProvidedMeth(amap, tpmb, _, m) as etmi -> diff --git a/src/fcs-fable/src/Compiler/Checking/AttributeChecking.fs b/src/fcs-fable/src/Compiler/Checking/AttributeChecking.fs index 075023a2c2..e87d4bba7c 100644 --- a/src/fcs-fable/src/Compiler/Checking/AttributeChecking.fs +++ b/src/fcs-fable/src/Compiler/Checking/AttributeChecking.fs @@ -27,7 +27,7 @@ open FSharp.Core.CompilerServices exception ObsoleteWarning of string * range exception ObsoleteError of string * range -let fail() = failwith "This custom attribute has an argument that can not yet be converted using this API" +let fail() = failwith "This custom attribute has an argument that cannot yet be converted using this API" let rec private evalILAttribElem elem = match elem with @@ -90,7 +90,8 @@ type AttribInfo = match x with | FSAttribInfo(_g, Attrib(tcref, _, _, _, _, _, _)) -> tcref | ILAttribInfo (g, amap, scoref, a, m) -> - let ty = RescopeAndImportILType scoref amap m [] a.Method.DeclaringType + // We are skipping nullness check here because this reference is an attribute usage, nullness does not apply. + let ty = RescopeAndImportILTypeSkipNullness scoref amap m [] a.Method.DeclaringType tcrefOfAppTy g ty member x.ConstructorArguments = @@ -102,9 +103,10 @@ type AttribInfo = let obj = evalFSharpAttribArg g evaluatedExpr ty, obj) | ILAttribInfo (_g, amap, scoref, cattr, m) -> - let parms, _args = decodeILAttribData cattr - [ for argTy, arg in Seq.zip cattr.Method.FormalArgTypes parms -> - let ty = RescopeAndImportILType scoref amap m [] argTy + let params_, _args = decodeILAttribData cattr + [ for argTy, arg in Seq.zip cattr.Method.FormalArgTypes params_ -> + // We are skipping nullness check here because this reference is an attribute usage, nullness does not apply. + let ty = RescopeAndImportILTypeSkipNullness scoref amap m [] argTy let obj = evalILAttribElem arg ty, obj ] @@ -117,9 +119,10 @@ type AttribInfo = let obj = evalFSharpAttribArg g evaluatedExpr ty, nm, isField, obj) | ILAttribInfo (_g, amap, scoref, cattr, m) -> - let _parms, namedArgs = decodeILAttribData cattr + let _params_, namedArgs = decodeILAttribData cattr [ for nm, argTy, isProp, arg in namedArgs -> - let ty = RescopeAndImportILType scoref amap m [] argTy + // We are skipping nullness check here because this reference is an attribute usage, nullness does not apply. + let ty = RescopeAndImportILTypeSkipNullness scoref amap m [] argTy let obj = evalILAttribElem arg let isField = not isProp ty, nm, isField, obj ] @@ -149,10 +152,11 @@ let GetAttribInfosOfEntity g amap m (tcref:TyconRef) = tcref.Attribs |> List.map (fun a -> FSAttribInfo (g, a)) -let GetAttribInfosOfMethod amap m minfo = +let rec GetAttribInfosOfMethod amap m minfo = match minfo with | ILMeth (g, ilminfo, _) -> ilminfo.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap ilminfo.MetadataScope m | FSMeth (g, _, vref, _) -> vref.Attribs |> AttribInfosOfFS g + | MethInfoWithModifiedReturnType(mi,_) -> GetAttribInfosOfMethod amap m mi | DefaultStructCtor _ -> [] #if !NO_TYPEPROVIDERS // TODO: provided attributes @@ -183,11 +187,12 @@ let GetAttribInfosOfEvent amap m einfo = /// Analyze three cases for attributes declared on methods: IL-declared attributes, F#-declared attributes and /// provided attributes. -let BindMethInfoAttributes m minfo f1 f2 f3 = +let rec BindMethInfoAttributes m minfo f1 f2 f3 = ignore m; ignore f3 match minfo with | ILMeth (_, x, _) -> f1 x.RawMetadata.CustomAttrs | FSMeth (_, _, vref, _) -> f2 vref.Attribs + | MethInfoWithModifiedReturnType(mi,_) -> BindMethInfoAttributes m mi f1 f2 f3 | DefaultStructCtor _ -> f2 [] #if !NO_TYPEPROVIDERS | ProvidedMeth (_, mi, _, _) -> f3 (mi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)), m)) @@ -207,7 +212,7 @@ let TryBindMethInfoAttribute g (m: range) (AttribInfo(atref, _) as attribSpec) m (fun provAttribs -> match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)), m) with | Some args -> f3 args - | None -> None) + | None -> None) #else (fun _provAttribs -> None) #endif @@ -232,7 +237,7 @@ let MethInfoHasAttribute g m attribSpec minfo = let private CheckCompilerFeatureRequiredAttribute (g: TcGlobals) cattrs msg m = // In some cases C# will generate both ObsoleteAttribute and CompilerFeatureRequiredAttribute. - // Specifically, when default constructor is generated for class with any reqired members in them. + // Specifically, when default constructor is generated for class with any required members in them. // ObsoleteAttribute should be ignored if CompilerFeatureRequiredAttribute is present, and its name is "RequiredMembers". let (AttribInfo(tref,_)) = g.attrib_CompilerFeatureRequiredAttribute match TryDecodeILAttribute tref cattrs with @@ -381,7 +386,7 @@ let CheckFSharpAttributesForUnseen g attribs _m = #if !NO_TYPEPROVIDERS /// Indicate if a list of provided attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. let CheckProvidedAttributesForUnseen (provAttribs: Tainted) m = - provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), typeof.FullName).IsSome), m) + provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), !! typeof.FullName).IsSome), m) #endif /// Check the attributes associated with a property, returning warnings and errors as data. @@ -465,9 +470,9 @@ let MethInfoIsUnseen g (m: range) (ty: TType) minfo = let isUnseenByHidingAttribute () = #if !NO_TYPEPROVIDERS - not (isObjTy g ty) && + not (isObjTyAnyNullness g ty) && isAppTy g ty && - isObjTy g minfo.ApparentEnclosingType && + isObjTyAnyNullness g minfo.ApparentEnclosingType && let tcref = tcrefOfAppTy g ty match tcref.TypeReprInfo with | TProvidedTypeRepr info -> @@ -480,7 +485,7 @@ let MethInfoIsUnseen g (m: range) (ty: TType) minfo = // just to look at the attributes on IL methods. if tcref.IsILTycon then tcref.ILTyconRawMetadata.CustomAttrs.AsArray() - |> Array.exists (fun attr -> attr.Method.DeclaringType.TypeSpec.Name = typeof.FullName) + |> Array.exists (fun attr -> attr.Method.DeclaringType.TypeSpec.Name = !! typeof.FullName) else false #else @@ -541,7 +546,7 @@ let IsSecurityAttribute (g: TcGlobals) amap (casmap : IDictionary) match casmap.TryGetValue tcs with | true, c -> c | _ -> - let exists = ExistsInEntireHierarchyOfType (fun t -> typeEquiv g t (mkAppTy attr.TyconRef [])) g amap m AllowMultiIntfInstantiations.Yes (mkAppTy tcref []) + let exists = ExistsInEntireHierarchyOfType (fun t -> typeEquiv g t (mkWoNullAppTy attr.TyconRef [])) g amap m AllowMultiIntfInstantiations.Yes (mkWoNullAppTy tcref []) casmap[tcs] <- exists exists | ValueNone -> false diff --git a/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fs b/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fs index d3e9fb1d42..7efb505c9f 100644 --- a/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fs +++ b/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fs @@ -15,12 +15,12 @@ open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypeHierarchy let mkIComparableCompareToSlotSig (g: TcGlobals) = - TSlotSig("CompareTo", g.mk_IComparable_ty, [], [], [ [ TSlotParam(Some("obj"), g.obj_ty, false, false, false, []) ] ], Some g.int_ty) + TSlotSig("CompareTo", g.mk_IComparable_ty, [], [], [ [ TSlotParam(Some("obj"), g.obj_ty_withNulls, false, false, false, []) ] ], Some g.int_ty) let mkGenericIComparableCompareToSlotSig (g: TcGlobals) ty = TSlotSig( "CompareTo", - (mkAppTy g.system_GenericIComparable_tcref [ ty ]), + (mkWoNullAppTy g.system_GenericIComparable_tcref [ ty ]), [], [], [ [ TSlotParam(Some("obj"), ty, false, false, false, []) ] ], @@ -35,7 +35,7 @@ let mkIStructuralComparableCompareToSlotSig (g: TcGlobals) = [], [ [ - TSlotParam(None, (mkRefTupledTy g [ g.obj_ty; g.IComparer_ty ]), false, false, false, []) + TSlotParam(None, (mkRefTupledTy g [ g.obj_ty_withNulls; g.IComparer_ty ]), false, false, false, []) ] ], Some g.int_ty @@ -44,7 +44,7 @@ let mkIStructuralComparableCompareToSlotSig (g: TcGlobals) = let mkGenericIEquatableEqualsSlotSig (g: TcGlobals) ty = TSlotSig( "Equals", - (mkAppTy g.system_GenericIEquatable_tcref [ ty ]), + (mkWoNullAppTy g.system_GenericIEquatable_tcref [ ty ]), [], [], [ [ TSlotParam(Some("obj"), ty, false, false, false, []) ] ], @@ -59,7 +59,7 @@ let mkIStructuralEquatableEqualsSlotSig (g: TcGlobals) = [], [ [ - TSlotParam(None, (mkRefTupledTy g [ g.obj_ty; g.IEqualityComparer_ty ]), false, false, false, []) + TSlotParam(None, (mkRefTupledTy g [ g.obj_ty_withNulls; g.IEqualityComparer_ty ]), false, false, false, []) ] ], Some g.bool_ty @@ -76,10 +76,10 @@ let mkIStructuralEquatableGetHashCodeSlotSig (g: TcGlobals) = ) let mkGetHashCodeSlotSig (g: TcGlobals) = - TSlotSig("GetHashCode", g.obj_ty, [], [], [ [] ], Some g.int_ty) + TSlotSig("GetHashCode", g.obj_ty_noNulls, [], [], [ [] ], Some g.int_ty) let mkEqualsSlotSig (g: TcGlobals) = - TSlotSig("Equals", g.obj_ty, [], [], [ [ TSlotParam(Some("obj"), g.obj_ty, false, false, false, []) ] ], Some g.bool_ty) + TSlotSig("Equals", g.obj_ty_noNulls, [], [], [ [ TSlotParam(Some("obj"), g.obj_ty_withNulls, false, false, false, []) ] ], Some g.bool_ty) //------------------------------------------------------------------------- // Helpers associated with code-generation of comparison/hash augmentations @@ -89,22 +89,25 @@ let mkThisTy g ty = if isStructTy g ty then mkByrefTy g ty else ty let mkCompareObjTy g ty = - mkFunTy g (mkThisTy g ty) (mkFunTy g g.obj_ty g.int_ty) + mkFunTy g (mkThisTy g ty) (mkFunTy g g.obj_ty_withNulls g.int_ty) let mkCompareTy g ty = mkFunTy g (mkThisTy g ty) (mkFunTy g ty g.int_ty) let mkCompareWithComparerTy g ty = - mkFunTy g (mkThisTy g ty) (mkFunTy g (mkRefTupledTy g [ g.obj_ty; g.IComparer_ty ]) g.int_ty) + mkFunTy g (mkThisTy g ty) (mkFunTy g (mkRefTupledTy g [ g.obj_ty_withNulls; g.IComparer_ty ]) g.int_ty) let mkEqualsObjTy g ty = - mkFunTy g (mkThisTy g ty) (mkFunTy g g.obj_ty g.bool_ty) + mkFunTy g (mkThisTy g ty) (mkFunTy g g.obj_ty_withNulls g.bool_ty) let mkEqualsTy g ty = mkFunTy g (mkThisTy g ty) (mkFunTy g ty g.bool_ty) let mkEqualsWithComparerTy g ty = - mkFunTy g (mkThisTy g ty) (mkFunTy g (mkRefTupledTy g [ g.obj_ty; g.IEqualityComparer_ty ]) g.bool_ty) + mkFunTy g (mkThisTy g ty) (mkFunTy g (mkRefTupledTy g [ g.obj_ty_withNulls; g.IEqualityComparer_ty ]) g.bool_ty) + +let mkEqualsWithComparerTyExact g ty = + mkFunTy g (mkThisTy g ty) (mkFunTy g (mkRefTupledTy g [ ty; g.IEqualityComparer_ty ]) g.bool_ty) let mkHashTy g ty = mkFunTy g (mkThisTy g ty) (mkFunTy g g.unit_ty g.int_ty) @@ -361,7 +364,7 @@ let mkRecdEquality g tcref (tycon: Tycon) = thisv, thatv, expr /// Build the equality implementation for a record type when parameterized by a comparer -let mkRecdEqualityWithComparer g tcref (tycon: Tycon) (_thisv, thise) thatobje (thatv, thate) compe = +let mkRecdEqualityWithComparer g tcref (tycon: Tycon) thise thatobje (thatv, thate) compe isexact = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst, ty = mkMinimalTy g tcref @@ -382,14 +385,21 @@ let mkRecdEqualityWithComparer g tcref (tycon: Tycon) (_thisv, thise) thatobje ( let expr = mkEqualsTestConjuncts g m (List.map mkTest fields) let expr = mkBindThatAddr g m ty thataddrv thatv thate expr - // will be optimized away if not necessary - let expr = mkIsInstConditional g m ty thatobje thatv expr (mkFalse g m) + + let expr = + if isexact then + expr + else + mkIsInstConditional g m ty thatobje thatv expr (mkFalse g m) let expr = if tycon.IsStructOrEnumTycon then expr else - mkBindThisNullEquals g m thise thatobje expr + if isexact then + mkBindThatNullEquals g m thise thate expr + else + mkBindThisNullEquals g m thise thatobje expr expr @@ -414,7 +424,7 @@ let mkExnEquality (g: TcGlobals) exnref (exnc: Tycon) = let cases = [ - mkCase (DecisionTreeTest.IsInst(g.exn_ty, mkAppTy exnref []), mbuilder.AddResultTarget(expr)) + mkCase (DecisionTreeTest.IsInst(g.exn_ty, mkWoNullAppTy exnref []), mbuilder.AddResultTarget(expr)) ] let dflt = Some(mbuilder.AddResultTarget(mkFalse g m)) @@ -425,7 +435,7 @@ let mkExnEquality (g: TcGlobals) exnref (exnc: Tycon) = thisv, thatv, expr /// Build the equality implementation for an exception definition when parameterized by a comparer -let mkExnEqualityWithComparer g exnref (exnc: Tycon) (_thisv, thise) thatobje (thatv, thate) compe = +let mkExnEqualityWithComparer g exnref (exnc: Tycon) thise thatobje (thatv, thate) compe isexact = let m = exnc.Range let thataddrv, thataddre = mkThatAddrLocal g m g.exn_ty @@ -445,7 +455,7 @@ let mkExnEqualityWithComparer g exnref (exnc: Tycon) (_thisv, thise) thatobje (t let cases = [ - mkCase (DecisionTreeTest.IsInst(g.exn_ty, mkAppTy exnref []), mbuilder.AddResultTarget(expr)) + mkCase (DecisionTreeTest.IsInst(g.exn_ty, mkWoNullAppTy exnref []), mbuilder.AddResultTarget(expr)) ] let dflt = mbuilder.AddResultTarget(mkFalse g m) @@ -453,13 +463,21 @@ let mkExnEqualityWithComparer g exnref (exnc: Tycon) (_thisv, thise) thatobje (t mbuilder.Close(dtree, m, g.bool_ty) let expr = mkBindThatAddr g m g.exn_ty thataddrv thatv thate expr - let expr = mkIsInstConditional g m g.exn_ty thatobje thatv expr (mkFalse g m) + + let expr = + if isexact then + expr + else + mkIsInstConditional g m g.exn_ty thatobje thatv expr (mkFalse g m) let expr = if exnc.IsStructOrEnumTycon then expr else - mkBindThisNullEquals g m thise thatobje expr + if isexact then + mkBindThatNullEquals g m thise thate expr + else + mkBindThisNullEquals g m thise thatobje expr expr @@ -758,7 +776,7 @@ let mkUnionEquality g tcref (tycon: Tycon) = thisv, thatv, expr /// Build the equality implementation for a union type when parameterized by a comparer -let mkUnionEqualityWithComparer g tcref (tycon: Tycon) (_thisv, thise) thatobje (thatv, thate) compe = +let mkUnionEqualityWithComparer g tcref (tycon: Tycon) thise thatobje (thatv, thate) compe isexact = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst, ty = mkMinimalTy g tcref @@ -846,13 +864,21 @@ let mkUnionEqualityWithComparer g tcref (tycon: Tycon) (_thisv, thise) thatobje (mkCompGenLet m thattagv (mkUnionCaseTagGetViaExprAddr (thataddre, tcref, tinst, m)) tagsEqTested) let expr = mkBindThatAddr g m ty thataddrv thatv thate expr - let expr = mkIsInstConditional g m ty thatobje thatv expr (mkFalse g m) + + let expr = + if isexact then + expr + else + mkIsInstConditional g m ty thatobje thatv expr (mkFalse g m) let expr = if tycon.IsStructOrEnumTycon then expr else - mkBindThisNullEquals g m thise thatobje expr + if isexact then + mkBindThatNullEquals g m thise thate expr + else + mkBindThisNullEquals g m thise thatobje expr expr @@ -1014,6 +1040,15 @@ let getAugmentationAttribs g (tycon: Tycon) = TryFindFSharpBoolAttribute g g.attrib_CustomComparisonAttribute tycon.Attribs, TryFindFSharpBoolAttribute g g.attrib_StructuralComparisonAttribute tycon.Attribs +[] +type EqualityWithComparerAugmentation = + { + GetHashCode: Val + GetHashCodeWithComparer: Val + EqualsWithComparer: Val + EqualsExactWithComparer: Val + } + let CheckAugmentationAttribs isImplementation g amap (tycon: Tycon) = let m = tycon.Range let attribs = getAugmentationAttribs g tycon @@ -1096,7 +1131,7 @@ let CheckAugmentationAttribs isImplementation g amap (tycon: Tycon) = hasNominalInterface g.system_GenericIComparable_tcref let hasExplicitEquals = - tycon.HasOverride g "Equals" [ g.obj_ty ] + tycon.HasOverride g "Equals" [ g.obj_ty_ambivalent ] || hasNominalInterface g.tcref_System_IStructuralEquatable let hasExplicitGenericEquals = hasNominalInterface g.system_GenericIEquatable_tcref @@ -1252,7 +1287,7 @@ let mkValSpecAux g m (tcref: TyconRef) ty vis slotsig methn valTy argData isGett let mkValSpec g (tcref: TyconRef) ty vis slotsig methn valTy argData isGetter = mkValSpecAux g tcref.Range tcref ty vis slotsig methn valTy argData isGetter true -// Unlike other generated items, the 'IsABC' propeties are visible, not considered compiler-generated +// Unlike other generated items, the 'IsABC' properties are visible, not considered compiler-generated let mkImpliedValSpec g m tcref ty vis slotsig methn valTy argData isGetter = let v = mkValSpecAux g m tcref ty vis slotsig methn valTy argData isGetter false v.SetIsImplied() @@ -1287,7 +1322,7 @@ let MakeValsForCompareWithComparerAugmentation g (tcref: TyconRef) = let MakeValsForEqualsAugmentation g (tcref: TyconRef) = let m = tcref.Range let _, ty = mkMinimalTy g tcref - let vis = tcref.TypeReprAccessibility + let vis = tcref.Accessibility let tps = tcref.Typars m let objEqualsVal = @@ -1312,13 +1347,13 @@ let MakeValsForEqualsAugmentation g (tcref: TyconRef) = let MakeValsForEqualityWithComparerAugmentation g (tcref: TyconRef) = let _, ty = mkMinimalTy g tcref - let vis = tcref.TypeReprAccessibility + let vis = tcref.Accessibility let tps = tcref.Typars tcref.Range let objGetHashCodeVal = mkValSpec g tcref ty vis (Some(mkGetHashCodeSlotSig g)) "GetHashCode" (tps +-> (mkHashTy g ty)) unitArg false - let withcGetHashCodeVal = + let withGetHashCodeVal = mkValSpec g tcref @@ -1330,10 +1365,28 @@ let MakeValsForEqualityWithComparerAugmentation g (tcref: TyconRef) = unaryArg false - let withcEqualsVal = + let withEqualsVal = mkValSpec g tcref ty vis (Some(mkIStructuralEquatableEqualsSlotSig g)) "Equals" (tps +-> (mkEqualsWithComparerTy g ty)) tupArg false - objGetHashCodeVal, withcGetHashCodeVal, withcEqualsVal + let withEqualsExactWithComparer = + let vis = TAccess (updateSyntaxAccessForCompPath (vis.CompilationPaths) SyntaxAccess.Public) + mkValSpec + g + tcref + ty + vis + // This doesn't implement any interface. + None + "Equals" + (tps +-> (mkEqualsWithComparerTyExact g ty)) + tupArg + false + { + GetHashCode = objGetHashCodeVal + GetHashCodeWithComparer = withGetHashCodeVal + EqualsWithComparer = withEqualsVal + EqualsExactWithComparer = withEqualsExactWithComparer + } let MakeBindingsForCompareAugmentation g (tycon: Tycon) = let tcref = mkLocalTyconRef tycon @@ -1351,13 +1404,13 @@ let MakeBindingsForCompareAugmentation g (tycon: Tycon) = let tinst, ty = mkMinimalTy g tcref let thisv, thise = mkThisVar g m ty - let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty_ambivalent let comparee = if isUnitTy g ty then mkZero g m else - let thate = mkCoerceExpr (thatobje, ty, m, g.obj_ty) + let thate = mkCoerceExpr (thatobje, ty, m, g.obj_ty_ambivalent) mkApps g ((exprForValRef m vref2, vref2.Type), (if isNil tinst then [] else [ tinst ]), [ thise; thate ], m) @@ -1394,8 +1447,8 @@ let MakeBindingsForCompareWithComparerAugmentation g (tycon: Tycon) = let compv, compe = mkCompGenLocal m "comp" g.IComparer_ty let thisv, thise = mkThisVar g m ty - let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty - let thate = mkCoerceExpr (thatobje, ty, m, g.obj_ty) + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty_ambivalent + let thate = mkCoerceExpr (thatobje, ty, m, g.obj_ty_ambivalent) let rhs = let comparee = comparef g tcref tycon (thisv, thise) (thatobjv, thate) compe @@ -1419,7 +1472,7 @@ let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon: Tycon let mkStructuralEquatable hashf equalsf = match tycon.GeneratedHashAndEqualsWithComparerValues with | None -> [] - | Some(objGetHashCodeVal, withcGetHashCodeVal, withcEqualsVal) -> + | Some(objGetHashCodeVal, withcGetHashCodeVal, withcEqualsVal, withcEqualsExactValOption) -> // build the hash rhs let withcGetHashCodeExpr = @@ -1451,12 +1504,33 @@ let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon: Tycon // build the equals rhs let withcEqualsExpr = - let _tinst, ty = mkMinimalTy g tcref + let tinst, ty = mkMinimalTy g tcref let thisv, thise = mkThisVar g m ty - let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty_ambivalent let thatv, thate = mkCompGenLocal m "that" ty let compv, compe = mkCompGenLocal m "comp" g.IEqualityComparer_ty - let equalse = equalsf g tcref tycon (thisv, thise) thatobje (thatv, thate) compe + + // if the new overload is available, use it + // otherwise, generate the whole equals thing + let equalse = + match withcEqualsExactValOption with + | Some withcEqualsExactVal -> + mkIsInstConditional + g + m + ty + thatobje + thatv + (mkApps + g + ((exprForValRef m withcEqualsExactVal, withcEqualsExactVal.Type), + (if isNil tinst then [] else [ tinst ]), + [ thise; mkRefTupled g m [ thate; compe ] [ty; g.IEqualityComparer_ty ] ], + m)) + (mkFalse g m) + | None -> + equalsf g tcref tycon thise thatobje (thatv, thate) compe false + mkMultiLambdas g m tps [ [ thisv ]; [ thatobjv; compv ] ] (equalse, g.bool_ty) let objGetHashCodeExpr = @@ -1481,9 +1555,22 @@ let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon: Tycon mkLambdas g m tps [ thisv; unitv ] (hashe, g.int_ty) + let withcEqualsExactExpr = + let _tinst, ty = mkMinimalTy g tcref + let thisv, thise = mkThisVar g m ty + let thatv, thate = mkCompGenLocal m "obj" ty + let compv, compe = mkCompGenLocal m "comp" g.IEqualityComparer_ty + + let equalse = equalsf g tcref tycon thise thate (thatv, thate) compe true + + mkMultiLambdas g m tps [ [ thisv ]; [ thatv; compv ] ] (equalse, g.bool_ty) + [ (mkCompGenBind withcGetHashCodeVal.Deref withcGetHashCodeExpr) (mkCompGenBind objGetHashCodeVal.Deref objGetHashCodeExpr) + match withcEqualsExactValOption with + | Some withcEqualsExactVal -> mkCompGenBind withcEqualsExactVal.Deref withcEqualsExactExpr + | None -> () (mkCompGenBind withcEqualsVal.Deref withcEqualsExpr) ] @@ -1515,7 +1602,7 @@ let MakeBindingsForEqualsAugmentation (g: TcGlobals) (tycon: Tycon) = let tinst, ty = mkMinimalTy g tcref let thisv, thise = mkThisVar g m ty - let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty_ambivalent let equalse = if isUnitTy g ty then @@ -1595,7 +1682,7 @@ let MakeValsForUnionAugmentation g (tcref: TyconRef) = tcref.UnionCasesAsList |> List.map (fun uc -> - // Unlike other generated items, the 'IsABC' propeties are visible, not considered compiler-generated + // Unlike other generated items, the 'IsABC' properties are visible, not considered compiler-generated let v = mkImpliedValSpec g uc.Range tcref tmty vis None ("get_Is" + uc.CompiledName) (tps +-> (mkIsCaseTy g tmty)) unitArg true diff --git a/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fsi b/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fsi index 5fa185c046..4a7d74311b 100644 --- a/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fsi +++ b/src/fcs-fable/src/Compiler/Checking/AugmentWithHashCompare.fsi @@ -7,6 +7,13 @@ open FSharp.Compiler open FSharp.Compiler.TypedTree open FSharp.Compiler.TcGlobals +[] +type EqualityWithComparerAugmentation = + { GetHashCode: Val + GetHashCodeWithComparer: Val + EqualsWithComparer: Val + EqualsExactWithComparer: Val } + val CheckAugmentationAttribs: bool -> TcGlobals -> Import.ImportMap -> Tycon -> unit val TyconIsCandidateForAugmentationWithCompare: TcGlobals -> Tycon -> bool @@ -21,7 +28,7 @@ val MakeValsForCompareWithComparerAugmentation: TcGlobals -> TyconRef -> Val val MakeValsForEqualsAugmentation: TcGlobals -> TyconRef -> Val * Val -val MakeValsForEqualityWithComparerAugmentation: TcGlobals -> TyconRef -> Val * Val * Val +val MakeValsForEqualityWithComparerAugmentation: TcGlobals -> TyconRef -> EqualityWithComparerAugmentation val MakeBindingsForCompareAugmentation: TcGlobals -> Tycon -> Binding list diff --git a/src/fcs-fable/src/Compiler/Checking/CheckBasics.fs b/src/fcs-fable/src/Compiler/Checking/CheckBasics.fs index bbfa5557b2..7cbca970cc 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckBasics.fs +++ b/src/fcs-fable/src/Compiler/Checking/CheckBasics.fs @@ -8,6 +8,7 @@ open System.Collections.Generic open FSharp.Compiler.Diagnostics open Internal.Utilities.Library open Internal.Utilities.Library.Extras +open Internal.Utilities.Collections open FSharp.Compiler open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.CompilerGlobalState @@ -136,7 +137,7 @@ type CtorInfo = /// A handle to the boolean ref cell to hold success of initialized 'this' for 'type X() as x = ...' constructs safeInitInfo: SafeInitData - /// Is the an implicit constructor or an explicit one? + /// Is there an implicit constructor or an explicit one? ctorIsImplicit: bool } @@ -243,6 +244,10 @@ type TcEnv = // Do we lay down an implicit debug point? eIsControlFlow: bool + + // In order to avoid checking implicit-yield expressions multiple times, we cache the resulting checked expressions. + // This avoids exponential behavior in the type checker when nesting implicit-yield expressions. + eCachedImplicitYieldExpressions : HashMultiMap } member tenv.DisplayEnv = tenv.eNameResEnv.DisplayEnv diff --git a/src/fcs-fable/src/Compiler/Checking/CheckBasics.fsi b/src/fcs-fable/src/Compiler/Checking/CheckBasics.fsi index e3ad581cb6..179752c394 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckBasics.fsi +++ b/src/fcs-fable/src/Compiler/Checking/CheckBasics.fsi @@ -6,6 +6,7 @@ open System.Collections.Concurrent open System.Collections.Generic open FSharp.Compiler.Diagnostics open Internal.Utilities.Library +open Internal.Utilities.Collections open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.CompilerGlobalState open FSharp.Compiler.ConstraintSolver @@ -46,7 +47,7 @@ type CtorInfo = /// A handle to the boolean ref cell to hold success of initialized 'this' for 'type X() as x = ...' constructs safeInitInfo: SafeInitData - /// Is the an implicit constructor or an explicit one? + /// Is there an implicit constructor or an explicit one? ctorIsImplicit: bool } @@ -128,6 +129,10 @@ type TcEnv = eLambdaArgInfos: ArgReprInfo list list eIsControlFlow: bool + + // In order to avoid checking implicit-yield expressions multiple times, we cache the resulting checked expressions. + // This avoids exponential behavior in the type checker when nesting implicit-yield expressions. + eCachedImplicitYieldExpressions: HashMultiMap } member DisplayEnv: DisplayEnv @@ -192,7 +197,7 @@ type TcPatPhase2Input = /// Represents the context flowed left-to-right through pattern checking type TcPatLinearEnv = TcPatLinearEnv of tpenv: UnscopedTyparEnv * names: NameMap * takenNames: Set -/// Represents the flags passsed to TcPat regarding the binding location +/// Represents the flags passed to TcPat regarding the binding location type TcPatValFlags = | TcPatValFlags of inlineFlag: ValInline * diff --git a/src/fcs-fable/src/Compiler/Checking/CheckComputationExpressions.fs b/src/fcs-fable/src/Compiler/Checking/CheckComputationExpressions.fs deleted file mode 100644 index 1394b2c1a9..0000000000 --- a/src/fcs-fable/src/Compiler/Checking/CheckComputationExpressions.fs +++ /dev/null @@ -1,2362 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -/// The typechecker. Left-to-right constrained type checking -/// with generalization at appropriate points. -module internal FSharp.Compiler.CheckComputationExpressions - -open Internal.Utilities.Library -open FSharp.Compiler.AccessibilityLogic -open FSharp.Compiler.AttributeChecking -open FSharp.Compiler.CheckExpressions -open FSharp.Compiler.CheckBasics -open FSharp.Compiler.ConstraintSolver -open FSharp.Compiler.DiagnosticsLogger -open FSharp.Compiler.Features -open FSharp.Compiler.Infos -open FSharp.Compiler.InfoReader -open FSharp.Compiler.NameResolution -open FSharp.Compiler.PatternMatchCompilation -open FSharp.Compiler.Syntax.PrettyNaming -open FSharp.Compiler.Syntax -open FSharp.Compiler.SyntaxTrivia -open FSharp.Compiler.SyntaxTreeOps -open FSharp.Compiler.Text -open FSharp.Compiler.Text.Range -open FSharp.Compiler.TypedTree -open FSharp.Compiler.TypedTreeOps - -type cenv = TcFileState - -/// Used to flag if this is the first or a sebsequent translation pass through a computation expression -type CompExprTranslationPass = Initial | Subsequent - -/// Used to flag if computation expression custom operations are allowed in a given context -type CustomOperationsMode = Allowed | Denied - -let TryFindIntrinsicOrExtensionMethInfo collectionSettings (cenv: cenv) (env: TcEnv) m ad nm ty = - AllMethInfosOfTypeInScope collectionSettings cenv.infoReader env.NameEnv (Some nm) ad IgnoreOverrides m ty - -/// Ignores an attribute -let IgnoreAttribute _ = None - -let (|ExprAsPat|_|) (f: SynExpr) = - match f with - | SingleIdent v1 | SynExprParen(SingleIdent v1, _, _, _) -> Some (mkSynPatVar None v1) - | SynExprParen(SynExpr.Tuple (false, elems, commas, _), _, _, _) -> - let elems = elems |> List.map (|SingleIdent|_|) - if elems |> List.forall (fun x -> x.IsSome) then - Some (SynPat.Tuple(false, (elems |> List.map (fun x -> mkSynPatVar None x.Value)), commas, f.Range)) - else - None - | _ -> None - -// For join clauses that join on nullable, we syntactically insert the creation of nullable values on the appropriate side of the condition, -// then pull the syntax apart again -let (|JoinRelation|_|) cenv env (expr: SynExpr) = - let m = expr.Range - let ad = env.eAccessRights - - let isOpName opName vref s = - (s = opName) && - match ResolveExprLongIdent cenv.tcSink cenv.nameResolver m ad env.eNameResEnv TypeNameResolutionInfo.Default [ident(opName, m)] None with - | Result (_, Item.Value vref2, []) -> valRefEq cenv.g vref vref2 - | _ -> false - - match expr with - | BinOpExpr(opId, a, b) when isOpName opNameEquals cenv.g.equals_operator_vref opId.idText -> Some (a, b) - - | BinOpExpr(opId, a, b) when isOpName opNameEqualsNullable cenv.g.equals_nullable_operator_vref opId.idText -> - - let a = SynExpr.App (ExprAtomicFlag.Atomic, false, mkSynLidGet a.Range [MangledGlobalName;"System"] "Nullable", a, a.Range) - Some (a, b) - - | BinOpExpr(opId, a, b) when isOpName opNameNullableEquals cenv.g.nullable_equals_operator_vref opId.idText -> - - let b = SynExpr.App (ExprAtomicFlag.Atomic, false, mkSynLidGet b.Range [MangledGlobalName;"System"] "Nullable", b, b.Range) - Some (a, b) - - | BinOpExpr(opId, a, b) when isOpName opNameNullableEqualsNullable cenv.g.nullable_equals_nullable_operator_vref opId.idText -> - - Some (a, b) - - | _ -> None - -let elimFastIntegerForLoop (spFor, spTo, id, start: SynExpr, dir, finish: SynExpr, innerExpr, m: range) = - let mOp = (unionRanges start.Range finish.Range).MakeSynthetic() - let pseudoEnumExpr = - if dir then mkSynInfix mOp start ".." finish - else mkSynTrifix mOp ".. .." start (SynExpr.Const (SynConst.Int32 -1, mOp)) finish - SynExpr.ForEach (spFor, spTo, SeqExprOnly false, true, mkSynPatVar None id, pseudoEnumExpr, innerExpr, m) - -/// Check if a computation or sequence expression is syntactically free of 'yield' (though not yield!) -let YieldFree (cenv: cenv) expr = - if cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield then - - // Implement yield free logic for F# Language including the LanguageFeature.ImplicitYield - let rec YieldFree expr = - match expr with - | SynExpr.Sequential (expr1=expr1; expr2=expr2) -> - YieldFree expr1 && YieldFree expr2 - - | SynExpr.IfThenElse (thenExpr=thenExpr; elseExpr=elseExprOpt) -> - YieldFree thenExpr && Option.forall YieldFree elseExprOpt - - | SynExpr.TryWith (tryExpr=body; withCases=clauses) -> - YieldFree body && clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) - - | SynExpr.Match (clauses=clauses) | SynExpr.MatchBang (clauses=clauses) -> - clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) - - | SynExpr.For (doBody=body) - | SynExpr.TryFinally (tryExpr=body) - | SynExpr.LetOrUse (body=body) - | SynExpr.While (doExpr=body) - | SynExpr.WhileBang (doExpr=body) - | SynExpr.ForEach (bodyExpr=body) -> - YieldFree body - - | SynExpr.LetOrUseBang(body=body) -> - YieldFree body - - | SynExpr.YieldOrReturn(flags=(true, _)) -> false - - | _ -> true - - YieldFree expr - else - // Implement yield free logic for F# Language without the LanguageFeature.ImplicitYield - let rec YieldFree expr = - match expr with - | SynExpr.Sequential (expr1=expr1; expr2=expr2) -> - YieldFree expr1 && YieldFree expr2 - - | SynExpr.IfThenElse (thenExpr=thenExpr; elseExpr=elseExprOpt) -> - YieldFree thenExpr && Option.forall YieldFree elseExprOpt - - | SynExpr.TryWith (tryExpr=e1; withCases=clauses) -> - YieldFree e1 && clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) - - | SynExpr.Match (clauses=clauses) | SynExpr.MatchBang (clauses=clauses) -> - clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) - - | SynExpr.For (doBody=body) - | SynExpr.TryFinally (tryExpr=body) - | SynExpr.LetOrUse (body=body) - | SynExpr.While (doExpr=body) - | SynExpr.WhileBang (doExpr=body) - | SynExpr.ForEach (bodyExpr=body) -> - YieldFree body - - | SynExpr.LetOrUseBang _ - | SynExpr.YieldOrReturnFrom _ - | SynExpr.YieldOrReturn _ - | SynExpr.ImplicitZero _ - | SynExpr.Do _ -> false - - | _ -> true - - YieldFree expr - - -/// Determine if a syntactic expression inside 'seq { ... }' or '[...]' counts as a "simple sequence -/// of semicolon separated values". For example [1;2;3]. -/// 'acceptDeprecated' is true for the '[ ... ]' case, where we allow the syntax '[ if g then t else e ]' but ask it to be parenthesized -/// -let (|SimpleSemicolonSequence|_|) cenv acceptDeprecated cexpr = - - let IsSimpleSemicolonSequenceElement expr = - match expr with - | SynExpr.IfThenElse _ when acceptDeprecated && YieldFree cenv expr -> true - | SynExpr.IfThenElse _ - | SynExpr.TryWith _ - | SynExpr.Match _ - | SynExpr.For _ - | SynExpr.ForEach _ - | SynExpr.TryFinally _ - | SynExpr.YieldOrReturnFrom _ - | SynExpr.YieldOrReturn _ - | SynExpr.LetOrUse _ - | SynExpr.Do _ - | SynExpr.MatchBang _ - | SynExpr.LetOrUseBang _ - | SynExpr.While _ - | SynExpr.WhileBang _ -> false - | _ -> true - - let rec TryGetSimpleSemicolonSequenceOfComprehension expr acc = - match expr with - | SynExpr.Sequential (_, true, e1, e2, _) -> - if IsSimpleSemicolonSequenceElement e1 then - TryGetSimpleSemicolonSequenceOfComprehension e2 (e1 :: acc) - else - None - | _ -> - if IsSimpleSemicolonSequenceElement expr then - Some(List.rev (expr :: acc)) - else - None - - TryGetSimpleSemicolonSequenceOfComprehension cexpr [] - -let RecordNameAndTypeResolutions cenv env tpenv expr = - // This function is motivated by cases like - // query { for ... join(for x in f(). } - // where there is incomplete code in a query, and we are current just dropping a piece of the AST on the floor (above, the bit inside the 'join'). - // - // The problem with dropping the AST on the floor is that we get no captured resolutions, which means no Intellisense/QuickInfo/ParamHelp. - // - // We check this AST-fragment, to get resolutions captured. - // - // This may have effects from typechecking, producing side-effects on the typecheck environment. - suppressErrorReporting (fun () -> - try - ignore(TcExprOfUnknownType cenv env tpenv expr) - with _ -> - ()) - -/// Used for all computation expressions except sequence expressions -let TcComputationExpression (cenv: cenv) env (overallTy: OverallTy) tpenv (mWhole, interpExpr: Expr, builderTy, comp: SynExpr) = - let overallTy = overallTy.Commit - - let g = cenv.g - let ad = env.eAccessRights - - let mkSynDelay2 (e: SynExpr) = mkSynDelay (e.Range.MakeSynthetic()) e - - let builderValName = CompilerGeneratedName "builder" - let mBuilderVal = interpExpr.Range - - // Give bespoke error messages for the FSharp.Core "query" builder - let isQuery = - match stripDebugPoints interpExpr with - // An unparameterized custom builder, e.g., `query`, `async`. - | Expr.Val (vref, _, m) - // A parameterized custom builder, e.g., `builder<…>`, `builder ()`. - | Expr.App (funcExpr = Expr.Val (vref, _, m)) -> - let item = Item.CustomBuilder (vref.DisplayName, vref) - CallNameResolutionSink cenv.tcSink (m, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) - valRefEq cenv.g vref cenv.g.query_value_vref - | _ -> false - - /// Make a builder.Method(...) call - let mkSynCall nm (m: range) args = - let m = m.MakeSynthetic() // Mark as synthetic so the language service won't pick it up. - let args = - match args with - | [] -> SynExpr.Const (SynConst.Unit, m) - | [arg] -> SynExpr.Paren (SynExpr.Paren (arg, range0, None, m), range0, None, m) - | args -> SynExpr.Paren (SynExpr.Tuple (false, args, [], m), range0, None, m) - - let builderVal = mkSynIdGet m builderValName - mkSynApp1 (SynExpr.DotGet (builderVal, range0, SynLongIdent([mkSynId m nm], [], [None]), m)) args m - - let hasMethInfo nm = TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad nm builderTy |> isNil |> not - - let sourceMethInfo = TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad "Source" builderTy - - // Optionally wrap sources of "let!", "yield!", "use!" in "query.Source" - let mkSourceExpr callExpr = - match sourceMethInfo with - | [] -> callExpr - | _ -> mkSynCall "Source" callExpr.Range [callExpr] - - let mkSourceExprConditional isFromSource callExpr = - if isFromSource then mkSourceExpr callExpr else callExpr - - /// Decide if the builder is an auto-quote builder - let isAutoQuote = hasMethInfo "Quote" - - let customOperationMethods = - AllMethInfosOfTypeInScope ResultCollectionSettings.AllResults cenv.infoReader env.NameEnv None ad IgnoreOverrides mBuilderVal builderTy - |> List.choose (fun methInfo -> - if not (IsMethInfoAccessible cenv.amap mBuilderVal ad methInfo) then None else - let nameSearch = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - IgnoreAttribute // We do not respect this attribute for IL methods - (function Attrib(_, _, [ AttribStringArg msg ], _, _, _, _) -> Some msg | _ -> None) - IgnoreAttribute // We do not respect this attribute for provided methods - - match nameSearch with - | None -> None - | Some nm -> - let joinConditionWord = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - IgnoreAttribute // We do not respect this attribute for IL methods - (function Attrib(_, _, _, ExtractAttribNamedArg "JoinConditionWord" (AttribStringArg s), _, _, _) -> Some s | _ -> None) - IgnoreAttribute // We do not respect this attribute for provided methods - - let flagSearch (propName: string) = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - IgnoreAttribute // We do not respect this attribute for IL methods - (function Attrib(_, _, _, ExtractAttribNamedArg propName (AttribBoolArg b), _, _, _) -> Some b | _ -> None) - IgnoreAttribute // We do not respect this attribute for provided methods - - let maintainsVarSpaceUsingBind = defaultArg (flagSearch "MaintainsVariableSpaceUsingBind") false - let maintainsVarSpace = defaultArg (flagSearch "MaintainsVariableSpace") false - let allowInto = defaultArg (flagSearch "AllowIntoPattern") false - let isLikeZip = defaultArg (flagSearch "IsLikeZip") false - let isLikeJoin = defaultArg (flagSearch "IsLikeJoin") false - let isLikeGroupJoin = defaultArg (flagSearch "IsLikeGroupJoin") false - - Some (nm, maintainsVarSpaceUsingBind, maintainsVarSpace, allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, joinConditionWord, methInfo)) - - let customOperationMethodsIndexedByKeyword = - if cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations then - customOperationMethods - |> Seq.groupBy (fun (nm, _, _, _, _, _, _, _, _) -> nm) - |> Seq.map (fun (nm, group) -> - (nm, - group - |> Seq.toList)) - else - customOperationMethods - |> Seq.groupBy (fun (nm, _, _, _, _, _, _, _, _) -> nm) - |> Seq.map (fun (nm, g) -> (nm, Seq.toList g)) - |> dict - - // Check for duplicates by method name (keywords and method names must be 1:1) - let customOperationMethodsIndexedByMethodName = - if cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations then - customOperationMethods - |> Seq.groupBy (fun (_, _, _, _, _, _, _, _, methInfo) -> methInfo.LogicalName) - |> Seq.map (fun (nm, group) -> - (nm, - group - |> Seq.toList)) - else - customOperationMethods - |> Seq.groupBy (fun (_, _, _, _, _, _, _, _, methInfo) -> methInfo.LogicalName) - |> Seq.map (fun (nm, g) -> (nm, Seq.toList g)) - |> dict - - /// Decide if the identifier represents a use of a custom query operator - let tryGetDataForCustomOperation (nm: Ident) = - let isOpDataCountAllowed opDatas = - match opDatas with - | [_] -> true - | _ :: _ -> cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations - | _ -> false - - match customOperationMethodsIndexedByKeyword.TryGetValue nm.idText with - | true, opDatas when isOpDataCountAllowed opDatas -> - for opData in opDatas do - let opName, maintainsVarSpaceUsingBind, maintainsVarSpace, _allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, _joinConditionWord, methInfo = opData - if (maintainsVarSpaceUsingBind && maintainsVarSpace) || (isLikeZip && isLikeJoin) || (isLikeZip && isLikeGroupJoin) || (isLikeJoin && isLikeGroupJoin) then - errorR(Error(FSComp.SR.tcCustomOperationInvalid opName, nm.idRange)) - if not (cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations) then - match customOperationMethodsIndexedByMethodName.TryGetValue methInfo.LogicalName with - | true, [_] -> () - | _ -> errorR(Error(FSComp.SR.tcCustomOperationMayNotBeOverloaded nm.idText, nm.idRange)) - Some opDatas - | true, opData :: _ -> errorR(Error(FSComp.SR.tcCustomOperationMayNotBeOverloaded nm.idText, nm.idRange)); Some [opData] - | _ -> None - - /// Decide if the identifier represents a use of a custom query operator - let hasCustomOperations () = if isNil customOperationMethods then CustomOperationsMode.Denied else CustomOperationsMode.Allowed - - let isCustomOperation nm = tryGetDataForCustomOperation nm |> Option.isSome - - let customOperationCheckValidity m f opDatas = - let vs = opDatas |> List.map f - let v0 = vs[0] - let opName, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo = opDatas[0] - if not (List.allEqual vs) then - errorR(Error(FSComp.SR.tcCustomOperationInvalid opName, m)) - v0 - - // Check for the MaintainsVariableSpace on custom operation - let customOperationMaintainsVarSpace (nm: Ident) = - match tryGetDataForCustomOperation nm with - | None -> false - | Some opDatas -> - opDatas |> customOperationCheckValidity nm.idRange (fun (_nm, _maintainsVarSpaceUsingBind, maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpace) - - let customOperationMaintainsVarSpaceUsingBind (nm: Ident) = - match tryGetDataForCustomOperation nm with - | None -> false - | Some opDatas -> - opDatas |> customOperationCheckValidity nm.idRange (fun (_nm, maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpaceUsingBind) - - let customOperationIsLikeZip (nm: Ident) = - match tryGetDataForCustomOperation nm with - | None -> false - | Some opDatas -> - opDatas |> customOperationCheckValidity nm.idRange (fun (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeZip) - - let customOperationIsLikeJoin (nm: Ident) = - match tryGetDataForCustomOperation nm with - | None -> false - | Some opDatas -> - opDatas |> customOperationCheckValidity nm.idRange (fun (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeJoin) - - let customOperationIsLikeGroupJoin (nm: Ident) = - match tryGetDataForCustomOperation nm with - | None -> false - | Some opDatas -> - opDatas |> customOperationCheckValidity nm.idRange (fun (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeGroupJoin) - - let customOperationJoinConditionWord (nm: Ident) = - match tryGetDataForCustomOperation nm with - | Some opDatas -> - opDatas |> customOperationCheckValidity nm.idRange (fun (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, joinConditionWord, _methInfo) -> joinConditionWord) - |> function None -> "on" | Some v -> v - | _ -> "on" - - let customOperationAllowsInto (nm: Ident) = - match tryGetDataForCustomOperation nm with - | None -> false - | Some opDatas -> - opDatas |> customOperationCheckValidity nm.idRange (fun (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> allowInto) - - let customOpUsageText nm = - match tryGetDataForCustomOperation nm with - | Some ((_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, _joinConditionWord, _methInfo) :: _) -> - if isLikeGroupJoin then - Some (FSComp.SR.customOperationTextLikeGroupJoin(nm.idText, customOperationJoinConditionWord nm, customOperationJoinConditionWord nm)) - elif isLikeJoin then - Some (FSComp.SR.customOperationTextLikeJoin(nm.idText, customOperationJoinConditionWord nm, customOperationJoinConditionWord nm)) - elif isLikeZip then - Some (FSComp.SR.customOperationTextLikeZip(nm.idText)) - else - None - | _ -> None - - /// Inside the 'query { ... }' use a modified name environment that contains fake 'CustomOperation' entries - /// for all custom operations. This adds them to the completion lists and prevents them being used as values inside - /// the query. - let env = - if List.isEmpty customOperationMethods then env else - { env with - eNameResEnv = - (env.eNameResEnv, customOperationMethods) - ||> Seq.fold (fun nenv (nm, _, _, _, _, _, _, _, methInfo) -> - AddFakeNameToNameEnv nm nenv (Item.CustomOperation (nm, (fun () -> customOpUsageText (ident (nm, mBuilderVal))), Some methInfo))) } - - // Environment is needed for completions - CallEnvSink cenv.tcSink (comp.Range, env.NameEnv, ad) - - let tryGetArgAttribsForCustomOperator (nm: Ident) = - match tryGetDataForCustomOperation nm with - | Some argInfos -> - argInfos - |> List.map (fun (_nm, __maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, methInfo) -> - match methInfo.GetParamAttribs(cenv.amap, mWhole) with - | [curriedArgInfo] -> Some (List.map fst curriedArgInfo) // one for the actual argument group - | _ -> None) - |> Some - | _ -> None - - let tryGetArgInfosForCustomOperator (nm: Ident) = - match tryGetDataForCustomOperation nm with - | Some argInfos -> - argInfos - |> List.map (fun (_nm, __maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, methInfo) -> - match methInfo with - | FSMeth(_, _, vref, _) -> - match ArgInfosOfMember cenv.g vref with - | [curriedArgInfo] -> Some curriedArgInfo - | _ -> None - | _ -> None) - |> Some - | _ -> None - - let tryExpectedArgCountForCustomOperator (nm: Ident) = - match tryGetArgAttribsForCustomOperator nm with - | None -> None - | Some argInfosForOverloads -> - let nums = argInfosForOverloads |> List.map (function None -> -1 | Some argInfos -> List.length argInfos) - - // Prior to 'OverloadsForCustomOperations' we count exact arguments. - // - // With 'OverloadsForCustomOperations' we don't compute an exact expected argument count - // if any arguments are optional, out or ParamArray. - let isSpecial = - if cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations then - argInfosForOverloads |> List.exists (fun info -> - match info with - | None -> false - | Some args -> - args |> List.exists (fun (ParamAttribs(isParamArrayArg, _isInArg, isOutArg, optArgInfo, _callerInfo, _reflArgInfo)) -> isParamArrayArg || isOutArg || optArgInfo.IsOptional)) - else - false - - if not isSpecial && nums |> List.forall (fun v -> v >= 0 && v = nums[0]) then - Some (max (nums[0] - 1) 0) // drop the computation context argument - else - None - - // Check for the [] attribute on an argument position - let isCustomOperationProjectionParameter i (nm: Ident) = - match tryGetArgInfosForCustomOperator nm with - | None -> false - | Some argInfosForOverloads -> - let vs = - argInfosForOverloads |> List.map (function - | None -> false - | Some argInfos -> - i < argInfos.Length && - let _, argInfo = List.item i argInfos - HasFSharpAttribute cenv.g cenv.g.attrib_ProjectionParameterAttribute argInfo.Attribs) - if List.allEqual vs then vs[0] - else - let opDatas = (tryGetDataForCustomOperation nm).Value - let opName, _, _, _, _, _, _, _j, _ = opDatas[0] - errorR(Error(FSComp.SR.tcCustomOperationInvalid opName, nm.idRange)) - false - - let (|ForEachThen|_|) synExpr = - match synExpr with - | SynExpr.ForEach (_spFor, _spIn, SeqExprOnly false, isFromSource, pat1, expr1, SynExpr.Sequential (_, true, clause, rest, _), _) -> - Some (isFromSource, pat1, expr1, clause, rest) - | _ -> None - - let (|CustomOpId|_|) predicate synExpr = - match synExpr with - | SingleIdent nm when isCustomOperation nm && predicate nm -> Some nm - | _ -> None - - // e1 in e2 ('in' is parsed as 'JOIN_IN') - let (|InExpr|_|) synExpr = - match synExpr with - | SynExpr.JoinIn (e1, _, e2, mApp) -> Some (e1, e2, mApp) - | _ -> None - - // e1 on e2 (note: 'on' is the 'JoinConditionWord') - let (|OnExpr|_|) nm synExpr = - match tryGetDataForCustomOperation nm with - | None -> None - | Some _ -> - match synExpr with - | SynExpr.App (_, _, SynExpr.App (_, _, e1, SingleIdent opName, _), e2, _) when opName.idText = customOperationJoinConditionWord nm -> - let item = Item.CustomOperation (opName.idText, (fun () -> None), None) - CallNameResolutionSink cenv.tcSink (opName.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.AccessRights) - Some (e1, e2) - | _ -> None - - // e1 into e2 - let (|IntoSuffix|_|) (e: SynExpr) = - match e with - | SynExpr.App (_, _, SynExpr.App (_, _, x, SingleIdent nm2, _), ExprAsPat intoPat, _) when nm2.idText = CustomOperations.Into -> - Some (x, nm2.idRange, intoPat) - | _ -> - None - - let arbPat (m: range) = mkSynPatVar None (mkSynId (m.MakeSynthetic()) "_missingVar") - - let MatchIntoSuffixOrRecover alreadyGivenError (nm: Ident) synExpr = - match synExpr with - | IntoSuffix (x, intoWordRange, intoPat) -> - // record the "into" as a custom operation for colorization - let item = Item.CustomOperation ("into", (fun () -> None), None) - CallNameResolutionSink cenv.tcSink (intoWordRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) - (x, intoPat, alreadyGivenError) - | _ -> - if not alreadyGivenError then - errorR(Error(FSComp.SR.tcOperatorIncorrectSyntax(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - (synExpr, arbPat synExpr.Range, true) - - let MatchOnExprOrRecover alreadyGivenError nm (onExpr: SynExpr) = - match onExpr with - | OnExpr nm (innerSource, SynExprParen(keySelectors, _, _, _)) -> - (innerSource, keySelectors) - | _ -> - if not alreadyGivenError then - suppressErrorReporting (fun () -> TcExprOfUnknownType cenv env tpenv onExpr) |> ignore - errorR(Error(FSComp.SR.tcOperatorIncorrectSyntax(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - (arbExpr("_innerSource", onExpr.Range), mkSynBifix onExpr.Range "=" (arbExpr("_keySelectors", onExpr.Range)) (arbExpr("_keySelector2", onExpr.Range))) - - let JoinOrGroupJoinOp detector synExpr = - match synExpr with - | SynExpr.App (_, _, CustomOpId detector nm, ExprAsPat innerSourcePat, mJoinCore) -> - Some(nm, innerSourcePat, mJoinCore, false) - // join with bad pattern (gives error on "join" and continues) - | SynExpr.App (_, _, CustomOpId detector nm, _innerSourcePatExpr, mJoinCore) -> - errorR(Error(FSComp.SR.tcBinaryOperatorRequiresVariable(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - Some(nm, arbPat mJoinCore, mJoinCore, true) - // join (without anything after - gives error on "join" and continues) - | CustomOpId detector nm -> - errorR(Error(FSComp.SR.tcBinaryOperatorRequiresVariable(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - Some(nm, arbPat synExpr.Range, synExpr.Range, true) - | _ -> - None - // JoinOrGroupJoinOp customOperationIsLikeJoin - - let (|JoinOp|_|) synExpr = JoinOrGroupJoinOp customOperationIsLikeJoin synExpr - - let (|GroupJoinOp|_|) synExpr = JoinOrGroupJoinOp customOperationIsLikeGroupJoin synExpr - - let arbKeySelectors m = mkSynBifix m "=" (arbExpr("_keySelectors", m)) (arbExpr("_keySelector2", m)) - - let (|JoinExpr|_|) synExpr = - match synExpr with - | InExpr (JoinOp(nm, innerSourcePat, _, alreadyGivenError), onExpr, mJoinCore) -> - let innerSource, keySelectors = MatchOnExprOrRecover alreadyGivenError nm onExpr - Some(nm, innerSourcePat, innerSource, keySelectors, mJoinCore) - | JoinOp (nm, innerSourcePat, mJoinCore, alreadyGivenError) -> - if alreadyGivenError then - errorR(Error(FSComp.SR.tcOperatorRequiresIn(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - Some (nm, innerSourcePat, arbExpr("_innerSource", synExpr.Range), arbKeySelectors synExpr.Range, mJoinCore) - | _ -> None - - let (|GroupJoinExpr|_|) synExpr = - match synExpr with - | InExpr (GroupJoinOp (nm, innerSourcePat, _, alreadyGivenError), intoExpr, mGroupJoinCore) -> - let onExpr, intoPat, alreadyGivenError = MatchIntoSuffixOrRecover alreadyGivenError nm intoExpr - let innerSource, keySelectors = MatchOnExprOrRecover alreadyGivenError nm onExpr - Some (nm, innerSourcePat, innerSource, keySelectors, intoPat, mGroupJoinCore) - | GroupJoinOp (nm, innerSourcePat, mGroupJoinCore, alreadyGivenError) -> - if alreadyGivenError then - errorR(Error(FSComp.SR.tcOperatorRequiresIn(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - Some (nm, innerSourcePat, arbExpr("_innerSource", synExpr.Range), arbKeySelectors synExpr.Range, arbPat synExpr.Range, mGroupJoinCore) - | _ -> - None - - - let (|JoinOrGroupJoinOrZipClause|_|) synExpr = - - match synExpr with - // join innerSourcePat in innerSource on (keySelector1 = keySelector2) - | JoinExpr (nm, innerSourcePat, innerSource, keySelectors, mJoinCore) -> - Some(nm, innerSourcePat, innerSource, Some keySelectors, None, mJoinCore) - - // groupJoin innerSourcePat in innerSource on (keySelector1 = keySelector2) into intoPat - | GroupJoinExpr (nm, innerSourcePat, innerSource, keySelectors, intoPat, mGroupJoinCore) -> - Some(nm, innerSourcePat, innerSource, Some keySelectors, Some intoPat, mGroupJoinCore) - - // zip intoPat in secondSource - | InExpr (SynExpr.App (_, _, CustomOpId customOperationIsLikeZip nm, ExprAsPat secondSourcePat, _), secondSource, mZipCore) -> - Some(nm, secondSourcePat, secondSource, None, None, mZipCore) - - // zip (without secondSource or in - gives error) - | CustomOpId customOperationIsLikeZip nm -> - errorR(Error(FSComp.SR.tcOperatorIncorrectSyntax(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - Some(nm, arbPat synExpr.Range, arbExpr("_secondSource", synExpr.Range), None, None, synExpr.Range) - - // zip secondSource (without in - gives error) - | SynExpr.App (_, _, CustomOpId customOperationIsLikeZip nm, ExprAsPat secondSourcePat, mZipCore) -> - errorR(Error(FSComp.SR.tcOperatorIncorrectSyntax(nm.idText, Option.get (customOpUsageText nm)), mZipCore)) - Some(nm, secondSourcePat, arbExpr("_innerSource", synExpr.Range), None, None, mZipCore) - - | _ -> - None - - let (|ForEachThenJoinOrGroupJoinOrZipClause|_|) strict synExpr = - match synExpr with - | ForEachThen (isFromSource, firstSourcePat, firstSource, JoinOrGroupJoinOrZipClause(nm, secondSourcePat, secondSource, keySelectorsOpt, pat3opt, mOpCore), innerComp) - when - (let _firstSourceSimplePats, later1 = - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - SimplePatsOfPat cenv.synArgNameGenerator firstSourcePat - Option.isNone later1) -> - Some (isFromSource, firstSourcePat, firstSource, nm, secondSourcePat, secondSource, keySelectorsOpt, pat3opt, mOpCore, innerComp) - - | JoinOrGroupJoinOrZipClause(nm, pat2, expr2, expr3, pat3opt, mOpCore) when strict -> - errorR(Error(FSComp.SR.tcBinaryOperatorRequiresBody(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - Some (true, arbPat synExpr.Range, arbExpr("_outerSource", synExpr.Range), nm, pat2, expr2, expr3, pat3opt, mOpCore, arbExpr("_innerComp", synExpr.Range)) - - | _ -> - None - - let (|StripApps|) e = - let rec strip e = - match e with - | SynExpr.FromParseError (SynExpr.App (_, _, f, arg, _), _) - | SynExpr.App (_, _, f, arg, _) -> - let g, acc = strip f - g, (arg :: acc) - | _ -> e, [] - let g, acc = strip e - g, List.rev acc - - let (|OptionalIntoSuffix|) e = - match e with - | IntoSuffix (body, intoWordRange, intoInfo) -> (body, Some (intoWordRange, intoInfo)) - | body -> (body, None) - - let (|CustomOperationClause|_|) e = - match e with - | OptionalIntoSuffix(StripApps(SingleIdent nm, _) as core, intoOpt) when isCustomOperation nm -> - // Now we know we have a custom operation, commit the name resolution - let intoInfoOpt = - match intoOpt with - | Some (intoWordRange, intoInfo) -> - let item = Item.CustomOperation ("into", (fun () -> None), None) - CallNameResolutionSink cenv.tcSink (intoWordRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) - Some intoInfo - | None -> None - - Some (nm, Option.get (tryGetDataForCustomOperation nm), core, core.Range, intoInfoOpt) - | _ -> None - - let mkSynLambda p e m = SynExpr.Lambda (false, false, p, e, None, m, SynExprLambdaTrivia.Zero) - - let mkExprForVarSpace m (patvs: Val list) = - match patvs with - | [] -> SynExpr.Const (SynConst.Unit, m) - | [v] -> SynExpr.Ident v.Id - | vs -> SynExpr.Tuple (false, (vs |> List.map (fun v -> SynExpr.Ident(v.Id))), [], m) - - let mkSimplePatForVarSpace m (patvs: Val list) = - let spats = - match patvs with - | [] -> [] - | [v] -> [mkSynSimplePatVar false v.Id] - | vs -> vs |> List.map (fun v -> mkSynSimplePatVar false v.Id) - SynSimplePats.SimplePats (spats, [], m) - - let mkPatForVarSpace m (patvs: Val list) = - match patvs with - | [] -> SynPat.Const (SynConst.Unit, m) - | [v] -> mkSynPatVar None v.Id - | vs -> SynPat.Tuple(false, (vs |> List.map (fun x -> mkSynPatVar None x.Id)), [], m) - - let (|OptionalSequential|) e = - match e with - | SynExpr.Sequential (_sp, true, dataComp1, dataComp2, _) -> (dataComp1, Some dataComp2) - | _ -> (e, None) - - // "cexpr; cexpr" is treated as builder.Combine(cexpr1, cexpr1) - // This is not pretty - we have to decide which range markers we use for the calls to Combine and Delay - // NOTE: we should probably suppress these sequence points altogether - let rangeForCombine innerComp1 = - let m = - match innerComp1 with - | SynExpr.IfThenElse (trivia={ IfToThenRange = mIfToThen }) -> mIfToThen - | SynExpr.Match (matchDebugPoint=DebugPointAtBinding.Yes mMatch) -> mMatch - | SynExpr.TryWith (trivia={ TryKeyword = mTry }) -> mTry - | SynExpr.TryFinally (trivia={ TryKeyword = mTry }) -> mTry - | SynExpr.For (forDebugPoint=DebugPointAtFor.Yes mBind) -> mBind - | SynExpr.ForEach (forDebugPoint=DebugPointAtFor.Yes mBind) -> mBind - | SynExpr.While (whileDebugPoint=DebugPointAtWhile.Yes mWhile) -> mWhile - | _ -> innerComp1.Range - - m.NoteSourceConstruct(NotedSourceConstruct.Combine) - - // Check for 'where x > y', 'select x, y' and other mis-applications of infix operators, give a good error message, and return a flag - let checkForBinaryApp comp = - match comp with - | StripApps(SingleIdent nm, [StripApps(SingleIdent nm2, args); arg2]) when - IsLogicalInfixOpName nm.idText && - (match tryExpectedArgCountForCustomOperator nm2 with Some n -> n > 0 | _ -> false) && - not (List.isEmpty args) -> - let estimatedRangeOfIntendedLeftAndRightArguments = unionRanges (List.last args).Range arg2.Range - errorR(Error(FSComp.SR.tcUnrecognizedQueryBinaryOperator(), estimatedRangeOfIntendedLeftAndRightArguments)) - true - | SynExpr.Tuple (false, StripApps(SingleIdent nm2, args) :: _, _, m) when - (match tryExpectedArgCountForCustomOperator nm2 with Some n -> n > 0 | _ -> false) && - not (List.isEmpty args) -> - let estimatedRangeOfIntendedLeftAndRightArguments = unionRanges (List.last args).Range m.EndRange - errorR(Error(FSComp.SR.tcUnrecognizedQueryBinaryOperator(), estimatedRangeOfIntendedLeftAndRightArguments)) - true - | _ -> - false - - let addVarsToVarSpace (varSpace: LazyWithContext) f = - LazyWithContext.Create - ((fun m -> - let (patvs: Val list, env) = varSpace.Force m - let vs, envinner = f m env - let patvs = List.append patvs (vs |> List.filter (fun v -> not (patvs |> List.exists (fun v2 -> v.LogicalName = v2.LogicalName)))) - patvs, envinner), - id) - - // Flag that a debug point should get emitted prior to both the evaluation of 'rhsExpr' and the call to Using - let addBindDebugPoint spBind e = - match spBind with - | DebugPointAtBinding.Yes m -> - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, e) - | _ -> e - - let emptyVarSpace = LazyWithContext.NotLazy ([], env) - - // If there are no 'yield' in the computation expression, and the builder supports 'Yield', - // then allow the type-directed rule interpreting non-unit-typed expressions in statement - // positions as 'yield'. 'yield!' may be present in the computation expression. - let enableImplicitYield = - cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield - && (hasMethInfo "Yield" && hasMethInfo "Combine" && hasMethInfo "Delay" && YieldFree cenv comp) - - // q - a flag indicating if custom operators are allowed. They are not allowed inside try/with, try/finally, if/then/else etc. - // varSpace - a lazy data structure indicating the variables bound so far in the overall computation - // comp - the computation expression being analyzed - // translatedCtxt - represents the translation of the context in which the computation expression 'comp' occurs, up to a - // hole to be filled by (part of) the results of translating 'comp'. - let rec tryTrans firstTry q varSpace comp translatedCtxt = - // Guard the stack for deeply nested computation expressions - cenv.stackGuard.Guard <| fun () -> - - match comp with - - // for firstSourcePat in firstSource do - // join secondSourcePat in expr2 on (expr3 = expr4) - // ... - // --> - // join expr1 expr2 (fun firstSourcePat -> expr3) (fun secondSourcePat -> expr4) (fun firstSourcePat secondSourcePat -> ...) - - // for firstSourcePat in firstSource do - // groupJoin secondSourcePat in expr2 on (expr3 = expr4) into groupPat - // ... - // --> - // groupJoin expr1 expr2 (fun firstSourcePat -> expr3) (fun secondSourcePat -> expr4) (fun firstSourcePat groupPat -> ...) - - // for firstSourcePat in firstSource do - // zip secondSource into secondSourcePat - // ... - // --> - // zip expr1 expr2 (fun pat1 pat3 -> ...) - | ForEachThenJoinOrGroupJoinOrZipClause true (isFromSource, firstSourcePat, firstSource, nm, secondSourcePat, secondSource, keySelectorsOpt, secondResultPatOpt, mOpCore, innerComp) -> - - if q = CustomOperationsMode.Denied then error(Error(FSComp.SR.tcCustomOperationMayNotBeUsedHere(), nm.idRange)) - let firstSource = mkSourceExprConditional isFromSource firstSource - let secondSource = mkSourceExpr secondSource - - // Add the variables to the variable space, on demand - let varSpaceWithFirstVars = - addVarsToVarSpace varSpace (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv firstSourcePat None - vspecs, envinner) - - let varSpaceWithSecondVars = - addVarsToVarSpace varSpaceWithFirstVars (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv secondSourcePat None - vspecs, envinner) - - let varSpaceWithGroupJoinVars = - match secondResultPatOpt with - | Some pat3 -> - addVarsToVarSpace varSpaceWithFirstVars (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv pat3 None - vspecs, envinner) - | None -> varSpace - - let firstSourceSimplePats, later1 = SimplePatsOfPat cenv.synArgNameGenerator firstSourcePat - let secondSourceSimplePats, later2 = SimplePatsOfPat cenv.synArgNameGenerator secondSourcePat - - if Option.isSome later1 then errorR (Error (FSComp.SR.tcJoinMustUseSimplePattern(nm.idText), firstSourcePat.Range)) - if Option.isSome later2 then errorR (Error (FSComp.SR.tcJoinMustUseSimplePattern(nm.idText), secondSourcePat.Range)) - - // check 'join' or 'groupJoin' or 'zip' is permitted for this builder - match tryGetDataForCustomOperation nm with - | None -> error(Error(FSComp.SR.tcMissingCustomOperation(nm.idText), nm.idRange)) - | Some opDatas -> - let opName, _, _, _, _, _, _, _, methInfo = opDatas[0] - - // Record the resolution of the custom operation for posterity - let item = Item.CustomOperation (opName, (fun () -> customOpUsageText nm), Some methInfo) - - // FUTURE: consider whether we can do better than emptyTyparInst here, in order to display instantiations - // of type variables in the quick info provided in the IDE. - CallNameResolutionSink cenv.tcSink (nm.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) - - let mkJoinExpr keySelector1 keySelector2 innerPat e = - let mSynthetic = mOpCore.MakeSynthetic() - mkSynCall methInfo.DisplayName mOpCore - [ firstSource - secondSource - mkSynLambda firstSourceSimplePats keySelector1 mSynthetic - mkSynLambda secondSourceSimplePats keySelector2 mSynthetic - mkSynLambda firstSourceSimplePats (mkSynLambda innerPat e mSynthetic) mSynthetic ] - - let mkZipExpr e = - let mSynthetic = mOpCore.MakeSynthetic() - mkSynCall methInfo.DisplayName mOpCore - [ firstSource - secondSource - mkSynLambda firstSourceSimplePats (mkSynLambda secondSourceSimplePats e mSynthetic) mSynthetic ] - - // wraps given expression into sequence with result produced by arbExpr so result will look like: - // l; SynExpr.ArbitraryAfterError (...) - // this allows to handle cases like 'on (a > b)' // '>' is not permitted as correct join relation - // after wrapping a and b can still be typechecked (so we'll have correct completion inside 'on' part) - // but presence of SynExpr.ArbitraryAfterError allows to avoid errors about incompatible types in cases like - // query { - // for a in [1] do - // join b in [""] on (a > b) - // } - // if we typecheck raw 'a' and 'b' then we'll end up with 2 errors: - // 1. incorrect join relation - // 2. incompatible types: int and string - // with SynExpr.ArbitraryAfterError we have only first one - let wrapInArbErrSequence l caption = - SynExpr.Sequential (DebugPointAtSequential.SuppressNeither, true, l, (arbExpr(caption, l.Range.EndRange)), l.Range) - - let mkOverallExprGivenVarSpaceExpr, varSpaceInner = - - let isNullableOp opId = - match ConvertValLogicalNameToDisplayNameCore opId with - | "?=" | "=?" | "?=?" -> true - | _ -> false - - match secondResultPatOpt, keySelectorsOpt with - // groupJoin - | Some secondResultPat, Some relExpr when customOperationIsLikeGroupJoin nm -> - let secondResultSimplePats, later3 = SimplePatsOfPat cenv.synArgNameGenerator secondResultPat - if Option.isSome later3 then errorR (Error (FSComp.SR.tcJoinMustUseSimplePattern(nm.idText), secondResultPat.Range)) - match relExpr with - | JoinRelation cenv env (keySelector1, keySelector2) -> - mkJoinExpr keySelector1 keySelector2 secondResultSimplePats, varSpaceWithGroupJoinVars - | BinOpExpr (opId, l, r) -> - if isNullableOp opId.idText then - // When we cannot resolve NullableOps, recommend the relevant namespace to be added - errorR(Error(FSComp.SR.cannotResolveNullableOperators(ConvertValLogicalNameToDisplayNameCore opId.idText), relExpr.Range)) - else - errorR(Error(FSComp.SR.tcInvalidRelationInJoin(nm.idText), relExpr.Range)) - let l = wrapInArbErrSequence l "_keySelector1" - let r = wrapInArbErrSequence r "_keySelector2" - // this is not correct JoinRelation but it is still binary operation - // we've already reported error now we can use operands of binary operation as join components - mkJoinExpr l r secondResultSimplePats, varSpaceWithGroupJoinVars - | _ -> - errorR(Error(FSComp.SR.tcInvalidRelationInJoin(nm.idText), relExpr.Range)) - // since the shape of relExpr doesn't match our expectations (JoinRelation) - // then we assume that this is l.h.s. of the join relation - // so typechecker will treat relExpr as body of outerKeySelector lambda parameter in GroupJoin method - mkJoinExpr relExpr (arbExpr("_keySelector2", relExpr.Range)) secondResultSimplePats, varSpaceWithGroupJoinVars - - | None, Some relExpr when customOperationIsLikeJoin nm -> - match relExpr with - | JoinRelation cenv env (keySelector1, keySelector2) -> - mkJoinExpr keySelector1 keySelector2 secondSourceSimplePats, varSpaceWithSecondVars - | BinOpExpr (opId, l, r) -> - if isNullableOp opId.idText then - // When we cannot resolve NullableOps, recommend the relevant namespace to be added - errorR(Error(FSComp.SR.cannotResolveNullableOperators(ConvertValLogicalNameToDisplayNameCore opId.idText), relExpr.Range)) - else - errorR(Error(FSComp.SR.tcInvalidRelationInJoin(nm.idText), relExpr.Range)) - // this is not correct JoinRelation but it is still binary operation - // we've already reported error now we can use operands of binary operation as join components - let l = wrapInArbErrSequence l "_keySelector1" - let r = wrapInArbErrSequence r "_keySelector2" - mkJoinExpr l r secondSourceSimplePats, varSpaceWithGroupJoinVars - | _ -> - errorR(Error(FSComp.SR.tcInvalidRelationInJoin(nm.idText), relExpr.Range)) - // since the shape of relExpr doesn't match our expectations (JoinRelation) - // then we assume that this is l.h.s. of the join relation - // so typechecker will treat relExpr as body of outerKeySelector lambda parameter in Join method - mkJoinExpr relExpr (arbExpr("_keySelector2", relExpr.Range)) secondSourceSimplePats, varSpaceWithGroupJoinVars - - | None, None when customOperationIsLikeZip nm -> - mkZipExpr, varSpaceWithSecondVars - - | _ -> - assert false - failwith "unreachable" - - - // Case from C# spec: A query expression with a join clause with an into followed by something other than a select clause - // Case from C# spec: A query expression with a join clause without an into followed by something other than a select clause - let valsInner, _env = varSpaceInner.Force mOpCore - let varSpaceExpr = mkExprForVarSpace mOpCore valsInner - let varSpacePat = mkPatForVarSpace mOpCore valsInner - let joinExpr = mkOverallExprGivenVarSpaceExpr varSpaceExpr - let consumingExpr = SynExpr.ForEach (DebugPointAtFor.No, DebugPointAtInOrTo.No, SeqExprOnly false, false, varSpacePat, joinExpr, innerComp, mOpCore) - Some (trans CompExprTranslationPass.Initial q varSpaceInner consumingExpr translatedCtxt) - - | SynExpr.ForEach (spFor, spIn, SeqExprOnly _seqExprOnly, isFromSource, pat, sourceExpr, innerComp, _mEntireForEach) -> - let sourceExpr = - match RewriteRangeExpr sourceExpr with - | Some e -> e - | None -> sourceExpr - let wrappedSourceExpr = mkSourceExprConditional isFromSource sourceExpr - - let mFor = - match spFor with - | DebugPointAtFor.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.For) - | DebugPointAtFor.No -> pat.Range - - // For computation expressions, 'in' or 'to' is hit on each MoveNext. - // To support this a named debug point for the "in" keyword is available to inlined code. - match spIn with - | DebugPointAtInOrTo.Yes mIn -> - cenv.namedDebugPointsForInlinedCode[{Range=mFor; Name="ForLoop.InOrToKeyword"}] <- mIn - | _ -> () - - let mPat = pat.Range - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mFor ad "For" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("For"), mFor)) - - // Add the variables to the query variable space, on demand - let varSpace = - addVarsToVarSpace varSpace (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv pat None - vspecs, envinner) - - Some (trans CompExprTranslationPass.Initial q varSpace innerComp - (fun innerCompR -> - - let forCall = - mkSynCall "For" mFor [wrappedSourceExpr; SynExpr.MatchLambda (false, mPat, [SynMatchClause(pat, None, innerCompR, mPat, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], DebugPointAtBinding.NoneAtInvisible, mFor) ] - - let forCall = - match spFor with - | DebugPointAtFor.Yes _ -> - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, false, forCall) - | DebugPointAtFor.No -> forCall - - translatedCtxt forCall)) - - | SynExpr.For (forDebugPoint=spFor; toDebugPoint=spTo; ident=id; identBody=start; direction=dir; toBody=finish; doBody=innerComp; range=m) -> - let mFor = match spFor with DebugPointAtFor.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.For) | _ -> m - - if isQuery then errorR(Error(FSComp.SR.tcNoIntegerForLoopInQuery(), mFor)) - - let reduced = elimFastIntegerForLoop (spFor, spTo, id, start, dir, finish, innerComp, m) - Some (trans CompExprTranslationPass.Initial q varSpace reduced translatedCtxt ) - - | SynExpr.While (spWhile, guardExpr, innerComp, _) -> - let mGuard = guardExpr.Range - let mWhile = match spWhile with DebugPointAtWhile.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) | _ -> mGuard - - if isQuery then error(Error(FSComp.SR.tcNoWhileInQuery(), mWhile)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mWhile ad "While" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("While"), mWhile)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mWhile ad "Delay" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Delay"), mWhile)) - - // 'while' is hit just before each time the guard is called - let guardExpr = - match spWhile with - | DebugPointAtWhile.Yes _ -> - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr) - | DebugPointAtWhile.No -> guardExpr - - Some(trans CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> - translatedCtxt - (mkSynCall "While" mWhile - [ mkSynDelay2 guardExpr; - mkSynCall "Delay" mWhile [mkSynDelay innerComp.Range holeFill]])) ) - - | SynExpr.WhileBang (spWhile, guardExpr, innerComp, mOrig) -> - let mGuard = guardExpr.Range - let mWhile = match spWhile with DebugPointAtWhile.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) | _ -> mGuard - let mGuard = mGuard.MakeSynthetic() - - // 'while!' is hit just before each time the guard is called - let guardExpr = - match spWhile with - | DebugPointAtWhile.Yes _ -> - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr) - | DebugPointAtWhile.No -> guardExpr - - let rewrittenWhileExpr = - let idFirst = mkSynId mGuard (CompilerGeneratedName "first") - let patFirst = mkSynPatVar None idFirst - - let body = - let idCond = mkSynId mGuard (CompilerGeneratedName "cond") - let patCond = mkSynPatVar None idCond - let condBinding = mkSynBinding (Xml.PreXmlDoc.Empty, patCond) (None, false, true, mGuard, DebugPointAtBinding.NoneAtSticky, None, SynExpr.Ident idFirst, mGuard, [], [], None, SynBindingTrivia.Zero) - let setCondExpr = SynExpr.Set (SynExpr.Ident idCond, SynExpr.Ident idFirst, mGuard) - let bindCondExpr = SynExpr.LetOrUseBang (DebugPointAtBinding.NoneAtSticky, false, true, patFirst, guardExpr, [], setCondExpr, mGuard, SynExprLetOrUseBangTrivia.Zero) - - let whileExpr = SynExpr.While (DebugPointAtWhile.No, SynExpr.Ident idCond, SynExpr.Sequential (DebugPointAtSequential.SuppressBoth, true, innerComp, bindCondExpr, mWhile), mOrig) - SynExpr.LetOrUse (false, false, [ condBinding ], whileExpr, mGuard, SynExprLetOrUseTrivia.Zero) - - SynExpr.LetOrUseBang (DebugPointAtBinding.NoneAtSticky, false, true, patFirst, guardExpr, [], body, mGuard, SynExprLetOrUseBangTrivia.Zero) - - tryTrans CompExprTranslationPass.Initial q varSpace rewrittenWhileExpr translatedCtxt - - | SynExpr.TryFinally (innerComp, unwindExpr, _mTryToLast, spTry, spFinally, trivia) -> - - let mTry = match spTry with DebugPointAtTry.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Try) | _ -> trivia.TryKeyword - let mFinally = match spFinally with DebugPointAtFinally.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Finally) | _ -> trivia.FinallyKeyword - - // Put down a debug point for the 'finally' - let unwindExpr2 = - match spFinally with - | DebugPointAtFinally.Yes _ -> - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFinally, true, unwindExpr) - | DebugPointAtFinally.No -> unwindExpr - - if isQuery then error(Error(FSComp.SR.tcNoTryFinallyInQuery(), mTry)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mTry ad "TryFinally" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("TryFinally"), mTry)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mTry ad "Delay" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Delay"), mTry)) - - let innerExpr = transNoQueryOps innerComp - - let innerExpr = - match spTry with - | DebugPointAtTry.Yes _ -> - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr) - | _ -> innerExpr - - Some (translatedCtxt - (mkSynCall "TryFinally" mTry [ - mkSynCall "Delay" mTry [mkSynDelay innerComp.Range innerExpr] - mkSynDelay2 unwindExpr2])) - - | SynExpr.Paren (_, _, _, m) -> - error(Error(FSComp.SR.tcConstructIsAmbiguousInComputationExpression(), m)) - - // In some cases the node produced by `mkSynCall "Zero" m []` may be discarded in the case - // of implicit yields - for example "list { 1; 2 }" when each expression checks as an implicit yield. - // If it is not discarded, the syntax node will later be checked and the existence/non-existence of the Zero method - // will be checked/reported appropriately (though the error message won't mention computation expressions - // like our other error messages for missing methods). - | SynExpr.ImplicitZero m -> - if (not enableImplicitYield) && - isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad "Zero" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("Zero"), m)) - Some (translatedCtxt (mkSynCall "Zero" m [])) - - | OptionalSequential (JoinOrGroupJoinOrZipClause (_, _, _, _, _, mClause), _) - when firstTry = CompExprTranslationPass.Initial -> - - // 'join' clauses preceded by 'let' and other constructs get processed by repackaging with a 'for' loop. - let patvs, _env = varSpace.Force comp.Range - let varSpaceExpr = mkExprForVarSpace mClause patvs - let varSpacePat = mkPatForVarSpace mClause patvs - - let dataCompPrior = - translatedCtxt (transNoQueryOps (SynExpr.YieldOrReturn ((true, false), varSpaceExpr, mClause))) - - // Rebind using for ... - let rebind = - SynExpr.ForEach (DebugPointAtFor.No, DebugPointAtInOrTo.No, SeqExprOnly false, false, varSpacePat, dataCompPrior, comp, comp.Range) - - // Retry with the 'for' loop packaging. Set firstTry=false just in case 'join' processing fails - tryTrans CompExprTranslationPass.Subsequent q varSpace rebind id - - - | OptionalSequential (CustomOperationClause (nm, _, opExpr, mClause, _), _) -> - - if q = CustomOperationsMode.Denied then error(Error(FSComp.SR.tcCustomOperationMayNotBeUsedHere(), opExpr.Range)) - - let patvs, _env = varSpace.Force comp.Range - let varSpaceExpr = mkExprForVarSpace mClause patvs - - let dataCompPriorToOp = - let isYield = not (customOperationMaintainsVarSpaceUsingBind nm) - translatedCtxt (transNoQueryOps (SynExpr.YieldOrReturn ((isYield, false), varSpaceExpr, mClause))) - - // Now run the consumeCustomOpClauses - Some (consumeCustomOpClauses q varSpace dataCompPriorToOp comp false mClause) - - | SynExpr.Sequential (sp, true, innerComp1, innerComp2, m) -> - - // Check for 'where x > y' and other mis-applications of infix operators. If detected, give a good error message, and just ignore innerComp1 - if isQuery && checkForBinaryApp innerComp1 then - Some (trans CompExprTranslationPass.Initial q varSpace innerComp2 translatedCtxt) - - else - - if isQuery && not(innerComp1.IsArbExprAndThusAlreadyReportedError) then - match innerComp1 with - | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential - | _ -> errorR(Error(FSComp.SR.tcUnrecognizedQueryOperator(), innerComp1.RangeOfFirstPortion)) - - match tryTrans CompExprTranslationPass.Initial CustomOperationsMode.Denied varSpace innerComp1 id with - | Some c -> - // "cexpr; cexpr" is treated as builder.Combine(cexpr1, cexpr1) - let m1 = rangeForCombine innerComp1 - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad "Combine" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Combine"), m)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad "Delay" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Delay"), m)) - - let combineCall = mkSynCall "Combine" m1 [c; mkSynCall "Delay" m1 [mkSynDelay innerComp2.Range (transNoQueryOps innerComp2)]] - - Some (translatedCtxt combineCall) - - | None -> - // "do! expr; cexpr" is treated as { let! () = expr in cexpr } - match innerComp1 with - | SynExpr.DoBang (rhsExpr, m) -> - let sp = - match sp with - | DebugPointAtSequential.SuppressExpr -> DebugPointAtBinding.NoneAtDo - | DebugPointAtSequential.SuppressBoth -> DebugPointAtBinding.NoneAtDo - | DebugPointAtSequential.SuppressStmt -> DebugPointAtBinding.Yes m - | DebugPointAtSequential.SuppressNeither -> DebugPointAtBinding.Yes m - Some(trans CompExprTranslationPass.Initial q varSpace (SynExpr.LetOrUseBang (sp, false, true, SynPat.Const(SynConst.Unit, rhsExpr.Range), rhsExpr, [], innerComp2, m, SynExprLetOrUseBangTrivia.Zero)) translatedCtxt) - - // "expr; cexpr" is treated as sequential execution - | _ -> - Some (trans CompExprTranslationPass.Initial q varSpace innerComp2 (fun holeFill -> - let fillExpr = - if enableImplicitYield then - // When implicit yields are enabled, then if the 'innerComp1' checks as type - // 'unit' we interpret the expression as a sequential, and when it doesn't - // have type 'unit' we interpret it as a 'Yield + Combine'. - let combineExpr = - let m1 = rangeForCombine innerComp1 - let implicitYieldExpr = mkSynCall "Yield" comp.Range [innerComp1] - mkSynCall "Combine" m1 [implicitYieldExpr; mkSynCall "Delay" m1 [mkSynDelay holeFill.Range holeFill]] - SynExpr.SequentialOrImplicitYield(sp, innerComp1, holeFill, combineExpr, m) - else - SynExpr.Sequential(sp, true, innerComp1, holeFill, m) - translatedCtxt fillExpr)) - - | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia) -> - match elseCompOpt with - | Some elseComp -> - if isQuery then error(Error(FSComp.SR.tcIfThenElseMayNotBeUsedWithinQueries(), trivia.IfToThenRange)) - Some (translatedCtxt (SynExpr.IfThenElse (guardExpr, transNoQueryOps thenComp, Some(transNoQueryOps elseComp), spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia))) - | None -> - let elseComp = - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env trivia.IfToThenRange ad "Zero" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Zero"), trivia.IfToThenRange)) - mkSynCall "Zero" trivia.IfToThenRange [] - Some (trans CompExprTranslationPass.Initial q varSpace thenComp (fun holeFill -> translatedCtxt (SynExpr.IfThenElse (guardExpr, holeFill, Some elseComp, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia)))) - - // 'let binds in expr' - | SynExpr.LetOrUse (isRec, false, binds, innerComp, m, trivia) -> - - // For 'query' check immediately - if isQuery then - match (List.map (BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env) binds) with - | [NormalizedBinding(_, SynBindingKind.Normal, false, false, _, _, _, _, _, _, _, _)] when not isRec -> - () - | normalizedBindings -> - let failAt m = error(Error(FSComp.SR.tcNonSimpleLetBindingInQuery(), m)) - match normalizedBindings with - | NormalizedBinding(_, _, _, _, _, _, _, _, _, _, mBinding, _) :: _ -> failAt mBinding - | _ -> failAt m - - // Add the variables to the query variable space, on demand - let varSpace = - addVarsToVarSpace varSpace (fun mQueryOp env -> - // Normalize the bindings before detecting the bound variables - match (List.map (BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env) binds) with - | [NormalizedBinding(_vis, SynBindingKind.Normal, false, false, _, _, _, _, pat, _, _, _)] -> - // successful case - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv pat None - vspecs, envinner - | _ -> - // error case - error(Error(FSComp.SR.tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings(), mQueryOp))) - - Some (trans CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> translatedCtxt (SynExpr.LetOrUse (isRec, false, binds, holeFill, m, trivia)))) - - // 'use x = expr in expr' - | SynExpr.LetOrUse (isUse=true; bindings=[SynBinding (kind=SynBindingKind.Normal; headPat=pat; expr=rhsExpr; debugPoint=spBind)]; body=innerComp) -> - let mBind = match spBind with DebugPointAtBinding.Yes m -> m | _ -> rhsExpr.Range - if isQuery then error(Error(FSComp.SR.tcUseMayNotBeUsedInQueries(), mBind)) - let innerCompRange = innerComp.Range - let consumeExpr = SynExpr.MatchLambda(false, innerCompRange, [SynMatchClause(pat, None, transNoQueryOps innerComp, innerCompRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], DebugPointAtBinding.NoneAtInvisible, innerCompRange) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad "Using" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Using"), mBind)) - - Some (translatedCtxt (mkSynCall "Using" mBind [rhsExpr; consumeExpr ]) |> addBindDebugPoint spBind) - - // 'let! pat = expr in expr' - // --> build.Bind(e1, (fun _argN -> match _argN with pat -> expr)) - // or - // --> build.BindReturn(e1, (fun _argN -> match _argN with pat -> expr-without-return)) - | SynExpr.LetOrUseBang (bindDebugPoint=spBind; isUse=false; isFromSource=isFromSource; pat=pat; rhs=rhsExpr; andBangs=[]; body=innerComp) -> - - let mBind = match spBind with DebugPointAtBinding.Yes m -> m | _ -> rhsExpr.Range - if isQuery then error(Error(FSComp.SR.tcBindMayNotBeUsedInQueries(), mBind)) - - // Add the variables to the query variable space, on demand - let varSpace = - addVarsToVarSpace varSpace (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv pat None - vspecs, envinner) - - let rhsExpr = mkSourceExprConditional isFromSource rhsExpr - Some (transBind q varSpace mBind (addBindDebugPoint spBind) "Bind" [rhsExpr] pat innerComp translatedCtxt) - - // 'use! pat = e1 in e2' --> build.Bind(e1, (function _argN -> match _argN with pat -> build.Using(x, (fun _argN -> match _argN with pat -> e2)))) - | SynExpr.LetOrUseBang (bindDebugPoint=spBind; isUse=true; isFromSource=isFromSource; pat=SynPat.Named (ident=SynIdent(id,_); isThisVal=false) as pat; rhs=rhsExpr; andBangs=[]; body=innerComp) - | SynExpr.LetOrUseBang (bindDebugPoint=spBind; isUse=true; isFromSource=isFromSource; pat=SynPat.LongIdent (longDotId=SynLongIdent([id], _, _)) as pat; rhs=rhsExpr; andBangs=[]; body=innerComp) -> - - let mBind = match spBind with DebugPointAtBinding.Yes m -> m | _ -> rhsExpr.Range - if isQuery then error(Error(FSComp.SR.tcBindMayNotBeUsedInQueries(), mBind)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad "Using" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Using"), mBind)) - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad "Bind" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Bind"), mBind)) - - let bindExpr = - let consumeExpr = SynExpr.MatchLambda(false, mBind, [SynMatchClause(pat, None, transNoQueryOps innerComp, innerComp.Range, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], DebugPointAtBinding.NoneAtInvisible, mBind) - let consumeExpr = mkSynCall "Using" mBind [SynExpr.Ident id; consumeExpr ] - let consumeExpr = SynExpr.MatchLambda(false, mBind, [SynMatchClause(pat, None, consumeExpr, id.idRange, DebugPointAtTarget.No, SynMatchClauseTrivia.Zero)], DebugPointAtBinding.NoneAtInvisible, mBind) - let rhsExpr = mkSourceExprConditional isFromSource rhsExpr - mkSynCall "Bind" mBind [rhsExpr; consumeExpr] - |> addBindDebugPoint spBind - - Some(translatedCtxt bindExpr) - - // 'use! pat = e1 ... in e2' where 'pat' is not a simple name --> error - | SynExpr.LetOrUseBang (isUse=true; pat=pat; andBangs=andBangs) -> - if isNil andBangs then - error(Error(FSComp.SR.tcInvalidUseBangBinding(), pat.Range)) - else - error(Error(FSComp.SR.tcInvalidUseBangBindingNoAndBangs(), comp.Range)) - - // 'let! pat1 = expr1 and! pat2 = expr2 in ...' --> - // build.BindN(expr1, expr2, ...) - // or - // build.BindNReturn(expr1, expr2, ...) - // or - // build.Bind(build.MergeSources(expr1, expr2), ...) - | SynExpr.LetOrUseBang(bindDebugPoint=spBind; isUse=false; isFromSource=isFromSource; pat=letPat; rhs=letRhsExpr; andBangs=andBangBindings; body=innerComp; range=letBindRange) -> - if not (cenv.g.langVersion.SupportsFeature LanguageFeature.AndBang) then - error(Error(FSComp.SR.tcAndBangNotSupported(), comp.Range)) - - if isQuery then - error(Error(FSComp.SR.tcBindMayNotBeUsedInQueries(), letBindRange)) - - let mBind = match spBind with DebugPointAtBinding.Yes m -> m | _ -> letRhsExpr.Range - let sources = (letRhsExpr :: [for SynExprAndBang(body=andExpr) in andBangBindings -> andExpr ]) |> List.map (mkSourceExprConditional isFromSource) - let pats = letPat :: [for SynExprAndBang(pat = andPat) in andBangBindings -> andPat ] - let sourcesRange = sources |> List.map (fun e -> e.Range) |> List.reduce unionRanges - - let numSources = sources.Length - let bindReturnNName = "Bind"+string numSources+"Return" - let bindNName = "Bind"+string numSources - - // Check if this is a Bind2Return etc. - let hasBindReturnN = not (isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad bindReturnNName builderTy)) - if hasBindReturnN && Option.isSome (convertSimpleReturnToExpr varSpace innerComp) then - let consumePat = SynPat.Tuple(false, pats, [], letPat.Range) - - // Add the variables to the query variable space, on demand - let varSpace = - addVarsToVarSpace varSpace (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv consumePat None - vspecs, envinner) - - Some (transBind q varSpace mBind (addBindDebugPoint spBind) bindNName sources consumePat innerComp translatedCtxt) - - else - - // Check if this is a Bind2 etc. - let hasBindN = not (isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad bindNName builderTy)) - if hasBindN then - let consumePat = SynPat.Tuple(false, pats, [], letPat.Range) - - // Add the variables to the query variable space, on demand - let varSpace = - addVarsToVarSpace varSpace (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv consumePat None - vspecs, envinner) - - Some (transBind q varSpace mBind (addBindDebugPoint spBind) bindNName sources consumePat innerComp translatedCtxt) - else - - // Look for the maximum supported MergeSources, MergeSources3, ... - let mkMergeSourcesName n = if n = 2 then "MergeSources" else "MergeSources"+(string n) - - let maxMergeSources = - let rec loop (n: int) = - let mergeSourcesName = mkMergeSourcesName n - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad mergeSourcesName builderTy) then - (n-1) - else - loop (n+1) - loop 2 - - if maxMergeSources = 1 then error(Error(FSComp.SR.tcRequireMergeSourcesOrBindN(bindNName), mBind)) - - let rec mergeSources (sourcesAndPats: (SynExpr * SynPat) list) = - let numSourcesAndPats = sourcesAndPats.Length - assert (numSourcesAndPats <> 0) - if numSourcesAndPats = 1 then - sourcesAndPats[0] - - elif numSourcesAndPats <= maxMergeSources then - - // Call MergeSources2(e1, e2), MergeSources3(e1, e2, e3) etc - let mergeSourcesName = mkMergeSourcesName numSourcesAndPats - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad mergeSourcesName builderTy) then - error(Error(FSComp.SR.tcRequireMergeSourcesOrBindN(bindNName), mBind)) - - let source = mkSynCall mergeSourcesName sourcesRange (List.map fst sourcesAndPats) - let pat = SynPat.Tuple(false, List.map snd sourcesAndPats, [], letPat.Range) - source, pat - - else - - // Call MergeSourcesMax(e1, e2, e3, e4, (...)) - let nowSourcesAndPats, laterSourcesAndPats = List.splitAt (maxMergeSources - 1) sourcesAndPats - let mergeSourcesName = mkMergeSourcesName maxMergeSources - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBind ad mergeSourcesName builderTy) then - error(Error(FSComp.SR.tcRequireMergeSourcesOrBindN(bindNName), mBind)) - - let laterSource, laterPat = mergeSources laterSourcesAndPats - let source = mkSynCall mergeSourcesName sourcesRange (List.map fst nowSourcesAndPats @ [laterSource]) - let pat = SynPat.Tuple(false, List.map snd nowSourcesAndPats @ [laterPat], [], letPat.Range) - source, pat - - let mergedSources, consumePat = mergeSources (List.zip sources pats) - - // Add the variables to the query variable space, on demand - let varSpace = - addVarsToVarSpace varSpace (fun _mCustomOp env -> - use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink - let _, _, vspecs, envinner, _ = TcMatchPattern cenv (NewInferenceType g) env tpenv consumePat None - vspecs, envinner) - - // Build the 'Bind' call - Some (transBind q varSpace mBind (addBindDebugPoint spBind) "Bind" [mergedSources] consumePat innerComp translatedCtxt) - - | SynExpr.Match (spMatch, expr, clauses, m, trivia) -> - if isQuery then error(Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery(), trivia.MatchKeyword)) - let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, innerComp, patm, sp, trivia)) -> SynMatchClause(pat, cond, transNoQueryOps innerComp, patm, sp, trivia)) - Some(translatedCtxt (SynExpr.Match (spMatch, expr, clauses, m, trivia))) - - // 'match! expr with pats ...' --> build.Bind(e1, (function pats ...)) - // FUTURE: consider allowing translation to BindReturn - | SynExpr.MatchBang (spMatch, expr, clauses, _m, trivia) -> - let inputExpr = mkSourceExpr expr - if isQuery then error(Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery(), trivia.MatchBangKeyword)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env trivia.MatchBangKeyword ad "Bind" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Bind"), trivia.MatchBangKeyword)) - - let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, innerComp, patm, sp, trivia)) -> SynMatchClause(pat, cond, transNoQueryOps innerComp, patm, sp, trivia)) - let consumeExpr = SynExpr.MatchLambda (false, trivia.MatchBangKeyword, clauses, DebugPointAtBinding.NoneAtInvisible, trivia.MatchBangKeyword) - - let callExpr = - mkSynCall "Bind" trivia.MatchBangKeyword [inputExpr; consumeExpr] - |> addBindDebugPoint spMatch - - Some(translatedCtxt callExpr) - - | SynExpr.TryWith (innerComp, clauses, mTryToLast, spTry, spWith, trivia) -> - let mTry = match spTry with DebugPointAtTry.Yes _ -> trivia.TryKeyword.NoteSourceConstruct(NotedSourceConstruct.Try) | _ -> trivia.TryKeyword - let spWith2 = match spWith with DebugPointAtWith.Yes _ -> DebugPointAtBinding.Yes trivia.WithKeyword | _ -> DebugPointAtBinding.NoneAtInvisible - - if isQuery then error(Error(FSComp.SR.tcTryWithMayNotBeUsedInQueries(), mTry)) - - let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, clauseComp, patm, sp, trivia)) -> SynMatchClause(pat, cond, transNoQueryOps clauseComp, patm, sp, trivia)) - let consumeExpr = SynExpr.MatchLambda(true, mTryToLast, clauses, spWith2, mTryToLast) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mTry ad "TryWith" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("TryWith"), mTry)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mTry ad "Delay" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Delay"), mTry)) - - let innerExpr = transNoQueryOps innerComp - - let innerExpr = - match spTry with - | DebugPointAtTry.Yes _ -> - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr) - | _ -> innerExpr - - let callExpr = - mkSynCall "TryWith" mTry [ - mkSynCall "Delay" mTry [mkSynDelay2 innerExpr] - consumeExpr - ] - - Some(translatedCtxt callExpr) - - | SynExpr.YieldOrReturnFrom ((true, _), synYieldExpr, m) -> - let yieldFromExpr = mkSourceExpr synYieldExpr - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad "YieldFrom" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("YieldFrom"), m)) - - let yieldFromCall = mkSynCall "YieldFrom" m [yieldFromExpr] - - let yieldFromCall = - if IsControlFlowExpression synYieldExpr then - yieldFromCall - else - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, yieldFromCall) - - Some (translatedCtxt yieldFromCall) - - | SynExpr.YieldOrReturnFrom ((false, _), synReturnExpr, m) -> - let returnFromExpr = mkSourceExpr synReturnExpr - if isQuery then error(Error(FSComp.SR.tcReturnMayNotBeUsedInQueries(), m)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad "ReturnFrom" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("ReturnFrom"), m)) - - let returnFromCall = mkSynCall "ReturnFrom" m [returnFromExpr] - - let returnFromCall = - if IsControlFlowExpression synReturnExpr then - returnFromCall - else - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, returnFromCall) - - Some (translatedCtxt returnFromCall) - - | SynExpr.YieldOrReturn ((isYield, _), synYieldOrReturnExpr, m) -> - let methName = (if isYield then "Yield" else "Return") - if isQuery && not isYield then error(Error(FSComp.SR.tcReturnMayNotBeUsedInQueries(), m)) - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad methName builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod(methName), m)) - - let yieldOrReturnCall = mkSynCall methName m [synYieldOrReturnExpr] - - let yieldOrReturnCall = - if IsControlFlowExpression synYieldOrReturnExpr then - yieldOrReturnCall - else - SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, yieldOrReturnCall) - - Some(translatedCtxt yieldOrReturnCall) - - | _ -> None - - and consumeCustomOpClauses q (varSpace: LazyWithContext<_, _>) dataCompPrior compClausesExpr lastUsesBind mClause = - - // Substitute 'yield ' into the context - - let patvs, _env = varSpace.Force comp.Range - let varSpaceSimplePat = mkSimplePatForVarSpace mClause patvs - let varSpacePat = mkPatForVarSpace mClause patvs - - match compClausesExpr with - - // Detect one custom operation... This clause will always match at least once... - | OptionalSequential (CustomOperationClause (nm, opDatas, opExpr, mClause, optionalIntoPat), optionalCont) -> - - let opName, _, _, _, _, _, _, _, methInfo = opDatas[0] - let isLikeZip = customOperationIsLikeZip nm - let isLikeJoin = customOperationIsLikeJoin nm - let isLikeGroupJoin = customOperationIsLikeZip nm - - // Record the resolution of the custom operation for posterity - let item = Item.CustomOperation (opName, (fun () -> customOpUsageText nm), Some methInfo) - - // FUTURE: consider whether we can do better than emptyTyparInst here, in order to display instantiations - // of type variables in the quick info provided in the IDE. - CallNameResolutionSink cenv.tcSink (nm.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) - - if isLikeZip || isLikeJoin || isLikeGroupJoin then - errorR(Error(FSComp.SR.tcBinaryOperatorRequiresBody(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) - match optionalCont with - | None -> - // we are about to drop the 'opExpr' AST on the floor. we've already reported an error. attempt to get name resolutions before dropping it - RecordNameAndTypeResolutions cenv env tpenv opExpr - dataCompPrior - | Some contExpr -> consumeCustomOpClauses q varSpace dataCompPrior contExpr lastUsesBind mClause - else - - let maintainsVarSpace = customOperationMaintainsVarSpace nm - let maintainsVarSpaceUsingBind = customOperationMaintainsVarSpaceUsingBind nm - - let expectedArgCount = tryExpectedArgCountForCustomOperator nm - - let dataCompAfterOp = - match opExpr with - | StripApps(SingleIdent nm, args) -> - let argCountsMatch = - match expectedArgCount with - | Some n -> n = args.Length - | None -> cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations - if argCountsMatch then - // Check for the [] attribute on each argument position - let args = args |> List.mapi (fun i arg -> - if isCustomOperationProjectionParameter (i+1) nm then - SynExpr.Lambda (false, false, varSpaceSimplePat, arg, None, arg.Range.MakeSynthetic(), SynExprLambdaTrivia.Zero) - else arg) - mkSynCall methInfo.DisplayName mClause (dataCompPrior :: args) - else - let expectedArgCount = defaultArg expectedArgCount 0 - errorR(Error(FSComp.SR.tcCustomOperationHasIncorrectArgCount(nm.idText, expectedArgCount, args.Length), nm.idRange)) - mkSynCall methInfo.DisplayName mClause ([ dataCompPrior ] @ List.init expectedArgCount (fun i -> arbExpr("_arg" + string i, mClause))) - | _ -> failwith "unreachable" - - match optionalCont with - | None -> - match optionalIntoPat with - | Some intoPat -> errorR(Error(FSComp.SR.tcIntoNeedsRestOfQuery(), intoPat.Range)) - | None -> () - dataCompAfterOp - - | Some contExpr -> - - // select a.Name into name; ... - // distinct into d; ... - // - // Rebind the into pattern and process the rest of the clauses - match optionalIntoPat with - | Some intoPat -> - if not (customOperationAllowsInto nm) then - error(Error(FSComp.SR.tcOperatorDoesntAcceptInto(nm.idText), intoPat.Range)) - - // Rebind using either for ... or let!.... - let rebind = - if maintainsVarSpaceUsingBind then - SynExpr.LetOrUseBang (DebugPointAtBinding.NoneAtLet, false, false, intoPat, dataCompAfterOp, [], contExpr, intoPat.Range, SynExprLetOrUseBangTrivia.Zero) - else - SynExpr.ForEach (DebugPointAtFor.No, DebugPointAtInOrTo.No, SeqExprOnly false, false, intoPat, dataCompAfterOp, contExpr, intoPat.Range) - - trans CompExprTranslationPass.Initial q emptyVarSpace rebind id - - // select a.Name; ... - // distinct; ... - // - // Process the rest of the clauses - | None -> - if maintainsVarSpace || maintainsVarSpaceUsingBind then - consumeCustomOpClauses q varSpace dataCompAfterOp contExpr maintainsVarSpaceUsingBind mClause - else - consumeCustomOpClauses q emptyVarSpace dataCompAfterOp contExpr false mClause - - // No more custom operator clauses in compClausesExpr, but there may be clauses like join, yield etc. - // Bind/iterate the dataCompPrior and use compClausesExpr as the body. - | _ -> - // Rebind using either for ... or let!.... - let rebind = - if lastUsesBind then - SynExpr.LetOrUseBang (DebugPointAtBinding.NoneAtLet, false, false, varSpacePat, dataCompPrior, [], compClausesExpr, compClausesExpr.Range, SynExprLetOrUseBangTrivia.Zero) - else - SynExpr.ForEach (DebugPointAtFor.No, DebugPointAtInOrTo.No, SeqExprOnly false, false, varSpacePat, dataCompPrior, compClausesExpr, compClausesExpr.Range) - - trans CompExprTranslationPass.Initial q varSpace rebind id - - and transNoQueryOps comp = - trans CompExprTranslationPass.Initial CustomOperationsMode.Denied emptyVarSpace comp id - - and trans firstTry q varSpace comp translatedCtxt = - match tryTrans firstTry q varSpace comp translatedCtxt with - | Some e -> e - | None -> - // This only occurs in final position in a sequence - match comp with - // "do! expr;" in final position is treated as { let! () = expr in return () } when Return is provided (and no Zero with Default attribute is available) or as { let! () = expr in zero } otherwise - | SynExpr.DoBang (rhsExpr, m) -> - let mUnit = rhsExpr.Range - let rhsExpr = mkSourceExpr rhsExpr - if isQuery then error(Error(FSComp.SR.tcBindMayNotBeUsedInQueries(), m)) - let bodyExpr = - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad "Return" builderTy) then - SynExpr.ImplicitZero m - else - match TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env m ad "Zero" builderTy with - | minfo :: _ when MethInfoHasAttribute cenv.g m cenv.g.attrib_DefaultValueAttribute minfo -> SynExpr.ImplicitZero m - | _ -> SynExpr.YieldOrReturn ((false, true), SynExpr.Const (SynConst.Unit, m), m) - let letBangBind = SynExpr.LetOrUseBang (DebugPointAtBinding.NoneAtDo, false, false, SynPat.Const(SynConst.Unit, mUnit), rhsExpr, [], bodyExpr, m, SynExprLetOrUseBangTrivia.Zero) - trans CompExprTranslationPass.Initial q varSpace letBangBind translatedCtxt - - // "expr;" in final position is treated as { expr; zero } - // Suppress the sequence point on the "zero" - | _ -> - // Check for 'where x > y' and other mis-applications of infix operators. If detected, give a good error message, and just ignore comp - if isQuery && checkForBinaryApp comp then - trans CompExprTranslationPass.Initial q varSpace (SynExpr.ImplicitZero comp.Range) translatedCtxt - else - if isQuery && not comp.IsArbExprAndThusAlreadyReportedError then - match comp with - | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential - | _ -> errorR(Error(FSComp.SR.tcUnrecognizedQueryOperator(), comp.RangeOfFirstPortion)) - trans CompExprTranslationPass.Initial q varSpace (SynExpr.ImplicitZero comp.Range) (fun holeFill -> - let fillExpr = - if enableImplicitYield then - let implicitYieldExpr = mkSynCall "Yield" comp.Range [comp] - SynExpr.SequentialOrImplicitYield(DebugPointAtSequential.SuppressExpr, comp, holeFill, implicitYieldExpr, comp.Range) - else - SynExpr.Sequential(DebugPointAtSequential.SuppressExpr, true, comp, holeFill, comp.Range) - translatedCtxt fillExpr) - - and transBind q varSpace bindRange addBindDebugPoint bindName bindArgs (consumePat: SynPat) (innerComp: SynExpr) translatedCtxt = - - let innerRange = innerComp.Range - - let innerCompReturn = - if cenv.g.langVersion.SupportsFeature LanguageFeature.AndBang then - convertSimpleReturnToExpr varSpace innerComp - else None - - match innerCompReturn with - | Some (innerExpr, customOpInfo) when - (let bindName = bindName + "Return" - not (isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env bindRange ad bindName builderTy))) -> - - let bindName = bindName + "Return" - - // Build the `BindReturn` call - let dataCompPriorToOp = - let consumeExpr = SynExpr.MatchLambda(false, consumePat.Range, [SynMatchClause(consumePat, None, innerExpr, innerRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], DebugPointAtBinding.NoneAtInvisible, innerRange) - translatedCtxt (mkSynCall bindName bindRange (bindArgs @ [consumeExpr])) - - match customOpInfo with - | None -> dataCompPriorToOp - | Some (innerComp, mClause) -> - // If the `BindReturn` was forced by a custom operation, continue to process the clauses of the CustomOp - consumeCustomOpClauses q varSpace dataCompPriorToOp innerComp false mClause - - | _ -> - - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env bindRange ad bindName builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod(bindName), bindRange)) - - // Build the `Bind` call - trans CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> - let consumeExpr = SynExpr.MatchLambda(false, consumePat.Range, [SynMatchClause(consumePat, None, holeFill, innerRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], DebugPointAtBinding.NoneAtInvisible, innerRange) - let bindCall = mkSynCall bindName bindRange (bindArgs @ [consumeExpr]) - translatedCtxt (bindCall |> addBindDebugPoint)) - - /// This function is for desugaring into .Bind{N}Return calls if possible - /// The outer option indicates if .BindReturn is possible. When it returns None, .BindReturn cannot be used - /// The inner option indicates if a custom operation is involved inside - and convertSimpleReturnToExpr varSpace innerComp = - match innerComp with - | SynExpr.YieldOrReturn ((false, _), returnExpr, m) -> - let returnExpr = SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, returnExpr) - Some (returnExpr, None) - - | SynExpr.Match (spMatch, expr, clauses, m, trivia) -> - let clauses = - clauses |> List.map (fun (SynMatchClause(pat, cond, innerComp2, patm, sp, trivia)) -> - match convertSimpleReturnToExpr varSpace innerComp2 with - | None -> None // failure - | Some (_, Some _) -> None // custom op on branch = failure - | Some (innerExpr2, None) -> Some (SynMatchClause(pat, cond, innerExpr2, patm, sp, trivia))) - if clauses |> List.forall Option.isSome then - Some (SynExpr.Match (spMatch, expr, (clauses |> List.map Option.get), m, trivia), None) - else - None - - | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia) -> - match convertSimpleReturnToExpr varSpace thenComp with - | None -> None - | Some (_, Some _) -> None - | Some (thenExpr, None) -> - let elseExprOptOpt = - match elseCompOpt with - // When we are missing an 'else' part alltogether in case of 'if cond then return exp', we fallback from BindReturn into regular Bind+Return - | None -> None - | Some elseComp -> - match convertSimpleReturnToExpr varSpace elseComp with - | None -> None // failure - | Some (_, Some _) -> None // custom op on branch = failure - | Some (elseExpr, None) -> Some (Some elseExpr) - match elseExprOptOpt with - | None -> None - | Some elseExprOpt -> Some (SynExpr.IfThenElse (guardExpr, thenExpr, elseExprOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia), None) - - | SynExpr.LetOrUse (isRec, false, binds, innerComp, m, trivia) -> - match convertSimpleReturnToExpr varSpace innerComp with - | None -> None - | Some (_, Some _) -> None - | Some (innerExpr, None) -> Some (SynExpr.LetOrUse (isRec, false, binds, innerExpr, m, trivia), None) - - | OptionalSequential (CustomOperationClause (nm, _, _, mClause, _), _) when customOperationMaintainsVarSpaceUsingBind nm -> - - let patvs, _env = varSpace.Force comp.Range - let varSpaceExpr = mkExprForVarSpace mClause patvs - - Some (varSpaceExpr, Some (innerComp, mClause)) - - | SynExpr.Sequential (sp, true, innerComp1, innerComp2, m) -> - - // Check the first part isn't a computation expression construct - if isSimpleExpr innerComp1 then - // Check the second part is a simple return - match convertSimpleReturnToExpr varSpace innerComp2 with - | None -> None - | Some (innerExpr2, optionalCont) -> Some (SynExpr.Sequential (sp, true, innerComp1, innerExpr2, m), optionalCont) - else - None - - | _ -> None - - /// Check if an expression has no computation expression constructs - and isSimpleExpr comp = - - match comp with - | ForEachThenJoinOrGroupJoinOrZipClause false _ -> false - | SynExpr.ForEach _ -> false - | SynExpr.For _ -> false - | SynExpr.While _ -> false - | SynExpr.WhileBang _ -> false - | SynExpr.TryFinally _ -> false - | SynExpr.ImplicitZero _ -> false - | OptionalSequential (JoinOrGroupJoinOrZipClause _, _) -> false - | OptionalSequential (CustomOperationClause _, _) -> false - | SynExpr.Sequential (_, _, innerComp1, innerComp2, _) -> isSimpleExpr innerComp1 && isSimpleExpr innerComp2 - | SynExpr.IfThenElse (thenExpr=thenComp; elseExpr=elseCompOpt) -> - isSimpleExpr thenComp && (match elseCompOpt with None -> true | Some c -> isSimpleExpr c) - | SynExpr.LetOrUse (body=innerComp) -> isSimpleExpr innerComp - | SynExpr.LetOrUseBang _ -> false - | SynExpr.Match (clauses=clauses) -> - clauses |> List.forall (fun (SynMatchClause(resultExpr = innerComp)) -> isSimpleExpr innerComp) - | SynExpr.MatchBang _ -> false - | SynExpr.TryWith (tryExpr=innerComp; withCases=clauses) -> - isSimpleExpr innerComp && - clauses |> List.forall (fun (SynMatchClause(resultExpr = clauseComp)) -> isSimpleExpr clauseComp) - | SynExpr.YieldOrReturnFrom _ -> false - | SynExpr.YieldOrReturn _ -> false - | SynExpr.DoBang _ -> false - | _ -> true - - let basicSynExpr = - trans CompExprTranslationPass.Initial (hasCustomOperations ()) (LazyWithContext.NotLazy ([], env)) comp id - - let mDelayOrQuoteOrRun = mBuilderVal.NoteSourceConstruct(NotedSourceConstruct.DelayOrQuoteOrRun).MakeSynthetic() - - // Add a call to 'Delay' if the method is present - let delayedExpr = - match TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad "Delay" builderTy with - | [] -> basicSynExpr - | _ -> - mkSynCall "Delay" mDelayOrQuoteOrRun [(mkSynDelay2 basicSynExpr)] - - // Add a call to 'Quote' if the method is present - let quotedSynExpr = - if isAutoQuote then - SynExpr.Quote (mkSynIdGet mDelayOrQuoteOrRun (CompileOpName "<@ @>"), false, delayedExpr, true, mWhole) - else delayedExpr - - // Add a call to 'Run' if the method is present - let runExpr = - match TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad "Run" builderTy with - | [] -> quotedSynExpr - | _ -> mkSynCall "Run" mDelayOrQuoteOrRun [quotedSynExpr] - - let lambdaExpr = - SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynSimplePatVar false (mkSynId mBuilderVal builderValName)], [], mBuilderVal), runExpr, None, mBuilderVal, SynExprLambdaTrivia.Zero) - - let env = - match comp with - | SynExpr.YieldOrReturn ((true, _), _, _) -> { env with eContextInfo = ContextInfo.YieldInComputationExpression } - | SynExpr.YieldOrReturn ((_, true), _, _) -> { env with eContextInfo = ContextInfo.ReturnInComputationExpression } - | _ -> env - - let lambdaExpr, tpenv = TcExpr cenv (MustEqual (mkFunTy g builderTy overallTy)) env tpenv lambdaExpr - - // beta-var-reduce to bind the builder using a 'let' binding - let coreExpr = mkApps cenv.g ((lambdaExpr, tyOfExpr cenv.g lambdaExpr), [], [interpExpr], mBuilderVal) - - coreExpr, tpenv - -let mkSeqEmpty (cenv: cenv) env m genTy = - // We must discover the 'zero' of the monadic algebra being generated in order to compile failing matches. - let g = cenv.g - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy g genResultTy) - mkCallSeqEmpty g m genResultTy - -let mkSeqCollect (cenv: cenv) env m enumElemTy genTy lam enumExpr = - let g = cenv.g - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) - let enumExpr = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g enumElemTy) (tyOfExpr cenv.g enumExpr) enumExpr - mkCallSeqCollect cenv.g m enumElemTy genResultTy lam enumExpr - -let mkSeqUsing (cenv: cenv) (env: TcEnv) m resourceTy genTy resourceExpr lam = - let g = cenv.g - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace cenv.g.system_IDisposable_ty resourceTy - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) - mkCallSeqUsing cenv.g m resourceTy genResultTy resourceExpr lam - -let mkSeqDelay (cenv: cenv) env m genTy lam = - let g = cenv.g - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) - mkCallSeqDelay cenv.g m genResultTy (mkUnitDelayLambda cenv.g m lam) - -let mkSeqAppend (cenv: cenv) env m genTy e1 e2 = - let g = cenv.g - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) - let e1 = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e1) e1 - let e2 = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e2) e2 - mkCallSeqAppend cenv.g m genResultTy e1 e2 - -let mkSeqFromFunctions (cenv: cenv) env m genTy e1 e2 = - let g = cenv.g - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) - let e2 = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e2) e2 - mkCallSeqGenerated cenv.g m genResultTy e1 e2 - -let mkSeqFinally (cenv: cenv) env m genTy e1 e2 = - let g = cenv.g - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) - let e1 = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e1) e1 - mkCallSeqFinally cenv.g m genResultTy e1 e2 - -let mkSeqTryWith (cenv: cenv) env m genTy origSeq exnFilter exnHandler = - let g = cenv.g - let genResultTy = NewInferenceType g - UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) - let origSeq = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g origSeq) origSeq - mkCallSeqTryWith cenv.g m genResultTy origSeq exnFilter exnHandler - -let mkSeqExprMatchClauses (pat, vspecs) innerExpr = - [MatchClause(pat, None, TTarget(vspecs, innerExpr, None), pat.Range) ] - -let compileSeqExprMatchClauses (cenv: cenv) env inputExprMark (pat: Pattern, vspecs) innerExpr inputExprOpt bindPatTy genInnerTy = - let patMark = pat.Range - let tclauses = mkSeqExprMatchClauses (pat, vspecs) innerExpr - CompilePatternForMatchClauses cenv env inputExprMark patMark false ThrowIncompleteMatchException inputExprOpt bindPatTy genInnerTy tclauses - -/// This case is used for computation expressions which are sequence expressions. Technically the code path is different because it -/// typechecks rather than doing a shallow syntactic translation, and generates calls into the Seq.* library -/// and helpers rather than to the builder methods (there is actually no builder for 'seq' in the library). -/// These are later detected by state machine compilation. -/// -/// Also "ienumerable extraction" is performed on arguments to "for". -let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m = - - let g = cenv.g - let genEnumElemTy = NewInferenceType g - UnifyTypes cenv env m overallTy.Commit (mkSeqTy cenv.g genEnumElemTy) - - // Allow subsumption at 'yield' if the element type is nominal prior to the analysis of the body of the sequence expression - let flex = not (isTyparTy cenv.g genEnumElemTy) - - // If there are no 'yield' in the computation expression then allow the type-directed rule - // interpreting non-unit-typed expressions in statement positions as 'yield'. 'yield!' may be - // present in the computation expression. - let enableImplicitYield = - cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield - && (YieldFree cenv comp) - - let mkSeqDelayedExpr m (coreExpr: Expr) = - let overallTy = tyOfExpr cenv.g coreExpr - mkSeqDelay cenv env m overallTy coreExpr - - let rec tryTcSequenceExprBody env genOuterTy tpenv comp = - match comp with - | SynExpr.ForEach (spFor, spIn, SeqExprOnly _seqExprOnly, _isFromSource, pat, pseudoEnumExpr, innerComp, _m) -> - let pseudoEnumExpr = - match RewriteRangeExpr pseudoEnumExpr with - | Some e -> e - | None -> pseudoEnumExpr - // This expression is not checked with the knowledge it is an IEnumerable, since we permit other enumerable types with GetEnumerator/MoveNext methods, as does C# - let pseudoEnumExpr, arbitraryTy, tpenv = TcExprOfUnknownType cenv env tpenv pseudoEnumExpr - let enumExpr, enumElemTy = ConvertArbitraryExprToEnumerable cenv arbitraryTy env pseudoEnumExpr - let patR, _, vspecs, envinner, tpenv = TcMatchPattern cenv enumElemTy env tpenv pat None - let innerExpr, tpenv = - let envinner = { envinner with eIsControlFlow = true } - tcSequenceExprBody envinner genOuterTy tpenv innerComp - - let enumExprRange = enumExpr.Range - - // We attach the debug point to the lambda expression so we can fetch it out again in LowerComputedListOrArraySeqExpr - let mFor = match spFor with DebugPointAtFor.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.For) | _ -> enumExprRange - - // We attach the debug point to the lambda expression so we can fetch it out again in LowerComputedListOrArraySeqExpr - let mIn = match spIn with DebugPointAtInOrTo.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.InOrTo) | _ -> pat.Range - - match patR, vspecs, innerExpr with - // Legacy peephole optimization: - // "seq { .. for x in e1 -> e2 .. }" == "e1 |> Seq.map (fun x -> e2)" - // "seq { .. for x in e1 do yield e2 .. }" == "e1 |> Seq.map (fun x -> e2)" - // - // This transformation is visible in quotations and thus needs to remain. - | (TPat_as (TPat_wild _, PatternValBinding (v, _), _), - [_], - DebugPoints(Expr.App (Expr.Val (vref, _, _), _, [genEnumElemTy], [yieldExpr], _mYield), recreate)) - when valRefEq cenv.g vref cenv.g.seq_singleton_vref -> - - // The debug point mFor is attached to the 'map' - // The debug point mIn is attached to the lambda - // Note: the 'yield' part of the debug point for 'yield expr' is currently lost in debug points. - let lam = mkLambda mIn v (recreate yieldExpr, genEnumElemTy) - let enumExpr = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g enumElemTy) (tyOfExpr cenv.g enumExpr) enumExpr - Some(mkCallSeqMap cenv.g mFor enumElemTy genEnumElemTy lam enumExpr, tpenv) - - | _ -> - // The debug point mFor is attached to the 'collect' - // The debug point mIn is attached to the lambda - let matchv, matchExpr = compileSeqExprMatchClauses cenv env enumExprRange (patR, vspecs) innerExpr None enumElemTy genOuterTy - let lam = mkLambda mIn matchv (matchExpr, tyOfExpr cenv.g matchExpr) - Some(mkSeqCollect cenv env mFor enumElemTy genOuterTy lam enumExpr, tpenv) - - | SynExpr.For (forDebugPoint=spFor; toDebugPoint=spTo; ident=id; identBody=start; direction=dir; toBody=finish; doBody=innerComp; range=m) -> - Some(tcSequenceExprBody env genOuterTy tpenv (elimFastIntegerForLoop (spFor, spTo, id, start, dir, finish, innerComp, m))) - - | SynExpr.While (spWhile, guardExpr, innerComp, _m) -> - let guardExpr, tpenv = - let env = { env with eIsControlFlow = false } - TcExpr cenv (MustEqual cenv.g.bool_ty) env tpenv guardExpr - - let innerExpr, tpenv = - let env = { env with eIsControlFlow = true } - tcSequenceExprBody env genOuterTy tpenv innerComp - - let guardExprMark = guardExpr.Range - let guardLambdaExpr = mkUnitDelayLambda cenv.g guardExprMark guardExpr - - // We attach the debug point to the lambda expression so we can fetch it out again in LowerComputedListOrArraySeqExpr - let mWhile = - match spWhile with - | DebugPointAtWhile.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) - | _ -> guardExprMark - - let innerDelayedExpr = mkSeqDelayedExpr mWhile innerExpr - Some(mkSeqFromFunctions cenv env guardExprMark genOuterTy guardLambdaExpr innerDelayedExpr, tpenv) - - | SynExpr.TryFinally (innerComp, unwindExpr, mTryToLast, spTry, spFinally, trivia) -> - let env = { env with eIsControlFlow = true } - let innerExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp - let unwindExpr, tpenv = TcExpr cenv (MustEqual cenv.g.unit_ty) env tpenv unwindExpr - - // We attach the debug points to the lambda expressions so we can fetch it out again in LowerComputedListOrArraySeqExpr - let mTry = - match spTry with - | DebugPointAtTry.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Try) - | _ -> trivia.TryKeyword - - let mFinally = - match spFinally with - | DebugPointAtFinally.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Finally) - | _ -> trivia.FinallyKeyword - - let innerExpr = mkSeqDelayedExpr mTry innerExpr - let unwindExpr = mkUnitDelayLambda cenv.g mFinally unwindExpr - - Some(mkSeqFinally cenv env mTryToLast genOuterTy innerExpr unwindExpr, tpenv) - - | SynExpr.Paren (_, _, _, m) when not (cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield)-> - error(Error(FSComp.SR.tcConstructIsAmbiguousInSequenceExpression(), m)) - - | SynExpr.ImplicitZero m -> - Some(mkSeqEmpty cenv env m genOuterTy, tpenv ) - - | SynExpr.DoBang (_rhsExpr, m) -> - error(Error(FSComp.SR.tcDoBangIllegalInSequenceExpression(), m)) - - | SynExpr.Sequential (sp, true, innerComp1, innerComp2, m) -> - let env1 = { env with eIsControlFlow = (match sp with DebugPointAtSequential.SuppressNeither | DebugPointAtSequential.SuppressExpr -> true | _ -> false) } - - let res, tpenv = tcSequenceExprBodyAsSequenceOrStatement env1 genOuterTy tpenv innerComp1 - - let env2 = { env with eIsControlFlow = (match sp with DebugPointAtSequential.SuppressNeither | DebugPointAtSequential.SuppressStmt -> true | _ -> false) } - - // "expr; cexpr" is treated as sequential execution - // "cexpr; cexpr" is treated as append - match res with - | Choice1Of2 innerExpr1 -> - let innerExpr2, tpenv = tcSequenceExprBody env2 genOuterTy tpenv innerComp2 - let innerExpr2 = mkSeqDelayedExpr innerExpr2.Range innerExpr2 - Some(mkSeqAppend cenv env innerComp1.Range genOuterTy innerExpr1 innerExpr2, tpenv) - | Choice2Of2 stmt1 -> - let innerExpr2, tpenv = tcSequenceExprBody env2 genOuterTy tpenv innerComp2 - Some(Expr.Sequential(stmt1, innerExpr2, NormalSeq, m), tpenv) - - | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, _isRecovery, mIfToEndOfElseBranch, trivia) -> - let guardExpr', tpenv = TcExpr cenv (MustEqual cenv.g.bool_ty) env tpenv guardExpr - let env = { env with eIsControlFlow = true } - let thenExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv thenComp - let elseComp = (match elseCompOpt with Some c -> c | None -> SynExpr.ImplicitZero trivia.IfToThenRange) - let elseExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv elseComp - Some(mkCond spIfToThen mIfToEndOfElseBranch genOuterTy guardExpr' thenExpr elseExpr, tpenv) - - // 'let x = expr in expr' - | SynExpr.LetOrUse (isUse=false (* not a 'use' binding *)) -> - TcLinearExprs - (fun overallTy envinner tpenv e -> tcSequenceExprBody envinner overallTy.Commit tpenv e) - cenv env overallTy - tpenv - true - comp - id |> Some - - // 'use x = expr in expr' - | SynExpr.LetOrUse (isUse=true; bindings=[SynBinding (kind=SynBindingKind.Normal; headPat=pat; expr=rhsExpr; debugPoint=spBind)]; body=innerComp; range=wholeExprMark) -> - - let bindPatTy = NewInferenceType g - let inputExprTy = NewInferenceType g - let pat', _, vspecs, envinner, tpenv = TcMatchPattern cenv bindPatTy env tpenv pat None - - UnifyTypes cenv env m inputExprTy bindPatTy - - let inputExpr, tpenv = - let env = { env with eIsControlFlow = true } - TcExpr cenv (MustEqual inputExprTy) env tpenv rhsExpr - - let innerExpr, tpenv = - let envinner = { envinner with eIsControlFlow = true } - tcSequenceExprBody envinner genOuterTy tpenv innerComp - - let mBind = - match spBind with - | DebugPointAtBinding.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Binding) - | _ -> inputExpr.Range - - let inputExprMark = inputExpr.Range - - let matchv, matchExpr = compileSeqExprMatchClauses cenv envinner inputExprMark (pat', vspecs) innerExpr (Some inputExpr) bindPatTy genOuterTy - - let consumeExpr = mkLambda mBind matchv (matchExpr, genOuterTy) - - // The 'mBind' is attached to the lambda - Some(mkSeqUsing cenv env wholeExprMark bindPatTy genOuterTy inputExpr consumeExpr, tpenv) - - | SynExpr.LetOrUseBang (range=m) -> - error(Error(FSComp.SR.tcUseForInSequenceExpression(), m)) - - | SynExpr.Match (spMatch, expr, clauses, _m, _trivia) -> - let inputExpr, inputTy, tpenv = TcExprOfUnknownType cenv env tpenv expr - - let tclauses, tpenv = - (tpenv, clauses) ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, innerComp, _, sp, _)) -> - let patR, condR, vspecs, envinner, tpenv = TcMatchPattern cenv inputTy env tpenv pat cond - let envinner = - match sp with - | DebugPointAtTarget.Yes -> { envinner with eIsControlFlow = true } - | DebugPointAtTarget.No -> envinner - let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp - MatchClause(patR, condR, TTarget(vspecs, innerExpr, None), patR.Range), tpenv) - - let inputExprTy = tyOfExpr cenv.g inputExpr - let inputExprMark = inputExpr.Range - let matchv, matchExpr = CompilePatternForMatchClauses cenv env inputExprMark inputExprMark true ThrowIncompleteMatchException (Some inputExpr) inputExprTy genOuterTy tclauses - - Some(mkLet spMatch inputExprMark matchv inputExpr matchExpr, tpenv) - - | SynExpr.TryWith (innerTry,withList,mTryToWith,_spTry,_spWith,trivia) -> - if not(g.langVersion.SupportsFeature(LanguageFeature.TryWithInSeqExpression)) then - error(Error(FSComp.SR.tcTryIllegalInSequenceExpression(), mTryToWith)) - - let env = { env with eIsControlFlow = true } - let tryExpr, tpenv = - let inner,tpenv = tcSequenceExprBody env genOuterTy tpenv innerTry - mkSeqDelayedExpr mTryToWith inner, tpenv - - // Compile the pattern twice, once as a filter with all succeeding targets returning "1", and once as a proper catch block. - let clauses, tpenv = - (tpenv, withList) ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, innerComp, m, sp, _)) -> - let patR, condR, vspecs, envinner, tpenv = TcMatchPattern cenv g.exn_ty env tpenv pat cond - let envinner = - match sp with - | DebugPointAtTarget.Yes -> { envinner with eIsControlFlow = true } - | DebugPointAtTarget.No -> envinner - let matchBody, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp - let handlerClause = MatchClause(patR, condR, TTarget(vspecs, matchBody, None), patR.Range) - let filterClause = MatchClause(patR, condR, TTarget([], Expr.Const(Const.Int32 1,m,g.int_ty), None), patR.Range) - (handlerClause,filterClause), tpenv) - - let handlers, filterClauses = List.unzip clauses - let withRange = trivia.WithToEndRange - let v1, filterExpr = CompilePatternForMatchClauses cenv env withRange withRange true FailFilter None g.exn_ty g.int_ty filterClauses - let v2, handlerExpr = CompilePatternForMatchClauses cenv env withRange withRange true FailFilter None g.exn_ty genOuterTy handlers - - let filterLambda = mkLambda filterExpr.Range v1 (filterExpr, genOuterTy) - let handlerLambda = mkLambda handlerExpr.Range v2 (handlerExpr, genOuterTy) - - let combinatorExpr = mkSeqTryWith cenv env mTryToWith genOuterTy tryExpr filterLambda handlerLambda - Some (combinatorExpr,tpenv) - - | SynExpr.YieldOrReturnFrom ((isYield, _), synYieldExpr, m) -> - let env = { env with eIsControlFlow = false } - let resultExpr, genExprTy, tpenv = TcExprOfUnknownType cenv env tpenv synYieldExpr - - if not isYield then errorR(Error(FSComp.SR.tcUseYieldBangForMultipleResults(), m)) - - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace genOuterTy genExprTy - - let resultExpr = mkCoerceExpr(resultExpr, genOuterTy, m, genExprTy) - - let resultExpr = - if IsControlFlowExpression synYieldExpr then - resultExpr - else - mkDebugPoint m resultExpr - - Some(resultExpr, tpenv) - - | SynExpr.YieldOrReturn ((isYield, _), synYieldExpr, m) -> - let env = { env with eIsControlFlow = false } - let genResultTy = NewInferenceType g - - if not isYield then errorR(Error(FSComp.SR.tcSeqResultsUseYield(), m)) - - UnifyTypes cenv env m genOuterTy (mkSeqTy cenv.g genResultTy) - - let resultExpr, tpenv = TcExprFlex cenv flex true genResultTy env tpenv synYieldExpr - - let resultExpr = mkCallSeqSingleton cenv.g m genResultTy resultExpr - - let resultExpr = - if IsControlFlowExpression synYieldExpr then - resultExpr - else - mkDebugPoint m resultExpr - - Some(resultExpr, tpenv ) - - | _ -> None - - and tcSequenceExprBody env (genOuterTy: TType) tpenv comp = - let res, tpenv = tcSequenceExprBodyAsSequenceOrStatement env genOuterTy tpenv comp - match res with - | Choice1Of2 expr -> - expr, tpenv - | Choice2Of2 stmt -> - let m = comp.Range - let resExpr = Expr.Sequential(stmt, mkSeqEmpty cenv env m genOuterTy, NormalSeq, m) - resExpr, tpenv - - and tcSequenceExprBodyAsSequenceOrStatement env genOuterTy tpenv comp = - match tryTcSequenceExprBody env genOuterTy tpenv comp with - | Some (expr, tpenv) -> Choice1Of2 expr, tpenv - | None -> - - let env = { env with eContextInfo = ContextInfo.SequenceExpression genOuterTy } - - if enableImplicitYield then - let hasTypeUnit, expr, tpenv = TryTcStmt cenv env tpenv comp - if hasTypeUnit then - Choice2Of2 expr, tpenv - else - let genResultTy = NewInferenceType g - let mExpr = expr.Range - UnifyTypes cenv env mExpr genOuterTy (mkSeqTy cenv.g genResultTy) - let expr, tpenv = TcExprFlex cenv flex true genResultTy env tpenv comp - let exprTy = tyOfExpr cenv.g expr - AddCxTypeMustSubsumeType env.eContextInfo env.DisplayEnv cenv.css mExpr NoTrace genResultTy exprTy - let resExpr = mkCallSeqSingleton cenv.g mExpr genResultTy (mkCoerceExpr(expr, genResultTy, mExpr, exprTy)) - Choice1Of2 resExpr, tpenv - else - let stmt, tpenv = TcStmtThatCantBeCtorBody cenv env tpenv comp - Choice2Of2 stmt, tpenv - - let coreExpr, tpenv = tcSequenceExprBody env overallTy.Commit tpenv comp - let delayedExpr = mkSeqDelayedExpr coreExpr.Range coreExpr - delayedExpr, tpenv - -let TcSequenceExpressionEntry (cenv: cenv) env (overallTy: OverallTy) tpenv (hasBuilder, comp) m = - match RewriteRangeExpr comp with - | Some replacementExpr -> - TcExpr cenv overallTy env tpenv replacementExpr - | None -> - - let implicitYieldEnabled = cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield - - let validateObjectSequenceOrRecordExpression = not implicitYieldEnabled - - match comp with - | SynExpr.New _ -> - errorR(Error(FSComp.SR.tcInvalidObjectExpressionSyntaxForm(), m)) - | SimpleSemicolonSequence cenv false _ when validateObjectSequenceOrRecordExpression -> - errorR(Error(FSComp.SR.tcInvalidObjectSequenceOrRecordExpression(), m)) - | _ -> - () - - if not hasBuilder && not cenv.g.compilingFSharpCore then - error(Error(FSComp.SR.tcInvalidSequenceExpressionSyntaxForm(), m)) - - TcSequenceExpression cenv env tpenv comp overallTy m - -let TcArrayOrListComputedExpression (cenv: cenv) env (overallTy: OverallTy) tpenv (isArray, comp) m = - let g = cenv.g - - // The syntax '[ n .. m ]' and '[ n .. step .. m ]' is not really part of array or list syntax. - // It could be in the future, e.g. '[ 1; 2..30; 400 ]' - // - // The elaborated form of '[ n .. m ]' is 'List.ofSeq (seq (op_Range n m))' and this shouldn't change - match RewriteRangeExpr comp with - | Some replacementExpr -> - let genCollElemTy = NewInferenceType g - - let genCollTy = (if isArray then mkArrayType else mkListTy) cenv.g genCollElemTy - - UnifyTypes cenv env m overallTy.Commit genCollTy - - let exprTy = mkSeqTy cenv.g genCollElemTy - - let expr, tpenv = TcExpr cenv (MustEqual exprTy) env tpenv replacementExpr - - let expr = - if cenv.g.compilingFSharpCore then - expr - else - // We add a call to 'seq ... ' to make sure sequence expression compilation gets applied to the contents of the - // comprehension. But don't do this in FSharp.Core.dll since 'seq' may not yet be defined. - mkCallSeq cenv.g m genCollElemTy expr - - let expr = mkCoerceExpr(expr, exprTy, expr.Range, overallTy.Commit) - - let expr = - if isArray then - mkCallSeqToArray cenv.g m genCollElemTy expr - else - mkCallSeqToList cenv.g m genCollElemTy expr - expr, tpenv - - | None -> - - // LanguageFeatures.ImplicitYield do not require this validation - let implicitYieldEnabled = cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield - let validateExpressionWithIfRequiresParenthesis = not implicitYieldEnabled - let acceptDeprecatedIfThenExpression = not implicitYieldEnabled - - match comp with - | SimpleSemicolonSequence cenv acceptDeprecatedIfThenExpression elems -> - match comp with - | SimpleSemicolonSequence cenv false _ -> () - | _ when validateExpressionWithIfRequiresParenthesis -> errorR(Deprecated(FSComp.SR.tcExpressionWithIfRequiresParenthesis(), m)) - | _ -> () - - let replacementExpr = - if isArray then - // This are to improve parsing/processing speed for parser tables by converting to an array blob ASAP - let nelems = elems.Length - if nelems > 0 && List.forall (function SynExpr.Const (SynConst.UInt16 _, _) -> true | _ -> false) elems - then SynExpr.Const (SynConst.UInt16s (Array.ofList (List.map (function SynExpr.Const (SynConst.UInt16 x, _) -> x | _ -> failwith "unreachable") elems)), m) - elif nelems > 0 && List.forall (function SynExpr.Const (SynConst.Byte _, _) -> true | _ -> false) elems - then SynExpr.Const (SynConst.Bytes (Array.ofList (List.map (function SynExpr.Const (SynConst.Byte x, _) -> x | _ -> failwith "unreachable") elems), SynByteStringKind.Regular, m), m) - else SynExpr.ArrayOrList (isArray, elems, m) - else - if cenv.g.langVersion.SupportsFeature(LanguageFeature.ReallyLongLists) then - SynExpr.ArrayOrList (isArray, elems, m) - else - if elems.Length > 500 then - error(Error(FSComp.SR.tcListLiteralMaxSize(), m)) - SynExpr.ArrayOrList (isArray, elems, m) - - TcExprUndelayed cenv overallTy env tpenv replacementExpr - | _ -> - - let genCollElemTy = NewInferenceType g - - let genCollTy = (if isArray then mkArrayType else mkListTy) cenv.g genCollElemTy - - // Propagating type directed conversion, e.g. for - // let x : seq = [ yield 1; if true then yield 2 ] - TcPropagatingExprLeafThenConvert cenv overallTy genCollTy env (* canAdhoc *) m (fun () -> - - let exprTy = mkSeqTy cenv.g genCollElemTy - - // Check the comprehension - let expr, tpenv = TcSequenceExpression cenv env tpenv comp (MustEqual exprTy) m - - let expr = mkCoerceIfNeeded cenv.g exprTy (tyOfExpr cenv.g expr) expr - - let expr = - if cenv.g.compilingFSharpCore then - //warning(Error(FSComp.SR.fslibUsingComputedListOrArray(), expr.Range)) - expr - else - // We add a call to 'seq ... ' to make sure sequence expression compilation gets applied to the contents of the - // comprehension. But don't do this in FSharp.Core.dll since 'seq' may not yet be defined. - mkCallSeq cenv.g m genCollElemTy expr - - let expr = mkCoerceExpr(expr, exprTy, expr.Range, overallTy.Commit) - - let expr = - if isArray then - mkCallSeqToArray cenv.g m genCollElemTy expr - else - mkCallSeqToList cenv.g m genCollElemTy expr - - expr, tpenv) diff --git a/src/fcs-fable/src/Compiler/Checking/CheckDeclarations.fs b/src/fcs-fable/src/Compiler/Checking/CheckDeclarations.fs index 09704614b8..80c1a656c2 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckDeclarations.fs +++ b/src/fcs-fable/src/Compiler/Checking/CheckDeclarations.fs @@ -4,19 +4,23 @@ module internal FSharp.Compiler.CheckDeclarations open System open System.Collections.Generic +open System.Threading open FSharp.Compiler.Diagnostics open Internal.Utilities.Collections open Internal.Utilities.Library open Internal.Utilities.Library.Extras open Internal.Utilities.Library.ResultOrException -open FSharp.Compiler -open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler +open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.AttributeChecking open FSharp.Compiler.CheckComputationExpressions open FSharp.Compiler.CheckExpressions +open FSharp.Compiler.CheckSequenceExpressions +open FSharp.Compiler.CheckArrayOrListComputedExpressions open FSharp.Compiler.CheckBasics +open FSharp.Compiler.CheckExpressionsOps open FSharp.Compiler.CheckIncrementalClasses open FSharp.Compiler.CheckPatterns open FSharp.Compiler.ConstraintSolver @@ -278,7 +282,7 @@ let AddModuleAbbreviationAndReport tcSink scopem id modrefs env = CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights) let item = Item.ModuleOrNamespaces modrefs - CallNameResolutionSink tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.AccessRights) + CallNameResolutionSink tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.AccessRights) env /// Adjust the TcEnv to account for opening the set of modules or namespaces implied by an `open` declaration @@ -305,7 +309,7 @@ let AddRootModuleOrNamespaceRefs g amap m env modrefs = /// Adjust the TcEnv to make more things 'InternalsVisibleTo' let addInternalsAccessibility env (ccu: CcuThunk) = - let compPath = CompPath (ccu.ILScopeRef, []) + let compPath = CompPath (ccu.ILScopeRef, TypedTree.SyntaxAccess.Unknown, []) let eInternalsVisibleCompPaths = compPath :: env.eInternalsVisibleCompPaths { env with eAccessRights = ComputeAccessRights env.eAccessPath eInternalsVisibleCompPaths env.eFamilyType // update this computed field @@ -400,7 +404,7 @@ let private CheckDuplicatesArgNames (synVal: SynValSig) m = for name in argNames do errorR(Error((FSComp.SR.chkDuplicatedMethodParameter(name), m))) -let private CheckDuplicatesAbstractMethodParmsSig (typeSpecs: SynTypeDefnSig list) = +let private CheckDuplicatesAbstractMethodParamsSig (typeSpecs: SynTypeDefnSig list) = for SynTypeDefnSig(typeRepr= trepr) in typeSpecs do match trepr with | SynTypeDefnSigRepr.ObjectModel(_, synMemberSigs, _) -> @@ -412,25 +416,27 @@ let private CheckDuplicatesAbstractMethodParmsSig (typeSpecs: SynTypeDefnSig li | _ -> () module TcRecdUnionAndEnumDeclarations = + open CheckExpressionsOps let CombineReprAccess parent vis = match parent with | ParentNone -> vis | Parent tcref -> combineAccess vis tcref.TypeReprAccessibility - let MakeRecdFieldSpec _cenv env parent (isStatic, konst, tyR, attrsForProperty, attrsForField, id, nameGenerated, isMutable, vol, xmldoc, vis, m) = - let vis, _ = ComputeAccessAndCompPath env None m vis None parent + let MakeRecdFieldSpec g env parent (isStatic, konst, tyR, attrsForProperty, attrsForField, id, nameGenerated, isMutable, vol, xmldoc, vis, m) = + let vis, _ = ComputeAccessAndCompPath g env None m vis None parent let vis = CombineReprAccess parent vis Construct.NewRecdField isStatic konst id nameGenerated tyR isMutable vol attrsForProperty attrsForField xmldoc vis false let TcFieldDecl (cenv: cenv) env parent isIncrClass tpenv (isStatic, synAttrs, id: Ident, nameGenerated, ty, isMutable, xmldoc, vis) = let g = cenv.g let m = id.idRange - let attrs, _ = TcAttributesWithPossibleTargets false cenv env AttributeTargets.FieldDecl synAttrs + let attrs, _ = TcAttributesWithPossibleTargets TcCanFail.ReportAllErrors cenv env AttributeTargets.FieldDecl synAttrs + let attrsForProperty, attrsForField = attrs |> List.partition (fun (attrTargets, _) -> (attrTargets &&& AttributeTargets.Property) <> enum 0) let attrsForProperty = (List.map snd attrsForProperty) let attrsForField = (List.map snd attrsForField) - let tyR, _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty + let tyR, _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv ty let zeroInit = HasFSharpAttribute g g.attrib_DefaultValueAttribute attrsForField let isVolatile = HasFSharpAttribute g g.attrib_VolatileFieldAttribute attrsForField @@ -445,11 +451,11 @@ module TcRecdUnionAndEnumDeclarations = let isPrivate = match vis with | Some (SynAccess.Private _) -> true | _ -> false if isStatic && (not zeroInit || not isMutable || not isPrivate) then errorR(Error(FSComp.SR.tcStaticValFieldsMustBeMutableAndPrivate(), m)) let konst = if zeroInit then Some Const.Zero else None - let rfspec = MakeRecdFieldSpec cenv env parent (isStatic, konst, tyR, attrsForProperty, attrsForField, id, nameGenerated, isMutable, isVolatile, xmldoc, vis, m) + let rfspec = MakeRecdFieldSpec g env parent (isStatic, konst, tyR, attrsForProperty, attrsForField, id, nameGenerated, isMutable, isVolatile, xmldoc, vis, m) match parent with | Parent tcref when useGenuineField tcref.Deref rfspec -> // Recheck the attributes for errors if the definition only generates a field - TcAttributesWithPossibleTargets false cenv env AttributeTargets.FieldDeclRestricted synAttrs |> ignore + TcAttributesWithPossibleTargets TcCanFail.ReportAllErrors cenv env AttributeTargets.FieldDeclRestricted synAttrs |> ignore | _ -> () rfspec @@ -494,25 +500,32 @@ module TcRecdUnionAndEnumDeclarations = if not (String.isLeadingIdentifierCharacterUpperCase name) && name <> opNameCons && name <> opNameNil then errorR(NotUpperCaseConstructor(id.idRange)) - let ValidateFieldNames (synFields: SynField list, tastFields: RecdField list) = + let private CheckUnionDuplicateFields (elems: Ident list) = + elems |> List.iteri (fun i (uc1: Ident) -> + elems |> List.iteri (fun j (uc2: Ident) -> + if j > i && uc1.idText = uc2.idText then + errorR(Error(FSComp.SR.tcFieldNameIsUsedModeThanOnce(uc1.idText), uc1.idRange)))) + + let ValidateFieldNames (synFields: SynField list, tastFields: RecdField list) = + let fields = synFields |> List.choose (function SynField(idOpt = Some ident) -> Some ident | _ -> None) + if fields.Length > 1 then + CheckUnionDuplicateFields fields + let seen = Dictionary() (synFields, tastFields) ||> List.iter2 (fun sf f -> match seen.TryGetValue f.LogicalName with | true, synField -> match sf, synField with - | SynField(idOpt = Some id), SynField(idOpt = Some _) -> - error(Error(FSComp.SR.tcFieldNameIsUsedModeThanOnce(id.idText), id.idRange)) | SynField(idOpt = Some id), SynField(idOpt = None) | SynField(idOpt = None), SynField(idOpt = Some id) -> - error(Error(FSComp.SR.tcFieldNameConflictsWithGeneratedNameForAnonymousField(id.idText), id.idRange)) - | _ -> assert false + errorR(Error(FSComp.SR.tcFieldNameConflictsWithGeneratedNameForAnonymousField(id.idText), id.idRange)) + | _ -> () | _ -> seen.Add(f.LogicalName, sf)) let TcUnionCaseDecl (cenv: cenv) env parent thisTy thisTyInst tpenv hasRQAAttribute (SynUnionCase(Attributes synAttrs, SynIdent(id, _), args, xmldoc, vis, m, _)) = let g = cenv.g - let attrs = TcAttributes cenv env AttributeTargets.UnionCaseDecl synAttrs // the attributes of a union case decl get attached to the generated "static factory" method - let vis, _ = ComputeAccessAndCompPath env None m vis None parent + let vis, _ = ComputeAccessAndCompPath g env None m vis None parent let vis = CombineReprAccess parent vis CheckUnionCaseName cenv id hasRQAAttribute @@ -527,7 +540,7 @@ module TcRecdUnionAndEnumDeclarations = match idOpt, parent with | Some fieldId, Parent tcref -> let item = Item.UnionCaseField (UnionCaseInfo (thisTyInst, UnionCaseRef (tcref, id.idText)), i) - CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights) + CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights) TcNamedFieldDecl cenv env parent false tpenv fld | _ -> Some(TcAnonFieldDecl cenv env parent tpenv (mkUnionCaseFieldName nFields i) fld) @@ -539,7 +552,7 @@ module TcRecdUnionAndEnumDeclarations = rfields, thisTy | SynUnionCaseKind.FullType (ty, arity) -> - let tyR, _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty + let tyR, _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv ty let curriedArgTys, recordTy = GetTopTauTypeInFSharpForm g (arity |> TranslateSynValInfo cenv m (TcAttributes cenv env) |> TranslatePartialValReprInfo []).ArgInfos tyR m if curriedArgTys.Length > 1 then @@ -551,7 +564,7 @@ module TcRecdUnionAndEnumDeclarations = let rfields = argTys |> List.mapi (fun i (argTy, argInfo) -> let id = (match argInfo.Name with Some id -> id | None -> mkSynId m (mkUnionCaseFieldName nFields i)) - MakeRecdFieldSpec cenv env parent (false, None, argTy, [], [], id, argInfo.Name.IsNone, false, false, XmlDoc.Empty, None, m)) + MakeRecdFieldSpec g env parent (false, None, argTy, [], [], id, argInfo.Name.IsNone, false, false, XmlDoc.Empty, None, m)) if not (typeEquiv g recordTy thisTy) then error(Error(FSComp.SR.tcReturnTypesForUnionMustBeSameAsType(), m)) @@ -564,6 +577,23 @@ module TcRecdUnionAndEnumDeclarations = let checkXmlDocs = cenv.diagnosticOptions.CheckXmlDocs let xmlDoc = xmldoc.ToXmlDoc(checkXmlDocs, Some names) + let attrs = + (* + The attributes of a union case decl get attached to the generated "static factory" method. + Enforce union-cases AttributeTargets: + - AttributeTargets.Method + type SomeUnion = + | Case1 of int // Compiles down to a static method + - AttributeTargets.Property + type SomeUnion = + | Case1 // Compiles down to a static property + *) + if g.langVersion.SupportsFeature(LanguageFeature.EnforceAttributeTargets) then + let target = if rfields.IsEmpty then AttributeTargets.Property else AttributeTargets.Method + TcAttributes cenv env target synAttrs + else + TcAttributes cenv env AttributeTargets.UnionCaseDecl synAttrs + Construct.NewUnionCase id rfields recordTy attrs xmlDoc vis let TcUnionCaseDecls (cenv: cenv) env (parent: ParentRef) (thisTy: TType) (thisTyInst: TypeInst) hasRQAAttribute tpenv unionCases = @@ -573,15 +603,15 @@ module TcRecdUnionAndEnumDeclarations = |> List.map (TcUnionCaseDecl cenv env parent thisTy thisTyInst tpenv hasRQAAttribute) unionCasesR |> CheckDuplicates (fun uc -> uc.Id) "union case" - let MakeEnumCaseSpec cenv env parent attrs thisTy caseRange (caseIdent: Ident) (xmldoc: PreXmlDoc) value = - let vis, _ = ComputeAccessAndCompPath env None caseRange None None parent + let MakeEnumCaseSpec g cenv env parent attrs thisTy caseRange (caseIdent: Ident) (xmldoc: PreXmlDoc) value = + let vis, _ = ComputeAccessAndCompPath g env None caseRange None None parent let vis = CombineReprAccess parent vis if caseIdent.idText = "value__" then errorR(Error(FSComp.SR.tcNotValidEnumCaseName(), caseIdent.idRange)) let checkXmlDocs = cenv.diagnosticOptions.CheckXmlDocs let xmlDoc = xmldoc.ToXmlDoc(checkXmlDocs, Some []) Construct.NewRecdField true (Some value) caseIdent false thisTy false false [] attrs xmlDoc vis false - let TcEnumDecl cenv env tpenv parent thisTy fieldTy (SynEnumCase (attributes = Attributes synAttrs; ident = SynIdent (id, _); valueExpr = valueExpr; xmlDoc = xmldoc; range = caseRange)) = + let TcEnumDecl g cenv env tpenv parent thisTy fieldTy (SynEnumCase (attributes = Attributes synAttrs; ident = SynIdent (id, _); valueExpr = valueExpr; xmlDoc = xmldoc; range = caseRange)) = let attrs = TcAttributes cenv env AttributeTargets.Field synAttrs let valueRange = valueExpr.Range @@ -590,19 +620,19 @@ module TcRecdUnionAndEnumDeclarations = error(Error(FSComp.SR.tcInvalidEnumerationLiteral(), valueRange)) | SynExpr.Const (synConst, _) -> let konst = TcConst cenv fieldTy valueRange env synConst - MakeEnumCaseSpec cenv env parent attrs thisTy caseRange id xmldoc konst + MakeEnumCaseSpec g cenv env parent attrs thisTy caseRange id xmldoc konst | _ -> let expr, actualTy, _ = TcExprOfUnknownType cenv env tpenv valueExpr UnifyTypes cenv env valueRange fieldTy actualTy - + match EvalLiteralExprOrAttribArg cenv.g expr with - | Expr.Const (konst, _, _) -> MakeEnumCaseSpec cenv env parent attrs thisTy caseRange id xmldoc konst + | Expr.Const (konst, _, _) -> MakeEnumCaseSpec g cenv env parent attrs thisTy caseRange id xmldoc konst | _ -> error(Error(FSComp.SR.tcInvalidEnumerationLiteral(), valueRange)) let TcEnumDecls (cenv: cenv) env tpenv parent thisTy enumCases = let g = cenv.g let fieldTy = NewInferenceType g - let enumCases' = enumCases |> List.map (TcEnumDecl cenv env tpenv parent thisTy fieldTy) |> CheckDuplicates (fun f -> f.Id) "enum element" + let enumCases' = enumCases |> List.map (TcEnumDecl g cenv env tpenv parent thisTy fieldTy) |> CheckDuplicates (fun f -> f.Id) "enum element" fieldTy, enumCases' //------------------------------------------------------------------------- @@ -663,7 +693,7 @@ let TcOpenModuleOrNamespaceDecl tcSink g amap scopem env (longId, m) = CheckNamespaceModuleOrTypeName g id let IsPartiallyQualifiedNamespace (modref: ModuleOrNamespaceRef) = - let (CompPath(_, p)) = modref.CompilationPath + let (CompPath(_, _, p)) = modref.CompilationPath // Bug FSharp 1.0 3274: FSI paths don't count when determining this warning let p = match p with @@ -713,7 +743,7 @@ let TcOpenTypeDecl (cenv: cenv) mOpenDecl scopem env (synType: SynType, m) = checkLanguageFeatureError g.langVersion LanguageFeature.OpenTypeDeclaration mOpenDecl - let ty, _tpenv = TcType cenv NoNewTypars CheckCxs ItemOccurence.Open WarnOnIWSAM.Yes env emptyUnscopedTyparEnv synType + let ty, _tpenv = TcType cenv NoNewTypars CheckCxs ItemOccurrence.Open WarnOnIWSAM.Yes env emptyUnscopedTyparEnv synType if not (isAppTy g ty) then error(Error(FSComp.SR.tcNamedTypeRequired("open type"), m)) @@ -759,7 +789,7 @@ module AddAugmentationDeclarations = let tcaug = tycon.TypeContents let ty = if tcref.Deref.IsFSharpException then g.exn_ty else generalizedTyconRef g tcref let m = tycon.Range - let genericIComparableTy = mkAppTy g.system_GenericIComparable_tcref [ty] + let genericIComparableTy = mkWoNullAppTy g.system_GenericIComparable_tcref [ty] let hasExplicitIComparable = tycon.HasInterface g g.mk_IComparable_ty @@ -800,12 +830,18 @@ module AddAugmentationDeclarations = if hasExplicitIStructuralEquatable then errorR(Error(FSComp.SR.tcImplementsIStructuralEquatableExplicitly(tycon.DisplayName), m)) else - let evspec1, evspec2, evspec3 = AugmentTypeDefinitions.MakeValsForEqualityWithComparerAugmentation g tcref + let augmentation = AugmentTypeDefinitions.MakeValsForEqualityWithComparerAugmentation g tcref PublishInterface cenv env.DisplayEnv tcref m true g.mk_IStructuralEquatable_ty - tcaug.SetHashAndEqualsWith (mkLocalValRef evspec1, mkLocalValRef evspec2, mkLocalValRef evspec3) - PublishValueDefn cenv env ModuleOrMemberBinding evspec1 - PublishValueDefn cenv env ModuleOrMemberBinding evspec2 - PublishValueDefn cenv env ModuleOrMemberBinding evspec3 + tcaug.SetHashAndEqualsWith ( + mkLocalValRef augmentation.GetHashCode, + mkLocalValRef augmentation.GetHashCodeWithComparer, + mkLocalValRef augmentation.EqualsWithComparer, + Some (mkLocalValRef augmentation.EqualsExactWithComparer)) + + PublishValueDefn cenv env ModuleOrMemberBinding augmentation.GetHashCode + PublishValueDefn cenv env ModuleOrMemberBinding augmentation.GetHashCodeWithComparer + PublishValueDefn cenv env ModuleOrMemberBinding augmentation.EqualsWithComparer + PublishValueDefnMaybeInclCompilerGenerated cenv env true ModuleOrMemberBinding augmentation.EqualsExactWithComparer let AddGenericCompareBindings (cenv: cenv) (tycon: Tycon) = if (* AugmentTypeDefinitions.TyconIsCandidateForAugmentationWithCompare cenv.g tycon && *) Option.isSome tycon.GeneratedCompareToValues then @@ -843,7 +879,7 @@ module AddAugmentationDeclarations = let m = tycon.Range // Note: tycon.HasOverride only gives correct results after we've done the type augmentation - let hasExplicitObjectEqualsOverride = tycon.HasOverride g "Equals" [g.obj_ty] + let hasExplicitObjectEqualsOverride = tycon.HasOverride g "Equals" [g.obj_ty_ambivalent] let hasExplicitGenericIEquatable = tcaugHasNominalInterface g tcaug g.system_GenericIEquatable_tcref if hasExplicitGenericIEquatable then @@ -857,7 +893,7 @@ module AddAugmentationDeclarations = let vspec1, vspec2 = AugmentTypeDefinitions.MakeValsForEqualsAugmentation g tcref tcaug.SetEquals (mkLocalValRef vspec1, mkLocalValRef vspec2) if not tycon.IsFSharpException then - PublishInterface cenv env.DisplayEnv tcref m true (mkAppTy g.system_GenericIEquatable_tcref [ty]) + PublishInterface cenv env.DisplayEnv tcref m true (mkWoNullAppTy g.system_GenericIEquatable_tcref [ty]) PublishValueDefn cenv env ModuleOrMemberBinding vspec1 PublishValueDefn cenv env ModuleOrMemberBinding vspec2 AugmentTypeDefinitions.MakeBindingsForEqualsAugmentation g tycon @@ -866,7 +902,8 @@ module AddAugmentationDeclarations = let ShouldAugmentUnion (g: TcGlobals) (tycon: Tycon) = g.langVersion.SupportsFeature LanguageFeature.UnionIsPropertiesVisible && - HasDefaultAugmentationAttribute g (mkLocalTyconRef tycon) + HasDefaultAugmentationAttribute g (mkLocalTyconRef tycon) && + tycon.UnionCasesArray.Length > 1 let AddUnionAugmentationValues (cenv: cenv) (env: TcEnv) tycon = let tcref = mkLocalTyconRef tycon @@ -902,11 +939,6 @@ module MutRecBindingChecking = /// A 'member' definition in a class | Phase2AMember of PreCheckingRecursiveBinding -#if OPEN_IN_TYPE_DECLARATIONS - /// A dummy declaration, should we ever support 'open' in type definitions - | Phase2AOpen of SynOpenDeclTarget * range -#endif - /// Indicates the super init has just been called, 'this' may now be published | Phase2AIncrClassCtorJustAfterSuperInit @@ -1039,7 +1071,7 @@ module MutRecBindingChecking = let innerState = (None, envForTycon, tpenv, recBindIdx, uncheckedBindsRev) [Phase2AIncrClassCtor (staticCtorInfo, None)], innerState - | Some (SynMemberDefn.ImplicitCtor (vis, Attributes attrs, SynSimplePats.SimplePats(pats=spats), thisIdOpt, xmlDoc, m,_)), ContainerInfo(_, Some memberContainerInfo) -> + | Some (SynMemberDefn.ImplicitCtor (vis, Attributes attrs, pat, thisIdOpt, xmlDoc, m,_)), ContainerInfo(_, Some memberContainerInfo) -> let (MemberOrValContainerInfo(tcref, _, baseValOpt, safeInitInfo, _)) = memberContainerInfo @@ -1050,7 +1082,7 @@ module MutRecBindingChecking = let staticCtorInfo = TcStaticImplicitCtorInfo_Phase2A(cenv, envForTycon, tcref, m, copyOfTyconTypars) // Phase2A: make incrCtorInfo - ctorv, thisVal etc, type depends on argty(s) - let incrCtorInfo = TcImplicitCtorInfo_Phase2A(cenv, envForTycon, tpenv, tcref, vis, attrs, spats, thisIdOpt, baseValOpt, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy, xmlDoc) + let incrCtorInfo = TcImplicitCtorInfo_Phase2A(cenv, envForTycon, tpenv, tcref, vis, attrs, pat, thisIdOpt, baseValOpt, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy, xmlDoc) // Phase2A: Add copyOfTyconTypars from incrCtorInfo - or from tcref let envForTycon = AddDeclaredTypars CheckForDuplicateTypars staticCtorInfo.IncrCtorDeclaredTypars envForTycon @@ -1058,7 +1090,7 @@ module MutRecBindingChecking = [Phase2AIncrClassCtor (staticCtorInfo, Some incrCtorInfo)], innerState - | Some (SynMemberDefn.ImplicitInherit (ty, arg, _baseIdOpt, m)), _ -> + | Some (SynMemberDefn.ImplicitInherit (ty, arg, _baseIdOpt, m, _)), _ -> if tcref.TypeOrMeasureKind = TyparKind.Measure then error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembers(), m)) @@ -1124,13 +1156,6 @@ module MutRecBindingChecking = let innerState = (incrCtorInfoOpt, envForTycon, tpenv, recBindIdx, List.rev binds @ uncheckedBindsRev) cbinds, innerState - -#if OPEN_IN_TYPE_DECLARATIONS - | Some (SynMemberDefn.Open (target, m)), _ -> - let innerState = (incrCtorInfoOpt, env, tpenv, recBindIdx, prelimRecValuesRev, uncheckedBindsRev) - [ Phase2AOpen (target, m) ], innerState -#endif - | definition -> error(InternalError(sprintf "Unexpected definition %A" definition, m))) @@ -1139,11 +1164,11 @@ module MutRecBindingChecking = for b1, b2 in List.pairwise defnAs do match b1, b2 with | TyconBindingPhase2A.Phase2AMember { - SyntacticBinding = NormalizedBinding(pat = SynPat.Named(ident = SynIdent(ident = getIdent)); valSynData = SynValData(memberFlags = Some mf)) + SyntacticBinding = NormalizedBinding(pat = SynPat.Named(ident = SynIdent(ident = Get_OrSet_Ident & getIdent)); valSynData = SynValData(memberFlags = Some mf)) RecBindingInfo = RecursiveBindingInfo(vspec = vGet) }, TyconBindingPhase2A.Phase2AMember { - SyntacticBinding = NormalizedBinding(pat = SynPat.Named(ident = SynIdent(ident = setIdent))) + SyntacticBinding = NormalizedBinding(pat = SynPat.Named(ident = SynIdent(ident = Get_OrSet_Ident & setIdent))) RecBindingInfo = RecursiveBindingInfo(vspec = vSet) } when Range.equals getIdent.idRange setIdent.idRange -> match vGet.ApparentEnclosingEntity with @@ -1162,7 +1187,7 @@ module MutRecBindingChecking = [ PropInfo.FSProp(g, apparentEnclosingType, Some (mkLocalValRef vGet), Some (mkLocalValRef vSet)) ], Some getIdent.idRange ) - CallNameResolutionSink cenv.tcSink (getIdent.idRange, envForTycon.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, envForTycon.eAccessRights) + CallNameResolutionSink cenv.tcSink (getIdent.idRange, envForTycon.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, envForTycon.eAccessRights) | _ -> () // If no constructor call, insert Phase2AIncrClassCtorJustAfterSuperInit at start @@ -1178,9 +1203,6 @@ module MutRecBindingChecking = let rest = let isAfter b = match b with -#if OPEN_IN_TYPE_DECLARATIONS - | Phase2AOpen _ -#endif | Phase2AIncrClassCtor _ | Phase2AInherit _ | Phase2AIncrClassCtorJustAfterSuperInit -> false | Phase2AIncrClassBindings (_, binds, _, _, _) -> binds |> List.exists (function SynBinding (kind=SynBindingKind.Do) -> true | _ -> false) | Phase2AIncrClassCtorJustAfterLastLet @@ -1334,10 +1356,10 @@ module MutRecBindingChecking = // Phase2B: typecheck the argument to an 'inherits' call and build the new object expr for the inherit-call | Phase2AInherit (synBaseTy, arg, baseValOpt, m) -> - let baseTy, tpenv = TcType cenv NoNewTypars CheckCxs ItemOccurence.Use WarnOnIWSAM.Yes envInstance tpenv synBaseTy - let baseTy = baseTy |> convertToTypeWithMetadataIfPossible g let inheritsExpr, tpenv = - try + try + let baseTy, tpenv = TcType cenv NoNewTypars CheckCxs ItemOccurrence.Use WarnOnIWSAM.Yes envInstance tpenv synBaseTy + let baseTy = baseTy |> convertToTypeWithMetadataIfPossible g TcNewExpr cenv envInstance tpenv baseTy (Some synBaseTy.Range) true arg m with RecoverableException e -> errorRecovery e m @@ -1399,16 +1421,6 @@ module MutRecBindingChecking = | Phase2AIncrClassCtorJustAfterLastLet -> let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) Phase2BIncrClassCtorJustAfterLastLet, innerState - - -#if OPEN_IN_TYPE_DECLARATIONS - | Phase2AOpen(target, m) -> - let envInstance = TcOpenDecl cenv m scopem envInstance target - let envStatic = TcOpenDecl cenv m scopem envStatic target - let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - Phase2BOpen, innerState -#endif - // Note: this path doesn't add anything the environment, because the member is already available off via its type @@ -1592,7 +1604,7 @@ module MutRecBindingChecking = if tcref.IsStructOrEnumTycon then Some (incrCtorInfo, mkUnit g tcref.Range, false), defnCs else - let inheritsExpr, _ = TcNewExpr cenv envForDecls tpenv g.obj_ty None true (SynExpr.Const (SynConst.Unit, tcref.Range)) tcref.Range + let inheritsExpr, _ = TcNewExpr cenv envForDecls tpenv g.obj_ty_noNulls None true (SynExpr.Const (SynConst.Unit, tcref.Range)) tcref.Range // If there is no 'inherits' and no simple non-static 'let' of a non-method then add a debug point at the entry to the constructor over the type name itself. let addDebugPointAtImplicitCtorArguments = @@ -1926,9 +1938,10 @@ module MutRecBindingChecking = let private ReportErrorOnStaticClass (synMembers: SynMemberDefn list) = for mem in synMembers do match mem with - | SynMemberDefn.ImplicitCtor(ctorArgs = SynSimplePats.SimplePats(pats = pats)) when (not pats.IsEmpty) -> - for pat in pats do - warning(Error(FSComp.SR.chkConstructorWithArgumentsOnStaticClasses(), pat.Range)) + | SynMemberDefn.ImplicitCtor(ctorArgs = pat) -> + match pat with + | SynPat.Paren(innerPat, _) -> warning(Error(FSComp.SR.chkConstructorWithArgumentsOnStaticClasses(), innerPat.Range)) + | _ -> () | SynMemberDefn.Member(SynBinding(valData = SynValData(memberFlags = Some memberFlags)), m) when memberFlags.MemberKind = SynMemberKind.Constructor -> warning(Error(FSComp.SR.chkAdditionalConstructorOnStaticClasses(), m)) | SynMemberDefn.Member(SynBinding(valData = SynValData(memberFlags = Some memberFlags)), m) when memberFlags.IsInstance -> @@ -1962,7 +1975,7 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial mBinds scopem mutRecNSInfo (env let intfTyR = let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForTycon - TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType WarnOnIWSAM.No envinner emptyUnscopedTyparEnv intfTy |> fst + TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.No envinner emptyUnscopedTyparEnv intfTy |> fst if not (tcref.HasInterface g intfTyR) then error(Error(FSComp.SR.tcAllImplementedInterfacesShouldBeDeclared(), intfTy.Range)) @@ -1973,8 +1986,8 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial mBinds scopem mutRecNSInfo (env if (generatedCompareToValues && typeEquiv g intfTyR g.mk_IComparable_ty) || (generatedCompareToWithComparerValues && typeEquiv g intfTyR g.mk_IStructuralComparable_ty) || - (generatedCompareToValues && typeEquiv g intfTyR (mkAppTy g.system_GenericIComparable_tcref [ty])) || - (generatedHashAndEqualsWithComparerValues && typeEquiv g intfTyR (mkAppTy g.system_GenericIEquatable_tcref [ty])) || + (generatedCompareToValues && typeEquiv g intfTyR (mkWoNullAppTy g.system_GenericIComparable_tcref [ty])) || + (generatedHashAndEqualsWithComparerValues && typeEquiv g intfTyR (mkWoNullAppTy g.system_GenericIEquatable_tcref [ty])) || (generatedHashAndEqualsWithComparerValues && typeEquiv g intfTyR g.mk_IStructuralEquatable_ty) then errorR(Error(FSComp.SR.tcDefaultImplementationForInterfaceHasAlreadyBeenAdded(), intfTy.Range)) @@ -2387,10 +2400,10 @@ let CheckForDuplicateModule env nm m = /// Check 'exception' declarations in implementations and signatures module TcExceptionDeclarations = - let TcExnDefnCore_Phase1A cenv env parent (SynExceptionDefnRepr(Attributes synAttrs, SynUnionCase(ident= SynIdent(id,_)), _, xmlDoc, vis, m)) = + let TcExnDefnCore_Phase1A g cenv env parent (SynExceptionDefnRepr(Attributes synAttrs, SynUnionCase(ident= SynIdent(id,_)), _, xmlDoc, vis, m)) = let attrs = TcAttributes cenv env AttributeTargets.ExnDecl synAttrs if not (String.isLeadingIdentifierCharacterUpperCase id.idText) then errorR(NotUpperCaseConstructor id.idRange) - let vis, cpath = ComputeAccessAndCompPath env None m vis None parent + let vis, cpath = ComputeAccessAndCompPath g env None m vis None parent let vis = TcRecdUnionAndEnumDeclarations.CombineReprAccess parent vis CheckForDuplicateConcreteType env (id.idText + "Exception") id.idRange CheckForDuplicateConcreteType env id.idText id.idRange @@ -2413,7 +2426,7 @@ module TcExceptionDeclarations = let tcref = mkLocalTyconRef exnc let thisTypInst, _ = generalizeTyconRef g tcref let item = Item.RecdField (RecdFieldInfo (thisTypInst, RecdFieldRef (tcref, fieldId.idText))) - CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights) + CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights) | _ -> () TcRecdUnionAndEnumDeclarations.TcAnonFieldDecl cenv env parent emptyUnscopedTyparEnv (mkExceptionFieldName i) fdef) @@ -2456,12 +2469,12 @@ module TcExceptionDeclarations = exnc.SetExceptionInfo repr let item = Item.ExnCase(mkLocalTyconRef exnc) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights) args' let private TcExnDefnCore (cenv: cenv) env parent synExnDefnRepr = let g = cenv.g - let exnc = TcExnDefnCore_Phase1A cenv env parent synExnDefnRepr + let exnc = TcExnDefnCore_Phase1A g cenv env parent synExnDefnRepr let args' = TcExnDefnCore_Phase1G_EstablishRepresentation cenv env parent exnc synExnDefnRepr exnc.TypeContents.tcaug_super <- Some g.exn_ty @@ -2495,7 +2508,7 @@ module TcExceptionDeclarations = let TcExnSignature (cenv: cenv) envInitial parent tpenv (SynExceptionSig(exnRepr=core; members=aug), scopem) = match core with - | SynExceptionDefnRepr(caseName = SynUnionCase(ident = SynIdent(ident, _))) when ident.idText = "" -> + | SynExceptionDefnRepr(caseName = SynUnionCase(ident = SynIdent(ident, _))) when String.IsNullOrEmpty(ident.idText) -> [], [], None, envInitial | _ -> let g = cenv.g @@ -2600,11 +2613,11 @@ module EstablishTypeDefinitionCores = match args with | SynUnionCaseKind.Fields flds -> for SynField(fieldType = ty; range = m) in flds do - let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty + let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv ty yield (tyR, m) | SynUnionCaseKind.FullType (ty, arity) -> - let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty + let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv ty let curriedArgTys, _ = GetTopTauTypeInFSharpForm g (arity |> TranslateSynValInfo cenv m (TcAttributes cenv env) |> TranslatePartialValReprInfo []).ArgInfos tyR m if curriedArgTys.Length > 1 then @@ -2618,13 +2631,13 @@ module EstablishTypeDefinitionCores = for field in fields do let (SynField(isStatic = isStatic; fieldType = ty; range = m)) = field if not isStatic then - let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty + let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv ty yield (tyR, m) match implicitCtorSynPats with | None -> () - | Some spats -> - let ctorArgNames, patEnv = TcSimplePatsOfUnknownType cenv true NoCheckCxs env tpenv spats + | Some pat -> + let ctorArgNames, patEnv, _ = TcSimplePatsOfUnknownType cenv true NoCheckCxs env tpenv pat let (TcPatLinearEnv(_, names, _)) = patEnv @@ -2637,7 +2650,7 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.Record (_, fields, _) -> for SynField(fieldType = ty; range = m) in fields do - let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty + let tyR, _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv ty yield (tyR, m) | _ -> @@ -2728,7 +2741,7 @@ module EstablishTypeDefinitionCores = let moduleKind = ComputeModuleOrNamespaceKind g true typeNames modAttrs id.idText let modName = AdjustModuleName moduleKind id.idText - let vis, _ = ComputeAccessAndCompPath envInitial None id.idRange vis None parent + let vis, _ = ComputeAccessAndCompPath g envInitial None id.idRange vis None parent CheckForDuplicateModule envInitial id.idText id.idRange let id = ident (modName, id.idRange) @@ -2757,13 +2770,13 @@ module EstablishTypeDefinitionCores = match synTyconRepr with | SynTypeDefnSimpleRepr.Exception synExnDefnRepr -> - TcExceptionDeclarations.TcExnDefnCore_Phase1A cenv env parent synExnDefnRepr + TcExceptionDeclarations.TcExnDefnCore_Phase1A g cenv env parent synExnDefnRepr | _ -> let id = ComputeTyconName (id, (match synTyconRepr with SynTypeDefnSimpleRepr.TypeAbbrev _ -> false | _ -> true), checkedTypars) // Augmentations of type definitions are allowed within the same file as long as no new type representation or abbreviation is given CheckForDuplicateConcreteType env id.idText id.idRange - let vis, cpath = ComputeAccessAndCompPath env None id.idRange synVis None parent + let vis, cpath = ComputeAccessAndCompPath g env None id.idRange synVis None parent // Establish the visibility of the representation, e.g. // type R = @@ -2780,7 +2793,8 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.Enum _ -> None | SynTypeDefnSimpleRepr.Exception _ -> None - let visOfRepr, _ = ComputeAccessAndCompPath env None id.idRange synVisOfRepr None parent + let visOfRepr, _ = ComputeAccessAndCompPath g env None id.idRange synVisOfRepr None parent + let visOfRepr = combineAccess vis visOfRepr // If we supported nested types and modules then additions would be needed here let lmodTy = MaybeLazy.Strict (Construct.NewEmptyModuleOrNamespaceType ModuleOrType) @@ -2790,19 +2804,24 @@ module EstablishTypeDefinitionCores = match synTyconRepr with | SynTypeDefnSimpleRepr.General (SynTypeDefnKind.Delegate (_ty, arity), _, _, _, _, _, _, _) -> arity.ArgNames | SynTypeDefnSimpleRepr.General (SynTypeDefnKind.Unspecified, _, _, _, _, _, Some synPats, _) -> - let rec patName (p: SynSimplePat) = + let rec patName (p: SynPat) = match p with - | SynSimplePat.Id (id, _, _, _, _, _) -> id.idText - | SynSimplePat.Typed(pat, _, _) -> patName pat - | SynSimplePat.Attrib(pat, _, _) -> patName pat + | SynPat.Named(ident = (SynIdent(id, _))) -> Some id.idText + | SynPat.Typed(pat = pat) + | SynPat.Attrib(pat = pat) -> patName pat + | _ -> None - let rec pats (p: SynSimplePats) = - match p with - | SynSimplePats.SimplePats (pats = ps) -> ps + let getSimplePats (pat: SynPat) = + match pat with + | SynPat.Paren(pat, _) -> + match pat with + | SynPat.Tuple(false, pats, _, _) -> pats + | pat -> [pat] + | _ -> [] let patNames = - pats synPats - |> List.map patName + getSimplePats synPats + |> List.choose patName patNames | _ -> [] @@ -2834,12 +2853,28 @@ module EstablishTypeDefinitionCores = // Allow failure of constructor resolution because Vals for members in the same recursive group are not yet available let attrs, getFinalAttrs = TcAttributesCanFail cenv envinner AttributeTargets.TyconDecl synAttrs let hasMeasureAttr = HasFSharpAttribute g g.attrib_MeasureAttribute attrs + let hasStructAttr = HasFSharpAttribute g g.attrib_StructAttribute attrs + let hasCLIMutable = HasFSharpAttribute g g.attrib_CLIMutableAttribute attrs + let hasAllowNullLiteralAttr = HasFSharpAttribute g g.attrib_AllowNullLiteralAttribute attrs + let hasSealedAttr = HasFSharpAttribute g g.attrib_SealedAttribute attrs + let structLayoutAttr = HasFSharpAttribute g g.attrib_StructLayoutAttribute attrs + + // We want to keep these special attributes treatment and avoid having two errors for the same attribute. + let reportAttributeTargetsErrors = + g.langVersion.SupportsFeature(LanguageFeature.EnforceAttributeTargets) + && not hasCLIMutable // CLIMutableAttribute has a special treatment(specific error FS3132) + && not hasAllowNullLiteralAttr // AllowNullLiteralAttribute has a special treatment(specific errors FS0934, FS093) + && not hasSealedAttr // SealedAttribute has a special treatment(specific error FS942) + && not structLayoutAttr // StructLayoutAttribute has a special treatment(specific error FS0937) + + let noCLIMutableAttributeCheck() = + if hasCLIMutable then errorR (Error(FSComp.SR.tcThisTypeMayNotHaveACLIMutableAttribute(), m)) let isStructRecordOrUnionType = match synTyconRepr with | SynTypeDefnSimpleRepr.Record _ | TyconCoreAbbrevThatIsReallyAUnion (hasMeasureAttr, envinner, id) _ - | SynTypeDefnSimpleRepr.Union _ -> + | SynTypeDefnSimpleRepr.Union _ -> HasFSharpAttribute g g.attrib_StructAttribute attrs | _ -> false @@ -2868,9 +2903,15 @@ module EstablishTypeDefinitionCores = | TyconCoreAbbrevThatIsReallyAUnion (hasMeasureAttr, envinner, id) (_, m) | SynTypeDefnSimpleRepr.Union (_, _, m) -> - + noCLIMutableAttributeCheck() // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind g (SynTypeDefnKind.Union, attrs, [], [], inSig, true, m) |> ignore + + if reportAttributeTargetsErrors then + if hasStructAttr then + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Struct synAttrs |> ignore + else + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Class synAttrs |> ignore // Note: the table of union cases is initially empty Construct.MakeUnionRepr [] @@ -2882,35 +2923,57 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly (s, m) -> let s = (s :?> ILType) + noCLIMutableAttributeCheck() // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind g (SynTypeDefnKind.IL, attrs, [], [], inSig, true, m) |> ignore TAsmRepr s | SynTypeDefnSimpleRepr.Record (_, _, m) -> - // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind g (SynTypeDefnKind.Record, attrs, [], [], inSig, true, m) |> ignore + + if reportAttributeTargetsErrors then + if hasStructAttr then + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Struct synAttrs |> ignore + else + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Class synAttrs |> ignore // Note: the table of record fields is initially empty TFSharpTyconRepr (Construct.NewEmptyFSharpTyconData TFSharpRecord) | SynTypeDefnSimpleRepr.General (kind, _, slotsigs, fields, isConcrete, _, _, _) -> let kind = InferTyconKind g (kind, attrs, slotsigs, fields, inSig, isConcrete, m) + noCLIMutableAttributeCheck() match kind with | SynTypeDefnKind.Opaque -> TNoRepr | _ -> let kind = match kind with - | SynTypeDefnKind.Class -> TFSharpClass - | SynTypeDefnKind.Interface -> TFSharpInterface - | SynTypeDefnKind.Delegate _ -> TFSharpDelegate (MakeSlotSig("Invoke", g.unit_ty, [], [], [], None)) - | SynTypeDefnKind.Struct -> TFSharpStruct + | SynTypeDefnKind.Class -> + if reportAttributeTargetsErrors then + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Class synAttrs |> ignore + TFSharpClass + | SynTypeDefnKind.Interface -> + if reportAttributeTargetsErrors then + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Interface synAttrs |> ignore + TFSharpInterface + | SynTypeDefnKind.Delegate _ -> + if reportAttributeTargetsErrors then + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Delegate synAttrs |> ignore + TFSharpDelegate (MakeSlotSig("Invoke", g.unit_ty, [], [], [], None)) + | SynTypeDefnKind.Struct -> + if reportAttributeTargetsErrors then + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Struct synAttrs |> ignore + TFSharpStruct | _ -> error(InternalError("should have inferred tycon kind", m)) TFSharpTyconRepr (Construct.NewEmptyFSharpTyconData kind) - | SynTypeDefnSimpleRepr.Enum _ -> + | SynTypeDefnSimpleRepr.Enum _ -> + noCLIMutableAttributeCheck() + if reportAttributeTargetsErrors then + TcAttributesWithPossibleTargets TcCanFail.IgnoreMemberResoutionError cenv envinner AttributeTargets.Enum synAttrs |> ignore TFSharpTyconRepr (Construct.NewEmptyFSharpTyconData TFSharpEnum) // OK, now fill in the (partially computed) type representation @@ -2934,8 +2997,8 @@ module EstablishTypeDefinitionCores = | None -> None | Some (tc, args, m) -> let ad = envinner.AccessRights - match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.UseInType OpenQualified envinner.NameEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.Yes with - | Result (_, tcrefBeforeStaticArguments) when + match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurrence.UseInType OpenQualified envinner.NameEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.Yes with + | Result (_, tcrefBeforeStaticArguments, _) when tcrefBeforeStaticArguments.IsProvided && not tcrefBeforeStaticArguments.IsErased -> @@ -3162,7 +3225,7 @@ module EstablishTypeDefinitionCores = // This case deals with ordinary type and measure abbreviations if not hasMeasureableAttr then let kind = if hasMeasureAttr then TyparKind.Measure else TyparKind.Type - let ty, _ = TcTypeOrMeasureAndRecover (Some kind) cenv NoNewTypars checkConstraints ItemOccurence.UseInType WarnOnIWSAM.No envinner tpenv rhsType + let ty, _ = TcTypeOrMeasureAndRecover (Some kind) cenv NoNewTypars checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.No envinner tpenv rhsType // Give a warning if `AutoOpenAttribute` is being aliased. // If the user were to alias the `Microsoft.FSharp.Core.AutoOpenAttribute` type, it would not be detected by the project graph dependency resolution algorithm. @@ -3207,7 +3270,7 @@ module EstablishTypeDefinitionCores = let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars m) envinner let envinner = MakeInnerEnvForTyconRef envinner tcref false - let implementedTys, _ = List.mapFold (mapFoldFst (TcTypeAndRecover cenv NoNewTypars checkConstraints ItemOccurence.UseInType WarnOnIWSAM.No envinner)) tpenv explicitImplements + let implementedTys, _ = List.mapFold (mapFoldFst (TcTypeAndRecover cenv NoNewTypars checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.No envinner)) tpenv explicitImplements if firstPass then tycon.entity_attribs <- attrs @@ -3219,7 +3282,7 @@ module EstablishTypeDefinitionCores = let kind = InferTyconKind g (kind, attrs, slotsigs, fields, inSig, isConcrete, m) let inherits = inherits |> List.map (fun (ty, m, _) -> (ty, m)) - let inheritedTys = fst (List.mapFold (mapFoldFst (TcTypeAndRecover cenv NoNewTypars checkConstraints ItemOccurence.UseInType WarnOnIWSAM.No envinner)) tpenv inherits) + let inheritedTys = fst (List.mapFold (mapFoldFst (TcTypeAndRecover cenv NoNewTypars checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.No envinner)) tpenv inherits) let implementedTys, inheritedTys = match kind with | SynTypeDefnKind.Interface -> @@ -3259,9 +3322,8 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.Record _ -> if tycon.IsStructRecordOrUnionTycon then Some(g.system_Value_ty) else None - | SynTypeDefnSimpleRepr.General (kind, _, slotsigs, fields, isConcrete, _, _, _) -> + | SynTypeDefnSimpleRepr.General (kind, inherits, slotsigs, fields, isConcrete, _, _, _) -> let kind = InferTyconKind g (kind, attrs, slotsigs, fields, inSig, isConcrete, m) - match inheritedTys with | [] -> match kind with @@ -3270,18 +3332,27 @@ module EstablishTypeDefinitionCores = | SynTypeDefnKind.Opaque | SynTypeDefnKind.Class | SynTypeDefnKind.Interface -> None | _ -> error(InternalError("should have inferred tycon kind", m)) - | [(ty, m)] -> - if not firstPass && not (match kind with SynTypeDefnKind.Class -> true | _ -> false) then - errorR (Error(FSComp.SR.tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes(), m)) - CheckSuperType cenv ty m + | [(ty, m)] -> + let inheritRange = + match inherits with + | [] -> m + | (synType, _, _) :: _ -> synType.Range + if not firstPass && not (match kind with SynTypeDefnKind.Class -> true | _ -> false) then + errorR (Error(FSComp.SR.tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes(), inheritRange)) + CheckSuperType cenv ty inheritRange if isTyparTy g ty then if firstPass then - errorR(Error(FSComp.SR.tcCannotInheritFromVariableType(), m)) - Some g.obj_ty // a "super" that is a variable type causes grief later - else + errorR(Error(FSComp.SR.tcCannotInheritFromVariableType(), inheritRange)) + Some g.obj_ty_noNulls // a "super" that is a variable type causes grief later + else Some ty - | _ -> - error(Error(FSComp.SR.tcTypesCannotInheritFromMultipleConcreteTypes(), m)) + | _ -> + match inherits with + | [] -> () + | _ :: inherits -> + for synType, _, _ in inherits do + errorR(Error(FSComp.SR.tcTypesCannotInheritFromMultipleConcreteTypes(), synType.Range)) + None | SynTypeDefnSimpleRepr.Enum _ -> Some(g.system_Enum_ty) @@ -3292,7 +3363,7 @@ module EstablishTypeDefinitionCores = super |> Option.map (fun ty -> if isFunTy g ty then let a,b = destFunTy g ty - mkAppTy g.fastFunc_tcr [a; b] + mkWoNullAppTy g.fastFunc_tcr [a; b] else ty) // Publish the super type @@ -3322,7 +3393,6 @@ module EstablishTypeDefinitionCores = // REVIEW: for hasMeasureableAttr we need to be stricter about checking these // are only used on exactly the right kinds of type definitions and not in conjunction with other attributes. let hasMeasureableAttr = HasFSharpAttribute g g.attrib_MeasureableAttribute attrs - let hasCLIMutable = HasFSharpAttribute g g.attrib_CLIMutableAttribute attrs let structLayoutAttr = TryFindFSharpInt32Attribute g g.attrib_StructLayoutAttribute attrs let hasAllowNullLiteralAttr = TryFindFSharpBoolAttribute g g.attrib_AllowNullLiteralAttribute attrs = Some true @@ -3343,7 +3413,6 @@ module EstablishTypeDefinitionCores = tycon.TypeContents.tcaug_super |> Option.iter (fun ty -> if not (TypeNullIsExtraValue g m ty) then errorR (Error(FSComp.SR.tcAllowNullTypesMayOnlyInheritFromAllowNullTypes(), m))) tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.iter (fun ty -> if not (TypeNullIsExtraValue g m ty) then errorR (Error(FSComp.SR.tcAllowNullTypesMayOnlyInheritFromAllowNullTypes(), m))) - let structLayoutAttributeCheck allowed = let explicitKind = int32 System.Runtime.InteropServices.LayoutKind.Explicit match structLayoutAttr with @@ -3367,9 +3436,6 @@ module EstablishTypeDefinitionCores = let noMeasureAttributeCheck() = if hasMeasureAttr then errorR (Error(FSComp.SR.tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure(), m)) - let noCLIMutableAttributeCheck() = - if hasCLIMutable then errorR (Error(FSComp.SR.tcThisTypeMayNotHaveACLIMutableAttribute(), m)) - let noSealedAttributeCheck k = if hasSealedAttr = Some true then errorR (Error(k(), m)) @@ -3378,14 +3444,13 @@ module EstablishTypeDefinitionCores = | rf :: _ -> errorR (Error(FSComp.SR.tcInterfaceTypesAndDelegatesCannotContainFields(), rf.Range)) | _ -> () - let primaryConstructorInDelegateCheck(implicitCtorSynPats : SynSimplePats option) = + let primaryConstructorInDelegateCheck(implicitCtorSynPats : SynPat option) = match implicitCtorSynPats with | None -> () - | Some spats -> - let ctorArgNames, _ = TcSimplePatsOfUnknownType cenv true CheckCxs envinner tpenv spats + | Some pat -> + let ctorArgNames, _, _ = TcSimplePatsOfUnknownType cenv true CheckCxs envinner tpenv pat if not ctorArgNames.IsEmpty then - match spats with - | SynSimplePats.SimplePats(range = m) -> errorR (Error(FSComp.SR.parsOnlyClassCanTakeValueArguments(), m)) + errorR (Error(FSComp.SR.parsOnlyClassCanTakeValueArguments(), pat.Range)) let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars m) envinner let envinner = MakeInnerEnvForTyconRef envinner thisTyconRef false @@ -3421,7 +3486,7 @@ module EstablishTypeDefinitionCores = for fspec in fields do if not fspec.IsCompilerGenerated then let item = Item.RecdField(FreshenRecdFieldRef cenv.nameResolver m (thisTyconRef.MakeNestedRecdFieldRef fspec)) - CallNameResolutionSink cenv.tcSink (fspec.Range, nenv, item, emptyTyparInst, ItemOccurence.Binding, ad) + CallNameResolutionSink cenv.tcSink (fspec.Range, nenv, item, emptyTyparInst, ItemOccurrence.Binding, ad) // Notify the Language Service about constructors in discriminated union declaration let writeFakeUnionCtorsToSink (unionCases: UnionCase list) = @@ -3430,7 +3495,7 @@ module EstablishTypeDefinitionCores = for unionCase in unionCases do let info = UnionCaseInfo(thisTyInst, mkUnionCaseRef thisTyconRef unionCase.Id.idText) let item = Item.UnionCase(info, false) - CallNameResolutionSink cenv.tcSink (unionCase.Range, nenv, item, emptyTyparInst, ItemOccurence.Binding, ad) + CallNameResolutionSink cenv.tcSink (unionCase.Range, nenv, item, emptyTyparInst, ItemOccurrence.Binding, ad) let typeRepr, baseValOpt, safeInitInfo = match synTyconRepr with @@ -3474,7 +3539,7 @@ module EstablishTypeDefinitionCores = noAllowNullLiteralAttributeCheck() if hasMeasureableAttr then let kind = if hasMeasureAttr then TyparKind.Measure else TyparKind.Type - let theTypeAbbrev, _ = TcTypeOrMeasureAndRecover (Some kind) cenv NoNewTypars CheckCxs ItemOccurence.UseInType WarnOnIWSAM.No envinner tpenv rhsType + let theTypeAbbrev, _ = TcTypeOrMeasureAndRecover (Some kind) cenv NoNewTypars CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.No envinner tpenv rhsType TMeasureableRepr theTypeAbbrev, None, NoSafeInitInfo // If we already computed a representation, e.g. for a generative type definition, then don't change it here. @@ -3484,7 +3549,6 @@ module EstablishTypeDefinitionCores = TNoRepr, None, NoSafeInitInfo | SynTypeDefnSimpleRepr.Union (_, unionCases, mRepr) -> - noCLIMutableAttributeCheck() noMeasureAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedDU noAbstractClassAttributeCheck() @@ -3524,7 +3588,6 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly (s, _) -> let s = (s :?> ILType) - noCLIMutableAttributeCheck() noMeasureAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedAssemblyCode noAllowNullLiteralAttributeCheck() @@ -3539,9 +3602,9 @@ module EstablishTypeDefinitionCores = match implicitCtorSynPats with | None -> () - | Some spats -> - if tycon.IsFSharpStructOrEnumTycon then - let ctorArgNames, patEnv = TcSimplePatsOfUnknownType cenv true CheckCxs envinner tpenv spats + | Some pat -> + if tycon.IsFSharpStructOrEnumTycon then + let ctorArgNames, patEnv, _ = TcSimplePatsOfUnknownType cenv true CheckCxs envinner tpenv pat let (TcPatLinearEnv(_, names, _)) = patEnv @@ -3567,16 +3630,33 @@ module EstablishTypeDefinitionCores = // Note: for a mutually recursive set we can't check this condition // until "isSealedTy" and "isClassTy" give reliable results. superTy |> Option.iter (fun ty -> - let m = match inherits with | [] -> m | (_, m, _) :: _ -> m + let m = + match inherits with + | [] -> m + | (synType, _, _) :: _ -> synType.Range + if isSealedTy g ty then errorR(Error(FSComp.SR.tcCannotInheritFromSealedType(), m)) elif not (isClassTy g ty) then errorR(Error(FSComp.SR.tcCannotInheritFromInterfaceType(), m))) + let abstractSlots = + [ for synValSig, memberFlags in slotsigs do + + let (SynValSig(range=m)) = synValSig + + CheckMemberFlags None NewSlotsOK OverridesOK memberFlags m + + let slots = fst (TcAndPublishValSpec (cenv, envinner, containerInfo, ModuleOrMemberBinding, Some memberFlags, tpenv, synValSig)) + // Multiple slots may be returned, e.g. for + // abstract P: int with get, set + + for slot in slots do + yield mkLocalValRef slot ] + let kind = match kind with | SynTypeDefnKind.Struct -> - noCLIMutableAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedStruct noAbstractClassAttributeCheck() noAllowNullLiteralAttributeCheck() @@ -3587,26 +3667,26 @@ module EstablishTypeDefinitionCores = TFSharpStruct | SynTypeDefnKind.Interface -> if hasSealedAttr = Some true then errorR (Error(FSComp.SR.tcInterfaceTypesCannotBeSealed(), m)) - noCLIMutableAttributeCheck() structLayoutAttributeCheck false noAbstractClassAttributeCheck() allowNullLiteralAttributeCheck() noFieldsCheck userFields TFSharpInterface | SynTypeDefnKind.Class -> - noCLIMutableAttributeCheck() structLayoutAttributeCheck(not isIncrClass) allowNullLiteralAttributeCheck() + for slot in abstractSlots do + if not slot.IsInstanceMember then + errorR(Error(FSComp.SR.chkStaticAbstractMembersOnClasses(), slot.Range)) TFSharpClass | SynTypeDefnKind.Delegate (ty, arity) -> - noCLIMutableAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedDelegate structLayoutAttributeCheck false noAllowNullLiteralAttributeCheck() noAbstractClassAttributeCheck() noFieldsCheck userFields primaryConstructorInDelegateCheck(implicitCtorSynPats) - let tyR, _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes envinner tpenv ty + let tyR, _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes envinner tpenv ty let _, _, curriedArgInfos, returnTy, _ = GetValReprTypeInCompiledForm g (arity |> TranslateSynValInfo cenv m (TcAttributes cenv envinner) |> TranslatePartialValReprInfo []) 0 tyR m if curriedArgInfos.Length < 1 then error(Error(FSComp.SR.tcInvalidDelegateSpecification(), m)) if curriedArgInfos.Length > 1 then error(Error(FSComp.SR.tcDelegatesCannotBeCurried(), m)) @@ -3631,21 +3711,7 @@ module EstablishTypeDefinitionCores = | (_, m, baseIdOpt) :: _ -> match baseIdOpt with | None -> Some(ident("base", m)) - | Some id -> Some id - - let abstractSlots = - [ for synValSig, memberFlags in slotsigs do - - let (SynValSig(range=m)) = synValSig - - CheckMemberFlags None NewSlotsOK OverridesOK memberFlags m - - let slots = fst (TcAndPublishValSpec (cenv, envinner, containerInfo, ModuleOrMemberBinding, Some memberFlags, tpenv, synValSig)) - // Multiple slots may be returned, e.g. for - // abstract P: int with get, set - - for slot in slots do - yield mkLocalValRef slot ] + | Some id -> Some id let baseValOpt = MakeAndPublishBaseVal cenv envinner baseIdOpt (superOfTycon g tycon) let safeInitInfo = ComputeInstanceSafeInitInfo cenv envinner thisTyconRef.Range thisTy @@ -3664,7 +3730,6 @@ module EstablishTypeDefinitionCores = let fieldTy, fields' = TcRecdUnionAndEnumDeclarations.TcEnumDecls cenv envinner tpenv innerParent thisTy decls let kind = TFSharpEnum structLayoutAttributeCheck false - noCLIMutableAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedEnum noAllowNullLiteralAttributeCheck() let vid = ident("value__", m) @@ -3693,7 +3758,7 @@ module EstablishTypeDefinitionCores = // validate ConditionalAttribute, should it be applied (it's only valid on a type if the type is an attribute type) match attrs |> List.tryFind (IsMatchingFSharpAttribute g g.attrib_ConditionalAttribute) with | Some _ -> - if not(ExistsInEntireHierarchyOfType (fun t -> typeEquiv g t (mkAppTy g.tcref_System_Attribute [])) g cenv.amap m AllowMultiIntfInstantiations.Yes thisTy) then + if not(ExistsInEntireHierarchyOfType (fun t -> typeEquiv g t (mkWoNullAppTy g.tcref_System_Attribute [])) g cenv.amap m AllowMultiIntfInstantiations.Yes thisTy) then errorR(Error(FSComp.SR.tcConditionalAttributeUsage(), m)) | _ -> () @@ -3815,12 +3880,12 @@ module EstablishTypeDefinitionCores = | _ -> acc - // collect edges from an a struct field (which is struct-contained in tycon) + // collect edges from a struct field (which is struct-contained in tycon) let rec accStructField (structTycon: Tycon) structTyInst (fspec: RecdField) (doneTypes, acc) = let fieldTy = actualTyOfRecdFieldForTycon structTycon structTyInst fspec accStructFieldType structTycon structTyInst fspec fieldTy (doneTypes, acc) - // collect edges from an a struct field (given the field type, which may be expanded if it is a type abbreviation) + // collect edges from a struct field (given the field type, which may be expanded if it is a type abbreviation) and accStructFieldType structTycon structTyInst fspec fieldTy (doneTypes, acc) = let fieldTy = stripTyparEqns fieldTy match fieldTy with @@ -3918,7 +3983,7 @@ module EstablishTypeDefinitionCores = let thisTyconRef = mkLocalTyconRef tycon let envForTycon = MakeInnerEnvForTyconRef envForTycon thisTyconRef false try - TcTyparConstraints cenv NoNewTypars checkConstraints ItemOccurence.UseInType envForTycon tpenv synTyconConstraints |> ignore + TcTyparConstraints cenv NoNewTypars checkConstraints ItemOccurrence.UseInType envForTycon tpenv synTyconConstraints |> ignore with RecoverableException exn -> errorRecovery exn m | _ -> ()) @@ -3982,7 +4047,7 @@ module EstablishTypeDefinitionCores = // Phase 1B. Establish the kind of each type constructor // Here we run InferTyconKind and record partial information about the kind of the type constructor. // This means FSharpTyconKind is set, which means isSealedTy, isInterfaceTy etc. give accurate results. - let withAttrs = + let withAttrs = (envMutRecPrelim, withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> let res = match origInfo, tyconOpt with @@ -4105,18 +4170,18 @@ module TcDeclarations = // This records a name resolution of the type at the location let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgs synTypars.Length - ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envForDecls.NameEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No + ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurrence.Binding OpenQualified envForDecls.NameEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No |> ignore mkLocalTyconRef tycon | _ -> let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgs synTypars.Length - let _, tcref = - match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envForDecls.NameEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with + let tcref = + match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurrence.Binding OpenQualified envForDecls.NameEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with | Result res -> // Update resolved type parameters with the names from the source. - let _, tcref = res + let _, tcref, _ = res if tcref.TyparsNoRange.Length = synTypars.Length then (tcref.TyparsNoRange, synTypars) ||> List.zip @@ -4126,11 +4191,12 @@ module TcDeclarations = typar.SetIdent(untypedIdent) ) - res - | res when inSig && List.isSingleton longPath -> - errorR(Deprecated(FSComp.SR.tcReservedSyntaxForAugmentation(), m)) - ForceRaise res - | res -> ForceRaise res + tcref + + | Exception exn -> + if inSig && List.isSingleton longPath then + errorR(Deprecated(FSComp.SR.tcReservedSyntaxForAugmentation(), m)) + ForceRaise (Exception exn) tcref let isInterfaceOrDelegateOrEnum = @@ -4165,7 +4231,7 @@ module TcDeclarations = let declaredTypars = TcTyparDecls cenv envForDecls synTypars let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envForDecls - let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envForTycon emptyUnscopedTyparEnv synTyparCxs + let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurrence.UseInType envForTycon emptyUnscopedTyparEnv synTyparCxs declaredTypars |> List.iter (SetTyparRigid envForDecls.DisplayEnv m) if isInSameModuleOrNamespace && not isInterfaceOrDelegateOrEnum then @@ -4215,7 +4281,7 @@ module TcDeclarations = // multiple (binding or slotsig or field or interface or inherit). // i.e. not local-bindings, implicit ctor or implicit inherit (or tycon?). // atMostOne inherit. - let private CheckMembersForm ds = + let private CheckMembersForm ds m = match ds with | d :: ds when isImplicitCtor d -> // Implicit construction @@ -4227,7 +4293,7 @@ module TcDeclarations = // Skip over 'let' and 'do' bindings let _, ds = ds |> List.takeUntil (function SynMemberDefn.LetBindings _ -> false | _ -> true) - // Skip over 'let' and 'do' bindings + // Skip over member bindings, abstract slots, interfaces and auto properties let _, ds = ds |> List.takeUntil (allFalse [isMember;isAbstractSlot;isInterface;isAutoProperty]) match ds with @@ -4236,9 +4302,9 @@ module TcDeclarations = | SynMemberDefn.Interface (range=m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have interface", m)) | SynMemberDefn.ImplicitCtor (range=m) :: _ -> errorR(InternalError("implicit class construction with two implicit constructions", m)) | SynMemberDefn.AutoProperty (range=m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have auto property", m)) - | SynMemberDefn.ImplicitInherit (range=m) :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit(), m)) + | SynMemberDefn.ImplicitInherit _ :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit(), m)) | SynMemberDefn.LetBindings (range=m) :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers(), m)) - | SynMemberDefn.Inherit (range=m) :: _ -> errorR(Error(FSComp.SR.tcInheritDeclarationMissingArguments(), m)) + | SynMemberDefn.Inherit (trivia= { InheritKeyword = m }) :: _ -> errorR(Error(FSComp.SR.tcInheritDeclarationMissingArguments(), m)) | SynMemberDefn.NestedType (range=m) :: _ -> errorR(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)) | _ -> () | ds -> @@ -4285,7 +4351,7 @@ module TcDeclarations = | _ -> () /// Split auto-properties into 'let' and 'member' bindings - let private SplitAutoProps members = + let private SplitAutoProps (g: TcGlobals) members = let membersIncludingAutoProps, vals_Inherits_Abstractslots = members |> List.partition (fun memb -> match memb with @@ -4306,7 +4372,7 @@ module TcDeclarations = // Convert auto properties to let bindings in the pre-list let rec preAutoProps memb = match memb with - | SynMemberDefn.AutoProperty(ident = id) when id.idText = "" -> [] + | SynMemberDefn.AutoProperty(ident = id) when String.IsNullOrEmpty(id.idText) -> [] | SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; xmlDoc=xmlDoc; synExpr=synExpr; range=mWholeAutoProp) -> // Only the keep the field-targeted attributes let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> true | _ -> false) @@ -4334,8 +4400,8 @@ module TcDeclarations = // Convert auto properties to member bindings in the post-list let rec postAutoProps memb = match memb with - | SynMemberDefn.AutoProperty(ident = id) when id.idText = "" -> [] - | SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; memberFlags=memberFlags; memberFlagsForSet=memberFlagsForSet; xmlDoc=xmlDoc; accessibility=access; trivia = { GetSetKeywords = mGetSetOpt }) -> + | SynMemberDefn.AutoProperty(ident = id) when String.IsNullOrEmpty(id.idText) -> [] + | SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; memberFlags=memberFlags; memberFlagsForSet=memberFlagsForSet; xmlDoc=xmlDoc; trivia = { GetSetKeywords = mGetSetOpt }; accessibility = access) -> let mMemberPortion = id.idRange // Only the keep the non-field-targeted attributes let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true) @@ -4348,7 +4414,8 @@ module TcDeclarations = match propKind, mGetSetOpt with | SynMemberKind.PropertySet, Some getSetKeywords -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), getSetKeywords.Range)) | _ -> () - + + let getterAccess, setterAccess = getGetterSetterAccess access propKind g.langVersion [ match propKind with | SynMemberKind.Member @@ -4358,7 +4425,7 @@ module TcDeclarations = let rhsExpr = SynExpr.Ident fldId let retInfo = match tyOpt with None -> None | Some ty -> Some (None, SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range)) let attribs = mkAttributeList attribs mMemberPortion - let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, retInfo, rhsExpr, rhsExpr.Range, [], attribs, Some memberFlags, SynBindingTrivia.Zero) + let binding = mkSynBinding (xmlDoc, headPat) (getterAccess, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, retInfo, rhsExpr, rhsExpr.Range, [], attribs, Some memberFlags, SynBindingTrivia.Zero) SynMemberDefn.Member (binding, mMemberPortion) yield getter | _ -> () @@ -4370,7 +4437,7 @@ module TcDeclarations = let vId = ident("v", mMemberPortion) let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion) let rhsExpr = mkSynAssign (SynExpr.Ident fldId) (SynExpr.Ident vId) - let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, None, rhsExpr, rhsExpr.Range, [], [], Some memberFlagsForSet, SynBindingTrivia.Zero) + let binding = mkSynBinding (xmlDoc, headPat) (setterAccess, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, None, rhsExpr, rhsExpr.Range, [], [], Some memberFlagsForSet, SynBindingTrivia.Zero) SynMemberDefn.Member (binding, mMemberPortion) yield setter | _ -> ()] @@ -4394,30 +4461,30 @@ module TcDeclarations = /// where simpleRepr can contain inherit type, declared fields and virtual slots. /// body = members /// where members contain methods/overrides, also implicit ctor, inheritCall and local definitions. - let rec private SplitTyconDefn (SynTypeDefn(typeInfo=synTyconInfo;typeRepr=trepr; members=extraMembers)) = + let rec private SplitTyconDefn g (SynTypeDefn(typeInfo=synTyconInfo;typeRepr=trepr; members=extraMembers)) = let extraMembers = desugarGetSetMembers extraMembers - let extraMembers, extra_vals_Inherits_Abstractslots = SplitAutoProps extraMembers + let extraMembers, extra_vals_Inherits_Abstractslots = SplitAutoProps g extraMembers let implements1 = extraMembers |> List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None) match trepr with | SynTypeDefnRepr.ObjectModel(kind, members, m) -> let members = desugarGetSetMembers members - CheckMembersForm members + CheckMembersForm members synTyconInfo.Range let fields = members |> List.choose (function SynMemberDefn.ValField (fieldInfo = f) -> Some f | _ -> None) let implements2 = members |> List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None) let inherits = members |> List.choose (function - | SynMemberDefn.Inherit (ty, idOpt, m) -> Some(ty, m, idOpt) - | SynMemberDefn.ImplicitInherit (ty, _, idOpt, m) -> Some(ty, m, idOpt) + | SynMemberDefn.Inherit (Some ty, idOpt, m, _) -> Some(ty, m, idOpt) + | SynMemberDefn.ImplicitInherit (ty, _, idOpt, m, _) -> Some(ty, m, idOpt) | _ -> None) //let nestedTycons = cspec |> List.choose (function SynMemberDefn.NestedType (x, _, _) -> Some x | _ -> None) let slotsigs = members |> List.choose (function SynMemberDefn.AbstractSlot (slotSig = x; flags = y) -> Some(x, y) | _ -> None) - let members,_vals_Inherits_Abstractslots = SplitAutoProps members + let members, _vals_Inherits_Abstractslots = SplitAutoProps g members let isConcrete = members |> List.exists (function @@ -4441,7 +4508,7 @@ module TcDeclarations = let implicitCtorSynPats = members |> List.tryPick (function - | SynMemberDefn.ImplicitCtor (ctorArgs = SynSimplePats.SimplePats _ as spats) -> Some spats + | SynMemberDefn.ImplicitCtor (ctorArgs = pat) -> Some pat | _ -> None) // An ugly bit of code to pre-determine if a type has a nullary constructor, prior to establishing the @@ -4450,7 +4517,7 @@ module TcDeclarations = members |> List.exists (function | SynMemberDefn.Member(memberDefn=SynBinding(valData=SynValData(memberFlags=Some memberFlags); headPat = SynPatForConstructorDecl SynPatForNullaryArgs)) -> memberFlags.MemberKind=SynMemberKind.Constructor - | SynMemberDefn.ImplicitCtor (ctorArgs = SynSimplePats.SimplePats(pats = spats)) -> isNil spats + | SynMemberDefn.ImplicitCtor (ctorArgs = SynPat.Const(SynConst.Unit, _)) -> true | _ -> false) let repr = SynTypeDefnSimpleRepr.General(kind, inherits, slotsigs, fields, isConcrete, isIncrClass, implicitCtorSynPats, m) let isAtOriginalTyconDefn = not (isAugmentationTyconDefnRepr repr) @@ -4471,7 +4538,6 @@ module TcDeclarations = core, extra_vals_Inherits_Abstractslots @ extraMembers //------------------------------------------------------------------------- - /// Bind a collection of mutually recursive definitions in an implementation file let TcMutRecDefinitions (cenv: cenv) envInitial parent typeNames tpenv m scopem mutRecNSInfo (mutRecDefns: MutRecDefnsInitialData) isMutRec = @@ -4479,7 +4545,7 @@ module TcDeclarations = // Split the definitions into "core representations" and "members". The code to process core representations // is shared between processing of signature files and implementation files. - let mutRecDefnsAfterSplit = mutRecDefns |> MutRecShapes.mapTycons SplitTyconDefn + let mutRecDefnsAfterSplit = mutRecDefns |> MutRecShapes.mapTycons (fun i -> SplitTyconDefn g i) // Create the entities for each module and type definition, and process the core representation of each type definition. let tycons, envMutRecPrelim, mutRecDefnsAfterCore = @@ -4720,7 +4786,6 @@ module TcDeclarations = let env = List.foldBack (AddLocalVal g cenv.tcSink scopem) idvs envForDecls env) - /// Bind a collection of mutually recursive declarations in a signature file let TcMutRecSignatureDecls (cenv: cenv) envInitial parent typeNames tpenv m scopem mutRecNSInfo (mutRecSigs: MutRecSigsInitialData) = let mutRecSigsAfterSplit = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature @@ -4732,6 +4797,18 @@ module TcDeclarations = // Updates the types of the modules to contain the contents so far, which now includes values and members MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecNSInfo mutRecDefnsAfterCore + // Generate the union augmentation values for all tycons. + let mutable vals = List.empty + (envMutRec, mutRecDefnsAfterCore) + ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls ((tyconCore, _, _), tyconOpt, _, _, _) -> + let (MutRecDefnsPhase1DataForTycon (isAtOriginalTyconDefn=isAtOriginalTyconDefn)) = tyconCore + match tyconOpt with + | Some tycon when isAtOriginalTyconDefn -> + if tycon.IsUnionTycon && AddAugmentationDeclarations.ShouldAugmentUnion cenv.g tycon then + let vspecs = AddAugmentationDeclarations.AddUnionAugmentationValues cenv envForDecls tycon + vals <- vspecs @ vals + | _ -> ()) + // By now we've established the full contents of type definitions apart from their // members and any fields determined by implicit construction. We know the kinds and // representations of types and have established them as valid. @@ -4740,28 +4817,19 @@ module TcDeclarations = // // Note: This environment reconstruction doesn't seem necessary. We're about to create Val's for all members, // which does require type checking, but no more information than is already available. - let envMutRecPrelimWithReprs, withEnvs = + + let envMutRecPrelimWithReprs, withEnvs = (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterCore) - ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs - (fun (_, tyconOpt, _, _, _) -> tyconOpt) - (fun _binds -> [ (* no values are available yet *) ]) - cenv true scopem m + ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs + (fun (_, tyconOpt, _, _, _) -> tyconOpt) + (fun _binds -> vals) + cenv true scopem m let mutRecDefnsAfterVals = TcMutRecSignatureDecls_Phase2 cenv scopem envMutRecPrelimWithReprs withEnvs // Updates the types of the modules to contain the contents so far, which now includes values and members MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecNSInfo mutRecDefnsAfterVals - // Generate the union augmentation values for all tycons. - (envMutRec, mutRecDefnsAfterCore) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls ((tyconCore, _, _), tyconOpt, _, _, _) -> - let (MutRecDefnsPhase1DataForTycon (isAtOriginalTyconDefn=isAtOriginalTyconDefn)) = tyconCore - match tyconOpt with - | Some tycon when isAtOriginalTyconDefn -> - if tycon.IsUnionTycon && AddAugmentationDeclarations.ShouldAugmentUnion cenv.g tycon then - let vspecs = AddAugmentationDeclarations.AddUnionAugmentationValues cenv envForDecls tycon - ignore vspecs - | _ -> ()) - envMutRec //------------------------------------------------------------------------- @@ -4779,7 +4847,7 @@ let rec TcSignatureElementNonMutRec (cenv: cenv) parent typeNames endm (env: TcE return env | SynModuleSigDecl.Types (typeSpecs, m) -> - CheckDuplicatesAbstractMethodParmsSig typeSpecs + CheckDuplicatesAbstractMethodParamsSig typeSpecs let scopem = unionRanges m endm let mutRecDefns = typeSpecs |> List.map MutRecShape.Tycon let env = TcDeclarations.TcMutRecSignatureDecls cenv env parent typeNames emptyUnscopedTyparEnv m scopem None mutRecDefns @@ -4809,7 +4877,7 @@ let rec TcSignatureElementNonMutRec (cenv: cenv) parent typeNames endm (env: TcE return! TcSignatureElementsMutRec cenv parent typeNames endm None env [modDecl] else let id = ComputeModuleName longPath - let vis, _ = ComputeAccessAndCompPath env None im vis None parent + let vis, _ = ComputeAccessAndCompPath g env None im vis None parent let attribs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs CheckNamespaceModuleOrTypeName g id let moduleKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind g true typeNames attribs id.idText @@ -4888,7 +4956,7 @@ let rec TcSignatureElementNonMutRec (cenv: cenv) parent typeNames endm (env: TcE modulNSs |> List.iter (fun moduleEntity -> let modref = mkLocalModuleRef moduleEntity let item = Item.ModuleOrNamespaces [modref] - CallNameResolutionSink cenv.tcSink (moduleEntity.Range, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights)) + CallNameResolutionSink cenv.tcSink (moduleEntity.Range, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights)) // For 'namespace rec' and 'module rec' we add the thing being defined let envNS = if isRec then AddLocalRootModuleOrNamespace cenv.tcSink g cenv.amap m envNS modTyRoot else envNS @@ -4953,7 +5021,7 @@ and TcSignatureElementsMutRec cenv parent typeNames m mutRecNSInfo envInitial (d ((true, true), defs) ||> List.collectFold (fun (openOk, moduleAbbrevOk) def -> match def with | SynModuleSigDecl.Types (typeSpecs, _) -> - CheckDuplicatesAbstractMethodParmsSig typeSpecs + CheckDuplicatesAbstractMethodParamsSig typeSpecs let decls = typeSpecs |> List.map MutRecShape.Tycon decls, (false, false) @@ -5057,8 +5125,106 @@ let CheckLetOrDoInNamespace binds m = | _ -> error(Error(FSComp.SR.tcNamespaceCannotContainValues(), binds.Head.RangeOfHeadPattern)) +let rec TcMutRecDefsFinish cenv defs m = + let opens = + [ for def in defs do + match def with + | MutRecShape.Open (MutRecDataForOpen (_target, _m, _moduleRange, openDeclsRef)) -> + yield! openDeclsRef.Value + | _ -> () ] + + let tycons = defs |> List.choose (function MutRecShape.Tycon (Some tycon, _) -> Some tycon | _ -> None) + + let binds = + defs |> List.collect (function + | MutRecShape.Open _ -> [] + | MutRecShape.ModuleAbbrev _ -> [] + | MutRecShape.Tycon (_, binds) + | MutRecShape.Lets binds -> + binds |> List.map ModuleOrNamespaceBinding.Binding + | MutRecShape.Module ((MutRecDefnsPhase2DataForModule(moduleTyAcc, moduleEntity), _), moduleDefs) -> + let moduleContents = TcMutRecDefsFinish cenv moduleDefs m + moduleEntity.entity_modul_type <- MaybeLazy.Strict moduleTyAcc.Value + [ ModuleOrNamespaceBinding.Module(moduleEntity, moduleContents) ]) + + TMDefRec(true, opens, tycons, binds, m) + +/// The mutually recursive case for a sequence of declarations (and nested modules) +let TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial mutRecNSInfo (defs: SynModuleDecl list) = + let m = match defs with [] -> m | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges + let scopem = (defs, m) ||> List.foldBack (fun h m -> unionRanges h.Range m) + + let mutRecDefns, (_, _, Attributes synAttrs) = + let rec loop isNamespace moduleRange attrs defs: MutRecDefnsInitialData * _ = + ((true, true, attrs), defs) ||> List.collectFold (fun (openOk, moduleAbbrevOk, attrs) def -> + match ElimSynModuleDeclExpr def with + + | SynModuleDecl.Types (typeDefs, _) -> + let decls = typeDefs |> List.map MutRecShape.Tycon + decls, (false, false, attrs) + + | SynModuleDecl.Let (letrec, binds, m) -> + let binds = + if isNamespace then + CheckLetOrDoInNamespace binds m; [] + else + if letrec then [MutRecShape.Lets binds] + else List.map (List.singleton >> MutRecShape.Lets) binds + binds, (false, false, attrs) + + | SynModuleDecl.NestedModule(moduleInfo = (SynComponentInfo(longId = []))) -> + [], (openOk, moduleAbbrevOk, attrs) + + | SynModuleDecl.NestedModule(moduleInfo=compInfo; isRecursive=isRec; decls=synDefs; range=moduleRange) -> + if isRec then warning(Error(FSComp.SR.tcRecImplied(), compInfo.Range)) + let mutRecDefs, (_, _, attrs) = loop false moduleRange attrs synDefs + let decls = [MutRecShape.Module (compInfo, mutRecDefs)] + decls, (false, false, attrs) + + | SynModuleDecl.Open (target, m) -> + if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(), m)) + let decls = [ MutRecShape.Open (MutRecDataForOpen(target, m, moduleRange, ref [])) ] + decls, (openOk, moduleAbbrevOk, attrs) + + | SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) -> + let members = desugarGetSetMembers members + let (SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=SynIdent(id,_)), _repr, xmlDoc, vis, m)) = repr + let compInfo = SynComponentInfo(synAttrs, None, [], [id], xmlDoc, false, vis, id.idRange) + let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, None, m, SynTypeDefnTrivia.Zero)) ] + decls, (false, false, attrs) + + | SynModuleDecl.HashDirective _ -> + [ ], (openOk, moduleAbbrevOk, attrs) + + | SynModuleDecl.Attributes (synAttrs, _) -> + [ ], (false, false, synAttrs) + + | SynModuleDecl.ModuleAbbrev (id, p, m) -> + if not moduleAbbrevOk then errorR(Error(FSComp.SR.tcModuleAbbrevFirstInMutRec(), m)) + let decls = [ MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev(id, p, m)) ] + decls, (false, moduleAbbrevOk, attrs) + + | SynModuleDecl.Expr _ -> failwith "unreachable: SynModuleDecl.Expr - ElimSynModuleDeclExpr" + + | SynModuleDecl.NamespaceFragment _ as d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(), d.Range))) + + loop (match parent with ParentNone -> true | Parent _ -> false) m [] defs + + let tpenv = emptyUnscopedTyparEnv + let mutRecDefnsChecked, envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent typeNames tpenv m scopem mutRecNSInfo mutRecDefns true + + // Check the assembly attributes + let attrs, _ = TcAttributesWithPossibleTargets TcCanFail.ReportAllErrors cenv envAfter AttributeTargets.Top synAttrs + + // Check the non-escaping condition as we build the list of module expressions on the way back up + let moduleContents = TcMutRecDefsFinish cenv mutRecDefnsChecked m + let escapeCheck () = + TcMutRecDefnsEscapeCheck mutRecDefnsChecked envInitial + + ([ moduleContents ], [ escapeCheck ], attrs), envAfter, envAfter + /// The non-mutually recursive case for a declaration -let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem env synDecl = +let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem env synDecl = cancellable { let g = cenv.g cenv.synArgNameGenerator.Reset() @@ -5073,7 +5239,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem return ([], [], []), env, env | SynModuleDecl.Exception (SynExceptionDefn(SynExceptionDefnRepr(caseName = SynUnionCase(ident = SynIdent(id, _))) as exnRepr, withKeyword, ms, mExDefn), m) -> - if id.idText = "" then + if String.IsNullOrEmpty(id.idText) then return ([], [], []), env, env else let edef = SynExceptionDefn(exnRepr, withKeyword, desugarGetSetMembers ms, mExDefn) @@ -5125,7 +5291,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem return! failwith "unreachable" | SynModuleDecl.Attributes (Attributes synAttrs, _) -> - let attrs, _ = TcAttributesWithPossibleTargets false cenv env AttributeTargets.Top synAttrs + let attrs, _ = TcAttributesWithPossibleTargets TcCanFail.ReportAllErrors cenv env AttributeTargets.Top synAttrs return ([], [], attrs), env, env | SynModuleDecl.HashDirective _ -> @@ -5140,7 +5306,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem if isRec then assert (not isContinuingModule) let modDecl = SynModuleDecl.NestedModule(compInfo, false, moduleDefs, isContinuingModule, m, trivia) - return! TcModuleOrNamespaceElementsMutRec cenv parent typeNames m env None [modDecl] + return TcModuleOrNamespaceElementsMutRec cenv parent typeNames m env None [modDecl] else let (SynComponentInfo(Attributes attribs, _, _, longPath, xml, _, vis, im)) = compInfo let id = ComputeModuleName longPath @@ -5150,7 +5316,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem let modName = EstablishTypeDefinitionCores.AdjustModuleName moduleKind id.idText CheckForDuplicateConcreteType env modName im CheckForDuplicateModule env id.idText id.idRange - let vis, _ = ComputeAccessAndCompPath env None id.idRange vis None parent + let vis, _ = ComputeAccessAndCompPath g env None id.idRange vis None parent let endm = m.EndRange let id = ident (modName, id.idRange) @@ -5168,7 +5334,9 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem let moduleEntity = Construct.NewModuleOrNamespace (Some env.eCompPath) vis id xmlDoc modAttrs (MaybeLazy.Strict moduleTy) // Now typecheck. - let! moduleContents, topAttrsNew, envAtEnd = TcModuleOrNamespaceElements cenv (Parent (mkLocalModuleRef moduleEntity)) endm envForModule xml None [] moduleDefs + let! moduleContents, topAttrsNew, envAtEnd = + TcModuleOrNamespaceElements cenv (Parent (mkLocalModuleRef moduleEntity)) endm envForModule xml None [] moduleDefs + |> cenv.stackGuard.GuardCancellable // Get the inferred type of the decls and record it in the modul. moduleEntity.entity_modul_type <- MaybeLazy.Strict moduleTyAcc.Value @@ -5250,14 +5418,16 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem modulNSs |> List.iter (fun moduleEntity -> let modref = mkLocalModuleRef moduleEntity let item = Item.ModuleOrNamespaces [modref] - CallNameResolutionSink cenv.tcSink (moduleEntity.Range, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights)) + CallNameResolutionSink cenv.tcSink (moduleEntity.Range, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights)) // For 'namespace rec' and 'module rec' we add the thing being defined let envNS = if isRec then AddLocalRootModuleOrNamespace cenv.tcSink g cenv.amap m envNS modTyRoot else envNS let nsInfo = Some (modulNSOpt, envNS.eModuleOrNamespaceTypeAccumulator) let mutRecNSInfo = if isRec then nsInfo else None - let! moduleContents, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envNS xml mutRecNSInfo [] defs + let! moduleContents, topAttrs, envAtEnd = + TcModuleOrNamespaceElements cenv parent endm envNS xml mutRecNSInfo [] defs + |> cenv.stackGuard.GuardCancellable MutRecBindingChecking.TcMutRecDefns_UpdateNSContents nsInfo let env, openDecls = @@ -5293,124 +5463,30 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem } /// The non-mutually recursive case for a sequence of declarations -and TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm (defsSoFar, env, envAtEnd) (moreDefs: SynModuleDecl list) = - cancellable { - match moreDefs with - | firstDef :: otherDefs -> - // Lookahead one to find out the scope of the next declaration. - let scopem = - if isNil otherDefs then unionRanges firstDef.Range endm - else unionRanges (List.head otherDefs).Range endm - - let! firstDef, env, envAtEnd = TcModuleOrNamespaceElementNonMutRec cenv parent typeNames scopem env firstDef - - // tail recursive - return! TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm ( (firstDef :: defsSoFar), env, envAtEnd) otherDefs - | [] -> - return List.rev defsSoFar, envAtEnd - } - -/// The mutually recursive case for a sequence of declarations (and nested modules) -and TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial mutRecNSInfo (defs: SynModuleDecl list) = - cancellable { - - let m = match defs with [] -> m | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges - let scopem = (defs, m) ||> List.foldBack (fun h m -> unionRanges h.Range m) +and [] TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm (defsSoFar, env, envAtEnd) (moreDefs: SynModuleDecl list) (ct: CancellationToken) = - let mutRecDefns, (_, _, Attributes synAttrs) = - let rec loop isNamespace moduleRange attrs defs: MutRecDefnsInitialData * _ = - ((true, true, attrs), defs) ||> List.collectFold (fun (openOk, moduleAbbrevOk, attrs) def -> - match ElimSynModuleDeclExpr def with - - | SynModuleDecl.Types (typeDefs, _) -> - let decls = typeDefs |> List.map MutRecShape.Tycon - decls, (false, false, attrs) - - | SynModuleDecl.Let (letrec, binds, m) -> - let binds = - if isNamespace then - CheckLetOrDoInNamespace binds m; [] - else - if letrec then [MutRecShape.Lets binds] - else List.map (List.singleton >> MutRecShape.Lets) binds - binds, (false, false, attrs) - - | SynModuleDecl.NestedModule(moduleInfo = (SynComponentInfo(longId = []))) -> - [], (openOk, moduleAbbrevOk, attrs) - - | SynModuleDecl.NestedModule(moduleInfo=compInfo; isRecursive=isRec; decls=synDefs; range=moduleRange) -> - if isRec then warning(Error(FSComp.SR.tcRecImplied(), compInfo.Range)) - let mutRecDefs, (_, _, attrs) = loop false moduleRange attrs synDefs - let decls = [MutRecShape.Module (compInfo, mutRecDefs)] - decls, (false, false, attrs) - - | SynModuleDecl.Open (target, m) -> - if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(), m)) - let decls = [ MutRecShape.Open (MutRecDataForOpen(target, m, moduleRange, ref [])) ] - decls, (openOk, moduleAbbrevOk, attrs) - - | SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) -> - let members = desugarGetSetMembers members - let (SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=SynIdent(id,_)), _repr, xmlDoc, vis, m)) = repr - let compInfo = SynComponentInfo(synAttrs, None, [], [id], xmlDoc, false, vis, id.idRange) - let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, None, m, SynTypeDefnTrivia.Zero)) ] - decls, (false, false, attrs) - - | SynModuleDecl.HashDirective _ -> - [ ], (openOk, moduleAbbrevOk, attrs) - - | SynModuleDecl.Attributes (synAttrs, _) -> - [ ], (false, false, synAttrs) - - | SynModuleDecl.ModuleAbbrev (id, p, m) -> - if not moduleAbbrevOk then errorR(Error(FSComp.SR.tcModuleAbbrevFirstInMutRec(), m)) - let decls = [ MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev(id, p, m)) ] - decls, (false, moduleAbbrevOk, attrs) - - | SynModuleDecl.Expr _ -> failwith "unreachable: SynModuleDecl.Expr - ElimSynModuleDeclExpr" - - | SynModuleDecl.NamespaceFragment _ as d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(), d.Range))) - - loop (match parent with ParentNone -> true | Parent _ -> false) m [] defs - - let tpenv = emptyUnscopedTyparEnv - let mutRecDefnsChecked, envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent typeNames tpenv m scopem mutRecNSInfo mutRecDefns true - - // Check the assembly attributes - let attrs, _ = TcAttributesWithPossibleTargets false cenv envAfter AttributeTargets.Top synAttrs - - // Check the non-escaping condition as we build the list of module expressions on the way back up - let moduleContents = TcMutRecDefsFinish cenv mutRecDefnsChecked m - let escapeCheck () = - TcMutRecDefnsEscapeCheck mutRecDefnsChecked envInitial - - return ([ moduleContents ], [ escapeCheck ], attrs), envAfter, envAfter - - } - -and TcMutRecDefsFinish cenv defs m = - let opens = - [ for def in defs do - match def with - | MutRecShape.Open (MutRecDataForOpen (_target, _m, _moduleRange, openDeclsRef)) -> - yield! openDeclsRef.Value - | _ -> () ] + if ct.IsCancellationRequested then + ValueOrCancelled.Cancelled (OperationCanceledException()) + else + match moreDefs with + | [] -> + ValueOrCancelled.Value (List.rev defsSoFar, envAtEnd) + | firstDef :: otherDefs -> + // Lookahead one to find out the scope of the next declaration. + let scopem = + if isNil otherDefs then + unionRanges firstDef.Range endm + else + unionRanges (List.head otherDefs).Range endm - let tycons = defs |> List.choose (function MutRecShape.Tycon (Some tycon, _) -> Some tycon | _ -> None) + let result = Cancellable.run ct (TcModuleOrNamespaceElementNonMutRec cenv parent typeNames scopem env firstDef |> cenv.stackGuard.GuardCancellable) - let binds = - defs |> List.collect (function - | MutRecShape.Open _ -> [] - | MutRecShape.ModuleAbbrev _ -> [] - | MutRecShape.Tycon (_, binds) - | MutRecShape.Lets binds -> - binds |> List.map ModuleOrNamespaceBinding.Binding - | MutRecShape.Module ((MutRecDefnsPhase2DataForModule(moduleTyAcc, moduleEntity), _), moduleDefs) -> - let moduleContents = TcMutRecDefsFinish cenv moduleDefs m - moduleEntity.entity_modul_type <- MaybeLazy.Strict moduleTyAcc.Value - [ ModuleOrNamespaceBinding.Module(moduleEntity, moduleContents) ]) + match result with + | ValueOrCancelled.Cancelled x -> + ValueOrCancelled.Cancelled x + | ValueOrCancelled.Value(firstDef, env, envAtEnd) -> + TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm ((firstDef :: defsSoFar), env, envAtEnd) otherDefs ct - TMDefRec(true, opens, tycons, binds, m) and TcModuleOrNamespaceElements cenv parent endm env xml mutRecNSInfo openDecls0 synModuleDecls = cancellable { @@ -5425,7 +5501,8 @@ and TcModuleOrNamespaceElements cenv parent endm env xml mutRecNSInfo openDecls0 match mutRecNSInfo with | Some _ -> - let! (moduleDefs, escapeChecks, topAttrsNew), _, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parent typeNames endm env mutRecNSInfo synModuleDecls + let (moduleDefs, escapeChecks, topAttrsNew), _, envAtEnd = + TcModuleOrNamespaceElementsMutRec cenv parent typeNames endm env mutRecNSInfo synModuleDecls let moduleContents = TMDefs(moduleDefs) // Run the escape checks (for compat run in reverse order) do @@ -5433,20 +5510,24 @@ and TcModuleOrNamespaceElements cenv parent endm env xml mutRecNSInfo openDecls0 escapeCheck() return (moduleContents, topAttrsNew, envAtEnd) - | None -> - - let! compiledDefs, envAtEnd = TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm ([], env, env) synModuleDecls - - // Apply the functions for each declaration to build the overall expression-builder - let moduleDefs = List.collect p13 compiledDefs - let moduleDefs = match openDecls0 with [] -> moduleDefs | _ -> TMDefOpens openDecls0 :: moduleDefs - let moduleContents = TMDefs moduleDefs + | None -> + let! ct = Cancellable.token () + let result = TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm ([], env, env) synModuleDecls ct + + match result with + | ValueOrCancelled.Value(compiledDefs, envAtEnd) -> + // Apply the functions for each declaration to build the overall expression-builder + let moduleDefs = List.collect p13 compiledDefs + let moduleDefs = match openDecls0 with [] -> moduleDefs | _ -> TMDefOpens openDecls0 :: moduleDefs + let moduleContents = TMDefs moduleDefs + + // Collect up the attributes that are global to the file + let topAttrsNew = List.collect p33 compiledDefs + return (moduleContents, topAttrsNew, envAtEnd) + | ValueOrCancelled.Cancelled x -> + return! Cancellable(fun _ -> ValueOrCancelled.Cancelled x) + } - // Collect up the attributes that are global to the file - let topAttrsNew = compiledDefs |> List.collect p33 - return (moduleContents, topAttrsNew, envAtEnd) - } - //-------------------------------------------------------------------------- // CheckOneImplFile - Typecheck all the namespace fragments in a file. @@ -5503,7 +5584,8 @@ let emptyTcEnv g = eCtorInfo = None eCallerMemberName = None eLambdaArgInfos = [] - eIsControlFlow = false } + eIsControlFlow = false + eCachedImplicitYieldExpressions = HashMultiMap(HashIdentity.Structural, useConcurrentDictionary = true) } let CreateInitialTcEnv(g, amap, scopem, assemblyName, ccus) = (emptyTcEnv g, ccus) ||> List.collectFold (fun env (ccu, autoOpens, internalsVisible) -> @@ -5577,7 +5659,7 @@ let CheckValueRestriction denvAtEnd infoReader rootSigOpt implFileTypePriorToSig // for example FSharp 1.0 3661. (match v.ValReprInfo with None -> true | Some tvi -> tvi.HasNoArgs)) then match ftyvs with - | tp :: _ -> errorR (ValueRestriction(denvAtEnd, infoReader, false, v, tp, v.Range)) + | tp :: _ -> errorR (ValueRestriction(denvAtEnd, infoReader, v, tp, v.Range)) | _ -> () mty.ModuleAndNamespaceDefinitions |> List.iter (fun v -> check v.ModuleOrNamespaceType) try check implFileTypePriorToSig with RecoverableException e -> errorRecovery e m @@ -5590,7 +5672,7 @@ let SolveInternalUnknowns g (cenv: cenv) denvAtEnd moduleContents extraAttribs = if (tp.Rigidity <> TyparRigidity.Rigid) && not tp.IsSolved then ChooseTyparSolutionAndSolve cenv.css denvAtEnd tp -let CheckModuleSignature g (cenv: cenv) m denvAtEnd rootSigOpt implFileTypePriorToSig implFileSpecPriorToSig moduleContents = +let CheckModuleSignature g (cenv: cenv) m denvAtEnd rootSigOpt implFileTypePriorToSig implFileSpecPriorToSig moduleContents fileName qualifiedNameOfFile = match rootSigOpt with | None -> // Deep copy the inferred type of the module @@ -5598,7 +5680,13 @@ let CheckModuleSignature g (cenv: cenv) m denvAtEnd rootSigOpt implFileTypePrior (implFileTypePriorToSigCopied, moduleContents) - | Some sigFileType -> + | Some sigFileType -> + use _ = + Activity.start "CheckDeclarations.CheckModuleSignature" + [| + Activity.Tags.fileName, fileName + Activity.Tags.qualifiedNameOfFile, qualifiedNameOfFile + |] // We want to show imperative type variables in any types in error messages at this late point let denv = { denvAtEnd with showInferenceTyparAnnotations=true } @@ -5658,7 +5746,10 @@ let CheckOneImplFile |] let cenv = cenv.Create (g, isScript, amap, thisCcu, false, Option.isSome rootSigOpt, - conditionalDefines, tcSink, (LightweightTcValForUsingInBuildMethodCall g), isInternalTestSpanStackReferring, + conditionalDefines, + tcSink, + LightweightTcValForUsingInBuildMethodCall g, + isInternalTestSpanStackReferring, diagnosticOptions, tcPat=TcPat, tcSimplePats=TcSimplePats, @@ -5669,7 +5760,9 @@ let CheckOneImplFile let envinner, moduleTyAcc = MakeInitialEnv env let defs = [ for x in implFileFrags -> SynModuleDecl.NamespaceFragment x ] - let! moduleContents, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDoc.Empty None openDecls0 defs + let! moduleContents, topAttrs, envAtEnd = + TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDoc.Empty None openDecls0 defs + |> cenv.stackGuard.GuardCancellable let implFileTypePriorToSig = moduleTyAcc.Value @@ -5724,7 +5817,7 @@ let CheckOneImplFile // Check the module matches the signature let implFileTy, implFileContents = conditionallySuppressErrorReporting (checkForErrors()) (fun () -> - CheckModuleSignature g cenv m denvAtEnd rootSigOpt implFileTypePriorToSig implFileSpecPriorToSig moduleContents) + CheckModuleSignature g cenv m denvAtEnd rootSigOpt implFileTypePriorToSig implFileSpecPriorToSig moduleContents fileName qualNameOfFile.Text) do conditionallySuppressErrorReporting (checkForErrors()) (fun () -> @@ -5744,8 +5837,14 @@ let CheckOneImplFile try let reportErrors = not (checkForErrors()) let tcVal = LightweightTcValForUsingInBuildMethodCall g + use _ = + Activity.start "PostTypeCheckSemanticChecks.CheckImplFile" + [| + Activity.Tags.fileName, fileName + Activity.Tags.qualifiedNameOfFile, qualNameOfFile.Text + |] PostTypeCheckSemanticChecks.CheckImplFile - (g, cenv.amap, reportErrors, cenv.infoReader, + (g, cenv.amap, reportErrors, cenv.infoReader, env.eInternalsVisibleCompPaths, cenv.thisCcu, tcVal, envAtEnd.DisplayEnv, implFileTy, implFileContents, extraAttribs, isLastCompiland, isInternalTestSpanStackReferring) @@ -5791,23 +5890,25 @@ let CheckOneSigFile (g, amap, thisCcu, checkForErrors, conditionalDefines, tcSin Activity.Tags.qualifiedNameOfFile, sigFile.QualifiedName.Text |] let cenv = - cenv.Create - (g, false, amap, thisCcu, true, false, conditionalDefines, tcSink, - (LightweightTcValForUsingInBuildMethodCall g), isInternalTestSpanStackReferring, - diagnosticOptions, - tcPat=TcPat, - tcSimplePats=TcSimplePats, - tcSequenceExpressionEntry=TcSequenceExpressionEntry, - tcArrayOrListSequenceExpression=TcArrayOrListComputedExpression, - tcComputationExpression=TcComputationExpression) + cenv.Create(g, false, amap, thisCcu, true, false, + conditionalDefines, + tcSink, + LightweightTcValForUsingInBuildMethodCall g, + isInternalTestSpanStackReferring, + diagnosticOptions, + tcPat=TcPat, + tcSimplePats=TcSimplePats, + tcSequenceExpressionEntry=TcSequenceExpressionEntry, + tcArrayOrListSequenceExpression=TcArrayOrListComputedExpression, + tcComputationExpression=TcComputationExpression) let envinner, moduleTyAcc = MakeInitialEnv tcEnv - + let m = sigFile.QualifiedName.Range let specs = [ for x in sigFile.Contents -> SynModuleSigDecl.NamespaceFragment x ] - let! tcEnv = TcSignatureElements cenv ParentNone sigFile.QualifiedName.Range envinner PreXmlDoc.Empty None specs - - let sigFileType = moduleTyAcc.Value + let! tcEnv = TcSignatureElements cenv ParentNone m envinner PreXmlDoc.Empty None specs + let sigFileType = moduleTyAcc.Value + if not (checkForErrors()) then try sigFileType |> IterTyconsOfModuleOrNamespaceType (fun tycon -> diff --git a/src/fcs-fable/src/Compiler/Checking/CheckFormatStrings.fs b/src/fcs-fable/src/Compiler/Checking/CheckFormatStrings.fs index e32d073cbd..e0555ef2a7 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckFormatStrings.fs +++ b/src/fcs-fable/src/Compiler/Checking/CheckFormatStrings.fs @@ -2,6 +2,7 @@ module internal FSharp.Compiler.CheckFormatStrings +open System open System.Text open Internal.Utilities.Library open Internal.Utilities.Library.Extras @@ -58,7 +59,7 @@ let escapeDotnetFormatString str = [] let (|PrefixedBy|_|) (prefix: string) (str: string) = - if str.StartsWith prefix then + if str.StartsWithOrdinal(prefix) then ValueSome prefix.Length else ValueNone @@ -358,10 +359,10 @@ let parseFormatStringInternal let acc = if widthArg then (Option.map ((+)1) posi, g.int_ty) :: acc else acc let checkOtherFlags c = - if info.precision then failwith (FSComp.SR.forFormatDoesntSupportPrecision(c.ToString())) - if info.addZeros then failwith (FSComp.SR.forDoesNotSupportZeroFlag(c.ToString())) + if info.precision then failwith (FSComp.SR.forFormatDoesntSupportPrecision(c.ToString() |> string)) + if info.addZeros then failwith (FSComp.SR.forDoesNotSupportZeroFlag(c.ToString() |> string)) match info.numPrefixIfPos with - | Some n -> failwith (FSComp.SR.forDoesNotSupportPrefixFlag(c.ToString(), n.ToString())) + | Some n -> failwith (FSComp.SR.forDoesNotSupportPrefixFlag(c.ToString() |> string, n.ToString())) | None -> () let skipPossibleInterpolationHole pos = Parse.skipPossibleInterpolationHole isInterpolated isFormattableString fmt pos @@ -370,12 +371,12 @@ let parseFormatStringInternal // type checker. They should always have '(...)' after for format string. let requireAndSkipInterpolationHoleFormat i = if i < len && fmt[i] = '(' then - let i2 = fmt.IndexOf(")", i+1) + let i2 = fmt.IndexOfOrdinal(")", i+1) if i2 = -1 then failwith (FSComp.SR.forFormatInvalidForInterpolated3()) else let dotnetAlignment = match widthValue with None -> "" | Some w -> "," + (if info.leftJustify then "-" else "") + string w - let dotnetNumberFormat = match fmt[i+1..i2-1] with "" -> "" | s -> ":" + s + let dotnetNumberFormat = match fmt[i+1..i2-1] with s when String.IsNullOrEmpty(s) -> "" | s -> ":" + s appendToDotnetFormatString ("{" + string dotnetFormatStringInterpolationHoleCount + dotnetAlignment + dotnetNumberFormat + "}") dotnetFormatStringInterpolationHoleCount <- dotnetFormatStringInterpolationHoleCount + 1 i2+1 @@ -448,7 +449,8 @@ let parseFormatStringInternal checkOtherFlags ch collectSpecifierLocation fragLine fragCol 1 let i = skipPossibleInterpolationHole (i+1) - parseLoop ((posi, g.string_ty) :: acc) (i, fragLine, fragCol+1) fragments + let stringTy = if g.checkNullness && g.langFeatureNullness then g.string_ty_ambivalent else g.string_ty + parseLoop ((posi, stringTy) :: acc) (i, fragLine, fragCol+1) fragments | 'O' -> checkOtherFlags ch diff --git a/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fs b/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fs index 8ef4d3734f..5630fc2d4c 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fs +++ b/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fs @@ -5,6 +5,7 @@ module internal FSharp.Compiler.CheckIncrementalClasses open System open FSharp.Compiler.Diagnostics +open FSharp.Compiler.Features open Internal.Utilities.Collections open Internal.Utilities.Library open Internal.Utilities.Library.Extras @@ -123,7 +124,7 @@ let TcStaticImplicitCtorInfo_Phase2A(cenv: cenv, env, tcref: TyconRef, m, copyOf /// Check and elaborate the "left hand side" of the implicit class construction /// syntax. -let TcImplicitCtorInfo_Phase2A(cenv: cenv, env, tpenv, tcref: TyconRef, vis, attrs, spats, thisIdOpt, baseValOpt: Val option, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy, xmlDoc: PreXmlDoc) = +let TcImplicitCtorInfo_Phase2A(cenv: cenv, env, tpenv, tcref: TyconRef, vis, attrs, pat: SynPat, thisIdOpt, baseValOpt: Val option, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy, xmlDoc: PreXmlDoc) = let g = cenv.g let baseValOpt = @@ -135,16 +136,30 @@ let TcImplicitCtorInfo_Phase2A(cenv: cenv, env, tpenv, tcref: TyconRef, vis, att let env = AddDeclaredTypars CheckForDuplicateTypars copyOfTyconTypars env // Type check arguments by processing them as 'simple' patterns - // NOTE: if we allow richer patterns here this is where we'd process those patterns - let ctorArgNames, patEnv = TcSimplePatsOfUnknownType cenv true CheckCxs env tpenv (SynSimplePats.SimplePats (spats, [], m)) + let ctorArgNames, patEnv, SynSimplePats.SimplePats(spats, _, _) = TcSimplePatsOfUnknownType cenv true CheckCxs env tpenv pat + + let rec reportGeneratedPattern spat = + match spat with + | SynSimplePat.Id(_, _, isCompilerGenerated, _, _, m) -> + if isCompilerGenerated then + errorR (Error(FSComp.SR.parsOnlySimplePatternsAreAllowedInConstructors(), m)) + + | SynSimplePat.Typed(pat, _, _) + | SynSimplePat.Attrib(pat, _, _) -> + reportGeneratedPattern pat + + for spat in spats do + reportGeneratedPattern spat let (TcPatLinearEnv(_, names, _)) = patEnv // Create the values with the given names let _, vspecs = MakeAndPublishSimpleVals cenv env names - if tcref.IsStructOrEnumTycon && isNil spats then + match tcref.IsStructOrEnumTycon, pat with + | true, SynPat.Const(SynConst.Unit, _) -> errorR (ParameterlessStructCtor(tcref.Range)) + | _ -> () // Put them in order let ctorArgs = List.map (fun v -> NameMap.find v vspecs) ctorArgNames @@ -159,7 +174,13 @@ let TcImplicitCtorInfo_Phase2A(cenv: cenv, env, tpenv, tcref: TyconRef, vis, att let ctorTy = mkFunTy g argTy objTy // NOTE: no attributes can currently be specified for the implicit constructor - let attribs = TcAttributes cenv env (AttributeTargets.Constructor ||| AttributeTargets.Method) attrs + let attribs = + // Implicit constructors can only target AttributeTargets.Constructor + if g.langVersion.SupportsFeature(LanguageFeature.EnforceAttributeTargets) then + TcAttributes cenv env AttributeTargets.Constructor attrs + else + TcAttributes cenv env (AttributeTargets.Constructor ||| AttributeTargets.Method) attrs + let memberFlags = CtorMemberFlags let synArgInfos = List.map (SynInfo.InferSynArgInfoFromSimplePat []) spats @@ -277,13 +298,15 @@ type IncrClassReprInfo = /// The vars forced to be fields due to static member bindings, instance initialization expressions or instance member bindings /// The vars forced to be fields due to instance member bindings /// + /// /// member localRep.ChooseRepresentation (cenv: cenv, env: TcEnv, isStatic, isCtorArg, staticCtorInfo: StaticCtorInfo, ctorInfoOpt: IncrClassCtorInfo option, staticForcedFieldVars: FreeLocals, instanceForcedFieldVars: FreeLocals, - takenFieldNames: Set, + takenFieldNames: Set, + declKind: DeclKind, bind: Binding) = let g = cenv.g let v = bind.Var @@ -373,7 +396,7 @@ type IncrClassReprInfo = // it a "member" in the F# sense, but the F# spec says it is generated and it is reasonable to reflect on it. let memberValScheme = ValScheme(id, prelimTyschemeG, Some valReprInfo, None, Some memberInfo, false, ValInline.Never, NormalVal, None, true (* isCompilerGenerated *), true (* isIncrClass *), false, false) - let methodVal = MakeAndPublishVal cenv env (Parent tcref, false, ModuleOrMemberBinding, ValNotInRecScope, memberValScheme, v.Attribs, XmlDoc.Empty, None, false) + let methodVal = MakeAndPublishVal cenv env (Parent tcref, false, declKind, ValNotInRecScope, memberValScheme, v.Attribs, XmlDoc.Empty, None, false) reportIfUnused() InMethod(isStatic, methodVal, valReprInfo) @@ -381,9 +404,9 @@ type IncrClassReprInfo = repr, takenFieldNames /// Extend the known local representations by choosing a representation for a binding - member localRep.ChooseAndAddRepresentation(cenv, env, isStatic, isCtorArg, staticCtorInfo, ctorInfoOpt, staticForcedFieldVars, instanceForcedFieldVars, bind: Binding) = + member localRep.ChooseAndAddRepresentation(cenv, env, isStatic, isCtorArg, staticCtorInfo, ctorInfoOpt, staticForcedFieldVars, instanceForcedFieldVars, declKind, bind: Binding) = let v = bind.Var - let repr, takenFieldNames = localRep.ChooseRepresentation (cenv, env, isStatic, isCtorArg, staticCtorInfo, ctorInfoOpt, staticForcedFieldVars, instanceForcedFieldVars, localRep.TakenFieldNames, bind ) + let repr, takenFieldNames = localRep.ChooseRepresentation (cenv, env, isStatic, isCtorArg, staticCtorInfo, ctorInfoOpt, staticForcedFieldVars, instanceForcedFieldVars, localRep.TakenFieldNames, declKind, bind ) // OK, representation chosen, now add it {localRep with TakenFieldNames=takenFieldNames @@ -425,7 +448,7 @@ type IncrClassReprInfo = | InMethod(isStatic, methodVal, valReprInfo), _ -> //dprintfn "Rewriting application of %s to be call to method %s" v.LogicalName methodVal.LogicalName let expr, exprTy = AdjustValForExpectedValReprInfo g m (mkLocalValRef methodVal) NormalValUse valReprInfo - // Prepend the the type arguments for the class + // Prepend the type arguments for the class let tyargs = tinst @ tyargs let thisArgs = if isStatic then [] @@ -663,11 +686,10 @@ let MakeCtorForIncrClassConstructionPhase2C( (staticForcedFieldVars.FreeLocals, instanceForcedFieldVars.FreeLocals) - // Compute the implicit construction side effects of single // 'let' or 'let rec' binding in the implicit class construction sequence let TransBind (reps: IncrClassReprInfo) (TBind(v, rhsExpr, spBind)) = - if v.MustInline then + if v.ShouldInline then error(Error(FSComp.SR.tcLocalClassBindingsCannotBeInline(), v.Range)) let rhsExpr = reps.FixupIncrClassExprPhase2C cenv thisValOpt safeStaticInitInfo thisTyInst rhsExpr @@ -758,7 +780,8 @@ let MakeCtorForIncrClassConstructionPhase2C( match dec with | IncrClassBindingGroup(binds, isStatic, isRec) -> let actions, reps, methodBinds = - let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ChooseAndAddRepresentation(cenv, env, isStatic, isCtorArg, staticCtorInfo, ctorInfoOpt, staticForcedFieldVars, instanceForcedFieldVars, bind)) // extend + // let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ChooseAndAddRepresentation(cenv, env, isStatic, isCtorArg, staticCtorInfo, ctorInfoOpt, staticForcedFieldVars, instanceForcedFieldVars, (ClassLetBinding isStatic), bind)) // extend + let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ChooseAndAddRepresentation(cenv, env, isStatic, isCtorArg, staticCtorInfo, ctorInfoOpt, staticForcedFieldVars, instanceForcedFieldVars, ModuleOrMemberBinding, bind)) // extend if isRec then // Note: the recursive calls are made via members on the object // or via access to fields. This means the recursive loop is "broken", diff --git a/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fsi b/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fsi index 0de56111ff..428ae98b63 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fsi +++ b/src/fcs-fable/src/Compiler/Checking/CheckIncrementalClasses.fsi @@ -130,7 +130,7 @@ val TcImplicitCtorInfo_Phase2A: tcref: TyconRef * vis: SynAccess option * attrs: SynAttribute list * - spats: SynSimplePat list * + pat: SynPat * thisIdOpt: Ident option * baseValOpt: Val option * safeInitInfo: SafeInitData * diff --git a/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fs b/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fs index 00229e5eb4..3f97cf8178 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fs +++ b/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fs @@ -27,6 +27,7 @@ open FSharp.Compiler.Text.Range open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.CheckExpressionsOps type cenv = TcFileState @@ -57,10 +58,12 @@ let UnifyRefTupleType contextInfo (cenv: cenv) denv m ty ps = AddCxTypeEqualsType contextInfo denv cenv.css m ty (TType_tuple (tupInfoRef, ptys)) ptys -let rec TryAdjustHiddenVarNameToCompGenName cenv env (id: Ident) altNameRefCellOpt = +let rec TryAdjustHiddenVarNameToCompGenName (cenv: cenv) env (id: Ident) altNameRefCellOpt = match altNameRefCellOpt with | Some ({contents = SynSimplePatAlternativeIdInfo.Undecided altId } as altNameRefCell) -> - match ResolvePatternLongIdent cenv.tcSink cenv.nameResolver AllIdsOK false id.idRange env.eAccessRights env.eNameResEnv TypeNameResolutionInfo.Default [id] ExtraDotAfterIdentifier.No with + let supportsWarnOnUpperIdentifiersInPatterns = cenv.g.langVersion.SupportsFeature(LanguageFeature.DontWarnOnUppercaseIdentifiersInBindingPatterns) + let warnOnUpperFlag = if supportsWarnOnUpperIdentifiersInPatterns then WarnOnUpperVariablePatterns else AllIdsOK + match ResolvePatternLongIdent cenv.tcSink cenv.nameResolver warnOnUpperFlag false id.idRange env.eAccessRights env.eNameResEnv TypeNameResolutionInfo.Default [id] ExtraDotAfterIdentifier.No with | Item.NewDef _ -> // The name is not in scope as a pattern identifier (e.g. union case), so do not use the alternate ID None @@ -97,7 +100,7 @@ and TcSimplePat optionalArgsOK checkConstraints (cenv: cenv) ty env patEnv p = id.idText, patEnvR | SynSimplePat.Typed (p, cty, m) -> - let ctyR, tpenv = TcTypeAndRecover cenv NewTyparsOK checkConstraints ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv cty + let ctyR, tpenv = TcTypeAndRecover cenv NewTyparsOK checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv cty match p with // Optional arguments on members @@ -171,11 +174,13 @@ and TcSimplePats (cenv: cenv) optionalArgsOK checkConstraints ty env patEnv synS let ps', patEnvR = (patEnv, List.zip ptys ps) ||> List.mapFold (fun patEnv (ty, pat) -> TcSimplePat optionalArgsOK checkConstraints cenv ty env patEnv pat) ps', patEnvR -and TcSimplePatsOfUnknownType (cenv: cenv) optionalArgsOK checkConstraints env tpenv synSimplePats = +and TcSimplePatsOfUnknownType (cenv: cenv) optionalArgsOK checkConstraints env tpenv (pat: SynPat) = let g = cenv.g let argTy = NewInferenceType g let patEnv = TcPatLinearEnv (tpenv, NameMap.empty, Set.empty) - TcSimplePats cenv optionalArgsOK checkConstraints argTy env patEnv synSimplePats + let spats, _ = SimplePatsOfPat cenv.synArgNameGenerator pat + let names, patEnv = TcSimplePats cenv optionalArgsOK checkConstraints argTy env patEnv spats + names, patEnv, spats and TcPatBindingName cenv env id ty isMemberThis vis1 valReprInfo (vFlags: TcPatValFlags) (names, takenNames: Set) = let (TcPatValFlags(inlineFlag, declaredTypars, argAttribs, isMutable, vis2, isCompGen)) = vFlags @@ -207,7 +212,7 @@ and TcPatBindingName cenv env id ty isMemberThis vis1 valReprInfo (vFlags: TcPat // For non-left-most paths, we register the name resolutions here if not isLeftMost && not vspec.IsCompilerGenerated && not (vspec.LogicalName.StartsWithOrdinal("_")) then let item = Item.Value(mkLocalValRef vspec) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights) PatternValBinding(vspec, typeScheme) @@ -271,7 +276,7 @@ and TcPat warnOnUpper (cenv: cenv) env valReprInfo vFlags (patEnv: TcPatLinearEn | SynPat.Typed (p, cty, m) -> let (TcPatLinearEnv(tpenv, names, takenNames)) = patEnv - let ctyR, tpenvR = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv cty + let ctyR, tpenvR = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv cty UnifyTypes cenv env m ty ctyR let patEnvR = TcPatLinearEnv(tpenvR, names, takenNames) TcPat warnOnUpper cenv env valReprInfo vFlags patEnvR ty p @@ -291,7 +296,11 @@ and TcPat warnOnUpper (cenv: cenv) env valReprInfo vFlags (patEnv: TcPatLinearEn TcPatAnds warnOnUpper cenv env vFlags patEnv ty pats m | SynPat.LongIdent (longDotId=longDotId; typarDecls=tyargs; argPats=args; accessibility=vis; range=m) -> - TcPatLongIdent warnOnUpper cenv env ad valReprInfo vFlags patEnv ty (longDotId, tyargs, args, vis, m) + try + TcPatLongIdent warnOnUpper cenv env ad valReprInfo vFlags patEnv ty (longDotId, tyargs, args, vis, m) + with RecoverableException e -> + errorRecovery e m + (fun _ -> TPat_error m), patEnv | SynPat.QuoteExpr(_, m) -> errorR (Error(FSComp.SR.tcInvalidPattern(), m)) @@ -349,6 +358,12 @@ and TcPatNamedAs warnOnUpper cenv env valReprInfo vFlags patEnv ty synInnerPat i and TcPatUnnamedAs warnOnUpper cenv env vFlags patEnv ty pat1 pat2 m = let pats = [pat1; pat2] + let warnOnUpper = + if cenv.g.langVersion.SupportsFeature(LanguageFeature.DontWarnOnUppercaseIdentifiersInBindingPatterns) then + AllIdsOK + else + warnOnUpper + let patsR, patEnvR = TcPatterns warnOnUpper cenv env vFlags patEnv (List.map (fun _ -> ty) pats) pats let phase2 values = TPat_conjs(List.map (fun f -> f values) patsR, m) phase2, patEnvR @@ -363,7 +378,7 @@ and TcPatNamed warnOnUpper cenv env vFlags patEnv id ty isMemberThis vis valRepr and TcPatIsInstance warnOnUpper cenv env valReprInfo vFlags patEnv srcTy synPat synTargetTy m = let (TcPatLinearEnv(tpenv, names, takenNames)) = patEnv - let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOKButWarnIfNotRigid CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synTargetTy + let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOKButWarnIfNotRigid CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synTargetTy TcRuntimeTypeTest false true cenv env.DisplayEnv m tgtTy srcTy let patEnv = TcPatLinearEnv(tpenv, names, takenNames) match synPat with @@ -434,13 +449,13 @@ and TcPatArrayOrList warnOnUpper cenv env vFlags patEnv ty isArray args m = else List.foldBack (mkConsListPat g argTy) argsR (mkNilListPat g m argTy) phase2, acc -and TcRecordPat warnOnUpper cenv env vFlags patEnv ty fieldPats m = +and TcRecordPat warnOnUpper (cenv: cenv) env vFlags patEnv ty fieldPats m = let fieldPats = fieldPats |> List.map (fun (fieldId, _, fieldPat) -> fieldId, fieldPat) match BuildFieldMap cenv env false ty fieldPats m with | None -> (fun _ -> TPat_error m), patEnv | Some(tinst, tcref, fldsmap, _fldsList) -> - let gtyp = mkAppTy tcref tinst + let gtyp = mkWoNullAppTy tcref tinst let inst = List.zip (tcref.Typars m) tinst UnifyTypes cenv env m ty gtyp @@ -451,7 +466,13 @@ and TcRecordPat warnOnUpper cenv env vFlags patEnv ty fieldPats m = let fieldPats, patEnvR = (patEnv, ftys) ||> List.mapFold (fun s (ty, fsp) -> match fldsmap.TryGetValue fsp.rfield_id.idText with - | true, v -> TcPat warnOnUpper cenv env None vFlags s ty v + | true, v -> + let warnOnUpper = + if cenv.g.langVersion.SupportsFeature(LanguageFeature.DontWarnOnUppercaseIdentifiersInBindingPatterns) then + AllIdsOK + else + warnOnUpper + TcPat warnOnUpper cenv env None vFlags s ty v | _ -> (fun _ -> TPat_wild m), s) let phase2 values = @@ -596,7 +617,7 @@ and TcPatLongIdentUnionCaseOrExnCase warnOnUpper cenv env ad vFlags patEnv ty (m let g = cenv.g // Report information about the case occurrence to IDE - CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurence.Pattern, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Pattern, env.eAccessRights) let mkf, argTys, argNames = ApplyUnionCaseOrExn m cenv env ty item let numArgTys = argTys.Length @@ -645,11 +666,11 @@ and TcPatLongIdentUnionCaseOrExnCase warnOnUpper cenv env ad vFlags patEnv ty (m | Item.ExnCase tref -> Item.RecdField (RecdFieldInfo ([], RecdFieldRef (tref, id.idText))) | _ -> failwithf "Expecting union case or exception item, got: %O" item - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, argItem, emptyTyparInst, ItemOccurence.Pattern, ad) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, argItem, emptyTyparInst, ItemOccurrence.Pattern, ad) match box result[idx] with - | Null -> result[idx] <- pat - | NonNull _ -> + | null -> result[idx] <- pat + | _ -> extraPatterns.Add pat errorR (Error (FSComp.SR.tcUnionCaseFieldCannotBeUsedMoreThanOnce id.idText, id.idRange)) @@ -736,7 +757,7 @@ and TcPatLongIdentILField warnOnUpper (cenv: cenv) env vFlags patEnv ty (mLongId UnifyTypes cenv env m ty (finfo.FieldType (cenv.amap, m)) let c' = TcFieldInit mLongId lit let item = Item.ILField finfo - CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurence.Pattern, env.AccessRights) + CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Pattern, env.AccessRights) (fun _ -> TPat_const (c', m)), acc /// Check a long identifier that has been resolved to a record field @@ -756,7 +777,7 @@ and TcPatLongIdentRecdField warnOnUpper cenv env vFlags patEnv ty (mLongId, rfin let item = Item.RecdField rfinfo // FUTURE: can we do better than emptyTyparInst here, in order to display instantiations // of type variables in the quick info provided in the IDE. - CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurence.Pattern, env.AccessRights) + CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Pattern, env.AccessRights) (fun _ -> TPat_const (lit, m)), acc /// Check a long identifier that has been resolved to an F# value that is a literal @@ -775,10 +796,9 @@ and TcPatLongIdentLiteral warnOnUpper (cenv: cenv) env vFlags patEnv ty (mLongId UnifyTypes cenv env m ty vexpty let item = Item.Value vref - CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurence.Pattern, env.AccessRights) + CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Pattern, env.AccessRights) (fun _ -> TPat_const (lit, m)), acc and TcPatterns warnOnUpper cenv env vFlags s argTys args = assert (List.length args = List.length argTys) List.mapFold (fun s (ty, pat) -> TcPat warnOnUpper cenv env None vFlags s ty pat) s (List.zip argTys args) - diff --git a/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fsi b/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fsi index 46e400b8a9..da797b35a8 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fsi +++ b/src/fcs-fable/src/Compiler/Checking/CheckPatterns.fsi @@ -15,8 +15,8 @@ val TcSimplePatsOfUnknownType: checkConstraints: CheckConstraints -> env: TcEnv -> tpenv: UnscopedTyparEnv -> - synSimplePats: SynSimplePats -> - string list * TcPatLinearEnv + pat: SynPat -> + string list * TcPatLinearEnv * SynSimplePats // Check a pattern, e.g. for a binding or a match clause val TcPat: diff --git a/src/fcs-fable/src/Compiler/Checking/CheckRecordSyntaxHelpers.fs b/src/fcs-fable/src/Compiler/Checking/CheckRecordSyntaxHelpers.fs index 5f59e1ac3e..8783da1031 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckRecordSyntaxHelpers.fs +++ b/src/fcs-fable/src/Compiler/Checking/CheckRecordSyntaxHelpers.fs @@ -90,26 +90,26 @@ let TransformAstForNestedUpdates (cenv: TcFileState) (env: TcEnv) overallTy (lid let totalRange (origId: Ident) (id: Ident) = withStartEnd origId.idRange.End id.idRange.Start origId.idRange - let rangeOfBlockSeperator (id: Ident) = + let rangeOfBlockSeparator (id: Ident) = let idEnd = id.idRange.End - let blockSeperatorStartCol = idEnd.Column - let blockSeperatorEndCol = blockSeperatorStartCol + 4 - let blockSeperatorStartPos = mkPos idEnd.Line blockSeperatorStartCol - let blockSeporatorEndPos = mkPos idEnd.Line blockSeperatorEndCol + let blockSeparatorStartCol = idEnd.Column + let blockSeparatorEndCol = blockSeparatorStartCol + 4 + let blockSeparatorStartPos = mkPos idEnd.Line blockSeparatorStartCol + let blockSeparatorEndPos = mkPos idEnd.Line blockSeparatorEndCol - withStartEnd blockSeperatorStartPos blockSeporatorEndPos id.idRange + withStartEnd blockSeparatorStartPos blockSeparatorEndPos id.idRange match withExpr with | SynExpr.Ident origId, (sepRange, _) -> let lid, rng = upToId sepRange id (origId :: ids) - Some(SynExpr.LongIdent(false, LongIdentWithDots(lid, rng), None, totalRange origId id), (rangeOfBlockSeperator id, None)) + Some(SynExpr.LongIdent(false, LongIdentWithDots(lid, rng), None, totalRange origId id), (rangeOfBlockSeparator id, None)) | _ -> None let rec synExprRecd copyInfo (outerFieldId: Ident) innerFields exprBeingAssigned = match innerFields with | [] -> failwith "unreachable" | (fieldId: Ident, item) :: rest -> - CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, [], ItemOccurence.Use, env.AccessRights) + CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, [], ItemOccurrence.Use, env.AccessRights) let fieldId = ident (fieldId.idText, fieldId.idRange.MakeSynthetic()) @@ -143,7 +143,7 @@ let TransformAstForNestedUpdates (cenv: TcFileState) (env: TcEnv) overallTy (lid | accessIds, (outerFieldId, item) :: rest -> checkLanguageFeatureAndRecover cenv.g.langVersion LanguageFeature.NestedCopyAndUpdate (rangeOfLid lid) - CallNameResolutionSink cenv.tcSink (outerFieldId.idRange, env.NameEnv, item, [], ItemOccurence.Use, env.AccessRights) + CallNameResolutionSink cenv.tcSink (outerFieldId.idRange, env.NameEnv, item, [], ItemOccurrence.Use, env.AccessRights) let outerFieldId = ident (outerFieldId.idText, outerFieldId.idRange.MakeSynthetic()) diff --git a/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fs b/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fs index b1b472a9dd..cc318d3717 100644 --- a/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fs +++ b/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fs @@ -57,25 +57,29 @@ open FSharp.Compiler.Import open FSharp.Compiler.InfoReader open FSharp.Compiler.Infos open FSharp.Compiler.MethodCalls +open FSharp.Compiler.NameResolution open FSharp.Compiler.Syntax open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text -open FSharp.Compiler.Text.Range open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypeHierarchy open FSharp.Compiler.TypeRelations +#if !NO_TYPEPROVIDERS +open FSharp.Compiler.TypeProviders +#endif + //------------------------------------------------------------------------- // Generate type variables and record them in within the scope of the // compilation environment, which currently corresponds to the scope // of the constraint resolution carried out by type checking. //------------------------------------------------------------------------- -let compgenId = mkSynId range0 unassignedTyparName +let compgenId = mkSynId Range.range0 unassignedTyparName let NewCompGenTypar (kind, rigid, staticReq, dynamicReq, error) = Construct.NewTypar(kind, rigid, SynTypar(compgenId, staticReq, true), error, dynamicReq, [], false, false) @@ -93,28 +97,10 @@ let NewInferenceMeasurePar () = let NewErrorTypar () = NewCompGenTypar (TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, true) - -let NewErrorMeasureVar () = - NewCompGenTypar (TyparKind.Measure, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, true) - -let NewInferenceType (g: TcGlobals) = - ignore g // included for future, minimizing code diffs, see https://github.com/dotnet/fsharp/pull/6804 - mkTyparTy (Construct.NewTypar (TyparKind.Type, TyparRigidity.Flexible, SynTypar(compgenId, TyparStaticReq.None, true), false, TyparDynamicReq.No, [], false, false)) - + let NewErrorType () = mkTyparTy (NewErrorTypar ()) -let NewErrorMeasure () = - Measure.Var (NewErrorMeasureVar ()) - -let NewByRefKindInferenceType (g: TcGlobals) m = - let tp = Construct.NewTypar (TyparKind.Type, TyparRigidity.Flexible, SynTypar(compgenId, TyparStaticReq.HeadType, true), false, TyparDynamicReq.No, [], false, false) - if g.byrefkind_InOut_tcr.CanDeref then - tp.SetConstraints [TyparConstraint.DefaultsTo(10, TType_app(g.byrefkind_InOut_tcr, [], g.knownWithoutNull), m)] - mkTyparTy tp - -let NewInferenceTypes g l = l |> List.map (fun _ -> NewInferenceType g) - let FreshenTypar (g: TcGlobals) rigid (tp: Typar) = let clearStaticReq = g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers let staticReq = if clearStaticReq then TyparStaticReq.None else tp.StaticReq @@ -137,13 +123,6 @@ let FreshenTypeInst g m tpsorig = let FreshMethInst g m fctps tinst tpsorig = FreshenAndFixupTypars g m TyparRigidity.Flexible fctps tinst tpsorig -let FreshenTypars g m tpsorig = - match tpsorig with - | [] -> [] - | _ -> - let _, _, tpTys = FreshenTypeInst g m tpsorig - tpTys - let FreshenMethInfo m (minfo: MethInfo) = let _, _, tpTys = FreshMethInst minfo.TcGlobals m (minfo.GetFormalTyparsOfDeclaringType m) minfo.DeclaringTypeInst minfo.FormalMethodTypars tpTys @@ -240,7 +219,15 @@ exception ConstraintSolverTypesNotInEqualityRelation of displayEnv: DisplayEnv * exception ConstraintSolverTypesNotInSubsumptionRelation of displayEnv: DisplayEnv * argTy: TType * paramTy: TType * callRange: range * parameterRange: range -exception ConstraintSolverMissingConstraint of displayEnv: DisplayEnv * Typar * TyparConstraint * range * range +exception ConstraintSolverMissingConstraint of displayEnv: DisplayEnv * Typar * TyparConstraint * range * range + +exception ConstraintSolverNullnessWarningEquivWithTypes of DisplayEnv * TType * TType * NullnessInfo * NullnessInfo * range * range + +exception ConstraintSolverNullnessWarningWithTypes of DisplayEnv * TType * TType * NullnessInfo * NullnessInfo * range * range + +exception ConstraintSolverNullnessWarningWithType of DisplayEnv * TType * NullnessInfo * range * range + +exception ConstraintSolverNullnessWarning of string * range * range exception ConstraintSolverError of string * range * range @@ -281,6 +268,7 @@ type ConstraintSolverState = /// Checks to run after all inference is complete. PostInferenceChecksFinal: ResizeArray unit> + WarnWhenUsingWithoutNullOnAWithNullTarget: string option } static member New(g, amap, infoReader, tcVal) = @@ -290,7 +278,8 @@ type ConstraintSolverState = InfoReader = infoReader TcVal = tcVal PostInferenceChecksPreDefaults = ResizeArray() - PostInferenceChecksFinal = ResizeArray() } + PostInferenceChecksFinal = ResizeArray() + WarnWhenUsingWithoutNullOnAWithNullTarget = None } member this.PushPostInferenceCheck (preDefaults, check) = if preDefaults then @@ -319,6 +308,9 @@ type ConstraintSolverEnv = // Is this speculative, with a trace allowing undo, and trial method overload resolution IsSpeculativeForMethodOverloading: bool + // Can this ignore the 'must support null' constraint, e.g. in a mutable assignment scenario + IsSupportsNullFlex: bool + /// Indicates that when unifying ty1 = ty2, only type variables in ty1 may be solved. Constraints /// can't be added to type variables in ty2 MatchingOnly: bool @@ -355,6 +347,7 @@ let MakeConstraintSolverEnv contextInfo css m denv = EquivEnv = TypeEquivEnv.Empty DisplayEnv = denv IsSpeculativeForMethodOverloading = false + IsSupportsNullFlex = false ExtraRigidTypars = emptyFreeTypars } @@ -377,7 +370,7 @@ let rec occursCheck g un ty = //------------------------------------------------------------------------- /// Some additional solutions are forced prior to generalization (permitWeakResolution=true). These are, roughly speaking, rules -/// for binary-operand constraints arising from constructs such as "1.0 + x" where "x" is an unknown type. THe constraint here +/// for binary-operand constraints arising from constructs such as "1.0 + x" where "x" is an unknown type. The constraint here /// involves two type parameters - one for the left, and one for the right. The left is already known to be Double. /// In this situation (and in the absence of other evidence prior to generalization), constraint solving forces an assumption that /// the right is also Double - this is "weak" because there is only weak evidence for it. @@ -729,22 +722,23 @@ let SolveTypIsCompatFlex (csenv: ConstraintSolverEnv) trace req ty = else CompleteD -let SubstMeasureWarnIfRigid (csenv: ConstraintSolverEnv) trace (v: Typar) ms = trackErrors { - if v.Rigidity.WarnIfUnified && not (isAnyParTy csenv.g (TType_measure ms)) then - // NOTE: we grab the name eagerly to make sure the type variable prints as a type variable - let tpnmOpt = if v.IsCompilerGenerated then None else Some v.Name - do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) - SubstMeasure v ms - return! WarnD(NonRigidTypar(csenv.DisplayEnv, tpnmOpt, v.Range, TType_measure (Measure.Var v), TType_measure ms, csenv.m)) - else - // Propagate static requirements from 'tp' to 'ty' - do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) - SubstMeasure v ms - if v.Rigidity = TyparRigidity.Anon && measureEquiv csenv.g ms Measure.One then - return! WarnD(Error(FSComp.SR.csCodeLessGeneric(), v.Range)) - else - () - } +let SubstMeasureWarnIfRigid (csenv: ConstraintSolverEnv) trace (v: Typar) ms = + trackErrors { + if v.Rigidity.WarnIfUnified && not (isAnyParTy csenv.g (TType_measure ms)) then + // NOTE: we grab the name eagerly to make sure the type variable prints as a type variable + let tpnmOpt = if v.IsCompilerGenerated then None else Some v.Name + do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) + SubstMeasure v ms + return! WarnD(NonRigidTypar(csenv.DisplayEnv, tpnmOpt, v.Range, TType_measure (Measure.Var v), TType_measure ms, csenv.m)) + else + // Propagate static requirements from 'tp' to 'ty' + do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) + SubstMeasure v ms + if v.Rigidity = TyparRigidity.Anon && measureEquiv csenv.g ms Measure.One then + return! WarnD(Error(FSComp.SR.csCodeLessGeneric(), v.Range)) + else + () + } let IsRigid (csenv: ConstraintSolverEnv) (tp: Typar) = tp.Rigidity = TyparRigidity.Rigid @@ -952,111 +946,198 @@ let CheckWarnIfRigid (csenv: ConstraintSolverEnv) ty1 (r: Typar) ty = /// Add the constraint "ty1 = ty" to the constraint problem, where ty1 is a type variable. /// Propagate all effects of adding this constraint, e.g. to solve other variables -let rec SolveTyparEqualsTypePart1 (csenv: ConstraintSolverEnv) m2 (trace: OptionalTrace) ty1 r ty = trackErrors { - // The types may still be equivalent due to abbreviations, which we are trying not to eliminate - if typeEquiv csenv.g ty1 ty then () else - // The famous 'occursCheck' check to catch "infinite types" like 'a = list<'a> - see also https://github.com/dotnet/fsharp/issues/1170 - if occursCheck csenv.g r ty then return! ErrorD (ConstraintSolverInfiniteTypes(csenv.DisplayEnv, csenv.eContextInfo, ty1, ty, csenv.m, m2)) else - // Note: warn _and_ continue! - do! CheckWarnIfRigid csenv ty1 r ty - // Record the solution before we solve the constraints, since - // We may need to make use of the equation when solving the constraints. - // Record a entry in the undo trace if one is provided - trace.Exec (fun () -> r.typar_solution <- Some ty) (fun () -> r.typar_solution <- None) - } - -and SolveTyparEqualsTypePart2 (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) (r: Typar) ty = trackErrors { - // Only solve constraints if this is not an error var - if r.IsFromError then () else - - // Check to see if this type variable is relevant to any trait constraints. - // If so, re-solve the relevant constraints. - if csenv.SolverState.ExtraCxs.ContainsKey r.Stamp then - do! RepeatWhileD ndeep (fun ndeep -> SolveRelevantMemberConstraintsForTypar csenv ndeep PermitWeakResolution.No trace r) - - // Re-solve the other constraints associated with this type variable - return! SolveTypMeetsTyparConstraints csenv ndeep m2 trace ty r +let rec SolveTyparEqualsTypePart1 (csenv: ConstraintSolverEnv) m2 (trace: OptionalTrace) ty1 r ty = + trackErrors { + // The types may still be equivalent due to abbreviations, which we are trying not to eliminate + if typeEquiv csenv.g ty1 ty then () else + // The famous 'occursCheck' check to catch "infinite types" like 'a = list<'a> - see also https://github.com/dotnet/fsharp/issues/1170 + if occursCheck csenv.g r ty then return! ErrorD (ConstraintSolverInfiniteTypes(csenv.DisplayEnv, csenv.eContextInfo, ty1, ty, csenv.m, m2)) else + // Note: warn _and_ continue! + do! CheckWarnIfRigid csenv ty1 r ty + // Record the solution before we solve the constraints, since + // We may need to make use of the equation when solving the constraints. + // Record a entry in the undo trace if one is provided + + //let ty1AllowsNull = r.Constraints |> List.exists (function | TyparConstraint.SupportsNull _ -> true | _ -> false ) + //let tyAllowsNull() = TypeNullIsExtraValueNew csenv.g m2 ty + //if ty1AllowsNull && not (tyAllowsNull()) then + // trace.Exec (fun () -> r.typar_solution <- Some (ty |> replaceNullnessOfTy csenv.g.knownWithNull)) (fun () -> r.typar_solution <- None) + //else + // trace.Exec (fun () -> r.typar_solution <- Some ty) (fun () -> r.typar_solution <- None) + trace.Exec (fun () -> r.typar_solution <- Some ty) (fun () -> r.typar_solution <- None) + } + +and SolveTyparEqualsTypePart2 (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) (r: Typar) ty = + trackErrors { + // Only solve constraints if this is not an error var + if r.IsFromError then () else - } + // Check to see if this type variable is relevant to any trait constraints. + // If so, re-solve the relevant constraints. + if csenv.SolverState.ExtraCxs.ContainsKey r.Stamp then + do! RepeatWhileD ndeep (fun ndeep -> SolveRelevantMemberConstraintsForTypar csenv ndeep PermitWeakResolution.No trace r) -/// Apply the constraints on 'typar' to the type 'ty' -and SolveTypMeetsTyparConstraints (csenv: ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = trackErrors { - let g = csenv.g + // Re-solve the other constraints associated with this type variable + return! SolveTypMeetsTyparConstraints csenv ndeep m2 trace ty r - // Propagate compat flex requirements from 'tp' to 'ty' - do! SolveTypIsCompatFlex csenv trace r.IsCompatFlex ty + } - // Propagate dynamic requirements from 'tp' to 'ty' - do! SolveTypDynamicReq csenv trace r.DynamicReq ty +/// Apply the constraints on 'typar' to the type 'ty' +and SolveTypMeetsTyparConstraints (csenv: ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = + trackErrors { + let g = csenv.g - // Propagate static requirements from 'tp' to 'ty' - do! SolveTypStaticReq csenv trace r.StaticReq ty + // Propagate compat flex requirements from 'tp' to 'ty' + do! SolveTypIsCompatFlex csenv trace r.IsCompatFlex ty - if not (g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers) then - // Propagate static requirements from 'tp' to 'ty' - // - // If IWSAMs are not supported then this is done on a per-type-variable basis when constraints - // are applied - see other calls to SolveTypStaticReq + // Propagate dynamic requirements from 'tp' to 'ty' + do! SolveTypDynamicReq csenv trace r.DynamicReq ty + + // Propagate static requirements from 'tp' to 'ty' do! SolveTypStaticReq csenv trace r.StaticReq ty - // Solve constraints on 'tp' w.r.t. 'ty' - for e in r.Constraints do - do! - match e with - | TyparConstraint.DefaultsTo (priority, dty, m) -> - if typeEquiv g ty dty then - CompleteD - else - match tryDestTyparTy g ty with - | ValueNone -> CompleteD - | ValueSome destTypar -> - AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.DefaultsTo(priority, dty, m)) - - | TyparConstraint.SupportsNull m2 -> SolveTypeUseSupportsNull csenv ndeep m2 trace ty - | TyparConstraint.IsEnum(underlyingTy, m2) -> SolveTypeIsEnum csenv ndeep m2 trace ty underlyingTy - | TyparConstraint.SupportsComparison(m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty - | TyparConstraint.SupportsEquality(m2) -> SolveTypeSupportsEquality csenv ndeep m2 trace ty - | TyparConstraint.IsDelegate(aty, bty, m2) -> SolveTypeIsDelegate csenv ndeep m2 trace ty aty bty - | TyparConstraint.IsNonNullableStruct m2 -> SolveTypeIsNonNullableValueType csenv ndeep m2 trace ty - | TyparConstraint.IsUnmanaged m2 -> SolveTypeIsUnmanaged csenv ndeep m2 trace ty - | TyparConstraint.IsReferenceType m2 -> SolveTypeIsReferenceType csenv ndeep m2 trace ty - | TyparConstraint.RequiresDefaultConstructor m2 -> SolveTypeRequiresDefaultConstructor csenv ndeep m2 trace ty - | TyparConstraint.SimpleChoice(tys, m2) -> SolveTypeChoice csenv ndeep m2 trace ty tys - | TyparConstraint.CoercesTo(ty2, m2) -> SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace None ty2 ty - | TyparConstraint.MayResolveMember(traitInfo, m2) -> - SolveMemberConstraint csenv false PermitWeakResolution.No ndeep m2 trace traitInfo |> OperationResult.ignore - } + if not (g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers) then + // Propagate static requirements from 'tp' to 'ty' + // + // If IWSAMs are not supported then this is done on a per-type-variable basis when constraints + // are applied - see other calls to SolveTypStaticReq + do! SolveTypStaticReq csenv trace r.StaticReq ty + + // Solve constraints on 'tp' w.r.t. 'ty' + for e in r.Constraints do + do! + match e with + | TyparConstraint.DefaultsTo (priority, dty, m) -> + if typeEquiv g ty dty then + CompleteD + else + match tryDestTyparTy g ty with + | ValueNone -> CompleteD + | ValueSome destTypar -> + AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.DefaultsTo(priority, dty, m)) + + | TyparConstraint.NotSupportsNull m2 -> SolveTypeUseNotSupportsNull csenv ndeep m2 trace ty + | TyparConstraint.SupportsNull m2 -> SolveTypeUseSupportsNull csenv ndeep m2 trace ty + | TyparConstraint.IsEnum(underlyingTy, m2) -> SolveTypeIsEnum csenv ndeep m2 trace ty underlyingTy + | TyparConstraint.SupportsComparison(m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty + | TyparConstraint.SupportsEquality(m2) -> SolveTypeSupportsEquality csenv ndeep m2 trace ty + | TyparConstraint.IsDelegate(aty, bty, m2) -> SolveTypeIsDelegate csenv ndeep m2 trace ty aty bty + | TyparConstraint.IsNonNullableStruct m2 -> SolveTypeIsNonNullableValueType csenv ndeep m2 trace ty + | TyparConstraint.IsUnmanaged m2 -> SolveTypeIsUnmanaged csenv ndeep m2 trace ty + | TyparConstraint.AllowsRefStruct _ -> CompleteD + | TyparConstraint.IsReferenceType m2 -> SolveTypeIsReferenceType csenv ndeep m2 trace ty + | TyparConstraint.RequiresDefaultConstructor m2 -> SolveTypeRequiresDefaultConstructor csenv ndeep m2 trace ty + | TyparConstraint.SimpleChoice(tys, m2) -> SolveTypeChoice csenv ndeep m2 trace ty tys + | TyparConstraint.CoercesTo(ty2, m2) -> SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace None ty2 ty + | TyparConstraint.MayResolveMember(traitInfo, m2) -> + SolveMemberConstraint csenv false PermitWeakResolution.No ndeep m2 trace traitInfo |> OperationResult.ignore + } +and shouldWarnUselessNullCheck (csenv:ConstraintSolverEnv) = + csenv.g.checkNullness && + csenv.SolverState.WarnWhenUsingWithoutNullOnAWithNullTarget.IsSome + +// nullness1: actual +// nullness2: expected +and SolveNullnessEquiv (csenv: ConstraintSolverEnv) m2 (trace: OptionalTrace) ty1 ty2 nullness1 nullness2 = + match nullness1, nullness2 with + | Nullness.Variable nv1, Nullness.Variable nv2 when nv1 === nv2 -> + CompleteD + | Nullness.Variable nv1, _ when nv1.IsSolved -> + SolveNullnessEquiv csenv m2 trace ty1 ty2 nv1.Solution nullness2 + | _, Nullness.Variable nv2 when nv2.IsSolved -> + SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nv2.Solution + | Nullness.Variable nv1, _ -> + trace.Exec (fun () -> nv1.Set nullness2) (fun () -> nv1.Unset()) + CompleteD + | _, Nullness.Variable nv2 -> + trace.Exec (fun () -> nv2.Set nullness1) (fun () -> nv2.Unset()) + CompleteD + | Nullness.Known n1, Nullness.Known n2 -> + match n1, n2 with + | NullnessInfo.AmbivalentToNull, _ -> CompleteD + | _, NullnessInfo.AmbivalentToNull -> CompleteD + | NullnessInfo.WithNull, NullnessInfo.WithNull -> CompleteD + | NullnessInfo.WithoutNull, NullnessInfo.WithoutNull -> CompleteD + // Warn for 'strict "must pass null"` APIs like Option.ofObj + | NullnessInfo.WithNull, NullnessInfo.WithoutNull when shouldWarnUselessNullCheck csenv -> + WarnD(Error(FSComp.SR.tcPassingWithoutNullToANullableExpectingFunc (csenv.SolverState.WarnWhenUsingWithoutNullOnAWithNullTarget.Value),m2)) + // Allow expected of WithNull and actual of WithoutNull except for specially marked APIs (handled above) + | NullnessInfo.WithNull, NullnessInfo.WithoutNull -> CompleteD + | _ -> + if csenv.g.checkNullness then + WarnD(ConstraintSolverNullnessWarningEquivWithTypes(csenv.DisplayEnv, ty1, ty2, n1, n2, csenv.m, m2)) + else + CompleteD -and SolveTyparEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) ty1 ty = trackErrors { - let m = csenv.m - do! DepthCheck ndeep m - match ty1 with - | TType_var (r, _) - | TType_measure (Measure.Var r) -> - do! SolveTyparEqualsTypePart1 csenv m2 trace ty1 r ty - do! SolveTyparEqualsTypePart2 csenv ndeep m2 trace r ty - | _ -> failwith "SolveTyparEqualsType" +// nullness1: target +// nullness2: source +and SolveNullnessSubsumesNullness (csenv: ConstraintSolverEnv) m2 (trace: OptionalTrace) ty1 ty2 nullness1 nullness2 = + match nullness1, nullness2 with + | Nullness.Variable nv1, Nullness.Variable nv2 when nv1 === nv2 -> + CompleteD + | Nullness.Variable nv1, _ when nv1.IsSolved -> + SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nv1.Solution nullness2 + | _, Nullness.Variable nv2 when nv2.IsSolved -> + SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nullness1 nv2.Solution + | Nullness.Variable _nv1, Nullness.Known NullnessInfo.WithoutNull -> + CompleteD + | Nullness.Variable nv1, _ -> + trace.Exec (fun () -> nv1.Set nullness2) (fun () -> nv1.Unset()) + CompleteD + | _, Nullness.Variable nv2 -> + trace.Exec (fun () -> nv2.Set nullness1) (fun () -> nv2.Unset()) + CompleteD + | Nullness.Known n1, Nullness.Known n2 -> + match n1, n2 with + | NullnessInfo.AmbivalentToNull, _ -> CompleteD + | _, NullnessInfo.AmbivalentToNull -> CompleteD + | NullnessInfo.WithNull, NullnessInfo.WithNull -> CompleteD + | NullnessInfo.WithoutNull, NullnessInfo.WithoutNull -> CompleteD + // Warn for 'strict "must pass null"` APIs like Option.ofObj + | NullnessInfo.WithNull, NullnessInfo.WithoutNull when shouldWarnUselessNullCheck csenv -> + WarnD(Error(FSComp.SR.tcPassingWithoutNullToANullableExpectingFunc (csenv.SolverState.WarnWhenUsingWithoutNullOnAWithNullTarget.Value),m2)) + // Allow target of WithNull and actual of WithoutNull + | NullnessInfo.WithNull, NullnessInfo.WithoutNull -> + CompleteD + | NullnessInfo.WithoutNull, NullnessInfo.WithNull -> + if csenv.g.checkNullness then + WarnD(ConstraintSolverNullnessWarningWithTypes(csenv.DisplayEnv, ty1, ty2, n1, n2, csenv.m, m2)) + else + CompleteD + +and SolveTyparEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) ty1 ty = + trackErrors { + let m = csenv.m + do! DepthCheck ndeep m + match ty1 with + | TType_var (r, _) + | TType_measure (Measure.Var r) -> + do! SolveTyparEqualsTypePart1 csenv m2 trace ty1 r ty + do! SolveTyparEqualsTypePart2 csenv ndeep m2 trace r ty + | _ -> failwith "SolveTyparEqualsType" } // Like SolveTyparEqualsType but asserts all typar equalities simultaneously instead of one by one -and SolveTyparsEqualTypes (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) tpTys tys = trackErrors { - do! (tpTys, tys) ||> Iterate2D (fun tpTy ty -> - match tpTy with - | TType_var (r, _) - | TType_measure (Measure.Var r) -> - SolveTyparEqualsTypePart1 csenv m2 trace tpTy r ty - | _ -> - failwith "SolveTyparsEqualTypes") - - do! (tpTys, tys) ||> Iterate2D (fun tpTy ty -> - match tpTy with - | TType_var (r, _) - | TType_measure (Measure.Var r) -> - SolveTyparEqualsTypePart2 csenv ndeep m2 trace r ty - | _ -> - failwith "SolveTyparsEqualTypes") - } +and SolveTyparsEqualTypes (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) tpTys tys = + trackErrors { + do! Iterate2D ( + fun tpTy ty -> + match tpTy with + | TType_var (r, _) + | TType_measure (Measure.Var r) -> + SolveTyparEqualsTypePart1 csenv m2 trace tpTy r ty + | _ -> + failwith "SolveTyparsEqualTypes") tpTys tys + do! Iterate2D ( + fun tpTy ty -> + match tpTy with + | TType_var (r, _) + | TType_measure (Measure.Var r) -> + SolveTyparEqualsTypePart2 csenv ndeep m2 trace r ty + | _ -> + failwith "SolveTyparsEqualTypes") tpTys tys + } and SolveAnonInfoEqualsAnonInfo (csenv: ConstraintSolverEnv) m2 (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = if evalTupInfoIsStruct anonInfo1.TupInfo <> evalTupInfoIsStruct anonInfo2.TupInfo then @@ -1137,80 +1218,171 @@ and SolveTypeEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTr let aenv = csenv.EquivEnv let g = csenv.g - // Pre F# 6.0 we asssert the trait solution here -#if TRAIT_CONSTRAINT_CORRECTIONS - if not (csenv.g.langVersion.SupportsFeature LanguageFeature.TraitConstraintCorrections) then -#endif match cxsln with | Some (traitInfo, traitSln) when traitInfo.Solution.IsNone -> // If this is an overload resolution at this point it's safe to assume the candidate member being evaluated solves this member constraint. TransactMemberConstraintSolution traitInfo trace traitSln | _ -> () - if ty1 === ty2 then CompleteD else - - let canShortcut = not trace.HasTrace - let sty1 = stripTyEqnsA csenv.g canShortcut ty1 - let sty2 = stripTyEqnsA csenv.g canShortcut ty2 - - match sty1, sty2 with - - // type vars inside forall-types may be alpha-equivalent - | TType_var (tp1, _), TType_var (tp2, _) when typarEq tp1 tp2 || (match aenv.EquivTypars.TryFind tp1 with | Some tpTy1 when typeEquiv g tpTy1 ty2 -> true | _ -> false) -> - CompleteD + if ty1 === ty2 then + CompleteD + else + let canShortcut = not trace.HasTrace + let sty1 = stripTyEqnsA csenv.g canShortcut ty1 + let sty2 = stripTyEqnsA csenv.g canShortcut ty2 + + let csenv = + match ty1 with + | TType.TType_var(r,_) when r.typar_flags.IsSupportsNullFlex -> + { csenv with IsSupportsNullFlex = true} + | _ -> csenv + + match sty1, sty2 with + // type vars inside forall-types may be alpha-equivalent + | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when typarEq tp1 tp2 || (match aenv.EquivTypars.TryFind tp1 with | Some tpTy1 when typeEquiv g tpTy1 ty2 -> true | _ -> false) -> + SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 + + | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when PreferUnifyTypar tp1 tp2 -> + match nullness1.TryEvaluate(), nullness2.TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty1 (TType_var (tp2, g.knownWithoutNull)) + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithoutNull -> + let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln sty2 (TType_var(tpNew, g.knownWithNull)) + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty1 + } + //// Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty1 (TType_var (tp2, g.knownWithoutNull)) + | _ -> + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 + let nullnessAfterSolution1 = combineNullness (nullnessOfTy g sty1) nullness1 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullnessAfterSolution1 nullness2 + } - // 'v1 = 'v2 - | TType_var (tp1, _), TType_var (tp2, _) when PreferUnifyTypar tp1 tp2 -> - SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 - // 'v1 = 'v2 - | TType_var (tp1, _), TType_var (tp2, _) when not csenv.MatchingOnly && PreferUnifyTypar tp2 tp1 -> - SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 + | TType_var (tp1, nullness1), TType_var (tp2, nullness2) when not csenv.MatchingOnly && PreferUnifyTypar tp2 tp1 -> + match nullness1.TryEvaluate(), nullness2.TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty2 (TType_var (tp1, g.knownWithoutNull)) + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithoutNull -> + let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln sty2 (TType_var(tpNew, g.knownWithNull)) + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty1 + } + //// Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty2 (TType_var (tp1, g.knownWithoutNull)) + | _ -> + // Unifying 'T1 ? and 'T2 % + // Unifying 'T1 % and 'T2 ? + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 + let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullnessAfterSolution2 + } - | TType_var (r, _), _ when not (IsRigid csenv r) -> - SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 + | TType_var (tp1, nullness1), _ when not (IsRigid csenv tp1) -> + match nullness1.TryEvaluate(), (nullnessOfTy g sty2).TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty1 (replaceNullnessOfTy g.knownWithoutNull sty2) + | ValueSome NullnessInfo.WithoutNull, ValueSome NullnessInfo.WithoutNull when + csenv.IsSupportsNullFlex && + isAppTy g sty2 && + tp1.Constraints |> List.exists (function TyparConstraint.SupportsNull _ -> true | _ -> false) -> + let tpNew = NewCompGenTypar(TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln (TType_var(tpNew, g.knownWithoutNull)) sty2 + do! SolveTypeEqualsType csenv ndeep m2 trace cxsln ty1 (TType_var(tpNew, g.knownWithNull)) + } + // Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty1 (replaceNullnessOfTy g.knownWithoutNull sty2) + | _ -> + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty1 ty2 + let nullnessAfterSolution1 = combineNullness (nullnessOfTy g sty1) nullness1 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullnessAfterSolution1 (nullnessOfTy g sty2) + } - | _, TType_var (r, _) when not csenv.MatchingOnly && not (IsRigid csenv r) -> - SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 + | _, TType_var (tp2, nullness2) when not csenv.MatchingOnly && not (IsRigid csenv tp2) -> + match (nullnessOfTy g sty1).TryEvaluate(), nullness2.TryEvaluate() with + // Unifying 'T1? and 'T2? + | ValueSome NullnessInfo.WithNull, ValueSome NullnessInfo.WithNull -> + SolveTyparEqualsType csenv ndeep m2 trace sty2 (replaceNullnessOfTy g.knownWithoutNull sty1) + // Unifying 'T1 % and 'T2 % + //| ValueSome NullnessInfo.AmbivalentToNull, ValueSome NullnessInfo.AmbivalentToNull -> + // SolveTyparEqualsType csenv ndeep m2 trace sty2 (replaceNullnessOfTy g.knownWithoutNull sty1) + | _ -> + trackErrors { + do! SolveTyparEqualsType csenv ndeep m2 trace sty2 ty1 + let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) nullnessAfterSolution2 + } - // Catch float<_>=float<1>, float32<_>=float32<1> and decimal<_>=decimal<1> - | _, TType_app (tc2, [ms], _) when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms])) -> - SolveTypeEqualsType csenv ndeep m2 trace None ms (TType_measure Measure.One) + // Catch float<_>=float<1>, float32<_>=float32<1> and decimal<_>=decimal<1> + | (_, TType_app (tc2, [ms2], _)) when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2])) -> + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace None (TType_measure Measure.One) ms2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - | TType_app (tc2, [ms], _), _ when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms])) -> - SolveTypeEqualsType csenv ndeep m2 trace None ms (TType_measure Measure.One) + | (TType_app (tc1, [ms1], _), _) when (tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1])) -> + trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace None ms1 (TType_measure Measure.One) + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> - SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> + trackErrors { + do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } + | TType_app _, TType_app _ -> + localAbortD - | TType_app _, TType_app _ -> - localAbortD + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> + if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then + ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) + else + SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> - if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) else - SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> + trackErrors { + do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 + do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + } - | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> trackErrors { - do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 - do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - } - | TType_fun (domainTy1, rangeTy1, _), TType_fun (domainTy2, rangeTy2, _) -> - SolveFunTypeEqn csenv ndeep m2 trace None domainTy1 domainTy2 rangeTy1 rangeTy2 + | TType_fun (domainTy1, rangeTy1, nullness1), TType_fun (domainTy2, rangeTy2, nullness2) -> + trackErrors { + do! SolveFunTypeEqn csenv ndeep m2 trace None domainTy1 domainTy2 rangeTy1 rangeTy2 + do! SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 + } - | TType_measure ms1, TType_measure ms2 -> - UnifyMeasures csenv trace ms1 ms2 + | TType_measure ms1, TType_measure ms2 -> + UnifyMeasures csenv trace ms1 ms2 - | TType_forall(tps1, bodyTy1), TType_forall(tps2, bodyTy2) -> - if tps1.Length <> tps2.Length then localAbortD else - let aenv = aenv.BindEquivTypars tps1 tps2 - let csenv = {csenv with EquivEnv = aenv } - if not (typarsAEquiv g aenv tps1 tps2) then localAbortD else - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bodyTy1 bodyTy2 + | TType_forall(tps1, bodyTy1), TType_forall(tps2, bodyTy2) -> + if tps1.Length <> tps2.Length then + localAbortD + else + let aenv = aenv.BindEquivTypars tps1 tps2 + let csenv = {csenv with EquivEnv = aenv } + if not (typarsAEquiv g aenv tps1 tps2) then + localAbortD + else + SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bodyTy1 bodyTy2 - | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> - SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> + SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - | _ -> localAbortD + | _ -> localAbortD and SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1 ty2 = SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace None ty1 ty2 @@ -1223,14 +1395,14 @@ and private SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln t | LocallyAbortOperationThatLosesAbbrevs -> ErrorD(ConstraintSolverTypesNotInEqualityRelation(csenv.DisplayEnv, ty1, ty2, csenv.m, m2, csenv.eContextInfo)) | err -> ErrorD err) -and SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln origl1 origl2 = - match origl1, origl2 with - | [], [] -> CompleteD - | _ -> +and SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln origl1 origl2 = + match origl1, origl2 with + | [], [] -> CompleteD + | _ -> // We unwind Iterate2D by hand here for performance reasons. - let rec loop l1 l2 = - match l1, l2 with - | [], [] -> CompleteD + let rec loop l1 l2 = + match l1, l2 with + | [], [] -> CompleteD | h1 :: t1, h2 :: t2 when t1.Length = t2.Length -> trackErrors { do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln h1 h2 @@ -1240,119 +1412,179 @@ and SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln origl1 origl2 = ErrorD(ConstraintSolverTupleDiffLengths(csenv.DisplayEnv, csenv.eContextInfo, origl1, origl2, csenv.m, m2)) loop origl1 origl2 -and SolveFunTypeEqn csenv ndeep m2 trace cxsln domainTy1 domainTy2 rangeTy1 rangeTy2 = trackErrors { - do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln domainTy1 domainTy2 - return! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln rangeTy1 rangeTy2 - } +and SolveTypeEqualsTypeWithContravarianceEqns (csenv:ConstraintSolverEnv) ndeep m2 trace cxsln origl1 origl2 typars = + let isContravariant (t:Typar) = + t.typar_opt_data + |> Option.map (fun d -> d.typar_is_contravariant) + |> Option.defaultValue(false) + + match origl1, origl2, typars with + | [], [], [] -> CompleteD + | _ -> + // We unwind Iterate2D by hand here for performance reasons. + let rec loop l1 l2 tps = + match l1, l2, tps with + | [], [], [] -> CompleteD + | h1 :: t1, h2 :: t2, hTp :: tTps when t1.Length = t2.Length && t1.Length = tTps.Length -> + trackErrors { + let h1 = + // For contravariant typars (` in C#'), if the required type is WithNull, the actual type can have any nullness it wants + // Without this added logic, their nullness would be forced to be equal. + if isContravariant hTp && (nullnessOfTy csenv.g h2).TryEvaluate() = ValueSome NullnessInfo.WithNull then + replaceNullnessOfTy csenv.g.knownWithNull h1 + else + h1 + + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln h1 h2 + do! loop t1 t2 tTps + } + | _ -> + ErrorD(ConstraintSolverTupleDiffLengths(csenv.DisplayEnv, csenv.eContextInfo, origl1, origl2, csenv.m, m2)) + loop origl1 origl2 typars + +and SolveFunTypeEqn csenv ndeep m2 trace cxsln domainTy1 domainTy2 rangeTy1 rangeTy2 = + trackErrors { + let g = csenv.g + let domainTy2 = reqTyForArgumentNullnessInference g domainTy1 domainTy2 + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln domainTy2 domainTy1 + return! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln rangeTy1 rangeTy2 + } // ty1: expected // ty2: actual // // "ty2 casts to ty1" // "a value of type ty2 can be used where a value of type ty1 is expected" -and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) cxsln ty1 ty2 = - // 'a :> obj ---> +and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) cxsln ty1 ty2 = let ndeep = ndeep + 1 let g = csenv.g - if isObjTy g ty1 then CompleteD else let canShortcut = not trace.HasTrace - let sty1 = stripTyEqnsA csenv.g canShortcut ty1 - let sty2 = stripTyEqnsA csenv.g canShortcut ty2 - - let amap = csenv.amap - let aenv = csenv.EquivEnv - let denv = csenv.DisplayEnv - - match sty1, sty2 with - | TType_var (tp1, _), _ -> - match aenv.EquivTypars.TryFind tp1 with - | Some tpTy1 -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln tpTy1 ty2 - | _ -> - match sty2 with - | TType_var (r2, _) when typarEq tp1 r2 -> CompleteD - | TType_var (r, _) when not csenv.MatchingOnly -> SolveTyparSubtypeOfType csenv ndeep m2 trace r ty1 - | _ -> SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ty1 ty2 - - | _, TType_var (r, _) when not csenv.MatchingOnly -> - SolveTyparSubtypeOfType csenv ndeep m2 trace r ty1 - | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> - if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) else - SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *) - - | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> trackErrors { - do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 - do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *) - } - - | TType_fun (domainTy1, rangeTy1, _), TType_fun (domainTy2, rangeTy2, _) -> - SolveFunTypeEqn csenv ndeep m2 trace cxsln domainTy1 domainTy2 rangeTy1 rangeTy2 (* nb. can unify since no variance *) - - | TType_measure ms1, TType_measure ms2 -> - UnifyMeasures csenv trace ms1 ms2 + // 'a :> objnull ---> + if isObjNullTy g ty1 then + CompleteD + elif isObjTyAnyNullness g ty1 && not csenv.MatchingOnly && not(isTyparTy g ty2) then + let nullness t = t |> stripTyEqnsA g canShortcut |> nullnessOfTy g + SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullness ty1) (nullness ty2) + else + let sty1 = stripTyEqnsA csenv.g canShortcut ty1 + let sty2 = stripTyEqnsA csenv.g canShortcut ty2 + let amap = csenv.amap + let aenv = csenv.EquivEnv + let denv = csenv.DisplayEnv - // Enforce the identities float=float<1>, float32=float32<1> and decimal=decimal<1> - | _, TType_app (tc2, [ms], _) when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms])) -> - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms (TType_measure Measure.One) + match sty1, sty2 with + | TType_var (tp1, nullness1) , _ -> + match aenv.EquivTypars.TryFind tp1 with + | Some tpTy1 -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln tpTy1 ty2 + | _ -> + match sty2 with + | TType_var (r2, nullness2) when typarEq tp1 r2 -> + SolveNullnessEquiv csenv m2 trace ty1 ty2 nullness1 nullness2 + | TType_var (r2, nullness2) when not csenv.MatchingOnly -> + trackErrors { + do! SolveTyparSubtypeOfType csenv ndeep m2 trace r2 ty1 + let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nullness1 nullnessAfterSolution2 + } + | _ -> SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ty1 ty2 - | TType_app (tc2, [ms], _), _ when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms])) -> - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms (TType_measure Measure.One) + | _, TType_var (r2, nullness2) when not csenv.MatchingOnly -> + trackErrors { + do! SolveTyparSubtypeOfType csenv ndeep m2 trace r2 ty1 + let nullnessAfterSolution2 = combineNullness (nullnessOfTy g sty2) nullness2 + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) nullnessAfterSolution2 + } - // Special subsumption rule for byref tags - | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 && g.byref2_tcr.CanDeref && tyconRefEq g g.byref2_tcr tc1 -> - match l1, l2 with - | [ h1; tag1 ], [ h2; tag2 ] -> trackErrors { - do! SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 - match stripTyEqnsA csenv.g canShortcut tag1, stripTyEqnsA csenv.g canShortcut tag2 with - | TType_app(tagc1, [], _), TType_app(tagc2, [], _) - when (tyconRefEq g tagc2 g.byrefkind_InOut_tcr && - (tyconRefEq g tagc1 g.byrefkind_In_tcr || tyconRefEq g tagc1 g.byrefkind_Out_tcr) ) -> () - | _ -> return! SolveTypeEqualsType csenv ndeep m2 trace cxsln tag1 tag2 - } - | _ -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> + if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then + ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) + else + SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *) + | TType_fun (domainTy1, rangeTy1, nullness1), TType_fun (domainTy2, rangeTy2, nullness2) -> + // nb. can unify since no variance + trackErrors { + do! SolveFunTypeEqn csenv ndeep m2 trace cxsln domainTy1 domainTy2 rangeTy1 rangeTy2 + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 nullness1 nullness2 + } + | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> + trackErrors { + do! SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 + do! SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 + } + | TType_measure ms1, TType_measure ms2 -> + UnifyMeasures csenv trace ms1 ms2 - | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> - SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 + // Enforce the identities float=float<1>, float32=float32<1> and decimal=decimal<1> + | _, TType_app (tc2, [ms2], _) when tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2]) -> + trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms2 (TType_measure Measure.One) + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> - SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 + | TType_app (tc1, [ms1], _), _ when tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1]) -> + trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms1 (TType_measure Measure.One) + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - | _ -> - // By now we know the type is not a variable type + // Special subsumption rule for byref tags + | TType_app (tc1, l1, _) , TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 && g.byref2_tcr.CanDeref && tyconRefEq g g.byref2_tcr tc1 -> + match l1, l2 with + | [ h1; tag1 ], [ h2; tag2 ] -> trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 + match stripTyEqnsA csenv.g canShortcut tag1, stripTyEqnsA csenv.g canShortcut tag2 with + | TType_app(tagc1, [], _), TType_app(tagc2, [], _) + when (tyconRefEq g tagc2 g.byrefkind_InOut_tcr && + (tyconRefEq g tagc1 g.byrefkind_In_tcr || tyconRefEq g tagc1 g.byrefkind_Out_tcr) ) -> () + | _ -> return! SolveTypeEqualsType csenv ndeep m2 trace cxsln tag1 tag2 + } + | _ -> SolveTypeEqualsTypeWithContravarianceEqns csenv ndeep m2 trace cxsln l1 l2 tc1.TyparsNoRange - // C :> obj ---> - if isObjTy g ty1 then CompleteD else - - let m = csenv.m + | TType_app (tc1, l1, _) , TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> + trackErrors { + do! SolveTypeEqualsTypeWithContravarianceEqns csenv ndeep m2 trace cxsln l1 l2 tc1.TyparsNoRange + do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2) + } - // 'a[] :> IList<'b> ---> 'a = 'b - // 'a[] :> ICollection<'b> ---> 'a = 'b - // 'a[] :> IEnumerable<'b> ---> 'a = 'b - // 'a[] :> IReadOnlyList<'b> ---> 'a = 'b - // 'a[] :> IReadOnlyCollection<'b> ---> 'a = 'b - // Note we don't support co-variance on array types nor - // the special .NET conversions for these types - match ty1 with - | AppTy g (tcref1, tinst1) when - isArray1DTy g ty2 && - (tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IList || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_ICollection || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyList || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyCollection || - tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IEnumerable) -> - match tinst1 with - | [elemTy1] -> - let elemTy2 = destArrayTy g ty2 - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln elemTy1 elemTy2 - | _ -> error(InternalError("destArrayTy", m)) + | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> + SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 | _ -> - // D :> Head<_> --> C :> Head<_> for the - // first interface or super-class C supported by D which - // may feasibly convert to Head. - match FindUniqueFeasibleSupertype g amap m ty1 ty2 with - | None -> ErrorD(ConstraintSolverTypesNotInSubsumptionRelation(denv, ty1, ty2, m, m2)) - | Some t -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln ty1 t + // By now we know the type is not a variable type + // C :> obj ---> + if isObjNullTy g ty1 then + CompleteD + else + let m = csenv.m + // 'a[] :> IList<'b> ---> 'a = 'b + // 'a[] :> ICollection<'b> ---> 'a = 'b + // 'a[] :> IEnumerable<'b> ---> 'a = 'b + // 'a[] :> IReadOnlyList<'b> ---> 'a = 'b + // 'a[] :> IReadOnlyCollection<'b> ---> 'a = 'b + // Note we don't support co-variance on array types nor + // the special .NET conversions for these types + match ty1 with + | AppTy g (tcref1, tinst1) when + isArray1DTy g ty2 && + (tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IList || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_ICollection || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyList || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IReadOnlyCollection || + tyconRefEq g tcref1 g.tcref_System_Collections_Generic_IEnumerable) -> + match tinst1 with + | [elemTy1] -> + let elemTy2 = destArrayTy g ty2 + SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln elemTy1 elemTy2 + | _ -> error(InternalError("destArrayTy", m)) + + | _ -> + // D :> Head<_> --> C :> Head<_> for the + // first interface or super-class C supported by D which + // may feasibly convert to Head. + match FindUniqueFeasibleSupertype g amap m ty1 ty2 with + | None -> ErrorD(ConstraintSolverTypesNotInSubsumptionRelation(denv, ty1, ty2, m, m2)) + | Some t -> SolveTypeSubsumesType csenv ndeep m2 trace cxsln ty1 t and SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace cxsln ty1 ty2 = let denv = csenv.DisplayEnv @@ -1367,21 +1599,28 @@ and SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace cxsln ty1 ty2 = and SolveTyparSubtypeOfType (csenv: ConstraintSolverEnv) ndeep m2 trace tp ty1 = let g = csenv.g - if isObjTy g ty1 then CompleteD - elif typeEquiv g ty1 (mkTyparTy tp) then CompleteD + if isObjNullTy g ty1 then + CompleteD + elif isObjTyAnyNullness g ty1 then + AddConstraint csenv ndeep m2 trace tp (TyparConstraint.NotSupportsNull csenv.m) + elif typeEquiv g ty1 (mkTyparTy tp) then + CompleteD elif isSealedTy g ty1 then SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace (mkTyparTy tp) ty1 else AddConstraint csenv ndeep m2 trace tp (TyparConstraint.CoercesTo(ty1, csenv.m)) and DepthCheck ndeep m = - if ndeep > 300 then error(Error(FSComp.SR.csTypeInferenceMaxDepth(), m)) else CompleteD + if ndeep > 300 then + error(Error(FSComp.SR.csTypeInferenceMaxDepth(), m)) + else + CompleteD // If this is a type that's parameterized on a unit-of-measure (expected to be numeric), unify its measure with 1 and SolveDimensionlessNumericType (csenv: ConstraintSolverEnv) ndeep m2 trace ty = match getMeasureOfType csenv.g ty with | Some (tcref, _) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty (mkAppTy tcref [TType_measure Measure.One]) + SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty (mkWoNullAppTy tcref [TType_measure Measure.One]) | None -> CompleteD @@ -1393,425 +1632,440 @@ and SolveDimensionlessNumericType (csenv: ConstraintSolverEnv) ndeep m2 trace ty /// will deal with the problem. /// /// 2. Some additional solutions are forced prior to generalization (permitWeakResolution= Yes or YesDuringCodeGen). See above -and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace traitInfo : OperationResult = trackErrors { - let (TTrait(supportTys, nm, memFlags, traitObjAndArgTys, retTy, sln)) = traitInfo - // Do not re-solve if already solved - if sln.Value.IsSome then return true else - - let g = csenv.g - let m = csenv.m - let amap = csenv.amap - let aenv = csenv.EquivEnv - let denv = csenv.DisplayEnv - - let ndeep = ndeep + 1 - do! DepthCheck ndeep m - - // Remove duplicates from the set of types in the support - let supportTys = ListSet.setify (typeAEquiv g aenv) supportTys +and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace traitInfo : OperationResult = + trackErrors { + let (TTrait(supportTys, nm, memFlags, traitObjAndArgTys, retTy, source, sln)) = traitInfo + // Do not re-solve if already solved + if sln.Value.IsSome then + return true + else + let g = csenv.g + let m = csenv.m + let amap = csenv.amap + let aenv = csenv.EquivEnv + let denv = csenv.DisplayEnv - // Rebuild the trait info after removing duplicates - let traitInfo = TTrait(supportTys, nm, memFlags, traitObjAndArgTys, retTy, sln) - let retTy = GetFSharpViewOfReturnType g retTy - - // Assert the object type if the constraint is for an instance member - if memFlags.IsInstance then - match supportTys, traitObjAndArgTys with - | [ty], h :: _ -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace h ty - | _ -> do! ErrorD (ConstraintSolverError(FSComp.SR.csExpectedArguments(), m, m2)) - - // Trait calls are only supported on pseudo type (variables) - if not (g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers) then - for e in supportTys do - do! SolveTypStaticReq csenv trace TyparStaticReq.HeadType e - - // SRTP constraints on rigid type parameters do not need to be solved - let isRigid = - supportTys |> List.forall (fun ty -> - match tryDestTyparTy g ty with - | ValueSome tp -> - match tp.Rigidity with - | TyparRigidity.Rigid - | TyparRigidity.WillBeRigid -> true - | _ -> false - | ValueNone -> false) + let ndeep = ndeep + 1 + do! DepthCheck ndeep m - let argTys = if memFlags.IsInstance then List.tail traitObjAndArgTys else traitObjAndArgTys + // Remove duplicates from the set of types in the support + let supportTys = ListSet.setify (typeAEquiv g aenv) supportTys - let minfos = GetRelevantMethodsForTrait csenv permitWeakResolution nm traitInfo + // Rebuild the trait info after removing duplicates + let traitInfo = traitInfo.WithSupportTypes supportTys + let retTy = GetFSharpViewOfReturnType g retTy - let! res = - trackErrors { - match minfos, supportTys, memFlags.IsInstance, nm, argTys with - | _, _, false, ("op_Division" | "op_Multiply"), [argTy1;argTy2] - when - // This simulates the existence of - // float * float -> float - // float32 * float32 -> float32 - // float<'u> * float<'v> -> float<'u 'v> - // float32<'u> * float32<'v> -> float32<'u 'v> - // decimal<'u> * decimal<'v> -> decimal<'u 'v> - // decimal<'u> * decimal -> decimal<'u> - // float32<'u> * float32<'v> -> float32<'u 'v> - // int * int -> int - // int64 * int64 -> int64 - // - // The rule is triggered by these sorts of inputs when permitWeakResolution=false - // float * float - // float * float32 // will give error - // decimal * decimal - // decimal * decimal <-- Note this one triggers even though "decimal" has some possibly-relevant methods - // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead - // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead - // - // The rule is triggered by these sorts of inputs when permitWeakResolution=true - // float * 'a - // 'a * float - // decimal<'u> * 'a - (let checkRuleAppliesInPreferenceToMethods argTy1 argTy2 = - // Check that at least one of the argument types is numeric - IsNumericOrIntegralEnumType g argTy1 && - // Check the other type is nominal, unless using weak resolution - IsBinaryOpOtherArgType g permitWeakResolution argTy2 && - // This next condition checks that either - // - Neither type contributes any methods OR - // - We have the special case "decimal<_> * decimal". In this case we have some - // possibly-relevant methods from "decimal" but we ignore them in this case. - (isNil minfos || (Option.isSome (getMeasureOfType g argTy1) && isDecimalTy g argTy2)) in - - checkRuleAppliesInPreferenceToMethods argTy1 argTy2 || - checkRuleAppliesInPreferenceToMethods argTy2 argTy1) -> - - match getMeasureOfType g argTy1 with - | Some (tcref, ms1) -> - let ms2 = freshMeasure () - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 (mkAppTy tcref [TType_measure ms2]) - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) - return TTraitBuiltIn - - | _ -> - - match getMeasureOfType g argTy2 with - | Some (tcref, ms2) -> - let ms1 = freshMeasure () - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkAppTy tcref [TType_measure ms1]) - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) - return TTraitBuiltIn - - | _ -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - | _, _, false, ("op_Addition" | "op_Subtraction" | "op_Modulus"), [argTy1;argTy2] - when // Ignore any explicit +/- overloads from any basic integral types - (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && - ( IsAddSubModType nm g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 - || IsAddSubModType nm g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - | _, _, false, ("op_LessThan" | "op_LessThanOrEqual" | "op_GreaterThan" | "op_GreaterThanOrEqual" | "op_Equality" | "op_Inequality" ), [argTy1;argTy2] - when // Ignore any explicit overloads from any basic integral types - (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && - ( IsRelationalType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 - || IsRelationalType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.bool_ty - return TTraitBuiltIn - - // We pretend for uniformity that the numeric types have a static property called Zero and One - // As with constants, only zero is polymorphic in its units - | [], [ty], false, "get_Zero", [] - when isNumericType g ty || isCharTy g ty -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty - return TTraitBuiltIn - - | [], [ty], false, "get_One", [] - when isNumericType g ty || isCharTy g ty -> - do! SolveDimensionlessNumericType csenv ndeep m2 trace ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty - return TTraitBuiltIn - - | [], _, false, "DivideByInt", [argTy1;argTy2] - when isFpTy g argTy1 || isDecimalTy g argTy1 -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - // We pretend for uniformity that the 'string' and 'array' types have an indexer property called 'Item' - | [], [ty], true, "get_Item", [argTy1] - when isStringTy g ty -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 g.int_ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.char_ty - return TTraitBuiltIn - - | [], [ty], true, "get_Item", argTys - when isArrayTy g ty -> - - if rankOfArrayTy g ty <> argTys.Length then - do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), argTys.Length), m, m2)) - - for argTy in argTys do - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty - - let ety = destArrayTy g ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ety - return TTraitBuiltIn - - | [], [ty], true, "set_Item", argTys - when isArrayTy g ty -> - - if rankOfArrayTy g ty <> argTys.Length - 1 then - do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argTys.Length - 1)), m, m2)) - let argTys, lastTy = List.frontAndBack argTys - - for argTy in argTys do - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty - - let elemTy = destArrayTy g ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace lastTy elemTy - return TTraitBuiltIn - - | [], _, false, ("op_BitwiseAnd" | "op_BitwiseOr" | "op_ExclusiveOr"), [argTy1;argTy2] - when IsBitwiseOpType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 - || IsBitwiseOpType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1 -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 - return TTraitBuiltIn - - | [], _, false, ("op_LeftShift" | "op_RightShift"), [argTy1;argTy2] - when IsIntegerOrIntegerEnumTy g argTy1 -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 - return TTraitBuiltIn - - | _, _, false, "op_UnaryPlus", [argTy] - when IsNumericOrIntegralEnumType g argTy -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn - - | _, _, false, "op_UnaryNegation", [argTy] - when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn - - | _, _, true, "get_Sign", [] - when IsSignType g supportTys.Head -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.int32_ty - return TTraitBuiltIn - - | _, _, false, ("op_LogicalNot" | "op_OnesComplement"), [argTy] - when IsIntegerOrIntegerEnumTy g argTy -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy - return TTraitBuiltIn - - | _, _, false, "Abs", [argTy] - when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> - - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn - - | _, _, false, "Sqrt", [argTy1] - when isFpTy g argTy1 -> - match getMeasureOfType g argTy1 with - | Some (tcref, _) -> - let ms1 = freshMeasure () - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkAppTy tcref [TType_measure ms1]) - return TTraitBuiltIn - | None -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - | _, _, false, ("Sin" | "Cos" | "Tan" | "Sinh" | "Cosh" | "Tanh" | "Atan" | "Acos" | "Asin" | "Exp" | "Ceiling" | "Floor" | "Round" | "Truncate" | "Log10" | "Log" | "Sqrt"), [argTy] - when isFpTy g argTy -> - - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy - return TTraitBuiltIn - - // Conversions from non-decimal numbers / strings / chars to non-decimal numbers / chars are built-in - | _, _, false, "op_Explicit", [argTy] - when (// The input type. - (IsNonDecimalNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && - // The output type - (IsNonDecimalNumericOrIntegralEnumType g retTy || isCharTy g retTy)) -> - - return TTraitBuiltIn - - // Conversions from (including decimal) numbers / strings / chars to decimals are built-in - | _, _, false, "op_Explicit", [argTy] - when (// The input type. - (IsNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && - // The output type - (isDecimalTy g retTy)) -> - return TTraitBuiltIn - - // Conversions from decimal numbers to native integers are built-in - // The rest of decimal conversions are handled via op_Explicit lookup on System.Decimal (which also looks for op_Implicit) - | _, _, false, "op_Explicit", [argTy] - when (// The input type. - (isDecimalTy g argTy) && - // The output type - (isNativeIntegerTy g retTy)) -> - return TTraitBuiltIn - - | [], _, false, "Pow", [argTy1; argTy2] - when isFpTy g argTy1 -> - - do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - return TTraitBuiltIn - - | _, _, false, "Atan2", [argTy1; argTy2] - when isFpTy g argTy1 -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 - match getMeasureOfType g argTy1 with - | None -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 - | Some (tcref, _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkAppTy tcref [TType_measure Measure.One]) - return TTraitBuiltIn + // Assert the object type if the constraint is for an instance member + if memFlags.IsInstance then + match supportTys, traitObjAndArgTys with + | [ty], h :: _ -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace h ty + | _ -> do! ErrorD (ConstraintSolverError(FSComp.SR.csExpectedArguments(), m, m2)) + + // Trait calls are only supported on pseudo type (variables) + if not (g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers) then + for e in supportTys do + do! SolveTypStaticReq csenv trace TyparStaticReq.HeadType e + + // SRTP constraints on rigid type parameters do not need to be solved + let isRigid = + supportTys |> List.forall (fun ty -> + match tryDestTyparTy g ty with + | ValueSome tp -> + match tp.Rigidity with + | TyparRigidity.Rigid + | TyparRigidity.WillBeRigid -> true + | _ -> false + | ValueNone -> false) + + let argTys = if memFlags.IsInstance then List.tail traitObjAndArgTys else traitObjAndArgTys + + let minfos = GetRelevantMethodsForTrait csenv permitWeakResolution nm traitInfo + + let! res = + trackErrors { + match minfos, supportTys, memFlags.IsInstance, nm, argTys with + | _, _, false, ("op_Division" | "op_Multiply"), [argTy1;argTy2] + when + // This simulates the existence of + // float * float -> float + // float32 * float32 -> float32 + // float<'u> * float<'v> -> float<'u 'v> + // float32<'u> * float32<'v> -> float32<'u 'v> + // decimal<'u> * decimal<'v> -> decimal<'u 'v> + // decimal<'u> * decimal -> decimal<'u> + // float32<'u> * float32<'v> -> float32<'u 'v> + // int * int -> int + // int64 * int64 -> int64 + // + // The rule is triggered by these sorts of inputs when permitWeakResolution=false + // float * float + // float * float32 // will give error + // decimal * decimal + // decimal * decimal <-- Note this one triggers even though "decimal" has some possibly-relevant methods + // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead + // float * Matrix // the rule doesn't trigger for this one since Matrix has overloads we can use and we prefer those instead + // + // The rule is triggered by these sorts of inputs when permitWeakResolution=true + // float * 'a + // 'a * float + // decimal<'u> * 'a + (let checkRuleAppliesInPreferenceToMethods argTy1 argTy2 = + // Check that at least one of the argument types is numeric + IsNumericOrIntegralEnumType g argTy1 && + // Check the other type is nominal, unless using weak resolution + IsBinaryOpOtherArgType g permitWeakResolution argTy2 && + // This next condition checks that either + // - Neither type contributes any methods OR + // - We have the special case "decimal<_> * decimal". In this case we have some + // possibly-relevant methods from "decimal" but we ignore them in this case. + (isNil minfos || (Option.isSome (getMeasureOfType g argTy1) && isDecimalTy g argTy2)) in + + checkRuleAppliesInPreferenceToMethods argTy1 argTy2 || + checkRuleAppliesInPreferenceToMethods argTy2 argTy1) -> + + match getMeasureOfType g argTy1 with + | Some (tcref, ms1) -> + let ms2 = freshMeasure () + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 (mkWoNullAppTy tcref [TType_measure ms2]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) + return TTraitBuiltIn - | _ -> - // OK, this is not solved by a built-in constraint. - // Now look for real solutions - - // First look for a solution by a record property - let recdPropSearch = - let isGetProp = nm.StartsWithOrdinal("get_") - let isSetProp = nm.StartsWithOrdinal("set_") - if not isRigid && ((argTys.IsEmpty && isGetProp) || isSetProp) then - let propName = nm[4..] - let props = - supportTys |> List.choose (fun ty -> - match TryFindIntrinsicNamedItemOfType csenv.InfoReader (propName, AccessibleFromEverywhere, false) FindMemberFlag.IgnoreOverrides m ty with - | Some (RecdFieldItem rfinfo) - when (isGetProp || rfinfo.RecdField.IsMutable) && - (rfinfo.IsStatic = not memFlags.IsInstance) && - IsRecdFieldAccessible amap m AccessibleFromEverywhere rfinfo.RecdFieldRef && - not rfinfo.LiteralValue.IsSome && - not rfinfo.RecdField.IsCompilerGenerated -> - Some (rfinfo, isSetProp) - | _ -> None) - match props with - | [ prop ] -> Some prop - | _ -> None - else - None - - let anonRecdPropSearch = - let isGetProp = nm.StartsWith "get_" - if not isRigid && isGetProp && memFlags.IsInstance then - let propName = nm[4..] - let props = - supportTys |> List.choose (fun ty -> - match NameResolution.TryFindAnonRecdFieldOfType g ty propName with - | Some (NameResolution.Item.AnonRecdField(anonInfo, tinst, i, _)) -> Some (anonInfo, tinst, i) - | _ -> None) - match props with - | [ prop ] -> Some prop - | _ -> None - else - None - - // Now check if there are no feasible solutions at all - match minfos, recdPropSearch, anonRecdPropSearch with - | [], None, None when MemberConstraintIsReadyForStrongResolution csenv traitInfo -> - if supportTys |> List.exists (isFunTy g) then - return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) - elif supportTys |> List.exists (isAnyTupleTy g) then - return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) - else - match nm, argTys with - | "op_Explicit", [argTy] -> - let argTyString = NicePrint.prettyStringOfTy denv argTy - let rtyString = NicePrint.prettyStringOfTy denv retTy - return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion(argTyString, rtyString), m, m2)) - | _ -> - let tyString = - match supportTys with - | [ty] -> NicePrint.minimalStringOfType denv ty - | _ -> supportTys |> List.map (NicePrint.minimalStringOfType denv) |> String.concat ", " - let opName = ConvertValLogicalNameToDisplayNameCore nm - let err = - match opName with - | "?>=" | "?>" | "?<=" | "?<" | "?=" | "?<>" - | ">=?" | ">?" | "<=?" | "?" - | "?>=?" | "?>?" | "?<=?" | "??" -> - if List.isSingleton supportTys then FSComp.SR.csTypeDoesNotSupportOperatorNullable(tyString, opName) - else FSComp.SR.csTypesDoNotSupportOperatorNullable(tyString, opName) - | _ -> - if List.isSingleton supportTys then FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) - else FSComp.SR.csTypesDoNotSupportOperator(tyString, opName) - return! ErrorD(ConstraintSolverError(err, m, m2)) + | _ -> - | _ -> - let dummyExpr = mkUnit g m - let calledMethGroup = - minfos - // curried members may not be used to satisfy constraints - |> List.choose (fun (staticTy, minfo) -> - if minfo.IsCurried then None else - let callerArgs = - { Unnamed = [ (argTys |> List.map (fun argTy -> CallerArg(argTy, m, false, dummyExpr))) ] - Named = [ [ ] ] } - let minst = FreshenMethInfo m minfo - let objtys = minfo.GetObjArgTypes(amap, m, minst) - Some(CalledMeth(csenv.InfoReader, None, false, FreshenMethInfo, m, AccessibleFromEverywhere, minfo, minst, minst, None, objtys, callerArgs, false, false, None, Some staticTy))) - - let methOverloadResult, errors = - trace.CollectThenUndoOrCommit - (fun (a, _) -> Option.isSome a) - (fun trace -> ResolveOverloading csenv (WithTrace trace) nm ndeep (Some traitInfo) CallerArgs.Empty AccessibleFromEverywhere calledMethGroup false (Some (MustEqual retTy))) - - match anonRecdPropSearch, recdPropSearch, methOverloadResult with - | Some (anonInfo, tinst, i), None, None -> - // OK, the constraint is solved by a record property. Assert that the return types match. - let rty2 = List.item i tinst - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 - return TTraitSolvedAnonRecdProp(anonInfo, tinst, i) - - | None, Some (rfinfo, isSetProp), None -> - // OK, the constraint is solved by a record property. Assert that the return types match. - let rty2 = if isSetProp then g.unit_ty else rfinfo.FieldType - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 - return TTraitSolvedRecdProp(rfinfo, isSetProp) - - | None, None, Some (calledMeth: CalledMeth<_>) -> - // OK, the constraint is solved. - let minfo = calledMeth.Method - - do! errors - let isInstance = minfo.IsInstance - if isInstance <> memFlags.IsInstance then - return! - if isInstance then - ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsNotStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) - else - ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) - else - do! CheckMethInfoAttributes g m None minfo - return TTraitSolved (minfo, calledMeth.CalledTyArgs, calledMeth.OptionalStaticType) - - | _ -> - do! AddUnsolvedMemberConstraint csenv ndeep m2 trace permitWeakResolution ignoreUnresolvedOverload traitInfo errors - return TTraitUnsolved - } - return! RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res - } + match getMeasureOfType g argTy2 with + | Some (tcref, ms2) -> + let ms1 = freshMeasure () + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure ms1]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) + return TTraitBuiltIn + + | _ -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn + + | _, _, false, ("op_Addition" | "op_Subtraction" | "op_Modulus"), [argTy1;argTy2] + when // Ignore any explicit +/- overloads from any basic integral types + (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && + ( IsAddSubModType nm g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 + || IsAddSubModType nm g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn + + | _, _, false, ("op_LessThan" | "op_LessThanOrEqual" | "op_GreaterThan" | "op_GreaterThanOrEqual" | "op_Equality" | "op_Inequality" ), [argTy1;argTy2] + when // Ignore any explicit overloads from any basic integral types + (minfos |> List.forall (fun (_, minfo) -> isIntegerTy g minfo.ApparentEnclosingType ) && + ( IsRelationalType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 + || IsRelationalType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1)) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.bool_ty + return TTraitBuiltIn + + // We pretend for uniformity that the numeric types have a static property called Zero and One + // As with constants, only zero is polymorphic in its units + | [], [ty], false, "get_Zero", [] + when isNumericType g ty || isCharTy g ty -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty + return TTraitBuiltIn + + | [], [ty], false, "get_One", [] + when isNumericType g ty || isCharTy g ty -> + do! SolveDimensionlessNumericType csenv ndeep m2 trace ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ty + return TTraitBuiltIn + + | [], _, false, "DivideByInt", [argTy1;argTy2] + when isFpTy g argTy1 || isDecimalTy g argTy1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn + + // We pretend for uniformity that the 'string' and 'array' types have an indexer property called 'Item' + | [], [ty], true, "get_Item", [argTy1] + when isStringTy g ty -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.char_ty + return TTraitBuiltIn + + | [], [ty], true, "get_Item", argTys + when isArrayTy g ty -> + + if rankOfArrayTy g ty <> argTys.Length then + do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), argTys.Length), m, m2)) + + for argTy in argTys do + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty + + let ety = destArrayTy g ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ety + return TTraitBuiltIn + + | [], [ty], true, "set_Item", argTys + when isArrayTy g ty -> + + if rankOfArrayTy g ty <> argTys.Length - 1 then + do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argTys.Length - 1)), m, m2)) + let argTys, lastTy = List.frontAndBack argTys + + for argTy in argTys do + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy g.int_ty + + let elemTy = destArrayTy g ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace lastTy elemTy + return TTraitBuiltIn + + | [], _, false, ("op_BitwiseAnd" | "op_BitwiseOr" | "op_ExclusiveOr"), [argTy1;argTy2] + when IsBitwiseOpType g argTy1 && IsBinaryOpOtherArgType g permitWeakResolution argTy2 + || IsBitwiseOpType g argTy2 && IsBinaryOpOtherArgType g permitWeakResolution argTy1 -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 + return TTraitBuiltIn + + | [], _, false, ("op_LeftShift" | "op_RightShift"), [argTy1;argTy2] + when IsIntegerOrIntegerEnumTy g argTy1 -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 + return TTraitBuiltIn + + | _, _, false, "op_UnaryPlus", [argTy] + when IsNumericOrIntegralEnumType g argTy -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn + + | _, _, false, "op_UnaryNegation", [argTy] + when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn + + | _, _, true, "get_Sign", [] + when IsSignType g supportTys.Head -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy g.int32_ty + return TTraitBuiltIn + + | _, _, false, ("op_LogicalNot" | "op_OnesComplement"), [argTy] + when IsIntegerOrIntegerEnumTy g argTy -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy + return TTraitBuiltIn + + | _, _, false, "Abs", [argTy] + when isSignedIntegerTy g argTy || isFpTy g argTy || isDecimalTy g argTy -> + + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn + + | _, _, false, "Sqrt", [argTy1] + when isFpTy g argTy1 -> + match getMeasureOfType g argTy1 with + | Some (tcref, _) -> + let ms1 = freshMeasure () + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure ms1]) + return TTraitBuiltIn + | None -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn + + | _, _, false, ("Sin" | "Cos" | "Tan" | "Sinh" | "Cosh" | "Tanh" | "Atan" | "Acos" | "Asin" | "Exp" | "Ceiling" | "Floor" | "Round" | "Truncate" | "Log10" | "Log" | "Sqrt"), [argTy] + when isFpTy g argTy -> + + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy + return TTraitBuiltIn + + // Conversions from non-decimal numbers / strings / chars to non-decimal numbers / chars are built-in + | _, _, false, "op_Explicit", [argTy] + when (// The input type. + (IsNonDecimalNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && + // The output type + (IsNonDecimalNumericOrIntegralEnumType g retTy || isCharTy g retTy)) -> + + return TTraitBuiltIn + + // Conversions from (including decimal) numbers / strings / chars to decimals are built-in + | _, _, false, "op_Explicit", [argTy] + when (// The input type. + (IsNumericOrIntegralEnumType g argTy || isStringTy g argTy || isCharTy g argTy) && + // The output type + (isDecimalTy g retTy)) -> + return TTraitBuiltIn + + // Conversions from decimal numbers to native integers are built-in + // The rest of decimal conversions are handled via op_Explicit lookup on System.Decimal (which also looks for op_Implicit) + | _, _, false, "op_Explicit", [argTy] + when (// The input type. + (isDecimalTy g argTy) && + // The output type + (isNativeIntegerTy g retTy)) -> + return TTraitBuiltIn + + | [], _, false, "Pow", [argTy1; argTy2] + when isFpTy g argTy1 -> + + do! SolveDimensionlessNumericType csenv ndeep m2 trace argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + return TTraitBuiltIn + + | _, _, false, "Atan2", [argTy1; argTy2] + when isFpTy g argTy1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1 + match getMeasureOfType g argTy1 with + | None -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1 + | Some (tcref, _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure Measure.One]) + return TTraitBuiltIn + + | _ -> + // OK, this is not solved by a built-in constraint. + // Now look for real solutions + + // First look for a solution by a record property + let recdPropSearch = + let isGetProp = nm.StartsWithOrdinal("get_") + let isSetProp = nm.StartsWithOrdinal("set_") + if not isRigid && ((argTys.IsEmpty && isGetProp) || isSetProp) then + let propName = nm[4..] + let props = + supportTys |> List.choose (fun ty -> + match TryFindIntrinsicNamedItemOfType csenv.InfoReader (propName, AccessibleFromEverywhere, false) FindMemberFlag.IgnoreOverrides m ty with + | Some (RecdFieldItem rfinfo) + when (isGetProp || rfinfo.RecdField.IsMutable) && + (rfinfo.IsStatic = not memFlags.IsInstance) && + IsRecdFieldAccessible amap m AccessibleFromEverywhere rfinfo.RecdFieldRef && + not rfinfo.LiteralValue.IsSome && + not rfinfo.RecdField.IsCompilerGenerated -> + Some (rfinfo, isSetProp) + | _ -> None) + match props with + | [ prop ] -> Some prop + | _ -> None + else + None + + let anonRecdPropSearch = + let isGetProp = nm.StartsWithOrdinal("get_") + if not isRigid && isGetProp && memFlags.IsInstance then + let propName = nm[4..] + let props = + supportTys |> List.choose (fun ty -> + match TryFindAnonRecdFieldOfType g ty propName with + | Some (Item.AnonRecdField(anonInfo, tinst, i, _)) -> Some (anonInfo, tinst, i) + | _ -> None) + match props with + | [ prop ] -> Some prop + | _ -> None + else + None + + // Now check if there are no feasible solutions at all + match minfos, recdPropSearch, anonRecdPropSearch with + | [], None, None when MemberConstraintIsReadyForStrongResolution csenv traitInfo -> + if supportTys |> List.exists (isFunTy g) then + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) + elif supportTys |> List.exists (isAnyTupleTy g) then + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(ConvertValLogicalNameToDisplayNameCore nm), m, m2)) + else + match nm, argTys with + | "op_Explicit", [argTy] -> + let argTyString = NicePrint.prettyStringOfTy denv argTy + let rtyString = NicePrint.prettyStringOfTy denv retTy + return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion(argTyString, rtyString), m, m2)) + | _ -> + let tyString = + match supportTys with + | [ty] -> NicePrint.minimalStringOfType denv ty + | _ -> supportTys |> List.map (NicePrint.minimalStringOfType denv) |> String.concat ", " + let opName = ConvertValLogicalNameToDisplayNameCore nm + let err = + match opName with + | "?>=" | "?>" | "?<=" | "?<" | "?=" | "?<>" + | ">=?" | ">?" | "<=?" | "?" + | "?>=?" | "?>?" | "?<=?" | "??" -> + if List.isSingleton supportTys then FSComp.SR.csTypeDoesNotSupportOperatorNullable(tyString, opName) + else FSComp.SR.csTypesDoNotSupportOperatorNullable(tyString, opName) + | _ -> + match supportTys, source.Value with + | [_], Some s when s.StartsWith("Operators.") -> + let opSource = s[10..] + if opSource = nm then FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) + else FSComp.SR.csTypeDoesNotSupportOperator(tyString, opSource) + | [_], Some s -> + FSComp.SR.csFunctionDoesNotSupportType(s, tyString, nm) + | [_], _ + -> FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) + | _, _ + -> FSComp.SR.csTypesDoNotSupportOperator(tyString, opName) + return! ErrorD(ConstraintSolverError(err, m, m2)) + + | _ -> + let dummyExpr = mkUnit g m + let calledMethGroup = + minfos + // curried members may not be used to satisfy constraints + |> List.choose (fun (staticTy, minfo) -> + if minfo.IsCurried then + None + else + let callerArgs = + { + Unnamed = [ (argTys |> List.map (fun argTy -> CallerArg(argTy, m, false, dummyExpr))) ] + Named = [ [ ] ] + } + let minst = FreshenMethInfo m minfo + let objtys = minfo.GetObjArgTypes(amap, m, minst) + Some(CalledMeth(csenv.InfoReader, None, false, FreshenMethInfo, m, AccessibleFromEverywhere, minfo, minst, minst, None, objtys, callerArgs, false, false, None, Some staticTy))) + + let methOverloadResult, errors = + trace.CollectThenUndoOrCommit + (fun (a, _) -> Option.isSome a) + (fun trace -> ResolveOverloading csenv (WithTrace trace) nm ndeep (Some traitInfo) CallerArgs.Empty AccessibleFromEverywhere calledMethGroup false (Some (MustEqual retTy))) + + match anonRecdPropSearch, recdPropSearch, methOverloadResult with + | Some (anonInfo, tinst, i), None, None -> + // OK, the constraint is solved by a record property. Assert that the return types match. + let rty2 = List.item i tinst + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 + return TTraitSolvedAnonRecdProp(anonInfo, tinst, i) + + | None, Some (rfinfo, isSetProp), None -> + // OK, the constraint is solved by a record property. Assert that the return types match. + let rty2 = if isSetProp then g.unit_ty else rfinfo.FieldType + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy rty2 + return TTraitSolvedRecdProp(rfinfo, isSetProp) + + | None, None, Some (calledMeth: CalledMeth<_>) -> + // OK, the constraint is solved. + let minfo = calledMeth.Method + + do! errors + let isInstance = minfo.IsInstance + if isInstance <> memFlags.IsInstance then + return! + if isInstance then + ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsNotStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) + else + ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (ConvertValLogicalNameToDisplayNameCore nm), nm), m, m2 )) + else + do! CheckMethInfoAttributes g m None minfo + return TTraitSolved (minfo, calledMeth.CalledTyArgs, calledMeth.OptionalStaticType) + + | _ -> + do! AddUnsolvedMemberConstraint csenv ndeep m2 trace permitWeakResolution ignoreUnresolvedOverload traitInfo errors + return TTraitUnsolved + } + return! RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res + } and AddUnsolvedMemberConstraint csenv ndeep m2 trace permitWeakResolution ignoreUnresolvedOverload traitInfo errors = trackErrors { @@ -1891,6 +2145,8 @@ and MemberConstraintSolutionOfMethInfo css m minfo minst staticTyOpt = | FSMeth(_, ty, vref, _) -> FSMethSln(ty, vref, minst, staticTyOpt) + | MethInfoWithModifiedReturnType(mi,_) -> MemberConstraintSolutionOfMethInfo css m mi minst staticTyOpt + | MethInfo.DefaultStructCtor _ -> error(InternalError("the default struct constructor was the unexpected solution to a trait constraint", m)) @@ -1909,7 +2165,7 @@ and MemberConstraintSolutionOfMethInfo css m minfo minst staticTyOpt = match callMethInfoOpt, callExpr with | Some methInfo, Expr.Op (TOp.ILCall (_, _, _, _, NormalValUse, _, _, ilMethRef, _, methInst, _), [], args, m) when (args, (objArgVars@allArgVars)) ||> List.lengthsEqAndForall2 (fun a b -> match a with Expr.Val (v, _, _) -> valEq v.Deref b | _ -> false) -> - let declaringTy = ImportProvidedType amap m (methInfo.PApply((fun x -> x.DeclaringType), m)) + let declaringTy = ImportProvidedType amap m (methInfo.PApply((fun x -> nonNull x.DeclaringType), m)) if isILAppTy g declaringTy then let extOpt = None // EXTENSION METHODS FROM TYPE PROVIDERS: for extension methods coming from the type providers we would have something here. ILMethSln(declaringTy, extOpt, ilMethRef, methInst, staticTyOpt) @@ -1928,7 +2184,6 @@ and TransactMemberConstraintSolution traitInfo (trace: OptionalTrace) sln = /// Only consider overload resolution if canonicalizing or all the types are now nominal. /// That is, don't perform resolution if more nominal information may influence the set of available overloads and GetRelevantMethodsForTrait (csenv: ConstraintSolverEnv) (permitWeakResolution: PermitWeakResolution) nm traitInfo : (TType * MethInfo) list = - let (TTrait(_, _, memFlags, _, _, _)) = traitInfo let results = if permitWeakResolution.Permit || MemberConstraintSupportIsReadyForDeterminingOverloads csenv traitInfo then let m = csenv.m @@ -1938,7 +2193,7 @@ and GetRelevantMethodsForTrait (csenv: ConstraintSolverEnv) (permitWeakResolutio let minfos = [ for (supportTy, nominalTy) in nominalTys do let infos = - match memFlags.MemberKind with + match traitInfo.MemberFlags.MemberKind with | SynMemberKind.Constructor -> GetIntrinsicConstructorInfosOfType csenv.SolverState.InfoReader m nominalTy | _ -> @@ -1962,8 +2217,7 @@ and GetRelevantMethodsForTrait (csenv: ConstraintSolverEnv) (permitWeakResolutio // The trait name "op_Explicit" also covers "op_Implicit", so look for that one too. if nm = "op_Explicit" then - let (TTrait(supportTys, _, memFlags, argTys, retTy, soln)) = traitInfo - let traitInfo2 = TTrait(supportTys, "op_Implicit", memFlags, argTys, retTy, soln) + let traitInfo2 = traitInfo.WithMemberName "op_Implicit" results @ GetRelevantMethodsForTrait csenv permitWeakResolution "op_Implicit" traitInfo2 else results @@ -2020,7 +2274,7 @@ and SupportTypeOfMemberConstraintIsSolved (csenv: ConstraintSolverEnv) (traitInf /// Get all the unsolved typars (statically resolved or not) relevant to the member constraint and GetFreeTyparsOfMemberConstraint (csenv: ConstraintSolverEnv) traitInfo = - let (TTrait(supportTys, _, _, argTys, retTy, _)) = traitInfo + let (TTrait(tys=supportTys; objAndArgTys=argTys; returnTyOpt=retTy)) = traitInfo freeInTypesLeftToRightSkippingConstraints csenv.g (supportTys @ argTys @ Option.toList retTy) and MemberConstraintIsReadyForWeakResolution csenv traitInfo = @@ -2104,8 +2358,8 @@ and AddMemberConstraint (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTr and TraitsAreRelated (csenv: ConstraintSolverEnv) retry traitInfo1 traitInfo2 = let g = csenv.g - let (TTrait(tys1, nm1, memFlags1, argTys1, _, _)) = traitInfo1 - let (TTrait(tys2, nm2, memFlags2, argTys2, _, _)) = traitInfo2 + let (TTrait(tys=tys1; memberName=nm1; memberFlags=memFlags1; objAndArgTys=argTys1)) = traitInfo1 + let (TTrait(tys=tys2; memberName=nm2; memberFlags=memFlags2; objAndArgTys=argTys2)) = traitInfo2 memFlags1.IsInstance = memFlags2.IsInstance && nm1 = nm2 && // Multiple op_Explicit and op_Implicit constraints can exist for the same type variable. @@ -2123,75 +2377,79 @@ and TraitsAreRelated (csenv: ConstraintSolverEnv) retry traitInfo1 traitInfo2 = // The 'retry' flag is passed when a rigid type variable is about to raise a missing constraint error // and the lengths of the support types are not equal (i.e. one is length 1, the other is length 2). // In this case the support types are first forced to be equal. -and EnforceConstraintConsistency (csenv: ConstraintSolverEnv) ndeep m2 trace retry tpc1 tpc2 = trackErrors { - let g = csenv.g - let amap = csenv.amap - let m = csenv.m - match tpc1, tpc2 with - | TyparConstraint.MayResolveMember(traitInfo1, _), TyparConstraint.MayResolveMember(traitInfo2, _) - when TraitsAreRelated csenv retry traitInfo1 traitInfo2 -> - let (TTrait(tys1, _, _, argTys1, rty1, _)) = traitInfo1 - let (TTrait(tys2, _, _, argTys2, rty2, _)) = traitInfo2 - if retry then - match tys1, tys2 with - | [ty1], [ty2] -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1 ty2 - | [ty1], _ -> do! IterateD (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1) tys2 - | _, [ty2] -> do! IterateD (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty2) tys1 - | _ -> () - do! Iterate2D (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace) argTys1 argTys2 - let rty1 = GetFSharpViewOfReturnType g rty1 - let rty2 = GetFSharpViewOfReturnType g rty2 - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty1 rty2 - - | TyparConstraint.CoercesTo(ty1, _), TyparConstraint.CoercesTo(ty2, _) -> - // Record at most one subtype constraint for each head type. - // That is, we forbid constraints by both I and I. - // This works because the types on the r.h.s. of subtype - // constraints are head-types and so any further inferences are equational. - let collect ty = - let mutable res = [] - IterateEntireHierarchyOfType (fun x -> res <- x :: res) g amap m AllowMultiIntfInstantiations.No ty - List.rev res - let parents1 = collect ty1 - let parents2 = collect ty2 - for ty1Parent in parents1 do - for ty2Parent in parents2 do - if HaveSameHeadType g ty1Parent ty2Parent then - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1Parent ty2Parent - - | TyparConstraint.IsEnum (unerlyingTy1, _), - TyparConstraint.IsEnum (unerlyingTy2, m2) -> - return! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace unerlyingTy1 unerlyingTy2 - - | TyparConstraint.IsDelegate (argsTy1, retTy1, _), - TyparConstraint.IsDelegate (argsTy2, retTy2, m2) -> - do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argsTy1 argsTy2 - return! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy1 retTy2 - - | TyparConstraint.SupportsComparison _, TyparConstraint.IsDelegate _ - | TyparConstraint.IsDelegate _, TyparConstraint.SupportsComparison _ - | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsReferenceType _ - | TyparConstraint.IsReferenceType _, TyparConstraint.IsNonNullableStruct _ -> - return! ErrorD (Error(FSComp.SR.csStructConstraintInconsistent(), m)) - - | TyparConstraint.IsUnmanaged _, TyparConstraint.IsReferenceType _ - | TyparConstraint.IsReferenceType _, TyparConstraint.IsUnmanaged _ -> - return! ErrorD (Error(FSComp.SR.csUnmanagedConstraintInconsistent(), m)) - - | TyparConstraint.SupportsComparison _, TyparConstraint.SupportsComparison _ - | TyparConstraint.SupportsEquality _, TyparConstraint.SupportsEquality _ - | TyparConstraint.SupportsNull _, TyparConstraint.SupportsNull _ - | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsNonNullableStruct _ - | TyparConstraint.IsUnmanaged _, TyparConstraint.IsUnmanaged _ - | TyparConstraint.IsReferenceType _, TyparConstraint.IsReferenceType _ - | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ - | TyparConstraint.SimpleChoice _, TyparConstraint.SimpleChoice _ -> - () - - | _ -> () - } +and EnforceConstraintConsistency (csenv: ConstraintSolverEnv) ndeep m2 trace retry tpc1 tpc2 = + trackErrors { + let g = csenv.g + let amap = csenv.amap + let m = csenv.m + match tpc1, tpc2 with + | TyparConstraint.MayResolveMember(traitInfo1, _), TyparConstraint.MayResolveMember(traitInfo2, _) + when TraitsAreRelated csenv retry traitInfo1 traitInfo2 -> + let (TTrait(tys=tys1; objAndArgTys=argTys1; returnTyOpt=rty1)) = traitInfo1 + let (TTrait(tys=tys2; objAndArgTys=argTys2; returnTyOpt=rty2)) = traitInfo2 + if retry then + match tys1, tys2 with + | [ty1], [ty2] -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1 ty2 + | [ty1], _ -> do! IterateD (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1) tys2 + | _, [ty2] -> do! IterateD (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty2) tys1 + | _ -> () + do! Iterate2D (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace) argTys1 argTys2 + let rty1 = GetFSharpViewOfReturnType g rty1 + let rty2 = GetFSharpViewOfReturnType g rty2 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty1 rty2 + + | TyparConstraint.CoercesTo(ty1, _), TyparConstraint.CoercesTo(ty2, _) -> + // Record at most one subtype constraint for each head type. + // That is, we forbid constraints by both I and I. + // This works because the types on the r.h.s. of subtype + // constraints are head-types and so any further inferences are equational. + let collect ty = + let mutable res = [] + IterateEntireHierarchyOfType (fun x -> res <- x :: res) g amap m AllowMultiIntfInstantiations.No ty + List.rev res + let parents1 = collect ty1 + let parents2 = collect ty2 + for ty1Parent in parents1 do + for ty2Parent in parents2 do + if HaveSameHeadType g ty1Parent ty2Parent then + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1Parent ty2Parent + + | TyparConstraint.IsEnum (underlyingTy1, _), TyparConstraint.IsEnum (underlyingTy2, m2) -> + return! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace underlyingTy1 underlyingTy2 + + | TyparConstraint.IsDelegate (argsTy1, retTy1, _), TyparConstraint.IsDelegate (argsTy2, retTy2, m2) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argsTy1 argsTy2 + return! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy1 retTy2 + + | TyparConstraint.SupportsComparison _, TyparConstraint.IsDelegate _ + | TyparConstraint.IsDelegate _, TyparConstraint.SupportsComparison _ + | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsReferenceType _ + | TyparConstraint.IsReferenceType _, TyparConstraint.IsNonNullableStruct _ -> + return! ErrorD (Error(FSComp.SR.csStructConstraintInconsistent(), m)) + + | TyparConstraint.SupportsNull _, TyparConstraint.NotSupportsNull _ + | TyparConstraint.NotSupportsNull _, TyparConstraint.SupportsNull _ -> + return! ErrorD (Error(FSComp.SR.csNullNotNullConstraintInconsistent(), m)) + + | TyparConstraint.IsUnmanaged _, TyparConstraint.IsReferenceType _ + | TyparConstraint.IsReferenceType _, TyparConstraint.IsUnmanaged _ -> + return! ErrorD (Error(FSComp.SR.csUnmanagedConstraintInconsistent(), m)) + + | TyparConstraint.SupportsComparison _, TyparConstraint.SupportsComparison _ + | TyparConstraint.SupportsEquality _, TyparConstraint.SupportsEquality _ + | TyparConstraint.SupportsNull _, TyparConstraint.SupportsNull _ + | TyparConstraint.NotSupportsNull _, TyparConstraint.NotSupportsNull _ + | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsNonNullableStruct _ + | TyparConstraint.IsUnmanaged _, TyparConstraint.IsUnmanaged _ + | TyparConstraint.IsReferenceType _, TyparConstraint.IsReferenceType _ + | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ + | TyparConstraint.SimpleChoice _, TyparConstraint.SimpleChoice _ -> + () + + | _ -> () + } -// See when one constraint implies implies another. +// See when one constraint implies another. // 'a :> ty1 implies 'a :> 'ty2 if the head type name of ty2 (say T2) occursCheck anywhere in the hierarchy of ty1 // If it does occur, e.g. at instantiation T2, then the check above will have enforced that // T2 = ty2 @@ -2217,8 +2475,10 @@ and CheckConstraintImplication (csenv: ConstraintSolverEnv) tpc1 tpc2 = // comparison implies equality | TyparConstraint.SupportsComparison _, TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _, TyparConstraint.SupportsNull _ + | TyparConstraint.NotSupportsNull _, TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _, TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _, TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _, TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ -> true | TyparConstraint.SimpleChoice (tys1, _), TyparConstraint.SimpleChoice (tys2, _) -> ListSet.isSubsetOf (typeEquiv g) tys1 tys2 @@ -2307,20 +2567,163 @@ and AddConstraint (csenv: ConstraintSolverEnv) ndeep m2 trace tp newConstraint () } -and SolveTypeUseSupportsNull (csenv: ConstraintSolverEnv) ndeep m2 trace ty = - let g = csenv.g - let m = csenv.m - let denv = csenv.DisplayEnv - match tryDestTyparTy g ty with - | ValueSome destTypar -> - AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SupportsNull m) - | ValueNone -> - if TypeSatisfiesNullConstraint g m ty then CompleteD else - match ty with - | NullableTy g _ -> - ErrorD (ConstraintSolverError(FSComp.SR.csNullableTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) - | _ -> - ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) +// preferConstraint: if the type is a type variable with an uncertain nullness, then +// this indicates whether we prefer to add a nullness constraint to the type variable itself, +// or whether we prefer to solve the nullness annotation. +// +// This is relevant for code like this: +// +// let isNull (value : 'T when 'T : null) = +// match box value with +// | null -> true +// | _ -> false +// +// let checkNonNull argName arg = +// if isNull arg then +// failwith (argName + " is null") +// +// Here the `'T: null` constraint is propagated by inference to checkNonNull. Which of these two types do we expect? +// +// val checkNonNull1: argName: string -> arg: 'T -> unit when 'T: null +// +// val checkNonNull2: argName: string -> arg: 'T | null -> unit +// +// When null checking is fully enabled, we prefer the latter. We can't always prefer it because it is a breaking change. +// +// Likewise consider +// +// let x = null +// +// What's the generalized type? +// val x: 'a when 'a: null +// val x: 'a | null when 'a: not null +// +// When null checking is fully enabled, we prefer the latter. We can't always prefer it because it is a breaking change. +and SolveTypeUseSupportsNull (csenv: ConstraintSolverEnv) ndeep m2 trace ty = + trackErrors { + let g = csenv.g + let m = csenv.m + let denv = csenv.DisplayEnv + if g.langFeatureNullness then + if TypeNullIsExtraValueNew g m ty then + () + elif isNullableTy g ty then + return! ErrorD (ConstraintSolverError(FSComp.SR.csNullableTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) + else + match tryDestTyparTy g ty with + | ValueSome tp -> + let nullness = nullnessOfTy g ty + match nullness.TryEvaluate() with + // NULLNESS TODO: This rule means turning on checkNullness changes type inference results for the cases + // mentioned in the comment above. THat's OK but needs to be documented in the RFC. + | ValueNone when not g.checkNullness -> + return! AddConstraint csenv ndeep m2 trace tp (TyparConstraint.SupportsNull m) + | ValueSome NullnessInfo.WithoutNull -> + return! AddConstraint csenv ndeep m2 trace tp (TyparConstraint.SupportsNull m) + | _ -> + if tp.Constraints |> List.exists (function | TyparConstraint.IsReferenceType _ -> true | _ -> false) |> not then + do! AddConstraint csenv ndeep m2 trace tp (TyparConstraint.IsReferenceType m) + return! SolveNullnessSupportsNull csenv ndeep m2 trace ty nullness + | _ -> + let nullness = nullnessOfTy g ty + do! SolveNullnessSupportsNull csenv ndeep m2 trace ty nullness + + // If checkNullness is off give the same errors as F# 4.5 + if not g.checkNullness && not (TypeNullIsExtraValue g m ty) then + return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) + else + if TypeNullIsExtraValue g m ty then + () + elif isNullableTy g ty then + return! ErrorD (ConstraintSolverError(FSComp.SR.csNullableTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) + else + match tryDestTyparTy g ty with + | ValueSome tp -> + do! AddConstraint csenv ndeep m2 trace tp (TyparConstraint.SupportsNull m) + | ValueNone -> + return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) + } + +and SolveNullnessSupportsNull (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) ty nullness = + trackErrors { + let g = csenv.g + let m = csenv.m + let denv = csenv.DisplayEnv + match nullness with + | Nullness.Variable nv -> + if nv.IsSolved then + do! SolveNullnessSupportsNull csenv ndeep m2 trace ty nv.Solution + else + trace.Exec (fun () -> nv.Set KnownWithNull) (fun () -> nv.Unset()) + | Nullness.Known n1 -> + match n1 with + | NullnessInfo.AmbivalentToNull -> () + | NullnessInfo.WithNull -> () + | NullnessInfo.WithoutNull -> + if g.checkNullness then + // If a type would allow null in older rules of F#, we can just emit a warning. + // In the opposite case, we keep this as an error to avoid generating incorrect code (e.g. assigning null to an int) + if (TypeNullIsExtraValue g m ty) then + return! WarnD(ConstraintSolverNullnessWarningWithType(denv, ty, n1, m, m2)) + else + return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) + } + +and SolveTypeUseNotSupportsNull (csenv: ConstraintSolverEnv) ndeep m2 trace ty = + trackErrors { + let g = csenv.g + let m = csenv.m + let denv = csenv.DisplayEnv + + if TypeNullIsTrueValue g ty then + // We can only give warnings here as F# 5.0 introduces these constraints into existing + // code via Option.ofObj and Option.toObj + do! WarnD (ConstraintSolverNullnessWarning(FSComp.SR.csTypeHasNullAsTrueValue(NicePrint.minimalStringOfType denv ty), m, m2)) + elif TypeNullIsExtraValueNew g m ty then + if g.checkNullness then + do! WarnD (ConstraintSolverNullnessWarning(FSComp.SR.csTypeHasNullAsExtraValue(NicePrint.minimalStringOfTypeWithNullness denv ty), m, m2)) + else + match tryDestTyparTy g ty with + | ValueSome tp -> + do! AddConstraint csenv ndeep m2 trace tp (TyparConstraint.NotSupportsNull m) + | ValueNone -> + let nullness = nullnessOfTy g ty + do! SolveNullnessNotSupportsNull csenv ndeep m2 trace ty nullness + } + +and SolveNullnessNotSupportsNull (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) ty nullness = + trackErrors { + let g = csenv.g + let m = csenv.m + let denv = csenv.DisplayEnv + match nullness with + | Nullness.Variable nv -> + if nv.IsSolved then + do! SolveNullnessNotSupportsNull csenv ndeep m2 trace ty nv.Solution + else + trace.Exec (fun () -> nv.Set KnownWithoutNull) (fun () -> nv.Unset()) + | Nullness.Known n1 -> + match n1 with + | NullnessInfo.AmbivalentToNull -> () + | NullnessInfo.WithoutNull -> () + | NullnessInfo.WithNull -> + if g.checkNullness && TypeNullIsExtraValueNew g m ty then + return! WarnD(ConstraintSolverNullnessWarning(FSComp.SR.csTypeHasNullAsExtraValue(NicePrint.minimalStringOfTypeWithNullness denv ty), m, m2)) + } + +and SolveTypeCanCarryNullness (csenv: ConstraintSolverEnv) ty nullness = + trackErrors { + let g = csenv.g + let m = csenv.m + let strippedTy = stripTyEqnsA g true ty + match tryAddNullnessToTy nullness strippedTy with + | Some _ -> + if isTyparTy g strippedTy && not (isReferenceTyparTy g strippedTy) then + return! AddConstraint csenv 0 m NoTrace (destTyparTy g strippedTy) (TyparConstraint.IsReferenceType m) + | None -> + let tyString = NicePrint.minimalStringOfType csenv.DisplayEnv strippedTy + return! ErrorD(Error(FSComp.SR.tcTypeDoesNotHaveAnyNull(tyString), m)) + } and SolveTypeSupportsComparison (csenv: ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g @@ -2337,8 +2740,8 @@ and SolveTypeSupportsComparison (csenv: ConstraintSolverEnv) ndeep m2 trace ty = ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportComparison1(NicePrint.minimalStringOfType denv ty), m, m2)) | _ -> match ty with - | SpecialComparableHeadType g tinst -> - tinst |> IterateD (SolveTypeSupportsComparison (csenv: ConstraintSolverEnv) ndeep m2 trace) + | SpecialComparableHeadType g tinst -> + IterateD (SolveTypeSupportsComparison (csenv: ConstraintSolverEnv) ndeep m2 trace) tinst | _ -> // Check the basic requirement - IComparable or IStructuralComparable or assumed if ExistsSameHeadTypeInHierarchy g amap m2 ty g.mk_IComparable_ty || @@ -2518,7 +2921,7 @@ and SolveTypeRequiresDefaultConstructor (csenv: ConstraintSolverEnv) ndeep m2 tr | ValueSome tp -> AddConstraint csenv ndeep m2 trace tp (TyparConstraint.RequiresDefaultConstructor m) | _ -> - if isStructTy g ty then + if isStructTy g ty && (isStructTupleTy g ty || isStructAnonRecdTy g ty || TypeHasDefaultValue g m ty) then if isStructTupleTy g ty then destStructTupleTy g ty |> IterateD (SolveTypeRequiresDefaultValue csenv ndeep m trace) elif isStructAnonRecdTy g ty then @@ -2620,7 +3023,13 @@ and CanMemberSigsMatchUpToCheck else ErrorD(Error (FSComp.SR.csMemberIsNotInstance(minfo.LogicalName), m)) else - MapCombineTDC2D subsumeTypes calledObjArgTys callerObjArgTys + // The object types must be non-null + let nonNullCalledObjArgTys = + if not calledMeth.Method.IsExtensionMember then + calledObjArgTys |> List.map (replaceNullnessOfTy g.knownWithoutNull) + else + calledObjArgTys + MapCombineTDC2D subsumeTypes nonNullCalledObjArgTys callerObjArgTys let! usesTDC3 = calledMeth.ArgSets |> MapCombineTDCD (fun argSet -> @@ -2745,25 +3154,27 @@ and ArgsMustSubsumeOrConvert isConstraint enforceNullableOptionalsKnownTypes // use known types from nullable optional args? (calledArg: CalledArg) - (callerArg: CallerArg<'T>) = trackErrors { + (callerArg: CallerArg<'T>) = + trackErrors { + let g = csenv.g + let m = callerArg.Range + let calledArgTy, usesTDC, eqn = AdjustCalledArgType csenv.InfoReader ad isConstraint enforceNullableOptionalsKnownTypes calledArg callerArg + + match eqn with + | Some (ty1, ty2, msg) -> + do! SolveTypeEqualsTypeWithReport csenv ndeep m trace cxsln ty1 ty2 + msg csenv.DisplayEnv + | None -> () - let g = csenv.g - let m = callerArg.Range - let calledArgTy, usesTDC, eqn = AdjustCalledArgType csenv.InfoReader ad isConstraint enforceNullableOptionalsKnownTypes calledArg callerArg - match eqn with - | Some (ty1, ty2, msg) -> - do! SolveTypeEqualsTypeWithReport csenv ndeep m trace cxsln ty1 ty2 - msg csenv.DisplayEnv - | None -> () - match usesTDC with - | TypeDirectedConversionUsed.Yes(warn, _, _) -> do! WarnD(warn csenv.DisplayEnv) - | TypeDirectedConversionUsed.No -> () - do! SolveTypeSubsumesTypeWithReport csenv ndeep m trace cxsln (Some calledArg.CalledArgumentType) calledArgTy callerArg.CallerArgumentType - if calledArg.IsParamArray && isArray1DTy g calledArgTy && not (isArray1DTy g callerArg.CallerArgumentType) then - return! ErrorD(Error(FSComp.SR.csMethodExpectsParams(), m)) - else - return usesTDC - } + match usesTDC with + | TypeDirectedConversionUsed.Yes(warn, _, _) -> do! WarnD(warn csenv.DisplayEnv) + | TypeDirectedConversionUsed.No -> () + do! SolveTypeSubsumesTypeWithReport csenv ndeep m trace cxsln (Some calledArg.CalledArgumentType) calledArgTy callerArg.CallerArgumentType + if calledArg.IsParamArray && isArray1DTy g calledArgTy && not (isArray1DTy g callerArg.CallerArgumentType) then + return! ErrorD(Error(FSComp.SR.csMethodExpectsParams(), m)) + else + return usesTDC + } // This is a slight variation on ArgsMustSubsumeOrConvert that adds contextual error report to the // subsumption check. The two could likely be combines. @@ -2967,22 +3378,11 @@ and ReportNoCandidatesErrorSynExpr csenv callerArgCounts methodName ad calledMet /// /// In F# 5.0 and 6.0 we assert this late by passing the cxsln parameter around. However this /// relies on not checking return types for SRTP constraints eagerly -/// -/// Post F# 6.0 (TraitConstraintCorrections) we will assert this early and add a proper check that return types match for SRTP constraint solving -/// (see alwaysCheckReturn) -and AssumeMethodSolvesTrait (csenv: ConstraintSolverEnv) (cx: TraitConstraintInfo option) m trace (calledMeth: CalledMeth<_>) = +and AssumeMethodSolvesTrait (csenv: ConstraintSolverEnv) (cx: TraitConstraintInfo option) m _trace (calledMeth: CalledMeth<_>) = match cx with | Some traitInfo when traitInfo.Solution.IsNone -> let staticTyOpt = if calledMeth.Method.IsInstance then None else calledMeth.OptionalStaticType let traitSln = MemberConstraintSolutionOfMethInfo csenv.SolverState m calledMeth.Method calledMeth.CalledTyArgs staticTyOpt -#if TRAIT_CONSTRAINT_CORRECTIONS - if csenv.g.langVersion.SupportsFeature LanguageFeature.TraitConstraintCorrections then - TransactMemberConstraintSolution traitInfo trace traitSln - None - else -#else - ignore trace -#endif Some (traitInfo, traitSln) | _ -> None @@ -3014,10 +3414,23 @@ and ResolveOverloading let candidates = calledMethGroup |> List.filter (fun cmeth -> cmeth.IsCandidate(m, ad)) let calledMethOpt, errors, calledMethTrace = - match calledMethGroup, candidates with - | _, [calledMeth] when not isOpConversion -> - Some calledMeth, CompleteD, NoTrace + | _, [calledMeth] when not isOpConversion -> + // See what candidates we have based on static/virtual/abstract + + // If false then is a static method call directly on an interface e.g. + // IParsable.Parse(...) + // IAdditionOperators.(+) + // This is not allowed as Parse and (+) method are static abstract + let isStaticConstrainedCall = + match calledMeth.OptionalStaticType with + | Some ttype -> isTyparTy g ttype + | None -> false + + match calledMeth.Method with + | ILMeth(ilMethInfo= ilMethInfo) when not isStaticConstrainedCall && ilMethInfo.IsStatic && ilMethInfo.IsAbstract -> + None, ErrorD (Error (FSComp.SR.chkStaticAbstractInterfaceMembers(ilMethInfo.ILName), m)), NoTrace + | _ -> Some calledMeth, CompleteD, NoTrace | [], _ when not isOpConversion -> None, ErrorD (Error (FSComp.SR.csMethodNotFound(methodName), m)), NoTrace @@ -3030,13 +3443,9 @@ and ResolveOverloading // Always take the return type into account for // -- op_Explicit, op_Implicit // -- candidate method sets that potentially use tupling of unfilled out args - /// -- if TraitConstraintCorrections is enabled, also check return types for SRTP constraints let alwaysCheckReturn = isOpConversion || candidates |> List.exists (fun cmeth -> cmeth.HasOutArgs) -#if TRAIT_CONSTRAINT_CORRECTIONS - || (csenv.g.langVersion.SupportsFeature LanguageFeature.TraitConstraintCorrections && cx.IsSome) -#endif // Exact match rule. // @@ -3326,7 +3735,7 @@ and GetMostApplicableOverload csenv ndeep candidates applicableMeths calledMethG // F# 5.0 rule - prior to F# 5.0 named arguments (on the caller side) were not being taken // into account when comparing overloads. So adding a name to an argument might mean - // overloads ould no longer be distinguished. We thus look at *all* arguments (whether + // overloads could no longer be distinguished. We thus look at *all* arguments (whether // optional or not) as an additional comparison technique. let c = if g.langVersion.SupportsFeature(LanguageFeature.NullableOptionalInterop) then @@ -3350,7 +3759,13 @@ and GetMostApplicableOverload csenv ndeep candidates applicableMeths calledMethG 0 if c <> 0 then c else - 0 + // Properties are kept incl. almost-duplicates because of the partial-override possibility. + // E.g. base can have get,set and derived only get => we keep both props around until method resolution time. + // Now is the type to pick the better (more derived) one. + match candidate.AssociatedPropertyInfo,other.AssociatedPropertyInfo,candidate.Method.IsExtensionMember,other.Method.IsExtensionMember with + | Some p1, Some p2, false, false -> compareTypes p1.ApparentEnclosingType p2.ApparentEnclosingType + | _ -> 0 + let bestMethods = let indexedApplicableMeths = applicableMeths |> List.indexed @@ -3560,6 +3975,13 @@ let AddCxMethodConstraint denv css m trace traitInfo = (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) |> RaiseOperationResult +let AddCxTypeDefnNotSupportsNull denv css m trace ty = + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m denv + PostponeOnFailedMemberConstraintResolution csenv trace + (fun csenv -> SolveTypeUseNotSupportsNull csenv 0 m trace ty) + (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) + |> RaiseOperationResult + let AddCxTypeUseSupportsNull denv css m trace ty = let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m denv PostponeOnFailedMemberConstraintResolution csenv trace @@ -3567,6 +3989,12 @@ let AddCxTypeUseSupportsNull denv css m trace ty = (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) |> RaiseOperationResult +let AddCxTypeCanCarryNullnessInfo denv css m ty nullness = + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m denv + let canCarryNullnessCheck() = SolveTypeCanCarryNullness csenv ty nullness |> RaiseOperationResult + csenv.SolverState.PushPostInferenceCheck (preDefaults=false, check = canCarryNullnessCheck) + + let AddCxTypeMustSupportComparison denv css m trace ty = let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m denv PostponeOnFailedMemberConstraintResolution csenv trace @@ -3659,46 +4087,53 @@ let CreateCodegenState tcVal g amap = ExtraCxs = HashMultiMap(10, HashIdentity.Structural) InfoReader = InfoReader(g, amap) PostInferenceChecksPreDefaults = ResizeArray() - PostInferenceChecksFinal = ResizeArray() } + PostInferenceChecksFinal = ResizeArray() + WarnWhenUsingWithoutNullOnAWithNullTarget = None} /// Determine if a codegen witness for a trait will require witness args to be available, e.g. in generic code -let CodegenWitnessExprForTraitConstraintWillRequireWitnessArgs tcVal g amap m (traitInfo:TraitConstraintInfo) = trackErrors { - let css = CreateCodegenState tcVal g amap - let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) - let! _res = SolveMemberConstraint csenv true PermitWeakResolution.Yes 0 m NoTrace traitInfo - let res = - match traitInfo.Solution with - | None - | Some BuiltInSln -> true - | _ -> false - return res - } +let CodegenWitnessExprForTraitConstraintWillRequireWitnessArgs tcVal g amap m (traitInfo:TraitConstraintInfo) = + trackErrors { + let css = CreateCodegenState tcVal g amap + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) + + let! _res = SolveMemberConstraint csenv true PermitWeakResolution.Yes 0 m NoTrace traitInfo + + let res = + match traitInfo.Solution with + | None + | Some BuiltInSln -> true + | _ -> false + return res + } /// Generate a witness expression if none is otherwise available, e.g. in legacy non-witness-passing code -let CodegenWitnessExprForTraitConstraint tcVal g amap m (traitInfo:TraitConstraintInfo) argExprs = trackErrors { - let css = CreateCodegenState tcVal g amap - let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) - let! _res = SolveMemberConstraint csenv true PermitWeakResolution.Yes 0 m NoTrace traitInfo - return GenWitnessExpr amap g m traitInfo argExprs - } +let CodegenWitnessExprForTraitConstraint tcVal g amap m (traitInfo:TraitConstraintInfo) argExprs = + trackErrors { + let css = CreateCodegenState tcVal g amap + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) + let! _res = SolveMemberConstraint csenv true PermitWeakResolution.Yes 0 m NoTrace traitInfo + return GenWitnessExpr amap g m traitInfo argExprs + } /// Generate the lambda argument passed for a use of a generic construct that accepts trait witnesses -let CodegenWitnessesForTyparInst tcVal g amap m typars tyargs = trackErrors { - let css = CreateCodegenState tcVal g amap - let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) - let ftps, _renaming, tinst = FreshenTypeInst g m typars - let traitInfos = GetTraitConstraintInfosOfTypars g ftps - do! SolveTyparsEqualTypes csenv 0 m NoTrace tinst tyargs - return GenWitnessArgs amap g m traitInfos - } +let CodegenWitnessesForTyparInst tcVal g amap m typars tyargs = + trackErrors { + let css = CreateCodegenState tcVal g amap + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) + let ftps, _renaming, tinst = FreshenTypeInst g m typars + let traitInfos = GetTraitConstraintInfosOfTypars g ftps + let! _res = SolveTyparsEqualTypes csenv 0 m NoTrace tinst tyargs + return GenWitnessArgs amap g m traitInfos + } /// Generate the lambda argument passed for a use of a generic construct that accepts trait witnesses -let CodegenWitnessArgForTraitConstraint tcVal g amap m traitInfo = trackErrors { - let css = CreateCodegenState tcVal g amap - let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) - let! _res = SolveMemberConstraint csenv true PermitWeakResolution.Yes 0 m NoTrace traitInfo - return GenWitnessExprLambda amap g m traitInfo - } +let CodegenWitnessArgForTraitConstraint tcVal g amap m traitInfo = + trackErrors { + let css = CreateCodegenState tcVal g amap + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) + let! _res = SolveMemberConstraint csenv true PermitWeakResolution.Yes 0 m NoTrace traitInfo + return GenWitnessExprLambda amap g m traitInfo + } /// For some code like "let f() = ([] = [])", a free choice is made for a type parameter /// for an interior type variable. This chooses a solution for a type parameter subject @@ -3748,7 +4183,8 @@ let IsApplicableMethApprox g amap m (minfo: MethInfo) availObjTy = ExtraCxs = HashMultiMap(10, HashIdentity.Structural) InfoReader = InfoReader(g, amap) PostInferenceChecksPreDefaults = ResizeArray() - PostInferenceChecksFinal = ResizeArray() } + PostInferenceChecksFinal = ResizeArray() + WarnWhenUsingWithoutNullOnAWithNullTarget = None} let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) let minst = FreshenMethInfo m minfo match minfo.GetObjArgTypes(amap, m, minst) with @@ -3763,4 +4199,4 @@ let IsApplicableMethApprox g amap m (minfo: MethInfo) availObjTy = |> CommitOperationResult | _ -> true else - true + true \ No newline at end of file diff --git a/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fsi b/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fsi index eb48ce3b43..4c29d684c3 100644 --- a/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fsi +++ b/src/fcs-fable/src/Compiler/Checking/ConstraintSolver.fsi @@ -15,61 +15,6 @@ open FSharp.Compiler.Text open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps -/// Create a type variable representing the use of a "_" in F# code -val NewAnonTypar: TyparKind * range * TyparRigidity * TyparStaticReq * TyparDynamicReq -> Typar - -/// Create an inference type variable -val NewInferenceType: TcGlobals -> TType - -/// Create an inference type variable for the kind of a byref pointer -val NewByRefKindInferenceType: TcGlobals -> range -> TType - -/// Create an inference type variable representing an error condition when checking an expression -val NewErrorType: unit -> TType - -/// Create an inference type variable representing an error condition when checking a measure -val NewErrorMeasure: unit -> Measure - -/// Create a list of inference type variables, one for each element in the input list -val NewInferenceTypes: TcGlobals -> 'T list -> TType list - -/// Given a set of formal type parameters and their constraints, make new inference type variables for -/// each and ensure that the constraints on the new type variables are adjusted to refer to these. -/// -/// Returns -/// 1. the new type parameters -/// 2. the instantiation mapping old type parameters to inference variables -/// 3. the inference type variables as a list of types. -val FreshenAndFixupTypars: - g: TcGlobals -> - m: range -> - rigid: TyparRigidity -> - Typars -> - TType list -> - Typars -> - Typars * TyparInstantiation * TType list - -/// Given a set of type parameters, make new inference type variables for -/// each and ensure that the constraints on the new type variables are adjusted. -/// -/// Returns -/// 1. the new type parameters -/// 2. the instantiation mapping old type parameters to inference variables -/// 3. the inference type variables as a list of types. -val FreshenTypeInst: g: TcGlobals -> range -> Typars -> Typars * TyparInstantiation * TType list - -/// Given a set of type parameters, make new inference type variables for -/// each and ensure that the constraints on the new type variables are adjusted. -/// -/// Returns the inference type variables as a list of types. -val FreshenTypars: g: TcGlobals -> range -> Typars -> TType list - -/// Given a method, which may be generic, make new inference type variables for -/// its generic parameters, and ensure that the constraints the new type variables are adjusted. -/// -/// Returns the inference type variables as a list of types. -val FreshenMethInfo: range -> MethInfo -> TType list - /// Information about the context of a type equation. [] type ContextInfo = @@ -174,6 +119,28 @@ exception ConstraintSolverTypesNotInSubsumptionRelation of exception ConstraintSolverMissingConstraint of displayEnv: DisplayEnv * Typar * TyparConstraint * range * range +exception ConstraintSolverNullnessWarningEquivWithTypes of + DisplayEnv * + TType * + TType * + NullnessInfo * + NullnessInfo * + range * + range + +exception ConstraintSolverNullnessWarningWithTypes of + DisplayEnv * + TType * + TType * + NullnessInfo * + NullnessInfo * + range * + range + +exception ConstraintSolverNullnessWarningWithType of DisplayEnv * TType * NullnessInfo * range * range + +exception ConstraintSolverNullnessWarning of string * range * range + exception ConstraintSolverError of string * range * range exception ErrorFromApplyingDefault of @@ -221,8 +188,32 @@ exception ArgDoesNotMatchError of /// A function that denotes captured tcVal, Used in constraint solver and elsewhere to get appropriate expressions for a ValRef. type TcValF = ValRef -> ValUseFlag -> TType list -> range -> Expr * TType -[] type ConstraintSolverState = + { + g: TcGlobals + + amap: ImportMap + + InfoReader: InfoReader + + /// The function used to freshen values we encounter during trait constraint solving + TcVal: TcValF + + /// This table stores all unsolved, ungeneralized trait constraints, indexed by free type variable. + /// That is, there will be one entry in this table for each free type variable in + /// each outstanding, unsolved, ungeneralized trait constraint. Constraints are removed from the table and resolved + /// each time a solution to an index variable is found. + mutable ExtraCxs: Internal.Utilities.Collections.HashMultiMap + + /// Checks to run after all inference is complete, but before defaults are applied and internal unknowns solved + PostInferenceChecksPreDefaults: ResizeArray unit> + + /// Checks to run after all inference is complete. + PostInferenceChecksFinal: ResizeArray unit> + + WarnWhenUsingWithoutNullOnAWithNullTarget: string option + } + static member New: TcGlobals * ImportMap * InfoReader * TcValF -> ConstraintSolverState /// Add a post-inference check to run at the end of inference @@ -296,8 +287,12 @@ val AddCxTypeMustSubsumeTypeMatchingOnlyUndoIfFailed: val AddCxMethodConstraint: DisplayEnv -> ConstraintSolverState -> range -> OptionalTrace -> TraitConstraintInfo -> unit +val AddCxTypeDefnNotSupportsNull: DisplayEnv -> ConstraintSolverState -> range -> OptionalTrace -> TType -> unit + val AddCxTypeUseSupportsNull: DisplayEnv -> ConstraintSolverState -> range -> OptionalTrace -> TType -> unit +val AddCxTypeCanCarryNullnessInfo: DisplayEnv -> ConstraintSolverState -> range -> TType -> Nullness -> unit + val AddCxTypeMustSupportComparison: DisplayEnv -> ConstraintSolverState -> range -> OptionalTrace -> TType -> unit val AddCxTypeMustSupportEquality: DisplayEnv -> ConstraintSolverState -> range -> OptionalTrace -> TType -> unit diff --git a/src/fcs-fable/src/Compiler/Checking/Expressions/CheckArrayOrListComputedExpressions.fs b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckArrayOrListComputedExpressions.fs new file mode 100644 index 0000000000..f8a2abd7d7 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckArrayOrListComputedExpressions.fs @@ -0,0 +1,163 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +/// Sequence expressions checking +module internal FSharp.Compiler.CheckArrayOrListComputedExpressions + +open FSharp.Compiler.CheckBasics +open FSharp.Compiler.ConstraintSolver +open FSharp.Compiler.CheckExpressionsOps +open FSharp.Compiler.CheckExpressions +open FSharp.Compiler.NameResolution +open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.Features +open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.Syntax +open FSharp.Compiler.CheckSequenceExpressions + +let TcArrayOrListComputedExpression (cenv: TcFileState) env (overallTy: OverallTy) tpenv (isArray, comp) m = + let g = cenv.g + + // The syntax '[ n .. m ]' and '[ n .. step .. m ]' is not really part of array or list syntax. + // It could be in the future, e.g. '[ 1; 2..30; 400 ]' + // + // The elaborated form of '[ n .. m ]' is 'List.ofSeq (seq (op_Range n m))' and this shouldn't change + match RewriteRangeExpr comp with + | Some replacementExpr -> + let genCollElemTy = NewInferenceType g + + let genCollTy = (if isArray then mkArrayType else mkListTy) cenv.g genCollElemTy + + UnifyTypes cenv env m overallTy.Commit genCollTy + + let exprTy = mkSeqTy cenv.g genCollElemTy + + let expr, tpenv = TcExpr cenv (MustEqual exprTy) env tpenv replacementExpr + + let expr = + if cenv.g.compilingFSharpCore then + expr + else + // We add a call to 'seq ... ' to make sure sequence expression compilation gets applied to the contents of the + // comprehension. But don't do this in FSharp.Core.dll since 'seq' may not yet be defined. + mkCallSeq cenv.g m genCollElemTy expr + + let expr = mkCoerceExpr (expr, exprTy, expr.Range, overallTy.Commit) + + let expr = + if isArray then + mkCallSeqToArray cenv.g m genCollElemTy expr + else + mkCallSeqToList cenv.g m genCollElemTy expr + + expr, tpenv + + | None -> + + // LanguageFeatures.ImplicitYield do not require this validation + let implicitYieldEnabled = + cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield + + let validateExpressionWithIfRequiresParenthesis = not implicitYieldEnabled + let acceptDeprecatedIfThenExpression = not implicitYieldEnabled + + match comp with + | SimpleSemicolonSequence cenv acceptDeprecatedIfThenExpression elems -> + match comp with + | SimpleSemicolonSequence cenv false _ -> () + | _ when validateExpressionWithIfRequiresParenthesis -> + errorR (Deprecated(FSComp.SR.tcExpressionWithIfRequiresParenthesis (), m)) + | _ -> () + + let replacementExpr = + if isArray then + // This are to improve parsing/processing speed for parser tables by converting to an array blob ASAP + let nelems = elems.Length + + if + nelems > 0 + && List.forall + (function + | SynExpr.Const(SynConst.UInt16 _, _) -> true + | _ -> false) + elems + then + SynExpr.Const( + SynConst.UInt16s( + Array.ofList ( + List.map + (function + | SynExpr.Const(SynConst.UInt16 x, _) -> x + | _ -> failwith "unreachable") + elems + ) + ), + m + ) + elif + nelems > 0 + && List.forall + (function + | SynExpr.Const(SynConst.Byte _, _) -> true + | _ -> false) + elems + then + SynExpr.Const( + SynConst.Bytes( + Array.ofList ( + List.map + (function + | SynExpr.Const(SynConst.Byte x, _) -> x + | _ -> failwith "unreachable") + elems + ), + SynByteStringKind.Regular, + m + ), + m + ) + else + SynExpr.ArrayOrList(isArray, elems, m) + else if cenv.g.langVersion.SupportsFeature(LanguageFeature.ReallyLongLists) then + SynExpr.ArrayOrList(isArray, elems, m) + else + if elems.Length > 500 then + error (Error(FSComp.SR.tcListLiteralMaxSize (), m)) + + SynExpr.ArrayOrList(isArray, elems, m) + + TcExprUndelayed cenv overallTy env tpenv replacementExpr + | _ -> + + let genCollElemTy = NewInferenceType g + + let genCollTy = (if isArray then mkArrayType else mkListTy) cenv.g genCollElemTy + + // Propagating type directed conversion, e.g. for + // let x : seq = [ yield 1; if true then yield 2 ] + TcPropagatingExprLeafThenConvert cenv overallTy genCollTy env (* canAdhoc *) m (fun () -> + + let exprTy = mkSeqTy cenv.g genCollElemTy + + // Check the comprehension + let expr, tpenv = TcSequenceExpression cenv env tpenv comp (MustEqual exprTy) m + + let expr = mkCoerceIfNeeded cenv.g exprTy (tyOfExpr cenv.g expr) expr + + let expr = + if cenv.g.compilingFSharpCore then + //warning(Error(FSComp.SR.fslibUsingComputedListOrArray(), expr.Range)) + expr + else + // We add a call to 'seq ... ' to make sure sequence expression compilation gets applied to the contents of the + // comprehension. But don't do this in FSharp.Core.dll since 'seq' may not yet be defined. + mkCallSeq cenv.g m genCollElemTy expr + + let expr = mkCoerceExpr (expr, exprTy, expr.Range, overallTy.Commit) + + let expr = + if isArray then + mkCallSeqToArray cenv.g m genCollElemTy expr + else + mkCallSeqToList cenv.g m genCollElemTy expr + + expr, tpenv) diff --git a/src/fcs-fable/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs new file mode 100644 index 0000000000..1f70a0fcfd --- /dev/null +++ b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs @@ -0,0 +1,3139 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +/// The typechecker. Left-to-right constrained type checking +/// with generalization at appropriate points. +module internal FSharp.Compiler.CheckComputationExpressions + +open Internal.Utilities.Library +open FSharp.Compiler.AccessibilityLogic +open FSharp.Compiler.AttributeChecking +open FSharp.Compiler.CheckExpressionsOps +open FSharp.Compiler.CheckExpressions +open FSharp.Compiler.CheckBasics +open FSharp.Compiler.ConstraintSolver +open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.Features +open FSharp.Compiler.Infos +open FSharp.Compiler.InfoReader +open FSharp.Compiler.NameResolution +open FSharp.Compiler.Syntax.PrettyNaming +open FSharp.Compiler.Syntax +open FSharp.Compiler.SyntaxTrivia +open FSharp.Compiler.SyntaxTreeOps +open FSharp.Compiler.Text +open FSharp.Compiler.Text.Range +open FSharp.Compiler.TypedTree +open FSharp.Compiler.TypedTreeOps +open System.Collections.Generic + +type cenv = TcFileState + +/// Used to flag if this is the first or a subsequent translation pass through a computation expression +[] +type CompExprTranslationPass = + | Initial + | Subsequent + +/// Used to flag if computation expression custom operations are allowed in a given context +[] +type CustomOperationsMode = + | Allowed + | Denied + +[] +type ComputationExpressionContext<'a> = + { + cenv: TcFileState + env: TcEnv + tpenv: UnscopedTyparEnv + customOperationMethodsIndexedByKeyword: + IDictionary * MethInfo>> + customOperationMethodsIndexedByMethodName: + IDictionary * MethInfo>> + sourceMethInfo: 'a list + builderValName: string + ad: AccessorDomain + builderTy: TType + isQuery: bool + enableImplicitYield: bool + origComp: SynExpr + mWhole: range + emptyVarSpace: LazyWithContext * TcEnv, range> + } + +let inline TryFindIntrinsicOrExtensionMethInfo collectionSettings (cenv: cenv) (env: TcEnv) m ad nm ty = + AllMethInfosOfTypeInScope collectionSettings cenv.infoReader env.NameEnv (Some nm) ad IgnoreOverrides m ty + +/// Ignores an attribute +let inline IgnoreAttribute _ = None + +let inline arbPat (m: range) = + mkSynPatVar None (mkSynId (m.MakeSynthetic()) "_missingVar") + +let inline arbKeySelectors m = + mkSynBifix m "=" (arbExpr ("_keySelectors", m)) (arbExpr ("_keySelector2", m)) + +// Flag that a debug point should get emitted prior to both the evaluation of 'rhsExpr' and the call to Using +let inline addBindDebugPoint spBind e = + match spBind with + | DebugPointAtBinding.Yes m -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, e) + | _ -> e + +let inline mkSynDelay2 (e: SynExpr) = mkSynDelay (e.Range.MakeSynthetic()) e + +/// Make a builder.Method(...) call +let mkSynCall nm (m: range) args builderValName = + let m = m.MakeSynthetic() // Mark as synthetic so the language service won't pick it up. + + let args = + match args with + | [] -> SynExpr.Const(SynConst.Unit, m) + | [ arg ] -> SynExpr.Paren(SynExpr.Paren(arg, range0, None, m), range0, None, m) + | args -> SynExpr.Paren(SynExpr.Tuple(false, args, [], m), range0, None, m) + + let builderVal = mkSynIdGet m builderValName + mkSynApp1 (SynExpr.DotGet(builderVal, range0, SynLongIdent([ mkSynId m nm ], [], [ None ]), m)) args m + +// Optionally wrap sources of "let!", "yield!", "use!" in "query.Source" +let mkSourceExpr callExpr sourceMethInfo builderValName = + match sourceMethInfo with + | [] -> callExpr + | _ -> mkSynCall "Source" callExpr.Range [ callExpr ] builderValName + +let mkSourceExprConditional isFromSource callExpr sourceMethInfo builderValName = + if isFromSource then + mkSourceExpr callExpr sourceMethInfo builderValName + else + callExpr + +let inline mkSynLambda p e m = + SynExpr.Lambda(false, false, p, e, None, m, SynExprLambdaTrivia.Zero) + +let mkExprForVarSpace m (patvs: Val list) = + match patvs with + | [] -> SynExpr.Const(SynConst.Unit, m) + | [ v ] -> SynExpr.Ident v.Id + | vs -> SynExpr.Tuple(false, (vs |> List.map (fun v -> SynExpr.Ident(v.Id))), [], m) + +let mkSimplePatForVarSpace m (patvs: Val list) = + let spats = + match patvs with + | [] -> [] + | [ v ] -> [ mkSynSimplePatVar false v.Id ] + | vs -> vs |> List.map (fun v -> mkSynSimplePatVar false v.Id) + + SynSimplePats.SimplePats(spats, [], m) + +let mkPatForVarSpace m (patvs: Val list) = + match patvs with + | [] -> SynPat.Const(SynConst.Unit, m) + | [ v ] -> mkSynPatVar None v.Id + | vs -> SynPat.Tuple(false, (vs |> List.map (fun x -> mkSynPatVar None x.Id)), [], m) + +let hasMethInfo nm cenv env mBuilderVal ad builderTy = + match TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad nm builderTy with + | [] -> false + | _ -> true + +let getCustomOperationMethods (cenv: TcFileState) (env: TcEnv) ad mBuilderVal builderTy = + let allMethInfos = + AllMethInfosOfTypeInScope + ResultCollectionSettings.AllResults + cenv.infoReader + env.NameEnv + None + ad + IgnoreOverrides + mBuilderVal + builderTy + + [ + for methInfo in allMethInfos do + if IsMethInfoAccessible cenv.amap mBuilderVal ad methInfo then + let nameSearch = + TryBindMethInfoAttribute + cenv.g + mBuilderVal + cenv.g.attrib_CustomOperationAttribute + methInfo + IgnoreAttribute // We do not respect this attribute for IL methods + (fun attr -> + // NOTE: right now, we support of custom operations with spaces in them ([]) + // In the parameterless CustomOperationAttribute - we use the method name, and also allow it to be ````-quoted (member _.``foo bar`` _ = ...) + match attr with + // Empty string and parameterless constructor - we use the method name + | Attrib(unnamedArgs = [ AttribStringArg "" ]) // Empty string as parameter + | Attrib(unnamedArgs = []) -> // No parameters, same as empty string for compat reasons. + Some methInfo.LogicalName + // Use the specified name + | Attrib(unnamedArgs = [ AttribStringArg msg ]) -> Some msg + | _ -> None) + IgnoreAttribute // We do not respect this attribute for provided methods + + match nameSearch with + | None -> () + | Some nm -> + let joinConditionWord = + TryBindMethInfoAttribute + cenv.g + mBuilderVal + cenv.g.attrib_CustomOperationAttribute + methInfo + IgnoreAttribute // We do not respect this attribute for IL methods + (function + | Attrib(propVal = ExtractAttribNamedArg "JoinConditionWord" (AttribStringArg s)) -> Some s + | _ -> None) + IgnoreAttribute // We do not respect this attribute for provided methods + + let flagSearch (propName: string) = + TryBindMethInfoAttribute + cenv.g + mBuilderVal + cenv.g.attrib_CustomOperationAttribute + methInfo + IgnoreAttribute // We do not respect this attribute for IL methods + (function + | Attrib(propVal = ExtractAttribNamedArg propName (AttribBoolArg b)) -> Some b + | _ -> None) + IgnoreAttribute // We do not respect this attribute for provided methods + + let maintainsVarSpaceUsingBind = + defaultArg (flagSearch "MaintainsVariableSpaceUsingBind") false + + let maintainsVarSpace = defaultArg (flagSearch "MaintainsVariableSpace") false + let allowInto = defaultArg (flagSearch "AllowIntoPattern") false + let isLikeZip = defaultArg (flagSearch "IsLikeZip") false + let isLikeJoin = defaultArg (flagSearch "IsLikeJoin") false + let isLikeGroupJoin = defaultArg (flagSearch "IsLikeGroupJoin") false + + nm, + maintainsVarSpaceUsingBind, + maintainsVarSpace, + allowInto, + isLikeZip, + isLikeJoin, + isLikeGroupJoin, + joinConditionWord, + methInfo + ] + +/// Decide if the identifier represents a use of a custom query operator +let tryGetDataForCustomOperation (nm: Ident) ceenv = + let isOpDataCountAllowed opDatas = + match opDatas with + | [ _ ] -> true + | _ :: _ -> ceenv.cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations + | _ -> false + + match ceenv.customOperationMethodsIndexedByKeyword.TryGetValue nm.idText with + | true, opDatas when isOpDataCountAllowed opDatas -> + for opData in opDatas do + let (opName, + maintainsVarSpaceUsingBind, + maintainsVarSpace, + _allowInto, + isLikeZip, + isLikeJoin, + isLikeGroupJoin, + _joinConditionWord, + methInfo) = + opData + + if + (maintainsVarSpaceUsingBind && maintainsVarSpace) + || (isLikeZip && isLikeJoin) + || (isLikeZip && isLikeGroupJoin) + || (isLikeJoin && isLikeGroupJoin) + then + errorR (Error(FSComp.SR.tcCustomOperationInvalid opName, nm.idRange)) + + if not (ceenv.cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations) then + match ceenv.customOperationMethodsIndexedByMethodName.TryGetValue methInfo.LogicalName with + | true, [ _ ] -> () + | _ -> errorR (Error(FSComp.SR.tcCustomOperationMayNotBeOverloaded nm.idText, nm.idRange)) + + Some opDatas + | true, opData :: _ -> + errorR (Error(FSComp.SR.tcCustomOperationMayNotBeOverloaded nm.idText, nm.idRange)) + Some [ opData ] + | _ -> None + +let isCustomOperation ceenv nm = + tryGetDataForCustomOperation nm ceenv |> Option.isSome + +let customOperationCheckValidity m f opDatas = + let vs = List.map f opDatas + let v0 = vs[0] + + let (opName, + _maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + _isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + _methInfo) = + opDatas[0] + + if not (List.allEqual vs) then + errorR (Error(FSComp.SR.tcCustomOperationInvalid opName, m)) + + v0 + +// Check for the MaintainsVariableSpace on custom operation +let customOperationMaintainsVarSpace ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | None -> false + | Some opDatas -> + opDatas + |> customOperationCheckValidity + nm.idRange + (fun + (_nm, + _maintainsVarSpaceUsingBind, + maintainsVarSpace, + _allowInto, + _isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + _methInfo) -> maintainsVarSpace) + +let customOperationMaintainsVarSpaceUsingBind ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | None -> false + | Some opDatas -> + opDatas + |> customOperationCheckValidity + nm.idRange + (fun + (_nm, + maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + _isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + _methInfo) -> maintainsVarSpaceUsingBind) + +let customOperationIsLikeZip ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | None -> false + | Some opDatas -> + opDatas + |> customOperationCheckValidity + nm.idRange + (fun + (_nm, + _maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + _methInfo) -> isLikeZip) + +let customOperationIsLikeJoin ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | None -> false + | Some opDatas -> + opDatas + |> customOperationCheckValidity + nm.idRange + (fun + (_nm, + _maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + _isLikeZip, + isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + _methInfo) -> isLikeJoin) + +let customOperationIsLikeGroupJoin ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | None -> false + | Some opDatas -> + opDatas + |> customOperationCheckValidity + nm.idRange + (fun + (_nm, + _maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + _isLikeZip, + _isLikeJoin, + isLikeGroupJoin, + _joinConditionWord, + _methInfo) -> isLikeGroupJoin) + +let customOperationJoinConditionWord ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | Some opDatas -> + opDatas + |> customOperationCheckValidity + nm.idRange + (fun + (_nm, + _maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + _isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + joinConditionWord, + _methInfo) -> joinConditionWord) + |> function + | None -> "on" + | Some v -> v + | _ -> "on" + +let customOperationAllowsInto ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | None -> false + | Some opDatas -> + opDatas + |> customOperationCheckValidity + nm.idRange + (fun + (_nm, + _maintainsVarSpaceUsingBind, + _maintainsVarSpace, + allowInto, + _isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + _methInfo) -> allowInto) + +let customOpUsageText ceenv nm = + match tryGetDataForCustomOperation nm ceenv with + | Some((_nm, + _maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + isLikeZip, + isLikeJoin, + isLikeGroupJoin, + _joinConditionWord, + _methInfo) :: _) -> + if isLikeGroupJoin then + Some( + FSComp.SR.customOperationTextLikeGroupJoin ( + nm.idText, + customOperationJoinConditionWord ceenv nm, + customOperationJoinConditionWord ceenv nm + ) + ) + elif isLikeJoin then + Some( + FSComp.SR.customOperationTextLikeJoin ( + nm.idText, + customOperationJoinConditionWord ceenv nm, + customOperationJoinConditionWord ceenv nm + ) + ) + elif isLikeZip then + Some(FSComp.SR.customOperationTextLikeZip (nm.idText)) + else + None + | _ -> None + +let tryGetArgAttribsForCustomOperator ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | Some argInfos -> + argInfos + |> List.map + (fun + (_nm, + __maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + _isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + methInfo) -> + match methInfo.GetParamAttribs(ceenv.cenv.amap, ceenv.mWhole) with + | [ curriedArgInfo ] -> Some (List.map fst curriedArgInfo) // one for the actual argument group + | _ -> None) + |> Some + | _ -> None + +let tryGetArgInfosForCustomOperator ceenv (nm: Ident) = + match tryGetDataForCustomOperation nm ceenv with + | Some argInfos -> + argInfos + |> List.map + (fun + (_nm, + __maintainsVarSpaceUsingBind, + _maintainsVarSpace, + _allowInto, + _isLikeZip, + _isLikeJoin, + _isLikeGroupJoin, + _joinConditionWord, + methInfo) -> + match methInfo with + | FSMeth(_, _, vref, _) -> + match ArgInfosOfMember ceenv.cenv.g vref with + | [ curriedArgInfo ] -> Some curriedArgInfo + | _ -> None + | _ -> None) + |> Some + | _ -> None + +let tryExpectedArgCountForCustomOperator ceenv (nm: Ident) = + match tryGetArgAttribsForCustomOperator ceenv nm with + | None -> None + | Some argInfosForOverloads -> + let nums = + argInfosForOverloads + |> List.map (function + | None -> -1 + | Some argInfos -> List.length argInfos) + + // Prior to 'OverloadsForCustomOperations' we count exact arguments. + // + // With 'OverloadsForCustomOperations' we don't compute an exact expected argument count + // if any arguments are optional, out or ParamArray. + let isSpecial = + if ceenv.cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations then + argInfosForOverloads + |> List.exists (fun info -> + match info with + | None -> false + | Some args -> + args + |> List.exists (fun (ParamAttribs(isParamArrayArg, _isInArg, isOutArg, optArgInfo, _callerInfo, _reflArgInfo)) -> + isParamArrayArg || isOutArg || optArgInfo.IsOptional)) + else + false + + if not isSpecial && nums |> List.forall (fun v -> v >= 0 && v = nums[0]) then + Some(max (nums[0] - 1) 0) // drop the computation context argument + else + None + +// Check for the [] attribute on an argument position +let isCustomOperationProjectionParameter ceenv i (nm: Ident) = + match tryGetArgInfosForCustomOperator ceenv nm with + | None -> false + | Some argInfosForOverloads -> + let vs = + argInfosForOverloads + |> List.map (function + | None -> false + | Some argInfos -> + i < argInfos.Length + && let _, argInfo = List.item i argInfos in + HasFSharpAttribute ceenv.cenv.g ceenv.cenv.g.attrib_ProjectionParameterAttribute argInfo.Attribs) + + if List.allEqual vs then + vs[0] + else + let opDatas = (tryGetDataForCustomOperation nm ceenv).Value + + let opName, _, _, _, _, _, _, _j, _ = opDatas[0] + errorR (Error(FSComp.SR.tcCustomOperationInvalid opName, nm.idRange)) + false + +[] +let (|ExprAsPat|_|) (f: SynExpr) = + match f with + | SingleIdent v1 + | SynExprParen(SingleIdent v1, _, _, _) -> ValueSome(mkSynPatVar None v1) + | SynExprParen(SynExpr.Tuple(false, elems, commas, _), _, _, _) -> + let elems = elems |> List.map (|SingleIdent|_|) + + if elems |> List.forall (fun x -> x.IsSome) then + ValueSome(SynPat.Tuple(false, (elems |> List.map (fun x -> mkSynPatVar None x.Value)), commas, f.Range)) + else + ValueNone + | _ -> ValueNone + +// For join clauses that join on nullable, we syntactically insert the creation of nullable values on the appropriate side of the condition, +// then pull the syntax apart again +[] +let (|JoinRelation|_|) ceenv (expr: SynExpr) = + let m = expr.Range + let ad = ceenv.env.eAccessRights + + let isOpName opName vref s = + (s = opName) + && match + ResolveExprLongIdent + ceenv.cenv.tcSink + ceenv.cenv.nameResolver + m + ad + ceenv.env.eNameResEnv + TypeNameResolutionInfo.Default + [ ident (opName, m) ] + None + with + | Result(_, Item.Value vref2, []) -> valRefEq ceenv.cenv.g vref vref2 + | _ -> false + + match expr with + | BinOpExpr(opId, a, b) when isOpName opNameEquals ceenv.cenv.g.equals_operator_vref opId.idText -> ValueSome(a, b) + + | BinOpExpr(opId, a, b) when isOpName opNameEqualsNullable ceenv.cenv.g.equals_nullable_operator_vref opId.idText -> + + let a = + SynExpr.App(ExprAtomicFlag.Atomic, false, mkSynLidGet a.Range [ MangledGlobalName; "System" ] "Nullable", a, a.Range) + + ValueSome(a, b) + + | BinOpExpr(opId, a, b) when isOpName opNameNullableEquals ceenv.cenv.g.nullable_equals_operator_vref opId.idText -> + + let b = + SynExpr.App(ExprAtomicFlag.Atomic, false, mkSynLidGet b.Range [ MangledGlobalName; "System" ] "Nullable", b, b.Range) + + ValueSome(a, b) + + | BinOpExpr(opId, a, b) when isOpName opNameNullableEqualsNullable ceenv.cenv.g.nullable_equals_nullable_operator_vref opId.idText -> + + ValueSome(a, b) + + | _ -> ValueNone + +let (|ForEachThen|_|) synExpr = + match synExpr with + | SynExpr.ForEach(_spFor, + _spIn, + SeqExprOnly false, + isFromSource, + pat1, + expr1, + SynExpr.Sequential(isTrueSeq = true; expr1 = clause; expr2 = rest), + _) -> Some(isFromSource, pat1, expr1, clause, rest) + | _ -> None + +let (|CustomOpId|_|) isCustomOperation predicate synExpr = + match synExpr with + | SingleIdent nm when isCustomOperation nm && predicate nm -> Some nm + | _ -> None + +// e1 in e2 ('in' is parsed as 'JOIN_IN') +let (|InExpr|_|) synExpr = + match synExpr with + | SynExpr.JoinIn(e1, _, e2, mApp) -> Some(e1, e2, mApp) + | _ -> None + +// e1 on e2 (note: 'on' is the 'JoinConditionWord') +let (|OnExpr|_|) ceenv nm synExpr = + match tryGetDataForCustomOperation nm ceenv with + | None -> None + | Some _ -> + match synExpr with + | SynExpr.App(funcExpr = SynExpr.App(funcExpr = e1; argExpr = SingleIdent opName); argExpr = e2) when + opName.idText = customOperationJoinConditionWord ceenv nm + -> + let item = Item.CustomOperation(opName.idText, (fun () -> None), None) + + CallNameResolutionSink + ceenv.cenv.tcSink + (opName.idRange, ceenv.env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ceenv.env.AccessRights) + + Some(e1, e2) + | _ -> None + +// e1 into e2 +let (|IntoSuffix|_|) (e: SynExpr) = + match e with + | SynExpr.App(funcExpr = SynExpr.App(funcExpr = x; argExpr = SingleIdent nm2); argExpr = ExprAsPat intoPat) when + nm2.idText = CustomOperations.Into + -> + Some(x, nm2.idRange, intoPat) + | _ -> None + +let JoinOrGroupJoinOp ceenv detector synExpr = + match synExpr with + | SynExpr.App(_, _, CustomOpId (isCustomOperation ceenv) detector nm, ExprAsPat innerSourcePat, mJoinCore) -> + Some(nm, innerSourcePat, mJoinCore, false) + // join with bad pattern (gives error on "join" and continues) + | SynExpr.App(_, _, CustomOpId (isCustomOperation ceenv) detector nm, _innerSourcePatExpr, mJoinCore) -> + errorR (Error(FSComp.SR.tcBinaryOperatorRequiresVariable (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + Some(nm, arbPat mJoinCore, mJoinCore, true) + // join (without anything after - gives error on "join" and continues) + | CustomOpId (isCustomOperation ceenv) detector nm -> + errorR (Error(FSComp.SR.tcBinaryOperatorRequiresVariable (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + Some(nm, arbPat synExpr.Range, synExpr.Range, true) + | _ -> None +// JoinOrGroupJoinOp customOperationIsLikeJoin + +let (|JoinOp|_|) ceenv synExpr = + JoinOrGroupJoinOp ceenv (customOperationIsLikeJoin ceenv) synExpr + +let (|GroupJoinOp|_|) ceenv synExpr = + JoinOrGroupJoinOp ceenv (customOperationIsLikeGroupJoin ceenv) synExpr + +let MatchIntoSuffixOrRecover ceenv alreadyGivenError (nm: Ident) synExpr = + match synExpr with + | IntoSuffix(x, intoWordRange, intoPat) -> + // record the "into" as a custom operation for colorization + let item = Item.CustomOperation("into", (fun () -> None), None) + + CallNameResolutionSink + ceenv.cenv.tcSink + (intoWordRange, ceenv.env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ceenv.env.eAccessRights) + + (x, intoPat, alreadyGivenError) + | _ -> + if not alreadyGivenError then + errorR (Error(FSComp.SR.tcOperatorIncorrectSyntax (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + (synExpr, arbPat synExpr.Range, true) + +let MatchOnExprOrRecover ceenv alreadyGivenError nm (onExpr: SynExpr) = + match onExpr with + | OnExpr ceenv nm (innerSource, SynExprParen(keySelectors, _, _, _)) -> (innerSource, keySelectors) + | _ -> + if not alreadyGivenError then + suppressErrorReporting (fun () -> TcExprOfUnknownType ceenv.cenv ceenv.env ceenv.tpenv onExpr) + |> ignore + + errorR (Error(FSComp.SR.tcOperatorIncorrectSyntax (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + (arbExpr ("_innerSource", onExpr.Range), + mkSynBifix onExpr.Range "=" (arbExpr ("_keySelectors", onExpr.Range)) (arbExpr ("_keySelector2", onExpr.Range))) + +let (|JoinExpr|_|) (ceenv: ComputationExpressionContext<'a>) synExpr = + match synExpr with + | InExpr(JoinOp ceenv (nm, innerSourcePat, _, alreadyGivenError), onExpr, mJoinCore) -> + let innerSource, keySelectors = + MatchOnExprOrRecover ceenv alreadyGivenError nm onExpr + + Some(nm, innerSourcePat, innerSource, keySelectors, mJoinCore) + | JoinOp ceenv (nm, innerSourcePat, mJoinCore, alreadyGivenError) -> + if alreadyGivenError then + errorR (Error(FSComp.SR.tcOperatorRequiresIn (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + Some(nm, innerSourcePat, arbExpr ("_innerSource", synExpr.Range), arbKeySelectors synExpr.Range, mJoinCore) + | _ -> None + +let (|GroupJoinExpr|_|) ceenv synExpr = + match synExpr with + | InExpr(GroupJoinOp ceenv (nm, innerSourcePat, _, alreadyGivenError), intoExpr, mGroupJoinCore) -> + let onExpr, intoPat, alreadyGivenError = + MatchIntoSuffixOrRecover ceenv alreadyGivenError nm intoExpr + + let innerSource, keySelectors = + MatchOnExprOrRecover ceenv alreadyGivenError nm onExpr + + Some(nm, innerSourcePat, innerSource, keySelectors, intoPat, mGroupJoinCore) + | GroupJoinOp ceenv (nm, innerSourcePat, mGroupJoinCore, alreadyGivenError) -> + if alreadyGivenError then + errorR (Error(FSComp.SR.tcOperatorRequiresIn (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + Some( + nm, + innerSourcePat, + arbExpr ("_innerSource", synExpr.Range), + arbKeySelectors synExpr.Range, + arbPat synExpr.Range, + mGroupJoinCore + ) + | _ -> None + +let (|JoinOrGroupJoinOrZipClause|_|) (ceenv: ComputationExpressionContext<'a>) synExpr = + + match synExpr with + // join innerSourcePat in innerSource on (keySelector1 = keySelector2) + | JoinExpr ceenv (nm, innerSourcePat, innerSource, keySelectors, mJoinCore) -> + Some(nm, innerSourcePat, innerSource, Some keySelectors, None, mJoinCore) + + // groupJoin innerSourcePat in innerSource on (keySelector1 = keySelector2) into intoPat + | GroupJoinExpr ceenv (nm, innerSourcePat, innerSource, keySelectors, intoPat, mGroupJoinCore) -> + Some(nm, innerSourcePat, innerSource, Some keySelectors, Some intoPat, mGroupJoinCore) + + // zip intoPat in secondSource + | InExpr(SynExpr.App(_, _, CustomOpId (isCustomOperation ceenv) (customOperationIsLikeZip ceenv) nm, ExprAsPat secondSourcePat, _), + secondSource, + mZipCore) -> Some(nm, secondSourcePat, secondSource, None, None, mZipCore) + + // zip (without secondSource or in - gives error) + | CustomOpId (isCustomOperation ceenv) (customOperationIsLikeZip ceenv) nm -> + errorR (Error(FSComp.SR.tcOperatorIncorrectSyntax (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + Some(nm, arbPat synExpr.Range, arbExpr ("_secondSource", synExpr.Range), None, None, synExpr.Range) + + // zip secondSource (without in - gives error) + | SynExpr.App(_, _, CustomOpId (isCustomOperation ceenv) (customOperationIsLikeZip ceenv) nm, ExprAsPat secondSourcePat, mZipCore) -> + errorR (Error(FSComp.SR.tcOperatorIncorrectSyntax (nm.idText, Option.get (customOpUsageText ceenv nm)), mZipCore)) + + Some(nm, secondSourcePat, arbExpr ("_innerSource", synExpr.Range), None, None, mZipCore) + + | _ -> None + +let (|ForEachThenJoinOrGroupJoinOrZipClause|_|) (ceenv: ComputationExpressionContext<'a>) strict synExpr = + match synExpr with + | ForEachThen(isFromSource, + firstSourcePat, + firstSource, + JoinOrGroupJoinOrZipClause ceenv (nm, secondSourcePat, secondSource, keySelectorsOpt, pat3opt, mOpCore), + innerComp) when + (let _firstSourceSimplePats, later1 = + use _holder = TemporarilySuspendReportingTypecheckResultsToSink ceenv.cenv.tcSink + SimplePatsOfPat ceenv.cenv.synArgNameGenerator firstSourcePat + + Option.isNone later1) + -> + Some(isFromSource, firstSourcePat, firstSource, nm, secondSourcePat, secondSource, keySelectorsOpt, pat3opt, mOpCore, innerComp) + + | JoinOrGroupJoinOrZipClause ceenv (nm, pat2, expr2, expr3, pat3opt, mOpCore) when strict -> + errorR (Error(FSComp.SR.tcBinaryOperatorRequiresBody (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + Some( + true, + arbPat synExpr.Range, + arbExpr ("_outerSource", synExpr.Range), + nm, + pat2, + expr2, + expr3, + pat3opt, + mOpCore, + arbExpr ("_innerComp", synExpr.Range) + ) + + | _ -> None + +let (|StripApps|) e = + let rec strip e = + match e with + | SynExpr.FromParseError(SynExpr.App(funcExpr = f; argExpr = arg), _) + | SynExpr.App(funcExpr = f; argExpr = arg) -> + let g, acc = strip f + g, (arg :: acc) + | _ -> e, [] + + let g, acc = strip e + g, List.rev acc + +let (|OptionalIntoSuffix|) e = + match e with + | IntoSuffix(body, intoWordRange, intoInfo) -> (body, Some(intoWordRange, intoInfo)) + | body -> (body, None) + +let (|CustomOperationClause|_|) ceenv e = + match e with + | OptionalIntoSuffix(StripApps(SingleIdent nm, _) as core, intoOpt) when isCustomOperation ceenv nm -> + // Now we know we have a custom operation, commit the name resolution + let intoInfoOpt = + match intoOpt with + | Some(intoWordRange, intoInfo) -> + let item = Item.CustomOperation("into", (fun () -> None), None) + + CallNameResolutionSink + ceenv.cenv.tcSink + (intoWordRange, ceenv.env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ceenv.env.eAccessRights) + + Some intoInfo + | None -> None + + Some(nm, Option.get (tryGetDataForCustomOperation nm ceenv), core, core.Range, intoInfoOpt) + | _ -> None + +let (|OptionalSequential|) e = + match e with + | SynExpr.Sequential(debugPoint = _sp; isTrueSeq = true; expr1 = dataComp1; expr2 = dataComp2) -> (dataComp1, Some dataComp2) + | _ -> (e, None) + +// "cexpr; cexpr" is treated as builder.Combine(cexpr1, cexpr1) +// This is not pretty - we have to decide which range markers we use for the calls to Combine and Delay +// NOTE: we should probably suppress these sequence points altogether +let rangeForCombine innerComp1 = + let m = + match innerComp1 with + | SynExpr.IfThenElse(trivia = { IfToThenRange = mIfToThen }) -> mIfToThen + | SynExpr.Match(matchDebugPoint = DebugPointAtBinding.Yes mMatch) -> mMatch + | SynExpr.TryWith(trivia = { TryKeyword = mTry }) -> mTry + | SynExpr.TryFinally(trivia = { TryKeyword = mTry }) -> mTry + | SynExpr.For(forDebugPoint = DebugPointAtFor.Yes mBind) -> mBind + | SynExpr.ForEach(forDebugPoint = DebugPointAtFor.Yes mBind) -> mBind + | SynExpr.While(whileDebugPoint = DebugPointAtWhile.Yes mWhile) -> mWhile + | _ -> innerComp1.Range + + m.NoteSourceConstruct(NotedSourceConstruct.Combine) + +// Check for 'where x > y', 'select x, y' and other mis-applications of infix operators, give a good error message, and return a flag +let checkForBinaryApp ceenv comp = + match comp with + | StripApps(SingleIdent nm, [ StripApps(SingleIdent nm2, args); arg2 ]) when + IsLogicalInfixOpName nm.idText + && (match tryExpectedArgCountForCustomOperator ceenv nm2 with + | Some n -> n > 0 + | _ -> false) + && not (List.isEmpty args) + -> + let estimatedRangeOfIntendedLeftAndRightArguments = + unionRanges (List.last args).Range arg2.Range + + errorR (Error(FSComp.SR.tcUnrecognizedQueryBinaryOperator (), estimatedRangeOfIntendedLeftAndRightArguments)) + true + | SynExpr.Tuple(false, StripApps(SingleIdent nm2, args) :: _, _, m) when + (match tryExpectedArgCountForCustomOperator ceenv nm2 with + | Some n -> n > 0 + | _ -> false) + && not (List.isEmpty args) + -> + let estimatedRangeOfIntendedLeftAndRightArguments = + unionRanges (List.last args).Range m.EndRange + + errorR (Error(FSComp.SR.tcUnrecognizedQueryBinaryOperator (), estimatedRangeOfIntendedLeftAndRightArguments)) + true + | _ -> false + +let inline addVarsToVarSpace (varSpace: LazyWithContext) f = + LazyWithContext.Create( + (fun m -> + let (patvs: Val list, env) = varSpace.Force m + let vs, envinner = f m env + + let patvs = + List.append + patvs + (vs + |> List.filter (fun v -> not (patvs |> List.exists (fun v2 -> v.LogicalName = v2.LogicalName)))) + + patvs, envinner), + id + ) + +/// +/// Try translate the syntax sugar +/// +/// Computation expression context (carrying caches, environments, ranges, etc) +/// Flag if it's inital check +/// a flag indicating if custom operators are allowed. They are not allowed inside try/with, try/finally, if/then/else etc. +/// a lazy data structure indicating the variables bound so far in the overall computation +/// the computation expression being analyzed +/// represents the translation of the context in which the computation expression 'comp' occurs, +/// up to a hole to be filled by (part of) the results of translating 'comp'. +/// +/// +let rec TryTranslateComputationExpression + (ceenv: ComputationExpressionContext<'a>) + (firstTry: CompExprTranslationPass) + (q: CustomOperationsMode) + (varSpace: LazyWithContext<(Val list * TcEnv), range>) + (comp: SynExpr) + (translatedCtxt: SynExpr -> SynExpr) + : SynExpr option = + // Guard the stack for deeply nested computation expressions + + let cenv = ceenv.cenv + + cenv.stackGuard.Guard + <| fun () -> + + match comp with + + // for firstSourcePat in firstSource do + // join secondSourcePat in expr2 on (expr3 = expr4) + // ... + // --> + // join expr1 expr2 (fun firstSourcePat -> expr3) (fun secondSourcePat -> expr4) (fun firstSourcePat secondSourcePat -> ...) + + // for firstSourcePat in firstSource do + // groupJoin secondSourcePat in expr2 on (expr3 = expr4) into groupPat + // ... + // --> + // groupJoin expr1 expr2 (fun firstSourcePat -> expr3) (fun secondSourcePat -> expr4) (fun firstSourcePat groupPat -> ...) + + // for firstSourcePat in firstSource do + // zip secondSource into secondSourcePat + // ... + // --> + // zip expr1 expr2 (fun pat1 pat3 -> ...) + | ForEachThenJoinOrGroupJoinOrZipClause ceenv true (isFromSource, + firstSourcePat, + firstSource, + nm, + secondSourcePat, + secondSource, + keySelectorsOpt, + secondResultPatOpt, + mOpCore, + innerComp) -> + match q with + | CustomOperationsMode.Denied -> error (Error(FSComp.SR.tcCustomOperationMayNotBeUsedHere (), nm.idRange)) + | CustomOperationsMode.Allowed -> + + let firstSource = + mkSourceExprConditional isFromSource firstSource ceenv.sourceMethInfo ceenv.builderValName + + let secondSource = + mkSourceExpr secondSource ceenv.sourceMethInfo ceenv.builderValName + + // Add the variables to the variable space, on demand + let varSpaceWithFirstVars = + addVarsToVarSpace varSpace (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv firstSourcePat None TcTrueMatchClause.No + + vspecs, envinner) + + let varSpaceWithSecondVars = + addVarsToVarSpace varSpaceWithFirstVars (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv secondSourcePat None TcTrueMatchClause.No + + vspecs, envinner) + + let varSpaceWithGroupJoinVars = + match secondResultPatOpt with + | Some pat3 -> + addVarsToVarSpace varSpaceWithFirstVars (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv pat3 None TcTrueMatchClause.No + + vspecs, envinner) + | None -> varSpace + + let firstSourceSimplePats, later1 = + SimplePatsOfPat cenv.synArgNameGenerator firstSourcePat + + let secondSourceSimplePats, later2 = + SimplePatsOfPat cenv.synArgNameGenerator secondSourcePat + + if Option.isSome later1 then + errorR (Error(FSComp.SR.tcJoinMustUseSimplePattern (nm.idText), firstSourcePat.Range)) + + if Option.isSome later2 then + errorR (Error(FSComp.SR.tcJoinMustUseSimplePattern (nm.idText), secondSourcePat.Range)) + + // check 'join' or 'groupJoin' or 'zip' is permitted for this builder + match tryGetDataForCustomOperation nm ceenv with + | None -> error (Error(FSComp.SR.tcMissingCustomOperation (nm.idText), nm.idRange)) + | Some opDatas -> + let opName, _, _, _, _, _, _, _, methInfo = opDatas[0] + + // Record the resolution of the custom operation for posterity + let item = + Item.CustomOperation(opName, (fun () -> customOpUsageText ceenv nm), Some methInfo) + + // FUTURE: consider whether we can do better than emptyTyparInst here, in order to display instantiations + // of type variables in the quick info provided in the IDE. + CallNameResolutionSink + cenv.tcSink + (nm.idRange, ceenv.env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ceenv.env.eAccessRights) + + let mkJoinExpr keySelector1 keySelector2 innerPat e = + let mSynthetic = mOpCore.MakeSynthetic() + + mkSynCall + methInfo.DisplayName + mOpCore + [ + firstSource + secondSource + mkSynLambda firstSourceSimplePats keySelector1 mSynthetic + mkSynLambda secondSourceSimplePats keySelector2 mSynthetic + mkSynLambda firstSourceSimplePats (mkSynLambda innerPat e mSynthetic) mSynthetic + ] + + let mkZipExpr e = + let mSynthetic = mOpCore.MakeSynthetic() + + mkSynCall + methInfo.DisplayName + mOpCore + [ + firstSource + secondSource + mkSynLambda firstSourceSimplePats (mkSynLambda secondSourceSimplePats e mSynthetic) mSynthetic + ] + + // wraps given expression into sequence with result produced by arbExpr so result will look like: + // l; SynExpr.ArbitraryAfterError (...) + // this allows to handle cases like 'on (a > b)' // '>' is not permitted as correct join relation + // after wrapping a and b can still be typechecked (so we'll have correct completion inside 'on' part) + // but presence of SynExpr.ArbitraryAfterError allows to avoid errors about incompatible types in cases like + // query { + // for a in [1] do + // join b in [""] on (a > b) + // } + // if we typecheck raw 'a' and 'b' then we'll end up with 2 errors: + // 1. incorrect join relation + // 2. incompatible types: int and string + // with SynExpr.ArbitraryAfterError we have only first one + let wrapInArbErrSequence l caption = + SynExpr.Sequential( + DebugPointAtSequential.SuppressNeither, + true, + l, + (arbExpr (caption, l.Range.EndRange)), + l.Range, + SynExprSequentialTrivia.Zero + ) + + let mkOverallExprGivenVarSpaceExpr, varSpaceInner = + + let isNullableOp opId = + match ConvertValLogicalNameToDisplayNameCore opId with + | "?=" + | "=?" + | "?=?" -> true + | _ -> false + + match secondResultPatOpt, keySelectorsOpt with + // groupJoin + | Some secondResultPat, Some relExpr when customOperationIsLikeGroupJoin ceenv nm -> + let secondResultSimplePats, later3 = + SimplePatsOfPat cenv.synArgNameGenerator secondResultPat + + if Option.isSome later3 then + errorR (Error(FSComp.SR.tcJoinMustUseSimplePattern (nm.idText), secondResultPat.Range)) + + match relExpr with + | JoinRelation ceenv (keySelector1, keySelector2) -> + mkJoinExpr keySelector1 keySelector2 secondResultSimplePats, varSpaceWithGroupJoinVars + | BinOpExpr(opId, l, r) -> + if isNullableOp opId.idText then + // When we cannot resolve NullableOps, recommend the relevant namespace to be added + errorR ( + Error( + FSComp.SR.cannotResolveNullableOperators (ConvertValLogicalNameToDisplayNameCore opId.idText), + relExpr.Range + ) + ) + else + errorR (Error(FSComp.SR.tcInvalidRelationInJoin (nm.idText), relExpr.Range)) + + let l = wrapInArbErrSequence l "_keySelector1" + let r = wrapInArbErrSequence r "_keySelector2" + // this is not correct JoinRelation but it is still binary operation + // we've already reported error now we can use operands of binary operation as join components + mkJoinExpr l r secondResultSimplePats, varSpaceWithGroupJoinVars + | _ -> + errorR (Error(FSComp.SR.tcInvalidRelationInJoin (nm.idText), relExpr.Range)) + // since the shape of relExpr doesn't match our expectations (JoinRelation) + // then we assume that this is l.h.s. of the join relation + // so typechecker will treat relExpr as body of outerKeySelector lambda parameter in GroupJoin method + mkJoinExpr relExpr (arbExpr ("_keySelector2", relExpr.Range)) secondResultSimplePats, + varSpaceWithGroupJoinVars + + | None, Some relExpr when customOperationIsLikeJoin ceenv nm -> + match relExpr with + | JoinRelation ceenv (keySelector1, keySelector2) -> + mkJoinExpr keySelector1 keySelector2 secondSourceSimplePats, varSpaceWithSecondVars + | BinOpExpr(opId, l, r) -> + if isNullableOp opId.idText then + // When we cannot resolve NullableOps, recommend the relevant namespace to be added + errorR ( + Error( + FSComp.SR.cannotResolveNullableOperators (ConvertValLogicalNameToDisplayNameCore opId.idText), + relExpr.Range + ) + ) + else + errorR (Error(FSComp.SR.tcInvalidRelationInJoin (nm.idText), relExpr.Range)) + // this is not correct JoinRelation but it is still binary operation + // we've already reported error now we can use operands of binary operation as join components + let l = wrapInArbErrSequence l "_keySelector1" + let r = wrapInArbErrSequence r "_keySelector2" + mkJoinExpr l r secondSourceSimplePats, varSpaceWithGroupJoinVars + | _ -> + errorR (Error(FSComp.SR.tcInvalidRelationInJoin (nm.idText), relExpr.Range)) + // since the shape of relExpr doesn't match our expectations (JoinRelation) + // then we assume that this is l.h.s. of the join relation + // so typechecker will treat relExpr as body of outerKeySelector lambda parameter in Join method + mkJoinExpr relExpr (arbExpr ("_keySelector2", relExpr.Range)) secondSourceSimplePats, + varSpaceWithGroupJoinVars + + | None, None when customOperationIsLikeZip ceenv nm -> mkZipExpr, varSpaceWithSecondVars + + | _ -> + assert false + failwith "unreachable" + + // Case from C# spec: A query expression with a join clause with an into followed by something other than a select clause + // Case from C# spec: A query expression with a join clause without an into followed by something other than a select clause + let valsInner, _env = varSpaceInner.Force mOpCore + let varSpaceExpr = mkExprForVarSpace mOpCore valsInner + let varSpacePat = mkPatForVarSpace mOpCore valsInner + let joinExpr = mkOverallExprGivenVarSpaceExpr varSpaceExpr ceenv.builderValName + + let consumingExpr = + SynExpr.ForEach( + DebugPointAtFor.No, + DebugPointAtInOrTo.No, + SeqExprOnly false, + false, + varSpacePat, + joinExpr, + innerComp, + mOpCore + ) + + Some(TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpaceInner consumingExpr translatedCtxt) + + | SynExpr.ForEach(spFor, spIn, SeqExprOnly _seqExprOnly, isFromSource, pat, sourceExpr, innerComp, _mEntireForEach) -> + let sourceExpr = + match RewriteRangeExpr sourceExpr with + | Some e -> e + | None -> sourceExpr + + let wrappedSourceExpr = + mkSourceExprConditional isFromSource sourceExpr ceenv.sourceMethInfo ceenv.builderValName + + let mFor = + match spFor with + | DebugPointAtFor.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.For) + | DebugPointAtFor.No -> pat.Range + + // For computation expressions, 'in' or 'to' is hit on each MoveNext. + // To support this a named debug point for the "in" keyword is available to inlined code. + match spIn with + | DebugPointAtInOrTo.Yes mIn -> + cenv.namedDebugPointsForInlinedCode[{ + Range = mFor + Name = "ForLoop.InOrToKeyword" + }] <- mIn + | _ -> () + + let mPat = pat.Range + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mFor + ceenv.ad + "For" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("For"), mFor)) + + // Add the variables to the query variable space, on demand + let varSpace = + addVarsToVarSpace varSpace (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv pat None TcTrueMatchClause.No + + vspecs, envinner) + + Some( + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace innerComp (fun innerCompR -> + + let forCall = + mkSynCall + "For" + mFor + [ + wrappedSourceExpr + SynExpr.MatchLambda( + false, + mPat, + [ + SynMatchClause(pat, None, innerCompR, mPat, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero) + ], + DebugPointAtBinding.NoneAtInvisible, + mFor + ) + ] + ceenv.builderValName + + let forCall = + match spFor with + | DebugPointAtFor.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, false, forCall) + | DebugPointAtFor.No -> forCall + + translatedCtxt forCall) + ) + + | SynExpr.For( + forDebugPoint = spFor + toDebugPoint = spTo + ident = id + identBody = start + direction = dir + toBody = finish + doBody = innerComp + range = m) -> + let mFor = + match spFor with + | DebugPointAtFor.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.For) + | _ -> m + + if ceenv.isQuery then + errorR (Error(FSComp.SR.tcNoIntegerForLoopInQuery (), mFor)) + + let reduced = + elimFastIntegerForLoop (spFor, spTo, id, start, dir, finish, innerComp, m) + + Some(TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace reduced translatedCtxt) + | SynExpr.While(spWhile, guardExpr, innerComp, _) -> + let mGuard = guardExpr.Range + + let mWhile = + match spWhile with + | DebugPointAtWhile.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) + | _ -> mGuard + + if ceenv.isQuery then + error (Error(FSComp.SR.tcNoWhileInQuery (), mWhile)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mWhile + ceenv.ad + "While" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("While"), mWhile)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mWhile + ceenv.ad + "Delay" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Delay"), mWhile)) + + // 'while' is hit just before each time the guard is called + let guardExpr = + match spWhile with + | DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr) + | DebugPointAtWhile.No -> guardExpr + + Some( + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> + translatedCtxt ( + mkSynCall + "While" + mWhile + [ + mkSynDelay2 guardExpr + mkSynCall "Delay" mWhile [ mkSynDelay innerComp.Range holeFill ] ceenv.builderValName + ] + ceenv.builderValName + )) + ) + + | SynExpr.WhileBang(spWhile, guardExpr, innerComp, mOrig) -> + let mGuard = guardExpr.Range + + let mWhile = + match spWhile with + | DebugPointAtWhile.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) + | _ -> mGuard + + let mGuard = mGuard.MakeSynthetic() + + // 'while!' is hit just before each time the guard is called + let guardExpr = + match spWhile with + | DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr) + | DebugPointAtWhile.No -> guardExpr + + let rewrittenWhileExpr = + let idFirst = mkSynId mGuard (CompilerGeneratedName "first") + let patFirst = mkSynPatVar None idFirst + + let body = + let idCond = mkSynId mGuard (CompilerGeneratedName "cond") + let patCond = mkSynPatVar None idCond + + let condBinding = + mkSynBinding + (Xml.PreXmlDoc.Empty, patCond) + (None, + false, + true, + mGuard, + DebugPointAtBinding.NoneAtSticky, + None, + SynExpr.Ident idFirst, + mGuard, + [], + [], + None, + SynBindingTrivia.Zero) + + let setCondExpr = SynExpr.Set(SynExpr.Ident idCond, SynExpr.Ident idFirst, mGuard) + + let bindCondExpr = + SynExpr.LetOrUseBang( + DebugPointAtBinding.NoneAtSticky, + false, + true, + patFirst, + guardExpr, + [], + setCondExpr, + mGuard, + SynExprLetOrUseBangTrivia.Zero + ) + + let whileExpr = + SynExpr.While( + DebugPointAtWhile.No, + SynExpr.Ident idCond, + SynExpr.Sequential( + DebugPointAtSequential.SuppressBoth, + true, + innerComp, + bindCondExpr, + mWhile, + SynExprSequentialTrivia.Zero + ), + mOrig + ) + + SynExpr.LetOrUse(false, false, [ condBinding ], whileExpr, mGuard, SynExprLetOrUseTrivia.Zero) + + SynExpr.LetOrUseBang( + DebugPointAtBinding.NoneAtSticky, + false, + true, + patFirst, + guardExpr, + [], + body, + mGuard, + SynExprLetOrUseBangTrivia.Zero + ) + + TryTranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace rewrittenWhileExpr translatedCtxt + + | SynExpr.TryFinally(innerComp, unwindExpr, _mTryToLast, spTry, spFinally, trivia) -> + + let mTry = + match spTry with + | DebugPointAtTry.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Try) + | _ -> trivia.TryKeyword + + let mFinally = + match spFinally with + | DebugPointAtFinally.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Finally) + | _ -> trivia.FinallyKeyword + + // Put down a debug point for the 'finally' + let unwindExpr2 = + match spFinally with + | DebugPointAtFinally.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFinally, true, unwindExpr) + | DebugPointAtFinally.No -> unwindExpr + + if ceenv.isQuery then + error (Error(FSComp.SR.tcNoTryFinallyInQuery (), mTry)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mTry + ceenv.ad + "TryFinally" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("TryFinally"), mTry)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mTry + ceenv.ad + "Delay" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Delay"), mTry)) + + let innerExpr = TranslateComputationExpressionNoQueryOps ceenv innerComp + + let innerExpr = + match spTry with + | DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr) + | _ -> innerExpr + + Some( + translatedCtxt ( + mkSynCall + "TryFinally" + mTry + [ + mkSynCall "Delay" mTry [ mkSynDelay innerComp.Range innerExpr ] ceenv.builderValName + mkSynDelay2 unwindExpr2 + ] + ceenv.builderValName + ) + ) + + | SynExpr.Paren(range = m) -> error (Error(FSComp.SR.tcConstructIsAmbiguousInComputationExpression (), m)) + + // In some cases the node produced by `mkSynCall "Zero" m []` may be discarded in the case + // of implicit yields - for example "list { 1; 2 }" when each expression checks as an implicit yield. + // If it is not discarded, the syntax node will later be checked and the existence/non-existence of the Zero method + // will be checked/reported appropriately (though the error message won't mention computation expressions + // like our other error messages for missing methods). + | SynExpr.ImplicitZero m -> + if + (not ceenv.enableImplicitYield) + && isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + m + ceenv.ad + "Zero" + ceenv.builderTy + ) + then + match ceenv.origComp with + // builder { } + // + // The compiler inserts a dummy () in CheckExpressions.fs for + // empty-bodied computation expressions. In this case, the user + // has not actually written any "control construct" in the body, + // and so we use a more specific error message for clarity. + | SynExpr.Const(SynConst.Unit, mUnit) when + cenv.g.langVersion.SupportsFeature LanguageFeature.EmptyBodiedComputationExpressions + && Range.equals mUnit range0 + -> + error (Error(FSComp.SR.tcEmptyBodyRequiresBuilderZeroMethod (), ceenv.mWhole)) + | _ -> error (Error(FSComp.SR.tcRequireBuilderMethod ("Zero"), m)) + + Some(translatedCtxt (mkSynCall "Zero" m [] ceenv.builderValName)) + + | OptionalSequential(JoinOrGroupJoinOrZipClause ceenv (_, _, _, _, _, mClause), _) when firstTry = CompExprTranslationPass.Initial -> + + // 'join' clauses preceded by 'let' and other constructs get processed by repackaging with a 'for' loop. + let patvs, _env = varSpace.Force comp.Range + let varSpaceExpr = mkExprForVarSpace mClause patvs + let varSpacePat = mkPatForVarSpace mClause patvs + + let dataCompPrior = + translatedCtxt ( + TranslateComputationExpressionNoQueryOps + ceenv + (SynExpr.YieldOrReturn((true, false), varSpaceExpr, mClause, SynExprYieldOrReturnTrivia.Zero)) + ) + + // Rebind using for ... + let rebind = + SynExpr.ForEach( + DebugPointAtFor.No, + DebugPointAtInOrTo.No, + SeqExprOnly false, + false, + varSpacePat, + dataCompPrior, + comp, + comp.Range + ) + + // Retry with the 'for' loop packaging. Set firstTry=false just in case 'join' processing fails + TryTranslateComputationExpression ceenv CompExprTranslationPass.Subsequent q varSpace rebind id + + | OptionalSequential(CustomOperationClause ceenv (nm, _, opExpr, mClause, _), _) -> + + match q with + | CustomOperationsMode.Denied -> error (Error(FSComp.SR.tcCustomOperationMayNotBeUsedHere (), opExpr.Range)) + | CustomOperationsMode.Allowed -> + let patvs, _env = varSpace.Force comp.Range + let varSpaceExpr = mkExprForVarSpace mClause patvs + + let dataCompPriorToOp = + let isYield = not (customOperationMaintainsVarSpaceUsingBind ceenv nm) + + translatedCtxt ( + TranslateComputationExpressionNoQueryOps + ceenv + (SynExpr.YieldOrReturn((isYield, false), varSpaceExpr, mClause, SynExprYieldOrReturnTrivia.Zero)) + ) + + // Now run the consumeCustomOpClauses + Some(ConsumeCustomOpClauses ceenv comp q varSpace dataCompPriorToOp comp false mClause) + + | SynExpr.Sequential(sp, true, innerComp1, innerComp2, m, _) -> + + // Check for 'where x > y' and other mis-applications of infix operators. If detected, give a good error message, and just ignore innerComp1 + if ceenv.isQuery && checkForBinaryApp ceenv innerComp1 then + Some(TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace innerComp2 translatedCtxt) + + else + if ceenv.isQuery && not (innerComp1.IsArbExprAndThusAlreadyReportedError) then + match innerComp1 with + | SynExpr.JoinIn _ -> () + | SynExpr.DoBang(trivia = { DoBangKeyword = m }) -> errorR (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), m)) + | _ -> errorR (Error(FSComp.SR.tcUnrecognizedQueryOperator (), innerComp1.RangeOfFirstPortion)) + + match + TryTranslateComputationExpression + ceenv + CompExprTranslationPass.Initial + CustomOperationsMode.Denied + varSpace + innerComp1 + id + with + | Some c -> + // "cexpr; cexpr" is treated as builder.Combine(cexpr1, cexpr1) + let m1 = rangeForCombine innerComp1 + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + m + ceenv.ad + "Combine" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Combine"), m)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + m + ceenv.ad + "Delay" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Delay"), m)) + + let combineCall = + mkSynCall + "Combine" + m1 + [ + c + mkSynCall + "Delay" + m1 + [ + mkSynDelay innerComp2.Range (TranslateComputationExpressionNoQueryOps ceenv innerComp2) + ] + ceenv.builderValName + ] + ceenv.builderValName + + Some(translatedCtxt combineCall) + + | None -> + // "do! expr; cexpr" is treated as { let! () = expr in cexpr } + match innerComp1 with + | SynExpr.DoBang(expr = rhsExpr; range = m) -> + let sp = + match sp with + | DebugPointAtSequential.SuppressExpr -> DebugPointAtBinding.NoneAtDo + | DebugPointAtSequential.SuppressBoth -> DebugPointAtBinding.NoneAtDo + | DebugPointAtSequential.SuppressStmt -> DebugPointAtBinding.Yes m + | DebugPointAtSequential.SuppressNeither -> DebugPointAtBinding.Yes m + + Some( + TranslateComputationExpression + ceenv + CompExprTranslationPass.Initial + q + varSpace + (SynExpr.LetOrUseBang( + sp, + false, + true, + SynPat.Const(SynConst.Unit, rhsExpr.Range), + rhsExpr, + [], + innerComp2, + m, + SynExprLetOrUseBangTrivia.Zero + )) + translatedCtxt + ) + + // "expr; cexpr" is treated as sequential execution + | _ -> + Some( + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace innerComp2 (fun holeFill -> + let fillExpr = + if ceenv.enableImplicitYield then + // When implicit yields are enabled, then if the 'innerComp1' checks as type + // 'unit' we interpret the expression as a sequential, and when it doesn't + // have type 'unit' we interpret it as a 'Yield + Combine'. + let combineExpr = + let m1 = rangeForCombine innerComp1 + + let implicitYieldExpr = + mkSynCall "Yield" comp.Range [ innerComp1 ] ceenv.builderValName + + mkSynCall + "Combine" + m1 + [ + implicitYieldExpr + mkSynCall "Delay" m1 [ mkSynDelay holeFill.Range holeFill ] ceenv.builderValName + ] + ceenv.builderValName + + SynExpr.SequentialOrImplicitYield(sp, innerComp1, holeFill, combineExpr, m) + else + SynExpr.Sequential(sp, true, innerComp1, holeFill, m, SynExprSequentialTrivia.Zero) + + translatedCtxt fillExpr) + ) + + | SynExpr.IfThenElse(guardExpr, thenComp, elseCompOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia) -> + match elseCompOpt with + | Some elseComp -> + if ceenv.isQuery then + error (Error(FSComp.SR.tcIfThenElseMayNotBeUsedWithinQueries (), trivia.IfToThenRange)) + + Some( + translatedCtxt ( + SynExpr.IfThenElse( + guardExpr, + TranslateComputationExpressionNoQueryOps ceenv thenComp, + Some(TranslateComputationExpressionNoQueryOps ceenv elseComp), + spIfToThen, + isRecovery, + mIfToEndOfElseBranch, + trivia + ) + ) + ) + | None -> + let elseComp = + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + trivia.IfToThenRange + ceenv.ad + "Zero" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Zero"), trivia.IfToThenRange)) + + mkSynCall "Zero" trivia.IfToThenRange [] ceenv.builderValName + + Some( + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace thenComp (fun holeFill -> + translatedCtxt ( + SynExpr.IfThenElse(guardExpr, holeFill, Some elseComp, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia) + )) + ) + + // 'let binds in expr' + | SynExpr.LetOrUse(isRec, false, binds, innerComp, m, trivia) -> + + // For 'query' check immediately + if ceenv.isQuery then + match (List.map (BindingNormalization.NormalizeBinding ValOrMemberBinding cenv ceenv.env) binds) with + | [ NormalizedBinding(_, SynBindingKind.Normal, false, false, _, _, _, _, _, _, _, _) ] when not isRec -> () + | normalizedBindings -> + let failAt m = + error (Error(FSComp.SR.tcNonSimpleLetBindingInQuery (), m)) + + match normalizedBindings with + | NormalizedBinding(mBinding = mBinding) :: _ -> failAt mBinding + | _ -> failAt m + + // Add the variables to the query variable space, on demand + let varSpace = + addVarsToVarSpace varSpace (fun mQueryOp env -> + // Normalize the bindings before detecting the bound variables + match (List.map (BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env) binds) with + | [ NormalizedBinding(kind = SynBindingKind.Normal; shouldInline = false; isMutable = false; pat = pat) ] -> + // successful case + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv pat None TcTrueMatchClause.No + + vspecs, envinner + | _ -> + // error case + error (Error(FSComp.SR.tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings (), mQueryOp))) + + Some( + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> + translatedCtxt (SynExpr.LetOrUse(isRec, false, binds, holeFill, m, trivia))) + ) + + // 'use x = expr in expr' + | SynExpr.LetOrUse( + isUse = true + bindings = [ SynBinding(kind = SynBindingKind.Normal; headPat = pat; expr = rhsExpr; debugPoint = spBind) ] + body = innerComp + trivia = { LetOrUseKeyword = mBind }) -> + + if ceenv.isQuery then + error (Error(FSComp.SR.tcUseMayNotBeUsedInQueries (), mBind)) + + let innerCompRange = innerComp.Range + + let consumeExpr = + SynExpr.MatchLambda( + false, + innerCompRange, + [ + SynMatchClause( + pat, + None, + TranslateComputationExpressionNoQueryOps ceenv innerComp, + innerCompRange, + DebugPointAtTarget.Yes, + SynMatchClauseTrivia.Zero + ) + ], + DebugPointAtBinding.NoneAtInvisible, + innerCompRange + ) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + "Using" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Using"), mBind)) + + Some( + translatedCtxt (mkSynCall "Using" mBind [ rhsExpr; consumeExpr ] ceenv.builderValName) + |> addBindDebugPoint spBind + ) + + // 'let! pat = expr in expr' + // --> build.Bind(e1, (fun _argN -> match _argN with pat -> expr)) + // or + // --> build.BindReturn(e1, (fun _argN -> match _argN with pat -> expr-without-return)) + | SynExpr.LetOrUseBang( + bindDebugPoint = spBind + isUse = false + isFromSource = isFromSource + pat = pat + rhs = rhsExpr + andBangs = [] + body = innerComp + trivia = { LetOrUseBangKeyword = mBind }) -> + + if ceenv.isQuery then + error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), mBind)) + + // Add the variables to the query variable space, on demand + let varSpace = + addVarsToVarSpace varSpace (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv pat None TcTrueMatchClause.No + + vspecs, envinner) + + let rhsExpr = + mkSourceExprConditional isFromSource rhsExpr ceenv.sourceMethInfo ceenv.builderValName + + Some( + TranslateComputationExpressionBind + ceenv + comp + q + varSpace + mBind + (addBindDebugPoint spBind) + "Bind" + [ rhsExpr ] + pat + innerComp + translatedCtxt + ) + + // 'use! pat = e1 in e2' --> build.Bind(e1, (function _argN -> match _argN with pat -> build.Using(x, (fun _argN -> match _argN with pat -> e2)))) + | SynExpr.LetOrUseBang( + bindDebugPoint = spBind + isUse = true + isFromSource = isFromSource + pat = SynPat.Named(ident = SynIdent(id, _); isThisVal = false) as pat + rhs = rhsExpr + andBangs = [] + body = innerComp + trivia = { LetOrUseBangKeyword = mBind }) + | SynExpr.LetOrUseBang( + bindDebugPoint = spBind + isUse = true + isFromSource = isFromSource + pat = SynPat.LongIdent(longDotId = SynLongIdent(id = [ id ])) as pat + rhs = rhsExpr + andBangs = [] + body = innerComp + trivia = { LetOrUseBangKeyword = mBind }) -> + + if ceenv.isQuery then + error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), mBind)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + "Using" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Using"), mBind)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + "Bind" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Bind"), mBind)) + + let bindExpr = + let consumeExpr = + SynExpr.MatchLambda( + false, + mBind, + [ + SynMatchClause( + pat, + None, + TranslateComputationExpressionNoQueryOps ceenv innerComp, + innerComp.Range, + DebugPointAtTarget.Yes, + SynMatchClauseTrivia.Zero + ) + ], + DebugPointAtBinding.NoneAtInvisible, + mBind + ) + + let consumeExpr = + mkSynCall "Using" mBind [ SynExpr.Ident id; consumeExpr ] ceenv.builderValName + + let consumeExpr = + SynExpr.MatchLambda( + false, + mBind, + [ + SynMatchClause(pat, None, consumeExpr, id.idRange, DebugPointAtTarget.No, SynMatchClauseTrivia.Zero) + ], + DebugPointAtBinding.NoneAtInvisible, + mBind + ) + + let rhsExpr = + mkSourceExprConditional isFromSource rhsExpr ceenv.sourceMethInfo ceenv.builderValName + + mkSynCall "Bind" mBind [ rhsExpr; consumeExpr ] ceenv.builderValName + |> addBindDebugPoint spBind + + Some(translatedCtxt bindExpr) + + // 'use! pat = e1 ... in e2' where 'pat' is not a simple name -> error + | SynExpr.LetOrUseBang(isUse = true; andBangs = andBangs; trivia = { LetOrUseBangKeyword = mBind }) -> + if isNil andBangs then + error (Error(FSComp.SR.tcInvalidUseBangBinding (), mBind)) + else + let m = + match andBangs with + | [] -> comp.Range + | h :: _ -> h.Trivia.AndBangKeyword + + error (Error(FSComp.SR.tcInvalidUseBangBindingNoAndBangs (), m)) + + // 'let! pat1 = expr1 and! pat2 = expr2 in ...' --> + // build.BindN(expr1, expr2, ...) + // or + // build.BindNReturn(expr1, expr2, ...) + // or + // build.Bind(build.MergeSources(expr1, expr2), ...) + | SynExpr.LetOrUseBang( + bindDebugPoint = spBind + isUse = false + isFromSource = isFromSource + pat = letPat + rhs = letRhsExpr + andBangs = andBangBindings + body = innerComp + trivia = { LetOrUseBangKeyword = mBind }) -> + if not (cenv.g.langVersion.SupportsFeature LanguageFeature.AndBang) then + let andBangRange = + match andBangBindings with + | [] -> comp.Range + | h :: _ -> h.Trivia.AndBangKeyword + + error (Error(FSComp.SR.tcAndBangNotSupported (), andBangRange)) + + if ceenv.isQuery then + error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), mBind)) + + let sources = + (letRhsExpr + :: [ for SynExprAndBang(body = andExpr) in andBangBindings -> andExpr ]) + |> List.map (fun expr -> mkSourceExprConditional isFromSource expr ceenv.sourceMethInfo ceenv.builderValName) + + let pats = + letPat :: [ for SynExprAndBang(pat = andPat) in andBangBindings -> andPat ] + + let sourcesRange = sources |> List.map (fun e -> e.Range) |> List.reduce unionRanges + + let numSources = sources.Length + let bindReturnNName = "Bind" + string numSources + "Return" + let bindNName = "Bind" + string numSources + + // Check if this is a Bind2Return etc. + let hasBindReturnN = + not ( + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + bindReturnNName + ceenv.builderTy + ) + ) + + if + hasBindReturnN + && Option.isSome (convertSimpleReturnToExpr ceenv comp varSpace innerComp) + then + let consumePat = SynPat.Tuple(false, pats, [], letPat.Range) + + // Add the variables to the query variable space, on demand + let varSpace = + addVarsToVarSpace varSpace (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv consumePat None TcTrueMatchClause.No + + vspecs, envinner) + + Some( + TranslateComputationExpressionBind + ceenv + comp + q + varSpace + mBind + (addBindDebugPoint spBind) + bindNName + sources + consumePat + innerComp + translatedCtxt + ) + + else + + // Check if this is a Bind2 etc. + let hasBindN = + not ( + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + bindNName + ceenv.builderTy + ) + ) + + if hasBindN then + let consumePat = SynPat.Tuple(false, pats, [], letPat.Range) + + // Add the variables to the query variable space, on demand + let varSpace = + addVarsToVarSpace varSpace (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv consumePat None TcTrueMatchClause.No + + vspecs, envinner) + + Some( + TranslateComputationExpressionBind + ceenv + comp + q + varSpace + mBind + (addBindDebugPoint spBind) + bindNName + sources + consumePat + innerComp + translatedCtxt + ) + else + + // Look for the maximum supported MergeSources, MergeSources3, ... + let mkMergeSourcesName n = + if n = 2 then + "MergeSources" + else + "MergeSources" + (string n) + + let maxMergeSources = + let rec loop (n: int) = + let mergeSourcesName = mkMergeSourcesName n + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + mergeSourcesName + ceenv.builderTy + ) + then + (n - 1) + else + loop (n + 1) + + loop 2 + + if maxMergeSources = 1 then + error (Error(FSComp.SR.tcRequireMergeSourcesOrBindN (bindNName), mBind)) + + let rec mergeSources (sourcesAndPats: (SynExpr * SynPat) list) = + let numSourcesAndPats = sourcesAndPats.Length + assert (numSourcesAndPats <> 0) + + if numSourcesAndPats = 1 then + sourcesAndPats[0] + + elif numSourcesAndPats <= maxMergeSources then + + // Call MergeSources2(e1, e2), MergeSources3(e1, e2, e3) etc + let mergeSourcesName = mkMergeSourcesName numSourcesAndPats + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + mergeSourcesName + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireMergeSourcesOrBindN (bindNName), mBind)) + + let source = + mkSynCall mergeSourcesName sourcesRange (List.map fst sourcesAndPats) ceenv.builderValName + + let pat = SynPat.Tuple(false, List.map snd sourcesAndPats, [], letPat.Range) + source, pat + + else + + // Call MergeSourcesMax(e1, e2, e3, e4, (...)) + let nowSourcesAndPats, laterSourcesAndPats = + List.splitAt (maxMergeSources - 1) sourcesAndPats + + let mergeSourcesName = mkMergeSourcesName maxMergeSources + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mBind + ceenv.ad + mergeSourcesName + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireMergeSourcesOrBindN (bindNName), mBind)) + + let laterSource, laterPat = mergeSources laterSourcesAndPats + + let source = + mkSynCall + mergeSourcesName + sourcesRange + (List.map fst nowSourcesAndPats @ [ laterSource ]) + ceenv.builderValName + + let pat = + SynPat.Tuple(false, List.map snd nowSourcesAndPats @ [ laterPat ], [], letPat.Range) + + source, pat + + let mergedSources, consumePat = mergeSources (List.zip sources pats) + + // Add the variables to the query variable space, on demand + let varSpace = + addVarsToVarSpace varSpace (fun _mCustomOp env -> + use _holder = TemporarilySuspendReportingTypecheckResultsToSink cenv.tcSink + + let _, _, vspecs, envinner, _ = + TcMatchPattern cenv (NewInferenceType cenv.g) env ceenv.tpenv consumePat None TcTrueMatchClause.No + + vspecs, envinner) + + // Build the 'Bind' call + Some( + TranslateComputationExpressionBind + ceenv + comp + q + varSpace + mBind + (addBindDebugPoint spBind) + "Bind" + [ mergedSources ] + consumePat + innerComp + translatedCtxt + ) + + | SynExpr.Match(spMatch, expr, clauses, m, trivia) -> + if ceenv.isQuery then + error (Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery (), trivia.MatchKeyword)) + + let clauses = + clauses + |> List.map (fun (SynMatchClause(pat, cond, innerComp, patm, sp, trivia)) -> + SynMatchClause(pat, cond, TranslateComputationExpressionNoQueryOps ceenv innerComp, patm, sp, trivia)) + + Some(translatedCtxt (SynExpr.Match(spMatch, expr, clauses, m, trivia))) + + // 'match! expr with pats ...' --> build.Bind(e1, (function pats ...)) + // FUTURE: consider allowing translation to BindReturn + | SynExpr.MatchBang(spMatch, expr, clauses, _m, trivia) -> + let inputExpr = mkSourceExpr expr ceenv.sourceMethInfo ceenv.builderValName + + if ceenv.isQuery then + error (Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery (), trivia.MatchBangKeyword)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + trivia.MatchBangKeyword + ceenv.ad + "Bind" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Bind"), trivia.MatchBangKeyword)) + + let clauses = + clauses + |> List.map (fun (SynMatchClause(pat, cond, innerComp, patm, sp, trivia)) -> + SynMatchClause(pat, cond, TranslateComputationExpressionNoQueryOps ceenv innerComp, patm, sp, trivia)) + + let consumeExpr = + SynExpr.MatchLambda(false, trivia.MatchBangKeyword, clauses, DebugPointAtBinding.NoneAtInvisible, trivia.MatchBangKeyword) + + let callExpr = + mkSynCall "Bind" trivia.MatchBangKeyword [ inputExpr; consumeExpr ] ceenv.builderValName + |> addBindDebugPoint spMatch + + Some(translatedCtxt callExpr) + + | SynExpr.TryWith(innerComp, clauses, mTryToLast, spTry, spWith, trivia) -> + let mTry = + match spTry with + | DebugPointAtTry.Yes _ -> trivia.TryKeyword.NoteSourceConstruct(NotedSourceConstruct.Try) + | _ -> trivia.TryKeyword + + let spWith2 = + match spWith with + | DebugPointAtWith.Yes _ -> DebugPointAtBinding.Yes trivia.WithKeyword + | _ -> DebugPointAtBinding.NoneAtInvisible + + if ceenv.isQuery then + error (Error(FSComp.SR.tcTryWithMayNotBeUsedInQueries (), mTry)) + + let clauses = + clauses + |> List.map (fun (SynMatchClause(pat, cond, clauseComp, patm, sp, trivia)) -> + SynMatchClause(pat, cond, TranslateComputationExpressionNoQueryOps ceenv clauseComp, patm, sp, trivia)) + + let consumeExpr = + SynExpr.MatchLambda(true, mTryToLast, clauses, spWith2, mTryToLast) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mTry + ceenv.ad + "TryWith" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("TryWith"), mTry)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + mTry + ceenv.ad + "Delay" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("Delay"), mTry)) + + let innerExpr = TranslateComputationExpressionNoQueryOps ceenv innerComp + + let innerExpr = + match spTry with + | DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr) + | _ -> innerExpr + + let callExpr = + mkSynCall + "TryWith" + mTry + [ + mkSynCall "Delay" mTry [ mkSynDelay2 innerExpr ] ceenv.builderValName + consumeExpr + ] + ceenv.builderValName + + Some(translatedCtxt callExpr) + + | SynExpr.YieldOrReturnFrom((true, _), synYieldExpr, _, { YieldOrReturnFromKeyword = m }) -> + let yieldFromExpr = + mkSourceExpr synYieldExpr ceenv.sourceMethInfo ceenv.builderValName + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + m + ceenv.ad + "YieldFrom" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("YieldFrom"), m)) + + let yieldFromCall = + mkSynCall "YieldFrom" synYieldExpr.Range [ yieldFromExpr ] ceenv.builderValName + + let yieldFromCall = + if IsControlFlowExpression synYieldExpr then + yieldFromCall + else + SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, yieldFromCall) + + Some(translatedCtxt yieldFromCall) + + | SynExpr.YieldOrReturnFrom((false, _), synReturnExpr, _, { YieldOrReturnFromKeyword = m }) -> + let returnFromExpr = + mkSourceExpr synReturnExpr ceenv.sourceMethInfo ceenv.builderValName + + if ceenv.isQuery then + error (Error(FSComp.SR.tcReturnMayNotBeUsedInQueries (), m)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + m + ceenv.ad + "ReturnFrom" + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod ("ReturnFrom"), m)) + + let returnFromCall = + mkSynCall "ReturnFrom" synReturnExpr.Range [ returnFromExpr ] ceenv.builderValName + + let returnFromCall = + if IsControlFlowExpression synReturnExpr then + returnFromCall + else + SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, returnFromCall) + + Some(translatedCtxt returnFromCall) + + | SynExpr.YieldOrReturn((isYield, _), synYieldOrReturnExpr, _, { YieldOrReturnKeyword = m }) -> + let methName = (if isYield then "Yield" else "Return") + + if ceenv.isQuery && not isYield then + error (Error(FSComp.SR.tcReturnMayNotBeUsedInQueries (), m)) + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + cenv + ceenv.env + m + ceenv.ad + methName + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod methName, m)) + + let yieldOrReturnCall = + mkSynCall methName synYieldOrReturnExpr.Range [ synYieldOrReturnExpr ] ceenv.builderValName + + let yieldOrReturnCall = + if IsControlFlowExpression synYieldOrReturnExpr then + yieldOrReturnCall + else + SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, yieldOrReturnCall) + + Some(translatedCtxt yieldOrReturnCall) + + | _ -> None + +and ConsumeCustomOpClauses + (ceenv: ComputationExpressionContext<'a>) + (comp: SynExpr) + q + (varSpace: LazyWithContext<_, _>) + dataCompPrior + compClausesExpr + lastUsesBind + mClause + = + + // Substitute 'yield ' into the context + + let patvs, _env = varSpace.Force comp.Range + let varSpaceSimplePat = mkSimplePatForVarSpace mClause patvs + let varSpacePat = mkPatForVarSpace mClause patvs + + match compClausesExpr with + + // Detect one custom operation... This clause will always match at least once... + | OptionalSequential(CustomOperationClause ceenv (nm, opDatas, opExpr, mClause, optionalIntoPat), optionalCont) -> + + let opName, _, _, _, _, _, _, _, methInfo = opDatas[0] + + let isLikeZip = customOperationIsLikeZip ceenv nm + + let isLikeJoin = customOperationIsLikeJoin ceenv nm + + let isLikeGroupJoin = customOperationIsLikeZip ceenv nm + + // Record the resolution of the custom operation for posterity + let item = + Item.CustomOperation(opName, (fun () -> customOpUsageText ceenv nm), Some methInfo) + + // FUTURE: consider whether we can do better than emptyTyparInst here, in order to display instantiations + // of type variables in the quick info provided in the IDE. + CallNameResolutionSink + ceenv.cenv.tcSink + (nm.idRange, ceenv.env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ceenv.env.eAccessRights) + + if isLikeZip || isLikeJoin || isLikeGroupJoin then + errorR (Error(FSComp.SR.tcBinaryOperatorRequiresBody (nm.idText, Option.get (customOpUsageText ceenv nm)), nm.idRange)) + + match optionalCont with + | None -> + // we are about to drop the 'opExpr' AST on the floor. we've already reported an error. attempt to get name resolutions before dropping it + RecordNameAndTypeResolutions ceenv.cenv ceenv.env ceenv.tpenv opExpr + dataCompPrior + | Some contExpr -> ConsumeCustomOpClauses ceenv comp q varSpace dataCompPrior contExpr lastUsesBind mClause + else + + let maintainsVarSpace = customOperationMaintainsVarSpace ceenv nm + + let maintainsVarSpaceUsingBind = customOperationMaintainsVarSpaceUsingBind ceenv nm + + let expectedArgCount = tryExpectedArgCountForCustomOperator ceenv nm + + let dataCompAfterOp = + match opExpr with + | StripApps(SingleIdent nm, args) -> + let argCountsMatch = + match expectedArgCount with + | Some n -> n = args.Length + | None -> ceenv.cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations + + if argCountsMatch then + // Check for the [] attribute on each argument position + let args = + args + |> List.mapi (fun i arg -> + if isCustomOperationProjectionParameter ceenv (i + 1) nm then + SynExpr.Lambda( + false, + false, + varSpaceSimplePat, + arg, + None, + arg.Range.MakeSynthetic(), + SynExprLambdaTrivia.Zero + ) + else + arg) + + mkSynCall methInfo.DisplayName mClause (dataCompPrior :: args) ceenv.builderValName + else + let expectedArgCount = defaultArg expectedArgCount 0 + + errorR ( + Error(FSComp.SR.tcCustomOperationHasIncorrectArgCount (nm.idText, expectedArgCount, args.Length), nm.idRange) + ) + + mkSynCall + methInfo.DisplayName + mClause + ([ dataCompPrior ] + @ List.init expectedArgCount (fun i -> arbExpr ("_arg" + string i, mClause))) + ceenv.builderValName + | _ -> failwith "unreachable" + + match optionalCont with + | None -> + match optionalIntoPat with + | Some intoPat -> errorR (Error(FSComp.SR.tcIntoNeedsRestOfQuery (), intoPat.Range)) + | None -> () + + dataCompAfterOp + + | Some contExpr -> + + // select a.Name into name; ... + // distinct into d; ... + // + // Rebind the into pattern and process the rest of the clauses + match optionalIntoPat with + | Some intoPat -> + if not (customOperationAllowsInto ceenv nm) then + error (Error(FSComp.SR.tcOperatorDoesntAcceptInto (nm.idText), intoPat.Range)) + + // Rebind using either for ... or let!.... + let rebind = + if maintainsVarSpaceUsingBind then + SynExpr.LetOrUseBang( + DebugPointAtBinding.NoneAtLet, + false, + false, + intoPat, + dataCompAfterOp, + [], + contExpr, + intoPat.Range, + SynExprLetOrUseBangTrivia.Zero + ) + else + SynExpr.ForEach( + DebugPointAtFor.No, + DebugPointAtInOrTo.No, + SeqExprOnly false, + false, + intoPat, + dataCompAfterOp, + contExpr, + intoPat.Range + ) + + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q ceenv.emptyVarSpace rebind id + + // select a.Name; ... + // distinct; ... + // + // Process the rest of the clauses + | None -> + if maintainsVarSpace || maintainsVarSpaceUsingBind then + ConsumeCustomOpClauses ceenv comp q varSpace dataCompAfterOp contExpr maintainsVarSpaceUsingBind mClause + else + ConsumeCustomOpClauses ceenv comp q ceenv.emptyVarSpace dataCompAfterOp contExpr false mClause + + // No more custom operator clauses in compClausesExpr, but there may be clauses like join, yield etc. + // Bind/iterate the dataCompPrior and use compClausesExpr as the body. + | _ -> + // Rebind using either for ... or let!.... + let rebind = + if lastUsesBind then + SynExpr.LetOrUseBang( + DebugPointAtBinding.NoneAtLet, + false, + false, + varSpacePat, + dataCompPrior, + [], + compClausesExpr, + compClausesExpr.Range, + SynExprLetOrUseBangTrivia.Zero + ) + else + SynExpr.ForEach( + DebugPointAtFor.No, + DebugPointAtInOrTo.No, + SeqExprOnly false, + false, + varSpacePat, + dataCompPrior, + compClausesExpr, + compClausesExpr.Range + ) + + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace rebind id + +and TranslateComputationExpressionNoQueryOps ceenv comp = + TranslateComputationExpression ceenv CompExprTranslationPass.Initial CustomOperationsMode.Denied ceenv.emptyVarSpace comp id + +and TranslateComputationExpressionBind + (ceenv: ComputationExpressionContext<'a>) + comp + q + varSpace + bindRange + addBindDebugPoint + bindName + (bindArgs: SynExpr list) + (consumePat: SynPat) + (innerComp: SynExpr) + translatedCtxt + = + + let innerRange = innerComp.Range + + let innerCompReturn = + if ceenv.cenv.g.langVersion.SupportsFeature LanguageFeature.AndBang then + convertSimpleReturnToExpr ceenv comp varSpace innerComp + else + None + + match innerCompReturn with + | Some(innerExpr, customOpInfo) when + (let bindName = bindName + "Return" + + not ( + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + ceenv.cenv + ceenv.env + bindRange + ceenv.ad + bindName + ceenv.builderTy + ) + )) + -> + + let bindName = bindName + "Return" + + // Build the `BindReturn` call + let dataCompPriorToOp = + let consumeExpr = + SynExpr.MatchLambda( + false, + consumePat.Range, + [ + SynMatchClause(consumePat, None, innerExpr, innerRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero) + ], + DebugPointAtBinding.NoneAtInvisible, + innerRange + ) + + translatedCtxt (mkSynCall bindName bindRange (bindArgs @ [ consumeExpr ]) ceenv.builderValName) + + match customOpInfo with + | None -> dataCompPriorToOp + | Some(innerComp, mClause) -> + // If the `BindReturn` was forced by a custom operation, continue to process the clauses of the CustomOp + ConsumeCustomOpClauses ceenv comp q varSpace dataCompPriorToOp innerComp false mClause + + | _ -> + + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + ceenv.cenv + ceenv.env + bindRange + ceenv.ad + bindName + ceenv.builderTy + ) + then + error (Error(FSComp.SR.tcRequireBuilderMethod (bindName), bindRange)) + + // Build the `Bind` call + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> + let consumeExpr = + SynExpr.MatchLambda( + false, + consumePat.Range, + [ + SynMatchClause(consumePat, None, holeFill, innerRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero) + ], + DebugPointAtBinding.NoneAtInvisible, + innerRange + ) + + let bindCall = + mkSynCall bindName bindRange (bindArgs @ [ consumeExpr ]) ceenv.builderValName + + translatedCtxt (bindCall |> addBindDebugPoint)) + +/// This function is for desugaring into .Bind{N}Return calls if possible +/// The outer option indicates if .BindReturn is possible. When it returns None, .BindReturn cannot be used +/// The inner option indicates if a custom operation is involved inside +and convertSimpleReturnToExpr (ceenv: ComputationExpressionContext<'a>) comp varSpace innerComp = + match innerComp with + | SynExpr.YieldOrReturn((false, _), returnExpr, m, _) -> + let returnExpr = SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, returnExpr) + Some(returnExpr, None) + + | SynExpr.Match(spMatch, expr, clauses, m, trivia) -> + let clauses = + clauses + |> List.map (fun (SynMatchClause(pat, cond, innerComp2, patm, sp, trivia)) -> + match convertSimpleReturnToExpr ceenv comp varSpace innerComp2 with + | None -> None // failure + | Some(_, Some _) -> None // custom op on branch = failure + | Some(innerExpr2, None) -> Some(SynMatchClause(pat, cond, innerExpr2, patm, sp, trivia))) + + if clauses |> List.forall Option.isSome then + Some(SynExpr.Match(spMatch, expr, (clauses |> List.map Option.get), m, trivia), None) + else + None + + | SynExpr.IfThenElse(guardExpr, thenComp, elseCompOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia) -> + match convertSimpleReturnToExpr ceenv comp varSpace thenComp with + | None -> None + | Some(_, Some _) -> None + | Some(thenExpr, None) -> + let elseExprOptOpt = + match elseCompOpt with + // When we are missing an 'else' part alltogether in case of 'if cond then return exp', we fallback from BindReturn into regular Bind+Return + | None -> None + | Some elseComp -> + match convertSimpleReturnToExpr ceenv comp varSpace elseComp with + | None -> None // failure + | Some(_, Some _) -> None // custom op on branch = failure + | Some(elseExpr, None) -> Some(Some elseExpr) + + match elseExprOptOpt with + | None -> None + | Some elseExprOpt -> + Some(SynExpr.IfThenElse(guardExpr, thenExpr, elseExprOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia), None) + + | SynExpr.LetOrUse(isRec, false, binds, innerComp, m, trivia) -> + match convertSimpleReturnToExpr ceenv comp varSpace innerComp with + | None -> None + | Some(_, Some _) -> None + | Some(innerExpr, None) -> Some(SynExpr.LetOrUse(isRec, false, binds, innerExpr, m, trivia), None) + + | OptionalSequential(CustomOperationClause ceenv (nm, _, _, mClause, _), _) when customOperationMaintainsVarSpaceUsingBind ceenv nm -> + + let patvs, _env = varSpace.Force comp.Range + let varSpaceExpr = mkExprForVarSpace mClause patvs + + Some(varSpaceExpr, Some(innerComp, mClause)) + + | SynExpr.Sequential(sp, true, innerComp1, innerComp2, m, trivia) -> + + // Check the first part isn't a computation expression construct + if (isSimpleExpr ceenv innerComp1) then + // Check the second part is a simple return + match convertSimpleReturnToExpr ceenv comp varSpace innerComp2 with + | None -> None + | Some(innerExpr2, optionalCont) -> Some(SynExpr.Sequential(sp, true, innerComp1, innerExpr2, m, trivia), optionalCont) + else + None + + | _ -> None + +/// Check if an expression has no computation expression constructs +and isSimpleExpr ceenv comp = + + match comp with + | ForEachThenJoinOrGroupJoinOrZipClause ceenv false _ -> false + | SynExpr.ForEach _ -> false + | SynExpr.For _ -> false + | SynExpr.While _ -> false + | SynExpr.WhileBang _ -> false + | SynExpr.TryFinally _ -> false + | SynExpr.ImplicitZero _ -> false + | OptionalSequential(JoinOrGroupJoinOrZipClause ceenv _, _) -> false + | OptionalSequential(CustomOperationClause ceenv _, _) -> false + | SynExpr.Sequential(expr1 = innerComp1; expr2 = innerComp2) -> isSimpleExpr ceenv innerComp1 && isSimpleExpr ceenv innerComp2 + | SynExpr.IfThenElse(thenExpr = thenComp; elseExpr = elseCompOpt) -> + isSimpleExpr ceenv thenComp + && (match elseCompOpt with + | None -> true + | Some c -> isSimpleExpr ceenv c) + | SynExpr.LetOrUse(body = innerComp) -> isSimpleExpr ceenv innerComp + | SynExpr.LetOrUseBang _ -> false + | SynExpr.Match(clauses = clauses) -> + clauses + |> List.forall (fun (SynMatchClause(resultExpr = innerComp)) -> isSimpleExpr ceenv innerComp) + | SynExpr.MatchBang _ -> false + | SynExpr.TryWith(tryExpr = innerComp; withCases = clauses) -> + isSimpleExpr ceenv innerComp + && clauses + |> List.forall (fun (SynMatchClause(resultExpr = clauseComp)) -> isSimpleExpr ceenv clauseComp) + | SynExpr.YieldOrReturnFrom _ -> false + | SynExpr.YieldOrReturn _ -> false + | SynExpr.DoBang _ -> false + | _ -> true + +and TranslateComputationExpression (ceenv: ComputationExpressionContext<'a>) firstTry q varSpace comp translatedCtxt = + + ceenv.cenv.stackGuard.Guard + <| fun () -> + match TryTranslateComputationExpression ceenv firstTry q varSpace comp translatedCtxt with + | Some e -> e + | None -> + // This only occurs in final position in a sequence + match comp with + // "do! expr;" in final position is treated as { let! () = expr in return () } when Return is provided (and no Zero with Default attribute is available) or as { let! () = expr in zero } otherwise + | SynExpr.DoBang(expr = rhsExpr; trivia = { DoBangKeyword = m }) -> + let mUnit = rhsExpr.Range + let rhsExpr = mkSourceExpr rhsExpr ceenv.sourceMethInfo ceenv.builderValName + + if ceenv.isQuery then + error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), m)) + + let bodyExpr = + if + isNil ( + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + ceenv.cenv + ceenv.env + m + ceenv.ad + "Return" + ceenv.builderTy + ) + then + SynExpr.ImplicitZero m + else + match + TryFindIntrinsicOrExtensionMethInfo + ResultCollectionSettings.AtMostOneResult + ceenv.cenv + ceenv.env + m + ceenv.ad + "Zero" + ceenv.builderTy + with + | minfo :: _ when MethInfoHasAttribute ceenv.cenv.g m ceenv.cenv.g.attrib_DefaultValueAttribute minfo -> + SynExpr.ImplicitZero m + | _ -> SynExpr.YieldOrReturn((false, true), SynExpr.Const(SynConst.Unit, m), m, SynExprYieldOrReturnTrivia.Zero) + + let letBangBind = + SynExpr.LetOrUseBang( + DebugPointAtBinding.NoneAtDo, + false, + false, + SynPat.Const(SynConst.Unit, mUnit), + rhsExpr, + [], + bodyExpr, + m, + SynExprLetOrUseBangTrivia.Zero + ) + + TranslateComputationExpression ceenv CompExprTranslationPass.Initial q varSpace letBangBind translatedCtxt + + // "expr;" in final position is treated as { expr; zero } + // Suppress the sequence point on the "zero" + | _ -> + // Check for 'where x > y' and other mis-applications of infix operators. If detected, give a good error message, and just ignore comp + if ceenv.isQuery && checkForBinaryApp ceenv comp then + TranslateComputationExpression + ceenv + CompExprTranslationPass.Initial + q + varSpace + (SynExpr.ImplicitZero comp.Range) + translatedCtxt + else + if ceenv.isQuery && not comp.IsArbExprAndThusAlreadyReportedError then + match comp with + | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential + | _ -> errorR (Error(FSComp.SR.tcUnrecognizedQueryOperator (), comp.RangeOfFirstPortion)) + + TranslateComputationExpression + ceenv + CompExprTranslationPass.Initial + q + varSpace + (SynExpr.ImplicitZero comp.Range) + (fun holeFill -> + let fillExpr = + if ceenv.enableImplicitYield then + let implicitYieldExpr = mkSynCall "Yield" comp.Range [ comp ] ceenv.builderValName + + SynExpr.SequentialOrImplicitYield( + DebugPointAtSequential.SuppressExpr, + comp, + holeFill, + implicitYieldExpr, + comp.Range + ) + else + SynExpr.Sequential( + DebugPointAtSequential.SuppressExpr, + true, + comp, + holeFill, + comp.Range, + SynExprSequentialTrivia.Zero + ) + + translatedCtxt fillExpr) + +/// Used for all computation expressions except sequence expressions +let TcComputationExpression (cenv: TcFileState) env (overallTy: OverallTy) tpenv (mWhole, interpExpr: Expr, builderTy, comp: SynExpr) = + let overallTy = overallTy.Commit + + let ad = env.eAccessRights + + let builderValName = CompilerGeneratedName "builder" + let mBuilderVal = interpExpr.Range + + // Give bespoke error messages for the FSharp.Core "query" builder + let isQuery = + match stripDebugPoints interpExpr with + // An unparameterized custom builder, e.g., `query`, `async`. + | Expr.Val(vref, _, m) + // A parameterized custom builder, e.g., `builder<…>`, `builder ()`. + | Expr.App(funcExpr = Expr.Val(vref, _, m)) when not vref.IsMember || vref.IsConstructor -> + let item = Item.CustomBuilder(vref.DisplayName, vref) + CallNameResolutionSink cenv.tcSink (m, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights) + valRefEq cenv.g vref cenv.g.query_value_vref + | _ -> false + + let sourceMethInfo = + TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad "Source" builderTy + + /// Decide if the builder is an auto-quote builder + let isAutoQuote = hasMethInfo "Quote" cenv env mBuilderVal ad builderTy + + let customOperationMethods = + getCustomOperationMethods cenv env ad mBuilderVal builderTy + + /// Decide if the identifier represents a use of a custom query operator + let hasCustomOperations = + match customOperationMethods with + | [] -> CustomOperationsMode.Denied + | _ -> CustomOperationsMode.Allowed + + let customOperationMethodsIndexedByKeyword = + if cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations then + customOperationMethods + |> Seq.groupBy (fun (nm, _, _, _, _, _, _, _, _) -> nm) + |> Seq.map (fun (nm, group) -> (nm, Seq.toList group)) + else + customOperationMethods + |> Seq.groupBy (fun (nm, _, _, _, _, _, _, _, _) -> nm) + |> Seq.map (fun (nm, group) -> (nm, Seq.toList group)) + |> dict + + // Check for duplicates by method name (keywords and method names must be 1:1) + let customOperationMethodsIndexedByMethodName = + if cenv.g.langVersion.SupportsFeature LanguageFeature.OverloadsForCustomOperations then + customOperationMethods + |> Seq.groupBy (fun (_, _, _, _, _, _, _, _, methInfo) -> methInfo.LogicalName) + |> Seq.map (fun (nm, group) -> (nm, Seq.toList group)) + else + customOperationMethods + |> Seq.groupBy (fun (_, _, _, _, _, _, _, _, methInfo) -> methInfo.LogicalName) + |> Seq.map (fun (nm, group) -> (nm, Seq.toList group)) + |> dict + + // If there are no 'yield' in the computation expression, and the builder supports 'Yield', + // then allow the type-directed rule interpreting non-unit-typed expressions in statement + // positions as 'yield'. 'yield!' may be present in the computation expression. + let enableImplicitYield = + cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield + && (hasMethInfo "Yield" cenv env mBuilderVal ad builderTy + && hasMethInfo "Combine" cenv env mBuilderVal ad builderTy + && hasMethInfo "Delay" cenv env mBuilderVal ad builderTy + && YieldFree cenv comp) + + let origComp = comp + + let ceenv = + { + cenv = cenv + env = env + tpenv = tpenv + customOperationMethodsIndexedByKeyword = customOperationMethodsIndexedByKeyword + customOperationMethodsIndexedByMethodName = customOperationMethodsIndexedByMethodName + sourceMethInfo = sourceMethInfo + builderValName = builderValName + ad = ad + builderTy = builderTy + isQuery = isQuery + enableImplicitYield = enableImplicitYield + origComp = origComp + mWhole = mWhole + emptyVarSpace = LazyWithContext.NotLazy([], env) + } + + /// Inside the 'query { ... }' use a modified name environment that contains fake 'CustomOperation' entries + /// for all custom operations. This adds them to the completion lists and prevents them being used as values inside + /// the query. + let env = + if List.isEmpty customOperationMethods then + env + else + { env with + eNameResEnv = + (env.eNameResEnv, customOperationMethods) + ||> Seq.fold (fun nenv (nm, _, _, _, _, _, _, _, methInfo) -> + AddFakeNameToNameEnv + nm + nenv + (Item.CustomOperation(nm, (fun () -> customOpUsageText ceenv (ident (nm, mBuilderVal))), Some methInfo))) + } + + // Environment is needed for completions + CallEnvSink cenv.tcSink (comp.Range, env.NameEnv, ad) + + let ceenv = { ceenv with env = env } + + let basicSynExpr = + TranslateComputationExpression ceenv CompExprTranslationPass.Initial hasCustomOperations (LazyWithContext.NotLazy([], env)) comp id + + let mDelayOrQuoteOrRun = + mBuilderVal + .NoteSourceConstruct(NotedSourceConstruct.DelayOrQuoteOrRun) + .MakeSynthetic() + + // Add a call to 'Delay' if the method is present + let delayedExpr = + match TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad "Delay" builderTy with + | [] -> basicSynExpr + | _ -> mkSynCall "Delay" mDelayOrQuoteOrRun [ (mkSynDelay2 basicSynExpr) ] builderValName + + // Add a call to 'Quote' if the method is present + let quotedSynExpr = + if isAutoQuote then + SynExpr.Quote(mkSynIdGet mDelayOrQuoteOrRun (CompileOpName "<@ @>"), false, delayedExpr, true, mWhole) + else + delayedExpr + + // Add a call to 'Run' if the method is present + let runExpr = + match TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mBuilderVal ad "Run" builderTy with + | [] -> quotedSynExpr + | _ -> mkSynCall "Run" mDelayOrQuoteOrRun [ quotedSynExpr ] builderValName + + let lambdaExpr = + SynExpr.Lambda( + false, + false, + SynSimplePats.SimplePats([ mkSynSimplePatVar false (mkSynId mBuilderVal builderValName) ], [], mBuilderVal), + runExpr, + None, + mBuilderVal, + SynExprLambdaTrivia.Zero + ) + + let env = + match comp with + | SynExpr.YieldOrReturn(flags = (true, _)) -> + { env with + eContextInfo = ContextInfo.YieldInComputationExpression + } + | SynExpr.YieldOrReturn(flags = (_, true)) -> + { env with + eContextInfo = ContextInfo.ReturnInComputationExpression + } + | _ -> env + + let lambdaExpr, tpenv = + TcExpr cenv (MustEqual(mkFunTy cenv.g builderTy overallTy)) env tpenv lambdaExpr + + // beta-var-reduce to bind the builder using a 'let' binding + let coreExpr = + mkApps cenv.g ((lambdaExpr, tyOfExpr cenv.g lambdaExpr), [], [ interpExpr ], mBuilderVal) + + coreExpr, tpenv diff --git a/src/fcs-fable/src/Compiler/Checking/CheckComputationExpressions.fsi b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckComputationExpressions.fsi similarity index 55% rename from src/fcs-fable/src/Compiler/Checking/CheckComputationExpressions.fsi rename to src/fcs-fable/src/Compiler/Checking/Expressions/CheckComputationExpressions.fsi index e9f24dfb15..ac9554252f 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckComputationExpressions.fsi +++ b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckComputationExpressions.fsi @@ -8,24 +8,6 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.TypedTree -val TcSequenceExpressionEntry: - cenv: TcFileState -> - env: TcEnv -> - overallTy: OverallTy -> - tpenv: UnscopedTyparEnv -> - hasBuilder: bool * comp: SynExpr -> - m: range -> - Expr * UnscopedTyparEnv - -val TcArrayOrListComputedExpression: - cenv: TcFileState -> - env: TcEnv -> - overallTy: OverallTy -> - tpenv: UnscopedTyparEnv -> - isArray: bool * comp: SynExpr -> - m: range -> - Expr * UnscopedTyparEnv - val TcComputationExpression: cenv: TcFileState -> env: TcEnv -> diff --git a/src/fcs-fable/src/Compiler/Checking/CheckExpressions.fs b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressions.fs similarity index 91% rename from src/fcs-fable/src/Compiler/Checking/CheckExpressions.fs rename to src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressions.fs index 69189a7313..0dec31f31b 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckExpressions.fs +++ b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -6,6 +6,7 @@ module internal FSharp.Compiler.CheckExpressions open System open System.Collections.Generic +open System.Text.RegularExpressions open Internal.Utilities.Collections open Internal.Utilities.Library @@ -17,6 +18,7 @@ open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.AttributeChecking open FSharp.Compiler.CheckBasics +open FSharp.Compiler.CheckExpressionsOps open FSharp.Compiler.CheckRecordSyntaxHelpers open FSharp.Compiler.ConstraintSolver open FSharp.Compiler.DiagnosticsLogger @@ -41,6 +43,7 @@ open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypeHierarchy open FSharp.Compiler.TypeRelations +open Import #if !NO_TYPEPROVIDERS open FSharp.Compiler.TypeProviders @@ -94,7 +97,7 @@ exception UnionPatternsBindDifferentNames of range exception VarBoundTwice of Ident -exception ValueRestriction of DisplayEnv * InfoReader * bool * Val * Typar * range +exception ValueRestriction of DisplayEnv * InfoReader * Val * Typar * range exception ValNotMutable of DisplayEnv * ValRef * range @@ -140,6 +143,47 @@ exception StandardOperatorRedefinitionWarning of string * range exception InvalidInternalsVisibleToAssemblyName of badName: string * fileName: string option +//---------------------------------------------------------------------------------------------- +// Helpers for determining if/what specifiers a string has. +// Used to decide if interpolated string can be lowered to a concat call. +// We don't care about single- vs multi-$ strings here, because lexer took care of that already. +//---------------------------------------------------------------------------------------------- +[] +let (|HasFormatSpecifier|_|) (s: string) = + if + Regex.IsMatch( + s, + // Regex pattern for something like: %[flags][width][.precision][type] + """ + (^|[^%]) # Start with beginning of string or any char other than '%' + (%%)*% # followed by an odd number of '%' chars + [+-0 ]{0,3} # optionally followed by flags + (\d+)? # optionally followed by width + (\.\d+)? # optionally followed by .precision + [bscdiuxXoBeEfFgGMOAat] # and then a char that determines specifier's type + """, + RegexOptions.Compiled ||| RegexOptions.IgnorePatternWhitespace) + then + ValueSome HasFormatSpecifier + else + ValueNone + +// Removes trailing "%s" unless it was escaped by another '%' (checks for odd sequence of '%' before final "%s") +let (|WithTrailingStringSpecifierRemoved|) (s: string) = + if s.EndsWith "%s" then +#if FABLE_COMPILER + let i = s[..(s.Length - 3)].TrimEnd('%').Length - 1 +#else + let i = s.AsSpan(0, s.Length - 2).LastIndexOfAnyExcept '%' +#endif + let diff = s.Length - 2 - i + if diff &&& 1 <> 0 then + s[..i] + else + s + else + s + /// Compute the available access rights from a particular location in code let ComputeAccessRights eAccessPath eInternalsVisibleCompPaths eFamilyType = AccessibleFrom (eAccessPath :: eInternalsVisibleCompPaths, eFamilyType) @@ -411,7 +455,7 @@ type CheckedBindingInfo = valAttribs: Attribs * xmlDoc: XmlDoc * tcPatPhase2: (TcPatPhase2Input -> Pattern) * - exlicitTyparInfo: ExplicitTyparInfo * + explicitTyparInfo: ExplicitTyparInfo * nameToPrelimValSchemeMap: NameMap * rhsExprChecked: Expr * argAndRetAttribs: ArgAndRetAttribs * @@ -428,13 +472,6 @@ type CheckedBindingInfo = type cenv = TcFileState -let CopyAndFixupTypars g m rigid tpsorig = - FreshenAndFixupTypars g m rigid [] [] tpsorig - -let UnifyTypes (cenv: cenv) (env: TcEnv) m expectedTy actualTy = - let g = cenv.g - AddCxTypeEqualsType env.eContextInfo env.DisplayEnv cenv.css m (tryNormalizeMeasureInType g expectedTy) (tryNormalizeMeasureInType g actualTy) - // If the overall type admits subsumption or type directed conversion, and the original unify would have failed, // then allow subsumption or type directed conversion. // @@ -446,7 +483,8 @@ let UnifyOverallType (cenv: cenv) (env: TcEnv) m overallTy actualTy = | MustConvertTo(isMethodArg, reqdTy) when g.langVersion.SupportsFeature LanguageFeature.AdditionalTypeDirectedConversions -> let actualTy = tryNormalizeMeasureInType g actualTy let reqdTy = tryNormalizeMeasureInType g reqdTy - if AddCxTypeEqualsTypeUndoIfFailed env.DisplayEnv cenv.css m reqdTy actualTy then + let reqTyForUnification = reqTyForArgumentNullnessInference g actualTy reqdTy + if AddCxTypeEqualsTypeUndoIfFailed env.DisplayEnv cenv.css m reqTyForUnification actualTy then () else // try adhoc type-directed conversions @@ -637,7 +675,7 @@ let UnifyFunctionTypeUndoIfFailed (cenv: cenv) denv m ty = | ValueNone -> let domainTy = NewInferenceType g let resultTy = NewInferenceType g - if AddCxTypeEqualsTypeUndoIfFailed denv cenv.css m ty (mkFunTy g domainTy resultTy) then + if AddCxTypeEqualsTypeUndoIfFailed denv cenv.css m ty (mkFunTy g domainTy resultTy) then ValueSome(domainTy, resultTy) else ValueNone @@ -699,7 +737,7 @@ let UnifyUnitType (cenv: cenv) (env: TcEnv) m ty expr = else let domainTy = NewInferenceType g let resultTy = NewInferenceType g - if AddCxTypeEqualsTypeUndoIfFailed denv cenv.css m ty (mkFunTy g domainTy resultTy) then + if AddCxTypeEqualsTypeUndoIfFailed denv cenv.css m ty (mkFunTy g domainTy resultTy) then warning (FunctionValueUnexpected(denv, ty, m)) else let reportImplicitlyDiscardError() = @@ -740,7 +778,7 @@ module AttributeTargets = let ForNewConstructors tcSink (env: TcEnv) mObjTy methodName meths = let origItem = Item.CtorGroup(methodName, meths) - let callSink (item, minst) = CallMethodGroupNameResolutionSink tcSink (mObjTy, env.NameEnv, item, origItem, minst, ItemOccurence.Use, env.AccessRights) + let callSink (item, minst) = CallMethodGroupNameResolutionSink tcSink (mObjTy, env.NameEnv, item, origItem, minst, ItemOccurrence.Use, env.AccessRights) let sendToSink minst refinedMeths = callSink (Item.CtorGroup(methodName, refinedMeths), minst) match meths with | [] -> @@ -767,7 +805,7 @@ let TcConst (cenv: cenv) (overallTy: TType) m env synConst = | SynMeasure.One _ -> Measure.One | SynMeasure.Named(tc, m) -> let ad = env.eAccessRights - let _, tcref = ForceRaise(ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Use OpenQualified env.eNameResEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No) + let _, tcref, _ = ForceRaise(ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurrence.Use OpenQualified env.eNameResEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No) match tcref.TypeOrMeasureKind with | TyparKind.Type -> error(Error(FSComp.SR.tcExpectedUnitOfMeasureNotType(), m)) | TyparKind.Measure -> Measure.Const tcref @@ -792,10 +830,10 @@ let TcConst (cenv: cenv) (overallTy: TType) m env synConst = let measureTy = match synConst with | SynConst.Measure(synMeasure = SynMeasure.Anon _) -> - (mkAppTy tcr [TType_measure (Measure.Var (NewAnonTypar (TyparKind.Measure, m, TyparRigidity.Anon, (if iszero then TyparStaticReq.None else TyparStaticReq.HeadType), TyparDynamicReq.No)))]) + (mkWoNullAppTy tcr [TType_measure (Measure.Var (NewAnonTypar (TyparKind.Measure, m, TyparRigidity.Anon, (if iszero then TyparStaticReq.None else TyparStaticReq.HeadType), TyparDynamicReq.No)))]) - | SynConst.Measure(synMeasure = ms) -> mkAppTy tcr [TType_measure (tcMeasure ms)] - | _ -> mkAppTy tcr [TType_measure Measure.One] + | SynConst.Measure(synMeasure = ms) -> mkWoNullAppTy tcr [TType_measure (tcMeasure ms)] + | _ -> mkWoNullAppTy tcr [TType_measure Measure.One] unif measureTy let expandedMeasurablesEnabled = @@ -815,7 +853,7 @@ let TcConst (cenv: cenv) (overallTy: TType) m env synConst = unif g.float_ty Const.Double f | SynConst.Decimal f -> - unif (mkAppTy g.decimal_tcr []) + unif (mkWoNullAppTy g.decimal_tcr []) Const.Decimal f | SynConst.SByte i -> unif g.sbyte_ty @@ -977,6 +1015,62 @@ let TranslatePartialValReprInfo tps (PrelimValReprInfo (argsData, retData)) = // Members //------------------------------------------------------------------------- + +[] +type TcCanFail = + | IgnoreMemberResoutionError + | IgnoreAllErrors + | ReportAllErrors + +[] +[] +type TcTrueMatchClause = + | Yes + | No + +let TcAddNullnessToType (warn: bool) (cenv: cenv) (env: TcEnv) nullness innerTyC m = + let g = cenv.g + if g.langFeatureNullness then + if TypeNullNever g innerTyC then + let tyString = NicePrint.minimalStringOfType env.DisplayEnv innerTyC + errorR(Error(FSComp.SR.tcTypeDoesNotHaveAnyNull(tyString), m)) + + match tryAddNullnessToTy nullness innerTyC with + + | None -> + let tyString = NicePrint.minimalStringOfType env.DisplayEnv innerTyC + errorR(Error(FSComp.SR.tcTypeDoesNotHaveAnyNull(tyString), m)) + innerTyC + + | Some innerTyCWithNull -> + // The inner type is not allowed to support null or use null as a representation value. + // For example "int option?" is not allowed, nor "string??". + // + // For variable types in FSharp.Core we make an exception because we must allow + // val toObj: value: 'T option -> 'T | null when 'T : not struct (* and 'T : not null *) + // without implying 'T is not null. This is because it is legitimate to use this + // function to "collapse" null and obj-null-coming-from-option using such a function. + + if not g.compilingFSharpCore || not (isTyparTy g innerTyC) then + AddCxTypeDefnNotSupportsNull env.DisplayEnv cenv.css m NoTrace innerTyC + AddCxTypeIsReferenceType env.DisplayEnv cenv.css m NoTrace innerTyC + + if not g.compilingFSharpCore && isTyparTy g innerTyC then + // A typar might be later inferred into a type not supporting `| null|, like tuple or anon. + // Repeat the check in post inference + AddCxTypeCanCarryNullnessInfo env.DisplayEnv cenv.css m innerTyC nullness + + innerTyCWithNull + + else + if warn then + warning(Error(FSComp.SR.tcNullnessCheckingNotEnabled(), m)) + innerTyC + +//------------------------------------------------------------------------- +// Members +//------------------------------------------------------------------------- + let ComputeLogicalName (id: Ident) (memberFlags: SynMemberFlags) = match memberFlags.MemberKind with | SynMemberKind.ClassConstructor -> ".cctor" @@ -1080,7 +1174,7 @@ let PublishModuleDefn (cenv: cenv) env mspec = if intoFslibCcu then mty else mty.AddEntity mspec) let item = Item.ModuleOrNamespaces([mkLocalModuleRef mspec]) - CallNameResolutionSink cenv.tcSink (mspec.Range, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights) + CallNameResolutionSink cenv.tcSink (mspec.Range, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights) let PublishTypeDefn (cenv: cenv) env mspec = UpdateAccModuleOrNamespaceType cenv env (fun _ mty -> @@ -1139,7 +1233,7 @@ let CombineVisibilityAttribs vis1 vis2 m = vis1 | _ -> vis2 -let ComputeAccessAndCompPath env (declKindOpt: DeclKind option) m vis overrideVis actualParent = +let ComputeAccessAndCompPath (g:TcGlobals) env (declKindOpt: DeclKind option) m vis overrideVis actualParent = let accessPath = env.eAccessPath let accessModPermitted = match declKindOpt with @@ -1150,12 +1244,13 @@ let ComputeAccessAndCompPath env (declKindOpt: DeclKind option) m vis overrideVi errorR(Error(FSComp.SR.tcMultipleVisibilityAttributesWithLet(), m)) let vis = - match overrideVis, vis with - | Some v, _ -> v - | _, None -> taccessPublic (* a module or member binding defaults to "public" *) - | _, Some (SynAccess.Public _) -> taccessPublic - | _, Some (SynAccess.Private _) -> taccessPrivate accessPath - | _, Some (SynAccess.Internal _) -> taccessInternal + match declKindOpt, overrideVis, vis with + | _, Some v, _ -> v + | Some (DeclKind.ClassLetBinding _), _, None when g.realsig -> taccessPrivate accessPath // a type binding defaults to "private" + | _, _, None -> taccessPublic // a module or member binding defaults to "public" + | _, _, Some (SynAccess.Public _) -> taccessPublic + | _, _, Some (SynAccess.Private _) -> taccessPrivate accessPath + | _, _, Some (SynAccess.Internal _) -> taccessInternal let vis = match actualParent with @@ -1198,7 +1293,7 @@ let CheckForAbnormalOperatorNames (cenv: cenv) (idRange: range) coreDisplayName let CheckInitProperties (g: TcGlobals) (minfo: MethInfo) methodName mItem = if g.langVersion.SupportsFeature(LanguageFeature.InitPropertiesSupport) then - // Check, wheter this method has external init, emit an error diagnostic in this case. + // Check, whether this method has external init, emit an error diagnostic in this case. if minfo.HasExternalInit then errorR (Error (FSComp.SR.tcSetterForInitOnlyPropertyCannotBeCalled1 methodName, mItem)) @@ -1235,7 +1330,7 @@ let CheckRequiredProperties (g:TcGlobals) (env: TcEnv) (cenv: TcFileState) (minf let details = NicePrint.multiLineStringOfPropInfos g cenv.amap mMethExpr env.DisplayEnv missingProps errorR(Error(FSComp.SR.tcMissingRequiredMembers details, mMethExpr)) -let private HasMethodImplNoInliningAttribute g attrs = +let private HasMethodImplNoInliningAttribute g attrs = match TryFindFSharpAttribute g g.attrib_MethodImplAttribute attrs with // NO_INLINING = 8 | Some (Attrib(_, _, [ AttribInt32Arg flags ], _, _, _, _)) -> (flags &&& 0x8) <> 0x0 @@ -1281,18 +1376,18 @@ let MakeAndPublishVal (cenv: cenv) env (altActualParent, inSig, declKind, valRec Parent(memberInfo.ApparentEnclosingEntity), vis | _ -> altActualParent, None - let vis, _ = ComputeAccessAndCompPath env (Some declKind) id.idRange vis overrideVis actualParent + let vis, _ = ComputeAccessAndCompPath g env (Some declKind) id.idRange vis overrideVis actualParent + + let inlineFlag = + if HasFSharpAttributeOpt g g.attrib_DllImportAttribute attrs then + if inlineFlag = ValInline.Always then + errorR(Error(FSComp.SR.tcDllImportStubsCannotBeInlined(), m)) + ValInline.Never + else + if HasMethodImplNoInliningAttribute g attrs + then ValInline.Never + else inlineFlag - let inlineFlag = - if HasFSharpAttributeOpt g g.attrib_DllImportAttribute attrs then - if inlineFlag = ValInline.Always then - errorR(Error(FSComp.SR.tcDllImportStubsCannotBeInlined(), m)) - ValInline.Never - else - if HasMethodImplNoInliningAttribute g attrs - then ValInline.Never - else inlineFlag - // CompiledName not allowed on virtual/abstract/override members let compiledNameAttrib = TryFindFSharpStringAttribute g g.attrib_CompiledNameAttribute attrs @@ -1372,7 +1467,7 @@ let MakeAndPublishVal (cenv: cenv) env (altActualParent, inSig, declKind, valRec let nenv = AddFakeNamedValRefToNameEnv vspec.DisplayName env.NameEnv (mkLocalValRef vspec) CallEnvSink cenv.tcSink (vspec.Range, nenv, env.eAccessRights) let item = Item.Value(mkLocalValRef vspec) - CallNameResolutionSink cenv.tcSink (vspec.Range, nenv, item, emptyTyparInst, ItemOccurence.Binding, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (vspec.Range, nenv, item, emptyTyparInst, ItemOccurrence.Binding, env.eAccessRights) | _ -> () vspec @@ -1610,9 +1705,9 @@ let CombineSyntacticAndInferredValReprInfo g rhsExpr prelimScheme = | _ when memberInfoOpt.IsSome -> partialValReprInfoOpt // Don't use any expression information for 'let' bindings where return attributes are present - | _ when retAttribs.Length > 0 -> + | _ when retAttribs.Length > 0 -> partialValReprInfoOpt - | Some partialValReprInfoFromSyntax -> + | Some partialValReprInfoFromSyntax -> let (PrelimValReprInfo(curriedArgInfosFromSyntax, retInfoFromSyntax)) = partialValReprInfoFromSyntax let partialArityInfo = if isMutable then @@ -1689,20 +1784,20 @@ let MakeAndPublishSimpleValsForMergedScope (cenv: cenv) env m (names: NameMap<_> else let nameResolutions = ResizeArray() - let notifyNameResolution (pos, item, itemGroup, itemTyparInst, occurence, nenv, ad, m: range, replacing) = + let notifyNameResolution (pos, item, itemGroup, itemTyparInst, occurrence, nenv, ad, m: range, replacing) = if not m.IsSynthetic then - nameResolutions.Add(pos, item, itemGroup, itemTyparInst, occurence, nenv, ad, m, replacing) + nameResolutions.Add(pos, item, itemGroup, itemTyparInst, occurrence, nenv, ad, m, replacing) let values, vspecMap = let sink = { new ITypecheckResultsSink with member _.NotifyEnvWithScope(_, _, _) = () // ignore EnvWithScope reports - member _.NotifyNameResolution(pos, item, itemTyparInst, occurence, nenv, ad, m, replacing) = - notifyNameResolution (pos, item, item, itemTyparInst, occurence, nenv, ad, m, replacing) + member _.NotifyNameResolution(pos, item, itemTyparInst, occurrence, nenv, ad, m, replacing) = + notifyNameResolution (pos, item, item, itemTyparInst, occurrence, nenv, ad, m, replacing) - member _.NotifyMethodGroupNameResolution(pos, item, itemGroup, itemTyparInst, occurence, nenv, ad, m, replacing) = - notifyNameResolution (pos, item, itemGroup, itemTyparInst, occurence, nenv, ad, m, replacing) + member _.NotifyMethodGroupNameResolution(pos, item, itemGroup, itemTyparInst, occurrence, nenv, ad, m, replacing) = + notifyNameResolution (pos, item, itemGroup, itemTyparInst, occurrence, nenv, ad, m, replacing) member _.NotifyExprHasType(_, _, _, _) = assert false // no expr typings in MakeAndPublishSimpleVals @@ -1730,8 +1825,8 @@ let MakeAndPublishSimpleValsForMergedScope (cenv: cenv) env m (names: NameMap<_> // send notification about mergedNameEnv CallEnvSink cenv.tcSink (mergedRange, mergedNameEnv, ad) // call CallNameResolutionSink for all captured name resolutions using mergedNameEnv - for _, item, itemGroup, itemTyparInst, occurence, _nenv, ad, m, _replacing in nameResolutions do - CallMethodGroupNameResolutionSink cenv.tcSink (m, mergedNameEnv, item, itemGroup, itemTyparInst, occurence, ad) + for _, item, itemGroup, itemTyparInst, occurrence, _nenv, ad, m, _replacing in nameResolutions do + CallMethodGroupNameResolutionSink cenv.tcSink (m, mergedNameEnv, item, itemGroup, itemTyparInst, occurrence, ad) values, vspecMap @@ -1743,7 +1838,7 @@ let MakeAndPublishSimpleValsForMergedScope (cenv: cenv) env m (names: NameMap<_> // to C<_> occurs then generate C for a fresh type inference variable ?ty. //------------------------------------------------------------------------- -let FreshenTyconRef (g: TcGlobals) m rigid (tcref: TyconRef) declaredTyconTypars = +let FreshenTyconRef (g: TcGlobals) m rigid (tcref: TyconRef) declaredTyconTypars = let origTypars = declaredTyconTypars let clearStaticReq = g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers let freshTypars = copyTypars clearStaticReq origTypars @@ -1756,7 +1851,7 @@ let FreshenTyconRef (g: TcGlobals) m rigid (tcref: TyconRef) declaredTyconTypars let freshTy = TType_app(tcref, tinst, g.knownWithoutNull) origTy, freshTypars, renaming, freshTy -let FreshenPossibleForallTy g m rigid ty = +let FreshenPossibleForallTy g m rigid ty = let origTypars, tau = tryDestForallTy g ty if isNil origTypars then [], [], [], tau @@ -1766,7 +1861,7 @@ let FreshenPossibleForallTy g m rigid ty = let tps, renaming, tinst = CopyAndFixupTypars g m rigid origTypars origTypars, tps, tinst, instType renaming tau -let FreshenTyconRef2 (g: TcGlobals) m (tcref: TyconRef) = +let FreshenTyconRef2 (g: TcGlobals) m (tcref: TyconRef) = let tps, renaming, tinst = FreshenTypeInst g m (tcref.Typars m) tps, renaming, tinst, TType_app (tcref, tinst, g.knownWithoutNull) @@ -1802,9 +1897,9 @@ let FreshenAbstractSlot g amap m synTyparDecls absMethInfo = typarsFromAbsSlotAreRigid, typarsFromAbsSlot, argTysFromAbsSlot, retTyFromAbsSlot let CheckRecdExprDuplicateFields (elems: Ident list) = - elems |> List.iteri (fun i (uc1: Ident) -> - elems |> List.iteri (fun j (uc2: Ident) -> - if j > i && uc1.idText = uc2.idText then + elems |> List.iteri (fun i (uc1: Ident) -> + elems |> List.iteri (fun j (uc2: Ident) -> + if j > i && uc1.idText = uc2.idText then errorR (Error(FSComp.SR.tcMultipleFieldsInRecord(uc1.idText), uc1.idRange)))) //------------------------------------------------------------------------- @@ -1869,7 +1964,7 @@ let BuildFieldMap (cenv: cenv) env isPartial ty (flds: ((Ident list * Ident) * ' // Record the precise resolution of the field for intellisense let item = Item.RecdField(rfinfo2) - CallNameResolutionSink cenv.tcSink (ident.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, ad) + CallNameResolutionSink cenv.tcSink (ident.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ad) let fref2 = rfinfo2.RecdFieldRef @@ -1895,7 +1990,7 @@ let BuildFieldMap (cenv: cenv) env isPartial ty (flds: ((Ident list * Ident) * ' | _ -> error(Error(FSComp.SR.tcRecordFieldInconsistentTypes(), m))) Some(tinst, tcref, fldsmap, List.rev rfldsList) -let rec ApplyUnionCaseOrExn (makerForUnionCase, makerForExnTag) m (cenv: cenv) env overallTy item = +let ApplyUnionCaseOrExn (makerForUnionCase, makerForExnTag) m (cenv: cenv) env overallTy item = let g = cenv.g let ad = env.eAccessRights match item with @@ -2049,12 +2144,12 @@ module GeneralizationHelpers = /// Recursively knock out typars we can't generalize. /// For non-generalized type variables be careful to iteratively knock out /// both the typars and any typars free in the constraints of the typars - /// into the set that are considered free in the environment. - let rec TrimUngeneralizableTypars genConstrainedTyparFlag inlineFlag (generalizedTypars: Typar list) freeInEnv = - // Do not generalize type variables with a static requirement unless function is marked 'inline' - let generalizedTypars, ungeneralizableTypars1 = + /// into the set that are considered free in the environment. + let rec TrimUngeneralizableTypars genConstrainedTyparFlag inlineFlag (generalizedTypars: Typar list) freeInEnv = + // Do not generalize type variables with a static requirement unless function is marked 'inline' + let generalizedTypars, ungeneralizableTypars1 = if inlineFlag = ValInline.Always then generalizedTypars, [] - else generalizedTypars |> List.partition (fun tp -> tp.StaticReq = TyparStaticReq.None) + else generalizedTypars |> List.partition (fun tp -> tp.StaticReq = TyparStaticReq.None) // Do not generalize type variables which would escape their scope // because they are free in the environment @@ -2062,7 +2157,7 @@ module GeneralizationHelpers = List.partition (fun x -> not (Zset.contains x freeInEnv)) generalizedTypars // Some situations, e.g. implicit class constructions that represent functions as fields, - // do not allow generalisation over constrained typars. (since they can not be represented as fields) + // do not allow generalisation over constrained typars. (since they cannot be represented as fields) // // Don't generalize IsCompatFlex type parameters to avoid changing inferred types. let generalizedTypars, ungeneralizableTypars3 = @@ -2101,7 +2196,7 @@ module GeneralizationHelpers = match tp.Constraints |> List.partition (function TyparConstraint.CoercesTo _ -> true | _ -> false) with | [TyparConstraint.CoercesTo(tgtTy, _)], others -> // Throw away null constraints if they are implied - if others |> List.exists (function TyparConstraint.SupportsNull _ -> not (TypeSatisfiesNullConstraint g m tgtTy) | _ -> true) + if others |> List.exists (function TyparConstraint.SupportsNull _ -> not (TypeNullIsExtraValue g m tgtTy) | _ -> true) then None else Some tgtTy | _ -> None @@ -2197,7 +2292,7 @@ module GeneralizationHelpers = // to C<_> occurs then generate C for a fresh type inference variable ?ty. //------------------------------------------------------------------------- - let CheckDeclaredTyparsPermitted (memFlagsOpt: SynMemberFlags option, declaredTypars, m) = + let CheckDeclaredTyparsPermitted (memFlagsOpt: SynMemberFlags option, declaredTypars: Typars, m) = match memFlagsOpt with | None -> () | Some memberFlags -> @@ -2207,7 +2302,13 @@ module GeneralizationHelpers = | SynMemberKind.PropertySet | SynMemberKind.PropertyGetSet -> if not (isNil declaredTypars) then - errorR(Error(FSComp.SR.tcPropertyRequiresExplicitTypeParameters(), m)) + let declaredTyparsRange = + declaredTypars + |> List.map(fun typar -> typar.Range) + + let m = declaredTyparsRange |> List.fold (fun r a -> unionRanges r a) range.Zero + + errorR(Error(FSComp.SR.tcPropertyRequiresExplicitTypeParameters(), m)) | SynMemberKind.Constructor -> if not (isNil declaredTypars) then errorR(Error(FSComp.SR.tcConstructorCannotHaveTypeParameters(), m)) @@ -2240,7 +2341,7 @@ module GeneralizationHelpers = //------------------------------------------------------------------------- let ComputeInlineFlag (memFlagsOption: SynMemberFlags option) isInline isMutable g attrs m = - let hasNoCompilerInliningAttribute () = HasFSharpAttribute g g.attrib_NoCompilerInliningAttribute attrs + let hasNoCompilerInliningAttribute () = HasFSharpAttribute g g.attrib_NoCompilerInliningAttribute attrs let isCtorOrAbstractSlot () = match memFlagsOption with @@ -2257,7 +2358,7 @@ let ComputeInlineFlag (memFlagsOption: SynMemberFlags option) isInline isMutable if isMutable || isCtorOrAbstractSlot() || hasNoCompilerInliningAttribute() || isExtern () then ValInline.Never, errorR elif HasMethodImplNoInliningAttribute g attrs then - ValInline.Never, + ValInline.Never, if g.langVersion.SupportsFeature LanguageFeature.WarningWhenInliningMethodImplNoInlineMarkedFunction then warning else ignore @@ -2266,7 +2367,7 @@ let ComputeInlineFlag (memFlagsOption: SynMemberFlags option) isInline isMutable else ValInline.Optional, ignore - if isInline && (inlineFlag <> ValInline.Always) then + if isInline && (inlineFlag <> ValInline.Always) then reportIncorrectInlineKeywordUsage (Error(FSComp.SR.tcThisValueMayNotBeInlined(), m)) inlineFlag @@ -2327,7 +2428,7 @@ type NormalizedBinding = | NormalizedBinding of visibility: SynAccess option * kind: SynBindingKind * - mustInline: bool * + shouldInline: bool * isMutable: bool * attribs: SynAttribute list * xmlDoc: XmlDoc * @@ -2343,9 +2444,9 @@ type IsObjExprBinding = | ValOrMemberBinding module BindingNormalization = - /// Push a bunch of pats at once. They may contain patterns, e.g. let f (A x) (B y) = ... - /// In this case the semantics is let f a b = let A x = a in let B y = b - let private PushMultiplePatternsToRhs (cenv: cenv) isMember pats (NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr)) = + /// Push a bunch of pats at once. They may contain patterns, e.g. let f (A x) (B y) = ... + /// In this case the semantics is let f a b = let A x = a in let B y = b + let private PushMultiplePatternsToRhs (cenv: cenv) isMember pats (NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr)) = let spatsL2, rhsExpr = PushCurriedPatternsToExpr cenv.synArgNameGenerator rhsExpr.Range isMember pats None rhsExpr NormalizedBindingRhs(spatsL2@spatsL, rtyOpt, rhsExpr) @@ -2425,8 +2526,12 @@ module BindingNormalization = match memberFlagsOpt with | None -> let extraDot = if synLongId.ThereIsAnExtraDotAtTheEnd then ExtraDotAfterIdentifier.Yes else ExtraDotAfterIdentifier.No - - match ResolvePatternLongIdent cenv.tcSink nameResolver AllIdsOK true m ad env.NameEnv TypeNameResolutionInfo.Default longId extraDot with + let warnOnUpper = + if not args.IsEmpty then + WarnOnUpperUnionCaseLabel + else AllIdsOK + + match ResolvePatternLongIdent cenv.tcSink nameResolver warnOnUpper true m ad env.NameEnv TypeNameResolutionInfo.Default longId extraDot with | Item.NewDef id -> if id.idText = opNameCons then NormalizedBindingPat(pat, rhsExpr, valSynData, typars) @@ -2575,13 +2680,8 @@ module EventDeclarationNormalization = let FreshenObjectArgType (cenv: cenv) m rigid tcref isExtrinsic declaredTyconTypars = let g = cenv.g -#if EXTENDED_EXTENSION_MEMBERS // indicates if extension members can add additional constraints to type parameters - let tcrefObjTy, enclosingDeclaredTypars, renaming, objTy = - FreshenTyconRef g m (if isExtrinsic then TyparRigidity.Flexible else rigid) tcref declaredTyconTypars -#else let tcrefObjTy, enclosingDeclaredTypars, renaming, objTy = FreshenTyconRef g m rigid tcref declaredTyconTypars -#endif // Struct members have a byref 'this' type (unless they are extrinsic extension members) let thisTy = @@ -2744,10 +2844,7 @@ let TcVal checkAttributes (cenv: cenv) env (tpenv: UnscopedTyparEnv) (vref: ValR let exprForVal = Expr.Val (vref, vrefFlags, m) let exprForVal = mkTyAppExpr m (exprForVal, vTy) tinst let isSpecial = - (match vrefFlags with NormalValUse | PossibleConstrainedCall _ -> false | _ -> true) || - valRefEq g vref g.splice_expr_vref || - valRefEq g vref g.splice_raw_expr_vref - + (match vrefFlags with NormalValUse | PossibleConstrainedCall _ -> false | _ -> true) || g.isSpliceOperator vref let exprForVal = RecordUseOfRecValue cenv valRecInfo vref exprForVal m tpsorig, exprForVal, isSpecial, tau, tinst, tpenv @@ -2757,34 +2854,6 @@ let TcVal checkAttributes (cenv: cenv) env (tpenv: UnscopedTyparEnv) (vref: ValR | Some AfterResolution.DoNothing | None -> () res -/// simplified version of TcVal used in calls to BuildMethodCall (typrelns.fs) -/// this function is used on typechecking step for making calls to provided methods and on optimization step (for the same purpose). -let LightweightTcValForUsingInBuildMethodCall g (vref: ValRef) vrefFlags (vrefTypeInst: TTypes) m = - let v = vref.Deref - let vTy = vref.Type - // byref-typed values get dereferenced - if isByrefTy g vTy then - mkAddrGet m vref, destByrefTy g vTy - else - match v.LiteralValue with - | Some literalConst -> - let _, _, _, tau = FreshenPossibleForallTy g m TyparRigidity.Flexible vTy - Expr.Const (literalConst, m, tau), tau - - | None -> - // Instantiate the value - let tau = - // If we have got an explicit instantiation then use that - let _, tps, tpTys, tau = FreshenPossibleForallTy g m TyparRigidity.Flexible vTy - - if tpTys.Length <> vrefTypeInst.Length then error(Error(FSComp.SR.tcTypeParameterArityMismatch(tps.Length, vrefTypeInst.Length), m)) - - instType (mkTyparInst tps vrefTypeInst) tau - - let exprForVal = Expr.Val (vref, vrefFlags, m) - let exprForVal = mkTyAppExpr m (exprForVal, vTy) vrefTypeInst - exprForVal, tau - /// Mark points where we decide whether an expression will support automatic /// decondensation or not. type ApplicableExpr = @@ -2919,11 +2988,20 @@ let TcRuntimeTypeTest isCast isOperator (cenv: cenv) denv m tgtTy srcTy = else error(Error(FSComp.SR.tcTypeTestErased(NicePrint.minimalStringOfType denv tgtTy, NicePrint.minimalStringOfType denv (stripTyEqnsWrtErasure EraseAll g tgtTy)), m)) else - for ety in getErasedTypes g tgtTy do + let checkTrgtNullness = + match (srcTy,g),(tgtTy,g) with + | (NullableRefType|NullTrueValue|NullableTypar), WithoutNullRefType when g.checkNullness && isCast -> + let srcNice = NicePrint.minimalStringOfTypeWithNullness denv srcTy + let tgtNice = NicePrint.minimalStringOfTypeWithNullness denv tgtTy + warning(Error(FSComp.SR.tcDowncastFromNullableToWithoutNull(srcNice,tgtNice,tgtNice), m)) + false + | (NullableRefType|NullTrueValue|NullableTypar), (NullableRefType|NullTrueValue|NullableTypar) -> not isCast //a type test (unlike type cast) will never return true for null in the source, therefore adding |null to target does not help => keep the erasure warning + | _ -> true + for ety in getErasedTypes g tgtTy checkTrgtNullness do if isMeasureTy g ety then warning(Error(FSComp.SR.tcTypeTestLosesMeasures(NicePrint.minimalStringOfType denv ety), m)) else - warning(Error(FSComp.SR.tcTypeTestLossy(NicePrint.minimalStringOfType denv ety, NicePrint.minimalStringOfType denv (stripTyEqnsWrtErasure EraseAll g ety)), m)) + warning(Error(FSComp.SR.tcTypeTestLossy(NicePrint.minimalStringOfTypeWithNullness denv ety, NicePrint.minimalStringOfType denv (stripTyEqnsWrtErasure EraseAll g ety)), m)) /// Checks, warnings and constraint assertions for upcasts let TcStaticUpcast (cenv: cenv) denv m tgtTy srcTy = @@ -3025,7 +3103,7 @@ let BuildDisposableCleanup (cenv: cenv) env m (v: Val) = else let disposeObjVar, disposeObjExpr = mkCompGenLocal m "objectToDispose" g.system_IDisposable_ty let disposeExpr, _ = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates m false disposeMethod NormalValUse [] [disposeObjExpr] [] None - let inputExpr = mkCoerceExpr(exprForVal v.Range v, g.obj_ty, m, v.Type) + let inputExpr = mkCoerceExpr(exprForVal v.Range v, g.obj_ty_ambivalent, m, v.Type) mkIsInstConditional g m g.system_IDisposable_ty inputExpr disposeObjVar disposeExpr (mkUnit g m) /// Build call to get_OffsetToStringData as part of 'fixed' @@ -3115,15 +3193,17 @@ let BuildRecdFieldSet g m objExpr (rfinfo: RecdFieldInfo) argExpr = // Helpers dealing with named and optional args at callsites //------------------------------------------------------------------------- +[] let (|BinOpExpr|_|) expr = match expr with - | SynExpr.App (_, _, SynExpr.App (_, _, SingleIdent opId, a, _), b, _) -> Some (opId, a, b) - | _ -> None + | SynExpr.App (_, _, SynExpr.App (_, _, SingleIdent opId, a, _), b, _) -> ValueSome (opId, a, b) + | _ -> ValueNone +[] let (|SimpleEqualsExpr|_|) expr = match expr with - | BinOpExpr(opId, a, b) when opId.idText = opNameEquals -> Some (a, b) - | _ -> None + | BinOpExpr(opId, a, b) when opId.idText = opNameEquals -> ValueSome (a, b) + | _ -> ValueNone /// Detect a named argument at a callsite let TryGetNamedArg expr = @@ -3162,30 +3242,6 @@ let GetMethodArgs arg = unnamedCallerArgs, namedCallerArgs - -//------------------------------------------------------------------------- -// Helpers dealing with pattern match compilation -//------------------------------------------------------------------------- - -let CompilePatternForMatch (cenv: cenv) (env: TcEnv) mExpr mMatch warnOnUnused actionOnFailure (inputVal, generalizedTypars, inputExprOpt) clauses inputTy resultTy = - let g = cenv.g - let dtree, targets = CompilePattern g env.DisplayEnv cenv.amap (LightweightTcValForUsingInBuildMethodCall g) cenv.infoReader mExpr mMatch warnOnUnused actionOnFailure (inputVal, generalizedTypars, inputExprOpt) clauses inputTy resultTy - mkAndSimplifyMatch DebugPointAtBinding.NoneAtInvisible mExpr mMatch resultTy dtree targets - -/// Compile a pattern -let CompilePatternForMatchClauses (cenv: cenv) env mExpr mMatch warnOnUnused actionOnFailure inputExprOpt inputTy resultTy tclauses = - // Avoid creating a dummy in the common cases where we are about to bind a name for the expression - // CLEANUP: avoid code duplication with code further below, i.e.all callers should call CompilePatternForMatch - match tclauses with - | [MatchClause(TPat_as (pat1, PatternValBinding (asVal, GeneralizedType(generalizedTypars, _)), _), None, TTarget(vs, targetExpr, _), m2)] -> - let vs2 = ListSet.remove valEq asVal vs - let expr = CompilePatternForMatch cenv env mExpr mMatch warnOnUnused actionOnFailure (asVal, generalizedTypars, None) [MatchClause(pat1, None, TTarget(vs2, targetExpr, None), m2)] inputTy resultTy - asVal, expr - | _ -> - let matchValueTmp, _ = mkCompGenLocal mExpr "matchValue" inputTy - let expr = CompilePatternForMatch cenv env mExpr mMatch warnOnUnused actionOnFailure (matchValueTmp, [], inputExprOpt) tclauses inputTy resultTy - matchValueTmp, expr - //------------------------------------------------------------------------- // Helpers dealing with sequence expressions //------------------------------------------------------------------------- @@ -3251,7 +3307,7 @@ let AnalyzeArbitraryExprAsEnumerable (cenv: cenv) (env: TcEnv) localAlloc m expr let enumElemTy = - if isObjTy g enumElemTy then + if isObjTyAnyNullness g enumElemTy then // Look for an 'Item' property, or a set of these with consistent return types let allEquivReturnTypes (minfo: MethInfo) (others: MethInfo list) = let returnTy = minfo.GetFSharpReturnType(cenv.amap, m, []) @@ -3263,7 +3319,7 @@ let AnalyzeArbitraryExprAsEnumerable (cenv: cenv) (env: TcEnv) localAlloc m expr // e.g. MatchCollection typeEquiv g g.int32_ty ty || // e.g. EnvDTE.Documents.Item - typeEquiv g g.obj_ty ty + typeEquiv g g.obj_ty_ambivalent ty | _ -> false match TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AllResults cenv env m ad "get_Item" tyToSearchForGetEnumeratorAndItem with @@ -3341,7 +3397,7 @@ let AnalyzeArbitraryExprAsEnumerable (cenv: cenv) (env: TcEnv) localAlloc m expr match probe exprTyAsSeq with | Some res -> res | None -> - let ienumerable = mkAppTy g.tcref_System_Collections_IEnumerable [] + let ienumerable = mkWoNullAppTy g.tcref_System_Collections_IEnumerable [] match probe ienumerable with | Some res -> res | None -> @@ -3443,9 +3499,9 @@ let EliminateInitializationGraphs | Expr.TyLambda (_, _, b, _, _) -> CheckExpr st b | Expr.Obj (_, ty, _, e, overrides, extraImpls, _) -> - // NOTE: we can't fixup recursive references inside delegates since the closure delegee of a delegate is not accessible - // from outside. Object expressions implementing interfaces can, on the other hand, be fixed up. See FSharp 1.0 bug 1469 - if isInterfaceTy g ty then + // NOTE: we can't fixup recursive references inside delegates since the closure delegee of a delegate is not accessible + // from outside. Object expressions implementing interfaces can, on the other hand, be fixed up. See FSharp 1.0 bug 1469 + if isInterfaceTy g ty then List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> checkDelayed st e) overrides List.iter (snd >> List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> checkDelayed st e)) extraImpls else @@ -3487,7 +3543,7 @@ let EliminateInitializationGraphs | Expr.Quote _ -> () | Expr.WitnessArg (_witnessInfo, _m) -> () - and CheckBinding st (TBind(_, e, _)) = CheckExpr st e + and CheckBinding st (TBind(_, e, _)) = CheckExpr st e and CheckDecisionTree st dt = match dt with @@ -3563,7 +3619,7 @@ let EliminateInitializationGraphs let vTy = mkLazyTy g ty let fty = mkFunTy g g.unit_ty ty - let flazy, felazy = mkCompGenLocal m v.LogicalName fty + let flazy, felazy = mkCompGenLocal m v.LogicalName fty let frhs = mkUnitDelayLambda g m e if mustHaveValReprInfo then @@ -3648,7 +3704,7 @@ let CheckAndRewriteObjectCtor g env (ctorLambdaExpr: Expr) = // = "let pat = expr in " | Expr.Let (bind, body, m, _) -> mkLetBind m bind (checkAndRewrite body) - // The constructor is a sequence "let pat = expr in " + // The constructor is a sequence "let pat = expr in " | Expr.Match (debugPoint, a, b, targets, c, d) -> let targets = targets |> Array.map (fun (TTarget(vs, body, flags)) -> TTarget(vs, checkAndRewrite body, flags)) Expr.Match (debugPoint, a, b, targets, c, d) @@ -3791,22 +3847,22 @@ let buildApp (cenv: cenv) expr resultTy arg m = type DelayedItem = /// Represents the in "item" - | DelayedTypeApp of - typeArgs: SynType list * - mTypeArgs: range * + | DelayedTypeApp of + typeArgs: SynType list * + mTypeArgs: range * mExprAndTypeArgs: range /// Represents the args in "item args", or "item.Property(args)". - | DelayedApp of - isAtomic: ExprAtomicFlag * - isSugar: bool * - synLeftExprOpt: SynExpr option * - argExpr: SynExpr * + | DelayedApp of + isAtomic: ExprAtomicFlag * + isSugar: bool * + synLeftExprOpt: SynExpr option * + argExpr: SynExpr * mFuncAndArg: range /// Represents the long identifiers in "item.Ident1", or "item.Ident1.Ident2" etc. - | DelayedDotLookup of - idents: Ident list * + | DelayedDotLookup of + idents: Ident list * range /// Represents an incomplete "item." @@ -3816,7 +3872,7 @@ type DelayedItem = | DelayedSet of SynExpr * range module DelayedItem = - let maybeAppliedArgForPreferExtensionOverProperty delayed = + let maybeAppliedArgForPreferExtensionOverProperty delayed = match delayed with | [] -> None | DelayedItem.DelayedApp(argExpr=argExpr) :: _ -> Some argExpr @@ -3993,7 +4049,7 @@ let rec TcTyparConstraint ridx (cenv: cenv) newOk checkConstraints occ (env: TcE tpenv | SynTypeConstraint.WhereTyparSubtypeOfType(tp, ty, m) -> - let tyR, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurence.UseInType WarnOnIWSAM.No env tpenv ty + let tyR, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.No env tpenv ty let tpR, tpenv = TcTypar cenv env newOk tpenv tp if newOk = NoNewTypars && isSealedTy g tyR then errorR(Error(FSComp.SR.tcInvalidConstraintTypeSealed(), m)) @@ -4003,6 +4059,13 @@ let rec TcTyparConstraint ridx (cenv: cenv) newOk checkConstraints occ (env: TcE | SynTypeConstraint.WhereTyparSupportsNull(tp, m) -> TcSimpleTyparConstraint cenv env newOk tpenv tp m AddCxTypeUseSupportsNull + | SynTypeConstraint.WhereTyparNotSupportsNull(tp, m, _) -> + if g.langFeatureNullness then + TcSimpleTyparConstraint cenv env newOk tpenv tp m AddCxTypeDefnNotSupportsNull + else + warning(Error(FSComp.SR.tcNullnessCheckingNotEnabled(), m)) + tpenv + | SynTypeConstraint.WhereTyparIsComparable(tp, m) -> TcSimpleTyparConstraint cenv env newOk tpenv tp m AddCxTypeMustSupportComparison @@ -4029,7 +4092,7 @@ let rec TcTyparConstraint ridx (cenv: cenv) newOk checkConstraints occ (env: TcE | SynTypeConstraint.WhereSelfConstrained(ty, m) -> checkLanguageFeatureAndRecover g.langVersion LanguageFeature.SelfTypeConstraints m - let tyR, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurence.UseInType WarnOnIWSAM.No env tpenv ty + let tyR, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.No env tpenv ty match tyR with | TType_app(tcref, tinst, _) when (tcref.IsTypeAbbrev && (isTyparTy g tcref.TypeAbbrev.Value) && tinst |> List.forall (isTyparTy g)) -> match checkConstraints with @@ -4052,7 +4115,7 @@ and TcConstraintWhereTyparIsEnum cenv env newOk checkConstraints tpenv tp synUnd let tpenv = match synUnderlingTys with | [synUnderlyingTy] -> - let underlyingTy, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synUnderlyingTy + let underlyingTy, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synUnderlyingTy AddCxTypeIsEnum env.DisplayEnv cenv.css m NoTrace (mkTyparTy tpR) underlyingTy tpenv | _ -> @@ -4076,7 +4139,8 @@ and TcConstraintWhereTyparSupportsMember cenv env newOk tpenv synSupportTys synM let g = cenv.g let traitInfo, tpenv = TcPseudoMemberSpec cenv newOk env synSupportTys tpenv synMemberSig m match traitInfo with - | TTrait(objTys, ".ctor", memberFlags, argTys, returnTy, _) when memberFlags.MemberKind = SynMemberKind.Constructor -> + | TTrait(tys=objTys; memberName=".ctor"; memberFlags=memberFlags; objAndArgTys=argTys; returnTyOpt=returnTy) + when memberFlags.MemberKind = SynMemberKind.Constructor -> match objTys, argTys with | [ty], [] when typeEquiv g ty (GetFSharpViewOfReturnType g returnTy) -> AddCxTypeMustSupportDefaultCtor env.DisplayEnv cenv.css m NoTrace ty @@ -4096,7 +4160,7 @@ and TcSimpleTyparConstraint cenv env newOk tpenv tp m constraintAdder = and TcPseudoMemberSpec cenv newOk env synTypes tpenv synMemberSig m = let g = cenv.g - let tys, tpenv = List.mapFold (TcTypeAndRecover cenv newOk CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env) tpenv synTypes + let tys, tpenv = List.mapFold (TcTypeAndRecover cenv newOk CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env) tpenv synTypes match synMemberSig with | SynMemberSig.Member (synValSig, memberFlags, m, _) -> @@ -4105,6 +4169,20 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv synMemberSig m = let members, tpenv = TcValSpec cenv env ModuleOrMemberBinding newOk ExprContainerInfo (Some memberFlags) (Some (List.head tys)) tpenv synValSig [] match members with | [ValSpecResult(_, _, id, _, _, memberConstraintTy, prelimValReprInfo, _)] -> + + match synValSig with + | SynValSig(accessibility = access) -> + match access with + | SynValSigAccess.Single(Some access) + | SynValSigAccess.GetSet(Some access, _, _) + | SynValSigAccess.GetSet(_, Some access, _) + | SynValSigAccess.GetSet(_, _, Some access) -> + if g.langVersion.SupportsFeature(LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters) then + errorR(Error(FSComp.SR.tcAccessModifiersNotAllowedInSRTPConstraint(), access.Range)) + else + warning(Error(FSComp.SR.tcAccessModifiersNotAllowedInSRTPConstraint(), access.Range)) + | _ -> () + let memberConstraintTypars, _ = tryDestForallTy g memberConstraintTy let valReprInfo = TranslatePartialValReprInfo memberConstraintTypars prelimValReprInfo let _, _, curriedArgInfos, returnTy, _ = GetValReprTypeInCompiledForm g valReprInfo 0 memberConstraintTy m @@ -4123,9 +4201,9 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv synMemberSig m = warning(Error(FSComp.SR.tcTraitMayNotUseComplexThings(), m)) let item = Item.OtherName (Some id, memberConstraintTy, None, None, id.idRange) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.AccessRights) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.AccessRights) - TTrait(tys, logicalCompiledName, memberFlags, argTys, returnTy, ref None), tpenv + TTrait(tys, logicalCompiledName, memberFlags, argTys, returnTy, ref None, ref None), tpenv | _ -> error(Error(FSComp.SR.tcInvalidConstraint(), m)) @@ -4155,7 +4233,7 @@ and TcValSpec (cenv: cenv) env declKind newOk containerInfo memFlagsOpt thisTyOp let allDeclaredTypars = enclosingDeclaredTypars @ declaredTypars let envinner = AddDeclaredTypars NoCheckForDuplicateTypars allDeclaredTypars env let checkConstraints = CheckCxs - let tpenv = TcTyparConstraints cenv newOk checkConstraints ItemOccurence.UseInType envinner tpenv synTyparConstraints + let tpenv = TcTyparConstraints cenv newOk checkConstraints ItemOccurrence.UseInType envinner tpenv synTyparConstraints // Treat constraints at the "end" of the type as if they are declared. // This is by far the most convenient place to locate the constraints. @@ -4164,7 +4242,7 @@ and TcValSpec (cenv: cenv) env declKind newOk containerInfo memFlagsOpt thisTyOp let tpenv = match ty with | SynType.WithGlobalConstraints(_, synConstraints, _) -> - TcTyparConstraints cenv newOk checkConstraints ItemOccurence.UseInType envinner tpenv synConstraints + TcTyparConstraints cenv newOk checkConstraints ItemOccurrence.UseInType envinner tpenv synConstraints | _ -> tpenv @@ -4172,7 +4250,7 @@ and TcValSpec (cenv: cenv) env declKind newOk containerInfo memFlagsOpt thisTyOp allDeclaredTypars |> List.iter (SetTyparRigid env.DisplayEnv m) // Process the type, including any constraints - let declaredTy, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurence.UseInType WarnOnIWSAM.Yes envinner tpenv ty + let declaredTy, tpenv = TcTypeAndRecover cenv newOk checkConstraints ItemOccurrence.UseInType WarnOnIWSAM.Yes envinner tpenv ty match memFlagsOpt, thisTyOpt with | Some memberFlags, Some thisTy -> @@ -4192,12 +4270,12 @@ and TcValSpec (cenv: cenv) env declKind newOk containerInfo memFlagsOpt thisTyOp if arginfos.Length > 1 then error(Error(FSComp.SR.tcInvalidPropertyType(), m)) match memberFlags.MemberKind with | SynMemberKind.PropertyGet -> - if SynInfo.HasNoArgs valSynInfo then + if SynInfo.HasNoArgs valSynInfo then let getterTy = mkFunTy g g.unit_ty declaredTy getterTy, (SynInfo.IncorporateEmptyTupledArgForPropertyGetter valSynInfo) else declaredTy, valSynInfo - | _ -> + | _ -> let setterArgTys = List.map fst (List.concat arginfos) @ [returnTy] let setterArgTy = mkRefTupledTy g setterArgTys let setterTy = mkFunTy g setterArgTy cenv.g.unit_ty @@ -4291,7 +4369,7 @@ and TcTypeOrMeasureParameter kindOpt cenv (env: TcEnv) newOk tpenv (SynTypar(id, | Some TyparKind.Type, TyparKind.Measure -> error (Error(FSComp.SR.tcExpectedTypeParameter(), id.idRange)); res, tpenv | _, _ -> let item = Item.TypeVar(id.idText, res) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.UseInType, env.AccessRights) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.UseInType, env.AccessRights) res, tpenv let key = id.idText @@ -4326,7 +4404,7 @@ and TcTypeOrMeasureParameter kindOpt cenv (env: TcEnv) newOk tpenv (SynTypar(id, let tpR = Construct.NewTypar (kind, TyparRigidity.WarnIfNotRigid, tp, false, TyparDynamicReq.Yes, [], false, false) let item = Item.TypeVar(id.idText, tpR) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.UseInType, env.AccessRights) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.UseInType, env.AccessRights) tpR, AddUnscopedTypar key tpR tpenv @@ -4353,7 +4431,7 @@ and TcTyparDecl (cenv: cenv) env synTyparDecl = () let item = Item.TypeVar(id.idText, tp) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.UseInType, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.UseInType, env.eAccessRights) tp @@ -4371,14 +4449,14 @@ and TcTypeOrMeasure kindOpt (cenv: cenv) newOk checkConstraints occ (iwsam: Warn match synTy with | SynType.LongIdent(SynLongIdent([], _, _)) -> // special case when type name is absent - i.e. empty inherit part in type declaration - g.obj_ty, tpenv + g.obj_ty_ambivalent, tpenv | SynType.LongIdent synLongId -> TcLongIdentType kindOpt cenv newOk checkConstraints occ iwsam env tpenv synLongId | MultiDimensionArrayType (rank, elemTy, m) -> TcArrayType cenv newOk checkConstraints occ env tpenv rank elemTy m - + | SynType.App (StripParenTypes (SynType.LongIdent longId), _, args, _, _, postfix, m) -> TcLongIdentAppType kindOpt cenv newOk checkConstraints occ iwsam env tpenv longId postfix args m @@ -4419,21 +4497,28 @@ and TcTypeOrMeasure kindOpt (cenv: cenv) newOk checkConstraints occ (iwsam: Warn | SynType.StaticConstant (synConst, m) -> TcTypeStaticConstant kindOpt tpenv synConst m + | SynType.StaticConstantNull m | SynType.StaticConstantNamed (_, _, m) | SynType.StaticConstantExpr (_, m) -> errorR(Error(FSComp.SR.parsInvalidLiteralInType(), m)) NewErrorType (), tpenv + | SynType.WithNull(innerTy, ambivalent, m, _) -> + let innerTyC, tpenv = TcTypeAndRecover cenv newOk checkConstraints occ WarnOnIWSAM.Yes env tpenv innerTy + let nullness = if ambivalent then KnownAmbivalentToNull else KnownWithNull + let tyWithNull = TcAddNullnessToType false cenv env nullness innerTyC m + tyWithNull, tpenv + | SynType.MeasurePower(ty, exponent, m) -> TcTypeMeasurePower kindOpt cenv newOk checkConstraints occ env tpenv ty exponent m | SynType.App(arg1, _, args, _, _, postfix, m) -> - TcTypeMeasureApp kindOpt cenv newOk checkConstraints occ env tpenv arg1 args postfix m + TcTypeMeasureApp kindOpt cenv newOk checkConstraints occ env tpenv arg1 args postfix m | SynType.Paren(innerType, _) | SynType.SignatureParameter(usedType = innerType) -> TcTypeOrMeasure kindOpt cenv newOk checkConstraints occ iwsam env tpenv innerType - + | SynType.Or(range = m) -> // The inner types are expected to be collected by (|TypesForTypar|) at this point. error(Error((FSComp.SR.tcSynTypeOrInvalidInDeclaration()), m)) @@ -4457,7 +4542,7 @@ and TcLongIdentType kindOpt (cenv: cenv) newOk checkConstraints occ iwsam env tp let m = synLongId.Range let ad = env.eAccessRights - let tinstEnclosing, tcref = ForceRaise(ResolveTypeLongIdent cenv.tcSink cenv.nameResolver occ OpenQualified env.NameEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No) + let tinstEnclosing, tcref, inst = ForceRaise(ResolveTypeLongIdent cenv.tcSink cenv.nameResolver occ OpenQualified env.NameEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No) CheckIWSAM cenv env checkConstraints iwsam m tcref @@ -4471,7 +4556,7 @@ and TcLongIdentType kindOpt (cenv: cenv) newOk checkConstraints occ iwsam env tp | _, TyparKind.Measure -> TType_measure (Measure.Const tcref), tpenv | _, TyparKind.Type -> - TcTypeApp cenv newOk checkConstraints occ env tpenv m tcref tinstEnclosing [] + TcTypeApp cenv newOk checkConstraints occ env tpenv m tcref tinstEnclosing [] inst /// Some.Long.TypeName /// ty1 SomeLongTypeName @@ -4479,9 +4564,9 @@ and TcLongIdentAppType kindOpt (cenv: cenv) newOk checkConstraints occ iwsam env let (SynLongIdent(tc, _, _)) = longId let ad = env.eAccessRights - let tinstEnclosing, tcref = + let tinstEnclosing, tcref, inst = let tyResInfo = TypeNameResolutionStaticArgsInfo.FromTyArgs args.Length - ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.UseInType OpenQualified env.eNameResEnv ad tc tyResInfo PermitDirectReferenceToGeneratedType.No + ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurrence.UseInType OpenQualified env.eNameResEnv ad tc tyResInfo PermitDirectReferenceToGeneratedType.No |> ForceRaise CheckIWSAM cenv env checkConstraints iwsam m tcref @@ -4498,7 +4583,7 @@ and TcLongIdentAppType kindOpt (cenv: cenv) newOk checkConstraints occ iwsam env | _, TyparKind.Type -> if postfix && tcref.Typars m |> List.exists (fun tp -> match tp.Kind with TyparKind.Measure -> true | _ -> false) then error(Error(FSComp.SR.tcInvalidUnitsOfMeasurePrefix(), m)) - TcTypeApp cenv newOk checkConstraints occ env tpenv m tcref tinstEnclosing args + TcTypeApp cenv newOk checkConstraints occ env tpenv m tcref tinstEnclosing args inst | _, TyparKind.Measure -> match args, postfix with @@ -4517,8 +4602,8 @@ and TcNestedAppType (cenv: cenv) newOk checkConstraints occ iwsam env tpenv synL let leftTy, tpenv = TcType cenv newOk checkConstraints occ iwsam env tpenv synLeftTy match leftTy with | AppTy g (tcref, tinst) -> - let tcref = ResolveTypeLongIdentInTyconRef cenv.tcSink cenv.nameResolver env.eNameResEnv (TypeNameResolutionInfo.ResolveToTypeRefs (TypeNameResolutionStaticArgsInfo.FromTyArgs args.Length)) ad m tcref longId - TcTypeApp cenv newOk checkConstraints occ env tpenv m tcref tinst args + let tcref, inst = ResolveTypeLongIdentInTyconRef cenv.tcSink cenv.nameResolver env.eNameResEnv (TypeNameResolutionInfo.ResolveToTypeRefs (TypeNameResolutionStaticArgsInfo.FromTyArgs args.Length)) ad m tcref longId + TcTypeApp cenv newOk checkConstraints occ env tpenv m tcref tinst args inst | _ -> error(Error(FSComp.SR.tcTypeHasNoNestedTypes(), m)) @@ -4533,18 +4618,18 @@ and TcTupleType kindOpt (cenv: cenv) newOk checkConstraints occ env tpenv isStru | Some TyparKind.Measure -> true | None -> args |> List.exists(function | SynTupleTypeSegment.Slash _ -> true | _ -> false) | Some _ -> false - + if isMeasure then let ms,tpenv = TcMeasuresAsTuple cenv newOk checkConstraints occ env tpenv args m TType_measure ms,tpenv else let argsR,tpenv = TcTypesAsTuple cenv newOk checkConstraints occ env tpenv args m TType_tuple(tupInfo, argsR), tpenv - + and CheckAnonRecdTypeDuplicateFields (elems: Ident array) = - elems |> Array.iteri (fun i (uc1: Ident) -> - elems |> Array.iteri (fun j (uc2: Ident) -> - if j > i && uc1.idText = uc2.idText then + elems |> Array.iteri (fun i (uc1: Ident) -> + elems |> Array.iteri (fun j (uc2: Ident) -> + if j > i && uc1.idText = uc2.idText then errorR(Error(FSComp.SR.tcAnonRecdTypeDuplicateFieldId(uc1.idText), uc1.idRange)))) and TcAnonRecdType (cenv: cenv) newOk checkConstraints occ env tpenv isStruct args m = @@ -4561,7 +4646,7 @@ and TcAnonRecdType (cenv: cenv) newOk checkConstraints occ env tpenv isStruct ar sortedFieldTys |> List.iteri (fun i (x,_) -> let item = Item.AnonRecdField(anonInfo, sortedCheckedArgTys, i, x.idRange) - CallNameResolutionSink cenv.tcSink (x.idRange,env.NameEnv,item,emptyTyparInst,ItemOccurence.UseInType,env.eAccessRights)) + CallNameResolutionSink cenv.tcSink (x.idRange,env.NameEnv,item,emptyTyparInst,ItemOccurrence.UseInType,env.eAccessRights)) TType_anon(anonInfo, sortedCheckedArgTys),tpenv @@ -4575,7 +4660,7 @@ and TcFunctionType (cenv: cenv) newOk checkConstraints occ env tpenv domainTy re and TcArrayType (cenv: cenv) newOk checkConstraints occ env tpenv rank elemTy m = let g = cenv.g let elemTy, tpenv = TcTypeAndRecover cenv newOk checkConstraints occ WarnOnIWSAM.Yes env tpenv elemTy - let tyR = mkArrayTy g rank elemTy m + let tyR = mkArrayTy g rank g.knownWithoutNull elemTy m tyR, tpenv and TcTypeParameter kindOpt (cenv: cenv) env newOk tpenv tp = @@ -4600,8 +4685,9 @@ and TcTypeWithConstraints (cenv: cenv) env newOk checkConstraints occ tpenv synT and TcTypeHashConstraint (cenv: cenv) env newOk checkConstraints occ tpenv synTy m = let tp = TcAnonTypeOrMeasure (Some TyparKind.Type) cenv TyparRigidity.WarnIfNotRigid TyparDynamicReq.Yes newOk m let ty, tpenv = TcTypeAndRecover cenv newOk checkConstraints occ WarnOnIWSAM.No env tpenv synTy - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace ty (mkTyparTy tp) - tp.AsType, tpenv + let tpTy = mkTyparTy tp + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace ty tpTy + tpTy, tpenv // (x: 't & #I1 & #I2) // (x: #I1 & #I2) @@ -4624,7 +4710,8 @@ and TcIntersectionConstraint (cenv: cenv) env newOk checkConstraints occ tpenv s | _ -> tpenv ) tpenv - tp.AsType, tpenv + let tpTy = tp.AsType KnownAmbivalentToNull // TODO: NULLNESS + tpTy, tpenv and TcTypeStaticConstant kindOpt tpenv c m = match c, kindOpt with @@ -4704,9 +4791,9 @@ and TcTypesAsTuple (cenv: cenv) newOk checkConstraints occ env tpenv (args: SynT let hasASlash = args |> List.exists(function | SynTupleTypeSegment.Slash _ -> true | _ -> false) - + if hasASlash then errorR(Error(FSComp.SR.tcUnexpectedSlashInType(), m)) - + let args : SynType list = getTypeFromTuplePath args match args with | [] -> error(InternalError("empty tuple type", m)) @@ -4758,7 +4845,7 @@ and TcStaticConstantParameter (cenv: cenv) (env: TcEnv) tpenv kind (StripParenTy match idOpt with | Some id -> let item = Item.OtherName (Some id, ttype, None, Some container, id.idRange) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.AccessRights) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.AccessRights) | _ -> () match v with @@ -4778,7 +4865,7 @@ and TcStaticConstantParameter (cenv: cenv) (env: TcEnv) tpenv kind (StripParenTy | SynConst.Double n when typeEquiv g g.float_ty kind -> record(g.float_ty); box (n: double) | SynConst.Char n when typeEquiv g g.char_ty kind -> record(g.char_ty); box (n: char) | SynConst.String (s, _, _) - | SynConst.SourceIdentifier (_, s, _) when (not (isNull s)) && typeEquiv g g.string_ty kind -> record(g.string_ty); box (s: string) + | SynConst.SourceIdentifier (_, s, _) when typeEquiv g g.string_ty kind -> record(g.string_ty); box (s: string) | SynConst.Bool b when typeEquiv g g.bool_ty kind -> record(g.bool_ty); box (b: bool) | _ -> fail() v, tpenv @@ -4807,7 +4894,6 @@ and TcStaticConstantParameter (cenv: cenv) (env: TcEnv) tpenv kind (StripParenTy | Const.Single n -> record(g.float32_ty); box (n: single) | Const.Double n -> record(g.float_ty); box (n: double) | Const.Char n -> record(g.char_ty); box (n: char) - | Const.String null -> fail() | Const.String s -> record(g.string_ty); box (s: string) | Const.Bool b -> record(g.bool_ty); box (b: bool) | _ -> fail() @@ -4864,8 +4950,8 @@ and CrackStaticConstantArgs (cenv: cenv) env tpenv (staticParameters: Tainted if sp.PUntaint((fun sp -> sp.IsOptional), m) then match sp.PUntaint((fun sp -> sp.RawDefaultValue), m) with - | Null -> error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, containerName, containerName, spName), m)) - | NonNull v -> v + | null -> error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, containerName, containerName, spName), m)) + | v -> v else error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, containerName, containerName, spName), m)) | ps -> @@ -4931,7 +5017,7 @@ and TcProvidedTypeApp (cenv: cenv) env tpenv tcref args m = // We put the type name check after the 'isDirectReferenceToGenerated' check because we need the 'isDirectReferenceToGenerated' error to be shown for generated types checkTypeName() if hasNoArgs then - mkAppTy tcref [], tpenv + mkWoNullAppTy tcref [], tpenv else let ty = Import.ImportProvidedType cenv.amap m providedTypeAfterStaticArguments ty, tpenv @@ -4942,7 +5028,7 @@ and TcProvidedTypeApp (cenv: cenv) env tpenv tcref args m = /// Note that the generic type may be a nested generic type List.ListEnumerator. /// In this case, 'argsR is only the instantiation of the suffix type arguments, and pathTypeArgs gives /// the prefix of type arguments. -and TcTypeApp (cenv: cenv) newOk checkConstraints occ env tpenv m tcref pathTypeArgs (synArgTys: SynType list) = +and TcTypeApp (cenv: cenv) newOk checkConstraints occ env tpenv m tcref pathTypeArgs (synArgTys: SynType list) (tinst: TypeInst) = let g = cenv.g CheckTyconAccessible cenv.amap m env.AccessRights tcref |> ignore CheckEntityAttributes g tcref m |> CommitOperationResult @@ -4953,16 +5039,22 @@ and TcTypeApp (cenv: cenv) newOk checkConstraints occ env tpenv m tcref pathType if tcref.Deref.IsProvided then TcProvidedTypeApp cenv env tpenv tcref synArgTys m else #endif - let tps, _, tinst, _ = FreshenTyconRef2 g m tcref - - // If we're not checking constraints, i.e. when we first assert the super/interfaces of a type definition, then just - // clear the constraint lists of the freshly generated type variables. A little ugly but fairly localized. - if checkConstraints = NoCheckCxs then tps |> List.iter (fun tp -> tp.SetConstraints []) let synArgTysLength = synArgTys.Length let pathTypeArgsLength = pathTypeArgs.Length if tinst.Length <> pathTypeArgsLength + synArgTysLength then error (TyconBadArgs(env.DisplayEnv, tcref, pathTypeArgsLength + synArgTysLength, m)) + let tps = tinst |> List.skip pathTypeArgsLength |> List.map (fun t -> + match t with + | TType_var(typar, _) + | TType_measure(Measure.Var typar) -> typar + | t -> failwith $"TcTypeApp: {t}" + ) + + // If we're not checking constraints, i.e. when we first assert the super/interfaces of a type definition, then just + // clear the constraint lists of the freshly generated type variables. A little ugly but fairly localized. + if checkConstraints = NoCheckCxs then tps |> List.iter (fun tp -> tp.SetConstraints []) + let argTys, tpenv = // Get the suffix of typars let tpsForArgs = List.skip (tps.Length - synArgTysLength) tps @@ -4976,7 +5068,7 @@ and TcTypeApp (cenv: cenv) newOk checkConstraints occ env tpenv m tcref pathType List.iter2 (UnifyTypes cenv env m) tinst actualArgTys // Try to decode System.Tuple --> F# tuple types etc. - let ty = g.decompileType tcref actualArgTys + let ty = g.decompileType tcref actualArgTys g.knownWithoutNull ty, tpenv @@ -4991,7 +5083,7 @@ and TcTypeOrMeasureAndRecover kindOpt (cenv: cenv) newOk checkConstraints occ iw match kindOpt, newOk with | Some TyparKind.Measure, NoNewTypars -> TType_measure Measure.One | Some TyparKind.Measure, _ -> TType_measure (NewErrorMeasure ()) - | _, NoNewTypars -> g.obj_ty + | _, NoNewTypars -> g.obj_ty_ambivalent | _ -> NewErrorType () recoveryTy, tpenv @@ -5008,9 +5100,9 @@ and TcNestedTypeApplication (cenv: cenv) newOk checkConstraints occ iwsam env tp error(Error(FSComp.SR.tcTypeHasNoNestedTypes(), mWholeTypeApp)) match ty with - | TType_app(tcref, _, _) -> + | TType_app(tcref, inst, _) -> CheckIWSAM cenv env checkConstraints iwsam mWholeTypeApp tcref - TcTypeApp cenv newOk checkConstraints occ env tpenv mWholeTypeApp tcref pathTypeArgs tyargs + TcTypeApp cenv newOk checkConstraints occ env tpenv mWholeTypeApp tcref pathTypeArgs tyargs inst | _ -> error(InternalError("TcNestedTypeApplication: expected type application", mWholeTypeApp)) @@ -5063,12 +5155,16 @@ and ConvSynPatToSynExpr synPat = /// Check a long identifier 'Case' or 'Case argsR' that has been resolved to an active pattern case and TcPatLongIdentActivePatternCase warnOnUpper (cenv: cenv) (env: TcEnv) vFlags patEnv ty (mLongId, item, apref, args, m) = let g = cenv.g - let (TcPatLinearEnv(tpenv, names, takenNames)) = patEnv let (APElemRef (apinfo, vref, idx, isStructRetTy)) = apref + let cenv = + match g.checkNullness,TryFindLocalizedFSharpStringAttribute g g.attrib_WarnOnWithoutNullArgumentAttribute vref.Attribs with + | true, (Some _ as warnMsg) -> {cenv with css.WarnWhenUsingWithoutNullOnAWithNullTarget = warnMsg} + | _ -> cenv + // Report information about the 'active recognizer' occurrence to IDE - CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurence.Pattern, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (mLongId, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Pattern, env.eAccessRights) // TOTAL/PARTIAL ACTIVE PATTERNS let _, vExpr, _, _, tinst, _ = TcVal true cenv env tpenv vref None None m @@ -5076,18 +5172,106 @@ and TcPatLongIdentActivePatternCase warnOnUpper (cenv: cenv) (env: TcEnv) vFlags let vExprTy = vExpr.Type let activePatArgsAsSynPats, patArg = - match args with - | [] -> [], SynPat.Const(SynConst.Unit, m) - | _ -> - // This bit of type-directed analysis ensures that parameterized partial active patterns returning unit do not need to take an argument - let dtys, retTy = stripFunTy g vExprTy - - if dtys.Length = args.Length + 1 && - ((isOptionTy g retTy && isUnitTy g (destOptionTy g retTy)) || - (isValueOptionTy g retTy && isUnitTy g (destValueOptionTy g retTy))) then + // only cases which return unit or unresolved type (in AP definition) compatible with unit can omit output arg + let canOmit retTy = + let couldResolveToUnit ty = + tryDestTyparTy g ty + |> ValueOption.exists (fun typar -> + not typar.IsSolved + && typar.Constraints |> List.forall (fun c -> + let (|Unit|_|) ty = if isUnitTy g ty then Some Unit else None + + match c with + // These apply or could apply to unit. + | TyparConstraint.IsReferenceType _ + | TyparConstraint.SupportsComparison _ + | TyparConstraint.SupportsEquality _ + | TyparConstraint.DefaultsTo (ty = Unit) + | TyparConstraint.AllowsRefStruct _ + | TyparConstraint.MayResolveMember _ -> true + + // Any other kind of constraint is incompatible with unit. + | TyparConstraint.CoercesTo _ + | TyparConstraint.DefaultsTo _ + | TyparConstraint.IsDelegate _ + | TyparConstraint.IsEnum _ + | TyparConstraint.IsNonNullableStruct _ + | TyparConstraint.NotSupportsNull _ + | TyparConstraint.IsUnmanaged _ + | TyparConstraint.RequiresDefaultConstructor _ + | TyparConstraint.SimpleChoice _ + | TyparConstraint.NotSupportsNull _ + | TyparConstraint.SupportsNull _ -> false)) + + let caseRetTy = + if isOptionTy g retTy then destOptionTy g retTy + elif isValueOptionTy g retTy then destValueOptionTy g retTy + elif isChoiceTy g retTy then destChoiceTy g retTy idx + else retTy + + isUnitTy g caseRetTy || couldResolveToUnit caseRetTy + + // This bit of type-directed analysis ensures that parameterized partial active patterns returning unit do not need to take an argument + let dtys, retTy = stripFunTy g vExprTy + let paramCount = if dtys.Length = 0 then 0 else dtys.Length - 1 + + let showErrMsg returnCount = + let fmtExprArgs paramCount = + let rec loop i (sb: Text.StringBuilder) = + let cutoff = 10 + if i > paramCount then sb.ToString() + elif i > cutoff then sb.Append("...").ToString() + else loop (i + 1) (sb.Append(" e").Append i) + + loop 1 (Text.StringBuilder()) + + let caseName = apinfo.ActiveTags[idx] + let msg = + match paramCount, returnCount with + | 0, 0 -> FSComp.SR.tcActivePatternArgsCountNotMatchNoArgsNoPat(caseName, caseName) + | 0, _ -> FSComp.SR.tcActivePatternArgsCountNotMatchOnlyPat(caseName) + | _, 0 -> FSComp.SR.tcActivePatternArgsCountNotMatchArgs(paramCount, caseName, fmtExprArgs paramCount) + | _, _ -> FSComp.SR.tcActivePatternArgsCountNotMatchArgsAndPat(paramCount, caseName, fmtExprArgs paramCount) + error(Error(msg, m)) + + // partial active pattern (returning bool) doesn't have output arg + if (not apinfo.IsTotal && isBoolTy g retTy) then + checkLanguageFeatureError g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern m + if paramCount = List.length args then args, SynPat.Const(SynConst.Unit, m) else - List.frontAndBack args + showErrMsg 0 + + // for single case active pattern, if not all parameter provided, output will be a function + // that takes the remaining parameter as input + elif apinfo.IsTotal && apinfo.ActiveTags.Length = 1 && dtys.Length >= args.Length && not args.IsEmpty then + List.frontAndBack args + + // active pattern cases returning unit or unknown things (in AP definition) can omit output arg + elif paramCount = args.Length then + // only cases which return unit or unresolved type (in AP definition) can omit output arg + if canOmit retTy then + args, SynPat.Const(SynConst.Unit, m) + else + showErrMsg 1 + + // active pattern in function param (e.g. let f (|P|_|) = ...) + elif tryDestTyparTy g vExprTy |> ValueOption.exists (fun typar -> not typar.IsSolved) then + List.frontAndBack args + + // args count should equal to AP function params count + elif dtys.Length <> args.Length then + let returnCount = + match dtys with + // val (|P|) : expr1:_ -> unit + // val (|P|_|) : expr1:_ -> unit option + // val (|P|_|) : expr1:_ -> unit voption + | [_] when canOmit retTy -> 0 + | _ -> 1 + + showErrMsg returnCount + else + List.frontAndBack args if not (isNil activePatArgsAsSynPats) && apinfo.ActiveTags.Length <> 1 then errorR (Error (FSComp.SR.tcRequireActivePatternWithOneResult (), m)) @@ -5151,6 +5335,7 @@ and TcExprFlex (cenv: cenv) flex compat (desiredTy: TType) (env: TcEnv) tpenv (s if flex then let argTy = NewInferenceType g + (destTyparTy g argTy).SetSupportsNullFlex(true) if compat then (destTyparTy g argTy).SetIsCompatFlex(true) @@ -5252,17 +5437,17 @@ and TryTcStmt (cenv: cenv) env tpenv synExpr = let expr, ty, tpenv = TcExprOfUnknownType cenv env tpenv synExpr let m = synExpr.Range let hasTypeUnit = TryUnifyUnitTypeWithoutWarning cenv env m ty - hasTypeUnit, expr, tpenv + hasTypeUnit, ty, expr, tpenv and CheckForAdjacentListExpression (cenv: cenv) synExpr hpa isInfix delayed (arg: SynExpr) = let g = cenv.g // func (arg)[arg2] gives warning that .[ must be used. match delayed with - | DelayedApp (hpa2, isSugar2, _, arg2, _) :: _ when not isInfix && (hpa = ExprAtomicFlag.NonAtomic) && isAdjacentListExpr isSugar2 hpa2 (Some synExpr) arg2 -> + | DelayedApp (hpa2, isSugar2, _, arg2, _) :: _ when not isInfix && (hpa = ExprAtomicFlag.NonAtomic) && isAdjacentListExpr isSugar2 hpa2 (Some synExpr) arg2 -> let mWarning = unionRanges arg.Range arg2.Range - match arg with - | SynExpr.Paren _ -> + match arg with + | SynExpr.Paren _ -> if g.langVersion.SupportsFeature LanguageFeature.IndexerNotationWithoutDot then warning(Error(FSComp.SR.tcParenThenAdjacentListArgumentNeedsAdjustment(), mWarning)) elif not (g.langVersion.IsExplicitlySpecifiedAs50OrBefore()) then @@ -5275,7 +5460,7 @@ and CheckForAdjacentListExpression (cenv: cenv) synExpr hpa isInfix delayed (arg elif not (g.langVersion.IsExplicitlySpecifiedAs50OrBefore()) then informationalWarning(Error(FSComp.SR.tcListThenAdjacentListArgumentReserved(), mWarning)) - | _ -> + | _ -> if g.langVersion.SupportsFeature LanguageFeature.IndexerNotationWithoutDot then warning(Error(FSComp.SR.tcOtherThenAdjacentListArgumentNeedsAdjustment(), mWarning)) elif not (g.langVersion.IsExplicitlySpecifiedAs50OrBefore()) then @@ -5289,96 +5474,112 @@ and CheckForAdjacentListExpression (cenv: cenv) synExpr hpa isInfix delayed (arg and TcExprThen (cenv: cenv) overallTy env tpenv isArg synExpr delayed = let g = cenv.g - match synExpr with + let cachedExpression = + env.eCachedImplicitYieldExpressions.FindAll synExpr.Range + |> List.tryPick (fun (se, ty, e) -> + if obj.ReferenceEquals(se, synExpr) then Some (ty, e) else None + ) - // A. - // A.B. - | SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, _, m) -> - let _, _, tpenv = suppressErrorReporting (fun () -> TcExprOfUnknownTypeThen cenv env tpenv expr1 [DelayedDot]) - mkDefault(m, overallTy.Commit), tpenv + match cachedExpression with + | Some (ty, expr) -> + UnifyOverallType cenv env synExpr.Range overallTy ty + expr, tpenv + | _ -> - // A - // A.B.C - | LongOrSingleIdent (isOpt, longId, altNameRefCellOpt, mLongId) -> - TcNonControlFlowExpr env <| fun env -> - if isOpt then errorR(Error(FSComp.SR.tcSyntaxErrorUnexpectedQMark(), mLongId)) + match synExpr with - // Check to see if pattern translation decided to use an alternative identifier. - match altNameRefCellOpt with - | Some {contents = SynSimplePatAlternativeIdInfo.Decided altId} -> - TcExprThen cenv overallTy env tpenv isArg (SynExpr.LongIdent (isOpt, SynLongIdent([altId], [], [None]), None, mLongId)) delayed - | _ -> - TcLongIdentThen cenv overallTy env tpenv longId delayed + // A. + // A.B. + | SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, _, m) -> + let _, _, tpenv = suppressErrorReporting (fun () -> TcExprOfUnknownTypeThen cenv env tpenv expr1 [DelayedDot]) + mkDefault(m, overallTy.Commit), tpenv - // f?x<-v - | SynExpr.Set(SynExpr.Dynamic(e1, _, e2, _) , rhsExpr, m) -> - TcExprThenSetDynamic cenv overallTy env tpenv isArg e1 e2 rhsExpr m delayed - - // f x - // f(x) // hpa=true - // f[x] // hpa=true - | SynExpr.App (hpa, isInfix, func, arg, mFuncAndArg) -> - match func with - | SynExpr.DotLambda _ -> errorR(Error(FSComp.SR.tcDotLambdaAtNotSupportedExpression(), func.Range)) - | _ -> () + // A + // A.B.C + | LongOrSingleIdent (isOpt, longId, altNameRefCellOpt, mLongId) -> + TcNonControlFlowExpr env <| fun env -> - TcNonControlFlowExpr env <| fun env -> - - CheckForAdjacentListExpression cenv synExpr hpa isInfix delayed arg + if isOpt then errorR(Error(FSComp.SR.tcSyntaxErrorUnexpectedQMark(), mLongId)) - TcExprThen cenv overallTy env tpenv false func ((DelayedApp (hpa, isInfix, Some func, arg, mFuncAndArg)) :: delayed) + // Check to see if pattern translation decided to use an alternative identifier. + match altNameRefCellOpt with + | Some {contents = SynSimplePatAlternativeIdInfo.Decided altId} -> + TcExprThen cenv overallTy env tpenv isArg (SynExpr.LongIdent (isOpt, SynLongIdent([altId], [], [None]), None, mLongId)) delayed + | _ -> + TcLongIdentThen cenv overallTy env tpenv longId delayed + + // f?x<-v + | SynExpr.Set(SynExpr.Dynamic(e1, _, e2, _) , rhsExpr, m) -> + TcExprThenSetDynamic cenv overallTy env tpenv isArg e1 e2 rhsExpr m delayed + + // f x + // f(x) // hpa=true + // f[x] // hpa=true + | SynExpr.App (hpa, isInfix, func, arg, mFuncAndArg) -> + match func with + | SynExpr.DotLambda _ -> errorR(Error(FSComp.SR.tcDotLambdaAtNotSupportedExpression(), func.Range)) + | _ -> () - // e1?e2 - | SynExpr.Dynamic(e1, mQmark, e2, _) -> - TcExprThenDynamic cenv overallTy env tpenv isArg e1 mQmark e2 delayed + TcNonControlFlowExpr env <| fun env -> - // e - | SynExpr.TypeApp (func, _, typeArgs, _, _, mTypeArgs, mFuncAndTypeArgs) -> - TcExprThen cenv overallTy env tpenv false func ((DelayedTypeApp (typeArgs, mTypeArgs, mFuncAndTypeArgs)) :: delayed) + CheckForAdjacentListExpression cenv synExpr hpa isInfix delayed arg - // expr1.id1 - // expr1.id1.id2 - // etc. - | SynExpr.DotGet (expr1, _, SynLongIdent(longId, _, _), _) -> - TcNonControlFlowExpr env <| fun env -> - TcExprThen cenv overallTy env tpenv false expr1 ((DelayedDotLookup (longId, synExpr.Range)) :: delayed) + TcExprThen cenv overallTy env tpenv false func ((DelayedApp (hpa, isInfix, Some func, arg, mFuncAndArg)) :: delayed) - // expr1.[expr2] - // expr1.[e21, ..., e2n] - // etc. - | SynExpr.DotIndexedGet (expr1, IndexerArgs indexArgs, mDot, mWholeExpr) -> - TcNonControlFlowExpr env <| fun env -> - if not isArg && g.langVersion.SupportsFeature LanguageFeature.IndexerNotationWithoutDot then - informationalWarning(Error(FSComp.SR.tcIndexNotationDeprecated(), mDot)) - TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv None expr1 indexArgs delayed - - // expr1.[expr2] <- expr3 - // expr1.[e21, ..., e2n] <- expr3 - // etc. - | SynExpr.DotIndexedSet (expr1, IndexerArgs indexArgs, expr3, mOfLeftOfSet, mDot, mWholeExpr) -> - TcNonControlFlowExpr env <| fun env -> - if g.langVersion.SupportsFeature LanguageFeature.IndexerNotationWithoutDot then - warning(Error(FSComp.SR.tcIndexNotationDeprecated(), mDot)) - TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv (Some (expr3, mOfLeftOfSet)) expr1 indexArgs delayed + // e1?e2 + | SynExpr.Dynamic(e1, mQmark, e2, _) -> + TcExprThenDynamic cenv overallTy env tpenv isArg e1 mQmark e2 delayed - // Part of 'T.Ident - | SynExpr.Typar (typar, m) -> - TcTyparExprThen cenv overallTy env tpenv typar m delayed + // e + | SynExpr.TypeApp (func, _, typeArgs, _, _, mTypeArgs, mFuncAndTypeArgs) -> + TcExprThen cenv overallTy env tpenv false func ((DelayedTypeApp (typeArgs, mTypeArgs, mFuncAndTypeArgs)) :: delayed) - // ^expr - | SynExpr.IndexFromEnd (rightExpr, m) -> - errorR(Error(FSComp.SR.tcTraitInvocationShouldUseTick(), m)) - // Incorporate the '^' into the rightExpr, producing a nested SynExpr.Typar - let adjustedExpr = ParseHelpers.adjustHatPrefixToTyparLookup m rightExpr - TcExprThen cenv overallTy env tpenv isArg adjustedExpr delayed + // expr1.id1 + // expr1.id1.id2 + // etc. + | SynExpr.DotGet (expr1, _, SynLongIdent(longId, _, _), _) -> + TcNonControlFlowExpr env <| fun env -> + TcExprThen cenv overallTy env tpenv false expr1 ((DelayedDotLookup (longId, synExpr.Range)) :: delayed) + + // expr1.[expr2] + // expr1.[e21, ..., e2n] + // etc. + | SynExpr.DotIndexedGet (expr1, IndexerArgs indexArgs, mDot, mWholeExpr) -> + TcNonControlFlowExpr env <| fun env -> + if not isArg && g.langVersion.SupportsFeature LanguageFeature.IndexerNotationWithoutDot then + informationalWarning(Error(FSComp.SR.tcIndexNotationDeprecated(), mDot)) + TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv None expr1 indexArgs delayed + + // expr1.[expr2] <- expr3 + // expr1.[e21, ..., e2n] <- expr3 + // etc. + | SynExpr.DotIndexedSet (expr1, IndexerArgs indexArgs, expr3, mOfLeftOfSet, mDot, mWholeExpr) -> + TcNonControlFlowExpr env <| fun env -> + if g.langVersion.SupportsFeature LanguageFeature.IndexerNotationWithoutDot then + warning(Error(FSComp.SR.tcIndexNotationDeprecated(), mDot)) + // Wrap in extra parens: like MakeDelayedSet, + // but we don't actually want to delay it here. + let setInfo = SynExpr.Paren (expr3, range0, None, expr3.Range), mOfLeftOfSet + TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv (Some setInfo) expr1 indexArgs delayed + + // Part of 'T.Ident + | SynExpr.Typar (typar, m) -> + TcTyparExprThen cenv overallTy env tpenv typar m delayed + + // ^expr + | SynExpr.IndexFromEnd (rightExpr, m) -> + errorR(Error(FSComp.SR.tcTraitInvocationShouldUseTick(), m)) + // Incorporate the '^' into the rightExpr, producing a nested SynExpr.Typar + let adjustedExpr = ParseHelpers.adjustHatPrefixToTyparLookup m rightExpr + TcExprThen cenv overallTy env tpenv isArg adjustedExpr delayed - | _ -> - match delayed with - | [] -> TcExprUndelayed cenv overallTy env tpenv synExpr | _ -> - let expr, exprTy, tpenv = TcExprUndelayedNoType cenv env tpenv synExpr - PropagateThenTcDelayed cenv overallTy env tpenv synExpr.Range (MakeApplicableExprNoFlex cenv expr) exprTy ExprAtomicFlag.NonAtomic delayed + match delayed with + | [] -> TcExprUndelayed cenv overallTy env tpenv synExpr + | _ -> + let expr, exprTy, tpenv = TcExprUndelayedNoType cenv env tpenv synExpr + PropagateThenTcDelayed cenv overallTy env tpenv synExpr.Range (MakeApplicableExprNoFlex cenv expr) exprTy ExprAtomicFlag.NonAtomic delayed and TcExprThenSetDynamic (cenv: cenv) overallTy env tpenv isArg e1 e2 rhsExpr m delayed = let e2 = mkDynamicArgExpr e2 @@ -5387,9 +5588,9 @@ and TcExprThenSetDynamic (cenv: cenv) overallTy env tpenv isArg e1 e2 rhsExpr m and TcExprThenDynamic (cenv: cenv) overallTy env tpenv isArg e1 mQmark e2 delayed = let appExpr = - let argExpr = mkDynamicArgExpr e2 + let argExpr = mkDynamicArgExpr e2 mkSynInfix mQmark e1 "?" argExpr - + TcExprThen cenv overallTy env tpenv isArg appExpr delayed and TcExprsWithFlexes (cenv: cenv) env m tpenv flexes (argTys: TType list) (args: SynExpr list) = @@ -5421,7 +5622,7 @@ and TcExprUndelayedNoType (cenv: cenv) env tpenv synExpr = /// or '_ array') is already sufficiently pre-known, and the information in the overall type /// can be eagerly propagated into the actual type (UnifyOverallType), including pre-calculating /// any type-directed conversion. This must mean that types extracted when processing the expression are not -/// considered in determining any type-directed conversion. +/// considered in determining any type-directed conversion. /// /// Used for: /// - Array or List expressions (both computed and fixed-size), to propagate from the overall type into the array/list type @@ -5486,13 +5687,13 @@ and TcPossiblyPropagatingExprLeafThenConvert isPropagating (cenv: cenv) (overall processExpr overallTy.Commit /// Process a leaf construct where the processing of the construct is initially independent -/// of the overall type. Determine and apply additional type-directed conversions after the processing +/// of the overall type. Determine and apply additional type-directed conversions after the processing /// is complete, as the inferred type of the expression may enable a type-directed conversion. /// /// Used for: -/// - trait call +/// - trait call /// - LibraryOnlyUnionCaseFieldGet -/// - constants +/// - constants and TcNonPropagatingExprLeafThenConvert (cenv: cenv) (overallTy: OverallTy) (env: TcEnv) m processExpr = // Process the construct @@ -5515,11 +5716,11 @@ and TcAdjustExprForTypeDirectedConversions (cenv: cenv) (overallTy: OverallTy) a expr and TcNonControlFlowExpr (env: TcEnv) f = - if env.eIsControlFlow then + if env.eIsControlFlow then let envinner = { env with eIsControlFlow = false } let res, tpenv = f envinner let m = res.Range - + // If the range is associated with calls like `async.For` for computation expression syntax control-flow // desugaring then don't emit a debug point - the debug points are placed separately in CheckComputationExpressions.fs match m.NotedSourceConstruct with @@ -5588,13 +5789,13 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy.Commit, env.AccessRights) TcConstExpr cenv overallTy env m tpenv synConst | SynExpr.DotLambda (synExpr, m, trivia) -> - match env.NameEnv.eUnqualifiedItems |> Map.tryFind "_arg1" with + match env.NameEnv.eUnqualifiedItems |> Map.tryFind "_arg1" with // Compiler-generated _arg items can have more forms, the real underscore will be 1-character wide | Some (Item.Value(valRef)) when valRef.Range.StartColumn+1 = valRef.Range.EndColumn -> warning(Error(FSComp.SR.tcAmbiguousDiscardDotLambda(), trivia.UnderscoreRange)) | Some _ -> () | None -> () - + let unaryArg = mkSynId trivia.UnderscoreRange (cenv.synArgNameGenerator.New()) let svar = mkSynCompGenSimplePatVar unaryArg let pushedExpr = pushUnaryArg synExpr unaryArg @@ -5606,8 +5807,8 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE | SynExpr.Match (spMatch, synInputExpr, synClauses, _m, _trivia) -> TcExprMatch cenv overallTy env tpenv synInputExpr spMatch synClauses - | SynExpr.MatchLambda (isExnMatch, mArg, clauses, spMatch, m) -> - TcExprMatchLambda cenv overallTy env tpenv (isExnMatch, mArg, clauses, spMatch, m) + | SynExpr.MatchLambda (isExnMatch, mFunction, clauses, spMatch, m) -> + TcExprMatchLambda cenv overallTy env tpenv (isExnMatch, mFunction, clauses, spMatch, m) | SynExpr.Assert (x, m) -> TcNonControlFlowExpr env <| fun env -> @@ -5648,7 +5849,8 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE | SynExpr.Null m -> TcNonControlFlowExpr env <| fun env -> AddCxTypeUseSupportsNull env.DisplayEnv cenv.css m NoTrace overallTy.Commit - mkNull m overallTy.Commit, tpenv + let tyWithNull = addNullnessToTy KnownWithNull overallTy.Commit + mkNull m tyWithNull, tpenv | SynExpr.Lazy (synInnerExpr, m) -> TcNonControlFlowExpr env <| fun env -> @@ -5675,7 +5877,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE TcExprArrayOrList cenv overallTy env tpenv (isArray, args, m) | SynExpr.New (superInit, synObjTy, arg, mNewExpr) -> - let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.Use WarnOnIWSAM.Yes env tpenv synObjTy + let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurrence.Use WarnOnIWSAM.Yes env tpenv synObjTy TcNonControlFlowExpr env <| fun env -> TcPropagatingExprLeafThenConvert cenv overallTy objTy env (* true *) mNewExpr (fun () -> @@ -5713,6 +5915,17 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE TcForEachExpr cenv overallTy env tpenv (seqExprOnly, isFromSource, pat, synEnumExpr, synBodyExpr, m, spFor, spIn, m) | SynExpr.ComputationExpr (hasSeqBuilder, comp, m) -> + let isIndexRange = match comp with | SynExpr.IndexRange _ -> true | _ -> false + let deprecatedPlacesWhereSeqCanBeOmitted = + cenv.g.langVersion.SupportsFeature LanguageFeature.DeprecatePlacesWhereSeqCanBeOmitted + if + deprecatedPlacesWhereSeqCanBeOmitted + && isIndexRange + && not hasSeqBuilder + && not cenv.g.compilingFSharpCore + then + warning (Error(FSComp.SR.chkDeprecatePlacesWhereSeqCanBeOmitted (), m)) + let env = ExitFamilyRegion env cenv.TcSequenceExpressionEntry cenv env overallTy tpenv (hasSeqBuilder, comp) m @@ -5743,7 +5956,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE let _, tpenv = suppressErrorReporting (fun () -> TcExpr cenv overallTy env tpenv expr1) mkDefault(m, overallTy.Commit), tpenv - | SynExpr.Sequential (sp, dir, synExpr1, synExpr2, m) -> + | SynExpr.Sequential (sp, dir, synExpr1, synExpr2, m, _) -> TcExprSequential cenv overallTy env tpenv (synExpr, sp, dir, synExpr1, synExpr2, m) // Used to implement the type-directed 'implicit yield' rule for computation expressions @@ -5775,7 +5988,10 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE // synExpr1.longId(synExpr2) <- expr3, very rarely used named property setters | SynExpr.DotNamedIndexedPropertySet (synExpr1, synLongId, synExpr2, expr3, mStmt) -> TcNonControlFlowExpr env <| fun env -> - TcExprDotNamedIndexedPropertySet cenv overallTy env tpenv (synExpr1, synLongId, synExpr2, expr3, mStmt) + // Wrap in extra parens: like MakeDelayedSet, + // but we don't actually want to delay it here. + let setInfo = SynExpr.Paren (expr3, range0, None, expr3.Range) + TcExprDotNamedIndexedPropertySet cenv overallTy env tpenv (synExpr1, synLongId, synExpr2, setInfo, mStmt) | SynExpr.LongIdentSet (synLongId, synExpr2, m) -> TcNonControlFlowExpr env <| fun env -> @@ -5784,7 +6000,10 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE // Type.Items(synExpr1) <- synExpr2 | SynExpr.NamedIndexedPropertySet (synLongId, synExpr1, synExpr2, mStmt) -> TcNonControlFlowExpr env <| fun env -> - TcExprNamedIndexPropertySet cenv overallTy env tpenv (synLongId, synExpr1, synExpr2, mStmt) + // Wrap in extra parens: like MakeDelayedSet, + // but we don't actually want to delay it here. + let setInfo = SynExpr.Paren (synExpr2, range0, None, synExpr2.Range) + TcExprNamedIndexPropertySet cenv overallTy env tpenv (synLongId, synExpr1, setInfo, mStmt) | SynExpr.TraitCall (TypesForTypar tps, synMemberSig, arg, m) -> TcNonControlFlowExpr env <| fun env -> @@ -5807,23 +6026,23 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy.Commit, env.AccessRights) TcQuotationExpr cenv overallTy env tpenv (oper, raw, ast, isFromQueryExpression, m) - | SynExpr.YieldOrReturn ((isTrueYield, _), _, m) - | SynExpr.YieldOrReturnFrom ((isTrueYield, _), _, m) when isTrueYield -> + | SynExpr.YieldOrReturn ((isTrueYield, _), _, _m, { YieldOrReturnKeyword = m }) + | SynExpr.YieldOrReturnFrom ((isTrueYield, _), _, _m, { YieldOrReturnFromKeyword = m }) when isTrueYield -> error(Error(FSComp.SR.tcConstructRequiresListArrayOrSequence(), m)) - | SynExpr.YieldOrReturn ((_, isTrueReturn), _, m) - | SynExpr.YieldOrReturnFrom ((_, isTrueReturn), _, m) when isTrueReturn -> + | SynExpr.YieldOrReturn ((_, isTrueReturn), _, _m, { YieldOrReturnKeyword = m }) + | SynExpr.YieldOrReturnFrom ((_, isTrueReturn), _, _m, { YieldOrReturnFromKeyword = m }) when isTrueReturn -> error(Error(FSComp.SR.tcConstructRequiresComputationExpressions(), m)) - | SynExpr.YieldOrReturn (_, _, m) - | SynExpr.YieldOrReturnFrom (_, _, m) + | SynExpr.YieldOrReturn (trivia = { YieldOrReturnKeyword = m }) + | SynExpr.YieldOrReturnFrom (trivia = { YieldOrReturnFromKeyword = m }) | SynExpr.ImplicitZero m -> error(Error(FSComp.SR.tcConstructRequiresSequenceOrComputations(), m)) - | SynExpr.DoBang (_, m) - | SynExpr.MatchBang (range = m) + | SynExpr.DoBang (trivia = { DoBangKeyword = m }) + | SynExpr.MatchBang (trivia = { MatchBangKeyword = m }) | SynExpr.WhileBang (range = m) - | SynExpr.LetOrUseBang (range = m) -> + | SynExpr.LetOrUseBang (trivia = { LetOrUseBangKeyword = m }) -> error(Error(FSComp.SR.tcConstructRequiresComputationExpression(), m)) | SynExpr.IndexFromEnd (rightExpr, m) -> @@ -5853,17 +6072,18 @@ and TcExprMatch (cenv: cenv) overallTy env tpenv synInputExpr spMatch synClauses // <@ function x -> (x: int) @> // is // Lambda (_arg2, Let (x, _arg2, x)) -and TcExprMatchLambda (cenv: cenv) overallTy env tpenv (isExnMatch, mArg, clauses, spMatch, m) = +and TcExprMatchLambda (cenv: cenv) overallTy env tpenv (isExnMatch, mFunction, clauses, spMatch, m) = let domainTy, resultTy = UnifyFunctionType None cenv env.DisplayEnv m overallTy.Commit - let idv1, idve1 = mkCompGenLocal mArg (cenv.synArgNameGenerator.New()) domainTy + let idv1, idve1 = mkCompGenLocal mFunction (cenv.synArgNameGenerator.New()) domainTy + CallExprHasTypeSink cenv.tcSink (mFunction.StartRange, env.NameEnv, domainTy, env.AccessRights) let envinner = ExitFamilyRegion env let envinner = { envinner with eIsControlFlow = true } - let idv2, matchExpr, tpenv = TcAndPatternCompileMatchClauses m mArg (if isExnMatch then Throw else ThrowIncompleteMatchException) cenv None domainTy (MustConvertTo (false, resultTy)) envinner tpenv clauses + let idv2, matchExpr, tpenv = TcAndPatternCompileMatchClauses m mFunction (if isExnMatch then Throw else ThrowIncompleteMatchException) cenv None domainTy (MustConvertTo (false, resultTy)) envinner tpenv clauses let overallExpr = mkMultiLambda m [idv1] ((mkLet spMatch m idv2 idve1 matchExpr), resultTy) overallExpr, tpenv and TcExprTypeAnnotated (cenv: cenv) overallTy env tpenv (synBodyExpr, synType, m) = - let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synType + let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synType UnifyOverallType cenv env m overallTy tgtTy let bodyExpr, tpenv = TcExpr cenv (MustConvertTo (false, tgtTy)) env tpenv synBodyExpr let bodyExpr2 = TcAdjustExprForTypeDirectedConversions cenv overallTy tgtTy env m bodyExpr @@ -5873,7 +6093,7 @@ and TcExprTypeTest (cenv: cenv) overallTy env tpenv (synInnerExpr, tgtTy, m) = let g = cenv.g let innerExpr, srcTy, tpenv = TcExprOfUnknownType cenv env tpenv synInnerExpr UnifyTypes cenv env m overallTy.Commit g.bool_ty - let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv tgtTy + let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv tgtTy TcRuntimeTypeTest false true cenv env.DisplayEnv m tgtTy srcTy let expr = mkCallTypeTest g m tgtTy innerExpr expr, tpenv @@ -5883,7 +6103,7 @@ and TcExprUpcast (cenv: cenv) overallTy env tpenv (synExpr, synInnerExpr, m) = let tgtTy, tpenv = match synExpr with | SynExpr.Upcast (_, tgtTy, m) -> - let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv tgtTy + let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv tgtTy UnifyTypes cenv env m tgtTy overallTy.Commit tgtTy, tpenv | SynExpr.InferredUpcast _ -> @@ -5901,7 +6121,7 @@ and TcExprDowncast (cenv: cenv) overallTy env tpenv (synExpr, synInnerExpr, m) = let tgtTy, tpenv, isOperator = match synExpr with | SynExpr.Downcast (_, tgtTy, m) -> - let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv tgtTy + let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv tgtTy UnifyTypes cenv env m tgtTy overallTy.Commit tgtTy, tpenv, true | SynExpr.InferredDowncast _ -> overallTy.Commit, tpenv, false @@ -5911,7 +6131,10 @@ and TcExprDowncast (cenv: cenv) overallTy env tpenv (synExpr, synInnerExpr, m) = // TcRuntimeTypeTest ensures tgtTy is a nominal type. Hence we can insert a check here // based on the nullness semantics of the nominal type. - let expr = mkCallUnbox g m tgtTy innerExpr + let expr = + match (tgtTy,g) with + | NullTrueValue | NullableRefType | NullableTypar when g.checkNullness -> mkCallUnboxFast g m tgtTy innerExpr + | _ -> mkCallUnbox g m tgtTy innerExpr expr, tpenv and TcExprLazy (cenv: cenv) overallTy env tpenv (synInnerExpr, m) = @@ -5956,7 +6179,7 @@ and TcExprArrayOrList (cenv: cenv) overallTy env tpenv (isArray, args, m) = let argTy = NewInferenceType g let actualTy = if isArray then mkArrayType g argTy else mkListTy g argTy - // Propagating type directed conversion, e.g. for + // Propagating type directed conversion, e.g. for // let x : seq = [ 1; 2 ] // Consider also the case where there is no relation but an op_Implicit is enabled from List<_> to C // let x : C = [ B(); B() ] @@ -5997,20 +6220,20 @@ and TcExprObjectExpr (cenv: cenv) overallTy env tpenv (synObjTy, argopt, binds, let mObjTy = synObjTy.Range - let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synObjTy + let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synObjTy // Work out the type of any interfaces to implement let extraImpls, tpenv = (tpenv, extraImpls) ||> List.mapFold (fun tpenv (SynInterfaceImpl(synIntfTy, _mWith, bindings, members, m)) -> let overrides = unionBindingAndMembers bindings members - let intfTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synIntfTy + let intfTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synIntfTy if not (isInterfaceTy g intfTy) then error(Error(FSComp.SR.tcExpectedInterfaceType(), m)) if isErasedType g intfTy then errorR(Error(FSComp.SR.tcCannotInheritFromErasedType(), m)) (m, intfTy, overrides), tpenv) - let realObjTy = if isObjTy g objTy && not (isNil extraImpls) then (p23 (List.head extraImpls)) else objTy + let realObjTy = if isObjTyAnyNullness g objTy && not (isNil extraImpls) then (p23 (List.head extraImpls)) else objTy TcPropagatingExprLeafThenConvert cenv overallTy realObjTy env (* canAdhoc *) m (fun () -> TcObjectExpr cenv env tpenv (objTy, realObjTy, argopt, binds, extraImpls, mObjTy, mNewExpr, m) @@ -6029,7 +6252,7 @@ and TcExprWhileLoop (cenv: cenv) overallTy env tpenv (spWhile, synGuardExpr, syn let g = cenv.g UnifyTypes cenv env m overallTy.Commit g.unit_ty - let guardExpr, tpenv = + let guardExpr, tpenv = let env = { env with eIsControlFlow = false } TcExpr cenv (MustEqual g.bool_ty) env tpenv synGuardExpr @@ -6057,7 +6280,7 @@ and TcExprIntegerForLoop (cenv: cenv) overallTy env tpenv (spFor, spTo, id, star // notify name resolution sink about loop variable let item = Item.Value(mkLocalValRef idv) - CallNameResolutionSink cenv.tcSink (idv.Range, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights) + CallNameResolutionSink cenv.tcSink (idv.Range, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights) let bodyExpr, tpenv = TcStmt cenv envinner tpenv body mkFastForLoop g (spFor, spTo, m, idv, startExpr, dir, finishExpr, bodyExpr), tpenv @@ -6108,7 +6331,7 @@ and TcExprSequential (cenv: cenv) overallTy env tpenv (synExpr, _sp, dir, synExp and TcExprSequentialOrImplicitYield (cenv: cenv) overallTy env tpenv (sp, synExpr1, synExpr2, otherExpr, m) = - let isStmt, expr1, tpenv = + let isStmt, expr1Ty, expr1, tpenv = let env1 = { env with eIsControlFlow = (match sp with DebugPointAtSequential.SuppressNeither | DebugPointAtSequential.SuppressExpr -> true | _ -> false) } TryTcStmt cenv env1 tpenv synExpr1 @@ -6121,7 +6344,14 @@ and TcExprSequentialOrImplicitYield (cenv: cenv) overallTy env tpenv (sp, synExp // The first expression wasn't unit-typed, so proceed to the alternative interpretation // Note a copy of the first expression is embedded in 'otherExpr' and thus // this will type-check the first expression over again. - TcExpr cenv overallTy env tpenv otherExpr + let cachedExpr = + match expr1 with + | Expr.DebugPoint(_,e) -> e + | _ -> expr1 + + env.eCachedImplicitYieldExpressions.Add(synExpr1.Range, (synExpr1, expr1Ty, cachedExpr)) + try TcExpr cenv overallTy env tpenv otherExpr + finally env.eCachedImplicitYieldExpressions.Remove synExpr1.Range and TcExprStaticOptimization (cenv: cenv) overallTy env tpenv (constraints, synExpr2, expr3, m) = let constraintsR, tpenv = List.mapFold (TcStaticOptimizationConstraint cenv env) tpenv constraints @@ -6141,8 +6371,8 @@ and TcExprDotSet (cenv: cenv) overallTy env tpenv (synExpr1, synLongId, synExpr2 and TcExprDotNamedIndexedPropertySet (cenv: cenv) overallTy env tpenv (synExpr1, synLongId, synExpr2, expr3, mStmt) = let (SynLongIdent(longId, _, _)) = synLongId let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId) - TcExprThen cenv overallTy env tpenv false synExpr1 - [ DelayedDotLookup(longId, mExprAndDotLookup); + TcExprThen cenv overallTy env tpenv false synExpr1 + [ DelayedDotLookup(longId, mExprAndDotLookup); DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr2, mStmt) MakeDelayedSet(expr3, mStmt)] @@ -6151,7 +6381,7 @@ and TcExprLongIdentSet (cenv: cenv) overallTy env tpenv (synLongId, synExpr2, m) // Type.Items(synExpr1) <- synExpr2 and TcExprNamedIndexPropertySet (cenv: cenv) overallTy env tpenv (synLongId, synExpr1, synExpr2, mStmt) = - TcLongIdentThen cenv overallTy env tpenv synLongId + TcLongIdentThen cenv overallTy env tpenv synLongId [ DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr1, mStmt) MakeDelayedSet(synExpr2, mStmt) ] @@ -6203,10 +6433,10 @@ and TcExprILAssembly (cenv: cenv) overallTy env tpenv (ilInstrs, synTyArgs, synA let g = cenv.g let ilInstrs = (ilInstrs :?> ILInstr[]) let argTys = NewInferenceTypes g synArgs - let tyargs, tpenv = TcTypes cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synTyArgs + let tyargs, tpenv = TcTypes cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synTyArgs // No subsumption at uses of IL assembly code let args, tpenv = TcExprsNoFlexes cenv env m tpenv argTys synArgs - let retTys, tpenv = TcTypes cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synRetTys + let retTys, tpenv = TcTypes cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synRetTys let returnTy = match retTys with | [] -> g.unit_ty @@ -6215,37 +6445,12 @@ and TcExprILAssembly (cenv: cenv) overallTy env tpenv (ilInstrs, synTyArgs, synA UnifyTypes cenv env m overallTy.Commit returnTy mkAsmExpr (Array.toList ilInstrs, tyargs, args, retTys, m), tpenv -// Converts 'a..b' to a call to the '(..)' operator in FSharp.Core -// Converts 'a..b..c' to a call to the '(.. ..)' operator in FSharp.Core -// -// NOTE: we could eliminate these more efficiently in LowerComputedCollections.fs, since -// [| 1..4 |] -// becomes [| for i in (..) 1 4 do yield i |] -// instead of generating the array directly from the ranges -and RewriteRangeExpr synExpr = - match synExpr with - // a..b..c (parsed as (a..b)..c ) - | SynExpr.IndexRange(Some (SynExpr.IndexRange(Some synExpr1, _, Some synStepExpr, _, _, _)), _, Some synExpr2, _m1, _m2, mWhole) -> - let mWhole = mWhole.MakeSynthetic() - Some (mkSynTrifix mWhole ".. .." synExpr1 synStepExpr synExpr2) - // a..b - | SynExpr.IndexRange (Some synExpr1, mOperator, Some synExpr2, _m1, _m2, mWhole) -> - let otherExpr = - let mWhole = mWhole.MakeSynthetic() - match mkSynInfix mOperator synExpr1 ".." synExpr2 with - | SynExpr.App (a, b, c, d, _) -> SynExpr.App (a, b, c, d, mWhole) - | _ -> failwith "impossible" - Some otherExpr - | _ -> None - /// Check lambdas as a group, to catch duplicate names in patterns and TcIteratedLambdas (cenv: cenv) isFirst (env: TcEnv) overallTy takenNames tpenv e = let g = cenv.g match e with - | SynExpr.Lambda (isMember, isSubsequent, synSimplePats, bodyExpr, _, m, _) when isMember || isFirst || isSubsequent -> - + | SynExpr.Lambda (isMember, isSubsequent, synSimplePats, bodyExpr, _parsedData, m, _trivia) when isMember || isFirst || isSubsequent -> let domainTy, resultTy = UnifyFunctionType None cenv env.DisplayEnv m overallTy.Commit - let vs, (TcPatLinearEnv (tpenv, names, takenNames)) = cenv.TcSimplePats cenv isMember CheckCxs domainTy env (TcPatLinearEnv (tpenv, Map.empty, takenNames)) synSimplePats @@ -6253,29 +6458,29 @@ and TcIteratedLambdas (cenv: cenv) isFirst (env: TcEnv) overallTy takenNames tpe let byrefs = vspecMap |> Map.map (fun _ v -> isByrefTy g v.Type, v) let envinner = if isMember then envinner else ExitFamilyRegion envinner let vspecs = vs |> List.map (fun nm -> NameMap.find nm vspecMap) - + // Match up the arginfos with the generated arguments and apply any information extracted from the attributes let envinner = - match envinner.eLambdaArgInfos with - | infos :: rest -> - if infos.Length = vspecs.Length then - (vspecs, infos) ||> List.iter2 (fun v argInfo -> + match envinner.eLambdaArgInfos with + | infos :: rest -> + if infos.Length = vspecs.Length then + (vspecs, infos) ||> List.iter2 (fun v argInfo -> v.SetArgReprInfoForDisplay (Some argInfo) let inlineIfLambda = HasFSharpAttribute g g.attrib_InlineIfLambdaAttribute argInfo.Attribs - if inlineIfLambda then + if inlineIfLambda then v.SetInlineIfLambda()) { envinner with eLambdaArgInfos = rest } | [] -> envinner - + let bodyExpr, tpenv = TcIteratedLambdas cenv false envinner (MustConvertTo (false, resultTy)) takenNames tpenv bodyExpr // See bug 5758: Non-monotonicity in inference: need to ensure that parameters are never inferred to have byref type, instead it is always declared byrefs |> Map.iter (fun _ (orig, v) -> if not orig && isByrefTy g v.Type then errorR(Error(FSComp.SR.tcParameterInferredByref v.DisplayName, v.Range))) - mkMultiLambda m vspecs (bodyExpr, resultTy), tpenv + mkMultiLambda m vspecs (bodyExpr, resultTy), tpenv - | e -> + | e -> let env = { env with eIsControlFlow = true } // Dive into the expression to check for syntax errors and suppress them if they show. conditionallySuppressErrorReporting (not isFirst && synExprContainsError e) (fun () -> @@ -6296,7 +6501,7 @@ and TcTyparExprThen (cenv: cenv) overallTy env tpenv synTypar m delayed = match rest with | [] -> delayed2 | _ -> DelayedDotLookup (rest, m2) :: delayed2 - CallNameResolutionSink cenv.tcSink (ident.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.AccessRights) + CallNameResolutionSink cenv.tcSink (ident.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.AccessRights) TcItemThen cenv overallTy env tpenv ([], item, mExprAndLongId, [], AfterResolution.DoNothing) (Some ty) delayed3 //TcLookupItemThen cenv overallTy env tpenv mObjExpr objExpr objExprTy delayed item mItem rest afterResolution | _ -> @@ -6318,14 +6523,14 @@ and (|IndexArgOptionalFromEnd|) (cenv: cenv) indexArg = and DecodeIndexArg (cenv: cenv) indexArg = match indexArg with | SynExpr.IndexRange (info1, _opm, info2, m1, m2, _) -> - let info1 = - match info1 with + let info1 = + match info1 with | Some (IndexArgOptionalFromEnd cenv (expr1, isFromEnd1, _)) -> Some (expr1, isFromEnd1) - | None -> None - let info2 = - match info2 with + | None -> None + let info2 = + match info2 with | Some (IndexArgOptionalFromEnd cenv (synExpr2, isFromEnd2, _)) -> Some (synExpr2, isFromEnd2) - | None -> None + | None -> None IndexArgRange (info1, info2, m1, m2) | IndexArgOptionalFromEnd cenv (expr, isFromEnd, m) -> IndexArgItem(expr, isFromEnd, m) @@ -6334,7 +6539,7 @@ and DecodeIndexArgs (cenv: cenv) indexArgs = indexArgs |> List.map (DecodeIndexArg cenv) and (|IndexerArgs|) expr = - match expr with + match expr with | SynExpr.Tuple (false, argExprs, _, _) -> argExprs | _ -> [expr] @@ -6350,15 +6555,15 @@ and ExpandIndexArgs (cenv: cenv) (synLeftExprOpt: SynExpr option) indexArgs = let rewriteReverseExpr (rank: int) (offset: SynExpr) (range: range) = let rankExpr = SynExpr.Const(SynConst.Int32 rank, range) let sliceArgs = SynExpr.Paren(SynExpr.Tuple(false, [rankExpr; offset], [], range), range, Some range, range) - match synLeftExprOpt with - | None -> error(Error(FSComp.SR.tcInvalidUseOfReverseIndex(), range)) - | Some xsId -> + match synLeftExprOpt with + | None -> error(Error(FSComp.SR.tcInvalidUseOfReverseIndex(), range)) + | Some xsId -> mkSynApp1 (mkSynDot range range xsId (SynIdent((mkSynId (range.MakeSynthetic()) "GetReverseIndex"), None))) sliceArgs range - let mkSynSomeExpr (m: range) x = + let mkSynSomeExpr (m: range) x = let m = m.MakeSynthetic() SynExpr.App (ExprAtomicFlag.NonAtomic, false, mkSynLidGet m FSharpLib.CorePath "Some", x, m) @@ -6374,12 +6579,12 @@ and ExpandIndexArgs (cenv: cenv) (synLeftExprOpt: SynExpr option) indexArgs = [ if fromEnd then rewriteReverseExpr pos expr range else expr ] | IndexArgRange(info1, info2, range1, range2) -> [ - match info1 with + match info1 with | Some (a1, isFromEnd1) -> yield mkSynSomeExpr range1 (if isFromEnd1 then rewriteReverseExpr pos a1 range1 else a1) - | None -> + | None -> yield mkSynNoneExpr range1 - match info2 with + match info2 with | Some (a2, isFromEnd2) -> yield mkSynSomeExpr range2 (if isFromEnd2 then rewriteReverseExpr pos a2 range2 else a2) | None -> @@ -6620,7 +6825,7 @@ and TcCtorCall isNaked cenv env tpenv (overallTy: OverallTy) objTy mObjTyOpt ite | Item.DelegateCtor ty, [arg] -> // Re-record the name resolution since we now know it's a constructor call match mObjTyOpt with - | Some mObjTy -> CallNameResolutionSink cenv.tcSink (mObjTy, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.AccessRights) + | Some mObjTy -> CallNameResolutionSink cenv.tcSink (mObjTy, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.AccessRights) | None -> () TcNewDelegateThen cenv (MustEqual objTy) env tpenv mItem mWholeCall ty arg ExprAtomicFlag.NonAtomic delayed @@ -6636,7 +6841,8 @@ and TcRecordConstruction (cenv: cenv) (overallTy: TType) isObjExpr env tpenv wit UnifyTypes cenv env m overallTy objTy // Types with implicit constructors can't use record or object syntax: all constructions must go through the implicit constructor - if tycon.MembersOfFSharpTyconByName |> NameMultiMap.existsInRange (fun v -> v.IsIncrClassConstructor) then + let supportsObjectExpressionWithoutOverrides = isObjExpr && g.langVersion.SupportsFeature(LanguageFeature.AllowObjectExpressionWithoutOverrides) + if not supportsObjectExpressionWithoutOverrides && tycon.MembersOfFSharpTyconByName |> NameMultiMap.existsInRange (fun v -> v.IsIncrClassConstructor) then errorR(Error(FSComp.SR.tcConstructorRequiresCall(tycon.DisplayName), m)) let fspecs = tycon.TrueInstanceFieldsAsList @@ -6816,7 +7022,7 @@ and FreshenObjExprAbstractSlot (cenv: cenv) (env: TcEnv) (implTy: TType) virtNam FreshenAbstractSlot g cenv.amap mBinding synTyparDecls absSlot // Work out the required type of the member - let bindingTy = mkFunTy cenv.g implTy (mkMethodTy cenv.g argTysFromAbsSlot retTyFromAbsSlot) + let bindingTy = mkFunTy cenv.g implTy (mkMethodTy cenv.g argTysFromAbsSlot retTyFromAbsSlot) Some(typarsFromAbsSlotAreRigid, typarsFromAbsSlot, bindingTy) @@ -6840,7 +7046,7 @@ and TcObjectExprBinding (cenv: cenv) (env: TcEnv) implTy tpenv (absSlotInfo, bin let logicalMethId = id let memberFlags = OverrideMemberFlags SynMemberKind.Member bindingRhs, logicalMethId, memberFlags - + | SynPat.Named (SynIdent(id,_), _, _, _), Some memberFlags -> CheckMemberFlags None NewSlotsOK OverridesOK memberFlags mBinding let bindingRhs = PushOnePatternToRhs cenv true (mkSynThisPatVar (ident (CompilerGeneratedName "this", id.idRange))) bindingRhs @@ -6970,7 +7176,7 @@ and CheckSuperType (cenv: cenv) ty m = typeEquiv g ty g.system_Array_ty || typeEquiv g ty g.system_MulticastDelegate_ty || typeEquiv g ty g.system_Delegate_ty then - error(Error(FSComp.SR.tcPredefinedTypeCannotBeUsedAsSuperType(), m)) + errorR(Error(FSComp.SR.tcPredefinedTypeCannotBeUsedAsSuperType(), m)) if isErasedType g ty then errorR(Error(FSComp.SR.tcCannotInheritFromErasedType(), m)) @@ -6978,12 +7184,15 @@ and CheckSuperType (cenv: cenv) ty m = and TcObjectExpr (cenv: cenv) env tpenv (objTy, realObjTy, argopt, binds, extraImpls, mObjTy, mNewExpr, mWholeExpr) = let g = cenv.g - match tryTcrefOfAppTy g objTy with | ValueNone -> error(Error(FSComp.SR.tcNewMustBeUsedWithNamedType(), mNewExpr)) | ValueSome tcref -> let isRecordTy = tcref.IsRecordTycon - if not isRecordTy && not (isInterfaceTy g objTy) && isSealedTy g objTy then errorR(Error(FSComp.SR.tcCannotCreateExtensionOfSealedType(), mNewExpr)) + let isInterfaceTy = isInterfaceTy g objTy + let isFSharpObjModelTy = isFSharpObjModelTy g objTy + let isOverallTyAbstract = HasFSharpAttribute g g.attrib_AbstractClassAttribute tcref.Attribs || isAbstractTycon tcref.Deref + + if not isRecordTy && not isInterfaceTy && isSealedTy g objTy then errorR(Error(FSComp.SR.tcCannotCreateExtensionOfSealedType(), mNewExpr)) CheckSuperType cenv objTy mObjTy @@ -6994,14 +7203,14 @@ and TcObjectExpr (cenv: cenv) env tpenv (objTy, realObjTy, argopt, binds, extraI let env = EnterFamilyRegion tcref env let ad = env.AccessRights - if // record construction ? + if // record construction ? e.g { A = 1; B = 2 } isRecordTy || - // object construction? - (isFSharpObjModelTy g objTy && not (isInterfaceTy g objTy) && argopt.IsNone) then + // object construction? e.g. new A() { ... } + (isFSharpObjModelTy && not isInterfaceTy && argopt.IsNone) then if argopt.IsSome then error(Error(FSComp.SR.tcNoArgumentsForRecordValue(), mWholeExpr)) if not (isNil extraImpls) then error(Error(FSComp.SR.tcNoInterfaceImplementationForConstructionExpression(), mNewExpr)) - if isFSharpObjModelTy g objTy && GetCtorShapeCounter env <> 1 then + if isFSharpObjModelTy && GetCtorShapeCounter env <> 1 then error(Error(FSComp.SR.tcObjectConstructionCanOnlyBeUsedInClassTypes(), mNewExpr)) let fldsList = binds |> List.map (fun b -> @@ -7011,31 +7220,35 @@ and TcObjectExpr (cenv: cenv) env tpenv (objTy, realObjTy, argopt, binds, extraI TcRecordConstruction cenv objTy true env tpenv None objTy fldsList mWholeExpr else - let item = ForceRaise (ResolveObjectConstructor cenv.nameResolver env.DisplayEnv mObjTy ad objTy) + // object expression construction e.g. { new A() with ... } or { new IA with ... } + let ctorCall, baseIdOpt, tpenv = + if isInterfaceTy then + match argopt with + | None -> + BuildObjCtorCall g mWholeExpr, None, tpenv + | Some _ -> + error(Error(FSComp.SR.tcConstructorForInterfacesDoNotTakeArguments(), mNewExpr)) + else + let item = ForceRaise (ResolveObjectConstructor cenv.nameResolver env.DisplayEnv mObjTy ad objTy) - if isFSharpObjModelTy g objTy && GetCtorShapeCounter env = 1 then - error(Error(FSComp.SR.tcObjectsMustBeInitializedWithObjectExpression(), mNewExpr)) + if isFSharpObjModelTy && GetCtorShapeCounter env = 1 then + error(Error(FSComp.SR.tcObjectsMustBeInitializedWithObjectExpression(), mNewExpr)) - let ctorCall, baseIdOpt, tpenv = - match item, argopt with - | Item.CtorGroup(methodName, minfos), Some (arg, baseIdOpt) -> - let meths = minfos |> List.map (fun minfo -> minfo, None) - let afterResolution = ForNewConstructors cenv.tcSink env mObjTy methodName minfos - let ad = env.AccessRights - - let expr, tpenv = TcMethodApplicationThen cenv env (MustEqual objTy) None tpenv None [] mWholeExpr mObjTy methodName ad PossiblyMutates false meths afterResolution CtorValUsedAsSuperInit [arg] ExprAtomicFlag.Atomic None [] - // The 'base' value is always bound - let baseIdOpt = (match baseIdOpt with None -> Some(ident("base", mObjTy)) | Some id -> Some id) - expr, baseIdOpt, tpenv - | Item.FakeInterfaceCtor intfTy, None -> - UnifyTypes cenv env mWholeExpr objTy intfTy - let expr = BuildObjCtorCall g mWholeExpr - expr, None, tpenv - | Item.FakeInterfaceCtor _, Some _ -> - error(Error(FSComp.SR.tcConstructorForInterfacesDoNotTakeArguments(), mNewExpr)) - | Item.CtorGroup _, None -> - error(Error(FSComp.SR.tcConstructorRequiresArguments(), mNewExpr)) - | _ -> error(Error(FSComp.SR.tcNewRequiresObjectConstructor(), mNewExpr)) + match item, argopt with + | Item.CtorGroup(methodName, minfos), Some (arg, baseIdOpt) -> + let meths = minfos |> List.map (fun minfo -> minfo, None) + let afterResolution = ForNewConstructors cenv.tcSink env mObjTy methodName minfos + let ad = env.AccessRights + + let expr, tpenv = TcMethodApplicationThen cenv env (MustEqual objTy) None tpenv None [] mWholeExpr mObjTy methodName ad PossiblyMutates false meths afterResolution CtorValUsedAsSuperInit [arg] ExprAtomicFlag.Atomic None [] + // The 'base' value is always bound + let baseIdOpt = (match baseIdOpt with None -> Some(ident("base", mObjTy)) | Some id -> Some id) + expr, baseIdOpt, tpenv + + | Item.CtorGroup _, None -> + error(Error(FSComp.SR.tcConstructorRequiresArguments(), mNewExpr)) + + | _ -> error(Error(FSComp.SR.tcNewRequiresObjectConstructor(), mNewExpr)) let baseValOpt = MakeAndPublishBaseVal cenv env baseIdOpt objTy let env = Option.foldBack (AddLocalVal g cenv.tcSink mNewExpr) baseValOpt env @@ -7045,17 +7258,18 @@ and TcObjectExpr (cenv: cenv) env tpenv (objTy, realObjTy, argopt, binds, extraI let overridesAndVirts, tpenv = ComputeObjectExprOverrides cenv env tpenv impls - // 2. check usage conditions - overridesAndVirts |> List.iter (fun (m, implTy, dispatchSlots, dispatchSlotsKeyed, availPriorOverrides, overrides) -> + // 2. check usage conditions + for ovd in overridesAndVirts do + let (m, implTy, dispatchSlots, dispatchSlotsKeyed, availPriorOverrides, overrides) = ovd let overrideSpecs = overrides |> List.map fst let hasStaticMembers = dispatchSlots |> List.exists (fun reqdSlot -> not reqdSlot.MethodInfo.IsInstance) - if hasStaticMembers then errorR(Error(FSComp.SR.chkStaticMembersOnObjectExpressions(), mObjTy)) DispatchSlotChecking.CheckOverridesAreAllUsedOnce (env.DisplayEnv, g, cenv.infoReader, true, implTy, dispatchSlotsKeyed, availPriorOverrides, overrideSpecs) - DispatchSlotChecking.CheckDispatchSlotsAreImplemented (env.DisplayEnv, cenv.infoReader, m, env.NameEnv, cenv.tcSink, false, true, implTy, dispatchSlots, availPriorOverrides, overrideSpecs) |> ignore) + if not hasStaticMembers then + DispatchSlotChecking.CheckDispatchSlotsAreImplemented (env.DisplayEnv, cenv.infoReader, m, env.NameEnv, cenv.tcSink, isOverallTyAbstract, true, implTy, dispatchSlots, availPriorOverrides, overrideSpecs) |> ignore // 3. create the specs of overrides let allTypeImpls = @@ -7087,8 +7301,12 @@ and TcObjectExpr (cenv: cenv) env tpenv (objTy, realObjTy, argopt, binds, extraI let objtyR, overrides' = allTypeImpls.Head assert (typeEquiv g objTy objtyR) let extraImpls = allTypeImpls.Tail + let supportsObjectExpressionWithoutOverrides = g.langVersion.SupportsFeature(LanguageFeature.AllowObjectExpressionWithoutOverrides) - // 7. Build the implementation + if not supportsObjectExpressionWithoutOverrides && not isInterfaceTy && overrides'.IsEmpty && extraImpls.IsEmpty then + errorR (Error(FSComp.SR.tcInvalidObjectExpressionSyntaxForm (), mWholeExpr)) + + // 4. Build the implementation let expr = mkObjExpr(objtyR, baseValOpt, ctorCall, overrides', extraImpls, mWholeExpr) let expr = mkCoerceIfNeeded g realObjTy objtyR expr expr, tpenv @@ -7111,7 +7329,7 @@ and TcConstStringExpr cenv (overallTy: OverallTy) env m tpenv (s: string) litera | _ -> false let g = cenv.g - + match isFormat g overallTy.Commit, literalType with | true, LiteralArgumentType.StaticField -> @@ -7138,7 +7356,7 @@ and TcFormatStringExpr cenv (overallTy: OverallTy) env m tpenv (fmtString: strin let formatTy = mkPrintfFormatTy g aty bty cty dty ety // This might qualify as a format string - check via a type directed rule - let ok = not (isObjTy g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy + let ok = not (isObjTyAnyNullness g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy if ok then // Parse the format string to work out the phantom types @@ -7217,7 +7435,7 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn Choice1Of2 (true, newFormatMethod) // ... or if that fails then may be a FormattableString by a type-directed rule.... - elif (not (isObjTy g overallTy.Commit) && + elif (not (isObjTyAnyNullness g overallTy.Commit) && ((g.system_FormattableString_tcref.CanDeref && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit g.system_FormattableString_ty) || (g.system_IFormattable_tcref.CanDeref && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit g.system_IFormattable_ty))) then @@ -7238,7 +7456,7 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn | None -> languageFeatureNotSupportedInLibraryError LanguageFeature.StringInterpolation m // ... or if that fails then may be a PrintfFormat by a type-directed rule.... - elif not (isObjTy g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy then + elif not (isObjTyAnyNullness g overallTy.Commit) && AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy.Commit formatTy then // And if that succeeds, the printerTy and printerResultTy must be the same (there are no curried arguments) UnifyTypes cenv env m printerTy printerResultTy @@ -7308,8 +7526,7 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn if List.isEmpty synFillExprs then if isString then - let sb = System.Text.StringBuilder(printfFormatString).Replace("%%", "%") - let str = mkString g m (sb.ToString()) + let str = mkString g m (printfFormatString.Replace("%%", "%")) TcPropagatingExprLeafThenConvert cenv overallTy g.string_ty env (* true *) m (fun () -> str, tpenv ) @@ -7320,25 +7537,68 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn // Type check the expressions filling the holes let fillExprs, tpenv = TcExprsNoFlexes cenv env m tpenv argTys synFillExprs - let fillExprsBoxed = (argTys, fillExprs) ||> List.map2 (mkCallBox g m) + // Take all interpolated string parts and typed fill expressions + // and convert them to typed expressions that can be used as args to System.String.Concat + // return an empty list if there are some format specifiers that make lowering to not applicable + let rec concatenable acc fillExprs parts = + match fillExprs, parts with + | [], [] -> + List.rev acc + | [], SynInterpolatedStringPart.FillExpr _ :: _ + | _, [] -> + // This should never happen, there will always be as many typed fill expressions + // as there are FillExprs in the interpolated string parts + error(InternalError("Mismatch in interpolation expression count", m)) + | _, SynInterpolatedStringPart.String (WithTrailingStringSpecifierRemoved "", _) :: parts -> + // If the string is empty (after trimming %s of the end), we skip it + concatenable acc fillExprs parts + + | _, SynInterpolatedStringPart.String (WithTrailingStringSpecifierRemoved HasFormatSpecifier, _) :: _ + | _, SynInterpolatedStringPart.FillExpr (_, Some _) :: _ + | _, SynInterpolatedStringPart.FillExpr (SynExpr.Tuple (isStruct = false; exprs = [_; SynExpr.Const (SynConst.Int32 _, _)]), _) :: _ -> + // There was a format specifier like %20s{..} or {..,20} or {x:hh}, which means we cannot simply concat + [] - let argsExpr = mkArray (g.obj_ty, fillExprsBoxed, m) - let percentATysExpr = - if percentATys.Length = 0 then - mkNull m (mkArrayType g g.system_Type_ty) - else - let tyExprs = percentATys |> Array.map (mkCallTypeOf g m) |> Array.toList - mkArray (g.system_Type_ty, tyExprs, m) + | _, SynInterpolatedStringPart.String (s & WithTrailingStringSpecifierRemoved trimmed, m) :: parts -> + let finalStr = trimmed.Replace("%%", "%") + concatenable (mkString g (shiftEnd 0 (finalStr.Length - s.Length) m) finalStr :: acc) fillExprs parts - let fmtExpr = MakeMethInfoCall cenv.amap m newFormatMethod [] [mkString g m printfFormatString; argsExpr; percentATysExpr] None + | fillExpr :: fillExprs, SynInterpolatedStringPart.FillExpr _ :: parts -> + concatenable (fillExpr :: acc) fillExprs parts - if isString then - TcPropagatingExprLeafThenConvert cenv overallTy g.string_ty env (* true *) m (fun () -> - // Make the call to sprintf - mkCall_sprintf g m printerTy fmtExpr [], tpenv - ) - else - fmtExpr, tpenv + let canLower = + g.langVersion.SupportsFeature LanguageFeature.LowerInterpolatedStringToConcat + && isString + && argTys |> List.forall (isStringTy g) + + let concatenableExprs = if canLower then concatenable [] fillExprs parts else [] + + match concatenableExprs with + | [p1; p2; p3; p4] -> TcPropagatingExprLeafThenConvert cenv overallTy g.string_ty env m (fun () -> mkStaticCall_String_Concat4 g m p1 p2 p3 p4, tpenv) + | [p1; p2; p3] -> TcPropagatingExprLeafThenConvert cenv overallTy g.string_ty env m (fun () -> mkStaticCall_String_Concat3 g m p1 p2 p3, tpenv) + | [p1; p2] -> TcPropagatingExprLeafThenConvert cenv overallTy g.string_ty env m (fun () -> mkStaticCall_String_Concat2 g m p1 p2, tpenv) + | [p1] -> p1, tpenv + | _ -> + + let fillExprsBoxed = (argTys, fillExprs) ||> List.map2 (mkCallBox g m) + + let argsExpr = mkArray (g.obj_ty_withNulls, fillExprsBoxed, m) + let percentATysExpr = + if percentATys.Length = 0 then + mkNull m (mkArrayType g g.system_Type_ty) + else + let tyExprs = percentATys |> Array.map (mkCallTypeOf g m) |> Array.toList + mkArray (g.system_Type_ty, tyExprs, m) + + let fmtExpr = MakeMethInfoCall cenv.amap m newFormatMethod [] [mkString g m printfFormatString; argsExpr; percentATysExpr] None + + if isString then + TcPropagatingExprLeafThenConvert cenv overallTy g.string_ty env (* true *) m (fun () -> + // Make the call to sprintf + mkCall_sprintf g m printerTy fmtExpr [], tpenv + ) + else + fmtExpr, tpenv // The case for $"..." used as type FormattableString or IFormattable | Choice2Of2 createFormattableStringMethod -> @@ -7349,7 +7609,7 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn let fillExprsBoxed = (argTys, fillExprs) ||> List.map2 (mkCallBox g m) let dotnetFormatStringExpr = mkString g m dotnetFormatString - let argsExpr = mkArray (g.obj_ty, fillExprsBoxed, m) + let argsExpr = mkArray (g.obj_ty_withNulls, fillExprsBoxed, m) // FormattableString are *always* turned into FormattableStringFactory.Create calls, boxing each argument let createExpr, _ = BuildPossiblyConditionalMethodCall cenv env NeverMutates m false createFormattableStringMethod NormalValUse [] [dotnetFormatStringExpr; argsExpr] [] None @@ -7473,7 +7733,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m let _, fldId = fld match TryFindAnonRecdFieldOfType g overallTy fldId.idText with | Some item -> - CallNameResolutionSink cenv.tcSink (fldId.idRange, env.eNameResEnv, item, emptyTyparInst, ItemOccurence.UseInType, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (fldId.idRange, env.eNameResEnv, item, emptyTyparInst, ItemOccurrence.UseInType, env.eAccessRights) | None -> () let firstPartRange = withStartEnd mWholeExpr.Start (mkPos mWholeExpr.StartLine (mWholeExpr.StartColumn + 1)) mWholeExpr // Use the left { in the expression @@ -7491,7 +7751,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m | None -> [] | Some(tinst, tcref, _, fldsList) -> - let gtyp = mkAppTy tcref tinst + let gtyp = mkWoNullAppTy tcref tinst UnifyTypes cenv env mWholeExpr overallTy gtyp [ for n, v in fldsList do @@ -7552,10 +7812,10 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m | None -> expr expr, tpenv -and CheckAnonRecdExprDuplicateFields (elems: Ident array) = - elems |> Array.iteri (fun i (uc1: Ident) -> - elems |> Array.iteri (fun j (uc2: Ident) -> - if j > i && uc1.idText = uc2.idText then +and CheckAnonRecdExprDuplicateFields (elems: Ident array) = + elems |> Array.iteri (fun i (uc1: Ident) -> + elems |> Array.iteri (fun j (uc2: Ident) -> + if j > i && uc1.idText = uc2.idText then errorR(Error (FSComp.SR.tcAnonRecdDuplicateFieldId(uc1.idText), uc1.idRange)))) // Check '{| .... |}' @@ -7565,7 +7825,7 @@ and TcAnonRecdExpr cenv (overallTy: TType) env tpenv (isStruct, optOrigSynExpr, TcNewAnonRecdExpr cenv overallTy env tpenv (isStruct, unsortedFieldIdsAndSynExprsGiven, mWholeExpr) | Some orig -> - // Ideally we should also check for duplicate field IDs in the TcCopyAndUpdateAnonRecdExpr case, but currently the logic is too complex to garante a proper error reporting + // Ideally we should also check for duplicate field IDs in the TcCopyAndUpdateAnonRecdExpr case, but currently the logic is too complex to guarantee a proper error reporting // So here we error instead errorR to avoid cascading internal errors unsortedFieldIdsAndSynExprsGiven |> List.countBy (fun (fId, _, _) -> textOfLid fId.LongIdent) @@ -7597,7 +7857,7 @@ and TcNewAnonRecdExpr cenv (overallTy: TType) env tpenv (isStruct, unsortedField sortedFieldExprs |> List.iteri (fun j (synLongIdent, _, _) -> let m = rangeOfLid synLongIdent.LongIdent let item = Item.AnonRecdField(anonInfo, sortedFieldTys, j, m) - CallNameResolutionSink cenv.tcSink (m, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights)) + CallNameResolutionSink cenv.tcSink (m, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights)) let unsortedFieldTys = sortedFieldTys @@ -7691,7 +7951,7 @@ and TcCopyAndUpdateAnonRecdExpr cenv (overallTy: TType) env tpenv (isStruct, (or match expr with | Choice1Of2 _ -> let item = Item.AnonRecdField(anonInfo, sortedFieldTysAll, j, fieldId.idRange) - CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (fieldId.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights) | Choice2Of2 _ -> ()) let unsortedFieldTysAll = @@ -7836,7 +8096,7 @@ and TcForEachExpr cenv overallTy env tpenv (seqExprOnly, isFromSource, synPat, s let pat, _, vspecs, envinner, tpenv = let env = { env with eIsControlFlow = false } - TcMatchPattern cenv enumElemTy env tpenv synPat None + TcMatchPattern cenv enumElemTy env tpenv synPat None TcTrueMatchClause.No let elemVar, pat = // nice: don't introduce awful temporary for r.h.s. in the 99% case where we know what we're binding it to @@ -7857,7 +8117,7 @@ and TcForEachExpr cenv overallTy env tpenv (seqExprOnly, isFromSource, synPat, s let valsDefinedByMatching = ListSet.remove valEq elemVar vspecs CompilePatternForMatch cenv env synEnumExpr.Range pat.Range false IgnoreWithWarning (elemVar, [], None) - [MatchClause(pat, None, TTarget(valsDefinedByMatching, bodyExpr, None), mIn)] + [MatchClause(pat, None, TTarget(valsDefinedByMatching, bodyExpr, None), mIn)] enumElemTy overallTy.Commit @@ -7889,7 +8149,7 @@ and TcForEachExpr cenv overallTy env tpenv (seqExprOnly, isFromSource, synPat, s WhileLoopForCompiledForEachExprMarker, guardExpr, mkInvisibleLet mIn elemVar currentExpr bodyExpr, mFor), - BuildDisposableCleanup cenv env mWholeExpr enumeratorVar, + BuildDisposableCleanup cenv env mWholeExpr enumeratorVar, mFor, g.unit_ty, DebugPointAtTry.No, DebugPointAtFinally.No))) let overallExpr = overallExprFixup overallExpr @@ -7920,7 +8180,7 @@ and TcQuotationExpr cenv overallTy env tpenv (_oper, raw, ast, isFromQueryExpres // We serialize the quoted expression to bytes in IlxGen after type inference etc. is complete. expr, tpenv -/// When checking sequence of function applications, +/// When checking sequence of function applications, /// type applications and dot-notation projections, first extract known /// type information from the applications. /// @@ -7985,6 +8245,10 @@ and Propagate (cenv: cenv) (overallTy: OverallTy) (env: TcEnv) tpenv (expr: Appl // seq { ... } | SynExpr.ComputationExpr _ -> () + // async { } + // seq { } + | SynExpr.Record (None, None, [], _) when g.langVersion.SupportsFeature LanguageFeature.EmptyBodiedComputationExpressions -> () + // expr[idx] // expr[idx1, idx2] // expr[idx1..] @@ -7997,7 +8261,7 @@ and Propagate (cenv: cenv) (overallTy: OverallTy) (env: TcEnv) tpenv (expr: Appl () else // This is the error path. The error we give depends on what's enabled. - // + // // First, 'delayed' is about to be dropped on the floor, do rudimentary checking to get name resolutions in its body RecordNameAndTypeResolutionsDelayed cenv env tpenv delayed let vName = @@ -8009,15 +8273,15 @@ and Propagate (cenv: cenv) (overallTy: OverallTy) (env: TcEnv) tpenv (expr: Appl if g.langVersion.IsExplicitlySpecifiedAs50OrBefore() then error (NotAFunctionButIndexer(denv, overallTy.Commit, vName, mExpr, mArg, false)) match vName with - | Some nm -> + | Some nm -> error(Error(FSComp.SR.tcNotAFunctionButIndexerNamedIndexingNotYetEnabled(nm, nm), mExprAndArg)) - | _ -> + | _ -> error(Error(FSComp.SR.tcNotAFunctionButIndexerIndexingNotYetEnabled(), mExprAndArg)) else match vName with - | Some nm -> + | Some nm -> error(Error(FSComp.SR.tcNotAnIndexerNamedIndexingNotYetEnabled(nm), mExprAndArg)) - | _ -> + | _ -> error(Error(FSComp.SR.tcNotAnIndexerIndexingNotYetEnabled(), mExprAndArg)) else if IsIndexerType g cenv.amap expr.Type then @@ -8129,7 +8393,7 @@ and TcNameOfExpr (cenv: cenv) env tpenv (synArg: SynExpr) = // Nameof resolution resolves to a symbol and in general we make that the same symbol as // would resolve if the long ident was used as an expression at the given location. // - // So we first check if the first identifier resolves as an expression, if so commit and and resolve. + // So we first check if the first identifier resolves as an expression, if so commit and resolve. // // However we don't commit for a type names - nameof allows 'naked' type names and thus all type name // resolutions are checked separately in the next step. @@ -8141,8 +8405,11 @@ and TcNameOfExpr (cenv: cenv) env tpenv (synArg: SynExpr) = when (match item with | Item.DelegateCtor _ - | Item.CtorGroup _ - | Item.FakeInterfaceCtor _ -> false + | Item.CtorGroup _ -> false + | Item.Types _ when delayed.IsEmpty -> + match delayed with + | [] | [DelayedTypeApp _] -> false + | _ -> true | _ -> true) -> let overallTy = match overallTyOpt with None -> MustEqual (NewInferenceType g) | Some t -> t let _, _ = TcItemThen cenv overallTy env tpenv res None delayed @@ -8155,11 +8422,11 @@ and TcNameOfExpr (cenv: cenv) env tpenv (synArg: SynExpr) = let resolvedToTypeName = if (match delayed with [DelayedTypeApp _] | [] -> true | _ -> false) then let (TypeNameResolutionInfo(_, staticArgsInfo)) = GetLongIdentTypeNameInfo delayed - match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.UseInAttribute OpenQualified env.eNameResEnv ad longId staticArgsInfo PermitDirectReferenceToGeneratedType.No with - | Result (tinstEnclosing, tcref) when IsEntityAccessible cenv.amap m ad tcref -> + match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurrence.UseInAttribute OpenQualified env.eNameResEnv ad longId staticArgsInfo PermitDirectReferenceToGeneratedType.No with + | Result (tinstEnclosing, tcref, inst) when IsEntityAccessible cenv.amap m ad tcref -> match delayed with | [DelayedTypeApp (tyargs, _, mExprAndTypeArgs)] -> - TcTypeApp cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv mExprAndTypeArgs tcref tinstEnclosing tyargs |> ignore + TcTypeApp cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType env tpenv mExprAndTypeArgs tcref tinstEnclosing tyargs inst |> ignore | _ -> () true // resolved to a type name, done with checks | _ -> @@ -8182,7 +8449,7 @@ and TcNameOfExpr (cenv: cenv) env tpenv (synArg: SynExpr) = if resolvedToModuleOrNamespaceName then result else ForceRaise nameResolutionResult |> ignore - // If that didn't give aan exception then raise a generic error + // If that didn't give an exception then raise a generic error error (Error(FSComp.SR.expressionHasNoName(), m)) // expr allowed, even with qualifications @@ -8200,7 +8467,7 @@ and TcNameOfExpr (cenv: cenv) env tpenv (synArg: SynExpr) = // expr : type" allowed with no subsequent qualifications | SynExpr.Typed (synBodyExpr, synType, _) when delayed.IsEmpty && overallTyOpt.IsNone -> - let tgtTy, _tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv synType + let tgtTy, _tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv synType check (Some (MustEqual tgtTy)) resultOpt synBodyExpr delayed | _ -> @@ -8218,7 +8485,7 @@ and TcNameOfExprResult (cenv: cenv) (lastIdent: Ident) m = // TcApplicationThen: Typecheck "expr x" + projections //------------------------------------------------------------------------- -// leftExpr[idx] gives a warning +// leftExpr[idx] gives a warning and isAdjacentListExpr isSugar atomicFlag (synLeftExprOpt: SynExpr option) (synArg: SynExpr) = not isSugar && if atomicFlag = ExprAtomicFlag.Atomic then @@ -8228,11 +8495,11 @@ and isAdjacentListExpr isSugar atomicFlag (synLeftExprOpt: SynExpr option) (synA | _ -> false else match synLeftExprOpt with - | Some synLeftExpr -> + | Some synLeftExpr -> match synArg with | SynExpr.ArrayOrList (false, _, _) | SynExpr.ArrayOrListComputed (false, _, _) -> - synLeftExpr.Range.IsAdjacentTo synArg.Range + synLeftExpr.Range.IsAdjacentTo synArg.Range | _ -> false | _ -> false @@ -8246,12 +8513,22 @@ and TcApplicationThen (cenv: cenv) (overallTy: OverallTy) env tpenv mExprAndArg let mArg = synArg.Range let mLeftExpr = leftExpr.Range + /// Treat an application of a value to an empty record expression + /// as a computation expression with a single unit expression. + /// Insert a (), i.e., such that builder { } ≡ builder { () }. + /// This transformation is only valid for language + /// versions that support this feature. + let (|EmptyFieldListAsUnit|_|) recordFields = + match recordFields with + | [] when g.langVersion.SupportsFeature LanguageFeature.EmptyBodiedComputationExpressions -> Some (EmptyFieldListAsUnit (SynExpr.Const (SynConst.Unit, range0))) + | _ -> None + // If the type of 'synArg' unifies as a function type, then this is a function application, otherwise // it is an error or a computation expression or indexer or delegate invoke match UnifyFunctionTypeUndoIfFailed cenv denv mLeftExpr exprTy with | ValueSome (domainTy, resultTy) -> - // atomicLeftExpr[idx] unifying as application gives a warning + // atomicLeftExpr[idx] unifying as application gives a warning if not isSugar then checkHighPrecedenceFunctionApplicationToList g [synArg] atomicFlag mExprAndArg @@ -8267,53 +8544,67 @@ and TcApplicationThen (cenv: cenv) (overallTy: OverallTy) env tpenv mExprAndArg // though users don't realise that. let synArg = match synArg with - | SynExpr.ComputationExpr (false, comp, m) when + // seq { comp } + // seq { } + | SynExpr.ComputationExpr (false, comp, m) + | SynExpr.Record (None, None, EmptyFieldListAsUnit comp, m) when (match leftExpr with | ApplicableExpr(expr=Expr.Op(TOp.Coerce, _, [SeqExpr g], _)) -> true | _ -> false) -> SynExpr.ComputationExpr (true, comp, m) + | _ -> synArg - let arg, tpenv = + let (arg, tpenv), cenv = // treat left and right of '||' and '&&' as control flow, so for example // f expr1 && g expr2 // will have debug points on "f expr1" and "g expr2" - let env = + let env,cenv = match leftExpr with | ApplicableExpr(expr=Expr.Val (vref, _, _)) | ApplicableExpr(expr=Expr.App (Expr.Val (vref, _, _), _, _, [_], _)) when valRefEq g vref g.and_vref - || valRefEq g vref g.and2_vref + || valRefEq g vref g.and2_vref || valRefEq g vref g.or_vref || valRefEq g vref g.or2_vref -> - { env with eIsControlFlow = true } - | _ -> env - - TcExprFlex2 cenv domainTy env false tpenv synArg + { env with eIsControlFlow = true },cenv + | ApplicableExpr(expr=Expr.Val (valRef=vref)) + | ApplicableExpr(expr=Expr.App (funcExpr=Expr.Val (valRef=vref))) -> + match TryFindLocalizedFSharpStringAttribute g g.attrib_WarnOnWithoutNullArgumentAttribute vref.Attribs with + | Some _ as msg -> env,{ cenv with css.WarnWhenUsingWithoutNullOnAWithNullTarget = msg} + | None when cenv.css.WarnWhenUsingWithoutNullOnAWithNullTarget <> None -> + env, { cenv with css.WarnWhenUsingWithoutNullOnAWithNullTarget = None} + | None -> env,cenv + | _ -> env,cenv + + TcExprFlex2 cenv domainTy env false tpenv synArg, cenv let exprAndArg, resultTy = buildApp cenv leftExpr resultTy arg mExprAndArg TcDelayed cenv overallTy env tpenv mExprAndArg exprAndArg resultTy atomicFlag delayed | ValueNone -> - // Type-directed invokables + // Type-directed invocables match synArg with // leftExpr[idx] // leftExpr[idx] <- expr2 - | SynExpr.ArrayOrListComputed(false, IndexerArgs indexArgs, m) - when - isAdjacentListExpr isSugar atomicFlag synLeftExprOpt synArg && + | SynExpr.ArrayOrListComputed(false, IndexerArgs indexArgs, m) + when + isAdjacentListExpr isSugar atomicFlag synLeftExprOpt synArg && g.langVersion.SupportsFeature LanguageFeature.IndexerNotationWithoutDot -> let expandedIndexArgs = ExpandIndexArgs cenv synLeftExprOpt indexArgs - let setInfo, delayed = - match delayed with + let setInfo, delayed = + match delayed with | DelayedSet(expr3, _) :: rest -> Some (expr3, unionRanges leftExpr.Range synArg.Range), rest | _ -> None, delayed TcIndexingThen cenv env overallTy mExprAndArg m tpenv setInfo synLeftExprOpt leftExpr.Expr exprTy expandedIndexArgs indexArgs delayed - // Perhaps 'leftExpr' is a computation expression builder, and 'arg' is '{ ... }' - | SynExpr.ComputationExpr (false, comp, _m) -> + // Perhaps 'leftExpr' is a computation expression builder, and 'arg' is '{ ... }' or '{ }': + // leftExpr { comp } + // leftExpr { } + | SynExpr.ComputationExpr (false, comp, _m) + | SynExpr.Record (None, None, EmptyFieldListAsUnit comp, _m) -> let bodyOfCompExpr, tpenv = cenv.TcComputationExpression cenv env overallTy tpenv (mLeftExpr, leftExpr.Expr, exprTy, comp) TcDelayed cenv overallTy env tpenv mExprAndArg (MakeApplicableExprNoFlex cenv bodyOfCompExpr) (tyOfExpr g bodyOfCompExpr) ExprAtomicFlag.NonAtomic delayed @@ -8374,9 +8665,6 @@ and TcItemThen (cenv: cenv) (overallTy: OverallTy) env tpenv (tinstEnclosing, it | Item.CtorGroup(nm, minfos) -> TcCtorItemThen cenv overallTy env item nm minfos tinstEnclosing tpenv mItem afterResolution delayed - | Item.FakeInterfaceCtor _ -> - error(Error(FSComp.SR.tcInvalidUseOfInterfaceType(), mItem)) - | Item.ImplicitOp(id, sln) -> TcImplicitOpItemThen cenv overallTy env id sln tpenv mItem delayed @@ -8430,14 +8718,14 @@ and TcUnionCaseOrExnCaseOrActivePatternResultItemThen (cenv: cenv) overallTy env let ucaseAppTy = NewInferenceType g let mkConstrApp, argTys, argNames = match item with - | Item.ActivePatternResult(apinfo, _apOverallTy, n, _) -> + | Item.ActivePatternResult(apinfo, _apOverallTy, n, m) -> let aparity = apinfo.ActiveTags.Length match aparity with | 0 | 1 -> let mkConstrApp _mArgs = function [arg] -> arg | _ -> error(InternalError("ApplyUnionCaseOrExn", mItem)) mkConstrApp, [ucaseAppTy], [ for s, m in apinfo.ActiveTagsWithRanges -> mkSynId m s ] | _ -> - let ucref = mkChoiceCaseRef g mItem aparity n + let ucref = mkChoiceCaseRef g m aparity n let _, _, tinst, _ = FreshenTyconRef2 g mItem ucref.TyconRef let ucinfo = UnionCaseInfo (tinst, ucref) ApplyUnionCaseOrExnTypes mItem cenv env ucaseAppTy (Item.UnionCase(ucinfo, false)) @@ -8502,7 +8790,7 @@ and TcUnionCaseOrExnCaseOrActivePatternResultItemThen (cenv: cenv) overallTy env | Item.UnionCase (uci, _) -> Item.UnionCaseField (uci, i) | Item.ExnCase tref -> Item.RecdField (RecdFieldInfo ([], RecdFieldRef (tref, id.idText))) | _ -> failwithf "Expecting union case or exception item, got: %O" item - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, argItem, emptyTyparInst, ItemOccurence.Use, ad) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, argItem, emptyTyparInst, ItemOccurrence.Use, ad) else error(Error(FSComp.SR.tcUnionCaseFieldCannotBeUsedMoreThanOnce(id.idText), id.idRange)) currentIndex <- SEEN_NAMED_ARGUMENT | None -> @@ -8575,7 +8863,7 @@ and TcUnionCaseOrExnCaseOrActivePatternResultItemThen (cenv: cenv) overallTy env let argName = argNamesIfFeatureEnabled |> List.tryItem i |> Option.map (fun x -> x.idText) |> Option.defaultWith (fun () -> "arg" + string i) mkCompGenLocal mItem argName ty) |> List.unzip - + let constrApp = mkConstrApp mItem args let lam = mkMultiLambda mItem vs (constrApp, tyOfExpr g constrApp) lam) @@ -8592,20 +8880,20 @@ and TcTypeItemThen (cenv: cenv) overallTy env nm ty tpenv mItem tinstEnclosing d // If Item.Types is returned then the ty will be of the form TType_app(tcref, genericTyargs) where tyargs // is a fresh instantiation for tcref. TcNestedTypeApplication will chop off precisely #genericTyargs args // and replace them by 'tyargs' - let ty, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs ty tinstEnclosing tyargs + let ty, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs ty tinstEnclosing tyargs // Report information about the whole expression including type arguments to VS let item = Item.Types(nm, [ty]) - CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights) let typeNameResInfo = GetLongIdentTypeNameInfo otherDelayed let item, mItem, rest, afterResolution = ResolveExprDotLongIdentAndComputeRange cenv.tcSink cenv.nameResolver (unionRanges mExprAndTypeArgs mLongId) ad env.eNameResEnv ty longId typeNameResInfo IgnoreOverrides true None TcItemThen cenv overallTy env tpenv ((argsOfAppTy g ty), item, mItem, rest, afterResolution) None otherDelayed | DelayedTypeApp(tyargs, _mTypeArgs, mExprAndTypeArgs) :: _delayed' -> // A case where we have an incomplete name e.g. 'Foo.' - we still want to report it to VS! - let ty, _ = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs ty tinstEnclosing tyargs + let ty, _ = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs ty tinstEnclosing tyargs let item = Item.Types(nm, [ty]) - CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights) // Same error as in the following case error(Error(FSComp.SR.tcInvalidUseOfTypeName(), mItem)) @@ -8614,7 +8902,10 @@ and TcTypeItemThen (cenv: cenv) overallTy env nm ty tpenv mItem tinstEnclosing d // In this case the type is not generic, and indeed we should never have returned Item.Types. // That's because ResolveTypeNamesToCtors should have been set at the original // call to ResolveLongIdentAsExprAndComputeRange - error(Error(FSComp.SR.tcInvalidUseOfTypeName(), mItem)) + if isInterfaceTy g ty then + error(Error(FSComp.SR.tcInvalidUseOfInterfaceType(), mItem)) + else + error(Error(FSComp.SR.tcInvalidUseOfTypeName(), mItem)) and TcMethodItemThen (cenv: cenv) overallTy env item methodName minfos tpenv mItem afterResolution staticTyOpt delayed = let ad = env.eAccessRights @@ -8632,7 +8923,7 @@ and TcMethodItemThen (cenv: cenv) overallTy env item methodName minfos tpenv mIt // Replace the resolution including the static parameters, plus the extra information about the original method info let item = Item.MethodGroup(methodName, [minfoAfterStaticArguments], Some minfos[0]) - CallNameResolutionSinkReplacing cenv.tcSink (mItem, env.NameEnv, item, [], ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSinkReplacing cenv.tcSink (mItem, env.NameEnv, item, [], ItemOccurrence.Use, env.eAccessRights) match otherDelayed with | DelayedApp(atomicFlag, _, _, arg, mExprAndArg) :: otherDelayed -> @@ -8643,12 +8934,12 @@ and TcMethodItemThen (cenv: cenv) overallTy env item methodName minfos tpenv mIt | None -> #endif - let tyargs, tpenv = TcTypesOrMeasures None cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tys mTypeArgs + let tyargs, tpenv = TcTypesOrMeasures None cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType env tpenv tys mTypeArgs // FUTURE: can we do better than emptyTyparInst here, in order to display instantiations // of type variables in the quick info provided in the IDE? But note we haven't yet even checked if the // number of type arguments is correct... - CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights) match otherDelayed with | DelayedApp(atomicFlag, _, _, arg, mExprAndArg) :: otherDelayed -> @@ -8680,7 +8971,7 @@ and TcCtorItemThen (cenv: cenv) overallTy env item nm minfos tinstEnclosing tpen | DelayedTypeApp(tyargs, _mTypeArgs, mExprAndTypeArgs) :: DelayedApp(_, _, _, arg, mExprAndArg) :: otherDelayed -> - let objTyAfterTyArgs, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs objTy tinstEnclosing tyargs + let objTyAfterTyArgs, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs objTy tinstEnclosing tyargs CallExprHasTypeSink cenv.tcSink (mExprAndArg, env.NameEnv, objTyAfterTyArgs, env.eAccessRights) let itemAfterTyArgs, minfosAfterTyArgs = #if !NO_TYPEPROVIDERS @@ -8701,11 +8992,11 @@ and TcCtorItemThen (cenv: cenv) overallTy env item nm minfos tinstEnclosing tpen | DelayedTypeApp(tyargs, _mTypeArgs, mExprAndTypeArgs) :: otherDelayed -> - let objTy, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs objTy tinstEnclosing tyargs + let objTy, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv mExprAndTypeArgs objTy tinstEnclosing tyargs // A case where we have an incomplete name e.g. 'Foo.' - we still want to report it to VS! let resolvedItem = Item.Types(nm, [objTy]) - CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, resolvedItem, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, resolvedItem, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights) minfos |> List.iter (fun minfo -> UnifyTypes cenv env mExprAndTypeArgs minfo.ApparentEnclosingType objTy) TcCtorCall true cenv env tpenv overallTy objTy (Some mExprAndTypeArgs) item false [] mExprAndTypeArgs otherDelayed (Some afterResolution) @@ -8759,7 +9050,7 @@ and TcTraitItemThen (cenv: cenv) overallTy env objOpt traitInfo tpenv mItem dela applicableExpr, exprTy | _ -> let vs, ves = argTys |> List.mapi (fun i ty -> mkCompGenLocal mItem ("arg" + string i) ty) |> List.unzip - // Account for a unit mismtach in logical v. compiled arguments + // Account for a unit mismatch in logical v. compiled arguments let compiledArgExprs = match argTys, traitInfo.GetCompiledArgumentTypes() with | [_], [] -> [] @@ -8778,7 +9069,7 @@ and TcTraitItemThen (cenv: cenv) overallTy env objOpt traitInfo tpenv mItem dela // Check and apply the arguments let resExpr, tpenv = TcDelayed cenv overallTy env tpenv mItem applicableExpr exprTy ExprAtomicFlag.NonAtomic delayed - // Aply the wrapper to pre-evaluate the object if any + // Apply the wrapper to pre-evaluate the object if any wrapper resExpr, tpenv and TcImplicitOpItemThen (cenv: cenv) overallTy env id sln tpenv mItem delayed = @@ -8807,7 +9098,7 @@ and TcImplicitOpItemThen (cenv: cenv) overallTy env id sln tpenv mItem delayed = let memberFlags = StaticMemberFlags SynMemberKind.Member let logicalCompiledName = ComputeLogicalName id memberFlags - let traitInfo = TTrait(argTys, logicalCompiledName, memberFlags, argTys, Some retTy, sln) + let traitInfo = TTrait(argTys, logicalCompiledName, memberFlags, argTys, Some retTy, ref None, sln) let expr = Expr.Op (TOp.TraitCall traitInfo, [], ves, mItem) let expr = mkLambdas g mItem [] vs (expr, retTy) @@ -8912,11 +9203,11 @@ and TcDelegateCtorItemThen cenv overallTy env ty tinstEnclosing tpenv mItem dela | DelayedApp (atomicFlag, _, _, arg, mItemAndArg) :: otherDelayed -> TcNewDelegateThen cenv overallTy env tpenv mItem mItemAndArg ty arg atomicFlag otherDelayed | DelayedTypeApp(tyargs, _mTypeArgs, mItemAndTypeArgs) :: DelayedApp (atomicFlag, _, _, arg, mItemAndArg) :: otherDelayed -> - let ty, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv mItemAndTypeArgs ty tinstEnclosing tyargs + let ty, tpenv = TcNestedTypeApplication cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv mItemAndTypeArgs ty tinstEnclosing tyargs // Report information about the whole expression including type arguments to VS let item = Item.DelegateCtor ty - CallNameResolutionSink cenv.tcSink (mItemAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (mItemAndTypeArgs, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, env.eAccessRights) TcNewDelegateThen cenv overallTy env tpenv mItem mItemAndArg ty arg atomicFlag otherDelayed | _ -> error(Error(FSComp.SR.tcInvalidUseOfDelegate(), mItem)) @@ -8970,7 +9261,7 @@ and TcValueItemThen cenv overallTy env vref tpenv mItem afterResolution delayed | _ -> error (Error(FSComp.SR.expressionHasNoName(), mExprAndTypeArgs)) | _ -> - let checkTys tpenv kinds = TcTypesOrMeasures (Some kinds) cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tys mItem + let checkTys tpenv kinds = TcTypesOrMeasures (Some kinds) cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType env tpenv tys mItem let _, vExpr, isSpecial, _, _, tpenv = TcVal true cenv env tpenv vref (Some (NormalValUse, checkTys)) (Some afterResolution) mItem let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vExpr else MakeApplicableExprWithFlex cenv env vExpr) @@ -8994,7 +9285,7 @@ and TcValueItemThen cenv overallTy env vref tpenv mItem afterResolution delayed and TcPropertyItemThen cenv overallTy env nm pinfos tpenv mItem afterResolution staticTyOpt delayed = let g = cenv.g let ad = env.eAccessRights - + if isNil pinfos then error (InternalError ("Unexpected error: empty property list", mItem)) @@ -9007,7 +9298,7 @@ and TcPropertyItemThen cenv overallTy env nm pinfos tpenv mItem afterResolution GetMemberApplicationArgs delayed cenv env tpenv else ExprAtomicFlag.Atomic, None, [mkSynUnit mItem], delayed, tpenv - + if not pinfo.IsStatic then error (Error (FSComp.SR.tcPropertyIsNotStatic nm, mItem)) @@ -9140,7 +9431,7 @@ and TcMemberTyArgsOpt cenv env tpenv tyArgsOpt = match tyArgsOpt with | None -> None, tpenv | Some (tyargs, mTypeArgs) -> - let tyargsChecked, tpenv = TcTypesOrMeasures None cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tyargs mTypeArgs + let tyargsChecked, tpenv = TcTypesOrMeasures None cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType env tpenv tyargs mTypeArgs Some tyargsChecked, tpenv and GetMemberApplicationArgs delayed cenv env tpenv = @@ -9154,15 +9445,18 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela let objArgs = [objExpr] - // 'base' calls use a different resolution strategy when finding methods. let findFlag = - let baseCall = IsBaseCall objArgs - (if baseCall then PreferOverrides else IgnoreOverrides) + // 'base' calls use a different resolution strategy when finding methods + // nullness checks need the overrides, since those can change nullable semantics (e.g. ToString from BCL) + if (g.checkNullness && g.langFeatureNullness) || IsBaseCall objArgs then + PreferOverrides + else + IgnoreOverrides // Canonicalize inference problem prior to '.' lookup on variable types if isTyparTy g objExprTy then CanonicalizePartialInferenceProblem cenv.css env.DisplayEnv mExprAndLongId (freeInTypeLeftToRight g false objExprTy) - + let maybeAppliedArgExpr = DelayedItem.maybeAppliedArgForPreferExtensionOverProperty delayed let item, mItem, rest, afterResolution = ResolveExprDotLongIdentAndComputeRange cenv.tcSink cenv.nameResolver mExprAndLongId ad env.NameEnv objExprTy longId TypeNameResolutionInfo.Default findFlag false maybeAppliedArgExpr TcLookupItemThen cenv overallTy env tpenv mObjExpr objExpr objExprTy delayed item mItem rest afterResolution @@ -9191,7 +9485,7 @@ and TcLookupItemThen cenv overallTy env tpenv mObjExpr objExpr objExprTy delayed | Some minfoAfterStaticArguments -> // Replace the resolution including the static parameters, plus the extra information about the original method info let item = Item.MethodGroup(methodName, [minfoAfterStaticArguments], Some minfos[0]) - CallNameResolutionSinkReplacing cenv.tcSink (mExprAndItem, env.NameEnv, item, [], ItemOccurence.Use, env.eAccessRights) + CallNameResolutionSinkReplacing cenv.tcSink (mExprAndItem, env.NameEnv, item, [], ItemOccurrence.Use, env.eAccessRights) TcMethodApplicationThen cenv env overallTy None tpenv None objArgs mExprAndItem mItem methodName ad mutates false [(minfoAfterStaticArguments, None)] afterResolution NormalValUse args atomicFlag None delayed | None -> @@ -9305,8 +9599,17 @@ and TcLookupItemThen cenv overallTy env tpenv mObjExpr objExpr objExprTy delayed | Item.Trait traitInfo -> TcTraitItemThen cenv overallTy env (Some objExpr) traitInfo tpenv mItem delayed - | Item.FakeInterfaceCtor _ | Item.DelegateCtor _ -> error (Error (FSComp.SR.tcConstructorsCannotBeFirstClassValues(), mItem)) + | Item.DelegateCtor _ -> error (Error (FSComp.SR.tcConstructorsCannotBeFirstClassValues(), mItem)) + | Item.UnionCase(info, _) -> + let clashingNames = info.Tycon.MembersOfFSharpTyconSorted |> List.tryFind(fun mem -> mem.DisplayNameCore = info.DisplayNameCore) + match clashingNames with + | None -> () + | Some value -> + let kind = if value.IsMember then "member" else "value" + errorR (NameClash(info.DisplayNameCore, kind, info.DisplayNameCore, value.Range, FSComp.SR.typeInfoUnionCase(), info.DisplayNameCore, value.Range)) + + error (Error (FSComp.SR.tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields(), mItem)) // These items are not expected here - they can't be the result of a instance member dot-lookup "expr.Ident" | Item.ActivePatternResult _ | Item.CustomOperation _ @@ -9316,7 +9619,6 @@ and TcLookupItemThen cenv overallTy env tpenv mObjExpr objExpr objExprTy delayed | Item.ModuleOrNamespaces _ | Item.TypeVar _ | Item.Types _ - | Item.UnionCase _ | Item.UnionCaseField _ | Item.UnqualifiedType _ | Item.Value _ @@ -9340,13 +9642,14 @@ and TcEventItemThen (cenv: cenv) overallTy env tpenv mItem mExprAndItem objDetai | None, false -> error (Error (FSComp.SR.tcEventIsNotStatic nm, mItem)) | _ -> () - let delTy = einfo.GetDelegateType(cenv.amap, mItem) + // The F# wrappers around events are null safe (impl is in FSharp.Core). Therefore, from an F# perspective, the type of the delegate can be considered Not Null. + let delTy = einfo.GetDelegateType(cenv.amap, mItem) |> replaceNullnessOfTy KnownWithoutNull let (SigOfFunctionForDelegate(delInvokeMeth, delArgTys, _, _)) = GetSigOfFunctionForDelegate cenv.infoReader delTy mItem ad let objArgs = Option.toList (Option.map fst objDetails) MethInfoChecks g cenv.amap true None objArgs env.eAccessRights mItem delInvokeMeth - + CheckILEventAttributes g einfo.DeclaringTyconRef (einfo.GetCustomAttrs()) mItem |> CommitOperationResult - + // This checks for and drops the 'object' sender let argsTy = ArgsTypeOfEventInfo cenv.infoReader mItem ad einfo if not (slotSigHasVoidReturnTy (delInvokeMeth.GetSlotSig(cenv.amap, mItem))) then errorR (nonStandardEventError einfo.EventName mItem) @@ -9369,7 +9672,7 @@ and TcEventItemThen (cenv: cenv) overallTy env tpenv mItem mExprAndItem objDetai (let dv, de = mkCompGenLocal mItem "eventDelegate" delTy let callExpr, _ = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates mItem false einfo.RemoveMethod NormalValUse [] objVars [de] None mkLambda mItem dv (callExpr, g.unit_ty)) - (let fvty = mkFunTy g g.obj_ty (mkFunTy g argsTy g.unit_ty) + (let fvty = mkFunTy g g.obj_ty_withNulls (mkFunTy g argsTy g.unit_ty) let fv, fe = mkCompGenLocal mItem "callback" fvty let createExpr = BuildNewDelegateExpr (Some einfo, g, cenv.amap, delTy, delInvokeMeth, delArgTys, fe, fvty, mItem) mkLambda mItem fv (createExpr, delTy))) @@ -9436,22 +9739,36 @@ and TcMethodApplicationThen PropagateThenTcDelayed cenv overallTy env tpenv mWholeExpr (MakeApplicableExprNoFlex cenv expr) exprTy atomicFlag delayed /// Infer initial type information at the callsite from the syntax of an argument, prior to overload resolution. -and GetNewInferenceTypeForMethodArg (cenv: cenv) env tpenv x = +and GetNewInferenceTypeForMethodArg (cenv: cenv) x = let g = cenv.g - match x with - | SynExprParen(a, _, _, _) -> - GetNewInferenceTypeForMethodArg cenv env tpenv a - | SynExpr.AddressOf (true, a, _, m) -> - mkByrefTyWithInference g (GetNewInferenceTypeForMethodArg cenv env tpenv a) (NewByRefKindInferenceType g m) - | SynExpr.Lambda (body = a) - | SynExpr.DotLambda (expr = a) -> - mkFunTy g (NewInferenceType g) (GetNewInferenceTypeForMethodArg cenv env tpenv a) - | SynExpr.Quote (_, raw, a, _, _) -> - if raw then mkRawQuotedExprTy g - else mkQuotedExprTy g (GetNewInferenceTypeForMethodArg cenv env tpenv a) - | _ -> NewInferenceType g + let rec loopExpr expr cont : struct (_ * _) = + match expr with + | SynExprParen (a, _, _, _) -> + loopExpr a cont + | SynExpr.AddressOf (true, a, _, m) -> + loopExpr a (cont << fun struct (depth, ty) -> depth + 1, mkByrefTyWithInference g ty (NewByRefKindInferenceType g m)) + | SynExpr.Lambda (body = a) + | SynExpr.DotLambda (expr = a) -> + loopExpr a (cont << fun struct (depth, ty) -> depth + 1, mkFunTy g (NewInferenceType g) ty) + | SynExpr.MatchLambda (matchClauses = SynMatchClause (resultExpr = a) :: clauses) -> + let loopClause a = loopExpr a (cont << fun struct (depth, ty) -> depth + 1, mkFunTy g (NewInferenceType g) ty) + + // Look at all branches, keeping the one + // that gives us the most syntactic information. + (loopClause a, clauses) + ||> List.fold (fun ((maxClauseDepth, _) as acc) (SynMatchClause (resultExpr = a)) -> + match loopClause a with + | clauseDepth, ty when clauseDepth > maxClauseDepth -> clauseDepth, ty + | _ -> acc) + | SynExpr.Quote (_, raw, a, _, _) -> + if raw then cont (0, mkRawQuotedExprTy g) + else loopExpr a (cont << fun struct (depth, ty) -> depth + 1, mkQuotedExprTy g ty) + | _ -> cont (0, NewInferenceType g) + + let struct (_depth, ty) = loopExpr x id + ty and CalledMethHasSingleArgumentGroupOfThisLength n (calledMeth: MethInfo) = match calledMeth.NumArgs with @@ -9487,7 +9804,7 @@ and UnifyMatchingSimpleArgumentTypes (cenv: cenv) (env: TcEnv) exprTy (calledMet and TcMethodApplication_SplitSynArguments (cenv: cenv) (env: TcEnv) - tpenv + _tpenv isProp (candidates: MethInfo list) (exprTy: OverallTy) @@ -9515,7 +9832,7 @@ and TcMethodApplication_SplitSynArguments else unnamedCurriedCallerArgs, namedCurriedCallerArgs - let MakeUnnamedCallerArgInfo x = (x, GetNewInferenceTypeForMethodArg cenv env tpenv x, x.Range) + let MakeUnnamedCallerArgInfo x = (x, GetNewInferenceTypeForMethodArg cenv x, x.Range) let singleMethodCurriedArgs = match candidates with @@ -9554,7 +9871,7 @@ and TcMethodApplication_SplitSynArguments | _ -> let unnamedCurriedCallerArgs = unnamedCurriedCallerArgs |> List.mapSquared MakeUnnamedCallerArgInfo let namedCurriedCallerArgs = namedCurriedCallerArgs |> List.mapSquared (fun (isOpt, nm, x) -> - let ty = GetNewInferenceTypeForMethodArg cenv env tpenv x + let ty = GetNewInferenceTypeForMethodArg cenv x // #435263: compiler crash with .net optional parameters and F# optional syntax // named optional arguments should always have option type // STRUCT OPTIONS: if we allow struct options as optional arguments then we should relax this and rely @@ -9609,7 +9926,7 @@ and TcMethodApplication_UniqueOverloadInference // "type directed" rule for first-class uses of ambiguous methods. // By context we know a type for the input argument. If it's a tuple - // this gives us the a potential number of arguments expected. Indeed even if it's a variable + // this gives us the potential number of arguments expected. Indeed even if it's a variable // type we assume the number of arguments is just "1". | None, _ -> @@ -9666,7 +9983,7 @@ and TcMethodApplication_CheckArguments callerObjArgTys ad mMethExpr - mItem + mItem tpenv = let g = cenv.g @@ -9707,7 +10024,7 @@ and TcMethodApplication_CheckArguments |> List.mapiSquared (fun i j ty -> let argName = curriedArgNamesIfFeatureEnabled |> List.tryItem i |> Option.bind (List.tryItem j) |> Option.flatten |> Option.defaultWith (fun () -> "arg" + string i + string j) mkCompGenLocal mMethExpr argName ty) - + let unnamedCurriedCallerArgs = lambdaVarsAndExprs |> List.mapSquared (fun (_, e) -> CallerArg(tyOfExpr g e, e.Range, false, e)) let namedCurriedCallerArgs = lambdaVarsAndExprs |> List.map (fun _ -> []) let lambdaVars = List.mapSquared fst lambdaVarsAndExprs @@ -9726,7 +10043,7 @@ and TcMethodApplication_CheckArguments match ExamineMethodForLambdaPropagation g mMethExpr meth ad with | Some (unnamedInfo, namedInfo) -> let calledObjArgTys = meth.CalledObjArgTys mMethExpr - if (calledObjArgTys, callerObjArgTys) ||> Seq.forall2 (fun calledTy callerTy -> + if (calledObjArgTys, callerObjArgTys) ||> Seq.forall2 (fun calledTy callerTy -> let noEagerConstraintApplication = MethInfoHasAttribute g mMethExpr g.attrib_NoEagerConstraintApplicationAttribute meth.Method // The logic associated with NoEagerConstraintApplicationAttribute is part of the @@ -9756,7 +10073,7 @@ and TcAdhocChecksOnLibraryMethods (cenv: cenv) (env: TcEnv) isInstance (finalCal if (isInstance && finalCalledMethInfo.IsInstance && - typeEquiv g finalCalledMethInfo.ApparentEnclosingType g.obj_ty && + typeEquiv g finalCalledMethInfo.ApparentEnclosingType g.obj_ty_ambivalent && (finalCalledMethInfo.LogicalName = "GetHashCode" || finalCalledMethInfo.LogicalName = "Equals")) then for objArg in objArgs do @@ -9881,7 +10198,7 @@ and TcMethodApplication let overriding = match unrefinedItem with - | Item.MethodGroup(_, overridenMeths, _) -> overridenMeths |> List.map (fun minfo -> minfo, None) + | Item.MethodGroup(_, overriddenMeths, _) -> overriddenMeths |> List.map (fun minfo -> minfo, None) | Item.Property(info = pinfos) -> if result.Method.LogicalName.StartsWithOrdinal("set_") then SettersOfPropInfos pinfos @@ -9952,7 +10269,7 @@ and TcMethodApplication | None -> id.idRange let container = ArgumentContainer.Method finalCalledMethInfo let item = Item.OtherName (idOpt, assignedArg.CalledArg.CalledArgumentType, None, Some container, m) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, ad)) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ad)) /// STEP 6. Build the call expression, then adjust for byref-returns, out-parameters-as-tuples, post-hoc property assignments, methods-as-first-class-value, @@ -9986,7 +10303,6 @@ and TcMethodApplication // Handle post-hoc property assignments let setterExprPrebinders, callExpr2b = let expr = callExpr2 - CheckRequiredProperties g env cenv finalCalledMethInfo finalAssignedItemSetters mMethExpr if isCheckingAttributeCall then @@ -10061,6 +10377,8 @@ and TcSetterArgExpr (cenv: cenv) env denv objExpr ad assignedSetter calledFromCo match setter with | AssignedPropSetter (propStaticTyOpt, pinfo, pminfo, pminst) -> + CheckPropInfoAttributes pinfo id.idRange |> CommitOperationResult + if g.langVersion.SupportsFeature(LanguageFeature.RequiredPropertiesSupport) && pinfo.IsSetterInitOnly && not calledFromConstructor then errorR (Error (FSComp.SR.tcInitOnlyPropertyCannotBeSet1 pinfo.PropertyName, m)) @@ -10092,7 +10410,7 @@ and TcSetterArgExpr (cenv: cenv) env denv objExpr ad assignedSetter calledFromCo // Record the resolution for the Language Service let item = Item.SetterArg (id, defnItem) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, ad) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Use, ad) argExprPrebinder, action, m @@ -10174,9 +10492,9 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfoFo yield info | CalledArgMatchesType (adjustedCalledArgTy, noEagerConstraintApplication) -> // If matching, we can solve 'tp1 --> tp2' but we can't transfer extra - // constraints from tp1 to tp2. + // constraints from tp1 to tp2. // - // The 'task' feature requires this fix to SRTP resolution. + // The 'task' feature requires this fix to SRTP resolution. let extraRigidTps = if noEagerConstraintApplication then Zset.ofList typarOrder (freeInTypeLeftToRight g true callerArgTy) else emptyFreeTypars if AddCxTypeMustSubsumeTypeMatchingOnlyUndoIfFailed env.DisplayEnv cenv.css mArg extraRigidTps adjustedCalledArgTy callerArgTy then yield info |] @@ -10236,7 +10554,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr synExpr cont = let g = cenv.g match synExpr with - | SynExpr.Sequential (sp, true, expr1, expr2, m) when not isCompExpr -> + | SynExpr.Sequential (sp, true, expr1, expr2, m, _) when not isCompExpr -> let expr1R, _ = let env1 = { env with eIsControlFlow = (match sp with | DebugPointAtSequential.SuppressNeither | DebugPointAtSequential.SuppressExpr -> true | _ -> false) } TcStmtThatCantBeCtorBody cenv env1 tpenv expr1 @@ -10309,10 +10627,15 @@ and TcAndPatternCompileMatchClauses mExpr mMatch actionOnFailure cenv inputExprO let matchVal, expr = CompilePatternForMatchClauses cenv env mExpr mMatch true actionOnFailure inputExprOpt inputTy resultTy.Commit clauses matchVal, expr, tpenv -and TcMatchPattern cenv inputTy env tpenv (synPat: SynPat) (synWhenExprOpt: SynExpr option) = +and TcMatchPattern (cenv: cenv) inputTy env tpenv (synPat: SynPat) (synWhenExprOpt: SynExpr option) (tcTrueMatchClause: TcTrueMatchClause) = let g = cenv.g let m = synPat.Range - let patf', (TcPatLinearEnv (tpenv, names, _)) = cenv.TcPat WarnOnUpperCase cenv env None (TcPatValFlags (ValInline.Optional, permitInferTypars, noArgOrRetAttribs, false, None, false)) (TcPatLinearEnv (tpenv, Map.empty, Set.empty)) inputTy synPat + let warnOnUpperFlag = + match tcTrueMatchClause with + | TcTrueMatchClause.Yes -> WarnOnUpperUnionCaseLabel + | TcTrueMatchClause.No -> WarnOnUpperVariablePatterns + + let patf', (TcPatLinearEnv (tpenv, names, _)) = cenv.TcPat warnOnUpperFlag cenv env None (TcPatValFlags (ValInline.Optional, permitInferTypars, noArgOrRetAttribs, false, None, false)) (TcPatLinearEnv (tpenv, Map.empty, Set.empty)) inputTy synPat let envinner, values, vspecMap = MakeAndPublishSimpleValsForMergedScope cenv env m names let whenExprOpt, tpenv = @@ -10328,11 +10651,20 @@ and TcMatchPattern cenv inputTy env tpenv (synPat: SynPat) (synWhenExprOpt: SynE and TcMatchClauses cenv inputTy (resultTy: OverallTy) env tpenv clauses = let mutable first = true let isFirst() = if first then first <- false; true else false - List.mapFold (fun clause -> TcMatchClause cenv inputTy resultTy env (isFirst()) clause) tpenv clauses + let resultList,(tpEnv,_input) = + List.mapFold (fun (unscopedTyParEnv,inputTy) -> TcMatchClause cenv inputTy resultTy env (isFirst()) unscopedTyParEnv) (tpenv,inputTy) clauses + resultList,tpEnv and TcMatchClause cenv inputTy (resultTy: OverallTy) env isFirst tpenv synMatchClause = - let (SynMatchClause(synPat, synWhenExprOpt, synResultExpr, patm, spTgt, _)) = synMatchClause - let pat, whenExprOpt, vspecs, envinner, tpenv = TcMatchPattern cenv inputTy env tpenv synPat synWhenExprOpt + let (SynMatchClause(synPat, synWhenExprOpt, synResultExpr, patm, spTgt, trivia)) = synMatchClause + + let isTrueMatchClause = + if synMatchClause.IsTrueMatchClause then + TcTrueMatchClause.Yes + else + TcTrueMatchClause.No + + let pat, whenExprOpt, vspecs, envinner, tpenv = TcMatchPattern cenv inputTy env tpenv synPat synWhenExprOpt isTrueMatchClause let resultEnv = if isFirst then envinner @@ -10346,8 +10678,37 @@ and TcMatchClause cenv inputTy (resultTy: OverallTy) env isFirst tpenv synMatchC let resultExpr, tpenv = TcExprThatCanBeCtorBody cenv resultTy resultEnv tpenv synResultExpr let target = TTarget(vspecs, resultExpr, None) - - MatchClause(pat, whenExprOpt, target, patm), tpenv + + let inputTypeForNextPatterns= + let removeNull t = + let stripped = stripTyEqns cenv.g t + replaceNullnessOfTy KnownWithoutNull stripped + let rec isWild (p:Pattern) = + match p with + | TPat_wild _ -> true + | TPat_as (p,_,_) -> isWild p + | TPat_disjs(patterns,_) -> patterns |> List.exists isWild + | TPat_conjs(patterns,_) -> patterns |> List.forall isWild + | TPat_tuple (_,pats,_,_) -> pats |> List.forall isWild + | _ -> false + + let rec eliminateNull (ty:TType) (p:Pattern) = + match p with + | TPat_null _ -> removeNull ty + | TPat_as (p,_,_) -> eliminateNull ty p + | TPat_disjs(patterns,_) -> (ty,patterns) ||> List.fold eliminateNull + | TPat_tuple (_,pats,_,_) -> + match stripTyparEqns ty with + // In a tuple of size N, if 1 elem is matched for null and N-1 are wild => subsequent clauses can strip nullness + | TType_tuple(ti,tys) when tys.Length = pats.Length && (pats |> List.count (isWild >> not)) = 1 -> + TType_tuple(ti, List.map2 eliminateNull tys pats) + | _ -> ty + | _ -> ty + match whenExprOpt with + | None -> eliminateNull inputTy pat + | _ -> inputTy + + MatchClause(pat, whenExprOpt, target, patm), (tpenv,inputTypeForNextPatterns) and TcStaticOptimizationConstraint cenv env tpenv c = let g = cenv.g @@ -10356,7 +10717,7 @@ and TcStaticOptimizationConstraint cenv env tpenv c = | SynStaticOptimizationConstraint.WhenTyparTyconEqualsTycon(tp, ty, m) -> if not g.compilingFSharpCore then errorR(Error(FSComp.SR.tcStaticOptimizationConditionalsOnlyForFSharpLibrary(), m)) - let tyR, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv ty + let tyR, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv ty let tpR, tpenv = TcTypar cenv env NewTyparsOK tpenv tp TTyconEqualsTycon(mkTyparTy tpR, tyR), tpenv | SynStaticOptimizationConstraint.WhenTyparIsStruct(tp, m) -> @@ -10384,22 +10745,22 @@ and TcAndBuildFixedExpr (cenv: cenv) env (overallPatTy, fixedExpr, overallExprTy | [[]], retTy when isByrefTy g retTy && mInfo.IsInstance -> true | _ -> false ) - + match getPinnableReferenceMInfo with | Some mInfo -> checkLanguageFeatureAndRecover g.langVersion LanguageFeature.ExtendedFixedBindings mBinding - + let mInst = FreshenMethInfo mBinding mInfo let pinnableReference, actualRetTy = BuildPossiblyConditionalMethodCall cenv env NeverMutates mBinding false mInfo NormalValUse mInst [ fixedExpr ] [] None - + let elemTy = destByrefTy g actualRetTy UnifyTypes cenv env mBinding (mkNativePtrTy g elemTy) overallPatTy - + // For value types: // let ptr: nativeptr = // let pinned x = &(expr: 'a).GetPinnableReference() // (nativeint) x - + // For reference types: // let ptr: nativeptr = // if isNull expr then @@ -10407,12 +10768,12 @@ and TcAndBuildFixedExpr (cenv: cenv) env (overallPatTy, fixedExpr, overallExprTy // else // let pinned x = &(expr: 'a).GetPinnableReference() // (nativeint) x - + let pinnedBinding = mkCompGenLetIn mBinding "pinnedByref" actualRetTy pinnableReference (fun (v, ve) -> v.SetIsFixed() mkConvToNativeInt g ve mBinding) - + if isStructTy g overallExprTy then Some pinnedBinding else @@ -10437,7 +10798,7 @@ and TcAndBuildFixedExpr (cenv: cenv) env (overallPatTy, fixedExpr, overallExprTy | TOp.RefAddrGet _, _, _ -> true | _ -> false | _ -> false - + if not okByRef then errorR (languageFeatureError g.langVersion LanguageFeature.ExtendedFixedBindings mBinding) @@ -10453,7 +10814,7 @@ and TcAndBuildFixedExpr (cenv: cenv) env (overallPatTy, fixedExpr, overallExprTy tryBuildGetPinnableReferenceCall () else None - + match getPinnableRefCall with | Some expr -> expr | None -> @@ -10517,8 +10878,14 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt let envinner = AddDeclaredTypars NoCheckForDuplicateTypars (enclosingDeclaredTypars@declaredTypars) env match bind with - | NormalizedBinding(vis, kind, isInline, isMutable, attrs, xmlDoc, _, valSynData, pat, NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr), mBinding, debugPoint) -> + | NormalizedBinding(vis, kind, isInline, isMutable, attrs, xmlDoc, _, valSynData, pat, NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr), _, debugPoint) -> let (SynValData(memberFlags = memberFlagsOpt)) = valSynData + let mBinding = pat.Range + + let isClassLetBinding = + match declKind, kind with + | ClassLetBinding _, SynBindingKind.Normal -> true + | _ -> false let callerName = match declKind, kind, pat with @@ -10537,13 +10904,20 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt | ModuleOrMemberBinding, SynBindingKind.StandaloneExpression, _ -> Some(".cctor") | _, _, _ -> envinner.eCallerMemberName - let envinner = {envinner with eCallerMemberName = callerName } - + let envinner = { envinner with eCallerMemberName = callerName } let attrTgt = declKind.AllowedAttribTargets memberFlagsOpt let isFixed, rhsExpr, overallPatTy, overallExprTy = match rhsExpr with | SynExpr.Fixed (e, _) -> true, e, NewInferenceType g, overallTy + // { new Foo() } is parsed as a SynExpr.ComputationExpr.(See pars.fsy `objExpr` rule). + // If a SynExpr.ComputationExpr body consists of a single SynExpr.New, and it's not the argument of a computation expression builder type. + // Then we should treat it as a SynExpr.ObjExpr and make it consistent with the other object expressions. e.g. + // { new Foo } -> SynExpr.ObjExpr + // { new Foo() } -> SynExpr.ObjExpr + // { New Foo with ... } -> SynExpr.ObjExpr + | SynExpr.ComputationExpr(false, SynExpr.New(_, targetType, expr, m), _) -> + false, SynExpr.ObjExpr(targetType, Some(expr, None), None, [], [], [], m, rhsExpr.Range), overallTy, overallTy | e -> false, e, overallTy, overallTy // Check the attributes of the binding, parameters or return value @@ -10551,9 +10925,11 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt // For all but attributes positioned at the return value, disallow implicitly // targeting the return value. let tgtEx = if isRet then enum 0 else AttributeTargets.ReturnValue - let attrs, _ = TcAttributesMaybeFailEx false cenv envinner tgt tgtEx attrs + let attrs, _ = TcAttributesMaybeFailEx TcCanFail.ReportAllErrors cenv envinner tgt tgtEx attrs + let attrs: Attrib list = attrs if attrTgt = enum 0 && not (isNil attrs) then - errorR(Error(FSComp.SR.tcAttributesAreNotPermittedOnLetBindings(), mBinding)) + for attr in attrs do + errorR(Error(FSComp.SR.tcAttributesAreNotPermittedOnLetBindings(), attr.Range)) attrs // Rotate [] from binding to return value @@ -10580,10 +10956,10 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt SynValData(valMf, SynValInfo(args, SynArgInfo({Attributes=rotRetSynAttrs; Range=mHead} :: attrs, opt, retId)), valId) retAttribs, valAttribs, valSynData - let isVolatile = HasFSharpAttribute g g.attrib_VolatileFieldAttribute valAttribs + let isVolatile = HasFSharpAttribute g g.attrib_VolatileFieldAttribute valAttribs let inlineFlag = ComputeInlineFlag memberFlagsOpt isInline isMutable g valAttribs mBinding - let argAttribs = + let argAttribs = spatsL |> List.map (SynInfo.InferSynArgInfoFromSimplePats >> List.map (SynInfo.AttribsOfArgData >> TcAttrs AttributeTargets.Parameter false)) // Assert the return type of an active pattern. A [] attribute may be used on a partial active pattern. @@ -10595,16 +10971,16 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt // always be used for empty branches of if/then/else and others let isZeroMethod = match declKind, pat with - | ModuleOrMemberBinding, SynPat.Named(SynIdent(id,_), _, _, _) when id.idText = "Zero" -> + | ModuleOrMemberBinding, SynPat.Named(SynIdent(id,_), _, _, _) when id.idText = "Zero" -> match memberFlagsOpt with | Some memberFlags -> match memberFlags.MemberKind with | SynMemberKind.Member -> true | _ -> false - | _ -> false + | _ -> false | _ -> false - if HasFSharpAttribute g g.attrib_DefaultValueAttribute valAttribs && not isZeroMethod then + if HasFSharpAttribute g g.attrib_DefaultValueAttribute valAttribs && not isZeroMethod then errorR(Error(FSComp.SR.tcDefaultValueAttributeRequiresVal(), mBinding)) let isThreadStatic = isThreadOrContextStatic g valAttribs @@ -10673,12 +11049,16 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt let envinner = match apinfoOpt with | Some (apinfo, apOverallTy, m) -> - if Option.isSome memberFlagsOpt || (not apinfo.IsTotal && apinfo.ActiveTags.Length > 1) then - error(Error(FSComp.SR.tcInvalidActivePatternName(), mBinding)) + let isMultiCasePartialAP = memberFlagsOpt.IsNone && not apinfo.IsTotal && apinfo.ActiveTags.Length > 1 + if isMultiCasePartialAP then + errorR(Error(FSComp.SR.tcPartialActivePattern(), m)) + + if Option.isSome memberFlagsOpt && not spatsL.IsEmpty then + errorR(Error(FSComp.SR.tcInvalidActivePatternName(apinfo.LogicalName), m)) apinfo.ActiveTagsWithRanges |> List.iteri (fun i (_tag, tagRange) -> let item = Item.ActivePatternResult(apinfo, apOverallTy, i, tagRange) - CallNameResolutionSink cenv.tcSink (tagRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights)) + CallNameResolutionSink cenv.tcSink (tagRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights)) { envinner with eNameResEnv = AddActivePatternResultTagsToNameEnv apinfo envinner.eNameResEnv apOverallTy m } | None -> @@ -10704,7 +11084,7 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt // The right-hand-side is control flow (has an implicit debug point) in any situation where we // haven't extended the debug point to include the 'let', that is, there is a debug point noted - // at the binding. + // at the binding. // // This includes // let _ = expr @@ -10712,7 +11092,7 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt // which are transformed to sequential expressions in TcLetBinding // let rhsIsControlFlow = - match pat with + match pat with | SynPat.Wild _ | SynPat.Const (SynConst.Unit, _) | SynPat.Paren (SynPat.Const (SynConst.Unit, _), _) -> true @@ -10720,7 +11100,7 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt match debugPoint with | DebugPointAtBinding.Yes _ -> false | _ -> true - + let envinner = { envinner with eLambdaArgInfos = argInfos; eIsControlFlow = rhsIsControlFlow } if isCtor then TcExprThatIsCtorBody (safeThisValOpt, safeInitInfo) cenv (MustEqual overallExprTy) envinner tpenv rhsExpr @@ -10735,17 +11115,28 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt else rhsExprChecked match apinfoOpt with - | Some (apinfo, apOverallTy, _) -> + | Some (apinfo, apOverallTy, m) -> let activePatResTys = NewInferenceTypes g apinfo.ActiveTags let _, apReturnTy = stripFunTy g apOverallTy - - if isStructRetTy && apinfo.IsTotal then - errorR(Error(FSComp.SR.tcInvalidStructReturn(), mBinding)) - - if isStructRetTy then + let apRetTy = + if apinfo.IsTotal then + if isStructRetTy then errorR(Error(FSComp.SR.tcInvalidStructReturn(), mBinding)) + ActivePatternReturnKind.RefTypeWrapper + else + if isStructRetTy || isValueOptionTy cenv.g apReturnTy then ActivePatternReturnKind.StructTypeWrapper + elif isBoolTy cenv.g apReturnTy then ActivePatternReturnKind.Boolean + else ActivePatternReturnKind.RefTypeWrapper + + match apRetTy with + | ActivePatternReturnKind.Boolean -> + checkLanguageFeatureError g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern mBinding + | ActivePatternReturnKind.StructTypeWrapper when not isStructRetTy -> + checkLanguageFeatureError g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern mBinding + | ActivePatternReturnKind.StructTypeWrapper -> checkLanguageFeatureError g.langVersion LanguageFeature.StructActivePattern mBinding + | ActivePatternReturnKind.RefTypeWrapper -> () - UnifyTypes cenv env mBinding (apinfo.ResultType g rhsExpr.Range activePatResTys isStructRetTy) apReturnTy + UnifyTypes cenv env mBinding (apinfo.ResultType g m activePatResTys apRetTy) apReturnTy | None -> if isStructRetTy then @@ -10764,8 +11155,40 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt if not (isNil declaredTypars) then errorR(Error(FSComp.SR.tcLiteralCannotHaveGenericParameters(), mBinding)) + let supportEnforceAttributeTargets = + (g.langVersion.SupportsFeature(LanguageFeature.EnforceAttributeTargets) && memberFlagsOpt.IsNone && not attrs.IsEmpty) + && not isVolatile // // VolatileFieldAttribute has a special treatment(specific error FS823) + + if supportEnforceAttributeTargets then + TcAttributeTargetsOnLetBindings { cenv with tcSink = TcResultsSink.NoSink } env attrs overallPatTy overallExprTy (not declaredTypars.IsEmpty) isClassLetBinding + CheckedBindingInfo(inlineFlag, valAttribs, xmlDoc, tcPatPhase2, explicitTyparInfo, nameToPrelimValSchemeMap, rhsExprChecked, argAndRetAttribs, overallPatTy, mBinding, debugPoint, isCompGen, literalValue, isFixed), tpenv +// Note: +// - Let bound values can only have attributes that uses AttributeTargets.Field ||| AttributeTargets.Property ||| AttributeTargets.ReturnValue +// - Let function bindings can only have attributes that uses AttributeTargets.Method ||| AttributeTargets.ReturnValue +and TcAttributeTargetsOnLetBindings (cenv: cenv) env attrs overallPatTy overallExprTy areTyparsDeclared isClassLetBinding = + let attrTgt = + if + // It's a type function: + // let x<'a> = … + areTyparsDeclared + // It's a regular function-valued binding: + // let f x = … + // let f = fun x -> … + || isFunTy cenv.g overallPatTy + || isFunTy cenv.g overallExprTy + then + // Class let bindings are a special case, they can have attributes that target fields and properties, since they might be lifted to those and contain lambdas/functions. + if isClassLetBinding then + AttributeTargets.ReturnValue ||| AttributeTargets.Method ||| AttributeTargets.Field ||| AttributeTargets.Property + else + AttributeTargets.ReturnValue ||| AttributeTargets.Method + else + AttributeTargets.ReturnValue ||| AttributeTargets.Field ||| AttributeTargets.Property + + TcAttributesWithPossibleTargets TcCanFail.ReportAllErrors cenv env attrTgt attrs |> ignore + and TcLiteral (cenv: cenv) overallTy env tpenv (attrs, synLiteralValExpr) = let g = cenv.g @@ -10790,7 +11213,7 @@ and TcLiteral (cenv: cenv) overallTy env tpenv (attrs, synLiteralValExpr) = and TcBindingTyparDecls alwaysRigid cenv env tpenv (ValTyparDecls(synTypars, synTyparConstraints, infer)) = let declaredTypars = TcTyparDecls cenv env synTypars let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTypars env - let tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner tpenv synTyparConstraints + let tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurrence.UseInType envinner tpenv synTyparConstraints let rigidCopyOfDeclaredTypars = if alwaysRigid then @@ -10849,10 +11272,10 @@ and TcAttributeEx canFail (cenv: cenv) (env: TcEnv) attrTgt attrEx (synAttr: Syn let try1 n = let tyid = mkSynId tyid.idRange n let tycon = (typath @ [tyid]) - - match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.UseInAttribute OpenQualified env.eNameResEnv ad tycon TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No with + + match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurrence.UseInAttribute OpenQualified env.eNameResEnv ad tycon TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No with | Exception err -> raze err - | Result(tinstEnclosing, tcref) -> success(TcTypeApp cenv NoNewTypars CheckCxs ItemOccurence.UseInAttribute env tpenv mAttr tcref tinstEnclosing []) + | Result(tinstEnclosing, tcref, inst) -> success(TcTypeApp cenv NoNewTypars CheckCxs ItemOccurrence.UseInAttribute env tpenv mAttr tcref tinstEnclosing [] inst) ForceRaise ((try1 (tyid.idText + "Attribute")) |> otherwise (fun () -> (try1 tyid.idText))) @@ -10924,7 +11347,7 @@ and TcAttributeEx canFail (cenv: cenv) (env: TcEnv) attrTgt attrEx (synAttr: Syn error(Error(FSComp.SR.tcAttributeIsNotValidForLanguageElement(), mAttr)) match ResolveObjectConstructor cenv.nameResolver env.DisplayEnv mAttr ad ty with - | Exception _ when canFail -> [ ], true + | Exception _ when canFail = TcCanFail.IgnoreAllErrors || canFail = TcCanFail.IgnoreMemberResoutionError -> [ ], true | res -> let item = ForceRaise res @@ -10971,7 +11394,7 @@ and TcAttributeEx canFail (cenv: cenv) (env: TcEnv) attrTgt attrEx (synAttr: Syn errorR(Error(FSComp.SR.tcPropertyOrFieldNotFoundInAttribute(), m)) id.idText, false, g.unit_ty let propNameItem = Item.SetterArg(id, setterItem) - CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, propNameItem, emptyTyparInst, ItemOccurence.Use, ad) + CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, propNameItem, emptyTyparInst, ItemOccurrence.Use, ad) AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace argTy callerArgTy @@ -11029,11 +11452,11 @@ and TcAttributesMaybeFail canFail cenv env attrTgt synAttribs = TcAttributesMaybeFailEx canFail cenv env attrTgt (enum 0) synAttribs and TcAttributesCanFail cenv env attrTgt synAttribs = - let attrs, didFail = TcAttributesMaybeFail true cenv env attrTgt synAttribs + let attrs, didFail = TcAttributesMaybeFail TcCanFail.IgnoreAllErrors cenv env attrTgt synAttribs attrs, (fun () -> if didFail then TcAttributes cenv env attrTgt synAttribs else attrs) and TcAttributes cenv env attrTgt synAttribs = - TcAttributesMaybeFail false cenv env attrTgt synAttribs |> fst + TcAttributesMaybeFail TcCanFail.ReportAllErrors cenv env attrTgt synAttribs |> fst //------------------------------------------------------------------------- // TcLetBinding @@ -11111,7 +11534,7 @@ and TcLetBinding (cenv: cenv) isUse env containerInfo declKind tpenv (synBinds, when List.lengthsEqAndForall2 typarRefEq generalizedTypars generalizedTypars' -> v, pat - | _ when inlineFlag.MustInline -> + | _ when inlineFlag.ShouldInline -> error(Error(FSComp.SR.tcInvalidInlineSpecification(), m)) | TPat_query _ when HasFSharpAttribute g g.attrib_LiteralAttribute attrs -> @@ -11224,7 +11647,7 @@ and ApplyTypesFromArgumentPatterns (cenv: cenv, env, optionalArgsOK, ty, m, tpen match retInfoOpt with | None -> () | Some (SynBindingReturnInfo (typeName = retInfoTy; range = m)) -> - let retInfoTy, _ = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env tpenv retInfoTy + let retInfoTy, _ = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes env tpenv retInfoTy UnifyTypes cenv env m ty retInfoTy // Property setters always have "unit" return type match memberFlagsOpt with @@ -11301,14 +11724,14 @@ and ApplyAbstractSlotInference (cenv: cenv) (envinner: TcEnv) (_: Val option) (a let details = NicePrint.multiLineStringOfMethInfos cenv.infoReader m envinner.DisplayEnv slots errorR(Error(FSComp.SR.tcOverrideArityMismatch details, memberId.idRange)) [] - + match slot with | FSMeth (_, _, valRef, _) -> match valRef.TauType with // https://github.com/dotnet/fsharp/issues/15307 // check if abstract method expects tuple, give better error message | TType_fun(_,TType_fun(TType_tuple _,_,_),_) -> - if not slot.NumArgs.IsEmpty && slot.NumArgs.Head = 1 then + if not slot.NumArgs.IsEmpty && slot.NumArgs.Head = 1 then errorR(Error(FSComp.SR.tcOverrideUsesMultipleArgumentsInsteadOfTuple(), memberId.idRange)) [] else raiseGenericArityMismatch() @@ -11329,6 +11752,10 @@ and ApplyAbstractSlotInference (cenv: cenv) (envinner: TcEnv) (_: Val option) (a let declaredTypars = (if typarsFromAbsSlotAreRigid then typarsFromAbsSlot else declaredTypars) + // Overrides can narrow the retTy from nullable to not-null. + // By changing nullness to be variable we do not get in the way of eliminating nullness (=good). + let retTyFromAbsSlot = retTyFromAbsSlot |> changeWithNullReqTyToVariable g + let absSlotTy = mkMethodTy g argTysFromAbsSlot retTyFromAbsSlot UnifyTypes cenv envinner m argsAndRetTy absSlotTy @@ -11663,7 +12090,7 @@ and AnalyzeRecursiveDecl match pat with | SynPat.FromParseError(innerPat, _) -> analyzeRecursiveDeclPat tpenv innerPat | SynPat.Typed(innerPat, tgtTy, _) -> - let tgtTyR, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes envinner tpenv tgtTy + let tgtTyR, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurrence.UseInType WarnOnIWSAM.Yes envinner tpenv tgtTy UnifyTypes cenv envinner mBinding ty tgtTyR analyzeRecursiveDeclPat tpenv innerPat | SynPat.Attrib(_innerPat, _attribs, m) -> @@ -11730,7 +12157,7 @@ and AnalyzeAndMakeAndPublishRecursiveValue let bindingAttribs = TcAttributes cenv env attrTgt bindingSynAttribs // Allocate the type inference variable for the inferred type - let ty = NewInferenceType g + let ty = NewInferenceType g let inlineFlag = ComputeInlineFlag memberFlagsOpt isInline isMutable g bindingAttribs mBinding @@ -11784,7 +12211,7 @@ and AnalyzeAndMakeAndPublishRecursiveValue match toolIdOpt with | Some tid when not tid.idRange.IsSynthetic && not (equals tid.idRange bindingId.idRange) -> let item = Item.Value (mkLocalValRef vspec) - CallNameResolutionSink cenv.tcSink (tid.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.RelatedText, env.eAccessRights) + CallNameResolutionSink cenv.tcSink (tid.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.RelatedText, env.eAccessRights) | _ -> () let mangledId = ident(vspec.LogicalName, vspec.Range) @@ -11885,7 +12312,7 @@ and TcLetrecBinding | None -> let reqdThisValTy = if isByrefTy g reqdThisValTy then destByrefTy g reqdThisValTy else reqdThisValTy let enclosingTyconRef = tcrefOfAppTy g reqdThisValTy - reqdThisValTy, (mkAppTy enclosingTyconRef (List.map mkTyparTy enclosingDeclaredTypars)), vspec.Range + reqdThisValTy, (mkWoNullAppTy enclosingTyconRef (List.map mkTyparTy enclosingDeclaredTypars)), vspec.Range | Some thisVal -> reqdThisValTy, thisVal.Type, thisVal.Range if not (AddCxTypeEqualsTypeUndoIfFailed envRec.DisplayEnv cenv.css rangeForCheck actualThisValTy reqdThisValTy) then @@ -12034,7 +12461,7 @@ and TcIncrementalLetRecGeneralization cenv scopem // Some of the bindings may now have been marked as 'generalizable' (which means they now transition // from PreGeneralization --> PostGeneralization, since we won't get any more information on // these bindings by processing later bindings). But this doesn't mean we - // actually generalize all the individual type variables occuring in these bindings - for example, some + // actually generalize all the individual type variables occurring in these bindings - for example, some // type variables may be free in the environment, and some definitions // may be value definitions which can't be generalized, e.g. // let rec f x = g x @@ -12242,11 +12669,7 @@ and FixupLetrecBind (cenv: cenv) denv generalizedTyparsForRecursiveBlock (bind: // Check coherence of generalization of variables for memberInfo members in generic classes match vspec.MemberInfo with -#if EXTENDED_EXTENSION_MEMBERS // indicates if extension members can add additional constraints to type parameters - | Some _ when not vspec.IsExtensionMember -> -#else | Some _ -> -#endif match PartitionValTyparsForApparentEnclosingType g vspec with | Some(parentTypars, memberParentTypars, _, _, _) -> ignore(SignatureConformance.Checker(g, cenv.amap, denv, SignatureRepackageInfo.Empty, false).CheckTypars vspec.Range TypeEquivEnv.Empty memberParentTypars parentTypars) @@ -12353,7 +12776,7 @@ let private PublishArguments (cenv: cenv) (env: TcEnv) vspec (synValSig: SynValS for (argTy, argReprInfo), ident in argData do let item = Item.OtherName (Some ident, argTy, Some argReprInfo, None, ident.idRange) - CallNameResolutionSink cenv.tcSink (ident.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, env.AccessRights) + CallNameResolutionSink cenv.tcSink (ident.idRange, env.NameEnv, item, emptyTyparInst, ItemOccurrence.Binding, env.AccessRights) let TcAndPublishValSpec (cenv: cenv, env, containerInfo: ContainerInfo, declKind : DeclKind, memFlagsOpt, tpenv, synValSig) = @@ -12361,8 +12784,9 @@ let TcAndPublishValSpec (cenv: cenv, env, containerInfo: ContainerInfo, declKind let (SynValSig (attributes=Attributes synAttrs; explicitTypeParams=explicitTypeParams; isInline=isInline; isMutable=mutableFlag; xmlDoc=xmlDoc; accessibility=vis; synExpr=literalExprOpt; range=m)) = synValSig let (ValTyparDecls (synTypars, _, synCanInferTypars)) = explicitTypeParams + let declaredTypars = TcTyparDecls cenv env synTypars - GeneralizationHelpers.CheckDeclaredTyparsPermitted(memFlagsOpt, synTypars, m) + GeneralizationHelpers.CheckDeclaredTyparsPermitted(memFlagsOpt, declaredTypars, m) let canInferTypars = GeneralizationHelpers.ComputeCanInferExtraGeneralizableTypars (containerInfo.ParentRef, synCanInferTypars, memFlagsOpt) @@ -12373,8 +12797,22 @@ let TcAndPublishValSpec (cenv: cenv, env, containerInfo: ContainerInfo, declKind let valinfos, tpenv = TcValSpec cenv env declKind newOk containerInfo memFlagsOpt None tpenv synValSig attrs let denv = env.DisplayEnv + let viss = + match memFlagsOpt with + | Some ({MemberKind = SynMemberKind.PropertyGetSet as propKind}) -> + let getterAccess, setterAccess = getGetterSetterAccess vis propKind g.langVersion + List.init valinfos.Length (fun i -> if i = 0 then getterAccess else setterAccess) + | Some ({MemberKind = SynMemberKind.PropertyGet as propKind}) -> + let getterAccess, _ = getGetterSetterAccess vis propKind g.langVersion + List.init valinfos.Length (fun _ -> getterAccess) + | Some ({MemberKind = SynMemberKind.PropertySet as propKind}) -> + let _, setterAccess = getGetterSetterAccess vis propKind g.langVersion + List.init valinfos.Length (fun _ -> setterAccess) + | _ -> + List.init valinfos.Length (fun _ -> vis.SingleAccess()) + let valinfos = List.zip valinfos viss - (tpenv, valinfos) ||> List.mapFold (fun tpenv valSpecResult -> + (tpenv, valinfos) ||> List.mapFold (fun tpenv (valSpecResult, vis) -> let (ValSpecResult (altActualParent, memberInfoOpt, id, enclosingDeclaredTypars, declaredTypars, ty, prelimValReprInfo, declKind)) = valSpecResult @@ -12418,7 +12856,7 @@ let TcAndPublishValSpec (cenv: cenv, env, containerInfo: ContainerInfo, declKind | None -> None | Some valReprInfo -> Some valReprInfo.ArgNames - let checkXmlDocs = cenv.diagnosticOptions.CheckXmlDocs + let checkXmlDocs = cenv.diagnosticOptions.CheckXmlDocs let xmlDoc = xmlDoc.ToXmlDoc(checkXmlDocs, paramNames) let vspec = MakeAndPublishVal cenv env (altActualParent, true, declKind, ValNotInRecScope, valscheme, attrs, xmlDoc, literalValue, false) @@ -12426,4 +12864,4 @@ let TcAndPublishValSpec (cenv: cenv, env, containerInfo: ContainerInfo, declKind assert(vspec.InlineInfo = inlineFlag) - vspec, tpenv) + vspec, tpenv) \ No newline at end of file diff --git a/src/fcs-fable/src/Compiler/Checking/CheckExpressions.fsi b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressions.fsi similarity index 95% rename from src/fcs-fable/src/Compiler/Checking/CheckExpressions.fsi rename to src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressions.fsi index 16a759c2e3..0e4e17a8f8 100644 --- a/src/fcs-fable/src/Compiler/Checking/CheckExpressions.fsi +++ b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressions.fsi @@ -75,7 +75,7 @@ exception UnionPatternsBindDifferentNames of range exception VarBoundTwice of Ident -exception ValueRestriction of DisplayEnv * InfoReader * bool * Val * Typar * range +exception ValueRestriction of DisplayEnv * InfoReader * Val * Typar * range exception ValNotMutable of DisplayEnv * ValRef * range @@ -123,9 +123,6 @@ exception InvalidInternalsVisibleToAssemblyName of badName: string * fileName: s val TcFieldInit: range -> ILFieldInit -> Const -val LightweightTcValForUsingInBuildMethodCall: - g: TcGlobals -> vref: ValRef -> vrefFlags: ValUseFlag -> vrefTypeInst: TTypes -> m: range -> Expr * TType - /// Indicates whether a syntactic type is allowed to include new type variables /// not declared anywhere, e.g. `let f (x: 'T option) = x.Value` type ImplicitlyBoundTyparsAllowed = @@ -256,7 +253,7 @@ type NormalizedBinding = | NormalizedBinding of visibility: SynAccess option * kind: SynBindingKind * - mustInline: bool * + shouldInline: bool * isMutable: bool * attribs: SynAttribute list * xmlDoc: XmlDoc * @@ -348,6 +345,19 @@ type PostSpecialValsRecursiveBinding = { ValScheme: ValScheme Binding: Binding } +[] +type TcCanFail = + | IgnoreMemberResoutionError + | IgnoreAllErrors + | ReportAllErrors + +/// Represents a pattern that is used in a true match clause e.g. | pat -> expr +[] +[] +type TcTrueMatchClause = + | Yes + | No + /// Represents a recursive binding after it has been both checked and generalized, but /// before initialization recursion has been rewritten type PreInitializationGraphEliminationBinding = @@ -413,7 +423,7 @@ val CheckSuperType: cenv: TcFileState -> ty: TType -> m: range -> unit val ChooseCanonicalDeclaredTyparsAfterInference: g: TcGlobals -> denv: DisplayEnv -> declaredTypars: Typar list -> m: range -> Typar list -/// After inference, view a ValSchem in a canonical way. +/// After inference, view a ValScheme in a canonical way. val ChooseCanonicalValSchemeAfterInference: g: TcGlobals -> denv: DisplayEnv -> vscheme: ValScheme -> m: range -> ValScheme @@ -428,8 +438,9 @@ val ComputeAccessRights: eFamilyType: TyconRef option -> AccessorDomain -/// Compute the available access rights and module/entity compilation path for a paricular location in code +/// Compute the available access rights and module/entity compilation path for a particular location in code val ComputeAccessAndCompPath: + g: TcGlobals -> env: TcEnv -> declKindOpt: DeclKind option -> m: range -> @@ -441,20 +452,6 @@ val ComputeAccessAndCompPath: /// Get the expression resulting from turning an expression into an enumerable value, e.g. at 'for' loops val ConvertArbitraryExprToEnumerable: cenv: TcFileState -> ty: TType -> env: TcEnv -> expr: Expr -> Expr * TType -/// Invoke pattern match compilation -val CompilePatternForMatchClauses: - cenv: TcFileState -> - env: TcEnv -> - mExpr: range -> - mMatch: range -> - warnOnUnused: bool -> - actionOnFailure: ActionOnFailure -> - inputExprOpt: Expr option -> - inputTy: TType -> - resultTy: TType -> - tclauses: MatchClause list -> - Val * Expr - /// Process recursive bindings so that initialization is through laziness and is checked. /// The bindings may be either plain 'let rec' bindings or mutually recursive nestings of modules and types. /// The functions must iterate the actual bindings and process them to the overall result. @@ -556,7 +553,7 @@ val MakeInnerEnv: TcEnv * ModuleOrNamespaceType ref /// Return a new environment suitable for processing declarations in the interior of a module definition -/// given that the accumulator for the module type already exisits. +/// given that the accumulator for the module type already exists. val MakeInnerEnvWithAcc: addOpenToNameEnv: bool -> env: TcEnv -> @@ -566,7 +563,7 @@ val MakeInnerEnvWithAcc: TcEnv /// Produce a post-generalization type scheme for a simple type where no type inference generalization -/// is appplied. +/// is applied. val NonGenericTypeScheme: ty: TType -> GeneralizedType /// Publish a module definition to the module/namespace type accumulator. @@ -614,7 +611,7 @@ val TcAttributesCanFail: /// Check a set of attributes which can only target specific elements val TcAttributesWithPossibleTargets: - canFail: bool -> + canFail: TcCanFail -> cenv: TcFileState -> env: TcEnv -> attrTgt: AttributeTargets -> @@ -639,9 +636,8 @@ val TcExpr: val CheckTupleIsCorrectLength: g: TcGlobals -> env: TcEnv -> m: range -> tupleTy: TType -> args: 'a list -> tcArgs: (TType list -> unit) -> unit -/// Converts 'a..b' to a call to the '(..)' operator in FSharp.Core -/// Converts 'a..b..c' to a call to the '(.. ..)' operator in FSharp.Core -val RewriteRangeExpr: synExpr: SynExpr -> SynExpr option +/// Check record names and types for cases like cases like `query { for ... join(for x in f(). }` +val RecordNameAndTypeResolutions: cenv: TcFileState -> env: TcEnv -> tpenv: UnscopedTyparEnv -> expr: SynExpr -> unit /// Check a syntactic expression and convert it to a typed tree expression val TcExprOfUnknownType: @@ -700,7 +696,11 @@ val TcLinearExprs: /// Try to check a syntactic statement and indicate if it's type is not unit without emitting a warning val TryTcStmt: - cenv: TcFileState -> env: TcEnv -> tpenv: UnscopedTyparEnv -> synExpr: SynExpr -> bool * Expr * UnscopedTyparEnv + cenv: TcFileState -> + env: TcEnv -> + tpenv: UnscopedTyparEnv -> + synExpr: SynExpr -> + bool * TType * Expr * UnscopedTyparEnv /// Check a pattern being used as a pattern match val TcMatchPattern: @@ -710,9 +710,11 @@ val TcMatchPattern: tpenv: UnscopedTyparEnv -> synPat: SynPat -> synWhenExprOpt: SynExpr option -> + tcTrueMatchClause: TcTrueMatchClause -> Pattern * Expr option * Val list * TcEnv * UnscopedTyparEnv -val (|BinOpExpr|_|): SynExpr -> (Ident * SynExpr * SynExpr) option +[] +val (|BinOpExpr|_|): SynExpr -> (Ident * SynExpr * SynExpr) voption /// Check a set of let bindings in a class or module val TcLetBindings: @@ -743,7 +745,7 @@ val TcLetrecBinding: UnscopedTyparEnv * Map -/// Get the binding for the implicit safe initialziation check value if it is being used +/// Get the binding for the implicit safe initialization check value if it is being used val TcLetrecComputeCtorSafeThisValBind: cenv: TcFileState -> safeThisValOpt: Val option -> Binding option /// Check a collection of `let rec` bindings @@ -792,7 +794,7 @@ val TcTyparConstraints: cenv: TcFileState -> newOk: ImplicitlyBoundTyparsAllowed -> checkConstraints: CheckConstraints -> - occ: ItemOccurence -> + occ: ItemOccurrence -> env: TcEnv -> tpenv: UnscopedTyparEnv -> synConstraints: SynTypeConstraint list -> @@ -806,7 +808,7 @@ val TcType: cenv: TcFileState -> newOk: ImplicitlyBoundTyparsAllowed -> checkConstraints: CheckConstraints -> - occ: ItemOccurence -> + occ: ItemOccurrence -> iwsam: WarnOnIWSAM -> env: TcEnv -> tpenv: UnscopedTyparEnv -> @@ -819,7 +821,7 @@ val TcTypeOrMeasureAndRecover: cenv: TcFileState -> newOk: ImplicitlyBoundTyparsAllowed -> checkConstraints: CheckConstraints -> - occ: ItemOccurence -> + occ: ItemOccurrence -> iwsam: WarnOnIWSAM -> env: TcEnv -> tpenv: UnscopedTyparEnv -> @@ -831,7 +833,7 @@ val TcTypeAndRecover: cenv: TcFileState -> newOk: ImplicitlyBoundTyparsAllowed -> checkConstraints: CheckConstraints -> - occ: ItemOccurence -> + occ: ItemOccurrence -> iwsam: WarnOnIWSAM -> env: TcEnv -> tpenv: UnscopedTyparEnv -> @@ -866,9 +868,6 @@ val TranslateSynValInfo: /// once type parameters have been fully inferred via generalization. val TranslatePartialValReprInfo: tps: Typar list -> PrelimValReprInfo -> ValReprInfo -/// Constrain two types to be equal within this type checking context -val UnifyTypes: cenv: TcFileState -> env: TcEnv -> m: range -> expectedTy: TType -> actualTy: TType -> unit - val TcRuntimeTypeTest: isCast: bool -> isOperator: bool -> @@ -933,12 +932,12 @@ val TcVal: module GeneralizationHelpers = /// Given an environment, compute the set of inference type variables which may not be - /// generalised, because they appear somewhere in the types of the constructs availabe + /// generalised, because they appear somewhere in the types of the constructs available /// in the environment. val ComputeUngeneralizableTypars: env: TcEnv -> Zset /// Given an environment, compute the set of trait solutions which must appear before - /// the current location, not after (to prevent use-before definitiosn and + /// the current location, not after (to prevent use-before definitions and /// forward calls via type inference filling in trait solutions). val ComputeUnabstractableTraitSolutions: env: TcEnv -> FreeLocals diff --git a/src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressionsOps.fs b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressionsOps.fs new file mode 100644 index 0000000000..17572c86e4 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckExpressionsOps.fs @@ -0,0 +1,381 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +module internal FSharp.Compiler.CheckExpressionsOps + +open Internal.Utilities.Library +open Internal.Utilities.Library.Extras +open FSharp.Compiler.CheckBasics +open FSharp.Compiler.ConstraintSolver +open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.Features +open FSharp.Compiler.NameResolution +open FSharp.Compiler.PatternMatchCompilation +open FSharp.Compiler.Text +open FSharp.Compiler.Text.Range +open FSharp.Compiler.Syntax +open FSharp.Compiler.TypedTree +open FSharp.Compiler.TypedTreeBasics +open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.SyntaxTreeOps + +let CopyAndFixupTypars g m rigid tpsorig = + FreshenAndFixupTypars g m rigid [] [] tpsorig + +let FreshenPossibleForallTy g m rigid ty = + let origTypars, tau = tryDestForallTy g ty + + if isNil origTypars then + [], [], [], tau + else + // tps may be have been equated to other tps in equi-recursive type inference and units-of-measure type inference. Normalize them here + let origTypars = NormalizeDeclaredTyparsForEquiRecursiveInference g origTypars + let tps, renaming, tinst = CopyAndFixupTypars g m rigid origTypars + origTypars, tps, tinst, instType renaming tau + +/// simplified version of TcVal used in calls to BuildMethodCall (typrelns.fs) +/// this function is used on typechecking step for making calls to provided methods and on optimization step (for the same purpose). +let LightweightTcValForUsingInBuildMethodCall g (vref: ValRef) vrefFlags (vrefTypeInst: TTypes) m = + let v = vref.Deref + let vTy = vref.Type + // byref-typed values get dereferenced + if isByrefTy g vTy then + mkAddrGet m vref, destByrefTy g vTy + else + match v.LiteralValue with + | Some literalConst -> + let _, _, _, tau = FreshenPossibleForallTy g m TyparRigidity.Flexible vTy + Expr.Const(literalConst, m, tau), tau + + | None -> + // Instantiate the value + let tau = + // If we have got an explicit instantiation then use that + let _, tps, tpTys, tau = FreshenPossibleForallTy g m TyparRigidity.Flexible vTy + + if tpTys.Length <> vrefTypeInst.Length then + error (Error(FSComp.SR.tcTypeParameterArityMismatch (tps.Length, vrefTypeInst.Length), m)) + + instType (mkTyparInst tps vrefTypeInst) tau + + let exprForVal = Expr.Val(vref, vrefFlags, m) + let exprForVal = mkTyAppExpr m (exprForVal, vTy) vrefTypeInst + exprForVal, tau + +//------------------------------------------------------------------------- +// Helpers dealing with pattern match compilation +//------------------------------------------------------------------------- + +let CompilePatternForMatch + (cenv: TcFileState) + (env: TcEnv) + mExpr + mMatch + warnOnUnused + actionOnFailure + (inputVal, generalizedTypars, inputExprOpt) + clauses + inputTy + resultTy + = + let g = cenv.g + + let dtree, targets = + CompilePattern + g + env.DisplayEnv + cenv.amap + (LightweightTcValForUsingInBuildMethodCall g) + cenv.infoReader + mExpr + mMatch + warnOnUnused + actionOnFailure + (inputVal, generalizedTypars, inputExprOpt) + clauses + inputTy + resultTy + + mkAndSimplifyMatch DebugPointAtBinding.NoneAtInvisible mExpr mMatch resultTy dtree targets + +/// Invoke pattern match compilation +let CompilePatternForMatchClauses (cenv: TcFileState) env mExpr mMatch warnOnUnused actionOnFailure inputExprOpt inputTy resultTy tclauses = + // Avoid creating a dummy in the common cases where we are about to bind a name for the expression + // CLEANUP: avoid code duplication with code further below, i.e.all callers should call CompilePatternForMatch + match tclauses with + | [ MatchClause(TPat_as(pat1, PatternValBinding(asVal, GeneralizedType(generalizedTypars, _)), _), None, TTarget(vs, targetExpr, _), m2) ] -> + let vs2 = ListSet.remove valEq asVal vs + + let expr = + CompilePatternForMatch + cenv + env + mExpr + mMatch + warnOnUnused + actionOnFailure + (asVal, generalizedTypars, None) + [ MatchClause(pat1, None, TTarget(vs2, targetExpr, None), m2) ] + inputTy + resultTy + + asVal, expr + | _ -> + let matchValueTmp, _ = mkCompGenLocal mExpr "matchValue" inputTy + + let expr = + CompilePatternForMatch + cenv + env + mExpr + mMatch + warnOnUnused + actionOnFailure + (matchValueTmp, [], inputExprOpt) + tclauses + inputTy + resultTy + + matchValueTmp, expr + +/// Constrain two types to be equal within this type checking context +let inline UnifyTypes (cenv: TcFileState) (env: TcEnv) m expectedTy actualTy = + + AddCxTypeEqualsType + env.eContextInfo + env.DisplayEnv + cenv.css + m + (tryNormalizeMeasureInType cenv.g expectedTy) + (tryNormalizeMeasureInType cenv.g actualTy) + +// Converts 'a..b' to a call to the '(..)' operator in FSharp.Core +// Converts 'a..b..c' to a call to the '(.. ..)' operator in FSharp.Core +// +// NOTE: we could eliminate these more efficiently in LowerComputedCollections.fs, since +// [| 1..4 |] +// becomes [| for i in (..) 1 4 do yield i |] +// instead of generating the array directly from the ranges +let RewriteRangeExpr synExpr = + match synExpr with + // a..b..c (parsed as (a..b)..c ) + | SynExpr.IndexRange(Some(SynExpr.IndexRange(Some synExpr1, _, Some synStepExpr, _, _, _)), _, Some synExpr2, _m1, _m2, mWhole) -> + let mWhole = mWhole.MakeSynthetic() + Some(mkSynTrifix mWhole ".. .." synExpr1 synStepExpr synExpr2) + // a..b + | SynExpr.IndexRange(Some synExpr1, mOperator, Some synExpr2, _m1, _m2, mWhole) -> + let otherExpr = + let mWhole = mWhole.MakeSynthetic() + + match mkSynInfix mOperator synExpr1 ".." synExpr2 with + | SynExpr.App(a, b, c, d, _) -> SynExpr.App(a, b, c, d, mWhole) + | _ -> failwith "impossible" + + Some otherExpr + | _ -> None + +/// Check if a computation or sequence expression is syntactically free of 'yield' (though not yield!) +let YieldFree (cenv: TcFileState) expr = + if cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield then + + // Implement yield free logic for F# Language including the LanguageFeature.ImplicitYield + let rec YieldFree expr = + match expr with + | SynExpr.Sequential(expr1 = expr1; expr2 = expr2) -> YieldFree expr1 && YieldFree expr2 + + | SynExpr.IfThenElse(thenExpr = thenExpr; elseExpr = elseExprOpt) -> YieldFree thenExpr && Option.forall YieldFree elseExprOpt + + | SynExpr.TryWith(tryExpr = body; withCases = clauses) -> + YieldFree body + && clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) + + | SynExpr.Match(clauses = clauses) + | SynExpr.MatchBang(clauses = clauses) -> clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) + + | SynExpr.For(doBody = body) + | SynExpr.TryFinally(tryExpr = body) + | SynExpr.LetOrUse(body = body) + | SynExpr.While(doExpr = body) + | SynExpr.WhileBang(doExpr = body) + | SynExpr.ForEach(bodyExpr = body) -> YieldFree body + + | SynExpr.LetOrUseBang(body = body) -> YieldFree body + + | SynExpr.YieldOrReturn(flags = (true, _)) -> false + + | _ -> true + + YieldFree expr + else + // Implement yield free logic for F# Language without the LanguageFeature.ImplicitYield + let rec YieldFree expr = + match expr with + | SynExpr.Sequential(expr1 = expr1; expr2 = expr2) -> YieldFree expr1 && YieldFree expr2 + + | SynExpr.IfThenElse(thenExpr = thenExpr; elseExpr = elseExprOpt) -> YieldFree thenExpr && Option.forall YieldFree elseExprOpt + + | SynExpr.TryWith(tryExpr = e1; withCases = clauses) -> + YieldFree e1 + && clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) + + | SynExpr.Match(clauses = clauses) + | SynExpr.MatchBang(clauses = clauses) -> clauses |> List.forall (fun (SynMatchClause(resultExpr = res)) -> YieldFree res) + + | SynExpr.For(doBody = body) + | SynExpr.TryFinally(tryExpr = body) + | SynExpr.LetOrUse(body = body) + | SynExpr.While(doExpr = body) + | SynExpr.WhileBang(doExpr = body) + | SynExpr.ForEach(bodyExpr = body) -> YieldFree body + + | SynExpr.LetOrUseBang _ + | SynExpr.YieldOrReturnFrom _ + | SynExpr.YieldOrReturn _ + | SynExpr.ImplicitZero _ + | SynExpr.Do _ -> false + + | _ -> true + + YieldFree expr + +let inline IsSimpleSemicolonSequenceElement expr cenv acceptDeprecated = + match expr with + | SynExpr.IfThenElse _ when acceptDeprecated && YieldFree cenv expr -> true + | SynExpr.IfThenElse _ + | SynExpr.TryWith _ + | SynExpr.Match _ + | SynExpr.For _ + | SynExpr.ForEach _ + | SynExpr.TryFinally _ + | SynExpr.YieldOrReturnFrom _ + | SynExpr.YieldOrReturn _ + | SynExpr.LetOrUse _ + | SynExpr.Do _ + | SynExpr.MatchBang _ + | SynExpr.LetOrUseBang _ + | SynExpr.While _ + | SynExpr.WhileBang _ -> false + | _ -> true + +[] +let rec TryGetSimpleSemicolonSequenceOfComprehension expr acc cenv acceptDeprecated = + match expr with + | SynExpr.Sequential(isTrueSeq = true; expr1 = e1; expr2 = e2) -> + if IsSimpleSemicolonSequenceElement e1 cenv acceptDeprecated then + TryGetSimpleSemicolonSequenceOfComprehension e2 (e1 :: acc) cenv acceptDeprecated + else + ValueNone + | _ -> + if IsSimpleSemicolonSequenceElement expr cenv acceptDeprecated then + ValueSome(List.rev (expr :: acc)) + else + ValueNone + +/// Determine if a syntactic expression inside 'seq { ... }' or '[...]' counts as a "simple sequence +/// of semicolon separated values". For example [1;2;3]. +/// 'acceptDeprecated' is true for the '[ ... ]' case, where we allow the syntax '[ if g then t else e ]' but ask it to be parenthesized +[] +let (|SimpleSemicolonSequence|_|) cenv acceptDeprecated cexpr = + TryGetSimpleSemicolonSequenceOfComprehension cexpr [] cenv acceptDeprecated + +let elimFastIntegerForLoop (spFor, spTo, id, start: SynExpr, dir, finish: SynExpr, innerExpr, m: range) = + let mOp = (unionRanges start.Range finish.Range).MakeSynthetic() + + let pseudoEnumExpr = + if dir then + mkSynInfix mOp start ".." finish + else + mkSynTrifix mOp ".. .." start (SynExpr.Const(SynConst.Int32 -1, mOp)) finish + + SynExpr.ForEach(spFor, spTo, SeqExprOnly false, true, mkSynPatVar None id, pseudoEnumExpr, innerExpr, m) + +let mkSeqEmpty (cenv: TcFileState) env m genTy = + // We must discover the 'zero' of the monadic algebra being generated in order to compile failing matches. + let g = cenv.g + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy g genResultTy) + mkCallSeqEmpty g m genResultTy + +let mkSeqUsing (cenv: TcFileState) (env: TcEnv) m resourceTy genTy resourceExpr lam = + let g = cenv.g + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace g.system_IDisposable_ty resourceTy + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) + mkCallSeqUsing cenv.g m resourceTy genResultTy resourceExpr lam + +let mkSeqAppend (cenv: TcFileState) env m genTy e1 e2 = + let g = cenv.g + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) + + let e1 = + mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e1) e1 + + let e2 = + mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e2) e2 + + mkCallSeqAppend cenv.g m genResultTy e1 e2 + +let mkSeqDelay (cenv: TcFileState) env m genTy lam = + let g = cenv.g + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) + mkCallSeqDelay cenv.g m genResultTy (mkUnitDelayLambda cenv.g m lam) + +let mkSeqCollect (cenv: TcFileState) env m enumElemTy genTy lam enumExpr = + let g = cenv.g + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) + + let enumExpr = + mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g enumElemTy) (tyOfExpr cenv.g enumExpr) enumExpr + + mkCallSeqCollect cenv.g m enumElemTy genResultTy lam enumExpr + +let mkSeqFromFunctions (cenv: TcFileState) env m genTy e1 e2 = + let g = cenv.g + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) + + let e2 = + mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e2) e2 + + mkCallSeqGenerated cenv.g m genResultTy e1 e2 + +let mkSeqFinally (cenv: TcFileState) env m genTy e1 e2 = + let g = cenv.g + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) + + let e1 = + mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g e1) e1 + + mkCallSeqFinally cenv.g m genResultTy e1 e2 + +let mkSeqTryWith (cenv: TcFileState) env m genTy origSeq exnFilter exnHandler = + let g = cenv.g + let genResultTy = NewInferenceType g + UnifyTypes cenv env m genTy (mkSeqTy cenv.g genResultTy) + + let origSeq = + mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g genResultTy) (tyOfExpr cenv.g origSeq) origSeq + + mkCallSeqTryWith cenv.g m genResultTy origSeq exnFilter exnHandler + +let inline mkSeqExprMatchClauses (pat, vspecs) innerExpr = + [ MatchClause(pat, None, TTarget(vspecs, innerExpr, None), pat.Range) ] + +let compileSeqExprMatchClauses (cenv: TcFileState) env inputExprMark (pat: Pattern, vspecs) innerExpr inputExprOpt bindPatTy genInnerTy = + let patMark = pat.Range + let tclauses = mkSeqExprMatchClauses (pat, vspecs) innerExpr + + CompilePatternForMatchClauses + cenv + env + inputExprMark + patMark + false + ThrowIncompleteMatchException + inputExprOpt + bindPatTy + genInnerTy + tclauses diff --git a/src/fcs-fable/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs new file mode 100644 index 0000000000..3c5f136d28 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs @@ -0,0 +1,469 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +/// Sequence expressions checking +module internal FSharp.Compiler.CheckSequenceExpressions + +open Internal.Utilities.Library +open FSharp.Compiler.CheckBasics +open FSharp.Compiler.CheckExpressions +open FSharp.Compiler.CheckExpressionsOps +open FSharp.Compiler.ConstraintSolver +open FSharp.Compiler.Features +open FSharp.Compiler.NameResolution +open FSharp.Compiler.PatternMatchCompilation +open FSharp.Compiler.Syntax +open FSharp.Compiler.Text +open FSharp.Compiler.TypedTree +open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.SyntaxTreeOps + +/// This case is used for computation expressions which are sequence expressions. Technically the code path is different because it +/// typechecks rather than doing a shallow syntactic translation, and generates calls into the Seq.* library +/// and helpers rather than to the builder methods (there is actually no builder for 'seq' in the library). +/// These are later detected by state machine compilation. +/// +/// Also "ienumerable extraction" is performed on arguments to "for". +let TcSequenceExpression (cenv: TcFileState) env tpenv comp (overallTy: OverallTy) m = + + let g = cenv.g + let genEnumElemTy = NewInferenceType g + UnifyTypes cenv env m overallTy.Commit (mkSeqTy cenv.g genEnumElemTy) + + // Allow subsumption at 'yield' if the element type is nominal prior to the analysis of the body of the sequence expression + let flex = not (isTyparTy cenv.g genEnumElemTy) + + // If there are no 'yield' in the computation expression then allow the type-directed rule + // interpreting non-unit-typed expressions in statement positions as 'yield'. 'yield!' may be + // present in the computation expression. + let enableImplicitYield = + cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield + && (YieldFree cenv comp) + + let mkSeqDelayedExpr m (coreExpr: Expr) = + let overallTy = tyOfExpr cenv.g coreExpr + mkSeqDelay cenv env m overallTy coreExpr + + let rec tryTcSequenceExprBody env genOuterTy tpenv comp = + match comp with + | SynExpr.ForEach(spFor, spIn, SeqExprOnly _seqExprOnly, _isFromSource, pat, pseudoEnumExpr, innerComp, _m) -> + let pseudoEnumExpr = + match RewriteRangeExpr pseudoEnumExpr with + | Some e -> e + | None -> pseudoEnumExpr + // This expression is not checked with the knowledge it is an IEnumerable, since we permit other enumerable types with GetEnumerator/MoveNext methods, as does C# + let pseudoEnumExpr, arbitraryTy, tpenv = + TcExprOfUnknownType cenv env tpenv pseudoEnumExpr + + let enumExpr, enumElemTy = + ConvertArbitraryExprToEnumerable cenv arbitraryTy env pseudoEnumExpr + + let patR, _, vspecs, envinner, tpenv = + TcMatchPattern cenv enumElemTy env tpenv pat None TcTrueMatchClause.No + + let innerExpr, tpenv = + let envinner = { envinner with eIsControlFlow = true } + tcSequenceExprBody envinner genOuterTy tpenv innerComp + + let enumExprRange = enumExpr.Range + + // We attach the debug point to the lambda expression so we can fetch it out again in LowerComputedListOrArraySeqExpr + let mFor = + match spFor with + | DebugPointAtFor.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.For) + | _ -> enumExprRange + + // We attach the debug point to the lambda expression so we can fetch it out again in LowerComputedListOrArraySeqExpr + let mIn = + match spIn with + | DebugPointAtInOrTo.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.InOrTo) + | _ -> pat.Range + + match patR, vspecs, innerExpr with + // Legacy peephole optimization: + // "seq { .. for x in e1 -> e2 .. }" == "e1 |> Seq.map (fun x -> e2)" + // "seq { .. for x in e1 do yield e2 .. }" == "e1 |> Seq.map (fun x -> e2)" + // + // This transformation is visible in quotations and thus needs to remain. + | (TPat_as(TPat_wild _, PatternValBinding(v, _), _), + [ _ ], + DebugPoints(Expr.App(Expr.Val(vref, _, _), _, [ genEnumElemTy ], [ yieldExpr ], _mYield), recreate)) when + valRefEq cenv.g vref cenv.g.seq_singleton_vref + -> + + // The debug point mFor is attached to the 'map' + // The debug point mIn is attached to the lambda + // Note: the 'yield' part of the debug point for 'yield expr' is currently lost in debug points. + let lam = mkLambda mIn v (recreate yieldExpr, genEnumElemTy) + + let enumExpr = + mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g enumElemTy) (tyOfExpr cenv.g enumExpr) enumExpr + + Some(mkCallSeqMap cenv.g mFor enumElemTy genEnumElemTy lam enumExpr, tpenv) + + | _ -> + // The debug point mFor is attached to the 'collect' + // The debug point mIn is attached to the lambda + let matchv, matchExpr = + compileSeqExprMatchClauses cenv env enumExprRange (patR, vspecs) innerExpr None enumElemTy genOuterTy + + let lam = mkLambda mIn matchv (matchExpr, tyOfExpr cenv.g matchExpr) + Some(mkSeqCollect cenv env mFor enumElemTy genOuterTy lam enumExpr, tpenv) + + | SynExpr.For( + forDebugPoint = spFor + toDebugPoint = spTo + ident = id + identBody = start + direction = dir + toBody = finish + doBody = innerComp + range = m) -> + Some(tcSequenceExprBody env genOuterTy tpenv (elimFastIntegerForLoop (spFor, spTo, id, start, dir, finish, innerComp, m))) + + | SynExpr.While(spWhile, guardExpr, innerComp, _m) -> + let guardExpr, tpenv = + let env = { env with eIsControlFlow = false } + TcExpr cenv (MustEqual cenv.g.bool_ty) env tpenv guardExpr + + let innerExpr, tpenv = + let env = { env with eIsControlFlow = true } + tcSequenceExprBody env genOuterTy tpenv innerComp + + let guardExprMark = guardExpr.Range + let guardLambdaExpr = mkUnitDelayLambda cenv.g guardExprMark guardExpr + + // We attach the debug point to the lambda expression so we can fetch it out again in LowerComputedListOrArraySeqExpr + let mWhile = + match spWhile with + | DebugPointAtWhile.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) + | _ -> guardExprMark + + let innerDelayedExpr = mkSeqDelayedExpr mWhile innerExpr + Some(mkSeqFromFunctions cenv env guardExprMark genOuterTy guardLambdaExpr innerDelayedExpr, tpenv) + + | SynExpr.TryFinally(innerComp, unwindExpr, mTryToLast, spTry, spFinally, trivia) -> + let env = { env with eIsControlFlow = true } + let innerExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp + let unwindExpr, tpenv = TcExpr cenv (MustEqual cenv.g.unit_ty) env tpenv unwindExpr + + // We attach the debug points to the lambda expressions so we can fetch it out again in LowerComputedListOrArraySeqExpr + let mTry = + match spTry with + | DebugPointAtTry.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Try) + | _ -> trivia.TryKeyword + + let mFinally = + match spFinally with + | DebugPointAtFinally.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Finally) + | _ -> trivia.FinallyKeyword + + let innerExpr = mkSeqDelayedExpr mTry innerExpr + let unwindExpr = mkUnitDelayLambda cenv.g mFinally unwindExpr + + Some(mkSeqFinally cenv env mTryToLast genOuterTy innerExpr unwindExpr, tpenv) + + | SynExpr.Paren(range = m) when not (cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield) -> + error (Error(FSComp.SR.tcConstructIsAmbiguousInSequenceExpression (), m)) + + | SynExpr.ImplicitZero m -> Some(mkSeqEmpty cenv env m genOuterTy, tpenv) + + | SynExpr.DoBang(trivia = { DoBangKeyword = m }) -> error (Error(FSComp.SR.tcDoBangIllegalInSequenceExpression (), m)) + + | SynExpr.Sequential(sp, true, innerComp1, innerComp2, m, _) -> + let env1 = + { env with + eIsControlFlow = + (match sp with + | DebugPointAtSequential.SuppressNeither + | DebugPointAtSequential.SuppressExpr -> true + | _ -> false) + } + + let res, tpenv = + tcSequenceExprBodyAsSequenceOrStatement env1 genOuterTy tpenv innerComp1 + + let env2 = + { env with + eIsControlFlow = + (match sp with + | DebugPointAtSequential.SuppressNeither + | DebugPointAtSequential.SuppressStmt -> true + | _ -> false) + } + + // "expr; cexpr" is treated as sequential execution + // "cexpr; cexpr" is treated as append + match res with + | Choice1Of2 innerExpr1 -> + let innerExpr2, tpenv = tcSequenceExprBody env2 genOuterTy tpenv innerComp2 + let innerExpr2 = mkSeqDelayedExpr innerExpr2.Range innerExpr2 + Some(mkSeqAppend cenv env innerComp1.Range genOuterTy innerExpr1 innerExpr2, tpenv) + | Choice2Of2 stmt1 -> + let innerExpr2, tpenv = tcSequenceExprBody env2 genOuterTy tpenv innerComp2 + Some(Expr.Sequential(stmt1, innerExpr2, NormalSeq, m), tpenv) + + | SynExpr.IfThenElse(guardExpr, thenComp, elseCompOpt, spIfToThen, _isRecovery, mIfToEndOfElseBranch, trivia) -> + let guardExpr', tpenv = TcExpr cenv (MustEqual cenv.g.bool_ty) env tpenv guardExpr + let env = { env with eIsControlFlow = true } + let thenExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv thenComp + + let elseComp = + (match elseCompOpt with + | Some c -> c + | None -> SynExpr.ImplicitZero trivia.IfToThenRange) + + let elseExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv elseComp + Some(mkCond spIfToThen mIfToEndOfElseBranch genOuterTy guardExpr' thenExpr elseExpr, tpenv) + + // 'let x = expr in expr' + | SynExpr.LetOrUse(isUse = false) -> + TcLinearExprs + (fun overallTy envinner tpenv e -> tcSequenceExprBody envinner overallTy.Commit tpenv e) + cenv + env + overallTy + tpenv + true + comp + id + |> Some + + // 'use x = expr in expr' + | SynExpr.LetOrUse( + isUse = true + bindings = [ SynBinding(kind = SynBindingKind.Normal; headPat = pat; expr = rhsExpr) ] + body = innerComp + range = wholeExprMark + trivia = { LetOrUseKeyword = mBind }) -> + + let bindPatTy = NewInferenceType g + let inputExprTy = NewInferenceType g + + let pat', _, vspecs, envinner, tpenv = + TcMatchPattern cenv bindPatTy env tpenv pat None TcTrueMatchClause.No + + UnifyTypes cenv env m inputExprTy bindPatTy + + let inputExpr, tpenv = + let env = { env with eIsControlFlow = true } + TcExpr cenv (MustEqual inputExprTy) env tpenv rhsExpr + + let innerExpr, tpenv = + let envinner = { envinner with eIsControlFlow = true } + tcSequenceExprBody envinner genOuterTy tpenv innerComp + + let inputExprMark = inputExpr.Range + + let matchv, matchExpr = + compileSeqExprMatchClauses cenv envinner inputExprMark (pat', vspecs) innerExpr (Some inputExpr) bindPatTy genOuterTy + + let consumeExpr = mkLambda mBind matchv (matchExpr, genOuterTy) + + // The 'mBind' is attached to the lambda + Some(mkSeqUsing cenv env wholeExprMark bindPatTy genOuterTy inputExpr consumeExpr, tpenv) + + | SynExpr.LetOrUseBang(range = m) -> error (Error(FSComp.SR.tcUseForInSequenceExpression (), m)) + + | SynExpr.Match(spMatch, expr, clauses, _m, _trivia) -> + let inputExpr, inputTy, tpenv = TcExprOfUnknownType cenv env tpenv expr + + let tclauses, tpenv = + (tpenv, clauses) + ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, innerComp, _, sp, trivia) as clause) -> + let isTrueMatchClause = + if clause.IsTrueMatchClause then + TcTrueMatchClause.Yes + else + TcTrueMatchClause.No + + let patR, condR, vspecs, envinner, tpenv = + TcMatchPattern cenv inputTy env tpenv pat cond isTrueMatchClause + + let envinner = + match sp with + | DebugPointAtTarget.Yes -> { envinner with eIsControlFlow = true } + | DebugPointAtTarget.No -> envinner + + let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp + MatchClause(patR, condR, TTarget(vspecs, innerExpr, None), patR.Range), tpenv) + + let inputExprTy = tyOfExpr cenv.g inputExpr + let inputExprMark = inputExpr.Range + + let matchv, matchExpr = + CompilePatternForMatchClauses + cenv + env + inputExprMark + inputExprMark + true + ThrowIncompleteMatchException + (Some inputExpr) + inputExprTy + genOuterTy + tclauses + + Some(mkLet spMatch inputExprMark matchv inputExpr matchExpr, tpenv) + + | SynExpr.TryWith(innerTry, withList, mTryToWith, _spTry, _spWith, trivia) -> + if not (g.langVersion.SupportsFeature(LanguageFeature.TryWithInSeqExpression)) then + error (Error(FSComp.SR.tcTryIllegalInSequenceExpression (), mTryToWith)) + + let env = { env with eIsControlFlow = true } + + let tryExpr, tpenv = + let inner, tpenv = tcSequenceExprBody env genOuterTy tpenv innerTry + mkSeqDelayedExpr mTryToWith inner, tpenv + + // Compile the pattern twice, once as a filter with all succeeding targets returning "1", and once as a proper catch block. + let clauses, tpenv = + (tpenv, withList) + ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, innerComp, m, sp, trivia) as clause) -> + let isTrueMatchClause = + if clause.IsTrueMatchClause then + TcTrueMatchClause.Yes + else + TcTrueMatchClause.No + + let patR, condR, vspecs, envinner, tpenv = + TcMatchPattern cenv g.exn_ty env tpenv pat cond isTrueMatchClause + + let envinner = + match sp with + | DebugPointAtTarget.Yes -> { envinner with eIsControlFlow = true } + | DebugPointAtTarget.No -> envinner + + let matchBody, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp + + let handlerClause = + MatchClause(patR, condR, TTarget(vspecs, matchBody, None), patR.Range) + + let filterClause = + MatchClause(patR, condR, TTarget(vspecs, Expr.Const(Const.Int32 1, m, g.int_ty), None), patR.Range) + + (handlerClause, filterClause), tpenv) + + let handlers, filterClauses = List.unzip clauses + let withRange = trivia.WithToEndRange + + let v1, filterExpr = + CompilePatternForMatchClauses cenv env withRange withRange true FailFilter None g.exn_ty g.int_ty filterClauses + + let v2, handlerExpr = + CompilePatternForMatchClauses cenv env withRange withRange true FailFilter None g.exn_ty genOuterTy handlers + + let filterLambda = mkLambda filterExpr.Range v1 (filterExpr, genOuterTy) + let handlerLambda = mkLambda handlerExpr.Range v2 (handlerExpr, genOuterTy) + + let combinatorExpr = + mkSeqTryWith cenv env mTryToWith genOuterTy tryExpr filterLambda handlerLambda + + Some(combinatorExpr, tpenv) + + | SynExpr.YieldOrReturnFrom(flags = (isYield, _); expr = synYieldExpr; trivia = { YieldOrReturnFromKeyword = m }) -> + let env = { env with eIsControlFlow = false } + let resultExpr, genExprTy, tpenv = TcExprOfUnknownType cenv env tpenv synYieldExpr + + if not isYield then + errorR (Error(FSComp.SR.tcUseYieldBangForMultipleResults (), m)) + + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css synYieldExpr.Range NoTrace genOuterTy genExprTy + + let resultExpr = + mkCoerceExpr (resultExpr, genOuterTy, synYieldExpr.Range, genExprTy) + + let resultExpr = + if IsControlFlowExpression synYieldExpr then + resultExpr + else + mkDebugPoint resultExpr.Range resultExpr + + Some(resultExpr, tpenv) + + | SynExpr.YieldOrReturn(flags = (isYield, _); expr = synYieldExpr; trivia = { YieldOrReturnKeyword = m }) -> + let env = { env with eIsControlFlow = false } + let genResultTy = NewInferenceType g + + if not isYield then + errorR (Error(FSComp.SR.tcSeqResultsUseYield (), m)) + + UnifyTypes cenv env synYieldExpr.Range genOuterTy (mkSeqTy cenv.g genResultTy) + + let resultExpr, tpenv = TcExprFlex cenv flex true genResultTy env tpenv synYieldExpr + + let resultExpr = mkCallSeqSingleton cenv.g synYieldExpr.Range genResultTy resultExpr + + let resultExpr = + if IsControlFlowExpression synYieldExpr then + resultExpr + else + mkDebugPoint synYieldExpr.Range resultExpr + + Some(resultExpr, tpenv) + + | _ -> None + + and tcSequenceExprBody env (genOuterTy: TType) tpenv comp = + let res, tpenv = tcSequenceExprBodyAsSequenceOrStatement env genOuterTy tpenv comp + + match res with + | Choice1Of2 expr -> expr, tpenv + | Choice2Of2 stmt -> + let m = comp.Range + let resExpr = Expr.Sequential(stmt, mkSeqEmpty cenv env m genOuterTy, NormalSeq, m) + resExpr, tpenv + + and tcSequenceExprBodyAsSequenceOrStatement env genOuterTy tpenv comp = + match tryTcSequenceExprBody env genOuterTy tpenv comp with + | Some(expr, tpenv) -> Choice1Of2 expr, tpenv + | None -> + + let env = + { env with + eContextInfo = ContextInfo.SequenceExpression genOuterTy + } + + if enableImplicitYield then + let hasTypeUnit, _ty, expr, tpenv = TryTcStmt cenv env tpenv comp + + if hasTypeUnit then + Choice2Of2 expr, tpenv + else + let genResultTy = NewInferenceType g + let mExpr = expr.Range + UnifyTypes cenv env mExpr genOuterTy (mkSeqTy cenv.g genResultTy) + let expr, tpenv = TcExprFlex cenv flex true genResultTy env tpenv comp + let exprTy = tyOfExpr cenv.g expr + AddCxTypeMustSubsumeType env.eContextInfo env.DisplayEnv cenv.css mExpr NoTrace genResultTy exprTy + + let resExpr = + mkCallSeqSingleton cenv.g mExpr genResultTy (mkCoerceExpr (expr, genResultTy, mExpr, exprTy)) + + Choice1Of2 resExpr, tpenv + else + let stmt, tpenv = TcStmtThatCantBeCtorBody cenv env tpenv comp + Choice2Of2 stmt, tpenv + + let coreExpr, tpenv = tcSequenceExprBody env overallTy.Commit tpenv comp + let delayedExpr = mkSeqDelayedExpr coreExpr.Range coreExpr + delayedExpr, tpenv + +let TcSequenceExpressionEntry (cenv: TcFileState) env (overallTy: OverallTy) tpenv (hasBuilder, comp) m = + match RewriteRangeExpr comp with + | Some replacementExpr -> TcExpr cenv overallTy env tpenv replacementExpr + | None -> + let implicitYieldEnabled = + cenv.g.langVersion.SupportsFeature LanguageFeature.ImplicitYield + + let validateObjectSequenceOrRecordExpression = not implicitYieldEnabled + + match comp with + | SimpleSemicolonSequence cenv false _ when validateObjectSequenceOrRecordExpression -> + errorR (Error(FSComp.SR.tcInvalidObjectSequenceOrRecordExpression (), m)) + | _ -> () + + if not hasBuilder && not cenv.g.compilingFSharpCore then + error (Error(FSComp.SR.tcInvalidSequenceExpressionSyntaxForm (), m)) + + TcSequenceExpression cenv env tpenv comp overallTy m diff --git a/src/fcs-fable/src/Compiler/Checking/FindUnsolved.fs b/src/fcs-fable/src/Compiler/Checking/FindUnsolved.fs index cfc34649ae..10eb7ab672 100644 --- a/src/fcs-fable/src/Compiler/Checking/FindUnsolved.fs +++ b/src/fcs-fable/src/Compiler/Checking/FindUnsolved.fs @@ -167,7 +167,7 @@ and accOp cenv env (op, tyargs, args, m) = | _ -> () /// Walk a trait call, collecting type variables -and accTraitInfo cenv env (mFallback : range) (TTrait(tys, _nm, _, argTys, retTy, _sln)) = +and accTraitInfo cenv env (mFallback : range) (TTrait(tys=tys; objAndArgTys=argTys; returnTyOpt=retTy)) = argTys |> accTypeInst cenv env mFallback retTy |> Option.iter (accTy cenv env mFallback) tys |> List.iter (accTy cenv env mFallback) diff --git a/src/fcs-fable/src/Compiler/Checking/InfoReader.fs b/src/fcs-fable/src/Compiler/Checking/InfoReader.fs index 86bbb1b83c..77fb623efb 100644 --- a/src/fcs-fable/src/Compiler/Checking/InfoReader.fs +++ b/src/fcs-fable/src/Compiler/Checking/InfoReader.fs @@ -4,6 +4,7 @@ /// Select members from a type by name, searching the type hierarchy if needed module internal FSharp.Compiler.InfoReader +open System open System.Collections.Concurrent open System.Collections.Generic open Internal.Utilities.Library @@ -23,9 +24,10 @@ open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypeHierarchy open FSharp.Compiler.TypeRelations +open Import /// Use the given function to select some of the member values from the members of an F# type -let SelectImmediateMemberVals g optFilter f (tcref: TyconRef) = +let SelectImmediateMemberVals g optFilter f withExplicitImpl (tcref: TyconRef) = let chooser (vref: ValRef) = match vref.MemberInfo with // The 'when' condition is a workaround for the fact that values providing @@ -33,7 +35,7 @@ let SelectImmediateMemberVals g optFilter f (tcref: TyconRef) = // These cannot be selected directly via the "." notation. // However, it certainly is useful to be able to publish these values, as we can in theory // optimize code to make direct calls to these methods. - | Some membInfo when not (ValRefIsExplicitImpl g vref) -> + | Some membInfo when withExplicitImpl || not (ValRefIsExplicitImpl g vref) -> f membInfo vref | _ -> None @@ -52,7 +54,7 @@ let TrySelectMemberVal g optFilter ty pri _membInfo (vref: ValRef) = else None -let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy metadataTy = +let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m withExplicitImpl origTy metadataTy = let minfos = match metadataOfTy g metadataTy with @@ -76,25 +78,28 @@ let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy // In this case convert to the .NET Tuple type that carries metadata and try again if isAnyTupleTy g metadataTy then let betterMetadataTy = convertToTypeWithMetadataIfPossible g metadataTy - GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy betterMetadataTy + GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m withExplicitImpl origTy betterMetadataTy // Function types support methods FSharpFunc<_, _>.FromConverter and friends from .NET metadata, // but not instance methods (you can't write "f.Invoke(x)", you have to write "f x") elif isFunTy g metadataTy then let betterMetadataTy = convertToTypeWithMetadataIfPossible g metadataTy - GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy betterMetadataTy + GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m withExplicitImpl origTy betterMetadataTy |> List.filter (fun minfo -> not minfo.IsInstance) else match tryTcrefOfAppTy g metadataTy with | ValueNone -> [] | ValueSome tcref -> - SelectImmediateMemberVals g optFilter (TrySelectMemberVal g optFilter origTy None) tcref + SelectImmediateMemberVals g optFilter (TrySelectMemberVal g optFilter origTy None) withExplicitImpl tcref let minfos = minfos |> List.filter (IsMethInfoAccessible amap m ad) minfos /// Query the immediate methods of an F# type, not taking into account inherited methods. The optFilter /// parameter is an optional name to restrict the set of properties returned. let GetImmediateIntrinsicMethInfosOfType (optFilter, ad) g amap m ty = - GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m ty ty + GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m false ty ty + +let GetImmediateIntrinsicMethInfosWithExplicitImplOfType (optFilter, ad) g amap m ty = + GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m true ty ty /// Query the immediate methods of an F# type, not taking into account inherited methods. The optFilter /// parameter is an optional name to restrict the set of properties returned. @@ -184,7 +189,7 @@ type PropertyCollector(g, amap, m, ty, optFilter, ad) = member _.Close() = [ for KeyValue(_, pinfo) in props -> pinfo ] -let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m origTy metadataTy = +let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m withExplicitImpl origTy metadataTy = let pinfos = match metadataOfTy g metadataTy with @@ -215,13 +220,13 @@ let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m origTy // In this case convert to the .NET Tuple type that carries metadata and try again if isAnyTupleTy g metadataTy || isFunTy g metadataTy then let betterMetadataTy = convertToTypeWithMetadataIfPossible g metadataTy - GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m origTy betterMetadataTy + GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m withExplicitImpl origTy betterMetadataTy else match tryTcrefOfAppTy g metadataTy with | ValueNone -> [] | ValueSome tcref -> let propCollector = PropertyCollector(g, amap, m, origTy, optFilter, ad) - SelectImmediateMemberVals g None (fun membInfo vref -> propCollector.Collect(membInfo, vref); None) tcref |> ignore + SelectImmediateMemberVals g None (fun membInfo vref -> propCollector.Collect(membInfo, vref); None) withExplicitImpl tcref |> ignore propCollector.Close() let pinfos = pinfos |> List.filter (IsPropInfoAccessible g amap m ad) @@ -229,8 +234,11 @@ let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m origTy /// Query the immediate properties of an F# type, not taking into account inherited properties. The optFilter /// parameter is an optional name to restrict the set of properties returned. -let rec GetImmediateIntrinsicPropInfosOfType (optFilter, ad) g amap m ty = - GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m ty ty +let GetImmediateIntrinsicPropInfosOfType (optFilter, ad) g amap m ty = + GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m false ty ty + +let GetImmediateIntrinsicPropInfosWithExplicitImplOfType (optFilter, ad) g amap m ty = + GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m true ty ty // Checks whether the given type has an indexer property. let IsIndexerType g amap ty = @@ -312,7 +320,7 @@ type FindMemberFlag = /// Get overrides instead of abstract slots when measuring whether a class/interface implements all its required slots. | PreferOverrides /// Similar to "IgnoreOverrides", but filters the items bottom-to-top, - /// and discards all when finds first non-virtual member which hides one above it in hirearchy. + /// and discards all when finds first non-virtual member which hides one above it in hierarchy. | DiscardOnFirstNonOverride /// The input list is sorted from most-derived to least-derived type, so any System.Object methods @@ -479,7 +487,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = // MethodImpls contains a list of methods that override. // OverrideBy is the method that does the overriding. - // Overrides is the method being overriden. + // Overrides is the method being overridden. (acc, mimpls) ||> List.fold (fun acc ilMethImpl -> let overridesName = ilMethImpl.Overrides.MethodRef.Name @@ -643,6 +651,11 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = MethInfosEquivByNameAndSig EraseNone true g amap m, (fun minfo -> minfo.LogicalName)) + static let PropsGetterSetterEquiv innerEquality (p1:PropInfo) (p2:PropInfo) : bool = + p1.HasGetter = p2.HasGetter && + p1.HasSetter = p2.HasSetter && + innerEquality p1 p2 + /// Filter the overrides of properties, either keeping the overrides or keeping the dispatch slots. static let FilterOverridesOfPropInfos findFlag g amap m props = props @@ -651,9 +664,47 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = (fun pinfo -> pinfo.IsNewSlot), (fun pinfo -> pinfo.IsDefiniteFSharpOverride), (fun _ -> false), - PropInfosEquivByNameAndSig EraseNone g amap m, + PropsGetterSetterEquiv (PropInfosEquivByNameAndSig EraseNone g amap m), (fun pinfo -> pinfo.PropertyName)) + //type A() = + // abstract E: int with get, set + // default val E = 0 with get + // Will get (A::E with get, A::E with get, set) + // ----- + //type A() = + // member val A = 0 with get, set + //type B() = + // inherit A() + // static member val A = 0 + // Will get (static B::A, None) + static let FilterOverridesOfPropInfosWithOverriddenProp findFlag g amap m props = + let checkProp prop prop2 = + not(obj.ReferenceEquals(prop, prop2)) && + PropInfosEquivByNameAndSig EraseNone g amap m prop prop2 && + if prop.HasGetter && prop.HasSetter then false + elif prop.HasGetter then prop2.HasSetter + elif prop.HasSetter then prop2.HasGetter + else false + + let rec findPropBefore prop hasMetTheProp = + function + | props :: t when hasMetTheProp -> + match props |> List.tryFind (checkProp prop) with + | Some p -> ValueSome p + | None -> findPropBefore prop true t + | props :: t -> + if props |> List.exists (fun i -> obj.ReferenceEquals(prop, i)) then + match props |> List.tryFind (checkProp prop) with + | Some p -> ValueSome p + | None -> findPropBefore prop true t + else findPropBefore prop false t + | _ -> ValueNone + + props + |> FilterOverridesOfPropInfos findFlag g amap m + |> List.map (List.map (fun prop -> struct(prop, if findFlag = FindMemberFlag.IgnoreOverrides || prop.IsNewSlot then ValueNone else findPropBefore prop false props))) + /// Exclude methods from super types which have the same signature as a method in a more specific type. static let ExcludeHiddenOfMethInfosImpl g amap m (minfos: MethInfo list list) = minfos @@ -669,7 +720,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = /// Exclude properties from super types which have the same name as a property in a more specific type. static let ExcludeHiddenOfPropInfosImpl g amap m pinfos = pinfos - |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes (fun (pinfo: PropInfo) -> pinfo.PropertyName) (PropInfosEquivByNameAndPartialSig EraseNone g amap m) + |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes (fun (pinfo: PropInfo) -> pinfo.PropertyName) (PropsGetterSetterEquiv (PropInfosEquivByNameAndPartialSig EraseNone g amap m)) |> List.concat /// Make a cache for function 'f' keyed by type (plus some additional 'flags') that only @@ -681,25 +732,28 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = // Only cache closed, monomorphic types (closed = all members for the type // have been processed). Generic type instantiations could be processed if we had // a decent hash function for these. + + // Nullness of `ty` (TType_app) is not considered here, as the info is used to load members of the type + // It would matter for different generic instantiations of the same type, but we don't cache that here - TType_app is always matched for `[]` typars. canMemoize=(fun (_flags, _: range, ty) -> match stripTyEqns g ty with - | TType_app(tcref, [], _) -> tcref.TypeContents.tcaug_closed + | TType_app(tcref, [], _) -> tcref.TypeContents.tcaug_closed | _ -> false), keyComparer= { new IEqualityComparer<_> with - member _.Equals((flags1, _, ty1), (flags2, _, ty2)) = - // Ignoring the ranges - that's OK. - flagsEq.Equals(flags1, flags2) && - match stripTyEqns g ty1, stripTyEqns g ty2 with - | TType_app(tcref1, [], _), TType_app(tcref2, [], _) -> tyconRefEq g tcref1 tcref2 - | _ -> false member _.GetHashCode((flags, _, ty)) = // Ignoring the ranges - that's OK. flagsEq.GetHashCode flags + (match stripTyEqns g ty with | TType_app(tcref, [], _) -> hash tcref.LogicalName - | _ -> 0) }) + | _ -> 0) + member _.Equals((flags1, _, ty1), (flags2, _, ty2)) = + // Ignoring the ranges - that's OK. + flagsEq.Equals(flags1, flags2) && + match stripTyEqns g ty1, stripTyEqns g ty2 with + | TType_app(tcref1, [], _),TType_app(tcref2, [], _) -> tyconRefEq g tcref1 tcref2 + | _ -> false }) let FindImplicitConversionsUncached (ad, m, ty) = if isTyparTy g ty then @@ -741,7 +795,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = let hashFlags3 = { new IEqualityComparer with member _.GetHashCode((ad: AccessorDomain)) = AccessorDomain.CustomGetHashCode ad - member _.Equals((ad1), (ad2)) = AccessorDomain.CustomEquals(g, ad1, ad2) } + member _.Equals((ad1), (ad2)) = nullSafeEquality ad1 ad2 (fun ad1 ad2 -> AccessorDomain.CustomEquals(g, ad1, ad2)) } let hashFlags4 = { new IEqualityComparer with @@ -904,6 +958,12 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) as this = member infoReader.GetIntrinsicPropInfosOfType optFilter ad allowMultiIntfInst findFlag m ty = infoReader.GetIntrinsicPropInfoSetsOfType optFilter ad allowMultiIntfInst findFlag m ty |> List.concat + /// Get the flattened list of intrinsic properties in the hierarchy + member infoReader.GetIntrinsicPropInfoWithOverriddenPropOfType optFilter ad allowMultiIntfInst findFlag m ty = + infoReader.GetRawIntrinsicPropertySetsOfType(optFilter, ad, allowMultiIntfInst, m, ty) + |> FilterOverridesOfPropInfosWithOverriddenProp findFlag infoReader.g infoReader.amap m + |> List.concat + member _.GetTraitInfosInType optFilter ty = GetImmediateTraitsInfosOfType optFilter g ty @@ -957,6 +1017,9 @@ let GetIntrinsicMethInfosOfType (infoReader: InfoReader) optFilter ad allowMulti let GetIntrinsicPropInfosOfType (infoReader: InfoReader) optFilter ad allowMultiIntfInst findFlag m ty = infoReader.GetIntrinsicPropInfosOfType optFilter ad allowMultiIntfInst findFlag m ty +let GetIntrinsicPropInfoWithOverriddenPropOfType (infoReader: InfoReader) optFilter ad allowMultiIntfInst findFlag m ty = + infoReader.GetIntrinsicPropInfoWithOverriddenPropOfType optFilter ad allowMultiIntfInst findFlag m ty + let TryFindIntrinsicNamedItemOfType (infoReader: InfoReader) (nm, ad, includeConstraints) findFlag m ty = infoReader.TryFindIntrinsicNamedItemOfType (nm, ad, includeConstraints) findFlag m ty @@ -967,7 +1030,7 @@ let TryFindIntrinsicPropInfo (infoReader: InfoReader) m ad nm ty = infoReader.TryFindIntrinsicPropInfo m ad nm ty /// Get a set of most specific override methods. -let GetIntrinisicMostSpecificOverrideMethInfoSetsOfType (infoReader: InfoReader) m ty = +let GetIntrinsicMostSpecificOverrideMethInfoSetsOfType (infoReader: InfoReader) m ty = infoReader.GetIntrinsicMostSpecificOverrideMethodSetsOfType (None, AccessibleFromSomewhere, AllowMultiIntfInstantiations.Yes, m, ty) //------------------------------------------------------------------------- @@ -1020,7 +1083,7 @@ let TryDestStandardDelegateType (infoReader: InfoReader) m ad delTy = let g = infoReader.g let (SigOfFunctionForDelegate(_, delArgTys, delRetTy, _)) = GetSigOfFunctionForDelegate infoReader delTy m ad match delArgTys with - | senderTy :: argTys when (isObjTy g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkRefTupledTy g argTys, delRetTy) + | senderTy :: argTys when (isObjTyAnyNullness g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkRefTupledTy g argTys, delRetTy) | _ -> None @@ -1071,7 +1134,7 @@ let TryFindMetadataInfoOfExternalEntityRef (infoReader: InfoReader) m eref = // Generalize to get a formal signature let formalTypars = eref.Typars m let formalTypeInst = generalizeTypars formalTypars - let ty = TType_app(eref, formalTypeInst, 0uy) + let ty = TType_app(eref, formalTypeInst, KnownAmbivalentToNull) if isILAppTy g ty then let formalTypeInfo = ILTypeInfo.FromType g ty Some(nlref.Ccu.FileName, formalTypars, formalTypeInfo) @@ -1097,14 +1160,14 @@ let GetXmlDocSigOfEntityRef infoReader m (eref: EntityRef) = else let ccuFileName = libFileOfEntityRef eref let m = eref.Deref - if m.XmlDocSig = "" then + if String.IsNullOrEmpty(m.XmlDocSig) then m.XmlDocSig <- XmlDocSigOfEntity eref Some (ccuFileName, m.XmlDocSig) let GetXmlDocSigOfScopedValRef g (tcref: TyconRef) (vref: ValRef) = let ccuFileName = libFileOfEntityRef tcref let v = vref.Deref - if v.XmlDocSig = "" && v.HasDeclaringEntity then + if String.IsNullOrEmpty(v.XmlDocSig) && v.HasDeclaringEntity then let ap = buildAccessPath vref.DeclaringEntity.CompilationPathOpt let path = if vref.DeclaringEntity.IsModule then @@ -1118,18 +1181,19 @@ let GetXmlDocSigOfScopedValRef g (tcref: TyconRef) (vref: ValRef) = let GetXmlDocSigOfRecdFieldRef (rfref: RecdFieldRef) = let tcref = rfref.TyconRef let ccuFileName = libFileOfEntityRef tcref - if rfref.RecdField.XmlDocSig = "" then + if String.IsNullOrEmpty(rfref.RecdField.XmlDocSig) then rfref.RecdField.XmlDocSig <- XmlDocSigOfProperty [tcref.CompiledRepresentationForNamedType.FullName; rfref.RecdField.LogicalName] Some (ccuFileName, rfref.RecdField.XmlDocSig) let GetXmlDocSigOfUnionCaseRef (ucref: UnionCaseRef) = let tcref = ucref.TyconRef let ccuFileName = libFileOfEntityRef tcref - if ucref.UnionCase.XmlDocSig = "" then + if String.IsNullOrEmpty(ucref.UnionCase.XmlDocSig) then ucref.UnionCase.XmlDocSig <- XmlDocSigOfUnionCase [tcref.CompiledRepresentationForNamedType.FullName; ucref.CaseName] Some (ccuFileName, ucref.UnionCase.XmlDocSig) -let GetXmlDocSigOfMethInfo (infoReader: InfoReader) m (minfo: MethInfo) = +[] +let rec GetXmlDocSigOfMethInfo (infoReader: InfoReader) m (minfo: MethInfo) = let amap = infoReader.amap match minfo with | FSMeth (g, _, vref, _) -> @@ -1142,7 +1206,7 @@ let GetXmlDocSigOfMethInfo (infoReader: InfoReader) m (minfo: MethInfo) = match TryFindMetadataInfoOfExternalEntityRef infoReader m ilminfo.DeclaringTyconRef with | None -> None | Some (ccuFileName, formalTypars, formalTypeInfo) -> - let filminfo = ILMethInfo(g, formalTypeInfo.ToType, None, ilminfo.RawMetadata, fmtps) + let filminfo = ILMethInfo(g, IlType formalTypeInfo, ilminfo.RawMetadata, fmtps) let args = if ilminfo.IsILExtensionMethod then filminfo.GetRawArgTypes(amap, m, minfo.FormalMethodInst) @@ -1157,6 +1221,7 @@ let GetXmlDocSigOfMethInfo (infoReader: InfoReader) m (minfo: MethInfo) = Some (ccuFileName, "M:"+actualTypeName+"."+normalizedName+genericArity+XmlDocArgsEnc g (formalTypars, fmtps) args) + | MethInfoWithModifiedReturnType(mi,_) -> GetXmlDocSigOfMethInfo infoReader m mi | DefaultStructCtor(g, ty) -> match tryTcrefOfAppTy g ty with | ValueSome tcref -> @@ -1171,7 +1236,7 @@ let GetXmlDocSigOfValRef g (vref: ValRef) = if not vref.IsLocalRef then let ccuFileName = vref.nlr.Ccu.FileName let v = vref.Deref - if v.XmlDocSig = "" && v.HasDeclaringEntity then + if String.IsNullOrEmpty(v.XmlDocSig) && v.HasDeclaringEntity then v.XmlDocSig <- XmlDocSigOfVal g false vref.DeclaringEntity.CompiledRepresentationForNamedType.Name v Some (ccuFileName, v.XmlDocSig) else diff --git a/src/fcs-fable/src/Compiler/Checking/InfoReader.fsi b/src/fcs-fable/src/Compiler/Checking/InfoReader.fsi index 3e8ceb927c..f96c1757ad 100644 --- a/src/fcs-fable/src/Compiler/Checking/InfoReader.fsi +++ b/src/fcs-fable/src/Compiler/Checking/InfoReader.fsi @@ -34,6 +34,16 @@ val GetImmediateIntrinsicMethInfosOfType: ty: TType -> MethInfo list +/// Query the immediate methods of an F# type, not taking into account inherited methods. The optFilter +/// parameter is an optional name to restrict the set of properties returned. +val GetImmediateIntrinsicMethInfosWithExplicitImplOfType: + optFilter: string option * ad: AccessorDomain -> + g: TcGlobals -> + amap: ImportMap -> + m: range -> + ty: TType -> + MethInfo list + /// A helper type to help collect properties. /// /// Join up getters and setters which are not associated in the F# data structure @@ -55,6 +65,16 @@ val GetImmediateIntrinsicPropInfosOfType: ty: TType -> PropInfo list +/// Query the immediate properties of an F# type, not taking into account inherited properties. The optFilter +/// parameter is an optional name to restrict the set of properties returned. +val GetImmediateIntrinsicPropInfosWithExplicitImplOfType: + optFilter: string option * ad: AccessorDomain -> + g: TcGlobals -> + amap: ImportMap -> + m: range -> + ty: TType -> + PropInfo list + /// Checks whether the given type has an indexer property. val IsIndexerType: g: TcGlobals -> amap: ImportMap -> ty: TType -> bool @@ -91,7 +111,7 @@ type FindMemberFlag = | PreferOverrides /// Similar to "IgnoreOverrides", but filters the items bottom-to-top, - /// and discards all when finds first non-virtual member which hides one above it in hirearchy. + /// and discards all when finds first non-virtual member which hides one above it in hierarchy. | DiscardOnFirstNonOverride /// An InfoReader is an object to help us read and cache infos. @@ -261,6 +281,17 @@ val GetIntrinsicPropInfosOfType: ty: TType -> PropInfo list +/// Get the flattened list of intrinsic properties in the hierarchy. If the PropInfo is get-only or set-only, try to find its setter or getter from the hierarchy. +val GetIntrinsicPropInfoWithOverriddenPropOfType: + infoReader: InfoReader -> + optFilter: string option -> + ad: AccessorDomain -> + allowMultiIntfInst: AllowMultiIntfInstantiations -> + findFlag: FindMemberFlag -> + m: range -> + ty: TType -> + struct (PropInfo * PropInfo voption) list + /// Perform type-directed name resolution of a particular named member in an F# type val TryFindIntrinsicNamedItemOfType: infoReader: InfoReader -> @@ -280,7 +311,7 @@ val TryFindIntrinsicPropInfo: infoReader: InfoReader -> m: range -> ad: AccessorDomain -> nm: string -> ty: TType -> PropInfo list /// Get a set of most specific override methods. -val GetIntrinisicMostSpecificOverrideMethInfoSetsOfType: +val GetIntrinsicMostSpecificOverrideMethInfoSetsOfType: infoReader: InfoReader -> m: range -> ty: TType -> NameMultiMap /// Represents information about the delegate - the Invoke MethInfo, the delegate argument types, the delegate return type diff --git a/src/fcs-fable/src/Compiler/Checking/MethodCalls.fs b/src/fcs-fable/src/Compiler/Checking/MethodCalls.fs index 03f3177d2e..773a6e9a69 100644 --- a/src/fcs-fable/src/Compiler/Checking/MethodCalls.fs +++ b/src/fcs-fable/src/Compiler/Checking/MethodCalls.fs @@ -155,8 +155,8 @@ let AdjustDelegateTy (infoReader: InfoReader) actualTy reqdTy m = // NOTE: // no generic method op_Implicit as yet // -// Search for an adhoc conversion based on op_Implicit, optionally returing a new equational type constraint to -// eliminate articifical constrained type variables. +// Search for an adhoc conversion based on op_Implicit, optionally returning a new equational type constraint to +// eliminate artificial constrained type variables. // // Allow adhoc for X --> Y where there is an op_Implicit from X to Y, and there is // no feasible subtype relationship between X and Y. @@ -308,8 +308,8 @@ let rec AdjustRequiredTypeForTypeDirectedConversions (infoReader: InfoReader) ad else reqdTy, TypeDirectedConversionUsed.No, None - // Adhoc based on op_Implicit, perhaps returing a new equational type constraint to - // eliminate articifical constrained type variables. + // Adhoc based on op_Implicit, perhaps returning a new equational type constraint to + // eliminate artificial constrained type variables. elif g.langVersion.SupportsFeature LanguageFeature.AdditionalTypeDirectedConversions then match TryFindRelevantImplicitConversion infoReader ad reqdTy actualTy m with | Some (minfo, _staticTy, eqn) -> actualTy, TypeDirectedConversionUsed.Yes(warn (TypeDirectedConversion.Implicit minfo), false, false), Some eqn @@ -430,14 +430,7 @@ let AdjustCalledArgType (infoReader: InfoReader) ad isConstraint enforceNullable // If the called method argument is an inref type, then the caller may provide a byref or value if isInByrefTy g calledArgTy then -#if IMPLICIT_ADDRESS_OF - if isByrefTy g callerArgTy then - calledArgTy - else - destByrefTy g calledArgTy -#else calledArgTy, TypeDirectedConversionUsed.No, None -#endif // If the called method argument is a (non inref) byref type, then the caller may provide a byref or ref. elif isByrefTy g calledArgTy then @@ -487,7 +480,7 @@ let MakeCalledArgs amap m (minfo: MethInfo) minst = IsOutArg=isOutArg ReflArgInfo=reflArgInfo NameOpt=nmOpt - CalledArgumentType=calledArgTy }) + CalledArgumentType= changeWithNullReqTyToVariable amap.g calledArgTy}) /// /// Represents the syntactic matching between a caller of a method and the called method. @@ -530,6 +523,19 @@ type CalledMeth<'T> staticTyOpt: TType option) = let g = infoReader.g + + let minfo = + match callerObjArgTys,minfo with + | objTy :: [], ILMeth _ when + g.checkNullness + && minfo.DisplayName = "ToString" + && minfo.IsNullary + && (isAnonRecdTy g objTy || isRecdTy g objTy || isUnionTy g objTy) + && ( typeEquiv g g.obj_ty_noNulls minfo.ApparentEnclosingAppType + || typeEquiv g g.system_Value_ty minfo.ApparentEnclosingAppType) -> + MethInfoWithModifiedReturnType(minfo, g.string_ty) + | _ -> minfo + let methodRetTy = if minfo.IsConstructor then minfo.ApparentEnclosingType else minfo.GetFSharpReturnType(infoReader.amap, m, calledTyArgs) let fullCurriedCalledArgs = MakeCalledArgs infoReader.amap m minfo calledTyArgs @@ -538,7 +544,7 @@ type CalledMeth<'T> // Detect the special case where an indexer setter using param aray takes 'value' argument after ParamArray arguments let isIndexerSetter = match pinfoOpt with - | Some pinfo when pinfo.HasSetter && minfo.LogicalName.StartsWith "set_" && (List.concat fullCurriedCalledArgs).Length >= 2 -> true + | Some pinfo when pinfo.HasSetter && minfo.LogicalName.StartsWithOrdinal("set_") && (List.concat fullCurriedCalledArgs).Length >= 2 -> true | _ -> false let argSetInfos = @@ -556,6 +562,12 @@ type CalledMeth<'T> let nUnnamedCalledArgs = unnamedCalledArgs.Length if allowOutAndOptArgs && nUnnamedCallerArgs < nUnnamedCalledArgs then let unnamedCalledArgsTrimmed, unnamedCalledOptOrOutArgs = List.splitAt nUnnamedCallerArgs unnamedCalledArgs + + // take the last ParamArray arg out, make it not break the optional/out params check + let unnamedCalledArgsTrimmed, unnamedCalledOptOrOutArgs = + match List.rev unnamedCalledOptOrOutArgs with + | h :: t when h.IsParamArray -> unnamedCalledArgsTrimmed @ [h], List.rev t + | _ -> unnamedCalledArgsTrimmed, unnamedCalledOptOrOutArgs let isOpt x = x.OptArgInfo.IsOptional let isOut x = x.IsOutArg && isByrefTy g x.CalledArgumentType @@ -900,8 +912,8 @@ let IsBaseCall objArgs = /// For example, when calling an interface method on a struct, or a method on a constrained /// variable type. let ComputeConstrainedCallInfo g amap m staticTyOpt args (minfo: MethInfo) = - match args, staticTyOpt with - | _, Some staticTy when not minfo.IsExtensionMember && not minfo.IsInstance && minfo.IsAbstract -> Some staticTy + match args, staticTyOpt with + | _, Some staticTy when not minfo.IsExtensionMember && not minfo.IsInstance && (minfo.IsAbstract || minfo.IsVirtual) -> Some staticTy | (objArgExpr :: _), _ when minfo.IsInstance && not minfo.IsExtensionMember -> let methObjTy = minfo.ApparentEnclosingType @@ -1040,7 +1052,7 @@ let BuildFSharpMethodCall g m (ty, vref: ValRef) valUseFlags minst args = /// Make a call to a method info. Used by the optimizer and code generator to build /// calls to the type-directed solutions to member constraints. -let MakeMethInfoCall (amap: ImportMap) m (minfo: MethInfo) minst args staticTyOpt = +let rec MakeMethInfoCall (amap: ImportMap) m (minfo: MethInfo) minst args staticTyOpt = let g = amap.g let ccallInfo = ComputeConstrainedCallInfo g amap m staticTyOpt args minfo let valUseFlags = @@ -1060,6 +1072,8 @@ let MakeMethInfoCall (amap: ImportMap) m (minfo: MethInfo) minst args staticTyOp | FSMeth(g, ty, vref, _) -> BuildFSharpMethodCall g m (ty, vref) valUseFlags minst args |> fst + | MethInfoWithModifiedReturnType(mi,_) -> MakeMethInfoCall amap m mi minst args staticTyOpt + | DefaultStructCtor(_, ty) -> mkDefault (m, ty) @@ -1109,7 +1123,7 @@ let TryImportProvidedMethodBaseAsLibraryIntrinsic (amap: Import.ImportMap, m: ra // minst: the instantiation to apply for a generic method // objArgs: the 'this' argument, if any // args: the arguments, if any -let BuildMethodCall tcVal g amap isMutable m isProp minfo valUseFlags minst objArgs args staticTyOpt = +let rec BuildMethodCall tcVal g amap isMutable m isProp minfo valUseFlags minst objArgs args staticTyOpt = let direct = IsBaseCall objArgs TakeObjAddrForMethodCall g amap minfo isMutable m staticTyOpt objArgs (fun ccallInfo objArgs -> @@ -1182,10 +1196,24 @@ let BuildMethodCall tcVal g amap isMutable m isProp minfo valUseFlags minst objA let vExpr, vExprTy = tcVal vref valUseFlags (minfo.DeclaringTypeInst @ minst) m BuildFSharpMethodApp g m vref vExpr vExprTy allArgs + | MethInfoWithModifiedReturnType(mi,retTy) -> + let expr, exprTy = BuildMethodCall tcVal g amap isMutable m isProp mi valUseFlags minst objArgs args staticTyOpt + let expr = mkCoerceExpr(expr, retTy, m, exprTy) + expr, retTy + // Build a 'call' to a struct default constructor | DefaultStructCtor (g, ty) -> - if not (TypeHasDefaultValue g m ty) then - errorR(Error(FSComp.SR.tcDefaultStructConstructorCall(), m)) + if g.langFeatureNullness && g.checkNullness then + if not (TypeHasDefaultValueNew g m ty) then + // If the condition is detected because of a variation in logic introduced because + // of nullness checking, then only a warning is emitted. + if not (TypeHasDefaultValue g m ty) then + errorR(Error(FSComp.SR.tcDefaultStructConstructorCall(), m)) + else + warning(Error(FSComp.SR.tcDefaultStructConstructorCall(), m)) + else + if not (TypeHasDefaultValue g m ty) then + errorR(Error(FSComp.SR.tcDefaultStructConstructorCall(), m)) mkDefault (m, ty), ty) let ILFieldStaticChecks g amap infoReader ad m (finfo : ILFieldInfo) = @@ -1229,7 +1257,7 @@ let MethInfoChecks g amap isInstance tyargsOpt objArgs ad m (minfo: MethInfo) = AccessibleFrom(paths, None) | _ -> ad - if not (IsTypeAndMethInfoAccessible amap m adOriginal ad minfo) then + if not (minfo.IsProtectedAccessibility && minfo.LogicalName.StartsWithOrdinal("set_")) && not(IsTypeAndMethInfoAccessible amap m adOriginal ad minfo) then error (Error (FSComp.SR.tcMethodNotAccessible(minfo.LogicalName), m)) if isAnyTupleTy g minfo.ApparentEnclosingType && not minfo.IsExtensionMember && @@ -1245,7 +1273,7 @@ let MethInfoChecks g amap isInstance tyargsOpt objArgs ad m (minfo: MethInfo) = /// Build a call to the System.Object constructor taking no arguments, let BuildObjCtorCall (g: TcGlobals) m = let ilMethRef = (mkILCtorMethSpecForTy(g.ilg.typ_Object, [])).MethodRef - Expr.Op (TOp.ILCall (false, false, false, false, CtorValUsedAsSuperInit, false, true, ilMethRef, [], [], [g.obj_ty]), [], [], m) + Expr.Op (TOp.ILCall (false, false, false, false, CtorValUsedAsSuperInit, false, true, ilMethRef, [], [], [g.obj_ty_noNulls]), [], [], m) /// Implements the elaborated form of adhoc conversions from functions to delegates at member callsites let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, delInvokeMeth: MethInfo, delArgTys, delFuncExpr, delFuncTy, m) = @@ -1291,7 +1319,7 @@ let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, d | Some einfo -> match delArgVals with | [] -> error(nonStandardEventError einfo.EventName m) - | h :: _ when not (isObjTy g h.Type) -> error(nonStandardEventError einfo.EventName m) + | h :: _ when not (isObjTyAnyNullness g h.Type) -> error(nonStandardEventError einfo.EventName m) | h :: t -> [exprForVal m h; mkRefTupledVars g m t] | None -> if isNil delArgTys then [mkUnit g m] else List.map (exprForVal m) delArgVals @@ -1365,12 +1393,6 @@ let AdjustCallerArgExpr tcVal (g: TcGlobals) amap infoReader ad isOutArg calledA if isByrefTy g calledArgTy && isRefCellTy g callerArgTy then None, Expr.Op (TOp.RefAddrGet false, [destRefCellTy g callerArgTy], [callerArgExpr], m) -#if IMPLICIT_ADDRESS_OF - elif isInByrefTy g calledArgTy && not (isByrefTy g callerArgTy) then - let wrap, callerArgExprAddress, _readonly, _writeonly = mkExprAddrOfExpr g true false NeverMutates callerArgExpr None m - Some wrap, callerArgExprAddress -#endif - // auto conversions to quotations (to match auto conversions to LINQ expressions) elif reflArgInfo.AutoQuote && isQuotedExprTy g calledArgTy && not (isQuotedExprTy g callerArgTy) then match reflArgInfo with @@ -1432,7 +1454,7 @@ let rec GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g (calledArg: C | Some tref -> let ty = mkILNonGenericBoxedTy tref let mref = mkILCtorMethSpecForTy(ty, [g.ilg.typ_Object]).MethodRef - let expr = Expr.Op (TOp.ILCall (false, false, false, true, NormalValUse, false, false, mref, [], [], [g.obj_ty]), [], [mkDefault(mMethExpr, currCalledArgTy)], mMethExpr) + let expr = Expr.Op (TOp.ILCall (false, false, false, true, NormalValUse, false, false, mref, [], [], [g.obj_ty_noNulls]), [], [mkDefault(mMethExpr, currCalledArgTy)], mMethExpr) emptyPreBinder, expr | WrapperForIUnknown -> @@ -1441,7 +1463,7 @@ let rec GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g (calledArg: C | Some tref -> let ty = mkILNonGenericBoxedTy tref let mref = mkILCtorMethSpecForTy(ty, [g.ilg.typ_Object]).MethodRef - let expr = Expr.Op (TOp.ILCall (false, false, false, true, NormalValUse, false, false, mref, [], [], [g.obj_ty]), [], [mkDefault(mMethExpr, currCalledArgTy)], mMethExpr) + let expr = Expr.Op (TOp.ILCall (false, false, false, true, NormalValUse, false, false, mref, [], [], [g.obj_ty_noNulls]), [], [mkDefault(mMethExpr, currCalledArgTy)], mMethExpr) emptyPreBinder, expr | PassByRef (ty, dfltVal2) -> @@ -1681,7 +1703,7 @@ let AdjustCallerArgs tcVal tcFieldInit eCallerMemberName (infoReader: InfoReader AdjustOutCallerArgs g calledMeth mMethExpr let adjustedNormalUnnamedArgs, setterValueArgs = - // IsIndexParamArraySetter onlye occurs for + // IsIndexParamArraySetter only occurs for // expr.[indexes] <- value // where the 'value' arg to the setter is always the last unnamed argument (there is no syntax to use a named argument for it) // Indeed in this case there will be no named/optional/out arguments. @@ -1725,7 +1747,7 @@ let AdjustCallerArgs tcVal tcFieldInit eCallerMemberName (infoReader: InfoReader // This file is not a great place for this functionality to sit, it's here because of BuildMethodCall module ProvidedMethodCalls = - let private convertConstExpr g amap m (constant : Tainted) = + let private convertConstExpr g amap m (constant : Tainted) = let obj, objTy = constant.PApply2(id, m) let ty = Import.ImportProvidedType amap m objTy let normTy = normalizeEnumTy g ty @@ -1749,7 +1771,7 @@ module ProvidedMethodCalls = | _ when typeEquiv g normTy g.float32_ty -> Const.Single(v :?> float32) | _ when typeEquiv g normTy g.float_ty -> Const.Double(v :?> float) | _ when typeEquiv g normTy g.char_ty -> Const.Char(v :?> char) - | _ when typeEquiv g normTy g.string_ty -> Const.String(v :?> string) + | _ when typeEquiv g normTy g.string_ty -> Const.String(!!v :?> string) | _ when typeEquiv g normTy g.decimal_ty -> Const.Decimal(v :?> decimal) | _ when typeEquiv g normTy g.unit_ty -> Const.Unit | _ -> fail() @@ -1937,13 +1959,6 @@ module ProvidedMethodCalls = let infoReader = InfoReader(g, amap) let exprR = CoerceFromFSharpFuncToDelegate g amap infoReader AccessorDomain.AccessibleFromSomewhere lambdaExprTy m lambdaExpr delegateTyR None, (exprR, tyOfExpr g exprR) -#if PROVIDED_ADDRESS_OF - | ProvidedAddressOfExpr e -> - let eR = exprToExpr (exprType.PApply((fun _ -> e), m)) - let wrap,exprR, _readonly, _writeonly = mkExprAddrOfExpr g true false DefinitelyMutates eR None m - let exprR = wrap exprR - None, (exprR, tyOfExpr g exprR) -#endif | ProvidedDefaultExpr pty -> let ty = Import.ImportProvidedType amap m (exprType.PApply((fun _ -> pty), m)) let exprR = mkDefault (m, ty) @@ -2232,12 +2247,12 @@ let GenWitnessExpr amap g m (traitInfo: TraitConstraintInfo) argExprs = match traitInfo.Solution with | None -> None // the trait has been generalized | Some _-> - // For these operators, the witness is just a call to the coresponding FSharp.Core operator + // For these operators, the witness is just a call to the corresponding FSharp.Core operator match g.TryMakeOperatorAsBuiltInWitnessInfo isStringTy isArrayTy traitInfo argExprs with | Some (info, tyargs, actualArgExprs) -> tryMkCallCoreFunctionAsBuiltInWitness g info tyargs actualArgExprs m | None -> - // For all other built-in operators, the witness is a call to the coresponding BuiltInWitnesses operator + // For all other built-in operators, the witness is a call to the corresponding BuiltInWitnesses operator // These are called as F# methods not F# functions tryMkCallBuiltInWitness g traitInfo argExprs m diff --git a/src/fcs-fable/src/Compiler/Checking/MethodCalls.fsi b/src/fcs-fable/src/Compiler/Checking/MethodCalls.fsi index e5f377cadb..9ddc593e4a 100644 --- a/src/fcs-fable/src/Compiler/Checking/MethodCalls.fsi +++ b/src/fcs-fable/src/Compiler/Checking/MethodCalls.fsi @@ -481,7 +481,7 @@ exception FieldNotMutable of TypedTreeOps.DisplayEnv * RecdFieldRef * range val CheckRecdFieldMutation: m: range -> denv: TypedTreeOps.DisplayEnv -> rfinfo: RecdFieldInfo -> unit -/// Generate a witness for the given (solved) constraint. Five possiblilities are taken +/// Generate a witness for the given (solved) constraint. Five possibilities are taken /// into account. /// 1. The constraint is solved by a .NET-declared method or an F#-declared method /// 2. The constraint is solved by an F# record field diff --git a/src/fcs-fable/src/Compiler/Checking/MethodOverrides.fs b/src/fcs-fable/src/Compiler/Checking/MethodOverrides.fs index 5abf08578f..18b3f23190 100644 --- a/src/fcs-fable/src/Compiler/Checking/MethodOverrides.fs +++ b/src/fcs-fable/src/Compiler/Checking/MethodOverrides.fs @@ -107,6 +107,7 @@ exception TypeIsImplicitlyAbstract of range exception OverrideDoesntOverride of DisplayEnv * OverrideInfo * MethInfo option * TcGlobals * Import.ImportMap * range module DispatchSlotChecking = + open Import /// Print the signature of an override to a buffer as part of an error message let PrintOverrideToBuffer denv os (Override(_, _, id, methTypars, memberToParentInst, argTys, retTy, _, _, _)) = @@ -148,6 +149,12 @@ module DispatchSlotChecking = let _, _, argInfos, retTy, _ = GetTypeOfMemberInMemberForm g overrideBy let nm = overrideBy.LogicalName + if g.checkNullness && nm = "ToString" && (argInfos |> List.sumBy _.Length) = 0 && retTy.IsSome then + let returnsString = typeEquiv g retTy.Value g.string_ty + let retTyNullness = (nullnessOfTy g retTy.Value).TryEvaluate() + if returnsString && retTyNullness = ValueSome(NullnessInfo.WithNull) then + warning(Error(FSComp.SR.tcNullableToStringOverride(), overrideBy.Range)) + let argTys = argInfos |> List.mapSquared fst let memberMethodTypars, memberToParentInst, argTys, retTy = @@ -324,7 +331,7 @@ module DispatchSlotChecking = let CheckDispatchSlotsAreImplemented (denv, infoReader: InfoReader, m, nenv, sink: TcResultsSink, isOverallTyAbstract, - isObjExpr: bool, + isObjExpr, reqdTy, dispatchSlots: RequiredSlot list, availPriorOverrides: OverrideInfo list, @@ -333,7 +340,7 @@ module DispatchSlotChecking = let amap = infoReader.amap let isReqdTyInterface = isInterfaceTy g reqdTy - let showMissingMethodsAndRaiseErrors = (isReqdTyInterface || not isOverallTyAbstract) + let showMissingMethodsAndRaiseErrors = (isReqdTyInterface || not isOverallTyAbstract) || (isOverallTyAbstract && isObjExpr) let mutable res = true let fail exn = @@ -345,7 +352,7 @@ module DispatchSlotChecking = let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) let overridesKeyed = overrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) - // we accumulate those to compose a more complete error message, see noimpl() bellow. + // we accumulate those to compose a more complete error message, see noimpl() below. let missingOverloadImplementation = ResizeArray() for reqdSlot in dispatchSlots do @@ -363,7 +370,7 @@ module DispatchSlotChecking = | [ovd] -> if not ovd.IsCompilerGenerated then let item = Item.MethodGroup(ovd.LogicalName, [dispatchSlot],None) - CallNameResolutionSink sink (ovd.Range, nenv, item, dispatchSlot.FormalMethodTyparInst, ItemOccurence.Implemented, AccessorDomain.AccessibleFromSomewhere) + CallNameResolutionSink sink (ovd.Range, nenv, item, dispatchSlot.FormalMethodTyparInst, ItemOccurrence.Implemented, AccessorDomain.AccessibleFromSomewhere) | [] -> if not reqdSlot.IsOptional && // Check that no available prior override implements this dispatch slot @@ -380,8 +387,7 @@ module DispatchSlotChecking = let compiledSig = CompiledSigOfMeth g amap m dispatchSlot let noimpl() = - if dispatchSlot.IsInstance then - missingOverloadImplementation.Add((isReqdTyInterface, lazy NicePrint.stringOfMethInfo infoReader m denv dispatchSlot)) + missingOverloadImplementation.Add((isReqdTyInterface, lazy NicePrint.stringOfMethInfo infoReader m denv dispatchSlot)) match overrides |> List.filter (IsPartialMatch g dispatchSlot compiledSig) with | [] -> @@ -404,10 +410,8 @@ module DispatchSlotChecking = let (CompiledSig (vargTys, _, fvmethTypars, _)) = compiledSig - // Object expressions can only implement instance members - let isObjExprWithInstanceMembers = (isObjExpr && isInstance) - if isObjExprWithInstanceMembers || isInstance then - if moreThanOnePossibleDispatchSlot then + if isInstance then + if moreThanOnePossibleDispatchSlot then noimpl() elif (argTys.Length <> vargTys.Length) then @@ -416,7 +420,7 @@ module DispatchSlotChecking = fail(Error(FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) elif not (IsTyparKindMatch compiledSig overrideBy) then fail(Error(FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) - else + else fail(Error(FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo infoReader m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) | overrideBy :: _ -> errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) @@ -427,8 +431,8 @@ module DispatchSlotChecking = else // Error will be reported below in CheckOverridesAreAllUsedOnce () - | _ -> - fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot), m)) + | ambiguousOverride :: _ -> + fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap ambiguousOverride.Range denv dispatchSlot), ambiguousOverride.Range)) | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(FormatMethInfoSig g amap m denv dispatchSlot), m)) if missingOverloadImplementation.Count > 0 then @@ -482,7 +486,7 @@ module DispatchSlotChecking = // Get the most specific method overrides for each interface type. |> List.choose (fun (ty, m) -> - let mostSpecificOverrides = GetIntrinisicMostSpecificOverrideMethInfoSetsOfType infoReader m ty + let mostSpecificOverrides = GetIntrinsicMostSpecificOverrideMethInfoSetsOfType infoReader m ty if mostSpecificOverrides.IsEmpty then None else Some mostSpecificOverrides) @@ -506,8 +510,8 @@ module DispatchSlotChecking = let overrideBy = GetInheritedMemberOverrideInfo g amap m OverrideCanImplement.CanImplementAnyInterfaceSlot minfo let minfoTy = generalizedTyconRef g minfo.ApparentEnclosingTyconRef NameMultiMap.find minfo.LogicalName mostSpecificOverrides - |> List.filter (fun (overridenTy, minfo2) -> - typeEquiv g overridenTy minfoTy && + |> List.filter (fun (overriddenTy, minfo2) -> + typeEquiv g overriddenTy minfoTy && IsSigExactMatch g amap m minfo2 overrideBy) /// Get a collection of slots for the given interface type. @@ -776,7 +780,7 @@ module DispatchSlotChecking = // Get all the members that are immediately part of this type // Include the auto-generated members - let allImmediateMembers = tycon.MembersOfFSharpTyconSorted @ tycon.AllGeneratedValues + let allImmediateMembers = tycon.MembersOfFSharpTyconSorted @ tycon.AllGeneratedInterfaceImplsAndOverrides // Get all the members we have to implement, organized by each type we explicitly implement let slotImplSets = GetSlotImplSets infoReader denv AccessibleFromSomewhere false allReqdTys @@ -831,7 +835,7 @@ module DispatchSlotChecking = let allCorrect = CheckDispatchSlotsAreImplemented (denv, infoReader, m, nenv, sink, tcaug.tcaug_abstract, false, reqdTy, dispatchSlots, availPriorOverrides, overrides) // Tell the user to mark the thing abstract if it was missing implementations - if not allCorrect && not tcaug.tcaug_abstract && not (isInterfaceTy g reqdTy) then + if not allCorrect && not tcaug.tcaug_abstract && (isClassTy g reqdTy) then errorR(TypeIsImplicitlyAbstract(m)) let overridesToCheck = @@ -848,14 +852,14 @@ module DispatchSlotChecking = allImmediateMembersThatMightImplementDispatchSlots |> List.iter (fun overrideBy -> let isFakeEventProperty = overrideBy.IsFSharpEventProperty(g) - let overriden = + let overridden = if isFakeEventProperty then let slotsigs = overrideBy.MemberInfo.Value.ImplementedSlotSigs slotsigs |> List.map (ReparentSlotSigToUseMethodTypars g overrideBy.Range overrideBy) else [ for (reqdTy, m), SlotImplSet(_dispatchSlots, dispatchSlotsKeyed, _, _) in allImpls do let overrideByInfo = GetTypeMemberOverrideInfo g reqdTy overrideBy - let overridenForThisSlotImplSet = + let overriddenForThisSlotImplSet = [ for reqdSlot in NameMultiMap.find overrideByInfo.LogicalName dispatchSlotsKeyed do let dispatchSlot = reqdSlot.MethodInfo if OverrideImplementsDispatchSlot g amap m dispatchSlot overrideByInfo then @@ -876,10 +880,10 @@ module DispatchSlotChecking = // Record the slotsig via mutation yield slotsig ] //if mustOverrideSomething reqdTy overrideBy then - // assert nonNil overridenForThisSlotImplSet - yield! overridenForThisSlotImplSet ] + // assert nonNil overriddenForThisSlotImplSet + yield! overriddenForThisSlotImplSet ] - overrideBy.MemberInfo.Value.ImplementedSlotSigs <- overriden) + overrideBy.MemberInfo.Value.ImplementedSlotSigs <- overridden) /// "Type Completion" inference and a few other checks at the end of the inference scope let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader: InfoReader, nenv, sink, isImplementation, denv, tycon: Tycon) = @@ -897,7 +901,7 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader: InfoReader, nenv #endif Option.isNone tycon.GeneratedCompareToValues && tycon.HasInterface g g.mk_IComparable_ty && - not (tycon.HasOverride g "Equals" [g.obj_ty]) && + not (tycon.HasOverride g "Equals" [g.obj_ty_ambivalent]) && not tycon.IsFSharpInterfaceTycon then (* Warn when we're doing this for class types *) @@ -916,7 +920,7 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader: InfoReader, nenv let tcaug = tycon.TypeContents let m = tycon.Range let hasExplicitObjectGetHashCode = tycon.HasOverride g "GetHashCode" [] - let hasExplicitObjectEqualsOverride = tycon.HasOverride g "Equals" [g.obj_ty] + let hasExplicitObjectEqualsOverride = tycon.HasOverride g "Equals" [g.obj_ty_ambivalent] if (Option.isSome tycon.GeneratedHashAndEqualsWithComparerValues) && (hasExplicitObjectGetHashCode || hasExplicitObjectEqualsOverride) then diff --git a/src/fcs-fable/src/Compiler/Checking/NameResolution.fs b/src/fcs-fable/src/Compiler/Checking/NameResolution.fs index 7b660d3d21..5b0c9842f7 100644 --- a/src/fcs-fable/src/Compiler/Checking/NameResolution.fs +++ b/src/fcs-fable/src/Compiler/Checking/NameResolution.fs @@ -87,9 +87,9 @@ let ActivePatternElemsOfValRef g (vref: ValRef) = match TryGetActivePatternInfo vref with | Some apinfo -> - let isStructRetTy = + let retKind = if apinfo.IsTotal then - false + ActivePatternReturnKind.RefTypeWrapper else let _, apReturnTy = stripFunTy g vref.TauType let hasStructAttribute() = @@ -97,8 +97,10 @@ let ActivePatternElemsOfValRef g (vref: ValRef) = |> List.exists (function | Attrib(targetsOpt = Some(System.AttributeTargets.ReturnValue)) as a -> IsMatchingFSharpAttribute g g.attrib_StructAttribute a | _ -> false) - isStructTy g apReturnTy || hasStructAttribute() - apinfo.ActiveTags |> List.mapi (fun i _ -> APElemRef(apinfo, vref, i, isStructRetTy)) + if isValueOptionTy g apReturnTy || hasStructAttribute() then ActivePatternReturnKind.StructTypeWrapper + elif isBoolTy g apReturnTy then ActivePatternReturnKind.Boolean + else ActivePatternReturnKind.RefTypeWrapper + apinfo.ActiveTags |> List.mapi (fun i _ -> APElemRef(apinfo, vref, i, retKind)) | None -> [] /// Try to make a reference to a value in a module. @@ -201,9 +203,6 @@ type Item = /// Represents the resolution of a name to a constructor | CtorGroup of string * MethInfo list - /// Represents the resolution of a name to the fake constructor simulated for an interface type. - | FakeInterfaceCtor of TType - /// Represents the resolution of a name to a delegate | DelegateCtor of TType @@ -276,11 +275,10 @@ type Item = | ValueSome tcref -> tcref.DisplayNameCore | _ -> nm |> DemangleGenericTypeName - | Item.CtorGroup(nm, _) -> nm |> DemangleGenericTypeName - | Item.FakeInterfaceCtor ty + | Item.CtorGroup(nm, _) -> nm |> DemangleGenericTypeName | Item.DelegateCtor ty -> match ty with - | AbbrevOrAppTy tcref -> tcref.DisplayNameCore + | AbbrevOrAppTy(tcref, _) -> tcref.DisplayNameCore // This case is not expected | _ -> "" | Item.UnqualifiedType(tcref :: _) -> tcref.DisplayNameCore @@ -311,7 +309,7 @@ type Item = | Item.Property(info = pinfo :: _) -> pinfo.DisplayName | Item.Event einfo -> einfo.DisplayName | Item.MethodGroup(_, minfo :: _, _) -> minfo.DisplayName - | Item.DelegateCtor (AbbrevOrAppTy tcref) -> tcref.DisplayName + | Item.DelegateCtor (AbbrevOrAppTy(tcref, _)) -> tcref.DisplayName | Item.UnqualifiedType(tcref :: _) -> tcref.DisplayName | Item.ModuleOrNamespaces(modref :: _) -> modref.DisplayName | Item.TypeVar (nm, _) -> nm |> ConvertLogicalNameToDisplayName @@ -526,7 +524,10 @@ let NextExtensionMethodPriority() = uint64 (newStamp()) /// Checks if the type is used for C# style extension members. let IsTyconRefUsedForCSharpStyleExtensionMembers g m (tcref: TyconRef) = // Type must be non-generic and have 'Extension' attribute - isNil(tcref.Typars m) && TyconRefHasAttribute g m g.attrib_ExtensionAttribute tcref + match metadataOfTycon tcref.Deref with + | ILTypeMetadata(TILObjectReprData(_, _, tdef)) -> tdef.CanContainExtensionMethods + | _ -> true + && isNil(tcref.Typars m) && TyconRefHasAttribute g m g.attrib_ExtensionAttribute tcref /// Checks if the type is used for C# style extension members. let IsTypeUsedForCSharpStyleExtensionMembers g m ty = @@ -575,62 +576,40 @@ let GetTyconRefForExtensionMembers minfo (deref: Entity) amap m g = /// Get the info for all the .NET-style extension members listed as static members in the type. let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap: Import.ImportMap) m (tcrefOfStaticClass: TyconRef) = let g = amap.g - let pri = NextExtensionMethodPriority() - - if g.langVersion.SupportsFeature(LanguageFeature.CSharpExtensionAttributeNotRequired) then - let csharpStyleExtensionMembers = - if IsTyconRefUsedForCSharpStyleExtensionMembers g m tcrefOfStaticClass || (tcrefOfStaticClass.IsLocalRef && not tcrefOfStaticClass.IsTypeAbbrev) then - protectAssemblyExploration [] (fun () -> - let ty = generalizedTyconRef g tcrefOfStaticClass - GetImmediateIntrinsicMethInfosOfType (None, AccessorDomain.AccessibleFromSomeFSharpCode) g amap m ty - |> List.filter (IsMethInfoPlainCSharpStyleExtensionMember g m true)) - else - [] - if not csharpStyleExtensionMembers.IsEmpty then - [ for minfo in csharpStyleExtensionMembers do - let ilExtMem = ILExtMem (tcrefOfStaticClass, minfo, pri) + let isApplicable = + IsTyconRefUsedForCSharpStyleExtensionMembers g m tcrefOfStaticClass || - // The results are indexed by the TyconRef of the first 'this' argument, if any. - // So we need to go and crack the type of the 'this' argument. - // - // This is convoluted because we only need the ILTypeRef of the first argument, and we don't - // want to read any other metadata as it can trigger missing-assembly errors. It turns out ImportILTypeRef - // is less eager in reading metadata than GetParamTypes. - // - // We don't use the index for the IL extension method for tuple of F# function types (e.g. if extension - // methods for tuple occur in C# code) - let thisTyconRef = GetTyconRefForExtensionMembers minfo tcrefOfStaticClass.Deref amap m g - match thisTyconRef with - | None -> () - | Some (Some tcref) -> yield Choice1Of2(tcref, ilExtMem) - | Some None -> yield Choice2Of2 ilExtMem ] - else - [] - else - if IsTyconRefUsedForCSharpStyleExtensionMembers g m tcrefOfStaticClass then - let ty = generalizedTyconRef g tcrefOfStaticClass - let minfos = GetImmediateIntrinsicMethInfosOfType (None, AccessorDomain.AccessibleFromSomeFSharpCode) g amap m ty - - [ for minfo in minfos do - if IsMethInfoPlainCSharpStyleExtensionMember g m true minfo then - let ilExtMem = ILExtMem (tcrefOfStaticClass, minfo, pri) - // The results are indexed by the TyconRef of the first 'this' argument, if any. - // So we need to go and crack the type of the 'this' argument. - // - // This is convoluted because we only need the ILTypeRef of the first argument, and we don't - // want to read any other metadata as it can trigger missing-assembly errors. It turns out ImportILTypeRef - // is less eager in reading metadata than GetParamTypes. - // - // We don't use the index for the IL extension method for tuple of F# function types (e.g. if extension - // methods for tuple occur in C# code) - let thisTyconRef = GetTyconRefForExtensionMembers minfo tcrefOfStaticClass.Deref amap m g - match thisTyconRef with - | None -> () - | Some (Some tcref) -> yield Choice1Of2(tcref, ilExtMem) - | Some None -> yield Choice2Of2 ilExtMem ] - else - [] + g.langVersion.SupportsFeature(LanguageFeature.CSharpExtensionAttributeNotRequired) && + tcrefOfStaticClass.IsLocalRef && + not tcrefOfStaticClass.IsTypeAbbrev + + if not isApplicable then [] else + + let ty = generalizedTyconRef g tcrefOfStaticClass + let pri = NextExtensionMethodPriority() + + let methods = + protectAssemblyExploration [] + (fun () -> GetImmediateIntrinsicMethInfosOfType (None, AccessorDomain.AccessibleFromSomeFSharpCode) g amap m ty) + + [ for minfo in methods do + if IsMethInfoPlainCSharpStyleExtensionMember g m true minfo then + let ilExtMem = ILExtMem (tcrefOfStaticClass, minfo, pri) + // The results are indexed by the TyconRef of the first 'this' argument, if any. + // So we need to go and crack the type of the 'this' argument. + // + // This is convoluted because we only need the ILTypeRef of the first argument, and we don't + // want to read any other metadata as it can trigger missing-assembly errors. It turns out ImportILTypeRef + // is less eager in reading metadata than GetParamTypes. + // + // We don't use the index for the IL extension method for tuple of F# function types (e.g. if extension + // methods for tuple occur in C# code) + let thisTyconRef = GetTyconRefForExtensionMembers minfo tcrefOfStaticClass.Deref amap m g + match thisTyconRef with + | None -> () + | Some (Some tcref) -> yield Choice1Of2(tcref, ilExtMem) + | Some None -> yield Choice2Of2 ilExtMem ] /// Query the declared properties of a type (including inherited properties) let IntrinsicPropInfosOfTypeInScope (infoReader: InfoReader) optFilter ad findFlag m ty = @@ -699,13 +678,14 @@ let IntrinsicMethInfosOfType (infoReader: InfoReader) optFilter ad allowMultiInt let minfos = minfos |> ExcludeHiddenOfMethInfos g amap m minfos -let TrySelectExtensionMethInfoOfILExtMem m amap apparentTy (actualParent, minfo, pri) = +let rec TrySelectExtensionMethInfoOfILExtMem m amap apparentTy (actualParent, minfo, pri) = match minfo with | ILMeth(_,ilminfo,_) -> MethInfo.CreateILExtensionMeth (amap, m, apparentTy, actualParent, Some pri, ilminfo.RawMetadata) |> Some // F#-defined IL-style extension methods are not seen as extension methods in F# code | FSMeth(g,_,vref,_) -> FSMeth(g, apparentTy, vref, Some pri) |> Some + | MethInfoWithModifiedReturnType(mi,_) -> TrySelectExtensionMethInfoOfILExtMem m amap apparentTy (actualParent, mi, pri) #if !NO_TYPEPROVIDERS // // Provided extension methods are not yet supported | ProvidedMeth(amap,providedMeth,_,m) -> @@ -1021,7 +1001,7 @@ let ResolveProvidedTypeNameInEntity (amap, m, typeName, modref: ModuleOrNamespac //------------------------------------------------------------------------- /// Qualified lookups of type names where the number of generic arguments is known -/// from context, e.g. Module.Type. The full names suh as ``List`1`` can +/// from context, e.g. Module.Type. The full names such as ``List`1`` can /// be used to qualify access if needed let LookupTypeNameInEntityHaveArity nm (typeNameResInfo: TypeNameResolutionStaticArgsInfo) (mty: ModuleOrNamespaceType) = let attempt1 = mty.TypesByMangledName.TryFind (typeNameResInfo.MangledNameForType nm) @@ -1129,9 +1109,9 @@ let GetNestedTyconRefsOfType (infoReader: InfoReader) (amap: Import.ImportMap) ( /// Handle the .NET/C# business where nested generic types implicitly accumulate the type parameters /// from their enclosing types. let MakeNestedType (ncenv: NameResolver) (tinst: TType list) m (tcrefNested: TyconRef) = - let tps = match tcrefNested.Typars m with [] -> [] | l -> List.skip tinst.Length l + let tps = match tcrefNested.Typars m with [] -> [] | l -> l[tinst.Length..] let tinstNested = ncenv.InstantiationGenerator m tps - mkAppTy tcrefNested (tinst @ tinstNested) + mkWoNullAppTy tcrefNested (tinst @ tinstNested) /// Get all the accessible nested types of an existing type. let GetNestedTypesOfType (ad, ncenv: NameResolver, optFilter, staticResInfo, checkForGenerated, m) ty = @@ -1178,11 +1158,11 @@ let ChooseEventInfosForNameEnv g ty (einfos: EventInfo list) = /// Rules: /// 1. Add nested types - access to their constructors. /// 2. Add static parts of type - i.e. C# style extension members, record labels, and union cases. -/// 3. Add static extention methods. +/// 3. Add static extension methods. /// 4. Add static extension properties. /// 5. Add static events. /// 6. Add static fields. -/// 7. Add static properies. +/// 7. Add static properties. /// 8. Add static methods and combine extension methods of the same group. let rec AddStaticContentOfTypeToNameEnv (g:TcGlobals) (amap: Import.ImportMap) ad m (nenv: NameResolutionEnv) (ty: TType) = let infoReader = InfoReader(g,amap) @@ -1191,7 +1171,7 @@ let rec AddStaticContentOfTypeToNameEnv (g:TcGlobals) (amap: Import.ImportMap) a let nenv = AddStaticPartsOfTypeToNameEnv amap m nenv ty // The order of items matter such as intrinsic members will always be favored over extension members of the same name. - // Extension property members will always be favored over extenion methods of the same name. + // Extension property members will always be favored over extension methods of the same name. let items = [| // Extension methods @@ -1302,7 +1282,7 @@ and private AddStaticPartsOfTyconRefToNameEnv bulkAddMode ownDefinition g amap m if isILOrRequiredQualifiedAccess || List.isEmpty ucrefs then tab else - // Union cases for unqualfied + // Union cases for unqualified AddUnionCases2 bulkAddMode tab ucrefs let ePatItems = @@ -1549,7 +1529,7 @@ let AddDeclaredTyparsToNameEnv check nenv typars = /// a fresh set of inference type variables for the type parameters. let FreshenTycon (ncenv: NameResolver) m (tcref: TyconRef) = let tinst = ncenv.InstantiationGenerator m (tcref.Typars m) - let improvedTy = ncenv.g.decompileType tcref tinst + let improvedTy = ncenv.g.decompileType tcref tinst ncenv.g.knownWithoutNull improvedTy /// Convert a reference to a named type into a type that includes @@ -1557,7 +1537,7 @@ let FreshenTycon (ncenv: NameResolver) m (tcref: TyconRef) = let FreshenTyconWithEnclosingTypeInst (ncenv: NameResolver) m (tinstEnclosing: TypeInst) (tcref: TyconRef) = let tps = ncenv.InstantiationGenerator m (tcref.Typars m) let tinst = List.skip tinstEnclosing.Length tps - let improvedTy = ncenv.g.decompileType tcref (tinstEnclosing @ tinst) + let improvedTy = ncenv.g.decompileType tcref (tinstEnclosing @ tinst) ncenv.g.knownWithoutNull improvedTy /// Convert a reference to a union case into a UnionCaseInfo that includes @@ -1570,6 +1550,85 @@ let FreshenUnionCaseRef (ncenv: NameResolver) m (ucref: UnionCaseRef) = let FreshenRecdFieldRef (ncenv: NameResolver) m (rfref: RecdFieldRef) = RecdFieldInfo(ncenv.InstantiationGenerator m (rfref.Tycon.Typars m), rfref) +//------------------------------------------------------------------------- +// Generate type variables and record them in within the scope of the +// compilation environment, which currently corresponds to the scope +// of the constraint resolution carried out by type checking. +//------------------------------------------------------------------------- + +let compgenId = mkSynId range0 unassignedTyparName + +let NewCompGenTypar (kind, rigid, staticReq, dynamicReq, error) = + Construct.NewTypar(kind, rigid, SynTypar(compgenId, staticReq, true), error, dynamicReq, [], false, false) + +let AnonTyparId m = mkSynId m unassignedTyparName + +let NewAnonTypar (kind, m, rigid, var, dyn) = + Construct.NewTypar (kind, rigid, SynTypar(AnonTyparId m, var, true), false, dyn, [], false, false) + +let NewNamedInferenceMeasureVar (_m: range, rigid, var, id) = + Construct.NewTypar(TyparKind.Measure, rigid, SynTypar(id, var, false), false, TyparDynamicReq.No, [], false, false) + +let NewInferenceMeasurePar () = + NewCompGenTypar (TyparKind.Measure, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, false) + +let NewErrorTypar () = + NewCompGenTypar (TyparKind.Type, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, true) + +let NewErrorMeasureVar () = + NewCompGenTypar (TyparKind.Measure, TyparRigidity.Flexible, TyparStaticReq.None, TyparDynamicReq.No, true) + +let NewInferenceType (g: TcGlobals) = + ignore g // included for future, minimizing code diffs, see https://github.com/dotnet/fsharp/pull/6804 + mkTyparTy (Construct.NewTypar (TyparKind.Type, TyparRigidity.Flexible, SynTypar(compgenId, TyparStaticReq.None, true), false, TyparDynamicReq.No, [], false, false)) + +let NewErrorType () = + mkTyparTy (NewErrorTypar ()) + +let NewErrorMeasure () = + Measure.Var (NewErrorMeasureVar ()) + +let NewByRefKindInferenceType (g: TcGlobals) m = + let tp = Construct.NewTypar (TyparKind.Type, TyparRigidity.Flexible, SynTypar(compgenId, TyparStaticReq.HeadType, true), false, TyparDynamicReq.No, [], false, false) + if g.byrefkind_InOut_tcr.CanDeref then + tp.SetConstraints [TyparConstraint.DefaultsTo(10, TType_app(g.byrefkind_InOut_tcr, [], g.knownWithoutNull), m)] + mkTyparTy tp + +let NewInferenceTypes g l = l |> List.map (fun _ -> NewInferenceType g) + +let FreshenTypar (g: TcGlobals) rigid (tp: Typar) = + let clearStaticReq = g.langVersion.SupportsFeature LanguageFeature.InterfacesWithAbstractStaticMembers + let staticReq = if clearStaticReq then TyparStaticReq.None else tp.StaticReq + let dynamicReq = if rigid = TyparRigidity.Rigid then TyparDynamicReq.Yes else TyparDynamicReq.No + NewCompGenTypar (tp.Kind, rigid, staticReq, dynamicReq, false) + +// QUERY: should 'rigid' ever really be 'true'? We set this when we know +// we are going to have to generalize a typar, e.g. when implementing a +// abstract generic method slot. But we later check the generalization +// condition anyway, so we could get away with a non-rigid typar. This +// would sort of be cleaner, though give errors later. +let FreshenAndFixupTypars g m rigid fctps tinst tpsorig = + let tps = tpsorig |> List.map (FreshenTypar g rigid) + let renaming, tinst = FixupNewTypars m fctps tinst tpsorig tps + tps, renaming, tinst + +let FreshenTypeInst g m tpsorig = + FreshenAndFixupTypars g m TyparRigidity.Flexible [] [] tpsorig + +let FreshMethInst g m fctps tinst tpsorig = + FreshenAndFixupTypars g m TyparRigidity.Flexible fctps tinst tpsorig + +let FreshenTypars g m tpsorig = + match tpsorig with + | [] -> [] + | _ -> + let _, _, tpTys = FreshenTypeInst g m tpsorig + tpTys + +let FreshenMethInfo m (minfo: MethInfo) = + let _, _, tpTys = FreshMethInst minfo.TcGlobals m (minfo.GetFormalTyparsOfDeclaringType m) minfo.DeclaringTypeInst minfo.FormalMethodTypars + tpTys + /// This must be called after fetching unqualified items that may need to be freshened /// or have type instantiations let ResolveUnqualifiedItem (ncenv: NameResolver) nenv m res = @@ -1696,7 +1755,7 @@ let LookupTypeNameInEnvMaybeHaveArity fq nm (typeNameResInfo: TypeNameResolution /// Represents the kind of the occurrence when reporting a name in name resolution [] -type ItemOccurence = +type ItemOccurrence = /// This is a binding / declaration of the item | Binding /// This is a usage of the item @@ -1713,6 +1772,8 @@ type ItemOccurence = | RelatedText /// This is a usage of a module or namespace name in open statement | Open + /// Not permitted item uses like interface names used as expressions + | InvalidUse type FormatStringCheckContext = { SourceText: ISourceText @@ -1725,9 +1786,9 @@ type ITypecheckResultsSink = abstract NotifyExprHasType: TType * NameResolutionEnv * AccessorDomain * range -> unit - abstract NotifyNameResolution: pos * item: Item * TyparInstantiation * ItemOccurence * NameResolutionEnv * AccessorDomain * range * replace: bool -> unit + abstract NotifyNameResolution: pos * item: Item * TyparInstantiation * ItemOccurrence * NameResolutionEnv * AccessorDomain * range * replace: bool -> unit - abstract NotifyMethodGroupNameResolution : pos * item: Item * itemMethodGroup: Item * TyparInstantiation * ItemOccurence * NameResolutionEnv * AccessorDomain * range * replace: bool -> unit + abstract NotifyMethodGroupNameResolution : pos * item: Item * itemMethodGroup: Item * TyparInstantiation * ItemOccurrence * NameResolutionEnv * AccessorDomain * range * replace: bool -> unit abstract NotifyFormatSpecifierLocation: range * int -> unit @@ -1741,88 +1802,100 @@ let (|ValRefOfProp|_|) (pi: PropInfo) = pi.ArbitraryValRef let (|ValRefOfMeth|_|) (mi: MethInfo) = mi.ArbitraryValRef let (|ValRefOfEvent|_|) (evt: EventInfo) = evt.ArbitraryValRef +[] let rec (|RecordFieldUse|_|) (item: Item) = match item with - | Item.RecdField(RecdFieldInfo(_, RecdFieldRef(tcref, name))) -> Some (name, tcref) - | Item.SetterArg(_, RecordFieldUse f) -> Some f - | _ -> None + | Item.RecdField(RecdFieldInfo(_, RecdFieldRef(tcref, name))) -> ValueSome (name, tcref) + | Item.SetterArg(_, RecordFieldUse f) -> ValueSome f + | _ -> ValueNone +[] let (|UnionCaseFieldUse|_|) (item: Item) = match item with - | Item.UnionCaseField (uci, fieldIndex) -> Some (fieldIndex, uci.UnionCaseRef) - | _ -> None + | Item.UnionCaseField (uci, fieldIndex) -> ValueSome (fieldIndex, uci.UnionCaseRef) + | _ -> ValueNone +[] let rec (|ILFieldUse|_|) (item: Item) = match item with - | Item.ILField finfo -> Some finfo - | Item.SetterArg(_, ILFieldUse f) -> Some f - | _ -> None + | Item.ILField finfo -> ValueSome finfo + | Item.SetterArg(_, ILFieldUse f) -> ValueSome f + | _ -> ValueNone +[] let rec (|PropertyUse|_|) (item: Item) = match item with - | Item.Property(info = pinfo :: _) -> Some pinfo - | Item.SetterArg(_, PropertyUse pinfo) -> Some pinfo - | _ -> None + | Item.Property(info = pinfo :: _) -> ValueSome pinfo + | Item.SetterArg(_, PropertyUse pinfo) -> ValueSome pinfo + | _ -> ValueNone +[] let rec (|FSharpPropertyUse|_|) (item: Item) = match item with - | Item.Property(info = [ValRefOfProp vref]) -> Some vref - | Item.SetterArg(_, FSharpPropertyUse propDef) -> Some propDef - | _ -> None + | Item.Property(info = [ValRefOfProp vref]) -> ValueSome vref + | Item.SetterArg(_, FSharpPropertyUse propDef) -> ValueSome propDef + | _ -> ValueNone +[] let (|MethodUse|_|) (item: Item) = match item with - | Item.MethodGroup(_, [minfo], _) -> Some minfo - | _ -> None + | Item.MethodGroup(_, [minfo], _) -> ValueSome minfo + | _ -> ValueNone +[] let (|FSharpMethodUse|_|) (item: Item) = match item with - | Item.MethodGroup(_, [ValRefOfMeth vref], _) -> Some vref - | Item.Value vref when vref.IsMember -> Some vref - | _ -> None + | Item.MethodGroup(_, [ValRefOfMeth vref], _) -> ValueSome vref + | Item.Value vref when vref.IsMember -> ValueSome vref + | _ -> ValueNone +[] let (|EntityUse|_|) (item: Item) = match item with - | Item.UnqualifiedType (tcref :: _) -> Some tcref - | Item.ExnCase tcref -> Some tcref - | Item.Types(_, [AbbrevOrAppTy tcref]) - | Item.DelegateCtor(AbbrevOrAppTy tcref) - | Item.FakeInterfaceCtor(AbbrevOrAppTy tcref) -> Some tcref + | Item.UnqualifiedType (tcref :: _) -> ValueSome tcref + | Item.ExnCase tcref -> ValueSome tcref + | Item.Types(_, [AbbrevOrAppTy(tcref, _)]) + | Item.DelegateCtor(AbbrevOrAppTy(tcref, _)) -> ValueSome tcref | Item.CtorGroup(_, ctor :: _) -> match ctor.ApparentEnclosingType with - | AbbrevOrAppTy tcref -> Some tcref - | _ -> None - | _ -> None + | AbbrevOrAppTy(tcref, _) -> ValueSome tcref + | _ -> ValueNone + | _ -> ValueNone +[] let (|EventUse|_|) (item: Item) = match item with - | Item.Event einfo -> Some einfo - | _ -> None + | Item.Event einfo -> ValueSome einfo + | _ -> ValueNone +[] let (|FSharpEventUse|_|) (item: Item) = match item with - | Item.Event(ValRefOfEvent vref) -> Some vref - | _ -> None + | Item.Event(ValRefOfEvent vref) -> ValueSome vref + | _ -> ValueNone +[] let (|UnionCaseUse|_|) (item: Item) = match item with - | Item.UnionCase(UnionCaseInfo(_, u1), _) -> Some u1 - | _ -> None + | Item.UnionCase(UnionCaseInfo(_, u1), _) -> ValueSome u1 + | _ -> ValueNone +[] let (|ValUse|_|) (item: Item) = match item with | Item.Value vref | FSharpPropertyUse vref | FSharpMethodUse vref | FSharpEventUse vref - | Item.CustomBuilder(_, vref) -> Some vref - | _ -> None + | Item.CustomBuilder(_, vref) -> ValueSome vref + | _ -> ValueNone +[] let (|ActivePatternCaseUse|_|) (item: Item) = match item with - | Item.ActivePatternCase(APElemRef(_, vref, idx, _)) -> Some (vref.SigRange, vref.DefinitionRange, idx) - | Item.ActivePatternResult(ap, _, idx, _) -> Some (ap.Range, ap.Range, idx) - | _ -> None + | Item.ActivePatternCase(APElemRef(_, vref, idx, _)) -> ValueSome (vref.SigRange, vref.DefinitionRange, idx) + | Item.ActivePatternResult(ap, _, idx, _) -> ValueSome (ap.Range, ap.Range, idx) + | _ -> ValueNone let tyconRefDefnHash (_g: TcGlobals) (eref1: EntityRef) = hash eref1.LogicalName @@ -1867,7 +1940,7 @@ let ItemsAreEffectivelyEqual g orig other = not tp1.IsCompilerGenerated && not tp1.IsFromError && not tp2.IsCompilerGenerated && not tp2.IsFromError && equals tp1.Range tp2.Range - | AbbrevOrAppTy tcref1, AbbrevOrAppTy tcref2 -> + | AbbrevOrAppTy(tcref1, _), AbbrevOrAppTy(tcref2, _) -> tyconRefDefnEq g tcref1 tcref2 | _ -> false) @@ -1946,7 +2019,7 @@ let ItemsAreEffectivelyEqualHash (g: TcGlobals) orig = | _ -> 389329 [] -type CapturedNameResolution(i: Item, tpinst, io: ItemOccurence, nre: NameResolutionEnv, ad: AccessorDomain, m: range) = +type CapturedNameResolution(i: Item, tpinst, io: ItemOccurrence, nre: NameResolutionEnv, ad: AccessorDomain, m: range) = member _.Pos = m.End @@ -1954,7 +2027,7 @@ type CapturedNameResolution(i: Item, tpinst, io: ItemOccurence, nre: NameResolut member _.ItemWithInst = ({ Item = i; TyparInstantiation = tpinst } : ItemWithInst) - member _.ItemOccurence = io + member _.ItemOccurrence = io member _.DisplayEnv = nre.DisplayEnv @@ -1989,7 +2062,7 @@ type TcResolutions [] type TcSymbolUseData = { ItemWithInst: ItemWithInst - ItemOccurence: ItemOccurence + ItemOccurrence: ItemOccurrence DisplayEnv: DisplayEnv Range: range } @@ -2003,7 +2076,7 @@ type TcSymbolUses(g, capturedNameResolutions: ResizeArray ResizeArray.mapToSmallArrayChunks (fun cnr -> { ItemWithInst=cnr.ItemWithInst; ItemOccurence=cnr.ItemOccurence; DisplayEnv=cnr.DisplayEnv; Range=cnr.Range }) + |> ResizeArray.mapToSmallArrayChunks (fun cnr -> { ItemWithInst=cnr.ItemWithInst; ItemOccurrence=cnr.ItemOccurrence; DisplayEnv=cnr.DisplayEnv; Range=cnr.Range }) let capturedNameResolutions = () do capturedNameResolutions // don't capture this! @@ -2114,22 +2187,22 @@ type TcResultsSinkImpl(tcGlobals, ?sourceText: ISourceText) = if allowedRange m then capturedExprTypings.Add((ty, nenv, ad, m)) - member sink.NotifyNameResolution(endPos, item, tpinst, occurenceType, nenv, ad, m, replace) = + member sink.NotifyNameResolution(endPos, item, tpinst, occurrenceType, nenv, ad, m, replace) = if allowedRange m then if replace then remove m if not (isAlreadyDone endPos item m) then - capturedNameResolutions.Add(CapturedNameResolution(item, tpinst, occurenceType, nenv, ad, m)) + capturedNameResolutions.Add(CapturedNameResolution(item, tpinst, occurrenceType, nenv, ad, m)) - member sink.NotifyMethodGroupNameResolution(endPos, item, itemMethodGroup, tpinst, occurenceType, nenv, ad, m, replace) = + member sink.NotifyMethodGroupNameResolution(endPos, item, itemMethodGroup, tpinst, occurrenceType, nenv, ad, m, replace) = if allowedRange m then if replace then remove m if not (isAlreadyDone endPos item m) then - capturedNameResolutions.Add(CapturedNameResolution(item, tpinst, occurenceType, nenv, ad, m)) - capturedMethodGroupResolutions.Add(CapturedNameResolution(itemMethodGroup, [], occurenceType, nenv, ad, m)) + capturedNameResolutions.Add(CapturedNameResolution(item, tpinst, occurrenceType, nenv, ad, m)) + capturedMethodGroupResolutions.Add(CapturedNameResolution(itemMethodGroup, [], occurrenceType, nenv, ad, m)) member sink.NotifyFormatSpecifierLocation(m, numArgs) = capturedFormatSpecifierLocations.Add((m, numArgs)) @@ -2168,20 +2241,20 @@ let CallEnvSink (sink: TcResultsSink) (scopem, nenv, ad) = | Some sink -> sink.NotifyEnvWithScope(scopem, nenv, ad) /// Report a specific name resolution at a source range -let CallNameResolutionSink (sink: TcResultsSink) (m: range, nenv, item, tpinst, occurenceType, ad) = +let CallNameResolutionSink (sink: TcResultsSink) (m: range, nenv, item, tpinst, occurrenceType, ad) = match sink.CurrentSink with | None -> () - | Some sink -> sink.NotifyNameResolution(m.End, item, tpinst, occurenceType, nenv, ad, m, false) + | Some sink -> sink.NotifyNameResolution(m.End, item, tpinst, occurrenceType, nenv, ad, m, false) -let CallMethodGroupNameResolutionSink (sink: TcResultsSink) (m: range, nenv, item, itemMethodGroup, tpinst, occurenceType, ad) = +let CallMethodGroupNameResolutionSink (sink: TcResultsSink) (m: range, nenv, item, itemMethodGroup, tpinst, occurrenceType, ad) = match sink.CurrentSink with | None -> () - | Some sink -> sink.NotifyMethodGroupNameResolution(m.End, item, itemMethodGroup, tpinst, occurenceType, nenv, ad, m, false) + | Some sink -> sink.NotifyMethodGroupNameResolution(m.End, item, itemMethodGroup, tpinst, occurrenceType, nenv, ad, m, false) -let CallNameResolutionSinkReplacing (sink: TcResultsSink) (m: range, nenv, item, tpinst, occurenceType, ad) = +let CallNameResolutionSinkReplacing (sink: TcResultsSink) (m: range, nenv, item, tpinst, occurrenceType, ad) = match sink.CurrentSink with | None -> () - | Some sink -> sink.NotifyNameResolution(m.End, item, tpinst, occurenceType, nenv, ad, m, true) + | Some sink -> sink.NotifyNameResolution(m.End, item, tpinst, occurrenceType, nenv, ad, m, true) /// Report a specific expression typing at a source range let CallExprHasTypeSink (sink: TcResultsSink) (m: range, nenv, ty, ad) = @@ -2229,7 +2302,6 @@ let CheckAllTyparsInferrable amap m item = | Item.Trait _ | Item.CtorGroup _ - | Item.FakeInterfaceCtor _ | Item.DelegateCtor _ | Item.Types _ | Item.ModuleOrNamespaces _ @@ -2411,8 +2483,8 @@ let rec ResolveLongIdentAsModuleOrNamespace sink (amap: Import.ImportMap) m firs let notifyNameResolution (modref: ModuleOrNamespaceRef) m = let item = Item.ModuleOrNamespaces [modref] - let occurence = if isOpenDecl then ItemOccurence.Open else ItemOccurence.Use - CallNameResolutionSink sink (m, nenv, item, emptyTyparInst, occurence, ad) + let occurrence = if isOpenDecl then ItemOccurrence.Open else ItemOccurrence.Use + CallNameResolutionSink sink (m, nenv, item, emptyTyparInst, occurrence, ad) match moduleOrNamespaces.TryGetValue id.idText with | true, modrefs when not modrefs.IsEmpty -> @@ -2470,7 +2542,8 @@ let private ResolveObjectConstructorPrim (ncenv: NameResolver) edenv resInfo m a else let ctorInfos = GetIntrinsicConstructorInfosOfType ncenv.InfoReader m ty if isNil ctorInfos && isInterfaceTy g ty then - success (resInfo, Item.FakeInterfaceCtor ty) + let tcref = tcrefOfAppTy g ty + success (resInfo, Item.Types(tcref.DisplayName, [ty])) else let defaultStructCtorInfo = if (not (ctorInfos |> List.exists (fun x -> x.IsNullary)) && @@ -2820,7 +2893,7 @@ let ResolveLongIdentInType sink (ncenv: NameResolver) nenv lookupKind m ad id fi |> AtMostOneResult m |> ForceRaise - ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurence.UseInType, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurrence.UseInType, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) item, rest let private ResolveLongIdentInTyconRef (ncenv: NameResolver) nenv lookupKind (resInfo: ResolutionInfo) depth m ad id rest typeNameResInfo tcref maybeAppliedArgExpr = @@ -2843,9 +2916,10 @@ let private ResolveLongIdentInTyconRefs atMostOne (ncenv: NameResolver) nenv loo // ResolveExprLongIdentInModuleOrNamespace //------------------------------------------------------------------------- +[] let (|AccessibleEntityRef|_|) amap m ad (modref: ModuleOrNamespaceRef) mspec = let eref = modref.NestedTyconRef mspec - if IsEntityAccessible amap m ad eref then Some eref else None + if IsEntityAccessible amap m ad eref then ValueSome eref else ValueNone let rec ResolveExprLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv (typeNameResInfo: TypeNameResolutionInfo) ad resInfo depth m modref (mty: ModuleOrNamespaceType) (id: Ident) (rest: Ident list) = // resInfo records the modules or namespaces actually relevant to a resolution @@ -2969,7 +3043,7 @@ let ChooseTyconRefInExpr (ncenv: NameResolver, m, ad, nenv, id: Ident, typeNameR success (tys |> List.map (fun (resInfo, ty) -> (resInfo, Item.Types(id.idText, [ty])))) /// Resolves the given tycons. -/// For each tycon, return resolution info that could contain enclosing type instantations. +/// For each tycon, return resolution info that could contain enclosing type instantiations. let ResolveUnqualifiedTyconRefs nenv tcrefs = let resInfo = ResolutionInfo.Empty @@ -3027,7 +3101,7 @@ let rec ResolveExprLongIdentPrim sink (ncenv: NameResolver) first fullyQualified let search = ChooseTyconRefInExpr (ncenv, m, ad, nenv, id, typeNameResInfo, tcrefs) match AtMostOneResult m search with | Result (resInfo, item) -> - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) Some(resInfo.EnclosingTypeInst, item, rest) | Exception e -> typeError <- Some e @@ -3070,37 +3144,54 @@ let rec ResolveExprLongIdentPrim sink (ncenv: NameResolver) first fullyQualified match AtMostOneResult m innerSearch with | Result _ as res -> res | _ -> - let failingCase = - match typeError with - | Some e -> raze e - | _ -> - let suggestNamesAndTypes (addToBuffer: string -> unit) = - for e in nenv.eUnqualifiedItems do - if canSuggestThisItem e.Value then - addToBuffer e.Value.DisplayName - - for e in nenv.TyconsByDemangledNameAndArity fullyQualified do - if IsEntityAccessible ncenv.amap m ad e.Value then - addToBuffer e.Value.DisplayName - - for kv in nenv.ModulesAndNamespaces fullyQualified do - for modref in kv.Value do - if IsEntityAccessible ncenv.amap m ad modref then - addToBuffer modref.DisplayName - - // check if the user forgot to use qualified access - for e in nenv.eTyconsByDemangledNameAndArity do - let hasRequireQualifiedAccessAttribute = HasFSharpAttribute ncenv.g ncenv.g.attrib_RequireQualifiedAccessAttribute e.Value.Attribs - if hasRequireQualifiedAccessAttribute then - if e.Value.IsUnionTycon && e.Value.UnionCasesArray |> Array.exists (fun c -> c.LogicalName = id.idText) then - addToBuffer (e.Value.DisplayName + "." + id.idText) - - raze (UndefinedName(0, FSComp.SR.undefinedNameValueOfConstructor, id, suggestNamesAndTypes)) - failingCase + + match typeError with + | Some e -> raze e + | _ -> + + let tyconSearch () = + let tcrefs = LookupTypeNameInEnvNoArity fullyQualified id.idText nenv + if isNil tcrefs then NoResultsOrUsefulErrors else + + let tcrefs = ResolveUnqualifiedTyconRefs nenv tcrefs + let typeNameResInfo = TypeNameResolutionInfo.ResolveToTypeRefs typeNameResInfo.StaticArgsInfo + CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, PermitDirectReferenceToGeneratedType.No, unionRanges m id.idRange) + |> CollectResults success + + match tyconSearch () with + | Result((resInfo, tcref) :: _) -> + let _, _, tyargs = FreshenTypeInst ncenv.g m (tcref.Typars m) + let item = Item.Types(id.idText, [TType_app(tcref, tyargs, ncenv.g.knownWithoutNull)]) + success (resInfo, item) + | _ -> + + let suggestNamesAndTypes (addToBuffer: string -> unit) = + for e in nenv.eUnqualifiedItems do + if canSuggestThisItem e.Value then + addToBuffer e.Value.DisplayName + + for e in nenv.TyconsByDemangledNameAndArity fullyQualified do + if IsEntityAccessible ncenv.amap m ad e.Value then + addToBuffer e.Value.DisplayName + + for kv in nenv.ModulesAndNamespaces fullyQualified do + for modref in kv.Value do + if IsEntityAccessible ncenv.amap m ad modref then + addToBuffer modref.DisplayName + + // check if the user forgot to use qualified access + for e in nenv.eTyconsByDemangledNameAndArity do + let hasRequireQualifiedAccessAttribute = HasFSharpAttribute ncenv.g ncenv.g.attrib_RequireQualifiedAccessAttribute e.Value.Attribs + if hasRequireQualifiedAccessAttribute then + if e.Value.IsUnionTycon && e.Value.UnionCasesArray |> Array.exists (fun c -> c.LogicalName = id.idText) then + addToBuffer (e.Value.DisplayName + "." + id.idText) + + raze (UndefinedName(0, FSComp.SR.undefinedNameValueOfConstructor, id, suggestNamesAndTypes)) + match res with | Exception e -> raze e | Result (resInfo, item) -> - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) success (resInfo.EnclosingTypeInst, item, rest) // A compound identifier. @@ -3190,7 +3281,7 @@ let rec ResolveExprLongIdentPrim sink (ncenv: NameResolver) first fullyQualified match res with | Exception e -> raze e | Result (resInfo, item, rest) -> - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) success (resInfo.EnclosingTypeInst, item, rest) let ResolveExprLongIdent sink (ncenv: NameResolver) m ad nenv typeNameResInfo lid maybeAppliedArgExpr = @@ -3278,7 +3369,10 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv nu exception UpperCaseIdentifierInPattern of range /// Indicates if a warning should be given for the use of upper-case identifiers in patterns -type WarnOnUpperFlag = WarnOnUpperCase | AllIdsOK +type WarnOnUpperFlag = + | WarnOnUpperUnionCaseLabel + | WarnOnUpperVariablePatterns + | AllIdsOK // Long ID in a pattern let rec ResolvePatternLongIdentPrim sink (ncenv: NameResolver) fullyQualified warnOnUpper newDef m ad nenv numTyArgsOpt (id: Ident) (rest: Ident list) extraDotAtTheEnd = @@ -3298,13 +3392,21 @@ let rec ResolvePatternLongIdentPrim sink (ncenv: NameResolver) fullyQualified wa | true, res when not newDef -> ResolveUnqualifiedItem ncenv nenv m res | _ -> // Single identifiers in patterns - variable bindings - if - not newDef - && warnOnUpper = WarnOnUpperCase - && id.idText.Length >= 3 - && System.Char.ToLowerInvariant id.idText[0] <> id.idText[0] + let supportsDontWarnOnUppercaseIdentifiers = ncenv.g.langVersion.SupportsFeature(LanguageFeature.DontWarnOnUppercaseIdentifiersInBindingPatterns) + let isUpperCaseIdentifier = (not newDef && System.Char.ToLowerInvariant id.idText[0] <> id.idText[0]) + if (supportsDontWarnOnUppercaseIdentifiers && isUpperCaseIdentifier) then - warning(UpperCaseIdentifierInPattern m) + match warnOnUpper with + | WarnOnUpperUnionCaseLabel -> warning(UpperCaseIdentifierInPattern m) + | WarnOnUpperVariablePatterns + | AllIdsOK -> () + else + // HACK: This is an historical hack that seems to related the use country and language codes, which are very common in codebases + if isUpperCaseIdentifier && id.idText.Length >= 3 then + match warnOnUpper with + | WarnOnUpperUnionCaseLabel + | WarnOnUpperVariablePatterns -> warning(UpperCaseIdentifierInPattern m) + | AllIdsOK -> () // If there's an extra dot, we check whether the single identifier is a union, module or namespace and report it to the sink for the sake of tooling match extraDotAtTheEnd with @@ -3312,13 +3414,13 @@ let rec ResolvePatternLongIdentPrim sink (ncenv: NameResolver) fullyQualified wa match LookupTypeNameInEnvNoArity fullyQualified id.idText nenv with | tcref :: _ when tcref.IsUnionTycon -> let res = ResolutionInfo.Empty.AddEntity (id.idRange, tcref) - ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurence.Pattern, ad, res, ResultTyparChecker(fun () -> true)) - Item.Types (id.idText, [ mkAppTy tcref [] ]) + ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurrence.Pattern, ad, res, ResultTyparChecker(fun () -> true)) + Item.Types (id.idText, [ mkWoNullAppTy tcref [] ]) | _ -> match ResolveLongIdentAsModuleOrNamespace sink ncenv.amap id.idRange true fullyQualified nenv ad id [] false ShouldNotifySink.Yes with | Result ((_, mref, _) :: _) -> let res = ResolutionInfo.Empty.AddEntity (id.idRange, mref) - ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurence.Pattern, ad, res, ResultTyparChecker(fun () -> true)) + ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurrence.Pattern, ad, res, ResultTyparChecker(fun () -> true)) Item.ModuleOrNamespaces [ mref ] | _ -> Item.NewDef id @@ -3350,7 +3452,7 @@ let rec ResolvePatternLongIdentPrim sink (ncenv: NameResolver) fullyQualified wa |> AtMostOneResult m |> ForceRaise - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> true)) + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.Use, ad, resInfo, ResultTyparChecker(fun () -> true)) match rest with | [] -> res @@ -3433,10 +3535,13 @@ let ResolveTypeLongIdentInTyconRef sink (ncenv: NameResolver) nenv typeNameResIn error(Error(FSComp.SR.nrUnexpectedEmptyLongId(), m)) | id :: rest -> ForceRaise (ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad ResolutionInfo.Empty PermitDirectReferenceToGeneratedType.No 0 m tcref id rest) - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> true)) - let item = Item.Types(tcref.DisplayName, [FreshenTycon ncenv m tcref]) - CallNameResolutionSink sink (rangeOfLid lid, nenv, item, emptyTyparInst, ItemOccurence.UseInType, ad) - tcref + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.Use, ad, resInfo, ResultTyparChecker(fun () -> true)) + + let _, tinst, tyargs = FreshenTypeInst ncenv.g m (tcref.Typars m) + let item = Item.Types(tcref.DisplayName, [TType_app(tcref, tyargs, ncenv.g.knownWithoutNull)]) + CallNameResolutionSink sink (rangeOfLid lid, nenv, item, tinst, ItemOccurrence.UseInType, ad) + + tcref, tyargs /// Create an UndefinedName error with details let SuggestTypeLongIdentInModuleOrNamespace depth (modref: ModuleOrNamespaceRef) amap ad m (id: Ident) = @@ -3463,7 +3568,7 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv: NameRe match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let item = Item.ModuleOrNamespaces [submodref] - CallNameResolutionSink sink (id.idRange, nenv, item, emptyTyparInst, ItemOccurence.Use, ad) + CallNameResolutionSink sink (id.idRange, nenv, item, emptyTyparInst, ItemOccurrence.Use, ad) let resInfo = resInfo.AddEntity(id.idRange, submodref) ResolveTypeLongIdentInModuleOrNamespace sink nenv ncenv typeNameResInfo ad genOk resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2 | _ -> @@ -3488,14 +3593,14 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv: NameRe AddResults tyconSearch modulSearch /// Resolve a long identifier representing a type -let rec ResolveTypeLongIdentPrim sink (ncenv: NameResolver) occurence first fullyQualified m nenv ad (id: Ident) (rest: Ident list) (staticResInfo: TypeNameResolutionStaticArgsInfo) genOk = +let rec ResolveTypeLongIdentPrim sink (ncenv: NameResolver) occurrence first fullyQualified m nenv ad (id: Ident) (rest: Ident list) (staticResInfo: TypeNameResolutionStaticArgsInfo) genOk = let typeNameResInfo = TypeNameResolutionInfo.ResolveToTypeRefs staticResInfo if first && id.idText = MangledGlobalName then match rest with | [] -> error (Error(FSComp.SR.nrGlobalUsedOnlyAsFirstName(), id.idRange)) | id2 :: rest2 -> - ResolveTypeLongIdentPrim sink ncenv occurence false FullyQualified m nenv ad id2 rest2 staticResInfo genOk + ResolveTypeLongIdentPrim sink ncenv occurrence false FullyQualified m nenv ad id2 rest2 staticResInfo genOk else match rest with | [] -> @@ -3525,8 +3630,8 @@ let rec ResolveTypeLongIdentPrim sink (ncenv: NameResolver) occurence first full for kv in nenv.TyconsByDemangledNameAndArity fullyQualified do if IsEntityAccessible ncenv.amap m ad kv.Value then addToBuffer kv.Value.DisplayName - match occurence with - | ItemOccurence.UseInAttribute -> + match occurrence with + | ItemOccurrence.UseInAttribute -> if kv.Value.DisplayName.EndsWithOrdinal("Attribute") then addToBuffer (kv.Value.DisplayName.Replace("Attribute", "")) | _ -> () @@ -3580,30 +3685,34 @@ let rec ResolveTypeLongIdentPrim sink (ncenv: NameResolver) occurence first full let r = AddResults searchSoFar (modulSearchFailed()) AtMostOneResult m2 (r |?> (fun tcrefs -> CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, genOk, m))) - /// Resolve a long identifier representing a type and report it -let ResolveTypeLongIdentAux sink (ncenv: NameResolver) occurence fullyQualified nenv ad (lid: Ident list) staticResInfo genOk = +let ResolveTypeLongIdentAux sink (ncenv: NameResolver) occurrence fullyQualified nenv ad (lid: Ident list) staticResInfo genOk = let m = rangeOfLid lid let res = match lid with | [] -> error(Error(FSComp.SR.nrUnexpectedEmptyLongId(), m)) | id :: rest -> - ResolveTypeLongIdentPrim sink ncenv occurence true fullyQualified m nenv ad id rest staticResInfo genOk + ResolveTypeLongIdentPrim sink ncenv occurrence true fullyQualified m nenv ad id rest staticResInfo genOk // Register the result as a name resolution match res with | Result (resInfo, tcref) -> - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.UseInType, ad, resInfo, ResultTyparChecker(fun () -> true)) - let item = Item.Types(tcref.DisplayName, [FreshenTycon ncenv m tcref]) - CallNameResolutionSink sink (m, nenv, item, emptyTyparInst, occurence, ad) - | _ -> () - res + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.UseInType, ad, resInfo, ResultTyparChecker(fun () -> true)) + + let _, tinst, tyargs = FreshenTypeInst ncenv.g m (tcref.Typars m) + let item = Item.Types(tcref.DisplayName, [TType_app(tcref, tyargs, ncenv.g.knownWithoutNull)]) + CallNameResolutionSink sink (m, nenv, item, tinst, occurrence, ad) + + Result(resInfo, tcref, tyargs) + + | Exception exn -> + Exception exn /// Resolve a long identifier representing a type and report it -let ResolveTypeLongIdent sink ncenv occurence fullyQualified nenv ad lid staticResInfo genOk = - let res = ResolveTypeLongIdentAux sink ncenv occurence fullyQualified nenv ad lid staticResInfo genOk - (res |?> fun (resInfo, tcref) -> (resInfo.EnclosingTypeInst, tcref)) +let ResolveTypeLongIdent sink ncenv occurrence fullyQualified nenv ad lid staticResInfo genOk = + let res = ResolveTypeLongIdentAux sink ncenv occurrence fullyQualified nenv ad lid staticResInfo genOk + res |?> fun (resInfo, tcref, ttypes) -> (resInfo.EnclosingTypeInst, tcref, ttypes) //------------------------------------------------------------------------- // Resolve F#/IL "." syntax in records etc. @@ -3787,7 +3896,7 @@ let ResolveField sink ncenv nenv ad ty mp id allFields = let checker = ResultTyparChecker(fun () -> true) res |> List.map (fun (resInfo, rfref) -> - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.UseInType, ad, resInfo, checker) + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.UseInType, ad, resInfo, checker) rfref) /// Resolve a long identifier representing a nested record field. @@ -3923,7 +4032,7 @@ let ResolveNestedField sink (ncenv: NameResolver) nenv ad recdTy lid = match item with | Item.RecdField info -> info.FieldType | Item.AnonRecdField (_, tys, index, _) -> tys[index] - | _ -> g.obj_ty + | _ -> g.obj_ty_ambivalent idsBeforeField, (fieldId, item) :: (nestedFieldSearch [] fieldTy rest) @@ -3997,6 +4106,11 @@ let NeedsWorkAfterResolution namedItem = | Item.ActivePatternCase apref -> not (List.isEmpty apref.ActivePatternVal.Typars) | _ -> false +let isWrongItemInExpr item = + match item with + | Item.Types _ -> true + | _ -> false + /// Specifies additional work to do after an item has been processed further in type checking. [] type AfterResolution = @@ -4034,15 +4148,15 @@ let ResolveLongIdentAsExprAndComputeRange (sink: TcResultsSink) (ncenv: NameReso let callSink (refinedItem, tpinst) = if not isFakeIdents then - let occurence = + let occurrence = match item with // It's r.h.s. `Case1` in `let (|Case1|Case1|) _ = if true then Case1 else Case2` // We return `Binding` for it because it's actually not usage, but definition. If we did not // it confuses detecting unused definitions. - | Item.ActivePatternResult _ -> ItemOccurence.Binding - | _ -> ItemOccurence.Use + | Item.ActivePatternResult _ -> ItemOccurrence.Binding + | _ -> ItemOccurrence.Use - CallMethodGroupNameResolutionSink sink (itemRange, nenv, refinedItem, item, tpinst, occurence, ad) + CallMethodGroupNameResolutionSink sink (itemRange, nenv, refinedItem, item, tpinst, occurrence, ad) let callSinkWithSpecificOverload (minfo: MethInfo, pinfoOpt: PropInfo option, tpinst) = let refinedItem = @@ -4059,17 +4173,23 @@ let ResolveLongIdentAsExprAndComputeRange (sink: TcResultsSink) (ncenv: NameReso | Some _ -> if NeedsWorkAfterResolution item then AfterResolution.RecordResolution(None, (fun tpinst -> callSink(item, tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (item, emptyTyparInst))) + + elif isWrongItemInExpr item then + CallNameResolutionSink sink (itemRange, nenv, item, emptyTyparInst, ItemOccurrence.InvalidUse, ad) + AfterResolution.DoNothing + else callSink (item, emptyTyparInst) AfterResolution.DoNothing success (tinstEnclosing, item, itemRange, rest, afterResolution) +[] let (|NonOverridable|_|) namedItem = match namedItem with - | Item.MethodGroup(_, minfos, _) when minfos |> List.exists(fun minfo -> minfo.IsVirtual || minfo.IsAbstract) -> None - | Item.Property(info = pinfos) when pinfos |> List.exists(fun pinfo -> pinfo.IsVirtualProperty) -> None - | _ -> Some () + | Item.MethodGroup(_, minfos, _) when minfos |> List.exists(fun minfo -> minfo.IsVirtual || minfo.IsAbstract) -> ValueNone + | Item.Property(info = pinfos) when pinfos |> List.exists(fun pinfo -> pinfo.IsVirtualProperty) -> ValueNone + | _ -> ValueSome () /// Called for 'expression.Bar' - for VS IntelliSense, we can filter out static members from method groups /// Also called for 'GenericType.Bar' - for VS IntelliSense, we can filter out non-static members from method groups @@ -4085,7 +4205,7 @@ let ResolveExprDotLongIdentAndComputeRange (sink: TcResultsSink) (ncenv: NameRes // "true" resolution let resInfo, item, rest, itemRange = resolveExpr findFlag - ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap itemRange item)) + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurrence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap itemRange item)) // Record the precise resolution of the field for intellisense/goto definition let afterResolution = @@ -4105,7 +4225,7 @@ let ResolveExprDotLongIdentAndComputeRange (sink: TcResultsSink) (ncenv: NameRes let callSink (refinedItem, tpinst) = let refinedItem = FilterMethodGroups ncenv itemRange refinedItem staticOnly let unrefinedItem = FilterMethodGroups ncenv itemRange unrefinedItem staticOnly - CallMethodGroupNameResolutionSink sink (itemRange, nenv, refinedItem, unrefinedItem, tpinst, ItemOccurence.Use, ad) + CallMethodGroupNameResolutionSink sink (itemRange, nenv, refinedItem, unrefinedItem, tpinst, ItemOccurrence.Use, ad) let callSinkWithSpecificOverload (minfo: MethInfo, pinfoOpt: PropInfo option, tpinst) = let refinedItem = @@ -4188,7 +4308,7 @@ let ItemOfTy g x = Item.Types (nm, [x]) // Filter out 'PrivateImplementationDetail' classes -let IsInterestingModuleName nm = not (System.String.IsNullOrEmpty nm) && nm[0] <> '<' +let IsInterestingModuleName nm = not (System.String.IsNullOrEmpty nm) && (!!nm)[0] <> '<' let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f plid (modref: ModuleOrNamespaceRef) = let mty = modref.ModuleOrNamespaceType @@ -4313,14 +4433,14 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso // // Don't show GetHashCode or Equals for F# types that admit equality as an abnormal operation let isUnseenDueToBasicObjRules = - not (isObjTy g ty) && + not (isObjTyAnyNullness g ty) && not minfo.IsExtensionMember && match minfo.LogicalName with | "GetType" -> false - | "GetHashCode" -> isObjTy g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) + | "GetHashCode" -> isObjTyAnyNullness g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) | "ToString" -> false | "Equals" -> - if not (isObjTy g minfo.ApparentEnclosingType) then + if not (isObjTyAnyNullness g minfo.ApparentEnclosingType) then // declaring type is not System.Object - show it false elif minfo.IsInstance then @@ -4331,7 +4451,7 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso true | _ -> // filter out self methods of obj type - isObjTy g minfo.ApparentEnclosingType + isObjTyAnyNullness g minfo.ApparentEnclosingType let result = not isUnseenDueToBasicObjRules && @@ -4500,7 +4620,6 @@ let InfosForTyconConstructors (ncenv: NameResolver) m ad (tcref: TyconRef) = match ResolveObjectConstructor ncenv (DisplayEnv.Empty g) m ad ty with | Result item -> match item with - | Item.FakeInterfaceCtor _ -> None | Item.CtorGroup(nm, ctorInfos) -> let ctors = ctorInfos @@ -5013,14 +5132,14 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( // // Don't show GetHashCode or Equals for F# types that admit equality as an abnormal operation let isUnseenDueToBasicObjRules = - not (isObjTy g ty) && + not (isObjTyAnyNullness g ty) && not minfo.IsExtensionMember && match minfo.LogicalName with | "GetType" -> false - | "GetHashCode" -> isObjTy g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) + | "GetHashCode" -> isObjTyAnyNullness g minfo.ApparentEnclosingType && not (AugmentTypeDefinitions.TypeDefinitelyHasEquality g ty) | "ToString" -> false | "Equals" -> - if not (isObjTy g minfo.ApparentEnclosingType) then + if not (isObjTyAnyNullness g minfo.ApparentEnclosingType) then // declaring type is not System.Object - show it false elif minfo.IsInstance then @@ -5031,7 +5150,7 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( true | _ -> // filter out self methods of obj type - isObjTy g minfo.ApparentEnclosingType + isObjTyAnyNullness g minfo.ApparentEnclosingType let result = not isUnseenDueToBasicObjRules && not minfo.IsInstance = statics && @@ -5301,7 +5420,6 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a | _ -> () | Item.DelegateCtor _ - | Item.FakeInterfaceCtor _ | Item.CtorGroup _ | Item.UnqualifiedType _ -> for tcref in nenv.TyconsByDemangledNameAndArity(OpenQualified).Values do diff --git a/src/fcs-fable/src/Compiler/Checking/NameResolution.fsi b/src/fcs-fable/src/Compiler/Checking/NameResolution.fsi index 3ba5113b00..693c9ec16d 100755 --- a/src/fcs-fable/src/Compiler/Checking/NameResolution.fsi +++ b/src/fcs-fable/src/Compiler/Checking/NameResolution.fsi @@ -94,9 +94,6 @@ type Item = /// Represents the resolution of a name to a constructor | CtorGroup of string * MethInfo list - /// Represents the resolution of a name to the fake constructor simulated for an interface type. - | FakeInterfaceCtor of TType - /// Represents the resolution of a name to a delegate | DelegateCtor of TType @@ -376,7 +373,7 @@ type TypeNameResolutionInfo = /// Represents the kind of the occurrence when reporting a name in name resolution [] -type internal ItemOccurence = +type internal ItemOccurrence = | Binding | Use | UseInType @@ -385,6 +382,7 @@ type internal ItemOccurence = | Implemented | RelatedText | Open + | InvalidUse /// Check for equality, up to signature matching val ItemsAreEffectivelyEqual: TcGlobals -> Item -> Item -> bool @@ -404,7 +402,7 @@ type internal CapturedNameResolution = member ItemWithInst: ItemWithInst /// Information about the occurrence of the symbol - member ItemOccurence: ItemOccurence + member ItemOccurrence: ItemOccurrence /// Information about printing. For example, should redundant keywords be hidden? member DisplayEnv: DisplayEnv @@ -443,7 +441,7 @@ type internal TcResolutions = [] type TcSymbolUseData = { ItemWithInst: ItemWithInst - ItemOccurence: ItemOccurence + ItemOccurrence: ItemOccurrence DisplayEnv: DisplayEnv Range: range } @@ -484,17 +482,17 @@ type ITypecheckResultsSink = /// Record that a name resolution occurred at a specific location in the source abstract NotifyNameResolution: - pos * Item * TyparInstantiation * ItemOccurence * NameResolutionEnv * AccessorDomain * range * bool -> unit + pos * Item * TyparInstantiation * ItemOccurrence * NameResolutionEnv * AccessorDomain * range * bool -> unit /// Record that a method group name resolution occurred at a specific location in the source abstract NotifyMethodGroupNameResolution: - pos * Item * Item * TyparInstantiation * ItemOccurence * NameResolutionEnv * AccessorDomain * range * bool -> + pos * Item * Item * TyparInstantiation * ItemOccurrence * NameResolutionEnv * AccessorDomain * range * bool -> unit /// Record that a printf format specifier occurred at a specific location in the source abstract NotifyFormatSpecifierLocation: range * int -> unit - /// Record that an open declaration occured in a given scope range + /// Record that an open declaration occurred in a given scope range abstract NotifyOpenDeclaration: OpenDeclaration -> unit /// Get the current source @@ -567,7 +565,8 @@ type LookupKind = /// Indicates if a warning should be given for the use of upper-case identifiers in patterns type WarnOnUpperFlag = - | WarnOnUpperCase + | WarnOnUpperUnionCaseLabel + | WarnOnUpperVariablePatterns | AllIdsOK /// Indicates whether we permit a direct reference to a type generator. Only set when resolving the @@ -615,17 +614,17 @@ val internal CallEnvSink: TcResultsSink -> range * NameResolutionEnv * AccessorD /// Report a specific name resolution at a source range val internal CallNameResolutionSink: - TcResultsSink -> range * NameResolutionEnv * Item * TyparInstantiation * ItemOccurence * AccessorDomain -> unit + TcResultsSink -> range * NameResolutionEnv * Item * TyparInstantiation * ItemOccurrence * AccessorDomain -> unit /// Report a specific method group name resolution at a source range val internal CallMethodGroupNameResolutionSink: TcResultsSink -> - range * NameResolutionEnv * Item * Item * TyparInstantiation * ItemOccurence * AccessorDomain -> + range * NameResolutionEnv * Item * Item * TyparInstantiation * ItemOccurrence * AccessorDomain -> unit /// Report a specific name resolution at a source range, replacing any previous resolutions val internal CallNameResolutionSinkReplacing: - TcResultsSink -> range * NameResolutionEnv * Item * TyparInstantiation * ItemOccurence * AccessorDomain -> unit + TcResultsSink -> range * NameResolutionEnv * Item * TyparInstantiation * ItemOccurrence * AccessorDomain -> unit /// Report a specific name resolution at a source range val internal CallExprHasTypeSink: TcResultsSink -> range * NameResolutionEnv * TType * AccessorDomain -> unit @@ -678,6 +677,67 @@ exception internal UpperCaseIdentifierInPattern of range /// Generate a new reference to a record field with a fresh type instantiation val FreshenRecdFieldRef: NameResolver -> range -> RecdFieldRef -> RecdFieldInfo +/// Create a type variable representing the use of a "_" in F# code +val NewAnonTypar: TyparKind * range * TyparRigidity * TyparStaticReq * TyparDynamicReq -> Typar + +val NewNamedInferenceMeasureVar: range * TyparRigidity * TyparStaticReq * Ident -> Typar + +val NewNamedInferenceMeasureVar: range * TyparRigidity * TyparStaticReq * Ident -> Typar + +val NewInferenceMeasurePar: unit -> Typar + +/// Create an inference type variable +val NewInferenceType: TcGlobals -> TType + +/// Create an inference type variable for the kind of a byref pointer +val NewByRefKindInferenceType: TcGlobals -> range -> TType + +/// Create an inference type variable representing an error condition when checking an expression +val NewErrorType: unit -> TType + +/// Create an inference type variable representing an error condition when checking a measure +val NewErrorMeasure: unit -> Measure + +/// Create a list of inference type variables, one for each element in the input list +val NewInferenceTypes: TcGlobals -> 'T list -> TType list + +/// Given a set of type parameters, make new inference type variables for +/// each and ensure that the constraints on the new type variables are adjusted. +/// +/// Returns the inference type variables as a list of types. +val FreshenTypars: g: TcGlobals -> range -> Typars -> TType list + +/// Given a method, which may be generic, make new inference type variables for +/// its generic parameters, and ensure that the constraints the new type variables are adjusted. +/// +/// Returns the inference type variables as a list of types. +val FreshenMethInfo: range -> MethInfo -> TType list + +/// Given a set of formal type parameters and their constraints, make new inference type variables for +/// each and ensure that the constraints on the new type variables are adjusted to refer to these. +/// +/// Returns +/// 1. the new type parameters +/// 2. the instantiation mapping old type parameters to inference variables +/// 3. the inference type variables as a list of types. +val FreshenAndFixupTypars: + g: TcGlobals -> + m: range -> + rigid: TyparRigidity -> + fctps: Typars -> + tinst: TType list -> + tpsorig: Typar list -> + Typar list * TyparInstantiation * TTypes + +/// Given a set of type parameters, make new inference type variables for +/// each and ensure that the constraints on the new type variables are adjusted. +/// +/// Returns +/// 1. the new type parameters +/// 2. the instantiation mapping old type parameters to inference variables +/// 3. the inference type variables as a list of types. +val FreshenTypeInst: g: TcGlobals -> m: range -> tpsorig: Typar list -> Typar list * TyparInstantiation * TTypes + /// Resolve a long identifier to a namespace, module. val internal ResolveLongIdentAsModuleOrNamespace: sink: TcResultsSink -> @@ -735,20 +795,20 @@ val internal ResolveTypeLongIdentInTyconRef: m: range -> tcref: TyconRef -> lid: Ident list -> - TyconRef + TyconRef * TypeInst /// Resolve a long identifier to a type definition val internal ResolveTypeLongIdent: sink: TcResultsSink -> ncenv: NameResolver -> - occurence: ItemOccurence -> + occurrence: ItemOccurrence -> fullyQualified: FullyQualifiedFlag -> nenv: NameResolutionEnv -> ad: AccessorDomain -> lid: Ident list -> staticResInfo: TypeNameResolutionStaticArgsInfo -> genOk: PermitDirectReferenceToGeneratedType -> - ResultOrException + ResultOrException /// Resolve a long identifier to a field val internal ResolveField: @@ -786,7 +846,7 @@ val internal ResolveExprLongIdent: val internal getRecordFieldsInScope: NameResolutionEnv -> Item list -/// Resolve a (possibly incomplete) long identifier to a loist of possible class or record fields +/// Resolve a (possibly incomplete) long identifier to a list of possible class or record fields val internal ResolvePartialLongIdentToClassOrRecdFields: NameResolver -> NameResolutionEnv -> range -> AccessorDomain -> string list -> bool -> bool -> Item list diff --git a/src/fcs-fable/src/Compiler/Checking/NicePrint.fs b/src/fcs-fable/src/Compiler/Checking/NicePrint.fs index 5783996d42..6e5ae8e75c 100755 --- a/src/fcs-fable/src/Compiler/Checking/NicePrint.fs +++ b/src/fcs-fable/src/Compiler/Checking/NicePrint.fs @@ -38,6 +38,8 @@ module internal PrintUtilities = let squareAngleL x = LeftL.leftBracketAngle ^^ x ^^ RightL.rightBracketAngle + let squareAngleReturn x = LeftL.leftBracketAngle ^^ WordL.keywordReturn ^^ SepL.colon ^^ x ^^ RightL.rightBracketAngle + let angleL x = SepL.leftAngle ^^ x ^^ RightL.rightAngle let braceL x = wordL leftBrace ^^ x ^^ wordL rightBrace @@ -55,7 +57,7 @@ module internal PrintUtilities = let comment str = wordL (tagText (sprintf "(* %s *)" str)) - let isDiscard (name: string) = name.StartsWith("_") + let isDiscard (name: string) = name.StartsWithOrdinal("_") let ensureFloat (s: string) = if String.forall (fun c -> Char.IsDigit c || c = '-') s then @@ -224,7 +226,7 @@ module internal PrintUtilities = else s) let pathText = trimPathByDisplayEnv denv path - if pathText = "" then tyconTextL else leftL (tagUnknownEntity pathText) ^^ tyconTextL + if String.IsNullOrEmpty(pathText) then tyconTextL else leftL (tagUnknownEntity pathText) ^^ tyconTextL let layoutBuiltinAttribute (denv: DisplayEnv) (attrib: BuiltinAttribInfo) = let tcref = attrib.TyconRef @@ -261,7 +263,7 @@ module internal PrintUtilities = if possibleXmlDoc.IsEmpty then match info with | Some(Some ccuFileName, xmlDocSig) -> - infoReader.amap.assemblyLoader.TryFindXmlDocumentationInfo(Path.GetFileNameWithoutExtension ccuFileName) + infoReader.amap.assemblyLoader.TryFindXmlDocumentationInfo(!!Path.GetFileNameWithoutExtension(ccuFileName)) |> Option.bind (fun xmlDocInfo -> xmlDocInfo.TryGetXmlDocBySig(xmlDocSig) ) @@ -337,6 +339,13 @@ module internal PrintUtilities = #endif | None -> layout + // When showing types in diagnostics, we don't show nullness annotations by default + // unless the diagnostic is specifically about nullness. + let suppressNullnessAnnotations denv = + match denv.showNullnessAnnotations with + | None -> { denv with showNullnessAnnotations = Some false } + | _ -> denv + module PrintIL = let fullySplitILTypeRef (tref: ILTypeRef) = @@ -496,10 +505,10 @@ module PrintTypes = | Const.Zero -> tagKeyword(if isRefTy g ty then "null" else "default") wordL str - let layoutAccessibilityCore (denv: DisplayEnv) accessibility = + let layoutAccessibilityCoreWithProtected (denv: DisplayEnv) isProtected accessibility = let isInternalCompPath x = match x with - | CompPath(ILScopeRef.Local, []) -> true + | CompPath(ILScopeRef.Local, _, []) -> true | _ -> false let (|Public|Internal|Private|) (TAccess p) = match p with @@ -507,11 +516,15 @@ module PrintTypes = | _ when List.forall isInternalCompPath p -> Internal | _ -> Private match denv.contextAccessibility, accessibility with + | _ when isProtected -> wordL (tagKeyword "protected") | Public, Internal -> WordL.keywordInternal | Public, Private -> WordL.keywordPrivate | Internal, Private -> WordL.keywordPrivate | _ -> emptyL - + + let layoutAccessibilityCore (denv: DisplayEnv) accessibility = + layoutAccessibilityCoreWithProtected denv false accessibility + let layoutAccessibility (denv: DisplayEnv) accessibility itemL = layoutAccessibilityCore denv accessibility ++ itemL @@ -635,6 +648,23 @@ module PrintTypes = let argsL = bracketL (sepListL RightL.comma (List.map (layoutILAttribElement denv) args)) PrintIL.layoutILType denv [] ty ++ argsL + /// Layout nullness attributes for C# flow-analysis + /// F# does not process them, this way we can at least show them. + and layoutCsharpCodeAnalysisIlAttributes denv (attrs:ILAttributes) (layoutCombinator: Layout -> Layout -> Layout) restL = + let denvShortNames() = { denv with shortTypeNames = true } + let attrsL = + [ for a in attrs.AsArray() do + let name = a.Method.DeclaringType.BasicQualifiedName + if name.StartsWith("System.Diagnostics.CodeAnalysis") then + let params_, _args = decodeILAttribData a + layoutILAttrib (denvShortNames()) (a.Method.DeclaringType, params_) + ] + match attrsL with + | [] -> restL + | _ -> + let separated = sepListL RightL.semicolon attrsL + layoutCombinator separated restL + /// Layout '[]' above another block and layoutAttribs denv startOpt isLiteral kind attrs restL = @@ -747,8 +777,13 @@ module PrintTypes = | _ -> if denv.abbreviateAdditionalConstraints then wordL (tagKeyword "when") ^^ wordL(tagText "") - elif denv.shortConstraints then - LeftL.leftParen ^^ wordL (tagKeyword "requires") ^^ sepListL (wordL (tagKeyword "and")) cxsL ^^ RightL.rightParen + elif denv.shortConstraints then + match cxs with + | (_,TyparConstraint.AllowsRefStruct _) :: _ -> + // If the first constraint is 'allows ref struct', we do not want to prefix it with 'requires', because that just reads wrong. + LeftL.leftParen ^^ sepListL (wordL (tagKeyword "and")) cxsL ^^ RightL.rightParen + | _ -> + LeftL.leftParen ^^ wordL (tagKeyword "requires") ^^ sepListL (wordL (tagKeyword "and")) cxsL ^^ RightL.rightParen else wordL (tagKeyword "when") ^^ sepListL (wordL (tagKeyword "and")) cxsL @@ -794,6 +829,9 @@ module PrintTypes = | TyparConstraint.SupportsNull _ -> [wordL (tagKeyword "null") |> longConstraintPrefix] + | TyparConstraint.NotSupportsNull _ -> + [(wordL (tagKeyword "not null") (* ^^ wordL(tagKeyword "null") *) ) |> longConstraintPrefix] + | TyparConstraint.IsNonNullableStruct _ -> if denv.shortConstraints then [wordL (tagText "value type")] @@ -805,6 +843,12 @@ module PrintTypes = [wordL (tagKeyword "unmanaged")] else [wordL (tagKeyword "unmanaged") |> longConstraintPrefix] + + | TyparConstraint.AllowsRefStruct _ -> + if denv.shortConstraints then + [wordL (tagKeyword "allows ref struct")] + else + [wordL (tagKeyword "allows ref struct") |> longConstraintPrefix] | TyparConstraint.IsReferenceType _ -> if denv.shortConstraints then @@ -827,7 +871,7 @@ module PrintTypes = and layoutTraitWithInfo denv env traitInfo = let g = denv.g - let (TTrait(tys, _, memFlags, _, _, _)) = traitInfo + let (TTrait(tys=tys;memberFlags=memFlags)) = traitInfo let nm = traitInfo.MemberDisplayNameCore let nameL = ConvertValLogicalNameToDisplayLayout false (tagMember >> wordL) nm if denv.shortConstraints then @@ -899,6 +943,16 @@ module PrintTypes = | [] -> tcL | [arg] -> layoutTypeWithInfoAndPrec denv env 2 arg ^^ tcL | args -> bracketIfL (prec <= 1) (bracketL (layoutTypesWithInfoAndPrec denv env 2 SepL.comma args) --- tcL) + + and layoutNullness (denv: DisplayEnv) part2 (nullness: Nullness) = + // Show nullness annotations unless explicitly turned off + if denv.showNullnessAnnotations <> Some false then + match nullness.Evaluate() with + | NullnessInfo.WithNull -> part2 ^^ wordL (tagText "| null") + | NullnessInfo.WithoutNull -> part2 + | NullnessInfo.AmbivalentToNull -> part2 //^^ wordL (tagText "__maybenull") + else + part2 /// Layout a type, taking precedence into account to insert brackets where needed and layoutTypeWithInfoAndPrec denv env prec ty = @@ -919,50 +973,56 @@ module PrintTypes = // Always prefer 'float' to 'float<1>' | TType_app (tc, args, _) when tc.IsMeasureableReprTycon && List.forall (isDimensionless g) args -> - layoutTypeWithInfoAndPrec denv env prec (reduceTyconRefMeasureableOrProvided g tc args) + layoutTypeWithInfoAndPrec denv env prec (reduceTyconRefMeasureableOrProvided g tc args) // Layout a type application - | TType_ucase (UnionCaseRef(tc, _), args) - | TType_app (tc, args, _) -> - let prefix = usePrefix denv tc - let demangledCompilationPathOpt, args = - if not denv.includeStaticParametersInTypeNames then - None, args - else + | TType_ucase (UnionCaseRef(tc, _), args) -> + let prefix = usePrefix denv tc + layoutTypeAppWithInfoAndPrec denv env (layoutTyconRefImpl false denv tc None) prec prefix args + | TType_app (tc, args, nullness) -> + let prefix = usePrefix denv tc + let demangledCompilationPathOpt, args = + if not denv.includeStaticParametersInTypeNames then + None, args + else #if FABLE_COMPILER - let regex = System.Text.RegularExpressions.Regex(@"`\d+") + let regex = System.Text.RegularExpressions.Regex(@"`\d+") #else - let regex = System.Text.RegularExpressions.Regex(@"\`\d+") + let regex = System.Text.RegularExpressions.Regex(@"\`\d+") #endif - let path, skip = - (0, tc.CompilationPath.DemangledPath) - ||> List.mapFold (fun skip path -> - // Verify the path does not contain a generic parameter count. - // For example Foo`3 indicates that there are three parameters in args that belong to this path. - let m = regex.Match(path) - if not m.Success then - path, skip - else - let take = m.Value.Replace("`", "") |> int - let genericArgs = - List.skip skip args - |> List.take take - |> List.map (layoutTypeWithInfoAndPrec denv env prec >> showL) - |> String.concat "," - |> sprintf "<%s>" - String.Concat(path.Substring(0, m.Index), genericArgs), (skip + take) - ) - - Some path, List.skip skip args - - layoutTypeAppWithInfoAndPrec - denv - env - (layoutTyconRefImpl false denv tc demangledCompilationPathOpt) - prec - prefix - args + let path, skip = + (0, tc.CompilationPath.DemangledPath) + ||> List.mapFold (fun skip path -> + // Verify the path does not contain a generic parameter count. + // For example Foo`3 indicates that there are three parameters in args that belong to this path. + let m = regex.Match(path) + if not m.Success then + path, skip + else + let take = m.Value.Replace("`", "") |> int + let genericArgs = + List.skip skip args + |> List.take take + |> List.map (layoutTypeWithInfoAndPrec denv env prec >> showL) + |> String.concat "," + |> sprintf "<%s>" + String.Concat(path.Substring(0, m.Index), genericArgs), (skip + take) + ) + + Some path, List.skip skip args + + let part1 = + layoutTypeAppWithInfoAndPrec + denv + env + (layoutTyconRefImpl false denv tc demangledCompilationPathOpt) + prec + prefix + args + let part2 = layoutNullness denv part1 nullness + + part2 // Layout a tuple type | TType_anon (anonInfo, tys) -> let core = sepListL RightL.semicolon (List.map2 (fun nm ty -> wordL (tagField nm) ^^ RightL.colon ^^ layoutTypeWithInfoAndPrec denv env prec ty) (Array.toList anonInfo.SortedNames) tys) @@ -987,16 +1047,20 @@ module PrintTypes = | [h] -> layoutTyparRefWithInfo denv env h ^^ rightL dot --- tauL | h :: t -> spaceListL (List.map (layoutTyparRefWithInfo denv env) (h :: t)) ^^ rightL dot --- tauL - | TType_fun _ -> + | TType_fun (_, _, nullness) -> let argTys, retTy = stripFunTy g ty let retTyL = layoutTypeWithInfoAndPrec denv env 5 retTy let argTysL = argTys |> List.map (layoutTypeWithInfoAndPrec denv env 4) let funcTyL = curriedLayoutsL arrow argTysL retTyL - bracketIfL (prec <= 4) funcTyL + let part1 = bracketIfL (prec <= 4) funcTyL + let part2 = layoutNullness denv part1 nullness + part2 // Layout a type variable . - | TType_var (r, _) -> - layoutTyparRefWithInfo denv env r + | TType_var (r, nullness) -> + let part1 = layoutTyparRefWithInfo denv env r + let part2 = layoutNullness denv part1 nullness + part2 | TType_measure unt -> layoutMeasure denv unt @@ -1176,7 +1240,7 @@ module PrintTypes = (nameL |> addColonL) ^^ tauL /// layouts the elements of an unresolved overloaded method call: - /// argInfos: unammed and named arguments + /// argInfos: unnamed and named arguments /// retTy: return type /// genParamTy: generic parameter types let prettyLayoutsOfUnresolvedOverloading denv argInfos retTy genParamTys = @@ -1193,7 +1257,7 @@ module PrintTypes = // using 0, 1, 2 as discriminant for return, arguments and generic parameters // respectively, in order to easily retrieve each of the types with their // expected quality below. - let typesWithDiscrimants = + let typesWithDiscriminants = [ yield 0, retTy for ty,_ in argInfos do @@ -1201,14 +1265,14 @@ module PrintTypes = for ty in genParamTys do yield 2, ty ] - let typesWithDiscrimants,typarsAndCxs = PrettyTypes.PrettifyDiscriminantAndTypePairs denv.g typesWithDiscrimants - let retTy = typesWithDiscrimants |> List.find (function 0, _ -> true | _ -> false) |> snd + let typesWithDiscriminants,typarsAndCxs = PrettyTypes.PrettifyDiscriminantAndTypePairs denv.g typesWithDiscriminants + let retTy = typesWithDiscriminants |> List.find (function 0, _ -> true | _ -> false) |> snd let argInfos = - typesWithDiscrimants + typesWithDiscriminants |> List.choose (function 1,ty -> Some ty | _ -> None) |> List.map2 (fun (_, argInfo) tTy -> tTy, argInfo) argInfos let genParamTys = - typesWithDiscrimants + typesWithDiscriminants |> List.choose (function 2,ty -> Some ty | _ -> None) argInfos, retTy, genParamTys, typarsAndCxs @@ -1262,12 +1326,12 @@ module PrintTastMemberOrVals = open PrintTypes let mkInlineL denv (v: Val) nameL = - if v.MustInline && not denv.suppressInlineKeyword then + if v.ShouldInline && not denv.suppressInlineKeyword then WordL.keywordInline ++ nameL else nameL - let layoutMemberName (denv: DisplayEnv) (vref: ValRef) niceMethodTypars argInfos tagFunction name = + let layoutMemberName (denv: DisplayEnv) (vref: ValRef) niceMethodTypars argInfos tagFunction name withAccessibility = let nameL = ConvertValLogicalNameToDisplayLayout vref.IsBaseVal (tagFunction >> mkNav vref.DefinitionRange >> wordL) name let nameL = if denv.showMemberContainers then @@ -1289,10 +1353,11 @@ module PrintTastMemberOrVals = layoutTyparDecls denv nameL true niceMethodTypars else nameL - let nameL = layoutAccessibility denv vref.Accessibility nameL - nameL + if withAccessibility then layoutAccessibility denv vref.Accessibility nameL + else nameL let prettyLayoutOfMemberShortOption denv typarInst (v: Val) short = + let denv = suppressNullnessAnnotations denv let vref = mkLocalValRef v let membInfo = Option.get vref.MemberInfo let stat = layoutMemberFlags membInfo.MemberFlags @@ -1303,6 +1368,8 @@ module PrintTastMemberOrVals = for _,info in argInfo do info.Attribs <- [] info.Name <- None + let supportAccessModifiersBeforeGetSet = + denv.g.langVersion.SupportsFeature Features.LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters let prettyTyparInst, memberL = match membInfo.MemberFlags.MemberKind with @@ -1311,7 +1378,7 @@ module PrintTastMemberOrVals = let resL = if short then tauL else - let nameL = layoutMemberName denv vref niceMethodTypars argInfos tagMember vref.DisplayNameCoreMangled + let nameL = layoutMemberName denv vref niceMethodTypars argInfos tagMember vref.DisplayNameCoreMangled true let nameL = if short then nameL else mkInlineL denv vref.Deref nameL stat --- ((nameL |> addColonL) ^^ tauL) prettyTyparInst, resL @@ -1330,14 +1397,19 @@ module PrintTastMemberOrVals = emptyTyparInst, stat | SynMemberKind.PropertyGet -> + let prefixAccessModifier, withGet = + if supportAccessModifiersBeforeGetSet then + false, WordL.keywordWith ^^ layoutAccessibilityCore denv vref.Accessibility ^^ wordL (tagText "get") + else + true, WordL.keywordWith ^^ wordL (tagText "get") if isNil argInfos then // use error recovery because intellisense on an incomplete file will show this errorR(Error(FSComp.SR.tastInvalidFormForPropertyGetter(), vref.Id.idRange)) - let nameL = layoutMemberName denv vref [] argInfos tagProperty vref.DisplayNameCoreMangled + let nameL = layoutMemberName denv vref [] argInfos tagProperty vref.DisplayNameCoreMangled prefixAccessModifier let nameL = if short then nameL else mkInlineL denv vref.Deref nameL let resL = - if short then nameL --- (WordL.keywordWith ^^ WordL.keywordGet) - else stat --- nameL --- (WordL.keywordWith ^^ WordL.keywordGet) + if short then nameL --- withGet + else stat --- nameL --- withGet emptyTyparInst, resL else let argInfos = @@ -1347,21 +1419,25 @@ module PrintTastMemberOrVals = let prettyTyparInst, niceMethodTypars,tauL = prettyLayoutOfMemberType denv vref typarInst argInfos retTy let resL = if short then - if isNil argInfos then tauL - else tauL --- (WordL.keywordWith ^^ WordL.keywordGet) + tauL --- withGet else - let nameL = layoutMemberName denv vref niceMethodTypars argInfos tagProperty vref.DisplayNameCoreMangled + let nameL = layoutMemberName denv vref niceMethodTypars argInfos tagProperty vref.DisplayNameCoreMangled prefixAccessModifier let nameL = if short then nameL else mkInlineL denv vref.Deref nameL - stat --- ((nameL |> addColonL) ^^ (if isNil argInfos then tauL else tauL --- (WordL.keywordWith ^^ WordL.keywordGet))) + stat --- ((nameL |> addColonL) ^^ (if isNil argInfos && not supportAccessModifiersBeforeGetSet then tauL else tauL --- withGet)) prettyTyparInst, resL | SynMemberKind.PropertySet -> + let prefixAccessModifier, withSet = + if supportAccessModifiersBeforeGetSet then + false, WordL.keywordWith ^^ layoutAccessibilityCore denv vref.Accessibility ^^ wordL (tagText "set") + else + true, WordL.keywordWith ^^ wordL (tagText "set") if argInfos.Length <> 1 || isNil argInfos.Head then // use error recovery because intellisense on an incomplete file will show this errorR(Error(FSComp.SR.tastInvalidFormForPropertySetter(), vref.Id.idRange)) - let nameL = layoutMemberName denv vref [] argInfos tagProperty vref.DisplayNameCoreMangled + let nameL = layoutMemberName denv vref [] argInfos tagProperty vref.DisplayNameCoreMangled prefixAccessModifier let nameL = if short then nameL else mkInlineL denv vref.Deref nameL - let resL = stat --- nameL --- (WordL.keywordWith ^^ WordL.keywordSet) + let resL = stat --- nameL --- withSet emptyTyparInst, resL else let curriedArgInfos = argInfos @@ -1369,11 +1445,11 @@ module PrintTastMemberOrVals = let prettyTyparInst, niceMethodTypars, tauL = prettyLayoutOfMemberType denv vref typarInst (if isNil argInfos then [] else [argInfos]) (fst valueInfo) let resL = if short then - (tauL --- (WordL.keywordWith ^^ WordL.keywordSet)) + (tauL --- withSet) else - let nameL = layoutMemberName denv vref niceMethodTypars curriedArgInfos tagProperty vref.DisplayNameCoreMangled + let nameL = layoutMemberName denv vref niceMethodTypars curriedArgInfos tagProperty vref.DisplayNameCoreMangled prefixAccessModifier let nameL = if short then nameL else mkInlineL denv vref.Deref nameL - stat --- ((nameL |> addColonL) ^^ (tauL --- (WordL.keywordWith ^^ WordL.keywordSet))) + stat --- ((nameL |> addColonL) ^^ (tauL --- withSet)) prettyTyparInst, resL prettyTyparInst, memberL @@ -1615,22 +1691,46 @@ module InfoMemberPrinting = let idL = ConvertValLogicalNameToDisplayLayout false (tagMethod >> tagNavArbValRef minfo.ArbitraryValRef >> wordL) minfo.LogicalName SepL.dot ^^ PrintTypes.layoutTyparDecls denv idL true minfo.FormalMethodTypars ^^ - SepL.leftParen + SepL.leftParen + + let layout,paramLayouts = + match denv.showCsharpCodeAnalysisAttributes, minfo with + | true, ILMeth(_g,mi,_e) -> + let methodLayout = + // Render Method attributes and [return:..] attributes on separate lines above (@@) the method definition + PrintTypes.layoutCsharpCodeAnalysisIlAttributes denv (minfo.GetCustomAttrs()) (squareAngleL >> (@@)) layout + |> PrintTypes.layoutCsharpCodeAnalysisIlAttributes denv (mi.RawMetadata.Return.CustomAttrs) (squareAngleReturn >> (@@)) + let paramLayouts = + minfo.GetParamDatas (amap, m, minst) + |> List.map (List.map fst) + |> List.head + |> List.zip (mi.ParamMetadata) + |> List.map(fun (ilParams,paramData) -> + layoutParamData denv paramData + // Render parameter attributes next to (^^) the parameter definition + |> PrintTypes.layoutCsharpCodeAnalysisIlAttributes denv (ilParams.CustomAttrs) (squareAngleL >> (^^)) ) + methodLayout,paramLayouts + | _ -> + layout, + minfo.GetParamDatas (amap, m, minst) + |> List.map (List.map fst) + |> List.concat + |> List.map (layoutParamData denv) - let paramDatas = minfo.GetParamDatas (amap, m, minst) |> List.map (List.map fst) - let layout = layout ^^ sepListL RightL.comma ((List.concat >> List.map (layoutParamData denv)) paramDatas) - layout ^^ RightL.rightParen ^^ WordL.colon ^^ PrintTypes.layoutType denv retTy + + let layout = layout ^^ sepListL RightL.comma paramLayouts + layout ^^ RightL.rightParen ^^ WordL.colon ^^ PrintTypes.layoutType denv retTy // Todo enrich return type // Prettify an ILMethInfo let prettifyILMethInfo (amap: Import.ImportMap) m (minfo: MethInfo) typarInst ilMethInfo = - let (ILMethInfo(_, apparentTy, dty, mdef, _)) = ilMethInfo - let (prettyTyparInst, prettyTys), _ = PrettyTypes.PrettifyInstAndTypes amap.g (typarInst, (apparentTy :: minfo.FormalMethodInst)) + let (ILMethInfo(_, methodsType, mdef, _)) = ilMethInfo + let (prettyTyparInst, prettyTys), _ = PrettyTypes.PrettifyInstAndTypes amap.g (typarInst, (methodsType.ToType :: minfo.FormalMethodInst)) match prettyTys with | prettyApparentTy :: prettyFormalMethInst -> let prettyMethInfo = - match dty with - | None -> MethInfo.CreateILMeth (amap, m, prettyApparentTy, mdef) - | Some declaringTyconRef -> MethInfo.CreateILExtensionMeth(amap, m, prettyApparentTy, declaringTyconRef, minfo.ExtensionMemberPriorityOption, mdef) + match methodsType with + | IlType _ -> MethInfo.CreateILMeth (amap, m, prettyApparentTy, mdef) + | CSharpStyleExtension(declaring=declaringTyconRef) -> MethInfo.CreateILExtensionMeth(amap, m, prettyApparentTy, declaringTyconRef, minfo.ExtensionMemberPriorityOption, mdef) prettyTyparInst, prettyMethInfo, prettyFormalMethInst | _ -> failwith "prettifyILMethInfo - prettyTys empty" @@ -1655,7 +1755,7 @@ module InfoMemberPrinting = // // For C# extension members: // ApparentContainer.Method(argName1: argType1, ..., argNameN: argTypeN) : retType - let prettyLayoutOfMethInfoFreeStyle (infoReader: InfoReader) m denv typarInst methInfo = + let rec prettyLayoutOfMethInfoFreeStyle (infoReader: InfoReader) m denv typarInst methInfo = let amap = infoReader.amap match methInfo with @@ -1666,6 +1766,12 @@ module InfoMemberPrinting = | FSMeth(_, _, vref, _) -> let prettyTyparInst, resL = PrintTastMemberOrVals.prettyLayoutOfValOrMember { denv with showMemberContainers=true } infoReader typarInst vref prettyTyparInst, resL + | MethInfoWithModifiedReturnType(ILMeth(_, ilminfo, _) as wrappedInfo,retTy) -> + let prettyTyparInst, prettyMethInfo, minst = prettifyILMethInfo amap m wrappedInfo typarInst ilminfo + let prettyMethInfo = MethInfoWithModifiedReturnType(prettyMethInfo,retTy) + let resL = layoutMethInfoCSharpStyle amap m denv prettyMethInfo minst + prettyTyparInst, resL + | MethInfoWithModifiedReturnType(mi,_) -> prettyLayoutOfMethInfoFreeStyle infoReader m denv typarInst mi | ILMeth(_, ilminfo, _) -> let prettyTyparInst, prettyMethInfo, minst = prettifyILMethInfo amap m methInfo typarInst ilminfo let resL = layoutMethInfoCSharpStyle amap m denv prettyMethInfo minst @@ -1681,14 +1787,20 @@ module InfoMemberPrinting = let retTy = if pinfo.IsIndexer then mkFunTy g (mkRefTupledTy g (pinfo.GetParamTypes(amap, m))) retTy else retTy let retTy, _ = PrettyTypes.PrettifyType g retTy let nameL = ConvertValLogicalNameToDisplayLayout false (tagProperty >> tagNavArbValRef pinfo.ArbitraryValRef >> wordL) pinfo.PropertyName + let struct(isGetterProtect, isSetterProtect) = pinfo.IsProtectedAccessibility + let getterAccess, setterAccess = + if denv.g.langVersion.SupportsFeature Features.LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters then + PrintTypes.layoutAccessibilityCoreWithProtected denv isGetterProtect (Option.defaultValue taccessPublic pinfo.GetterAccessibility), + PrintTypes.layoutAccessibilityCoreWithProtected denv isSetterProtect (Option.defaultValue taccessPublic pinfo.SetterAccessibility) + else emptyL, emptyL let getterSetter = match pinfo.HasGetter, pinfo.HasSetter with | true, false -> - WordL.keywordWith ^^ WordL.keywordGet + WordL.keywordWith ^^ getterAccess ^^ wordL (tagText "get") | false, true -> - WordL.keywordWith ^^ WordL.keywordSet + WordL.keywordWith ^^ setterAccess ^^ wordL (tagText "set") | true, true -> - WordL.keywordWith ^^ wordL (tagText "get, set") + WordL.keywordWith ^^ getterAccess ^^ wordL (tagText "get") ^^ RightL.comma ++ setterAccess ^^ wordL (tagText "set") | false, false -> emptyL @@ -1825,14 +1937,11 @@ module TastDefinitionPrinting = let layoutPropInfo denv (infoReader: InfoReader) m (pinfo: PropInfo) : Layout list = let amap = infoReader.amap - let isPublicGetterSetter (getter: MethInfo) (setter: MethInfo) = - let isPublicAccess access = access = TAccess [] - match getter.ArbitraryValRef, setter.ArbitraryValRef with - | Some gRef, Some sRef -> isPublicAccess gRef.Accessibility && isPublicAccess sRef.Accessibility - | _ -> false - + let supportAccessModifiersBeforeGetSet = + denv.g.langVersion.SupportsFeature Features.LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters + match pinfo.ArbitraryValRef with - | Some vref -> + | Some vref when not supportAccessModifiersBeforeGetSet -> match pinfo with | DifferentGetterAndSetter(getValRef, setValRef) -> let getSuffix = if pinfo.IsIndexer then emptyL else WordL.keywordWith ^^ WordL.keywordGet @@ -1841,11 +1950,37 @@ module TastDefinitionPrinting = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader setValRef ] | _ -> + let isPublicGetterSetter (getter: MethInfo) (setter: MethInfo) = + let isPublicAccess access = access = TAccess [] + match getter.ArbitraryValRef, setter.ArbitraryValRef with + | Some gRef, Some sRef -> isPublicAccess gRef.Accessibility && isPublicAccess sRef.Accessibility + | _ -> false + let propL = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader vref - if pinfo.HasGetter && pinfo.HasSetter && not pinfo.IsIndexer && isPublicGetterSetter pinfo.GetterMethod pinfo.SetterMethod then + if pinfo.HasGetter && pinfo.HasSetter && not pinfo.IsIndexer && isPublicGetterSetter pinfo.GetterMethod pinfo.SetterMethod then [ propL ^^ WordL.keywordWith ^^ wordL (tagText "get, set") ] else [ propL ] + + | Some vref -> + let propL = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader vref + if pinfo.HasGetter && pinfo.HasSetter then + let rec ``replace 'with'`` layout newLayout = + match layout with + | Node(Leaf (text = text), _, _) when text.Text = "with" -> newLayout + | Node(l, r, i) -> Node(l, ``replace 'with'`` r newLayout , i) + | Attr(text, attr, l) -> Attr(text, attr, ``replace 'with'`` l newLayout ) + | Leaf _ + | ObjLeaf _ -> layout + + let getterAccess, setterAccess = + pinfo.GetterMethod.ArbitraryValRef |> Option.map _.Accessibility |> Option.defaultValue taccessPublic, + pinfo.SetterMethod.ArbitraryValRef |> Option.map _.Accessibility |> Option.defaultValue taccessPublic + let getSet = + WordL.keywordWith ^^ layoutAccessibilityCore denv getterAccess ^^ wordL (tagText "get") ^^ RightL.comma --- layoutAccessibilityCore denv setterAccess ^^ wordL (tagText "set") + [ ``replace 'with'`` propL getSet ] + else + [ propL ] | None -> let modifierAndMember = @@ -1917,9 +2052,10 @@ module TastDefinitionPrinting = match vrefOpt with | None -> true | Some vref -> + (not vref.IsCompilerGenerated) && (denv.showObsoleteMembers || not (CheckFSharpAttributesForObsolete denv.g vref.Attribs)) && (denv.showHiddenMembers || not (CheckFSharpAttributesForHidden denv.g vref.Attribs)) - + let ctors = GetIntrinsicConstructorInfosOfType infoReader m ty |> List.filter (fun minfo -> IsMethInfoAccessible amap m ad minfo && not minfo.IsClassConstructor && shouldShow minfo.ArbitraryValRef) @@ -1931,7 +2067,7 @@ module TastDefinitionPrinting = tycon.ImmediateInterfacesOfFSharpTycon |> List.filter (fun (_, compgen, _) -> not compgen) |> List.map p13 - else + else GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m ty let iimplsLs = @@ -2065,7 +2201,7 @@ module TastDefinitionPrinting = let inherits = [ if not (suppressInheritanceAndInterfacesForTyInSimplifiedDisplays g amap m ty) then match GetSuperTypeOfType g amap m ty with - | Some superTy when not (isObjTy g superTy) && not (isValueTypeTy g superTy) -> + | Some superTy when not (isObjTyAnyNullness g superTy) && not (isValueTypeTy g superTy) -> superTy | _ -> () ] @@ -2754,6 +2890,8 @@ let prettyLayoutOfInstAndSig denv x = PrintTypes.prettyLayoutOfInstAndSig denv x let minimalStringsOfTwoTypes denv ty1 ty2 = let (ty1, ty2), tpcs = PrettyTypes.PrettifyTypePair denv.g (ty1, ty2) + let denv = suppressNullnessAnnotations denv + // try denv + no type annotations let attempt1 = let denv = { denv with showInferenceTyparAnnotations=false; showStaticallyResolvedTyparAnnotations=false } @@ -2776,6 +2914,7 @@ let minimalStringsOfTwoTypes denv ty1 ty2 = | Some res -> res | None -> + // try denv let attempt3 = let min1 = stringOfTy denv ty1 let min2 = stringOfTy denv ty2 @@ -2801,13 +2940,14 @@ let minimalStringsOfTwoTypes denv ty1 ty2 = let denv = denv.SetOpenPaths [] let denv = { denv with includeStaticParametersInTypeNames=true } let makeName t = - let assemblyName = PrintTypes.layoutAssemblyName denv t |> function | null | "" -> "" | name -> sprintf " (%s)" name + let assemblyName = PrintTypes.layoutAssemblyName denv t |> function Null | NonNull "" -> "" | NonNull name -> sprintf " (%s)" name sprintf "%s%s" (stringOfTy denv t) assemblyName (makeName ty1, makeName ty2, stringOfTyparConstraints denv tpcs) // Note: Always show imperative annotations when comparing value signatures let minimalStringsOfTwoValues denv infoReader vref1 vref2 = + let denv = suppressNullnessAnnotations denv let denvMin = { denv with showInferenceTyparAnnotations=true; showStaticallyResolvedTyparAnnotations=false } let min1 = buildString (fun buf -> outputQualifiedValOrMember denvMin infoReader buf vref1) let min2 = buildString (fun buf -> outputQualifiedValOrMember denvMin infoReader buf vref2) @@ -2821,5 +2961,9 @@ let minimalStringsOfTwoValues denv infoReader vref1 vref2 = let minimalStringOfType denv ty = let ty, _cxs = PrettyTypes.PrettifyType denv.g ty + let denv = suppressNullnessAnnotations denv let denvMin = { denv with showInferenceTyparAnnotations=false; showStaticallyResolvedTyparAnnotations=false } showL (PrintTypes.layoutTypeWithInfoAndPrec denvMin SimplifyTypes.typeSimplificationInfo0 2 ty) + +let minimalStringOfTypeWithNullness denv ty = + minimalStringOfType {denv with showNullnessAnnotations = Some true} ty diff --git a/src/fcs-fable/src/Compiler/Checking/NicePrint.fsi b/src/fcs-fable/src/Compiler/Checking/NicePrint.fsi index 84dabb2c95..8b90e66ce9 100644 --- a/src/fcs-fable/src/Compiler/Checking/NicePrint.fsi +++ b/src/fcs-fable/src/Compiler/Checking/NicePrint.fsi @@ -173,3 +173,5 @@ val minimalStringsOfTwoValues: denv: DisplayEnv -> infoReader: InfoReader -> vref1: ValRef -> vref2: ValRef -> string * string val minimalStringOfType: denv: DisplayEnv -> ty: TType -> string + +val minimalStringOfTypeWithNullness: denv: DisplayEnv -> ty: TType -> string diff --git a/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fs b/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fs index 33c93e6e36..7fc4a4dcb1 100644 --- a/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fs +++ b/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fs @@ -26,6 +26,7 @@ open FSharp.Compiler.TypeRelations #if !FABLE_COMPILER open type System.MemoryExtensions #endif +open Import exception MatchIncomplete of bool * (string * bool) option * range exception RuleNeverMatched of range @@ -45,7 +46,7 @@ type Pattern = | TPat_as of Pattern * PatternValBinding * range (* note: can be replaced by TPat_var, i.e. equals TPat_conjs([TPat_var; pat]) *) | TPat_disjs of Pattern list * range | TPat_conjs of Pattern list * range - | TPat_query of (Expr * TType list * bool * (ValRef * TypeInst) option * int * ActivePatternInfo) * Pattern * range + | TPat_query of (Expr * TType list * ActivePatternReturnKind * (ValRef * TypeInst) option * int * ActivePatternInfo) * Pattern * range | TPat_unioncase of UnionCaseRef * TypeInst * Pattern list * range | TPat_exnconstr of TyconRef * Pattern list * range | TPat_tuple of TupInfo * Pattern list * TType list * range @@ -473,7 +474,7 @@ let computeWhatSuccessfulNullTestImpliesAboutTypeTest g tgtTy2 = Implication.Fails /// Work out what a failing null test implies about a type test (against tgtTy2) for the same -/// input balue. The answer is "nothing" but it's included for symmetry. +/// input value. The answer is "nothing" but it's included for symmetry. let computeWhatFailingNullTestImpliesAboutTypeTest _g _tgtTy2 = Implication.Nothing @@ -511,7 +512,7 @@ let computeWhatSuccessfulTypeTestImpliesAboutTypeTest g amap m tgtTy1 tgtTy2 = // For any inputs where ':? int' succeeds, ':? string' will fail // // - // This only applies if tgtTy2 is not potetnially related to the sealed type tgtTy1: + // This only applies if tgtTy2 is not potentially related to the sealed type tgtTy1: // match x with // | :? int when false -> ... // note: "when false" used so type test succeeds but proceed to next type test // | :? IComparable -> ... @@ -613,15 +614,15 @@ let getDiscrimOfPattern (g: TcGlobals) tpinst t = | TPat_isinst (srcTy, tgtTy, _, _m) -> Some(DecisionTreeTest.IsInst (instType tpinst srcTy, instType tpinst tgtTy)) | TPat_exnconstr(tcref, _, _m) -> - Some(DecisionTreeTest.IsInst (g.exn_ty, mkAppTy tcref [])) + Some(DecisionTreeTest.IsInst (g.exn_ty, mkWoNullAppTy tcref [])) | TPat_const (c, _m) -> Some(DecisionTreeTest.Const c) | TPat_unioncase (c, tyargs', _, _m) -> Some(DecisionTreeTest.UnionCase (c, instTypes tpinst tyargs')) | TPat_array (args, ty, _m) -> Some(DecisionTreeTest.ArrayLength (args.Length, ty)) - | TPat_query ((activePatExpr, resTys, isStructRetTy, apatVrefOpt, idx, apinfo), _, _m) -> - Some (DecisionTreeTest.ActivePatternCase (activePatExpr, instTypes tpinst resTys, isStructRetTy, apatVrefOpt, idx, apinfo)) + | TPat_query ((activePatExpr, resTys, retKind, apatVrefOpt, idx, apinfo), _, _m) -> + Some (DecisionTreeTest.ActivePatternCase (activePatExpr, instTypes tpinst resTys, retKind, apatVrefOpt, idx, apinfo)) | TPat_error range -> Some (DecisionTreeTest.Error range) @@ -737,24 +738,7 @@ let ChooseInvestigationPointLeftToRight frontiers = | [] -> failwith "ChooseInvestigationPointLeftToRight: no frontiers!" - -#if OPTIMIZE_LIST_MATCHING -// This is an initial attempt to remove extra typetests/castclass for simple list pattern matching "match x with h :: t -> ... | [] -> ..." -// The problem with this technique is that it creates extra locals which inhibit the process of converting pattern matches into linear let bindings. - -let (|ListConsDiscrim|_|) g = function - | (DecisionTreeTest.UnionCase (ucref, tinst)) - (* check we can use a simple 'isinst' instruction *) - when tyconRefEq g ucref.TyconRef g.list_tcr_canon & ucref.CaseName = "op_ColonColon" -> Some tinst - | _ -> None - -let (|ListEmptyDiscrim|_|) g = function - | (DecisionTreeTest.UnionCase (ucref, tinst)) - (* check we can use a simple 'isinst' instruction *) - when tyconRefEq g ucref.TyconRef g.list_tcr_canon & ucref.CaseName = "op_Nil" -> Some tinst - | _ -> None -#endif - +[] let (|ConstNeedsDefaultCase|_|) c = match c with | Const.Decimal _ @@ -769,8 +753,8 @@ let (|ConstNeedsDefaultCase|_|) c = | Const.UInt64 _ | Const.IntPtr _ | Const.UIntPtr _ - | Const.Char _ -> Some () - | _ -> None + | Const.Char _ -> ValueSome () + | _ -> ValueNone /// Build a dtree, equivalent to: TDSwitch("expr", edges, default, m) /// @@ -809,17 +793,6 @@ let rec BuildSwitch inpExprOpt g expr edges dflt m = | TCase((DecisionTreeTest.IsNull | DecisionTreeTest.IsInst _), _) as edge :: edges, dflt -> TDSwitch(expr, [edge], Some (BuildSwitch None g expr edges dflt m), m) -#if OPTIMIZE_LIST_MATCHING - // 'cons/nil' tests where we have stored the result of the cons test in an 'isinst' in a variable - // In this case the 'expr' already holds the result of the 'isinst' test. - | [TCase(ListConsDiscrim g tinst, consCase)], Some emptyCase - | [TCase(ListEmptyDiscrim g tinst, emptyCase)], Some consCase - | [TCase(ListEmptyDiscrim g _, emptyCase); TCase(ListConsDiscrim g tinst, consCase)], None - | [TCase(ListConsDiscrim g tinst, consCase); TCase(ListEmptyDiscrim g _, emptyCase)], None - when Option.isSome inpExprOpt -> - TDSwitch(expr, [TCase(DecisionTreeTest.IsNull, emptyCase)], Some consCase, m) -#endif - // All these should also always have default cases | TCase(DecisionTreeTest.Const ConstNeedsDefaultCase, _) :: _, None -> error(InternalError("inexhaustive match - need a default case!", m)) @@ -944,8 +917,8 @@ let rec investigationPoints inpPat = let rec erasePartialPatterns inpPat = match inpPat with - | TPat_query ((expr, resTys, isStructRetTy, apatVrefOpt, idx, apinfo), p, m) -> - if apinfo.IsTotal then TPat_query ((expr, resTys, isStructRetTy, apatVrefOpt, idx, apinfo), erasePartialPatterns p, m) + | TPat_query ((expr, resTys, retKind, apatVrefOpt, idx, apinfo), p, m) -> + if apinfo.IsTotal then TPat_query ((expr, resTys, retKind, apatVrefOpt, idx, apinfo), erasePartialPatterns p, m) else TPat_disjs ([], m) (* always fail *) | TPat_as (p, x, m) -> TPat_as (erasePartialPatterns p, x, m) | TPat_disjs (subPats, m) -> TPat_disjs(erasePartials subPats, m) @@ -1275,36 +1248,22 @@ let CompilePatternBasic AdjustValToHaveValReprInfo v origInputVal.TryDeclaringEntity ValReprInfo.emptyValData Some addrExp, Some (mkInvisibleBind v e) - - -#if OPTIMIZE_LIST_MATCHING - | [EdgeDiscrim(_, ListConsDiscrim g tinst, m); EdgeDiscrim(_, ListEmptyDiscrim g _, _)] - | [EdgeDiscrim(_, ListEmptyDiscrim g _, _); EdgeDiscrim(_, ListConsDiscrim g tinst, m)] - | [EdgeDiscrim(_, ListConsDiscrim g tinst, m)] - | [EdgeDiscrim(_, ListEmptyDiscrim g tinst, m)] - (* check we can use a simple 'isinst' instruction *) - when isNil origInputValTypars -> - - let ucaseTy = (mkProvenUnionCaseTy g.cons_ucref tinst) - let v, vExpr = mkCompGenLocal m "unionTestResult" ucaseTy - if origInputVal.IsMemberOrModuleBinding then - AdjustValToHaveValReprInfo v origInputVal.DeclaringEntity ValReprInfo.emptyValData - let argExpr = GetSubExprOfInput subexpr - let appExpr = mkIsInst ucaseTy argExpr mMatch - Some vExpr, Some (mkInvisibleBind v appExpr) -#endif - // Active pattern matches: create a variable to hold the results of executing the active pattern. // If a struct return we continue with an expression for taking the address of that location. - | EdgeDiscrim(_, DecisionTreeTest.ActivePatternCase(activePatExpr, resTys, isStructRetTy, _apatVrefOpt, _, apinfo), m) :: _ -> + | EdgeDiscrim(_, DecisionTreeTest.ActivePatternCase(activePatExpr, resTys, retKind, _apatVrefOpt, _, apinfo), m) :: _ -> if not (isNil origInputValTypars) then error(InternalError("Unexpected generalized type variables when compiling an active pattern", m)) - let resTy = apinfo.ResultType g m resTys isStructRetTy + let resTy = apinfo.ResultType g m resTys retKind let argExpr = GetSubExprOfInput subexpr let appExpr = mkApps g ((activePatExpr, tyOfExpr g activePatExpr), [], [argExpr], m) - let vOpt, addrExp, _readonly, _writeonly = mkExprAddrOfExprAux g isStructRetTy false NeverMutates appExpr None mMatch + let mustTakeAddress = + match retKind with + | ActivePatternReturnKind.StructTypeWrapper -> true + | ActivePatternReturnKind.RefTypeWrapper + | ActivePatternReturnKind.Boolean -> false + let vOpt, addrExp, _readonly, _writeonly = mkExprAddrOfExprAux g mustTakeAddress false NeverMutates appExpr None mMatch match vOpt with | None -> let v, vExpr = mkCompGenLocal m ("activePatternResult" + string (newUnique())) resTy @@ -1341,9 +1300,6 @@ let CompilePatternBasic let resPostBindOpt, ucaseBindOpt = match discrim with | DecisionTreeTest.UnionCase (ucref, tinst) when -#if OPTIMIZE_LIST_MATCHING - isNone inpExprOpt && -#endif (isNil origInputValTypars && not origInputVal.IsMemberOrModuleBinding && not ucref.Tycon.IsStructRecordOrUnionTycon && @@ -1360,13 +1316,17 @@ let CompilePatternBasic // Convert active pattern edges to tests on results data let discrim' = match discrim with - | DecisionTreeTest.ActivePatternCase(_pexp, resTys, isStructRetTy, _apatVrefOpt, idx, apinfo) -> + | DecisionTreeTest.ActivePatternCase(_pexp, resTys, retKind, _apatVrefOpt, idx, apinfo) -> let aparity = apinfo.ActiveTags.Length let total = apinfo.IsTotal if not total && aparity > 1 then error(Error(FSComp.SR.patcPartialActivePatternsGenerateOneResult(), m)) - if not total then DecisionTreeTest.UnionCase(mkAnySomeCase g isStructRetTy, resTys) + if not total then + match retKind with + | ActivePatternReturnKind.Boolean -> DecisionTreeTest.Const(Const.Bool true) + | ActivePatternReturnKind.RefTypeWrapper -> DecisionTreeTest.UnionCase(mkAnySomeCase g false, resTys) + | ActivePatternReturnKind.StructTypeWrapper -> DecisionTreeTest.UnionCase(mkAnySomeCase g true, resTys) elif aparity <= 1 then DecisionTreeTest.Const(Const.Unit) else DecisionTreeTest.UnionCase(mkChoiceCaseRef g m aparity idx, resTys) | _ -> discrim @@ -1438,7 +1398,7 @@ let CompilePatternBasic let newActives = removeActive path actives match patAtActive with | TPat_wild _ | TPat_as _ | TPat_tuple _ | TPat_disjs _ | TPat_conjs _ | TPat_recd _ -> failwith "Unexpected projection pattern" - | TPat_query ((_, resTys, isStructRetTy, apatVrefOpt, idx, apinfo), p, m) -> + | TPat_query ((_, resTys, retKind, apatVrefOpt, idx, apinfo), p, m) -> if apinfo.IsTotal then // Total active patterns always return choice values let hasParam = (match apatVrefOpt with None -> true | Some (vref, _) -> doesActivePatternHaveFreeTypars g vref) @@ -1466,10 +1426,12 @@ let CompilePatternBasic if i = iInvestigated then let subAccess _j tpinst _ = let expr = Option.get inpExprOpt - if isStructRetTy then + match retKind with + | ActivePatternReturnKind.Boolean -> expr + | ActivePatternReturnKind.StructTypeWrapper -> // In this case, the inpExprOpt is already an address-of expression mkUnionCaseFieldGetProvenViaExprAddr (expr, mkValueSomeCase g, instTypes tpinst resTys, 0, mExpr) - else + | ActivePatternReturnKind.RefTypeWrapper -> mkUnionCaseFieldGetUnprovenViaExprAddr (expr, mkSomeCase g, instTypes tpinst resTys, 0, mExpr) mkSubFrontiers path subAccess newActives [p] (fun path j -> PathQuery(path, int64 j)) else @@ -1512,7 +1474,7 @@ let CompilePatternBasic | TPat_exnconstr (ecref, argpats, _) -> let srcTy1 = g.exn_ty - let tgtTy1 = mkAppTy ecref [] + let tgtTy1 = mkWoNullAppTy ecref [] if taken |> List.exists (discrimsEq g (DecisionTreeTest.IsInst (srcTy1, tgtTy1))) then [] else match discrim with diff --git a/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fsi b/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fsi index 5b2d94c8ff..b4d68aa320 100644 --- a/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fsi +++ b/src/fcs-fable/src/Compiler/Checking/PatternMatchCompilation.fsi @@ -27,7 +27,10 @@ type Pattern = | TPat_as of Pattern * PatternValBinding * range | TPat_disjs of Pattern list * range | TPat_conjs of Pattern list * range - | TPat_query of (Expr * TType list * bool * (ValRef * TypeInst) option * int * ActivePatternInfo) * Pattern * range + | TPat_query of + (Expr * TType list * ActivePatternReturnKind * (ValRef * TypeInst) option * int * ActivePatternInfo) * + Pattern * + range | TPat_unioncase of UnionCaseRef * TypeInst * Pattern list * range | TPat_exnconstr of TyconRef * Pattern list * range | TPat_tuple of TupInfo * Pattern list * TType list * range diff --git a/src/fcs-fable/src/Compiler/Checking/PostInferenceChecks.fs b/src/fcs-fable/src/Compiler/Checking/PostInferenceChecks.fs index a4963093ed..99a8e89356 100644 --- a/src/fcs-fable/src/Compiler/Checking/PostInferenceChecks.fs +++ b/src/fcs-fable/src/Compiler/Checking/PostInferenceChecks.fs @@ -28,6 +28,7 @@ open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypeHierarchy open FSharp.Compiler.TypeRelations +open Import //-------------------------------------------------------------------------- // NOTES: reraise safety checks @@ -334,7 +335,20 @@ let RecordAnonRecdInfo cenv (anonInfo: AnonRecdTypeInfo) = // approx walk of type //-------------------------------------------------------------------------- -let rec CheckTypeDeep (cenv: cenv) (visitTy, visitTyconRefOpt, visitAppTyOpt, visitTraitSolutionOpt, visitTyparOpt as f) (g: TcGlobals) env isInner ty = +/// Represents the container for nester type instantions, carrying information about the parent (generic type) and data about correspinding generic typar definition. +/// For current use, IlGenericParameterDef was enough. For other future use cases, conversion into F# Typar might be needed. +type TypeInstCtx = + | NoInfo + | IlGenericInst of parent:TyconRef * genericArg:ILGenericParameterDef + | TyparInst of parent:TyconRef + | TopLevelAllowingByRef + + with member x.TyparAllowsRefStruct() = + match x with + | IlGenericInst(_,ilTypar) -> ilTypar.HasAllowsRefStruct + | _ -> false + +let rec CheckTypeDeep (cenv: cenv) (visitTy, visitTyconRefOpt, visitAppTyOpt, visitTraitSolutionOpt, visitTyparOpt as f) (g: TcGlobals) env (typeInstParentOpt:TypeInstCtx) ty = // We iterate the _solved_ constraints as well, to pick up any record of trait constraint solutions // This means we walk _all_ the constraints _everywhere_ in a type, including // those attached to _solved_ type variables. This is used by PostTypeCheckSemanticChecks to detect uses of @@ -346,7 +360,7 @@ let rec CheckTypeDeep (cenv: cenv) (visitTy, visitTyconRefOpt, visitAppTyOpt, vi | TType_var (tp, _) when tp.Solution.IsSome -> for cx in tp.Constraints do match cx with - | TyparConstraint.MayResolveMember(TTrait(_, _, _, _, _, soln), _) -> + | TyparConstraint.MayResolveMember(TTrait(solution=soln), _) -> match visitTraitSolutionOpt, soln.Value with | Some visitTraitSolution, Some sln -> visitTraitSolution sln | _ -> () @@ -366,22 +380,30 @@ let rec CheckTypeDeep (cenv: cenv) (visitTy, visitTyconRefOpt, visitAppTyOpt, vi match ty with | TType_forall (tps, body) -> let env = BindTypars g env tps - CheckTypeDeep cenv f g env isInner body + CheckTypeDeep cenv f g env typeInstParentOpt body tps |> List.iter (fun tp -> tp.Constraints |> List.iter (CheckTypeConstraintDeep cenv f g env)) | TType_measure _ -> () | TType_app (tcref, tinst, _) -> match visitTyconRefOpt with - | Some visitTyconRef -> visitTyconRef isInner tcref + | Some visitTyconRef -> visitTyconRef typeInstParentOpt tcref | None -> () // If it's a 'byref<'T>', don't check 'T as an inner. This allows byref>. // 'byref>' is invalid and gets checked in visitAppTy. - if isByrefTyconRef g tcref then - CheckTypesDeepNoInner cenv f g env tinst + //if isByrefTyconRef g tcref then + // CheckTypesDeepNoInner cenv f g env tinst + + if tcref.CanDeref && tcref.IsILTycon && tinst.Length = tcref.ILTyconRawMetadata.GenericParams.Length then + (tinst,tcref.ILTyconRawMetadata.GenericParams) + ||> List.iter2 (fun ty ilGenericParam -> + let typeInstParent = IlGenericInst(tcref, ilGenericParam) + CheckTypeDeep cenv f g env typeInstParent ty) else - CheckTypesDeep cenv f g env tinst + let parentRef = TyparInst(tcref) + for ty in tinst do + CheckTypeDeep cenv f g env parentRef ty match visitAppTyOpt with | Some visitAppTy -> visitAppTy (tcref, tinst) @@ -398,8 +420,8 @@ let rec CheckTypeDeep (cenv: cenv) (visitTy, visitTyconRefOpt, visitAppTyOpt, vi CheckTypesDeep cenv f g env tys | TType_fun (s, t, _) -> - CheckTypeDeep cenv f g env true s - CheckTypeDeep cenv f g env true t + CheckTypeDeep cenv f g env NoInfo s + CheckTypeDeep cenv f g env NoInfo t | TType_var (tp, _) -> if not tp.IsSolved then @@ -410,43 +432,41 @@ let rec CheckTypeDeep (cenv: cenv) (visitTy, visitTyconRefOpt, visitAppTyOpt, vi and CheckTypesDeep cenv f g env tys = for ty in tys do - CheckTypeDeep cenv f g env true ty - -and CheckTypesDeepNoInner cenv f g env tys = - for ty in tys do - CheckTypeDeep cenv f g env false ty + CheckTypeDeep cenv f g env NoInfo ty and CheckTypeConstraintDeep cenv f g env x = match x with - | TyparConstraint.CoercesTo(ty, _) -> CheckTypeDeep cenv f g env true ty + | TyparConstraint.CoercesTo(ty, _) -> CheckTypeDeep cenv f g env NoInfo ty | TyparConstraint.MayResolveMember(traitInfo, _) -> CheckTraitInfoDeep cenv f g env traitInfo - | TyparConstraint.DefaultsTo(_, ty, _) -> CheckTypeDeep cenv f g env true ty + | TyparConstraint.DefaultsTo(_, ty, _) -> CheckTypeDeep cenv f g env NoInfo ty | TyparConstraint.SimpleChoice(tys, _) -> CheckTypesDeep cenv f g env tys - | TyparConstraint.IsEnum(underlyingTy, _) -> CheckTypeDeep cenv f g env true underlyingTy - | TyparConstraint.IsDelegate(argTys, retTy, _) -> CheckTypeDeep cenv f g env true argTys; CheckTypeDeep cenv f g env true retTy + | TyparConstraint.IsEnum(underlyingTy, _) -> CheckTypeDeep cenv f g env NoInfo underlyingTy + | TyparConstraint.IsDelegate(argTys, retTy, _) -> CheckTypeDeep cenv f g env NoInfo argTys; CheckTypeDeep cenv f g env NoInfo retTy | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ + | TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> () -and CheckTraitInfoDeep cenv (_, _, _, visitTraitSolutionOpt, _ as f) g env (TTrait(tys, _, _, argTys, retTy, soln)) = - CheckTypesDeep cenv f g env tys - CheckTypesDeep cenv f g env argTys - Option.iter (CheckTypeDeep cenv f g env true ) retTy - match visitTraitSolutionOpt, soln.Value with +and CheckTraitInfoDeep cenv (_, _, _, visitTraitSolutionOpt, _ as f) g env traitInfo = + CheckTypesDeep cenv f g env traitInfo.SupportTypes + CheckTypesDeep cenv f g env traitInfo.CompiledObjectAndArgumentTypes + Option.iter (CheckTypeDeep cenv f g env NoInfo ) traitInfo.CompiledReturnType + match visitTraitSolutionOpt, traitInfo.Solution with | Some visitTraitSolution, Some sln -> visitTraitSolution sln | _ -> () /// Check for byref-like types let CheckForByrefLikeType cenv env m ty check = - CheckTypeDeep cenv (ignore, Some (fun _deep tcref -> if isByrefLikeTyconRef cenv.g m tcref then check()), None, None, None) cenv.g env false ty + CheckTypeDeep cenv (ignore, Some (fun ctx tcref -> if (isByrefLikeTyconRef cenv.g m tcref && not(ctx.TyparAllowsRefStruct())) then check()), None, None, None) cenv.g env NoInfo ty /// Check for byref types let CheckForByrefType cenv env ty check = - CheckTypeDeep cenv (ignore, Some (fun _deep tcref -> if isByrefTyconRef cenv.g tcref then check()), None, None, None) cenv.g env false ty + CheckTypeDeep cenv (ignore, Some (fun _ctx tcref -> if isByrefTyconRef cenv.g tcref then check()), None, None, None) cenv.g env NoInfo ty /// check captures under lambdas /// @@ -457,7 +477,7 @@ let CheckEscapes cenv allowProtected m syntacticArgs body = (* m is a range suit if cenv.reportErrors then let cantBeFree (v: Val) = // If v is a syntactic argument, then it can be free since it was passed in. - // The following can not be free: + // The following cannot be free: // a) BaseVal can never escape. // b) Byref typed values can never escape. // Note that: Local mutables can be free, as they will be boxed later. @@ -478,7 +498,7 @@ let CheckEscapes cenv allowProtected m syntacticArgs body = (* m is a range suit if (isByrefLikeTy cenv.g m v.Type) then // Inner functions are not guaranteed to compile to method with a predictable arity (number of arguments). // As such, partial applications involving byref arguments could lead to closures containing byrefs. - // For safety, such functions are assumed to have no known arity, and so can not accept byrefs. + // For safety, such functions are assumed to have no known arity, and so cannot accept byrefs. errorR(Error(FSComp.SR.chkByrefUsedInInvalidWay(v.DisplayName), m)) elif v.IsBaseVal then @@ -515,7 +535,7 @@ let CheckTypeForAccess (cenv: cenv) env objName valAcc m ty = if isLessAccessible tyconAcc valAcc then errorR(Error(FSComp.SR.chkTypeLessAccessibleThanType(tcref.DisplayName, (objName())), m)) - CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env false ty + CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env NoInfo ty let WarnOnWrongTypeForAccess (cenv: cenv) env objName valAcc m ty = if cenv.reportErrors then @@ -533,7 +553,7 @@ let WarnOnWrongTypeForAccess (cenv: cenv) env objName valAcc m ty = let warningText = errorText + Environment.NewLine + FSComp.SR.tcTypeAbbreviationsCheckedAtCompileTime() warning(AttributeChecking.ObsoleteWarning(warningText, m)) - CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env false ty + CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env NoInfo ty /// Indicates whether a byref or byref-like type is permitted at a particular location [] @@ -628,16 +648,26 @@ let CheckTypeAux permitByRefLike (cenv: cenv) env m ty onInnerByrefError = else errorR (Error(FSComp.SR.checkNotSufficientlyGenericBecauseOfScope(tp.DisplayName), m)) - let visitTyconRef isInner tcref = + let visitTyconRef (ctx:TypeInstCtx) tcref = + let checkInner() = + match ctx with + | TopLevelAllowingByRef -> false + | TyparInst(parentTcRef) + | IlGenericInst(parentTcRef,_) when isByrefTyconRef cenv.g parentTcRef -> false + | _ -> true + + let isInnerByRefLike() = checkInner() && isByrefLikeTyconRef cenv.g m tcref + + let permitByRefLike = + if ctx.TyparAllowsRefStruct() then PermitByRefType.All else permitByRefLike - let isInnerByRefLike = isInner && isByrefLikeTyconRef cenv.g m tcref match permitByRefLike with | PermitByRefType.None when isByrefLikeTyconRef cenv.g m tcref -> errorR(Error(FSComp.SR.chkErrorUseOfByref(), m)) - | PermitByRefType.NoInnerByRefLike when isInnerByRefLike -> + | PermitByRefType.NoInnerByRefLike when isInnerByRefLike() -> onInnerByrefError () - | PermitByRefType.SpanLike when isByrefTyconRef cenv.g tcref || isInnerByRefLike -> + | PermitByRefType.SpanLike when isByrefTyconRef cenv.g tcref || isInnerByRefLike() -> onInnerByrefError () | _ -> () @@ -664,7 +694,13 @@ let CheckTypeAux permitByRefLike (cenv: cenv) env m ty onInnerByrefError = cenv.potentialUnboundUsesOfVals <- cenv.potentialUnboundUsesOfVals.Add(vref.Stamp, m) | _ -> () - CheckTypeDeep cenv (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTyar) cenv.g env false ty + let initialCtx = + match permitByRefLike with + | PermitByRefType.SpanLike + | PermitByRefType.NoInnerByRefLike -> TopLevelAllowingByRef + | _ -> NoInfo + + CheckTypeDeep cenv (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTyar) cenv.g env initialCtx ty let CheckType permitByRefLike cenv env m ty = CheckTypeAux permitByRefLike cenv env m ty (fun () -> errorR(Error(FSComp.SR.chkErrorUseOfByref(), m))) @@ -702,10 +738,6 @@ let CheckNoReraise cenv freesOpt (body: Expr) = if fvs.UsesUnboundRethrow then errorR(Error(FSComp.SR.chkErrorContainsCallToRethrow(), body.Range)) -/// Check if a function is a quotation splice operator -let isSpliceOperator g v = valRefEq g v g.splice_expr_vref || valRefEq g v g.splice_raw_expr_vref - - /// Examples: /// I & I => ExactlyEqual. /// I & I => NotEqual. @@ -775,8 +807,8 @@ let rec CheckExprNoByrefs cenv env expr = and CheckValRef (cenv: cenv) (env: env) v m (ctxt: PermitByRefExpr) = if cenv.reportErrors then - if isSpliceOperator cenv.g v && not env.quote then errorR(Error(FSComp.SR.chkSplicingOnlyInQuotations(), m)) - if isSpliceOperator cenv.g v then errorR(Error(FSComp.SR.chkNoFirstClassSplicing(), m)) + if cenv.g.isSpliceOperator v && not env.quote then errorR(Error(FSComp.SR.chkSplicingOnlyInQuotations(), m)) + if cenv.g.isSpliceOperator v then errorR(Error(FSComp.SR.chkNoFirstClassSplicing(), m)) if valRefEq cenv.g v cenv.g.addrof_vref then errorR(Error(FSComp.SR.chkNoFirstClassAddressOf(), m)) if valRefEq cenv.g v cenv.g.reraise_vref then errorR(Error(FSComp.SR.chkNoFirstClassRethrow(), m)) if valRefEq cenv.g v cenv.g.nameof_vref then errorR(Error(FSComp.SR.chkNoFirstClassNameOf(), m)) @@ -1191,7 +1223,7 @@ and CheckExpr (cenv: cenv) (env: env) origExpr (ctxt: PermitByRefExpr) : Limit = NoLimit // Allow '%expr' in quotations - | Expr.App (Expr.Val (vref, _, _), _, tinst, [arg], m) when isSpliceOperator g vref && env.quote -> + | Expr.App (Expr.Val (vref, _, _), _, tinst, [arg], m) when g.isSpliceOperator vref && env.quote -> CheckSpliceApplication cenv env (tinst, arg, m) // Check an application @@ -1307,14 +1339,14 @@ and CheckILBaseCall cenv env (ilMethRef, enclTypeInst, methInst, retTypes, tyarg match tryTcrefOfAppTy g baseVal.Type with | ValueSome tcref when tcref.IsILTycon -> try - // This is awkward - we have to explicitly re-resolve back to the IL metadata to determine if the method is abstract. - // We believe this may be fragile in some situations, since we are using the Abstract IL code to compare - // type equality, and it would be much better to remove any F# dependency on that implementation of IL type - // equality. It would be better to make this check in tc.fs when we have the Abstract IL metadata for the method to hand. - let mdef = resolveILMethodRef tcref.ILTyconRawMetadata ilMethRef + let mdef = + match tcref.ILTyconInfo with + | TILObjectReprData(scoref, _, _) -> + resolveILMethodRefWithRescope (rescopeILType scoref) tcref.ILTyconRawMetadata ilMethRef + if mdef.IsAbstract then errorR(Error(FSComp.SR.tcCannotCallAbstractBaseMember(mdef.Name), m)) - with _ -> () // defensive coding + with _ -> () | _ -> () CheckTypeInstNoByrefs cenv env m tyargs @@ -1461,9 +1493,31 @@ and CheckExprOp cenv env (op, tyargs, args, m) ctxt expr = CombineTwoLimits limit1 limit2 | TOp.ILCall (_, _, _, _, _, _, _, ilMethRef, enclTypeInst, methInst, retTypes), _, _ -> + CheckTypeInstNoByrefs cenv env m tyargs - CheckTypeInstNoByrefs cenv env m enclTypeInst - CheckTypeInstNoByrefs cenv env m methInst + + match enclTypeInst,methInst with + | [],[] -> () + | enclTypeInst,methInst -> + let tyconRef = ImportILTypeRef cenv.amap m ilMethRef.DeclaringTypeRef + match tyconRef.TypeReprInfo with + | TILObjectRepr(TILObjectReprData(scoref, _, tdef)) -> + (enclTypeInst,tdef.GenericParams) + ||> List.iter2 (fun typeInst typeGeneric -> + if not typeGeneric.HasAllowsRefStruct then + CheckTypeNoByrefs cenv env m typeInst) + + match methInst with + | [] -> () + | methInst -> + let methDef = resolveILMethodRefWithRescope (rescopeILType scoref) tdef ilMethRef + (methInst,methDef.GenericParams) + ||> List.iter2 (fun methInst methGeneric -> + if not methGeneric.HasAllowsRefStruct then + CheckTypeNoByrefs cenv env m methInst) + + | _ -> () + CheckTypeInstNoInnerByrefs cenv env m retTypes // permit byref returns let hasReceiver = @@ -1904,7 +1958,8 @@ and CheckAttribArgExpr cenv env expr = | Const.Single _ | Const.Char _ | Const.Zero - | Const.String _ -> () + | Const.String _ + | Const.Decimal _ -> () | _ -> if cenv.reportErrors then errorR (Error (FSComp.SR.tastNotAConstantExpression(), m)) @@ -1970,7 +2025,8 @@ and AdjustAccess isHidden (cpath: unit -> CompilationPath) access = let (TAccess l) = access // FSharp 1.0 bug 1908: Values hidden by signatures are implicitly at least 'internal' let scoref = cpath().ILScopeRef - TAccess(CompPath(scoref, []) :: l) + let sa = cpath().SyntaxAccess + TAccess(CompPath(scoref, sa, []) :: l) else access @@ -2076,7 +2132,7 @@ and CheckBinding cenv env alwaysCheckNoReraise ctxt (TBind(v, bindRhs, _) as bin if cenv.reportErrors && isReturnsResumableCodeTy g v.TauType then if not (g.langVersion.SupportsFeature LanguageFeature.ResumableStateMachines) then error(Error(FSComp.SR.tcResumableCodeNotSupported(), bind.Var.Range)) - if not v.MustInline then + if not v.ShouldInline then warning(Error(FSComp.SR.tcResumableCodeFunctionMustBeInline(), v.Range)) if isReturnsResumableCodeTy g v.TauType then @@ -2084,7 +2140,7 @@ and CheckBinding cenv env alwaysCheckNoReraise ctxt (TBind(v, bindRhs, _) as bin else env - CheckLambdas isTop (Some v) cenv env v.MustInline valReprInfo alwaysCheckNoReraise bindRhs v.Range v.Type ctxt + CheckLambdas isTop (Some v) cenv env v.ShouldInline valReprInfo alwaysCheckNoReraise bindRhs v.Range v.Type ctxt and CheckBindings cenv env binds = for bind in binds do @@ -2143,10 +2199,6 @@ let CheckModuleBinding cenv env (TBind(v, e, _) as bind) = error(Duplicate(kind, v.DisplayName, v.Range)) -#if CASES_IN_NESTED_CLASS - if tcref.IsUnionTycon && nm = "Cases" then - errorR(NameClash(nm, kind, v.DisplayName, v.Range, "generated type", "Cases", tcref.Range)) -#endif if tcref.IsUnionTycon then match nm with | "Tag" -> errorR(NameClash(nm, kind, v.DisplayName, v.Range, FSComp.SR.typeInfoGeneratedProperty(), "Tag", tcref.Range)) @@ -2283,7 +2335,7 @@ let CheckEntityDefn cenv env (tycon: Entity) = else MethInfosEquivByNameAndPartialSig eraseFlag true g cenv.amap m minfo minfo2 (* partial ignores return type *) let immediateMeths = - [ for v in tycon.AllGeneratedValues do yield FSMeth (g, ty, v, None) + [ for v in tycon.AllGeneratedInterfaceImplsAndOverrides do yield FSMeth (g, ty, v, None) yield! GetImmediateIntrinsicMethInfosOfType (None, AccessibleFromSomewhere) g cenv.amap m ty ] let immediateProps = GetImmediateIntrinsicPropInfosOfType (None, AccessibleFromSomewhere) g cenv.amap m ty @@ -2351,25 +2403,25 @@ let CheckEntityDefn cenv env (tycon: Entity) = ignore isInArg match (optArgInfo, callerInfo) with | _, NoCallerInfo -> () - | NotOptional, _ -> errorR(Error(FSComp.SR.tcCallerInfoNotOptional(callerInfo.ToString()), m)) + | NotOptional, _ -> errorR(Error(FSComp.SR.tcCallerInfoNotOptional(callerInfo |> string), m)) | CallerSide _, CallerLineNumber -> if not (typeEquiv g g.int32_ty ty) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv ty), m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, "int", NicePrint.minimalStringOfType cenv.denv ty), m)) | CalleeSide, CallerLineNumber -> if not ((isOptionTy g ty) && (typeEquiv g g.int32_ty (destOptionTy g ty))) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, "int", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m)) | CallerSide _, CallerFilePath -> if not (typeEquiv g g.string_ty ty) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty), m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, "string", NicePrint.minimalStringOfType cenv.denv ty), m)) | CalleeSide, CallerFilePath -> if not ((isOptionTy g ty) && (typeEquiv g g.string_ty (destOptionTy g ty))) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m)) | CallerSide _, CallerMemberName -> if not (typeEquiv g g.string_ty ty) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty), m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, "string", NicePrint.minimalStringOfType cenv.denv ty), m)) | CalleeSide, CallerMemberName -> if not ((isOptionTy g ty) && (typeEquiv g g.string_ty (destOptionTy g ty))) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m))) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m))) for pinfo in immediateProps do let nm = pinfo.PropertyName @@ -2535,13 +2587,30 @@ let CheckEntityDefn cenv env (tycon: Entity) = // Check fields. We check these late because we have to have first checked that the structs are // free of cycles - if tycon.IsStructOrEnumTycon then + if g.langFeatureNullness && g.checkNullness then + for f in tycon.AllInstanceFieldsAsList do + let m = f.Range + // Check if it's marked unsafe + let zeroInitUnsafe = TryFindFSharpBoolAttribute g g.attrib_DefaultValueAttribute f.FieldAttribs + if zeroInitUnsafe = Some true then + let ty = f.FormalType + // If the condition is detected because of a variation in logic introduced because + // of nullness checking, then only a warning is emitted. + if not (TypeHasDefaultValueNew g m ty) then + if not (TypeHasDefaultValue g m ty) then + errorR(Error(FSComp.SR.chkValueWithDefaultValueMustHaveDefaultValue(), m)) + else + warning(Error(FSComp.SR.chkValueWithDefaultValueMustHaveDefaultValue(), m)) + + // These are the old rules (not g.langFeatureNullness or not g.checkNullness), mistakenly only applied to structs + elif tycon.IsStructOrEnumTycon then for f in tycon.AllInstanceFieldsAsList do + let m = f.Range // Check if it's marked unsafe let zeroInitUnsafe = TryFindFSharpBoolAttribute g g.attrib_DefaultValueAttribute f.FieldAttribs if zeroInitUnsafe = Some true then - if not (TypeHasDefaultValue g m ty) then - errorR(Error(FSComp.SR.chkValueWithDefaultValueMustHaveDefaultValue(), m)) + if not (TypeHasDefaultValue g m f.FormalType) then + errorR(Error(FSComp.SR.chkValueWithDefaultValueMustHaveDefaultValue(), m)) // Check type abbreviations match tycon.TypeAbbrev with diff --git a/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fs b/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fs index b7dd2b1c7f..ba5e118eac 100644 --- a/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fs +++ b/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fs @@ -171,33 +171,37 @@ exception IgnoringPartOfQuotedTermWarning of string * range let wfail e = raise (InvalidQuotedTerm e) +[] let (|ModuleValueOrMemberUse|_|) g expr = let rec loop expr args = match stripExpr expr with | Expr.App (InnerExprPat(Expr.Val (vref, vFlags, _) as f), fty, tyargs, actualArgs, _m) when vref.IsMemberOrModuleBinding -> - Some(vref, vFlags, f, fty, tyargs, actualArgs @ args) + ValueSome(vref, vFlags, f, fty, tyargs, actualArgs @ args) | Expr.App (f, _fTy, [], actualArgs, _) -> loop f (actualArgs @ args) | Expr.Val (vref, vFlags, _m) as f when (match vref.TryDeclaringEntity with ParentNone -> false | _ -> true) -> let fty = tyOfExpr g f - Some(vref, vFlags, f, fty, [], args) + ValueSome(vref, vFlags, f, fty, [], args) | _ -> - None + ValueNone loop expr [] +[] let (|SimpleArrayLoopUpperBound|_|) expr = match expr with - | Expr.Op (TOp.ILAsm ([AI_sub], _), _, [Expr.Op (TOp.ILAsm ([I_ldlen; AI_conv ILBasicType.DT_I4], _), _, _, _); Expr.Const (Const.Int32 1, _, _) ], _) -> Some () - | _ -> None + | Expr.Op (TOp.ILAsm ([AI_sub], _), _, [Expr.Op (TOp.ILAsm ([I_ldlen; AI_conv ILBasicType.DT_I4], _), _, _, _); Expr.Const (Const.Int32 1, _, _) ], _) -> ValueSome () + | _ -> ValueNone +[] let (|SimpleArrayLoopBody|_|) g expr = match expr with | Expr.Lambda (_, a, b, ([_] as args), DebugPoints (Expr.Let (TBind(forVarLoop, DebugPoints (Expr.Op (TOp.ILAsm ([I_ldelem_any(ILArrayShape [(Some 0, None)], _)], _), [elemTy], [arr; idx], m1), _), seqPoint), body, m2, freeVars), _), m, ty) -> let body = Expr.Let (TBind(forVarLoop, mkCallArrayGet g m1 elemTy arr idx, seqPoint), body, m2, freeVars) let expr = Expr.Lambda (newUnique(), a, b, args, body, m, ty) - Some (arr, elemTy, expr) - | _ -> None + ValueSome (arr, elemTy, expr) + | _ -> ValueNone +[] let (|ObjectInitializationCheck|_|) g expr = // recognize "if this.init@ < 1 then failinit" match expr with @@ -211,10 +215,8 @@ let (|ObjectInitializationCheck|_|) g expr = name.StartsWithOrdinal("init") && selfRef.IsMemberThisVal && valRefEq g failInitRef (ValRefForIntrinsic g.fail_init_info) && - isUnitTy g resultTy -> Some() - | _ -> None - -let isSplice g vref = valRefEq g vref g.splice_expr_vref || valRefEq g vref g.splice_raw_expr_vref + isUnitTy g resultTy -> ValueSome() + | _ -> ValueNone let rec EmitDebugInfoIfNecessary cenv env m astExpr : ExprData = // do not emit debug info if emitDebugInfoInQuotations = false or it was already written for the given expression @@ -298,7 +300,7 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. match expr with // Detect expression tree exprSplices | Expr.App (InnerExprPat(Expr.Val (vref, _, _)), _, _, x0 :: rest, m) - when isSplice g vref -> + when g.isSpliceOperator vref -> let idx = cenv.exprSplices.Count let ty = tyOfExpr g expr @@ -311,7 +313,7 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. (hole, rest) ||> List.fold (fun fR arg -> QP.mkApp (fR, ConvExpr cenv env arg)) | ModuleValueOrMemberUse g (vref, vFlags, _f, _fTy, tyargs, curriedArgs) - when not (isSplice g vref) -> + when not (g.isSpliceOperator vref) -> let m = expr.Range let numEnclTypeArgs, _, isNewObj, valUseFlags, isSelfInit, takesInstanceArg, isPropGet, isPropSet = @@ -584,7 +586,7 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. | TOp.ExnConstr tcref, _, args -> let _rgtypR = ConvTyconRef cenv tcref m - let _typ = mkAppTy tcref [] + let _typ = mkWoNullAppTy tcref [] let parentTyconR = ConvTyconRef cenv tcref m let argTys = tcref |> recdFieldsOfExnDefRef |> List.map (fun rfld -> rfld.FormalType) let methArgTypesR = ConvTypes cenv env m argTys @@ -1223,7 +1225,7 @@ and ConvILType cenv env m ty = and TryElimErasableTyconRef cenv m (tcref: TyconRef) = match tcref.TypeReprInfo with // Get the base type - | TProvidedTypeRepr info when info.IsErased -> Some (info.BaseTypeForErased (m, cenv.g.obj_ty)) + | TProvidedTypeRepr info when info.IsErased -> Some (info.BaseTypeForErased (m, cenv.g.obj_ty_withNulls)) | _ -> None #endif diff --git a/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fsi b/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fsi index 288a8e1e73..1958dde4dc 100644 --- a/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fsi +++ b/src/fcs-fable/src/Compiler/Checking/QuotationTranslator.fsi @@ -41,10 +41,15 @@ val ConvExprPublic: QuotationGenerationScope -> suppressWitnesses: bool -> Expr val ConvReflectedDefinition: QuotationGenerationScope -> string -> Val -> Expr -> QuotationPickler.MethodBaseData * QuotationPickler.ExprData +[] val (|ModuleValueOrMemberUse|_|): - TcGlobals -> Expr -> (ValRef * ValUseFlag * Expr * TType * TypeInst * Expr list) option + TcGlobals -> Expr -> (ValRef * ValUseFlag * Expr * TType * TypeInst * Expr list) voption -val (|SimpleArrayLoopUpperBound|_|): Expr -> unit option -val (|SimpleArrayLoopBody|_|): TcGlobals -> Expr -> (Expr * TType * Expr) option -val (|ObjectInitializationCheck|_|): TcGlobals -> Expr -> unit option -val isSplice: TcGlobals -> ValRef -> bool +[] +val (|SimpleArrayLoopUpperBound|_|): Expr -> unit voption + +[] +val (|SimpleArrayLoopBody|_|): TcGlobals -> Expr -> (Expr * TType * Expr) voption + +[] +val (|ObjectInitializationCheck|_|): TcGlobals -> Expr -> unit voption diff --git a/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fs b/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fs index f24a93c5fc..8e8dc84eb2 100644 --- a/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fs +++ b/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fs @@ -39,6 +39,14 @@ exception InterfaceNotRevealed of DisplayEnv * TType * range exception ArgumentsInSigAndImplMismatch of sigArg: Ident * implArg: Ident +exception DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer of + denv: DisplayEnv * + implTycon:Tycon * + sigTycon:Tycon * + implTypeAbbrev:TType * + sigTypeAbbrev:TType * + range: range + // Use a type to capture the constant, common parameters type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = @@ -231,7 +239,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = else let aNull2 = TypeNullIsExtraValue g m (generalizedTyconRef g (mkLocalTyconRef implTycon)) - let fNull2 = TypeNullIsExtraValue g m (generalizedTyconRef g (mkLocalTyconRef implTycon)) + let fNull2 = TypeNullIsExtraValue g m (generalizedTyconRef g (mkLocalTyconRef implTycon)) // TODO: should be sigTycon, raises extra errors if aNull2 && not fNull2 then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false @@ -338,7 +346,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = elif (implVal.CompiledName g.CompilerGlobalState) <> (sigVal.CompiledName g.CompilerGlobalState) then (err denv FSComp.SR.ValueNotContainedMutabilityCompiledNamesDiffer) elif implVal.DisplayName <> sigVal.DisplayName then (err denv FSComp.SR.ValueNotContainedMutabilityDisplayNamesDiffer) elif isLessAccessible implVal.Accessibility sigVal.Accessibility then (err denv FSComp.SR.ValueNotContainedMutabilityAccessibilityMore) - elif implVal.MustInline <> sigVal.MustInline then (err denv FSComp.SR.ValueNotContainedMutabilityInlineFlagsDiffer) + elif implVal.ShouldInline <> sigVal.ShouldInline then (err denv FSComp.SR.ValueNotContainedMutabilityInlineFlagsDiffer) elif implVal.LiteralValue <> sigVal.LiteralValue then (err denv FSComp.SR.ValueNotContainedMutabilityLiteralConstantValuesDiffer) elif implVal.IsTypeFunction <> sigVal.IsTypeFunction then (err denv FSComp.SR.ValueNotContainedMutabilityOneIsTypeFunction) else @@ -589,8 +597,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = match implTycon.TypeAbbrev, sigTycon.TypeAbbrev with | Some ty1, Some ty2 -> if not (typeAEquiv g aenv ty1 ty2) then - let s1, s2, _ = NicePrint.minimalStringsOfTwoTypes denv ty1 ty2 - errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, s1, s2), m)) + errorR (DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(denv, implTycon, sigTycon, ty1, ty2, m)) false else true diff --git a/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fsi b/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fsi index c0939f92b3..1b13796894 100644 --- a/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fsi +++ b/src/fcs-fable/src/Compiler/Checking/SignatureConformance.fsi @@ -40,6 +40,14 @@ exception InterfaceNotRevealed of DisplayEnv * TType * range exception ArgumentsInSigAndImplMismatch of sigArg: Ident * implArg: Ident +exception DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer of + denv: DisplayEnv * + implTycon: Tycon * + sigTycon: Tycon * + implTypeAbbrev: TType * + sigTypeAbbrev: TType * + range: range + type Checker = new: diff --git a/src/fcs-fable/src/Compiler/Checking/SignatureHash.fs b/src/fcs-fable/src/Compiler/Checking/SignatureHash.fs index 77a9ede414..a9bf8fce50 100644 --- a/src/fcs-fable/src/Compiler/Checking/SignatureHash.fs +++ b/src/fcs-fable/src/Compiler/Checking/SignatureHash.fs @@ -1,338 +1,20 @@ module internal Fsharp.Compiler.SignatureHash -open Internal.Utilities.Library -open Internal.Utilities.Rational open FSharp.Compiler.AbstractIL.IL -open FSharp.Compiler.Syntax open FSharp.Compiler.TcGlobals -open FSharp.Compiler.Text open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.CheckDeclarations -type ObserverVisibility = - | PublicOnly - | PublicAndInternal - -[] -module internal HashingPrimitives = - - type Hash = int - - let inline hashText (s: string) : Hash = hash s - let inline private combineHash acc y : Hash = (acc <<< 1) + y + 631 - let inline pipeToHash (value: Hash) (acc: Hash) = combineHash acc value - let inline addFullStructuralHash (value) (acc: Hash) = combineHash (acc) (hash value) - - let inline hashListOrderMatters ([] func) (items: #seq<'T>) : Hash = - let mutable acc = 0 - - for i in items do - let valHash = func i - // We are calling hashListOrderMatters for things like list of types, list of properties, list of fields etc. The ones which are visibility-hidden will return 0, and are ommited. - if valHash <> 0 then - acc <- combineHash acc valHash - - acc - - let inline hashListOrderIndependent ([] func) (items: #seq<'T>) : Hash = - let mutable acc = 0 - - for i in items do - let valHash = func i - acc <- acc ^^^ valHash - - acc - - let (@@) (h1: Hash) (h2: Hash) = combineHash h1 h2 - -[] -module internal HashUtilities = - - let private hashEntityRefName (xref: EntityRef) name = - let tag = - if xref.IsNamespace then - TextTag.Namespace - elif xref.IsModule then - TextTag.Module - elif xref.IsTypeAbbrev then - TextTag.Alias - elif xref.IsFSharpDelegateTycon then - TextTag.Delegate - elif xref.IsILEnumTycon || xref.IsFSharpEnumTycon then - TextTag.Enum - elif xref.IsStructOrEnumTycon then - TextTag.Struct - elif isInterfaceTyconRef xref then - TextTag.Interface - elif xref.IsUnionTycon then - TextTag.Union - elif xref.IsRecordTycon then - TextTag.Record - else - TextTag.Class - - (hash tag) @@ (hashText name) - - let hashTyconRefImpl (tcref: TyconRef) = - let demangled = tcref.DisplayNameWithStaticParameters - let tyconHash = hashEntityRefName tcref demangled - - tcref.CompilationPath.AccessPath - |> hashListOrderMatters (fst >> hashText) - |> pipeToHash tyconHash - -module HashIL = - - let hashILTypeRef (tref: ILTypeRef) = - tref.Enclosing - |> hashListOrderMatters hashText - |> addFullStructuralHash tref.Name - - let private hashILArrayShape (sh: ILArrayShape) = sh.Rank - - let rec hashILType (ty: ILType) : Hash = - match ty with - | ILType.Void -> hash ILType.Void - | ILType.Array(sh, t) -> hashILType t @@ hashILArrayShape sh - | ILType.Value t - | ILType.Boxed t -> hashILTypeRef t.TypeRef @@ (t.GenericArgs |> hashListOrderMatters (hashILType)) - | ILType.Ptr t - | ILType.Byref t -> hashILType t - | ILType.FunctionPointer t -> hashILCallingSignature t - | ILType.TypeVar n -> hash n - | ILType.Modified(_, _, t) -> hashILType t - - and hashILCallingSignature (signature: ILCallingSignature) = - let res = signature.ReturnType |> hashILType - signature.ArgTypes |> hashListOrderMatters (hashILType) |> pipeToHash res - -module HashAccessibility = - - let isHiddenToObserver (TAccess access) (observer: ObserverVisibility) = - let isInternalCompPath x = - match x with - | CompPath(ILScopeRef.Local, []) -> true - | _ -> false - - match access with - | [] -> false - | _ when List.forall isInternalCompPath access -> - match observer with - // The 'access' means internal, but our observer can see it (e.g. because of IVT attribute) - | PublicAndInternal -> false - | PublicOnly -> true - | _ -> true - -module rec HashTypes = - - /// Hash a reference to a type - let hashTyconRef tcref = hashTyconRefImpl tcref - - /// Hash the flags of a member - let hashMemberFlags (memFlags: SynMemberFlags) = hash memFlags - - /// Hash an attribute 'Type(arg1, ..., argN)' - let private hashAttrib (Attrib(tyconRef = tcref)) = hashTyconRefImpl tcref - - let hashAttributeList attrs = - attrs |> hashListOrderIndependent hashAttrib - - let private hashTyparRef (typar: Typar) = - hashText typar.DisplayName - |> addFullStructuralHash (typar.Rigidity) - |> addFullStructuralHash (typar.StaticReq) - - let private hashTyparRefWithInfo (typar: Typar) = - hashTyparRef typar @@ hashAttributeList typar.Attribs - - let private hashConstraint (g: TcGlobals) struct (tp, tpc) = - let tpHash = hashTyparRefWithInfo tp - - match tpc with - | TyparConstraint.CoercesTo(tgtTy, _) -> tpHash @@ 1 @@ hashTType g tgtTy - | TyparConstraint.MayResolveMember(traitInfo, _) -> tpHash @@ 2 @@ hashTraitWithInfo (* denv *) g traitInfo - | TyparConstraint.DefaultsTo(_, ty, _) -> tpHash @@ 3 @@ hashTType g ty - | TyparConstraint.IsEnum(ty, _) -> tpHash @@ 4 @@ hashTType g ty - | TyparConstraint.SupportsComparison _ -> tpHash @@ 5 - | TyparConstraint.SupportsEquality _ -> tpHash @@ 6 - | TyparConstraint.IsDelegate(aty, bty, _) -> tpHash @@ 7 @@ hashTType g aty @@ hashTType g bty - | TyparConstraint.SupportsNull _ -> tpHash @@ 8 - | TyparConstraint.IsNonNullableStruct _ -> tpHash @@ 9 - | TyparConstraint.IsUnmanaged _ -> tpHash @@ 10 - | TyparConstraint.IsReferenceType _ -> tpHash @@ 11 - | TyparConstraint.SimpleChoice(tys, _) -> tpHash @@ 12 @@ (tys |> hashListOrderIndependent (hashTType g)) - | TyparConstraint.RequiresDefaultConstructor _ -> tpHash @@ 13 - - /// Hash type parameter constraints - let private hashConstraints (g: TcGlobals) cxs = - cxs |> hashListOrderIndependent (hashConstraint g) - - let private hashTraitWithInfo (g: TcGlobals) traitInfo = - let nameHash = hashText traitInfo.MemberLogicalName - let memberHash = hashMemberFlags traitInfo.MemberFlags - - let returnTypeHash = - match traitInfo.CompiledReturnType with - | Some t -> hashTType g t - | _ -> -1 - - traitInfo.CompiledObjectAndArgumentTypes - |> hashListOrderIndependent (hashTType g) - |> pipeToHash (nameHash) - |> pipeToHash (returnTypeHash) - |> pipeToHash memberHash - - /// Hash a unit of measure expression - let private hashMeasure unt = - let measuresWithExponents = - ListMeasureVarOccsWithNonZeroExponents unt - |> List.sortBy (fun (tp: Typar, _) -> tp.DisplayName) - - measuresWithExponents - |> hashListOrderIndependent (fun (typar, exp: Rational) -> hashTyparRef typar @@ hash exp) - - /// Hash a type, taking precedence into account to insert brackets where needed - let hashTType (g: TcGlobals) ty = - - match stripTyparEqns ty |> (stripTyEqns g) with - | TType_ucase(UnionCaseRef(tc, _), args) - | TType_app(tc, args, _) -> args |> hashListOrderMatters (hashTType g) |> pipeToHash (hashTyconRef tc) - | TType_anon(anonInfo, tys) -> - tys - |> hashListOrderMatters (hashTType g) - |> pipeToHash (anonInfo.SortedNames |> hashListOrderMatters hashText) - |> addFullStructuralHash (evalAnonInfoIsStruct anonInfo) - | TType_tuple(tupInfo, t) -> - t - |> hashListOrderMatters (hashTType g) - |> addFullStructuralHash (evalTupInfoIsStruct tupInfo) - // Hash a first-class generic type. - | TType_forall(tps, tau) -> tps |> hashListOrderMatters (hashTyparRef) |> pipeToHash (hashTType g tau) - | TType_fun _ -> - let argTys, retTy = stripFunTy g ty - argTys |> hashListOrderMatters (hashTType g) |> pipeToHash (hashTType g retTy) - | TType_var(r, _) -> hashTyparRefWithInfo r - | TType_measure unt -> hashMeasure unt - - // Hash a single argument, including its name and type - let private hashArgInfo (g: TcGlobals) (ty, argInfo: ArgReprInfo) = - - let attributesHash = hashAttributeList argInfo.Attribs - - let nameHash = - match argInfo.Name with - | Some i -> hashText i.idText - | _ -> -1 - - let typeHash = hashTType g ty - - typeHash @@ nameHash @@ attributesHash - - let private hashCurriedArgInfos (g: TcGlobals) argInfos = - argInfos - |> hashListOrderMatters (fun l -> l |> hashListOrderMatters (hashArgInfo g)) - - /// Hash a single type used as the type of a member or value - let hashTopType (g: TcGlobals) argInfos retTy cxs = - let retTypeHash = hashTType g retTy - let cxsHash = hashConstraints g cxs - let argHash = hashCurriedArgInfos g argInfos - - retTypeHash @@ cxsHash @@ argHash - - let private hashTyparInclConstraints (g: TcGlobals) (typar: Typar) = - typar.Constraints - |> hashListOrderIndependent (fun tpc -> hashConstraint g (typar, tpc)) - |> pipeToHash (hashTyparRef typar) - - /// Hash type parameters - let hashTyparDecls (g: TcGlobals) (typars: Typars) = - typars |> hashListOrderMatters (hashTyparInclConstraints g) - - let private hashUncurriedSig (g: TcGlobals) typarInst argInfos retTy = - typarInst - |> hashListOrderMatters (fun (typar, ttype) -> hashTyparInclConstraints g typar @@ hashTType g ttype) - |> pipeToHash (hashTopType g argInfos retTy []) - - let private hashMemberSigCore (g: TcGlobals) memberToParentInst (typarInst, methTypars: Typars, argInfos, retTy) = - typarInst - |> hashListOrderMatters (fun (typar, ttype) -> hashTyparInclConstraints g typar @@ hashTType g ttype) - |> pipeToHash (hashTopType g argInfos retTy []) - |> pipeToHash ( - memberToParentInst - |> hashListOrderMatters (fun (typar, ty) -> hashTyparRef typar @@ hashTType g ty) - ) - |> pipeToHash (hashTyparDecls g methTypars) - - let hashMemberType (g: TcGlobals) vref typarInst argInfos retTy = - match PartitionValRefTypars g vref with - | Some(_, _, memberMethodTypars, memberToParentInst, _) -> - hashMemberSigCore g memberToParentInst (typarInst, memberMethodTypars, argInfos, retTy) - | None -> hashUncurriedSig g typarInst argInfos retTy - -module HashTastMemberOrVals = - open HashTypes - - let private hashMember (g: TcGlobals, observer) typarInst (v: Val) = - let vref = mkLocalValRef v - - if HashAccessibility.isHiddenToObserver vref.Accessibility observer then - 0 - else - let membInfo = Option.get vref.MemberInfo - let _tps, argInfos, retTy, _ = GetTypeOfMemberInFSharpForm g vref - - let memberFlagsHash = hashMemberFlags membInfo.MemberFlags - let parentTypeHash = hashTyconRef membInfo.ApparentEnclosingEntity - let memberTypeHash = hashMemberType g vref typarInst argInfos retTy - let flagsHash = hash v.val_flags.PickledBits - let nameHash = hashText v.DisplayNameCoreMangled - let attribsHash = hashAttributeList v.Attribs - - let combinedHash = - memberFlagsHash - @@ parentTypeHash - @@ memberTypeHash - @@ flagsHash - @@ nameHash - @@ attribsHash - - combinedHash - - let private hashNonMemberVal (g: TcGlobals, observer) (tps, v: Val, tau, cxs) = - if HashAccessibility.isHiddenToObserver v.Accessibility observer then - 0 - else - let valReprInfo = arityOfValForDisplay v - let nameHash = hashText v.DisplayNameCoreMangled - let typarHash = hashTyparDecls g tps - let argInfos, retTy = GetTopTauTypeInFSharpForm g valReprInfo.ArgInfos tau v.Range - let typeHash = hashTopType g argInfos retTy cxs - let flagsHash = hash v.val_flags.PickledBits - let attribsHash = hashAttributeList v.Attribs - - let combinedHash = nameHash @@ typarHash @@ typeHash @@ flagsHash @@ attribsHash - combinedHash - - let hashValOrMemberNoInst (g, obs) (vref: ValRef) = - match vref.MemberInfo with - | None -> - let tps, tau = vref.GeneralizedType - - let cxs = - tps - |> Seq.collect (fun tp -> tp.Constraints |> Seq.map (fun cx -> struct (tp, cx))) - - hashNonMemberVal (g, obs) (tps, vref.Deref, tau, cxs) - | Some _ -> hashMember (g, obs) emptyTyparInst vref.Deref +open Internal.Utilities.Library +open Internal.Utilities.TypeHashing +open Internal.Utilities.TypeHashing.HashTypes //------------------------------------------------------------------------- /// Printing TAST objects module TyconDefinitionHash = - open HashTypes let private hashRecdField (g: TcGlobals, observer) (fld: RecdField) = if HashAccessibility.isHiddenToObserver fld.Accessibility observer then @@ -476,7 +158,7 @@ let calculateHashOfImpliedSignature g observer (expr: ModuleOrNamespaceContents) let rec hashModuleOrNameSpaceBinding (monb: ModuleOrNamespaceBinding) = match monb with - | ModuleOrNamespaceBinding.Binding b when b.Var.LogicalName.StartsWith("doval@") -> 0 + | ModuleOrNamespaceBinding.Binding b when b.Var.LogicalName.StartsWithOrdinal("doval@") -> 0 | ModuleOrNamespaceBinding.Binding b -> HashTastMemberOrVals.hashValOrMemberNoInst (g, observer) (mkLocalValRef b.Var) | ModuleOrNamespaceBinding.Module(moduleInfo, contents) -> hashSingleModuleOrNameSpaceIncludingName (moduleInfo, contents) diff --git a/src/fcs-fable/src/Compiler/Checking/SignatureHash.fsi b/src/fcs-fable/src/Compiler/Checking/SignatureHash.fsi index 90d25e8eab..51f3fe1769 100644 --- a/src/fcs-fable/src/Compiler/Checking/SignatureHash.fsi +++ b/src/fcs-fable/src/Compiler/Checking/SignatureHash.fsi @@ -5,9 +5,7 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypedTree open FSharp.Compiler.CheckDeclarations -type ObserverVisibility = - | PublicOnly - | PublicAndInternal +open Internal.Utilities.TypeHashing val calculateHashOfImpliedSignature: g: TcGlobals -> observer: ObserverVisibility -> expr: ModuleOrNamespaceContents -> int diff --git a/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fs b/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fs index 1faa9a50a3..a7ea9ad802 100644 --- a/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fs +++ b/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fs @@ -18,11 +18,12 @@ open FSharp.Compiler.TypeRelations let PostInferenceChecksStackGuardDepth = GetEnvInteger "FSHARP_TailCallChecks" 50 +[] let (|ValUseAtApp|_|) e = match e with | InnerExprPat(Expr.App(funcExpr = InnerExprPat(Expr.Val(valRef = vref; flags = valUseFlags))) | Expr.Val( - valRef = vref; flags = valUseFlags)) -> Some(vref, valUseFlags) - | _ -> None + valRef = vref; flags = valUseFlags)) -> ValueSome(vref, valUseFlags) + | _ -> ValueNone type TailCallReturnType = | MustReturnVoid // indicates "has unit return type and must return void" @@ -46,8 +47,16 @@ type TailCall = static member YesFromVal (g: TcGlobals) (v: Val) = TailCall.Yes(TailCall.IsVoidRet g v) static member YesFromExpr (g: TcGlobals) (expr: Expr) = + let yesFromTType (t: TType) = + if isUnitTy g t then + TailCall.Yes TailCallReturnType.MustReturnVoid + else + TailCall.Yes TailCallReturnType.NonVoid + match expr with | ValUseAtApp(valRef, _) -> TailCall.Yes(TailCall.IsVoidRet g valRef.Deref) + | Expr.Const(constType = constType) -> yesFromTType constType + | Expr.Match(exprType = exprType) -> yesFromTType exprType | _ -> TailCall.Yes TailCallReturnType.NonVoid member x.AtExprLambda = @@ -67,8 +76,6 @@ type cenv = amap: Import.ImportMap - reportErrors: bool - /// Values in module that have been marked [] mustTailCall: Zset } @@ -139,12 +146,8 @@ let rec mkArgsForAppliedExpr isBaseCall argsl x = | Expr.Op(TOp.Coerce, _, [ f ], _) -> mkArgsForAppliedExpr isBaseCall argsl f | _ -> [] -/// Check an expression, where the expression is in a position where byrefs can be generated -let rec CheckExprNoByrefs cenv (tailCall: TailCall) expr = - CheckExpr cenv expr PermitByRefExpr.No tailCall - /// Check an expression, warn if it's attributed with TailCall but our analysis concludes it's not a valid tail call -and CheckForNonTailRecCall (cenv: cenv) expr (tailCall: TailCall) = +let CheckForNonTailRecCall (cenv: cenv) expr (tailCall: TailCall) = let g = cenv.g let expr = stripExpr expr let expr = stripDebugPoints expr @@ -152,68 +155,70 @@ and CheckForNonTailRecCall (cenv: cenv) expr (tailCall: TailCall) = match expr with | Expr.App(f, _fty, _tyargs, argsl, m) -> - if cenv.reportErrors then - if cenv.g.langVersion.SupportsFeature LanguageFeature.WarningWhenTailRecAttributeButNonTailRecUsage then - match f with - | ValUseAtApp(vref, valUseFlags) when cenv.mustTailCall.Contains vref.Deref -> - - let canTailCall = - match tailCall with - | TailCall.No -> // an upper level has already decided that this is not in a tailcall position - false - | TailCall.Yes returnType -> - if vref.IsMemberOrModuleBinding && vref.ValReprInfo.IsSome then - let topValInfo = vref.ValReprInfo.Value - - let nowArgs, laterArgs = - let _, curriedArgInfos, _, _ = - GetValReprTypeInFSharpForm cenv.g topValInfo vref.Type m - - if argsl.Length >= curriedArgInfos.Length then - (List.splitAfter curriedArgInfos.Length argsl) - else - ([], argsl) - - let numEnclosingTypars = CountEnclosingTyparsOfActualParentOfVal vref.Deref - - let _, _, _, returnTy, _ = - GetValReprTypeInCompiledForm g topValInfo numEnclosingTypars vref.Type m - - let _, _, isNewObj, isSuperInit, isSelfInit, _, _, _ = - GetMemberCallInfo cenv.g (vref, valUseFlags) - - let isCCall = - match valUseFlags with - | PossibleConstrainedCall _ -> true - | _ -> false - - let hasByrefArg = nowArgs |> List.exists (tyOfExpr cenv.g >> isByrefTy cenv.g) - - let mustGenerateUnitAfterCall = - (Option.isNone returnTy && returnType <> TailCallReturnType.MustReturnVoid) - - let noTailCallBlockers = - not isNewObj - && not isSuperInit - && not isSelfInit - && not mustGenerateUnitAfterCall - && isNil laterArgs - && not (IsValRefIsDllImport cenv.g vref) - && not isCCall - && not hasByrefArg - - noTailCallBlockers // blockers that will prevent the IL level from emmiting a tail instruction + match f with + | ValUseAtApp(vref, valUseFlags) when cenv.mustTailCall.Contains vref.Deref -> + + let canTailCall = + match tailCall with + | TailCall.No -> // an upper level has already decided that this is not in a tailcall position + false + | TailCall.Yes returnType -> + if vref.IsMemberOrModuleBinding && vref.ValReprInfo.IsSome then + let topValInfo = vref.ValReprInfo.Value + + let nowArgs, laterArgs = + let _, curriedArgInfos, _, _ = + GetValReprTypeInFSharpForm cenv.g topValInfo vref.Type m + + if argsl.Length >= curriedArgInfos.Length then + (List.splitAfter curriedArgInfos.Length argsl) else - true + ([], argsl) - // warn if we call inside of recursive scope in non-tail-call manner/with tail blockers. See - // ``Warn successfully in match clause`` - // ``Warn for byref parameters`` - if not canTailCall then - warning (Error(FSComp.SR.chkNotTailRecursive vref.DisplayName, m)) - | _ -> () + let numEnclosingTypars = CountEnclosingTyparsOfActualParentOfVal vref.Deref + + let _, _, _, returnTy, _ = + GetValReprTypeInCompiledForm g topValInfo numEnclosingTypars vref.Type m + + let _, _, isNewObj, isSuperInit, isSelfInit, _, _, _ = + GetMemberCallInfo cenv.g (vref, valUseFlags) + + let isCCall = + match valUseFlags with + | PossibleConstrainedCall _ -> true + | _ -> false + + let hasByrefArg = nowArgs |> List.exists (tyOfExpr cenv.g >> isByrefTy cenv.g) + + let mustGenerateUnitAfterCall = + (Option.isNone returnTy && returnType <> TailCallReturnType.MustReturnVoid) + + let noTailCallBlockers = + not isNewObj + && not isSuperInit + && not isSelfInit + && not mustGenerateUnitAfterCall + && isNil laterArgs + && not (IsValRefIsDllImport cenv.g vref) + && not isCCall + && not hasByrefArg + + noTailCallBlockers // blockers that will prevent the IL level from emitting a tail instruction + else + true + + // warn if we call inside of recursive scope in non-tail-call manner/with tail blockers. See + // ``Warn successfully in match clause`` + // ``Warn for byref parameters`` + if not canTailCall then + warning (Error(FSComp.SR.chkNotTailRecursive vref.DisplayName, m)) + | _ -> () | _ -> () +/// Check an expression, where the expression is in a position where byrefs can be generated +let rec CheckExprNoByrefs cenv (tailCall: TailCall) expr = + CheckExpr cenv expr PermitByRefExpr.No tailCall + /// Check call arguments, including the return argument. and CheckCall cenv args ctxts (tailCall: TailCall) = // detect CPS-like expressions @@ -225,6 +230,13 @@ and CheckCall cenv args ctxts (tailCall: TailCall) = | Expr.App _ -> Some(TailCall.YesFromExpr cenv.g e) | IsAppInLambdaBody t -> Some t | _ -> None + | Expr.App(args = args) -> + args + |> List.tryPick (fun a -> + match a with + | IsAppInLambdaBody t -> Some t + | _ -> None) + | _ -> None // if we haven't already decided this is no tail call, try to detect CPS-like expressions @@ -542,12 +554,10 @@ and CheckExprOp cenv (op, tyargs, args, m) ctxt : unit = | TOp.ValFieldSet _rf, _, [ _arg1; _arg2 ] -> () | TOp.Coerce, [ tgtTy; srcTy ], [ x ] -> - let tailCall = TailCall.YesFromExpr cenv.g x - if TypeDefinitelySubsumesTypeNoCoercion 0 g cenv.amap m tgtTy srcTy then - CheckExpr cenv x ctxt tailCall + CheckExpr cenv x ctxt TailCall.No else - CheckExprNoByrefs cenv tailCall x + CheckExprNoByrefs cenv TailCall.No x | TOp.Reraise, [ _ty1 ], [] -> () @@ -720,7 +730,7 @@ and CheckBinding cenv alwaysCheckNoReraise ctxt (TBind(v, bindRhs, _) as bind) : | Some info -> info | _ -> ValReprInfo.emptyValData - CheckLambdas isTop (Some v) cenv v.MustInline valReprInfo tailCall alwaysCheckNoReraise bindRhs v.Range v.Type ctxt + CheckLambdas isTop (Some v) cenv v.ShouldInline valReprInfo tailCall alwaysCheckNoReraise bindRhs v.Range v.Type ctxt and CheckBindings cenv binds = for bind in binds do @@ -729,19 +739,8 @@ and CheckBindings cenv binds = let CheckModuleBinding cenv (isRec: bool) (TBind _ as bind) = // warn for non-rec functions which have the attribute - if - cenv.reportErrors - && cenv.g.langVersion.SupportsFeature LanguageFeature.WarningWhenTailCallAttrOnNonRec - then - let isNotAFunction = - match bind.Var.ValReprInfo with - | Some info -> info.HasNoArgs - | _ -> false - - if - (not isRec || isNotAFunction) - && HasFSharpAttribute cenv.g cenv.g.attrib_TailCallAttribute bind.Var.Attribs - then + if cenv.g.langVersion.SupportsFeature LanguageFeature.WarningWhenTailCallAttrOnNonRec then + if not isRec && cenv.g.HasTailCallAttrib bind.Var.Attribs then warning (Error(FSComp.SR.chkTailCallAttrOnNonRec (), bind.Var.Range)) // Check if a let binding to the result of a rec expression is not inside the rec expression @@ -765,7 +764,18 @@ let CheckModuleBinding cenv (isRec: bool) (TBind _ as bind) = | Expr.Lambda(bodyExpr = bodyExpr) -> checkTailCall insideSubBindingOrTry bodyExpr | Expr.DebugPoint(_debugPointAtLeafExpr, expr) -> checkTailCall insideSubBindingOrTry expr | Expr.Let(binding = binding; bodyExpr = bodyExpr) -> - checkTailCall true binding.Expr + // detect continuation shapes like MakeAsync + let isContinuation = + match bodyExpr with + | Expr.App(funcExpr = Expr.Val(valRef = valRef)) -> + match valRef.GeneralizedType with + | [ _ ], + TType_fun(domainType = TType_fun(domainType = TType_app _; rangeType = TType_app _); rangeType = TType_app _) -> + true + | _ -> false + | _ -> false + + checkTailCall (not isContinuation) binding.Expr let warnForBodyExpr = insideSubBindingOrTry @@ -782,6 +792,7 @@ let CheckModuleBinding cenv (isRec: bool) (TBind _ as bind) = // warn for recursive calls in TryWith/TryFinally operations exprs |> Seq.iter (checkTailCall true) | Expr.Op(args = exprs) -> exprs |> Seq.iter (checkTailCall insideSubBindingOrTry) + | Expr.Sequential(expr2 = expr2) -> checkTailCall insideSubBindingOrTry expr2 | _ -> () checkTailCall false bodyExpr @@ -807,7 +818,7 @@ and CheckDefnInModule cenv mdef = let mustTailCall = Seq.fold (fun mustTailCall (v: Val) -> - if HasFSharpAttribute cenv.g cenv.g.attrib_TailCallAttribute v.Attribs then + if cenv.g.HasTailCallAttrib v.Attribs then let newSet = Zset.add v mustTailCall newSet else @@ -844,14 +855,17 @@ and CheckModuleSpec cenv isRec mbind = | ModuleOrNamespaceBinding.Module(_mspec, rhs) -> CheckDefnInModule cenv rhs -let CheckImplFile (g, amap, reportErrors, implFileContents) = - let cenv = - { - g = g - reportErrors = reportErrors - stackGuard = StackGuard(PostInferenceChecksStackGuardDepth, "CheckImplFile") - amap = amap - mustTailCall = Zset.empty valOrder - } - - CheckDefnInModule cenv implFileContents +let CheckImplFile (g: TcGlobals, amap, reportErrors, implFileContents) = + if + reportErrors + && g.langVersion.SupportsFeature LanguageFeature.WarningWhenTailRecAttributeButNonTailRecUsage + then + let cenv = + { + g = g + stackGuard = StackGuard(PostInferenceChecksStackGuardDepth, "CheckImplFile") + amap = amap + mustTailCall = Zset.empty valOrder + } + + CheckDefnInModule cenv implFileContents diff --git a/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fsi b/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fsi index 2fa3b16375..0600900eb2 100644 --- a/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fsi +++ b/src/fcs-fable/src/Compiler/Checking/TailCallChecks.fsi @@ -6,7 +6,7 @@ open FSharp.Compiler.TypedTree /// Perform the TailCall analysis on the optimized TAST for a file. /// The TAST is traversed analogously to the PostInferenceChecks phase. -/// For functions that are annotated with the [] attribute, a warning is emmitted if they are called in a +/// For functions that are annotated with the [] attribute, a warning is emitted if they are called in a /// non-tailrecursive manner in the recursive scope of the function. /// The ModuleOrNamespaceContents aren't mutated in any way by performing this check. val CheckImplFile: diff --git a/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fs b/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fs index a778b516d9..9bf7c2ec89 100644 --- a/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fs +++ b/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fs @@ -9,6 +9,7 @@ open FSharp.Compiler open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Import +open FSharp.Compiler.Import.Nullness open FSharp.Compiler.Features open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps @@ -55,7 +56,10 @@ let GetSuperTypeOfType g amap m ty = let tinst = argsOfAppTy g ty match tdef.Extends with | None -> None - | Some ilTy -> Some (RescopeAndImportILType scoref amap m tinst ilTy) + | Some ilTy -> // 'inherit' can refer to a type which has nullable type arguments (e.g. List) + let typeAttrs = AttributesFromIL(tdef.MetadataIndex,tdef.CustomAttrsStored) + let nullness = {DirectAttributes = typeAttrs; Fallback = FromClass typeAttrs} + Some (RescopeAndImportILType scoref amap m tinst nullness ilTy) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> if isFSharpObjModelTy g ty || isFSharpExceptionTy g ty then @@ -63,8 +67,8 @@ let GetSuperTypeOfType g amap m ty = Some (instType (mkInstForAppTy g ty) (superOfTycon g tcref.Deref)) elif isArrayTy g ty then Some g.system_Array_ty - elif isRefTy g ty && not (isObjTy g ty) then - Some g.obj_ty + elif isRefTy g ty && not (isObjTyAnyNullness g ty) then + Some g.obj_ty_noNulls elif isStructTupleTy g ty then Some g.system_Value_ty elif isFSharpStructOrEnumTy g ty then @@ -75,13 +79,19 @@ let GetSuperTypeOfType g amap m ty = elif isStructAnonRecdTy g ty then Some g.system_Value_ty elif isAnonRecdTy g ty then - Some g.obj_ty + Some g.obj_ty_noNulls elif isRecdTy g ty || isUnionTy g ty then - Some g.obj_ty + Some g.obj_ty_noNulls else None - resBeforeNull + match resBeforeNull with + | Some superTy -> + let nullness = nullnessOfTy g ty + let superTyWithNull = addNullnessToTy nullness superTy + Some superTyWithNull + | None -> + None /// Make a type for System.Collections.Generic.IList let mkSystemCollectionsGenericIListTy (g: TcGlobals) ty = @@ -107,9 +117,16 @@ let GetImmediateInterfacesOfMetadataType g amap m skipUnref ty (tcref: TyconRef) // succeeded with more reported. There are pathological corner cases where this // doesn't apply: e.g. for mscorlib interfaces like IComparable, but we can always // assume those are present. - for intfTy in tdef.Implements do + let checkNullness = g.langFeatureNullness && g.checkNullness + for {Idx = attrsIdx; Type = intfTy; CustomAttrsStored = attrs} in tdef.Implements.Value do if skipUnref = SkipUnrefInterfaces.No || CanRescopeAndImportILType scoref amap m intfTy then - RescopeAndImportILType scoref amap m tinst intfTy + if checkNullness then + let typeAttrs = AttributesFromIL(attrsIdx,attrs) + let nullness = {DirectAttributes = typeAttrs; Fallback = FromClass typeAttrs} + RescopeAndImportILType scoref amap m tinst nullness intfTy + else + RescopeAndImportILTypeSkipNullness scoref amap m tinst intfTy + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> for intfTy in tcref.ImmediateInterfaceTypesOfFSharpTycon do instType (mkInstForAppTy g ty) intfTy ] @@ -119,7 +136,7 @@ let GetImmediateInterfacesOfMetadataType g amap m skipUnref ty (tcref: TyconRef) // // NOTE: Anonymous record types are not directly considered to implement IComparable, // IComparable or IEquatable. This is because whether they support these interfaces depend on their -// consitutent types, which may not yet be known in type inference. +// constituent types, which may not yet be known in type inference. let rec GetImmediateInterfacesOfType skipUnref g amap m ty = [ match tryAppTy g ty with @@ -178,15 +195,15 @@ and GetImmediateInterfacesOfMeasureAnnotatedType skipUnref g amap m ty reprTy = intfTy // NOTE: we should really only report the IComparable> interface for measure-annotated types - // if the original type supports IComparable somewhere in the hierarchy, likeiwse IEquatable>. + // if the original type supports IComparable somewhere in the hierarchy, likewise IEquatable>. // // However since F# 2.0 we have always reported these interfaces for all measure-annotated types. //if ExistsInInterfaceHierarchy (typeEquiv g (mkAppTy g.system_GenericIComparable_tcref [reprTy])) skipUnref g amap m ty then - mkAppTy g.system_GenericIComparable_tcref [ty] + mkWoNullAppTy g.system_GenericIComparable_tcref [ty] //if ExistsInInterfaceHierarchy (typeEquiv g (mkAppTy g.system_GenericIEquatable_tcref [reprTy])) skipUnref g amap m ty then - mkAppTy g.system_GenericIEquatable_tcref [ty] + mkWoNullAppTy g.system_GenericIEquatable_tcref [ty] ] // Check for any System.Numerics type in the interface hierarchy @@ -249,11 +266,11 @@ let FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref visitor List.foldBack (loop (ndeep+1)) (GetImmediateInterfacesOfType skipUnref g amap m ty) - (loop ndeep g.obj_ty state) + (loop ndeep g.obj_ty_noNulls state) else match tryDestTyparTy g ty with | ValueSome tp -> - let state = loop (ndeep+1) g.obj_ty state + let state = loop (ndeep+1) g.obj_ty_noNulls state List.foldBack (fun x vacc -> match x with @@ -264,8 +281,10 @@ let FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref visitor | TyparConstraint.IsEnum _ | TyparConstraint.IsDelegate _ | TyparConstraint.SupportsNull _ + | TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.SimpleChoice _ | TyparConstraint.RequiresDefaultConstructor _ -> vacc @@ -349,33 +368,38 @@ let ExistsHeadTypeInEntireHierarchy g amap m typeToSearchFrom tcrefToLookFor = ExistsInEntireHierarchyOfType (HasHeadType g tcrefToLookFor) g amap m AllowMultiIntfInstantiations.Yes typeToSearchFrom /// Read an Abstract IL type from metadata and convert to an F# type. -let ImportILTypeFromMetadata amap m scoref tinst minst ilTy = - RescopeAndImportILType scoref amap m (tinst@minst) ilTy +let ImportILTypeFromMetadata amap m scoref tinst minst nullnessSource ilTy = + RescopeAndImportILType scoref amap m (tinst@minst) nullnessSource ilTy + +/// Read an Abstract IL type from metadata and convert to an F# type, ignoring nullness checking. +let ImportILTypeFromMetadataSkipNullness amap m scoref tinst minst ilTy = + RescopeAndImportILTypeSkipNullness scoref amap m (tinst@minst) ilTy /// Read an Abstract IL type from metadata, including any attributes that may affect the type itself, and convert to an F# type. -let ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst ilTy getCattrs = - let ty = RescopeAndImportILType scoref amap m (tinst@minst) ilTy +let ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst nullnessSource ilTy = + let ty = RescopeAndImportILType scoref amap m (tinst@minst) nullnessSource ilTy + // If the type is a byref and one of attributes from a return or parameter has // - a `IsReadOnlyAttribute` - it's an inref // - a `RequiresLocationAttribute` (in which case it's a `ref readonly`) which we treat as inref, // latter is an ad-hoc fix for https://github.com/dotnet/runtime/issues/94317. if isByrefTy amap.g ty - && (TryFindILAttribute amap.g.attrib_IsReadOnlyAttribute (getCattrs ()) - || TryFindILAttribute amap.g.attrib_RequiresLocationAttribute (getCattrs ())) then + && (TryFindILAttribute amap.g.attrib_IsReadOnlyAttribute (nullnessSource.DirectAttributes.Read()) + || TryFindILAttribute amap.g.attrib_RequiresLocationAttribute (nullnessSource.DirectAttributes.Read())) then mkInByrefTy amap.g (destByrefTy amap.g ty) else ty /// Get the parameter type of an IL method. -let ImportParameterTypeFromMetadata amap m ilTy getCattrs scoref tinst mist = - ImportILTypeFromMetadataWithAttributes amap m scoref tinst mist ilTy getCattrs +let ImportParameterTypeFromMetadata amap m nullnessSource ilTy scoref tinst mist = + ImportILTypeFromMetadataWithAttributes amap m scoref tinst mist nullnessSource ilTy /// Get the return type of an IL method, taking into account instantiations for type, return attributes and method generic parameters, and /// translating 'void' to 'None'. -let ImportReturnTypeFromMetadata amap m ilTy getCattrs scoref tinst minst = +let ImportReturnTypeFromMetadata amap m nullnessSource ilTy scoref tinst minst = match ilTy with | ILType.Void -> None - | retTy -> Some(ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst retTy getCattrs) + | retTy -> Some(ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst nullnessSource retTy ) /// Copy constraints. If the constraint comes from a type parameter associated @@ -388,7 +412,9 @@ let ImportReturnTypeFromMetadata amap m ilTy getCattrs scoref tinst minst = let CopyTyparConstraints m tprefInst (tporig: Typar) = tporig.Constraints - |> List.map (fun tpc -> + // F# does not have escape analysis for authoring 'allows ref struct' generic code. Therefore, typar is not copied, can only come from C# authored code + |> List.filter (fun tp -> match tp with | TyparConstraint.AllowsRefStruct _ -> false | _ -> true) + |> List.map (fun tpc -> match tpc with | TyparConstraint.CoercesTo(ty, _) -> TyparConstraint.CoercesTo (instType tprefInst ty, m) @@ -400,6 +426,8 @@ let CopyTyparConstraints m tprefInst (tporig: Typar) = TyparConstraint.IsEnum (instType tprefInst underlyingTy, m) | TyparConstraint.SupportsComparison _ -> TyparConstraint.SupportsComparison m + | TyparConstraint.NotSupportsNull _ -> + TyparConstraint.NotSupportsNull m | TyparConstraint.SupportsEquality _ -> TyparConstraint.SupportsEquality m | TyparConstraint.IsDelegate(argTys, retTy, _) -> @@ -408,6 +436,7 @@ let CopyTyparConstraints m tprefInst (tporig: Typar) = TyparConstraint.IsNonNullableStruct m | TyparConstraint.IsUnmanaged _ -> TyparConstraint.IsUnmanaged m + | TyparConstraint.AllowsRefStruct _ -> failwith "impossible, filtered above" | TyparConstraint.IsReferenceType _ -> TyparConstraint.IsReferenceType m | TyparConstraint.SimpleChoice (tys, _) -> diff --git a/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fsi b/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fsi index 225e618747..8633f9827f 100644 --- a/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fsi +++ b/src/fcs-fable/src/Compiler/Checking/TypeHierarchy.fsi @@ -117,6 +117,17 @@ val ExistsHeadTypeInEntireHierarchy: /// Read an Abstract IL type from metadata and convert to an F# type. val ImportILTypeFromMetadata: + amap: ImportMap -> + m: range -> + scoref: ILScopeRef -> + tinst: TType list -> + minst: TType list -> + nullnessSource: Nullness.NullableAttributesSource -> + ilTy: ILType -> + TType + +/// Read an Abstract IL type from metadata and convert to an F# type, ignoring nullness checking. +val ImportILTypeFromMetadataSkipNullness: amap: ImportMap -> m: range -> scoref: ILScopeRef -> tinst: TType list -> minst: TType list -> ilTy: ILType -> TType /// Read an Abstract IL type from metadata, including any attributes that may affect the type itself, and convert to an F# type. @@ -126,16 +137,16 @@ val ImportILTypeFromMetadataWithAttributes: scoref: ILScopeRef -> tinst: TType list -> minst: TType list -> + nullnessSource: Nullness.NullableAttributesSource -> ilTy: ILType -> - getCattrs: (unit -> ILAttributes) -> TType /// Get the parameter type of an IL method. val ImportParameterTypeFromMetadata: amap: ImportMap -> m: range -> + nullnessSource: Nullness.NullableAttributesSource -> ilTy: ILType -> - getCattrs: (unit -> ILAttributes) -> scoref: ILScopeRef -> tinst: TType list -> mist: TType list -> @@ -146,8 +157,8 @@ val ImportParameterTypeFromMetadata: val ImportReturnTypeFromMetadata: amap: ImportMap -> m: range -> + nullnessSource: Nullness.NullableAttributesSource -> ilTy: ILType -> - getCattrs: (unit -> ILAttributes) -> scoref: ILScopeRef -> tinst: TType list -> minst: TType list -> diff --git a/src/fcs-fable/src/Compiler/Checking/TypeRelations.fs b/src/fcs-fable/src/Compiler/Checking/TypeRelations.fs index 49afd4825b..6c38b68d80 100644 --- a/src/fcs-fable/src/Compiler/Checking/TypeRelations.fs +++ b/src/fcs-fable/src/Compiler/Checking/TypeRelations.fs @@ -6,7 +6,8 @@ module internal FSharp.Compiler.TypeRelations open FSharp.Compiler.Features open Internal.Utilities.Collections -open Internal.Utilities.Library +open Internal.Utilities.Library + open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypedTree @@ -14,38 +15,43 @@ open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypeHierarchy +open Import + +#nowarn "3391" + /// Implements a :> b without coercion based on finalized (no type variable) types -// Note: This relation is approximate and not part of the language specification. +// Note: This relation is approximate and not part of the language specification. // -// Some appropriate uses: +// Some appropriate uses: // patcompile.fs: IsDiscrimSubsumedBy (approximate warning for redundancy of 'isinst' patterns) // tc.fs: TcRuntimeTypeTest (approximate warning for redundant runtime type tests) // tc.fs: TcExnDefnCore (error for bad exception abbreviation) // ilxgen.fs: GenCoerce (omit unnecessary castclass or isinst instruction) // -let rec TypeDefinitelySubsumesTypeNoCoercion ndeep g amap m ty1 ty2 = - if ndeep > 100 then error(InternalError("recursive class hierarchy (detected in TypeDefinitelySubsumesTypeNoCoercion), ty1 = " + (DebugPrint.showType ty1), m)) - if ty1 === ty2 then true - elif typeEquiv g ty1 ty2 then true - else - let ty1 = stripTyEqns g ty1 - let ty2 = stripTyEqns g ty2 - // F# reference types are subtypes of type 'obj' - (typeEquiv g ty1 g.obj_ty && isRefTy g ty2) || - // Follow the supertype chain - (isAppTy g ty2 && - isRefTy g ty2 && +let rec TypeDefinitelySubsumesTypeNoCoercion ndeep g amap m ty1 ty2 = + + if ndeep > 100 then + error(InternalError("Large class hierarchy (possibly recursive, detected in TypeDefinitelySubsumesTypeNoCoercion), ty1 = " + (DebugPrint.showType ty1), m)) - ((match GetSuperTypeOfType g amap m ty2 with - | None -> false - | Some ty -> TypeDefinitelySubsumesTypeNoCoercion (ndeep+1) g amap m ty1 ty) || + if ty1 === ty2 then true + elif typeEquiv g ty1 ty2 then true + else + let ty1 = stripTyEqns g ty1 + let ty2 = stripTyEqns g ty2 + // F# reference types are subtypes of type 'obj' + (typeEquiv g ty1 g.obj_ty_ambivalent && isRefTy g ty2) || + // Follow the supertype chain + (isAppTy g ty2 && + isRefTy g ty2 && - // Follow the interface hierarchy - (isInterfaceTy g ty1 && - ty2 |> GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m - |> List.exists (TypeDefinitelySubsumesTypeNoCoercion (ndeep+1) g amap m ty1)))) + ((match GetSuperTypeOfType g amap m ty2 with + | None -> false + | Some ty -> TypeDefinitelySubsumesTypeNoCoercion (ndeep+1) g amap m ty1 ty) || -type CanCoerce = CanCoerce | NoCoerce + // Follow the interface hierarchy + (isInterfaceTy g ty1 && + ty2 |> GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m + |> List.exists (TypeDefinitelySubsumesTypeNoCoercion (ndeep+1) g amap m ty1)))) let stripAll stripMeasures g ty = if stripMeasures then @@ -54,80 +60,111 @@ let stripAll stripMeasures g ty = ty |> stripTyEqns g /// The feasible equivalence relation. Part of the language spec. -let rec TypesFeasiblyEquivalent stripMeasures ndeep g amap m ty1 ty2 = +let rec TypesFeasiblyEquivalent stripMeasures ndeep g amap m ty1 ty2 = - if ndeep > 100 then error(InternalError("recursive class hierarchy (detected in TypeFeasiblySubsumesType), ty1 = " + (DebugPrint.showType ty1), m)); + if ndeep > 100 then + error(InternalError("Large class hierarchy (possibly recursive, detected in TypeFeasiblySubsumesType), ty1 = " + (DebugPrint.showType ty1), m)); let ty1 = stripAll stripMeasures g ty1 let ty2 = stripAll stripMeasures g ty2 match ty1, ty2 with - | TType_var _, _ + | TType_measure _, TType_measure _ + | TType_var _, _ | _, TType_var _ -> true | TType_app (tcref1, l1, _), TType_app (tcref2, l2, _) when tyconRefEq g tcref1 tcref2 -> List.lengthsEqAndForall2 (TypesFeasiblyEquivalent stripMeasures ndeep g amap m) l1 l2 - | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> + | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> (evalTupInfoIsStruct anonInfo1.TupInfo = evalTupInfoIsStruct anonInfo2.TupInfo) && (match anonInfo1.Assembly, anonInfo2.Assembly with ccu1, ccu2 -> ccuEq ccu1 ccu2) && (anonInfo1.SortedNames = anonInfo2.SortedNames) && List.lengthsEqAndForall2 (TypesFeasiblyEquivalent stripMeasures ndeep g amap m) l1 l2 - | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> evalTupInfoIsStruct tupInfo1 = evalTupInfoIsStruct tupInfo2 && - List.lengthsEqAndForall2 (TypesFeasiblyEquivalent stripMeasures ndeep g amap m) l1 l2 + List.lengthsEqAndForall2 (TypesFeasiblyEquivalent stripMeasures ndeep g amap m) l1 l2 - | TType_fun (domainTy1, rangeTy1, _), TType_fun (domainTy2, rangeTy2, _) -> + | TType_fun (domainTy1, rangeTy1, _), TType_fun (domainTy2, rangeTy2, _) -> TypesFeasiblyEquivalent stripMeasures ndeep g amap m domainTy1 domainTy2 && TypesFeasiblyEquivalent stripMeasures ndeep g amap m rangeTy1 rangeTy2 - | TType_measure _, TType_measure _ -> - true - - | _ -> + | _ -> false /// The feasible equivalence relation. Part of the language spec. -let rec TypesFeasiblyEquiv ndeep g amap m ty1 ty2 = +let TypesFeasiblyEquiv ndeep g amap m ty1 ty2 = TypesFeasiblyEquivalent false ndeep g amap m ty1 ty2 /// The feasible equivalence relation after stripping Measures. let TypesFeasiblyEquivStripMeasures g amap m ty1 ty2 = TypesFeasiblyEquivalent true 0 g amap m ty1 ty2 +let inline TryGetCachedTypeSubsumption (g: TcGlobals) (amap: ImportMap) key = + if g.compilationMode = CompilationMode.OneOff && g.langVersion.SupportsFeature LanguageFeature.UseTypeSubsumptionCache then + match amap.TypeSubsumptionCache.TryGetValue(key) with + | true, subsumes -> + ValueSome subsumes + | false, _ -> + ValueNone + else + ValueNone + +let inline UpdateCachedTypeSubsumption (g: TcGlobals) (amap: ImportMap) key subsumes : unit = + if g.compilationMode = CompilationMode.OneOff && g.langVersion.SupportsFeature LanguageFeature.UseTypeSubsumptionCache then + amap.TypeSubsumptionCache[key] <- subsumes + /// The feasible coercion relation. Part of the language spec. -let rec TypeFeasiblySubsumesType ndeep g amap m ty1 canCoerce ty2 = - if ndeep > 100 then error(InternalError("recursive class hierarchy (detected in TypeFeasiblySubsumesType), ty1 = " + (DebugPrint.showType ty1), m)) - let ty1 = stripTyEqns g ty1 - let ty2 = stripTyEqns g ty2 - match ty1, ty2 with - | TType_var _, _ | _, TType_var _ -> true +let rec TypeFeasiblySubsumesType ndeep (g: TcGlobals) (amap: ImportMap) m (ty1: TType) (canCoerce: CanCoerce) (ty2: TType) = - | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> - List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 + if ndeep > 100 then + error(InternalError("Large class hierarchy (possibly recursive, detected in TypeFeasiblySubsumesType), ty1 = " + (DebugPrint.showType ty1), m)) - | TType_tuple _, TType_tuple _ - | TType_anon _, TType_anon _ - | TType_fun _, TType_fun _ -> - TypesFeasiblyEquiv ndeep g amap m ty1 ty2 + let ty1 = stripTyEqns g ty1 + let ty2 = stripTyEqns g ty2 - | TType_measure _, TType_measure _ -> - true + // Check if language feature supported + let key = TTypeCacheKey.FromStrippedTypes (ty1, ty2, canCoerce, g) + + match TryGetCachedTypeSubsumption g amap key with + | ValueSome subsumes -> + subsumes + | ValueNone -> + let subsumes = + match ty1, ty2 with + | TType_measure _, TType_measure _ + | TType_var _, _ | _, TType_var _ -> + true + + | TType_app (tc1, l1, _), TType_app (tc2, l2, _) when tyconRefEq g tc1 tc2 -> + List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 + + | TType_tuple _, TType_tuple _ + | TType_anon _, TType_anon _ + | TType_fun _, TType_fun _ -> + TypesFeasiblyEquiv ndeep g amap m ty1 ty2 + + | _ -> + // F# reference types are subtypes of type 'obj' + if isObjTyAnyNullness g ty1 && (canCoerce = CanCoerce || isRefTy g ty2) then + true + elif isAppTy g ty2 && (canCoerce = CanCoerce || isRefTy g ty2) && TypeFeasiblySubsumesTypeWithSupertypeCheck g amap m ndeep ty1 ty2 then + true + else + let interfaces = GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m ty2 + // See if any interface in type hierarchy of ty2 is a supertype of ty1 + List.exists (TypeFeasiblySubsumesType (ndeep + 1) g amap m ty1 NoCoerce) interfaces + + UpdateCachedTypeSubsumption g amap key subsumes + + subsumes + +and TypeFeasiblySubsumesTypeWithSupertypeCheck g amap m ndeep ty1 ty2 = + match GetSuperTypeOfType g amap m ty2 with + | None -> false + | Some ty -> TypeFeasiblySubsumesType (ndeep + 1) g amap m ty1 NoCoerce ty - | _ -> - // F# reference types are subtypes of type 'obj' - (isObjTy g ty1 && (canCoerce = CanCoerce || isRefTy g ty2)) - || - (isAppTy g ty2 && - (canCoerce = CanCoerce || isRefTy g ty2) && - begin match GetSuperTypeOfType g amap m ty2 with - | None -> false - | Some ty -> TypeFeasiblySubsumesType (ndeep+1) g amap m ty1 NoCoerce ty - end || - ty2 |> GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m - |> List.exists (TypeFeasiblySubsumesType (ndeep+1) g amap m ty1 NoCoerce)) - /// Choose solutions for Expr.TyChoose type "hidden" variables introduced /// by letrec nodes. Also used by the pattern match compiler to choose type /// variables when compiling patterns at generalized bindings. @@ -136,49 +173,48 @@ let rec TypeFeasiblySubsumesType ndeep g amap m ty1 canCoerce ty2 = let ChooseTyparSolutionAndRange (g: TcGlobals) amap (tp:Typar) = let m = tp.Range let (maxTy, isRefined), m = - let initialTy = - match tp.Kind with - | TyparKind.Type -> g.obj_ty + let initialTy = + match tp.Kind with + | TyparKind.Type -> g.obj_ty_noNulls | TyparKind.Measure -> TType_measure Measure.One // Loop through the constraints computing the lub (((initialTy, false), m), tp.Constraints) ||> List.fold (fun ((maxTy, isRefined), _) tpc -> - let join m x = + let join m x = if TypeFeasiblySubsumesType 0 g amap m x CanCoerce maxTy then maxTy, isRefined elif TypeFeasiblySubsumesType 0 g amap m maxTy CanCoerce x then x, true else errorR(Error(FSComp.SR.typrelCannotResolveImplicitGenericInstantiation((DebugPrint.showType x), (DebugPrint.showType maxTy)), m)); maxTy, isRefined - // Don't continue if an error occurred and we set the value eagerly + // Don't continue if an error occurred and we set the value eagerly if tp.IsSolved then (maxTy, isRefined), m else - match tpc with - | TyparConstraint.CoercesTo(x, m) -> + match tpc with + | TyparConstraint.CoercesTo(x, m) -> join m x, m - | TyparConstraint.MayResolveMember(_traitInfo, m) -> - (maxTy, isRefined), m | TyparConstraint.SimpleChoice(_, m) -> errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInPrintf(), m)) (maxTy, isRefined), m - | TyparConstraint.SupportsNull m -> - (maxTy, isRefined), m + | TyparConstraint.SupportsNull m -> + ((addNullnessToTy KnownWithNull maxTy), isRefined), m | TyparConstraint.SupportsComparison m -> join m g.mk_IComparable_ty, m - | TyparConstraint.SupportsEquality m -> - (maxTy, isRefined), m | TyparConstraint.IsEnum(_, m) -> errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInEnum(), m)) (maxTy, isRefined), m - | TyparConstraint.IsDelegate(_, _, m) -> + | TyparConstraint.IsDelegate(_, _, m) -> errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInDelegate(), m)) (maxTy, isRefined), m - | TyparConstraint.IsNonNullableStruct m -> + | TyparConstraint.IsNonNullableStruct m -> join m g.int_ty, m | TyparConstraint.IsUnmanaged m -> errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInUnmanaged(), m)) (maxTy, isRefined), m - | TyparConstraint.RequiresDefaultConstructor m -> + | TyparConstraint.NotSupportsNull m // NOTE: this doesn't "force" non-nullness, since it is the default choice in 'obj' or 'int' + | TyparConstraint.SupportsEquality m + | TyparConstraint.AllowsRefStruct m + | TyparConstraint.RequiresDefaultConstructor m + | TyparConstraint.IsReferenceType m + | TyparConstraint.MayResolveMember(_, m) + | TyparConstraint.DefaultsTo(_,_, m) -> (maxTy, isRefined), m - | TyparConstraint.IsReferenceType m -> - (maxTy, isRefined), m - | TyparConstraint.DefaultsTo(_priority, _ty, m) -> - (maxTy, isRefined), m) + ) if g.langVersion.SupportsFeature LanguageFeature.DiagnosticForObjInference then match tp.Kind with @@ -189,7 +225,7 @@ let ChooseTyparSolutionAndRange (g: TcGlobals) amap (tp:Typar) = maxTy, m -let ChooseTyparSolution g amap tp = +let ChooseTyparSolution g amap tp = let ty, _m = ChooseTyparSolutionAndRange g amap tp if tp.Rigidity = TyparRigidity.Anon && typeEquiv g ty (TType_measure Measure.One) then warning(Error(FSComp.SR.csCodeLessGeneric(), tp.Range)) @@ -199,14 +235,14 @@ let ChooseTyparSolution g amap tp = // For example // 'a = Expr<'b> // 'b = int -// In this case the solutions are +// In this case the solutions are // 'a = Expr // 'b = int // We ground out the solutions by repeatedly instantiating -let IterativelySubstituteTyparSolutions g tps solutions = +let IterativelySubstituteTyparSolutions g tps solutions = let tpenv = mkTyparInst tps solutions - let rec loop n curr = - let curr' = curr |> instTypes tpenv + let rec loop n curr = + let curr' = curr |> instTypes tpenv // We cut out at n > 40 just in case this loops. It shouldn't, since there should be no cycles in the // solution equations, and we've only ever seen one example where even n = 2 was required. // Perhaps it's possible in error recovery some strange situations could occur where cycles @@ -214,25 +250,25 @@ let IterativelySubstituteTyparSolutions g tps solutions = // // We don't give an error if we hit the limit since it's feasible that the solutions of unknowns // is not actually relevant to the rest of type checking or compilation. - if n > 40 || List.forall2 (typeEquiv g) curr curr' then - curr - else + if n > 40 || List.forall2 (typeEquiv g) curr curr' then + curr + else loop (n+1) curr' loop 0 solutions -let ChooseTyparSolutionsForFreeChoiceTypars g amap e = - match stripDebugPoints e with - | Expr.TyChoose (tps, e1, _m) -> - - /// Only make choices for variables that are actually used in the expression +let ChooseTyparSolutionsForFreeChoiceTypars g amap e = + match stripDebugPoints e with + | Expr.TyChoose (tps, e1, _m) -> + + /// Only make choices for variables that are actually used in the expression let ftvs = (freeInExpr CollectTyparsNoCaching e1).FreeTyvars.FreeTypars let tps = tps |> List.filter (Zset.memberOf ftvs) - + let solutions = tps |> List.map (ChooseTyparSolution g amap) |> IterativelySubstituteTyparSolutions g tps - + let tpenv = mkTyparInst tps solutions - + instExpr g tpenv e1 | _ -> e @@ -242,51 +278,51 @@ let ChooseTyparSolutionsForFreeChoiceTypars g amap e = /// PostTypeCheckSemanticChecks before we've eliminated these nodes. let tryDestLambdaWithValReprInfo g amap valReprInfo (lambdaExpr, ty) = let (ValReprInfo (tpNames, _, _)) = valReprInfo - let rec stripLambdaUpto n (e, ty) = - match stripDebugPoints e with - | Expr.Lambda (_, None, None, v, b, _, retTy) when n > 0 -> + let rec stripLambdaUpto n (e, ty) = + match stripDebugPoints e with + | Expr.Lambda (_, None, None, v, b, _, retTy) when n > 0 -> let vs', b', retTy' = stripLambdaUpto (n-1) (b, retTy) - (v :: vs', b', retTy') - | _ -> + (v :: vs', b', retTy') + | _ -> ([], e, ty) - let rec startStripLambdaUpto n (e, ty) = - match stripDebugPoints e with - | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, b, _, retTy) when n > 0 -> + let rec startStripLambdaUpto n (e, ty) = + match stripDebugPoints e with + | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, b, _, retTy) when n > 0 -> let vs', b', retTy' = stripLambdaUpto (n-1) (b, retTy) - (ctorThisValOpt, baseValOpt, (v :: vs'), b', retTy') - | Expr.TyChoose (_tps, _b, _) -> + (ctorThisValOpt, baseValOpt, (v :: vs'), b', retTy') + | Expr.TyChoose (_tps, _b, _) -> startStripLambdaUpto n (ChooseTyparSolutionsForFreeChoiceTypars g amap e, ty) - | _ -> + | _ -> (None, None, [], e, ty) let n = valReprInfo.NumCurriedArgs - let tps, bodyExpr, bodyTy = - match stripDebugPoints lambdaExpr with - | Expr.TyLambda (_, tps, b, _, retTy) when not (isNil tpNames) -> tps, b, retTy + let tps, bodyExpr, bodyTy = + match stripDebugPoints lambdaExpr with + | Expr.TyLambda (_, tps, b, _, retTy) when not (isNil tpNames) -> tps, b, retTy | _ -> [], lambdaExpr, ty let ctorThisValOpt, baseValOpt, vsl, body, retTy = startStripLambdaUpto n (bodyExpr, bodyTy) - if vsl.Length <> n then - None + if vsl.Length <> n then + None else Some (tps, ctorThisValOpt, baseValOpt, vsl, body, retTy) -let destLambdaWithValReprInfo g amap valReprInfo (lambdaExpr, ty) = - match tryDestLambdaWithValReprInfo g amap valReprInfo (lambdaExpr, ty) with +let destLambdaWithValReprInfo g amap valReprInfo (lambdaExpr, ty) = + match tryDestLambdaWithValReprInfo g amap valReprInfo (lambdaExpr, ty) with | None -> error(Error(FSComp.SR.typrelInvalidValue(), lambdaExpr.Range)) | Some res -> res - + let IteratedAdjustArityOfLambdaBody g arities vsl body = - (arities, vsl, ([], body)) |||> List.foldBack2 (fun arities vs (allvs, body) -> + (arities, vsl, ([], body)) |||> List.foldBack2 (fun arities vs (allvs, body) -> let vs, body = AdjustArityOfLambdaBody g arities vs body vs :: allvs, body) -/// Do IteratedAdjustArityOfLambdaBody for a series of iterated lambdas, producing one method. -/// The required iterated function arity (List.length valReprInfo) must be identical -/// to the iterated function arity of the input lambda (List.length vsl) +/// Do IteratedAdjustArityOfLambdaBody for a series of iterated lambdas, producing one method. +/// The required iterated function arity (List.length valReprInfo) must be identical +/// to the iterated function arity of the input lambda (List.length vsl) let IteratedAdjustLambdaToMatchValReprInfo g amap valReprInfo lambdaExpr = let lambdaExprTy = tyOfExpr g lambdaExpr @@ -295,7 +331,7 @@ let IteratedAdjustLambdaToMatchValReprInfo g amap valReprInfo lambdaExpr = let arities = valReprInfo.AritiesOfArgs - if arities.Length <> vsl.Length then + if arities.Length <> vsl.Length then errorR(InternalError(sprintf "IteratedAdjustLambdaToMatchValReprInfo, #arities = %d, #vsl = %d" arities.Length vsl.Length, body.Range)) let vsl, body = IteratedAdjustArityOfLambdaBody g arities vsl body @@ -304,6 +340,6 @@ let IteratedAdjustLambdaToMatchValReprInfo g amap valReprInfo lambdaExpr = /// "Single Feasible Type" inference /// Look for the unique supertype of ty2 for which ty2 :> ty1 might feasibly hold -let FindUniqueFeasibleSupertype g amap m ty1 ty2 = +let FindUniqueFeasibleSupertype g amap m ty1 ty2 = let supertypes = Option.toList (GetSuperTypeOfType g amap m ty2) @ (GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m ty2) - supertypes |> List.tryFind (TypeFeasiblySubsumesType 0 g amap m ty1 NoCoerce) + supertypes |> List.tryFind (TypeFeasiblySubsumesType 0 g amap m ty1 NoCoerce) diff --git a/src/fcs-fable/src/Compiler/Checking/TypeRelations.fsi b/src/fcs-fable/src/Compiler/Checking/TypeRelations.fsi index b33852fae5..9419e617d7 100644 --- a/src/fcs-fable/src/Compiler/Checking/TypeRelations.fsi +++ b/src/fcs-fable/src/Compiler/Checking/TypeRelations.fsi @@ -9,10 +9,6 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text open FSharp.Compiler.TypedTree -type CanCoerce = - | CanCoerce - | NoCoerce - /// Implements a :> b without coercion based on finalized (no type variable) types val TypeDefinitelySubsumesTypeNoCoercion: ndeep: int -> g: TcGlobals -> amap: ImportMap -> m: range -> ty1: TType -> ty2: TType -> bool diff --git a/src/fcs-fable/src/Compiler/Checking/import.fs b/src/fcs-fable/src/Compiler/Checking/import.fs index 7f1f13efda..a1deee1c8a 100644 --- a/src/fcs-fable/src/Compiler/Checking/import.fs +++ b/src/fcs-fable/src/Compiler/Checking/import.fs @@ -8,7 +8,9 @@ open System.Collections.Generic open System.Collections.Immutable open Internal.Utilities.Library open Internal.Utilities.Library.Extras -open FSharp.Compiler +open Internal.Utilities.TypeHashing +open Internal.Utilities.TypeHashing.HashTypes +open FSharp.Compiler open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.CompilerGlobalState open FSharp.Compiler.DiagnosticsLogger @@ -24,9 +26,9 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypeProviders #endif -/// Represents an interface to some of the functionality of TcImports, for loading assemblies +/// Represents an interface to some of the functionality of TcImports, for loading assemblies /// and accessing information about generated provided assemblies. -type AssemblyLoader = +type AssemblyLoader = /// Resolve an Abstract IL assembly reference to a Ccu abstract FindCcuFromAssemblyRef : CompilationThreadToken * range * ILAssemblyRef -> CcuResolutionResult @@ -43,48 +45,95 @@ type AssemblyLoader = /// Record a root for a [] type to help guide static linking & type relocation abstract RecordGeneratedTypeRoot : ProviderGeneratedType -> unit #endif - + +[] +type CanCoerce = + | CanCoerce + | NoCoerce + +type [] TTypeCacheKey = + + val ty1: TType + val ty2: TType + val canCoerce: CanCoerce + val tcGlobals: TcGlobals + + private new (ty1, ty2, canCoerce, tcGlobals) = + { ty1 = ty1; ty2 = ty2; canCoerce = canCoerce; tcGlobals = tcGlobals } + + static member FromStrippedTypes (ty1, ty2, canCoerce, tcGlobals) = + TTypeCacheKey(ty1, ty2, canCoerce, tcGlobals) + + interface System.IEquatable with + member this.Equals other = + if this.canCoerce <> other.canCoerce then + false + elif this.ty1 === other.ty1 && this.ty2 === other.ty2 then + true + else + stampEquals this.tcGlobals this.ty1 other.ty1 + && stampEquals this.tcGlobals this.ty2 other.ty2 + + override this.Equals other = + match other with + | :? TTypeCacheKey as p -> (this :> System.IEquatable).Equals p + | _ -> false + + override this.GetHashCode() : int = + let g = this.tcGlobals + + let ty1Hash = combineHash (hashStamp g this.ty1) (hashTType g this.ty1) + let ty2Hash = combineHash (hashStamp g this.ty2) (hashTType g this.ty2) + + let combined = combineHash (combineHash ty1Hash ty2Hash) (hash this.canCoerce) + + combined + //------------------------------------------------------------------------- // Import an IL types as F# types. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -/// Represents a context used by the import routines that convert AbstractIL types and provided -/// types to F# internal compiler data structures. +/// Represents a context used by the import routines that convert AbstractIL types and provided +/// types to F# internal compiler data structures. /// /// Also caches the conversion of AbstractIL ILTypeRef nodes, based on hashes of these. /// /// There is normally only one ImportMap for any assembly compilation, though additional instances can be created -/// using tcImports.GetImportMap() if needed, and it is not harmful if multiple instances are used. The object -/// serves as an interface through to the tables stored in the primary TcImports structures defined in CompileOps.fs. +/// using tcImports.GetImportMap() if needed, and it is not harmful if multiple instances are used. The object +/// serves as an interface through to the tables stored in the primary TcImports structures defined in CompileOps.fs. [] type ImportMap(g: TcGlobals, assemblyLoader: AssemblyLoader) = let typeRefToTyconRefCache = ConcurrentDictionary() + let typeSubsumptionCache = ConcurrentDictionary(System.Environment.ProcessorCount, 1024) + member _.g = g member _.assemblyLoader = assemblyLoader member _.ILTypeRefToTyconRefCache = typeRefToTyconRefCache -let CanImportILScopeRef (env: ImportMap) m scoref = + member _.TypeSubsumptionCache = typeSubsumptionCache + +let CanImportILScopeRef (env: ImportMap) m scoref = let isResolved assemblyRef = // Explanation: This represents an unchecked invariant in the hosted compiler: that any operations // which import types (and resolve assemblies from the tcImports tables) happen on the compilation thread. - let ctok = AssumeCompilationThreadWithoutEvidence() - + let ctok = AssumeCompilationThreadWithoutEvidence() + match env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assemblyRef) with | UnresolvedCcu _ -> false | ResolvedCcu _ -> true - match scoref with + match scoref with | ILScopeRef.Local | ILScopeRef.Module _ -> true | ILScopeRef.Assembly assemblyRef -> isResolved assemblyRef | ILScopeRef.PrimaryAssembly -> isResolved env.g.ilg.primaryAssemblyRef /// Import a reference to a type definition, given the AbstractIL data for the type reference -let ImportTypeRefData (env: ImportMap) m (scoref, path, typeName) = +let ImportTypeRefData (env: ImportMap) m (scoref, path, typeName) = let findCcu assemblyRef = // Explanation: This represents an unchecked invariant in the hosted compiler: that any operations @@ -93,8 +142,8 @@ let ImportTypeRefData (env: ImportMap) m (scoref, path, typeName) = env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assemblyRef) - let ccu = - match scoref with + let ccu = + match scoref with | ILScopeRef.Local -> error(InternalError("ImportILTypeRef: unexpected local scope", m)) | ILScopeRef.Module _ -> error(InternalError("ImportILTypeRef: reference found to a type in an auxiliary module", m)) | ILScopeRef.Assembly assemblyRef -> findCcu assemblyRef @@ -102,14 +151,14 @@ let ImportTypeRefData (env: ImportMap) m (scoref, path, typeName) = // Do a dereference of a fake tcref for the type just to check it exists in the target assembly and to find // the corresponding Tycon. - let ccu = + let ccu = match ccu with | ResolvedCcu ccu->ccu - | UnresolvedCcu ccuName -> + | UnresolvedCcu ccuName -> error (Error(FSComp.SR.impTypeRequiredUnavailable(typeName, ccuName), m)) let fakeTyconRef = mkNonLocalTyconRef (mkNonLocalEntityRef ccu path) typeName - let tycon = - try + let tycon = + try fakeTyconRef.Deref with _ -> error (Error(FSComp.SR.impReferencedTypeCouldNotBeFoundInAssembly(String.concat "." (Array.append path [| typeName |]), ccu.AssemblyName), m)) @@ -119,33 +168,33 @@ let ImportTypeRefData (env: ImportMap) m (scoref, path, typeName) = | TProvidedTypeRepr info -> //printfn "ImportTypeRefData: validating type: typeLogicalName = %A" typeName ValidateProvidedTypeAfterStaticInstantiation(m, info.ProvidedType, path, typeName) - | _ -> + | _ -> () #endif - match tryRescopeEntity ccu tycon with + match tryRescopeEntity ccu tycon with | ValueNone -> error (Error(FSComp.SR.impImportedAssemblyUsesNotPublicType(String.concat "." (Array.toList path@[typeName])), m)) | ValueSome tcref -> tcref - + /// Import a reference to a type definition, given an AbstractIL ILTypeRef, without caching // // Note, the type names that flow to the point include the "mangled" type names used for static parameters for provided types. // For example, // Foo.Bar,"1.0" -// This is because ImportProvidedType goes via Abstract IL type references. -let ImportILTypeRefUncached (env: ImportMap) m (tref: ILTypeRef) = - let path, typeName = - match tref.Enclosing with - | [] -> +// This is because ImportProvidedType goes via Abstract IL type references. +let ImportILTypeRefUncached (env: ImportMap) m (tref: ILTypeRef) = + let path, typeName = + match tref.Enclosing with + | [] -> splitILTypeNameWithPossibleStaticArguments tref.Name - | h :: t -> + | h :: t -> let nsp, tname = splitILTypeNameWithPossibleStaticArguments h // Note, subsequent type names do not need to be split, only the first [| yield! nsp; yield tname; yield! t |], tref.Name ImportTypeRefData (env: ImportMap) m (tref.Scope, path, typeName) - + /// Import a reference to a type definition, given an AbstractIL ILTypeRef, with caching let ImportILTypeRef (env: ImportMap) m (tref: ILTypeRef) = match env.ILTypeRefToTyconRefCache.TryGetValue tref with @@ -160,156 +209,317 @@ let CanImportILTypeRef (env: ImportMap) m (tref: ILTypeRef) = env.ILTypeRefToTyconRefCache.ContainsKey(tref) || CanImportILScopeRef env m tref.Scope /// Import a type, given an AbstractIL ILTypeRef and an F# type instantiation. -/// -/// Prefer the F# abbreviation for some built-in types, e.g. 'string' rather than -/// 'System.String', since we prefer the F# abbreviation to the .NET equivalents. -let ImportTyconRefApp (env: ImportMap) tcref tyargs = - env.g.improveType tcref tyargs +/// +/// Prefer the F# abbreviation for some built-in types, e.g. 'string' rather than +/// 'System.String', since we prefer the F# abbreviation to the .NET equivalents. +let ImportTyconRefApp (env: ImportMap) tcref tyargs nullness = + env.g.improveType tcref tyargs nullness + + +module Nullness = + + open FSharp.Compiler.AbstractIL.Diagnostics + + let arrayWithByte0 = [|0uy|] + let arrayWithByte1 = [|1uy|] + let arrayWithByte2 = [|2uy|] + + let knownAmbivalent = NullnessInfo.AmbivalentToNull |> Nullness.Known + let knownWithoutNull = NullnessInfo.WithoutNull |> Nullness.Known + let knownNullable = NullnessInfo.WithNull |> Nullness.Known + + let mapping byteValue = + match byteValue with + | 0uy -> knownAmbivalent + | 1uy -> knownWithoutNull + | 2uy -> knownNullable + | _ -> + dprintfn "%i was passed to Nullness mapping, this is not a valid value" byteValue + knownAmbivalent + + let isByte (g:TcGlobals) (ilgType:ILType) = + g.ilg.typ_Byte.BasicQualifiedName = ilgType.BasicQualifiedName + + let tryParseAttributeDataToNullableByteFlags (g:TcGlobals) attrData = + match attrData with + | None -> ValueNone + | Some ([ILAttribElem.Byte 0uy],_) -> ValueSome arrayWithByte0 + | Some ([ILAttribElem.Byte 1uy],_) -> ValueSome arrayWithByte1 + | Some ([ILAttribElem.Byte 2uy],_) -> ValueSome arrayWithByte2 + | Some ([ILAttribElem.Array(byteType,listOfBytes)],_) when isByte g byteType -> + listOfBytes + |> Array.ofList + |> Array.choose(function | ILAttribElem.Byte b -> Some b | _ -> None) + |> ValueSome + + | _ -> ValueNone + + [] + type AttributesFromIL = AttributesFromIL of metadataIndex:int * attrs:ILAttributesStored + with + member this.Read() = match this with| AttributesFromIL(idx,attrs) -> attrs.GetCustomAttrs(idx) + member this.GetNullable(g:TcGlobals) = + match g.attrib_NullableAttribute_opt with + | None -> ValueNone + | Some n -> + TryDecodeILAttribute n.TypeRef (this.Read()) + |> tryParseAttributeDataToNullableByteFlags g + + member this.GetNullableContext(g:TcGlobals) = + match g.attrib_NullableContextAttribute_opt with + | None -> ValueNone + | Some n -> + TryDecodeILAttribute n.TypeRef (this.Read()) + |> tryParseAttributeDataToNullableByteFlags g + + [] + type NullableContextSource = + | FromClass of AttributesFromIL + | FromMethodAndClass of methodAttrs:AttributesFromIL * classAttrs:AttributesFromIL + + [] + type NullableAttributesSource = + { DirectAttributes: AttributesFromIL + Fallback : NullableContextSource} + with + member this.GetFlags(g:TcGlobals) = + let fallback = this.Fallback + this.DirectAttributes.GetNullable(g) + |> ValueOption.orElseWith(fun () -> + match fallback with + | FromClass attrs -> attrs.GetNullableContext(g) + | FromMethodAndClass(methodCtx,classCtx) -> + methodCtx.GetNullableContext(g) + |> ValueOption.orElseWith (fun () -> classCtx.GetNullableContext(g))) + |> ValueOption.defaultValue arrayWithByte0 + static member Empty = + let emptyFromIL = AttributesFromIL(0,Given(ILAttributes.Empty)) + {DirectAttributes = emptyFromIL; Fallback = FromClass(emptyFromIL)} + + [] + type NullableFlags = {Data : byte[]; Idx : int } +(* Nullness logic for generic arguments: +The data which comes from NullableAttribute back might be a flat array, or a scalar (which represents a virtual array of unknown size) +The array is passed trough all generic typars depth first , e.g. List,Uri>> + -- see here how the array indexes map to types above: [| 0 1 2 3 4 5 |] +For value types, a value is passed even though it is always 0 +*) + with + member this.GetNullness() = + match this.Data.Length with + // No nullable data nor parent context -> we cannot tell + | 0 -> knownAmbivalent + // A scalar value from attributes, cover type and all it's potential typars + | 1 -> this.Data[0] |> mapping + // We have a bigger array, indexes map to typars in a depth-first fashion + | n when n > this.Idx -> this.Data[this.Idx] |> mapping + // This is an erroneous case, we need more nullnessinfo then the metadata contains + | _ -> + // TODO nullness - once being confident that our bugs are solved and what remains are incoming metadata bugs, remove failwith and replace with dprintfn + // Testing with .NET compilers other then Roslyn producing nullness metadata? + failwithf "Length of Nullable metadata and needs of its processing do not match: %A" this + knownAmbivalent + + member this.Advance() = {Data = this.Data; Idx = this.Idx + 1} + + let inline isSystemNullable (tspec:ILTypeSpec) = + match tspec.Name,tspec.Enclosing with + | "Nullable`1",["System"] -> true + | "System.Nullable`1",[] -> true + | _ -> false + + let inline evaluateFirstOrderNullnessAndAdvance (ilt:ILType) (flags:NullableFlags) = + match ilt with + | ILType.Value tspec when tspec.GenericArgs.IsEmpty -> KnownWithoutNull, flags + // System.Nullable is special-cased in C# spec for nullness metadata. + // You CAN assign 'null' to it, and when boxed, it CAN be boxed to 'null'. + | ILType.Value tspec when isSystemNullable tspec -> KnownWithoutNull, flags + | ILType.Value _ -> KnownWithoutNull, flags.Advance() + | _ -> flags.GetNullness(), flags.Advance() /// Import an IL type as an F# type. -let rec ImportILType (env: ImportMap) m tinst ty = +let rec ImportILType (env: ImportMap) m tinst ty = match ty with - | ILType.Void -> + | ILType.Void -> env.g.unit_ty - | ILType.Array(bounds, ty) -> + | ILType.Array(bounds, ty) -> let n = bounds.Rank let elemTy = ImportILType env m tinst ty - mkArrayTy env.g n elemTy m + mkArrayTy env.g n Nullness.knownAmbivalent elemTy m | ILType.Boxed tspec | ILType.Value tspec -> - let tcref = ImportILTypeRef env m tspec.TypeRef - let inst = tspec.GenericArgs |> List.map (ImportILType env m tinst) - ImportTyconRefApp env tcref inst + let tcref = ImportILTypeRef env m tspec.TypeRef + let inst = tspec.GenericArgs |> List.map (ImportILType env m tinst) + ImportTyconRefApp env tcref inst Nullness.knownAmbivalent | ILType.Byref ty -> mkByrefTy env.g (ImportILType env m tinst ty) - | ILType.Ptr ILType.Void when env.g.voidptr_tcr.CanDeref -> mkVoidPtrTy env.g - | ILType.Ptr ty -> mkNativePtrTy env.g (ImportILType env m tinst ty) - | ILType.FunctionPointer _ -> env.g.nativeint_ty (* failwith "cannot import this kind of type (ptr, fptr)" *) - - | ILType.Modified(_, _, ty) -> + | ILType.Modified(_, _, ty) -> // All custom modifiers are ignored ImportILType env m tinst ty - | ILType.TypeVar u16 -> - let ty = - try + | ILType.TypeVar u16 -> + let ty = + try List.item (int u16) tinst - with _ -> + with _ -> error(Error(FSComp.SR.impNotEnoughTypeParamsInScopeWhileImporting(), m)) - ty + + let tyWithNullness = addNullnessToTy Nullness.knownAmbivalent ty + tyWithNullness + +/// Import an IL type as an F# type. +let rec ImportILTypeWithNullness (env: ImportMap) m tinst (nf:Nullness.NullableFlags) ty : struct(TType*Nullness.NullableFlags) = + match ty with + | ILType.Void -> + env.g.unit_ty,nf + + | ILType.Array(bounds, innerTy) -> + let n = bounds.Rank + let (arrayNullness,nf) = Nullness.evaluateFirstOrderNullnessAndAdvance ty nf + let struct(elemTy,nf) = ImportILTypeWithNullness env m tinst nf innerTy + mkArrayTy env.g n arrayNullness elemTy m, nf + + | ILType.Boxed tspec | ILType.Value tspec -> + let tcref = ImportILTypeRef env m tspec.TypeRef + let (typeRefNullness,nf) = Nullness.evaluateFirstOrderNullnessAndAdvance ty nf + let struct(inst,nullableFlagsLeft) = (nf,tspec.GenericArgs) ||> List.vMapFold (fun nf current -> ImportILTypeWithNullness env m tinst nf current ) + + ImportTyconRefApp env tcref inst typeRefNullness, nullableFlagsLeft + + | ILType.Byref ty -> + let struct(ttype,nf) = ImportILTypeWithNullness env m tinst nf ty + mkByrefTy env.g ttype, nf + + | ILType.Ptr ILType.Void when env.g.voidptr_tcr.CanDeref -> mkVoidPtrTy env.g, nf + + | ILType.Ptr ty -> + let struct(ttype,nf) = ImportILTypeWithNullness env m tinst nf ty + mkNativePtrTy env.g ttype, nf + + | ILType.FunctionPointer _ -> env.g.nativeint_ty, nf (* failwith "cannot import this kind of type (ptr, fptr)" *) + + | ILType.Modified(_, _, ty) -> + // All custom modifiers are ignored + ImportILTypeWithNullness env m tinst nf ty + + | ILType.TypeVar u16 -> + let ttype = + try + List.item (int u16) tinst + with _ -> + error(Error(FSComp.SR.impNotEnoughTypeParamsInScopeWhileImporting(), m)) + + let (typeVarNullness,nf) = Nullness.evaluateFirstOrderNullnessAndAdvance ty nf + addNullnessToTy typeVarNullness ttype, nf /// Determines if an IL type can be imported as an F# type -let rec CanImportILType (env: ImportMap) m ty = +let rec CanImportILType (env: ImportMap) m ty = match ty with | ILType.Void -> true - | ILType.Array(_bounds, ety) -> CanImportILType env m ety - | ILType.Boxed tspec | ILType.Value tspec -> - CanImportILTypeRef env m tspec.TypeRef - && tspec.GenericArgs |> List.forall (CanImportILType env m) + CanImportILTypeRef env m tspec.TypeRef + && tspec.GenericArgs |> List.forall (CanImportILType env m) | ILType.Byref ety -> CanImportILType env m ety - | ILType.Ptr ety -> CanImportILType env m ety - | ILType.FunctionPointer _ -> true - | ILType.Modified(_, _, ety) -> CanImportILType env m ety - | ILType.TypeVar _u16 -> true #if !NO_TYPEPROVIDERS /// Import a provided type reference as an F# type TyconRef -let ImportProvidedNamedType (env: ImportMap) (m: range) (st: Tainted) = +let ImportProvidedNamedType (env: ImportMap) (m: range) (st: Tainted) = // See if a reverse-mapping exists for a generated/relocated System.Type - match st.PUntaint((fun st -> st.TryGetTyconRef()), m) with + match st.PUntaint((fun st -> st.TryGetTyconRef()), m) with | Some x -> (x :?> TyconRef) - | None -> + | None -> let tref = GetILTypeRefOfProvidedType (st, m) ImportILTypeRef env m tref /// Import a provided type as an AbstractIL type -let rec ImportProvidedTypeAsILType (env: ImportMap) (m: range) (st: Tainted) = +let rec ImportProvidedTypeAsILType (env: ImportMap) (m: range) (st: Tainted) = if st.PUntaint ((fun x -> x.IsVoid), m) then ILType.Void elif st.PUntaint((fun st -> st.IsGenericParameter), m) then mkILTyvarTy (uint16 (st.PUntaint((fun st -> st.GenericParameterPosition), m))) - elif st.PUntaint((fun st -> st.IsArray), m) then + elif st.PUntaint((fun st -> st.IsArray), m) then let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()), m)) ILType.Array(ILArrayShape.FromRank (st.PUntaint((fun st -> st.GetArrayRank()), m)), et) - elif st.PUntaint((fun st -> st.IsByRef), m) then + elif st.PUntaint((fun st -> st.IsByRef), m) then let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()), m)) ILType.Byref et - elif st.PUntaint((fun st -> st.IsPointer), m) then + elif st.PUntaint((fun st -> st.IsPointer), m) then let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()), m)) ILType.Ptr et else - let gst, genericArgs = - if st.PUntaint((fun st -> st.IsGenericType), m) then - let args = st.PApplyArray((fun st -> st.GetGenericArguments()), "GetGenericArguments", m) |> Array.map (ImportProvidedTypeAsILType env m) |> List.ofArray + let gst, genericArgs = + if st.PUntaint((fun st -> st.IsGenericType), m) then + let args = st.PApplyArray((fun st -> st.GetGenericArguments()), "GetGenericArguments", m) |> Array.map (ImportProvidedTypeAsILType env m) |> List.ofArray let gst = st.PApply((fun st -> st.GetGenericTypeDefinition()), m) gst, args - else + else st, [] let tref = GetILTypeRefOfProvidedType (gst, m) let tcref = ImportProvidedNamedType env m gst let tps = tcref.Typars m - if tps.Length <> genericArgs.Length then + if tps.Length <> genericArgs.Length then error(Error(FSComp.SR.impInvalidNumberOfGenericArguments(tcref.CompiledName, tps.Length, genericArgs.Length), m)) // We're converting to an IL type, where generic arguments are erased let genericArgs = List.zip tps genericArgs |> List.filter (fun (tp, _) -> not tp.IsErased) |> List.map snd let tspec = mkILTySpec(tref, genericArgs) - if st.PUntaint((fun st -> st.IsValueType), m) then - ILType.Value tspec - else + if st.PUntaint((fun st -> st.IsValueType), m) then + ILType.Value tspec + else mkILBoxedType tspec /// Import a provided type as an F# type. -let rec ImportProvidedType (env: ImportMap) (m: range) (* (tinst: TypeInst) *) (st: Tainted) = +let rec ImportProvidedType (env: ImportMap) (m: range) (* (tinst: TypeInst) *) (st: Tainted) = - // Explanation: The two calls below represent am unchecked invariant of the hosted compiler: - // that type providers are only activated on the CompilationThread. This invariant is not currently checked + // Explanation: The two calls below represent am unchecked invariant of the hosted compiler: + // that type providers are only activated on the CompilationThread. This invariant is not currently checked // via CompilationThreadToken passing. We leave the two calls below as a reminder of this. // - // This function is one major source of type provider activations, but not the only one: almost + // This function is one major source of type provider activations, but not the only one: almost // any call in the 'TypeProviders' module is a potential type provider activation. let ctok = AssumeCompilationThreadWithoutEvidence () RequireCompilationThread ctok let g = env.g - if st.PUntaint((fun st -> st.IsArray), m) then + if st.PUntaint((fun st -> st.IsArray), m) then let elemTy = ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()), m)) - mkArrayTy g (st.PUntaint((fun st -> st.GetArrayRank()), m)) elemTy m - elif st.PUntaint((fun st -> st.IsByRef), m) then + // TODO Nullness - integration into type providers as a separate feature for later. + let nullness = Nullness.knownAmbivalent + mkArrayTy g (st.PUntaint((fun st -> st.GetArrayRank()), m)) nullness elemTy m + elif st.PUntaint((fun st -> st.IsByRef), m) then let elemTy = ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()), m)) mkByrefTy g elemTy - elif st.PUntaint((fun st -> st.IsPointer), m) then + elif st.PUntaint((fun st -> st.IsPointer), m) then let elemTy = ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()), m)) - if isUnitTy g elemTy || isVoidTy g elemTy && g.voidptr_tcr.CanDeref then - mkVoidPtrTy g + if isUnitTy g elemTy || isVoidTy g elemTy && g.voidptr_tcr.CanDeref then + mkVoidPtrTy g else mkNativePtrTy g elemTy else // REVIEW: Extension type could try to be its own generic arg (or there could be a type loop) - let tcref, genericArgs = - if st.PUntaint((fun st -> st.IsGenericType), m) then + let tcref, genericArgs = + if st.PUntaint((fun st -> st.IsGenericType), m) then let tcref = ImportProvidedNamedType env m (st.PApply((fun st -> st.GetGenericTypeDefinition()), m)) - let args = st.PApplyArray((fun st -> st.GetGenericArguments()), "GetGenericArguments", m) |> Array.map (ImportProvidedType env m (* tinst *) ) |> List.ofArray + let args = st.PApplyArray((fun st -> st.GetGenericArguments()), "GetGenericArguments", m) |> Array.map (ImportProvidedType env m (* tinst *) ) |> List.ofArray tcref, args - else + else let tcref = ImportProvidedNamedType env m st - tcref, [] - + tcref, [] + let genericArgsLength = genericArgs.Length - /// Adjust for the known primitive numeric types that accept units of measure. + /// Adjust for the known primitive numeric types that accept units of measure. let tcref = if genericArgsLength = 1 then // real @@ -335,22 +545,22 @@ let rec ImportProvidedType (env: ImportMap) (m: range) (* (tinst: TypeInst) *) ( tcref let tps = tcref.Typars m - if tps.Length <> genericArgsLength then + if tps.Length <> genericArgsLength then error(Error(FSComp.SR.impInvalidNumberOfGenericArguments(tcref.CompiledName, tps.Length, genericArgsLength), m)) - let genericArgs = - (tps, genericArgs) ||> List.map2 (fun tp genericArg -> - if tp.Kind = TyparKind.Measure then - let rec conv ty = - match ty with + let genericArgs = + (tps, genericArgs) ||> List.map2 (fun tp genericArg -> + if tp.Kind = TyparKind.Measure then + let rec conv ty = + match ty with | TType_app (tcref, [ty1;ty2], _) when tyconRefEq g tcref g.measureproduct_tcr -> Measure.Prod (conv ty1, conv ty2) | TType_app (tcref, [ty1], _) when tyconRefEq g tcref g.measureinverse_tcr -> Measure.Inv (conv ty1) - | TType_app (tcref, [], _) when tyconRefEq g tcref g.measureone_tcr -> Measure.One + | TType_app (tcref, [], _) when tyconRefEq g tcref g.measureone_tcr -> Measure.One | TType_app (tcref, [], _) when tcref.TypeOrMeasureKind = TyparKind.Measure -> Measure.Const tcref - | TType_app (tcref, _, _) -> + | TType_app (tcref, _, _) -> errorR(Error(FSComp.SR.impInvalidMeasureArgument1(tcref.CompiledName, tp.Name), m)) Measure.One - | _ -> + | _ -> errorR(Error(FSComp.SR.impInvalidMeasureArgument2(tp.Name), m)) Measure.One @@ -358,84 +568,88 @@ let rec ImportProvidedType (env: ImportMap) (m: range) (* (tinst: TypeInst) *) ( else genericArg) - ImportTyconRefApp env tcref genericArgs + // TODO Nullness - integration into type providers as a separate feature for later. + let nullness = Nullness.knownAmbivalent + + ImportTyconRefApp env tcref genericArgs nullness /// Import a provided method reference as an Abstract IL method reference -let ImportProvidedMethodBaseAsILMethodRef (env: ImportMap) (m: range) (mbase: Tainted) = +let ImportProvidedMethodBaseAsILMethodRef (env: ImportMap) (m: range) (mbase: Tainted) = let tref = GetILTypeRefOfProvidedType (mbase.PApply((fun mbase -> nonNull mbase.DeclaringType), m), m) - let mbase = + let mbase = // Find the formal member corresponding to the called member - match mbase.OfType() with - | Some minfo when - minfo.PUntaint((fun minfo -> minfo.IsGenericMethod|| (nonNull minfo.DeclaringType).IsGenericType), m) -> + match mbase.OfType() with + | Some minfo when + minfo.PUntaint((fun minfo -> minfo.IsGenericMethod|| (nonNull minfo.DeclaringType).IsGenericType), m) -> let declaringType = minfo.PApply((fun minfo -> nonNull minfo.DeclaringType), m) - let declaringGenericTypeDefn = - if declaringType.PUntaint((fun t -> t.IsGenericType), m) then + let declaringGenericTypeDefn = + if declaringType.PUntaint((fun t -> t.IsGenericType), m) then declaringType.PApply((fun declaringType -> declaringType.GetGenericTypeDefinition()), m) - else + else declaringType - let methods = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetMethods()), "GetMethods", m) + let methods = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetMethods()), "GetMethods", m) let metadataToken = minfo.PUntaint((fun minfo -> minfo.MetadataToken), m) - let found = methods |> Array.tryFind (fun x -> x.PUntaint((fun x -> x.MetadataToken), m) = metadataToken) + let found = methods |> Array.tryFind (fun x -> x.PUntaint((fun x -> x.MetadataToken), m) = metadataToken) match found with | Some found -> found.Coerce(m) - | None -> + | None -> let methodName = minfo.PUntaint((fun minfo -> minfo.Name), m) let typeName = declaringGenericTypeDefn.PUntaint((fun declaringGenericTypeDefn -> declaringGenericTypeDefn.FullName), m) error(Error(FSComp.SR.etIncorrectProvidedMethod(DisplayNameOfTypeProvider(minfo.TypeProvider, m), methodName, metadataToken, typeName), m)) - | _ -> - match mbase.OfType() with - | Some cinfo when cinfo.PUntaint((fun x -> (nonNull x.DeclaringType).IsGenericType), m) -> + | _ -> + match mbase.OfType() with + | Some cinfo when cinfo.PUntaint((fun x -> (nonNull x.DeclaringType).IsGenericType), m) -> let declaringType = cinfo.PApply((fun x -> nonNull x.DeclaringType), m) let declaringGenericTypeDefn = declaringType.PApply((fun x -> x.GetGenericTypeDefinition()), m) // We have to find the uninstantiated formal signature corresponding to this instantiated constructor. // Annoyingly System.Reflection doesn't give us a MetadataToken to compare on, so we have to look by doing // the instantiation and comparing.. - let found = - let ctors = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetConstructors()), "GetConstructors", m) + let found = + let ctors = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetConstructors()), "GetConstructors", m) - let actualParamTys = + let actualParamTys = [ for p in cinfo.PApplyArray((fun x -> x.GetParameters()), "GetParameters", m) do ImportProvidedType env m (p.PApply((fun p -> p.ParameterType), m)) ] let actualGenericArgs = argsOfAppTy env.g (ImportProvidedType env m declaringType) - ctors |> Array.tryFind (fun ctor -> - let formalParamTysAfterInst = + ctors |> Array.tryFind (fun ctor -> + let formalParamTysAfterInst = [ for p in ctor.PApplyArray((fun x -> x.GetParameters()), "GetParameters", m) do let ilFormalTy = ImportProvidedTypeAsILType env m (p.PApply((fun p -> p.ParameterType), m)) + // TODO Nullness - integration into type providers as a separate feature for later. yield ImportILType env m actualGenericArgs ilFormalTy ] (formalParamTysAfterInst, actualParamTys) ||> List.lengthsEqAndForall2 (typeEquiv env.g)) - + match found with | Some found -> found.Coerce(m) - | None -> + | None -> let typeName = declaringGenericTypeDefn.PUntaint((fun x -> x.FullName), m) error(Error(FSComp.SR.etIncorrectProvidedConstructor(DisplayNameOfTypeProvider(cinfo.TypeProvider, m), typeName), m)) | _ -> mbase - let retTy = - match mbase.OfType() with + let retTy = + match mbase.OfType() with | Some minfo -> minfo.PApply((fun minfo -> minfo.ReturnType), m) | None -> match mbase.OfType() with | Some _ -> mbase.PApply((fun _ -> ProvidedType.Void), m) | _ -> failwith "ImportProvidedMethodBaseAsILMethodRef - unexpected" - let genericArity = - if mbase.PUntaint((fun x -> x.IsGenericMethod), m) then + let genericArity = + if mbase.PUntaint((fun x -> x.IsGenericMethod), m) then mbase.PUntaint((fun x -> x.GetGenericArguments().Length), m) else 0 let callingConv = (if mbase.PUntaint((fun x -> x.IsStatic), m) then ILCallingConv.Static else ILCallingConv.Instance) - let ilParamTys = + let ilParamTys = [ for p in mbase.PApplyArray((fun x -> x.GetParameters()), "GetParameters", m) do yield ImportProvidedTypeAsILType env m (p.PApply((fun p -> p.ParameterType), m)) ] @@ -448,25 +662,39 @@ let ImportProvidedMethodBaseAsILMethodRef (env: ImportMap) (m: range) (mbase: Ta // Load an IL assembly into the compiler's internal data structures // Careful use is made of laziness here to ensure we don't read the entire IL // assembly on startup. -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- /// Import a set of Abstract IL generic parameter specifications as a list of new -/// F# generic parameters. -/// +/// F# generic parameters. +/// /// Fixup the constraints so that any references to the generic parameters /// in the constraints now refer to the new generic parameters. -let ImportILGenericParameters amap m scoref tinst (gps: ILGenericParameterDefs) = - match gps with +let ImportILGenericParameters amap m scoref tinst (nullableFallback:Nullness.NullableContextSource) (gps: ILGenericParameterDefs) = + match gps with | [] -> [] - | _ -> + | _ -> let amap : ImportMap = amap() - let tps = gps |> List.map (fun gp -> Construct.NewRigidTypar gp.Name m) + let tps = gps |> List.map (fun gp -> Construct.NewRigidTypar gp.Name m) let tptys = tps |> List.map mkTyparTy let importInst = tinst@tptys - (tps, gps) ||> List.iter2 (fun tp gp -> - let constraints = - [ if gp.CustomAttrs |> TryFindILAttribute amap.g.attrib_IsUnmanagedAttribute then + (tps, gps) ||> List.iter2 (fun tp gp -> + if gp.Variance = ILGenericVariance.ContraVariant then + tp.MarkAsContravariant() + let constraints = + [ + if amap.g.langFeatureNullness && amap.g.checkNullness then + let nullness = + { Nullness.DirectAttributes = Nullness.AttributesFromIL(gp.MetadataIndex,gp.CustomAttrsStored) + Nullness.Fallback = nullableFallback } + + match nullness.GetFlags(amap.g) with + | [|1uy|] -> TyparConstraint.NotSupportsNull(m) + // In F#, 'SupportsNull' has the meaning of "must support null as a value". In C#, Nullable(2) is an allowance, not a requirement. + //| [|2uy|] -> TyparConstraint.SupportsNull(m) + | _ -> () + + if gp.CustomAttrs |> TryFindILAttribute amap.g.attrib_IsUnmanagedAttribute then TyparConstraint.IsUnmanaged(m) if gp.HasDefaultConstructorConstraint then TyparConstraint.RequiresDefaultConstructor(m) @@ -474,30 +702,32 @@ let ImportILGenericParameters amap m scoref tinst (gps: ILGenericParameterDefs) TyparConstraint.IsNonNullableStruct(m) if gp.HasReferenceTypeConstraint then TyparConstraint.IsReferenceType(m) + if gp.HasAllowsRefStruct then + TyparConstraint.AllowsRefStruct(m) for ilTy in gp.Constraints do - TyparConstraint.CoercesTo(ImportILType amap m importInst (rescopeILType scoref ilTy), m) ] + TyparConstraint.CoercesTo(ImportILType amap m importInst (rescopeILType scoref ilTy), m) ] tp.SetConstraints constraints) tps /// Given a list of items each keyed by an ordered list of keys, apply 'nodef' to the each group -/// with the same leading key. Apply 'tipf' to the elements where the keylist is empty, and return -/// the overall results. Used to bucket types, so System.Char and System.Collections.Generic.List +/// with the same leading key. Apply 'tipf' to the elements where the keylist is empty, and return +/// the overall results. Used to bucket types, so System.Char and System.Collections.Generic.List /// both get initially bucketed under 'System'. -let multisetDiscriminateAndMap nodef tipf (items: ('Key list * 'Value) list) = - // Find all the items with an empty key list and call 'tipf' - let tips = - [ for keylist, v in items do - match keylist with +let multisetDiscriminateAndMap nodef tipf (items: ('Key list * 'Value) list) = + // Find all the items with an empty key list and call 'tipf' + let tips = + [ for keylist, v in items do + match keylist with | [] -> yield tipf v | _ -> () ] // Find all the items with a non-empty key list. Bucket them together by // the first key. For each bucket, call 'nodef' on that head key and the bucket. - let nodes = + let nodes = let buckets = Dictionary<_, _>(10) for keylist, v in items do - match keylist with + match keylist with | [] -> () | key :: rest -> buckets[key] <- @@ -511,47 +741,49 @@ let multisetDiscriminateAndMap nodef tipf (items: ('Key list * 'Value) list) = /// Import an IL type definition as a new F# TAST Entity node. let rec ImportILTypeDef amap m scoref (cpath: CompilationPath) enc nm (tdef: ILTypeDef) = - let lazyModuleOrNamespaceTypeForNestedTypes = + let lazyModuleOrNamespaceTypeForNestedTypes = InterruptibleLazy(fun _ -> let cpath = cpath.NestedCompPath nm ModuleOrType ImportILTypeDefs amap m scoref cpath (enc@[tdef]) tdef.NestedTypes ) - // Add the type itself. - Construct.NewILTycon - (Some cpath) - (nm, m) + let nullableFallback = Nullness.FromClass(Nullness.AttributesFromIL(tdef.MetadataIndex,tdef.CustomAttrsStored)) + + // Add the type itself. + Construct.NewILTycon + (Some cpath) + (nm, m) // The read of the type parameters may fail to resolve types. We pick up a new range from the point where that read is forced // Make sure we reraise the original exception one occurs - see findOriginalException. - (LazyWithContext.Create((fun m -> ImportILGenericParameters amap m scoref [] tdef.GenericParams), findOriginalException)) - (scoref, enc, tdef) + (LazyWithContext.Create((fun m -> ImportILGenericParameters amap m scoref [] nullableFallback tdef.GenericParams), findOriginalException)) + (scoref, enc, tdef) (MaybeLazy.Lazy lazyModuleOrNamespaceTypeForNestedTypes) - + /// Import a list of (possibly nested) IL types as a new ModuleOrNamespaceType node /// containing new entities, bucketing by namespace along the way. and ImportILTypeDefList amap m (cpath: CompilationPath) enc items = // Split into the ones with namespaces and without. Add the ones with namespaces in buckets. - // That is, discriminate based in the first element of the namespace list (e.g. "System") + // That is, discriminate based in the first element of the namespace list (e.g. "System") // and, for each bag, fold-in a lazy computation to add the types under that bag . // // nodef - called for each bucket, where 'n' is the head element of the namespace used // as a key in the discrimination, tgs is the remaining descriptors. We create an entity for 'n'. // - // tipf - called if there are no namespace items left to discriminate on. - let entities = - items - |> multisetDiscriminateAndMap + // tipf - called if there are no namespace items left to discriminate on. + let entities = + items + |> multisetDiscriminateAndMap (fun n tgs -> let modty = InterruptibleLazy(fun _ -> ImportILTypeDefList amap m (cpath.NestedCompPath n (Namespace true)) enc tgs) Construct.NewModuleOrNamespace (Some cpath) taccessPublic (mkSynId m n) XmlDoc.Empty [] (MaybeLazy.Lazy modty)) - (fun (n, info: InterruptibleLazy<_>) -> + (fun (n, info: InterruptibleLazy<_>) -> let (scoref2, lazyTypeDef: ILPreTypeDef) = info.Force() ImportILTypeDef amap m scoref2 cpath enc n (lazyTypeDef.GetTypeDef())) let kind = match enc with [] -> Namespace true | _ -> ModuleOrType Construct.NewModuleOrNamespaceType kind entities [] - + /// Import a table of IL types as a ModuleOrNamespaceType. /// and ImportILTypeDefs amap m scoref cpath enc (tdefs: ILTypeDefs) = @@ -565,49 +797,49 @@ and ImportILTypeDefs amap m scoref cpath enc (tdefs: ILTypeDefs) = /// /// Example: for a collection of types "System.Char", "System.Int32" and "Library.C" /// the return ModuleOrNamespaceType will contain namespace entities for "System" and "Library", which in turn contain -/// type definition entities for ["Char"; "Int32"] and ["C"] respectively. -let ImportILAssemblyMainTypeDefs amap m scoref modul = - modul.TypeDefs |> ImportILTypeDefs amap m scoref (CompPath(scoref, [])) [] +/// type definition entities for ["Char"; "Int32"] and ["C"] respectively. +let ImportILAssemblyMainTypeDefs amap m scoref modul = + modul.TypeDefs |> ImportILTypeDefs amap m scoref (CompPath(scoref, SyntaxAccess.Unknown, [])) [] -/// Import the "exported types" table for multi-module assemblies. -let ImportILAssemblyExportedType amap m auxModLoader (scoref: ILScopeRef) (exportedType: ILExportedTypeOrForwarder) = +/// Import the "exported types" table for multi-module assemblies. +let ImportILAssemblyExportedType amap m auxModLoader (scoref: ILScopeRef) (exportedType: ILExportedTypeOrForwarder) = // Forwarders are dealt with separately in the ref->def dereferencing logic in tast.fs as they effectively give rise to type equivalences - if exportedType.IsForwarder then + if exportedType.IsForwarder then [] else let ns, n = splitILTypeName exportedType.Name let info = InterruptibleLazy (fun _ -> - match - (try + match + (try let modul = auxModLoader exportedType.ScopeRef let ptd = mkILPreTypeDefComputed (ns, n, (fun () -> modul.TypeDefs.FindByName exportedType.Name)) Some ptd with :? KeyNotFoundException -> None) - with - | None -> + with + | None -> error(Error(FSComp.SR.impReferenceToDllRequiredByAssembly(exportedType.ScopeRef.QualifiedName, scoref.QualifiedName, exportedType.Name), m)) - | Some preTypeDef -> + | Some preTypeDef -> scoref, preTypeDef ) - [ ImportILTypeDefList amap m (CompPath(scoref, [])) [] [(ns, (n, info))] ] + [ ImportILTypeDefList amap m (CompPath(scoref, SyntaxAccess.Unknown, [])) [] [(ns, (n, info))] ] -/// Import the "exported types" table for multi-module assemblies. -let ImportILAssemblyExportedTypes amap m auxModLoader scoref (exportedTypes: ILExportedTypesAndForwarders) = - [ for exportedType in exportedTypes.AsList() do +/// Import the "exported types" table for multi-module assemblies. +let ImportILAssemblyExportedTypes amap m auxModLoader scoref (exportedTypes: ILExportedTypesAndForwarders) = + [ for exportedType in exportedTypes.AsList() do yield! ImportILAssemblyExportedType amap m auxModLoader scoref exportedType ] -/// Import both the main type definitions and the "exported types" table, i.e. all the +/// Import both the main type definitions and the "exported types" table, i.e. all the /// types defined in an IL assembly. -let ImportILAssemblyTypeDefs (amap, m, auxModLoader, aref, mainmod: ILModuleDef) = +let ImportILAssemblyTypeDefs (amap, m, auxModLoader, aref, mainmod: ILModuleDef) = let scoref = ILScopeRef.Assembly aref let mtypsForExportedTypes = ImportILAssemblyExportedTypes amap m auxModLoader scoref mainmod.ManifestOfAssembly.ExportedTypes let mainmod = ImportILAssemblyMainTypeDefs amap m scoref mainmod CombineCcuContentFragments (mainmod :: mtypsForExportedTypes) /// Import the type forwarder table for an IL assembly -let ImportILAssemblyTypeForwarders (amap, m, exportedTypes: ILExportedTypesAndForwarders): CcuTypeForwarderTable = +let ImportILAssemblyTypeForwarders (amap, m, exportedTypes: ILExportedTypesAndForwarders): CcuTypeForwarderTable = let rec addToTree tree path item value = match path with | [] -> @@ -660,22 +892,22 @@ let ImportILAssemblyTypeForwarders (amap, m, exportedTypes: ILExportedTypesAndFo |> addNested exportedType exportedType.Nested [yield! ns; yield n] ) |> fun root -> { Root = root } - + /// Import an IL assembly as a new TAST CCU -let ImportILAssembly(amap: unit -> ImportMap, m, auxModuleLoader, xmlDocInfoLoader: IXmlDocumentationInfoLoader option, ilScopeRef, sourceDir, fileName, ilModule: ILModuleDef, invalidateCcu: IEvent) = +let ImportILAssembly(amap: unit -> ImportMap, m, auxModuleLoader, xmlDocInfoLoader: IXmlDocumentationInfoLoader option, ilScopeRef, sourceDir, fileName, ilModule: ILModuleDef, invalidateCcu: IEvent) = invalidateCcu |> ignore - let aref = - match ilScopeRef with - | ILScopeRef.Assembly aref -> aref + let aref = + match ilScopeRef with + | ILScopeRef.Assembly aref -> aref | _ -> error(InternalError("ImportILAssembly: cannot reference .NET netmodules directly, reference the containing assembly instead", m)) let nm = aref.Name let mty = ImportILAssemblyTypeDefs(amap, m, auxModuleLoader, aref, ilModule) - let forwarders = - match ilModule.Manifest with + let forwarders = + match ilModule.Manifest with | None -> CcuTypeForwarderTable.Empty | Some manifest -> ImportILAssemblyTypeForwarders(amap, m, manifest.ExportedTypes) - let ccuData: CcuData = + let ccuData: CcuData = { IsFSharp=false UsesFSharp20PlusQuotations=false #if !NO_TYPEPROVIDERS @@ -684,20 +916,20 @@ let ImportILAssembly(amap: unit -> ImportMap, m, auxModuleLoader, xmlDocInfoLoad ImportProvidedType = (fun ty -> ImportProvidedType (amap()) m ty) #endif QualifiedName= Some ilScopeRef.QualifiedName - Contents = Construct.NewCcuContents ilScopeRef m nm mty + Contents = Construct.NewCcuContents ilScopeRef m nm mty ILScopeRef = ilScopeRef Stamp = newStamp() - SourceCodeDirectory = sourceDir // note: not an accurate value, but IL assemblies don't give us this information in any attributes. + SourceCodeDirectory = sourceDir // note: not an accurate value, but IL assemblies don't give us this information in any attributes. FileName = fileName MemberSignatureEquality= (fun ty1 ty2 -> typeEquivAux EraseAll (amap()).g ty1 ty2) TryGetILModuleDef = (fun () -> Some ilModule) TypeForwarders = forwarders - XmlDocumentationInfo = + XmlDocumentationInfo = match xmlDocInfoLoader, fileName with | Some xmlDocInfoLoader, Some fileName -> xmlDocInfoLoader.TryLoad(fileName) | _ -> None } - + CcuThunk.Create(nm, ccuData) //------------------------------------------------------------------------- @@ -705,9 +937,20 @@ let ImportILAssembly(amap: unit -> ImportMap, m, auxModuleLoader, xmlDocInfoLoad //------------------------------------------------------------------------- /// Import an IL type as an F# type. importInst gives the context for interpreting type variables. -let RescopeAndImportILType scoref amap m importInst ilTy = - ilTy |> rescopeILType scoref |> ImportILType amap m importInst +let RescopeAndImportILTypeSkipNullness scoref amap m importInst ilTy = + ilTy |> rescopeILType scoref |> ImportILType amap m importInst + +let RescopeAndImportILType scoref (amap:ImportMap) m importInst (nullnessSource:Nullness.NullableAttributesSource) ilTy = + let g = amap.g + if g.langFeatureNullness && g.checkNullness then + let flags = nullnessSource.GetFlags(g) + let flags = {Nullness.NullableFlags.Data = flags; Nullness.NullableFlags.Idx = 0} + let struct(ty,_) = ilTy |> rescopeILType scoref |> ImportILTypeWithNullness amap m importInst flags + ty + else + RescopeAndImportILTypeSkipNullness scoref amap m importInst ilTy + + let CanRescopeAndImportILType scoref amap m ilTy = ilTy |> rescopeILType scoref |> CanImportILType amap m - diff --git a/src/fcs-fable/src/Compiler/Checking/import.fsi b/src/fcs-fable/src/Compiler/Checking/import.fsi index 830fd81b12..001f936798 100644 --- a/src/fcs-fable/src/Compiler/Checking/import.fsi +++ b/src/fcs-fable/src/Compiler/Checking/import.fsi @@ -10,6 +10,8 @@ open FSharp.Compiler.Text open FSharp.Compiler.Xml open FSharp.Compiler.TypedTree +open System.Collections.Concurrent + #if !NO_TYPEPROVIDERS open FSharp.Compiler.TypeProviders #endif @@ -35,6 +37,26 @@ type AssemblyLoader = abstract RecordGeneratedTypeRoot: ProviderGeneratedType -> unit #endif +[] +type CanCoerce = + | CanCoerce + | NoCoerce + +[] +type TTypeCacheKey = + interface System.IEquatable + private new: ty1: TType * ty2: TType * canCoerce: CanCoerce * tcGlobals: TcGlobals -> TTypeCacheKey + + static member FromStrippedTypes: + ty1: TType * ty2: TType * canCoerce: CanCoerce * tcGlobals: TcGlobals -> TTypeCacheKey + + val ty1: TType + val ty2: TType + val canCoerce: CanCoerce + val tcGlobals: TcGlobals + override Equals: other: obj -> bool + override GetHashCode: unit -> int + /// Represents a context used for converting AbstractIL .NET and provided types to F# internal compiler data structures. /// Also cache the conversion of AbstractIL ILTypeRef nodes, based on hashes of these. /// @@ -51,6 +73,29 @@ type ImportMap = /// The TcGlobals for the import context member g: TcGlobals + /// Type subsumption cache + member TypeSubsumptionCache: ConcurrentDictionary + +module Nullness = + + [] + type AttributesFromIL = + | AttributesFromIL of metadataIndex: int * attrs: ILAttributesStored + + member Read: unit -> ILAttributes + + [] + type NullableContextSource = + | FromClass of AttributesFromIL + | FromMethodAndClass of methodAttrs: AttributesFromIL * classAttrs: AttributesFromIL + + [] + type NullableAttributesSource = + { DirectAttributes: AttributesFromIL + Fallback: NullableContextSource } + + static member Empty: NullableAttributesSource + /// Import a reference to a type definition, given an AbstractIL ILTypeRef, with caching val internal ImportILTypeRef: ImportMap -> range -> ILTypeRef -> TyconRef @@ -79,7 +124,13 @@ val internal ImportProvidedMethodBaseAsILMethodRef: ImportMap -> range -> Tainte /// Import a set of Abstract IL generic parameter specifications as a list of new F# generic parameters. val internal ImportILGenericParameters: - (unit -> ImportMap) -> range -> ILScopeRef -> TType list -> ILGenericParameterDef list -> Typar list + (unit -> ImportMap) -> + range -> + ILScopeRef -> + TType list -> + Nullness.NullableContextSource -> + ILGenericParameterDef list -> + Typar list /// Import an IL assembly as a new TAST CCU val internal ImportILAssembly: @@ -100,7 +151,19 @@ val internal ImportILAssemblyTypeForwarders: /// Import an IL type as an F# type, first rescoping to view the metadata from the current assembly /// being compiled. importInst gives the context for interpreting type variables. -val RescopeAndImportILType: +/// This function fully skips the 'nullness checking' metadata flags. +val RescopeAndImportILTypeSkipNullness: scoref: ILScopeRef -> amap: ImportMap -> m: range -> importInst: TType list -> ilTy: ILType -> TType +/// Import an IL type as an F# type, first rescoping to view the metadata from the current assembly +/// being compiled. importInst gives the context for interpreting type variables. +val RescopeAndImportILType: + scoref: ILScopeRef -> + amap: ImportMap -> + m: range -> + importInst: TType list -> + nullnessSource: Nullness.NullableAttributesSource -> + ilTy: ILType -> + TType + val CanRescopeAndImportILType: scoref: ILScopeRef -> amap: ImportMap -> m: range -> ilTy: ILType -> bool diff --git a/src/fcs-fable/src/Compiler/Checking/infos.fs b/src/fcs-fable/src/Compiler/Checking/infos.fs index d9e886c070..666963ac6f 100644 --- a/src/fcs-fable/src/Compiler/Checking/infos.fs +++ b/src/fcs-fable/src/Compiler/Checking/infos.fs @@ -9,6 +9,7 @@ open FSharp.Compiler open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Import +open FSharp.Compiler.Import.Nullness open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.TcGlobals @@ -206,7 +207,7 @@ type OptionalArgInfo = if isByrefTy g ty then let ty = destByrefTy g ty PassByRef (ty, analyze ty) - elif isObjTy g ty then + elif isObjTyAnyNullness g ty then match ilParam.Marshal with | Some(ILNativeType.IUnknown | ILNativeType.IDispatch | ILNativeType.Interface) -> Constant ILFieldInit.Null | _ -> @@ -216,7 +217,8 @@ type OptionalArgInfo = else MissingValue else DefaultValue - CallerSide (analyze (ImportILTypeFromMetadata amap m ilScope ilTypeInst [] ilParam.Type)) + // See above - the type is imported only in order to be analyzed for optional default value, nullness is irrelevant here. + CallerSide (analyze (ImportILTypeFromMetadataSkipNullness amap m ilScope ilTypeInst [] ilParam.Type)) | Some v -> CallerSide (Constant v) else @@ -294,7 +296,7 @@ let CrackParamAttribsInfo g (ty: TType, argInfo: ArgReprInfo) = | None -> // Do a type-directed analysis of the type to determine the default value to pass. // Similar rules as OptionalArgInfo.FromILParameter are applied here, except for the COM and byref-related stuff. - CallerSide (if isObjTy g ty then MissingValue else DefaultValue) + CallerSide (if isObjTyAnyNullness g ty then MissingValue else DefaultValue) | Some attr -> let defaultValue = OptionalArgInfo.ValueOfDefaultParameterValueAttrib attr match defaultValue with @@ -325,7 +327,7 @@ let CrackParamAttribsInfo g (ty: TType, argInfo: ArgReprInfo) = | false, true, true -> match TryFindFSharpAttribute g g.attrib_CallerMemberNameAttribute argInfo.Attribs with | Some(Attrib(_, _, _, _, _, _, callerMemberNameAttributeRange)) -> - warning(Error(FSComp.SR.CallerMemberNameIsOverriden(argInfo.Name.Value.idText), callerMemberNameAttributeRange)) + warning(Error(FSComp.SR.CallerMemberNameIsOverridden(argInfo.Name.Value.idText), callerMemberNameAttributeRange)) CallerFilePath | _ -> failwith "Impossible" | _, _, _ -> @@ -342,12 +344,12 @@ let CrackParamAttribsInfo g (ty: TType, argInfo: ArgReprInfo) = type ILFieldInit with /// Compute the ILFieldInit for the given provided constant value for a provided enum type. - static member FromProvidedObj m (v: obj) = + static member FromProvidedObj m (v: obj MaybeNull) = match v with | Null -> ILFieldInit.Null | NonNull v -> let objTy = v.GetType() - let v = if objTy.IsEnum then objTy.GetField("value__").GetValue v else v + let v = if objTy.IsEnum then !!(!!objTy.GetField("value__")).GetValue v else v match v with | :? single as i -> ILFieldInit.Single i | :? double as i -> ILFieldInit.Double i @@ -362,7 +364,9 @@ type ILFieldInit with | :? uint32 as i -> ILFieldInit.UInt32 i | :? int64 as i -> ILFieldInit.Int64 i | :? uint64 as i -> ILFieldInit.UInt64 i - | _ -> error(Error(FSComp.SR.infosInvalidProvidedLiteralValue(try v.ToString() with _ -> "?"), m)) + | _ -> + let txt = match v with | null -> "?" | v -> try !!v.ToString() with _ -> "?" + error(Error(FSComp.SR.infosInvalidProvidedLiteralValue(txt), m)) /// Compute the OptionalArgInfo for a provided parameter. @@ -380,7 +384,7 @@ let OptionalArgInfoOfProvidedParameter (amap: ImportMap) m (provParam : Tainted< if isByrefTy g ty then let ty = destByrefTy g ty PassByRef (ty, analyze ty) - elif isObjTy g ty then MissingValue + elif isObjTyAnyNullness g ty then MissingValue else DefaultValue let paramTy = ImportProvidedType amap m (provParam.PApply((fun p -> p.ParameterType), m)) @@ -394,8 +398,8 @@ let OptionalArgInfoOfProvidedParameter (amap: ImportMap) m (provParam : Tainted< /// Compute the ILFieldInit for the given provided constant value for a provided enum type. let GetAndSanityCheckProviderMethod m (mi: Tainted<'T :> ProvidedMemberInfo>) (get : 'T -> ProvidedMethodInfo MaybeNull) err = match mi.PApply((fun mi -> (get mi :> ProvidedMethodBase MaybeNull)),m) with - | Tainted.Null -> error(Error(err(mi.PUntaint((fun mi -> mi.Name),m),mi.PUntaint((fun mi -> (nonNull mi.DeclaringType).Name), m)), m)) // TODO NULLNESS: type isntantiation should not be needed - | meth -> meth + | Tainted.Null -> error(Error(err(mi.PUntaint((fun mi -> mi.Name),m),mi.PUntaint((fun mi -> (nonNull mi.DeclaringType).Name), m)), m)) + | Tainted.NonNull meth -> meth /// Try to get an arbitrary ProvidedMethodInfo associated with a property. let ArbitraryMethodInfoOfPropertyInfo (pi: Tainted) m = @@ -447,6 +451,10 @@ type ILTypeInfo = let (ILTypeInfo(g, ty, tref, tdef)) = x ILTypeInfo(g, instType inst ty, tref, tdef) + member x.NullableAttributes = AttributesFromIL(x.RawMetadata.MetadataIndex,x.RawMetadata.CustomAttrsStored) + + member x.NullableClassSource = FromClass(x.NullableAttributes) + static member FromType g ty = if isAnyTupleTy g ty then // When getting .NET metadata for the properties and methods @@ -463,7 +471,17 @@ type ILTypeInfo = let tref = mkRefForNestedILTypeDef scoref (enc, tdef) ILTypeInfo(g, ty, tref, tdef) else - failwith "ILTypeInfo.FromType - no IL metadata for type" + failwith ("ILTypeInfo.FromType - no IL metadata for type" + System.Environment.StackTrace) + +[] +type ILMethParentTypeInfo = + | IlType of ILTypeInfo + | CSharpStyleExtension of declaring:TyconRef * apparent:TType + + member x.ToType = + match x with + | IlType x -> x.ToType + | CSharpStyleExtension(apparent=x) -> x /// Describes an F# use of an IL method. [] @@ -472,32 +490,38 @@ type ILMethInfo = /// /// If ilDeclaringTyconRefOpt is 'Some' then this is an F# use of an C#-style extension method. /// If ilDeclaringTyconRefOpt is 'None' then ilApparentType is an IL type definition. - | ILMethInfo of g: TcGlobals * ilApparentType: TType * ilDeclaringTyconRefOpt: TyconRef option * ilMethodDef: ILMethodDef * ilGenericMethodTyArgs: Typars + | ILMethInfo of g: TcGlobals * ilType:ILMethParentTypeInfo * ilMethodDef: ILMethodDef * ilGenericMethodTyArgs: Typars - member x.TcGlobals = match x with ILMethInfo(g, _, _, _, _) -> g + member x.TcGlobals = match x with ILMethInfo(g, _, _, _) -> g /// Get the apparent declaring type of the method as an F# type. /// If this is a C#-style extension method then this is the type which the method /// appears to extend. This may be a variable type. - member x.ApparentEnclosingType = match x with ILMethInfo(_, ty, _, _, _) -> ty + member x.ApparentEnclosingType = match x with ILMethInfo(_, ty, _, _) -> ty.ToType /// Like ApparentEnclosingType but use the compiled nominal type if this is a method on a tuple type member x.ApparentEnclosingAppType = convertToTypeWithMetadataIfPossible x.TcGlobals x.ApparentEnclosingType /// Get the declaring type associated with an extension member, if any. - member x.ILExtensionMethodDeclaringTyconRef = match x with ILMethInfo(_, _, tcrefOpt, _, _) -> tcrefOpt + member x.ILExtensionMethodDeclaringTyconRef = + match x with + | ILMethInfo(ilType=CSharpStyleExtension(declaring= x)) -> Some x + | _ -> None /// Get the Abstract IL metadata associated with the method. - member x.RawMetadata = match x with ILMethInfo(_, _, _, md, _) -> md + member x.RawMetadata = match x with ILMethInfo(_, _, md, _) -> md /// Get the formal method type parameters associated with a method. - member x.FormalMethodTypars = match x with ILMethInfo(_, _, _, _, fmtps) -> fmtps + member x.FormalMethodTypars = match x with ILMethInfo(_, _, _, fmtps) -> fmtps /// Get the IL name of the method member x.ILName = x.RawMetadata.Name /// Indicates if the method is an extension method - member x.IsILExtensionMethod = x.ILExtensionMethodDeclaringTyconRef.IsSome + member x.IsILExtensionMethod = + match x with + | ILMethInfo(ilType=CSharpStyleExtension _) -> true + | _ -> false /// Get the declaring type of the method. If this is an C#-style extension method then this is the IL type /// holding the static member that is the extension method. @@ -558,15 +582,28 @@ type ILMethInfo = /// Does it appear to the user as an instance method? member x.IsInstance = not x.IsConstructor && not x.IsStatic - /// Get the argument types of the the IL method. If this is an C#-style extension method + member x.NullableFallback = + let raw = x.RawMetadata + let classAttrs = + match x with + | ILMethInfo(ilType=CSharpStyleExtension(declaring= t)) when t.IsILTycon -> AttributesFromIL(t.ILTyconRawMetadata.MetadataIndex,t.ILTyconRawMetadata.CustomAttrsStored) + // C#-style extension defined in F# -> we do not support manually adding NullableContextAttribute by F# users. + | ILMethInfo(ilType=CSharpStyleExtension _) -> AttributesFromIL(0,Given(ILAttributes.Empty)) + | ILMethInfo(ilType=IlType(t)) -> t.NullableAttributes + + FromMethodAndClass(AttributesFromIL(raw.MetadataIndex,raw.CustomAttrsStored),classAttrs) + + member x.GetNullness(p:ILParameter) = {DirectAttributes = AttributesFromIL(p.MetadataIndex,p.CustomAttrsStored); Fallback = x.NullableFallback} + + /// Get the argument types of the IL method. If this is an C#-style extension method /// then drop the object argument. member x.GetParamTypes(amap, m, minst) = - x.ParamMetadata |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type (fun _ -> p.CustomAttrs) x.MetadataScope x.DeclaringTypeInst minst) + x.ParamMetadata |> List.map (fun p -> ImportParameterTypeFromMetadata amap m (x.GetNullness(p)) p.Type x.MetadataScope x.DeclaringTypeInst minst) /// Get all the argument types of the IL method. Include the object argument even if this is /// an C#-style extension method. member x.GetRawArgTypes(amap, m, minst) = - x.RawMetadata.Parameters |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type (fun _ -> p.CustomAttrs) x.MetadataScope x.DeclaringTypeInst minst) + x.RawMetadata.Parameters |> List.map (fun p -> ImportParameterTypeFromMetadata amap m (x.GetNullness(p)) p.Type x.MetadataScope x.DeclaringTypeInst minst) /// Get info about the arguments of the IL method. If this is an C#-style extension method then /// drop the object argument. @@ -575,7 +612,7 @@ type ILMethInfo = member x.GetParamNamesAndTypes(amap, m, minst) = let scope = x.MetadataScope let tinst = x.DeclaringTypeInst - x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportParameterTypeFromMetadata amap m p.Type (fun _ -> p.CustomAttrs) scope tinst minst) ) + x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportParameterTypeFromMetadata amap m (x.GetNullness(p)) p.Type scope tinst minst) ) /// Get a reference to the method (dropping all generic instantiations), as an Abstract IL ILMethodRef. member x.ILMethodRef = @@ -599,12 +636,13 @@ type ILMethInfo = /// Get the (zero or one) 'self'/'this'/'object' arguments associated with an IL method. /// An instance extension method returns one object argument. - member x.GetObjArgTypes(amap, m, minst) = + member x.GetObjArgTypes(amap, m, minst) = // All C#-style extension methods are instance. We have to re-read the 'obj' type w.r.t. the // method instantiation. if x.IsILExtensionMethod then let p = x.RawMetadata.Parameters.Head - [ ImportParameterTypeFromMetadata amap m p.Type (fun _ -> p.CustomAttrs) x.MetadataScope x.DeclaringTypeInst minst ] + let nullableSource = {DirectAttributes = AttributesFromIL(p.MetadataIndex,p.CustomAttrsStored); Fallback = x.NullableFallback} + [ ImportParameterTypeFromMetadata amap m nullableSource p.Type x.MetadataScope x.DeclaringTypeInst minst ] else if x.IsInstance then [ x.ApparentEnclosingType ] else @@ -612,10 +650,12 @@ type ILMethInfo = /// Get the compiled return type of the method, where 'void' is None. member x.GetCompiledReturnType (amap, m, minst) = - ImportReturnTypeFromMetadata amap m x.RawMetadata.Return.Type (fun _ -> x.RawMetadata.Return.CustomAttrs) x.MetadataScope x.DeclaringTypeInst minst + let ilReturn = x.RawMetadata.Return + let nullableSource = {DirectAttributes = AttributesFromIL(ilReturn.MetadataIndex,ilReturn.CustomAttrsStored); Fallback = x.NullableFallback} + ImportReturnTypeFromMetadata amap m nullableSource ilReturn.Type x.MetadataScope x.DeclaringTypeInst minst /// Get the F# view of the return type of the method, where 'void' is 'unit'. - member x.GetFSharpReturnType (amap, m, minst) = + member x.GetFSharpReturnType (amap, m, minst) = x.GetCompiledReturnType(amap, m, minst) |> GetFSharpViewOfReturnType amap.g @@ -630,6 +670,9 @@ type MethInfo = /// Describes a use of a method backed by Abstract IL # metadata | ILMeth of tcGlobals: TcGlobals * ilMethInfo: ILMethInfo * extensionMethodPriority: ExtensionMethodPriority option + /// A pseudo-method used by F# typechecker to treat Object.ToString() of known types as returning regular string, not `string?` as in the BCL + | MethInfoWithModifiedReturnType of original:MethInfo * modifiedReturnType: TType + /// Describes a use of a pseudo-method corresponding to the default constructor for a .NET struct type | DefaultStructCtor of tcGlobals: TcGlobals * structTy: TType @@ -646,6 +689,7 @@ type MethInfo = match x with | ILMeth(_, ilminfo, _) -> ilminfo.ApparentEnclosingType | FSMeth(_, ty, _, _) -> ty + | MethInfoWithModifiedReturnType(mi, _) -> mi.ApparentEnclosingType | DefaultStructCtor(_, ty) -> ty #if !NO_TYPEPROVIDERS | ProvidedMeth(amap, mi, _, m) -> @@ -666,6 +710,7 @@ type MethInfo = match x with | ILMeth(_, ilminfo, _) when x.IsExtensionMember -> ilminfo.DeclaringTyconRef | FSMeth(_, _, vref, _) when x.IsExtensionMember && vref.HasDeclaringEntity -> vref.DeclaringEntity + | MethInfoWithModifiedReturnType(mi, _) -> mi.DeclaringTyconRef | _ -> x.ApparentEnclosingTyconRef /// Get the information about provided static parameters, if any @@ -673,6 +718,7 @@ type MethInfo = match x with | ILMeth _ -> None | FSMeth _ -> None + | MethInfoWithModifiedReturnType _ -> None #if !NO_TYPEPROVIDERS | ProvidedMeth (_, mb, _, m) -> let staticParams = mb.PApplyWithProvider((fun (mb, provider) -> mb.GetStaticParametersForMethod provider), range=m) @@ -691,6 +737,7 @@ type MethInfo = #if !NO_TYPEPROVIDERS | ProvidedMeth(_, _, pri, _) -> pri #endif + | MethInfoWithModifiedReturnType(mi, _) -> mi.ExtensionMemberPriorityOption | DefaultStructCtor _ -> None /// Get the extension method priority of the method. If it is not an extension method @@ -702,8 +749,9 @@ type MethInfo = member x.DebuggerDisplayName = match x with | ILMeth(_, y, _) -> y.DeclaringTyconRef.DisplayNameWithStaticParametersAndUnderscoreTypars + "::" + y.ILName - | FSMeth(_, AbbrevOrAppTy tcref, vref, _) -> tcref.DisplayNameWithStaticParametersAndUnderscoreTypars + "::" + vref.LogicalName + | FSMeth(_, AbbrevOrAppTy(tcref, _), vref, _) -> tcref.DisplayNameWithStaticParametersAndUnderscoreTypars + "::" + vref.LogicalName | FSMeth(_, _, vref, _) -> "??::" + vref.LogicalName + | MethInfoWithModifiedReturnType(mi, returnTy) -> mi.DebuggerDisplayName + $"({returnTy.DebugText})" #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> "ProvidedMeth: " + mi.PUntaint((fun mi -> mi.Name), m) #endif @@ -714,6 +762,7 @@ type MethInfo = match x with | ILMeth(_, y, _) -> y.ILName | FSMeth(_, _, vref, _) -> vref.LogicalName + | MethInfoWithModifiedReturnType(mi, _) -> mi.LogicalName #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.Name), m) #endif @@ -753,6 +802,7 @@ type MethInfo = match x with | ILMeth(g, _, _) -> g | FSMeth(g, _, _, _) -> g + | MethInfoWithModifiedReturnType(mi, _) -> mi.TcGlobals | DefaultStructCtor (g, _) -> g #if !NO_TYPEPROVIDERS | ProvidedMeth(amap, _, _, _) -> amap.g @@ -768,6 +818,7 @@ type MethInfo = let ty = x.ApparentEnclosingAppType let _, memberMethodTypars, _, _ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (ty, vref) memberMethodTypars + | MethInfoWithModifiedReturnType(mi, _) -> mi.FormalMethodTypars | DefaultStructCtor _ -> [] #if !NO_TYPEPROVIDERS | ProvidedMeth _ -> [] // There will already have been an error if there are generic parameters here. @@ -783,6 +834,7 @@ type MethInfo = match x with | ILMeth _ -> XmlDoc.Empty | FSMeth(_, _, vref, _) -> vref.XmlDoc + | MethInfoWithModifiedReturnType(mi, _) -> mi.XmlDoc | DefaultStructCtor _ -> XmlDoc.Empty #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m)-> @@ -794,6 +846,7 @@ type MethInfo = member x.ArbitraryValRef = match x with | FSMeth(_g, _, vref, _) -> Some vref + | MethInfoWithModifiedReturnType(mi, _) -> mi.ArbitraryValRef | _ -> None /// Get a list of argument-number counts, one count for each set of curried arguments. @@ -803,6 +856,7 @@ type MethInfo = match x with | ILMeth(_, ilminfo, _) -> [ilminfo.NumParams] | FSMeth(g, _, vref, _) -> GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref |> List.map List.length + | MethInfoWithModifiedReturnType(mi, _) -> mi.NumArgs | DefaultStructCtor _ -> [0] #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> [mi.PUntaint((fun mi -> mi.GetParameters().Length), m)] // Why is this a list? Answer: because the method might be curried @@ -812,7 +866,7 @@ type MethInfo = member x.IsUnionCaseTester = let tcref = x.ApparentEnclosingTyconRef tcref.IsUnionTycon && - x.LogicalName.StartsWith("get_Is") && + x.LogicalName.StartsWithOrdinal("get_Is") && match x.ArbitraryValRef with | Some v -> v.IsImplied | None -> false @@ -824,6 +878,7 @@ type MethInfo = match x with | ILMeth(_, ilmeth, _) -> ilmeth.IsInstance | FSMeth(_, _, vref, _) -> vref.IsInstanceMember || x.IsCSharpStyleExtensionMember + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsInstance | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> not mi.IsConstructor && not mi.IsStatic), m) @@ -837,6 +892,7 @@ type MethInfo = match x with | ILMeth(_, ilmeth, _) -> ilmeth.IsProtectedAccessibility | FSMeth _ -> false + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsProtectedAccessibility | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsFamily), m) @@ -846,6 +902,7 @@ type MethInfo = match x with | ILMeth(_, ilmeth, _) -> ilmeth.IsVirtual | FSMeth(_, _, vref, _) -> vref.IsVirtualMember + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsVirtual | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsVirtual), m) @@ -855,6 +912,7 @@ type MethInfo = match x with | ILMeth(_, ilmeth, _) -> ilmeth.IsConstructor | FSMeth(_g, _, vref, _) -> (vref.MemberInfo.Value.MemberFlags.MemberKind = SynMemberKind.Constructor) + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsConstructor | DefaultStructCtor _ -> true #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsConstructor), m) @@ -867,6 +925,7 @@ type MethInfo = match vref.TryDeref with | ValueSome x -> x.IsClassConstructor | _ -> false + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsClassConstructor | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsConstructor && mi.IsStatic), m) // Note: these are never public anyway @@ -876,6 +935,7 @@ type MethInfo = match x with | ILMeth(_g, ilmeth, _) -> ilmeth.IsVirtual | FSMeth(_, _, vref, _) -> vref.MemberInfo.Value.MemberFlags.IsDispatchSlot + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsDispatchSlot | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth _ -> x.IsVirtual // Note: follow same implementation as ILMeth @@ -887,6 +947,7 @@ type MethInfo = match x with | ILMeth(_, ilmeth, _) -> ilmeth.IsFinal | FSMeth(_g, _, _vref, _) -> false + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsFinal | DefaultStructCtor _ -> true #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsFinal), m) @@ -902,6 +963,7 @@ type MethInfo = match minfo with | ILMeth(_, ilmeth, _) -> ilmeth.IsAbstract | FSMeth(g, _, vref, _) -> isInterfaceTy g minfo.ApparentEnclosingType || vref.IsDispatchSlotMember + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsAbstract | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsAbstract), m) @@ -912,6 +974,7 @@ type MethInfo = (match x with | ILMeth(_, x, _) -> x.IsNewSlot || (isInterfaceTy x.TcGlobals x.ApparentEnclosingType && not x.IsFinal) | FSMeth(_, _, vref, _) -> vref.IsDispatchSlotMember + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsNewSlot #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsHideBySig), m) // REVIEW: Check this is correct #endif @@ -921,6 +984,7 @@ type MethInfo = member x.IsILMethod = match x with | ILMeth _ -> true + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsILMethod | _ -> false /// Check if this method is an explicit implementation of an interface member @@ -928,6 +992,7 @@ type MethInfo = match x with | ILMeth _ -> false | FSMeth(g, _, vref, _) -> vref.IsFSharpExplicitInterfaceImplementation g + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsFSharpExplicitInterfaceImplementation | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth _ -> false @@ -938,6 +1003,7 @@ type MethInfo = match x with | ILMeth _ -> false | FSMeth(_, _, vref, _) -> vref.IsDefiniteFSharpOverrideMember + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsDefiniteFSharpOverride | DefaultStructCtor _ -> false #if !NO_TYPEPROVIDERS | ProvidedMeth _ -> false @@ -946,6 +1012,7 @@ type MethInfo = member x.ImplementedSlotSignatures = match x with | FSMeth(_, _, vref, _) -> vref.ImplementedSlotSignatures + | MethInfoWithModifiedReturnType(mi, _) -> mi.ImplementedSlotSignatures | _ -> failwith "not supported" /// Indicates if this is an extension member. @@ -953,6 +1020,7 @@ type MethInfo = match x with | FSMeth (_, _, vref, pri) -> pri.IsSome || vref.IsExtensionMember | ILMeth (_, _, Some _) -> true + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsExtensionMember | _ -> false /// Indicates if this is an extension member (e.g. on a struct) that takes a byref arg @@ -964,12 +1032,16 @@ type MethInfo = /// Indicates if this is an F# extension member. member x.IsFSharpStyleExtensionMember = - match x with FSMeth (_, _, vref, _) -> vref.IsExtensionMember | _ -> false + match x with + | FSMeth (_, _, vref, _) -> vref.IsExtensionMember + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsFSharpStyleExtensionMember + | _ -> false /// Indicates if this is an C#-style extension member. member x.IsCSharpStyleExtensionMember = match x with | FSMeth (_, _, vref, Some _) -> not vref.IsExtensionMember + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsCSharpStyleExtensionMember | ILMeth (_, _, Some _) -> true | _ -> false @@ -991,6 +1063,7 @@ type MethInfo = member x.IsFSharpEventPropertyMethod = match x with | FSMeth(g, _, vref, _) -> vref.IsFSharpEventProperty g + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsFSharpEventPropertyMethod #if !NO_TYPEPROVIDERS | ProvidedMeth _ -> false #endif @@ -1022,12 +1095,14 @@ type MethInfo = | ILMeth (g, ilMethInfo, _) -> ilMethInfo.IsReadOnly g || x.IsOnReadOnlyType | FSMeth _ -> false // F# defined methods not supported yet. Must be a language feature. + | MethInfoWithModifiedReturnType(mi, _) -> mi.IsReadOnly | _ -> false - /// Indicates, wheter this method has `IsExternalInit` modreq. + /// Indicates, whether this method has `IsExternalInit` modreq. member x.HasExternalInit = match x with | ILMeth (_, ilMethInfo, _) -> HasExternalInit ilMethInfo.ILMethodRef + | MethInfoWithModifiedReturnType(mi, _) -> mi.HasExternalInit | _ -> false /// Indicates if this method is an extension member that is read-only. @@ -1040,14 +1115,19 @@ type MethInfo = /// Build IL method infos. static member CreateILMeth (amap: ImportMap, m, ty: TType, md: ILMethodDef) = let tinfo = ILTypeInfo.FromType amap.g ty - let mtps = ImportILGenericParameters (fun () -> amap) m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata md.GenericParams - ILMeth (amap.g, ILMethInfo(amap.g, ty, None, md, mtps), None) + let nullableFallback = FromMethodAndClass(AttributesFromIL(md.MetadataIndex,md.CustomAttrsStored),tinfo.NullableAttributes) + let mtps = ImportILGenericParameters (fun () -> amap) m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata nullableFallback md.GenericParams + ILMeth (amap.g, ILMethInfo(amap.g, IlType tinfo, md, mtps), None) /// Build IL method infos for a C#-style extension method - static member CreateILExtensionMeth (amap, m, apparentTy: TType, declaringTyconRef: TyconRef, extMethPri, md: ILMethodDef) = + static member CreateILExtensionMeth (amap:ImportMap, m, apparentTy: TType, declaringTyconRef: TyconRef, extMethPri, md: ILMethodDef) = let scoref = declaringTyconRef.CompiledRepresentationForNamedType.Scope - let mtps = ImportILGenericParameters (fun () -> amap) m scoref [] md.GenericParams - ILMeth (amap.g, ILMethInfo(amap.g, apparentTy, Some declaringTyconRef, md, mtps), extMethPri) + let typeInfo = CSharpStyleExtension(declaringTyconRef,apparentTy) + let declaringMetadata = declaringTyconRef.ILTyconRawMetadata + let declaringAttributes = AttributesFromIL(declaringMetadata.MetadataIndex,declaringMetadata.CustomAttrsStored) + let nullableFallback = FromMethodAndClass(AttributesFromIL(md.MetadataIndex,md.CustomAttrsStored),declaringAttributes) + let mtps = ImportILGenericParameters (fun () -> amap) m scoref [] nullableFallback md.GenericParams + ILMeth (amap.g, ILMethInfo(amap.g, typeInfo, md, mtps), extMethPri) /// Tests whether two method infos have the same underlying definition. /// Used to merge operator overloads collected from left and right of an operator constraint. @@ -1056,6 +1136,8 @@ type MethInfo = match x1, x2 with | ILMeth(_, x1, _), ILMeth(_, x2, _) -> (x1.RawMetadata === x2.RawMetadata) | FSMeth(g, _, vref1, _), FSMeth(_, _, vref2, _) -> valRefEq g vref1 vref2 + | mi1, MethInfoWithModifiedReturnType(mi2, _) + | MethInfoWithModifiedReturnType(mi1, _), mi2 -> MethInfo.MethInfosUseIdenticalDefinitions mi1 mi2 | DefaultStructCtor _, DefaultStructCtor _ -> tyconRefEq x1.TcGlobals x1.DeclaringTyconRef x2.DeclaringTyconRef #if !NO_TYPEPROVIDERS | ProvidedMeth(_, mi1, _, _), ProvidedMeth(_, mi2, _, _) -> ProvidedMethodBase.TaintedEquals (mi1, mi2) @@ -1067,6 +1149,7 @@ type MethInfo = match x with | ILMeth(_, x1, _) -> hash x1.RawMetadata.Name | FSMeth(_, _, vref, _) -> hash vref.LogicalName + | MethInfoWithModifiedReturnType(mi,_) -> mi.ComputeHashCode() | DefaultStructCtor(_, _ty) -> 34892 // "ty" doesn't support hashing. We could use "hash (tcrefOfAppTy g ty).CompiledName" or // something but we don't have a "g" parameter here yet. But this hash need only be very approximate anyway #if !NO_TYPEPROVIDERS @@ -1078,9 +1161,10 @@ type MethInfo = match x with | ILMeth(_g, ilminfo, pri) -> match ilminfo with - | ILMethInfo(_, ty, None, md, _) -> MethInfo.CreateILMeth(amap, m, instType inst ty, md) - | ILMethInfo(_, ty, Some declaringTyconRef, md, _) -> MethInfo.CreateILExtensionMeth(amap, m, instType inst ty, declaringTyconRef, pri, md) + | ILMethInfo(_, IlType ty, md, _) -> MethInfo.CreateILMeth(amap, m, instType inst ty.ToType, md) + | ILMethInfo(_, CSharpStyleExtension(declaringTyconRef,ty), md, _) -> MethInfo.CreateILExtensionMeth(amap, m, instType inst ty, declaringTyconRef, pri, md) | FSMeth(g, ty, vref, pri) -> FSMeth(g, instType inst ty, vref, pri) + | MethInfoWithModifiedReturnType(mi, retTy) -> MethInfoWithModifiedReturnType(mi.Instantiate(amap, m, inst), retTy) | DefaultStructCtor(g, ty) -> DefaultStructCtor(g, instType inst ty) #if !NO_TYPEPROVIDERS | ProvidedMeth _ -> @@ -1099,6 +1183,7 @@ type MethInfo = let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) let _, _, retTy, _ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (ty, vref) retTy |> Option.map (instType inst) + | MethInfoWithModifiedReturnType(_,retTy) -> Some retTy | DefaultStructCtor _ -> None #if !NO_TYPEPROVIDERS | ProvidedMeth(amap, mi, _, m) -> @@ -1116,6 +1201,7 @@ type MethInfo = | ILMeth (ilMethInfo = ilminfo) -> // A single group of tupled arguments [ ilminfo.ParamMetadata |> List.map (fun x -> x.Name) ] + | MethInfoWithModifiedReturnType(mi,_) -> mi.GetParamNames() #if !NO_TYPEPROVIDERS | ProvidedMeth (_, mi, _, m) -> // A single group of tupled arguments @@ -1134,6 +1220,7 @@ type MethInfo = let paramTypes = ParamNameAndType.FromMember x.IsCSharpStyleExtensionMember g vref let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) paramTypes |> List.mapSquared (fun (ParamNameAndType(_, ty)) -> instType inst ty) + | MethInfoWithModifiedReturnType(mi,_) -> mi.GetParamTypes(amap,m,minst) | DefaultStructCtor _ -> [] #if !NO_TYPEPROVIDERS | ProvidedMeth(amap, mi, _, m) -> @@ -1158,6 +1245,7 @@ type MethInfo = else [ ty ] else [] + | MethInfoWithModifiedReturnType(mi,_) -> mi.GetObjArgTypes(amap, m, minst) | DefaultStructCtor _ -> [] #if !NO_TYPEPROVIDERS | ProvidedMeth(amap, mi, _, m) -> @@ -1169,6 +1257,7 @@ type MethInfo = member x.GetCustomAttrs() = match x with | ILMeth(_, ilMethInfo, _) -> ilMethInfo.RawMetadata.CustomAttrs + | MethInfoWithModifiedReturnType(mi,_) -> mi.GetCustomAttrs() | _ -> ILAttributes.Empty /// Get the parameter attributes of a method info, which get combined with the parameter names and types @@ -1209,6 +1298,7 @@ type MethInfo = | FSMeth(g, _, vref, _) -> GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref |> List.mapSquared (CrackParamAttribsInfo g) + | MethInfoWithModifiedReturnType(mi,_) -> mi.GetParamAttribs(amap, m) | DefaultStructCtor _ -> [[]] @@ -1216,10 +1306,10 @@ type MethInfo = | ProvidedMeth(amap, mi, _, _) -> // A single group of tupled arguments [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do - let isParamArrayArg = p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure id, typeof.FullName).IsSome), m) + let isParamArrayArg = p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure id, !! typeof.FullName).IsSome), m) let optArgInfo = OptionalArgInfoOfProvidedParameter amap m p let reflArgInfo = - match p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure id, typeof.FullName)), m) with + match p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure id, !! typeof.FullName)), m) with | Some ([ Some (:? bool as b) ], _) -> ReflectedArgInfo.Quote b | Some _ -> ReflectedArgInfo.Quote false | None -> ReflectedArgInfo.None @@ -1251,6 +1341,7 @@ type MethInfo = |> List.mapSquared (map1Of2 (instType methodToParentRenaming) >> MakeSlotParam ) let formalRetTy = Option.map (instType methodToParentRenaming) retTy MakeSlotSig(x.LogicalName, x.ApparentEnclosingType, formalEnclosingTypars, formalMethTypars, formalParams, formalRetTy) + | MethInfoWithModifiedReturnType(mi,_) -> mi.GetSlotSig(amap, m) | DefaultStructCtor _ -> error(InternalError("no slotsig for DefaultStructCtor", m)) | _ -> let g = x.TcGlobals @@ -1269,12 +1360,17 @@ type MethInfo = let formalRetTy, formalParams = match x with - | ILMeth(_, ilminfo, _) -> + | ILMeth(_, ilminfo, _) -> let ftinfo = ILTypeInfo.FromType g (TType_app(tcref, formalEnclosingTyparTys, g.knownWithoutNull)) - let formalRetTy = ImportReturnTypeFromMetadata amap m ilminfo.RawMetadata.Return.Type (fun _ -> ilminfo.RawMetadata.Return.CustomAttrs) ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys + + let ilReturn = ilminfo.RawMetadata.Return + let nullableSource = {DirectAttributes = AttributesFromIL(ilReturn.MetadataIndex,ilReturn.CustomAttrsStored); Fallback = ilminfo.NullableFallback} + + let formalRetTy = ImportReturnTypeFromMetadata amap m nullableSource ilReturn.Type ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys let formalParams = [ [ for p in ilminfo.RawMetadata.Parameters do - let paramTy = ImportILTypeFromMetadataWithAttributes amap m ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys p.Type (fun _ -> p.CustomAttrs) + let nullableSource = {nullableSource with DirectAttributes = AttributesFromIL(p.MetadataIndex,p.CustomAttrsStored)} + let paramTy = ImportILTypeFromMetadataWithAttributes amap m ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys nullableSource p.Type yield TSlotParam(p.Name, paramTy, p.IsIn, p.IsOut, p.IsOptional, []) ] ] formalRetTy, formalParams #if !NO_TYPEPROVIDERS @@ -1286,7 +1382,7 @@ type MethInfo = // For non-generic type providers there is no difference let formalParams = [ [ for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do - let paramName = p.PUntaint((fun p -> match p.Name with null -> None | s -> Some s), m) + let paramName = p.PUntaint((fun p -> match p.Name with "" -> None | s -> Some s), m) let paramTy = ImportProvidedType amap m (p.PApply((fun p -> p.ParameterType), m)) let isIn, isOut, isOptional = p.PUntaint((fun p -> p.IsIn, p.IsOut, p.IsOptional), m) yield TSlotParam(paramName, paramTy, isIn, isOut, isOptional, []) ] ] @@ -1298,37 +1394,41 @@ type MethInfo = /// Get the ParamData objects for the parameters of a MethInfo member x.GetParamDatas(amap, m, minst) = - let paramNamesAndTypes = - match x with - | ILMeth(_g, ilminfo, _) -> - [ ilminfo.GetParamNamesAndTypes(amap, m, minst) ] - | FSMeth(g, _, vref, _) -> - let ty = x.ApparentEnclosingAppType - let items = ParamNameAndType.FromMember x.IsCSharpStyleExtensionMember g vref - let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) - items |> ParamNameAndType.InstantiateCurried inst - | DefaultStructCtor _ -> - [[]] -#if !NO_TYPEPROVIDERS - | ProvidedMeth(amap, mi, _, _) -> - // A single set of tupled parameters - [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do - let paramName = - match p.PUntaint((fun p -> p.Name), m) with - | null -> None - | name -> Some (mkSynId m name) - let paramTy = - match p.PApply((fun p -> p.ParameterType), m) with - | Tainted.Null -> amap.g.unit_ty - | Tainted.NonNull parameterType -> ImportProvidedType amap m parameterType - yield ParamNameAndType(paramName, paramTy) ] ] - -#endif - - let paramAttribs = x.GetParamAttribs(amap, m) - (paramAttribs, paramNamesAndTypes) ||> List.map2 (List.map2 (fun (info, attribs) (ParamNameAndType(nmOpt, pty)) -> - let (ParamAttribs(isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo)) = info - ParamData(isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, nmOpt, reflArgInfo, pty), attribs)) + match x with + | MethInfoWithModifiedReturnType(mi,_) -> mi.GetParamDatas(amap, m, minst) + | _ -> + let paramNamesAndTypes = + match x with + | ILMeth(_g, ilminfo, _) -> + [ ilminfo.GetParamNamesAndTypes(amap, m, minst) ] + | FSMeth(g, _, vref, _) -> + let ty = x.ApparentEnclosingAppType + let items = ParamNameAndType.FromMember x.IsCSharpStyleExtensionMember g vref + let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) + items |> ParamNameAndType.InstantiateCurried inst + | MethInfoWithModifiedReturnType(_mi,_) -> failwith "unreachable" + | DefaultStructCtor _ -> + [[]] +#if !NO_TYPEPROVIDERS + | ProvidedMeth(amap, mi, _, _) -> + // A single set of tupled parameters + [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do + let paramName = + match p.PUntaint((fun p -> p.Name), m) with + | "" -> None + | name -> Some (mkSynId m name) + let paramTy = + match p.PApply((fun p -> p.ParameterType), m) with + | Tainted.Null -> amap.g.unit_ty + | Tainted.NonNull parameterType -> ImportProvidedType amap m parameterType + yield ParamNameAndType(paramName, paramTy) ] ] + +#endif + + let paramAttribs = x.GetParamAttribs(amap, m) + (paramAttribs, paramNamesAndTypes) ||> List.map2 (List.map2 (fun (info, attribs) (ParamNameAndType(nmOpt, pty)) -> + let (ParamAttribs(isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo)) = info + ParamData(isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, nmOpt, reflArgInfo, pty), attribs)) /// Get the ParamData objects for the parameters of a MethInfo member x.HasParamArrayArg(amap, m, minst) = @@ -1472,8 +1572,10 @@ type ILFieldInfo = /// Get the type of the field as an F# type member x.FieldType(amap, m) = - match x with - | ILFieldInfo (tinfo, fdef) -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] fdef.FieldType + match x with + | ILFieldInfo (tinfo, fdef) -> + let nullness = {DirectAttributes = AttributesFromIL(fdef.MetadataIndex,fdef.CustomAttrsStored); Fallback = tinfo.NullableClassSource} + ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] nullness fdef.FieldType #if !NO_TYPEPROVIDERS | ProvidedField(amap, fi, m) -> ImportProvidedType amap m (fi.PApply((fun fi -> fi.FieldType), m)) #endif @@ -1533,7 +1635,7 @@ type RecdFieldInfo = member x.FieldType = actualTyOfRecdFieldRef x.RecdFieldRef x.TypeInst /// Get the enclosing (declaring) type of the field in an F#-declared record, class or struct type - member x.DeclaringType = TType_app (x.RecdFieldRef.TyconRef, x.TypeInst, 0uy) + member x.DeclaringType = TType_app (x.RecdFieldRef.TyconRef, x.TypeInst, KnownWithoutNull) // TODO NULLNESS - qualify this override x.ToString() = x.TyconRef.ToString() + "::" + x.LogicalName @@ -1608,13 +1710,13 @@ type ILPropInfo = member x.GetterMethod = assert x.HasGetter let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.GetMethod.Value - ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) + ILMethInfo(x.TcGlobals, IlType x.ILTypeInfo, mdef, []) /// Gets the ILMethInfo of the 'set' method for the IL property member x.SetterMethod = assert x.HasSetter let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.SetMethod.Value - ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) + ILMethInfo(x.TcGlobals, IlType x.ILTypeInfo, mdef, []) /// Indicates if the IL property has a 'get' method member x.HasGetter = Option.isSome x.RawMetadata.GetMethod @@ -1622,7 +1724,7 @@ type ILPropInfo = /// Indicates if the IL property has a 'set' method member x.HasSetter = Option.isSome x.RawMetadata.SetMethod - /// Indidcates whether IL property has an init-only setter (i.e. has the `System.Runtime.CompilerServices.IsExternalInit` modifer) + /// Indicates whether IL property has an init-only setter (i.e. has the `System.Runtime.CompilerServices.IsExternalInit` modifier) member x.IsSetterInitOnly = x.HasSetter && HasExternalInit x.SetterMethod.ILMethodRef @@ -1647,23 +1749,36 @@ type ILPropInfo = /// Any type parameters of the enclosing type are instantiated in the type returned. member x.GetParamNamesAndTypes(amap, m) = let (ILPropInfo (tinfo, pdef)) = x - pdef.Args |> List.map (fun ty -> ParamNameAndType(None, ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] ty) ) + if x.HasGetter then + x.GetterMethod.GetParamNamesAndTypes(amap,m,tinfo.TypeInstOfRawMetadata) + else if x.HasSetter then + x.SetterMethod.GetParamNamesAndTypes(amap,m,tinfo.TypeInstOfRawMetadata) + else + // Fallback-only for invalid properties + pdef.Args |> List.map (fun ty -> ParamNameAndType(None, ImportILTypeFromMetadataSkipNullness amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] ty) ) /// Get the types of the indexer arguments associated with the IL property. /// /// Any type parameters of the enclosing type are instantiated in the type returned. member x.GetParamTypes(amap, m) = let (ILPropInfo (tinfo, pdef)) = x - pdef.Args |> List.map (fun ty -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] ty) + if x.HasGetter then + x.GetterMethod.GetParamTypes(amap,m,tinfo.TypeInstOfRawMetadata) + else if x.HasSetter then + x.SetterMethod.GetParamTypes(amap,m,tinfo.TypeInstOfRawMetadata) + else + // Fallback-only for invalid properties + pdef.Args |> List.map (fun ty -> ImportILTypeFromMetadataSkipNullness amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] ty) /// Get the return type of the IL property. /// /// Any type parameters of the enclosing type are instantiated in the type returned. member x.GetPropertyType (amap, m) = let (ILPropInfo (tinfo, pdef)) = x - ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] pdef.PropertyType + let nullness = {DirectAttributes = AttributesFromIL(pdef.MetadataIndex,pdef.CustomAttrsStored); Fallback = tinfo.NullableClassSource} + ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] nullness pdef.PropertyType - override x.ToString() = x.ILTypeInfo.ToString() + "::" + x.PropertyName + override x.ToString() = !!x.ILTypeInfo.ToString() + "::" + x.PropertyName /// Describes an F# use of a property [] @@ -1769,6 +1884,38 @@ type PropInfo = | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> pi.CanWrite), m) #endif + member x.GetterAccessibility = + match x with + | ILProp ilpinfo when ilpinfo.HasGetter -> Some taccessPublic + | ILProp _ -> None + + | FSProp(_, _, Some getter, _) -> Some getter.Accessibility + | FSProp _ -> None + +#if !NO_TYPEPROVIDERS + | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> if pi.CanWrite then Some taccessPublic else None), m) +#endif + + member x.SetterAccessibility = + match x with + | ILProp ilpinfo when ilpinfo.HasSetter -> Some taccessPublic + | ILProp _ -> None + + | FSProp(_, _, _, Some setter) -> Some setter.Accessibility + | FSProp _ -> None + +#if !NO_TYPEPROVIDERS + | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> if pi.CanWrite then Some taccessPublic else None), m) +#endif + + member x.IsProtectedAccessibility = + match x with + | ILProp ilpinfo when ilpinfo.HasGetter && ilpinfo.HasSetter -> + struct(ilpinfo.GetterMethod.IsProtectedAccessibility, ilpinfo.SetterMethod.IsProtectedAccessibility) + | ILProp ilpinfo when ilpinfo.HasGetter -> struct(ilpinfo.GetterMethod.IsProtectedAccessibility, false) + | ILProp ilpinfo when ilpinfo.HasSetter -> struct(false, ilpinfo.SetterMethod.IsProtectedAccessibility) + | _ -> struct(false, false) + member x.IsSetterInitOnly = match x with | ILProp ilpinfo -> ilpinfo.IsSetterInitOnly @@ -1939,7 +2086,7 @@ type PropInfo = /// Get the result type of the property member x.GetPropertyType (amap, m) = - match x with + match x with | ILProp ilpinfo -> ilpinfo.GetPropertyType (amap, m) | FSProp (g, _, Some vref, _) | FSProp (g, _, _, Some vref) -> @@ -1957,7 +2104,7 @@ type PropInfo = /// /// If the property is in a generic type, then the type parameters are instantiated in the types returned. member x.GetParamNamesAndTypes(amap, m) = - match x with + match x with | ILProp ilpinfo -> ilpinfo.GetParamNamesAndTypes(amap, m) | FSProp (g, ty, Some vref, _) | FSProp (g, ty, _, Some vref) -> @@ -1967,7 +2114,7 @@ type PropInfo = #if !NO_TYPEPROVIDERS | ProvidedProp (_, pi, m) -> [ for p in pi.PApplyArray((fun pi -> pi.GetIndexParameters()), "GetIndexParameters", m) do - let paramName = p.PUntaint((fun p -> match p.Name with null -> None | s -> Some (mkSynId m s)), m) + let paramName = p.PUntaint((fun p -> match p.Name with "" -> None | s -> Some (mkSynId m s)), m) let paramTy = ImportProvidedType amap m (p.PApply((fun p -> p.ParameterType), m)) yield ParamNameAndType(paramName, paramTy) ] #endif @@ -1978,7 +2125,7 @@ type PropInfo = |> List.map (fun (ParamNameAndType(nmOpt, paramTy)) -> ParamData(false, false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None, paramTy)) /// Get the types of the indexer parameters associated with the property - member x.GetParamTypes(amap, m) = + member x.GetParamTypes(amap, m) = x.GetParamNamesAndTypes(amap, m) |> List.map (fun (ParamNameAndType(_, ty)) -> ty) /// Get a MethInfo for the 'getter' method associated with the property @@ -2073,12 +2220,12 @@ type ILEventInfo = /// Get the ILMethInfo describing the 'add' method associated with the event member x.AddMethod = let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.AddMethod - ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) + ILMethInfo(x.TcGlobals, IlType x.ILTypeInfo, mdef, []) /// Get the ILMethInfo describing the 'remove' method associated with the event member x.RemoveMethod = let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.RemoveMethod - ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) + ILMethInfo(x.TcGlobals, IlType x.ILTypeInfo, mdef, []) /// Get the declaring type of the event as an ILTypeRef member x.TypeRef = x.ILTypeInfo.ILTypeRef @@ -2089,7 +2236,7 @@ type ILEventInfo = /// Indicates if the property is static member x.IsStatic = x.AddMethod.IsStatic - override x.ToString() = x.ILTypeInfo.ToString() + "::" + x.EventName + override x.ToString() = !!x.ILTypeInfo.ToString() + "::" + x.EventName //------------------------------------------------------------------------- // Helpers for EventInfo @@ -2274,9 +2421,10 @@ type EventInfo = match x with | ILEvent(ILEventInfo(tinfo, edef)) -> // Get the delegate type associated with an IL event, taking into account the instantiation of the - // declaring type. + // declaring type if Option.isNone edef.EventType then error (nonStandardEventError x.EventName m) - ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] edef.EventType.Value + let nullness = {DirectAttributes = AttributesFromIL(edef.MetadataIndex,edef.CustomAttrsStored); Fallback = tinfo.NullableClassSource} + ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] nullness edef.EventType.Value | FSEvent(g, p, _, _) -> FindDelegateTypeOfPropertyEvent g amap x.EventName m (p.GetPropertyType(amap, m)) @@ -2391,18 +2539,19 @@ let SettersOfPropInfos (pinfos: PropInfo list) = pinfos |> List.choose (fun pinf let GettersOfPropInfos (pinfos: PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasGetter then Some(pinfo.GetterMethod, Some pinfo) else None) +[] let (|DifferentGetterAndSetter|_|) (pinfo: PropInfo) = if not (pinfo.HasGetter && pinfo.HasSetter) then - None + ValueNone else match pinfo.GetterMethod.ArbitraryValRef, pinfo.SetterMethod.ArbitraryValRef with | Some getValRef, Some setValRef -> if getValRef.Accessibility <> setValRef.Accessibility then - Some (getValRef, setValRef) + ValueSome (getValRef, setValRef) else match getValRef.ValReprInfo with | Some getValReprInfo when // Getter has an index parameter - getValReprInfo.TotalArgCount > 1 -> Some (getValRef, setValRef) - | _ -> None - | _ -> None \ No newline at end of file + getValReprInfo.TotalArgCount > 1 -> ValueSome (getValRef, setValRef) + | _ -> ValueNone + | _ -> ValueNone \ No newline at end of file diff --git a/src/fcs-fable/src/Compiler/Checking/infos.fsi b/src/fcs-fable/src/Compiler/Checking/infos.fsi index c6347984e5..0a5389ca88 100644 --- a/src/fcs-fable/src/Compiler/Checking/infos.fsi +++ b/src/fcs-fable/src/Compiler/Checking/infos.fsi @@ -178,13 +178,19 @@ type ILTypeInfo = member TypeInstOfRawMetadata: TypeInst +[] +type ILMethParentTypeInfo = + | IlType of ILTypeInfo + | CSharpStyleExtension of declaring: TyconRef * apparent: TType + + member ToType: TType + /// Describes an F# use of an IL method. [] type ILMethInfo = | ILMethInfo of g: TcGlobals * - ilApparentType: TType * - ilDeclaringTyconRefOpt: TyconRef option * + ilType: ILMethParentTypeInfo * ilMethodDef: ILMethodDef * ilGenericMethodTyArgs: Typars @@ -278,7 +284,7 @@ type ILMethInfo = /// Any type parameters of the enclosing type are instantiated in the type returned. member GetParamNamesAndTypes: amap: ImportMap * m: range * minst: TType list -> ParamNameAndType list - /// Get the argument types of the the IL method. If this is an C#-style extension method + /// Get the argument types of the IL method. If this is an C#-style extension method /// then drop the object argument. member GetParamTypes: amap: ImportMap * m: range * minst: TType list -> TType list @@ -308,6 +314,9 @@ type MethInfo = /// Describes a use of a method backed by Abstract IL # metadata | ILMeth of tcGlobals: TcGlobals * ilMethInfo: ILMethInfo * extensionMethodPriority: ExtensionMethodPriority option + /// A pseudo-method used by F# typechecker to treat Object.ToString() of known types as returning regular string, not `string?` as in the BCL + | MethInfoWithModifiedReturnType of original: MethInfo * modifiedReturnType: TType + /// Describes a use of a pseudo-method corresponding to the default constructor for a .NET struct type | DefaultStructCtor of tcGlobals: TcGlobals * structTy: TType @@ -438,7 +447,7 @@ type MethInfo = /// Receiver must be a struct type. member IsReadOnly: bool - /// Indicates, wheter this method has `IsExternalInit` modreq. + /// Indicates, whether this method has `IsExternalInit` modreq. member HasExternalInit: bool /// Indicates if the enclosing type for the method is a value type. @@ -721,7 +730,7 @@ type ILPropInfo = /// Get the declaring IL type of the IL property, including any generic instantiation member ILTypeInfo: ILTypeInfo - /// Is the property requied (has the RequiredMemberAttribute). + /// Is the property required (has the RequiredMemberAttribute). member IsRequired: bool /// Indicates if the IL property is logically a 'newslot', i.e. hides any previous slots of the same name. @@ -816,10 +825,16 @@ type PropInfo = /// Indicates if this property has an associated setter method. member HasSetter: bool - /// Indidcates whether IL property has an init-only setter (i.e. has the `System.Runtime.CompilerServices.IsExternalInit` modifer) + member GetterAccessibility: Accessibility option + + member SetterAccessibility: Accessibility option + + member IsProtectedAccessibility: struct (bool * bool) + + /// Indicates whether IL property has an init-only setter (i.e. has the `System.Runtime.CompilerServices.IsExternalInit` modifier) member IsSetterInitOnly: bool - /// Is the property requied (has the RequiredMemberAttribute). + /// Is the property required (has the RequiredMemberAttribute). member IsRequired: bool member ImplementedSlotSignatures: SlotSig list @@ -1101,4 +1116,5 @@ val SettersOfPropInfos: pinfos: PropInfo list -> (MethInfo * PropInfo option) li val GettersOfPropInfos: pinfos: PropInfo list -> (MethInfo * PropInfo option) list -val (|DifferentGetterAndSetter|_|): pinfo: PropInfo -> (ValRef * ValRef) option +[] +val (|DifferentGetterAndSetter|_|): pinfo: PropInfo -> (ValRef * ValRef) voption diff --git a/src/fcs-fable/src/Compiler/CodeGen/EraseClosures.fs b/src/fcs-fable/src/Compiler/CodeGen/EraseClosures.fs index cf1499f0c3..df2604717e 100644 --- a/src/fcs-fable/src/Compiler/CodeGen/EraseClosures.fs +++ b/src/fcs-fable/src/Compiler/CodeGen/EraseClosures.fs @@ -572,17 +572,17 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = name = td.Name, genericParams = td.GenericParams, attributes = td.Attributes, - implements = [], + implements = emptyILInterfaceImpls, nestedTypes = emptyILTypeDefs, layout = ILTypeDefLayout.Auto, extends = Some cenv.mkILTyFuncTy, methods = mkILMethods (ctorMethodDef :: nowApplyMethDef :: nowMethods), fields = mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList()), - customAttrs = emptyILCustomAttrs, + customAttrs = emptyILCustomAttrsStored, methodImpls = emptyILMethodImpls, properties = emptyILProperties, events = emptyILEvents, - isKnownToBeAttribute = false, + additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls ) .WithSpecialName(false) @@ -706,17 +706,17 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = name = td.Name, genericParams = td.GenericParams, attributes = td.Attributes, - implements = [], + implements = emptyILInterfaceImpls, layout = ILTypeDefLayout.Auto, nestedTypes = emptyILTypeDefs, extends = Some nowEnvParentClass, methods = mkILMethods (ctorMethodDef :: nowApplyMethDef :: nowMethods), fields = mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList()), - customAttrs = emptyILCustomAttrs, + customAttrs = emptyILCustomAttrsStored, methodImpls = emptyILMethodImpls, properties = emptyILProperties, events = emptyILEvents, - isKnownToBeAttribute = false, + additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls ) .WithHasSecurity(false) diff --git a/src/fcs-fable/src/Compiler/CodeGen/EraseUnions.fs b/src/fcs-fable/src/Compiler/CodeGen/EraseUnions.fs index e21f76b307..7978810747 100644 --- a/src/fcs-fable/src/Compiler/CodeGen/EraseUnions.fs +++ b/src/fcs-fable/src/Compiler/CodeGen/EraseUnions.fs @@ -8,6 +8,8 @@ open FSharp.Compiler.IlxGenSupport open System.Collections.Generic open System.Reflection open Internal.Utilities.Library +open FSharp.Compiler.TypedTree +open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.Features open FSharp.Compiler.TcGlobals open FSharp.Compiler.AbstractIL.IL @@ -666,6 +668,7 @@ let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases) = let mkMethodsAndPropertiesForFields (addMethodGeneratedAttrs, addPropertyGeneratedAttrs) + (g: TcGlobals) access attr imports @@ -705,15 +708,28 @@ let mkMethodsAndPropertiesForFields for field in fields do let fspec = mkILFieldSpecInTy (ilTy, field.LowerName, field.Type) + let ilReturn = mkILReturn field.Type + + let ilReturn = + if TryFindILAttribute g.attrib_NullableAttribute field.ILField.CustomAttrs then + let attrs = + field.ILField.CustomAttrs.AsArray() + |> Array.filter (IsILAttrib g.attrib_NullableAttribute) + + ilReturn.WithCustomAttrs(mkILCustomAttrsFromArray attrs) + else + ilReturn + yield mkILNonGenericInstanceMethod ( "get_" + adjustFieldName hasHelpers field.Name, access, [], - mkILReturn field.Type, + ilReturn, mkMethodBody (true, [], 2, nonBranchingInstrsToCode [ mkLdarg 0us; mkNormalLdfld fspec ], attr, imports) ) |> addMethodGeneratedAttrs + ] basicProps, basicMethods @@ -789,7 +805,19 @@ let convAlternativeDef mkMakerName cuspec altName, cud.HelpersAccessibility, fields - |> Array.map (fun fd -> mkILParamNamed (fd.LowerName, fd.Type)) + |> Array.map (fun fd -> + let plainParam = mkILParamNamed (fd.LowerName, fd.Type) + + if TryFindILAttribute g.attrib_NullableAttribute fd.ILField.CustomAttrs then + let attrs = + fd.ILField.CustomAttrs.AsArray() + |> Array.filter (IsILAttrib g.attrib_NullableAttribute) + + { plainParam with + CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrsFromArray attrs) + } + else + plainParam) |> Array.toList, mkILReturn baseTy, mkMethodBody (true, locals, fields.Length + locals.Length, nonBranchingInstrsToCode ilInstrs, attr, imports) @@ -844,18 +872,39 @@ let convAlternativeDef | SpecialFSharpListHelpers -> let baseTesterMeths, baseTesterProps = - if - g.langVersion.SupportsFeature LanguageFeature.UnionIsPropertiesVisible - && cud.HasHelpers = AllHelpers - then - [], [] - elif cud.UnionCases.Length <= 1 then + if cud.UnionCases.Length <= 1 then [], [] elif repr.RepresentOneAlternativeAsNull info then [], [] else + let additionalAttributes = + if + g.checkNullness + && g.langFeatureNullness + && repr.RepresentAlternativeAsStructValue info + && not alt.IsNullary + then + let notnullfields = + alt.FieldDefs + // Fields that are nullable even from F# perspective has an [Nullable] attribute on them + // Non-nullable fields are implicit in F#, therefore not annotated separately + |> Array.filter (fun f -> TryFindILAttribute g.attrib_NullableAttribute f.ILField.CustomAttrs |> not) + + let fieldNames = + notnullfields + |> Array.map (fun f -> f.LowerName) + |> Array.append (notnullfields |> Array.map (fun f -> f.Name)) + + if fieldNames |> Array.isEmpty then + emptyILCustomAttrs + else + mkILCustomAttrsFromArray [| GetNotNullWhenTrueAttribute g fieldNames |] + + else + emptyILCustomAttrs + [ - mkILNonGenericInstanceMethod ( + (mkILNonGenericInstanceMethod ( "get_" + mkTesterName altName, cud.HelpersAccessibility, [], @@ -868,7 +917,8 @@ let convAlternativeDef attr, imports ) - ) + )) + .With(customAttrs = additionalAttributes) |> addMethodGeneratedAttrs ], [ @@ -891,7 +941,7 @@ let convAlternativeDef propertyType = g.ilg.typ_Bool, init = None, args = [], - customAttrs = emptyILCustomAttrs + customAttrs = additionalAttributes ) |> addPropertyGeneratedAttrs |> addPropertyNeverAttrs @@ -900,13 +950,31 @@ let convAlternativeDef let baseMakerMeths, baseMakerProps = if alt.IsNullary then + let attributes = + if + g.checkNullness + && g.langFeatureNullness + && repr.RepresentAlternativeAsNull(info, alt) + then + let noTypars = td.GenericParams.Length + + GetNullableAttribute + g + [ + yield NullnessInfo.WithNull // The top-level value itself, e.g. option, is nullable + yield! List.replicate noTypars NullnessInfo.AmbivalentToNull + ] // The typars are not (i.e. do not change option into option + |> Array.singleton + |> mkILCustomAttrsFromArray + else + emptyILCustomAttrs let nullaryMeth = mkILNonGenericStaticMethod ( "get_" + altName, cud.HelpersAccessibility, [], - mkILReturn baseTy, + (mkILReturn baseTy).WithCustomAttrs attributes, mkMethodBody ( true, [], @@ -930,7 +998,7 @@ let convAlternativeDef propertyType = baseTy, init = None, args = [], - customAttrs = emptyILCustomAttrs + customAttrs = attributes ) |> addPropertyGeneratedAttrs |> addPropertyNeverAttrs @@ -1103,6 +1171,7 @@ let convAlternativeDef let basicProps, basicMethods = mkMethodsAndPropertiesForFields (addMethodGeneratedAttrs, addPropertyGeneratedAttrs) + g cud.UnionCasesAccessibility attr imports @@ -1136,6 +1205,12 @@ let convAlternativeDef .With(customAttrs = mkILCustomAttrs [ GetDynamicDependencyAttribute g 0x660 baseTy ]) |> addMethodGeneratedAttrs + let attrs = + if g.checkNullness && g.langFeatureNullness then + GetNullableContextAttribute g 1uy :: debugAttrs + else + debugAttrs + let altTypeDef = mkILGenericClass ( altTy.TypeSpec.Name, @@ -1154,7 +1229,7 @@ let convAlternativeDef emptyILTypeDefs, mkILProperties basicProps, emptyILEvents, - mkILCustomAttrs debugAttrs, + mkILCustomAttrs attrs, ILTypeInit.BeforeField ) @@ -1276,8 +1351,59 @@ let mkClassUnionDef |> addMethodGeneratedAttrs ] + let fieldDefs = + // Since structs are flattened out for all cases together, all boxed fields are potentially nullable + if + isStruct + && cud.UnionCases.Length > 1 + && g.checkNullness + && g.langFeatureNullness + then + alt.FieldDefs + |> Array.map (fun field -> + if field.Type.IsNominal && field.Type.Boxity = AsValue then + field + else + let attrs = + let existingAttrs = field.ILField.CustomAttrs.AsArray() + + let nullableIdx = + existingAttrs |> Array.tryFindIndex (IsILAttrib g.attrib_NullableAttribute) + + match nullableIdx with + | None -> + existingAttrs + |> Array.append [| GetNullableAttribute g [ NullnessInfo.WithNull ] |] + | Some idx -> + let replacementAttr = + match existingAttrs[idx] with + (* + The attribute carries either a single byte, or a list of bytes for the fields itself and all its generic type arguments + The way we lay out DUs does not affect nullability of the typars of a field, therefore we just change the very first byte + If the field was already declared as nullable (value = 2uy) or ambivalent(value = 0uy), we can keep it that way + If it was marked as non-nullable within that UnionCase, we have to convert it to WithNull (2uy) due to other cases being possible + *) + | Encoded(method, _data, [ ILAttribElem.Byte 1uy ]) -> + mkILCustomAttribMethRef (method, [ ILAttribElem.Byte 2uy ], []) + | Encoded(method, + _data, + [ ILAttribElem.Array(elemType, (ILAttribElem.Byte 1uy) :: otherElems) ]) -> + mkILCustomAttribMethRef ( + method, + [ ILAttribElem.Array(elemType, (ILAttribElem.Byte 2uy) :: otherElems) ], + [] + ) + | attrAsBefore -> attrAsBefore + + existingAttrs |> Array.replace idx replacementAttr + + field.ILField.With(customAttrs = mkILCustomAttrsFromArray attrs) + |> IlxUnionCaseField) + else + alt.FieldDefs + let fieldsToBeAddedIntoType = - alt.FieldDefs + fieldDefs |> Array.filter (fun f -> fieldsEmitted.Add(struct (f.LowerName, f.Type))) let fields = fieldsToBeAddedIntoType |> Array.map mkUnionCaseFieldId |> Array.toList @@ -1285,6 +1411,7 @@ let mkClassUnionDef let props, meths = mkMethodsAndPropertiesForFields (addMethodGeneratedAttrs, addPropertyGeneratedAttrs) + g cud.UnionCasesAccessibility cud.DebugPoint cud.DebugImports @@ -1444,7 +1571,7 @@ let mkClassUnionDef genericParams = td.GenericParams, attributes = enum 0, layout = ILTypeDefLayout.Auto, - implements = [], + implements = emptyILInterfaceImpls, extends = Some g.ilg.typ_Object, methods = emptyILMethods, securityDecls = emptyILSecurityDecls, @@ -1452,8 +1579,8 @@ let mkClassUnionDef methodImpls = emptyILMethodImpls, events = emptyILEvents, properties = emptyILProperties, - isKnownToBeAttribute = false, - customAttrs = emptyILCustomAttrs + additionalFlags = ILTypeDefAdditionalFlags.None, + customAttrs = emptyILCustomAttrsStored ) .WithNestedAccess(cud.UnionCasesAccessibility) .WithAbstract(true) @@ -1494,7 +1621,15 @@ let mkClassUnionDef @ List.map (fun (_, _, _, _, fdef, _) -> fdef) altNullaryFields @ td.Fields.AsList() ), - properties = mkILProperties (tagProps @ basePropsFromAlt @ selfProps @ existingProps) + properties = mkILProperties (tagProps @ basePropsFromAlt @ selfProps @ existingProps), + customAttrs = + if cud.IsNullPermitted && g.checkNullness && g.langFeatureNullness then + td.CustomAttrs.AsArray() + |> Array.append [| GetNullableAttribute g [ NullnessInfo.WithNull ] |] + |> mkILCustomAttrsFromArray + |> storeILCustomAttrs + else + td.CustomAttrsStored ) // The .cctor goes on the Cases type since that's where the constant fields for nullary constructors live |> addConstFieldInit diff --git a/src/fcs-fable/src/Compiler/CodeGen/IlxGen.fs b/src/fcs-fable/src/Compiler/CodeGen/IlxGen.fs index b7492a6836..76310bf048 100644 --- a/src/fcs-fable/src/Compiler/CodeGen/IlxGen.fs +++ b/src/fcs-fable/src/Compiler/CodeGen/IlxGen.fs @@ -5,6 +5,7 @@ module internal FSharp.Compiler.IlxGen open FSharp.Compiler.IlxGenSupport +open System open System.IO open System.Reflection open System.Collections.Generic @@ -91,7 +92,7 @@ let ChooseParamNames fieldNamesAndTypes = ilParamName, ilFieldName, ilPropType) /// Approximation for purposes of optimization and giving a warning when compiling definition-only files as EXEs -let rec CheckCodeDoesSomething (code: ILCode) = +let CheckCodeDoesSomething (code: ILCode) = code.Instrs |> Array.exists (function | AI_ldnull @@ -218,15 +219,17 @@ let CountStaticFieldDef = NewCounter "IL field definitions corresponding to valu let CountCallFuncInstructions = NewCounter "callfunc instructions (indirect calls)" /// Non-local information related to internals of code generation within an assembly -type IlxGenIntraAssemblyInfo = - { - /// A table recording the generated name of the static backing fields for each mutable top level value where - /// we may need to take the address of that value, e.g. static mutable module-bound values which are structs. These are - /// only accessible intra-assembly. Across assemblies, taking the address of static mutable module-bound values is not permitted. - /// The key to the table is the method ref for the property getter for the value, which is a stable name for the Val's - /// that come from both the signature and the implementation. - StaticFieldInfo: ConcurrentDictionary - } +/// A table recording the generated name of the static backing fields for each mutable top level value where +/// we may need to take the address of that value, e.g. static mutable module-bound values which are structs. These are +/// only accessible intra-assembly. Across assemblies, taking the address of static mutable module-bound values is not permitted. +/// The key to the table is the method ref for the property getter for the value, which is a stable name for the Val's +/// that come from both the signature and the implementation. +type IlxGenIntraAssemblyInfo(staticFieldInfo: ConcurrentDictionary) = + + static member Create() = + new IlxGenIntraAssemblyInfo(new ConcurrentDictionary<_, _>(HashIdentity.Structural)) + + member _.GetOrAddStaticFieldInfo(info: ILMethodRef, f: System.Func) = staticFieldInfo.GetOrAdd(info, f) /// Helper to make sure we take tailcalls in some situations type FakeUnit = | Fake @@ -319,9 +322,6 @@ type cenv = /// Cache the generation of the "unit" type mutable ilUnitTy: ILType option - /// Other information from the emit of this assembly - intraAssemblyInfo: IlxGenIntraAssemblyInfo - /// Cache methods with SecurityAttribute applied to them, to prevent unnecessary calls to ExistsInEntireHierarchyOfType casApplied: IDictionary @@ -413,7 +413,7 @@ let CompLocForSubModuleOrNamespace cloc (submod: ModuleOrNamespace) = Namespace = Some(mkTopName cloc.Namespace n) } -let CompLocForFixedPath fragName qname (CompPath(sref, cpath)) = +let CompLocForFixedPath fragName qname (CompPath(sref, _, cpath)) = let ns, t = cpath |> List.takeUntil (fun (_, mkind) -> @@ -424,7 +424,7 @@ let CompLocForFixedPath fragName qname (CompPath(sref, cpath)) = let ns = List.map fst ns let ns = textOfPath ns let encl = t |> List.map (fun (s, _) -> s) - let ns = if ns = "" then None else Some ns + let ns = if String.IsNullOrEmpty(ns) then None else Some ns { QualifiedNameOfFile = fragName @@ -479,7 +479,7 @@ let CompLocForPrivateImplementationDetails cloc = } /// Compute an ILTypeRef for a CompilationLocation -let rec TypeRefForCompLoc cloc = +let TypeRefForCompLoc cloc = match cloc.Enclosing with | [] -> mkILTyRef (cloc.Scope, TypeNameForPrivateImplementationDetails cloc) | [ h ] -> @@ -493,23 +493,31 @@ let rec TypeRefForCompLoc cloc = let mkILTyForCompLoc cloc = mkILNonGenericBoxedTy (TypeRefForCompLoc cloc) -let ComputeMemberAccess hidden = - if hidden then +/// Compute visibility for type members +/// based on hidden and accessibility from the source code +/// when hidden and realsig is specified then +/// as typed in source code, I.e internal or public +/// when hidden and not realsig is specified then +/// then they are internal, old behaviour (anything not public is internal) +/// otherwise it is public, by definition +let ComputeMemberAccess hidden (accessibility: Accessibility) realsig = + + if (not accessibility.IsPublic) && realsig then + accessibility.AsILMemberAccess() + elif hidden then ILMemberAccess.Assembly else ILMemberAccess.Public -// Under --publicasinternal change types from Public to Private (internal for types) -let ComputePublicTypeAccess () = ILTypeDefAccess.Public +let ComputeTypeAccess (tref: ILTypeRef) hidden (accessibility: Accessibility) realsig = -let ComputeTypeAccess (tref: ILTypeRef) hidden = match tref.Enclosing with | [] -> if hidden then ILTypeDefAccess.Private else - ComputePublicTypeAccess() - | _ -> ILTypeDefAccess.Nested(ComputeMemberAccess hidden) + ILTypeDefAccess.Public + | _ -> ILTypeDefAccess.Nested(ComputeMemberAccess hidden accessibility realsig) //-------------------------------------------------------------------------- // TypeReprEnv @@ -638,7 +646,8 @@ and GenNamedTyAppAux (cenv: cenv) m (tyenv: TypeReprEnv) ptrsOK tcref tinst = #if !NO_TYPEPROVIDERS match tcref.TypeReprInfo with // Generate the base type, because that is always the representation of the erased type, unless the assembly is being injected - | TProvidedTypeRepr info when info.IsErased -> GenTypeAux cenv m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased(m, g.obj_ty)) + | TProvidedTypeRepr info when info.IsErased -> + GenTypeAux cenv m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased(m, g.obj_ty_withNulls)) | _ -> #endif GenTyAppAux cenv m tyenv (GenTyconRef tcref) tinst @@ -697,15 +706,11 @@ and GenUnionCaseRef (cenv: cenv) m tyenv i (fspecs: RecdField[]) = let ilFieldDef = mkILInstanceField (fspec.LogicalName, GenType cenv m tyenv fspec.FormalType, None, ILMemberAccess.Public) // These properties on the "field" of an alternative end up going on a property generated by cu_erase.fs - IlxUnionCaseField( - ilFieldDef.With( - customAttrs = - mkILCustomAttrs - [ - (mkCompilationMappingAttrWithVariantNumAndSeqNum g (int SourceConstructFlags.Field) i j) - ] - ) - )) + let attrs = + (mkCompilationMappingAttrWithVariantNumAndSeqNum g (int SourceConstructFlags.Field) i j) + :: GenAdditionalAttributesForTy g fspec.FormalType + + IlxUnionCaseField(ilFieldDef.With(customAttrs = mkILCustomAttrs attrs))) and GenUnionRef (cenv: cenv) m (tcref: TyconRef) = let g = cenv.g @@ -808,7 +813,7 @@ and GenTypeArgs cenv m tyenv tyargs = GenTypeArgsAux cenv m tyenv tyargs // fields are initialized only in their class constructors (we generate one primary // cctor for each file to ensure initialization coherence across the file, regardless // of how many modules are in the file). This means F# passes an extra check applied by SQL Server when it -// verifies stored procedures: SQL Server checks that all 'initionly' static fields are only initialized from +// verifies stored procedures: SQL Server checks that all 'initonly' static fields are only initialized from // their own class constructor. // // However, mutable static fields must be accessible across compilation units. This means we place them in their "natural" location @@ -817,17 +822,22 @@ and GenTypeArgs cenv m tyenv tyargs = GenTypeArgsAux cenv m tyenv tyargs // Computes the location where the static field for a value lives. // - Literals go in their type/module. // - For interactive code, we always place fields in their type/module with an accurate name -let GenFieldSpecForStaticField (isInteractive, g, ilContainerTy, vspec: Val, nm, m, cloc, ilTy) = - if isInteractive || HasFSharpAttribute g g.attrib_LiteralAttribute vspec.Attribs then - let fieldName = vspec.CompiledName g.CompilerGlobalState +let GenFieldSpecForStaticField (isInteractive, (g: TcGlobals), ilContainerTy, vspec: Val, nm, m, cloc, ilTy) = - let fieldName = - if isInteractive then - CompilerGeneratedName fieldName - else - fieldName + let fieldName = vspec.CompiledName g.CompilerGlobalState + if HasFSharpAttribute g g.attrib_LiteralAttribute vspec.Attribs then mkILFieldSpecInTy (ilContainerTy, fieldName, ilTy) + elif isInteractive then + mkILFieldSpecInTy (ilContainerTy, CompilerGeneratedName fieldName, ilTy) + elif g.realsig then + assert (g.CompilerGlobalState |> Option.isSome) + + mkILFieldSpecInTy ( + ilContainerTy, + CompilerGeneratedName(g.CompilerGlobalState.Value.IlxGenNiceNameGenerator.FreshCompilerGeneratedName(nm, m)), + ilTy + ) else let fieldName = // Ensure that we have an g.CompilerGlobalState @@ -922,7 +932,7 @@ type ArityInfo = int list // // or, for witnesses: // -// let inline incr{addWitnessForT} (x: 'T) = x + GenericZero<'T> // has witness argment for '+' +// let inline incr{addWitnessForT} (x: 'T) = x + GenericZero<'T> // has witness argument for '+' // // LAM <'T when 'T :... op_Addition ...>{addWitnessForT}. (incr<'T>{addWitnessForT}, incr<'U>{addWitnessForU}, incr<'V>{addWitnessForV}) : ('T -> 'T) * ('U -> 'U) * ('V -> 'V) // directTypars = 'T @@ -1153,6 +1163,18 @@ and IlxGenEnv = /// Indicates the default "place" for stuff we're currently generating cloc: CompileLocation + /// Indicates the default "place" for initialization stuff we're currently generating + initClassCompLoc: CompileLocation option + + /// Per sourcefile initclass fieldspec + initClassFieldSpec: Lazy option + + /// Indicates the name used for static initialization fields + initFieldName: string + + /// Indicates the name used for static initialization method + staticInitializationName: string + /// The sequel to use for an "early exit" in a state machine, e.g. a return from the middle of an /// async block exitSequel: sequel @@ -1197,6 +1219,11 @@ and IlxGenEnv = /// Collection of code-gen functions where each inner array represents codegen (method bodies) functions for a single file delayedFileGenReverse: list<(unit -> unit)[]> + + /// Other information from the emit of this assembly + intraAssemblyInfo: IlxGenIntraAssemblyInfo + + realsig: bool } override _.ToString() = "" @@ -1220,6 +1247,15 @@ let EnvForTycon tps eenv = tyenv = eenv.tyenv.ForTycon tps } +let AddEnclosingToEnv eenv enclosing name ns = + { eenv with + cloc = + { eenv.cloc with + Enclosing = enclosing @ [ name ] + Namespace = ns + } + } + let AddTyparsToEnv typars (eenv: IlxGenEnv) = { eenv with tyenv = eenv.tyenv.Add typars @@ -1355,7 +1391,7 @@ let GetMethodSpecForMemberVal cenv (memberInfo: ValMemberInfo) (vref: ValRef) = if isCtor || cctor then ILType.Void else ilRetTy let ilTy = - GenType cenv m tyenvUnderTypars (mkAppTy parentTcref (List.map mkTyparTy ctps)) + GenType cenv m tyenvUnderTypars (mkWoNullAppTy parentTcref (List.map mkTyparTy ctps)) let nm = vref.CompiledName g.CompilerGlobalState @@ -1461,20 +1497,23 @@ let ComputeFieldSpecForVal match optIntraAssemblyInfo with | None -> generate () - | Some iai -> iai.StaticFieldInfo.GetOrAdd(ilGetterMethRef, (fun _ -> generate ())) + | Some intraAssemblyInfo -> intraAssemblyInfo.GetOrAddStaticFieldInfo(ilGetterMethRef, (fun _ -> generate ())) /// Compute the representation information for an F#-declared value (not a member nor a function). /// Mutable and literal static fields must have stable names and live in the "public" location -let ComputeStorageForFSharpValue amap (g: TcGlobals) cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy (vref: ValRef) m = - let nm = vref.CompiledName g.CompilerGlobalState +let ComputeStorageForFSharpValue cenv cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy (vref: ValRef) m = + let nm = vref.CompiledName cenv.g.CompilerGlobalState let vspec = vref.Deref let ilTy = - GenType amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) + GenType cenv m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) let ilTyForProperty = mkILTyForCompLoc cloc let attribs = vspec.Attribs - let hasLiteralAttr = HasFSharpAttribute g g.attrib_LiteralAttribute attribs + + let hasLiteralAttr = + HasFSharpAttribute cenv.g cenv.g.attrib_LiteralAttribute attribs + let ilTypeRefForProperty = ilTyForProperty.TypeRef let ilGetterMethRef = @@ -1484,7 +1523,7 @@ let ComputeStorageForFSharpValue amap (g: TcGlobals) cloc optIntraAssemblyInfo o mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_" + nm, 0, [ ilTy ], ILType.Void) let ilFieldSpec = - ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) + ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, cenv.g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) StaticPropertyWithField(ilFieldSpec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) @@ -1546,7 +1585,6 @@ let IsFSharpValCompiledAsMethod g (v: Val) = let ComputeStorageForValWithValReprInfo ( cenv, - g, optIntraAssemblyInfo: IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, @@ -1554,7 +1592,11 @@ let ComputeStorageForValWithValReprInfo cloc ) = - if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then + if + isUnitTy cenv.g vref.Type + && not vref.IsMemberOrModuleBinding + && not vref.IsMutable + then Null else let valReprInfo = @@ -1570,7 +1612,7 @@ let ComputeStorageForValWithValReprInfo | Some a -> a let m = vref.Range - let nm = vref.CompiledName g.CompilerGlobalState + let nm = vref.CompiledName cenv.g.CompilerGlobalState if vref.Deref.IsCompiledAsStaticPropertyWithoutField then let nm = "get_" + nm @@ -1586,35 +1628,34 @@ let ComputeStorageForValWithValReprInfo // // REVIEW: This call to GetValReprTypeInFSharpForm is only needed to determine if this is a (type) function or a value // We should just look at the arity - match GetValReprTypeInFSharpForm g valReprInfo vref.Type vref.Range with + match GetValReprTypeInFSharpForm cenv.g valReprInfo vref.Type vref.Range with | [], [], returnTy, _ when not vref.IsMember -> - ComputeStorageForFSharpValue cenv g cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy vref m + ComputeStorageForFSharpValue cenv cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy vref m | _ -> match vref.MemberInfo with | Some memberInfo when not vref.IsExtensionMember -> ComputeStorageForFSharpMember cenv valReprInfo memberInfo vref m | _ -> ComputeStorageForFSharpFunctionOrFSharpExtensionMember cenv cloc valReprInfo vref m /// Determine how an F#-declared value, function or member is represented, if it is in the assembly being compiled. -let ComputeAndAddStorageForLocalValWithValReprInfo (cenv, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v: Val) eenv = +let ComputeAndAddStorageForLocalValWithValReprInfo (cenv, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v: Val) eenv = let storage = - ComputeStorageForValWithValReprInfo(cenv, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) + ComputeStorageForValWithValReprInfo(cenv, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) - AddStorageForVal g (v, notlazy storage) eenv + AddStorageForVal cenv.g (v, notlazy storage) eenv /// Determine how an F#-declared value, function or member is represented, if it is an external assembly. -let ComputeStorageForNonLocalVal cenv g cloc modref (v: Val) = +let ComputeStorageForNonLocalVal cenv cloc modref (v: Val) = match v.ValReprInfo with | None -> error (InternalError("ComputeStorageForNonLocalVal, expected an ValReprInfo for " + v.LogicalName, v.Range)) - | Some _ -> ComputeStorageForValWithValReprInfo(cenv, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) + | Some _ -> ComputeStorageForValWithValReprInfo(cenv, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) /// Determine how all the F#-declared top level values, functions and members are represented, for an external module or namespace. -let rec AddStorageForNonLocalModuleOrNamespaceRef cenv g cloc acc (modref: ModuleOrNamespaceRef) (modul: ModuleOrNamespace) = +let rec AddStorageForNonLocalModuleOrNamespaceRef cenv cloc acc (modref: ModuleOrNamespaceRef) (modul: ModuleOrNamespace) = let acc = (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> AddStorageForNonLocalModuleOrNamespaceRef cenv - g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) @@ -1623,12 +1664,12 @@ let rec AddStorageForNonLocalModuleOrNamespaceRef cenv g cloc acc (modref: Modul let acc = (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, InterruptibleLazy(fun _ -> ComputeStorageForNonLocalVal cenv g cloc modref v)) acc) + AddStorageForVal cenv.g (v, InterruptibleLazy(fun _ -> ComputeStorageForNonLocalVal cenv cloc modref v)) acc) acc /// Determine how all the F#-declared top level values, functions and members are represented, for an external assembly. -let AddStorageForExternalCcu cenv g eenv (ccu: CcuThunk) = +let AddStorageForExternalCcu cenv eenv (ccu: CcuThunk) = if not ccu.IsFSharp then eenv else @@ -1639,7 +1680,7 @@ let AddStorageForExternalCcu cenv g eenv (ccu: CcuThunk) = (fun smodul acc -> let cloc = CompLocForSubModuleOrNamespace cloc smodul let modref = mkNonLocalCcuRootEntityRef ccu smodul - AddStorageForNonLocalModuleOrNamespaceRef cenv g cloc acc modref smodul) + AddStorageForNonLocalModuleOrNamespaceRef cenv cloc acc modref smodul) ccu.RootModulesAndNamespaces eenv @@ -1648,7 +1689,7 @@ let AddStorageForExternalCcu cenv g eenv (ccu: CcuThunk) = (eenv, ccu.Contents.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, InterruptibleLazy(fun _ -> ComputeStorageForNonLocalVal cenv g cloc eref v)) acc) + AddStorageForVal cenv.g (v, InterruptibleLazy(fun _ -> ComputeStorageForNonLocalVal cenv cloc eref v)) acc) eenv @@ -1669,8 +1710,8 @@ let rec AddBindingsForLocalModuleOrNamespaceType allocVal cloc eenv (mty: Module eenv /// Record how all the top level F#-declared values, functions and members are represented, for a set of referenced assemblies. -let AddExternalCcusToIlxGenEnv cenv g eenv ccus = - List.fold (AddStorageForExternalCcu cenv g) eenv ccus +let AddExternalCcusToIlxGenEnv cenv eenv ccus = + List.fold (AddStorageForExternalCcu cenv) eenv ccus /// Record how all the unrealized abstract slots are represented, for a type definition. let AddBindingsForTycon allocVal (cloc: CompileLocation) (tycon: Tycon) eenv = @@ -1766,21 +1807,11 @@ and AddBindingsForModuleOrNamespaceBinding allocVal cloc x eenv = /// into the stored results for the whole CCU. /// isIncrementalFragment = true --> "typed input" /// isIncrementalFragment = false --> "#load" -let AddIncrementalLocalAssemblyFragmentToIlxGenEnv - ( - cenv: cenv, - isIncrementalFragment, - g, - ccu, - fragName, - intraAssemblyInfo, - eenv, - implFiles - ) = +let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (cenv: cenv, isIncrementalFragment, ccu, fragName, eenv, implFiles) = let cloc = CompLocForFragment fragName ccu let allocVal = - ComputeAndAddStorageForLocalValWithValReprInfo(cenv, g, intraAssemblyInfo, true, NoShadowLocal) + ComputeAndAddStorageForLocalValWithValReprInfo(cenv, eenv.intraAssemblyInfo, true, NoShadowLocal) (eenv, implFiles) ||> List.fold (fun eenv implFile -> @@ -1882,13 +1913,30 @@ type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = let gevents = ResizeArray(tdef.Events.AsList()) let gnested = TypeDefsBuilder() - member _.Close() = + member _.Close(g: TcGlobals) = + + let attrs = + if g.checkNullness && g.langFeatureNullness then + let attrsBefore = tdef.CustomAttrs + + [| + yield! attrsBefore.AsArray() + if attrsBefore |> TryFindILAttribute g.attrib_AllowNullLiteralAttribute then + yield GetNullableAttribute g [ NullnessInfo.WithNull ] + if (gmethods.Count + gfields.Count + gproperties.Count) > 0 then + yield GetNullableContextAttribute g 1uy + |] + |> mkILCustomAttrsFromArray + else + tdef.CustomAttrs + tdef.With( methods = mkILMethods (ResizeArray.toList gmethods), fields = mkILFields (ResizeArray.toList gfields), properties = mkILProperties (tdef.Properties.AsList() @ HashRangeSorted gproperties), events = mkILEvents (ResizeArray.toList gevents), - nestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList() @ gnested.Close()) + nestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList() @ gnested.Close(g)), + customAttrs = storeILCustomAttrs attrs ) member _.AddEventDef edef = gevents.Add edef @@ -1919,7 +1967,16 @@ type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = if not discard then AddPropertyDefToHash m gproperties pdef - member _.PrependInstructionsToSpecificMethodDef(cond, instrs, tag, imports) = + member _.AppendInstructionsToSpecificMethodDef(cond, instrs, tag, imports) = + match ResizeArray.tryFindIndex cond gmethods with + | Some idx -> gmethods[idx] <- appendInstrsToMethod instrs gmethods[idx] + | None -> + let body = + mkMethodBody (false, [], 1, nonBranchingInstrsToCode instrs, tag, imports) + + gmethods.Add(mkILClassCtor body) + + member this.PrependInstructionsToSpecificMethodDef(cond, instrs, tag, imports) = match ResizeArray.tryFindIndex cond gmethods with | Some idx -> gmethods[idx] <- prependInstrsToMethod instrs gmethods[idx] | None -> @@ -1928,6 +1985,10 @@ type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = gmethods.Add(mkILClassCtor body) + this + + member _.ILTypeDef = tdef + and TypeDefsBuilder() = let tdefs = @@ -1936,14 +1997,14 @@ and TypeDefsBuilder() = let mutable countDown = System.Int32.MaxValue let mutable countUp = -1 - member b.Close() = + member b.Close(g: TcGlobals) = //The order we emit type definitions is not deterministic since it is using the reverse of a range from a hash table. We should use an approximation of source order. // Ideally it shouldn't matter which order we use. // However, for some tests FSI generated code appears sensitive to the order, especially for nested types. [ for _, (b, eliminateIfEmpty) in tdefs.Values |> Seq.collect id |> Seq.sortBy fst do - let tdef = b.Close() + let tdef = b.Close(g) // Skip the type if it is empty if not eliminateIfEmpty @@ -2021,6 +2082,7 @@ type AnonTypeGenerationTable() = HasReferenceTypeConstraint = false HasNotNullableValueTypeConstraint = false HasDefaultConstructorConstraint = false + HasAllowsRefStruct = false MetadataIndex = NoMetadataIdx } ] @@ -2033,14 +2095,7 @@ type AnonTypeGenerationTable() = mkILFields [ for _, fldName, fldTy in flds -> - - let access = - if cenv.options.isInteractive && cenv.options.fsiMultiAssemblyEmit then - ILMemberAccess.Public - else - ILMemberAccess.Private - - let fdef = mkILInstanceField (fldName, fldTy, None, access) + let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) let attrs = [ g.CompilerGeneratedAttribute; g.DebuggerBrowsableNeverAttribute ] fdef.With(customAttrs = mkILCustomAttrs attrs) ] @@ -2093,7 +2148,7 @@ type AnonTypeGenerationTable() = let tycon = let lmtyp = MaybeLazy.Strict(Construct.NewEmptyModuleOrNamespaceType ModuleOrType) - let cpath = CompPath(ilTypeRef.Scope, []) + let cpath = CompPath(ilTypeRef.Scope, SyntaxAccess.Unknown, []) Construct.NewTycon( Some cpath, @@ -2147,14 +2202,14 @@ type AnonTypeGenerationTable() = [ (g.mk_IStructuralComparable_ty, true, m) (g.mk_IComparable_ty, true, m) - (mkAppTy g.system_GenericIComparable_tcref [ ty ], true, m) + (mkWoNullAppTy g.system_GenericIComparable_tcref [ ty ], true, m) (g.mk_IStructuralEquatable_ty, true, m) - (mkAppTy g.system_GenericIEquatable_tcref [ ty ], true, m) + (mkWoNullAppTy g.system_GenericIEquatable_tcref [ ty ], true, m) ] let vspec1, vspec2 = AugmentTypeDefinitions.MakeValsForEqualsAugmentation g tcref - let evspec1, evspec2, evspec3 = + let augmentation = AugmentTypeDefinitions.MakeValsForEqualityWithComparerAugmentation g tcref let cvspec1, cvspec2 = AugmentTypeDefinitions.MakeValsForCompareAugmentation g tcref @@ -2165,7 +2220,13 @@ type AnonTypeGenerationTable() = tcaug.SetCompare(mkLocalValRef cvspec1, mkLocalValRef cvspec2) tcaug.SetCompareWith(mkLocalValRef cvspec3) tcaug.SetEquals(mkLocalValRef vspec1, mkLocalValRef vspec2) - tcaug.SetHashAndEqualsWith(mkLocalValRef evspec1, mkLocalValRef evspec2, mkLocalValRef evspec3) + + tcaug.SetHashAndEqualsWith( + mkLocalValRef augmentation.GetHashCode, + mkLocalValRef augmentation.GetHashCodeWithComparer, + mkLocalValRef augmentation.EqualsWithComparer, + Some(mkLocalValRef augmentation.EqualsExactWithComparer) + ) // Build the ILTypeDef. We don't rely on the normal record generation process because we want very specific field names @@ -2178,7 +2239,8 @@ type AnonTypeGenerationTable() = let ilInterfaceTys = [ - for intfTy, _, _ in tcaug.tcaug_interfaces -> GenType cenv m (TypeReprEnv.Empty.ForTypars tps) intfTy + for intfTy, _, _ in tcaug.tcaug_interfaces -> + GenType cenv m (TypeReprEnv.Empty.ForTypars tps) intfTy |> InterfaceImpl.Create ] let ilTypeDef = @@ -2264,7 +2326,10 @@ and AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf let vtdef = mkRawDataValueTypeDef g.iltyp_ValueType (name, size, 0us) let vtref = NestedTypeRefForCompLoc cloc vtdef.Name let vtspec = mkILTySpec (vtref, []) - let vtdef = vtdef.WithAccess(ComputeTypeAccess vtref true) + + let vtdef = + vtdef.WithAccess(ComputeTypeAccess vtref true taccessInternal cenv.g.realsig) + mgbuf.AddTypeDef(vtref, vtdef, false, true, None) vtspec), keyComparer = HashIdentity.Structural @@ -2275,6 +2340,22 @@ and AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf /// static init fields on script modules. let scriptInitFspecs = ConcurrentStack() + let initialInstrs seqpt feefee = + [ + yield! + (if isEnvVarSet "NO_ADD_FEEFEE_TO_CCTORS" then [] + elif isEnvVarSet "ADD_SEQPT_TO_CCTORS" then seqpt + else feefee) // mark start of hidden code + ] + + let finalInstrs fspec = + [ + yield mkLdcInt32 0 + yield mkNormalStsfld fspec + yield mkNormalLdsfld fspec + yield AI_pop + ] + member _.AddScriptInitFieldSpec(fieldSpec, range) = scriptInitFspecs.Push((fieldSpec, range)) @@ -2287,15 +2368,7 @@ and AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf let InitializeCompiledScript (fspec, m) = let ilDebugRange = GenPossibleILDebugRange cenv m - mgbuf.AddExplicitInitToSpecificMethodDef( - (fun (md: ILMethodDef) -> md.IsEntryPoint), - tref, - fspec, - ilDebugRange, - imports, - [], - [] - ) + mgbuf.AddExplicitInitToEntryPoint(tref, fspec, ilDebugRange, imports, [], []) scriptInitFspecs |> Seq.iter InitializeCompiledScript | None -> () @@ -2321,6 +2394,8 @@ and AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf .FindNestedTypeDefsBuilder(tref.Enclosing) .AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) + member _.FindNestedTypeDefBuilder(tref: ILTypeRef) = gtdefs.FindNestedTypeDefBuilder(tref) + member _.GetCurrentFields(tref: ILTypeRef) = gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields() @@ -2336,24 +2411,23 @@ and AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf if ilMethodDef.IsEntryPoint then explicitEntryPointInfo <- Some tref - member _.AddExplicitInitToSpecificMethodDef(cond, tref, fspec, sourceOpt, imports, feefee, seqpt) = - // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field - // Doing both a store and load keeps FxCop happier because it thinks the field is useful - let instrs = - [ - yield! - (if isEnvVarSet "NO_ADD_FEEFEE_TO_CCTORS" then [] - elif isEnvVarSet "ADD_SEQPT_TO_CCTORS" then seqpt - else feefee) // mark start of hidden code - yield mkLdcInt32 0 - yield mkNormalStsfld fspec - yield mkNormalLdsfld fspec - yield AI_pop - ] + member _.AddExplicitInitToEntryPoint(tref, fspec, sourceOpt, imports, feefee, seqpt) = + + let cond = (fun (md: ILMethodDef) -> md.IsEntryPoint) + + gtdefs + .FindNestedTypeDefBuilder(tref) + .PrependInstructionsToSpecificMethodDef(cond, (initialInstrs seqpt feefee) @ (finalInstrs fspec), sourceOpt, imports) + |> ignore + + member _.AddExplicitInitToCctor(tref, fspec, sourceOpt, imports, feefee, seqpt) = + + let cond = (fun (md: ILMethodDef) -> md.Name = ".cctor") gtdefs .FindNestedTypeDefBuilder(tref) - .PrependInstructionsToSpecificMethodDef(cond, instrs, sourceOpt, imports) + .PrependInstructionsToSpecificMethodDef(cond, initialInstrs seqpt feefee, sourceOpt, imports) + .AppendInstructionsToSpecificMethodDef(cond, finalInstrs fspec, sourceOpt, imports) member _.AddEventDef(tref, edef) = gtdefs.FindNestedTypeDefBuilder(tref).AddEventDef(edef) @@ -2373,7 +2447,7 @@ and AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf |> List.sortBy (fst >> (~-)) // invert the result to get 'order-by-descending' behavior (items in list are 0..* so we don't need to worry about int.MinValue) |> List.map snd - gtdefs.Close(), orderedReflectedDefinitions + gtdefs.Close(g), orderedReflectedDefinitions member _.cenv = cenv @@ -2710,7 +2784,7 @@ let CodeGenThen (cenv: cenv) mgbuf (entryPointInfo, methodName, eenv, alreadyUse match selfArgOpt with | Some selfArg when selfArg.LogicalName <> "this" - && not (selfArg.LogicalName.StartsWith("_")) + && not (selfArg.LogicalName.StartsWithOrdinal("_")) && not cenv.options.localOptimizationsEnabled -> let ilTy = selfArg.Type |> GenType cenv m eenv.tyenv @@ -2849,7 +2923,7 @@ and GenExprPreSteps (cenv: cenv) (cgbuf: CodeGenBuffer) eenv expr sequel = match expr with | Expr.Sequential((DebugPointExpr g debugPointName) as dpExpr, codeExpr, NormalSeq, m) -> match cenv.namedDebugPointsForInlinedCode.TryGetValue({ Range = m; Name = debugPointName }) with - | false, _ when debugPointName = "" -> CG.EmitDebugPoint cgbuf m + | false, _ when String.IsNullOrEmpty(debugPointName) -> CG.EmitDebugPoint cgbuf m | false, _ -> // printfn $"---- Unfound debug point {debugPointName} at {m}" // for KeyValue(k,v) in cenv.namedDebugPointsForInlinedCode do @@ -2877,7 +2951,8 @@ and GenExprPreSteps (cenv: cenv) (cgbuf: CodeGenBuffer) eenv expr sequel = let lowering = if compileSequenceExpressions then - LowerComputedCollectionExpressions.LowerComputedListOrArrayExpr cenv.tcVal g cenv.amap expr + let ilTyForTy ty = GenType cenv expr.Range eenv.tyenv ty + LowerComputedCollectionExpressions.LowerComputedListOrArrayExpr cenv.tcVal g cenv.amap ilTyForTy expr else None @@ -3723,11 +3798,11 @@ and GenCoerce cenv cgbuf eenv (e, tgtTy, m, srcTy) sequel = else GenExpr cenv cgbuf eenv e Continue - if not (isObjTy g srcTy) then + if not (isObjTyAnyNullness g srcTy) then let ilFromTy = GenType cenv m eenv.tyenv srcTy CG.EmitInstr cgbuf (pop 1) (Push [ g.ilg.typ_Object ]) (I_box ilFromTy) - if not (isObjTy g tgtTy) then + if not (isObjTyAnyNullness g tgtTy) then let ilToTy = GenType cenv m eenv.tyenv tgtTy CG.EmitInstr cgbuf (pop 1) (Push [ ilToTy ]) (I_unbox_any ilToTy) @@ -4610,7 +4685,7 @@ and GenIndirectCall cenv cgbuf eenv (funcTy, tyargs, curriedArgs, m) sequel = CountCallFuncInstructions() - // Generate the code code an ILX callfunc operation + // Generate the code for an ILX callfunc operation let instrs = EraseClosures.mkCallFunc cenv.ilxPubCloEnv @@ -5057,7 +5132,7 @@ and GenWhileLoop cenv cgbuf eenv (spWhile, condExpr, bodyExpr, m) sequel = // Generate IL assembly code. // Polymorphic IL/ILX instructions may be instantiated when polymorphic code is inlined. // We must implement this for the few uses of polymorphic instructions -// in the standard libarary. +// in the standard library. //-------------------------------------------------------------------------- and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = @@ -5108,7 +5183,7 @@ and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = | I_ldsflda fspec, _ -> I_ldsflda(modFieldSpec fspec) | EI_ilzero(ILType.TypeVar _), [ tyarg ] -> EI_ilzero tyarg | AI_nop, _ -> i - // These are embedded in the IL for a an initonly ldfld, i.e. + // These are embedded in the IL for an initonly ldfld, i.e. // here's the relevant comment from tc.fs // "Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr." @@ -5394,7 +5469,7 @@ and CommitCallSequel cenv eenv m cloc cgbuf mustGenerateUnitAfterCall sequel = and MakeNotSupportedExnExpr cenv eenv (argExpr, m) = let g = cenv.g - let ety = mkAppTy (g.FindSysTyconRef [ "System" ] "NotSupportedException") [] + let ety = mkWoNullAppTy (g.FindSysTyconRef [ "System" ] "NotSupportedException") [] let ilTy = GenType cenv m eenv.tyenv ety let mref = mkILCtorMethSpecForTy(ilTy, [ g.ilg.typ_String ]).MethodRef Expr.Op(TOp.ILCall(false, false, false, true, NormalValUse, false, false, mref, [], [], [ ety ]), [], [ argExpr ], m) @@ -5584,6 +5659,30 @@ and GenGenericParam cenv eenv (tp: Typar) = | TyparConstraint.IsNonNullableStruct _ -> true | _ -> false) + let nullnessOfTypar = + if g.langFeatureNullness && g.checkNullness then + let hasNotSupportsNull = + tp.Constraints + |> List.exists (function + | TyparConstraint.NotSupportsNull _ -> true + | _ -> false) + + let hasSupportsNull () = + tp.Constraints + |> List.exists (function + | TyparConstraint.SupportsNull _ -> true + | _ -> false) + + if hasNotSupportsNull || notNullableValueTypeConstraint then + NullnessInfo.WithoutNull + elif refTypeConstraint || hasSupportsNull () then + NullnessInfo.WithNull + else + NullnessInfo.AmbivalentToNull + |> Some + else + None + let defaultConstructorConstraint = tp.Constraints |> List.exists (function @@ -5625,12 +5724,14 @@ and GenGenericParam cenv eenv (tp: Typar) = nm let attributeList = - let defined = GenAttrs cenv eenv tp.Attribs - - if emitUnmanagedInIlOutput then - (GetIsUnmanagedAttribute g) :: defined - else - defined + [ + yield! GenAttrs cenv eenv tp.Attribs + if emitUnmanagedInIlOutput then + yield (GetIsUnmanagedAttribute g) + match nullnessOfTypar with + | Some nullInfo -> yield GetNullableAttribute g [ nullInfo ] + | _ -> () + ] let tpAttrs = mkILCustomAttrs (attributeList) @@ -5650,6 +5751,7 @@ and GenGenericParam cenv eenv (tp: Typar) = HasReferenceTypeConstraint = refTypeConstraint HasNotNullableValueTypeConstraint = notNullableValueTypeConstraint || emitUnmanagedInIlOutput HasDefaultConstructorConstraint = defaultConstructorConstraint + HasAllowsRefStruct = false } //-------------------------------------------------------------------------- @@ -5665,11 +5767,7 @@ and GenSlotParam m cenv eenv slotParam : ILParameter = GenParamAttribs cenv ty attribs let ilAttribs = GenAttrs cenv eenv attribs - - let ilAttribs = - match GenReadOnlyAttributeIfNecessary cenv.g ty with - | Some attr -> ilAttribs @ [ attr ] - | None -> ilAttribs + let ilAttribs = ilAttribs @ GenAdditionalAttributesForTy cenv.g ty { Name = nm @@ -5725,9 +5823,9 @@ and GenFormalReturnType m cenv eenvFormal returnTy : ILReturn = match returnTy with | None -> ilRet | Some ty -> - match GenReadOnlyAttributeIfNecessary cenv.g ty with - | Some attr -> ilRet.WithCustomAttrs(mkILCustomAttrs (ilRet.CustomAttrs.AsList() @ [ attr ])) - | None -> ilRet + match GenAdditionalAttributesForTy cenv.g ty with + | [] -> ilRet + | attrs -> ilRet.WithCustomAttrs(mkILCustomAttrs (ilRet.CustomAttrs.AsList() @ attrs)) and instSlotParam inst (TSlotParam(nm, ty, inFlag, fl2, fl3, attrs)) = TSlotParam(nm, instType inst ty, inFlag, fl2, fl3, attrs) @@ -5942,7 +6040,8 @@ and GenStructStateMachine cenv cgbuf eenvouter (res: LoweredStateMachine) sequel let interfaceTys = GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g cenv.amap m templateStructTy - let ilInterfaceTys = List.map (GenType cenv m eenvinner.tyenv) interfaceTys + let ilInterfaceTys = + List.map (GenType cenv m eenvinner.tyenv >> InterfaceImpl.Create) interfaceTys let super = g.iltyp_ValueType @@ -6112,7 +6211,7 @@ and GenStructStateMachine cenv cgbuf eenvouter (res: LoweredStateMachine) sequel ) do // Suppress the "ResumptionDynamicInfo" from generated state machines if templateFld.LogicalName <> "ResumptionDynamicInfo" then - let access = ComputeMemberAccess false + let access = ComputeMemberAccess false taccessPublic cenv.g.realsig let fty = GenType cenv m eenvinner.tyenv templateFld.FieldType let fdef = @@ -6133,7 +6232,7 @@ and GenStructStateMachine cenv cgbuf eenvouter (res: LoweredStateMachine) sequel // Fields for captured variables for ilCloFreeVar in ilCloFreeVars do - let access = ComputeMemberAccess false + let access = ComputeMemberAccess false taccessPublic cenv.g.realsig let fdef = ILFieldDef( @@ -6152,33 +6251,35 @@ and GenStructStateMachine cenv cgbuf eenvouter (res: LoweredStateMachine) sequel yield fdef ] + let customAttrs = + [ + g.CompilerGeneratedAttribute + mkCompilationMappingAttr g (int SourceConstructFlags.Closure) + ] + |> mkILCustomAttrs + |> storeILCustomAttrs + let cloTypeDef = ILTypeDef( name = ilCloTypeRef.Name, layout = ILTypeDefLayout.Auto, attributes = enum 0, genericParams = ilCloGenericFormals, - customAttrs = - mkILCustomAttrs ( - [ - g.CompilerGeneratedAttribute - mkCompilationMappingAttr g (int SourceConstructFlags.Closure) - ] - ), + customAttrs = customAttrs, fields = mkILFields fdefs, events = emptyILEvents, properties = emptyILProperties, methods = mkILMethods mdefs, methodImpls = mkILMethodImpls mimpls, nestedTypes = emptyILTypeDefs, - implements = ilInterfaceTys, + implements = InterruptibleLazy.FromValue(ilInterfaceTys), extends = Some super, - isKnownToBeAttribute = false, + additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls ) .WithSealed(true) .WithSpecialName(true) - .WithAccess(ComputeTypeAccess ilCloTypeRef true) + .WithAccess(ComputeTypeAccess ilCloTypeRef true taccessInternal cenv.g.realsig) .WithLayout(ILTypeDefLayout.Auto) .WithEncoding(ILDefaultPInvokeEncoding.Auto) .WithInitSemantics(ILTypeInit.BeforeField) @@ -6297,7 +6398,8 @@ and GenObjectExpr cenv cgbuf eenvouter objExpr (baseType, baseValOpt, basecall, let mimpls = mimpls |> List.choose id // choose the ones that actually have method impls let interfaceTys = - interfaceImpls |> List.map (fst >> GenType cenv m eenvinner.tyenv) + interfaceImpls + |> List.map (fst >> GenType cenv m eenvinner.tyenv >> InterfaceImpl.Create) let super = (if isInterfaceTy g baseType then @@ -6306,7 +6408,11 @@ and GenObjectExpr cenv cgbuf eenvouter objExpr (baseType, baseValOpt, basecall, ilCloRetTy) let interfaceTys = - interfaceTys @ (if isInterfaceTy g baseType then [ ilCloRetTy ] else []) + interfaceTys + @ (if isInterfaceTy g baseType then + [ InterfaceImpl.Create(ilCloRetTy) ] + else + []) let cloTypeDefs = GenClosureTypeDefs @@ -6586,28 +6692,33 @@ and GenClosureTypeDefs else mdefs, [] + let customAttrs = + attrs @ [ mkCompilationMappingAttr g (int SourceConstructFlags.Closure) ] + |> mkILCustomAttrs + |> storeILCustomAttrs + let tdef = ILTypeDef( name = tref.Name, layout = ILTypeDefLayout.Auto, attributes = enum 0, genericParams = ilGenParams, - customAttrs = mkILCustomAttrs (attrs @ [ mkCompilationMappingAttr g (int SourceConstructFlags.Closure) ]), + customAttrs = customAttrs, fields = mkILFields fdefs, events = emptyILEvents, properties = emptyILProperties, methods = mkILMethods mdefs, methodImpls = mkILMethodImpls mimpls, nestedTypes = emptyILTypeDefs, - implements = ilIntfTys, + implements = InterruptibleLazy.FromValue(ilIntfTys), extends = Some ext, - isKnownToBeAttribute = false, + additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls ) .WithSealed(true) .WithSerializable(true) .WithSpecialName(true) - .WithAccess(ComputeTypeAccess tref true) + .WithAccess(ComputeTypeAccess tref true taccessInternal cenv.g.realsig) .WithLayout(ILTypeDefLayout.Auto) .WithEncoding(ILDefaultPInvokeEncoding.Auto) .WithInitSemantics(ILTypeInit.BeforeField) @@ -6794,13 +6905,12 @@ and GenFreevar cenv m eenvouter tyenvinner (fv: Val) = #endif | _ -> GenType cenv m tyenvinner fv.Type -and GetIlxClosureFreeVars cenv m (thisVars: ValRef list) boxity eenvouter takenNames expr = +and GetIlxClosureFreeVars cenv m (thisVars: ValRef list) boxity eenv takenNames expr = let g = cenv.g // Choose a base name for the closure let basename = - let boundv = - eenvouter.letBoundVars |> List.tryFind (fun v -> not v.IsCompilerGenerated) + let boundv = eenv.letBoundVars |> List.tryFind (fun v -> not v.IsCompilerGenerated) match boundv with | Some v -> v.CompiledName cenv.g.CompilerGlobalState @@ -6818,6 +6928,7 @@ and GetIlxClosureFreeVars cenv m (thisVars: ValRef list) boxity eenvouter takenN let ilCloTypeRef = // FSharp 1.0 bug 3404: System.Reflection doesn't like '.' and '`' in type names let basenameSafeForUseAsTypename = CleanUpGeneratedTypeName basename + let suffixmark = expr.Range let cloName = @@ -6825,14 +6936,14 @@ and GetIlxClosureFreeVars cenv m (thisVars: ValRef list) boxity eenvouter takenN assert (g.CompilerGlobalState |> Option.isSome) g.CompilerGlobalState.Value.StableNameGenerator.GetUniqueCompilerGeneratedName(basenameSafeForUseAsTypename, suffixmark, uniq) - NestedTypeRefForCompLoc eenvouter.cloc cloName + NestedTypeRefForCompLoc eenv.cloc cloName // Collect the free variables of the closure let cloFreeVarResults = let opts = CollectTyparsAndLocalsWithStackGuard() let opts = - match eenvouter.tyenv.TemplateReplacement with + match eenv.tyenv.TemplateReplacement with | None -> opts | Some(tcref, _, typars, _) -> opts.WithTemplateReplacement(tyconRefEq g tcref, typars) @@ -6847,7 +6958,7 @@ and GetIlxClosureFreeVars cenv m (thisVars: ValRef list) boxity eenvouter takenN freeLocals |> List.filter (fun fv -> (thisVars |> List.forall (fun v -> not (valRefEq g (mkLocalValRef fv) v))) - && (match StorageForVal m fv eenvouter with + && (match StorageForVal m fv eenv with | StaticPropertyWithField _ | StaticProperty _ | Method _ @@ -6859,14 +6970,14 @@ and GetIlxClosureFreeVars cenv m (thisVars: ValRef list) boxity eenvouter takenN let cloFreeTyvars = (cloFreeVarResults.FreeTyvars, freeLocals) ||> List.fold (fun ftyvs fv -> - match StorageForVal m fv eenvouter with + match StorageForVal m fv eenv with | Env(_, _, Some(moreFtyvs, _)) | Local(_, _, Some(moreFtyvs, _)) -> unionFreeTyvars ftyvs moreFtyvs | _ -> ftyvs) let cloFreeTyvars = cloFreeTyvars.FreeTypars |> Zset.elements - let eenvinner = eenvouter |> EnvForTypars cloFreeTyvars + let eenvinner = eenv |> EnvForTypars cloFreeTyvars let ilCloTyInner = let ilCloGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars @@ -6902,13 +7013,13 @@ and GetIlxClosureFreeVars cenv m (thisVars: ValRef list) boxity eenvouter takenN (cloFreeVars, names) ||> List.map2 (fun fv nm -> let localCloInfo = - match StorageForVal m fv eenvouter with + match StorageForVal m fv eenv with | Local(_, _, localCloInfo) | Env(_, _, localCloInfo) -> localCloInfo | _ -> None let ilFv = - mkILFreeVar (nm, fv.IsCompilerGenerated, GenFreevar cenv m eenvouter eenvinner.tyenv fv) + mkILFreeVar (nm, fv.IsCompilerGenerated, GenFreevar cenv m eenv eenvinner.tyenv fv) let storage = let ilField = mkILFieldSpecInTy (ilCloTyInner, ilFv.fvName, ilFv.fvType) @@ -7265,7 +7376,7 @@ and IsSequelImmediate sequel = /// or 'match'. and GenJoinPoint cenv cgbuf pos eenv ty m sequel = - // What the join point does depends on the contents of the sequel. For example, if the sequal is "return" then + // What the join point does depends on the contents of the sequel. For example, if the sequel is "return" then // each branch can just return and no true join point is needed. match sequel with // All of these can be done at the end of each branch - we don't need a real join point @@ -7445,7 +7556,7 @@ and GenDecisionTreeSuccess let genTargetInfoOpt = if generateTargetNow then - // Fenerate the targets in-order only + // Generate the targets in-order only targetNext.Value <- targetNext.Value + 1 Some(GenDecisionTreeTarget cenv cgbuf stackAtTargets targetInfo sequel) else @@ -8071,7 +8182,7 @@ and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec: IlxClosureSpec, e, ilField: ILFi CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld (mkILFieldSpec (ilField.FieldRef, ilxCloSpec.ILType))) /// Generate letrec bindings -and GenLetRecBindings cenv (cgbuf: CodeGenBuffer) eenv (allBinds: Bindings, m) = +and GenLetRecBindings cenv (cgbuf: CodeGenBuffer) eenv (allBinds: Bindings, m) (dict: Dictionary option) = // 'let rec' bindings are always considered to be in loops, that is each may have backward branches for the // tailcalls back to the entry point. This means we don't rely on zero-init of mutable locals @@ -8143,6 +8254,23 @@ and GenLetRecBindings cenv (cgbuf: CodeGenBuffer) eenv (allBinds: Bindings, m) = let fixups = ref [] + let updateForwardReferenceSet (bind: Binding) (forwardReferenceSet: Zset) = + // Record the variable as defined + let forwardReferenceSet = Zset.remove bind.Var forwardReferenceSet + + // Execute and discard any fixups that can now be committed + let newFixups = + fixups.Value + |> List.filter (fun (boundv, fv, action) -> + if (Zset.contains boundv forwardReferenceSet || Zset.contains fv forwardReferenceSet) then + true + else + action () + false) + + fixups.Value <- newFixups + forwardReferenceSet + let recursiveVars = Zset.addList (bindsPossiblyRequiringFixup |> List.map (fun v -> v.Var)) (Zset.empty valOrder) @@ -8161,39 +8289,74 @@ and GenLetRecBindings cenv (cgbuf: CodeGenBuffer) eenv (allBinds: Bindings, m) = "internal error: should never need to set non-delayed recursive val: " + bind.Var.LogicalName ))) + // Record the variable as defined let forwardReferenceSet = Zset.remove bind.Var forwardReferenceSet forwardReferenceSet) - // Generate the actual bindings - let _ = - (recursiveVars, allBinds) - ||> List.fold (fun forwardReferenceSet (bind: Binding) -> - GenBinding cenv cgbuf eenv bind false + let getStampForVal (v: Val) = + match v.HasDeclaringEntity with + | false -> 0L + | true -> v.DeclaringEntity.Deref.Stamp - // Record the variable as defined - let forwardReferenceSet = Zset.remove bind.Var forwardReferenceSet + let groupBinds = + let rec loopAllBinds bindings remainder = + match remainder with + | [] -> bindings |> List.rev + | _ -> + let stamp = remainder |> List.head |> (fun (TBind(v, _, _)) -> getStampForVal v) - // Execute and discard any fixups that can now be committed - let newFixups = - fixups.Value - |> List.filter (fun (boundv, fv, action) -> - if (Zset.contains boundv forwardReferenceSet || Zset.contains fv forwardReferenceSet) then - true - else - action () - false) + let taken = + remainder |> List.takeWhile (fun (TBind(v, _, _)) -> stamp = getStampForVal v) - fixups.Value <- newFixups + let remainder = + remainder |> List.skipWhile (fun (TBind(v, _, _)) -> stamp = getStampForVal v) - forwardReferenceSet) + loopAllBinds (taken :: bindings) remainder + + loopAllBinds [ [] ] allBinds + + let _ = + (recursiveVars, groupBinds) + ||> List.fold (fun forwardReferenceSet (binds: Binding list) -> + match dict, cenv.g.realsig, binds with + | _, false, _ + | None, _, _ + | _, _, [] -> + (forwardReferenceSet, binds) + ||> List.fold (fun forwardReferenceSet (bind: Binding) -> + GenBinding cenv cgbuf eenv bind false + updateForwardReferenceSet bind forwardReferenceSet) + | Some dict, true, _ -> + let (TBind(v, _, _)) = binds |> List.head + + match dict.TryGetValue(getStampForVal v) with + | false, _ -> + (forwardReferenceSet, binds) + ||> List.fold (fun forwardReferenceSet (bind: Binding) -> + GenBinding cenv cgbuf eenv bind false + updateForwardReferenceSet bind forwardReferenceSet) + | true, tref -> + CodeGenInitMethod + cenv + cgbuf + (AddEnclosingToEnv eenv tref.Enclosing tref.Name None) + tref + (fun cgbuf eenv -> + // Generate chunks of non-nested bindings together to allow recursive fixups. + GenLetRecBindings cenv cgbuf eenv (binds, m) None + CG.EmitInstr cgbuf (pop 0) Push0 I_ret) + m + + (forwardReferenceSet, binds) + ||> List.fold (fun forwardReferenceSet (bind: Binding) -> updateForwardReferenceSet bind forwardReferenceSet)) () and GenLetRec cenv cgbuf eenv (binds, body, m) sequel = let _, endMark as scopeMarks = StartLocalScope "letrec" cgbuf let eenv = AllocStorageForBinds cenv cgbuf scopeMarks eenv binds - GenLetRecBindings cenv cgbuf eenv (binds, m) + GenLetRecBindings cenv cgbuf eenv (binds, m) None GenExpr cenv cgbuf eenv body (EndLocalScope(sequel, endMark)) //------------------------------------------------------------------------- @@ -8209,17 +8372,22 @@ and GenBinding cenv cgbuf eenv (bind: Binding) (isStateVar: bool) = GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar None and ComputeMethodAccessRestrictedBySig eenv vspec = + let vspec = + if eenv.realsig then + DoRemapVal eenv.sigToImplRemapInfo vspec + else + vspec + + let isHiddenBySignatureVal = IsHiddenVal eenv.sigToImplRemapInfo vspec + let isHidden = - // Anything hidden by a signature gets assembly visibility - IsHiddenVal eenv.sigToImplRemapInfo vspec - || + isHiddenBySignatureVal // Anything that's not a module or member binding gets assembly visibility - not vspec.IsMemberOrModuleBinding - || + || not vspec.IsMemberOrModuleBinding // Compiler generated members for class function 'let' bindings get assembly visibility - vspec.IsIncrClassGeneratedMember + || vspec.IsIncrClassGeneratedMember - ComputeMemberAccess isHidden + ComputeMemberAccess isHidden vspec.Accessibility eenv.realsig and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = let g = cenv.g @@ -8246,12 +8414,13 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = let access = ComputeMethodAccessRestrictedBySig eenv vspec - // Workaround for .NET and Visual Studio restriction w.r.t debugger type proxys - // Mark internal constructors in internal classes as public. + // because of reflection back-compatability private constructors are treated the same as internal constructors + // Workaround for .NET and Visual Studio restriction w.r.t debugger type proxies + // Mark internal and private constructors in internal classes as public. let access = + // private and internal constructors from source are treated the same if - access = ILMemberAccess.Assembly - && vspec.IsConstructor + vspec.IsConstructor && IsHiddenTycon eenv.sigToImplRemapInfo vspec.MemberApparentEntity.Deref then ILMemberAccess.Public @@ -8358,7 +8527,7 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = propertyType = ilTy, init = None, args = [], - customAttrs = mkILCustomAttrs ilAttribs + customAttrs = mkILCustomAttrs (GenAdditionalAttributesForTy g vspec.Type @ ilAttribs) ) cgbuf.mgbuf.AddOrMergePropertyDef(ilGetterMethSpec.MethodRef.DeclaringTypeRef, ilPropDef, m) @@ -8404,15 +8573,21 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = /// Generate a static field definition... let ilFieldDefs = - let access = - ComputeMemberAccess(not hasLiteralAttr || IsHiddenVal eenv.sigToImplRemapInfo vspec) + let hidden = not hasLiteralAttr || IsHiddenVal eenv.sigToImplRemapInfo vspec + + let access = ComputeMemberAccess hidden vspec.Accessibility cenv.g.realsig let ilFieldDef = mkILStaticField (fspec.Name, fty, None, None, access) + let isDecimalConstant = + match vref.LiteralValue with + | Some(Const.Decimal _) -> true + | _ -> false + let ilFieldDef = match vref.LiteralValue with - | Some konst -> ilFieldDef.WithLiteralDefaultValue(Some(GenFieldInit m konst)) - | None -> ilFieldDef + | Some konst when not isDecimalConstant -> ilFieldDef.WithLiteralDefaultValue(Some(GenFieldInit m konst)) + | _ -> ilFieldDef let ilFieldDef = let isClassInitializer = (cgbuf.MethodName = ".cctor") @@ -8424,6 +8599,7 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = || not isClassInitializer || hasLiteralAttr ) + || isDecimalConstant ) let ilAttribs = @@ -8434,6 +8610,66 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = else GenAttrs cenv eenv vspec.Attribs // literals have no property, so preserve all the attributes on the field itself + let ilAttribs = GenAdditionalAttributesForTy g vspec.Type @ ilAttribs + + let ilAttribs = + if isDecimalConstant then + match vref.LiteralValue with + | Some(Const.Decimal d) -> + match System.Decimal.GetBits d with + | [| lo; med; hi; signExp |] -> + let scale = (min (((signExp &&& 0xFF0000) >>> 16) &&& 0xFF) 28) |> byte + let sign = if (signExp &&& 0x80000000) <> 0 then 1uy else 0uy + + let attrib = + mkILCustomAttribute ( + g.attrib_DecimalConstantAttribute.TypeRef, + [ + g.ilg.typ_Byte + g.ilg.typ_Byte + g.ilg.typ_Int32 + g.ilg.typ_Int32 + g.ilg.typ_Int32 + ], + [ + ILAttribElem.Byte scale + ILAttribElem.Byte sign + ILAttribElem.UInt32(uint32 hi) + ILAttribElem.UInt32(uint32 med) + ILAttribElem.UInt32(uint32 lo) + ], + [] + ) + + let ilInstrs = + [ + mkLdcInt32 lo + mkLdcInt32 med + mkLdcInt32 hi + mkLdcInt32 (int32 sign) + mkLdcInt32 (int32 scale) + mkNormalNewobj ( + mkILCtorMethSpecForTy ( + fspec.ActualType, + [ + g.ilg.typ_Int32 + g.ilg.typ_Int32 + g.ilg.typ_Int32 + g.ilg.typ_Bool + g.ilg.typ_Byte + ] + ) + ) + mkNormalStsfld fspec + ] + + CG.EmitInstrs cgbuf (pop 0) (Push0) ilInstrs + [ attrib ] + | _ -> failwith "unreachable" + | _ -> failwith "unreachable" + else + ilAttribs + let ilFieldDef = ilFieldDef.With(customAttrs = mkILCustomAttrs (ilAttribs @ [ g.DebuggerBrowsableNeverAttribute ])) @@ -8455,6 +8691,7 @@ and GenBindingAfterDebugPoint cenv cgbuf eenv bind isStateVar startMarkOpt = vspec.Attribs |> List.filter (fun (Attrib(_, _, _, _, _, targets, _)) -> canTarget (targets, System.AttributeTargets.Property)) |> GenAttrs cenv eenv // property only gets attributes that target properties + |> List.append (GenAdditionalAttributesForTy g vspec.Type) let ilPropDef = ILPropertyDef( @@ -8630,7 +8867,7 @@ and GenMarshal cenv attribs = let safeArrayUserDefinedSubType = // the argument is a System.Type obj, but it's written to MD as a UTF8 string match decoder.FindTypeName "SafeArrayUserDefinedSubType" "" with - | "" -> None + | x when String.IsNullOrEmpty(x) -> None | res -> if (safeArraySubType = ILNativeVariant.IDispatch) @@ -8761,11 +8998,7 @@ and GenParams | None -> None, takenNames let ilAttribs = GenAttrs cenv eenv attribs - - let ilAttribs = - match GenReadOnlyAttributeIfNecessary cenv.g methodArgTy with - | Some attr -> ilAttribs @ [ attr ] - | None -> ilAttribs + let ilAttribs = ilAttribs @ GenAdditionalAttributesForTy cenv.g methodArgTy let param: ILParameter = { @@ -8791,10 +9024,7 @@ and GenReturnInfo cenv eenv returnTy ilRetTy (retInfo: ArgReprInfo) : ILReturn = let ilAttribs = match returnTy with - | Some retTy -> - match GenReadOnlyAttributeIfNecessary cenv.g retTy with - | Some attr -> ilAttribs @ [ attr ] - | None -> ilAttribs + | Some retTy -> ilAttribs @ GenAdditionalAttributesForTy cenv.g retTy | _ -> ilAttribs let ilAttrs = mkILCustomAttrs ilAttribs @@ -9129,9 +9359,7 @@ and GenMethodForBinding || memberInfo.MemberFlags.MemberKind = SynMemberKind.PropertySet || memberInfo.MemberFlags.MemberKind = SynMemberKind.PropertyGetSet -> - match GenReadOnlyAttributeIfNecessary cenv.g returnTy with - | Some ilAttr -> ilAttr - | _ -> () + yield! GenAdditionalAttributesForTy cenv.g returnTy | _ -> () ] @@ -9715,17 +9943,15 @@ and AllocValForBind cenv cgbuf (scopeMarks: Mark * Mark) eenv (TBind(v, repr, _) | Some _ -> None, AllocValReprWithinExpr cenv cgbuf (snd scopeMarks) eenv.cloc v eenv and AllocValReprWithinExpr cenv cgbuf endMark cloc v eenv = - let g = cenv.g - // decide whether to use a shadow local or not let useShadowLocal = cenv.options.generateDebugSymbols && not cenv.options.localOptimizationsEnabled && not v.IsCompilerGenerated && not v.IsMutable - && // Don't use shadow locals for things like functions which are not compiled as static values/properties - IsCompiledAsStaticProperty g v + && (not eenv.realsig) + && IsCompiledAsStaticProperty cenv.g v let optShadowLocal, eenv = if useShadowLocal then @@ -9735,7 +9961,7 @@ and AllocValReprWithinExpr cenv cgbuf endMark cloc v eenv = else NoShadowLocal, eenv - ComputeAndAddStorageForLocalValWithValReprInfo (cenv, g, cenv.intraAssemblyInfo, cenv.options.isInteractive, optShadowLocal) cloc v eenv + ComputeAndAddStorageForLocalValWithValReprInfo (cenv, eenv.intraAssemblyInfo, cenv.options.isInteractive, optShadowLocal) cloc v eenv //-------------------------------------------------------------------------- // Generate stack save/restore and assertions - pulled into letrec by alloc* @@ -9925,7 +10151,19 @@ and CreatePermissionSets cenv eenv (securityAttributes: Attrib list) = //-------------------------------------------------------------------------- /// Generate a static class at the given cloc -and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attribs, initTrigger, eliminateIfEmpty, addAtEnd) = +and GenTypeDefForCompLoc + ( + cenv, + eenv, + mgbuf: AssemblyBuilder, + cloc, + hidden, + accessibility: Accessibility, + attribs, + initTrigger, + eliminateIfEmpty, + addAtEnd + ) = let g = cenv.g let tref = TypeRefForCompLoc cloc @@ -9933,7 +10171,7 @@ and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attr mkILSimpleClass g.ilg (tref.Name, - ComputeTypeAccess tref hidden, + ComputeTypeAccess tref hidden accessibility cenv.g.realsig, emptyILMethods, emptyILFields, emptyILTypeDefs, @@ -9977,16 +10215,69 @@ and GenImplFileContents cenv cgbuf qname lazyInitInfo eenv mty def = let _eenvEnd = GenModuleOrNamespaceContents cenv cgbuf qname lazyInitInfo eenv def ()) +and CodeGenInitMethod cenv (cgbuf: CodeGenBuffer) eenv tref (codeGenInitFunc: CodeGenBuffer -> IlxGenEnv -> unit) m = + + // Generate the declarations in the module and its initialization code + let _, body = + CodeGenMethod cenv cgbuf.mgbuf ([], eenv.staticInitializationName, eenv, 0, None, codeGenInitFunc, m) + + if CheckCodeDoesSomething body.Code then + // We are here because the module we just grabbed has an interesting static initializer + let feefee, seqpt = + if body.Code.Instrs.Length > 0 then + match body.Code.Instrs[0] with + | I_seqpoint sp as i -> [ FeeFeeInstr cenv sp.Document ], [ i ] + | _ -> [], [] + else + [], [] + + let ilDebugRange = GenPossibleILDebugRange cenv m + + // Call global file initializer + match eenv.initClassFieldSpec with + | Some fs -> cgbuf.mgbuf.AddExplicitInitToCctor(tref, fs.Force(), ilDebugRange, eenv.imports, feefee, seqpt) + | None -> () + + // Add code to invoke envinner's class static initializer + let access = ComputeMemberAccess true taccessInternal eenv.realsig + + let ilBody = MethodBody.IL(InterruptibleLazy.FromValue body) + let ilReturn = mkILReturn ILType.Void + + let method = + (mkILNonGenericStaticMethod (eenv.staticInitializationName, access, [], ilReturn, ilBody)) + .WithSpecialName + + cgbuf.mgbuf.AddMethodDef(tref, method) + CountMethodDef() + + let ty = + let td = cgbuf.mgbuf.FindNestedTypeDefBuilder(tref).ILTypeDef + let boxity = if td.IsStruct then ILBoxity.AsValue else ILBoxity.AsObject + mkILFormalNamedTy boxity tref td.GenericParams + + let methodSpec = + mkILNonGenericStaticMethSpecInTy (ty, eenv.staticInitializationName, [], ILType.Void) + + cgbuf.EmitInstr((pop 0), Push0, mkNormalCall (methodSpec)) + and GenModuleOrNamespaceContents cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo eenv x = match x with | TMDefRec(_isRec, opens, tycons, mbinds, m) -> let eenvinner = AddDebugImportsToEnv cenv eenv opens + let dict = Some(Dictionary()) + for tc in tycons do - if tc.IsFSharpException then - GenExnDef cenv cgbuf.mgbuf eenvinner m tc - else - GenTypeDef cenv cgbuf.mgbuf lazyInitInfo eenvinner m tc + let optTref = + if tc.IsFSharpException then + GenExnDef cenv cgbuf.mgbuf eenv m tc + else + GenTypeDef cenv cgbuf.mgbuf lazyInitInfo eenv m tc + + match optTref with + | Some tref -> dict.Value.Add(tc.Stamp, tref) + | None -> () // Generate chunks of non-nested bindings together to allow recursive fixups. let mutable bindsRemaining = mbinds @@ -9994,6 +10285,7 @@ and GenModuleOrNamespaceContents cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo while not bindsRemaining.IsEmpty do match bindsRemaining with | ModuleOrNamespaceBinding.Binding _ :: _ -> + let recBinds = bindsRemaining |> List.takeWhile (function @@ -10009,7 +10301,7 @@ and GenModuleOrNamespaceContents cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo | ModuleOrNamespaceBinding.Binding _ -> true | _ -> false) - GenLetRecBindings cenv cgbuf eenv (recBinds, m) + GenLetRecBindings cenv cgbuf eenv (recBinds, m) dict bindsRemaining <- otherBinds | (ModuleOrNamespaceBinding.Module _ as mbind) :: rest -> GenModuleBinding cenv cgbuf qname lazyInitInfo eenvinner m mbind @@ -10037,21 +10329,24 @@ and GenModuleOrNamespaceContents cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo // Generate a module binding and GenModuleBinding cenv (cgbuf: CodeGenBuffer) (qname: QualifiedNameOfFile) lazyInitInfo eenv m x = match x with - | ModuleOrNamespaceBinding.Binding bind -> GenLetRecBindings cenv cgbuf eenv ([ bind ], m) + | ModuleOrNamespaceBinding.Binding bind -> GenLetRecBindings cenv cgbuf eenv ([ bind ], m) None + + | ModuleOrNamespaceBinding.Module(mspec, mdef) when mspec.IsNamespace -> + // Generate the declarations in the namespace and its initialization code + GenModuleOrNamespaceContents cenv cgbuf qname lazyInitInfo eenv mdef |> ignore | ModuleOrNamespaceBinding.Module(mspec, mdef) -> + + // Evaluate bindings for module let hidden = IsHiddenTycon eenv.sigToImplRemapInfo mspec let eenvinner = - if mspec.IsNamespace then - eenv - else - { eenv with - cloc = CompLocForFixedModule cenv.options.fragName qname.Text mspec - initLocals = - eenv.initLocals - && not (HasFSharpAttribute cenv.g cenv.g.attrib_SkipLocalsInitAttribute mspec.Attribs) - } + { eenv with + cloc = CompLocForFixedModule cenv.options.fragName qname.Text mspec + initLocals = + eenv.initLocals + && not (HasFSharpAttribute cenv.g cenv.g.attrib_SkipLocalsInitAttribute mspec.Attribs) + } // Create the class to hold the contents of this module. No class needed if // we're compiling it as a namespace. @@ -10060,44 +10355,46 @@ and GenModuleBinding cenv (cgbuf: CodeGenBuffer) (qname: QualifiedNameOfFile) la // However mutable static fields go into the class for the module itself. // So this static class ends up with a .cctor if it has mutable fields. // - if not mspec.IsNamespace then - // The use of ILTypeInit.OnAny prevents the execution of the cctor before the - // "main" method in the case where the "main" method is implicit. - let staticClassTrigger = (* if eenv.isFinalFile then *) - ILTypeInit.OnAny (* else ILTypeInit.BeforeField *) - - GenTypeDefForCompLoc( - cenv, - eenvinner, - cgbuf.mgbuf, - eenvinner.cloc, - hidden, - mspec.Attribs, - staticClassTrigger, - false (* atEnd= *) , - true - ) - // Generate the declarations in the module and its initialization code - let _envAtEnd = - GenModuleOrNamespaceContents cenv cgbuf qname lazyInitInfo eenvinner mdef + // The use of ILTypeInit.OnAny prevents the execution of the cctor before the + // "main" method in the case where the "main" method is implicit. + let staticClassTrigger = ILTypeInit.OnAny + + GenTypeDefForCompLoc( + cenv, + eenvinner, + cgbuf.mgbuf, + eenvinner.cloc, + hidden, + mspec.Accessibility, + mspec.Attribs, + staticClassTrigger, + false (* atEnd= *) , + true + ) - // If the module has a .cctor for some mutable fields, we need to ensure that when - // those fields are "touched" the InitClass .cctor is forced. The InitClass .cctor will - // then fill in the value of the mutable fields. - if - not mspec.IsNamespace - && (cgbuf.mgbuf.GetCurrentFields(TypeRefForCompLoc eenvinner.cloc) - |> Seq.isEmpty - |> not) - then - GenForceWholeFileInitializationAsPartOfCCtor + let tref = TypeRefForCompLoc eenvinner.cloc + + if eenv.realsig then + CodeGenInitMethod cenv - cgbuf.mgbuf - lazyInitInfo - (TypeRefForCompLoc eenvinner.cloc) - eenv.imports - mspec.Range + cgbuf + eenvinner + tref + (fun cgbuf eenv -> + GenModuleOrNamespaceContents cenv cgbuf qname lazyInitInfo eenv mdef |> ignore + CG.EmitInstr cgbuf (pop 0) Push0 I_ret //) + ) + m + else + GenModuleOrNamespaceContents cenv cgbuf qname lazyInitInfo eenvinner mdef + |> ignore + + // If the module has a .cctor for some mutable fields, we need to ensure that when + // those fields are "touched" the InitClass .cctor is forced. The InitClass .cctor will + // then fill in the value of the mutable fields. + if not (cgbuf.mgbuf.GetCurrentFields(tref) |> Seq.isEmpty) then + GenForceWholeFileInitializationAsPartOfCCtor cenv cgbuf.mgbuf lazyInitInfo tref eenv.imports mspec.Range /// Generate the namespace fragments in a single file and GenImplFile cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (implFile: CheckedImplFileAfterOptimization) = @@ -10105,7 +10402,6 @@ and GenImplFile cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (implFile: Checke implFile.ImplFile let optimizeDuringCodeGen = implFile.OptimizeDuringCodeGen - let g = cenv.g let m = qname.Range // Generate all the anonymous record types mentioned anywhere in this module @@ -10127,21 +10423,38 @@ and GenImplFile cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (implFile: Checke let initClassCompLoc = CompLocForInitClass eenv.cloc let initClassTy = mkILTyForCompLoc initClassCompLoc + let initClassTrigger = ILTypeInit.OnAny - let initClassTrigger = (* if isFinalFile then *) - ILTypeInit.OnAny (* else ILTypeInit.BeforeField *) + let initClassFieldSpec = + lazy + let ilFieldDef = + mkILStaticField ( + eenv.initFieldName, + cenv.g.ilg.typ_Int32, + None, + None, + ComputeMemberAccess true taccessInternal cenv.g.realsig + ) + |> cenv.g.AddFieldNeverAttributes + |> cenv.g.AddFieldGeneratedAttributes + + CountStaticFieldDef() + mgbuf.AddFieldDef(initClassTy.TypeRef, ilFieldDef) + mkILFieldSpecInTy (initClassTy, eenv.initFieldName, cenv.g.ilg.typ_Int32) let eenv = { eenv with cloc = initClassCompLoc + initClassCompLoc = Some initClassCompLoc isFinalFile = isFinalFile someTypeInThisAssembly = initClassTy + initClassFieldSpec = Some initClassFieldSpec } // Create the class to hold the initialization code and static fields for this file. // internal static class $ {} // Put it at the end since that gives an approximation of dependency order (to aid FSI.EXE's code generator - see FSharp 1.0 5548) - GenTypeDefForCompLoc(cenv, eenv, mgbuf, initClassCompLoc, useHiddenInitCode, [], initClassTrigger, false, true) + GenTypeDefForCompLoc(cenv, eenv, mgbuf, initClassCompLoc, useHiddenInitCode, taccessInternal, [], initClassTrigger, false, true) // lazyInitInfo is an accumulator of functions which add the forced initialization of the storage module to // - mutable fields in public modules @@ -10209,15 +10522,7 @@ and GenImplFile cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (implFile: Checke // This adds the explicit init of the .cctor to the explicit entry point main method let ilDebugRange = GenPossibleILDebugRange cenv m - mgbuf.AddExplicitInitToSpecificMethodDef( - (fun md -> md.IsEntryPoint), - tref, - fspec, - ilDebugRange, - eenv.imports, - feefee, - seqpt - )) + mgbuf.AddExplicitInitToEntryPoint(tref, fspec, ilDebugRange, eenv.imports, feefee, seqpt)) let cctorMethDef = mkILClassCtor (MethodBody.IL(InterruptibleLazy.FromValue topCode)) @@ -10264,30 +10569,24 @@ and GenImplFile cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (implFile: Checke // Create the field to act as the target for the forced initialization. // Why do this for the final file? // There is no need to do this for a final file with an implicit entry point. For an explicit entry point in lazyInitInfo. - let initFieldName = CompilerGeneratedName "init" - - let ilFieldDef = - mkILStaticField (initFieldName, g.ilg.typ_Int32, None, None, ComputeMemberAccess true) - |> g.AddFieldNeverAttributes - |> g.AddFieldGeneratedAttributes - - let fspec = mkILFieldSpecInTy (initClassTy, initFieldName, cenv.g.ilg.typ_Int32) - CountStaticFieldDef() - mgbuf.AddFieldDef(initClassTy.TypeRef, ilFieldDef) + initClassFieldSpec.Force() |> ignore // Run the imperative (yuck!) actions that force the generation // of references to the cctor for nested modules etc. - lazyInitInfo |> Seq.iter (fun f -> f fspec feefee seqpt) + match eenv.initClassFieldSpec with + | Some fspec -> + lazyInitInfo |> Seq.iter (fun f -> f (fspec.Force()) feefee seqpt) - if isScript && not isFinalFile then - mgbuf.AddScriptInitFieldSpec(fspec, m) + if isScript && not isFinalFile then + mgbuf.AddScriptInitFieldSpec(fspec.Force(), m) + | None -> () // Compute the ilxgenEnv after the generation of the module, i.e. the residue need to generate anything that // uses the constructs exported from this module. // We add the module type all over again. Note no shadow locals for static fields needed here since they are only relevant to the main/.cctor let eenvafter = let allocVal = - ComputeAndAddStorageForLocalValWithValReprInfo(cenv, g, cenv.intraAssemblyInfo, cenv.options.isInteractive, NoShadowLocal) + ComputeAndAddStorageForLocalValWithValReprInfo(cenv, eenv.intraAssemblyInfo, cenv.options.isInteractive, NoShadowLocal) AddBindingsForLocalModuleOrNamespaceType allocVal clocCcu eenv signature @@ -10304,7 +10603,7 @@ and GenForceWholeFileInitializationAsPartOfCCtor cenv (mgbuf: AssemblyBuilder) ( // Doing both a store and load keeps FxCop happier because it thinks the field is useful lazyInitInfo.Add(fun fspec feefee seqpt -> let ilDebugRange = GenPossibleILDebugRange cenv m - mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.Name = ".cctor"), tref, fspec, ilDebugRange, imports, feefee, seqpt)) + mgbuf.AddExplicitInitToCctor(tref, fspec, ilDebugRange, imports, feefee, seqpt)) /// Generate an Equals method. and GenEqualsOverrideCallingIComparable cenv (tcref: TyconRef, ilThisTy, _ilThatTy) = @@ -10349,6 +10648,8 @@ and GenWitnessParams cenv eenv m (witnessInfos: TraitWitnessInfos) = let nm = String.uncapitalize witnessInfo.MemberName let nm = if used.Contains nm then nm + string i else nm + let attribs = GenAdditionalAttributesForTy cenv.g ty + let ilParam: ILParameter = { Name = Some nm @@ -10358,7 +10659,7 @@ and GenWitnessParams cenv eenv m (witnessInfos: TraitWitnessInfos) = IsIn = false IsOut = false IsOptional = false - CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs []) + CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs attribs) MetadataIndex = NoMetadataIdx } @@ -10390,9 +10691,7 @@ and GenAbstractBinding cenv eenv tref (vref: ValRef) = || memberInfo.MemberFlags.MemberKind = SynMemberKind.PropertySet || memberInfo.MemberFlags.MemberKind = SynMemberKind.PropertyGetSet -> - match GenReadOnlyAttributeIfNecessary cenv.g returnTy with - | Some ilAttr -> ilAttr - | _ -> () + yield! GenAdditionalAttributesForTy cenv.g returnTy | _ -> () ] @@ -10533,12 +10832,12 @@ and GenPrintingMethod cenv eenv methName ilThisTy m = | _ -> () ] -and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = +and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) : ILTypeRef option = let g = cenv.g let tcref = mkLocalTyconRef tycon if tycon.IsTypeAbbrev then - () + None else match tycon.TypeReprInfo with #if !NO_TYPEPROVIDERS @@ -10548,7 +10847,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = | TNoRepr | TAsmRepr _ | TILObjectRepr _ - | TMeasureableRepr _ -> () + | TMeasureableRepr _ -> None | TFSharpTyconRepr _ -> let eenvinner = EnvForTycon tycon eenv let thisTy = generalizedTyconRef g tcref @@ -10556,16 +10855,35 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let ilThisTy = GenType cenv m eenvinner.tyenv thisTy let tref = ilThisTy.TypeRef let ilGenParams = GenGenericParams cenv eenvinner tycon.TyparsNoRange + let checkNullness = g.langFeatureNullness && g.checkNullness let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon - |> List.map (GenType cenv m eenvinner.tyenv) + |> List.map (fun x -> + let ilType = GenType cenv m eenvinner.tyenv x + + let customAttrs = + if checkNullness then + GenAdditionalAttributesForTy g x |> mkILCustomAttrs |> ILAttributesStored.Given + else + emptyILCustomAttrsStored + + InterfaceImpl.Create(ilType, customAttrs)) let ilTypeName = tref.Name let hidden = IsHiddenTycon eenv.sigToImplRemapInfo tycon + let hiddenRepr = hidden || IsHiddenTyconRepr eenv.sigToImplRemapInfo tycon - let access = ComputeTypeAccess tref hidden + + let tyconAccess = + let tycon = + if eenv.realsig then + DoRemapTycon eenv.sigToImplRemapInfo tycon + else + tycon + + ComputeTypeAccess tref hidden tycon.Accessibility cenv.g.realsig // The implicit augmentation doesn't actually create CompareTo(object) or Object.Equals // So we do it here. @@ -10581,7 +10899,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = Option.isNone tycon.GeneratedCompareToValues && Option.isNone tycon.GeneratedHashAndEqualsValues && tycon.HasInterface g g.mk_IComparable_ty - && not (tycon.HasOverride g "Equals" [ g.obj_ty ]) + && not (tycon.HasOverride g "Equals" [ g.obj_ty_ambivalent ]) && not tycon.IsFSharpInterfaceTycon then [ GenEqualsOverrideCallingIComparable cenv (tcref, ilThisTy, ilThisTy) ] @@ -10667,7 +10985,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let tyconRepr = tycon.TypeReprInfo - let reprAccess = ComputeMemberAccess hiddenRepr + let reprAccess = ComputeMemberAccess hiddenRepr taccessPublic cenv.g.realsig // DebugDisplayAttribute gets copied to the subtypes generated as part of DU compilation let debugDisplayAttrs, normalAttrs = @@ -10724,6 +11042,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = else ILTypeDefKind.Class | TFSharpClass -> ILTypeDefKind.Class + | TFSharpStruct -> ILTypeDefKind.ValueType | TFSharpInterface -> ILTypeDefKind.Interface | TFSharpEnum -> ILTypeDefKind.Enum @@ -10819,13 +11138,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = // The IL field is hidden if the property/field is hidden OR we're using a property // AND the field is not mutable (because we can take the address of a mutable field). // Otherwise fields are always accessed via their property getters/setters - // - // Additionally, don't hide fields for multiemit in F# Interactive - let isFieldHidden = - isPropHidden - || (not useGenuineField - && not isFSharpMutable - && not (cenv.options.isInteractive && cenv.options.fsiMultiAssemblyEmit)) + let isFieldHidden = isPropHidden || (not useGenuineField && not isFSharpMutable) let extraAttribs = match tyconRepr with @@ -10833,7 +11146,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = [ g.CompilerGeneratedAttribute; g.DebuggerBrowsableNeverAttribute ] | _ -> [] // don't hide fields in classes in debug display - let access = ComputeMemberAccess isFieldHidden + let access = ComputeMemberAccess isFieldHidden taccessPublic cenv.g.realsig let literalValue = Option.map (GenFieldInit m) fspec.LiteralValue @@ -10846,7 +11159,12 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = literalValue = None, offset = ilFieldOffset, marshal = None, - customAttrs = mkILCustomAttrs (GenAttrs cenv eenv fattribs @ extraAttribs) + customAttrs = + mkILCustomAttrs ( + GenAttrs cenv eenv fattribs + @ extraAttribs + @ GenAdditionalAttributesForTy g fspec.FormalType + ) ) .WithAccess(access) .WithStatic(isStatic) @@ -10903,7 +11221,9 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = if not useGenuineField then let ilPropName = fspec.LogicalName let ilMethName = "get_" + ilPropName - let access = ComputeMemberAccess isPropHidden + + let access = ComputeMemberAccess isPropHidden taccessPublic cenv.g.realsig + let isStruct = isStructTyconRef tcref let attrs = @@ -10926,7 +11246,8 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let ilMethName = "set_" + ilPropName let ilParams = [ mkILParamNamed ("value", ilPropType) ] let ilReturn = mkILReturn ILType.Void - let iLAccess = ComputeMemberAccess isPropHidden + + let iLAccess = ComputeMemberAccess isPropHidden taccessPublic cenv.g.realsig let ilMethodDef = if isStatic then @@ -11133,10 +11454,11 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = match tycon.TypeReprInfo with | TILObjectRepr _ -> - let tdef = tycon.ILTyconRawMetadata.WithAccess access + let tdef = tycon.ILTyconRawMetadata.WithAccess tyconAccess - let tdef = - tdef.With(customAttrs = mkILCustomAttrs ilCustomAttrs, genericParams = ilGenParams) + let customAttrs = ilCustomAttrs |> mkILCustomAttrs |> storeILCustomAttrs + + let tdef = tdef.With(customAttrs = customAttrs, genericParams = ilGenParams) tdef, None @@ -11157,25 +11479,35 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let ilAttrs = ilCustomAttrs @ [ - mkCompilationMappingAttr - g - (int ( - if isObjectType then - SourceConstructFlags.ObjectType - elif hiddenRepr then - SourceConstructFlags.RecordType ||| SourceConstructFlags.NonPublicRepresentation - else - SourceConstructFlags.RecordType - )) + yield + mkCompilationMappingAttr + g + (int ( + if isObjectType then + SourceConstructFlags.ObjectType + elif hiddenRepr then + SourceConstructFlags.RecordType ||| SourceConstructFlags.NonPublicRepresentation + else + SourceConstructFlags.RecordType + )) + + if not (ilBaseTy.GenericArgs.IsEmpty) then + yield! GenAdditionalAttributesForTy g super ] let isKnownToBeAttribute = ExistsSameHeadTypeInHierarchy g cenv.amap m super g.mk_Attribute_ty + let additionalFlags = + if isKnownToBeAttribute then + ILTypeDefAdditionalFlags.IsKnownToBeAttribute + else + ILTypeDefAdditionalFlags.None + let tdef = mkILGenericClass ( ilTypeName, - access, + tyconAccess, ilGenParams, ilBaseTy, ilIntfTys, @@ -11197,7 +11529,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = .WithSerializable(isSerializable) .WithAbstract(isAbstract) .WithImport(isComInteropTy g thisTy) - .With(methodImpls = mkILMethodImpls methodImpls, isKnownToBeAttribute = isKnownToBeAttribute) + .With(methodImpls = mkILMethodImpls methodImpls, newAdditionalFlags = additionalFlags) let tdLayout, tdEncoding = match TryFindFSharpAttribute g g.attrib_StructLayoutAttribute tycon.Attribs with @@ -11332,19 +11664,19 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = ILTypeDefLayout.Auto let cattrs = - mkILCustomAttrs ( - ilCustomAttrs - @ [ - mkCompilationMappingAttr - g - (int ( - if hiddenRepr then - SourceConstructFlags.SumType ||| SourceConstructFlags.NonPublicRepresentation - else - SourceConstructFlags.SumType - )) - ] - ) + ilCustomAttrs + @ [ + mkCompilationMappingAttr + g + (int ( + if hiddenRepr then + SourceConstructFlags.SumType ||| SourceConstructFlags.NonPublicRepresentation + else + SourceConstructFlags.SumType + )) + ] + |> mkILCustomAttrs + |> storeILCustomAttrs let tdef = ILTypeDef( @@ -11359,7 +11691,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = methods = mkILMethods ilMethods, methodImpls = mkILMethodImpls methodImpls, nestedTypes = emptyILTypeDefs, - implements = ilIntfTys, + implements = InterruptibleLazy.FromValue(ilIntfTys), extends = Some( if tycon.IsStructOrEnumTycon then @@ -11367,14 +11699,14 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = else g.ilg.typ_Object ), - isKnownToBeAttribute = false, + additionalFlags = ILTypeDefAdditionalFlags.None, securityDecls = emptyILSecurityDecls ) .WithLayout(layout) .WithSerializable(isSerializable) .WithSealed(true) .WithEncoding(ILDefaultPInvokeEncoding.Auto) - .WithAccess(access) + .WithAccess(tyconAccess) // If there are static fields in the union, use the same kind of trigger as // for class types .WithInitSemantics( @@ -11402,19 +11734,24 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = // private static field for lists etc. // // Also discard the F#-compiler supplied implementation of the Empty, IsEmpty, Value and None properties. + let tdefDiscards = Some( (fun (md: ILMethodDef) -> (cuinfo.HasHelpers = SpecialFSharpListHelpers && (md.Name = "get_Empty" || md.Name = "Cons" || md.Name = "get_IsEmpty")) || (cuinfo.HasHelpers = SpecialFSharpOptionHelpers - && (md.Name = "get_Value" || md.Name = "get_None" || md.Name = "Some"))), + && (md.Name = "get_Value" || md.Name = "get_None" || md.Name = "Some")) + || (cuinfo.HasHelpers = AllHelpers + && (md.Name.StartsWith("get_Is") && not (tdef2.Methods.FindByName(md.Name).IsEmpty)))), (fun (pd: ILPropertyDef) -> (cuinfo.HasHelpers = SpecialFSharpListHelpers && (pd.Name = "Empty" || pd.Name = "IsEmpty")) || (cuinfo.HasHelpers = SpecialFSharpOptionHelpers - && (pd.Name = "Value" || pd.Name = "None"))) + && (pd.Name = "Value" || pd.Name = "None")) + || (cuinfo.HasHelpers = AllHelpers + && (pd.Name.StartsWith("Is") && not (tdef2.Properties.LookupByName(pd.Name).IsEmpty)))) ) tdef2, tdefDiscards @@ -11433,26 +11770,39 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = // In this case, the .cctor for this type must force the .cctor of the backing static class for the file. if tycon.TyparsNoRange.IsEmpty + && not (eenv.realsig) && tycon.MembersOfFSharpTyconSorted |> List.exists (fun vref -> vref.Deref.IsClassConstructor) then GenForceWholeFileInitializationAsPartOfCCtor cenv mgbuf lazyInitInfo tref eenv.imports m + Some tref + /// Generate the type for an F# exception declaration. -and GenExnDef cenv mgbuf eenv m (exnc: Tycon) = +and GenExnDef cenv mgbuf eenv m (exnc: Tycon) : ILTypeRef option = let g = cenv.g let exncref = mkLocalEntityRef exnc match exnc.ExceptionInfo with | TExnAbbrevRepr _ | TExnAsmRepr _ - | TExnNone -> () + | TExnNone -> None | TExnFresh _ -> let ilThisTy = GenExnType cenv m eenv.tyenv exncref let tref = ilThisTy.TypeRef let isHidden = IsHiddenTycon eenv.sigToImplRemapInfo exnc - let access = ComputeTypeAccess tref isHidden - let reprAccess = ComputeMemberAccess isHidden + + let access = + let tycon = + if eenv.realsig then + DoRemapTycon eenv.sigToImplRemapInfo exnc + else + exnc + + ComputeTypeAccess tref isHidden tycon.Accessibility cenv.g.realsig + + let reprAccess = ComputeMemberAccess isHidden taccessPublic cenv.g.realsig + let fspecs = exnc.TrueInstanceFieldsAsList let ilMethodDefsForProperties, ilFieldDefs, ilPropertyDefs, fieldNamesAndTypes = @@ -11564,7 +11914,7 @@ and GenExnDef cenv mgbuf eenv m (exnc: Tycon) = let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon - |> List.map (GenType cenv m eenv.tyenv) + |> List.map (GenType cenv m eenv.tyenv >> InterfaceImpl.Create) let tdef = mkILGenericClass ( @@ -11584,6 +11934,7 @@ and GenExnDef cenv mgbuf eenv m (exnc: Tycon) = let tdef = tdef.WithSerializable(true) mgbuf.AddTypeDef(tref, tdef, false, false, None) + Some tref let CodegenAssembly cenv eenv mgbuf implFiles = match List.tryFrontAndBack implFiles with @@ -11636,11 +11987,12 @@ let CodegenAssembly cenv eenv mgbuf implFiles = //------------------------------------------------------------------------- let GetEmptyIlxGenEnv (g: TcGlobals) ccu = - let thisCompLoc = CompLocForCcu ccu - { tyenv = TypeReprEnv.Empty - cloc = thisCompLoc + cloc = CompLocForCcu ccu + initClassCompLoc = None + initFieldName = CompilerGeneratedName "init" + staticInitializationName = CompilerGeneratedName "staticInitialization" exitSequel = Return valsInScope = ValMap<_>.Empty witnessesInScope = EmptyTraitWitnessInfoHashMap g @@ -11657,6 +12009,9 @@ let GetEmptyIlxGenEnv (g: TcGlobals) ccu = imports = None delayCodeGen = true delayedFileGenReverse = [] + intraAssemblyInfo = IlxGenIntraAssemblyInfo.Create() + realsig = g.realsig + initClassFieldSpec = None } type IlxGenResults = @@ -11727,6 +12082,7 @@ let GenerateCode (cenv, anonTypeTable, eenv, CheckedAssemblyAfterOptimization im mgbuf, CompLocForPrivateImplementationDetails eenv.cloc, useHiddenInitCode, + taccessInternal, [], ILTypeInit.BeforeField, true (* atEnd= *) , @@ -11806,14 +12162,14 @@ let LookupGeneratedValue (cenv: cenv) (ctxt: ExecutionContext) eenv (v: Val) = if hasLiteralAttr then let staticTy = ctxt.LookupTypeRef fspec.DeclaringTypeRef // Checked: This FieldInfo (FieldBuilder) supports GetValue(). - staticTy.GetField(fspec.Name).GetValue(null: obj) + (!! staticTy.GetField(fspec.Name)).GetValue(null: obj MaybeNull) else let staticTy = ctxt.LookupTypeRef ilContainerTy.TypeRef // We can't call .Invoke on the ILMethodRef's MethodInfo, // because it is the MethodBuilder and that does not support Invoke. // Rather, we look for the getter MethodInfo from the built type and .Invoke on that. let methInfo = - staticTy.GetMethod(ilGetterMethRef.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + !! staticTy.GetMethod(ilGetterMethRef.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) methInfo.Invoke(null, null) @@ -11826,7 +12182,7 @@ let LookupGeneratedValue (cenv: cenv) (ctxt: ExecutionContext) eenv (v: Val) = // because it is the MethodBuilder and that does not support Invoke. // Rather, we look for the getter MethodInfo from the built type and .Invoke on that. let methInfo = - staticTy.GetMethod(ilGetterMethSpec.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + !! staticTy.GetMethod(ilGetterMethSpec.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) methInfo.Invoke(null, null) @@ -11843,8 +12199,8 @@ let LookupGeneratedValue (cenv: cenv) (ctxt: ExecutionContext) eenv (v: Val) = #endif None -// Invoke the set_Foo method for a declaration with a value. Used to create variables with values programatically in fsi.exe. -let SetGeneratedValue (ctxt: ExecutionContext) eenv isForced (v: Val) (value: obj) = +// Invoke the set_Foo method for a declaration with a value. Used to create variables with values programmatically in fsi.exe. +let SetGeneratedValue (ctxt: ExecutionContext) eenv isForced (v: Val) (value: objnull) = try match StorageForVal v.Range v eenv with | StaticPropertyWithField(fspec, _, hasLiteralAttr, _, _, _, _f, ilSetterMethRef, _) -> @@ -11853,14 +12209,14 @@ let SetGeneratedValue (ctxt: ExecutionContext) eenv isForced (v: Val) (value: ob let staticTy = ctxt.LookupTypeRef fspec.DeclaringTypeRef let fieldInfo = - staticTy.GetField(fspec.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + !! staticTy.GetField(fspec.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) fieldInfo.SetValue(null, value) else let staticTy = ctxt.LookupTypeRef ilSetterMethRef.DeclaringTypeRef let methInfo = - staticTy.GetMethod(ilSetterMethRef.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + !! staticTy.GetMethod(ilSetterMethRef.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) methInfo.Invoke(null, [| value |]) |> ignore | _ -> () @@ -11886,26 +12242,21 @@ let ClearGeneratedValue (ctxt: ExecutionContext) eenv (v: Val) = () /// The published API from the ILX code generator -type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal: ConstraintSolver.TcValF, ccu: CcuThunk) = +type IlxAssemblyGenerator(amap: ImportMap, g: TcGlobals, tcVal: ConstraintSolver.TcValF, ccu: CcuThunk) = // The incremental state held by the ILX code generator - let mutable ilxGenEnv = GetEmptyIlxGenEnv tcGlobals ccu + let mutable ilxGenEnv = GetEmptyIlxGenEnv g ccu let anonTypeTable = AnonTypeGenerationTable() - let intraAssemblyInfo = - { - StaticFieldInfo = ConcurrentDictionary<_, _>(HashIdentity.Structural) - } - let cenv = { - g = tcGlobals + g = g ilxPubCloEnv = EraseClosures.newIlxPubCloEnv ( - tcGlobals.ilg, - tcGlobals.AddMethodGeneratedAttributes, - tcGlobals.AddFieldGeneratedAttributes, - tcGlobals.AddFieldNeverAttributes + g.ilg, + g.AddMethodGeneratedAttributes, + g.AddFieldGeneratedAttributes, + g.AddFieldNeverAttributes ) tcVal = tcVal viewCcu = ccu @@ -11913,7 +12264,6 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal: Constrai namedDebugPointsForInlinedCode = Map.empty amap = amap casApplied = ConcurrentDictionary() - intraAssemblyInfo = intraAssemblyInfo optionsOpt = None optimizeDuringCodeGen = (fun _flag expr -> expr) stackGuard = getEmptyStackGuard () @@ -11922,22 +12272,12 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal: Constrai /// Register a set of referenced assemblies with the ILX code generator member _.AddExternalCcus ccus = - ilxGenEnv <- AddExternalCcusToIlxGenEnv cenv tcGlobals ilxGenEnv ccus + ilxGenEnv <- AddExternalCcusToIlxGenEnv cenv ilxGenEnv ccus /// Register a fragment of the current assembly with the ILX code generator. If 'isIncrementalFragment' is true then the input /// is assumed to be a fragment 'typed' into FSI.EXE, otherwise the input is assumed to be the result of a '#load' member _.AddIncrementalLocalAssemblyFragment(isIncrementalFragment, fragName, typedImplFiles) = - ilxGenEnv <- - AddIncrementalLocalAssemblyFragmentToIlxGenEnv( - cenv, - isIncrementalFragment, - tcGlobals, - ccu, - fragName, - intraAssemblyInfo, - ilxGenEnv, - typedImplFiles - ) + ilxGenEnv <- AddIncrementalLocalAssemblyFragmentToIlxGenEnv(cenv, isIncrementalFragment, ccu, fragName, ilxGenEnv, typedImplFiles) /// Generate ILX code for an assembly fragment member _.GenerateCode(codeGenOpts, typedAssembly: CheckedAssemblyAfterOptimization, assemAttribs, moduleAttribs) = diff --git a/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fs b/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fs index a0fa11a4a3..0e163db406 100644 --- a/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fs +++ b/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fs @@ -8,6 +8,7 @@ open Internal.Utilities.Library open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypedTreeOps +open FSharp.Compiler.TypedTree /// Make a method that simply loads a field let mkLdfldMethodDef (ilMethName, iLAccess, isStatic, ilTy, ilFieldName, ilPropType, customAttrs) = @@ -45,7 +46,7 @@ let mkLocalPrivateAttributeWithDefaultConstructor (g: TcGlobals, name: string) = ILTypeDefAccess.Private, ILGenericParameterDefs.Empty, g.ilg.typ_Attribute, - ILTypes.Empty, + [], ilMethods, emptyILFields, emptyILTypeDefs, @@ -68,7 +69,22 @@ let mkILNonGenericInstanceProperty (name, ilType, propertyAttribute, customAttri customAttrs = customAttributes ) -let mkLocalPrivateAttributeWithPropertyConstructors (g: TcGlobals, name: string, attrProperties: (string * ILType) list option) = +type AttrDataGenerationStyle = + | PublicFields + | EncapsulatedProperties + +let getFieldMemberAccess = + function + | PublicFields -> ILMemberAccess.Public + | EncapsulatedProperties -> ILMemberAccess.Private + +let mkLocalPrivateAttributeWithPropertyConstructors + ( + g: TcGlobals, + name: string, + attrProperties: (string * ILType) list option, + codegenStyle: AttrDataGenerationStyle + ) = let ilTypeRef = mkILTyRef (ILScopeRef.Local, name) let ilTy = mkILFormalNamedTy ILBoxity.AsObject ilTypeRef [] @@ -76,21 +92,34 @@ let mkLocalPrivateAttributeWithPropertyConstructors (g: TcGlobals, name: string, attrProperties |> Option.defaultValue [] |> List.map (fun (name, ilType) -> - let fieldName = name + "@" - - (g.AddFieldGeneratedAttributes(mkILInstanceField (fieldName, ilType, None, ILMemberAccess.Private))), - (g.AddMethodGeneratedAttributes(mkLdfldMethodDef ($"get_{name}", ILMemberAccess.Public, false, ilTy, fieldName, ilType, []))), - (g.AddPropertyGeneratedAttributes( - mkILNonGenericInstanceProperty ( - name, - ilType, - PropertyAttributes.None, - emptyILCustomAttrs, - Some(mkILMethRef (ilTypeRef, ILCallingConv.Instance, "get_" + name, 0, [], ilType)), - None - ) - )), - (name, fieldName, ilType)) + match codegenStyle with + | PublicFields -> + (g.AddFieldGeneratedAttributes(mkILInstanceField (name, ilType, None, getFieldMemberAccess codegenStyle))), + [], + [], + (name, name, ilType) + | EncapsulatedProperties -> + let fieldName = name + "@" + + (g.AddFieldGeneratedAttributes(mkILInstanceField (fieldName, ilType, None, getFieldMemberAccess codegenStyle))), + [ + g.AddMethodGeneratedAttributes( + mkLdfldMethodDef ($"get_{name}", ILMemberAccess.Public, false, ilTy, fieldName, ilType, []) + ) + ], + [ + g.AddPropertyGeneratedAttributes( + mkILNonGenericInstanceProperty ( + name, + ilType, + PropertyAttributes.None, + emptyILCustomAttrs, + Some(mkILMethRef (ilTypeRef, ILCallingConv.Instance, "get_" + name, 0, [], ilType)), + None + ) + ) + ], + (name, fieldName, ilType)) // Generate constructor with required arguments let ilCtorDef = @@ -106,23 +135,83 @@ let mkLocalPrivateAttributeWithPropertyConstructors (g: TcGlobals, name: string, ) ) - let ilCustomAttrs = mkILCustomAttrsFromArray [| g.CompilerGeneratedAttribute |] - mkILGenericClass ( name, ILTypeDefAccess.Private, ILGenericParameterDefs.Empty, g.ilg.typ_Attribute, - ILTypes.Empty, + [], mkILMethods ( ilCtorDef - :: (ilElements |> List.fold (fun acc (_, getter, _, _) -> getter :: acc) []) + :: (ilElements |> List.fold (fun acc (_, getter, _, _) -> getter @ acc) []) ), mkILFields (ilElements |> List.map (fun (field, _, _, _) -> field)), emptyILTypeDefs, - mkILProperties (ilElements |> List.map (fun (_, _, property, _) -> property)), + mkILProperties (ilElements |> List.collect (fun (_, _, props, _) -> props)), emptyILEvents, - ilCustomAttrs, + mkILCustomAttrsFromArray [| g.CompilerGeneratedAttribute |], + ILTypeInit.BeforeField + ) + +let mkLocalPrivateAttributeWithByteAndByteArrayConstructors (g: TcGlobals, name: string, bytePropertyName: string) = + let ilTypeRef = mkILTyRef (ILScopeRef.Local, name) + let ilTy = mkILFormalNamedTy ILBoxity.AsObject ilTypeRef [] + + let fieldName = bytePropertyName + let fieldType = g.ilg.typ_ByteArray + + let fieldDef = + g.AddFieldGeneratedAttributes(mkILInstanceField (fieldName, fieldType, None, ILMemberAccess.Public)) + + // Constructor taking an array + let ilArrayCtorDef = + g.AddMethodGeneratedAttributes( + mkILSimpleStorageCtorWithParamNames ( + Some g.ilg.typ_Attribute.TypeSpec, + ilTy, + [], + [ (fieldName, fieldName, fieldType) ], + ILMemberAccess.Public, + None, + None + ) + ) + + let ilScalarCtorDef = + let scalarValueIlType = g.ilg.typ_Byte + + g.AddMethodGeneratedAttributes( + let code = + [ + mkLdarg0 + mkNormalCall (mkILCtorMethSpecForTy (mkILBoxedType g.ilg.typ_Attribute.TypeSpec, [])) // Base class .ctor + + mkLdarg0 // Prepare 'this' to be on bottom of the stack + mkLdcInt32 1 + I_newarr(ILArrayShape.SingleDimensional, scalarValueIlType) // new byte[1] + AI_dup // Duplicate the array pointer in stack, 1 for stelem and 1 for stfld + mkLdcInt32 0 + mkLdarg 1us + I_stelem DT_I1 // array[0] = argument from .ctor + mkNormalStfld (mkILFieldSpecInTy (ilTy, fieldName, fieldType)) + ] + + let body = mkMethodBody (false, [], 8, nonBranchingInstrsToCode code, None, None) + mkILCtor (ILMemberAccess.Public, [ mkILParamNamed ("scalarByteValue", scalarValueIlType) ], body) + ) + + mkILGenericClass ( + name, + ILTypeDefAccess.Private, + ILGenericParameterDefs.Empty, + g.ilg.typ_Attribute, + [], + mkILMethods ([ ilScalarCtorDef; ilArrayCtorDef ]), + mkILFields [ fieldDef ], + emptyILTypeDefs, + emptyILProperties, + emptyILEvents, + mkILCustomAttrsFromArray [| g.CompilerGeneratedAttribute |], ILTypeInit.BeforeField ) @@ -144,7 +233,7 @@ let mkLocalPrivateInt32Enum (g: TcGlobals, tref: ILTypeRef, values: (string * in ILTypeDefAccess.Private, ILGenericParameterDefs.Empty, g.ilg.typ_Enum, - ILTypes.Empty, + [], mkILMethods [], mkILFields enumFields, emptyILTypeDefs, @@ -159,23 +248,16 @@ let mkLocalPrivateInt32Enum (g: TcGlobals, tref: ILTypeRef, values: (string * in // Generate Local embeddable versions of framework types when necessary //-------------------------------------------------------------------------- -let private getPotentiallyEmbedableAttribute (g: TcGlobals) (info: BuiltinAttribInfo) = +let private getPotentiallyEmbeddableAttribute (g: TcGlobals) (info: BuiltinAttribInfo) = let tref = info.TypeRef g.TryEmbedILType(tref, (fun () -> mkLocalPrivateAttributeWithDefaultConstructor (g, tref.Name))) mkILCustomAttribute (info.TypeRef, [], [], []) let GetReadOnlyAttribute (g: TcGlobals) = - getPotentiallyEmbedableAttribute g g.attrib_IsReadOnlyAttribute + getPotentiallyEmbeddableAttribute g g.attrib_IsReadOnlyAttribute let GetIsUnmanagedAttribute (g: TcGlobals) = - getPotentiallyEmbedableAttribute g g.attrib_IsUnmanagedAttribute - -let GenReadOnlyAttributeIfNecessary g ty = - if isInByrefTy g ty then - let attr = GetReadOnlyAttribute g - Some attr - else - None + getPotentiallyEmbeddableAttribute g g.attrib_IsUnmanagedAttribute let GetDynamicallyAccessedMemberTypes (g: TcGlobals) = let tref = g.enum_DynamicallyAccessedMemberTypes.TypeRef @@ -220,7 +302,7 @@ let GetDynamicDependencyAttribute (g: TcGlobals) memberTypes (ilType: ILType) = let properties = Some [ "MemberType", GetDynamicallyAccessedMemberTypes g; "Type", g.ilg.typ_Type ] - mkLocalPrivateAttributeWithPropertyConstructors (g, tref.Name, properties)) + mkLocalPrivateAttributeWithPropertyConstructors (g, tref.Name, properties, EncapsulatedProperties)) ) let typIlMemberTypes = @@ -233,6 +315,168 @@ let GetDynamicDependencyAttribute (g: TcGlobals) memberTypes (ilType: ILType) = [] ) +/// Generates NullableContextAttribute[1], which has the meaning of: +/// Nested items not being annotated with Nullable attribute themselves are interpreted as being withoutnull +/// Doing it that way is a heuristical decision supporting limited usage of (| null) annotations and not allowing nulls in >50% of F# code +/// (if majority of fields/parameters/return values would be nullable, this heuristic would lead to bloat of generated metadata) +let GetNullableContextAttribute (g: TcGlobals) flagValue = + let tref = g.attrib_NullableContextAttribute.TypeRef + + g.TryEmbedILType( + tref, + (fun () -> + let fields = Some [ "Flag", g.ilg.typ_Byte ] + mkLocalPrivateAttributeWithPropertyConstructors (g, tref.Name, fields, PublicFields)) + ) + + mkILCustomAttribute (tref, [ g.ilg.typ_Byte ], [ ILAttribElem.Byte flagValue ], []) + +let GetNotNullWhenTrueAttribute (g: TcGlobals) (propNames: string array) = + let tref = g.attrib_MemberNotNullWhenAttribute.TypeRef + + g.TryEmbedILType( + tref, + (fun () -> + let fields = + Some [ "ReturnValue", g.ilg.typ_Bool; "Members", g.ilg.typ_StringArray ] + + mkLocalPrivateAttributeWithPropertyConstructors (g, tref.Name, fields, EncapsulatedProperties)) + ) + + let stringArgs = + propNames |> Array.map (Some >> ILAttribElem.String) |> List.ofArray + + mkILCustomAttribute ( + tref, + [ g.ilg.typ_Bool; g.ilg.typ_StringArray ], + [ ILAttribElem.Bool true; ILAttribElem.Array(g.ilg.typ_String, stringArgs) ], + [] + ) + +let GetNullableAttribute (g: TcGlobals) (nullnessInfos: TypedTree.NullnessInfo list) = + let tref = g.attrib_NullableAttribute.TypeRef + + g.TryEmbedILType(tref, (fun () -> mkLocalPrivateAttributeWithByteAndByteArrayConstructors (g, tref.Name, "NullableFlags"))) + + let byteValue ni = + match ni with + | NullnessInfo.WithNull -> 2uy + | NullnessInfo.AmbivalentToNull -> 0uy + | NullnessInfo.WithoutNull -> 1uy + + let bytes = nullnessInfos |> List.map (fun ni -> byteValue ni |> ILAttribElem.Byte) + + match bytes with + | [ singleByte ] -> mkILCustomAttribute (tref, [ g.ilg.typ_Byte ], [ singleByte ], []) + | listOfBytes -> mkILCustomAttribute (tref, [ g.ilg.typ_ByteArray ], [ ILAttribElem.Array(g.ilg.typ_Byte, listOfBytes) ], []) + +let GenReadOnlyIfNecessary g ty = + if isInByrefTy g ty then + let attr = GetReadOnlyAttribute g + Some attr + else + None + +(* Nullness metadata format in C#: https://github.com/dotnet/roslyn/blob/main/docs/features/nullable-metadata.md +Each type reference in metadata may have an associated NullableAttribute with a byte[] where each byte represents nullability: 0 for oblivious, 1 for not annotated, and 2 for annotated. + +The byte[] is constructed as follows: + +Reference type: the nullability (0, 1, or 2), followed by the representation of the type arguments in order including containing types +Nullable value type: the representation of the type argument only +Non-generic value type: skipped +Generic value type: 0, followed by the representation of the type arguments in order including containing types +Array: the nullability (0, 1, or 2), followed by the representation of the element type +Tuple: the representation of the underlying constructed type +Type parameter reference: the nullability (0, 1, or 2, with 0 for unconstrained type parameter) +*) +let rec GetNullnessFromTType (g: TcGlobals) ty = + match ty |> stripTyEqns g with + | TType_app(tcref, tinst, nullness) -> + let isValueType = tcref.IsStructOrEnumTycon + let isNonGeneric = tinst.IsEmpty + + if isNonGeneric && isValueType then + // Non-generic value type: skipped + [] + else + [ + if tyconRefEq g g.system_Nullable_tcref tcref then + // Nullable value type: the representation of the type argument only + () + else if isValueType then + // Generic value type: 0, followed by the representation of the type arguments in order including containing types + yield NullnessInfo.AmbivalentToNull + else if + IsUnionTypeWithNullAsTrueValue g tcref.Deref + || TypeHasAllowNull tcref g FSharp.Compiler.Text.Range.Zero + then + yield NullnessInfo.WithNull + else + // Reference type: the nullability (0, 1, or 2), followed by the representation of the type arguments in order including containing types + yield nullness.Evaluate() + + for tt in tinst do + yield! GetNullnessFromTType g tt + ] + + | TType_fun(domainTy, retTy, nullness) -> + // FsharpFunc + [ + yield nullness.Evaluate() + yield! GetNullnessFromTType g domainTy + yield! GetNullnessFromTType g retTy + ] + + | TType_tuple(tupInfo, elementTypes) -> + // Tuple: the representation of the underlying constructed type + [ + if evalTupInfoIsStruct tupInfo then + yield NullnessInfo.AmbivalentToNull + else + yield NullnessInfo.WithoutNull + for t in elementTypes do + yield! GetNullnessFromTType g t + ] + + | TType_anon(anonInfo, tys) -> + // It is unlikely for an anon type to be used from C# due to the mangled name, but can still carry the nullability info about it's generic type arguments == the types of the fields + [ + if evalAnonInfoIsStruct anonInfo then + yield NullnessInfo.AmbivalentToNull + else + yield NullnessInfo.WithoutNull + for t in tys do + yield! GetNullnessFromTType g t + ] + | TType_forall _ + | TType_ucase _ + | TType_measure _ -> [] + | TType_var(nullness = nullness) -> [ nullness.Evaluate() ] + +let GenNullnessIfNecessary (g: TcGlobals) ty = + if g.langFeatureNullness && g.checkNullness then + let nullnessList = GetNullnessFromTType g ty + + match nullnessList with + // Optimizations as done in C# :: If the byte[] is empty, the NullableAttribute is omitted. + | [] -> None + // Optimizations as done in C# :: If all values in the byte[] are the same, the NullableAttribute is constructed with that single byte value. + | head :: tail when tail |> List.forall ((=) head) -> + match head with + // For F# code, each type has an automatically generated NullableContextAttribute(1) + // That means an implicit (hidden, not generated) Nullable(1) attribute + | NullnessInfo.WithoutNull -> None + | _ -> GetNullableAttribute g [ head ] |> Some + | nonUniformList -> GetNullableAttribute g nonUniformList |> Some + else + None + +let GenAdditionalAttributesForTy g ty = + let readOnly = GenReadOnlyIfNecessary g ty |> Option.toList + let nullable = GenNullnessIfNecessary g ty |> Option.toList + readOnly @ nullable + /// Generate "modreq([mscorlib]System.Runtime.InteropServices.InAttribute)" on inref types. let GenReadOnlyModReqIfNecessary (g: TcGlobals) ty ilTy = let add = isInByrefTy g ty && g.attrib_InAttribute.TyconRef.CanDeref diff --git a/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fsi b/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fsi index 24968a25ec..5661eadd50 100644 --- a/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fsi +++ b/src/fcs-fable/src/Compiler/CodeGen/IlxGenSupport.fsi @@ -19,6 +19,9 @@ val mkLdfldMethodDef: val GetDynamicDependencyAttribute: g: TcGlobals -> memberTypes: int32 -> ilType: ILType -> ILAttribute val GenReadOnlyModReqIfNecessary: g: TcGlobals -> ty: TypedTree.TType -> ilTy: ILType -> ILType -val GenReadOnlyAttributeIfNecessary: g: TcGlobals -> ty: TypedTree.TType -> ILAttribute option +val GenAdditionalAttributesForTy: g: TcGlobals -> ty: TypedTree.TType -> ILAttribute list val GetReadOnlyAttribute: g: TcGlobals -> ILAttribute val GetIsUnmanagedAttribute: g: TcGlobals -> ILAttribute +val GetNullableAttribute: g: TcGlobals -> nullnessInfos: TypedTree.NullnessInfo list -> ILAttribute +val GetNullableContextAttribute: g: TcGlobals -> byte -> ILAttribute +val GetNotNullWhenTrueAttribute: g: TcGlobals -> string array -> ILAttribute diff --git a/src/fcs-fable/src/Compiler/DependencyManager/AssemblyResolveHandler.fs b/src/fcs-fable/src/Compiler/DependencyManager/AssemblyResolveHandler.fs index c7f56c903f..0c87130608 100644 --- a/src/fcs-fable/src/Compiler/DependencyManager/AssemblyResolveHandler.fs +++ b/src/fcs-fable/src/Compiler/DependencyManager/AssemblyResolveHandler.fs @@ -6,6 +6,7 @@ open System open System.IO open System.Reflection open Internal.Utilities.FSharpEnvironment +open Internal.Utilities.Library /// Signature for ResolutionProbe callback /// host implements this, it's job is to return a list of assembly paths to probe. @@ -14,25 +15,24 @@ type AssemblyResolutionProbe = delegate of Unit -> seq /// Type that encapsulates AssemblyResolveHandler for managed packages type AssemblyResolveHandlerCoreclr(assemblyProbingPaths: AssemblyResolutionProbe option) as this = let loadContextType = - Type.GetType("System.Runtime.Loader.AssemblyLoadContext, System.Runtime.Loader", false) + !! Type.GetType("System.Runtime.Loader.AssemblyLoadContext, System.Runtime.Loader", false) let loadFromAssemblyPathMethod = - loadContextType.GetMethod("LoadFromAssemblyPath", [| typeof |]) + !! loadContextType.GetMethod("LoadFromAssemblyPath", [| typeof |]) - let eventInfo = loadContextType.GetEvent("Resolving") + let eventInfo = !! loadContextType.GetEvent("Resolving") let handler, defaultAssemblyLoadContext = let ti = typeof let gmi = - ti.GetMethod("ResolveAssemblyNetStandard", BindingFlags.Instance ||| BindingFlags.NonPublic) + !! ti.GetMethod("ResolveAssemblyNetStandard", BindingFlags.Instance ||| BindingFlags.NonPublic) let mi = gmi.MakeGenericMethod(loadContextType) - let del = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, mi) + let del = Delegate.CreateDelegate(!!eventInfo.EventHandlerType, this, mi) let prop = - loadContextType - .GetProperty("Default", BindingFlags.Static ||| BindingFlags.Public) + (!! loadContextType.GetProperty("Default", BindingFlags.Static ||| BindingFlags.Public)) .GetValue(null, null) del, prop @@ -41,7 +41,7 @@ type AssemblyResolveHandlerCoreclr(assemblyProbingPaths: AssemblyResolutionProbe member _.ResolveAssemblyNetStandard (ctxt: 'T) (assemblyName: AssemblyName) : Assembly = let loadAssembly path = - loadFromAssemblyPathMethod.Invoke(ctxt, [| path |]) :?> Assembly + !! loadFromAssemblyPathMethod.Invoke(ctxt, [| path |]) :?> Assembly let assemblyPaths = match assemblyProbingPaths with @@ -113,7 +113,7 @@ type AssemblyResolveHandler internal (assemblyProbingPaths: AssemblyResolutionPr else new AssemblyResolveHandlerDeskTop(assemblyProbingPaths) :> IDisposable) - new(assemblyProbingPaths: AssemblyResolutionProbe) = new AssemblyResolveHandler(Option.ofObj assemblyProbingPaths) + new(assemblyProbingPaths: AssemblyResolutionProbe MaybeNull) = new AssemblyResolveHandler(Option.ofObj assemblyProbingPaths) interface IDisposable with member _.Dispose() = diff --git a/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fs b/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fs index 329dd9bd29..cc1b47de2e 100644 --- a/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fs +++ b/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fs @@ -15,8 +15,11 @@ open System.Collections.Concurrent module Option = /// Convert string into Option string where null and String.Empty result in None - let ofString s = - if String.IsNullOrEmpty(s) then None else Some(s) + let ofString (s: string MaybeNull) = + match s with + | null -> None + | "" -> None + | s -> Some s [] module ReflectionHelper = @@ -57,31 +60,27 @@ module ReflectionHelper = let instanceFlags = BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Instance - let property = - theType.GetProperty(propertyName, instanceFlags, null, typeof<'T>, [||], [||]) - - if isNull property then - None - else - let getMethod = property.GetGetMethod() - - if not (isNull getMethod) && not getMethod.IsStatic then - Some property - else - None + match theType.GetProperty(propertyName, instanceFlags, null, typeof<'T>, [||], [||]) with + | null -> None + | property -> + match property.GetGetMethod() with + | null -> None + | getMethod when getMethod.IsStatic -> None + | _ -> Some property with _ -> None let getInstanceMethod<'T> (theType: Type) (parameterTypes: Type[]) methodName = try - let theMethod = theType.GetMethod(methodName, parameterTypes) - if isNull theMethod then None else Some theMethod + match theType.GetMethod(methodName, parameterTypes) with + | null -> None + | theMethod -> Some theMethod with _ -> None let stripTieWrapper (e: Exception) = match e with - | :? TargetInvocationException as e -> e.InnerException + | :? TargetInvocationException as e when isNotNull e.InnerException -> !!e.InnerException | _ -> e /// Indicate the type of error to report @@ -96,7 +95,7 @@ type ResolvingErrorReport = delegate of ErrorReportType * int * string -> unit /// The results of ResolveDependencies type IResolveDependenciesResult = - /// Succeded? + /// Succeeded? abstract Success: bool /// The resolution output log @@ -105,7 +104,7 @@ type IResolveDependenciesResult = /// The resolution error log (* process stderror *) abstract StdError: string[] - /// The resolution paths - the full paths to selcted resolved dll's. + /// The resolution paths - the full paths to selected resolved dll's. /// In scripts this is equivalent to #r @"c:\somepath\to\packages\ResolvedPackage\1.1.1\lib\netstandard2.0\ResolvedAssembly.dll" abstract Resolutions: seq @@ -124,7 +123,9 @@ type IResolveDependenciesResult = /// #I @"c:\somepath\to\packages\1.1.1\ResolvedPackage" abstract Roots: seq +#if NO_CHECKNULLS [] +#endif type IDependencyManagerProvider = abstract Name: string abstract Key: string @@ -159,19 +160,19 @@ type ReflectionDependencyManagerProvider let instance = if not (isNull (theType.GetConstructor([| typeof; typeof |]))) then - Activator.CreateInstance(theType, [| outputDir :> obj; useResultsCache :> obj |]) + Activator.CreateInstance(theType, [| outputDir :> objnull; useResultsCache :> objnull |]) else - Activator.CreateInstance(theType, [| outputDir :> obj |]) + Activator.CreateInstance(theType, [| outputDir :> objnull |]) - let nameProperty = nameProperty.GetValue >> string - let keyProperty = keyProperty.GetValue >> string + let nameProperty (x: objnull) = x |> nameProperty.GetValue |> string + let keyProperty (x: objnull) = x |> keyProperty.GetValue |> string - let helpMessagesProperty = - let toStringArray (o: obj) = o :?> string[] + let helpMessagesProperty (x: objnull) = + let toStringArray (o: objnull) = !!o :?> string[] match helpMessagesProperty with - | Some helpMessagesProperty -> helpMessagesProperty.GetValue >> toStringArray - | None -> fun _ -> [||] + | Some helpMessagesProperty -> x |> helpMessagesProperty.GetValue |> toStringArray + | None -> [||] static member InstanceMaker(theType: Type, outputDir: string option, useResultsCache: bool) = match @@ -323,7 +324,7 @@ type ReflectionDependencyManagerProvider static member MakeResultFromObject(result: obj) = { new IResolveDependenciesResult with - /// Succeded? + /// Succeeded? member _.Success = match getInstanceProperty (result.GetType()) "Success" with | None -> false @@ -333,31 +334,31 @@ type ReflectionDependencyManagerProvider member _.StdOut = match getInstanceProperty (result.GetType()) "StdOut" with | None -> [||] - | Some p -> p.GetValue(result) :?> string[] + | Some p -> !! p.GetValue(result) :?> string[] /// The resolution error log (* process stderror *) member _.StdError = match getInstanceProperty (result.GetType()) "StdError" with | None -> [||] - | Some p -> p.GetValue(result) :?> string[] + | Some p -> !! p.GetValue(result) :?> string[] /// The resolution paths member _.Resolutions = match getInstanceProperty> (result.GetType()) "Resolutions" with | None -> Seq.empty - | Some p -> p.GetValue(result) :?> seq + | Some p -> !! p.GetValue(result) :?> seq /// The source code file paths member _.SourceFiles = match getInstanceProperty> (result.GetType()) "SourceFiles" with | None -> Seq.empty - | Some p -> p.GetValue(result) :?> seq + | Some p -> !! p.GetValue(result) :?> seq /// The roots to package directories member _.Roots = match getInstanceProperty> (result.GetType()) "Roots" with | None -> Seq.empty - | Some p -> p.GetValue(result) :?> seq + | Some p -> !! p.GetValue(result) :?> seq } static member MakeResultFromFields @@ -370,7 +371,7 @@ type ReflectionDependencyManagerProvider roots: seq ) = { new IResolveDependenciesResult with - /// Succeded? + /// Succeeded? member _.Success = success /// The resolution output log @@ -418,7 +419,7 @@ type ReflectionDependencyManagerProvider rid, timeout ) : IResolveDependenciesResult = - // The ResolveDependencies method, has two signatures, the original signaature in the variable resolveDeps and the updated signature resolveDepsEx + // The ResolveDependencies method, has two signatures, the original signature in the variable resolveDeps and the updated signature resolveDepsEx // the resolve method can return values in two different tuples: // (bool * string list * string list * string list) // (bool * string list * string list) @@ -452,14 +453,18 @@ type ReflectionDependencyManagerProvider None, [||] match method with + | None -> ReflectionDependencyManagerProvider.MakeResultFromFields(false, [||], [||], Seq.empty, Seq.empty, Seq.empty) | Some m -> - let result = m.Invoke(instance, arguments) + match m.Invoke(instance, arguments) with + | null -> ReflectionDependencyManagerProvider.MakeResultFromFields(false, [||], [||], Seq.empty, Seq.empty, Seq.empty) // Verify the number of arguments returned in the tuple returned by resolvedependencies, it can be: // 1 - object with properties // 3 - (bool * string list * string list) // Support legacy api return shape (bool, seq, seq) --- original paket packagemanager - if FSharpType.IsTuple(result.GetType()) then + | result when FSharpType.IsTuple(result.GetType()) |> not -> + ReflectionDependencyManagerProvider.MakeResultFromObject(result) + | result -> // Verify the number of arguments returned in the tuple returned by resolvedependencies, it can be: // 3 - (bool * string list * string list) let success, sourceFiles, packageRoots = @@ -468,15 +473,11 @@ type ReflectionDependencyManagerProvider match tupleFields |> Array.length with | 3 -> tupleFields[0] :?> bool, - tupleFields[1] :?> string list |> List.toSeq, - tupleFields[2] :?> string list |> List.distinct |> List.toSeq + !!tupleFields[1] :?> string list |> List.toSeq, + !!tupleFields[2] :?> string list |> List.distinct |> List.toSeq | _ -> false, seqEmpty, seqEmpty ReflectionDependencyManagerProvider.MakeResultFromFields(success, [||], [||], Seq.empty, sourceFiles, packageRoots) - else - ReflectionDependencyManagerProvider.MakeResultFromObject(result) - - | None -> ReflectionDependencyManagerProvider.MakeResultFromFields(false, [||], [||], Seq.empty, Seq.empty, Seq.empty) /// Provides DependencyManagement functions. /// Class is IDisposable @@ -498,7 +499,7 @@ type DependencyProvider let assemblyLocation = typeof.GetTypeInfo().Assembly.Location - yield Path.GetDirectoryName assemblyLocation + yield !!(Path.GetDirectoryName assemblyLocation) yield AppDomain.CurrentDomain.BaseDirectory ]) @@ -612,7 +613,7 @@ type DependencyProvider let managers = RegisteredDependencyManagers compilerTools (Option.ofString outputDir) reportError - match managers |> Seq.tryFind (fun kv -> path.StartsWith(kv.Value.Key + ":")) with + match managers |> Seq.tryFind (fun kv -> path.StartsWithOrdinal(kv.Value.Key + ":")) with | None -> let err, msg = this.CreatePackageManagerUnknownError(compilerTools, outputDir, path.Split(':').[0], reportError) diff --git a/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fsi b/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fsi index a4c76e67b9..4c97224fc9 100644 --- a/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fsi +++ b/src/fcs-fable/src/Compiler/DependencyManager/DependencyProvider.fsi @@ -10,7 +10,7 @@ open Internal.Utilities.Library /// The results of ResolveDependencies type IResolveDependenciesResult = - /// Succeded? + /// Succeeded? abstract Success: bool /// The resolution output log @@ -39,7 +39,9 @@ type IResolveDependenciesResult = abstract Roots: seq /// Wraps access to a DependencyManager implementation +#if NO_CHECKNULLS [] +#endif type IDependencyManagerProvider = /// Name of the dependency manager @@ -51,7 +53,7 @@ type IDependencyManagerProvider = /// paket: indicates that this DM is for paket scripts, which manage nuget packages, github source dependencies etc ... abstract Key: string - /// The help messages for this dependency manager inster + /// The help messages for this dependency manager instance abstract HelpMessages: string[] /// Clear the results cache diff --git a/src/fcs-fable/src/Compiler/DependencyManager/NativeDllResolveHandler.fs b/src/fcs-fable/src/Compiler/DependencyManager/NativeDllResolveHandler.fs index 12aa28c48c..6319f3df48 100644 --- a/src/fcs-fable/src/Compiler/DependencyManager/NativeDllResolveHandler.fs +++ b/src/fcs-fable/src/Compiler/DependencyManager/NativeDllResolveHandler.fs @@ -8,6 +8,7 @@ open System.IO open System.Reflection open System.Runtime.InteropServices open Internal.Utilities +open Internal.Utilities.Library open Internal.Utilities.FSharpEnvironment open FSharp.Compiler.IO @@ -23,12 +24,12 @@ type internal ProbingPathsStore() = else p - static member RemoveProbeFromProcessPath probePath = + static member RemoveProbeFromProcessPath(probePath: string) = if not (String.IsNullOrWhiteSpace(probePath)) then let probe = ProbingPathsStore.AppendPathSeparator probePath let path = - ProbingPathsStore.AppendPathSeparator(Environment.GetEnvironmentVariable("PATH")) + ProbingPathsStore.AppendPathSeparator(Environment.GetEnvironmentVariable("PATH") |> defaultIfNull "") if path.Contains(probe) then Environment.SetEnvironmentVariable("PATH", path.Replace(probe, "")) @@ -37,7 +38,7 @@ type internal ProbingPathsStore() = let probe = ProbingPathsStore.AppendPathSeparator probePath let path = - ProbingPathsStore.AppendPathSeparator(Environment.GetEnvironmentVariable("PATH")) + ProbingPathsStore.AppendPathSeparator(Environment.GetEnvironmentVariable("PATH") |> defaultIfNull "") if not (path.Contains(probe)) then Environment.SetEnvironmentVariable("PATH", path + probe) @@ -71,9 +72,9 @@ type internal NativeDllResolveHandlerCoreClr(nativeProbingRoots: NativeResolutio let nativeLibraryTryLoad = let nativeLibraryType: Type = - Type.GetType("System.Runtime.InteropServices.NativeLibrary, System.Runtime.InteropServices", false) + !! Type.GetType("System.Runtime.InteropServices.NativeLibrary, System.Runtime.InteropServices", false) - nativeLibraryType.GetMethod("TryLoad", [| typeof; typeof.MakeByRefType() |]) + !! nativeLibraryType.GetMethod("TryLoad", [| typeof; typeof.MakeByRefType() |]) let loadNativeLibrary path = let arguments = [| path :> obj; IntPtr.Zero :> obj |] @@ -88,7 +89,7 @@ type internal NativeDllResolveHandlerCoreClr(nativeProbingRoots: NativeResolutio let isRooted = Path.IsPathRooted name let useSuffix s = - not (name.Contains(s + ".") || name.EndsWith(s)) // linux devs often append version # to libraries I.e mydll.so.5.3.2 + not (name.Contains(s + ".") || name.EndsWithOrdinal(s)) // linux devs often append version # to libraries I.e mydll.so.5.3.2 let usePrefix = name.IndexOf(Path.DirectorySeparatorChar) = -1 // If name has directory information no add no prefix @@ -156,13 +157,12 @@ type internal NativeDllResolveHandlerCoreClr(nativeProbingRoots: NativeResolutio // netstandard 2.1 has this property, unfortunately we don't build with that yet //public event Func ResolvingUnmanagedDll let assemblyLoadContextType: Type = - Type.GetType("System.Runtime.Loader.AssemblyLoadContext, System.Runtime.Loader", false) + !! Type.GetType("System.Runtime.Loader.AssemblyLoadContext, System.Runtime.Loader", false) let eventInfo, handler, defaultAssemblyLoadContext = - assemblyLoadContextType.GetEvent("ResolvingUnmanagedDll"), + !! assemblyLoadContextType.GetEvent("ResolvingUnmanagedDll"), Func resolveUnmanagedDll, - assemblyLoadContextType - .GetProperty("Default", BindingFlags.Static ||| BindingFlags.Public) + (!! assemblyLoadContextType.GetProperty("Default", BindingFlags.Static ||| BindingFlags.Public)) .GetValue(null, null) do eventInfo.AddEventHandler(defaultAssemblyLoadContext, handler) @@ -184,7 +184,7 @@ type NativeDllResolveHandler(nativeProbingRoots: NativeResolutionProbe option) = |> Option.filter (fun _ -> isRunningOnCoreClr) |> Option.map (fun _ -> new NativeDllResolveHandlerCoreClr(nativeProbingRoots)) - new(nativeProbingRoots: NativeResolutionProbe) = new NativeDllResolveHandler(Option.ofObj nativeProbingRoots) + new(nativeProbingRoots: NativeResolutionProbe MaybeNull) = new NativeDllResolveHandler(Option.ofObj nativeProbingRoots) member internal _.RefreshPathsInEnvironment(roots: string seq) = handler |> Option.iter (fun handler -> handler.RefreshPathsInEnvironment(roots)) diff --git a/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fs b/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fs index 028277ecb9..d74f439ce5 100644 --- a/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fs +++ b/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fs @@ -26,6 +26,7 @@ open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Features open FSharp.Compiler.IO open FSharp.Compiler.CodeAnalysis +open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.Text.Range open FSharp.Compiler.Xml @@ -105,21 +106,61 @@ let ResolveFileUsingPaths (paths, m, fileName) = #endif //!FABLE_COMPILER -let GetWarningNumber (m, warningNumber: string) = - try - // Okay so ... - // #pragma strips FS of the #pragma "FS0004" and validates the warning number - // therefore if we have warning id that starts with a numeric digit we convert it to Some (int32) - // anything else is ignored None - if Char.IsDigit(warningNumber[0]) then - Some(int32 warningNumber) - elif warningNumber.StartsWithOrdinal "FS" then - raise (ArgumentException()) +[] +type WarningNumberSource = + | CommandLineOption + | CompilerDirective + +[] +type WarningDescription = + | Int32 of int + | String of string + | Ident of Ident + +let GetWarningNumber (m, description: WarningDescription, langVersion: LanguageVersion, source: WarningNumberSource) = + let argFeature = LanguageFeature.ParsedHashDirectiveArgumentNonQuotes + + let parse (numStr: string) = + let trimPrefix (s: string) = + if s.StartsWithOrdinal "FS" then s[2..] else s + + let tryParseIntWithFailAction (s: string) (failAction: unit -> unit) = + match Int32.TryParse s with + | true, n -> Some n + | false, _ -> + failAction () + None + + let warnInvalid () = + warning (Error(FSComp.SR.buildInvalidWarningNumber numStr, m)) + + if source = WarningNumberSource.CommandLineOption then + tryParseIntWithFailAction (trimPrefix numStr) id + elif langVersion.SupportsFeature(argFeature) then + tryParseIntWithFailAction (trimPrefix numStr) warnInvalid + else + tryParseIntWithFailAction numStr id + + match description with + | WarningDescription.Int32 n -> + if tryCheckLanguageFeatureAndRecover langVersion argFeature m then + Some n + else + None + | WarningDescription.String s -> + if + source = WarningNumberSource.CompilerDirective + && not (langVersion.SupportsFeature argFeature) + && s.StartsWithOrdinal "FS" + then + warning (Error(FSComp.SR.buildInvalidWarningNumber s, m)) + + parse s + | WarningDescription.Ident ident -> + if tryCheckLanguageFeatureAndRecover langVersion argFeature m then + parse ident.idText else None - with _ -> - warning (Error(FSComp.SR.buildInvalidWarningNumber warningNumber, m)) - None let ComputeMakePathAbsolute implicitIncludeDir (path: string) = try @@ -195,12 +236,12 @@ type VersionFlag = else use fs = FileSystem.OpenFileForReadShim(s) use is = new StreamReader(fs) - is.ReadLine() + !! is.ReadLine() | VersionNone -> "0.0.0.0" #endif //!FABLE_COMPILER /// Represents a reference to an assembly. May be backed by a real assembly on disk, or a cross-project -/// reference backed by information generated by the the compiler service. +/// reference backed by information generated by the compiler service. type IRawFSharpAssemblyData = /// The raw list AutoOpenAttribute attributes in the assembly abstract GetAutoOpenAttributes: unit -> string list @@ -213,11 +254,14 @@ type IRawFSharpAssemblyData = abstract TryGetILModuleDef: unit -> ILModuleDef option /// The raw F# signature data in the assembly, if any - abstract GetRawFSharpSignatureData: range * ilShortAssemName: string * fileName: string -> (string * (unit -> ReadOnlyByteMemory)) list + abstract GetRawFSharpSignatureData: + range * ilShortAssemName: string * fileName: string -> + (string * ((unit -> ReadOnlyByteMemory) * (unit -> ReadOnlyByteMemory) option)) list /// The raw F# optimization data in the assembly, if any abstract GetRawFSharpOptimizationData: - range * ilShortAssemName: string * fileName: string -> (string * (unit -> ReadOnlyByteMemory)) list + range * ilShortAssemName: string * fileName: string -> + (string * ((unit -> ReadOnlyByteMemory) * (unit -> ReadOnlyByteMemory) option)) list /// The table of type forwarders in the assembly abstract GetRawTypeForwarders: unit -> ILExportedTypesAndForwarders @@ -232,7 +276,7 @@ type IRawFSharpAssemblyData = /// Indicates if the assembly has any F# signature data attribute abstract HasAnyFSharpSignatureDataAttribute: bool - /// Indicates if the assembly has an F# signature data attribute auitable for use with this version of F# tooling + /// Indicates if the assembly has an F# signature data attribute suitable for use with this version of F# tooling abstract HasMatchingFSharpSignatureDataAttribute: bool /// Cache of time stamps as we traverse a project description @@ -275,7 +319,7 @@ and IProjectReference = abstract FileName: string /// Evaluate raw contents of the assembly file generated by the project - abstract EvaluateRawContents: unit -> NodeCode + abstract EvaluateRawContents: unit -> Async /// Get the logical timestamp that would be the timestamp of the assembly file generated by the project /// @@ -463,6 +507,7 @@ type TcConfigBuilder = mutable embedResources: string list mutable diagnosticsOptions: FSharpDiagnosticOptions mutable mlCompatibility: bool + mutable checkNullness: bool mutable checkOverflow: bool mutable showReferenceResolutions: bool mutable outputDir: string option @@ -489,7 +534,8 @@ type TcConfigBuilder = mutable printAllSignatureFiles: bool mutable xmlDocOutputFile: string option mutable stats: bool - mutable generateFilterBlocks: bool (* don't generate filter blocks due to bugs on Mono *) + mutable generateFilterBlocks: + bool (* Previously marked with: `don't generate filter blocks due to bugs on Mono`. However, the related bug has been fixed: https://github.com/dotnet/linker/issues/2181 *) mutable signer: string option mutable container: string option @@ -543,7 +589,7 @@ type TcConfigBuilder = mutable optSettings: Optimizer.OptimizationSettings mutable emitTailcalls: bool mutable deterministic: bool - mutable concurrentBuild: bool + mutable parallelParsing: bool mutable parallelIlxGen: bool mutable emitMetadataAssembly: MetadataAssemblyGeneration mutable preferredUiLang: string option @@ -633,6 +679,10 @@ type TcConfigBuilder = mutable typeCheckingConfig: TypeCheckingConfig mutable dumpSignatureData: bool + + mutable realsig: bool + + mutable compilationMode: TcGlobals.CompilationMode } // Directories to start probing in @@ -649,7 +699,11 @@ type TcConfigBuilder = seq { yield! tcConfigB.includes yield! tcConfigB.compilerToolPaths - yield! (tcConfigB.referencedDLLs |> Seq.map (fun ref -> Path.GetDirectoryName(ref.Text))) + + yield! + (tcConfigB.referencedDLLs + |> Seq.map (fun ref -> !! Path.GetDirectoryName(ref.Text))) + tcConfigB.implicitIncludeDir } |> Seq.distinct @@ -668,8 +722,8 @@ type TcConfigBuilder = rangeForErrors ) = - if (String.IsNullOrEmpty defaultFSharpBinariesDir) then - failwith "Expected a valid defaultFSharpBinariesDir" + let defaultFSharpBinariesDir = + nullArgCheck "defaultFSharpBinariesDir" defaultFSharpBinariesDir // These are all default values, many can be overridden using the command line switch { @@ -699,6 +753,7 @@ type TcConfigBuilder = subsystemVersion = 4, 0 // per spec for 357994 useHighEntropyVA = false mlCompatibility = false + checkNullness = false checkOverflow = false showReferenceResolutions = false outputDir = None @@ -726,7 +781,7 @@ type TcConfigBuilder = printAllSignatureFiles = false xmlDocOutputFile = None stats = false - generateFilterBlocks = false (* don't generate filter blocks *) + generateFilterBlocks = false (* This was set as false due to an older bug in Mono https://github.com/dotnet/linker/issues/2181. This has been fixed in the meantime. *) signer = None container = None @@ -741,7 +796,7 @@ type TcConfigBuilder = metadataVersion = None standalone = false extraStaticLinkRoots = [] - compressMetadata = false + compressMetadata = true noSignatureData = false onlyEssentialOptimizationData = false useOptimizationDataFile = false @@ -785,7 +840,7 @@ type TcConfigBuilder = } emitTailcalls = true deterministic = false - concurrentBuild = true + parallelParsing = true parallelIlxGen = FSharpExperimentalFeaturesEnabledAutomatically emitMetadataAssembly = MetadataAssemblyGeneration.None preferredUiLang = None @@ -844,7 +899,9 @@ type TcConfigBuilder = DumpGraph = false } dumpSignatureData = false + realsig = false strictIndentation = None + compilationMode = TcGlobals.CompilationMode.Unset } member tcConfigB.FxResolver = @@ -950,7 +1007,7 @@ type TcConfigBuilder = member tcConfigB.TurnWarningOff(m, s: string) = use _ = UseBuildPhase BuildPhase.Parameter - match GetWarningNumber(m, s) with + match GetWarningNumber(m, WarningDescription.String s, tcConfigB.langVersion, WarningNumberSource.CommandLineOption) with | None -> () | Some n -> // nowarn:62 turns on mlCompatibility, e.g. shows ML compat items in intellisense menus @@ -965,7 +1022,7 @@ type TcConfigBuilder = member tcConfigB.TurnWarningOn(m, s: string) = use _ = UseBuildPhase BuildPhase.Parameter - match GetWarningNumber(m, s) with + match GetWarningNumber(m, WarningDescription.String s, tcConfigB.langVersion, WarningNumberSource.CommandLineOption) with | None -> () | Some n -> // warnon 62 turns on mlCompatibility, e.g. shows ML compat items in intellisense menus @@ -1149,7 +1206,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = // clone the input builder to ensure nobody messes with it. let data = { data with pause = data.pause } - let computeKnownDllReference libraryName = + let computeKnownDllReference (libraryName: string) = let defaultCoreLibraryReference = AssemblyReference(range0, libraryName + ".dll", None) @@ -1201,7 +1258,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = ComputeMakePathAbsolute data.implicitIncludeDir primaryAssemblyFilename try - let clrRoot = Some(Path.GetDirectoryName(FileSystem.GetFullPathShim fileName)) + let clrRoot = Some(!! Path.GetDirectoryName(FileSystem.GetFullPathShim fileName)) clrRoot, data.legacyReferenceResolver.Impl.HighestInstalledNetFrameworkVersion() with e -> // We no longer expect the above to fail but leaving this just in case @@ -1306,6 +1363,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = member _.embedResources = data.embedResources member _.diagnosticsOptions = data.diagnosticsOptions member _.mlCompatibility = data.mlCompatibility + member _.checkNullness = data.checkNullness member _.checkOverflow = data.checkOverflow member _.showReferenceResolutions = data.showReferenceResolutions member _.outputDir = data.outputDir @@ -1377,7 +1435,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = member _.optSettings = data.optSettings member _.emitTailcalls = data.emitTailcalls member _.deterministic = data.deterministic - member _.concurrentBuild = data.concurrentBuild + member _.parallelParsing = data.parallelParsing member _.parallelIlxGen = data.parallelIlxGen member _.emitMetadataAssembly = data.emitMetadataAssembly member _.pathMap = data.pathMap @@ -1415,6 +1473,8 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = member _.captureIdentifiersWhenParsing = data.captureIdentifiersWhenParsing member _.typeCheckingConfig = data.typeCheckingConfig member _.dumpSignatureData = data.dumpSignatureData + member _.realsig = data.realsig + member _.compilationMode = data.compilationMode static member Create(builder, validate) = use _ = UseBuildPhase BuildPhase.Parameter @@ -1505,7 +1565,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = /// 'framework' reference set that is potentially shared across multiple compilations. member tcConfig.IsSystemAssembly(fileName: string) = try - let dirName = Path.GetDirectoryName fileName + let dirName = !! Path.GetDirectoryName(fileName) let baseName = FileSystemUtils.fileNameWithoutExtension fileName FileSystem.FileExistsShim fileName diff --git a/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fsi b/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fsi index 8067f2ed8a..a7785ef76b 100644 --- a/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fsi +++ b/src/fcs-fable/src/Compiler/Driver/CompilerConfig.fsi @@ -19,6 +19,7 @@ open FSharp.Compiler.Diagnostics open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Features open FSharp.Compiler.CodeAnalysis +open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.BuildGraph @@ -49,16 +50,18 @@ type IRawFSharpAssemblyData = /// Indicates if the assembly has any F# signature data attribute abstract HasAnyFSharpSignatureDataAttribute: bool - /// Indicates if the assembly has an F# signature data attribute auitable for use with this version of F# tooling + /// Indicates if the assembly has an F# signature data attribute suitable for use with this version of F# tooling abstract HasMatchingFSharpSignatureDataAttribute: bool /// Get the raw F# signature data in the assembly, if any abstract GetRawFSharpSignatureData: - m: range * ilShortAssemName: string * fileName: string -> (string * (unit -> ReadOnlyByteMemory)) list + m: range * ilShortAssemName: string * fileName: string -> + (string * ((unit -> ReadOnlyByteMemory) * (unit -> ReadOnlyByteMemory) option)) list /// Get the raw F# optimization data in the assembly, if any abstract GetRawFSharpOptimizationData: - m: range * ilShortAssemName: string * fileName: string -> (string * (unit -> ReadOnlyByteMemory)) list + m: range * ilShortAssemName: string * fileName: string -> + (string * ((unit -> ReadOnlyByteMemory) * (unit -> ReadOnlyByteMemory) option)) list /// Get the table of type forwarders in the assembly abstract GetRawTypeForwarders: unit -> ILExportedTypesAndForwarders @@ -94,7 +97,7 @@ and IProjectReference = /// Evaluate raw contents of the assembly file generated by the project. /// 'None' may be returned if an in-memory view of the contents is, for some reason, /// not available. In this case the on-disk view of the contents will be preferred. - abstract EvaluateRawContents: unit -> NodeCode + abstract EvaluateRawContents: unit -> Async /// Get the logical timestamp that would be the timestamp of the assembly file generated by the project. /// @@ -296,6 +299,8 @@ type TcConfigBuilder = mutable mlCompatibility: bool + mutable checkNullness: bool + mutable checkOverflow: bool mutable showReferenceResolutions: bool @@ -438,7 +443,7 @@ type TcConfigBuilder = mutable deterministic: bool - mutable concurrentBuild: bool + mutable parallelParsing: bool mutable parallelIlxGen: bool @@ -527,6 +532,10 @@ type TcConfigBuilder = mutable typeCheckingConfig: TypeCheckingConfig mutable dumpSignatureData: bool + + mutable realsig: bool + + mutable compilationMode: TcGlobals.CompilationMode } static member CreateNew: @@ -636,6 +645,8 @@ type TcConfig = member mlCompatibility: bool + member checkNullness: bool + member checkOverflow: bool member showReferenceResolutions: bool @@ -772,7 +783,7 @@ type TcConfig = member deterministic: bool - member concurrentBuild: bool + member parallelParsing: bool member parallelIlxGen: bool @@ -890,7 +901,7 @@ type TcConfig = member CoreLibraryDllReference: unit -> AssemblyReference - /// Allow forking and subsuequent modification of the TcConfig via a new TcConfigBuilder + /// Allow forking and subsequent modification of the TcConfig via a new TcConfigBuilder member CloneToBuilder: unit -> TcConfigBuilder /// Indicates if the compilation will result in F# signature data resource in the generated binary @@ -914,6 +925,10 @@ type TcConfig = member dumpSignatureData: bool + member realsig: bool + + member compilationMode: TcGlobals.CompilationMode + #if !FABLE_COMPILER /// Represents a computation to return a TcConfig. Normally this is just a constant immutable TcConfig, @@ -936,7 +951,20 @@ val ResolveFileUsingPaths: paths: string seq * m: range * fileName: string -> st #endif //!FABLE_COMPILER -val GetWarningNumber: m: range * warningNumber: string -> int option +[] +type WarningNumberSource = + | CommandLineOption + | CompilerDirective + +[] +type WarningDescription = + | Int32 of int + | String of string + | Ident of Ident + +val GetWarningNumber: + m: range * description: WarningDescription * langVersion: LanguageVersion * source: WarningNumberSource -> + int option /// Get the name used for FSharp.Core val GetFSharpCoreLibraryName: unit -> string diff --git a/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fs b/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fs index 647da59a75..2dab5fd8f1 100644 --- a/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fs +++ b/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -/// Contains logic to prepare, post-process, filter and emit compiler diagnsotics +/// Contains logic to prepare, post-process, filter and emit compiler diagnostics module internal FSharp.Compiler.CompilerDiagnostics open System @@ -81,6 +81,7 @@ type Exception with member exn.DiagnosticRange = match exn with + | DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(range = m) -> Some m | ArgumentsInSigAndImplMismatch(_, implArg) -> Some implArg.idRange | ErrorFromAddingConstraint(_, exn2, _) -> exn2.DiagnosticRange #if !NO_TYPEPROVIDERS @@ -147,7 +148,7 @@ type Exception with | IntfImplInIntrinsicAugmentation m | OverrideInExtrinsicAugmentation m | IntfImplInExtrinsicAugmentation m - | ValueRestriction(_, _, _, _, _, m) + | ValueRestriction(_, _, _, _, m) | LetRecUnsound(_, _, m) | ObsoleteError(_, m) | ObsoleteWarning(_, m) @@ -178,6 +179,10 @@ type Exception with | ConstraintSolverTupleDiffLengths(_, _, _, _, m, _) | ConstraintSolverInfiniteTypes(_, _, _, _, m, _) | ConstraintSolverMissingConstraint(_, _, _, m, _) + | ConstraintSolverNullnessWarningEquivWithTypes(_, _, _, _, _, m, _) + | ConstraintSolverNullnessWarningWithTypes(_, _, _, _, _, m, _) + | ConstraintSolverNullnessWarningWithType(_, _, _, m, _) + | ConstraintSolverNullnessWarning(_, m, _) | ConstraintSolverTypesNotInEqualityRelation(_, _, _, m, _, _) | ConstraintSolverError(_, m, _) | ConstraintSolverTypesNotInSubsumptionRelation(_, _, _, m, _) @@ -208,7 +213,7 @@ type Exception with | HashLoadedScriptConsideredSource m -> Some m #if !FABLE_COMPILER // Strip TargetInvocationException wrappers - | :? System.Reflection.TargetInvocationException as e -> e.InnerException.DiagnosticRange + | :? System.Reflection.TargetInvocationException as e when isNotNull e.InnerException -> (!!e.InnerException).DiagnosticRange #endif #if !NO_TYPEPROVIDERS | :? TypeProviderError as e -> e.Range |> Some @@ -324,7 +329,7 @@ type Exception with | BadEventTransformation _ -> 91 | HashLoadedScriptConsideredSource _ -> 92 | UnresolvedConversionOperator _ -> 93 - | ArgumentsInSigAndImplMismatch _ -> 3218 + // avoid 94-100 for safety | ObsoleteError _ -> 101 #if !NO_TYPEPROVIDERS @@ -332,22 +337,28 @@ type Exception with | TypeProviders.ProvidedTypeResolution _ -> 103 #endif | PatternMatchCompilation.EnumMatchIncomplete _ -> 104 + | Failure _ -> 192 + | DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer _ -> 318 + | ArgumentsInSigAndImplMismatch _ -> 3218 #if !FABLE_COMPILER // Strip TargetInvocationException wrappers - | :? TargetInvocationException as e -> e.InnerException.DiagnosticNumber + | :? TargetInvocationException as e when isNotNull e.InnerException -> (!!e.InnerException).DiagnosticNumber #endif | WrappedError(e, _) -> e.DiagnosticNumber | DiagnosticWithText(n, _, _) -> n | DiagnosticWithSuggestions(n, _, _, _, _) -> n | DiagnosticEnabledWithLanguageFeature(n, _, _, _) -> n - | Failure _ -> 192 | IllegalFileNameChar(fileName, invalidChar) -> fst (FSComp.SR.buildUnexpectedFileNameCharacter (fileName, string invalidChar)) #if !NO_TYPEPROVIDERS | :? TypeProviderError as e -> e.Number #endif | ErrorsFromAddingSubsumptionConstraint(_, _, _, _, _, ContextInfo.DowncastUsedInsteadOfUpcast _, _) -> fst (FSComp.SR.considerUpcast ("", "")) + | ConstraintSolverNullnessWarningEquivWithTypes _ -> 3261 + | ConstraintSolverNullnessWarningWithTypes _ -> 3261 + | ConstraintSolverNullnessWarningWithType _ -> 3261 + | ConstraintSolverNullnessWarning _ -> 3261 | _ -> 193 type PhasedDiagnostic with @@ -404,47 +415,25 @@ type PhasedDiagnostic with (severity = FSharpDiagnosticSeverity.Info && level > 0) || (severity = FSharpDiagnosticSeverity.Warning && level >= x.WarningLevel) - /// Indicates if a diagnostic should be reported as an informational - member x.ReportAsInfo(options, severity) = - match severity with - | FSharpDiagnosticSeverity.Error -> false - | FSharpDiagnosticSeverity.Warning -> false - | FSharpDiagnosticSeverity.Info -> x.IsEnabled(severity, options) && not (List.contains x.Number options.WarnOff) - | FSharpDiagnosticSeverity.Hidden -> false - - /// Indicates if a diagnostic should be reported as a warning - member x.ReportAsWarning(options, severity) = - match severity with - | FSharpDiagnosticSeverity.Error -> false - - | FSharpDiagnosticSeverity.Warning -> x.IsEnabled(severity, options) && not (List.contains x.Number options.WarnOff) - - // Informational become warning if explicitly on and not explicitly off - | FSharpDiagnosticSeverity.Info -> - let n = x.Number - List.contains n options.WarnOn && not (List.contains n options.WarnOff) - - | FSharpDiagnosticSeverity.Hidden -> false + member x.AdjustSeverity(options, severity) = + let n = x.Number - /// Indicates if a diagnostic should be reported as an error - member x.ReportAsError(options, severity) = + let warnOff () = List.contains n options.WarnOff match severity with - | FSharpDiagnosticSeverity.Error -> true - - // Warnings become errors in some situations - | FSharpDiagnosticSeverity.Warning -> - let n = x.Number - + | FSharpDiagnosticSeverity.Error -> FSharpDiagnosticSeverity.Error + | FSharpDiagnosticSeverity.Warning when x.IsEnabled(severity, options) - && not (List.contains n options.WarnAsWarn) - && ((options.GlobalWarnAsError && not (List.contains n options.WarnOff)) + && ((options.GlobalWarnAsError && not (warnOff ())) || List.contains n options.WarnAsError) - - // Informational become errors if explicitly WarnAsError - | FSharpDiagnosticSeverity.Info -> List.contains x.Number options.WarnAsError - - | FSharpDiagnosticSeverity.Hidden -> false + && not (List.contains n options.WarnAsWarn) + -> + FSharpDiagnosticSeverity.Error + | FSharpDiagnosticSeverity.Warning when x.IsEnabled(severity, options) && not (warnOff ()) -> FSharpDiagnosticSeverity.Warning + | FSharpDiagnosticSeverity.Info when List.contains n options.WarnAsError -> FSharpDiagnosticSeverity.Error + | FSharpDiagnosticSeverity.Info when List.contains n options.WarnOn && not (warnOff ()) -> FSharpDiagnosticSeverity.Warning + | FSharpDiagnosticSeverity.Info when x.IsEnabled(severity, options) && not (warnOff ()) -> FSharpDiagnosticSeverity.Info + | _ -> FSharpDiagnosticSeverity.Hidden [] module OldStyleMessages = @@ -457,6 +446,10 @@ module OldStyleMessages = let ConstraintSolverTupleDiffLengthsE () = Message("ConstraintSolverTupleDiffLengths", "%d%d") let ConstraintSolverInfiniteTypesE () = Message("ConstraintSolverInfiniteTypes", "%s%s") let ConstraintSolverMissingConstraintE () = Message("ConstraintSolverMissingConstraint", "%s") + let ConstraintSolverNullnessWarningEquivWithTypesE () = Message("ConstraintSolverNullnessWarningEquivWithTypes", "%s%s") + let ConstraintSolverNullnessWarningWithTypesE () = Message("ConstraintSolverNullnessWarningWithTypes", "%s%s") + let ConstraintSolverNullnessWarningWithTypeE () = Message("ConstraintSolverNullnessWarningWithType", "%s") + let ConstraintSolverNullnessWarningE () = Message("ConstraintSolverNullnessWarning", "%s") let ConstraintSolverTypesNotInEqualityRelation1E () = Message("ConstraintSolverTypesNotInEqualityRelation1", "%s%s") let ConstraintSolverTypesNotInEqualityRelation2E () = Message("ConstraintSolverTypesNotInEqualityRelation2", "%s%s") let ConstraintSolverTypesNotInSubsumptionRelationE () = Message("ConstraintSolverTypesNotInSubsumptionRelation", "%s%s%s") @@ -587,11 +580,8 @@ module OldStyleMessages = let DeprecatedE () = Message("Deprecated", "%s") let LibraryUseOnlyE () = Message("LibraryUseOnly", "") let MissingFieldsE () = Message("MissingFields", "%s") - let ValueRestriction1E () = Message("ValueRestriction1", "%s%s%s") - let ValueRestriction2E () = Message("ValueRestriction2", "%s%s%s") - let ValueRestriction3E () = Message("ValueRestriction3", "%s") - let ValueRestriction4E () = Message("ValueRestriction4", "%s%s%s") - let ValueRestriction5E () = Message("ValueRestriction5", "%s%s%s") + let ValueRestrictionFunctionE () = Message("ValueRestrictionFunction", "%s%s%s") + let ValueRestrictionE () = Message("ValueRestriction", "%s%s%s") let RecoverableParseErrorE () = Message("RecoverableParseError", "") let ReservedKeywordE () = Message("ReservedKeyword", "%s") let IndentationProblemE () = Message("IndentationProblem", "%s") @@ -617,14 +607,18 @@ module OldStyleMessages = let TargetInvocationExceptionWrapperE () = Message("TargetInvocationExceptionWrapper", "%s") let ArgumentsInSigAndImplMismatchE () = Message("ArgumentsInSigAndImplMismatch", "%s%s") + let DefinitionsInSigAndImplNotCompatibleAbbreviationsDifferE () = + Message("DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer", "%s%s%s%s") + #if DEBUG let mutable showParserStackOnParseError = false #endif +[] let (|InvalidArgument|_|) (exn: exn) = match exn with - | :? ArgumentException as e -> Some e.Message - | _ -> None + | :? ArgumentException as e -> ValueSome e.Message + | _ -> ValueNone #if FABLE_COMPILER module Printf = @@ -689,6 +683,57 @@ type Exception with if m.StartLine <> m2.StartLine then os.AppendString(SeeAlsoE().Format(stringOfRange m)) + | ConstraintSolverNullnessWarningEquivWithTypes(denv, ty1, ty2, _nullness1, _nullness2, m, m2) -> + + // Turn on nullness annotations for messages about nullness + let denv = + { denv with + showNullnessAnnotations = Some true + } + + let t1, t2, _cxs = NicePrint.minimalStringsOfTwoTypes denv ty1 ty2 + + os.AppendString(ConstraintSolverNullnessWarningEquivWithTypesE().Format t1 t2) + |> ignore + + if m.StartLine <> m2.StartLine then + os.AppendString(SeeAlsoE().Format(stringOfRange m)) |> ignore + + | ConstraintSolverNullnessWarningWithTypes(denv, ty1, ty2, _nullness1, _nullness2, m, m2) -> + + // Turn on nullness annotations for messages about nullness + let denv = + { denv with + showNullnessAnnotations = Some true + } + + let t1, t2, _cxs = NicePrint.minimalStringsOfTwoTypes denv ty1 ty2 + + os.AppendString(ConstraintSolverNullnessWarningWithTypesE().Format t1 t2) |> ignore + + if m.StartLine <> m2.StartLine then + os.AppendString(SeeAlsoE().Format(stringOfRange m)) |> ignore + + | ConstraintSolverNullnessWarningWithType(denv, ty, _, m, m2) -> + + // Turn on nullness annotations for messages about nullness + let denv = + { denv with + showNullnessAnnotations = Some true + } + + let t = NicePrint.minimalStringOfType denv ty + os.AppendString(ConstraintSolverNullnessWarningWithTypeE().Format(t)) |> ignore + + if m.StartLine <> m2.StartLine then + os.AppendString(SeeAlsoE().Format(stringOfRange m)) |> ignore + + | ConstraintSolverNullnessWarning(msg, m, m2) -> + os.AppendString(ConstraintSolverNullnessWarningE().Format(msg)) |> ignore + + if m.StartLine <> m2.StartLine then + os.AppendString(SeeAlsoE().Format(stringOfRange m2)) + | ConstraintSolverMissingConstraint(denv, tpr, tpc, m, m2) -> os.AppendString( ConstraintSolverMissingConstraintE() @@ -757,7 +802,7 @@ type Exception with | ErrorFromAddingTypeEquation(error = ConstraintSolverError _ as e) -> e.Output(os, suggestNames) - | ErrorFromAddingTypeEquation(_g, denv, ty1, ty2, ConstraintSolverTupleDiffLengths(_, contextInfo, tl1, tl2, _, _), m) -> + | ErrorFromAddingTypeEquation(_g, denv, ty1, ty2, ConstraintSolverTupleDiffLengths(_, contextInfo, tl1, tl2, m1, m2), m) -> let ty1, ty2, tpcs = NicePrint.minimalStringsOfTwoTypes denv ty1 ty2 let messageArgs = tl1.Length, ty1, tl2.Length, ty2 @@ -774,6 +819,11 @@ type Exception with else os.AppendString(FSComp.SR.listElementHasWrongTypeTuple messageArgs) | _ -> os.AppendString(ErrorFromAddingTypeEquationTuplesE().Format tl1.Length ty1 tl2.Length ty2 tpcs) + else + os.AppendString(ConstraintSolverTupleDiffLengthsE().Format tl1.Length tl2.Length) + + if m1.StartLine <> m2.StartLine then + os.AppendString(SeeAlsoE().Format(stringOfRange m1)) | ErrorFromAddingTypeEquation(g, denv, ty1, ty2, e, _) -> if not (typeEquiv g ty1 ty2) then @@ -841,7 +891,8 @@ type Exception with let argsMessage, returnType, genericParametersMessage = let retTy = - knownReturnType |> Option.defaultValue (TType_var(Typar.NewUnlinked(), 0uy)) + knownReturnType + |> Option.defaultValue (TType.TType_var(Typar.NewUnlinked(), KnownAmbivalentToNull)) let argRepr = callerArgs.ArgumentNamesAndTypes @@ -911,9 +962,11 @@ type Exception with [ knownReturnType; genericParametersMessage; argsMessage ] |> List.choose id |> String.concat (nl + nl) - |> function - | "" -> nl - | result -> nl + nl + result + nl + nl + |> fun result -> + if String.IsNullOrEmpty(result) then + nl + else + nl + nl + result + nl + nl match failure with | NoOverloadsFound(methodName, overloads, _) -> @@ -1246,9 +1299,9 @@ type Exception with | Parser.TOKEN_INTERP_STRING_BEGIN_PART -> SR.GetString("Parser.TOKEN.INTERP.STRING.BEGIN.PART") | Parser.TOKEN_INTERP_STRING_PART -> SR.GetString("Parser.TOKEN.INTERP.STRING.PART") | Parser.TOKEN_INTERP_STRING_END -> SR.GetString("Parser.TOKEN.INTERP.STRING.END") + | Parser.TOKEN_BAR_JUST_BEFORE_NULL -> SR.GetString("Parser.TOKEN.BAR_JUST_BEFORE_NULL") | unknown -> - Debug.Assert(false, "unknown token tag") - let result = sprintf "%+A" unknown + let result = sprintf "unknown token tag %+A" unknown Debug.Assert(false, result) result @@ -1773,7 +1826,7 @@ type Exception with | MissingFields(sl, _) -> os.AppendString(MissingFieldsE().Format(String.concat "," sl + ".")) - | ValueRestriction(denv, infoReader, hasSig, v, _, _) -> + | ValueRestriction(denv, infoReader, v, _, _) -> let denv = { denv with showInferenceTyparAnnotations = true @@ -1781,55 +1834,22 @@ type Exception with let tau = v.TauType - if hasSig then - if isFunTy denv.g tau && (arityOfVal v).HasNoArgs then - let msg = - ValueRestriction1E().Format - v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) - v.DisplayName + if isFunTy denv.g tau && (arityOfVal v).HasNoArgs then + let msg = + ValueRestrictionFunctionE().Format + v.DisplayName + (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) + v.DisplayName - os.AppendString msg - else - let msg = - ValueRestriction2E().Format - v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) - v.DisplayName - - os.AppendString msg + os.AppendString msg else - match v.MemberInfo with - | Some membInfo when - (match membInfo.MemberFlags.MemberKind with - | SynMemberKind.PropertyGet - | SynMemberKind.PropertySet - | SynMemberKind.Constructor -> true // can't infer extra polymorphism - // can infer extra polymorphism - | _ -> false) - -> - let msg = - ValueRestriction3E() - .Format(NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) - - os.AppendString msg - | _ -> - if isFunTy denv.g tau && (arityOfVal v).HasNoArgs then - let msg = - ValueRestriction4E().Format - v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) - v.DisplayName - - os.AppendString msg - else - let msg = - ValueRestriction5E().Format - v.DisplayName - (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) - v.DisplayName + let msg = + ValueRestrictionE().Format + v.DisplayName + (NicePrint.stringOfQualifiedValOrMember denv infoReader (mkLocalValRef v)) + v.DisplayName - os.AppendString msg + os.AppendString msg | Parsing.RecoverableParseError -> os.AppendString(RecoverableParseErrorE().Format) @@ -1906,9 +1926,20 @@ type Exception with | ArgumentsInSigAndImplMismatch(sigArg, implArg) -> os.AppendString(ArgumentsInSigAndImplMismatchE().Format sigArg.idText implArg.idText) + | DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(denv, implTycon, _sigTycon, implTypeAbbrev, sigTypeAbbrev, _m) -> + let s1, s2, _ = NicePrint.minimalStringsOfTwoTypes denv implTypeAbbrev sigTypeAbbrev + + os.AppendString( + DefinitionsInSigAndImplNotCompatibleAbbreviationsDifferE().Format + (implTycon.TypeOrMeasureKind.ToString()) + implTycon.DisplayName + s1 + s2 + ) + #if !FABLE_COMPILER // Strip TargetInvocationException wrappers - | :? TargetInvocationException as exn -> exn.InnerException.Output(os, suggestNames) + | :? TargetInvocationException as e when isNotNull e.InnerException -> (!!e.InnerException).Output(os, suggestNames) | :? FileNotFoundException as exn -> Printf.bprintf os "%s" exn.Message @@ -2010,6 +2041,8 @@ type FormattedDiagnosticDetailedInfo = Location: FormattedDiagnosticLocation option Canonical: FormattedDiagnosticCanonicalInformation Message: string + Context: string option + DiagnosticStyle: DiagnosticStyle } [] @@ -2017,7 +2050,7 @@ type FormattedDiagnostic = | Short of FSharpDiagnosticSeverity * string | Long of FSharpDiagnosticSeverity * FormattedDiagnosticDetailedInfo -let FormatDiagnosticLocation (tcConfig: TcConfig) m : FormattedDiagnosticLocation = +let FormatDiagnosticLocation (tcConfig: TcConfig) (m: Range) : FormattedDiagnosticLocation = if equals m rangeStartup || equals m rangeCmdArgs then { Range = m @@ -2080,6 +2113,10 @@ let FormatDiagnosticLocation (tcConfig: TcConfig) m : FormattedDiagnosticLocatio sprintf "%s(%d,%d,%d,%d): " file m.StartLine m.StartColumn m.EndLine m.EndColumn, m, file else "", m, file + | DiagnosticStyle.Rich -> + let file = file.Replace('/', Path.DirectorySeparatorChar) + let m = withStart (mkPos m.StartLine (m.StartColumn + 1)) m + (sprintf "\n --> %s (%d,%d)" file m.StartLine m.StartColumn), m, file { Range = m @@ -2120,8 +2157,12 @@ let CollectFormattedDiagnostics (tcConfig: TcConfig, severity: FSharpDiagnosticS let text = match tcConfig.diagnosticStyle with // Show the subcategory for --vserrors so that we can fish it out in Visual Studio and use it to determine error stickiness. + | DiagnosticStyle.Emacs + | DiagnosticStyle.Gcc + | DiagnosticStyle.Default + | DiagnosticStyle.Test -> sprintf "%s FS%04d: " message errorNumber | DiagnosticStyle.VisualStudio -> sprintf "%s %s FS%04d: " subcategory message errorNumber - | _ -> sprintf "%s FS%04d: " message errorNumber + | DiagnosticStyle.Rich -> sprintf "%s FS%04d: " message errorNumber let canonical: FormattedDiagnosticCanonicalInformation = { @@ -2130,13 +2171,51 @@ let CollectFormattedDiagnostics (tcConfig: TcConfig, severity: FSharpDiagnosticS TextRepresentation = text } - let message = diagnostic.FormatCore(tcConfig.flatErrors, suggestNames) + let message = + match tcConfig.diagnosticStyle with + | DiagnosticStyle.Emacs + | DiagnosticStyle.Gcc + | DiagnosticStyle.Default + | DiagnosticStyle.Test + | DiagnosticStyle.Rich + | DiagnosticStyle.VisualStudio -> diagnostic.FormatCore(tcConfig.flatErrors, suggestNames) + + let context = + match tcConfig.diagnosticStyle with + | DiagnosticStyle.Emacs + | DiagnosticStyle.Gcc + | DiagnosticStyle.Default + | DiagnosticStyle.Test + | DiagnosticStyle.VisualStudio -> None + | DiagnosticStyle.Rich -> + match diagnostic.Range with + | Some m -> + let content = + m.FileName + |> FileSystem.GetFullFilePathInDirectoryShim tcConfig.implicitIncludeDir + |> System.IO.File.ReadAllLines + + if m.StartLine = m.EndLine then + $"\n {m.StartLine} | {content[m.StartLine - 1]}\n" + + $"""{String.make (m.StartColumn + 6) ' '}{String.make (m.EndColumn - m.StartColumn) '^'}""" + |> Some + else + content + |> fun lines -> Array.sub lines (m.StartLine - 1) (m.EndLine - m.StartLine - 1) + |> Array.fold + (fun (context, lineNumber) line -> (context + $"\n{lineNumber} | {line}", lineNumber + 1)) + ("", (m.StartLine)) + |> fst + |> Some + | None -> None let entry: FormattedDiagnosticDetailedInfo = { Location = where + Context = context Canonical = canonical Message = message + DiagnosticStyle = tcConfig.diagnosticStyle } errors.Add(FormattedDiagnostic.Long(severity, entry)) @@ -2164,12 +2243,33 @@ type PhasedDiagnostic with match e with | FormattedDiagnostic.Short(_, txt) -> buf.AppendString txt | FormattedDiagnostic.Long(_, details) -> - match details.Location with - | Some l when not l.IsEmpty -> buf.AppendString l.TextRepresentation - | _ -> () - - buf.AppendString details.Canonical.TextRepresentation - buf.AppendString details.Message + match details.DiagnosticStyle with + | DiagnosticStyle.Emacs + | DiagnosticStyle.Gcc + | DiagnosticStyle.Test + | DiagnosticStyle.VisualStudio + | DiagnosticStyle.Default -> + match details.Location with + | Some l when not l.IsEmpty -> + buf.AppendString l.TextRepresentation + + if details.Context.IsSome then + buf.AppendString details.Context.Value + | _ -> () + + buf.AppendString details.Canonical.TextRepresentation + buf.AppendString details.Message + | DiagnosticStyle.Rich -> + buf.AppendString details.Canonical.TextRepresentation + buf.AppendString details.Message + + match details.Location with + | Some l when not l.IsEmpty -> + buf.AppendString l.TextRepresentation + + if details.Context.IsSome then + buf.AppendString details.Context.Value + | _ -> () member diagnostic.OutputContext(buf, prefix, fileLineFunction) = match diagnostic.Range with @@ -2209,8 +2309,11 @@ type DiagnosticsLoggerFilteringByScopedPragmas (checkFile, scopedPragmas, diagnosticOptions: FSharpDiagnosticOptions, diagnosticsLogger: DiagnosticsLogger) = inherit DiagnosticsLogger("DiagnosticsLoggerFilteringByScopedPragmas") + let mutable realErrorPresent = false + override _.DiagnosticSink(diagnostic: PhasedDiagnostic, severity) = if severity = FSharpDiagnosticSeverity.Error then + realErrorPresent <- true diagnosticsLogger.DiagnosticSink(diagnostic, severity) else let report = @@ -2229,14 +2332,13 @@ type DiagnosticsLoggerFilteringByScopedPragmas | None -> true if report then - if diagnostic.ReportAsError(diagnosticOptions, severity) then - diagnosticsLogger.DiagnosticSink(diagnostic, FSharpDiagnosticSeverity.Error) - elif diagnostic.ReportAsWarning(diagnosticOptions, severity) then - diagnosticsLogger.DiagnosticSink(diagnostic, FSharpDiagnosticSeverity.Warning) - elif diagnostic.ReportAsInfo(diagnosticOptions, severity) then - diagnosticsLogger.DiagnosticSink(diagnostic, severity) + match diagnostic.AdjustSeverity(diagnosticOptions, severity) with + | FSharpDiagnosticSeverity.Hidden -> () + | s -> diagnosticsLogger.DiagnosticSink(diagnostic, s) override _.ErrorCount = diagnosticsLogger.ErrorCount + override _.CheckForRealErrorsIgnoringWarnings = realErrorPresent + let GetDiagnosticsLoggerFilteringByScopedPragmas (checkFile, scopedPragmas, diagnosticOptions, diagnosticsLogger) = DiagnosticsLoggerFilteringByScopedPragmas(checkFile, scopedPragmas, diagnosticOptions, diagnosticsLogger) :> DiagnosticsLogger diff --git a/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fsi b/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fsi index 64077fcf06..e7f744b2fb 100644 --- a/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fsi +++ b/src/fcs-fable/src/Compiler/Driver/CompilerDiagnostics.fsi @@ -1,6 +1,6 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -/// Contains logic to prepare, post-process, filter and emit compiler diagnsotics +/// Contains logic to prepare, post-process, filter and emit compiler diagnostics module internal FSharp.Compiler.CompilerDiagnostics open System.Text @@ -61,14 +61,8 @@ type PhasedDiagnostic with /// Format the core of the diagnostic as a string. Doesn't include the range information. member FormatCore: flattenErrors: bool * suggestNames: bool -> string - /// Indicates if a diagnostic should be reported as an informational - member ReportAsInfo: FSharpDiagnosticOptions * FSharpDiagnosticSeverity -> bool - - /// Indicates if a diagnostic should be reported as a warning - member ReportAsWarning: FSharpDiagnosticOptions * FSharpDiagnosticSeverity -> bool - - /// Indicates if a diagnostic should be reported as an error - member ReportAsError: FSharpDiagnosticOptions * FSharpDiagnosticSeverity -> bool + /// Compute new severity according to the various diagnostics options + member AdjustSeverity: FSharpDiagnosticOptions * FSharpDiagnosticSeverity -> FSharpDiagnosticSeverity #if !FABLE_COMPILER /// Output all of a diagnostic to a buffer, including range @@ -117,7 +111,9 @@ type FormattedDiagnosticCanonicalInformation = type FormattedDiagnosticDetailedInfo = { Location: FormattedDiagnosticLocation option Canonical: FormattedDiagnosticCanonicalInformation - Message: string } + Message: string + Context: string option + DiagnosticStyle: DiagnosticStyle } /// Used internally and in LegacyHostedCompilerForTesting [] diff --git a/src/fcs-fable/src/Compiler/Driver/CompilerImports.fs b/src/fcs-fable/src/Compiler/Driver/CompilerImports.fs index 42ea77b8d6..9b5ca6851f 100644 --- a/src/fcs-fable/src/Compiler/Driver/CompilerImports.fs +++ b/src/fcs-fable/src/Compiler/Driver/CompilerImports.fs @@ -66,11 +66,19 @@ let IsSignatureDataResource (r: ILResource) = || r.Name.StartsWithOrdinal FSharpSignatureCompressedDataResourceName || r.Name.StartsWithOrdinal FSharpSignatureDataResourceName2 +let IsSignatureDataResourceB (r: ILResource) = + r.Name.StartsWithOrdinal FSharpSignatureDataResourceNameB + || r.Name.StartsWithOrdinal FSharpSignatureCompressedDataResourceNameB + let IsOptimizationDataResource (r: ILResource) = r.Name.StartsWithOrdinal FSharpOptimizationDataResourceName || r.Name.StartsWithOrdinal FSharpOptimizationCompressedDataResourceName || r.Name.StartsWithOrdinal FSharpOptimizationDataResourceName2 +let IsOptimizationDataResourceB (r: ILResource) = + r.Name.StartsWithOrdinal FSharpOptimizationDataResourceNameB + || r.Name.StartsWithOrdinal FSharpOptimizationCompressedDataResourceNameB + let decompressResource (r: ILResource) = #if FABLE_COMPILER r.GetBytes() // no support for gunzip @@ -83,73 +91,132 @@ let decompressResource (r: ILResource) = ByteStorage.FromByteArray(decompressed.ToArray()).GetByteMemory() #endif -let GetResourceNameAndSignatureDataFunc (r: ILResource) = - let resourceType, ccuName = - if r.Name.StartsWithOrdinal FSharpSignatureDataResourceName then - FSharpSignatureDataResourceName, String.dropPrefix r.Name FSharpSignatureDataResourceName - elif r.Name.StartsWithOrdinal FSharpSignatureCompressedDataResourceName then - FSharpSignatureCompressedDataResourceName, String.dropPrefix r.Name FSharpSignatureCompressedDataResourceName - elif r.Name.StartsWithOrdinal FSharpSignatureDataResourceName2 then - FSharpSignatureDataResourceName2, String.dropPrefix r.Name FSharpSignatureDataResourceName2 - else - failwith "GetSignatureDataResourceName" - - if resourceType = FSharpSignatureCompressedDataResourceName then - ccuName, (fun () -> decompressResource (r)) +let GetSignatureDataResourceName (r: ILResource) = + if r.Name.StartsWithOrdinal FSharpSignatureDataResourceName then + (fun () -> r.GetBytes()), String.dropPrefix r.Name FSharpSignatureDataResourceName + elif r.Name.StartsWithOrdinal FSharpSignatureCompressedDataResourceName then + (fun () -> decompressResource r), String.dropPrefix r.Name FSharpSignatureCompressedDataResourceName + elif r.Name.StartsWithOrdinal FSharpSignatureDataResourceNameB then + (fun () -> r.GetBytes()), String.dropPrefix r.Name FSharpSignatureDataResourceNameB + elif r.Name.StartsWithOrdinal FSharpSignatureCompressedDataResourceNameB then + (fun () -> decompressResource r), String.dropPrefix r.Name FSharpSignatureCompressedDataResourceNameB + elif r.Name.StartsWithOrdinal FSharpSignatureDataResourceName2 then + (fun () -> r.GetBytes()), String.dropPrefix r.Name FSharpSignatureDataResourceName2 else - ccuName, (fun () -> r.GetBytes()) - -let GetResourceNameAndOptimizationDataFunc (r: ILResource) = - let resourceType, ccuName = - if r.Name.StartsWithOrdinal FSharpOptimizationDataResourceName then - FSharpOptimizationDataResourceName, String.dropPrefix r.Name FSharpOptimizationDataResourceName - elif r.Name.StartsWithOrdinal FSharpOptimizationCompressedDataResourceName then - FSharpOptimizationCompressedDataResourceName, String.dropPrefix r.Name FSharpOptimizationCompressedDataResourceName - elif r.Name.StartsWithOrdinal FSharpOptimizationDataResourceName2 then - FSharpOptimizationDataResourceName2, String.dropPrefix r.Name FSharpOptimizationDataResourceName2 - else - failwith "GetOptimizationDataResourceName" - - if resourceType = FSharpOptimizationCompressedDataResourceName then - ccuName, (fun () -> decompressResource (r)) + failwith "unreachable" + +let GetResourceNameAndSignatureDataFuncs (resources: ILResource list) = + [ for r in resources do + if IsSignatureDataResource r then + let readerA, ccuName = GetSignatureDataResourceName r + + let readerB = + resources |> List.tryPick (fun rB -> + if IsSignatureDataResourceB rB then + let readerB, ccuNameB = GetSignatureDataResourceName rB + if ccuName = ccuNameB then + Some readerB + else None + else None) + + ccuName, (readerA, readerB) ] + +let GetOptimizationDataResourceName (r: ILResource) = + if r.Name.StartsWithOrdinal FSharpOptimizationDataResourceName then + (fun () -> r.GetBytes()), String.dropPrefix r.Name FSharpOptimizationDataResourceName + elif r.Name.StartsWithOrdinal FSharpOptimizationCompressedDataResourceName then + (fun () -> decompressResource r), String.dropPrefix r.Name FSharpOptimizationCompressedDataResourceName + elif r.Name.StartsWithOrdinal FSharpOptimizationDataResourceNameB then + (fun () -> r.GetBytes()), String.dropPrefix r.Name FSharpOptimizationDataResourceNameB + elif r.Name.StartsWithOrdinal FSharpOptimizationCompressedDataResourceNameB then + (fun () -> decompressResource r), String.dropPrefix r.Name FSharpOptimizationCompressedDataResourceNameB + elif r.Name.StartsWithOrdinal FSharpOptimizationDataResourceName2 then + (fun () -> r.GetBytes()), String.dropPrefix r.Name FSharpOptimizationDataResourceName2 else - ccuName, (fun () -> r.GetBytes()) + failwith $"GetOptimizationDataResourceName - {r.Name}" + +let GetResourceNameAndOptimizationDataFuncs (resources: ILResource list) = + [ for r in resources do + if IsOptimizationDataResource r then + let readerA, ccuName = GetOptimizationDataResourceName r + + let readerB = + resources |> List.tryPick (fun rB -> + if IsOptimizationDataResourceB rB then + let readerB, ccuNameB = GetOptimizationDataResourceName rB + if ccuName = ccuNameB then + Some readerB + else None + else None) + ccuName, (readerA, readerB) ] let IsReflectedDefinitionsResource (r: ILResource) = r.Name.StartsWithOrdinal(QuotationPickler.SerializedReflectedDefinitionsResourceNameBase) #if !FABLE_COMPILER -let PickleToResource inMem file (g: TcGlobals) compress scope rName p x = +let ByteBufferToBytes compress (bytes: ByteBuffer) = + if compress then + let raw = new MemoryStream(bytes.AsMemory().ToArray()) + let compressed = new MemoryStream() + use deflator = new DeflateStream(compressed, CompressionLevel.Optimal) + raw.CopyTo deflator + deflator.Close() + compressed.ToArray() + else + bytes.AsMemory().ToArray() + +let PickleToResource inMem file (g: TcGlobals) compress scope rName rNameB p x = let file = PathMap.apply g.pathMap file - let bytes = - use bytes = pickleObjWithDanglingCcus inMem file g scope p x + let bytes, bytesB = pickleObjWithDanglingCcus inMem file g scope p x + use bytes = bytes + use bytesB = bytesB + let bytes = ByteBufferToBytes compress bytes + let bytesB = ByteBufferToBytes compress bytesB + let byteStorage = ByteStorage.FromByteArray(bytes) - if compress then - let raw = new MemoryStream(bytes.AsMemory().ToArray()) - let compressed = new MemoryStream() - use deflator = new DeflateStream(compressed, CompressionLevel.Optimal) - raw.CopyTo deflator - deflator.Close() - compressed.ToArray() + let byteStorageB = + if inMem then + ByteStorage.FromMemoryAndCopy(bytesB.AsMemory(), useBackingMemoryMappedFile = true) else - bytes.AsMemory().ToArray() + ByteStorage.FromByteArray(bytesB.AsMemory().ToArray()) - let byteStorage = ByteStorage.FromByteArray(bytes) + let resource = + { + Name = rName + Location = ILResourceLocation.Local(byteStorage) + Access = ILResourceAccess.Public + CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs + MetadataIndex = NoMetadataIdx + } - { - Name = rName - Location = ILResourceLocation.Local(byteStorage) - Access = ILResourceAccess.Public - CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs - MetadataIndex = NoMetadataIdx - } + let resourceB = + if bytesB.AsMemory().Length > 0 then + Some + { + Name = rNameB + Location = ILResourceLocation.Local(byteStorageB) + Access = ILResourceAccess.Public + CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs + MetadataIndex = NoMetadataIdx + } + else + None + + resource, resourceB + +let GetSignatureData (file, ilScopeRef, ilModule, byteReaderA, byteReaderB) : PickledDataWithReferences = + let memA = byteReaderA () -let GetSignatureData (file, ilScopeRef, ilModule, byteReader) : PickledDataWithReferences = - unpickleObjWithDanglingCcus file ilScopeRef ilModule unpickleCcuInfo (byteReader ()) + let memB = + (match byteReaderB with + | None -> ByteMemory.Empty.AsReadOnly() + | Some br -> br ()) -let WriteSignatureData (tcConfig: TcConfig, tcGlobals, exportRemapping, ccu: CcuThunk, fileName, inMem) : ILResource = + unpickleObjWithDanglingCcus file ilScopeRef ilModule unpickleCcuInfo memA memB + +let WriteSignatureData (tcConfig: TcConfig, tcGlobals, exportRemapping, ccu: CcuThunk, fileName, inMem) = let mspec = ApplyExportRemappingToEntity tcGlobals exportRemapping ccu.Contents if tcConfig.dumpSignatureData then @@ -164,13 +231,19 @@ let WriteSignatureData (tcConfig: TcConfig, tcGlobals, exportRemapping, ccu: Ccu // For historical reasons, we use a different resource name for FSharp.Core, so older F# compilers // don't complain when they see the resource. - let rName, compress = + let rName = if tcConfig.compressMetadata then - FSharpSignatureCompressedDataResourceName, true + FSharpSignatureCompressedDataResourceName elif ccu.AssemblyName = getFSharpCoreLibraryName then - FSharpSignatureDataResourceName2, false + FSharpSignatureDataResourceName2 + else + FSharpSignatureDataResourceName + + let rNameB = + if tcConfig.compressMetadata then + FSharpSignatureCompressedDataResourceNameB else - FSharpSignatureDataResourceName, false + FSharpSignatureDataResourceNameB let includeDir = if String.IsNullOrEmpty tcConfig.implicitIncludeDir then @@ -184,9 +257,10 @@ let WriteSignatureData (tcConfig: TcConfig, tcGlobals, exportRemapping, ccu: Ccu inMem fileName tcGlobals - compress + tcConfig.compressMetadata ccu (rName + ccu.AssemblyName) + (rNameB + ccu.AssemblyName) pickleCcuInfo { mspec = mspec @@ -194,28 +268,56 @@ let WriteSignatureData (tcConfig: TcConfig, tcGlobals, exportRemapping, ccu: Ccu usesQuotations = ccu.UsesFSharp20PlusQuotations } -let GetOptimizationData (file, ilScopeRef, ilModule, byteReader) = - unpickleObjWithDanglingCcus file ilScopeRef ilModule Optimizer.u_CcuOptimizationInfo (byteReader ()) +let GetOptimizationData (file, ilScopeRef, ilModule, byteReaderA, byteReaderB) = + let memA = byteReaderA () + + let memB = + (match byteReaderB with + | None -> ByteMemory.Empty.AsReadOnly() + | Some br -> br ()) + + unpickleObjWithDanglingCcus file ilScopeRef ilModule Optimizer.u_CcuOptimizationInfo memA memB let WriteOptimizationData (tcConfig: TcConfig, tcGlobals, fileName, inMem, ccu: CcuThunk, modulInfo) = // For historical reasons, we use a different resource name for FSharp.Core, so older F# compilers // don't complain when they see the resource. - let rName, compress = + let rName = if tcConfig.compressMetadata then - FSharpOptimizationCompressedDataResourceName, true + FSharpOptimizationCompressedDataResourceName elif ccu.AssemblyName = getFSharpCoreLibraryName then - FSharpOptimizationDataResourceName2, false + FSharpOptimizationDataResourceName2 else - FSharpOptimizationDataResourceName, false + FSharpOptimizationDataResourceName - PickleToResource inMem fileName tcGlobals compress ccu (rName + ccu.AssemblyName) Optimizer.p_CcuOptimizationInfo modulInfo + let rNameB = + if tcConfig.compressMetadata then + FSharpOptimizationCompressedDataResourceNameB + else + FSharpOptimizationDataResourceNameB + + PickleToResource + inMem + fileName + tcGlobals + tcConfig.compressMetadata + ccu + (rName + ccu.AssemblyName) + (rNameB + ccu.AssemblyName) + Optimizer.p_CcuOptimizationInfo + modulInfo let EncodeSignatureData (tcConfig: TcConfig, tcGlobals, exportRemapping, generatedCcu, outfile, isIncrementalBuild) = if tcConfig.GenerateSignatureData then - let resource = + let resource1, resource2 = WriteSignatureData(tcConfig, tcGlobals, exportRemapping, generatedCcu, outfile, isIncrementalBuild) - let resources = [ resource ] + let resources = + [ + resource1 + match resource2 with + | None -> () + | Some r -> r + ] let sigAttr = mkSignatureDataVersionAttr tcGlobals (parseILVersion FSharpBinaryMetadataFormatRevision) @@ -234,7 +336,18 @@ let EncodeOptimizationData (tcGlobals, tcConfig: TcConfig, outfile, exportRemapp else data - [ WriteOptimizationData(tcConfig, tcGlobals, outfile, isIncrementalBuild, ccu, optData) ] + let r1, r2 = + WriteOptimizationData(tcConfig, tcGlobals, outfile, isIncrementalBuild, ccu, optData) + + let resources = + [ + r1 + match r2 with + | None -> () + | Some r -> r + ] + + resources else [] @@ -391,18 +504,38 @@ let isHashRReference (r: range) = && not (equals r rangeCmdArgs) && FileSystem.IsPathRootedShim r.FileName -let IsNetModule fileName = +let IsNetModule (fileName:string) = let ext = Path.GetExtension fileName String.Compare(ext, ".netmodule", StringComparison.OrdinalIgnoreCase) = 0 -let IsDLL fileName = +let IsDLL (fileName:string) = let ext = Path.GetExtension fileName String.Compare(ext, ".dll", StringComparison.OrdinalIgnoreCase) = 0 -let IsExe fileName = +let IsExe (fileName:string) = let ext = Path.GetExtension fileName String.Compare(ext, ".exe", StringComparison.OrdinalIgnoreCase) = 0 +let addConstraintSources(ia: ImportedAssembly) = + let contents = ia.FSharpViewOfMetadata.Contents + let addCxsToMember name (v: Val) = + for typar in fst v.GeneralizedType do + for cx in typar.Constraints do + match cx with + | TyparConstraint.MayResolveMember(TTrait(source=source), _) -> + source.Value <- Some name + | _ -> () + let rec addCxsToModule name (m: ModuleOrNamespaceType) = + for e in m.ModuleAndNamespaceDefinitions do + if e.IsModuleOrNamespace then + let mname = + if String.length name > 0 then name + "." + e.DisplayName + elif e.IsModule then e.DisplayName + else "" + addCxsToModule mname e.ModuleOrNamespaceType + for memb in m.AllValsAndMembers do addCxsToMember (name + "." + memb.LogicalName) memb + addCxsToModule "" contents.ModuleOrNamespaceType + type TcConfig with member tcConfig.TryResolveLibWithDirectories(r: AssemblyReference) = @@ -434,7 +567,7 @@ type TcConfig with yield! tcConfig.GetSearchPathsForLibraryFiles() if isHashRReference m then - Path.GetDirectoryName(m.FileName) + !! Path.GetDirectoryName(m.FileName) } let resolved = TryResolveFileUsingPaths(searchPaths, m, nm) @@ -878,59 +1011,49 @@ type RawFSharpAssemblyDataBackedByFileOnDisk(ilModule: ILModuleDef, ilAssemblyRe member _.GetRawFSharpSignatureData(m, ilShortAssemName, fileName) = let resources = ilModule.Resources.AsList() - let sigDataReaders = - [ - for r in resources do - if IsSignatureDataResource r then - GetResourceNameAndSignatureDataFunc r - ] + let sigDataReaders = GetResourceNameAndSignatureDataFuncs resources let sigDataReaders = if sigDataReaders.IsEmpty && List.contains ilShortAssemName externalSigAndOptData then - let sigFileName = Path.ChangeExtension(fileName, "sigdata") + let sigFileName = !! Path.ChangeExtension(fileName, "sigdata") if not (FileSystem.FileExistsShim sigFileName) then error (Error(FSComp.SR.buildExpectedSigdataFile (FileSystem.GetFullPathShim sigFileName), m)) - [ - (ilShortAssemName, - fun () -> - FileSystem - .OpenFileForReadShim(sigFileName, useMemoryMappedFile = true, shouldShadowCopy = true) - .AsByteMemory() - .AsReadOnly()) - ] + let readerA () = + FileSystem + .OpenFileForReadShim(sigFileName, useMemoryMappedFile = true, shouldShadowCopy = true) + .AsByteMemory() + .AsReadOnly() + + [ (ilShortAssemName, (readerA, None)) ] else sigDataReaders sigDataReaders member _.GetRawFSharpOptimizationData(m, ilShortAssemName, fileName) = - let optDataReaders = - ilModule.Resources.AsList() - |> List.choose (fun r -> - if IsOptimizationDataResource r then - Some(GetResourceNameAndOptimizationDataFunc r) - else - None) + let resources = ilModule.Resources.AsList() + + let optDataReaders = GetResourceNameAndOptimizationDataFuncs resources // Look for optimization data in a file let optDataReaders = if optDataReaders.IsEmpty && List.contains ilShortAssemName externalSigAndOptData then - let optDataFile = Path.ChangeExtension(fileName, "optdata") + let optDataFile = !! Path.ChangeExtension(fileName, "optdata") if not (FileSystem.FileExistsShim optDataFile) then - let fullPath = FileSystem.GetFullPathShim optDataFile - error (Error(FSComp.SR.buildExpectedFileAlongSideFSharpCore (optDataFile, fullPath), m)) - - [ - (ilShortAssemName, - (fun () -> - FileSystem - .OpenFileForReadShim(optDataFile, useMemoryMappedFile = true, shouldShadowCopy = true) - .AsByteMemory() - .AsReadOnly())) - ] + error ( + Error(FSComp.SR.buildExpectedFileAlongSideFSharpCore (optDataFile, FileSystem.GetFullPathShim optDataFile), m) + ) + + let readerA () = + FileSystem + .OpenFileForReadShim(optDataFile, useMemoryMappedFile = true, shouldShadowCopy = true) + .AsByteMemory() + .AsReadOnly() + + [ (ilShortAssemName, (readerA, None)) ] else optDataReaders @@ -969,20 +1092,11 @@ type RawFSharpAssemblyData(ilModule: ILModuleDef, ilAssemblyRefs) = member _.GetRawFSharpSignatureData(_, _, _) = let resources = ilModule.Resources.AsList() - - [ - for r in resources do - if IsSignatureDataResource r then - GetResourceNameAndSignatureDataFunc r - ] + GetResourceNameAndSignatureDataFuncs resources member _.GetRawFSharpOptimizationData(_, _, _) = - ilModule.Resources.AsList() - |> List.choose (fun r -> - if IsOptimizationDataResource r then - Some(GetResourceNameAndOptimizationDataFunc r) - else - None) + let resources = ilModule.Resources.AsList() + GetResourceNameAndOptimizationDataFuncs resources member _.GetRawTypeForwarders() = match ilModule.Manifest with @@ -1423,7 +1537,7 @@ and [] TcImports | Tainted.Null -> false, None | Tainted.NonNull assembly -> let aname = assembly.PUntaint((fun a -> a.GetName()), m) - let ilShortAssemName = aname.Name + let ilShortAssemName = string aname.Name match tcImports.FindCcu(ctok, m, ilShortAssemName, lookupOnly = true) with | ResolvedCcu ccu -> @@ -1436,7 +1550,7 @@ and [] TcImports | UnresolvedCcu _ -> let g = tcImports.GetTcGlobals() let ilScopeRef = ILScopeRef.Assembly(ILAssemblyRef.FromAssemblyName aname) - let fileName = aname.Name + ".dll" + let fileName = string aname.Name + ".dll" let bytes = assembly @@ -1720,6 +1834,7 @@ and [] TcImports let cpath = CompPath( ILScopeRef.Local, + SyntaxAccess.Unknown, injectedNamespace |> List.rev |> List.map (fun n -> (n, ModuleOrNamespaceKind.Namespace true)) @@ -1818,7 +1933,7 @@ and [] TcImports |> Option.get // MSDN: this method causes the file to be opened and closed, but the assembly is not added to this domain let name = AssemblyName.GetAssemblyName(resolution.resolvedPath) - name.Version + !! name.Version // Note, this only captures systemRuntimeContainsTypeRef (which captures tcImportsWeak, using name tcImports) let systemRuntimeContainsType = @@ -1919,13 +2034,13 @@ and [] TcImports match providers with | [] -> - let typeName = typeof.FullName + let typeName = !! typeof.FullName warning (Error(FSComp.SR.etHostingAssemblyFoundWithoutHosts (fileNameOfRuntimeAssembly, typeName), m)) | _ -> #if DEBUG if typeProviderEnvironment.ShowResolutionMessages then - dprintfn "Found extension type hosting hosting assembly '%s' with the following extensions:" fileNameOfRuntimeAssembly + dprintfn "Found extension type hosting assembly '%s' with the following extensions:" fileNameOfRuntimeAssembly providers |> List.iter (fun provider -> dprintfn " %s" (DisplayNameOfTypeProvider(provider.TypeProvider, m))) @@ -2072,9 +2187,9 @@ and [] TcImports let ccuRawDataAndInfos = ilModule.GetRawFSharpSignatureData(m, ilShortAssemName, fileName) - |> List.map (fun (ccuName, sigDataReader) -> + |> List.map (fun (ccuName, (sigDataReader, sigDataReaderB)) -> let data = - GetSignatureData(fileName, ilScopeRef, ilModule.TryGetILModuleDef(), sigDataReader) + GetSignatureData(fileName, ilScopeRef, ilModule.TryGetILModuleDef(), sigDataReader, sigDataReaderB) let optDatas = Map.ofList optDataReaders @@ -2125,9 +2240,9 @@ and [] TcImports InterruptibleLazy(fun _ -> match Map.tryFind ccuName optDatas with | None -> None - | Some info -> + | Some (readerA, readerB) -> let data = - GetOptimizationData(fileName, ilScopeRef, ilModule.TryGetILModuleDef(), info) + GetOptimizationData(fileName, ilScopeRef, ilModule.TryGetILModuleDef(), readerA, readerB) let fixupThunk () = data.OptionalFixup(fun nm -> availableToOptionalCcu (tcImports.FindCcu(ctok, m, nm, lookupOnly = false))) @@ -2211,14 +2326,14 @@ and [] TcImports ( ctok, r: AssemblyResolution - ) : NodeCode<(_ * (unit -> AvailableImportedAssembly list)) option> = - node { + ) : Async<(_ * (unit -> AvailableImportedAssembly list)) option> = + async { CheckDisposed() let m = r.originalReference.Range let fileName = r.resolvedPath let! contentsOpt = - node { + async { match r.ProjectReference with | Some ilb -> return! ilb.EvaluateRawContents() | None -> return ProjectAssemblyDataResult.Unavailable true @@ -2281,21 +2396,23 @@ and [] TcImports // NOTE: When used in the Language Service this can cause the transitive checking of projects. Hence it must be cancellable. member tcImports.RegisterAndImportReferencedAssemblies(ctok, nms: AssemblyResolution list) = - node { + async { CheckDisposed() + let tcConfig = tcConfigP.Get ctok let runMethod = match tcConfig.parallelReferenceResolution with - | ParallelReferenceResolution.On -> NodeCode.Parallel - | ParallelReferenceResolution.Off -> NodeCode.Sequential + | ParallelReferenceResolution.On -> MultipleDiagnosticsLoggers.Parallel + | ParallelReferenceResolution.Off -> MultipleDiagnosticsLoggers.Sequential let! results = nms |> List.map (fun nm -> - node { + async { try + use _ = new CompilationGlobalsScope() return! tcImports.TryRegisterAndPrepareToImportReferencedDll(ctok, nm) with e -> errorR (Error(FSComp.SR.buildProblemReadingAssembly (nm.resolvedPath, e.Message), nm.originalReference.Range)) @@ -2306,6 +2423,9 @@ and [] TcImports let _dllinfos, phase2s = results |> Array.choose id |> List.ofArray |> List.unzip fixupOrphanCcus () let ccuinfos = List.collect (fun phase2 -> phase2 ()) phase2s + if importsBase.IsSome then + importsBase.Value.CcuTable.Values |> Seq.iter addConstraintSources + ccuTable.Values |> Seq.iter addConstraintSources return ccuinfos } @@ -2332,7 +2452,7 @@ and [] TcImports ReportWarnings warns tcImports.RegisterAndImportReferencedAssemblies(ctok, res) - |> NodeCode.RunImmediateWithoutCancellation + |> Async.RunImmediate |> ignore true @@ -2385,12 +2505,6 @@ and [] TcImports match resolutions.TryFindByOriginalReference assemblyReference with | Some assemblyResolution -> ResultD [ assemblyResolution ] | None -> -#if NO_MSBUILD_REFERENCE_RESOLUTION - try - ResultD [ tcConfig.ResolveLibWithDirectories assemblyReference ] - with e -> - ErrorD e -#else // Next try to lookup up by the exact full resolved path. match resolutions.TryFindByResolvedPath assemblyReference.Text with | Some assemblyResolution -> ResultD [ assemblyResolution ] @@ -2423,7 +2537,6 @@ and [] TcImports // Note, if mode=ResolveAssemblyReferenceMode.Speculative and the resolution failed then TryResolveLibsUsingMSBuildRules returns // the empty list and we convert the failure into an AssemblyNotResolved here. ErrorD(AssemblyNotResolved(assemblyReference.Text, assemblyReference.Range)) -#endif ) member tcImports.ResolveAssemblyReference(ctok, assemblyReference, mode) : AssemblyResolution list = @@ -2433,7 +2546,7 @@ and [] TcImports // we dispose TcImports is because we need to dispose type providers, and type providers are never included in the framework DLL set. // If a framework set ever includes type providers, you will not have to worry about explicitly calling Dispose as the Finalizer will handle it. static member BuildFrameworkTcImports(tcConfigP: TcConfigProvider, frameworkDLLs, nonFrameworkDLLs) = - node { + async { let ctok = CompilationThreadToken() let tcConfig = tcConfigP.Get ctok @@ -2510,7 +2623,7 @@ and [] TcImports resolvedAssemblies |> List.choose tryFindEquivPrimaryAssembly let! fslibCcu, fsharpCoreAssemblyScopeRef = - node { + async { if tcConfig.compilingFSharpCore then // When compiling FSharp.Core.dll, the fslibCcu reference to FSharp.Core.dll is a delayed ccu thunk fixed up during type checking return CcuThunk.CreateDelayed getFSharpCoreLibraryName, ILScopeRef.Local @@ -2567,12 +2680,15 @@ and [] TcImports tcConfig.implicitIncludeDir, tcConfig.mlCompatibility, tcConfig.isInteractive, + tcConfig.checkNullness, tcConfig.useReflectionFreeCodeGen, tryFindSysTypeCcu, tcConfig.emitDebugInfoInQuotations, tcConfig.noDebugAttributes, tcConfig.pathMap, - tcConfig.langVersion + tcConfig.langVersion, + tcConfig.realsig, + tcConfig.compilationMode ) #if DEBUG @@ -2603,7 +2719,7 @@ and [] TcImports dependencyProvider ) = - node { + async { let ctok = CompilationThreadToken() let tcConfig = tcConfigP.Get ctok @@ -2621,7 +2737,7 @@ and [] TcImports } static member BuildTcImports(tcConfigP: TcConfigProvider, dependencyProvider) = - node { + async { let ctok = CompilationThreadToken() let tcConfig = tcConfigP.Get ctok @@ -2653,7 +2769,7 @@ let RequireReferences (ctok, tcImports: TcImports, tcEnv, thisAssemblyName, reso let ccuinfos = tcImports.RegisterAndImportReferencedAssemblies(ctok, resolutions) - |> NodeCode.RunImmediateWithoutCancellation + |> Async.RunImmediate let asms = ccuinfos diff --git a/src/fcs-fable/src/Compiler/Driver/CompilerImports.fsi b/src/fcs-fable/src/Compiler/Driver/CompilerImports.fsi index b06eb25826..f7589a2d81 100644 --- a/src/fcs-fable/src/Compiler/Driver/CompilerImports.fsi +++ b/src/fcs-fable/src/Compiler/Driver/CompilerImports.fsi @@ -39,14 +39,23 @@ exception MSBuildReferenceResolutionError of message: string * warningCode: stri /// Determine if an IL resource attached to an F# assembly is an F# signature data resource val IsSignatureDataResource: ILResource -> bool +/// Determine if an IL resource attached to an F# assembly is an F# signature data resource (data stream B) +val IsSignatureDataResourceB: ILResource -> bool + /// Determine if an IL resource attached to an F# assembly is an F# optimization data resource val IsOptimizationDataResource: ILResource -> bool +/// Determine if an IL resource attached to an F# assembly is an F# optimization data resource (data stream B) +val IsOptimizationDataResourceB: ILResource -> bool + /// Determine if an IL resource attached to an F# assembly is an F# quotation data resource for reflected definitions val IsReflectedDefinitionsResource: ILResource -> bool -val GetResourceNameAndSignatureDataFunc: ILResource -> string * (unit -> ReadOnlyByteMemory) -val GetResourceNameAndOptimizationDataFunc: ILResource -> string * (unit -> ReadOnlyByteMemory) +val GetResourceNameAndSignatureDataFuncs: + ILResource list -> (string * ((unit -> ReadOnlyByteMemory) * (unit -> ReadOnlyByteMemory) option)) list + +val GetResourceNameAndOptimizationDataFuncs: + ILResource list -> (string * ((unit -> ReadOnlyByteMemory) * (unit -> ReadOnlyByteMemory) option)) list #if !FABLE_COMPILER @@ -222,14 +231,14 @@ type TcImports = member internal Base: TcImports option static member BuildFrameworkTcImports: - TcConfigProvider * AssemblyResolution list * AssemblyResolution list -> NodeCode + TcConfigProvider * AssemblyResolution list * AssemblyResolution list -> Async static member BuildNonFrameworkTcImports: TcConfigProvider * TcImports * AssemblyResolution list * UnresolvedAssemblyReference list * DependencyProvider -> - NodeCode + Async static member BuildTcImports: - tcConfigP: TcConfigProvider * dependencyProvider: DependencyProvider -> NodeCode + tcConfigP: TcConfigProvider * dependencyProvider: DependencyProvider -> Async /// Process a group of #r in F# Interactive. /// Adds the reference to the tcImports and add the ccu to the type checking environment. diff --git a/src/fcs-fable/src/Compiler/Driver/CompilerOptions.fs b/src/fcs-fable/src/Compiler/Driver/CompilerOptions.fs index 7624ac4507..b144f8eb9a 100644 --- a/src/fcs-fable/src/Compiler/Driver/CompilerOptions.fs +++ b/src/fcs-fable/src/Compiler/Driver/CompilerOptions.fs @@ -111,7 +111,7 @@ let compilerOptionUsage (CompilerOption(s, tag, spec, _, _)) = | OptionFloat _ -> sprintf "--%s:%s" s tag | OptionRest _ -> sprintf "--%s ..." s | OptionGeneral _ -> - if tag = "" then + if String.IsNullOrEmpty(tag) then sprintf "%s" s else sprintf "%s:%s" s tag (* still being decided *) @@ -253,7 +253,7 @@ module ResponseFile = let data = seq { while not reader.EndOfStream do - reader.ReadLine() + !! reader.ReadLine() } |> Seq.choose parseLine |> List.ofSeq @@ -276,7 +276,7 @@ let ParseCompilerOptions (collectOtherArgument: string -> unit, blocks: Compiler let optArgs = String.Join(":", opts[1..]) let opt = - if option = "" then + if String.IsNullOrEmpty(option) then "" // if it doesn't start with a '-' or '/', reject outright elif option[0] <> '-' && option[0] <> '/' then @@ -284,7 +284,7 @@ let ParseCompilerOptions (collectOtherArgument: string -> unit, blocks: Compiler elif option <> "--" then // is it an abbreviated or MSFT-style option? // if so, strip the first character and move on with your life - // Wierdly a -- option can't have only a 1 character name + // Weirdly a -- option can't have only a 1 character name if option.Length = 2 || isSlashOpt option then option[1..] elif option.Length >= 3 && option[2] = ':' then @@ -304,13 +304,13 @@ let ParseCompilerOptions (collectOtherArgument: string -> unit, blocks: Compiler opt, token, optArgs let getOptionArg compilerOption (argString: string) = - if argString = "" then + if String.IsNullOrEmpty(argString) then errorR (Error(FSComp.SR.buildOptionRequiresParameter (compilerOptionUsage compilerOption), rangeCmdArgs)) argString let getOptionArgList compilerOption (argString: string) = - if argString = "" then + if String.IsNullOrEmpty(argString) then errorR (Error(FSComp.SR.buildOptionRequiresParameter (compilerOptionUsage compilerOption), rangeCmdArgs)) [] else @@ -386,19 +386,19 @@ let ParseCompilerOptions (collectOtherArgument: string -> unit, blocks: Compiler reportDeprecatedOption d f blocks t - | CompilerOption(s, _, OptionUnit f, d, _) :: _ when optToken = s && argString = "" -> + | CompilerOption(s, _, OptionUnit f, d, _) :: _ when optToken = s && String.IsNullOrEmpty(argString) -> reportDeprecatedOption d f () t - | CompilerOption(s, _, OptionSwitch f, d, _) :: _ when getSwitchOpt optToken = s && argString = "" -> + | CompilerOption(s, _, OptionSwitch f, d, _) :: _ when getSwitchOpt optToken = s && String.IsNullOrEmpty(argString) -> reportDeprecatedOption d f (getSwitch opt) t - | CompilerOption(s, _, OptionSet f, d, _) :: _ when optToken = s && argString = "" -> + | CompilerOption(s, _, OptionSet f, d, _) :: _ when optToken = s && String.IsNullOrEmpty(argString) -> reportDeprecatedOption d f.Value <- true t - | CompilerOption(s, _, OptionClear f, d, _) :: _ when optToken = s && argString = "" -> + | CompilerOption(s, _, OptionClear f, d, _) :: _ when optToken = s && String.IsNullOrEmpty(argString) -> reportDeprecatedOption d f.Value <- false t @@ -579,6 +579,9 @@ let SetTailcallSwitch (tcConfigB: TcConfigBuilder) switch = let SetDeterministicSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.deterministic <- (switch = OptionSwitch.On) +let SetRealsig (tcConfigB: TcConfigBuilder) switch = + tcConfigB.realsig <- (switch = OptionSwitch.On) + let SetReferenceAssemblyOnlySwitch (tcConfigB: TcConfigBuilder) switch = match tcConfigB.emitMetadataAssembly with | MetadataAssemblyGeneration.None when (not tcConfigB.standalone) && tcConfigB.extraStaticLinkRoots.IsEmpty -> @@ -630,6 +633,26 @@ let splittingSwitch (tcConfigB: TcConfigBuilder) switch = let callVirtSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.alwaysCallVirt <- switch = OptionSwitch.On +let callParallelCompilationSwitch (tcConfigB: TcConfigBuilder) switch = + tcConfigB.parallelIlxGen <- switch = OptionSwitch.On + + let (graphCheckingMode, optMode) = + match switch with + | OptionSwitch.On -> TypeCheckingMode.Graph, OptimizationProcessingMode.Parallel + | OptionSwitch.Off -> TypeCheckingMode.Sequential, OptimizationProcessingMode.Sequential + + if tcConfigB.typeCheckingConfig.Mode <> graphCheckingMode then + tcConfigB.typeCheckingConfig <- + { tcConfigB.typeCheckingConfig with + Mode = graphCheckingMode + } + + if tcConfigB.optSettings.processingMode <> optMode then + tcConfigB.optSettings <- + { tcConfigB.optSettings with + processingMode = optMode + } + let useHighEntropyVASwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.useHighEntropyVA <- switch = OptionSwitch.On @@ -688,8 +711,8 @@ let SetEmbedAllSourceSwitch (tcConfigB: TcConfigBuilder) switch = else tcConfigB.embedAllSource <- false -let setOutFileName tcConfigB path = - let outputDir = Path.GetDirectoryName(path) +let setOutFileName tcConfigB (path: string) = + let outputDir = !! Path.GetDirectoryName(path) tcConfigB.outputDir <- Some outputDir tcConfigB.outputFile <- Some path @@ -840,7 +863,7 @@ let errorsAndWarningsFlags (tcConfigB: TcConfigBuilder) = CompilerOption( "nowarn", tagWarnList, - OptionStringList(fun n -> tcConfigB.TurnWarningOff(rangeCmdArgs, trimFS n)), + OptionStringList(fun n -> tcConfigB.TurnWarningOff(rangeCmdArgs, n)), None, Some(FSComp.SR.optsNowarn ()) ) @@ -848,11 +871,19 @@ let errorsAndWarningsFlags (tcConfigB: TcConfigBuilder) = CompilerOption( "warnon", tagWarnList, - OptionStringList(fun n -> tcConfigB.TurnWarningOn(rangeCmdArgs, trimFS n)), + OptionStringList(fun n -> tcConfigB.TurnWarningOn(rangeCmdArgs, n)), None, Some(FSComp.SR.optsWarnOn ()) ) + CompilerOption( + "checknulls", + tagNone, + OptionSwitch(fun switch -> tcConfigB.checkNullness <- switch = OptionSwitch.On), + None, + Some(FSComp.SR.optsCheckNulls ()) + ) + CompilerOption( "consolecolors", tagNone, @@ -1037,6 +1068,8 @@ let codeGenerationFlags isFsi (tcConfigB: TcConfigBuilder) = Some(FSComp.SR.optsDeterministic ()) ) + CompilerOption("realsig", tagNone, OptionSwitch(SetRealsig tcConfigB), None, Some(FSComp.SR.optsRealsig ())) + CompilerOption("pathmap", tagPathMap, OptionStringList(AddPathMapping tcConfigB), None, Some(FSComp.SR.optsPathMap ())) CompilerOption( @@ -1232,7 +1265,7 @@ let noFrameworkFlag isFsc tcConfigB = tagNone, OptionUnit(fun () -> // When the compilation is not fsi do nothing. - // It is just not a usefull option when running fsi on the coreclr or the desktop framework really. + // It is just not a useful option when running fsi on the coreclr or the desktop framework really. if isFsc then tcConfigB.implicitlyReferenceDotNetAssemblies <- false tcConfigB.implicitlyResolveAssemblies <- false), @@ -1371,9 +1404,9 @@ let testFlag tcConfigB = | "DumpDebugInfo" -> tcConfigB.dumpDebugInfo <- true | "ShowLoadedAssemblies" -> tcConfigB.showLoadedAssemblies <- true | "ContinueAfterParseFailure" -> tcConfigB.continueAfterParseFailure <- true - | "ParallelOff" -> tcConfigB.concurrentBuild <- false - | "ParallelIlxGen" -> tcConfigB.parallelIlxGen <- true - | "GraphBasedChecking" -> + | "ParallelOff" -> tcConfigB.parallelParsing <- false + | "ParallelIlxGen" -> tcConfigB.parallelIlxGen <- true // Kept as --test:.. flag for temporary backwards compatibility during .NET10 period. + | "GraphBasedChecking" -> // Kept as --test:.. flag for temporary backwards compatibility during .NET10 period. tcConfigB.typeCheckingConfig <- { tcConfigB.typeCheckingConfig with Mode = TypeCheckingMode.Graph @@ -1384,7 +1417,7 @@ let testFlag tcConfigB = DumpGraph = true } | "DumpSignatureData" -> tcConfigB.dumpSignatureData <- true - | "ParallelOptimization" -> + | "ParallelOptimization" -> // Kept as --test:.. flag for temporary backwards compatibility during .NET10 period. tcConfigB.optSettings <- { tcConfigB.optSettings with processingMode = OptimizationProcessingMode.Parallel @@ -1401,6 +1434,7 @@ let testFlag tcConfigB = let editorSpecificFlags (tcConfigB: TcConfigBuilder) = [ CompilerOption("vserrors", tagNone, OptionUnit(fun () -> tcConfigB.diagnosticStyle <- DiagnosticStyle.VisualStudio), None, None) + CompilerOption("richerrors", tagNone, OptionUnit(fun () -> tcConfigB.diagnosticStyle <- DiagnosticStyle.Rich), None, None) CompilerOption("validate-type-providers", tagNone, OptionUnit id, None, None) // preserved for compatibility's sake, no longer has any effect CompilerOption("LCID", tagInt, OptionInt ignore, None, None) CompilerOption("flaterrors", tagNone, OptionUnit(fun () -> tcConfigB.flatErrors <- true), None, None) @@ -1697,6 +1731,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) = None ) + CompilerOption( + "parallelcompilation", + tagNone, + OptionSwitch(callParallelCompilationSwitch tcConfigB), + Some(InternalCommandLineOption("--parallelcompilation", rangeCmdArgs)), + None + ) + testFlag tcConfigB ] @ @@ -2065,7 +2107,7 @@ let GetBannerText tcConfigB = else "" -/// FSC only help. (FSI has it's own help function). +/// FSC only help. (FSI has its own help function). let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) = GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth @@ -2150,7 +2192,7 @@ let abbreviatedFlagsFsc tcConfigB = Some(FSComp.SR.optsShortFormOf ("--target library")) ) - // FSC help abbreviations. FSI has it's own help options... + // FSC help abbreviations. FSI has its own help options... CompilerOption( "?", tagNone, @@ -2405,7 +2447,7 @@ let DoWithColor newColor f = match enableConsoleColoring, foreBackColor () with | false, _ | true, None -> - // could not get console colours, so no attempt to change colours, can not set them back + // could not get console colours, so no attempt to change colours, cannot set them back f () | true, Some(c, _) -> try diff --git a/src/fcs-fable/src/Compiler/Driver/CreateILModule.fs b/src/fcs-fable/src/Compiler/Driver/CreateILModule.fs index 7fa60a2595..5ed836631d 100644 --- a/src/fcs-fable/src/Compiler/Driver/CreateILModule.fs +++ b/src/fcs-fable/src/Compiler/Driver/CreateILModule.fs @@ -54,11 +54,12 @@ module AttributeHelpers = | Some(Attrib(_, _, [ AttribBoolArg p ], _, _, _, _)) -> Some p | _ -> None + [] let (|ILVersion|_|) (versionString: string) = try - Some(parseILVersion versionString) + ValueSome(parseILVersion versionString) with e -> - None + ValueNone //---------------------------------------------------------------------------- // ValidateKeySigningAttributes, GetStrongNameSigner @@ -409,7 +410,7 @@ module MainModuleBuilder = yield! codegenResults.ilAssemAttrs if Option.isSome pdbfile then - tcGlobals.mkDebuggableAttributeV2 (tcConfig.jitTracking, disableJitOptimizations, false (* enableEnC *) ) + tcGlobals.mkDebuggableAttributeV2 (tcConfig.jitTracking, disableJitOptimizations) yield! reflectedDefinitionAttrs ] @@ -522,7 +523,7 @@ module MainModuleBuilder = $"%d{fileVersionInfo.Major}.%d{fileVersionInfo.Minor}.%d{fileVersionInfo.Build}.%d{fileVersionInfo.Revision}") ("ProductVersion", productVersionString) match tcConfig.outputFile with - | Some f -> ("OriginalFilename", Path.GetFileName f) + | Some f -> ("OriginalFilename", !! Path.GetFileName(f)) | None -> () yield! FindAttribute "Comments" "System.Reflection.AssemblyDescriptionAttribute" yield! FindAttribute "FileDescription" "System.Reflection.AssemblyTitleAttribute" @@ -584,19 +585,22 @@ module MainModuleBuilder = [ resource ] // a user cannot specify both win32res and win32manifest - if not (tcConfig.win32manifest = "") && not (tcConfig.win32res = "") then + if + not (String.IsNullOrEmpty(tcConfig.win32manifest)) + && not (String.IsNullOrEmpty(tcConfig.win32res)) + then error (Error(FSComp.SR.fscTwoResourceManifests (), rangeCmdArgs)) let win32Manifest = // use custom manifest if provided - if not (tcConfig.win32manifest = "") then + if not (String.IsNullOrEmpty(tcConfig.win32manifest)) then tcConfig.win32manifest // don't embed a manifest if target is not an exe, if manifest is specifically excluded, if another native resource is being included, or if running on mono elif not (tcConfig.target.IsExe) || not (tcConfig.includewin32manifest) - || not (tcConfig.win32res = "") + || not (String.IsNullOrEmpty(tcConfig.win32res)) then "" // otherwise, include the default manifest @@ -618,9 +622,9 @@ module MainModuleBuilder = [ for av in assemblyVersionResources assemblyVersion do ILNativeResource.Out av - if not (tcConfig.win32res = "") then + if not (String.IsNullOrEmpty(tcConfig.win32res)) then ILNativeResource.Out(FileSystem.OpenFileForReadShim(tcConfig.win32res).ReadAllBytes()) - if tcConfig.includewin32manifest && not (win32Manifest = "") then + if tcConfig.includewin32manifest && not (String.IsNullOrEmpty(win32Manifest)) then ILNativeResource.Out [| yield! ResFileFormat.ResFileHeader() @@ -631,8 +635,8 @@ module MainModuleBuilder = )) |] if - tcConfig.win32res = "" - && tcConfig.win32icon <> "" + String.IsNullOrEmpty(tcConfig.win32res) + && not (String.IsNullOrEmpty(tcConfig.win32icon)) && tcConfig.target <> CompilerTarget.Dll then use ms = new MemoryStream() diff --git a/src/fcs-fable/src/Compiler/Driver/FxResolver.fs b/src/fcs-fable/src/Compiler/Driver/FxResolver.fs index 6f8643c30a..dfeff2cabf 100644 --- a/src/fcs-fable/src/Compiler/Driver/FxResolver.fs +++ b/src/fcs-fable/src/Compiler/Driver/FxResolver.fs @@ -69,7 +69,7 @@ type internal FxResolver | NonNull message -> lock errorslock (fun () -> errorsList.Add(message)) let psi = ProcessStartInfo() - psi.FileName <- pathToExe + psi.FileName <- !!pathToExe if workingDir.IsSome then psi.WorkingDirectory <- workingDir.Value @@ -91,7 +91,7 @@ type internal FxResolver p.BeginOutputReadLine() p.BeginErrorReadLine() - if not (p.WaitForExit(timeout)) then + if not (p.WaitForExit(timeout: int)) then // Timed out resolving throw a diagnostic. raise (TimeoutException(sprintf "Timeout executing command '%s' '%s'" psi.FileName psi.Arguments)) else @@ -213,7 +213,7 @@ type internal FxResolver if String.IsNullOrWhiteSpace fileName then getFSharpCompilerLocation () else - fileName + !!fileName // Compute the framework implementation directory, either of the selected SDK or the currently running process as a backup // F# interactive/reflective scenarios use the implementation directory of the currently running process @@ -238,7 +238,7 @@ type internal FxResolver dotnetConfig.IndexOf(pattern, StringComparison.OrdinalIgnoreCase) + pattern.Length - let endPos = dotnetConfig.IndexOf("\"", startPos) + let endPos = dotnetConfig.IndexOfOrdinal("\"", startPos) let ver = dotnetConfig[startPos .. endPos - 1] let path = @@ -284,7 +284,10 @@ type internal FxResolver try let asm = typeof>.Assembly - if asm.FullName.StartsWith("System.ValueTuple", StringComparison.OrdinalIgnoreCase) then + if + (!!asm.FullName) + .StartsWith("System.ValueTuple", StringComparison.OrdinalIgnoreCase) + then Some asm.Location else let valueTuplePath = @@ -318,7 +321,7 @@ type internal FxResolver version, "" match Version.TryParse(ver) with - | true, v -> v, suffix + | true, v -> !!v, suffix | false, _ -> zeroVersion, suffix let compareVersion (v1: Version * string) (v2: Version * string) = @@ -364,14 +367,14 @@ type internal FxResolver let implDir, warnings = getImplementationAssemblyDir () let version = DirectoryInfo(implDir).Name - if version.StartsWith("x") then + if version.StartsWithOrdinal("x") then // Is running on the desktop (None, None), warnings else let di = tryGetVersionedSubDirectory "packs/Microsoft.NETCore.App.Ref" version match di with - | Some di -> (Some(di.Name), Some(di.Parent.FullName)), warnings + | Some di -> (Some(di.Name), Some((!!di.Parent).FullName)), warnings | None -> (None, None), warnings with e -> let warn = @@ -403,7 +406,7 @@ type internal FxResolver | ".NET", "Core" when arr.Length >= 3 -> Some("netcoreapp" + (getTfmNumber arr[2])) | ".NET", "Framework" when arr.Length >= 3 -> - if arr[2].StartsWith("4.8") then + if arr[2].StartsWithOrdinal("4.8") then Some "net48" else Some "net472" @@ -416,7 +419,7 @@ type internal FxResolver match runningTfmOpt with | Some tfm -> tfm - | _ -> if isRunningOnCoreClr then "net8.0" else "net472" + | _ -> if isRunningOnCoreClr then "net9.0" else "net472" let trySdkRefsPackDirectory = lazy @@ -495,7 +498,7 @@ type internal FxResolver try if FileSystem.FileExistsShim(reference) then // Reference is a path to a file on disk - Path.GetFileNameWithoutExtension(reference), reference + !! Path.GetFileNameWithoutExtension(reference), reference else // Reference is a SimpleAssembly name reference, frameworkPathFromSimpleName reference @@ -560,7 +563,7 @@ type internal FxResolver dotnetConfig.IndexOf(pattern, StringComparison.OrdinalIgnoreCase) + pattern.Length - let endPos = dotnetConfig.IndexOf("\"", startPos) + let endPos = dotnetConfig.IndexOfOrdinal("\"", startPos) let tfm = dotnetConfig[startPos .. endPos - 1] tfm with _ -> @@ -936,7 +939,7 @@ type internal FxResolver if useFsiAuxLib then getFsiLibraryImplementationReference () ] - |> List.filter (Path.GetFileNameWithoutExtension >> systemAssemblies.Contains) + |> List.filter (Path.GetFileNameWithoutExtension >> (!!) >> systemAssemblies.Contains) sdkReferences, false with e -> diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fs b/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fs index 9300385b48..1425ec0f9e 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fs +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fs @@ -1,7 +1,6 @@ module internal FSharp.Compiler.GraphChecking.DependencyResolution open FSharp.Compiler.Syntax -open Internal.Utilities.Library /// Find a path from a starting TrieNode and return the end node or None let queryTriePartial (trie: TrieNode) (path: LongIdentifier) : TrieNode option = @@ -118,6 +117,20 @@ let rec processStateEntry (trie: TrieNode) (state: FileContentQueryState) (entry FoundDependencies = foundDependencies } + | FileContentEntry.ModuleName name -> + // We need to check if the module name is a hit in the Trie. + let state' = + let queryResult = queryTrie trie [ name ] + processIdentifier queryResult state + + match state.OwnNamespace with + | None -> state' + | Some ns -> + // If there we currently have our own namespace, + // the combination of that namespace + module name should be checked as well. + let queryResult = queryTrieDual trie ns [ name ] + processIdentifier queryResult state' + /// /// For a given file's content, collect all missing ("ghost") file dependencies that the core resolution algorithm didn't return, /// but are required to satisfy the type-checker. diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fsi b/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fsi index 8804999117..19dcffc6ad 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fsi +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/DependencyResolution.fsi @@ -26,7 +26,7 @@ val processOpenPath: trie: TrieNode -> path: LongIdentifier -> state: FileConten /// /// /// The file order is used by the resolution algorithm to remove edges not allowed by the language. -/// Ie. if file B preceeds file A, the resulting graph will not contain edge B -> A. +/// Ie. if file B precedes file A, the resulting graph will not contain edge B -> A. /// Hence this function cannot, as it stands, be used to help create a "reasonable" file ordering for an unordered set of files. /// /// diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/FileContentMapping.fs b/src/fcs-fable/src/Compiler/Driver/GraphChecking/FileContentMapping.fs index bfdaf4beea..7be965522f 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/FileContentMapping.fs +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/FileContentMapping.fs @@ -9,15 +9,26 @@ type Continuations = ((FileContentEntry list -> FileContentEntry list) -> FileCo let collectFromOption (mapping: 'T -> 'U list) (t: 'T option) : 'U list = List.collect mapping (Option.toList t) let longIdentToPath (skipLast: bool) (longId: LongIdent) : LongIdentifier = - if skipLast then - List.take (longId.Length - 1) longId - else - longId + + // We always skip the "special" `global` identifier. + let longId = + match longId with + | h :: t when h.idText = "`global`" -> t + | _ -> longId + + match skipLast, longId with + | true, _ :: _ -> List.take (longId.Length - 1) longId + | _ -> longId |> List.map (fun ident -> ident.idText) let synLongIdentToPath (skipLast: bool) (synLongIdent: SynLongIdent) = longIdentToPath skipLast synLongIdent.LongIdent +/// In some rare cases we are interested in the name of a single Ident. +/// For example `nameof ModuleName` in expressions or patterns. +let visitIdentAsPotentialModuleName (moduleNameIdent: Ident) = + FileContentEntry.ModuleName moduleNameIdent.idText + let visitSynLongIdent (lid: SynLongIdent) : FileContentEntry list = visitLongIdent lid.LongIdent let visitLongIdent (lid: LongIdent) = @@ -51,7 +62,7 @@ let visitSynModuleDecl (decl: SynModuleDecl) : FileContentEntry list = | SynModuleDecl.NestedModule(moduleInfo = SynComponentInfo(longId = [ ident ]; attributes = attributes); decls = decls) -> yield! visitSynAttributes attributes yield FileContentEntry.NestedModule(ident.idText, List.collect visitSynModuleDecl decls) - | SynModuleDecl.NestedModule _ -> failwith "A nested module cannot have multiple identifiers" + | SynModuleDecl.NestedModule _ -> () // A nested module cannot have multiple identifiers. This will already be a parse error, but we could be working with recovered syntax tree | SynModuleDecl.Let(bindings = bindings) -> yield! List.collect visitBinding bindings | SynModuleDecl.Types(typeDefns = typeDefns) -> yield! List.collect visitSynTypeDefn typeDefns | SynModuleDecl.HashDirective _ -> () @@ -75,7 +86,7 @@ let visitSynModuleSigDecl (md: SynModuleSigDecl) = | SynModuleSigDecl.NestedModule(moduleInfo = SynComponentInfo(longId = [ ident ]; attributes = attributes); moduleDecls = decls) -> yield! visitSynAttributes attributes yield FileContentEntry.NestedModule(ident.idText, List.collect visitSynModuleSigDecl decls) - | SynModuleSigDecl.NestedModule _ -> failwith "A nested module cannot have multiple identifiers" + | SynModuleSigDecl.NestedModule _ -> () // A nested module cannot have multiple identifiers. This will already be a parse error, but we could be working with recovered syntax tree | SynModuleSigDecl.ModuleAbbrev(longId = longId) -> yield! visitLongIdentForModuleAbbrev longId | SynModuleSigDecl.Val(valSig, _) -> yield! visitSynValSig valSig | SynModuleSigDecl.Types(types = types) -> yield! List.collect visitSynTypeDefnSig types @@ -200,8 +211,8 @@ let visitSynMemberDefn (md: SynMemberDefn) : FileContentEntry list = | SynMemberDefn.GetSetMember(memberDefnForGet, memberDefnForSet, _, _) -> yield! collectFromOption visitBinding memberDefnForGet yield! collectFromOption visitBinding memberDefnForSet - | SynMemberDefn.ImplicitCtor(ctorArgs = ctorArgs) -> yield! visitSynSimplePats ctorArgs - | SynMemberDefn.ImplicitInherit(inheritType, inheritArgs, _, _) -> + | SynMemberDefn.ImplicitCtor(ctorArgs = pat) -> yield! visitPat pat + | SynMemberDefn.ImplicitInherit(inheritType, inheritArgs, _, _, _) -> yield! visitSynType inheritType yield! visitSynExpr inheritArgs | SynMemberDefn.LetBindings(bindings = bindings) -> yield! List.collect visitBinding bindings @@ -209,7 +220,8 @@ let visitSynMemberDefn (md: SynMemberDefn) : FileContentEntry list = | SynMemberDefn.Interface(interfaceType, _, members, _) -> yield! visitSynType interfaceType yield! collectFromOption (List.collect visitSynMemberDefn) members - | SynMemberDefn.Inherit(baseType, _, _) -> yield! visitSynType baseType + | SynMemberDefn.Inherit(baseType = Some baseType) -> yield! visitSynType baseType + | SynMemberDefn.Inherit(baseType = None) -> () | SynMemberDefn.ValField(fieldInfo, _) -> yield! visitSynField fieldInfo | SynMemberDefn.NestedType _ -> () | SynMemberDefn.AutoProperty(attributes = attributes; typeOpt = typeOpt; synExpr = synExpr) -> @@ -246,6 +258,7 @@ let visitSynType (t: SynType) : FileContentEntry list = let continuations = List.map (snd >> visit) fields Continuation.concatenate continuations continuation | SynType.Array(elementType = elementType) -> visit elementType continuation + | SynType.WithNull(innerType = innerType) -> visit innerType continuation | SynType.Fun(argType, returnType, _, _) -> let continuations = List.map visit [ argType; returnType ] Continuation.concatenate continuations continuation @@ -256,6 +269,7 @@ let visitSynType (t: SynType) : FileContentEntry list = | SynType.HashConstraint(innerType, _) -> visit innerType continuation | SynType.MeasurePower(baseMeasure = baseMeasure) -> visit baseMeasure continuation | SynType.StaticConstant _ -> continuation [] + | SynType.StaticConstantNull _ -> continuation [] | SynType.StaticConstantExpr(expr, _) -> continuation (visitSynExpr expr) | SynType.StaticConstantNamed(ident, value, _) -> let continuations = List.map visit [ ident; value ] @@ -294,6 +308,7 @@ let visitSynTypeConstraint (tc: SynTypeConstraint) : FileContentEntry list = | SynTypeConstraint.WhereTyparIsReferenceType _ | SynTypeConstraint.WhereTyparIsUnmanaged _ | SynTypeConstraint.WhereTyparSupportsNull _ + | SynTypeConstraint.WhereTyparNotSupportsNull _ | SynTypeConstraint.WhereTyparIsComparable _ | SynTypeConstraint.WhereTyparIsEquatable _ -> [] | SynTypeConstraint.WhereTyparDefaultsToType(typeName = typeName) -> visitSynType typeName @@ -302,9 +317,54 @@ let visitSynTypeConstraint (tc: SynTypeConstraint) : FileContentEntry list = | SynTypeConstraint.WhereTyparIsEnum(typeArgs = typeArgs) -> List.collect visitSynType typeArgs | SynTypeConstraint.WhereTyparIsDelegate(typeArgs = typeArgs) -> List.collect visitSynType typeArgs +[] +let inline (|NameofIdent|_|) (ident: Ident) = + if ident.idText = "nameof" then ValueSome() else ValueNone + +/// nameof X.Y.Z can be used in expressions and patterns +[] +type NameofResult = + /// Example: nameof X + /// Where X is a module name + | SingleIdent of potentialModuleName: Ident + /// Example: nameof X.Y.Z + /// Where Z is either a module name or something from inside module or namespace Y. + /// Both options need to be explored. + | LongIdent of longIdent: LongIdent + +let visitNameofResult (nameofResult: NameofResult) : FileContentEntry = + match nameofResult with + | NameofResult.SingleIdent moduleName -> visitIdentAsPotentialModuleName moduleName + | NameofResult.LongIdent longIdent -> + // In this case the last part of the LongIdent could be a module name. + // So we should not cut off the last part. + FileContentEntry.PrefixedIdentifier(longIdentToPath false longIdent) + +/// Special case of `nameof Module` type of expression +[] +let (|NameofExpr|_|) (e: SynExpr) : NameofResult voption = + let rec stripParen (e: SynExpr) = + match e with + | SynExpr.Paren(expr = expr) -> stripParen expr + | _ -> e + + match e with + | SynExpr.App(flag = ExprAtomicFlag.NonAtomic; isInfix = false; funcExpr = SynExpr.Ident NameofIdent; argExpr = moduleNameExpr) -> + match stripParen moduleNameExpr with + | SynExpr.Ident moduleNameIdent -> ValueSome(NameofResult.SingleIdent moduleNameIdent) + | SynExpr.LongIdent(longDotId = longIdent) -> + match longIdent.LongIdent with + | [] -> ValueNone + // This is highly unlikely to be produced by the parser + | [ moduleNameIdent ] -> ValueSome(NameofResult.SingleIdent moduleNameIdent) + | lid -> ValueSome(NameofResult.LongIdent(lid)) + | _ -> ValueNone + | _ -> ValueNone + let visitSynExpr (e: SynExpr) : FileContentEntry list = let rec visit (e: SynExpr) (continuation: FileContentEntry list -> FileContentEntry list) : FileContentEntry list = match e with + | NameofExpr nameofResult -> continuation [ visitNameofResult nameofResult ] | SynExpr.Const _ -> continuation [] | SynExpr.Paren(expr = expr) -> visit expr continuation | SynExpr.Quote(operator = operator; quotedExpr = quotedExpr) -> @@ -389,7 +449,7 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list = | SynExpr.IfThenElse(ifExpr = ifExpr; thenExpr = thenExpr; elseExpr = elseExpr) -> let continuations = List.map visit (ifExpr :: thenExpr :: Option.toList elseExpr) Continuation.concatenate continuations continuation - | SynExpr.Typar _ -> continuation [] + | SynExpr.Typar _ | SynExpr.Ident _ -> continuation [] | SynExpr.LongIdent(longDotId = longDotId) -> continuation (visitSynLongIdent longDotId) | SynExpr.LongIdentSet(longDotId, expr, _) -> visit expr (fun nodes -> visitSynLongIdent longDotId @ nodes |> continuation) @@ -464,7 +524,7 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list = visit expr (fun exprNodes -> [ yield! exprNodes; yield! List.collect visitSynMatchClause clauses ] |> continuation) - | SynExpr.DoBang(expr, _) -> visit expr continuation + | SynExpr.DoBang(expr = expr) -> visit expr continuation | SynExpr.WhileBang(whileExpr = whileExpr; doExpr = doExpr) -> visit whileExpr (fun whileNodes -> visit doExpr (fun doNodes -> whileNodes @ doNodes |> continuation)) | SynExpr.LibraryOnlyILAssembly(typeArgs = typeArgs; args = args; retTy = retTy) -> @@ -517,11 +577,36 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list = visit e id +/// Special case of `| nameof Module ->` type of pattern +[] +let (|NameofPat|_|) (pat: SynPat) = + let rec stripPats p = + match p with + | SynPat.Paren(pat = pat) -> stripPats pat + | _ -> p + + match pat with + | SynPat.LongIdent(longDotId = SynLongIdent(id = [ NameofIdent ]); typarDecls = None; argPats = SynArgPats.Pats [ moduleNamePat ]) -> + match stripPats moduleNamePat with + | SynPat.LongIdent( + longDotId = SynLongIdent.SynLongIdent(id = longIdent) + extraId = None + typarDecls = None + argPats = SynArgPats.Pats [] + accessibility = None) -> + match longIdent with + | [] -> ValueNone + | [ moduleNameIdent ] -> ValueSome(NameofResult.SingleIdent moduleNameIdent) + | lid -> ValueSome(NameofResult.LongIdent lid) + | _ -> ValueNone + | _ -> ValueNone + let visitPat (p: SynPat) : FileContentEntry list = let rec visit (p: SynPat) (continuation: FileContentEntry list -> FileContentEntry list) : FileContentEntry list = match p with + | NameofPat moduleNameIdent -> continuation [ visitNameofResult moduleNameIdent ] | SynPat.Paren(pat = pat) -> visit pat continuation - | SynPat.Typed(pat = pat; targetType = t) -> visit pat (fun nodes -> nodes @ visitSynType t) + | SynPat.Typed(pat = pat; targetType = t) -> visit pat (fun nodes -> nodes @ visitSynType t |> continuation) | SynPat.Const _ -> continuation [] | SynPat.Wild _ -> continuation [] | SynPat.Named _ -> continuation [] diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fs b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fs index 075859e6c4..96c76ae3ec 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fs +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fs @@ -27,32 +27,49 @@ module internal Graph = |> Array.map (fun (KeyValue(k, v)) -> k, v) |> readOnlyDict - let transitive<'Node when 'Node: equality> (graph: Graph<'Node>) : Graph<'Node> = - /// Find transitive dependencies of a single node. - let transitiveDeps (node: 'Node) = - let visited = HashSet<'Node>() + let nodes (graph: Graph<'Node>) : Set<'Node> = + graph.Values |> Seq.collect id |> Seq.append graph.Keys |> Set + + /// Find transitive dependencies of a single node. + let transitiveDeps (node: 'Node) (graph: Graph<'Node>) = + let visited = HashSet<'Node>() - let rec dfs (node: 'Node) = - graph[node] - // Add direct dependencies. - // Use HashSet.Add return value semantics to filter out those that were added previously. - |> Array.filter visited.Add - |> Array.iter dfs + let rec dfs (node: 'Node) = + graph[node] + // Add direct dependencies. + // Use HashSet.Add return value semantics to filter out those that were added previously. + |> Array.filter visited.Add + |> Array.iter dfs - dfs node - visited |> Seq.toArray + dfs node + visited |> Seq.toArray + let transitive<'Node when 'Node: equality> (graph: Graph<'Node>) : Graph<'Node> = graph.Keys |> Seq.toArray - |> Array.Parallel.map (fun node -> node, transitiveDeps node) + |> Array.Parallel.map (fun node -> node, graph |> transitiveDeps node) |> readOnlyDict + // TODO: optimize + /// Get subgraph of the given graph that contains only nodes that are reachable from the given node. + let subGraphFor node graph = + let allDeps = graph |> transitiveDeps node + let relevant n = n = node || allDeps |> Array.contains n + + graph + |> Seq.choose (fun (KeyValue(src, deps)) -> + if relevant src then + Some(src, deps |> Array.filter relevant) + else + None) + |> make + /// Create a reverse of the graph let reverse (originalGraph: Graph<'Node>) : Graph<'Node> = originalGraph // Collect all edges |> Seq.collect (fun (KeyValue(idx, deps)) -> deps |> Array.map (fun dep -> idx, dep)) - // Group dependants of the same dependencies together + // Group dependents of the same dependencies together |> Seq.groupBy snd // Construct reversed graph |> Seq.map (fun (dep, edges) -> dep, edges |> Seq.map fst |> Seq.toArray) @@ -66,10 +83,10 @@ module internal Graph = graph |> Seq.iter (fun (KeyValue(file, deps)) -> printfn $"{file} -> {deps |> Array.map nodePrinter |> join}") - let print (graph: Graph<'Node>) : unit = - printCustom graph (fun node -> node.ToString()) + let print (graph: Graph<'Node> when 'Node: not null) : unit = + printCustom graph (fun node -> node.ToString() |> string) - let serialiseToMermaid path (graph: Graph) = + let serialiseToMermaid (graph: Graph) = let sb = StringBuilder() let appendLine (line: string) = sb.AppendLine(line) |> ignore @@ -84,12 +101,14 @@ module internal Graph = appendLine $" %i{idx} --> %i{depIdx}" appendLine "```" + sb.ToString() + let writeMermaidToFile path (graph: Graph) = #if FABLE_COMPILER ignore (path: string) #else use out = FileSystem.OpenFileForWriteShim(path, fileMode = System.IO.FileMode.Create) - out.WriteAllText(sb.ToString()) + graph |> serialiseToMermaid |> out.WriteAllText #endif //!FABLE_COMPILER diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fsi b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fsi index 95542470d8..2caf421dc5 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fsi +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Graph.fsi @@ -10,12 +10,18 @@ module internal Graph = /// Build the graph. val make: nodeDeps: seq<'Node * 'Node array> -> Graph<'Node> when 'Node: equality val map<'T, 'U when 'U: equality> : f: ('T -> 'U) -> graph: Graph<'T> -> Graph<'U> + /// Get all nodes of the graph. + val nodes: graph: Graph<'Node> -> Set<'Node> /// Create a transitive closure of the graph in O(n^2) time (but parallelize it). /// The resulting graph contains edge A -> C iff the input graph contains a (directed) non-zero length path from A to C. val transitive<'Node when 'Node: equality> : graph: Graph<'Node> -> Graph<'Node> + /// Get a sub-graph of the graph containing only the nodes reachable from the given node. + val subGraphFor: node: 'Node -> graph: Graph<'Node> -> Graph<'Node> when 'Node: equality /// Create a reverse of the graph. val reverse<'Node when 'Node: equality> : originalGraph: Graph<'Node> -> Graph<'Node> /// Print the contents of the graph to the standard output. - val print: graph: Graph<'Node> -> unit + val print: graph: Graph<'Node> -> unit when 'Node: not null + /// Create a simple Mermaid graph + val serialiseToMermaid: graph: Graph -> string /// Create a simple Mermaid graph and save it under the path specified. - val serialiseToMermaid: path: string -> graph: Graph -> unit + val writeMermaidToFile: path: string -> graph: Graph -> unit diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fs b/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fs index 7d92fc41a5..1ecf477f04 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fs +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fs @@ -1,6 +1,9 @@ module internal FSharp.Compiler.GraphChecking.GraphProcessing open System.Threading +open FSharp.Compiler.GraphChecking +open System.Threading.Tasks +open System /// Information about the node in a graph, describing its relation with other nodes. type NodeInfo<'Item> = @@ -8,7 +11,7 @@ type NodeInfo<'Item> = Item: 'Item Deps: 'Item[] TransitiveDeps: 'Item[] - Dependants: 'Item[] + Dependents: 'Item[] } type IncrementableInt(value: int) = @@ -32,13 +35,16 @@ type ProcessedNode<'Item, 'Result> = Result: 'Result } +type GraphProcessingException(msg, ex: System.Exception) = + inherit exn(msg, ex) + let processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> (graph: Graph<'Item>) (work: ('Item -> ProcessedNode<'Item, 'Result>) -> NodeInfo<'Item> -> 'Result) (parentCt: CancellationToken) : ('Item * 'Result)[] = let transitiveDeps = graph |> Graph.transitive - let dependants = graph |> Graph.reverse + let dependents = graph |> Graph.reverse // Cancellation source used to signal either an exception in one of the items or end of processing. use localCts = new CancellationTokenSource() #if !FABLE_COMPILER @@ -52,7 +58,7 @@ let processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> if not exists || not (transitiveDeps.ContainsKey item) - || not (dependants.ContainsKey item) + || not (dependents.ContainsKey item) then printfn $"Unexpected inconsistent state of the graph for item '{item}'" @@ -60,7 +66,7 @@ let processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> Item = item Deps = graph[item] TransitiveDeps = transitiveDeps[item] - Dependants = dependants[item] + Dependents = dependents[item] } { @@ -136,17 +142,17 @@ let processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> let singleRes = work getItemPublicNode info node.Result <- Some singleRes - let unblockedDependants = - node.Info.Dependants + let unblockedDependents = + node.Info.Dependents |> lookupMany - // For every dependant, increment its number of processed dependencies, - // and filter dependants which now have all dependencies processed (but didn't before). - |> Array.filter (fun dependant -> - let pdc = dependant.ProcessedDepsCount.Increment() - // Note: We cannot read 'dependant.ProcessedDepsCount' again to avoid returning the same item multiple times. - pdc = dependant.Info.Deps.Length) - - unblockedDependants |> Array.iter queueNode + // For every dependent, increment its number of processed dependencies, + // and filter dependents which now have all dependencies processed (but didn't before). + |> Array.filter (fun dependent -> + let pdc = dependent.ProcessedDepsCount.Increment() + // Note: We cannot read 'dependent.ProcessedDepsCount' again to avoid returning the same item multiple times. + pdc = dependent.Info.Deps.Length) + + unblockedDependents |> Array.iter queueNode incrementProcessedNodesCount () leaves |> Array.iter queueNode @@ -161,7 +167,7 @@ let processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> // If we stopped early due to an exception, reraise it. match getExn () with | None -> () - | Some(item, ex) -> raise (System.Exception($"Encountered exception when processing item '{item}'", ex)) + | Some(item, ex) -> raise (GraphProcessingException($"Encountered exception when processing item '{item}'", ex)) // All calculations succeeded - extract the results and sort in input order. nodes.Values @@ -173,3 +179,136 @@ let processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> node.Info.Item, result) |> Seq.sortBy fst |> Seq.toArray + +let processGraphAsync<'Item, 'Result when 'Item: equality and 'Item: comparison> + (graph: Graph<'Item>) + (work: ('Item -> ProcessedNode<'Item, 'Result>) -> NodeInfo<'Item> -> Async<'Result>) + : Async<('Item * 'Result)[]> = + async { + let transitiveDeps = graph |> Graph.transitive + let dependents = graph |> Graph.reverse + // Cancellation source used to signal either an exception in one of the items or end of processing. + let! parentCt = Async.CancellationToken + use localCts = new CancellationTokenSource() + + let completionSignal = TaskCompletionSource() + + use _ = parentCt.Register(fun () -> completionSignal.TrySetCanceled() |> ignore) + + use cts = CancellationTokenSource.CreateLinkedTokenSource(parentCt, localCts.Token) + + let makeNode (item: 'Item) : GraphNode<'Item, 'Result> = + let info = + let exists = graph.ContainsKey item + + if + not exists + || not (transitiveDeps.ContainsKey item) + || not (dependents.ContainsKey item) + then + printfn $"Unexpected inconsistent state of the graph for item '{item}'" + + { + Item = item + Deps = graph[item] + TransitiveDeps = transitiveDeps[item] + Dependents = dependents[item] + } + + { + Info = info + Result = None + ProcessedDepsCount = IncrementableInt(0) + } + + let nodes = graph.Keys |> Seq.map (fun item -> item, makeNode item) |> readOnlyDict + + let lookupMany items = + items |> Array.map (fun item -> nodes[item]) + + let leaves = + nodes.Values |> Seq.filter (fun n -> n.Info.Deps.Length = 0) |> Seq.toArray + + let getItemPublicNode item = + let node = nodes[item] + + { + ProcessedNode.Info = node.Info + ProcessedNode.Result = + node.Result + |> Option.defaultWith (fun () -> failwith $"Results for item '{node.Info.Item}' are not yet available") + } + + let processedCount = IncrementableInt(0) + + let handleExn (item, ex: exn) = + try + localCts.Cancel() + with :? ObjectDisposedException -> + // If it's disposed already, it means that the processing has already finished, most likely due to cancellation or failure in another node. + () + + match ex with + | :? OperationCanceledException -> completionSignal.TrySetCanceled() + | _ -> + completionSignal.TrySetException( + GraphProcessingException($"[*] Encountered exception when processing item '{item}': {ex.Message}", ex) + ) + |> ignore + + let incrementProcessedNodesCount () = + if processedCount.Increment() = nodes.Count then + completionSignal.TrySetResult() |> ignore + + let rec queueNode node = + Async.Start( + async { + use! _catch = Async.OnCancel(completionSignal.TrySetCanceled >> ignore) + let! res = processNode node |> Async.Catch + + match res with + | Choice1Of2() -> () + | Choice2Of2 ex -> handleExn (node.Info.Item, ex) + }, + cts.Token + ) + + and processNode (node: GraphNode<'Item, 'Result>) : Async = + async { + + let info = node.Info + + let! singleRes = work getItemPublicNode info + node.Result <- Some singleRes + + let unblockedDependents = + node.Info.Dependents + |> lookupMany + // For every dependent, increment its number of processed dependencies, + // and filter dependents which now have all dependencies processed (but didn't before). + |> Array.filter (fun dependent -> + let pdc = dependent.ProcessedDepsCount.Increment() + // Note: We cannot read 'dependent.ProcessedDepsCount' again to avoid returning the same item multiple times. + pdc = dependent.Info.Deps.Length) + + unblockedDependents |> Array.iter queueNode + incrementProcessedNodesCount () + } + + leaves |> Array.iter queueNode + + // Wait for end of processing, an exception, or an external cancellation request. + do! completionSignal.Task |> Async.AwaitTask + + // All calculations succeeded - extract the results and sort in input order. + return + nodes.Values + |> Seq.map (fun node -> + let result = + node.Result + |> Option.defaultWith (fun () -> failwith $"Unexpected lack of result for item '{node.Info.Item}'") + + node.Info.Item, result) + |> Seq.sortBy fst + |> Seq.toArray + } diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fsi b/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fsi index cb9a95a59f..7a8c9f9885 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fsi +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/GraphProcessing.fsi @@ -8,16 +8,20 @@ type NodeInfo<'Item> = { Item: 'Item Deps: 'Item[] TransitiveDeps: 'Item[] - Dependants: 'Item[] } + Dependents: 'Item[] } /// An already processed node in the graph, with its result available type ProcessedNode<'Item, 'Result> = { Info: NodeInfo<'Item> Result: 'Result } +type GraphProcessingException = + inherit exn + new: msg: string * ex: System.Exception -> GraphProcessingException + /// /// A generic method to generate results for a graph of work items in parallel. -/// Processes leaves first, and after each node has been processed, schedules any now unblocked dependants. +/// Processes leaves first, and after each node has been processed, schedules any now unblocked dependents. /// Returns a list of results, one per item. /// Uses the Thread Pool to schedule work. /// @@ -33,3 +37,8 @@ val processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> : work: (('Item -> ProcessedNode<'Item, 'Result>) -> NodeInfo<'Item> -> 'Result) -> parentCt: CancellationToken -> ('Item * 'Result)[] + +val processGraphAsync<'Item, 'Result when 'Item: equality and 'Item: comparison> : + graph: Graph<'Item> -> + work: (('Item -> ProcessedNode<'Item, 'Result>) -> NodeInfo<'Item> -> Async<'Result>) -> + Async<('Item * 'Result)[]> diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/TrieMapping.fs b/src/fcs-fable/src/Compiler/Driver/GraphChecking/TrieMapping.fs index a1ab4fadfc..268d985847 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/TrieMapping.fs +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/TrieMapping.fs @@ -12,7 +12,7 @@ module private ImmutableHashSet = let singleton (value: 'T) = ImmutableHashSet.Create<'T>(Array.singleton value) - /// Create new new HashSet<'T> with zero elements. + /// Create a new HashSet<'T> with zero elements. let empty () = ImmutableHashSet.Empty let autoOpenShapes = @@ -123,7 +123,7 @@ let processSynModuleOrNamespace<'Decl> // Only the last node can be a module, depending on the SynModuleOrNamespaceKind. let rec visit continuation (xs: LongIdent) = match xs with - | [] -> failwith "should not be empty" + | [] -> ImmutableDictionary.Empty |> continuation | [ finalPart ] -> let name = finalPart.idText @@ -215,7 +215,8 @@ let rec mkTrieNodeFor (file: FileInProject) : FileIndex * TrieNode = let hasTypesOrAutoOpenNestedModules = decls |> List.exists (function - | SynModuleSigDecl.Types _ -> true + | SynModuleSigDecl.Types _ + | SynModuleSigDecl.Exception _ -> true | SynModuleSigDecl.NestedModule(moduleInfo = SynComponentInfo(attributes = attributes)) -> isAnyAttributeAutoOpen attributes | _ -> false) @@ -230,7 +231,8 @@ let rec mkTrieNodeFor (file: FileInProject) : FileIndex * TrieNode = let hasTypesOrAutoOpenNestedModules = List.exists (function - | SynModuleDecl.Types _ -> true + | SynModuleDecl.Types _ + | SynModuleDecl.Exception _ -> true | SynModuleDecl.NestedModule(moduleInfo = SynComponentInfo(attributes = attributes)) -> isAnyAttributeAutoOpen attributes | _ -> false) diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fs b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fs index 00538b6e59..7443df5820 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fs +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fs @@ -61,6 +61,7 @@ type internal TrieNode = /// A significant construct found in the syntax tree of a file. /// This construct needs to be processed in order to deduce potential links to other files in the project. +[] type internal FileContentEntry = /// Any toplevel namespace a file might have. /// In case a file has `module X.Y.Z`, then `X.Y` is considered to be the toplevel namespace @@ -73,6 +74,9 @@ type internal FileContentEntry = /// Being explicit about nested modules allows for easier reasoning what namespaces (paths) are open. /// We can scope an `OpenStatement` to the everything that is happening inside the nested module. | NestedModule of name: string * nestedContent: FileContentEntry list + /// A single identifier that could be the name of a module. + /// Example use-case: `let x = nameof Foo` where `Foo` is a module. + | ModuleName of name: Identifier type internal FileContent = { diff --git a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fsi b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fsi index 468ef65889..5f075a1bad 100644 --- a/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fsi +++ b/src/fcs-fable/src/Compiler/Driver/GraphChecking/Types.fsi @@ -55,6 +55,7 @@ type internal TrieNode = /// A significant construct found in the syntax tree of a file. /// This construct needs to be processed in order to deduce potential links to other files in the project. +[] type internal FileContentEntry = /// Any toplevel namespace a file might have. /// In case a file has `module X.Y.Z`, then `X.Y` is considered to be the toplevel namespace @@ -67,6 +68,9 @@ type internal FileContentEntry = /// Being explicit about nested modules allows for easier reasoning what namespaces (paths) are open. /// For example we can limit the scope of an `OpenStatement` to symbols defined inside the nested module. | NestedModule of name: string * nestedContent: FileContentEntry list + /// A single identifier that could be the name of a module. + /// Example use-case: `let x = nameof Foo` where `Foo` is a module. + | ModuleName of name: Identifier /// File identifiers and its content extract for dependency resolution type internal FileContent = diff --git a/src/fcs-fable/src/Compiler/Driver/OptimizeInputs.fs b/src/fcs-fable/src/Compiler/Driver/OptimizeInputs.fs index 6055bd44d0..2d9fbbb106 100644 --- a/src/fcs-fable/src/Compiler/Driver/OptimizeInputs.fs +++ b/src/fcs-fable/src/Compiler/Driver/OptimizeInputs.fs @@ -401,7 +401,6 @@ let ApplyAllOptimizations importMap, prevFile.FirstLoopRes.OptEnv, isIncrementalFragment, - tcConfig.fsiMultiAssemblyEmit, tcConfig.emitTailcalls, prevFile.FirstLoopRes.HidingInfo, file @@ -448,7 +447,6 @@ let ApplyAllOptimizations importMap, prevFile.OptEnvExtraLoop, isIncrementalFragment, - tcConfig.fsiMultiAssemblyEmit, tcConfig.emitTailcalls, prevPhase.FirstLoopRes.HidingInfo, file @@ -519,7 +517,6 @@ let ApplyAllOptimizations importMap, prevFile.OptEnvFinalSimplify, isIncrementalFragment, - tcConfig.fsiMultiAssemblyEmit, tcConfig.emitTailcalls, prevPhase.FirstLoopRes.HidingInfo, file diff --git a/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fs b/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fs index 23a6e0da30..0116972829 100644 --- a/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fs +++ b/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fs @@ -27,6 +27,7 @@ open FSharp.Compiler.Diagnostics open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Features open FSharp.Compiler.IO +open FSharp.Compiler.LexerStore open FSharp.Compiler.Lexhelp open FSharp.Compiler.NameResolution open FSharp.Compiler.ParseHelpers @@ -216,15 +217,22 @@ let PostParseModuleSpec (_i, defaultNamespace, isLastCompiland, fileName, intf) SynModuleOrNamespaceSig(lid, isRecursive, kind, decls, xmlDoc, attributes, None, range, trivia) -let GetScopedPragmasForHashDirective hd = +let GetScopedPragmasForHashDirective hd (langVersion: LanguageVersion) = [ match hd with - | ParsedHashDirective("nowarn", numbers, m) -> - for s in numbers do - match s with - | ParsedHashDirectiveArgument.SourceIdentifier _ -> () - | ParsedHashDirectiveArgument.String(s, _, _) -> - match GetWarningNumber(m, s) with + | ParsedHashDirective("nowarn", args, _) -> + for arg in args do + let rangeAndDescription = + match arg with + | ParsedHashDirectiveArgument.Int32(n, m) -> Some(m, WarningDescription.Int32 n) + | ParsedHashDirectiveArgument.Ident(ident, m) -> Some(m, WarningDescription.Ident ident) + | ParsedHashDirectiveArgument.String(s, _, m) -> Some(m, WarningDescription.String s) + | _ -> None + + match rangeAndDescription with + | None -> () + | Some(m, description) -> + match GetWarningNumber(m, description, langVersion, WarningNumberSource.CompilerDirective) with | None -> () | Some n -> ScopedPragma.WarningOff(m, n) | _ -> () @@ -232,7 +240,7 @@ let GetScopedPragmasForHashDirective hd = let private collectCodeComments (lexbuf: UnicodeLexing.Lexbuf) (tripleSlashComments: range list) = [ - yield! LexbufCommentStore.GetComments(lexbuf) + yield! CommentStore.GetComments(lexbuf) yield! (List.map CommentTrivia.LineComment tripleSlashComments) ] |> List.sortBy (function @@ -272,13 +280,13 @@ let PostParseModuleImpls for SynModuleOrNamespace(decls = decls) in impls do for d in decls do match d with - | SynModuleDecl.HashDirective(hd, _) -> yield! GetScopedPragmasForHashDirective hd + | SynModuleDecl.HashDirective(hd, _) -> yield! GetScopedPragmasForHashDirective hd lexbuf.LanguageVersion | _ -> () for hd in hashDirectives do - yield! GetScopedPragmasForHashDirective hd + yield! GetScopedPragmasForHashDirective hd lexbuf.LanguageVersion ] - let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf) + let conditionalDirectives = IfdefStore.GetTrivia(lexbuf) let codeComments = collectCodeComments lexbuf tripleSlashComments let trivia: ParsedImplFileInputTrivia = @@ -323,13 +331,13 @@ let PostParseModuleSpecs for SynModuleOrNamespaceSig(decls = decls) in specs do for d in decls do match d with - | SynModuleSigDecl.HashDirective(hd, _) -> yield! GetScopedPragmasForHashDirective hd + | SynModuleSigDecl.HashDirective(hd, _) -> yield! GetScopedPragmasForHashDirective hd lexbuf.LanguageVersion | _ -> () for hd in hashDirectives do - yield! GetScopedPragmasForHashDirective hd + yield! GetScopedPragmasForHashDirective hd lexbuf.LanguageVersion ] - let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf) + let conditionalDirectives = IfdefStore.GetTrivia(lexbuf) let codeComments = collectCodeComments lexbuf tripleSlashComments let trivia: ParsedSigFileInputTrivia = @@ -343,8 +351,8 @@ let PostParseModuleSpecs type ModuleNamesDict = Map> /// Checks if a module name is already given and deduplicates the name if needed. -let DeduplicateModuleName (moduleNamesDict: ModuleNamesDict) fileName (qualNameOfFile: QualifiedNameOfFile) = - let path = Path.GetDirectoryName fileName +let DeduplicateModuleName (moduleNamesDict: ModuleNamesDict) (fileName: string) (qualNameOfFile: QualifiedNameOfFile) = + let path = !! Path.GetDirectoryName(fileName) let path = if FileSystem.IsPathRootedShim path then @@ -425,7 +433,7 @@ let ParseInput "ParseAndCheckFile.parseFile" [| Activity.Tags.fileName, fileName - Activity.Tags.buildPhase, BuildPhase.Parse.ToString() + Activity.Tags.buildPhase, !! BuildPhase.Parse.ToString() Activity.Tags.userOpName, userOpName |> Option.defaultValue "" |] @@ -481,15 +489,13 @@ let ParseInput if FSharpImplFileSuffixes |> List.exists (FileSystemUtils.checkSuffix fileName) then let impl = Parser.implementationFile lexer lexbuf - let tripleSlashComments = - LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf) + let tripleSlashComments = XmlDocStore.ReportInvalidXmlDocPositions(lexbuf) PostParseModuleImpls(defaultNamespace, fileName, isLastCompiland, impl, lexbuf, tripleSlashComments, Set identStore) elif FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix fileName) then let intfs = Parser.signatureFile lexer lexbuf - let tripleSlashComments = - LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf) + let tripleSlashComments = XmlDocStore.ReportInvalidXmlDocPositions(lexbuf) PostParseModuleSpecs(defaultNamespace, fileName, isLastCompiland, intfs, lexbuf, tripleSlashComments, Set identStore) else if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then @@ -800,7 +806,7 @@ let ParseOneInputFile (tcConfig: TcConfig, lexResourceManager, fileName, isLastC /// NOTE: Max errors is currently counted separately for each logger. When max errors is reached on one compilation /// the given Exiter will be called. /// -/// NOTE: this needs to be improved to commit diagnotics as soon as possible +/// NOTE: this needs to be improved to commit diagnostics as soon as possible /// /// NOTE: If StopProcessing is raised by any piece of work then the overall function raises StopProcessing. let UseMultipleDiagnosticLoggers (inputs, diagnosticsLogger, eagerFormat) f = @@ -852,7 +858,7 @@ let ParseInputFilesSequential (tcConfig: TcConfig, lexResourceManager, sourceFil /// Parse multiple input files from disk let ParseInputFiles (tcConfig: TcConfig, lexResourceManager, sourceFiles, diagnosticsLogger: DiagnosticsLogger, retryLocked) = try - if tcConfig.concurrentBuild then + if tcConfig.parallelParsing then ParseInputFilesInParallel(tcConfig, lexResourceManager, sourceFiles, diagnosticsLogger, retryLocked) else ParseInputFilesSequential(tcConfig, lexResourceManager, sourceFiles, diagnosticsLogger, retryLocked) @@ -881,7 +887,7 @@ let ProcessMetaCommandsFromInput match args with | [ path ] -> - let p = if String.IsNullOrWhiteSpace(path) then "" else path + let p = if String.IsNullOrWhiteSpace(path) then "" else !!path hashReferenceF state (m, p, directive) @@ -894,55 +900,91 @@ let ProcessMetaCommandsFromInput try match hash with - | ParsedHashDirective("I", ParsedHashDirectiveArguments args, m) -> + | ParsedHashDirective("I", [ path ], m) -> if not canHaveScriptMetaCommands then errorR (HashIncludeNotAllowedInNonScript m) + else + let arguments = parsedHashDirectiveStringArguments [ path ] tcConfig.langVersion - match args with - | [ path ] -> - matchedm <- m - tcConfig.AddIncludePath(m, path, pathOfMetaCommandSource) - state - | _ -> - errorR (Error(FSComp.SR.buildInvalidHashIDirective (), m)) - state - | ParsedHashDirective("nowarn", ParsedHashDirectiveArguments numbers, m) -> - List.fold (fun state d -> nowarnF state (m, d)) state numbers + match arguments with + | [ path ] -> + matchedm <- m + tcConfig.AddIncludePath(m, path, pathOfMetaCommandSource) + | _ -> errorR (Error(FSComp.SR.buildInvalidHashIDirective (), m)) + + state - | ParsedHashDirective(("reference" | "r"), ParsedHashDirectiveArguments args, m) -> - matchedm <- m - ProcessDependencyManagerDirective Directive.Resolution args m state + | ParsedHashDirective("nowarn", hashArguments, m) -> + let arguments = parsedHashDirectiveArgumentsNoCheck hashArguments + + List.fold (fun state d -> nowarnF state (m, d)) state arguments + + | ParsedHashDirective(("reference" | "r") as c, [], m) -> + if not canHaveScriptMetaCommands then + errorR (HashDirectiveNotAllowedInNonScript m) + else + let arg = (parsedHashDirectiveArguments [] tcConfig.langVersion) + warning (Error((FSComp.SR.fsiInvalidDirective (c, String.concat " " arg)), m)) - | ParsedHashDirective("i", ParsedHashDirectiveArguments args, m) -> - matchedm <- m - ProcessDependencyManagerDirective Directive.Include args m state + state - | ParsedHashDirective("load", ParsedHashDirectiveArguments args, m) -> + | ParsedHashDirective(("reference" | "r"), [ reference ], m) -> if not canHaveScriptMetaCommands then errorR (HashDirectiveNotAllowedInNonScript m) + state + else + let arguments = + parsedHashDirectiveStringArguments [ reference ] tcConfig.langVersion - match args with - | _ :: _ -> + match arguments with + | [ reference ] -> + matchedm <- m + ProcessDependencyManagerDirective Directive.Resolution [ reference ] m state + | _ -> state + + | ParsedHashDirective("i", [ path ], m) -> + if not canHaveScriptMetaCommands then + errorR (HashDirectiveNotAllowedInNonScript m) + state + else matchedm <- m - args |> List.iter (fun path -> loadSourceF state (m, path)) - | _ -> errorR (Error(FSComp.SR.buildInvalidHashloadDirective (), m)) + let arguments = parsedHashDirectiveStringArguments [ path ] tcConfig.langVersion + + match arguments with + | [ path ] -> ProcessDependencyManagerDirective Directive.Include [ path ] m state + | _ -> state + + | ParsedHashDirective("load", paths, m) -> + if not canHaveScriptMetaCommands then + errorR (HashDirectiveNotAllowedInNonScript m) + else + let arguments = parsedHashDirectiveArguments paths tcConfig.langVersion + + match arguments with + | _ :: _ -> + matchedm <- m + arguments |> List.iter (fun path -> loadSourceF state (m, path)) + | _ -> errorR (Error(FSComp.SR.buildInvalidHashloadDirective (), m)) state - | ParsedHashDirective("time", ParsedHashDirectiveArguments args, m) -> + + | ParsedHashDirective("time", switch, m) -> if not canHaveScriptMetaCommands then errorR (HashDirectiveNotAllowedInNonScript m) + else + let arguments = parsedHashDirectiveArguments switch tcConfig.langVersion - match args with - | [] -> () - | [ "on" | "off" ] -> () - | _ -> errorR (Error(FSComp.SR.buildInvalidHashtimeDirective (), m)) + match arguments with + | [] -> matchedm <- m + | [ "on" | "off" ] -> matchedm <- m + | _ -> errorR (Error(FSComp.SR.buildInvalidHashtimeDirective (), m)) state | _ -> - (* warning(Error("This meta-command has been ignored", m)) *) state + with RecoverableException e -> errorRecovery e matchedm state @@ -1407,15 +1449,17 @@ let DiagnosticsLoggerForInput (tcConfig: TcConfig, input: ParsedInput, oldLogger /// Typecheck a single file (or interactive entry into F# Interactive) let CheckOneInputEntry (ctok, checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt) tcState input = - // Equip loggers to locally filter w.r.t. scope pragmas in each input - use _ = - UseTransformedDiagnosticsLogger(fun oldLogger -> DiagnosticsLoggerForInput(tcConfig, input, oldLogger)) + cancellable { + // Equip loggers to locally filter w.r.t. scope pragmas in each input + use _ = + UseTransformedDiagnosticsLogger(fun oldLogger -> DiagnosticsLoggerForInput(tcConfig, input, oldLogger)) - use _ = UseBuildPhase BuildPhase.TypeCheck + use _ = UseBuildPhase BuildPhase.TypeCheck - RequireCompilationThread ctok + RequireCompilationThread ctok - CheckOneInput(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, TcResultsSink.NoSink, tcState, input) + return! CheckOneInput(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, TcResultsSink.NoSink, tcState, input) + } |> Cancellable.runWithoutCancellation /// Finish checking multiple files (or one interactive entry into F# Interactive) @@ -1488,7 +1532,7 @@ type NodeToTypeCheck = /// This can be either an implementation or a signature file. | PhysicalFile of fileIndex: FileIndex /// An artificial node that will add the earlier processed signature information to the TcEnvFromImpls. - /// Dependants on this type of node will perceive that a file is known in both TcEnvFromSignatures and TcEnvFromImpls. + /// Dependents on this type of node will perceive that a file is known in both TcEnvFromSignatures and TcEnvFromImpls. /// Even though the actual implementation file was not type-checked. | ArtificialImplFile of signatureFileIndex: FileIndex @@ -1503,7 +1547,7 @@ let CheckOneInputWithCallback prefixPathOpt, tcSink, tcState: TcState, - inp: ParsedInput, + input: ParsedInput, _skipImplIfSigExists: bool): (unit -> bool) * TcConfig * TcImports * TcGlobals * LongIdent option * TcResultsSink * TcState * ParsedInput * bool) : Cancellable> = @@ -1511,7 +1555,7 @@ let CheckOneInputWithCallback try CheckSimulateException tcConfig - let m = inp.Range + let m = input.Range let amap = tcImports.GetImportMap() let conditionalDefines = @@ -1520,7 +1564,7 @@ let CheckOneInputWithCallback else Some tcConfig.conditionalDefines - match inp with + match input with | ParsedInput.SigFile file -> let qualNameOfFile = file.QualifiedName @@ -1760,6 +1804,43 @@ module private TypeCheckingGraphProcessing = finalFileResults, state +let TransformDependencyGraph (graph: Graph, filePairs: FilePairMap) = + let mkArtificialImplFile n = NodeToTypeCheck.ArtificialImplFile n + let mkPhysicalFile n = NodeToTypeCheck.PhysicalFile n + + /// Map any signature dependencies to the ArtificialImplFile counterparts, + /// unless the signature dependency is the backing file of the current (implementation) file. + let mapDependencies idx deps = + Array.map + (fun dep -> + if filePairs.IsSignature dep then + let implIdx = filePairs.GetImplementationIndex dep + + if implIdx = idx then + // This is the matching signature for the implementation. + // Retain the direct dependency onto the signature file. + mkPhysicalFile dep + else + mkArtificialImplFile dep + else + mkPhysicalFile dep) + deps + + // Transform the graph to include ArtificialImplFile nodes when necessary. + graph + |> Seq.collect (fun (KeyValue(fileIdx, deps)) -> + if filePairs.IsSignature fileIdx then + // Add an additional ArtificialImplFile node for the signature file. + [| + // Mark the current file as physical and map the dependencies. + mkPhysicalFile fileIdx, mapDependencies fileIdx deps + // Introduce a new node that depends on the signature. + mkArtificialImplFile fileIdx, [| mkPhysicalFile fileIdx |] + |] + else + [| mkPhysicalFile fileIdx, mapDependencies fileIdx deps |]) + |> Graph.make + /// Constructs a file dependency graph and type-checks the files in parallel where possible. let CheckMultipleInputsUsingGraphMode ((ctok, checkForErrors, tcConfig: TcConfig, tcImports: TcImports, tcGlobals, prefixPathOpt, tcState, eagerFormat, inputs): @@ -1788,42 +1869,7 @@ let CheckMultipleInputsUsingGraphMode let filePairs = FilePairMap(sourceFiles) let graph, trie = DependencyResolution.mkGraph filePairs sourceFiles - let nodeGraph = - let mkArtificialImplFile n = NodeToTypeCheck.ArtificialImplFile n - let mkPhysicalFile n = NodeToTypeCheck.PhysicalFile n - - /// Map any signature dependencies to the ArtificialImplFile counterparts, - /// unless the signature dependency is the backing file of the current (implementation) file. - let mapDependencies idx deps = - Array.map - (fun dep -> - if filePairs.IsSignature dep then - let implIdx = filePairs.GetImplementationIndex dep - - if implIdx = idx then - // This is the matching signature for the implementation. - // Retain the direct dependency onto the signature file. - mkPhysicalFile dep - else - mkArtificialImplFile dep - else - mkPhysicalFile dep) - deps - - // Transform the graph to include ArtificialImplFile nodes when necessary. - graph - |> Seq.collect (fun (KeyValue(fileIdx, deps)) -> - if filePairs.IsSignature fileIdx then - // Add an additional ArtificialImplFile node for the signature file. - [| - // Mark the current file as physical and map the dependencies. - mkPhysicalFile fileIdx, mapDependencies fileIdx deps - // Introduce a new node that depends on the signature. - mkArtificialImplFile fileIdx, [| mkPhysicalFile fileIdx |] - |] - else - [| mkPhysicalFile fileIdx, mapDependencies fileIdx deps |]) - |> Graph.make + let nodeGraph = TransformDependencyGraph(graph, filePairs) // Persist the graph to a Mermaid diagram if specified. if tcConfig.typeCheckingConfig.DumpGraph then @@ -1843,7 +1889,7 @@ let CheckMultipleInputsUsingGraphMode .TrimStart([| '\\'; '/' |]) (idx, friendlyFileName)) - |> Graph.serialiseToMermaid graphFile) + |> Graph.writeMermaidToFile graphFile) let _ = ctok // TODO Use it let diagnosticsLogger = DiagnosticsThreadStatics.DiagnosticsLogger @@ -1877,14 +1923,18 @@ let CheckMultipleInputsUsingGraphMode ((input, logger): ParsedInput * DiagnosticsLogger) ((currentTcState, _currentPriorErrors): State) : Finisher = - use _ = UseDiagnosticsLogger logger - let checkForErrors2 () = priorErrors || (logger.ErrorCount > 0) - let tcSink = TcResultsSink.NoSink let (Finisher(finisher = finisher)) = - CheckOneInputWithCallback - node - (checkForErrors2, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, currentTcState, input, false) + cancellable { + use _ = UseDiagnosticsLogger logger + let checkForErrors2 () = priorErrors || (logger.ErrorCount > 0) + let tcSink = TcResultsSink.NoSink + + return! + CheckOneInputWithCallback + node + (checkForErrors2, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, currentTcState, input, false) + } |> Cancellable.runWithoutCancellation Finisher( diff --git a/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fsi b/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fsi index 66a7c40785..72a63371c7 100644 --- a/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fsi +++ b/src/fcs-fable/src/Compiler/Driver/ParseAndCheckInputs.fsi @@ -15,12 +15,46 @@ open FSharp.Compiler.Diagnostics open FSharp.Compiler.DependencyManager #endif open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.GraphChecking +open FSharp.Compiler.NameResolution open FSharp.Compiler.Syntax open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text open FSharp.Compiler.TypedTree open FSharp.Compiler.UnicodeLexing +/// Auxiliary type for re-using signature information in TcEnvFromImpls. +/// +/// TcState has two typing environments: TcEnvFromSignatures && TcEnvFromImpls +/// When type checking a file, depending on the type (implementation or signature), it will use one of these typing environments (TcEnv). +/// Checking a file will populate the respective TcEnv. +/// +/// When a file has a dependencies, the information of the signature file in case a pair (implementation file backed by a signature) will suffice to type-check that file. +/// Example: if `B.fs` has a dependency on `A`, the information of `A.fsi` is enough for `B.fs` to type-check, on condition that information is available in the TcEnvFromImpls. +/// We introduce a special ArtificialImplFile node in the graph to satisfy this. `B.fs -> [ A.fsi ]` becomes `B.fs -> [ ArtificialImplFile A ]. +/// The `ArtificialImplFile A` node will duplicate the signature information which A.fsi provided earlier. +/// Processing a `ArtificialImplFile` node will add the information from the TcEnvFromSignatures to the TcEnvFromImpls. +/// This means `A` will be known in both TcEnvs and therefor `B.fs` can be type-checked. +/// By doing this, we can speed up the graph processing as type checking a signature file is less expensive than its implementation counterpart. +/// +/// When we need to actually type-check an implementation file backed by a signature, we cannot have the duplicate information of the signature file present in TcEnvFromImpls. +/// Example `A.fs -> [ A.fsi ]`. An implementation file always depends on its signature. +/// Type-checking `A.fs` will add the actual information to TcEnvFromImpls and we do not depend on the `ArtificialImplFile A` for `A.fs`. +/// +/// In order to deal correctly with the `ArtificialImplFile` logic, we need to transform the resolved graph to contain the additional pair nodes. +/// After we have type-checked the graph, we exclude the ArtificialImplFile nodes as they are not actual physical files in our project. +#if !FABLE_COMPILER +[] +type NodeToTypeCheck = + /// A real physical file in the current project. + /// This can be either an implementation or a signature file. + | PhysicalFile of fileIndex: FileIndex + /// An artificial node that will add the earlier processed signature information to the TcEnvFromImpls. + /// Dependents on this type of node will perceive that a file is known in both TcEnvFromSignatures and TcEnvFromImpls. + /// Even though the actual implementation file was not type-checked. + | ArtificialImplFile of signatureFileIndex: FileIndex +#endif //!FABLE_COMPILER + val IsScript: string -> bool val ComputeQualifiedNameOfFileFromUniquePath: range * string list -> QualifiedNameOfFile @@ -141,6 +175,8 @@ type TcState = member CreatesGeneratedProvidedTypes: bool +type PartialResult = TcEnv * TopAttribs * CheckedImplFile option * ModuleOrNamespaceType + /// Get the initial type checking state for a set of inputs val GetInitialTcState: range * string * TcConfig * TcGlobals * TcImports * TcEnv * OpenDeclaration list -> TcState @@ -161,6 +197,46 @@ val CheckOneInput: input: ParsedInput -> Cancellable<(TcEnv * TopAttribs * CheckedImplFile option * ModuleOrNamespaceType) * TcState> +#if !FABLE_COMPILER +val CheckOneInputWithCallback: + node: NodeToTypeCheck -> + checkForErrors: (unit -> bool) * + tcConfig: TcConfig * + tcImports: TcImports * + tcGlobals: TcGlobals * + prefixPathOpt: LongIdent option * + tcSink: TcResultsSink * + tcState: TcState * + input: ParsedInput * + _skipImplIfSigExists: bool -> + Cancellable> +#endif //!FABLE_COMPILER + +val AddCheckResultsToTcState: + tcGlobals: TcGlobals * + amap: Import.ImportMap * + hadSig: bool * + prefixPathOpt: LongIdent option * + tcSink: TcResultsSink * + tcImplEnv: TcEnv * + qualNameOfFile: QualifiedNameOfFile * + implFileSigType: ModuleOrNamespaceType -> + tcState: TcState -> + ModuleOrNamespaceType * TcState + +#if !FABLE_COMPILER +val AddSignatureResultToTcImplEnv: + tcImports: TcImports * + tcGlobals: TcGlobals * + prefixPathOpt: LongIdent option * + tcSink: TcResultsSink * + tcState: TcState * + input: ParsedInput -> + (TcState -> PartialResult * TcState) + +val TransformDependencyGraph: graph: Graph * filePairs: FilePairMap -> Graph +#endif //!FABLE_COMPILER + /// Finish the checking of multiple inputs val CheckMultipleInputsFinish: (TcEnv * TopAttribs * 'T option * 'U) list * TcState -> (TcEnv * TopAttribs * 'T list * 'U list) * TcState diff --git a/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fs b/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fs index 5ed409d7f5..46102d53ab 100644 --- a/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fs +++ b/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fs @@ -44,7 +44,7 @@ type LoadClosure = /// The resolved references along with the ranges of the #r positions in each file. References: (string * AssemblyResolution list) list - /// The resolved pacakge references along with the ranges of the #r positions in each file. + /// The resolved package references along with the ranges of the #r positions in each file. PackageReferences: (range * string list)[] /// Whether we're decided to use .NET Framework analysis for this script @@ -163,7 +163,7 @@ module ScriptPreprocessClosure = reduceMemoryUsage ) = - let projectDir = Path.GetDirectoryName fileName + let projectDir = !! Path.GetDirectoryName(fileName) let isInteractive = (codeContext = CodeContext.CompilationAndEvaluation) let isInvalidationSupported = (codeContext = CodeContext.Editing) @@ -464,7 +464,7 @@ module ScriptPreprocessClosure = let diagnosticsLogger = CapturingDiagnosticsLogger("FindClosureMetaCommands") use _ = UseDiagnosticsLogger diagnosticsLogger - let pathOfMetaCommandSource = Path.GetDirectoryName fileName + let pathOfMetaCommandSource = !! Path.GetDirectoryName(fileName) let preSources = tcConfig.GetAvailableLoadedSources() let tcConfigResult, noWarns = diff --git a/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fsi b/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fsi index 1af54ba633..a32cc5f259 100644 --- a/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fsi +++ b/src/fcs-fable/src/Compiler/Driver/ScriptClosure.fsi @@ -41,7 +41,7 @@ type LoadClosure = /// The resolved references along with the ranges of the #r positions in each file. References: (string * AssemblyResolution list) list - /// The resolved pacakge references along with the ranges of the #r positions in each file. + /// The resolved package references along with the ranges of the #r positions in each file. PackageReferences: (range * string list)[] /// Whether we're decided to use .NET Framework analysis for this script diff --git a/src/fcs-fable/src/Compiler/Driver/StaticLinking.fs b/src/fcs-fable/src/Compiler/Driver/StaticLinking.fs index 007c77c8e5..5391674462 100644 --- a/src/fcs-fable/src/Compiler/Driver/StaticLinking.fs +++ b/src/fcs-fable/src/Compiler/Driver/StaticLinking.fs @@ -158,7 +158,7 @@ let StaticLinkILModules match depILModule.Manifest with | Some m -> for ca in m.CustomAttrs.AsArray() do - if ca.Method.MethodRef.DeclaringTypeRef.FullName = typeof.FullName then + if ca.Method.MethodRef.DeclaringTypeRef.FullName = !!typeof.FullName then ca | _ -> () ] @@ -184,7 +184,8 @@ let StaticLinkILModules // Save only the interface/optimization attributes of generated data let intfDataResources, others = - allResources |> List.partition (snd >> IsSignatureDataResource) + allResources + |> List.partition (fun (_, r) -> IsSignatureDataResource r || IsSignatureDataResourceB r) let intfDataResources = [ @@ -194,7 +195,8 @@ let StaticLinkILModules ] let optDataResources, others = - others |> List.partition (snd >> IsOptimizationDataResource) + others + |> List.partition (fun (_, r) -> IsOptimizationDataResource r || IsOptimizationDataResourceB r) let optDataResources = [ diff --git a/src/fcs-fable/src/Compiler/Driver/fsc.fs b/src/fcs-fable/src/Compiler/Driver/fsc.fs index d3bfd2e74c..1d17950a9a 100644 --- a/src/fcs-fable/src/Compiler/Driver/fsc.fs +++ b/src/fcs-fable/src/Compiler/Driver/fsc.fs @@ -21,6 +21,7 @@ open System.Text open System.Threading open Internal.Utilities +open Internal.Utilities.TypeHashing open Internal.Utilities.Library open Internal.Utilities.Library.Extras @@ -29,13 +30,11 @@ open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.ILBinaryReader open FSharp.Compiler.AccessibilityLogic -open FSharp.Compiler.CheckExpressions open FSharp.Compiler.CheckDeclarations open FSharp.Compiler.CompilerConfig open FSharp.Compiler.CompilerDiagnostics open FSharp.Compiler.CompilerImports open FSharp.Compiler.CompilerOptions -open FSharp.Compiler.CompilerGlobalState open FSharp.Compiler.CreateILModule open FSharp.Compiler.DependencyManager open FSharp.Compiler.Diagnostics @@ -47,7 +46,6 @@ open FSharp.Compiler.IO open FSharp.Compiler.ParseAndCheckInputs open FSharp.Compiler.OptimizeInputs open FSharp.Compiler.ScriptClosure -open FSharp.Compiler.Syntax open FSharp.Compiler.StaticLinking open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text @@ -55,7 +53,7 @@ open FSharp.Compiler.Text.Range open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.XmlDocFileWriter -open FSharp.Compiler.BuildGraph +open FSharp.Compiler.CheckExpressionsOps //---------------------------------------------------------------------------- // Reporting - warnings, errors @@ -79,7 +77,8 @@ type DiagnosticsLoggerUpToMaxErrors(tcConfigB: TcConfigBuilder, exiter: Exiter, override x.DiagnosticSink(diagnostic, severity) = let tcConfig = TcConfig.Create(tcConfigB, validate = false) - if diagnostic.ReportAsError(tcConfig.diagnosticsOptions, severity) then + match diagnostic.AdjustSeverity(tcConfigB.diagnosticsOptions, severity) with + | FSharpDiagnosticSeverity.Error -> if errors >= tcConfig.maxErrors then x.HandleTooManyErrors(FSComp.SR.fscTooManyErrors ()) exiter.Exit 1 @@ -95,11 +94,8 @@ type DiagnosticsLoggerUpToMaxErrors(tcConfigB: TcConfigBuilder, exiter: Exiter, Debug.Assert(false, sprintf "Lookup exception in compiler: %s" (diagnostic.Exception.ToString())) | _ -> () - elif diagnostic.ReportAsWarning(tcConfig.diagnosticsOptions, severity) then - x.HandleIssue(tcConfig, diagnostic, FSharpDiagnosticSeverity.Warning) - - elif diagnostic.ReportAsInfo(tcConfig.diagnosticsOptions, severity) then - x.HandleIssue(tcConfig, diagnostic, severity) + | FSharpDiagnosticSeverity.Hidden -> () + | s -> x.HandleIssue(tcConfig, diagnostic, s) /// Create an error logger that counts and prints errors let ConsoleDiagnosticsLogger (tcConfigB: TcConfigBuilder, exiter: Exiter) = @@ -204,6 +200,7 @@ let AdjustForScriptCompile (tcConfigB: TcConfigBuilder, commandLineSourceFiles, error (Error(FSComp.SR.pathIsInvalid file, rangeStartup)) let commandLineSourceFiles = commandLineSourceFiles |> List.map combineFilePath + tcConfigB.embedSourceList <- tcConfigB.embedSourceList |> List.map combineFilePath // Script compilation is active if the last item being compiled is a script and --noframework has not been specified let mutable allSources = [] @@ -275,9 +272,6 @@ let SetProcessThreadLocals tcConfigB = | Some s -> Thread.CurrentThread.CurrentUICulture <- CultureInfo(s) | None -> () - if tcConfigB.utf8output then - Console.OutputEncoding <- Encoding.UTF8 - let ProcessCommandLineFlags (tcConfigB: TcConfigBuilder, lcidFromCodePage, argv) = let mutable inputFilesRef = [] @@ -349,7 +343,7 @@ module InterfaceFileWriter = let writeAllToSameFile declaredImpls = /// Use a UTF-8 Encoding with no Byte Order Mark let os = - if tcConfig.printSignatureFile = "" then + if String.IsNullOrEmpty(tcConfig.printSignatureFile) then Console.Out else FileSystem @@ -373,7 +367,7 @@ module InterfaceFileWriter = let writeToSeparateFiles (declaredImpls: CheckedImplFile list) = for CheckedImplFile(qualifiedNameOfFile = name) as impl in declaredImpls do let fileName = - Path.ChangeExtension(name.Range.FileName, extensionForFile name.Range.FileName) + !! Path.ChangeExtension(name.Range.FileName, extensionForFile name.Range.FileName) printfn "writing impl file to %s" fileName use os = FileSystem.OpenFileForWriteShim(fileName, FileMode.Create).GetWriter() @@ -394,7 +388,7 @@ module InterfaceFileWriter = // 2) If not, but FSharp.Core.dll exists beside the compiler binaries, it will copy it to output directory. // 3) If not, it will produce an error. let CopyFSharpCore (outFile: string, referencedDlls: AssemblyReference list) = - let outDir = Path.GetDirectoryName outFile + let outDir = !! Path.GetDirectoryName(outFile) let fsharpCoreAssemblyName = GetFSharpCoreLibraryName() + ".dll" let fsharpCoreDestinationPath = Path.Combine(outDir, fsharpCoreAssemblyName) @@ -414,7 +408,7 @@ let CopyFSharpCore (outFile: string, referencedDlls: AssemblyReference list) = | Some referencedFsharpCoreDll -> copyFileIfDifferent referencedFsharpCoreDll.Text fsharpCoreDestinationPath | None -> let executionLocation = Assembly.GetExecutingAssembly().Location - let compilerLocation = Path.GetDirectoryName executionLocation + let compilerLocation = !! Path.GetDirectoryName(executionLocation) let compilerFsharpCoreDllPath = Path.Combine(compilerLocation, fsharpCoreAssemblyName) @@ -481,14 +475,15 @@ let main1 // See Bug 735819 let lcidFromCodePage = + let thread = Thread.CurrentThread + if (Console.OutputEncoding.CodePage <> 65001) - && (Console.OutputEncoding.CodePage - <> Thread.CurrentThread.CurrentUICulture.TextInfo.OEMCodePage) - && (Console.OutputEncoding.CodePage - <> Thread.CurrentThread.CurrentUICulture.TextInfo.ANSICodePage) + && (Console.OutputEncoding.CodePage <> thread.CurrentUICulture.TextInfo.OEMCodePage) + && (Console.OutputEncoding.CodePage <> thread.CurrentUICulture.TextInfo.ANSICodePage) + && (CultureInfo.InvariantCulture <> thread.CurrentUICulture) then - Thread.CurrentThread.CurrentUICulture <- CultureInfo("en-US") + thread.CurrentUICulture <- CultureInfo("en-US") Some 1033 else None @@ -511,7 +506,8 @@ let main1 defaultCopyFSharpCore = defaultCopyFSharpCore, tryGetMetadataSnapshot = tryGetMetadataSnapshot, sdkDirOverride = None, - rangeForErrors = range0 + rangeForErrors = range0, + compilationMode = CompilationMode.OneOff ) tcConfigB.exiter <- exiter @@ -524,7 +520,7 @@ let main1 // Now install a delayed logger to hold all errors from flags until after all flags have been parsed (for example, --vserrors) let delayForFlagsLogger = CapturingDiagnosticsLogger("DelayFlagsLogger") - let _holder = UseDiagnosticsLogger delayForFlagsLogger + SetThreadDiagnosticsLoggerNoUnwind delayForFlagsLogger // Share intern'd strings across all lexing/parsing let lexResourceManager = Lexhelp.LexResourceManager() @@ -551,6 +547,17 @@ let main1 | Some parallelReferenceResolution -> tcConfigB.parallelReferenceResolution <- parallelReferenceResolution | None -> () + if tcConfigB.utf8output && Console.OutputEncoding <> Encoding.UTF8 then + let previousEncoding = Console.OutputEncoding + Console.OutputEncoding <- Encoding.UTF8 + + disposables.Register( + { new IDisposable with + member _.Dispose() = + Console.OutputEncoding <- previousEncoding + } + ) + // Display the banner text, if necessary if not bannerAlreadyPrinted then Console.Write(GetBannerText tcConfigB) @@ -595,7 +602,7 @@ let main1 let diagnosticsLogger = diagnosticsLoggerProvider.CreateLogger(tcConfigB, exiter) // Install the global error logger and never remove it. This logger does have all command-line flags considered. - let _holder = UseDiagnosticsLogger diagnosticsLogger + SetThreadDiagnosticsLoggerNoUnwind diagnosticsLogger // Forward all errors from flags delayForFlagsLogger.CommitDelayedDiagnostics diagnosticsLogger @@ -613,7 +620,7 @@ let main1 // Import basic assemblies let tcGlobals, frameworkTcImports = TcImports.BuildFrameworkTcImports(foundationalTcConfigP, sysRes, otherRes) - |> NodeCode.RunImmediateWithoutCancellation + |> Async.RunImmediate let ilSourceDocs = [ @@ -662,7 +669,7 @@ let main1 let tcImports = TcImports.BuildNonFrameworkTcImports(tcConfigP, frameworkTcImports, otherRes, knownUnresolved, dependencyProvider) - |> NodeCode.RunImmediateWithoutCancellation + |> Async.RunImmediate // register tcImports to be disposed in future disposables.Register tcImports @@ -748,7 +755,7 @@ let main2 GetDiagnosticsLoggerFilteringByScopedPragmas(true, scopedPragmas, tcConfig.diagnosticsOptions, oldLogger) - let _holder = UseDiagnosticsLogger diagnosticsLogger + SetThreadDiagnosticsLoggerNoUnwind diagnosticsLogger // Try to find an AssemblyVersion attribute let assemVerFromAttrib = @@ -896,11 +903,7 @@ let main3 TryFindFSharpStringAttribute tcGlobals tcGlobals.attrib_InternalsVisibleToAttribute topAttrs.assemblyAttrs |> Option.isSome - let observer = - if hasIvt then - Fsharp.Compiler.SignatureHash.PublicAndInternal - else - Fsharp.Compiler.SignatureHash.PublicOnly + let observer = if hasIvt then PublicAndInternal else PublicOnly let optDataHash = optDataResources @@ -1243,16 +1246,6 @@ let CompileFromCommandLineArguments ) = use disposables = new DisposablesTracker() - let savedOut = Console.Out - - use _ = - { new IDisposable with - member _.Dispose() = - try - Console.SetOut(savedOut) - with _ -> - () - } main1 ( ctok, diff --git a/src/fcs-fable/src/Compiler/FSComp.txt b/src/fcs-fable/src/Compiler/FSComp.txt index d0fad76ab3..b42500049d 100644 --- a/src/fcs-fable/src/Compiler/FSComp.txt +++ b/src/fcs-fable/src/Compiler/FSComp.txt @@ -155,7 +155,6 @@ ValueNotContainedMutabilityInstanceButStatic,"Module '%s' contains\n %s \n 315,DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl,"The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was required by the signature but was not specified by the implementation" 316,DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig,"The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was present in the implementation but not in the signature" 317,DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer,"The %s definitions for type '%s' in the signature and implementation are not compatible because the signature declares a %s while the implementation declares a %s" -318,DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer,"The %s definitions for type '%s' in the signature and implementation are not compatible because the abbreviations differ: %s versus %s" 319,DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig,"The %s definitions for type '%s' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature." 320,DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation,"The %s definitions for type '%s' in the signature and implementation are not compatible because the signature has an abbreviation while the implementation does not" ModuleContainsConstructorButNamesDiffer,"The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe names differ" @@ -315,6 +314,7 @@ csExpectTypeWithOperatorButGivenFunction,"Expecting a type supporting the operat csExpectTypeWithOperatorButGivenTuple,"Expecting a type supporting the operator '%s' but given a tuple type" csTypesDoNotSupportOperator,"None of the types '%s' support the operator '%s'" csTypeDoesNotSupportOperator,"The type '%s' does not support the operator '%s'" +csFunctionDoesNotSupportType,"'%s' does not support the type '%s', because the latter lacks the required (real or built-in) member '%s'" csTypesDoNotSupportOperatorNullable,"None of the types '%s' support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'." csTypeDoesNotSupportOperatorNullable,"The type '%s' does not support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'." csTypeDoesNotSupportConversion,"The type '%s' does not support a conversion to the type '%s'" @@ -561,6 +561,7 @@ tcCouldNotFindIDisposable,"Couldn't find Dispose on IDisposable, or it was overl 706,tcInvalidUnitsOfMeasurePrefix,"Units-of-measure cannot be used as prefix arguments to a type. Rewrite as postfix arguments in angle brackets." 707,tcUnitsOfMeasureInvalidInTypeConstructor,"Unit-of-measure cannot be used in type constructor application" 708,tcRequireBuilderMethod,"This control construct may only be used if the computation expression builder defines a '%s' method" +708,tcEmptyBodyRequiresBuilderZeroMethod,"An empty body may only be used if the computation expression builder defines a 'Zero' method." 709,tcTypeHasNoNestedTypes,"This type has no nested types" 711,tcUnexpectedSymbolInTypeExpression,"Unexpected %s in type expression" 712,tcTypeParameterInvalidAsTypeConstructor,"Type parameter cannot be used as type constructor" @@ -678,7 +679,7 @@ tcUnnamedArgumentsDoNotFormPrefix,"The unnamed arguments do not form a prefix of 824,tcAttributesAreNotPermittedOnLetBindings,"Attributes are not permitted on 'let' bindings in expressions" 825,tcDefaultValueAttributeRequiresVal,"The 'DefaultValue' attribute may only be used on 'val' declarations" 826,tcConditionalAttributeRequiresMembers,"The 'ConditionalAttribute' attribute may only be used on members" -827,tcInvalidActivePatternName,"This is not a valid name for an active pattern" +827,tcInvalidActivePatternName,"'%s' is not a valid method name. Use a 'let' binding instead." 828,tcEntryPointAttributeRequiresFunctionInModule,"The 'EntryPointAttribute' attribute may only be used on function definitions in modules" 829,tcMutableValuesCannotBeInline,"Mutable values cannot be marked 'inline'" 830,tcMutableValuesMayNotHaveGenericParameters,"Mutable values cannot have generic parameters" @@ -874,10 +875,11 @@ srcFileTooLarge,"Source file is too large to embed in a portable PDB" optsResource,"Embed the specified managed resource" optsLinkresource,"Link the specified resource to this assembly where the resinfo format is [,[,public|private]]" optsDebugPM,"Emit debug information (Short form: -g)" -optsDebug,"Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file)." +optsDebug,"Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file)." optsOptimize,"Enable optimizations (Short form: -O)" optsTailcalls,"Enable or disable tailcalls" optsDeterministic,"Produce a deterministic assembly (including module version GUID and timestamp)" +optsRealsig,"Generate assembly with IL visibility that matches the source code visibility" optsRefOnly,"Produce a reference assembly, instead of a full assembly, as the primary output" optsRefOut,"Produce a reference assembly with the specified file path." optsPathMap,"Maps physical paths to source path names output by the compiler" @@ -992,7 +994,6 @@ lexhlpIdentifierReserved,"The identifier '%s' is reserved for future use by F#" 1112,impImportedAssemblyUsesNotPublicType,"An imported assembly uses the type '%s' but that type is not public" 1113,optValueMarkedInlineButIncomplete,"The value '%s' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible" 1114,optValueMarkedInlineButWasNotBoundInTheOptEnv,"The value '%s' was marked inline but was not bound in the optimization environment" -1115,optLocalValueNotFoundDuringOptimization,"Local value %s not found during optimization" 1116,optValueMarkedInlineHasUnexpectedValue,"A value marked as 'inline' has an unexpected value" 1117,optValueMarkedInlineCouldNotBeInlined,"A value marked as 'inline' could not be inlined" 1118,optFailedToInlineValue,"Failed to inline the value '%s' marked 'inline', perhaps because a recursive value was marked 'inline'" @@ -1019,7 +1020,7 @@ lexfltSeparatorTokensOfPatternMatchMisaligned,"The '|' tokens separating rules o # ----------------------------------------------------------------------------- lexCharNotAllowedInOperatorNames,"'%s' is not permitted as a character in operator names and is reserved for future use" lexUnexpectedChar,"Unexpected character '%s'" -1140,lexByteArrayCannotEncode,"This byte array literal contains characters that do not encode as a single byte" +1140,lexByteArrayCannotEncode,"This byte array literal contains %d characters that do not encode as a single byte" 1141,lexIdentEndInMarkReserved,"Identifiers followed by '%s' are reserved for future use" 1142,lexOutsideEightBitSigned,"This number is outside the allowable range for 8-bit signed integers" 1143,lexOutsideEightBitSignedHex,"This number is outside the allowable range for hexadecimal 8-bit signed integers" @@ -1033,10 +1034,11 @@ lexUnexpectedChar,"Unexpected character '%s'" 1151,lexOutsideNativeSigned,"This number is outside the allowable range for signed native integers" 1152,lexOutsideNativeUnsigned,"This number is outside the allowable range for unsigned native integers" 1153,lexInvalidFloat,"Invalid floating point number" -1154,lexOusideDecimal,"This number is outside the allowable range for decimal literals" -1155,lexOusideThirtyTwoBitFloat,"This number is outside the allowable range for 32-bit floats" +1154,lexOutsideDecimal,"This number is outside the allowable range for decimal literals" +1155,lexOutsideThirtyTwoBitFloat,"This number is outside the allowable range for 32-bit floats" 1156,lexInvalidNumericLiteral,"This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1.0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint)." -1157,lexInvalidByteLiteral,"This is not a valid byte literal" +1157,lexInvalidAsciiByteLiteral,"This is not a valid byte character literal. The value must be less than or equal to '\127'B." +1157,lexInvalidTrigraphAsciiByteLiteral,"This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error." 1158,lexInvalidCharLiteral,"This is not a valid character literal" 1159,lexThisUnicodeOnlyInStringLiterals,"This Unicode encoding is only valid in string literals" 1160,lexTokenReserved,"This token is reserved for future use" @@ -1130,6 +1132,8 @@ lexIfOCaml,"IF-FSHARP/IF-CAML regions are no longer supported" 1249,lexUnmatchedRBracesInTripleQuote,"The interpolated string contains unmatched closing braces." 1250,lexTooManyPercentsInTripleQuote,"The interpolated triple quoted string literal does not start with enough '$' characters to allow this many consecutive '%%' characters." 1251,lexExtendedStringInterpolationNotSupported,"Extended string interpolation is not supported in this version of F#." +1252,lexInvalidCharLiteralInString,"'%s' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '%s'. In a future F# version this warning will be promoted to an error." +1253,lexByteArrayOutisdeAscii,"This byte array literal contains %d non-ASCII characters. All characters should be < 128y." # reshapedmsbuild.fs 1300,toolLocationHelperUnsupportedFrameworkVersion,"The specified .NET Framework version '%s' is not supported. Please specify a value from the enumeration Microsoft.Build.Utilities.TargetDotNetFrameworkVersion." # ----------------------------------------------------------------------------- @@ -1166,7 +1170,7 @@ fscTooManyErrors,"Exiting - too many errors" 2018,fscKeyFileWarning,"Option '--keyfile' overrides attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file or added module" 2019,fscKeyNameWarning,"Option '--keycontainer' overrides attribute 'System.Reflection.AssemblyNameAttribute' given in a source file or added module" 2020,fscReferenceOnCommandLine,"The assembly '%s' is listed on the command line. Assemblies should be referenced using a command line flag such as '-r'." -2021,fscRemotingError,"The resident compilation service was not used because a problem occured in communicating with the server." +2021,fscRemotingError,"The resident compilation service was not used because a problem occurred in communicating with the server." 2022,pathIsInvalid,"Problem with filename '%s': Illegal characters in path." 2023,fscResxSourceFileDeprecated,"Passing a .resx file (%s) as a source file to the compiler is deprecated. Use resgen.exe to transform the .resx file into a .resources file to pass as a --resource option. If you are using MSBuild, this can be done via an item in the .fsproj project file." 2024,fscStaticLinkingNoProfileMismatches,"Static linking may not be used on an assembly referencing mscorlib (e.g. a .NET Framework assembly) when generating an assembly that references System.Runtime (e.g. a .NET Core or Portable assembly)." @@ -1210,7 +1214,7 @@ fscTooManyErrors,"Exiting - too many errors" 3043,etUnexpectedExceptionFromProvidedMemberMember,"Unexpected exception from member '%s' of provided type '%s' member '%s': %s" 3044,etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters,"Nested provided types do not take static arguments or generic parameters" 3045,etInvalidStaticArgument,"Invalid static argument to provided type. Expected an argument of kind '%s'." -3046,etErrorApplyingStaticArgumentsToType,"An error occured applying the static arguments to a provided type" +3046,etErrorApplyingStaticArgumentsToType,"An error occurred applying the static arguments to a provided type" 3047,etUnknownStaticArgumentKind,"Unknown static argument kind '%s' when resolving a reference to a provided type or method '%s'" 3048,etProviderHasDesignerAssemblyDependency,"The type provider designer assembly '%s' could not be loaded from folder '%s' because a dependency was missing or could not loaded. All dependencies of the type provider designer assembly must be located in the same folder as that assembly. The exception reported was: %s - %s" 3049,etProviderHasDesignerAssemblyException,"The type provider designer assembly '%s' could not be loaded from folder '%s'. The exception reported was: %s - %s" @@ -1225,7 +1229,7 @@ invalidFullNameForProvidedType,"invalid full name for provided type" 3061,tcTypeCastErased,"This downcast will erase the provided type '%s' to the type '%s'." 3062,tcTypeTestErased,"This type test with a provided type '%s' is not allowed because this provided type will be erased to '%s' at runtime." 3063,tcCannotInheritFromErasedType,"Cannot inherit from erased provided type" -3065,etInvalidTypeProviderAssemblyName,"Assembly '%s' hase TypeProviderAssembly attribute with invalid value '%s'. The value should be a valid assembly name" +3065,etInvalidTypeProviderAssemblyName,"Assembly '%s' has TypeProviderAssembly attribute with invalid value '%s'. The value should be a valid assembly name" 3066,tcInvalidMemberNameCtor,"Invalid member name. Members may not have name '.ctor' or '.cctor'" 3068,tcInferredGenericTypeGivesRiseToInconsistency,"The function or member '%s' is used in a way that requires further type annotations at its definition to ensure consistency of inferred types. The inferred signature is '%s'." 3069,tcInvalidTypeArgumentCount,"The number of type arguments did not match: '%d' given, '%d' expected. This may be related to a previously reported error." @@ -1356,7 +1360,7 @@ descriptionUnavailable,"(description unavailable...)" 3179,fscSystemRuntimeInteropServicesIsRequired,"System.Runtime.InteropServices assembly is required to use UnknownWrapper\DispatchWrapper classes." 3180,abImplicitHeapAllocation,"The mutable local '%s' is implicitly allocated as a reference cell because it has been captured by a closure. This warning is for informational purposes only to indicate where implicit allocations are performed." estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetStaticParametersForMethod, but ApplyStaticArgumentsForMethod was not implemented or invalid" -3181,etErrorApplyingStaticArgumentsToMethod,"An error occured applying the static arguments to a provided method" +3181,etErrorApplyingStaticArgumentsToMethod,"An error occurred applying the static arguments to a provided method" 3182,pplexUnexpectedChar,"Unexpected character '%s' in preprocessor expression" 3183,ppparsUnexpectedToken,"Unexpected token '%s' in preprocessor expression" 3184,ppparsIncompleteExpression,"Incomplete preprocessor expression" @@ -1382,7 +1386,7 @@ tcTupleStructMismatch,"One tuple type is a struct tuple, the other is a referenc 3202,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" 3203,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" 3204,tcStructUnionMultiCaseDistinctFields,"If a multicase union type is a struct, then all union cases must have unique names. For example: 'type A = B of b: int | C of c: int'." -3206,CallerMemberNameIsOverriden,"The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute." +3206,CallerMemberNameIsOverridden,"The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute." 3207,tcFixedNotAllowed,"Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is one of the following: an array, the address of an array element, a string, a byref, an inref, or a type implementing GetPinnableReference()" 3208,tcCouldNotFindOffsetToStringData,"Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression." 3209,chkNoByrefAddressOfLocal,"The address of the variable '%s' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope." @@ -1461,7 +1465,7 @@ keywordDescriptionStatic,"Used to indicate a method or property that can be call keywordDescriptionStruct,"Used to declare a structure type. Also used in generic parameter constraints." keywordDescriptionThen,"Used in conditional expressions. Also used to perform side effects after object construction." keywordDescriptionTo,"Used in for loops to indicate a range." -keywordDescriptionTry,"Used to introduce a block of code that might generate an exception. Used together with with or finally." +keywordDescriptionTry,"Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'." keywordDescriptionType,"Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation." keywordDescriptionTypeTest,"Used to check if an object is of the given type in a pattern or binding." keywordDescriptionUpcast,"Used to convert to a type that is higher in the inheritance chain." @@ -1521,6 +1525,23 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3250,expressionHasNoName,"Expression does not have a name." 3251,chkNoFirstClassNameOf,"Using the 'nameof' operator as a first-class function value is not permitted." 3252,tcIllegalByrefsInOpenTypeDeclaration,"Byref types are not allowed in an open type declaration." +3260,tcTypeDoesNotHaveAnyNull,"The type '%s' does not support a nullness qualification." +#3261 reserved for ConstraintSolverNullnessWarningEquivWithTypes +#3261 reserved for ConstraintSolverNullnessWarningWithTypes +#3261 reserved for ConstraintSolverNullnessWarningWithType +#3261 reserved for ConstraintSolverNullnessWarning +3262,tcPassingWithoutNullToANullableExpectingFunc,"Value known to be without null passed to a function meant for nullables: %s" +tcPassingWithoutNullToOptionOfObj,"You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value." +tcPassingWithoutNullToValueOptionOfObj,"You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value." +tcPassingWithoutNullToNonNullAP,"You can remove this |Null|NonNull| pattern usage." +tcPassingWithoutNullToNonNullQuickAP,"You can remove this |NonNullQuick| pattern usage." +tcPassingWithoutNullTononNullFunction,"You can remove this `nonNull` assertion." +3263,tcNullableToStringOverride,"With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function." +3264,tcDowncastFromNullableToWithoutNull,"Nullness warning: Downcasting from '%s' into '%s' can introduce unexpected null values. Cast to '%s|null' instead or handle the null before downcasting." +3268,csNullNotNullConstraintInconsistent,"The constraints 'null' and 'not null' are inconsistent" +3271,tcNullnessCheckingNotEnabled,"The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored." +csTypeHasNullAsTrueValue,"The type '%s' uses 'null' as a representation value but a non-null type is expected" +csTypeHasNullAsExtraValue,"The type '%s' supports 'null' but a non-null type is expected" 3300,chkInvalidFunctionParameterType,"The parameter '%s' has an invalid type '%s'. This is not permitted by the rules of Common IL." 3301,chkInvalidFunctionReturnType,"The function or method has an invalid return type '%s'. This is not permitted by the rules of Common IL." 3302,packageManagementRequiresVFive,"The 'package management' feature requires language version 5.0 or above" @@ -1535,6 +1556,8 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3352,typrelInterfaceMemberNoMostSpecificImplementation,"Interface member '%s' does not have a most specific implementation." 3353,fsiInvalidDirective,"Invalid directive '#%s %s'" useSdkRefs,"Use reference assemblies for .NET framework references when available (Enabled by default)." +optsCheckNulls,"Enable nullness declarations and checks" +fSharpBannerVersion,"%s for F# %s" optsGetLangVersions,"Display the allowed values for language version." optsSetLangVersion,"Specify language version such as 'latest' or 'preview'." optsSupportedLangVersions,"Supported language versions:" @@ -1544,7 +1567,7 @@ nativeResourceHeaderMalformed,"Resource header beginning at offset %s is malform formatDashItem," - %s" featureSingleUnderscorePattern,"single underscore pattern" featureWildCardInForLoop,"wild card in for loop" -featureRelaxWhitespace,"whitespace relexation" +featureRelaxWhitespace,"whitespace relaxation" featureNameOf,"nameof" featureImplicitYield,"implicit yield" featureOpenTypeDeclaration,"open type declaration" @@ -1553,6 +1576,7 @@ featurePackageManagement,"package management" featureFromEndSlicing,"from-end slicing" featureFixedIndexSlice3d4d,"fixed-index slice 3d/4d" featureAndBang,"applicative computation expressions" +featureNullnessChecking,"nullness checking" featureResumableStateMachines,"resumable state machines" featureNullableOptionalInterop,"nullable optional interop" featureDefaultInterfaceMemberConsumption,"default interface member consumption" @@ -1592,6 +1616,11 @@ featurePreferExtensionMethodOverPlainProperty,"prefer extension method over plai featureWarningIndexedPropertiesGetSetSameType,"Indexed properties getter and setter must have the same type" featureChkTailCallAttrOnNonRec,"Raises warnings if the 'TailCall' attribute is used on non-recursive functions." featureUnionIsPropertiesVisible,"Union case test properties" +featureBooleanReturningAndReturnTypeDirectedPartialActivePattern,"Boolean-returning and return-type-directed partial active patterns" +featureEnforceAttributeTargets,"Enforce AttributeTargets" +featureLowerInterpolatedStringToConcat,"Optimizes interpolated strings in certain cases, by lowering to concatenation" +featureLowerIntegralRangesToFastLoops,"Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops." +featureLowerSimpleMappingsInComprehensionsToFastLoops,"Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively." 3354,tcNotAFunctionButIndexerNamedIndexingNotYetEnabled,"This value supports indexing, e.g. '%s.[index]'. The syntax '%s[index]' requires /langversion:preview. See https://aka.ms/fsharp-index-notation." 3354,tcNotAFunctionButIndexerIndexingNotYetEnabled,"This expression supports indexing, e.g. 'expr.[index]'. The syntax 'expr[index]' requires /langversion:preview. See https://aka.ms/fsharp-index-notation." 3355,tcNotAnIndexerNamedIndexingNotYetEnabled,"The value '%s' is not a function and does not support index notation." @@ -1656,7 +1685,7 @@ forFormatInvalidForInterpolated4,"Interpolated strings used as type IFormattable 3501,tcResumableCodeFunctionMustBeInline,"Invalid resumable code. Any method of function accepting or returning resumable code must be marked 'inline'" 3501,tcResumableCodeArgMustHaveRightName,"Invalid resumable code. Resumable code parameter must have name beginning with '__expand'" 3501,tcResumableCodeArgMustHaveRightKind,"Invalid resumable code. A resumable code parameter must be of delegate or function type" -3501,tcResumableCodeContainsLetRec,"Invalid resumable code. A 'let rec' occured in the resumable code specification" +3501,tcResumableCodeContainsLetRec,"Invalid resumable code. A 'let rec' occurred in the resumable code specification" 3510,tcResumableCodeNotSupported,"Using resumable code or resumable state machines requires /langversion:preview" 3510,tcNoEagerConstraintApplicationAttribute,"Using methods with 'NoEagerConstraintApplicationAttribute' requires /langversion:6.0 or later" 3511,reprStateMachineNotCompilable,"This state machine is not statically compilable. %s. An alternative dynamic implementation will be used, which may be slower. Consider adjusting your code to ensure this state machine is statically compilable, or else suppress this warning." @@ -1664,8 +1693,8 @@ forFormatInvalidForInterpolated4,"Interpolated strings used as type IFormattable 3513,tcResumableCodeInvocation,"Resumable code invocation. Suppress this warning if you are defining new low-level resumable code in terms of existing resumable code." 3514,ilxGenUnknownDebugPoint,"Unknown debug point '%s'. The available debug points are '%s'." reprResumableCodeInvokeNotReduced,"A resumable code invocation at '%s' could not be reduced" -reprResumableCodeContainsLetRec,"A 'let rec' occured in the resumable code specification" -reprResumableCodeContainsConstrainedGenericLet,"A constrained generic construct occured in the resumable code specification" +reprResumableCodeContainsLetRec,"A 'let rec' occurred in the resumable code specification" +reprResumableCodeContainsConstrainedGenericLet,"A constrained generic construct occurred in the resumable code specification" reprResumableCodeContainsDynamicResumeAtInBody,"A target label for __resumeAt was not statically determined. A __resumeAt with a non-static target label may only appear at the start of a resumable code method" reprResumableCodeContainsResumptionInTryFinally,"A try/finally may not contain resumption points" reprResumableCodeContainsResumptionInHandlerOrFilter,"The 'with' block of a try/with may not contain resumption points" @@ -1689,7 +1718,7 @@ reprStateMachineInvalidForm,"The state machine has an unexpected form" 3535,tcUsingInterfacesWithStaticAbstractMethods,"Declaring \"interfaces with static abstract methods\" is an advanced feature. See https://aka.ms/fsharp-iwsams for guidance. You can disable this warning by using '#nowarn \"3535\"' or '--nowarn:3535'." 3536,tcUsingInterfaceWithStaticAbstractMethodAsType,"'%s' is normally used as a type constraint in generic code, e.g. \"'T when ISomeInterface<'T>\" or \"let f (x: #ISomeInterface<_>)\". See https://aka.ms/fsharp-iwsams for guidance. You can disable this warning by using '#nowarn \"3536\"' or '--nowarn:3536'." 3537,tcTraitHasMultipleSupportTypes,"The trait '%s' invoked by this call has multiple support types. This invocation syntax is not permitted for such traits. See https://aka.ms/fsharp-srtp for guidance." -3545,tcMissingRequiredMembers,"The following required properties have to be initalized:%s" +3545,tcMissingRequiredMembers,"The following required properties have to be initialized:%s" 3546,parsExpectingPattern,"Expecting pattern" 3547,parsExpectedPatternAfterToken,"Expected a pattern after this point" 3548,matchNotAllowedForUnionCaseWithNoData,"Pattern discard is not allowed for union case that takes no data." @@ -1738,4 +1767,25 @@ featureReuseSameFieldsInStructUnions,"Share underlying fields in a [] di 3860,chkStaticMembersOnObjectExpressions,"Object expressions cannot implement interfaces with static abstract members or declare static members." 3861,chkTailCallAttrOnNonRec,"The TailCall attribute should only be applied to recursive functions." 3862,parsStaticMemberImcompleteSyntax,"Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration." -3863,parsExpectingField,"Expecting record field" \ No newline at end of file +3863,parsExpectingRecordField,"Expecting record field" +3864,tooManyMethodsInDotNetTypeWritingAssembly,"The type '%s' has too many methods. Found: '%d', maximum: '%d'" +3865,parsOnlySimplePatternsAreAllowedInConstructors,"Only simple patterns are allowed in primary constructors" +3866,chkStaticAbstractInterfaceMembers,"A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.%s)." +3867,chkStaticAbstractMembersOnClasses,"Classes cannot contain static abstract members." +3868,tcActivePatternArgsCountNotMatchNoArgsNoPat,"This active pattern does not expect any arguments, i.e., it should be used like '%s' instead of '%s x'." +3868,tcActivePatternArgsCountNotMatchOnlyPat,"This active pattern expects exactly one pattern argument, e.g., '%s pat'." +3868,tcActivePatternArgsCountNotMatchArgs,"This active pattern expects %d expression argument(s), e.g., '%s%s'." +3868,tcActivePatternArgsCountNotMatchArgsAndPat,"This active pattern expects %d expression argument(s) and a pattern argument, e.g., '%s%s pat'." +featureParsedHashDirectiveArgumentNonString,"# directives with non-quoted string arguments" +3869,featureParsedHashDirectiveUnexpectedInteger,"Unexpected integer literal '%d'." +3869,featureParsedHashDirectiveUnexpectedIdentifier,"Unexpected identifier '%s'." +featureEmptyBodiedComputationExpressions,"Support for computation expressions with empty bodies: builder {{ }}" +3870,parsExpectingUnionCaseField,"Expecting union case field" +featureAllowAccessModifiersToAutoPropertiesGettersAndSetters,"Allow access modifiers to auto properties getters and setters" +3871,tcAccessModifiersNotAllowedInSRTPConstraint,"Access modifiers cannot be applied to an SRTP constraint." +featureAllowObjectExpressionWithoutOverrides,"Allow object expressions without overrides" +featureUseTypeSubsumptionCache,"Use type conversion cache during compilation" +3872,tcPartialActivePattern,"Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern." +featureDontWarnOnUppercaseIdentifiersInBindingPatterns,"Don't warn on uppercase identifiers in binding patterns" +3873,chkDeprecatePlacesWhereSeqCanBeOmitted,"This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}'" +featureDeprecatePlacesWhereSeqCanBeOmitted,"Deprecate places where 'seq' can be omitted" diff --git a/src/fcs-fable/src/Compiler/FSStrings.resx b/src/fcs-fable/src/Compiler/FSStrings.resx index 251f626c63..383b499110 100644 --- a/src/fcs-fable/src/Compiler/FSStrings.resx +++ b/src/fcs-fable/src/Compiler/FSStrings.resx @@ -129,6 +129,18 @@ A type parameter is missing a constraint '{0}' + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + + Nullness warning: The type '{0}' does not support 'null'. + + + Nullness warning: {0}. + The unit of measure '{0}' does not match the unit of measure '{1}' @@ -184,7 +196,7 @@ Duplicate definition of {0} '{1}' - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module Two members called '{0}' have the same signature @@ -220,7 +232,7 @@ A coercion from the value type \n {0} \nto the type \n {1} \nwill involve boxing. Consider using 'box' instead - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. This construct causes code to be less generic than indicated by its type annotations. The type variable implied by the use of a '#', '_' or other type annotation at or near '{0}' has been constrained to be type '{1}'. @@ -414,6 +426,9 @@ symbol '|}' + + symbol '|' (directly before 'null') + symbol '>}' @@ -1029,20 +1044,11 @@ The following fields require values: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. syntax error @@ -1060,7 +1066,7 @@ Override implementations should be given as part of the initial declaration of a type. - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. Interface implementations should be given on the initial declaration of a type. @@ -1072,10 +1078,10 @@ The type referenced through '{0}' is defined in an assembly that is not referenced. You must add a reference to assembly '{1}'. - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. This directive may only be used in F# script files (extensions .fsx or .fsscript). Either remove the directive, move this code to a script file or delimit the directive with '#if INTERACTIVE'/'#endif'. @@ -1122,6 +1128,9 @@ The argument names in the signature '{0}' and implementation '{1}' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + keyword 'while!' diff --git a/src/fcs-fable/src/Compiler/FSharp.Compiler.Service.fsproj b/src/fcs-fable/src/Compiler/FSharp.Compiler.Service.fsproj index 687bc26923..419746af6c 100644 --- a/src/fcs-fable/src/Compiler/FSharp.Compiler.Service.fsproj +++ b/src/fcs-fable/src/Compiler/FSharp.Compiler.Service.fsproj @@ -1,4 +1,4 @@ - + @@ -10,27 +10,45 @@ $(NoWarn);75 $(NoWarn);1204 $(NoWarn);NU5125 + $(NoWarn);64;1182;1204 + $(OtherFlags) --warnaserror-:1182 FSharp.Compiler.Service true $(DefineConstants);COMPILER + true + + $(FSharpNetCoreProductDefaultTargetFramework);$(TargetFrameworks) $(DefineConstants);FSHARPCORE_USE_PACKAGE $(OtherFlags) --extraoptimizationloops:1 + + - $(OtherFlags) --warnon:1182 + $(OtherFlags) --nowarn:1182 + $(OtherFlags) --warnon:3218 $(OtherFlags) --warnon:3390 - true + + $(OtherFlags) --generate-filter-blocks + true $(IntermediateOutputPath)$(TargetFramework)\ $(IntermediateOutputPath)$(TargetFramework)\ false - Debug;Release;ReleaseCompressed + Debug;Release - false + false + false + true @@ -38,12 +56,17 @@ FSharp.Compiler.Service.nuspec true The F# Compiler Services package for F# $(FSLanguageVersion) exposes additional functionality for implementing F# language bindings, additional tools based on the compiler or refactoring tools. The package also includes F# interactive service that can be used for embedding F# scripting into your applications. Contains code from the F# Software Foundation. - /blob/main/release-notes.md#FSharp-Compiler-Service-$(FSharpCompilerServiceReleaseNotesVersion) + /blob/main/docs/release-notes/.FSharp.Compiler.Service/$(FSharpLibrariesChangelogVersion).md F#, fsharp, interactive, compiler, editor preview $(MSBuildThisFileDirectory)logo.png + + $(ArtifactsDir)/bin/$(MSBuildProjectName)/$(Configuration)/ + $(ArtifactsDir)obj/$(MSBuildProjectName)/$(Configuration)/ + + @@ -69,7 +92,6 @@ - @@ -77,9 +99,11 @@ + + FSComp.txt @@ -89,9 +113,11 @@ FSStrings.resx FSStrings.resources - + + + @@ -104,8 +130,6 @@ - - @@ -124,6 +148,8 @@ + + @@ -144,6 +170,8 @@ + + @@ -156,6 +184,8 @@ + + @@ -217,15 +247,15 @@ SyntaxTree\pplex.fsl - --module FSharp.Compiler.PPParser --open FSharp.Compiler.ParseHelpers --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char + --module FSharp.Compiler.PPParser --open FSharp.Compiler.ParseHelpers --open FSharp.Compiler.LexerStore --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char SyntaxTree\pppars.fsy - --module FSharp.Compiler.Lexer --open FSharp.Compiler.Lexhelp --open Internal.Utilities.Text.Lexing --open FSharp.Compiler.Parser --open FSharp.Compiler.Text --open FSharp.Compiler.ParseHelpers --internal --unicode --lexlib Internal.Utilities.Text.Lexing + --module FSharp.Compiler.Lexer --open FSharp.Compiler.Lexhelp --open Internal.Utilities.Text.Lexing --open FSharp.Compiler.Parser --open FSharp.Compiler.Text --open FSharp.Compiler.ParseHelpers --open FSharp.Compiler.LexerStore --internal --unicode --lexlib Internal.Utilities.Text.Lexing SyntaxTree\lex.fsl - -v --module FSharp.Compiler.Parser --open FSharp.Compiler --open FSharp.Compiler.Syntax --open FSharp.Compiler.Text --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char + --module FSharp.Compiler.Parser --open FSharp.Compiler --open FSharp.Compiler.Syntax --open FSharp.Compiler.Text --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char SyntaxTree\pars.fsy @@ -250,6 +280,8 @@ + + @@ -296,6 +328,7 @@ + @@ -303,6 +336,7 @@ + @@ -347,18 +381,21 @@ - - + + + - - + + + + - - + + @@ -475,6 +512,10 @@ + + + + @@ -493,6 +534,11 @@ + + + + + @@ -504,6 +550,8 @@ + + @@ -517,23 +565,18 @@ - - $(ArtifactsDir)/bin/$(MSBuildProjectName)/$(Configuration)/ - $(ArtifactsDir)obj/$(MSBuildProjectName)/$(Configuration)/ - - - TargetFramework=net8.0 + TargetFramework=$(FSharpNetCoreProductTargetFramework) compile - TargetFramework=net8.0 + TargetFramework=$(FSharpNetCoreProductTargetFramework) compile - TargetFramework=net8.0 + TargetFramework=$(FSharpNetCoreProductTargetFramework) compile diff --git a/src/fcs-fable/src/Compiler/Facilities/AsyncMemoize.fs b/src/fcs-fable/src/Compiler/Facilities/AsyncMemoize.fs new file mode 100644 index 0000000000..af1a52e5e5 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Facilities/AsyncMemoize.fs @@ -0,0 +1,643 @@ +namespace Internal.Utilities.Collections + +open System +open System.Collections.Generic +open System.Diagnostics +open System.IO +open System.Threading +open System.Threading.Tasks + +open FSharp.Compiler +open FSharp.Compiler.BuildGraph +open FSharp.Compiler.Diagnostics +open FSharp.Compiler.DiagnosticsLogger +open Internal.Utilities.Library +open System.Runtime.CompilerServices + +[] +module internal Utils = + + /// Return file name with one directory above it + let shortPath (path: string) = + let dirPath = !! Path.GetDirectoryName(path) + + let dir = + dirPath.Split Path.DirectorySeparatorChar + |> Array.tryLast + |> Option.map (sprintf "%s/") + |> Option.defaultValue "" + + $"{dir}{Path.GetFileName path}" + + let replayDiagnostics (logger: DiagnosticsLogger) = Seq.iter ((<|) logger.DiagnosticSink) + + [] + let (|TaskCancelled|_|) (ex: exn) = + match ex with + | :? System.Threading.Tasks.TaskCanceledException as tce -> ValueSome tce + //| :? System.AggregateException as ae -> + // if ae.InnerExceptions |> Seq.forall (fun e -> e :? System.Threading.Tasks.TaskCanceledException) then + // ae.InnerExceptions |> Seq.tryHead |> Option.map (fun e -> e :?> System.Threading.Tasks.TaskCanceledException) + // else + // None + | _ -> ValueNone + +type internal StateUpdate<'TValue> = + | CancelRequest + | OriginatorCanceled + | JobCompleted of 'TValue * (PhasedDiagnostic * FSharpDiagnosticSeverity) list + | JobFailed of exn * (PhasedDiagnostic * FSharpDiagnosticSeverity) list + +type internal MemoizeReply<'TValue> = + | New of CancellationToken + | Existing of Task<'TValue> + +type internal MemoizeRequest<'TValue> = GetOrCompute of Async<'TValue> * CancellationToken + +[] +type internal Job<'TValue> = + | Running of TaskCompletionSource<'TValue> * CancellationTokenSource * Async<'TValue> * DateTime * ResizeArray + | Completed of 'TValue * (PhasedDiagnostic * FSharpDiagnosticSeverity) list + | Canceled of DateTime + | Failed of DateTime * exn // TODO: probably we don't need to keep this + + member this.DebuggerDisplay = + match this with + | Running(_, cts, _, ts, _) -> + let cancellation = + if cts.IsCancellationRequested then + " ! Cancellation Requested" + else + "" + + $"Running since {ts.ToShortTimeString()}{cancellation}" + | Completed(value, diags) -> $"Completed {value}" + (if diags.Length > 0 then $" ({diags.Length})" else "") + | Canceled _ -> "Canceled" + | Failed(_, ex) -> $"Failed {ex}" + +type internal JobEvent = + | Requested + | Started + | Restarted + | Finished + | Canceled + | Evicted + | Collected + | Weakened + | Strengthened + | Failed + | Cleared + +type internal ICacheKey<'TKey, 'TVersion> = + abstract member GetKey: unit -> 'TKey + abstract member GetVersion: unit -> 'TVersion + abstract member GetLabel: unit -> string + +[] +type Extensions = + + [] + static member internal WithExtraVersion(cacheKey: ICacheKey<_, _>, extraVersion) = + { new ICacheKey<_, _> with + member _.GetLabel() = cacheKey.GetLabel() + member _.GetKey() = cacheKey.GetKey() + member _.GetVersion() = cacheKey.GetVersion(), extraVersion + } + +type private KeyData<'TKey, 'TVersion> = + { + Label: string + Key: 'TKey + Version: 'TVersion + } + +type internal AsyncLock() = + + let semaphore = new SemaphoreSlim(1, 1) + + member _.Semaphore = semaphore + + member _.Do(f) = + task { + do! semaphore.WaitAsync() + + try + return! f () + finally + semaphore.Release() |> ignore + } + + interface IDisposable with + member _.Dispose() = semaphore.Dispose() + +type internal CachingDiagnosticsLogger(originalLogger: DiagnosticsLogger option) = + inherit DiagnosticsLogger($"CachingDiagnosticsLogger") + + let capturedDiagnostics = ResizeArray() + + override _.ErrorCount = + originalLogger + |> Option.map (fun x -> x.ErrorCount) + |> Option.defaultValue capturedDiagnostics.Count + + override _.DiagnosticSink(diagnostic: PhasedDiagnostic, severity: FSharpDiagnosticSeverity) = + originalLogger |> Option.iter (fun x -> x.DiagnosticSink(diagnostic, severity)) + capturedDiagnostics.Add(diagnostic, severity) + + member _.CapturedDiagnostics = capturedDiagnostics |> Seq.toList + +[] +type internal AsyncMemoize<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVersion: equality +#if !NO_CHECKNULLS + and 'TKey:not null + and 'TVersion:not null +#endif + > + (?keepStrongly, ?keepWeakly, ?name: string, ?cancelDuplicateRunningJobs: bool) = + + let name = defaultArg name "N/A" + let cancelDuplicateRunningJobs = defaultArg cancelDuplicateRunningJobs false + + let event = Event<_>() + + let mutable errors = 0 + let mutable hits = 0 + let mutable started = 0 + let mutable completed = 0 + let mutable canceled = 0 + let mutable restarted = 0 + let mutable failed = 0 + let mutable evicted = 0 + let mutable collected = 0 + let mutable strengthened = 0 + let mutable cleared = 0 + + let mutable updates_in_flight = 0 + + let mutable cancel_ct_registration_original = 0 + let mutable cancel_exception_original = 0 + let mutable cancel_original_processed = 0 + let mutable cancel_ct_registration_subsequent = 0 + let mutable cancel_exception_subsequent = 0 + let mutable cancel_subsequent_processed = 0 + + let failures = ResizeArray() + let mutable avgDurationMs = 0.0 + + let cache = + LruCache<'TKey, 'TVersion, Job<'TValue>>( + keepStrongly = defaultArg keepStrongly 100, + keepWeakly = defaultArg keepWeakly 200, + requiredToKeep = + (function + | Running _ -> true + | Job.Canceled at when at > DateTime.Now.AddMinutes -5.0 -> true + | Job.Failed(at, _) when at > DateTime.Now.AddMinutes -5.0 -> true + | _ -> false), + event = + (function + | CacheEvent.Evicted -> + (fun k -> + Interlocked.Increment &evicted |> ignore + event.Trigger(JobEvent.Evicted, k)) + | CacheEvent.Collected -> + (fun k -> + Interlocked.Increment &collected |> ignore + event.Trigger(JobEvent.Collected, k)) + | CacheEvent.Weakened -> (fun k -> event.Trigger(JobEvent.Weakened, k)) + | CacheEvent.Strengthened -> + (fun k -> + Interlocked.Increment &strengthened |> ignore + event.Trigger(JobEvent.Strengthened, k)) + | CacheEvent.Cleared -> + (fun k -> + Interlocked.Increment &cleared |> ignore + event.Trigger(JobEvent.Cleared, k))) + ) + + let requestCounts = Dictionary, int>() + let cancellationRegistrations = Dictionary<_, _>() + + let saveRegistration key registration = + cancellationRegistrations[key] <- + match cancellationRegistrations.TryGetValue key with + | true, registrations -> registration :: registrations + | _ -> [ registration ] + + let cancelRegistration key = + match cancellationRegistrations.TryGetValue key with + | true, registrations -> + for r: CancellationTokenRegistration in registrations do + r.Dispose() + + cancellationRegistrations.Remove key |> ignore + | _ -> () + + let incrRequestCount key = + requestCounts[key] <- + if requestCounts.ContainsKey key then + requestCounts[key] + 1 + else + 1 + + let decrRequestCount key = + if requestCounts.ContainsKey key then + requestCounts[key] <- requestCounts[key] - 1 + + let log (eventType, keyData: KeyData<_, _>) = + event.Trigger(eventType, (keyData.Label, keyData.Key, keyData.Version)) + + let lock = new AsyncLock() + + let processRequest post (key: KeyData<_, _>, msg) diagnosticLogger = + + lock.Do(fun () -> + task { + + let cached, otherVersions = cache.GetAll(key.Key, key.Version) + + let result = + match msg, cached with + | GetOrCompute _, Some(Completed(result, diags)) -> + Interlocked.Increment &hits |> ignore + diags |> replayDiagnostics diagnosticLogger + Existing(Task.FromResult result) + | GetOrCompute(_, ct), Some(Running(tcs, _, _, _, loggers)) -> + Interlocked.Increment &hits |> ignore + incrRequestCount key + + ct.Register(fun _ -> + let _name = name + Interlocked.Increment &cancel_ct_registration_subsequent |> ignore + post (key, CancelRequest)) + |> saveRegistration key + + loggers.Add diagnosticLogger + + Existing tcs.Task + + | GetOrCompute(computation, ct), None + | GetOrCompute(computation, ct), Some(Job.Canceled _) + | GetOrCompute(computation, ct), Some(Job.Failed _) -> + Interlocked.Increment &started |> ignore + incrRequestCount key + + ct.Register(fun _ -> + let _name = name + Interlocked.Increment &cancel_ct_registration_original |> ignore + post (key, OriginatorCanceled)) + |> saveRegistration key + + let cts = new CancellationTokenSource() + + cache.Set( + key.Key, + key.Version, + key.Label, + (Running( + TaskCompletionSource<'TValue>(TaskCreationOptions.RunContinuationsAsynchronously), + cts, + computation, + DateTime.Now, + ResizeArray() + )) + ) + + otherVersions + |> Seq.choose (function + | v, Running(_tcs, cts, _, _, _) -> Some(v, cts) + | _ -> None) + |> Seq.iter (fun (_v, cts) -> + use _ = Activity.start $"{name}: Duplicate running job" [| "key", key.Label |] + //System.Diagnostics.Trace.TraceWarning($"{name} Duplicate {key.Label}") + if cancelDuplicateRunningJobs then + //System.Diagnostics.Trace.TraceWarning("Canceling") + cts.Cancel()) + + New cts.Token + + log (Requested, key) + return result + }) + + let internalError key message = + let ex = exn (message) + failures.Add(key, ex) + Interlocked.Increment &errors |> ignore + // raise ex -- Suppose there's no need to raise here - where does it even go? + + let processStateUpdate post (key: KeyData<_, _>, action: StateUpdate<_>) = + lock.Do(fun () -> + task { + + let cached = cache.TryGet(key.Key, key.Version) + + match action, cached with + + | OriginatorCanceled, Some(Running(tcs, cts, computation, _, _)) -> + + Interlocked.Increment &cancel_original_processed |> ignore + + decrRequestCount key + + if requestCounts[key] < 1 then + cancelRegistration key + cts.Cancel() + tcs.TrySetCanceled() |> ignore + // Remember the job in case it completes after cancellation + cache.Set(key.Key, key.Version, key.Label, Job.Canceled DateTime.Now) + requestCounts.Remove key |> ignore + log (Canceled, key) + Interlocked.Increment &canceled |> ignore + use _ = Activity.start $"{name}: Canceled job" [| "key", key.Label |] + () + + else + // We need to restart the computation + Task.Run(fun () -> + Async.StartAsTask( + async { + + let cachingLogger = new CachingDiagnosticsLogger(None) + + try + // TODO: Should unify starting and restarting + log (Restarted, key) + Interlocked.Increment &restarted |> ignore + System.Diagnostics.Trace.TraceInformation $"{name} Restarted {key.Label}" + let currentLogger = DiagnosticsThreadStatics.DiagnosticsLogger + DiagnosticsThreadStatics.DiagnosticsLogger <- cachingLogger + + try + let! result = computation + post (key, (JobCompleted(result, cachingLogger.CapturedDiagnostics))) + return () + finally + DiagnosticsThreadStatics.DiagnosticsLogger <- currentLogger + with + | TaskCancelled _ -> + Interlocked.Increment &cancel_exception_subsequent |> ignore + post (key, CancelRequest) + () + | ex -> post (key, (JobFailed(ex, cachingLogger.CapturedDiagnostics))) + } + ), + cts.Token) + |> ignore + + | CancelRequest, Some(Running(tcs, cts, _c, _, _)) -> + + Interlocked.Increment &cancel_subsequent_processed |> ignore + + decrRequestCount key + + if requestCounts[key] < 1 then + cancelRegistration key + cts.Cancel() + tcs.TrySetCanceled() |> ignore + // Remember the job in case it completes after cancellation + cache.Set(key.Key, key.Version, key.Label, Job.Canceled DateTime.Now) + requestCounts.Remove key |> ignore + log (Canceled, key) + Interlocked.Increment &canceled |> ignore + use _ = Activity.start $"{name}: Canceled job" [| "key", key.Label |] + () + + // Probably in some cases cancellation can be fired off even after we just unregistered it + | CancelRequest, None + | CancelRequest, Some(Completed _) + | CancelRequest, Some(Job.Canceled _) + | CancelRequest, Some(Job.Failed _) + | OriginatorCanceled, None + | OriginatorCanceled, Some(Completed _) + | OriginatorCanceled, Some(Job.Canceled _) + | OriginatorCanceled, Some(Job.Failed _) -> () + + | JobFailed(ex, diags), Some(Running(tcs, _cts, _c, _ts, loggers)) -> + cancelRegistration key + cache.Set(key.Key, key.Version, key.Label, Job.Failed(DateTime.Now, ex)) + requestCounts.Remove key |> ignore + log (Failed, key) + Interlocked.Increment &failed |> ignore + failures.Add(key.Label, ex) + + for logger in loggers do + diags |> replayDiagnostics logger + + tcs.TrySetException ex |> ignore + + | JobCompleted(result, diags), Some(Running(tcs, _cts, _c, started, loggers)) -> + cancelRegistration key + cache.Set(key.Key, key.Version, key.Label, (Completed(result, diags))) + requestCounts.Remove key |> ignore + log (Finished, key) + Interlocked.Increment &completed |> ignore + let duration = float (DateTime.Now - started).Milliseconds + + avgDurationMs <- + if completed < 2 then + duration + else + avgDurationMs + (duration - avgDurationMs) / float completed + + for logger in loggers do + diags |> replayDiagnostics logger + + if tcs.TrySetResult result = false then + internalError key.Label "Invalid state: Completed job already completed" + + // Sometimes job can be canceled but it still manages to complete (or fail) + | JobFailed _, Some(Job.Canceled _) + | JobCompleted _, Some(Job.Canceled _) -> () + + // Job can't be evicted from cache while it's running because then subsequent requesters would be waiting forever + | JobFailed _, None -> internalError key.Label "Invalid state: Running job missing in cache (failed)" + + | JobCompleted _, None -> internalError key.Label "Invalid state: Running job missing in cache (completed)" + + | JobFailed(ex, _diags), Some(Completed(_job, _diags2)) -> + internalError key.Label $"Invalid state: Failed Completed job \n%A{ex}" + + | JobCompleted(_result, _diags), Some(Completed(_job, _diags2)) -> + internalError key.Label "Invalid state: Double-Completed job" + + | JobFailed(ex, _diags), Some(Job.Failed(_, ex2)) -> + internalError key.Label $"Invalid state: Double-Failed job \n%A{ex} \n%A{ex2}" + + | JobCompleted(_result, _diags), Some(Job.Failed(_, ex2)) -> + internalError key.Label $"Invalid state: Completed Failed job \n%A{ex2}" + }) + + let rec post msg = + Interlocked.Increment &updates_in_flight |> ignore + backgroundTask { + do! processStateUpdate post msg + Interlocked.Decrement &updates_in_flight |> ignore + } + |> ignore + + member this.Get'(key, computation) = + + let wrappedKey = + { new ICacheKey<_, _> with + member _.GetKey() = key + member _.GetVersion() = Unchecked.defaultof<_> + member _.GetLabel() = match key.ToString() with | null -> "" | s -> s + } + + this.Get(wrappedKey, computation) + + member _.Get(key: ICacheKey<_, _>, computation) = + + let key = + { + Label = key.GetLabel() + Key = key.GetKey() + Version = key.GetVersion() + } + + async { + let! ct = Async.CancellationToken + + let callerDiagnosticLogger = DiagnosticsThreadStatics.DiagnosticsLogger + + match! + processRequest post (key, GetOrCompute(computation, ct)) callerDiagnosticLogger + |> Async.AwaitTask + with + | New internalCt -> + + let linkedCtSource = CancellationTokenSource.CreateLinkedTokenSource(ct, internalCt) + let cachingLogger = new CachingDiagnosticsLogger(Some callerDiagnosticLogger) + + try + return! + Async.StartAsTask( + async { + // TODO: Should unify starting and restarting + let currentLogger = DiagnosticsThreadStatics.DiagnosticsLogger + DiagnosticsThreadStatics.DiagnosticsLogger <- cachingLogger + + log (Started, key) + + try + let! result = computation + post (key, (JobCompleted(result, cachingLogger.CapturedDiagnostics))) + return result + finally + DiagnosticsThreadStatics.DiagnosticsLogger <- currentLogger + }, + cancellationToken = linkedCtSource.Token + ) + |> Async.AwaitTask + with + | TaskCancelled ex -> + // TODO: do we need to do anything else here? Presumably it should be done by the registration on + // the cancellation token or before we triggered our own cancellation + + // Let's send this again just in case. It seems sometimes it's not triggered from the registration? + + Interlocked.Increment &cancel_exception_original |> ignore + + post (key, (OriginatorCanceled)) + return raise ex + | ex -> + post (key, (JobFailed(ex, cachingLogger.CapturedDiagnostics))) + return raise ex + + | Existing job -> return! job |> Async.AwaitTask + + } + + member _.TryGet(key: 'TKey, predicate: 'TVersion -> bool) : 'TValue option = + let versionsAndJobs = cache.GetAll(key) + + versionsAndJobs + |> Seq.tryPick (fun (version, job) -> + match predicate version, job with + | true, Completed(completed, _) -> Some completed + | _ -> None) + + member _.Clear() = cache.Clear() + + member _.Clear predicate = cache.Clear predicate + + member val Event = event.Publish + + member this.OnEvent = this.Event.Add + + member _.Count = lock.Do(fun () -> Task.FromResult cache.Count).Result + + member _.Updating = updates_in_flight > 0 + + member _.Locked = lock.Semaphore.CurrentCount < 1 + + member _.Running = + cache.GetValues() + |> Seq.filter (function + | _, _, Running _ -> true + | _ -> false) + |> Seq.toArray + + member this.DebuggerDisplay = + let locked = if this.Locked then " [LOCKED]" else "" + + let valueStats = + cache.GetValues() + |> Seq.countBy (function + | _, _, Running _ -> "Running" + | _, _, Completed _ -> "Completed" + | _, _, Job.Canceled _ -> "Canceled" + | _, _, Job.Failed _ -> "Failed") + |> Map + + let running = + valueStats.TryFind "Running" + |> Option.map (sprintf " Running: %d ") + |> Option.defaultValue "" + + let avgDuration = avgDurationMs |> sprintf "| Avg: %.0f ms" + + let hitRatio = + if started > 0 then + $" (%.0f{float hits / (float (started + hits)) * 100.0} %%)" + else + "" + + let stats = + [| + if errors + failed > 0 then + " (_!_) " + if errors > 0 then $"| ERRORS: {errors} " else "" + if failed > 0 then $"| FAILED: {failed} " else "" + $"| hits: {hits}{hitRatio} " + if started > 0 then $"| started: {started} " else "" + if completed > 0 then $"| completed: {completed} " else "" + if canceled > 0 then $"| canceled: {canceled} " else "" + if restarted > 0 then $"| restarted: {restarted} " else "" + if evicted > 0 then $"| evicted: {evicted} " else "" + if collected > 0 then $"| collected: {collected} " else "" + if cleared > 0 then $"| cleared: {cleared} " else "" + if strengthened > 0 then + $"| strengthened: {strengthened} " + else + "" + |] + |> String.concat "" + + $"{locked}{running}{cache.DebuggerDisplay} {stats}{avgDuration}" + +/// A drop-in replacement for AsyncMemoize that disables caching and just runs the computation every time. +[] +type internal AsyncMemoizeDisabled<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVersion: equality> + (?keepStrongly, ?keepWeakly, ?name: string, ?cancelDuplicateRunningJobs: bool) = + + do ignore (keepStrongly, keepWeakly, name, cancelDuplicateRunningJobs) + + let mutable requests = 0 + + member _.Get(_key: ICacheKey<_, _>, computation) = + Interlocked.Increment &requests |> ignore + computation + + member _.DebuggerDisplay = $"(disabled) requests: {requests}" diff --git a/src/fcs-fable/src/Compiler/Facilities/AsyncMemoize.fsi b/src/fcs-fable/src/Compiler/Facilities/AsyncMemoize.fsi new file mode 100644 index 0000000000..d86352d998 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Facilities/AsyncMemoize.fsi @@ -0,0 +1,95 @@ +namespace Internal.Utilities.Collections + +open System.Threading.Tasks +open FSharp.Compiler.BuildGraph + +[] +module internal Utils = + + /// Return file name with one directory above it + val shortPath: path: string -> string + + [] + val (|TaskCancelled|_|): ex: exn -> TaskCanceledException voption + +type internal JobEvent = + | Requested + | Started + | Restarted + | Finished + | Canceled + | Evicted + | Collected + | Weakened + | Strengthened + | Failed + | Cleared + +type internal ICacheKey<'TKey, 'TVersion> = + + abstract GetKey: unit -> 'TKey + + abstract GetLabel: unit -> string + + abstract GetVersion: unit -> 'TVersion + +[] +type Extensions = + + [] + static member internal WithExtraVersion: cacheKey: ICacheKey<'a, 'b> * extraVersion: 'c -> ICacheKey<'a, ('b * 'c)> + +type internal AsyncLock = + interface System.IDisposable + + new: unit -> AsyncLock + + member Do: f: (unit -> #Task<'b>) -> Task<'b> + +/// +/// A cache/memoization for computations that makes sure that the same computation will only be computed once even if it's needed +/// at multiple places/times. +/// +/// Strongly holds at most one result per key. +/// +type internal AsyncMemoize<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVersion: equality +#if !NO_CHECKNULLS + and 'TKey:not null + and 'TVersion:not null +#endif + > = + + /// Maximum number of strongly held results to keep in the cache + /// Maximum number of weakly held results to keep in the cache + /// Name of the cache - used in tracing messages + /// If true, when a job is started, all other jobs with the same key will be canceled. + new: + ?keepStrongly: int * ?keepWeakly: int * ?name: string * ?cancelDuplicateRunningJobs: bool -> + AsyncMemoize<'TKey, 'TVersion, 'TValue> + + member Clear: unit -> unit + + member Clear: predicate: ('TKey -> bool) -> unit + + member Get: key: ICacheKey<'TKey, 'TVersion> * computation: Async<'TValue> -> Async<'TValue> + + member Get': key: 'TKey * computation: Async<'TValue> -> Async<'TValue> + + member TryGet: key: 'TKey * predicate: ('TVersion -> bool) -> 'TValue option + + member Event: IEvent + + member OnEvent: ((JobEvent * (string * 'TKey * 'TVersion) -> unit) -> unit) + + member Count: int + + member Updating: bool + +/// A drop-in replacement for AsyncMemoize that disables caching and just runs the computation every time. +type internal AsyncMemoizeDisabled<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVersion: equality> = + + new: + ?keepStrongly: obj * ?keepWeakly: obj * ?name: string * ?cancelDuplicateRunningJobs: bool -> + AsyncMemoizeDisabled<'TKey, 'TVersion, 'TValue> + + member Get: _key: ICacheKey<'a, 'b> * computation: 'c -> 'c diff --git a/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fs b/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fs index 556dd21085..a0291b7dfc 100644 --- a/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fs +++ b/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fs @@ -2,209 +2,12 @@ module FSharp.Compiler.BuildGraph -open System open System.Threading open System.Threading.Tasks -open System.Diagnostics open System.Globalization -open FSharp.Compiler.DiagnosticsLogger -open Internal.Utilities.Library - -[] -type NodeCode<'T> = Node of Async<'T> #if !FABLE_COMPILER -let wrapThreadStaticInfo computation = - async { - let diagnosticsLogger = DiagnosticsThreadStatics.DiagnosticsLogger - let phase = DiagnosticsThreadStatics.BuildPhase - let ct = Cancellable.Token - - try - return! computation - finally - DiagnosticsThreadStatics.DiagnosticsLogger <- diagnosticsLogger - DiagnosticsThreadStatics.BuildPhase <- phase - Cancellable.Token <- ct - } - -type Async<'T> with - - static member AwaitNodeCode(node: NodeCode<'T>) = - match node with - | Node(computation) -> wrapThreadStaticInfo computation - -[] -type NodeCodeBuilder() = - - static let zero = Node(async.Zero()) - - [] - member _.Zero() : NodeCode = zero - - [] - member _.Delay(f: unit -> NodeCode<'T>) = - Node( - async.Delay(fun () -> - match f () with - | Node(p) -> p) - ) - - [] - member _.Return value = Node(async.Return(value)) - - [] - member _.ReturnFrom(computation: NodeCode<_>) = computation - - [] - member _.Bind(Node(p): NodeCode<'a>, binder: 'a -> NodeCode<'b>) : NodeCode<'b> = - Node( - async.Bind( - p, - fun x -> - match binder x with - | Node p -> p - ) - ) - - [] - member _.TryWith(Node(p): NodeCode<'T>, binder: exn -> NodeCode<'T>) : NodeCode<'T> = - Node( - async.TryWith( - p, - fun ex -> - match binder ex with - | Node p -> p - ) - ) - - [] - member _.TryFinally(Node(p): NodeCode<'T>, binder: unit -> unit) : NodeCode<'T> = Node(async.TryFinally(p, binder)) - - [] - member _.For(xs: 'T seq, binder: 'T -> NodeCode) : NodeCode = - Node( - async.For( - xs, - fun x -> - match binder x with - | Node p -> p - ) - ) - - [] - member _.Combine(Node(p1): NodeCode, Node(p2): NodeCode<'T>) : NodeCode<'T> = Node(async.Combine(p1, p2)) - - [] - member _.Using(value: CompilationGlobalsScope, binder: CompilationGlobalsScope -> NodeCode<'U>) = - Node( - async { - DiagnosticsThreadStatics.DiagnosticsLogger <- value.DiagnosticsLogger - DiagnosticsThreadStatics.BuildPhase <- value.BuildPhase - - try - return! binder value |> Async.AwaitNodeCode - finally - (value :> IDisposable).Dispose() - } - ) - - [] - member _.Using(value: IDisposable, binder: IDisposable -> NodeCode<'U>) = - Node( - async { - use _ = value - return! binder value |> Async.AwaitNodeCode - } - ) - -let node = NodeCodeBuilder() - -[] -type NodeCode private () = - - static let cancellationToken = Node(wrapThreadStaticInfo Async.CancellationToken) - - static member RunImmediate(computation: NodeCode<'T>, ct: CancellationToken) = - let diagnosticsLogger = DiagnosticsThreadStatics.DiagnosticsLogger - let phase = DiagnosticsThreadStatics.BuildPhase - let ct2 = Cancellable.Token - - try - try - let work = - async { - DiagnosticsThreadStatics.DiagnosticsLogger <- diagnosticsLogger - DiagnosticsThreadStatics.BuildPhase <- phase - Cancellable.Token <- ct2 - return! computation |> Async.AwaitNodeCode - } - - Async.StartImmediateAsTask(work, cancellationToken = ct).Result - finally - DiagnosticsThreadStatics.DiagnosticsLogger <- diagnosticsLogger - DiagnosticsThreadStatics.BuildPhase <- phase - Cancellable.Token <- ct2 - with :? AggregateException as ex when ex.InnerExceptions.Count = 1 -> - raise (ex.InnerExceptions[0]) - - static member RunImmediateWithoutCancellation(computation: NodeCode<'T>) = - NodeCode.RunImmediate(computation, CancellationToken.None) - - static member StartAsTask_ForTesting(computation: NodeCode<'T>, ?ct: CancellationToken) = - let diagnosticsLogger = DiagnosticsThreadStatics.DiagnosticsLogger - let phase = DiagnosticsThreadStatics.BuildPhase - let ct2 = Cancellable.Token - - try - let work = - async { - DiagnosticsThreadStatics.DiagnosticsLogger <- diagnosticsLogger - DiagnosticsThreadStatics.BuildPhase <- phase - Cancellable.Token <- ct2 - return! computation |> Async.AwaitNodeCode - } - - Async.StartAsTask(work, cancellationToken = defaultArg ct CancellationToken.None) - finally - DiagnosticsThreadStatics.DiagnosticsLogger <- diagnosticsLogger - DiagnosticsThreadStatics.BuildPhase <- phase - Cancellable.Token <- ct2 - - static member CancellationToken = cancellationToken - - static member FromCancellable(computation: Cancellable<'T>) = - Node(wrapThreadStaticInfo (Cancellable.toAsync computation)) - - static member AwaitAsync(computation: Async<'T>) = Node(wrapThreadStaticInfo computation) - - static member AwaitTask(task: Task<'T>) = - Node(wrapThreadStaticInfo (Async.AwaitTask task)) - - static member AwaitTask(task: Task) = - Node(wrapThreadStaticInfo (Async.AwaitTask task)) - - static member AwaitWaitHandle_ForTesting(waitHandle: WaitHandle) = - Node(wrapThreadStaticInfo (Async.AwaitWaitHandle(waitHandle))) - - static member Sleep(ms: int) = - Node(wrapThreadStaticInfo (Async.Sleep(ms))) - - static member Sequential(computations: NodeCode<'T> seq) = - node { - let results = ResizeArray() - - for computation in computations do - let! res = computation - results.Add(res) - - return results.ToArray() - } - - static member Parallel(computations: NodeCode<'T> seq) = - computations |> Seq.map (fun (Node x) -> x) |> Async.Parallel |> Node - [] module GraphNode = @@ -216,21 +19,17 @@ module GraphNode = match preferredUiLang with | Some s -> culture <- CultureInfo s -#if FX_RESHAPED_GLOBALIZATION - CultureInfo.CurrentUICulture <- culture -#else Thread.CurrentThread.CurrentUICulture <- culture -#endif | None -> () [] -type GraphNode<'T> private (computation: NodeCode<'T>, cachedResult: ValueOption<'T>, cachedResultNode: NodeCode<'T>) = +type GraphNode<'T> private (computation: Async<'T>, cachedResult: ValueOption<'T>, cachedResultNode: Async<'T>) = let mutable computation = computation let mutable requestCount = 0 let mutable cachedResult = cachedResult - let mutable cachedResultNode: NodeCode<'T> = cachedResultNode + let mutable cachedResultNode: Async<'T> = cachedResultNode let isCachedResultNodeNotNull () = not (obj.ReferenceEquals(cachedResultNode, null)) @@ -242,11 +41,11 @@ type GraphNode<'T> private (computation: NodeCode<'T>, cachedResult: ValueOption if isCachedResultNodeNotNull () then cachedResultNode else - node { + async { Interlocked.Increment(&requestCount) |> ignore try - let! ct = NodeCode.CancellationToken + let! ct = Async.CancellationToken // We must set 'taken' before any implicit cancellation checks // occur, making sure we are under the protection of the 'try'. @@ -265,22 +64,21 @@ type GraphNode<'T> private (computation: NodeCode<'T>, cachedResult: ValueOption ||| TaskContinuationOptions.NotOnFaulted ||| TaskContinuationOptions.ExecuteSynchronously) ) - |> NodeCode.AwaitTask + |> Async.AwaitTask match cachedResult with | ValueSome value -> return value | _ -> let tcs = TaskCompletionSource<'T>() - let (Node(p)) = computation Async.StartWithContinuations( async { Thread.CurrentThread.CurrentUICulture <- GraphNode.culture - return! p + return! computation }, (fun res -> cachedResult <- ValueSome res - cachedResultNode <- node.Return res + cachedResultNode <- async.Return res computation <- Unchecked.defaultof<_> tcs.SetResult(res)), (fun ex -> tcs.SetException(ex)), @@ -288,7 +86,7 @@ type GraphNode<'T> private (computation: NodeCode<'T>, cachedResult: ValueOption ct ) - return! tcs.Task |> NodeCode.AwaitTask + return! tcs.Task |> Async.AwaitTask finally if taken then semaphore.Release() |> ignore @@ -303,7 +101,7 @@ type GraphNode<'T> private (computation: NodeCode<'T>, cachedResult: ValueOption member _.IsComputing = requestCount > 0 static member FromResult(result: 'T) = - let nodeResult = node.Return result + let nodeResult = async.Return result GraphNode(nodeResult, ValueSome result, nodeResult) new(computation) = GraphNode(computation, ValueNone, Unchecked.defaultof<_>) diff --git a/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fsi b/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fsi index 3cc8220429..c06c61ac82 100644 --- a/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fsi +++ b/src/fcs-fable/src/Compiler/Facilities/BuildGraph.fsi @@ -2,92 +2,8 @@ module internal FSharp.Compiler.BuildGraph -open System -open System.Diagnostics -open System.Threading -open System.Threading.Tasks -open FSharp.Compiler.DiagnosticsLogger -open Internal.Utilities.Library - -/// Represents code that can be run as part of the build graph. -/// -/// This is essentially cancellable async code where the only asynchronous waits are on nodes. -/// When a node is evaluated the evaluation is run synchronously on the thread of the -/// first requestor. -[] -type NodeCode<'T> - #if !FABLE_COMPILER -type Async<'T> with - - /// Asynchronously await code in the build graph - static member AwaitNodeCode: node: NodeCode<'T> -> Async<'T> - -/// A standard builder for node code. -[] -type NodeCodeBuilder = - - member Bind: NodeCode<'T> * ('T -> NodeCode<'U>) -> NodeCode<'U> - - member Zero: unit -> NodeCode - - member Delay: (unit -> NodeCode<'T>) -> NodeCode<'T> - - member Return: 'T -> NodeCode<'T> - - member ReturnFrom: NodeCode<'T> -> NodeCode<'T> - - member TryWith: NodeCode<'T> * (exn -> NodeCode<'T>) -> NodeCode<'T> - - member TryFinally: NodeCode<'T> * (unit -> unit) -> NodeCode<'T> - - member For: xs: 'T seq * binder: ('T -> NodeCode) -> NodeCode - - member Combine: x1: NodeCode * x2: NodeCode<'T> -> NodeCode<'T> - - /// A limited form 'use' for establishing the compilation globals. - member Using: CompilationGlobalsScope * (CompilationGlobalsScope -> NodeCode<'T>) -> NodeCode<'T> - - /// A generic 'use' that disposes of the IDisposable at the end of the computation. - member Using: IDisposable * (IDisposable -> NodeCode<'T>) -> NodeCode<'T> - -/// Specifies code that can be run as part of the build graph. -val node: NodeCodeBuilder - -/// Contains helpers to specify code that can be run as part of the build graph. -[] -type NodeCode = - - /// Only used for testing, do not use - static member RunImmediate: computation: NodeCode<'T> * ct: CancellationToken -> 'T - - /// Used in places where we don't care about cancellation, e.g. the command line compiler - /// and F# Interactive - static member RunImmediateWithoutCancellation: computation: NodeCode<'T> -> 'T - - static member CancellationToken: NodeCode - - static member Sequential: computations: NodeCode<'T> seq -> NodeCode<'T[]> - - static member Parallel: computations: (NodeCode<'T> seq) -> NodeCode<'T[]> - - static member AwaitAsync: computation: Async<'T> -> NodeCode<'T> - - static member AwaitTask: task: Task<'T> -> NodeCode<'T> - - static member AwaitTask: task: Task -> NodeCode - - /// Execute the cancellable computation synchronously using the ambient cancellation token of - /// the NodeCode. - static member FromCancellable: computation: Cancellable<'T> -> NodeCode<'T> - - /// Only used for testing, do not use - static member StartAsTask_ForTesting: computation: NodeCode<'T> * ?ct: CancellationToken -> Task<'T> - - /// Only used for testing, do not use - static member AwaitWaitHandle_ForTesting: waitHandle: WaitHandle -> NodeCode - /// Contains helpers related to the build graph [] module internal GraphNode = @@ -104,7 +20,7 @@ module internal GraphNode = type internal GraphNode<'T> = /// - computation - The computation code to run. - new: computation: NodeCode<'T> -> GraphNode<'T> + new: computation: Async<'T> -> GraphNode<'T> /// Creates a GraphNode with given result already cached. static member FromResult: 'T -> GraphNode<'T> @@ -112,7 +28,7 @@ type internal GraphNode<'T> = /// Return NodeCode which, when executed, will get the value of the computation if already computed, or /// await an existing in-progress computation for the node if one exists, or else will synchronously /// start the computation on the current thread. - member GetOrComputeValue: unit -> NodeCode<'T> + member GetOrComputeValue: unit -> Async<'T> /// Return 'Some' if the computation has already been computed, else None if /// the computation is in-progress or has not yet been started. diff --git a/src/fcs-fable/src/Compiler/Facilities/CompilerLocation.fs b/src/fcs-fable/src/Compiler/Facilities/CompilerLocation.fs index fa49445b76..9cd20c1863 100644 --- a/src/fcs-fable/src/Compiler/Facilities/CompilerLocation.fs +++ b/src/fcs-fable/src/Compiler/Facilities/CompilerLocation.fs @@ -8,6 +8,7 @@ open System.IO open System.Reflection open System.Runtime.InteropServices open Microsoft.FSharp.Core +open Internal.Utilities.Library #nowarn "44" // ConfigurationSettings is obsolete but the new stuff is horribly complicated. @@ -23,13 +24,15 @@ module internal FSharpEnvironment = let FSharpProductName = UtilsStrings.SR.buildProductName (FSharpBannerVersion) - let versionOf<'t> = typeof<'t>.Assembly.GetName().Version.ToString() + let versionOf<'t> : MaybeNull = + match typeof<'t>.Assembly.GetName().Version with + | null -> null + | v -> v.ToString() let FSharpCoreLibRunningVersion = try match versionOf with - | null -> None - | "" -> None + | s when String.IsNullOrEmpty(s) -> None | s -> Some(s) with _ -> None @@ -41,8 +44,9 @@ module internal FSharpEnvironment = let FSharpBinaryMetadataFormatRevision = "2.0.0.0" let isRunningOnCoreClr = - typeof.Assembly.FullName - .StartsWith("System.Private.CoreLib", StringComparison.InvariantCultureIgnoreCase) + match typeof.Assembly.FullName with + | null -> false + | name -> name.StartsWith("System.Private.CoreLib", StringComparison.InvariantCultureIgnoreCase) module Option = /// Convert string into Option string where null and String.Empty result in None @@ -70,7 +74,7 @@ module internal FSharpEnvironment = try // We let you set FSHARP_COMPILER_BIN. I've rarely seen this used and its not documented in the install instructions. match Environment.GetEnvironmentVariable("FSHARP_COMPILER_BIN") with - | result when not (String.IsNullOrWhiteSpace result) -> Some result + | result when not (String.IsNullOrWhiteSpace result) -> Some !!result | _ -> let safeExists f = (try @@ -84,7 +88,8 @@ module internal FSharpEnvironment = | _ -> let fallback () = let d = Assembly.GetExecutingAssembly() - Some(Path.GetDirectoryName d.Location) + + Some(!! Path.GetDirectoryName(d.Location)) match tryCurrentDomain () with | None -> fallback () @@ -119,6 +124,7 @@ module internal FSharpEnvironment = |] elif typeof.Assembly.GetName().Name = "System.Private.CoreLib" then [| + "net9.0" "net8.0" "net7.0" "net6.0" @@ -184,8 +190,8 @@ module internal FSharpEnvironment = | None -> () | Some(p: string) -> match Path.GetDirectoryName(p) with - | s when s = "" || isNull s || Path.GetFileName(p) = "packages" || s = p -> () - | parentDir -> yield! searchParentDirChain (Some parentDir) assemblyName + | s when String.IsNullOrEmpty(s) || Path.GetFileName(p) = "packages" || s = p -> () + | parentDir -> yield! searchParentDirChain (Option.ofObj parentDir) assemblyName for p in searchToolPaths path compilerToolPaths do let fileName = Path.Combine(p, assemblyName) @@ -196,7 +202,9 @@ module internal FSharpEnvironment = let loadFromParentDirRelativeToRuntimeAssemblyLocation designTimeAssemblyName = let runTimeAssemblyPath = Path.GetDirectoryName runTimeAssemblyFileName - let paths = searchParentDirChain (Some runTimeAssemblyPath) designTimeAssemblyName + + let paths = + searchParentDirChain (Option.ofObj runTimeAssemblyPath) designTimeAssemblyName paths |> Seq.tryHead @@ -204,7 +212,7 @@ module internal FSharpEnvironment = | Some res -> loadFromLocation res | None -> // The search failed, just load from the first location and report an error - let runTimeAssemblyPath = Path.GetDirectoryName runTimeAssemblyFileName + let runTimeAssemblyPath = !! Path.GetDirectoryName(runTimeAssemblyFileName) loadFromLocation (Path.Combine(runTimeAssemblyPath, designTimeAssemblyName)) if designTimeAssemblyName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) then @@ -215,9 +223,9 @@ module internal FSharpEnvironment = // design-time DLLs specified using "x.DesignTIme, Version= ..." long assembly names and GAC loads. // These kind of design-time assembly specifications are no longer used to our knowledge so that comparison is basically legacy // and will always succeed. - let name = AssemblyName(Path.GetFileNameWithoutExtension designTimeAssemblyName) + let name = AssemblyName(!! Path.GetFileNameWithoutExtension(designTimeAssemblyName)) - if name.Name.Equals(name.FullName, StringComparison.OrdinalIgnoreCase) then + if name.FullName.Equals(name.Name, StringComparison.OrdinalIgnoreCase) then let designTimeFileName = designTimeAssemblyName + ".dll" loadFromParentDirRelativeToRuntimeAssemblyLocation designTimeFileName else @@ -237,7 +245,8 @@ module internal FSharpEnvironment = let getFSharpCompilerLocationWithDefaultFromType (defaultLocation: Type) = let location = try - Some(Path.GetDirectoryName(defaultLocation.Assembly.Location)) + let directory = Path.GetDirectoryName(defaultLocation.Assembly.Location) + Option.ofObj (directory) with _ -> None @@ -266,7 +275,7 @@ module internal FSharpEnvironment = // Must be alongside the location of FSharp.CompilerService.dll let getDefaultFsiLibraryLocation () = - Path.Combine(Path.GetDirectoryName(getFSharpCompilerLocation ()), fsiLibraryName + ".dll") + Path.Combine(!! Path.GetDirectoryName(getFSharpCompilerLocation ()), fsiLibraryName + ".dll") let isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) @@ -286,7 +295,7 @@ module internal FSharpEnvironment = if String.IsNullOrEmpty(pf) then Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) else - pf + !!pf let candidate = Path.Combine(pf, "dotnet", dotnet) @@ -311,20 +320,23 @@ module internal FSharpEnvironment = let probePathForDotnetHost () = let paths = let p = Environment.GetEnvironmentVariable("PATH") - if not (isNull p) then p.Split(Path.PathSeparator) else [||] + + match p with + | null -> [||] + | p -> p.Split(Path.PathSeparator) paths |> Array.tryFind (fun f -> fileExists (Path.Combine(f, dotnet))) match (Environment.GetEnvironmentVariable("DOTNET_HOST_PATH")) with // Value set externally - | value when not (String.IsNullOrEmpty(value)) && fileExists value -> Some value + | NonEmptyString value when fileExists value -> Some value | _ -> // Probe for netsdk install, dotnet. and dotnet.exe is a constant offset from the location of System.Int32 let candidate = let assemblyLocation = Path.GetDirectoryName(typeof.GetTypeInfo().Assembly.Location) - Path.GetFullPath(Path.Combine(assemblyLocation, "..", "..", "..", dotnet)) + Path.GetFullPath(Path.Combine(!!assemblyLocation, "..", "..", "..", dotnet)) if fileExists candidate then Some candidate @@ -342,12 +354,12 @@ module internal FSharpEnvironment = [| match getDotnetHostPath (), getDotnetGlobalHostPath () with | Some hostPath, Some globalHostPath -> - yield Path.GetDirectoryName(hostPath) + yield !! Path.GetDirectoryName(hostPath) if isDotnetMultilevelLookup && hostPath <> globalHostPath then - yield Path.GetDirectoryName(globalHostPath) - | Some hostPath, None -> yield Path.GetDirectoryName(hostPath) - | None, Some globalHostPath -> yield Path.GetDirectoryName(globalHostPath) + yield !! Path.GetDirectoryName(globalHostPath) + | Some hostPath, None -> yield !! Path.GetDirectoryName(hostPath) + | None, Some globalHostPath -> yield !! Path.GetDirectoryName(globalHostPath) | None, None -> () |] diff --git a/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fs b/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fs index 15e8db0159..2a3a6ffe74 100644 --- a/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fs +++ b/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -// This file contains simple types related to diagnsotics that are made public in the +// This file contains simple types related to diagnostics that are made public in the // FSharp.Compiler.Service API but which are also used throughout the // F# compiler. namespace FSharp.Compiler.Diagnostics diff --git a/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fsi b/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fsi index 6cbde1eb0b..8ff6b3d2f8 100644 --- a/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fsi +++ b/src/fcs-fable/src/Compiler/Facilities/DiagnosticOptions.fsi @@ -1,6 +1,6 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -// This file contains simple types related to diagnsotics that are made public in the +// This file contains simple types related to diagnostics that are made public in the // FSharp.Compiler.Service API but which are also used throughout the // F# compiler. diff --git a/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fs b/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fs index 643f9c022d..a92734b0a3 100644 --- a/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fs +++ b/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fs @@ -11,17 +11,21 @@ open System open System.Diagnostics open System.Reflection open System.Threading +open System.Runtime.CompilerServices +open System.Runtime.InteropServices open Internal.Utilities.Library open Internal.Utilities.Library.Extras +open System.Threading.Tasks /// Represents the style being used to format errors -[] +[] type DiagnosticStyle = | Default | Emacs | Test | VisualStudio | Gcc + | Rich /// Thrown when we want to add some range information to a .NET exception exception WrappedError of exn * range with @@ -66,10 +70,11 @@ exception StopProcessingExn of exn option with | StopProcessingExn(Some exn) -> "StopProcessingExn, originally (" + exn.ToString() + ")" | _ -> "StopProcessingExn" +[] let (|StopProcessing|_|) exn = match exn with - | StopProcessingExn _ -> Some() - | _ -> None + | StopProcessingExn _ -> ValueSome() + | _ -> ValueNone let StopProcessing<'T> = StopProcessingExn None @@ -173,7 +178,7 @@ let rec AttachRange m (exn: exn) = match exn with #if !FABLE_COMPILER // Strip TargetInvocationException wrappers - | :? TargetInvocationException -> AttachRange m exn.InnerException + | :? TargetInvocationException as e when isNotNull e.InnerException -> AttachRange m !!exn.InnerException #endif | UnresolvedReferenceNoRange a -> UnresolvedReferenceError(a, m) | UnresolvedPathReferenceNoRange(a, p) -> UnresolvedPathReference(a, p, m) @@ -223,6 +228,20 @@ type BuildPhase = | Output | Interactive // An error seen during interactive execution + override this.ToString() = + match this with + | DefaultPhase -> nameof DefaultPhase + | Compile -> nameof Compile + | Parameter -> nameof Parameter + | Parse -> nameof Parse + | TypeCheck -> nameof TypeCheck + | CodeGen -> nameof CodeGen + | Optimize -> nameof Optimize + | IlxGen -> nameof IlxGen + | IlGen -> nameof IlGen + | Output -> nameof Output + | Interactive -> nameof Interactive + /// Literal build phase subcategory strings. module BuildPhaseSubcategory = [] @@ -339,6 +358,9 @@ type DiagnosticsLogger(nameForDebugging: string) = member x.CheckForErrors() = (x.ErrorCount > 0) + abstract CheckForRealErrorsIgnoringWarnings: bool + default x.CheckForRealErrorsIgnoringWarnings = x.CheckForErrors() + member _.DebugDisplay() = sprintf "DiagnosticsLogger(%s)" nameForDebugging @@ -380,29 +402,19 @@ type CapturingDiagnosticsLogger(nm, ?eagerFormat) = let errors = diagnostics.ToArray() errors |> Array.iter diagnosticsLogger.DiagnosticSink -/// Type holds thread-static globals for use by the compile. -type internal DiagnosticsThreadStatics = - [] - static val mutable private buildPhase: BuildPhase - - [] - static val mutable private diagnosticsLogger: DiagnosticsLogger +let buildPhase = AsyncLocal() +let diagnosticsLogger = AsyncLocal() - static member BuildPhaseUnchecked = DiagnosticsThreadStatics.buildPhase +/// Type holds thread-static globals for use by the compiler. +type internal DiagnosticsThreadStatics = static member BuildPhase - with get () = - match box DiagnosticsThreadStatics.buildPhase with - | Null -> BuildPhase.DefaultPhase - | _ -> DiagnosticsThreadStatics.buildPhase - and set v = DiagnosticsThreadStatics.buildPhase <- v + with get () = buildPhase.Value |> ValueOption.defaultValue BuildPhase.DefaultPhase + and set v = buildPhase.Value <- ValueSome v static member DiagnosticsLogger - with get () = - match box DiagnosticsThreadStatics.diagnosticsLogger with - | Null -> AssertFalseDiagnosticsLogger - | _ -> DiagnosticsThreadStatics.diagnosticsLogger - and set v = DiagnosticsThreadStatics.diagnosticsLogger <- v + with get () = diagnosticsLogger.Value |> ValueOption.defaultValue AssertFalseDiagnosticsLogger + and set v = diagnosticsLogger.Value <- ValueSome v [] module DiagnosticsLoggerExtensions = @@ -429,7 +441,7 @@ module DiagnosticsLoggerExtensions = try if not tryAndDetectDev15 then let preserveStackTrace = - typeof + !!typeof .GetMethod("InternalPreserveStackTrace", BindingFlags.Instance ||| BindingFlags.NonPublic) preserveStackTrace.Invoke(exn, null) |> ignore @@ -442,6 +454,7 @@ module DiagnosticsLoggerExtensions = type DiagnosticsLogger with member x.EmitDiagnostic(exn, severity) = + #if !FABLE_COMPILER match exn with | InternalError(s, _) @@ -517,16 +530,15 @@ module DiagnosticsLoggerExtensions = /// NOTE: The change will be undone when the returned "unwind" object disposes let UseBuildPhase (phase: BuildPhase) = - let oldBuildPhase = DiagnosticsThreadStatics.BuildPhaseUnchecked + let oldBuildPhase = buildPhase.Value DiagnosticsThreadStatics.BuildPhase <- phase { new IDisposable with - member x.Dispose() = - DiagnosticsThreadStatics.BuildPhase <- oldBuildPhase + member x.Dispose() = buildPhase.Value <- oldBuildPhase } /// NOTE: The change will be undone when the returned "unwind" object disposes -let UseTransformedDiagnosticsLogger (transformer: DiagnosticsLogger -> #DiagnosticsLogger) = +let UseTransformedDiagnosticsLogger (transformer: DiagnosticsLogger -> DiagnosticsLogger) = let oldLogger = DiagnosticsThreadStatics.DiagnosticsLogger DiagnosticsThreadStatics.DiagnosticsLogger <- transformer oldLogger @@ -551,6 +563,8 @@ type CompilationGlobalsScope(diagnosticsLogger: DiagnosticsLogger, buildPhase: B let unwindEL = UseDiagnosticsLogger diagnosticsLogger let unwindBP = UseBuildPhase buildPhase + new() = new CompilationGlobalsScope(DiagnosticsThreadStatics.DiagnosticsLogger, DiagnosticsThreadStatics.BuildPhase) + member _.DiagnosticsLogger = diagnosticsLogger member _.BuildPhase = buildPhase @@ -841,24 +855,26 @@ let internal languageFeatureError (langVersion: LanguageVersion) (langFeature: L let suggestedVersionStr = LanguageVersion.GetFeatureVersionString langFeature Error(FSComp.SR.chkFeatureNotLanguageSupported (featureStr, currentVersionStr, suggestedVersionStr), m) -let private tryLanguageFeatureErrorAux (langVersion: LanguageVersion) (langFeature: LanguageFeature) (m: range) = +let internal tryLanguageFeatureErrorOption (langVersion: LanguageVersion) (langFeature: LanguageFeature) (m: range) = if not (langVersion.SupportsFeature langFeature) then Some(languageFeatureError langVersion langFeature m) else None let internal checkLanguageFeatureError langVersion langFeature m = - match tryLanguageFeatureErrorAux langVersion langFeature m with + match tryLanguageFeatureErrorOption langVersion langFeature m with | Some e -> error e | None -> () -let internal checkLanguageFeatureAndRecover langVersion langFeature m = - match tryLanguageFeatureErrorAux langVersion langFeature m with - | Some e -> errorR e - | None -> () +let internal tryCheckLanguageFeatureAndRecover langVersion langFeature m = + match tryLanguageFeatureErrorOption langVersion langFeature m with + | Some e -> + errorR e + false + | None -> true -let internal tryLanguageFeatureErrorOption langVersion langFeature m = - tryLanguageFeatureErrorAux langVersion langFeature m +let internal checkLanguageFeatureAndRecover langVersion langFeature m = + tryCheckLanguageFeatureAndRecover langVersion langFeature m |> ignore let internal languageFeatureNotSupportedInLibraryError (langFeature: LanguageFeature) (m: range) = let featureStr = LanguageVersion.GetFeatureString langFeature @@ -871,26 +887,39 @@ type StackGuard(maxDepth: int, name: string) = let mutable depth = 1 [] - member _.Guard(f) = + member _.Guard + ( + f, + [] memberName: string, + [] path: string, + [] line: int + ) = #if FABLE_COMPILER ignore depth ignore maxDepth ignore name f () #else //!FABLE_COMPILER + use _ = + Activity.start + "DiagnosticsLogger.StackGuard.Guard" + [| + Activity.Tags.stackGuardName, name + Activity.Tags.stackGuardCurrentDepth, string depth + Activity.Tags.stackGuardMaxDepth, string maxDepth + Activity.Tags.callerMemberName, memberName + Activity.Tags.callerFilePath, path + Activity.Tags.callerLineNumber, string line + |] + depth <- depth + 1 try if depth % maxDepth = 0 then - let diagnosticsLogger = DiagnosticsThreadStatics.DiagnosticsLogger - let buildPhase = DiagnosticsThreadStatics.BuildPhase - let ct = Cancellable.Token async { do! Async.SwitchToNewThread() Thread.CurrentThread.Name <- $"F# Extra Compilation Thread for {name} (depth {depth})" - use _scope = new CompilationGlobalsScope(diagnosticsLogger, buildPhase) - use _token = Cancellable.UsingToken ct return f () } |> Async.RunImmediate @@ -900,6 +929,10 @@ type StackGuard(maxDepth: int, name: string) = depth <- depth - 1 #endif //!FABLE_COMPILER + [] + member x.GuardCancellable(original: Cancellable<'T>) = + Cancellable(fun ct -> x.Guard(fun () -> Cancellable.run ct original)) + static member val DefaultDepth = #if DEBUG GetEnvInteger "FSHARP_DefaultStackGuardDepth" 50 @@ -909,3 +942,69 @@ type StackGuard(maxDepth: int, name: string) = static member GetDepthOption(name: string) = GetEnvInteger ("FSHARP_" + name + "StackGuardDepth") StackGuard.DefaultDepth + +// UseMultipleDiagnosticLoggers in ParseAndCheckProject.fs provides similar functionality. +// We should probably adapt and reuse that code. +module MultipleDiagnosticsLoggers = + let Parallel computations = + let computationsWithLoggers, diagnosticsReady = + [ + for i, computation in computations |> Seq.indexed do + let diagnosticsReady = TaskCompletionSource<_>() + + let logger = CapturingDiagnosticsLogger($"CaptureDiagnosticsConcurrently {i}") + + // Inject capturing logger into the computation. Signal the TaskCompletionSource when done. + let computationsWithLoggers = + async { + SetThreadDiagnosticsLoggerNoUnwind logger + + try + return! computation + finally + diagnosticsReady.SetResult logger + } + + computationsWithLoggers, diagnosticsReady + ] + |> List.unzip + + // Commit diagnostics from computations as soon as it is possible, preserving the order. + let replayDiagnostics = + backgroundTask { + let target = DiagnosticsThreadStatics.DiagnosticsLogger + + for tcs in diagnosticsReady do + let! finishedLogger = tcs.Task + finishedLogger.CommitDelayedDiagnostics target + } + + async { + try + // We want to restore the current diagnostics context when finished. + use _ = new CompilationGlobalsScope() + let! results = Async.Parallel computationsWithLoggers + do! replayDiagnostics |> Async.AwaitTask + return results + finally + // When any of the computation throws, Async.Parallel may not start some remaining computations at all. + // We set dummy results for them to allow the task to finish and to not lose any already emitted diagnostics. + if not replayDiagnostics.IsCompleted then + let emptyLogger = CapturingDiagnosticsLogger("empty") + + for tcs in diagnosticsReady do + tcs.TrySetResult(emptyLogger) |> ignore + + replayDiagnostics.Wait() + } + + let Sequential computations = + async { + let results = ResizeArray() + + for computation in computations do + let! result = computation + results.Add result + + return results.ToArray() + } diff --git a/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fsi b/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fsi index e9040da36e..e5a4c8e7f8 100644 --- a/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fsi +++ b/src/fcs-fable/src/Compiler/Facilities/DiagnosticsLogger.fsi @@ -6,15 +6,18 @@ open System open FSharp.Compiler.Diagnostics open FSharp.Compiler.Features open FSharp.Compiler.Text +open System.Runtime.CompilerServices +open System.Runtime.InteropServices /// Represents the style being used to format errors -[] +[] type DiagnosticStyle = | Default | Emacs | Test | VisualStudio | Gcc + | Rich /// Thrown when we want to add some range information to a .NET exception exception WrappedError of exn * range @@ -37,11 +40,12 @@ val NoSuggestions: Suggestions /// Thrown when we stop processing the F# Interactive entry or #load. exception StopProcessingExn of exn option -val (|StopProcessing|_|): exn: exn -> unit option +[] +val (|StopProcessing|_|): exn: exn -> unit voption val StopProcessing<'T> : exn -/// Represents a diagnostic exeption whose text comes via SR.* +/// Represents a diagnostic exception whose text comes via SR.* exception DiagnosticWithText of number: int * message: string * range: range /// A diagnostic that is raised when enabled manually, or by default with a language feature @@ -51,7 +55,7 @@ exception DiagnosticEnabledWithLanguageFeature of range: range * enabledByLangFeature: bool -/// Creates a diagnostic exeption whose text comes via SR.* +/// Creates a diagnostic exception whose text comes via SR.* val Error: (int * string) * range -> exn exception InternalError of message: string * range: range @@ -97,7 +101,7 @@ val inline protectAssemblyExplorationNoReraise: dflt1: 'T -> dflt2: 'T -> f: (un val AttachRange: m: range -> exn: exn -> exn -/// Represnts an early exit from parsing, checking etc, for example because 'maxerrors' has been reached. +/// Represents an early exit from parsing, checking etc, for example because 'maxerrors' has been reached. type Exiter = abstract Exit: int -> 'T @@ -205,6 +209,9 @@ type DiagnosticsLogger = /// Checks if ErrorCount > 0 member CheckForErrors: unit -> bool + abstract CheckForRealErrorsIgnoringWarnings: bool + default CheckForRealErrorsIgnoringWarnings: bool + /// Represents a DiagnosticsLogger that discards diagnostics val DiscardErrorsLogger: DiagnosticsLogger @@ -232,8 +239,6 @@ type DiagnosticsThreadStatics = static member BuildPhase: BuildPhase with get, set - static member BuildPhaseUnchecked: BuildPhase - static member DiagnosticsLogger: DiagnosticsLogger with get, set [] @@ -278,7 +283,7 @@ module DiagnosticsLoggerExtensions = val UseBuildPhase: phase: BuildPhase -> IDisposable /// NOTE: The change will be undone when the returned "unwind" object disposes -val UseTransformedDiagnosticsLogger: transformer: (DiagnosticsLogger -> #DiagnosticsLogger) -> IDisposable +val UseTransformedDiagnosticsLogger: transformer: (DiagnosticsLogger -> DiagnosticsLogger) -> IDisposable val UseDiagnosticsLogger: newLogger: DiagnosticsLogger -> IDisposable @@ -437,6 +442,8 @@ val languageFeatureError: langVersion: LanguageVersion -> langFeature: LanguageF val checkLanguageFeatureError: langVersion: LanguageVersion -> langFeature: LanguageFeature -> m: range -> unit +val tryCheckLanguageFeatureAndRecover: langVersion: LanguageVersion -> langFeature: LanguageFeature -> m: range -> bool + val checkLanguageFeatureAndRecover: langVersion: LanguageVersion -> langFeature: LanguageFeature -> m: range -> unit val tryLanguageFeatureErrorOption: @@ -448,7 +455,14 @@ type StackGuard = new: maxDepth: int * name: string -> StackGuard /// Execute the new function, on a new thread if necessary - member Guard: f: (unit -> 'T) -> 'T + member Guard: + f: (unit -> 'T) * + [] memberName: string * + [] path: string * + [] line: int -> + 'T + + member GuardCancellable: Internal.Utilities.Library.Cancellable<'T> -> Internal.Utilities.Library.Cancellable<'T> static member GetDepthOption: string -> int @@ -458,8 +472,21 @@ type StackGuard = type CompilationGlobalsScope = new: diagnosticsLogger: DiagnosticsLogger * buildPhase: BuildPhase -> CompilationGlobalsScope + /// When disposed, restores caller's diagnostics logger and build phase. + new: unit -> CompilationGlobalsScope + interface IDisposable member DiagnosticsLogger: DiagnosticsLogger member BuildPhase: BuildPhase + +module MultipleDiagnosticsLoggers = + + /// Run computations using Async.Parallel. + /// Captures the diagnostics from each computation and commits them to the caller's logger preserving their order. + /// When done, restores caller's build phase and diagnostics logger. + val Parallel: computations: Async<'T> seq -> Async<'T array> + + /// Run computations sequentially starting immediately on the current thread. + val Sequential: computations: Async<'T> seq -> Async<'T array> diff --git a/src/fcs-fable/src/Compiler/Facilities/Hashing.fs b/src/fcs-fable/src/Compiler/Facilities/Hashing.fs new file mode 100644 index 0000000000..dd58495c59 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Facilities/Hashing.fs @@ -0,0 +1,88 @@ +namespace Internal.Utilities.Hashing + +open System +open System.Threading + +/// Tools for hashing things with MD5 into a string that can be used as a cache key. +module internal Md5StringHasher = + + let private md5 = + new ThreadLocal<_>(fun () -> System.Security.Cryptography.MD5.Create()) + + let private computeHash (bytes: byte array) = md5.Value.ComputeHash(bytes) + + let hashString (s: string) = + System.Text.Encoding.UTF8.GetBytes(s) |> computeHash + + let empty = String.Empty + + let addBytes (bytes: byte array) (s: string) = + let sbytes = s |> hashString + + Array.append sbytes bytes + |> computeHash + |> System.BitConverter.ToString + |> (fun x -> x.Replace("-", "")) + + let addString (s: string) (s2: string) = + s |> System.Text.Encoding.UTF8.GetBytes |> addBytes <| s2 + + let addSeq<'item> (items: 'item seq) (addItem: 'item -> string -> string) (s: string) = + items |> Seq.fold (fun s a -> addItem a s) s + + let addStrings strings = addSeq strings addString + + // If we use this make it an extension method? + //let addVersions<'a, 'b when 'a :> ICacheKey<'b, string>> (versions: 'a seq) (s: string) = + // versions |> Seq.map (fun x -> x.GetVersion()) |> addStrings <| s + + let addBool (b: bool) (s: string) = + b |> BitConverter.GetBytes |> addBytes <| s + + let addDateTime (dt: System.DateTime) (s: string) = dt.Ticks.ToString() |> addString <| s + +module internal Md5Hasher = + + let private md5 = + new ThreadLocal<_>(fun () -> System.Security.Cryptography.MD5.Create()) + + let computeHash (bytes: byte array) = md5.Value.ComputeHash(bytes) + + let empty = Array.empty + + let hashString (s: string) = + s |> System.Text.Encoding.UTF8.GetBytes |> computeHash + + let addBytes (bytes: byte array) (s: byte array) = + + Array.append s bytes |> computeHash + + let addString (s: string) (s2: byte array) = + s |> System.Text.Encoding.UTF8.GetBytes |> addBytes <| s2 + + let addSeq<'item> (items: 'item seq) (addItem: 'item -> byte array -> byte array) (s: byte array) = + items |> Seq.fold (fun s a -> addItem a s) s + + let addStrings strings = addSeq strings addString + let addBytes' bytes = addSeq bytes addBytes + + // If we use this make it an extension method? + //let addVersions<'a, 'b when 'a :> ICacheKey<'b, string>> (versions: 'a seq) (s: string) = + // versions |> Seq.map (fun x -> x.GetVersion()) |> addStrings <| s + + let addBool (b: bool) (s: byte array) = + b |> BitConverter.GetBytes |> addBytes <| s + + let addDateTime (dt: System.DateTime) (s: byte array) = + dt.Ticks |> BitConverter.GetBytes |> addBytes <| s + + let addDateTimes (dts: System.DateTime seq) (s: byte array) = s |> addSeq dts addDateTime + + let addInt (i: int) (s: byte array) = + i |> BitConverter.GetBytes |> addBytes <| s + + let addIntegers (items: int seq) (s: byte array) = addSeq items addInt s + + let addBooleans (items: bool seq) (s: byte array) = addSeq items addBool s + + let toString (bytes: byte array) = bytes |> System.BitConverter.ToString diff --git a/src/fcs-fable/src/Compiler/Facilities/Hashing.fsi b/src/fcs-fable/src/Compiler/Facilities/Hashing.fsi new file mode 100644 index 0000000000..c154fd6607 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Facilities/Hashing.fsi @@ -0,0 +1,50 @@ +namespace Internal.Utilities.Hashing + +/// Tools for hashing things with MD5 into a string that can be used as a cache key. +module internal Md5StringHasher = + + val hashString: s: string -> byte array + + val empty: string + + val addBytes: bytes: byte array -> s: string -> string + + val addString: s: string -> s2: string -> string + + val addSeq: items: 'item seq -> addItem: ('item -> string -> string) -> s: string -> string + + val addStrings: strings: string seq -> (string -> string) + + val addBool: b: bool -> s: string -> string + + val addDateTime: dt: System.DateTime -> s: string -> string + +module internal Md5Hasher = + + val computeHash: bytes: byte array -> byte array + + val empty: 'a array + + val hashString: s: string -> byte array + + val addBytes: bytes: byte array -> s: byte array -> byte array + + val addString: s: string -> s2: byte array -> byte array + + val addSeq: items: 'item seq -> addItem: ('item -> byte array -> byte array) -> s: byte array -> byte array + + val addStrings: strings: string seq -> (byte array -> byte array) + + val addBytes': bytes: byte array seq -> (byte array -> byte array) + + val addBool: b: bool -> s: byte array -> byte array + + val addDateTime: dt: System.DateTime -> s: byte array -> byte array + + val addDateTimes: dts: System.DateTime seq -> s: byte array -> byte array + + val addIntegers: items: int seq -> s: byte array -> byte array + + val addBooleans: items: bool seq -> s: byte array -> byte array + + val toString: bytes: byte array -> string diff --git a/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fs b/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fs index 643224b904..0e2783796a 100644 --- a/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fs +++ b/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fs @@ -38,6 +38,7 @@ type LanguageFeature = | StringInterpolation | OverloadsForCustomOperations | ExpandedMeasurables + | NullnessChecking | StructActivePattern | PrintfBinaryFormat | IndexerNotationWithoutDot @@ -84,6 +85,18 @@ type LanguageFeature = | PreferExtensionMethodOverPlainProperty | WarningIndexedPropertiesGetSetSameType | WarningWhenTailCallAttrOnNonRec + | BooleanReturningAndReturnTypeDirectedPartialActivePattern + | EnforceAttributeTargets + | LowerInterpolatedStringToConcat + | LowerIntegralRangesToFastLoops + | AllowAccessModifiersToAutoPropertiesGettersAndSetters + | LowerSimpleMappingsInComprehensionsToFastLoops + | ParsedHashDirectiveArgumentNonQuotes + | EmptyBodiedComputationExpressions + | AllowObjectExpressionWithoutOverrides + | DontWarnOnUppercaseIdentifiersInBindingPatterns + | UseTypeSubsumptionCache + | DeprecatePlacesWhereSeqCanBeOmitted /// LanguageVersion management type LanguageVersion(versionText) = @@ -95,10 +108,11 @@ type LanguageVersion(versionText) = static let languageVersion60 = 6.0m static let languageVersion70 = 7.0m static let languageVersion80 = 8.0m + static let languageVersion90 = 9.0m static let previewVersion = 9999m // Language version when preview specified - static let defaultVersion = languageVersion80 // Language version when default specified + static let defaultVersion = languageVersion90 // Language version when default specified static let latestVersion = defaultVersion // Language version when latest specified - static let latestMajorVersion = languageVersion80 // Language version when latestmajor specified + static let latestMajorVersion = languageVersion90 // Language version when latestmajor specified static let validOptions = [| "preview"; "default"; "latest"; "latestmajor" |] @@ -111,6 +125,7 @@ type LanguageVersion(versionText) = languageVersion60 languageVersion70 languageVersion80 + languageVersion90 |] static let features = @@ -187,14 +202,29 @@ type LanguageVersion(versionText) = LanguageFeature.ExtendedFixedBindings, languageVersion80 LanguageFeature.PreferStringGetPinnableReference, languageVersion80 + // F# 9.0 + LanguageFeature.NullnessChecking, languageVersion90 + LanguageFeature.ReuseSameFieldsInStructUnions, languageVersion90 + LanguageFeature.PreferExtensionMethodOverPlainProperty, languageVersion90 + LanguageFeature.WarningIndexedPropertiesGetSetSameType, languageVersion90 + LanguageFeature.WarningWhenTailCallAttrOnNonRec, languageVersion90 + LanguageFeature.UnionIsPropertiesVisible, languageVersion90 + LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern, languageVersion90 + LanguageFeature.LowerInterpolatedStringToConcat, languageVersion90 + LanguageFeature.LowerIntegralRangesToFastLoops, languageVersion90 + LanguageFeature.LowerSimpleMappingsInComprehensionsToFastLoops, languageVersion90 + LanguageFeature.ParsedHashDirectiveArgumentNonQuotes, languageVersion90 + LanguageFeature.EmptyBodiedComputationExpressions, languageVersion90 + LanguageFeature.EnforceAttributeTargets, languageVersion90 + // F# preview - LanguageFeature.FromEndSlicing, previewVersion - LanguageFeature.UnmanagedConstraintCsharpInterop, previewVersion - LanguageFeature.ReuseSameFieldsInStructUnions, previewVersion - LanguageFeature.PreferExtensionMethodOverPlainProperty, previewVersion - LanguageFeature.WarningIndexedPropertiesGetSetSameType, previewVersion - LanguageFeature.WarningWhenTailCallAttrOnNonRec, previewVersion - LanguageFeature.UnionIsPropertiesVisible, previewVersion + LanguageFeature.UseTypeSubsumptionCache, previewVersion + LanguageFeature.UnmanagedConstraintCsharpInterop, previewVersion // not enabled because: https://github.com/dotnet/fsharp/issues/17509 + LanguageFeature.FromEndSlicing, previewVersion // Unfinished features --- needs work + LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters, previewVersion + LanguageFeature.AllowObjectExpressionWithoutOverrides, previewVersion + LanguageFeature.DontWarnOnUppercaseIdentifiersInBindingPatterns, previewVersion + LanguageFeature.DeprecatePlacesWhereSeqCanBeOmitted, previewVersion ] static let defaultLanguageVersion = LanguageVersion("default") @@ -216,6 +246,8 @@ type LanguageVersion(versionText) = | "7" -> languageVersion70 | "8.0" | "8" -> languageVersion80 + | "9.0" + | "9" -> languageVersion90 | _ -> 0m let specified = getVersionFromString versionText @@ -277,6 +309,7 @@ type LanguageVersion(versionText) = | LanguageFeature.FromEndSlicing -> FSComp.SR.featureFromEndSlicing () | LanguageFeature.FixedIndexSlice3d4d -> FSComp.SR.featureFixedIndexSlice3d4d () | LanguageFeature.AndBang -> FSComp.SR.featureAndBang () + | LanguageFeature.NullnessChecking -> FSComp.SR.featureNullnessChecking () | LanguageFeature.ResumableStateMachines -> FSComp.SR.featureResumableStateMachines () | LanguageFeature.NullableOptionalInterop -> FSComp.SR.featureNullableOptionalInterop () | LanguageFeature.DefaultInterfaceMemberConsumption -> FSComp.SR.featureDefaultInterfaceMemberConsumption () @@ -336,6 +369,22 @@ type LanguageVersion(versionText) = | LanguageFeature.PreferExtensionMethodOverPlainProperty -> FSComp.SR.featurePreferExtensionMethodOverPlainProperty () | LanguageFeature.WarningIndexedPropertiesGetSetSameType -> FSComp.SR.featureWarningIndexedPropertiesGetSetSameType () | LanguageFeature.WarningWhenTailCallAttrOnNonRec -> FSComp.SR.featureChkTailCallAttrOnNonRec () + | LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern -> + FSComp.SR.featureBooleanReturningAndReturnTypeDirectedPartialActivePattern () + | LanguageFeature.EnforceAttributeTargets -> FSComp.SR.featureEnforceAttributeTargets () + | LanguageFeature.LowerInterpolatedStringToConcat -> FSComp.SR.featureLowerInterpolatedStringToConcat () + | LanguageFeature.LowerIntegralRangesToFastLoops -> FSComp.SR.featureLowerIntegralRangesToFastLoops () + | LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters -> + FSComp.SR.featureAllowAccessModifiersToAutoPropertiesGettersAndSetters () + | LanguageFeature.LowerSimpleMappingsInComprehensionsToFastLoops -> + FSComp.SR.featureLowerSimpleMappingsInComprehensionsToFastLoops () + | LanguageFeature.ParsedHashDirectiveArgumentNonQuotes -> FSComp.SR.featureParsedHashDirectiveArgumentNonString () + | LanguageFeature.EmptyBodiedComputationExpressions -> FSComp.SR.featureEmptyBodiedComputationExpressions () + | LanguageFeature.AllowObjectExpressionWithoutOverrides -> FSComp.SR.featureAllowObjectExpressionWithoutOverrides () + | LanguageFeature.DontWarnOnUppercaseIdentifiersInBindingPatterns -> + FSComp.SR.featureDontWarnOnUppercaseIdentifiersInBindingPatterns () + | LanguageFeature.UseTypeSubsumptionCache -> FSComp.SR.featureUseTypeSubsumptionCache () + | LanguageFeature.DeprecatePlacesWhereSeqCanBeOmitted -> FSComp.SR.featureDeprecatePlacesWhereSeqCanBeOmitted () /// Get a version string associated with the given feature. static member GetFeatureVersionString feature = diff --git a/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fsi b/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fsi index 7af2317e3c..bc361ba133 100644 --- a/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fsi +++ b/src/fcs-fable/src/Compiler/Facilities/LanguageFeatures.fsi @@ -28,6 +28,7 @@ type LanguageFeature = | StringInterpolation | OverloadsForCustomOperations | ExpandedMeasurables + | NullnessChecking | StructActivePattern | PrintfBinaryFormat | IndexerNotationWithoutDot @@ -75,6 +76,18 @@ type LanguageFeature = | PreferExtensionMethodOverPlainProperty | WarningIndexedPropertiesGetSetSameType | WarningWhenTailCallAttrOnNonRec + | BooleanReturningAndReturnTypeDirectedPartialActivePattern + | EnforceAttributeTargets + | LowerInterpolatedStringToConcat + | LowerIntegralRangesToFastLoops + | AllowAccessModifiersToAutoPropertiesGettersAndSetters + | LowerSimpleMappingsInComprehensionsToFastLoops + | ParsedHashDirectiveArgumentNonQuotes + | EmptyBodiedComputationExpressions + | AllowObjectExpressionWithoutOverrides + | DontWarnOnUppercaseIdentifiersInBindingPatterns + | UseTypeSubsumptionCache + | DeprecatePlacesWhereSeqCanBeOmitted /// LanguageVersion management type LanguageVersion = diff --git a/src/fcs-fable/src/Compiler/Facilities/SimulatedMSBuildReferenceResolver.fs b/src/fcs-fable/src/Compiler/Facilities/SimulatedMSBuildReferenceResolver.fs index 017cdfaace..c9f8439036 100644 --- a/src/fcs-fable/src/Compiler/Facilities/SimulatedMSBuildReferenceResolver.fs +++ b/src/fcs-fable/src/Compiler/Facilities/SimulatedMSBuildReferenceResolver.fs @@ -12,7 +12,7 @@ open FSharp.Compiler.IO // 1. List of frameworks // 2. DeriveTargetFrameworkDirectoriesFor45Plus // 3. HighestInstalledRefAssembliesOrDotNETFramework -// 4. GetPathToDotNetFrameworkImlpementationAssemblies +// 4. GetPathToDotNetFrameworkImplementationAssemblies [] let private Net45 = "v4.5" @@ -50,11 +50,11 @@ let private SimulatedMSBuildResolver = /// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework /// This is only used to specify the "last resort" path for assembly resolution. - let GetPathToDotNetFrameworkImlpementationAssemblies _ = + let GetPathToDotNetFrameworkImplementationAssemblies _ = let isDesktop = typeof.Assembly.GetName().Name = "mscorlib" if isDesktop then - match System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() with + match (System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(): string MaybeNull) with | null -> [] | x -> [ x ] else @@ -82,7 +82,7 @@ let private SimulatedMSBuildResolver = if Environment.OSVersion.Platform = PlatformID.Win32NT then let PF = match Environment.GetEnvironmentVariable("ProgramFiles(x86)") with - | null -> Environment.GetEnvironmentVariable("ProgramFiles") // if PFx86 is null, then we are 32-bit and just get PF + | null -> !! Environment.GetEnvironmentVariable("ProgramFiles") // if PFx86 is null, then we are 32-bit and just get PF | s -> s PF + @"\Reference Assemblies\Microsoft\Framework\.NETFramework" @@ -112,7 +112,7 @@ let private SimulatedMSBuildResolver = yield fsharpCoreDir yield implicitIncludeDir yield! GetPathToDotNetFrameworkReferenceAssemblies targetFrameworkVersion - yield! GetPathToDotNetFrameworkImlpementationAssemblies targetFrameworkVersion + yield! GetPathToDotNetFrameworkImplementationAssemblies targetFrameworkVersion ] for r, baggage in references do @@ -150,14 +150,14 @@ let private SimulatedMSBuildResolver = let fscoreDir0 = let PF = match Environment.GetEnvironmentVariable("ProgramFiles(x86)") with - | null -> Environment.GetEnvironmentVariable("ProgramFiles") + | null -> !! Environment.GetEnvironmentVariable("ProgramFiles") | s -> s PF + @"\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\" - + n.Version.ToString() + + (!!n.Version).ToString() - let trialPath = Path.Combine(fscoreDir0, n.Name + ".dll") + let trialPath = Path.Combine(fscoreDir0, !!n.Name + ".dll") if FileSystem.FileExistsShim trialPath then success trialPath @@ -173,7 +173,7 @@ let private SimulatedMSBuildResolver = r else try - AssemblyName(r).Name + ".dll" + !!AssemblyName(r).Name + ".dll" with _ -> r + ".dll" @@ -198,7 +198,7 @@ let private SimulatedMSBuildResolver = let netFx = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() let gac = - Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(netFx.TrimEnd('\\'))), "assembly") + Path.Combine(!! Path.GetDirectoryName(Path.GetDirectoryName(netFx.TrimEnd('\\'))), "assembly") match n.Version, n.GetPublicKeyToken() with | null, _ @@ -207,7 +207,7 @@ let private SimulatedMSBuildResolver = [ if FileSystem.DirectoryExistsShim gac then for gacDir in FileSystem.EnumerateDirectoriesShim gac do - let assemblyDir = Path.Combine(gacDir, n.Name) + let assemblyDir = Path.Combine(gacDir, !!n.Name) if FileSystem.DirectoryExistsShim assemblyDir then for tdir in FileSystem.EnumerateDirectoriesShim assemblyDir do @@ -228,7 +228,7 @@ let private SimulatedMSBuildResolver = if FileSystem.DirectoryExistsShim gac then for gacDir in Directory.EnumerateDirectories gac do //printfn "searching GAC directory: %s" gacDir - let assemblyDir = Path.Combine(gacDir, n.Name) + let assemblyDir = Path.Combine(gacDir, !!n.Name) if FileSystem.DirectoryExistsShim assemblyDir then //printfn "searching GAC directory: %s" assemblyDir diff --git a/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fs b/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fs index 070aea9036..a6d06ffe41 100644 --- a/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fs +++ b/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fs @@ -63,6 +63,7 @@ module WordL = let leftAngle = wordL TaggedText.leftAngle let keywordModule = wordL TaggedText.keywordModule let keywordNamespace = wordL TaggedText.keywordNamespace + let keywordReturn = wordL TaggedText.keywordReturn module LeftL = let leftParen = leftL TaggedText.leftParen diff --git a/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fsi b/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fsi index de40c9d5d7..3d9608d043 100644 --- a/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fsi +++ b/src/fcs-fable/src/Compiler/Facilities/TextLayoutRender.fsi @@ -106,6 +106,7 @@ module internal WordL = val leftAngle: Layout val keywordModule: Layout val keywordNamespace: Layout + val keywordReturn: Layout module internal LeftL = val leftParen: Layout diff --git a/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fs b/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fs index e84974842a..36e0196c3c 100644 --- a/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fs +++ b/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fs @@ -6,6 +6,11 @@ namespace FSharp.Compiler.Text open System open System.IO +open System.Collections.Immutable +open Internal.Utilities.Library + +open Internal.Utilities.Collections +open Internal.Utilities.Hashing type ISourceText = @@ -29,6 +34,11 @@ type ISourceText = abstract GetSubTextFromRange: range: range -> string +type ISourceTextNew = + inherit ISourceText + + abstract GetChecksum: unit -> System.Collections.Immutable.ImmutableArray + [] type StringText(str: string) = @@ -42,7 +52,7 @@ type StringText(str: string) = let mutable line = reader.ReadLine() while not (isNull line) do - yield line + yield !!line line <- reader.ReadLine() if str.EndsWith("\n", StringComparison.Ordinal) then @@ -70,7 +80,7 @@ type StringText(str: string) = override _.ToString() = str - interface ISourceText with + interface ISourceTextNew with member _.Item with get index = str[index] @@ -101,11 +111,10 @@ type StringText(str: string) = if lastIndex <= startIndex || lastIndex >= str.Length then invalidArg "target" "Too big." - #if FABLE_COMPILER str.IndexOf(target, startIndex) <> -1 #else - str.IndexOf(target, startIndex, target.Length) <> -1 + str.IndexOfOrdinal(target, startIndex, target.Length) <> -1 #endif member _.Length = str.Length @@ -157,9 +166,49 @@ type StringText(str: string) = let lastLine = sourceText.GetLineString(range.EndLine - 1) sb.Append(lastLine.Substring(0, range.EndColumn)).ToString() + member _.GetChecksum() = + str + |> Md5Hasher.hashString + |> fun byteArray -> ImmutableArray.Create(byteArray, 0, byteArray.Length) + module SourceText = let ofString str = StringText(str) :> ISourceText + +module SourceTextNew = + + let ofString str = StringText(str) :> ISourceTextNew + + let ofISourceText (sourceText: ISourceText) = + { new ISourceTextNew with + member _.Item + with get index = sourceText[index] + + member _.GetLineString(x) = sourceText.GetLineString(x) + + member _.GetLineCount() = sourceText.GetLineCount() + + member _.GetLastCharacterPosition() = sourceText.GetLastCharacterPosition() + + member _.GetSubTextString(x, y) = sourceText.GetSubTextString(x, y) + + member _.SubTextEquals(x, y) = sourceText.SubTextEquals(x, y) + + member _.Length = sourceText.Length + + member _.ContentEquals(x) = sourceText.ContentEquals(x) + + member _.CopyTo(a, b, c, d) = sourceText.CopyTo(a, b, c, d) + + member _.GetSubTextFromRange(x) = sourceText.GetSubTextFromRange(x) + + member _.GetChecksum() = + // TODO: something better... + !! sourceText.ToString() + |> Md5Hasher.hashString + |> fun byteArray -> ImmutableArray.Create(byteArray, 0, byteArray.Length) + } + // NOTE: the code in this file is a drop-in replacement runtime for Lexing.fs from the FsLexYacc repository namespace Internal.Utilities.Text.Lexing @@ -201,13 +250,13 @@ type internal Position = Position(x.FileIndex, x.Line, x.OriginalLine, x.StartOfLineAbsoluteOffset, x.StartOfLineAbsoluteOffset - 1) member x.ApplyLineDirective(fileIdx, line) = - Position(fileIdx, line, x.OriginalLine, x.AbsoluteOffset, x.AbsoluteOffset) + Position(fileIdx, line, x.OriginalLine + 1, x.AbsoluteOffset, x.AbsoluteOffset) override p.ToString() = $"({p.Line},{p.Column})" static member Empty = Position() - static member FirstLine fileIdx = Position(fileIdx, 1, 0, 0, 0) + static member FirstLine fileIdx = Position(fileIdx, 1, 1, 0, 0) #if FABLE_COMPILER type internal LexBufferChar = uint16 diff --git a/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fsi b/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fsi index 582861c697..950c7dfaeb 100644 --- a/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fsi +++ b/src/fcs-fable/src/Compiler/Facilities/prim-lexing.fsi @@ -39,12 +39,23 @@ type ISourceText = /// Throws an exception when the input range is outside the file boundaries. abstract GetSubTextFromRange: range: range -> string +/// Just like ISourceText, but with a checksum. Added as a separate type to avoid breaking changes. +type ISourceTextNew = + inherit ISourceText + + abstract GetChecksum: unit -> System.Collections.Immutable.ImmutableArray + /// Functions related to ISourceText objects module SourceText = /// Creates an ISourceText object from the given string val ofString: string -> ISourceText +module SourceTextNew = + + val ofString: string -> ISourceTextNew + val ofISourceText: ISourceText -> ISourceTextNew + // // NOTE: the code in this file is a drop-in replacement runtime for Lexing.fsi from the FsLexYacc repository // and is referenced by generated code for the three FsLex generated lexers in the F# compiler. diff --git a/src/fcs-fable/src/Compiler/Facilities/prim-parsing.fs b/src/fcs-fable/src/Compiler/Facilities/prim-parsing.fs index 9ce808163c..803da99661 100644 --- a/src/fcs-fable/src/Compiler/Facilities/prim-parsing.fs +++ b/src/fcs-fable/src/Compiler/Facilities/prim-parsing.fs @@ -17,9 +17,9 @@ exception Accept of obj [] type internal IParseState #if FABLE_COMPILER - (ruleStartPoss: Position[], ruleEndPoss: Position[], lhsPos: Position[], ruleValues: obj[], lexbuf: LexBuffer) = + (ruleStartPoss: Position[], ruleEndPoss: Position[], lhsPos: Position[], ruleValues: objnull[], lexbuf: LexBuffer) = #else - (ruleStartPoss: Position[], ruleEndPoss: Position[], lhsPos: Position[], ruleValues: obj[], lexbuf: LexBuffer) = + (ruleStartPoss: Position[], ruleEndPoss: Position[], lhsPos: Position[], ruleValues: objnull[], lexbuf: LexBuffer) = #endif member _.LexBuffer = lexbuf @@ -131,7 +131,7 @@ type Stack<'a>(n) = member buf.PrintStack() = for i = 0 to (count - 1) do - Console.Write("{0}{1}", contents[i], (if i = count - 1 then ":" else "-")) + Console.Write("{0}{1}", contents[i] :> objnull, (if i = count - 1 then ":" else "-")) module Flags = #if DEBUG @@ -157,7 +157,10 @@ module internal Implementation = //------------------------------------------------------------------------- // Read the tables written by FSYACC. - type AssocTable(elemTab: uint16[], offsetTab: uint16[], cache: int[], cacheSize: int) = + type AssocTable(elemTab: uint16[], offsetTab: uint16[], cache: int[]) = + + do Array.fill cache 0 cache.Length -1 + let cacheSize = cache.Length / 2 member t.ReadAssoc(minElemNum, maxElemNum, defaultValueOfAssoc, keyToFind) = // do a binary chop on the table @@ -237,7 +240,7 @@ module internal Implementation = [] [] type ValueInfo = - val value: obj + val value: objnull val startPos: Position val endPos: Position @@ -275,21 +278,16 @@ module internal Implementation = // The 100 here means a maximum of 100 elements for each rule let ruleStartPoss = (Array.zeroCreate 100: Position[]) let ruleEndPoss = (Array.zeroCreate 100: Position[]) - let ruleValues = (Array.zeroCreate 100: obj[]) + let ruleValues = (Array.zeroCreate 100: objnull[]) let lhsPos = (Array.zeroCreate 2: Position[]) let reductions = tables.reductions let cacheSize = 7919 // the 1000'th prime - // Use a simpler hash table with faster lookup, but only one - // hash bucket per key. #if FABLE_COMPILER let actionTableCache = Array.zeroCreate (cacheSize * 2) let gotoTableCache = Array.zeroCreate (cacheSize * 2) #else let actionTableCache = ArrayPool.Shared.Rent(cacheSize * 2) let gotoTableCache = ArrayPool.Shared.Rent(cacheSize * 2) - // Clear the arrays since ArrayPool does not - Array.Clear(actionTableCache, 0, actionTableCache.Length) - Array.Clear(gotoTableCache, 0, gotoTableCache.Length) use _cacheDisposal = { new IDisposable with @@ -300,10 +298,10 @@ module internal Implementation = #endif //!FABLE_COMPILER let actionTable = - AssocTable(tables.actionTableElements, tables.actionTableRowOffsets, actionTableCache, cacheSize) + AssocTable(tables.actionTableElements, tables.actionTableRowOffsets, actionTableCache) let gotoTable = - AssocTable(tables.gotos, tables.sparseGotoTableRowOffsets, gotoTableCache, cacheSize) + AssocTable(tables.gotos, tables.sparseGotoTableRowOffsets, gotoTableCache) let stateToProdIdxsTable = IdxToIdxListTable(tables.stateToProdIdxsTableElements, tables.stateToProdIdxsTableRowOffsets) diff --git a/src/fcs-fable/src/Compiler/Interactive/ControlledExecution.fs b/src/fcs-fable/src/Compiler/Interactive/ControlledExecution.fs index 24f2dcb2ae..2d696344b5 100644 --- a/src/fcs-fable/src/Compiler/Interactive/ControlledExecution.fs +++ b/src/fcs-fable/src/Compiler/Interactive/ControlledExecution.fs @@ -13,6 +13,7 @@ open System.Reflection open System.Threading open Internal.Utilities.FSharpEnvironment +open Internal.Utilities.Library open Unchecked @@ -24,21 +25,20 @@ type internal ControlledExecution(isInteractive: bool) = static let ceType: Type option = Option.ofObj (Type.GetType("System.Runtime.ControlledExecution, System.Private.CoreLib", false)) - static let threadType: Type option = Option.ofObj (typeof) + static let threadType: Type option = typeof |> Option.ofObj static let ceRun: MethodInfo option = match ceType with | None -> None | Some t -> - Option.ofObj ( - t.GetMethod( - "Run", - BindingFlags.Static ||| BindingFlags.Public, - defaultof, - [| typeof; typeof |], - [||] - ) + t.GetMethod( + "Run", + BindingFlags.Static ||| BindingFlags.Public, + defaultof, + [| typeof; typeof |], + [||] ) + |> Option.ofObj static let threadResetAbort: MethodInfo option = match isRunningOnCoreClr, threadType with @@ -67,6 +67,8 @@ type internal ControlledExecution(isInteractive: bool) = static member StripTargetInvocationException(exn: Exception) = match exn with - | :? TargetInvocationException as e when not (isNull e.InnerException) -> - ControlledExecution.StripTargetInvocationException(e.InnerException) + | :? TargetInvocationException as e -> + match e.InnerException with + | null -> exn + | innerEx -> ControlledExecution.StripTargetInvocationException(innerEx) | _ -> exn diff --git a/src/fcs-fable/src/Compiler/Interactive/FSIstrings.txt b/src/fcs-fable/src/Compiler/Interactive/FSIstrings.txt index c357f835be..2340214f8d 100644 --- a/src/fcs-fable/src/Compiler/Interactive/FSIstrings.txt +++ b/src/fcs-fable/src/Compiler/Interactive/FSIstrings.txt @@ -32,6 +32,7 @@ fsiIntroPackageSourceUriInfo,"Include package source uri when searching for pack fsiIntroTextHashloadInfo,"Load the given file(s) as if compiled and referenced" fsiIntroTextHashtimeInfo,"Toggle timing on/off" fsiIntroTextHashhelpInfo,"Display help" +fsiIntroTextHashhelpdocInfo,"Display documentation for an identifier, e.g. #help \"List.map\";;" fsiIntroTextHashquitInfo,"Exit" fsiIntroTextHashclearInfo,"Clear screen" fsiIntroTextHeader2commandLine," F# Interactive command line options:" @@ -57,3 +58,4 @@ fsiOperationCouldNotBeCompleted,"Operation could not be completed due to earlier fsiOperationFailed,"Operation failed. The error text has been printed in the error stream. To return the corresponding FSharpDiagnostic use the EvalInteractionNonThrowing, EvalScriptNonThrowing or EvalExpressionNonThrowing" fsiMultiAssemblyEmitOption,"Emit multiple assemblies (on by default)" 2304,fsiEntryPointWontBeInvoked,"Functions with [] are not invoked in FSI. '%s' was not invoked. Execute '%s ' in order to invoke '%s' with the appropriate string array of command line arguments." +fsiDetailedHelpLink,"See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details." \ No newline at end of file diff --git a/src/fcs-fable/src/Compiler/Interactive/FSharpInteractiveServer.fs b/src/fcs-fable/src/Compiler/Interactive/FSharpInteractiveServer.fs index 9c66f2df2c..557a1170e5 100644 --- a/src/fcs-fable/src/Compiler/Interactive/FSharpInteractiveServer.fs +++ b/src/fcs-fable/src/Compiler/Interactive/FSharpInteractiveServer.fs @@ -10,10 +10,10 @@ open System.Threading module CtrlBreakHandlers = - let interuptCommand = "Interactive-CtrlCNotificationCommand-Interupt" + let interruptCommand = "Interactive-CtrlCNotificationCommand-Interrupt" - let lineInteruptCommand = - Encoding.UTF8.GetBytes(interuptCommand + Environment.NewLine) + let lineInterruptCommand = + Encoding.UTF8.GetBytes(interruptCommand + Environment.NewLine) let connectionTimeout = 1000 @@ -35,7 +35,7 @@ module CtrlBreakHandlers = while not (stream.EndOfStream) do let line = stream.ReadLine() - if line = interuptCommand then + if line = interruptCommand then this.Interrupt() finally stream.Close() @@ -56,7 +56,7 @@ module CtrlBreakHandlers = with _ -> () - client.Write(lineInteruptCommand, 0, lineInteruptCommand.Length) + client.Write(lineInterruptCommand, 0, lineInterruptCommand.Length) client.Flush() interface IDisposable with diff --git a/src/fcs-fable/src/Compiler/Interactive/fsi.fs b/src/fcs-fable/src/Compiler/Interactive/fsi.fs index 4cec0c7a8d..08bbb9f98a 100644 --- a/src/fcs-fable/src/Compiler/Interactive/fsi.fs +++ b/src/fcs-fable/src/Compiler/Interactive/fsi.fs @@ -71,6 +71,7 @@ open FSharp.Compiler.Tokenization open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.BuildGraph +open FSharp.Compiler.CheckExpressionsOps //---------------------------------------------------------------------------- // For the FSI as a service methods... @@ -121,7 +122,7 @@ module internal Utilities = } else let specialized = typedefof>.MakeGenericType [| ty |] - Activator.CreateInstance(specialized) :?> IAnyToLayoutCall + !! Activator.CreateInstance(specialized) :?> IAnyToLayoutCall let callStaticMethod (ty: Type) name args = ty.InvokeMember( @@ -373,7 +374,7 @@ type ILMultiInMemoryAssemblyEmitEnv let typT = convTypeRef tref let tyargs = List.map convTypeAux tspec.GenericArgs - let res = + let res: Type MaybeNull = match isNil tyargs, typT.IsGenericType with | _, true -> typT.MakeGenericType(List.toArray tyargs) | true, false -> typT @@ -388,7 +389,7 @@ type ILMultiInMemoryAssemblyEmitEnv and convTypeAux ty = match ty with - | ILType.Void -> Type.GetType("System.Void") + | ILType.Void -> !! Type.GetType("System.Void") | ILType.Array(shape, eltType) -> let baseT = convTypeAux eltType @@ -396,8 +397,8 @@ type ILMultiInMemoryAssemblyEmitEnv baseT.MakeArrayType() else baseT.MakeArrayType shape.Rank - | ILType.Value tspec -> convTypeSpec tspec - | ILType.Boxed tspec -> convTypeSpec tspec + | ILType.Value tspec -> !!(convTypeSpec tspec) + | ILType.Boxed tspec -> !!(convTypeSpec tspec) | ILType.Ptr eltType -> let baseT = convTypeAux eltType baseT.MakePointerType() @@ -435,7 +436,7 @@ type ILMultiInMemoryAssemblyEmitEnv let ltref = mkRefForNestedILTypeDef ILScopeRef.Local (enc, tdef) let tref = mkRefForNestedILTypeDef ilScopeRef (enc, tdef) let key = tref.BasicQualifiedName - let typ = asm.GetType(key) + let typ = !! asm.GetType(key) //printfn "Adding %s --> %s" key typ.FullName let rtref = rescopeILTypeRef dynamicCcuScopeRef tref typeMap.Add(ltref, (typ, tref)) @@ -510,7 +511,7 @@ type FsiEvaluationSessionHostConfig() = abstract FloatingPointFormat: string /// Called by the evaluation session to ask the host for parameters to format text for output - abstract AddedPrinters: Choice string), Type * (obj -> obj)> list + abstract AddedPrinters: Choice string), Type * (objnull -> objnull)> list /// Called by the evaluation session to ask the host for parameters to format text for output abstract ShowDeclarationValues: bool @@ -587,7 +588,7 @@ type FsiEvaluationSessionHostConfig() = type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, outWriter: TextWriter) = /// This printer is used by F# Interactive if no other printers apply. - let DefaultPrintingIntercept (ienv: IEnvironment) (obj: obj) = + let DefaultPrintingIntercept (ienv: IEnvironment) (obj: objnull) = match obj with | null -> None | :? System.Collections.IDictionary as ie -> @@ -629,10 +630,10 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, outWriter: Te match x with | Choice1Of2(aty: Type, printer) -> yield - (fun _ienv (obj: obj) -> + (fun _ienv (obj: objnull) -> match obj with | null -> None - | _ when aty.IsAssignableFrom(obj.GetType()) -> + | obj when aty.IsAssignableFrom(obj.GetType()) -> let text = printer obj match box text with @@ -642,10 +643,10 @@ type internal FsiValuePrinter(fsi: FsiEvaluationSessionHostConfig, outWriter: Te | Choice2Of2(aty: Type, converter) -> yield - (fun ienv (obj: obj) -> + (fun ienv (obj: objnull) -> match obj with | null -> None - | _ when aty.IsAssignableFrom(obj.GetType()) -> + | obj when aty.IsAssignableFrom(obj.GetType()) -> match converter obj with | null -> None | res -> Some(ienv.GetLayout res) @@ -845,7 +846,7 @@ type internal FsiStdinSyphon(errorWriter: TextWriter) = /// Encapsulates functions used to write to outWriter and errorWriter type internal FsiConsoleOutput(tcConfigB, outWriter: TextWriter, errorWriter: TextWriter) = - let nullOut = new StreamWriter(Stream.Null) :> TextWriter + let nullOut = TextWriter.Null let fprintfnn (os: TextWriter) fmt = Printf.kfprintf @@ -897,7 +898,8 @@ type internal DiagnosticsLoggerThatStopsOnFirstError override _.DiagnosticSink(diagnostic, severity) = let tcConfig = TcConfig.Create(tcConfigB, validate = false) - if diagnostic.ReportAsError(tcConfig.diagnosticsOptions, severity) then + match diagnostic.AdjustSeverity(tcConfig.diagnosticsOptions, severity) with + | FSharpDiagnosticSeverity.Error -> fsiStdinSyphon.PrintDiagnostic(tcConfig, diagnostic) errorCount <- errorCount + 1 @@ -905,20 +907,14 @@ type internal DiagnosticsLoggerThatStopsOnFirstError exit 1 (* non-zero exit code *) // STOP ON FIRST ERROR (AVOIDS PARSER ERROR RECOVERY) raise StopProcessing - elif diagnostic.ReportAsWarning(tcConfig.diagnosticsOptions, severity) then - DoWithDiagnosticColor FSharpDiagnosticSeverity.Warning (fun () -> - fsiConsoleOutput.Error.WriteLine() - diagnostic.WriteWithContext(fsiConsoleOutput.Error, " ", fsiStdinSyphon.GetLine, tcConfig, severity) - fsiConsoleOutput.Error.WriteLine() - fsiConsoleOutput.Error.WriteLine() - fsiConsoleOutput.Error.Flush()) - elif diagnostic.ReportAsInfo(tcConfig.diagnosticsOptions, severity) then - DoWithDiagnosticColor FSharpDiagnosticSeverity.Info (fun () -> + | (FSharpDiagnosticSeverity.Warning | FSharpDiagnosticSeverity.Info) as adjustedSeverity -> + DoWithDiagnosticColor adjustedSeverity (fun () -> fsiConsoleOutput.Error.WriteLine() diagnostic.WriteWithContext(fsiConsoleOutput.Error, " ", fsiStdinSyphon.GetLine, tcConfig, severity) fsiConsoleOutput.Error.WriteLine() fsiConsoleOutput.Error.WriteLine() fsiConsoleOutput.Error.Flush()) + | FSharpDiagnosticSeverity.Hidden -> () override _.ErrorCount = errorCount @@ -933,12 +929,12 @@ type DiagnosticsLogger with /// Get the directory name from a string, with some defaults if it doesn't have one let internal directoryName (s: string) = - if s = "" then + if String.IsNullOrEmpty(s) then "." else match Path.GetDirectoryName s with - | null -> if FileSystem.IsPathRootedShim s then s else "." - | res -> if res = "" then "." else res + | Null -> if FileSystem.IsPathRootedShim s then s else "." + | NonNull res -> if String.IsNullOrEmpty(res) then "." else res //---------------------------------------------------------------------------- // cmd line - state for options @@ -975,10 +971,11 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, argv: s let executableFileNameWithoutExtension = lazy let getFsiCommandLine () = - let fileNameWithoutExtension path = Path.GetFileNameWithoutExtension(path) + let fileNameWithoutExtension (path: string MaybeNull) = Path.GetFileNameWithoutExtension(path) let currentProcess = Process.GetCurrentProcess() - let processFileName = fileNameWithoutExtension currentProcess.MainModule.FileName + let mainModule = currentProcess.MainModule + let processFileName = fileNameWithoutExtension (mainModule ^ _.FileName) let commandLineExecutableFileName = try @@ -993,7 +990,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, argv: s | _ -> StringComparison.OrdinalIgnoreCase if String.Compare(processFileName, commandLineExecutableFileName, stringComparison) = 0 then - processFileName + !!processFileName else sprintf "%s %s" processFileName commandLineExecutableFileName @@ -1007,6 +1004,8 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, argv: s fprintfn fsiConsoleOutput.Out "" fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage (executableFileNameWithoutExtension.Value)) Console.Write(GetCompilerOptionBlocks blocks tcConfigB.bufferWidth) + fprintfn fsiConsoleOutput.Out "" + fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiDetailedHelpLink ()) exit 0 // option tags @@ -1201,11 +1200,6 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, argv: s if tcConfigB.clearResultsCache then dependencyProvider.ClearResultsCache(tcConfigB.compilerToolPaths, getOutputDir tcConfigB, reportError rangeCmdArgs) - if tcConfigB.utf8output then - let prev = Console.OutputEncoding - Console.OutputEncoding <- Encoding.UTF8 - System.AppDomain.CurrentDomain.ProcessExit.Add(fun _ -> Console.OutputEncoding <- prev) - do let firstArg = match sourceFiles with @@ -1240,6 +1234,10 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, argv: s fsiConsoleOutput.uprintfn """ #time ["on"|"off"];; // %s""" (FSIstrings.SR.fsiIntroTextHashtimeInfo ()) fsiConsoleOutput.uprintfn """ #help;; // %s""" (FSIstrings.SR.fsiIntroTextHashhelpInfo ()) + fsiConsoleOutput.uprintfn + """ #help "idn";; // %s""" + (FSIstrings.SR.fsiIntroTextHashhelpdocInfo ()) + if tcConfigB.langVersion.SupportsFeature(LanguageFeature.PackageManagement) then for msg in dependencyProvider.GetRegisteredDependencyManagerHelpText( @@ -1525,8 +1523,8 @@ let ConvReflectionTypeToILTypeRef (reflectionTy: Type) = let aref = ILAssemblyRef.FromAssemblyName(reflectionTy.Assembly.GetName()) let scoref = ILScopeRef.Assembly aref - let fullName = reflectionTy.FullName - let index = fullName.IndexOf("[") + let fullName = reflectionTy.FullName |> nullArgCheck "reflectionTy.FullName" + let index = fullName.IndexOfOrdinal("[") let fullName = if index = -1 then @@ -1559,15 +1557,15 @@ let rec ConvReflectionTypeToILType (reflectionTy: Type) = if ctors.Length = 1 - && (not (isNull (ctors[0].GetCustomAttribute()))) + && not (isNull (box (ctors[0].GetCustomAttribute()))) && not ctors[0].IsPublic && IsCompilerGeneratedName reflectionTy.Name then let rec get (typ: Type) = - if FSharp.Reflection.FSharpType.IsFunction typ.BaseType then - get typ.BaseType - else - typ + match typ.BaseType with + | null -> typ + | baseTyp when FSharp.Reflection.FSharpType.IsFunction baseTyp -> get baseTyp + | _ -> typ get reflectionTy else @@ -1577,7 +1575,7 @@ let rec ConvReflectionTypeToILType (reflectionTy: Type) = let elementOrItemTref = if reflectionTy.HasElementType then - reflectionTy.GetElementType() + !! reflectionTy.GetElementType() else reflectionTy |> ConvReflectionTypeToILTypeRef @@ -1606,7 +1604,10 @@ let rec ConvReflectionTypeToILType (reflectionTy: Type) = let internal mkBoundValueTypedImpl tcGlobals m moduleName name ty = let vis = Accessibility.TAccess([]) - let compPath = (CompilationPath.CompPath(ILScopeRef.Local, [])) + + let compPath = + (CompilationPath.CompPath(ILScopeRef.Local, SyntaxAccess.Unknown, [])) + let mutable mty = Unchecked.defaultof<_> let entity = @@ -1666,34 +1667,6 @@ let internal mkBoundValueTypedImpl tcGlobals m moduleName name ty = let qname = QualifiedNameOfFile.QualifiedNameOfFile(Ident(moduleName, m)) entity, v, CheckedImplFile.CheckedImplFile(qname, [], mty, contents, false, false, StampMap.Empty, Map.empty) -let scriptingSymbolsPath = - let createDirectory path = - lazy - try - if not (Directory.Exists(path)) then - Directory.CreateDirectory(path) |> ignore - - path - with _ -> - path - - createDirectory (Path.Combine(Path.GetTempPath(), $"{DateTime.Now:s}-{Guid.NewGuid():n}".Replace(':', '-'))) - -let deleteScriptingSymbols () = - try -#if !DEBUG - if scriptingSymbolsPath.IsValueCreated then - if Directory.Exists(scriptingSymbolsPath.Value) then - Directory.Delete(scriptingSymbolsPath.Value, true) -#else - () -#endif - with _ -> - () - -AppDomain.CurrentDomain.ProcessExit -|> Event.add (fun _ -> deleteScriptingSymbols ()) - let dynamicCcuName = "FSI-ASSEMBLY" /// Encapsulates the coordination of the typechecking, optimization and code generation @@ -1755,6 +1728,33 @@ type internal FsiDynamicCompiler let reportedAssemblies = Dictionary() + let scriptingSymbolsPath = + let createDirectory (path: string) = + try + if not (Directory.Exists(path)) then + Directory.CreateDirectory(path) |> ignore + + path + with _ -> + path + + createDirectory (Path.Combine(Path.GetTempPath(), $"{DateTime.Now:s}-{Guid.NewGuid():n}".Replace(':', '-'))) + + let deleteScriptingSymbols () = + try +#if !DEBUG + if Directory.Exists(scriptingSymbolsPath) then + Directory.Delete(scriptingSymbolsPath, true) +#else + () +#endif + with _ -> + () + + do + AppDomain.CurrentDomain.ProcessExit + |> Event.add (fun _ -> deleteScriptingSymbols ()) + /// Add attributes let CreateModuleFragment (tcConfigB: TcConfigBuilder, dynamicCcuName, codegenResults) = if progress then @@ -1832,7 +1832,7 @@ type internal FsiDynamicCompiler { ilg = tcGlobals.ilg outfile = $"{multiAssemblyName}-{dynamicAssemblyId}.dll" - pdbfile = Some(Path.Combine(scriptingSymbolsPath.Value, $"{multiAssemblyName}-{dynamicAssemblyId}.pdb")) + pdbfile = Some(Path.Combine(scriptingSymbolsPath, $"{multiAssemblyName}-{dynamicAssemblyId}.pdb")) emitTailcalls = tcConfig.emitTailcalls deterministic = tcConfig.deterministic portablePDB = true @@ -1854,7 +1854,12 @@ type internal FsiDynamicCompiler let asm = match opts.pdbfile, pdbBytes with - | (Some pdbfile), (Some pdbBytes) -> File.WriteAllBytes(pdbfile, pdbBytes) + | (Some pdbfile), (Some pdbBytes) -> + File.WriteAllBytes(pdbfile, pdbBytes) +#if FOR_TESTING + Directory.CreateDirectory(scriptingSymbolsPath.Value) |> ignore + File.WriteAllBytes(Path.ChangeExtension(pdbfile, ".dll"), assemblyBytes) +#endif | _ -> () match pdbBytes with @@ -1893,7 +1898,7 @@ type internal FsiDynamicCompiler if edef.ArgCount = 0 then yield (fun () -> - let typ = asm.GetType(edef.DeclaringTypeRef.BasicQualifiedName) + let typ = !! asm.GetType(edef.DeclaringTypeRef.BasicQualifiedName) try ignore ( @@ -1911,8 +1916,8 @@ type internal FsiDynamicCompiler ) None - with :? TargetInvocationException as e -> - Some e.InnerException) + with :? TargetInvocationException as e when isNotNull e.InnerException -> + Some !!e.InnerException) ] emEnv.AddModuleDef asm ilScopeRef ilxMainModule @@ -2299,7 +2304,7 @@ type internal FsiDynamicCompiler istate.tcState.TcEnvFromImpls.DisplayEnv, symbol, [], - ItemOccurence.Binding, + ItemOccurrence.Binding, v.DeclarationLocation ) @@ -2314,7 +2319,7 @@ type internal FsiDynamicCompiler istate.tcState.TcEnvFromImpls.DisplayEnv, symbol, [], - ItemOccurence.Binding, + ItemOccurrence.Binding, e.DeclarationLocation ) @@ -2405,7 +2410,7 @@ type internal FsiDynamicCompiler member _.DynamicAssemblies = dynamicAssemblies.ToArray() member _.FindDynamicAssembly(name, useFullName: bool) = - let getName (assemblyName: AssemblyName) = + let getName (assemblyName: AssemblyName) : string MaybeNull = if useFullName then assemblyName.FullName else @@ -2496,7 +2501,7 @@ type internal FsiDynamicCompiler processContents newState declaredImpls /// Evaluate the given expression and produce a new interactive state. - member fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger: DiagnosticsLogger, istate, expr: SynExpr) = + member fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger: DiagnosticsLogger, istate, expr: SynExpr, suppressItPrint) = let tcConfig = TcConfig.Create(tcConfigB, validate = false) let itName = "it" @@ -2510,7 +2515,7 @@ type internal FsiDynamicCompiler // Snarf the type for 'it' via the binding match istate.tcState.TcEnvFromImpls.NameEnv.FindUnqualifiedItem itName with | Item.Value vref -> - if not tcConfig.noFeedback then + if not tcConfig.noFeedback && not suppressItPrint then let infoReader = InfoReader(istate.tcGlobals, istate.tcImports.GetImportMap()) valuePrinter.InvokeExprPrinter( @@ -2607,7 +2612,7 @@ type internal FsiDynamicCompiler /// Process any delayed assembly additions. member _.ProcessDelayedReferences(ctok, istate) = - // Grab the dealyed assembly reference additions + // Grab the delayed assembly reference additions let refs = delayedReferences |> Seq.toList delayedReferences.Clear() @@ -2776,13 +2781,13 @@ type internal FsiDynamicCompiler istate // error already reported with _ -> - // An exception occured during processing, so remove the lines causing the error from the package manager list. + // An exception occurred during processing, so remove the lines causing the error from the package manager list. tcConfigB.packageManagerLines <- PackageManagerLine.RemoveUnprocessedLines packageManagerKey tcConfigB.packageManagerLines reraise ()) - member fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncudePathDirective(ctok, istate, directiveKind, path, show, m) = + member fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncludePathDirective(ctok, istate, directiveKind, path, show, m) = let dm = fsiOptions.DependencyProvider.TryFindDependencyManagerInPath( tcConfigB.compilerToolPaths, @@ -2830,11 +2835,11 @@ type internal FsiDynamicCompiler st), (fun st (m, path, directive) -> let st, _ = - fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncudePathDirective(ctok, st, directive, path, false, m) + fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncludePathDirective(ctok, st, directive, path, false, m) st), (fun _ _ -> ())) - (tcConfigB, input, Path.GetDirectoryName sourceFile, istate)) + (tcConfigB, input, !! Path.GetDirectoryName(sourceFile), istate)) member fsiDynamicCompiler.EvalSourceFiles(ctok, istate, m, sourceFiles, lexResourceManager, diagnosticsLogger: DiagnosticsLogger) = let tcConfig = TcConfig.Create(tcConfigB, validate = false) @@ -2929,11 +2934,9 @@ type internal FsiDynamicCompiler | _ -> None | _ -> None - member _.AddBoundValue(ctok, diagnosticsLogger: DiagnosticsLogger, istate, name: string, value: obj) = + member _.AddBoundValue(ctok, diagnosticsLogger: DiagnosticsLogger, istate, name: string, value: objnull) = try - match value with - | null -> nullArg "value" - | _ -> () + let value = value |> nullArgCheck (nameof value) if String.IsNullOrWhiteSpace name then invalidArg "name" "Name cannot be null or white-space." @@ -3251,7 +3254,7 @@ type internal FsiInterruptController // - The requesting assembly (that is, the assembly that is returned by the ResolveEventArgs.RequestingAssembly property) // was loaded without context. // -// On the coreclr we add an UnmanagedDll Resoution handler to ensure that native dll's can be searched for, +// On the coreclr we add an UnmanagedDll Resolution handler to ensure that native dll's can be searched for, // the desktop version of the Clr does not support this mechanism. // // For information about contexts, see the Assembly.LoadFrom(String) method overload. @@ -3274,7 +3277,7 @@ type internal MagicAssemblyResolution() = fsiDynamicCompiler: FsiDynamicCompiler, fsiConsoleOutput: FsiConsoleOutput, fullAssemName: string - ) = + ) : Assembly MaybeNull = try // Grab the name of the assembly @@ -3430,7 +3433,7 @@ type internal MagicAssemblyResolution() = fsiDynamicCompiler: FsiDynamicCompiler, fsiConsoleOutput: FsiConsoleOutput, fullAssemName: string - ) = + ) : Assembly MaybeNull = //Eliminate recursive calls to Resolve which can happen via our callout to msbuild resolution if MagicAssemblyResolution.resolving then @@ -3519,13 +3522,13 @@ type FsiStdinLexerProvider | NonNull t -> fsiStdinSyphon.Add(t + "\n")) match inputOption with - | Some null + | Some Null | None -> if progress then fprintfn fsiConsoleOutput.Out "End of file from TextReader.ReadLine" 0 - | Some(input: string) -> + | Some(NonNull input) -> let input = input + "\n" if input.Length > len then @@ -3721,37 +3724,84 @@ type FsiInteractionProcessor stopProcessingRecovery e range0 None + let runhDirective diagnosticsLogger ctok istate source = + let lexbuf = + UnicodeLexing.StringAsLexbuf(true, tcConfigB.langVersion, tcConfigB.strictIndentation, $"<@@ {source} @@>") + + let tokenizer = + fsiStdinLexerProvider.CreateBufferLexer("hdummy.fsx", lexbuf, diagnosticsLogger) + + let parsedInteraction = ParseInteraction tokenizer + + match parsedInteraction with + | Some(ParsedScriptInteraction.Definitions([ SynModuleDecl.Expr(e, _) ], _)) -> + + let _state, status = + fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, e, true) + + match status with + | Completed(Some compStatus) -> + match compStatus.ReflectionValue with + | :? FSharp.Quotations.Expr as qex -> + let s = FsiHelp.Logic.Quoted.h qex + fsiConsoleOutput.uprintf "%s" s + | _ -> () + | _ -> () + | _ -> () + /// Partially process a hash directive, leaving state in packageManagerLines and required assemblies let PartiallyProcessHashDirective (ctok, istate, hash, diagnosticsLogger: DiagnosticsLogger) = match hash with - | ParsedHashDirective("load", ParsedHashDirectiveArguments sourceFiles, m) -> + | ParsedHashDirective("load", paths, m) -> + let sourceFiles = parsedHashDirectiveArguments paths tcConfigB.langVersion + let istate = fsiDynamicCompiler.EvalSourceFiles(ctok, istate, m, sourceFiles, lexResourceManager, diagnosticsLogger) istate, Completed None - | ParsedHashDirective(("reference" | "r"), ParsedHashDirectiveArguments [ path ], m) -> - fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncudePathDirective(ctok, istate, Directive.Resolution, path, true, m) + | ParsedHashDirective(("reference" | "r"), [ reference ], m) -> + let path = + (parsedHashDirectiveStringArguments [ reference ] tcConfigB.langVersion) + |> List.head + + fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncludePathDirective(ctok, istate, Directive.Resolution, path, true, m) - | ParsedHashDirective("i", ParsedHashDirectiveArguments [ path ], m) -> - fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncudePathDirective(ctok, istate, Directive.Include, path, true, m) + | ParsedHashDirective("i", [ path ], m) -> + let path = + (parsedHashDirectiveStringArguments [ path ] tcConfigB.langVersion) |> List.head + + fsiDynamicCompiler.PartiallyProcessReferenceOrPackageIncludePathDirective(ctok, istate, Directive.Include, path, true, m) + + | ParsedHashDirective("I", [ path ], m) -> + let path = + (parsedHashDirectiveStringArguments [ path ] tcConfigB.langVersion) |> List.head - | ParsedHashDirective("I", ParsedHashDirectiveArguments [ path ], m) -> tcConfigB.AddIncludePath(m, path, tcConfigB.implicitIncludeDir) let tcConfig = TcConfig.Create(tcConfigB, validate = false) fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiDidAHashI (tcConfig.MakePathAbsolute path)) istate, Completed None - | ParsedHashDirective("cd", ParsedHashDirectiveArguments [ path ], m) -> + | ParsedHashDirective("cd", [ path ], m) -> + let path = + (parsedHashDirectiveStringArguments [ path ] tcConfigB.langVersion) |> List.head + ChangeDirectory path m istate, Completed None - | ParsedHashDirective("silentCd", ParsedHashDirectiveArguments [ path ], m) -> + | ParsedHashDirective("silentCd", [ path ], m) -> + let path = + (parsedHashDirectiveStringArguments [ path ] tcConfigB.langVersion) |> List.head + ChangeDirectory path m fsiConsolePrompt.SkipNext() (* "silent" directive *) istate, Completed None - | ParsedHashDirective("interactiveprompt", ParsedHashDirectiveArguments [ "show" | "hide" | "skip" as showPrompt ], m) -> + | ParsedHashDirective("interactiveprompt", [ prompt ], m) -> + let showPrompt = + (parsedHashDirectiveStringArguments [ prompt ] tcConfigB.langVersion) + |> List.head + match showPrompt with | "show" -> fsiConsolePrompt.ShowPrompt <- true | "hide" -> fsiConsolePrompt.ShowPrompt <- false @@ -3764,29 +3814,35 @@ type FsiInteractionProcessor let istate = { istate with debugBreak = true } istate, Completed None - | ParsedHashDirective("time", [], _) -> - if istate.timing then - fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOff ()) - else - fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOn ()) + | ParsedHashDirective("time", switch, m) -> + let arguments = parsedHashDirectiveArguments switch tcConfigB.langVersion let istate = - { istate with - timing = not istate.timing - } - - istate, Completed None + match arguments with + | [] -> + if istate.timing then + fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOff ()) + else + fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOn ()) - | ParsedHashDirective("time", ParsedHashDirectiveArguments [ "on" | "off" as v ], _) -> - if v <> "on" then - fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOff ()) - else - fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOn ()) + { istate with + timing = not istate.timing + } + | [ "on" ] -> + fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOn ()) + { istate with timing = true } + | [ "off" ] -> + fsiConsoleOutput.uprintnfnn "%s" (FSIstrings.SR.fsiTurnedTimingOff ()) + { istate with timing = false } + | _ -> + errorR (Error(FSComp.SR.buildInvalidHashtimeDirective (), m)) + istate - let istate = { istate with timing = (v = "on") } istate, Completed None - | ParsedHashDirective("nowarn", ParsedHashDirectiveArguments numbers, m) -> + | ParsedHashDirective("nowarn", nowarnArguments, m) -> + let numbers = (parsedHashDirectiveArgumentsNoCheck nowarnArguments) + List.iter (fun (d: string) -> tcConfigB.TurnWarningOff(m, d)) numbers istate, Completed None @@ -3813,15 +3869,22 @@ type FsiInteractionProcessor | ParsedHashDirective(("q" | "quit"), [], _) -> fsiInterruptController.Exit() - | ParsedHashDirective("help", [], m) -> - fsiOptions.ShowHelp(m) + | ParsedHashDirective("help", hashArguments, m) -> + let args = (parsedHashDirectiveArguments hashArguments tcConfigB.langVersion) + + match args with + | [] -> fsiOptions.ShowHelp(m) + | [ arg ] -> runhDirective diagnosticsLogger ctok istate arg + | _ -> warning (Error((FSComp.SR.fsiInvalidDirective ("help", String.concat " " args)), m)) + istate, Completed None - | ParsedHashDirective(c, ParsedHashDirectiveArguments arg, m) -> + | ParsedHashDirective(c, hashArguments, m) -> + let arg = (parsedHashDirectiveArguments hashArguments tcConfigB.langVersion) warning (Error((FSComp.SR.fsiInvalidDirective (c, String.concat " " arg)), m)) istate, Completed None - /// Most functions return a step status - this decides whether to continue and propogates the + /// Most functions return a step status - this decides whether to continue and propagates the /// last value produced let ProcessStepStatus (istate, cont) lastResult f = match cont with @@ -3863,7 +3926,7 @@ type FsiInteractionProcessor | InteractionGroup.HashDirectives [] -> istate, Completed None | InteractionGroup.Definitions([ SynModuleDecl.Expr(expr, _) ], _) -> - fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr) + fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr, false) | InteractionGroup.Definitions(defs, _) -> fsiDynamicCompiler.EvalParsedDefinitions(ctok, diagnosticsLogger, istate, true, false, defs) @@ -4057,7 +4120,7 @@ type FsiInteractionProcessor |> InteractiveCatch diagnosticsLogger (fun istate -> istate |> mainThreadProcessAction ctok (fun ctok istate -> - fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr))) + fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr, false))) let commitResult (istate, result) = match result with @@ -4089,7 +4152,6 @@ type FsiInteractionProcessor ?cancellationToken: CancellationToken ) = let cancellationToken = defaultArg cancellationToken CancellationToken.None - use _ = Cancellable.UsingToken(cancellationToken) if tokenizer.LexBuffer.IsPastEndOfStream then let stepStatus = @@ -4218,7 +4280,6 @@ type FsiInteractionProcessor member _.EvalInteraction(ctok, sourceText, scriptFileName, diagnosticsLogger, ?cancellationToken) = let cancellationToken = defaultArg cancellationToken CancellationToken.None - use _ = Cancellable.UsingToken(cancellationToken) use _ = UseBuildPhase BuildPhase.Interactive use _ = UseDiagnosticsLogger diagnosticsLogger use _scope = SetCurrentUICultureForThread fsiOptions.FsiLCID @@ -4257,7 +4318,14 @@ type FsiInteractionProcessor let m = expr.Range // Make this into "(); expr" to suppress generalization and compilation-as-function let exprWithSeq = - SynExpr.Sequential(DebugPointAtSequential.SuppressExpr, true, SynExpr.Const(SynConst.Unit, m.StartRange), expr, m) + SynExpr.Sequential( + DebugPointAtSequential.SuppressExpr, + true, + SynExpr.Const(SynConst.Unit, m.StartRange), + expr, + m, + SynExprSequentialTrivia.Zero + ) ExecuteParsedExpressionOnMainThread(ctok, diagnosticsLogger, exprWithSeq, istate)) |> commitResult @@ -4571,6 +4639,20 @@ type FsiEvaluationSession with e -> warning (e) + let restoreEncoding = + if tcConfigB.utf8output && Console.OutputEncoding <> Text.Encoding.UTF8 then + let previousEncoding = Console.OutputEncoding + Console.OutputEncoding <- Encoding.UTF8 + + Some( + { new IDisposable with + member _.Dispose() = + Console.OutputEncoding <- previousEncoding + } + ) + else + None + do updateBannerText () // resetting banner text after parsing options @@ -4595,8 +4677,7 @@ type FsiEvaluationSession try let tcConfig = tcConfigP.Get(ctokStartup) - checker.FrameworkImportsCache.Get tcConfig - |> NodeCode.RunImmediateWithoutCancellation + checker.FrameworkImportsCache.Get tcConfig |> Async.RunImmediate with e -> stopProcessingRecovery e range0 failwithf "Error creating evaluation session: %A" e @@ -4610,7 +4691,7 @@ type FsiEvaluationSession unresolvedReferences, fsiOptions.DependencyProvider ) - |> NodeCode.RunImmediateWithoutCancellation + |> Async.RunImmediate with e -> stopProcessingRecovery e range0 failwithf "Error creating evaluation session: %A" e @@ -4619,7 +4700,7 @@ type FsiEvaluationSession let lexResourceManager = LexResourceManager() /// The lock stops the type checker running at the same time as the server intellisense implementation. - let tcLockObject = box 7 // any new object will do + let tcLockObject = box 7 |> Unchecked.nonNull // any new object will do let resolveAssemblyRef (aref: ILAssemblyRef) = // Explanation: This callback is invoked during compilation to resolve assembly references @@ -4683,7 +4764,7 @@ type FsiEvaluationSession let makeNestedException (userExn: #Exception) = // clone userExn -- make userExn the inner exception, to retain the stacktrace on raise let arguments = [| userExn.Message :> obj; userExn :> obj |] - Activator.CreateInstance(userExn.GetType(), arguments) :?> Exception + !! Activator.CreateInstance(userExn.GetType(), arguments) :?> Exception let commitResult res = match res with @@ -4715,6 +4796,7 @@ type FsiEvaluationSession member _.Dispose() = (tcImports :> IDisposable).Dispose() uninstallMagicAssemblyResolution.Dispose() + restoreEncoding |> Option.iter (fun x -> x.Dispose()) /// Load the dummy interaction, load the initial files, and, /// if interacting, start the background thread to read the standard input. @@ -4895,7 +4977,6 @@ type FsiEvaluationSession SpawnInteractiveServer(fsi, fsiOptions, fsiConsoleOutput) use _ = UseBuildPhase BuildPhase.Interactive - use _ = Cancellable.UsingToken(CancellationToken.None) if fsiOptions.Interact then // page in the type check env @@ -4988,8 +5069,8 @@ module Settings = let runSignal = new AutoResetEvent(false) let exitSignal = new AutoResetEvent(false) let doneSignal = new AutoResetEvent(false) - let mutable queue = ([]: (unit -> obj) list) - let mutable result = (None: obj option) + let mutable queue = ([]: (unit -> objnull) list) + let mutable result = (None: objnull option) let setSignal (signal: AutoResetEvent) = while not (signal.Set()) do diff --git a/src/fcs-fable/src/Compiler/Interactive/fsi.fsi b/src/fcs-fable/src/Compiler/Interactive/fsi.fsi index 6c1bed8c41..c34a583cdb 100644 --- a/src/fcs-fable/src/Compiler/Interactive/fsi.fsi +++ b/src/fcs-fable/src/Compiler/Interactive/fsi.fsi @@ -8,6 +8,7 @@ open System.Threading open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.Diagnostics open FSharp.Compiler.Symbols +open Internal.Utilities.Library /// Represents an evaluated F# value [] @@ -62,7 +63,7 @@ type public FsiEvaluationSessionHostConfig = abstract FloatingPointFormat: string /// Called by the evaluation session to ask the host for parameters to format text for output - abstract AddedPrinters: Choice string), Type * (obj -> obj)> list + abstract AddedPrinters: Choice string), Type * (objnull -> objnull)> list /// Called by the evaluation session to ask the host for parameters to format text for output abstract ShowDeclarationValues: bool @@ -396,7 +397,7 @@ module Settings = /// Register a print transformer that controls the output of the interactive session. member AddPrintTransformer: ('T -> obj) -> unit - member internal AddedPrinters: Choice string), Type * (obj -> obj)> list + member internal AddedPrinters: Choice string), Type * (objnull -> objnull)> list /// The command line arguments after ignoring the arguments relevant to the interactive /// environment and replacing the first argument with the name of the last script file, @@ -405,7 +406,7 @@ module Settings = /// returned by System.Environment.GetCommandLineArgs. member CommandLineArgs: string[] with get, set - /// Gets or sets a the current event loop being used to process interactions. + /// Gets or sets the current event loop being used to process interactions. member EventLoop: IEventLoop with get, set /// A default implementation of the 'fsi' object, used by GetDefaultConfiguration(). Note this diff --git a/src/fcs-fable/src/Compiler/Interactive/fsihelp.fs b/src/fcs-fable/src/Compiler/Interactive/fsihelp.fs new file mode 100644 index 0000000000..eb1efd22ed --- /dev/null +++ b/src/fcs-fable/src/Compiler/Interactive/fsihelp.fs @@ -0,0 +1,272 @@ +module FSharp.Compiler.Interactive.FsiHelp + +open System +open System.Collections.Generic +open System.IO +open System.Text +open System.Reflection +open FSharp.Compiler.IO + +// 3261 Is the nullness warning. I really tried to properly check all accesses, but the chosen xml API has nulls everywhere and is not a good fit for compiler nullness checking. +// Even basic constructs like `n.Attributes.GetNamedItem("name").Value` have `| null| on every single dot access. +#nowarn "3261" + +module Parser = + + open System.Xml + + type Help = + { + Summary: string + Remarks: string option + Parameters: (string * string) list + Returns: string option + Exceptions: (string * string) list + Examples: (string * string) list + FullName: string + Assembly: string + } + + member this.ToDisplayString() = + let sb = StringBuilder() + + let parameters = + this.Parameters + |> List.map (fun (name, description) -> sprintf "- %s: %s" name description) + |> String.concat "\n" + + sb.AppendLine().AppendLine("Description:").AppendLine(this.Summary) |> ignore + + match this.Remarks with + | Some r -> sb.AppendLine $"\nRemarks:\n%s{r}" |> ignore + | None -> () + + if not (String.IsNullOrWhiteSpace(parameters)) then + sb.AppendLine $"\nParameters:\n%s{parameters}" |> ignore + + match this.Returns with + | Some r -> sb.AppendLine $"Returns:\n%s{r}" |> ignore + | None -> () + + if not this.Exceptions.IsEmpty then + sb.AppendLine "\nExceptions:" |> ignore + + for (exType, exDesc) in this.Exceptions do + sb.AppendLine $"%s{exType}: %s{exDesc}" |> ignore + + if not this.Examples.IsEmpty then + sb.AppendLine "\nExamples:" |> ignore + + for example, desc in this.Examples do + sb.AppendLine example |> ignore + + if not (String.IsNullOrWhiteSpace(desc)) then + sb.AppendLine $"""// {desc.Replace("\n", "\n// ")}""" |> ignore + + sb.AppendLine "" |> ignore + + sb.AppendLine $"Full name: %s{this.FullName}" |> ignore + sb.AppendLine $"Assembly: %s{this.Assembly}" |> ignore + + sb.ToString() + + let cleanupXmlContent (s: string) = s.Replace("\n ", "\n").Trim() // some stray whitespace from the XML + + // remove any leading `X:` and trailing `N + let trimDotNet (s: string) = + let s = if s.Length > 2 && s[1] = ':' then s.Substring(2) else s + let idx = s.IndexOf('`') + let s = if idx > 0 then s.Substring(0, idx) else s + s + + let xmlDocCache = Dictionary() + + let tryGetXmlDocument xmlPath = + try + match xmlDocCache.TryGetValue(xmlPath) with + | true, value -> + let xmlDocument = XmlDocument() + xmlDocument.LoadXml(value) + Some xmlDocument + | _ -> + use stream = FileSystem.OpenFileForReadShim(xmlPath) + let rawXml = stream.ReadAllText() + let xmlDocument = XmlDocument() + xmlDocument.LoadXml(rawXml) + xmlDocCache.Add(xmlPath, rawXml) + Some xmlDocument + with _ -> + None + + let getTexts (node: Xml.XmlNode) = + seq { + for child in node.ChildNodes do + if child.Name = "#text" then + yield child.Value + + if child.Name = "c" then + yield child.InnerText + + if child.Name = "see" then + let cref = child.Attributes.GetNamedItem("cref") + + if not (isNull cref) then + yield cref.Value |> trimDotNet + } + |> String.concat "" + + let tryMkHelp (xmlDocument: XmlDocument option) (assembly: string) (modName: string) (implName: string) (sourceName: string) = + let sourceName = sourceName.Replace('.', '#') // for .ctor + let implName = implName.Replace('.', '#') // for .ctor + let xmlName = $"{modName}.{implName}" + + let toTry = + [ + $"""/doc/members/member[contains(@name, ":{xmlName}`")]""" + $"""/doc/members/member[contains(@name, ":{xmlName}(")]""" + $"""/doc/members/member[contains(@name, ":{xmlName}")]""" + ] + + xmlDocument + |> Option.bind (fun xmlDocument -> + seq { + for t in toTry do + let node = xmlDocument.SelectSingleNode(t) + if not (isNull node) then Some node else None + } + |> Seq.tryPick id) + |> function + | None -> ValueNone + | Some n -> + let summary = + n.SelectSingleNode("summary") + |> Option.ofObj + |> Option.map getTexts + |> Option.map cleanupXmlContent + + let remarks = + n.SelectSingleNode("remarks") + |> Option.ofObj + |> Option.map getTexts + |> Option.map cleanupXmlContent + + let parameters = + n.SelectNodes("param") + |> Seq.cast + |> Seq.map (fun n -> n.Attributes.GetNamedItem("name").Value.Trim(), n.InnerText.Trim()) + |> List.ofSeq + + let returns = + n.SelectSingleNode("returns") + |> Option.ofObj + |> Option.map (fun n -> getTexts(n).Trim()) + + let exceptions = + n.SelectNodes("exception") + |> Seq.cast + |> Seq.map (fun n -> + let exType = n.Attributes.GetNamedItem("cref").Value + let idx = exType.IndexOf(':') + let exType = if idx >= 0 then exType.Substring(idx + 1) else exType + exType.Trim(), n.InnerText.Trim()) + |> List.ofSeq + + let examples = + n.SelectNodes("example") + |> Seq.cast + |> Seq.map (fun n -> + let codeNode = n.SelectSingleNode("code") + + let code = + if isNull codeNode then + "" + else + n.RemoveChild(codeNode) |> ignore + cleanupXmlContent codeNode.InnerText + + code, cleanupXmlContent n.InnerText) + |> List.ofSeq + + match summary with + | Some s -> + { + Summary = s + Remarks = remarks + Parameters = parameters + Returns = returns + Exceptions = exceptions + Examples = examples + FullName = $"{modName}.{sourceName}" // the long ident as users see it + Assembly = assembly + } + |> ValueSome + | None -> ValueNone + +module Expr = + + open Microsoft.FSharp.Quotations.Patterns + + let tryGetSourceName (methodInfo: MethodInfo) = + try + let attr = methodInfo.GetCustomAttribute() + Some attr.SourceName + with _ -> + None + + let getInfos (declaringType: Type) (sourceName: string option) (implName: string) = + let xmlPath = Path.ChangeExtension(declaringType.Assembly.Location, ".xml") + let xmlDoc = Parser.tryGetXmlDocument xmlPath + let assembly = Path.GetFileName(declaringType.Assembly.Location) + + // for FullName cases like Microsoft.FSharp.Core.FSharpOption`1[System.Object] + let fullName = + let idx = declaringType.FullName.IndexOf('[') + + if idx >= 0 then + declaringType.FullName.Substring(0, idx) + else + declaringType.FullName + + let fullName = fullName.Replace('+', '.') // for FullName cases like Microsoft.FSharp.Collections.ArrayModule+Parallel + + (xmlDoc, assembly, fullName, implName, sourceName |> Option.defaultValue implName) + + let rec exprNames expr = + match expr with + | Call(exprOpt, methodInfo, _exprList) -> + match exprOpt with + | Some _ -> None + | None -> + let sourceName = tryGetSourceName methodInfo + getInfos methodInfo.DeclaringType sourceName methodInfo.Name |> Some + | Lambda(_param, body) -> exprNames body + | Let(_, _, body) -> exprNames body + | Value(_o, t) -> getInfos t (Some t.Name) t.Name |> Some + | DefaultValue t -> getInfos t (Some t.Name) t.Name |> Some + | PropertyGet(_o, info, _) -> getInfos info.DeclaringType (Some info.Name) info.Name |> Some + | NewUnionCase(info, _exprList) -> getInfos info.DeclaringType (Some info.Name) info.Name |> Some + | NewObject(ctorInfo, _e) -> getInfos ctorInfo.DeclaringType (Some ctorInfo.Name) ctorInfo.Name |> Some + | NewArray(t, _exprs) -> getInfos t (Some t.Name) t.Name |> Some + | NewTuple _ -> + let ty = typeof<_ * _> + getInfos ty (Some ty.Name) ty.Name |> Some + | NewStructTuple _ -> + let ty = typeof + getInfos ty (Some ty.Name) ty.Name |> Some + | _ -> None + +module Logic = + + open Expr + open Parser + + module Quoted = + let tryGetHelp (expr: Quotations.Expr) = + match exprNames expr with + | Some(xmlDocument, assembly, modName, implName, sourceName) -> tryMkHelp xmlDocument assembly modName implName sourceName + | _ -> ValueNone + + let h (expr: Quotations.Expr) = + match tryGetHelp expr with + | ValueNone -> "unable to get documentation\n" + | ValueSome d -> d.ToDisplayString() diff --git a/src/fcs-fable/src/Compiler/Interactive/fsihelp.fsi b/src/fcs-fable/src/Compiler/Interactive/fsihelp.fsi new file mode 100644 index 0000000000..34b8691c3f --- /dev/null +++ b/src/fcs-fable/src/Compiler/Interactive/fsihelp.fsi @@ -0,0 +1,23 @@ +module FSharp.Compiler.Interactive.FsiHelp + +module Parser = + + type Help = + { Summary: string + Remarks: string option + Parameters: (string * string) list + Returns: string option + Exceptions: (string * string) list + Examples: (string * string) list + FullName: string + Assembly: string } + + member ToDisplayString: unit -> string + +module Logic = + + module Quoted = + + val tryGetHelp: expr: Quotations.Expr -> Parser.Help voption + + val h: expr: Quotations.Expr -> string diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.cs.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.cs.xlf index 97dcca71c4..f34d1d6f7d 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.cs.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.cs.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. Funkce s [<EntryPoint>] nejsou vyvolány v FSI. {0} nebylo vyvoláno. Pokud chcete vyvolat {2} s příslušným polem řetězců argumentů příkazového řádku, spusťte příkaz{1} <args>. @@ -17,6 +22,11 @@ Vymazat obrazovku + + Display documentation for an identifier, e.g. #help \"List.map\";; + Zobrazit dokumentaci k identifikátoru, např. #help \"List.map\";; + + Operation could not be completed due to earlier error Operaci nešlo dokončit z důvodu dřívější chyby. diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.de.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.de.xlf index a3d73b0e67..8a295c3199 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.de.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.de.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. Funktionen mit [<EntryPoint>] werden in FSI nicht aufgerufen. '{0}' wurde nicht aufgerufen. Führen Sie '{1} <args>' aus, um '{2}' mit dem entsprechenden String-Array von Befehlszeilenargumenten aufzurufen. @@ -17,6 +22,11 @@ Bildschirm löschen + + Display documentation for an identifier, e.g. #help \"List.map\";; + Dokumentation für einen Bezeichner anzeigen, z. B. #help \"List.map\";; + + Operation could not be completed due to earlier error Der Vorgang konnte aufgrund eines vorherigen Fehlers nicht abgeschlossen werden. diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.es.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.es.xlf index 190ff245ba..23932efb4a 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.es.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.es.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. Las funciones con [<EntryPoint>] no se invocan en FSI. “{0}” no se invocó. Ejecute “{1} <args>” para invocar “{2}” con la matriz adecuada de cadenas de argumentos de línea de comandos. @@ -17,6 +22,11 @@ Borrar pantalla + + Display documentation for an identifier, e.g. #help \"List.map\";; + Mostrar documentación para un identificador, por ejemplo, #help \"List.map\";; + + Operation could not be completed due to earlier error La operación no se pudo completar debido a un error anterior diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.fr.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.fr.xlf index 38d7a20d8e..1e2032619d 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.fr.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.fr.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. Les fonctions avec [<EntryPoint>] ne sont pas appelées dans FSI. '{0}' n’a pas été appelée. Exécutez '{1} <args>' pour appeler '{2}' avec le tableau de chaînes approprié d’arguments de ligne de commande. @@ -17,6 +22,11 @@ Effacer l'écran + + Display documentation for an identifier, e.g. #help \"List.map\";; + Afficher la documentation pour un identifiant, par ex. #help \"List.map\ » ;; + + Operation could not be completed due to earlier error Impossible d'exécuter l'opération en raison d'une erreur antérieure diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.it.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.it.xlf index 9c916837e5..80dc7d6509 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.it.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.it.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. Le funzioni con [<EntryPoint>] non vengono richiamate in FSI. '{0}' non è stato richiamato. Eseguire '{1} <args>' per richiamare '{2}' con la matrice di stringhe appropriata degli argomenti della riga di comando. @@ -17,6 +22,11 @@ Cancella schermata + + Display documentation for an identifier, e.g. #help \"List.map\";; + Visualizzare la documentazione per un identificatore, ad esempio #help \"List.map\";; + + Operation could not be completed due to earlier error Non è stato possibile completare l'operazione a causa di un errore precedente diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ja.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ja.xlf index eab626f267..aab77e35fb 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ja.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ja.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. [<EntryPoint>] を含む関数は FSI では呼び出されません。'{0}' は呼び出されませんでした。コマンド ライン引数の適切な文字列配列を使用して '{2}' を呼び出すには、'{1} <args>' を実行してください。 @@ -17,6 +22,11 @@ 画面をクリアする + + Display documentation for an identifier, e.g. #help \"List.map\";; + 識別子のドキュメントを表示する (例:#help \"List.map\";; + + Operation could not be completed due to earlier error 以前のエラーが原因で操作を完了できませんでした diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ko.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ko.xlf index be891b9818..fc80e805ce 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ko.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ko.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. [<EntryPoint>]가 있는 함수는 FSI에서 호출되지 않습니다. '{0}'이(가) 호출되지 않았습니다. 명령줄 인수의 적절한 문자열 배열로 '{2}'을(를) 호출하려면 '{1}<args>'를 실행하세요. @@ -17,6 +22,11 @@ 화면 지우기 + + Display documentation for an identifier, e.g. #help \"List.map\";; + 식별자에 대한 설명서 표시(예: #help \"List.map\";;) + + Operation could not be completed due to earlier error 이전 오류로 인해 작업을 완료할 수 없습니다. diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pl.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pl.xlf index 58adec37da..57d8b491f4 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pl.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pl.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. Funkcje z elementem [<EntryPoint>] nie są wywoływane w interfejsie FSI. „{0}” nie został wywołany. Wykonaj polecenie „{1} <args>”, aby wywołać „{2}” z odpowiednią tablicą ciągów argumentów wiersza polecenia. @@ -17,6 +22,11 @@ Wyczyść ekran + + Display documentation for an identifier, e.g. #help \"List.map\";; + Wyświetl dokumentację identyfikatora, np. #help \"List.map\";; + + Operation could not be completed due to earlier error Nie udało się ukończyć operacji z powodu wcześniejszego błędu diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pt-BR.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pt-BR.xlf index b080a196f7..c9869893e0 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.pt-BR.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. As funções com [<EntryPoint>] não são invocadas no FSI. '{0}' não foi invocado. Execute '{1} <args>' para invocar '{2}' com a matriz de cadeia de caracteres apropriada dos argumentos da linha de comando. @@ -17,6 +22,11 @@ Limpar tela + + Display documentation for an identifier, e.g. #help \"List.map\";; + Exibir documentação para um identificador, por exemplo, #help \"List.map\";; + + Operation could not be completed due to earlier error Não foi possível concluir a operação devido a um erro anterior diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ru.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ru.xlf index e46822530d..ca55edd31d 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ru.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.ru.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. Функции с [<EntryPoint>] не вызываются в FSI. "{0}" не вызван. Выполните "{1} <args>", чтобы вызвать "{2}" с соответствующим строковым массивом аргументов командной строки. @@ -17,6 +22,11 @@ Очистить экран + + Display documentation for an identifier, e.g. #help \"List.map\";; + Отобразить документацию для идентификатора, например #help \"List.map\";; + + Operation could not be completed due to earlier error Операция не может быть завершена из-за предыдущей ошибки diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.tr.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.tr.xlf index 3222a474ef..cbab7d0b0a 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.tr.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.tr.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. [<EntryPoint>] ile işlevler, FSI'de çağrılmaz. '{0}' başlatılmadı. '{1} <args>' komutunu çalıştırarak uygun komut satırı bağımsız değişken dizisiyle '{2}' komutunu başlatın. @@ -17,6 +22,11 @@ Ekranı temizle + + Display documentation for an identifier, e.g. #help \"List.map\";; + Tanımlayıcı ile ilgili belgeleri görüntüle, ör. #help \"List.map\";; + + Operation could not be completed due to earlier error Önceki hata nedeniyle işlem tamamlanamadı diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hans.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hans.xlf index de485cc536..1da5881d77 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hans.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. FSI 中未调用具有 [<EntryPoint>] 的函数。未调用“{0}”。执行“{1} <args>”,以便使用命令行参数的相应字符串数组调用“{2}”。 @@ -17,6 +22,11 @@ 清除屏幕 + + Display documentation for an identifier, e.g. #help \"List.map\";; + 显示标识符的文档,例如#help \"List.map\";; + + Operation could not be completed due to earlier error 由于早期错误,无法完成操作 diff --git a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hant.xlf b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hant.xlf index 9348019132..bec99354ad 100644 --- a/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fcs-fable/src/Compiler/Interactive/xlf/FSIstrings.txt.zh-Hant.xlf @@ -2,6 +2,11 @@ + + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + See https://learn.microsoft.com/dotnet/fsharp/language-reference/fsharp-interactive-options for more details. + + Functions with [<EntryPoint>] are not invoked in FSI. '{0}' was not invoked. Execute '{1} <args>' in order to invoke '{2}' with the appropriate string array of command line arguments. FSI 中未叫用具有 [<EntryPoint>] 的函數。未叫用'{0}'。執行 '{1} <args>',以使用適當的命令列引數字串陣列叫用 '{2}'。 @@ -17,6 +22,11 @@ 清空螢幕 + + Display documentation for an identifier, e.g. #help \"List.map\";; + 顯示識別碼的文件,例如#help \"List.map\";; + + Operation could not be completed due to earlier error 因為先前發生錯誤,所以無法完成作業 diff --git a/src/fcs-fable/src/Compiler/Legacy/LegacyHostedCompilerForTesting.fs b/src/fcs-fable/src/Compiler/Legacy/LegacyHostedCompilerForTesting.fs index eb7928b5fd..d814232b18 100644 --- a/src/fcs-fable/src/Compiler/Legacy/LegacyHostedCompilerForTesting.fs +++ b/src/fcs-fable/src/Compiler/Legacy/LegacyHostedCompilerForTesting.fs @@ -191,7 +191,7 @@ type internal FscCompiler(legacyReferenceResolver) = let regex = Regex(@"^(/|--)test:ErrorRanges$", RegexOptions.Compiled ||| RegexOptions.IgnoreCase) - fun arg -> regex.IsMatch(arg) + fun (arg: string) -> regex.IsMatch(arg) #endif /// test if --vserrors flag is set @@ -203,7 +203,7 @@ type internal FscCompiler(legacyReferenceResolver) = let regex = Regex(@"^(/|--)vserrors$", RegexOptions.Compiled ||| RegexOptions.IgnoreCase) - fun arg -> regex.IsMatch(arg) + fun (arg: string) -> regex.IsMatch(arg) #endif /// test if an arg is a path to fsc.exe @@ -215,7 +215,7 @@ type internal FscCompiler(legacyReferenceResolver) = let regex = Regex(@"fsc(\.exe)?$", RegexOptions.Compiled ||| RegexOptions.IgnoreCase) - fun arg -> regex.IsMatch(arg) + fun (arg: string) -> regex.IsMatch(arg) #endif /// do compilation as if args was argv to fsc.exe @@ -223,11 +223,13 @@ type internal FscCompiler(legacyReferenceResolver) = // args.[0] is later discarded, assuming it is just the path to fsc. // compensate for this in case caller didn't know let args = - match args with - | [||] + match box args with | null -> [| "fsc" |] - | a when not <| fscExeArg a[0] -> Array.append [| "fsc" |] a - | _ -> args + | _ -> + match args with + | [||] -> [| "fsc" |] + | a when not <| fscExeArg a[0] -> Array.append [| "fsc" |] a + | _ -> args let errorRanges = args |> Seq.exists errorRangesArg let vsErrors = args |> Seq.exists vsErrorsArg diff --git a/src/fcs-fable/src/Compiler/Optimize/DetupleArgs.fs b/src/fcs-fable/src/Compiler/Optimize/DetupleArgs.fs index 0021357366..f4521fa0e0 100644 --- a/src/fcs-fable/src/Compiler/Optimize/DetupleArgs.fs +++ b/src/fcs-fable/src/Compiler/Optimize/DetupleArgs.fs @@ -41,7 +41,7 @@ let DetupleRewriteStackGuardDepth = StackGuard.GetDepthOption "DetupleRewrite" // A1: If the function called only wants the fields of the tuple. // A2: If all call sites allocate a tuple argument, // then can factor that tuple creation into the function, -// and hope the optimiser will eliminate it if possible. +// and hope the optimizer will eliminate it if possible. // e.g. if only the fields are required. // // The COLLAPSE transform is based on answer A2... @@ -149,15 +149,16 @@ let DetupleRewriteStackGuardDepth = StackGuard.GetDepthOption "DetupleRewrite" // in these new cases, take care to have let binding sequence (eval order...) -// Merge a tyapp node and and app node. +// Merge a tyapp node and app node. +[] let (|TyappAndApp|_|) e = match e with | Expr.App(f, fty, tys, args, m) -> match stripDebugPoints (stripExpr f) with - | Expr.App(f2, fty2, tys2, [], m2) -> Some(f2, fty2, tys2 @ tys, args, m2) - | Expr.App _ -> Some(f, fty, tys, args, m) (* has args, so not combine ty args *) - | f -> Some(f, fty, tys, args, m) - | _ -> None + | Expr.App(f2, fty2, tys2, [], m2) -> ValueSome(f2, fty2, tys2 @ tys, args, m2) + | Expr.App _ -> ValueSome(f, fty, tys, args, m) (* has args, so not combine ty args *) + | f -> ValueSome(f, fty, tys, args, m) + | _ -> ValueNone [] module GlobalUsageAnalysis = @@ -720,7 +721,7 @@ type penv = ccu: CcuThunk g: TcGlobals } -let hasTransfrom penv f = Zmap.tryFind f penv.transforms +let hasTransform penv f = Zmap.tryFind f penv.transforms //------------------------------------------------------------------------- // pass - app fixup - collapseArgs @@ -827,7 +828,7 @@ let fixupApp (penv: penv) (fx, fty, tys, args, m) = | Expr.Val(vref, _, vm) -> let f = vref.Deref - match hasTransfrom penv f with + match hasTransform penv f with | Some trans -> // fix it let callPattern = trans.transformCallPattern @@ -881,7 +882,7 @@ let passBind penv (TBind(fOrig, repr, letSeqPtOpt) as bind) = let g = penv.g let m = fOrig.Range - match hasTransfrom penv fOrig with + match hasTransform penv fOrig with | None -> // fOrig no transform bind diff --git a/src/fcs-fable/src/Compiler/Optimize/InnerLambdasToTopLevelFuncs.fs b/src/fcs-fable/src/Compiler/Optimize/InnerLambdasToTopLevelFuncs.fs index 37b3f26c42..f03db8f5e6 100644 --- a/src/fcs-fable/src/Compiler/Optimize/InnerLambdasToTopLevelFuncs.fs +++ b/src/fcs-fable/src/Compiler/Optimize/InnerLambdasToTopLevelFuncs.fs @@ -129,10 +129,10 @@ let mkLocalNameTypeArity compgen m name ty valReprInfo = //------------------------------------------------------------------------- //------------------------------------------------------------------------- -// pass1: GetValsBoundUnderMustInline (see comment further below) +// pass1: GetValsBoundUnderShouldInline (see comment further below) //------------------------------------------------------------------------- -let GetValsBoundUnderMustInline xinfo = +let GetValsBoundUnderShouldInline xinfo = let accRejectFrom (v: Val) repr rejectS = if v.InlineInfo = ValInline.Always then Zset.union (GetValsBoundInExpr repr) rejectS @@ -194,8 +194,14 @@ module Pass1_DetermineTLRAndArities = let nFormals = vss.Length let nMaxApplied = GetMaxNumArgsAtUses xinfo f let arity = Operators.min nFormals nMaxApplied - if atTopLevel || arity<>0 || not (isNil tps) then Some (f, arity) - else None + if atTopLevel then + Some (f, arity) + elif g.realsig then + None + else if arity<>0 || not (isNil tps) then + Some (f, arity) + else + None /// Check if f involves any value recursion (so can skip those). /// ValRec considered: recursive && some f in mutual binding is not bound to a lambda @@ -213,21 +219,21 @@ module Pass1_DetermineTLRAndArities = let xinfo = GetUsageInfoOfImplFile g expr let fArities = Zmap.chooseL (SelectTLRVals g xinfo) xinfo.Defns let fArities = List.filter (fst >> IsValueRecursionFree xinfo) fArities - // Do not TLR v if it is bound under a mustinline defn + // Do not TLR v if it is bound under a shouldinline defn // There is simply no point - the original value will be duplicated and TLR'd anyway - let rejectS = GetValsBoundUnderMustInline xinfo + let rejectS = GetValsBoundUnderShouldInline xinfo let fArities = List.filter (fun (v, _) -> not (Zset.contains v rejectS)) fArities (*-*) let tlrS = Zset.ofList valOrder (List.map fst fArities) - let topValS = xinfo.TopLevelBindings (* genuinely top level *) - let topValS = Zset.filter (IsMandatoryNonTopLevel g >> not) topValS (* restrict *) - (* REPORT MISSED CASES *) + let topValS = xinfo.TopLevelBindings (* genuinely top level *) + let topValS = Zset.filter (IsMandatoryNonTopLevel g >> not) topValS (* restrict *) #if DEBUG + (* REPORT MISSED CASES *) if verboseTLR then let missed = Zset.diff xinfo.TopLevelBindings tlrS missed |> Zset.iter (fun v -> dprintf "TopLevel but not TLR = %s\n" v.LogicalName) -#endif (* REPORT OVER *) +#endif let arityM = Zmap.ofList valOrder fArities #if DEBUG if verboseTLR then DumpArity arityM @@ -290,7 +296,7 @@ module Pass1_DetermineTLRAndArities = // so better not have env(h) in env(f)!!!]. -/// The subset of ids from a mutal binding that are chosen to be TLR. +/// The subset of ids from a mutual binding that are chosen to be TLR. /// They share a common env. /// [Each fclass has an env, the fclass are the handles to envs.] type BindingGroupSharingSameReqdItems(bindings: Bindings) = @@ -718,7 +724,7 @@ let FlatEnvPacks g fclassM topValS declist (reqdItemsMap: Zmap } - let rewriteState0 = {rws_mustinline=false;rws_innerLevel=0;rws_preDecs=emptyTR} + let rewriteState0 = {rws_shouldinline=false;rws_innerLevel=0;rws_preDecs=emptyTR} // move in/out of lambdas (or lambda containing construct) let EnterInner z = {z with rws_innerLevel = z.rws_innerLevel + 1} let ExitInner z = {z with rws_innerLevel = z.rws_innerLevel - 1} - let EnterMustInline b z f = - let orig = z.rws_mustinline - let x, z' = f (if b then {z with rws_mustinline = true } else z) - {z' with rws_mustinline = orig }, x + let EnterShouldInline b z f = + let orig = z.rws_shouldinline + let x, z' = f (if b then {z with rws_shouldinline = true } else z) + {z' with rws_shouldinline = orig }, x /// extract PreDecs (iff at top-level) let ExtractPreDecs z = @@ -1153,7 +1159,7 @@ module Pass4_RewriteAssembly = let targets = Array.toList targets let dtree, z = TransDecisionTree penv z dtree let targets, z = List.mapFold (TransDecisionTreeTarget penv) z targets - // TransDecisionTreeTarget wraps EnterInner/exitInnter, so need to collect any top decs + // TransDecisionTreeTarget wraps EnterInner/exitInner, so need to collect any top decs let pds,z = ExtractPreDecs z MakePreDecs m pds (mkAndSimplifyMatch spBind mExpr m ty dtree targets), z @@ -1263,8 +1269,8 @@ module Pass4_RewriteAssembly = TObjExprMethod(slotsig, attribs, tps, vs, e, m), z and TransBindingRhs penv z (TBind(v, e, letSeqPtOpt)) : Binding * RewriteState = - let mustInline = v.MustInline - let z, e = EnterMustInline mustInline z (fun z -> TransExpr penv z e) + let shouldInline = v.ShouldInline + let z, e = EnterShouldInline shouldInline z (fun z -> TransExpr penv z e) TBind (v, e, letSeqPtOpt), z and TransDecisionTree penv z x: DecisionTree * RewriteState = diff --git a/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fs b/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fs index f2f3e4f624..1f224ea499 100644 --- a/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fs +++ b/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fs @@ -2,18 +2,22 @@ module internal FSharp.Compiler.LowerComputedCollectionExpressions -open Internal.Utilities.Library +open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.Features open FSharp.Compiler.InfoReader open FSharp.Compiler.LowerSequenceExpressions open FSharp.Compiler.MethodCalls open FSharp.Compiler.Syntax open FSharp.Compiler.TcGlobals +open FSharp.Compiler.Text open FSharp.Compiler.TypeRelations open FSharp.Compiler.TypedTree +open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypeHierarchy +open Import /// Build the 'test and dispose' part of a 'use' statement let BuildDisposableCleanup tcVal (g: TcGlobals) infoReader m (v: Val) = @@ -33,7 +37,7 @@ let BuildDisposableCleanup tcVal (g: TcGlobals) infoReader m (v: Val) = else let disposeObjVar, disposeObjExpr = mkCompGenLocal m "objectToDispose" g.system_IDisposable_ty let disposeExpr, _ = BuildMethodCall tcVal g infoReader.amap PossiblyMutates m false disposeMethod NormalValUse [] [disposeObjExpr] [] None - let inputExpr = mkCoerceExpr(exprForVal v.Range v, g.obj_ty, m, v.Type) + let inputExpr = mkCoerceExpr(exprForVal v.Range v, g.obj_ty_ambivalent, m, v.Type) mkIsInstConditional g m g.system_IDisposable_ty inputExpr disposeObjVar disposeExpr (mkUnit g m) let mkCallCollectorMethod tcVal (g: TcGlobals) infoReader m name collExpr args = @@ -230,40 +234,511 @@ let (|OptionalCoerce|) expr = // Making 'seq' optional means this kicks in for FSharp.Core, see TcArrayOrListComputedExpression // which only adds a 'seq' call outside of FSharp.Core +[] let (|OptionalSeq|_|) g amap expr = match expr with // use 'seq { ... }' as an indicator | Seq g (e, elemTy) -> - Some (e, elemTy) + ValueSome (e, elemTy) | _ -> // search for the relevant element type match tyOfExpr g expr with | SeqElemTy g amap expr.Range elemTy -> - Some (expr, elemTy) - | _ -> None + ValueSome (expr, elemTy) + | _ -> ValueNone +[] let (|SeqToList|_|) g expr = match expr with - | ValApp g g.seq_to_list_vref (_, [seqExpr], m) -> Some (seqExpr, m) - | _ -> None + | ValApp g g.seq_to_list_vref (_, [seqExpr], m) -> ValueSome (seqExpr, m) + | _ -> ValueNone +[] let (|SeqToArray|_|) g expr = match expr with - | ValApp g g.seq_to_array_vref (_, [seqExpr], m) -> Some (seqExpr, m) - | _ -> None - -let LowerComputedListOrArrayExpr tcVal (g: TcGlobals) amap overallExpr = + | ValApp g g.seq_to_array_vref (_, [seqExpr], m) -> ValueSome (seqExpr, m) + | _ -> ValueNone + +module List = + /// Makes the equivalent of an inlined call to List.map. + let mkMap tcVal (g: TcGlobals) amap m (mBody, spFor, _spIn, mFor, mIn, spInWhile) srcList overallElemTy loopVal body = + let collectorTy = g.mk_ListCollector_ty overallElemTy + let srcListTy = tyOfExpr g srcList + + mkCompGenLetMutableIn m "collector" collectorTy (mkDefault (m, collectorTy)) (fun (_, collector) -> + let reader = InfoReader (g, amap) + + // Adapted from DetectAndOptimizeForEachExpression in TypedTreeOps.fs. + + let IndexHead = 0 + let IndexTail = 1 + + let currentVar, currentExpr = mkMutableCompGenLocal mIn "current" srcListTy + let nextVar, nextExpr = mkMutableCompGenLocal mIn "next" srcListTy + let srcElemTy = loopVal.val_type + + let guardExpr = mkNonNullTest g mFor nextExpr + let headOrDefaultExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr, g.cons_ucref, [srcElemTy], IndexHead, mIn) + let tailOrNullExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr, g.cons_ucref, [srcElemTy], IndexTail, mIn) + + let body = + mkInvisibleLet mIn loopVal headOrDefaultExpr + (mkSequential mIn + (mkCallCollectorAdd tcVal g reader mIn collector body) + (mkSequential mIn + (mkValSet mIn (mkLocalValRef currentVar) nextExpr) + (mkValSet mIn (mkLocalValRef nextVar) tailOrNullExpr))) + + let loop = + // let mutable current = enumerableExpr + mkLet spFor m currentVar srcList + // let mutable next = current.TailOrNull + (mkInvisibleLet mFor nextVar tailOrNullExpr + // while nonNull next do + (mkWhile g (spInWhile, WhileLoopForCompiledForEachExprMarker, guardExpr, body, mBody))) + + let close = mkCallCollectorClose tcVal g reader m collector + + mkSequential m loop close + ) + + /// Makes an expression that will build a list from an integral range. + let mkFromIntegralRange + tcVal + (g: TcGlobals) + amap + m + (mBody, _spFor, _spIn, mFor, mIn, spInWhile) + rangeTy + overallElemTy + (rangeExpr: Expr) + start + step + finish + (body: (Val * Expr) option) + = + let collectorTy = g.mk_ListCollector_ty overallElemTy + + /// let collector = ListCollector () in + /// + /// collector.Close () + let mkListInit mkLoop = + mkCompGenLetMutableIn m "collector" collectorTy (mkDefault (m, collectorTy)) (fun (_, collector) -> + let reader = InfoReader (g, amap) + + let loop = + mkLoop (fun _idxVar loopVar -> + let body = + body + |> Option.map (fun (loopVal, body) -> mkInvisibleLet m loopVal loopVar body) + |> Option.defaultValue loopVar + + mkCallCollectorAdd tcVal g reader mBody collector body) + + let close = mkCallCollectorClose tcVal g reader mBody collector + mkSequential m loop close + ) + + mkOptimizedRangeLoop + g + (mBody, mFor, mIn, spInWhile) + (rangeTy, rangeExpr) + (start, step, finish) + (fun count mkLoop -> + match count with + | Expr.Const (value = IntegralConst.Zero) -> + mkNil g m overallElemTy + + | Expr.Const (value = _nonzeroConstant) -> + mkListInit mkLoop + + | _dynamicCount -> + mkListInit mkLoop + ) + +module Array = + let private mkIlInstr (g: TcGlobals) specific any ilTy = + if ilTy = g.ilg.typ_Int32 then specific DT_I4 + elif ilTy = g.ilg.typ_Int64 then specific DT_I8 + elif ilTy = g.ilg.typ_UInt64 then specific DT_U8 + elif ilTy = g.ilg.typ_UInt32 then specific DT_U4 + elif ilTy = g.ilg.typ_IntPtr then specific DT_I + elif ilTy = g.ilg.typ_UIntPtr then specific DT_U + elif ilTy = g.ilg.typ_Int16 then specific DT_I2 + elif ilTy = g.ilg.typ_UInt16 then specific DT_U2 + elif ilTy = g.ilg.typ_SByte then specific DT_I1 + elif ilTy = g.ilg.typ_Byte then specific DT_U1 + elif ilTy = g.ilg.typ_Char then specific DT_U2 + elif ilTy = g.ilg.typ_Double then specific DT_R8 + elif ilTy = g.ilg.typ_Single then specific DT_R4 + else any ilTy + + /// Makes the equivalent of an inlined call to Array.map. + let mkMap g m (mBody, _spFor, _spIn, mFor, mIn, spInWhile) srcArray srcIlTy destIlTy overallElemTy (loopVal: Val) body = + mkCompGenLetIn m (nameof srcArray) (tyOfExpr g srcArray) srcArray (fun (_, srcArray) -> + let len = mkLdlen g mIn srcArray + let arrayTy = mkArrayType g overallElemTy + + /// (# "newarr !0" type ('T) count : 'T array #) + let array = + mkAsmExpr + ( + [I_newarr (ILArrayShape.SingleDimensional, destIlTy)], + [], + [len], + [arrayTy], + m + ) + + let ldelem = mkIlInstr g I_ldelem (fun ilTy -> I_ldelem_any (ILArrayShape.SingleDimensional, ilTy)) srcIlTy + let stelem = mkIlInstr g I_stelem (fun ilTy -> I_stelem_any (ILArrayShape.SingleDimensional, ilTy)) destIlTy + + let mapping = + mkCompGenLetIn m (nameof array) arrayTy array (fun (_, array) -> + mkCompGenLetMutableIn mFor "i" g.int32_ty (mkTypedZero g mIn g.int32_ty) (fun (iVal, i) -> + let body = + // If the loop val is used in the loop body, + // rebind it to pull directly from the source array. + // Otherwise, don't bother reading from the source array at all. + let body = + let freeLocals = (freeInExpr CollectLocals body).FreeLocals + + if freeLocals.Contains loopVal then + mkInvisibleLet mBody loopVal (mkAsmExpr ([ldelem], [], [srcArray; i], [loopVal.val_type], mBody)) body + else + body + + // destArray[i] <- body srcArray[i] + let setArrSubI = mkAsmExpr ([stelem], [], [array; i; body], [], mIn) + + // i <- i + 1 + let incrI = mkValSet mIn (mkLocalValRef iVal) (mkAsmExpr ([AI_add], [], [i; mkTypedOne g mIn g.int32_ty], [g.int32_ty], mIn)) + + mkSequential mIn setArrSubI incrI + + let guard = mkILAsmClt g mFor i (mkLdlen g mFor array) + + let loop = + mkWhile + g + ( + spInWhile, + NoSpecialWhileLoopMarker, + guard, + body, + mIn + ) + + // while i < array.Length do done + // array + mkSequential m loop array + ) + ) + + // Add a debug point at the `for`, before anything gets evaluated. + Expr.DebugPoint (DebugPointAtLeafExpr.Yes mFor, mapping) + ) + + /// Whether to check for overflow when converting a value to a native int. + [] + type Ovf = + /// Check for overflow. We need this when passing the count into newarr. + | CheckOvf + + /// Don't check for overflow. We don't need to check when indexing into the array, + /// since we already know count didn't overflow during initialization. + | NoCheckOvf + + /// Makes an expression that will build an array from an integral range. + let mkFromIntegralRange g m (mBody, _spFor, _spIn, mFor, mIn, spInWhile) rangeTy ilTy overallElemTy (rangeExpr: Expr) start step finish (body: (Val * Expr) option) = + let arrayTy = mkArrayType g overallElemTy + + let convToNativeInt ovf expr = + let ty = tyOfExpr g expr + + let conv = + match ovf with + | NoCheckOvf -> AI_conv DT_I + | CheckOvf when isSignedIntegerTy g ty -> AI_conv_ovf DT_I + | CheckOvf -> AI_conv_ovf_un DT_I + + if typeEquivAux EraseMeasures g ty g.int64_ty then + mkAsmExpr ([conv], [], [expr], [g.nativeint_ty], mIn) + elif typeEquivAux EraseMeasures g ty g.nativeint_ty then + mkAsmExpr ([conv], [], [mkAsmExpr ([AI_conv DT_I8], [], [expr], [g.int64_ty], mIn)], [g.nativeint_ty], mIn) + elif typeEquivAux EraseMeasures g ty g.uint64_ty then + mkAsmExpr ([conv], [], [expr], [g.nativeint_ty], mIn) + elif typeEquivAux EraseMeasures g ty g.unativeint_ty then + mkAsmExpr ([conv], [], [mkAsmExpr ([AI_conv DT_U8], [], [expr], [g.uint64_ty], mIn)], [g.nativeint_ty], mIn) + else + expr + + let stelem = mkIlInstr g I_stelem (fun ilTy -> I_stelem_any (ILArrayShape.SingleDimensional, ilTy)) ilTy + + /// (# "newarr !0" type ('T) count : 'T array #) + let mkNewArray count = + mkAsmExpr + ( + [I_newarr (ILArrayShape.SingleDimensional, ilTy)], + [], + [convToNativeInt CheckOvf count], + [arrayTy], + m + ) + + /// let array = (# "newarr !0" type ('T) count : 'T array #) in + /// + /// array + let mkArrayInit count mkLoop = + mkCompGenLetIn mFor "array" arrayTy (mkNewArray count) (fun (_, array) -> + let loop = + mkLoop (fun idxVar loopVar -> + let body = + body + |> Option.map (fun (loopVal, body) -> mkInvisibleLet mBody loopVal loopVar body) + |> Option.defaultValue loopVar + + mkAsmExpr ([stelem], [], [array; convToNativeInt NoCheckOvf idxVar; body], [], mBody)) + + mkSequential m loop array) + + mkOptimizedRangeLoop + g + (mBody, mFor, mIn, spInWhile) + (rangeTy, rangeExpr) + (start, step, finish) + (fun count mkLoop -> + match count with + | Expr.Const (value = IntegralConst.Zero) -> + mkArray (overallElemTy, [], m) + + | Expr.Const (value = _nonzeroConstant) -> + mkArrayInit count mkLoop + + | _dynamicCount -> + mkCompGenLetIn m (nameof count) (tyOfExpr g count) count (fun (_, count) -> + let countTy = tyOfExpr g count + + // if count = 0 then + // [||] + // else + // let array = (# "newarr !0" type ('T) count : 'T array #) in + // + // array + mkCond + DebugPointAtBinding.NoneAtInvisible + m + arrayTy + (mkILAsmCeq g m count (mkTypedZero g m countTy)) + (mkArray (overallElemTy, [], m)) + (mkArrayInit count mkLoop) + ) + ) + +/// Matches Seq.singleton and returns the body expression. +[] +let (|SeqSingleton|_|) g expr : Expr voption = + match expr with + | ValApp g g.seq_singleton_vref (_, [body], _) -> ValueSome body + | _ -> ValueNone + +/// Matches the compiled representation of the mapping in +/// +/// for … in … do f (); …; yield … +/// for … in … do let … = … in yield … +/// for … in … do f (); …; … +/// for … in … do let … = … in … +/// +/// i.e., +/// +/// f (); …; Seq.singleton … +/// let … = … in Seq.singleton … +[] +let (|SingleYield|_|) g expr : Expr voption = + let rec loop expr cont = + match expr with + | Expr.Let (binding, DebugPoints (SeqSingleton g body, debug), m, frees) -> + ValueSome (cont (Expr.Let (binding, debug body, m, frees))) + + | Expr.Let (binding, DebugPoints (body, debug), m, frees) -> + loop body (cont << fun body -> Expr.Let (binding, debug body, m, frees)) + + | Expr.Sequential (expr1, DebugPoints (SeqSingleton g body, debug), kind, m) -> + ValueSome (cont (Expr.Sequential (expr1, debug body, kind, m))) + + | Expr.Sequential (expr1, DebugPoints (body, debug), kind, m) -> + loop body (cont << fun body -> Expr.Sequential (expr1, debug body, kind, m)) + + | Expr.Match (debugPoint, mInput, decision, [|TTarget (boundVals, DebugPoints (SeqSingleton g body, debug), isStateVarFlags)|], mFull, exprType) -> + ValueSome (cont (Expr.Match (debugPoint, mInput, decision, [|TTarget (boundVals, debug body, isStateVarFlags)|], mFull, exprType))) + + | SeqSingleton g body -> + ValueSome (cont body) + + | _ -> ValueNone + + loop expr id + +/// Extracts any let-bindings or sequential +/// expressions that directly precede the specified mapping application, e.g., +/// +/// [let y = f () in for … in … -> …] +/// +/// [f (); g (); for … in … -> …] +/// +/// Returns a function that will re-prefix the prelude to the +/// lowered mapping, as well as the mapping to lower, i.e., +/// to transform the above into something like: +/// +/// let y = f () in [for … in … -> …] +/// +/// f (); g (); [for … in … -> …] +let gatherPrelude ((|App|_|) : _ -> _ voption) expr = + let rec loop expr cont = + match expr with + | Expr.Let (binding, DebugPoints (body, debug), m, frees) -> + loop body (cont << fun body -> Expr.Let (binding, debug body, m, frees)) + + | Expr.Sequential (expr1, DebugPoints (body, debug), kind, m) -> + loop body (cont << fun body -> Expr.Sequential (expr1, debug body, kind, m)) + + | App contents -> + ValueSome (cont, contents) + + | _ -> ValueNone + + loop expr id + +/// The representation used for +/// +/// for … in … -> … +/// for … in … do yield … +/// for … in … do … +[] +let (|SeqMap|_|) g = + gatherPrelude (function + | ValApp g g.seq_map_vref ([ty1; ty2], [Expr.Lambda (valParams = [loopVal]; bodyExpr = body; range = mIn) as mapping; input], mFor) -> + let spIn = match mIn.NotedSourceConstruct with NotedSourceConstruct.InOrTo -> DebugPointAtInOrTo.Yes mIn | _ -> DebugPointAtInOrTo.No + let spFor = DebugPointAtBinding.Yes mFor + let spInWhile = match spIn with DebugPointAtInOrTo.Yes m -> DebugPointAtWhile.Yes m | DebugPointAtInOrTo.No -> DebugPointAtWhile.No + let ranges = body.Range, spFor, spIn, mFor, mIn, spInWhile + ValueSome (ty1, ty2, input, mapping, loopVal, body, ranges) + + | _ -> ValueNone) + +/// The representation used for +/// +/// for … in … do f (); …; yield … +/// for … in … do let … = … in yield … +/// for … in … do f (); …; … +/// for … in … do let … = … in … +[] +let (|SeqCollectSingle|_|) g = + gatherPrelude (function + | ValApp g g.seq_collect_vref ([ty1; _; ty2], [Expr.Lambda (valParams = [loopVal]; bodyExpr = DebugPoints (SingleYield g body, debug); range = mIn) as mapping; input], mFor) -> + let spIn = match mIn.NotedSourceConstruct with NotedSourceConstruct.InOrTo -> DebugPointAtInOrTo.Yes mIn | _ -> DebugPointAtInOrTo.No + let spFor = DebugPointAtBinding.Yes mFor + let spInWhile = match spIn with DebugPointAtInOrTo.Yes m -> DebugPointAtWhile.Yes m | DebugPointAtInOrTo.No -> DebugPointAtWhile.No + let ranges = body.Range, spFor, spIn, mFor, mIn, spInWhile + ValueSome (ty1, ty2, input, mapping, loopVal, debug body, ranges) + + | _ -> ValueNone) + +/// for … in … -> … +/// for … in … do yield … +/// for … in … do … +/// for … in … do f (); …; yield … +/// for … in … do let … = … in yield … +/// for … in … do f (); …; … +/// for … in … do let … = … in … +[] +let (|SimpleMapping|_|) g expr = + match expr with + // for … in … -> … + // for … in … do yield … + // for … in … do … + | ValApp g g.seq_delay_vref (_, [Expr.Lambda (bodyExpr = DebugPoints (SeqMap g (cont, (ty1, ty2, input, mapping, loopVal, body, ranges)), debug))], _) + + // for … in … do f (); …; yield … + // for … in … do let … = … in yield … + // for … in … do f (); …; … + // for … in … do let … = … in … + | ValApp g g.seq_delay_vref (_, [Expr.Lambda (bodyExpr = DebugPoints (SeqCollectSingle g (cont, (ty1, ty2, input, mapping, loopVal, body, ranges)), debug))], _) -> + ValueSome (debug >> cont, (ty1, ty2, input, mapping, loopVal, body, ranges)) + + | _ -> ValueNone + +[] +let (|Array|_|) g (OptionalCoerce expr) = + if isArray1DTy g (tyOfExpr g expr) then ValueSome expr + else ValueNone + +[] +let (|List|_|) g (OptionalCoerce expr) = + if isListTy g (tyOfExpr g expr) then ValueSome expr + else ValueNone + +let LowerComputedListOrArrayExpr tcVal (g: TcGlobals) amap ilTyForTy overallExpr = // If ListCollector is in FSharp.Core then this optimization kicks in if g.ListCollector_tcr.CanDeref then - match overallExpr with + // […] | SeqToList g (OptionalCoerce (OptionalSeq g amap (overallSeqExpr, overallElemTy)), m) -> - let collectorTy = g.mk_ListCollector_ty overallElemTy - LowerComputedListOrArraySeqExpr tcVal g amap m collectorTy overallSeqExpr - + match overallSeqExpr with + // [for … in xs -> …] (* When xs is a list. *) + | SimpleMapping g (cont, (_, _, List g list, _, loopVal, body, ranges)) when + g.langVersion.SupportsFeature LanguageFeature.LowerSimpleMappingsInComprehensionsToFastLoops + -> + Some (cont (List.mkMap tcVal g amap m ranges list overallElemTy loopVal body)) + + // [start..finish] + // [start..step..finish] + | IntegralRange g (rangeTy, (start, step, finish)) when + g.langVersion.SupportsFeature LanguageFeature.LowerIntegralRangesToFastLoops + -> + let ranges = m, DebugPointAtBinding.NoneAtInvisible, DebugPointAtInOrTo.No, m, m, DebugPointAtWhile.No + Some (List.mkFromIntegralRange tcVal g amap m ranges rangeTy overallElemTy overallSeqExpr start step finish None) + + // [for … in start..finish -> …] + // [for … in start..step..finish -> …] + | SimpleMapping g (cont, (_, _, DebugPoints (rangeExpr & IntegralRange g (rangeTy, (start, step, finish)), debug), _, loopVal, body, ranges)) when + g.langVersion.SupportsFeature LanguageFeature.LowerIntegralRangesToFastLoops + -> + Some (cont (debug (List.mkFromIntegralRange tcVal g amap m ranges rangeTy overallElemTy rangeExpr start step finish (Some (loopVal, body))))) + + // [(* Anything more complex. *)] + | _ -> + let collectorTy = g.mk_ListCollector_ty overallElemTy + LowerComputedListOrArraySeqExpr tcVal g amap m collectorTy overallSeqExpr + + // [|…|] | SeqToArray g (OptionalCoerce (OptionalSeq g amap (overallSeqExpr, overallElemTy)), m) -> - let collectorTy = g.mk_ArrayCollector_ty overallElemTy - LowerComputedListOrArraySeqExpr tcVal g amap m collectorTy overallSeqExpr + match overallSeqExpr with + // [|for … in xs -> …|] (* When xs is an array. *) + | SimpleMapping g (cont, (ty1, ty2, Array g array, _, loopVal, body, ranges)) when + g.langVersion.SupportsFeature LanguageFeature.LowerSimpleMappingsInComprehensionsToFastLoops + -> + Some (cont (Array.mkMap g m ranges array (ilTyForTy ty1) (ilTyForTy ty2) overallElemTy loopVal body)) + + // [|start..finish|] + // [|start..step..finish|] + | IntegralRange g (rangeTy, (start, step, finish)) when + g.langVersion.SupportsFeature LanguageFeature.LowerIntegralRangesToFastLoops + -> + let ranges = m, DebugPointAtBinding.NoneAtInvisible, DebugPointAtInOrTo.No, m, m, DebugPointAtWhile.No + Some (Array.mkFromIntegralRange g m ranges rangeTy (ilTyForTy overallElemTy) overallElemTy overallSeqExpr start step finish None) + + // [|for … in start..finish -> …|] + // [|for … in start..step..finish -> …|] + | SimpleMapping g (cont, (_, _, DebugPoints (rangeExpr & IntegralRange g (rangeTy, (start, step, finish)), debug), _, loopVal, body, ranges)) when + g.langVersion.SupportsFeature LanguageFeature.LowerIntegralRangesToFastLoops + -> + Some (cont (debug (Array.mkFromIntegralRange g m ranges rangeTy (ilTyForTy overallElemTy) overallElemTy rangeExpr start step finish (Some (loopVal, body))))) + + // [|(* Anything more complex. *)|] + | _ -> + let collectorTy = g.mk_ArrayCollector_ty overallElemTy + LowerComputedListOrArraySeqExpr tcVal g amap m collectorTy overallSeqExpr | _ -> None else diff --git a/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fsi b/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fsi index a165636177..e504af7e3e 100644 --- a/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fsi +++ b/src/fcs-fable/src/Compiler/Optimize/LowerComputedCollections.fsi @@ -2,9 +2,15 @@ module internal FSharp.Compiler.LowerComputedCollectionExpressions +open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.Import open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypedTree val LowerComputedListOrArrayExpr: - tcVal: ConstraintSolver.TcValF -> g: TcGlobals -> amap: ImportMap -> Expr -> Expr option + tcVal: ConstraintSolver.TcValF -> + g: TcGlobals -> + amap: ImportMap -> + ilTyForTy: (TType -> ILType) -> + overallExpr: Expr -> + Expr option diff --git a/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fs b/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fs index 3a7d733ec5..df19323cb6 100644 --- a/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fs +++ b/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fs @@ -74,15 +74,16 @@ let tyConfirmsToSeq g ty = tyconRefEq g tcref g.tcref_System_Collections_Generic_IEnumerable | _ -> false +[] let (|SeqElemTy|_|) g amap m ty = match SearchEntireHierarchyOfType (tyConfirmsToSeq g) g amap m ty with | None -> // printfn "FAILED - yield! did not yield a sequence! %s" (stringOfRange m) - None + ValueNone | Some seqTy -> // printfn "found yield!" let inpElemTy = List.head (argsOfAppTy g seqTy) - Some inpElemTy + ValueSome inpElemTy /// Analyze a TAST expression to detect the elaborated form of a sequence expression. /// Then compile it to a state machine represented as a TAST containing goto, return and label nodes. @@ -554,7 +555,7 @@ let ConvertSequenceExprToObject g amap overallExpr = let pc2lab = Map.ofList ((pcInit, initLabel) :: (pcDone, noDisposeContinuationLabel) :: List.zip pcs labs) let lab2pc = Map.ofList ((initLabel, pcInit) :: (noDisposeContinuationLabel, pcDone) :: List.zip labs pcs) - // Execute phase2, building the core of the the GenerateNext, Dispose and CheckDispose methods + // Execute phase2, building the core of the GenerateNext, Dispose and CheckDispose methods let generateExprCore, disposalExprCore, checkDisposeExprCore = res.phase2 (pcVarRef, currVarRef, nextVarRef, lab2pc) diff --git a/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fsi b/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fsi index aa675cda5c..61ed7d8776 100644 --- a/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fsi +++ b/src/fcs-fable/src/Compiler/Optimize/LowerSequences.fsi @@ -9,7 +9,8 @@ open FSharp.Compiler.TypedTree open FSharp.Compiler.Text /// Detect a 'seq' type -val (|SeqElemTy|_|): TcGlobals -> ImportMap -> range -> TType -> TType option +[] +val (|SeqElemTy|_|): TcGlobals -> ImportMap -> range -> TType -> TType voption val callNonOverloadedILMethod: g: TcGlobals -> amap: ImportMap -> m: range -> methName: string -> ty: TType -> args: Exprs -> Expr diff --git a/src/fcs-fable/src/Compiler/Optimize/LowerStateMachines.fs b/src/fcs-fable/src/Compiler/Optimize/LowerStateMachines.fs index 7c4835b346..7a6dd553f6 100644 --- a/src/fcs-fable/src/Compiler/Optimize/LowerStateMachines.fs +++ b/src/fcs-fable/src/Compiler/Optimize/LowerStateMachines.fs @@ -114,7 +114,7 @@ let isExpandVar g (v: Val) = let isStateMachineBindingVar g (v: Val) = isExpandVar g v || (let nm = v.LogicalName - (nm.StartsWith "builder@" || v.IsMemberThisVal) && + (nm.StartsWithOrdinal("builder@") || v.IsMemberThisVal) && not v.IsCompiledAsTopLevel) type env = @@ -377,6 +377,7 @@ type LowerStateMachine(g: TcGlobals) = | None -> env2, expr2 // Detect a state machine with a single method override + [] let (|ExpandedStateMachineInContext|_|) inputExpr = // All expanded resumable code state machines e.g. 'task { .. }' begin with a bind of @builder or 'defn' let env, expr = BindResumableCodeDefinitions env.Empty inputExpr @@ -405,9 +406,9 @@ type LowerStateMachine(g: TcGlobals) = (moveNextThisVar, moveNextExprR), (setStateMachineThisVar, setStateMachineStateVar, setStateMachineBodyR), (afterCodeThisVar, afterCodeBodyR)) - Some (env, remake2, moveNextBody) + ValueSome (env, remake2, moveNextBody) | _ -> - None + ValueNone // A utility to add a jump table an expression let addPcJumpTable m (pcs: int list) (pc2lab: Map) pcExpr expr = @@ -447,7 +448,7 @@ type LowerStateMachine(g: TcGlobals) = let res = match expr with | ResumableCodeInvoke g (_, _, _, m, _) -> - Result.Error (FSComp.SR.reprResumableCodeInvokeNotReduced(m.ToString())) + Result.Error (FSComp.SR.reprResumableCodeInvokeNotReduced(!!m.ToString())) // Eliminate 'if __useResumableCode ...' within. | IfUseResumableStateMachinesExpr g (thenExpr, _) -> @@ -833,7 +834,7 @@ type LowerStateMachine(g: TcGlobals) = |> Result.Ok elif bind.Var.IsCompiledAsTopLevel || not (resBody.resumableVars.FreeLocals.Contains(bind.Var)) || - bind.Var.LogicalName.StartsWith stackVarPrefix then + bind.Var.LogicalName.StartsWithOrdinal(stackVarPrefix) then if sm_verbose then printfn "LetExpr (non-control-flow, rewrite rhs, RepresentBindingAsTopLevelOrLocal)" RepresentBindingAsTopLevelOrLocal bind resBody m |> Result.Ok diff --git a/src/fcs-fable/src/Compiler/Optimize/Optimizer.fs b/src/fcs-fable/src/Compiler/Optimize/Optimizer.fs index e164e1dcd9..9216330cb0 100644 --- a/src/fcs-fable/src/Compiler/Optimize/Optimizer.fs +++ b/src/fcs-fable/src/Compiler/Optimize/Optimizer.fs @@ -142,7 +142,7 @@ type ValInfos(entries) = (fun (_: ValRef, k: ValLinkageFullKey) -> hash k.PartialKey) (fun (v1, k1) (v2, k2) -> k1.PartialKey = k2.PartialKey && - // dismbiguate overloads, somewhat low-perf but only use for a handful of overloads in FSharp.Core + // disambiguate overloads, somewhat low-perf but only use for a handful of overloads in FSharp.Core match k1.TypeForLinkage, k2.TypeForLinkage with | Some _, Some _ -> let sig1 = XmlDocSigOfVal g true "" v1.Deref @@ -221,8 +221,8 @@ type Summary<'Info> = TotalSize: int /// Meaning: could mutate, could non-terminate, could raise exception - /// One use: an effect expr can not be eliminated as dead code (e.g. sequencing) - /// One use: an effect=false expr can not throw an exception? so try-with is removed. + /// One use: an effect expr cannot be eliminated as dead code (e.g. sequencing) + /// One use: an effect=false expr cannot throw an exception? so try-with is removed. HasEffect: bool /// Indicates that a function may make a useful tailcall, hence when called should itself be tailcalled @@ -234,20 +234,23 @@ type Summary<'Info> = // Note, this is a different notion of "size" to the one used for inlining heuristics //------------------------------------------------------------------------- -let rec SizeOfValueInfos (arr:_[]) = - if arr.Length <= 0 then 0 else max 0 (SizeOfValueInfo arr[0]) - -and SizeOfValueInfo x = - match x with - | SizeValue (vdepth, _v) -> vdepth // terminate recursion at CACHED size nodes - | ConstValue (_x, _) -> 1 - | UnknownValue -> 1 - | ValValue (_vr, vinfo) -> SizeOfValueInfo vinfo + 1 - | TupleValue vinfos - | RecdValue (_, vinfos) - | UnionCaseValue (_, vinfos) -> 1 + SizeOfValueInfos vinfos - | CurriedLambdaValue _ -> 1 - | ConstExprValue (_size, _) -> 1 +let SizeOfValueInfo valueInfo = + let rec loop acc valueInfo = + match valueInfo with + | SizeValue (vdepth, _v) -> assert (vdepth >= 0); acc + vdepth // terminate recursion at CACHED size nodes + | CurriedLambdaValue _ + | ConstExprValue _ + | ConstValue _ + | UnknownValue -> acc + 1 + | TupleValue vinfos + | RecdValue (_, vinfos) + | UnionCaseValue (_, vinfos) when vinfos.Length = 0 -> acc + 1 + | TupleValue vinfos + | RecdValue (_, vinfos) + | UnionCaseValue (_, vinfos) -> loop (acc + 1) vinfos[0] + | ValValue (_vr, vinfo) -> loop (acc + 1) vinfo + + loop 0 valueInfo let [] minDepthForASizeNode = 5 // for small vinfos do not record size info, save space @@ -436,6 +439,7 @@ type cenv = stackGuard: StackGuard + realsig: bool } override x.ToString() = "" @@ -497,10 +501,10 @@ let rec IsPartialExprVal x = | TupleValue args | RecdValue (_, args) | UnionCaseValue (_, args) -> Array.exists IsPartialExprVal args | ConstValue _ | CurriedLambdaValue _ | ConstExprValue _ -> false | ValValue (_, a) - | SizeValue(_, a) -> IsPartialExprVal a + | SizeValue (_, a) -> IsPartialExprVal a let CheckInlineValueIsComplete (v: Val) res = - if v.MustInline && IsPartialExprVal res then + if v.ShouldInline && IsPartialExprVal res then errorR(Error(FSComp.SR.optValueMarkedInlineButIncomplete(v.DisplayName), v.Range)) //System.Diagnostics.Debug.Assert(false, sprintf "Break for incomplete inline value %s" v.DisplayName) @@ -558,7 +562,7 @@ let UnknownValInfo = { ValExprInfo=UnknownValue; ValMakesNoCriticalTailcalls=fal let mkValInfo info (v: Val) = { ValExprInfo=info.Info; ValMakesNoCriticalTailcalls= v.MakesNoCriticalTailcalls } (* Bind a value *) -let BindInternalLocalVal cenv (v: Val) vval env = +let BindInternalLocalVal cenv (v: Val) vval env = let vval = if v.IsMutable then UnknownValInfo else vval match vval.ValExprInfo with @@ -566,7 +570,7 @@ let BindInternalLocalVal cenv (v: Val) vval env = | _ -> cenv.localInternalVals[v.Stamp] <- vval env - + let BindExternalLocalVal cenv (v: Val) vval env = let g = cenv.g @@ -636,7 +640,7 @@ let GetInfoForLocalValue cenv env (v: Val) m = match env.localExternalVals.TryFind v.Stamp with | Some vval -> vval | None -> - if v.MustInline then + if v.ShouldInline then errorR(Error(FSComp.SR.optValueMarkedInlineButWasNotBoundInTheOptEnv(fullDisplayTextOfValRef (mkLocalValRef v)), m)) UnknownValInfo @@ -669,7 +673,7 @@ let GetInfoForNonLocalVal cenv env (vref: ValRef) = UnknownValInfo #endif // REVIEW: optionally turn x-module on/off on per-module basis or - elif cenv.settings.crossAssemblyOpt () || vref.MustInline then + elif cenv.settings.crossAssemblyOpt () || vref.ShouldInline then match TryGetInfoForNonLocalEntityRef env vref.nlr.EnclosingEntity.nlr with | Some structInfo -> match structInfo.ValInfos.TryFind vref with @@ -696,10 +700,25 @@ let GetInfoForVal cenv env m (vref: ValRef) = GetInfoForLocalValue cenv env vref.binding m else GetInfoForNonLocalVal cenv env vref + res +let GetInfoForValWithCheck cenv env m (vref: ValRef) = + let res = GetInfoForVal cenv env m vref check vref res |> ignore res +let IsPartialExpr cenv env m x = + let rec isPartialExpression x = + match x with + | Expr.App (func, _, _, args, _) -> func :: args |> Seq.exists isPartialExpression + | Expr.Lambda (_, _, _, _, expr, _, _) -> expr |> isPartialExpression + | Expr.Let (TBind (_,expr,_), body, _, _) -> expr :: [body] |> List.exists isPartialExpression + | Expr.LetRec (bindings, body, _, _) -> body :: (bindings |> List.map (fun (TBind (_,expr,_)) -> expr)) |> List.exists isPartialExpression + | Expr.Sequential (expr1, expr2, _, _) -> [expr1; expr2] |> Seq.exists isPartialExpression + | Expr.Val (vr, _, _) when not vr.IsLocalRef -> ((GetInfoForVal cenv env m vr).ValExprInfo) |> IsPartialExprVal + | _ -> false + isPartialExpression x + //------------------------------------------------------------------------- // Try to get information about values of particular types //------------------------------------------------------------------------- @@ -709,15 +728,17 @@ let rec stripValue = function | SizeValue(_, details) -> stripValue details (* step through SizeValue "aliases" *) | vinfo -> vinfo +[] let (|StripConstValue|_|) ev = match stripValue ev with - | ConstValue(c, _) -> Some c - | _ -> None + | ConstValue(c, _) -> ValueSome c + | _ -> ValueNone +[] let (|StripLambdaValue|_|) ev = match stripValue ev with - | CurriedLambdaValue (id, arity, sz, expr, ty) -> Some (id, arity, sz, expr, ty) - | _ -> None + | CurriedLambdaValue (id, arity, sz, expr, ty) -> ValueSome (id, arity, sz, expr, ty) + | _ -> ValueNone let destTupleValue ev = match stripValue ev with @@ -729,10 +750,11 @@ let destRecdValue ev = | RecdValue (_tcref, info) -> Some info | _ -> None +[] let (|StripUnionCaseValue|_|) ev = match stripValue ev with - | UnionCaseValue (c, info) -> Some (c, info) - | _ -> None + | UnionCaseValue (c, info) -> ValueSome (c, info) + | _ -> ValueNone let mkBoolVal (g: TcGlobals) n = ConstValue(Const.Bool n, g.bool_ty) @@ -1403,7 +1425,7 @@ let AbstractOptimizationInfoToEssentials = let rec abstractModulInfo (ss: ModuleInfo) = { ModuleOrNamespaceInfos = NameMap.map (InterruptibleLazy.force >> abstractModulInfo >> notlazy) ss.ModuleOrNamespaceInfos - ValInfos = ss.ValInfos.Filter (fun (v, _) -> v.MustInline) } + ValInfos = ss.ValInfos.Filter (fun (v, _) -> v.ShouldInline) } and abstractLazyModulInfo ss = ss |> InterruptibleLazy.force |> abstractModulInfo |> notlazy @@ -1463,11 +1485,11 @@ let AbstractExprInfoByVars (boundVars: Val list, boundTyVars) ivalue = | UnknownValue -> ivalue | SizeValue (_vdepth, vinfo) -> MakeSizedValueInfo (abstractExprInfo vinfo) - and abstractValInfo v = + let abstractValInfo v = { ValExprInfo=abstractExprInfo v.ValExprInfo ValMakesNoCriticalTailcalls=v.ValMakesNoCriticalTailcalls } - and abstractModulInfo ss = + let rec abstractModulInfo ss = { ModuleOrNamespaceInfos = ss.ModuleOrNamespaceInfos |> NameMap.map (InterruptibleLazy.force >> abstractModulInfo >> notlazy) ValInfos = ss.ValInfos.Map (fun (vref, e) -> check vref (abstractValInfo e) ) } @@ -1543,11 +1565,11 @@ let ValueOfExpr expr = let IsMutableStructuralBindingForTupleElement (vref: ValRef) = vref.IsCompilerGenerated && - vref.LogicalName.EndsWith suffixForTupleElementAssignmentTarget + vref.LogicalName.EndsWithOrdinal suffixForTupleElementAssignmentTarget let IsMutableForOutArg (vref: ValRef) = vref.IsCompilerGenerated && - vref.LogicalName.StartsWith(outArgCompilerGeneratedName) + vref.LogicalName.StartsWithOrdinal(outArgCompilerGeneratedName) let IsKnownOnlyMutableBeforeUse (vref: ValRef) = IsMutableStructuralBindingForTupleElement vref || @@ -1598,7 +1620,7 @@ let ValueIsUsedOrHasEffect cenv fvs (b: Binding, binfo) = // No discarding for things that are used Zset.contains v (fvs()) -let rec SplitValuesByIsUsedOrHasEffect cenv fvs x = +let SplitValuesByIsUsedOrHasEffect cenv fvs x = x |> List.filter (ValueIsUsedOrHasEffect cenv fvs) |> List.unzip let IlAssemblyCodeInstrHasEffect i = @@ -1681,7 +1703,7 @@ let TryEliminateBinding cenv _env bind e2 _m = not vspec1.IsCompilerGenerated then None elif vspec1.IsFixed then None - elif vspec1.LogicalName.StartsWith stackVarPrefix || + elif vspec1.LogicalName.StartsWithOrdinal stackVarPrefix || vspec1.LogicalName.Contains suffixForVariablesThatMayNotBeEliminated then None else @@ -1773,26 +1795,29 @@ let TryEliminateLet cenv env bind e2 m = | None -> mkLetBind m bind e2, 0 /// Detect the application of a value to an arbitrary number of arguments +[] let rec (|KnownValApp|_|) expr = match stripDebugPoints expr with - | Expr.Val (vref, _, _) -> Some(vref, [], []) - | Expr.App (KnownValApp(vref, typeArgs1, otherArgs1), _, typeArgs2, otherArgs2, _) -> Some(vref, typeArgs1@typeArgs2, otherArgs1@otherArgs2) - | _ -> None + | Expr.Val (vref, _, _) -> ValueSome(vref, [], []) + | Expr.App (KnownValApp(vref, typeArgs1, otherArgs1), _, typeArgs2, otherArgs2, _) -> ValueSome(vref, typeArgs1@typeArgs2, otherArgs1@otherArgs2) + | _ -> ValueNone /// Matches boolean decision tree: /// check single case with bool const. +[] let (|TDBoolSwitch|_|) dtree = match dtree with | TDSwitch(expr, [TCase (DecisionTreeTest.Const(Const.Bool testBool), caseTree )], Some defaultTree, range) -> - Some (expr, testBool, caseTree, defaultTree, range) + ValueSome (expr, testBool, caseTree, defaultTree, range) | _ -> - None + ValueNone /// Check target that have a constant bool value +[] let (|ConstantBoolTarget|_|) target = match target with - | TTarget([], Expr.Const (Const.Bool b, _, _), _) -> Some b - | _ -> None + | TTarget([], Expr.Const (Const.Bool b, _, _), _) -> ValueSome b + | _ -> ValueNone /// Is this a tree, where each decision is a two-way switch (to prevent later duplication of trees), and each branch returns or true/false, /// apart from one branch which defers to another expression @@ -2025,7 +2050,7 @@ let TryRewriteBranchingTupleBinding g (v: Val) rhs tgtSeqPtOpt body m = mkLetsBind m binds rhsAndTupleBinding |> Some | _ -> None -let rec ExpandStructuralBinding cenv expr = +let ExpandStructuralBinding cenv expr = let g = cenv.g assert cenv.settings.ExpandStructuralValues() @@ -2062,50 +2087,59 @@ let rec ExpandStructuralBinding cenv expr = ExpandStructuralBindingRaw cenv e /// Detect a query { ... } +[] let (|QueryRun|_|) g expr = match expr with | Expr.App (Expr.Val (vref, _, _), _, _, [_builder; arg], _) when valRefEq g vref g.query_run_value_vref -> - Some (arg, None) + ValueSome (arg, None) | Expr.App (Expr.Val (vref, _, _), _, [ elemTy ], [_builder; arg], _) when valRefEq g vref g.query_run_enumerable_vref -> - Some (arg, Some elemTy) + ValueSome (arg, Some elemTy) | _ -> - None + ValueNone let (|MaybeRefTupled|) e = tryDestRefTupleExpr e +[] let (|AnyInstanceMethodApp|_|) e = match e with - | Expr.App (Expr.Val (vref, _, _), _, tyargs, [obj; MaybeRefTupled args], _) -> Some (vref, tyargs, obj, args) - | _ -> None + | Expr.App (Expr.Val (vref, _, _), _, tyargs, [obj; MaybeRefTupled args], _) -> ValueSome (vref, tyargs, obj, args) + | _ -> ValueNone +[] let (|InstanceMethodApp|_|) g (expectedValRef: ValRef) e = match e with - | AnyInstanceMethodApp (vref, tyargs, obj, args) when valRefEq g vref expectedValRef -> Some (tyargs, obj, args) - | _ -> None + | AnyInstanceMethodApp (vref, tyargs, obj, args) when valRefEq g vref expectedValRef -> ValueSome (tyargs, obj, args) + | _ -> ValueNone +[] let (|QuerySourceEnumerable|_|) g = function - | InstanceMethodApp g g.query_source_vref ([resTy], _builder, [res]) -> Some (resTy, res) - | _ -> None + | InstanceMethodApp g g.query_source_vref ([resTy], _builder, [res]) -> ValueSome (resTy, res) + | _ -> ValueNone +[] let (|QueryFor|_|) g = function - | InstanceMethodApp g g.query_for_vref ([srcTy;qTy;resTy;_qInnerTy], _builder, [src;selector]) -> Some (qTy, srcTy, resTy, src, selector) - | _ -> None + | InstanceMethodApp g g.query_for_vref ([srcTy;qTy;resTy;_qInnerTy], _builder, [src;selector]) -> ValueSome (qTy, srcTy, resTy, src, selector) + | _ -> ValueNone +[] let (|QueryYield|_|) g = function - | InstanceMethodApp g g.query_yield_vref ([resTy;qTy], _builder, [res]) -> Some (qTy, resTy, res) - | _ -> None + | InstanceMethodApp g g.query_yield_vref ([resTy;qTy], _builder, [res]) -> ValueSome (qTy, resTy, res) + | _ -> ValueNone +[] let (|QueryYieldFrom|_|) g = function - | InstanceMethodApp g g.query_yield_from_vref ([resTy;qTy], _builder, [res]) -> Some (qTy, resTy, res) - | _ -> None + | InstanceMethodApp g g.query_yield_from_vref ([resTy;qTy], _builder, [res]) -> ValueSome (qTy, resTy, res) + | _ -> ValueNone +[] let (|QuerySelect|_|) g = function - | InstanceMethodApp g g.query_select_vref ([srcTy;qTy;resTy], _builder, [src;selector]) -> Some (qTy, srcTy, resTy, src, selector) - | _ -> None + | InstanceMethodApp g g.query_select_vref ([srcTy;qTy;resTy], _builder, [src;selector]) -> ValueSome (qTy, srcTy, resTy, src, selector) + | _ -> ValueNone +[] let (|QueryZero|_|) g = function - | InstanceMethodApp g g.query_zero_vref ([resTy;qTy], _builder, _) -> Some (qTy, resTy) - | _ -> None + | InstanceMethodApp g g.query_zero_vref ([resTy;qTy], _builder, _) -> ValueSome (qTy, resTy) + | _ -> ValueNone /// Look for a possible tuple and transform let (|AnyRefTupleTrans|) e = @@ -2114,11 +2148,12 @@ let (|AnyRefTupleTrans|) e = | _ -> [e], (function [e] -> e | _ -> assert false; failwith "unreachable") /// Look for any QueryBuilder.* operation and transform +[] let (|AnyQueryBuilderOpTrans|_|) g = function | Expr.App (Expr.Val (vref, _, _) as v, vty, tyargs, [builder; AnyRefTupleTrans( src :: rest, replaceArgs) ], m) when (match vref.ApparentEnclosingEntity with Parent tcref -> tyconRefEq g tcref g.query_builder_tcref | ParentNone -> false) -> - Some (src, (fun newSource -> Expr.App (v, vty, tyargs, [builder; replaceArgs(newSource :: rest)], m))) - | _ -> None + ValueSome (src, (fun newSource -> Expr.App (v, vty, tyargs, [builder; replaceArgs(newSource :: rest)], m))) + | _ -> ValueNone /// If this returns "Some" then the source is not IQueryable. // := @@ -2222,7 +2257,7 @@ let TryDetectQueryQuoteAndRun cenv (expr: Expr) = | QuerySelect g (qTy, _, resultElemTy, _, _) | QueryYield g (qTy, resultElemTy, _) | QueryYieldFrom g (qTy, resultElemTy, _) - when typeEquiv g qTy (mkAppTy g.tcref_System_Collections_IEnumerable []) -> + when typeEquiv g qTy (mkWoNullAppTy g.tcref_System_Collections_IEnumerable []) -> match tryRewriteToSeqCombinators g e with | Some newSource -> @@ -2291,7 +2326,7 @@ let IsILMethodRefSystemStringConcatArray (mref: ILMethodRef) = ilTy.IsNominal && ilTy.TypeRef.Name = "System.String" -> true | _ -> false)) - + let rec IsDebugPipeRightExpr cenv expr = let g = cenv.g match expr with @@ -2306,6 +2341,13 @@ let rec IsDebugPipeRightExpr cenv expr = else false | _ -> false +let inline IsStateMachineExpr g overallExpr = + //printfn "%s" (DebugPrint.showExpr overallExpr) + match overallExpr with + | Expr.App(funcExpr = Expr.Val(valRef = valRef)) -> + isReturnsResumableCodeTy g valRef.TauType + | _ -> false + /// Optimize/analyze an expression let rec OptimizeExpr cenv (env: IncrementalOptimizationEnv) expr = cenv.stackGuard.Guard <| fun () -> @@ -2320,6 +2362,10 @@ let rec OptimizeExpr cenv (env: IncrementalOptimizationEnv) expr = if IsDebugPipeRightExpr cenv expr then OptimizeDebugPipeRights cenv env expr else + let isStateMachineE = IsStateMachineExpr g expr + + let env = { env with disableMethodSplitting = env.disableMethodSplitting || isStateMachineE } + match expr with // treat the common linear cases to avoid stack overflows, using an explicit continuation | LinearOpExpr _ @@ -2332,9 +2378,10 @@ let rec OptimizeExpr cenv (env: IncrementalOptimizationEnv) expr = | Expr.Const (c, m, ty) -> OptimizeConst cenv env expr (c, m, ty) - | Expr.Val (v, _vFlags, m) -> + | Expr.Val (v, _vFlags, m) -> OptimizeVal cenv env expr (v, m) + | Expr.Quote (ast, splices, isFromQueryExpression, m, ty) -> let doData data = map3Of4 (List.map (OptimizeExpr cenv env >> fst)) data let splices = @@ -2478,13 +2525,6 @@ and MakeOptimizedSystemStringConcatCall cenv env m args = when IsILMethodRefSystemStringConcat ilMethRef -> optimizeArgs args accArgs -// String constant folding requires a bit more work as we cannot quadratically concat strings at compile time. -#if STRING_CONSTANT_FOLDING - // Optimize string constants, e.g. "1" + "2" will turn into "12" - | Expr.Const (Const.String str1, _, _), Expr.Const (Const.String str2, _, _) :: accArgs -> - mkString g m (str1 + str2) :: accArgs -#endif - | arg, _ -> arg :: accArgs and optimizeArgs args accArgs = @@ -2601,13 +2641,13 @@ and OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsR, arginfos, m) = | TOp.UnionCaseFieldGet (cspec, n), [e1info] -> TryOptimizeUnionCaseGet cenv env (e1info, cspec, tyargs, n, m) | _ -> None match knownValue with - | Some valu -> - match TryOptimizeVal cenv env (None, false, false, valu, m) with + | Some value_ -> + match TryOptimizeVal cenv env (None, false, false, value_, m) with | Some res -> OptimizeExpr cenv env res (* discard e1 since guard ensures it has no effects *) - | None -> OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu + | None -> OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos value_ | None -> OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos UnknownValue -and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = +and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos value_ = let g = cenv.g // The generic case - we may collect information, but the construction/projection doesn't disappear @@ -2616,20 +2656,20 @@ and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = let argEffects = OrEffects arginfos let argValues = List.map (fun x -> x.Info) arginfos let effect = OpHasEffect g m op - let cost, valu = + let cost, value_ = match op with | TOp.UnionCase c -> 2, MakeValueInfoForUnionCase c (Array.ofList argValues) - | TOp.ExnConstr _ -> 2, valu + | TOp.ExnConstr _ -> 2, value_ | TOp.Tuple tupInfo -> let isStruct = evalTupInfoIsStruct tupInfo - if isStruct then 0, valu + if isStruct then 0, value_ else 1,MakeValueInfoForTuple (Array.ofList argValues) | TOp.AnonRecd anonInfo -> let isStruct = evalAnonInfoIsStruct anonInfo - if isStruct then 0, valu - else 1, valu + if isStruct then 0, value_ + else 1, value_ | TOp.AnonRecdGet _ | TOp.ValFieldGet _ @@ -2638,41 +2678,41 @@ and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = | TOp.ExnFieldGet _ | TOp.UnionCaseTagGet _ -> // REVIEW: reduction possible here, and may be very effective - 1, valu + 1, value_ | TOp.UnionCaseProof _ -> // We count the proof as size 0 // We maintain the value of the source of the proof-cast if it is known to be a UnionCaseValue - let valu = + let value_ = match argValues[0] with | StripUnionCaseValue (uc, info) -> UnionCaseValue(uc, info) - | _ -> valu - 0, valu + | _ -> value_ + 0, value_ | TOp.ILAsm (instrs, retTypes) -> min instrs.Length 1, mkAssemblyCodeValueInfo g instrs argValues retTypes - | TOp.Bytes bytes -> bytes.Length/10, valu - | TOp.UInt16s bytes -> bytes.Length/10, valu + | TOp.Bytes bytes -> bytes.Length/10, value_ + | TOp.UInt16s bytes -> bytes.Length/10, value_ | TOp.ValFieldGetAddr _ | TOp.Array | TOp.IntegerForLoop _ | TOp.While _ | TOp.TryWith _ | TOp.TryFinally _ | TOp.ILCall _ | TOp.TraitCall _ | TOp.LValueOp _ | TOp.ValFieldSet _ | TOp.UnionCaseFieldSet _ | TOp.RefAddrGet _ | TOp.Coerce | TOp.Reraise | TOp.UnionCaseFieldGetAddr _ - | TOp.ExnFieldSet _ -> 1, valu + | TOp.ExnFieldSet _ -> 1, value_ | TOp.Recd (ctorInfo, tcref) -> let finfos = tcref.AllInstanceFieldsAsList // REVIEW: this seems a little conservative: Allocating a record with a mutable field // is not an effect - only reading or writing the field is. - let valu = + let value_ = match ctorInfo with | RecdExprIsObjInit -> UnknownValue | RecdExpr -> - if argValues.Length <> finfos.Length then valu + if argValues.Length <> finfos.Length then value_ else MakeValueInfoForRecord tcref (Array.ofList ((argValues, finfos) ||> List.map2 (fun x f -> if f.IsMutable then UnknownValue else x) )) - 2, valu + 2, value_ | TOp.Goto _ | TOp.Label _ | TOp.Return -> assert false; error(InternalError("unexpected goto/label/return in optimization", m)) // Indirect calls to IL code are always taken as tailcalls @@ -2685,7 +2725,7 @@ and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = FunctionSize=argsFSize + cost HasEffect=argEffects || effect MightMakeCriticalTailcall= mayBeCriticalTailcall // discard tailcall info for args - these are not in tailcall position - Info=valu } + Info=value_ } // Replace entire expression with known value? match TryOptimizeValInfo cenv env m vinfo with @@ -2696,7 +2736,7 @@ and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = FunctionSize=argsFSize + cost HasEffect=argEffects || effect MightMakeCriticalTailcall= mayBeCriticalTailcall // discard tailcall info for args - these are not in tailcall position - Info=valu } + Info=value_ } /// Optimize/analyze a constant node and OptimizeConst cenv env expr (c, m, ty) = @@ -3013,8 +3053,7 @@ and CopyExprForInlining cenv isInlineIfLambda expr (m: range) = /// Make optimization decisions once we know the optimization information /// for a value -and TryOptimizeVal cenv env (vOpt: ValRef option, mustInline, inlineIfLambda, valInfoForVal, m) = - +and TryOptimizeVal cenv env (vOpt: ValRef option, shouldInline, inlineIfLambda, valInfoForVal, m) = let g = cenv.g match valInfoForVal with @@ -3023,13 +3062,13 @@ and TryOptimizeVal cenv env (vOpt: ValRef option, mustInline, inlineIfLambda, va Some (Expr.Const (c, m, ty)) | SizeValue (_, detail) -> - TryOptimizeVal cenv env (vOpt, mustInline, inlineIfLambda, detail, m) + TryOptimizeVal cenv env (vOpt, shouldInline, inlineIfLambda, detail, m) | ValValue (vR, detail) -> // Inline values bound to other values immediately // Prefer to inline using the more specific info if possible // If the more specific info didn't reveal an inline then use the value - match TryOptimizeVal cenv env (vOpt, mustInline, inlineIfLambda, detail, m) with + match TryOptimizeVal cenv env (vOpt, shouldInline, inlineIfLambda, detail, m) with | Some e -> Some e | None -> // If we have proven 'v = compilerGeneratedValue' @@ -3047,18 +3086,26 @@ and TryOptimizeVal cenv env (vOpt: ValRef option, mustInline, inlineIfLambda, va | ConstExprValue(_size, expr) -> Some (remarkExpr m (copyExpr g CloneAllAndMarkExprValsAsCompilerGenerated expr)) - | CurriedLambdaValue (_, _, _, expr, _) when mustInline || inlineIfLambda -> - let exprCopy = CopyExprForInlining cenv inlineIfLambda expr m - Some exprCopy + | CurriedLambdaValue (_, _, _, expr, _) when shouldInline || inlineIfLambda -> + let fvs = freeInExpr CollectLocals expr + if fvs.UsesMethodLocalConstructs then + // Discarding lambda for binding because uses protected members --- TBD: Should we warn or error here + None + else + let exprCopy = CopyExprForInlining cenv inlineIfLambda expr m + Some exprCopy - | TupleValue _ | UnionCaseValue _ | RecdValue _ when mustInline -> + | TupleValue _ | UnionCaseValue _ | RecdValue _ when shouldInline -> failwith "tuple, union and record values cannot be marked 'inline'" - | UnknownValue when mustInline -> - warning(Error(FSComp.SR.optValueMarkedInlineHasUnexpectedValue(), m)); None + | UnknownValue when shouldInline -> + warning(Error(FSComp.SR.optValueMarkedInlineHasUnexpectedValue(), m)) + None + + | _ when shouldInline -> + warning(Error(FSComp.SR.optValueMarkedInlineCouldNotBeInlined(), m)) + None - | _ when mustInline -> - warning(Error(FSComp.SR.optValueMarkedInlineCouldNotBeInlined(), m)); None | _ -> None and TryOptimizeValInfo cenv env m vinfo = @@ -3082,9 +3129,9 @@ and OptimizeVal cenv env expr (v: ValRef, m) = let g = cenv.g - let valInfoForVal = GetInfoForVal cenv env m v + let valInfoForVal = GetInfoForValWithCheck cenv env m v - match TryOptimizeVal cenv env (Some v, v.MustInline, v.InlineIfLambda, valInfoForVal.ValExprInfo, m) with + match TryOptimizeVal cenv env (Some v, v.ShouldInline, v.InlineIfLambda, valInfoForVal.ValExprInfo, m) with | Some e -> // don't reoptimize inlined lambdas until they get applied to something match e with @@ -3100,16 +3147,19 @@ and OptimizeVal cenv env expr (v: ValRef, m) = let e, einfo = OptimizeExpr cenv env e e, AddValEqualityInfo g m v einfo - | None -> + | None -> #if FABLE_COMPILER // no inlining for FSharp.Core - if v.MustInline && not (v.ToString().StartsWith("Microsoft.FSharp.")) then + if v.ShouldInline && not (v.ToString().StartsWith("Microsoft.FSharp.")) then #else - if v.MustInline then + if v.ShouldInline then #endif - error(Error(FSComp.SR.optFailedToInlineValue(v.DisplayName), m)) + match valInfoForVal.ValExprInfo with + | UnknownValue -> error(Error(FSComp.SR.optFailedToInlineValue(v.DisplayName), m)) + | _ -> warning(Error(FSComp.SR.optFailedToInlineValue(v.DisplayName), m)) if v.InlineIfLambda then warning(Error(FSComp.SR.optFailedToInlineSuggestedValue(v.DisplayName), m)) + expr, (AddValEqualityInfo g m v { Info=valInfoForVal.ValExprInfo HasEffect=false @@ -3191,7 +3241,7 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = // the target takes a tupled argument, so we need to reorder the arg expressions in the // arg list, and create a tuple of y & comp // push the comparer to the end and box the argument - let args2 = [x; mkRefTupledNoTypes g m [mkCoerceExpr(y, g.obj_ty, m, ty) ; comp]] + let args2 = [x; mkRefTupledNoTypes g m [mkCoerceExpr(y, g.obj_ty_ambivalent, m, ty) ; comp]] Some (DevirtualizeApplication cenv env vref ty tyargs args2 m) | _ -> None @@ -3206,30 +3256,47 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | Some (_, vref) -> Some (DevirtualizeApplication cenv env vref ty tyargs args m) | _ -> None - // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityWithComparerFast + // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityWithComparerIntrinsic | Expr.Val (v, _, _), [ty], _ when CanDevirtualizeApplication cenv v g.generic_equality_withc_inner_vref ty args -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsWithComparerValues, args with - | Some (_, _, withcEqualsVal), [comp; x; y] -> + | Some (_, _, _, Some withcEqualsExactVal), [comp; x; y] -> + // push the comparer to the end + let args2 = [x; mkRefTupledNoTypes g m [y; comp]] + Some (DevirtualizeApplication cenv env withcEqualsExactVal ty tyargs args2 m) + | Some (_, _, withcEqualsVal, _ ), [comp; x; y] -> // push the comparer to the end and box the argument - let args2 = [x; mkRefTupledNoTypes g m [mkCoerceExpr(y, g.obj_ty, m, ty) ; comp]] + let args2 = [x; mkRefTupledNoTypes g m [mkCoerceExpr(y, g.obj_ty_ambivalent, m, ty) ; comp]] Some (DevirtualizeApplication cenv env withcEqualsVal ty tyargs args2 m) | _ -> None - // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityWithComparer + // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityIntrinsic | Expr.Val (v, _, _), [ty], _ when CanDevirtualizeApplication cenv v g.generic_equality_per_inner_vref ty args && not(isRefTupleTy g ty) -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsWithComparerValues, args with - | Some (_, _, withcEqualsVal), [x; y] -> - let args2 = [x; mkRefTupledNoTypes g m [mkCoerceExpr(y, g.obj_ty, m, ty); (mkCallGetGenericPEREqualityComparer g m)]] - Some (DevirtualizeApplication cenv env withcEqualsVal ty tyargs args2 m) + | Some (_, _, _, Some withcEqualsExactVal), [x; y] -> + let args2 = [x; mkRefTupledNoTypes g m [y; (mkCallGetGenericPEREqualityComparer g m)]] + Some (DevirtualizeApplication cenv env withcEqualsExactVal ty tyargs args2 m) + | Some (_, _, withcEqualsVal, _), [x; y] -> + let equalsExactOpt = + tcref.MembersOfFSharpTyconByName.TryFind("Equals") + |> Option.map (List.where (fun x -> x.IsCompilerGenerated)) + |> Option.bind List.tryExactlyOne + + match equalsExactOpt with + | Some equalsExact -> + let args2 = [x; mkRefTupledNoTypes g m [y; (mkCallGetGenericPEREqualityComparer g m)]] + Some (DevirtualizeApplication cenv env equalsExact ty tyargs args2 m) + | None -> + let args2 = [x; mkRefTupledNoTypes g m [mkCoerceExpr(y, g.obj_ty_ambivalent, m, ty); (mkCallGetGenericPEREqualityComparer g m)]] + Some (DevirtualizeApplication cenv env withcEqualsVal ty tyargs args2 m) | _ -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericHashIntrinsic | Expr.Val (v, _, _), [ty], _ when CanDevirtualizeApplication cenv v g.generic_hash_inner_vref ty args -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsWithComparerValues, args with - | Some (_, withcGetHashCodeVal, _), [x] -> + | Some (_, withcGetHashCodeVal, _, _), [x] -> let args2 = [x; mkCallGetGenericEREqualityComparer g m] Some (DevirtualizeApplication cenv env withcGetHashCodeVal ty tyargs args2 m) | _ -> None @@ -3238,7 +3305,7 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | Expr.Val (v, _, _), [ty], _ when CanDevirtualizeApplication cenv v g.generic_hash_withc_inner_vref ty args -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsWithComparerValues, args with - | Some (_, withcGetHashCodeVal, _), [comp; x] -> + | Some (_, withcGetHashCodeVal, _, _), [comp; x] -> let args2 = [x; comp] Some (DevirtualizeApplication cenv env withcGetHashCodeVal ty tyargs args2 m) | _ -> None @@ -3400,7 +3467,7 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) | _ -> false | _ -> false | _ -> false - | _ -> false + | _ -> false if isValFromLazyExtensions then None else @@ -3408,7 +3475,7 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) match finfo.Info with | ValValue(vref, _) -> vref.Attribs |> List.exists (fun a -> (IsSecurityAttribute g cenv.amap cenv.casApplied a m) || (IsSecurityCriticalAttribute g a)) - | _ -> false + | _ -> false if isSecureMethod then None else @@ -3419,6 +3486,13 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) if isGetHashCode then None else + let isApplicationPartialExpr = + match finfo.Info with + | ValValue (_, CurriedLambdaValue (_, _, _, expr, _) ) -> IsPartialExpr cenv env m expr + | _ -> false + + if isApplicationPartialExpr then None else + // Inlining lambda let f2R = CopyExprForInlining cenv false f2 m @@ -3551,52 +3625,53 @@ and OptimizeApplication cenv env (f0, f0ty, tyargs, args, m) = | Choice2Of2 (newf0, remake) -> match TryInlineApplication cenv env finfo (tyargs, args, m) with - | Some (res, info) -> + | Some (res, info) -> // inlined (res |> remake), info - | None -> - let shapes = - match newf0 with - | Expr.Val (vref, _, _) -> - match vref.ValReprInfo with - | Some(ValReprInfo(_, detupArgsL, _)) -> - let nargs = args.Length - let nDetupArgsL = detupArgsL.Length - let nShapes = min nargs nDetupArgsL - let detupArgsShapesL = - List.truncate nShapes detupArgsL - |> List.map (fun detupArgs -> - match detupArgs with - | [] | [_] -> UnknownValue - | _ -> TupleValue(Array.ofList (List.map (fun _ -> UnknownValue) detupArgs))) - List.zip (detupArgsShapesL @ List.replicate (nargs - nShapes) UnknownValue) args - | _ -> args |> List.map (fun arg -> UnknownValue, arg) - | _ -> args |> List.map (fun arg -> UnknownValue, arg) - - let newArgs, arginfos = OptimizeExprsThenReshapeAndConsiderSplits cenv env shapes - // beta reducing - let reducedExpr = MakeApplicationAndBetaReduce g (newf0, f0ty, [tyargs], newArgs, m) - let newExpr = reducedExpr |> remake - - match newf0, reducedExpr with - | (Expr.Lambda _ | Expr.TyLambda _), Expr.Let _ -> - // we beta-reduced, hence reoptimize - OptimizeExpr cenv env newExpr | _ -> - // regular - // Determine if this application is a critical tailcall - let mayBeCriticalTailcall = + let shapes = match newf0 with - | KnownValApp(vref, _typeArgs, otherArgs) -> + | Expr.Val (vref, _, _) -> + match vref.ValReprInfo with + | Some(ValReprInfo(_, detupArgsL, _)) -> + let nargs = args.Length + let nDetupArgsL = detupArgsL.Length + let nShapes = min nargs nDetupArgsL + let detupArgsShapesL = + List.truncate nShapes detupArgsL + |> List.map (fun detupArgs -> + match detupArgs with + | [] | [_] -> UnknownValue + | _ -> TupleValue(Array.ofList (List.map (fun _ -> UnknownValue) detupArgs))) + List.zip (detupArgsShapesL @ List.replicate (nargs - nShapes) UnknownValue) args + | _ -> args |> List.map (fun arg -> UnknownValue, arg) + | _ -> args |> List.map (fun arg -> UnknownValue, arg) + + let newArgs, arginfos = OptimizeExprsThenReshapeAndConsiderSplits cenv env shapes + // beta reducing + let reducedExpr = MakeApplicationAndBetaReduce g (newf0, f0ty, [tyargs], newArgs, m) + let newExpr = reducedExpr |> remake + + match newf0, reducedExpr with + | (Expr.Lambda _ | Expr.TyLambda _), Expr.Let _ -> + // we beta-reduced, hence reoptimize + OptimizeExpr cenv env newExpr + | _ -> + // regular + + // Determine if this application is a critical tailcall + let mayBeCriticalTailcall = + match newf0 with + | KnownValApp(vref, _typeArgs, otherArgs) -> // Check if this is a call to a function of known arity that has been inferred to not be a critical tailcall when used as a direct call // This includes recursive calls to the function being defined (in which case we get a non-critical, closed-world tailcall). // Note we also have to check the argument count to ensure this is a direct call (or a partial application). let doesNotMakeCriticalTailcall = - vref.MakesNoCriticalTailcalls || - (let valInfoForVal = GetInfoForVal cenv env m vref in valInfoForVal.ValMakesNoCriticalTailcalls) || + vref.MakesNoCriticalTailcalls || + (let valInfoForVal = GetInfoForValWithCheck cenv env m vref in valInfoForVal.ValMakesNoCriticalTailcalls) || (match env.functionVal with | None -> false | Some (v, _) -> valEq vref.Deref v) if doesNotMakeCriticalTailcall then let numArgs = otherArgs.Length + newArgs.Length @@ -3608,16 +3683,16 @@ and OptimizeApplication cenv env (f0, f0ty, tyargs, args, m) = | None -> true // over-application of a known function, which presumably returns a function. This counts as an indirect call else true // application of a function that may make a critical tailcall - - | _ -> - // All indirect calls (calls to unknown functions) are assumed to be critical tailcalls - true - newExpr, { TotalSize=finfo.TotalSize + AddTotalSizes arginfos - FunctionSize=finfo.FunctionSize + AddFunctionSizes arginfos - HasEffect=true - MightMakeCriticalTailcall = mayBeCriticalTailcall - Info=ValueOfExpr newExpr } + | _ -> + // All indirect calls (calls to unknown functions) are assumed to be critical tailcalls + true + + newExpr, { TotalSize=finfo.TotalSize + AddTotalSizes arginfos + FunctionSize=finfo.FunctionSize + AddFunctionSizes arginfos + HasEffect=true + MightMakeCriticalTailcall = mayBeCriticalTailcall + Info=ValueOfExpr newExpr } /// Extract a sequence of pipe-right operations (note the pipe-right operator is left-associative /// so we start with the full thing and descend down taking apps off the end first) @@ -3796,7 +3871,7 @@ and OptimizeLambdas (vspec: Val option) cenv env valReprInfo expr exprTy = () // can't inline any values with semi-recursive object references to self or base - let valu = + let value_ = match baseValOpt with | None -> CurriedLambdaValue (lambdaId, arities, bsize, exprR, exprTy) | Some baseVal -> @@ -3816,7 +3891,7 @@ and OptimizeLambdas (vspec: Val option) cenv env valReprInfo expr exprTy = FunctionSize=1 HasEffect=false MightMakeCriticalTailcall = false - Info= valu } + Info= value_ } | _ -> OptimizeExpr cenv env expr @@ -3828,15 +3903,15 @@ and OptimizeNewDelegateExpr cenv env (lambdaId, vsl, body, remake) = let arities = vsl.Length let bsize = bodyinfo.TotalSize let exprR = remake bodyR - let valu = CurriedLambdaValue (lambdaId, arities, bsize, exprR, tyOfExpr g exprR) + let value_ = CurriedLambdaValue (lambdaId, arities, bsize, exprR, tyOfExpr g exprR) exprR, { TotalSize=bsize + closureTotalSize (* estimate size of new syntactic closure - expensive, in contrast to a method *) FunctionSize=1 HasEffect=false MightMakeCriticalTailcall = false - Info= valu } + Info= value_ } -/// Recursive calls that first try to make an expression "fit" the a shape +/// Recursive calls that first try to make an expression "fit" the shape /// where it is about to be consumed. and OptimizeExprsThenReshapeAndConsiderSplits cenv env exprs = match exprs with @@ -4060,7 +4135,7 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = let exprOptimized, einfo = let env = if vref.IsCompilerGenerated && Option.isSome env.latestBoundId then env else {env with latestBoundId=Some vref.Id} - let cenv = if vref.InlineInfo.MustInline then { cenv with optimizing=false} else cenv + let cenv = if vref.InlineInfo.ShouldInline then { cenv with optimizing=false} else cenv let arityInfo = InferValReprInfoOfBinding g AllowTypeDirectedDetupling.No vref expr let exprOptimized, einfo = OptimizeLambdas (Some vref) cenv env arityInfo expr vref.Type let size = localVarSize @@ -4078,7 +4153,10 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = let fvs = freeInExpr CollectLocals body if fvs.UsesMethodLocalConstructs then // Discarding lambda for binding because uses protected members - UnknownValue + UnknownValue + elif fvs.FreeLocals.ToArray() |> Seq.fold(fun acc v -> if not acc then v.Accessibility.IsPrivate else acc) false then + // Discarding lambda for binding because uses private members + UnknownValue else ivalue @@ -4089,10 +4167,10 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | UnknownValue | ConstValue _ | ConstExprValue _ -> ivalue | SizeValue(_, a) -> MakeSizedValueInfo (cut a) - let einfo = if vref.MustInline || vref.InlineIfLambda then einfo else {einfo with Info = cut einfo.Info } + let einfo = if vref.ShouldInline || vref.InlineIfLambda then einfo else {einfo with Info = cut einfo.Info } let einfo = - if (not vref.MustInline && not vref.InlineIfLambda && not cenv.settings.KeepOptimizationValues) || + if (not vref.ShouldInline && not vref.InlineIfLambda && not cenv.settings.KeepOptimizationValues) || // Bug 4916: do not record inline data for initialization trigger expressions // Note: we can't eliminate these value infos at the file boundaries because that would change initialization @@ -4139,8 +4217,8 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = valRefEq g nvref g.generic_hash_inner_vref)) then {einfo with Info=UnknownValue} else einfo - if vref.MustInline && IsPartialExprVal einfo.Info then - errorR(InternalError("the mustinline value '"+vref.LogicalName+"' was not inferred to have a known value", vref.Range)) + if vref.ShouldInline && IsPartialExprVal einfo.Info then + errorR(InternalError("the inline value '"+vref.LogicalName+"' was not inferred to have a known value", vref.Range)) let env = BindInternalLocalVal cenv vref (mkValInfo einfo vref) env (TBind(vref, exprOptimized, spBind), einfo), env @@ -4287,8 +4365,7 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = let defs, minfos = List.unzip defs (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) -and OptimizeImplFileInternal cenv env isIncrementalFragment fsiMultiAssemblyEmit hidden implFile = - let g = cenv.g +and OptimizeImplFileInternal cenv env isIncrementalFragment hidden implFile = let (CheckedImplFile (qname, pragmas, signature, contents, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode)) = implFile let env, contentsR, minfo, hidden = // FSI compiles interactive fragments as if you're typing incrementally into one module. @@ -4300,13 +4377,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment fsiMultiAssemblyEmit // This optimizes and builds minfo ignoring the signature let (defR, minfo), (_env, _bindInfosColl) = OptimizeModuleContents cenv (env, []) contents let hidden = ComputeImplementationHidingInfoAtAssemblyBoundary defR hidden - let minfo = - // In F# interactive multi-assembly mode, no internals are accessible across interactive fragments. - // In F# interactive single-assembly mode, internals are accessible across interactive fragments. - if fsiMultiAssemblyEmit then - AbstractLazyModulInfoByHiding true hidden minfo - else - AbstractLazyModulInfoByHiding false hidden minfo + let minfo = AbstractLazyModulInfoByHiding false hidden minfo let env = BindValsInModuleOrNamespace cenv minfo env env, defR, minfo, hidden else @@ -4314,13 +4385,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment fsiMultiAssemblyEmit let mexprR, minfo = OptimizeModuleExprWithSig cenv env signature contents let hidden = ComputeSignatureHidingInfoAtAssemblyBoundary signature hidden let minfoExternal = AbstractLazyModulInfoByHiding true hidden minfo - let env = - // In F# interactive multi-assembly mode, internals are not accessible in the 'env' used intra-assembly - // In regular fsc compilation, internals are accessible in the 'env' used intra-assembly - if g.isInteractive && fsiMultiAssemblyEmit then - BindValsInModuleOrNamespace cenv minfoExternal env - else - BindValsInModuleOrNamespace cenv minfo env + let env = BindValsInModuleOrNamespace cenv minfo env env, mexprR, minfoExternal, hidden let implFileR = CheckedImplFile (qname, pragmas, signature, contentsR, hasExplicitEntryPoint, isScript, anonRecdTypes, namedDebugPointsForInlinedCode) @@ -4328,7 +4393,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment fsiMultiAssemblyEmit env, implFileR, minfo, hidden /// Entry point -let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, fsiMultiAssemblyEmit, emitTailcalls, hidden, mimpls) = +let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, emitTailcalls, hidden, mimpls) = let cenv = { settings=settings scope=ccu @@ -4339,10 +4404,11 @@ let OptimizeImplFile (settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncr localInternalVals=Dictionary(10000) emitTailcalls=emitTailcalls casApplied=Dictionary() - stackGuard = StackGuard(OptimizerStackGuardDepth, "OptimizerStackGuardDepth") + stackGuard = StackGuard(OptimizerStackGuardDepth, "OptimizerStackGuardDepth") + realsig = tcGlobals.realsig } - let env, _, _, _ as results = OptimizeImplFileInternal cenv optEnv isIncrementalFragment fsiMultiAssemblyEmit hidden mimpls + let env, _, _, _ as results = OptimizeImplFileInternal cenv optEnv isIncrementalFragment hidden mimpls let optimizeDuringCodeGen disableMethodSplitting expr = let env = { env with disableMethodSplitting = env.disableMethodSplitting || disableMethodSplitting } diff --git a/src/fcs-fable/src/Compiler/Optimize/Optimizer.fsi b/src/fcs-fable/src/Compiler/Optimize/Optimizer.fsi index aa205b8622..17912af759 100644 --- a/src/fcs-fable/src/Compiler/Optimize/Optimizer.fsi +++ b/src/fcs-fable/src/Compiler/Optimize/Optimizer.fsi @@ -85,7 +85,6 @@ val internal OptimizeImplFile: Import.ImportMap * IncrementalOptimizationEnv * isIncrementalFragment: bool * - fsiMultiAssemblyEmit: bool * emitTailcalls: bool * SignatureHidingInfo * CheckedImplFile -> diff --git a/src/fcs-fable/src/Compiler/Service/BackgroundCompiler.fs b/src/fcs-fable/src/Compiler/Service/BackgroundCompiler.fs new file mode 100644 index 0000000000..1089f5774e --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/BackgroundCompiler.fs @@ -0,0 +1,1747 @@ +namespace FSharp.Compiler.CodeAnalysis + +open FSharp.Compiler.Text +open FSharp.Compiler.BuildGraph + +open System +open System.Diagnostics +open System.IO +open System.Reflection +open System.Reflection.Emit +open System.Threading +open Internal.Utilities.Collections +open Internal.Utilities.Library +open Internal.Utilities.Library.Extras +open FSharp.Compiler +open FSharp.Compiler.AbstractIL +open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler.AbstractIL.ILBinaryReader +open FSharp.Compiler.AbstractIL.ILDynamicAssemblyWriter +open FSharp.Compiler.CodeAnalysis +open FSharp.Compiler.CompilerConfig +open FSharp.Compiler.CompilerDiagnostics +open FSharp.Compiler.CompilerImports +open FSharp.Compiler.CompilerOptions +open FSharp.Compiler.DependencyManager +open FSharp.Compiler.Diagnostics +open FSharp.Compiler.Driver +open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.IO +open FSharp.Compiler.ParseAndCheckInputs +open FSharp.Compiler.ScriptClosure +open FSharp.Compiler.Symbols +open FSharp.Compiler.Syntax +open FSharp.Compiler.Tokenization +open FSharp.Compiler.Text +open FSharp.Compiler.Text.Range +open FSharp.Compiler.TcGlobals +open FSharp.Compiler.BuildGraph +open FSharp.Compiler.CodeAnalysis.ProjectSnapshot + +type SourceTextHash = int64 +type CacheStamp = int64 +type FileName = string +type FilePath = string +type ProjectPath = string +type FileVersion = int + +type FSharpProjectSnapshot = FSharp.Compiler.CodeAnalysis.ProjectSnapshot.FSharpProjectSnapshot + +type internal IBackgroundCompiler = + + /// Type-check the result obtained by parsing. Force the evaluation of the antecedent type checking context if needed. + abstract member CheckFileInProject: + parseResults: FSharpParseFileResults * + fileName: string * + fileVersion: int * + sourceText: ISourceText * + options: FSharpProjectOptions * + userOpName: string -> + Async + + /// Type-check the result obtained by parsing, but only if the antecedent type checking context is available. + abstract member CheckFileInProjectAllowingStaleCachedResults: + parseResults: FSharpParseFileResults * + fileName: string * + fileVersion: int * + sourceText: ISourceText * + options: FSharpProjectOptions * + userOpName: string -> + Async + + abstract member ClearCache: options: seq * userOpName: string -> unit + + abstract member ClearCache: projects: ProjectSnapshot.FSharpProjectIdentifier seq * userOpName: string -> unit + + abstract member ClearCaches: unit -> unit + + abstract member DownsizeCaches: unit -> unit + + abstract member FindReferencesInFile: + fileName: string * + options: FSharpProjectOptions * + symbol: FSharp.Compiler.Symbols.FSharpSymbol * + canInvalidateProject: bool * + userOpName: string -> + Async> + + abstract member FindReferencesInFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * symbol: FSharp.Compiler.Symbols.FSharpSymbol * userOpName: string -> + Async> + + abstract member GetAssemblyData: + options: FSharpProjectOptions * outputFileName: string * userOpName: string -> + Async + + abstract member GetAssemblyData: + projectSnapshot: FSharpProjectSnapshot * outputFileName: string * userOpName: string -> + Async + + /// Fetch the check information from the background compiler (which checks w.r.t. the FileSystem API) + abstract member GetBackgroundCheckResultsForFileInProject: + fileName: string * options: FSharpProjectOptions * userOpName: string -> Async + + /// Fetch the parse information from the background compiler (which checks w.r.t. the FileSystem API) + abstract member GetBackgroundParseResultsForFileInProject: + fileName: string * options: FSharpProjectOptions * userOpName: string -> Async + + abstract member GetCachedCheckFileResult: + builder: IncrementalBuilder * fileName: string * sourceText: ISourceText * options: FSharpProjectOptions -> + Async<(FSharpParseFileResults * FSharpCheckFileResults) option> + + abstract member GetProjectOptionsFromScript: + fileName: string * + sourceText: ISourceText * + previewEnabled: bool option * + loadedTimeStamp: System.DateTime option * + otherFlags: string array option * + useFsiAuxLib: bool option * + useSdkRefs: bool option * + sdkDirOverride: string option * + assumeDotNetFramework: bool option * + optionsStamp: int64 option * + userOpName: string -> + Async + + abstract GetProjectSnapshotFromScript: + fileName: string * + sourceText: ISourceTextNew * + documentSource: DocumentSource * + previewEnabled: bool option * + loadedTimeStamp: System.DateTime option * + otherFlags: string array option * + useFsiAuxLib: bool option * + useSdkRefs: bool option * + sdkDirOverride: string option * + assumeDotNetFramework: bool option * + optionsStamp: int64 option * + userOpName: string -> + Async + + abstract member GetSemanticClassificationForFile: + fileName: string * options: FSharpProjectOptions * userOpName: string -> + Async + + abstract member GetSemanticClassificationForFile: + fileName: string * snapshot: FSharpProjectSnapshot * userOpName: string -> + Async + + abstract member InvalidateConfiguration: options: FSharpProjectOptions * userOpName: string -> unit + + abstract InvalidateConfiguration: projectSnapshot: FSharpProjectSnapshot * userOpName: string -> unit + + abstract member NotifyFileChanged: fileName: string * options: FSharpProjectOptions * userOpName: string -> Async + + abstract member NotifyProjectCleaned: options: FSharpProjectOptions * userOpName: string -> Async + + /// Parses and checks the source file and returns untyped AST and check results. + abstract member ParseAndCheckFileInProject: + fileName: string * fileVersion: int * sourceText: ISourceText * options: FSharpProjectOptions * userOpName: string -> + Async + + abstract member ParseAndCheckFileInProject: + fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string -> + Async + + /// Parse and typecheck the whole project. + abstract member ParseAndCheckProject: options: FSharpProjectOptions * userOpName: string -> Async + + abstract member ParseAndCheckProject: projectSnapshot: FSharpProjectSnapshot * userOpName: string -> Async + + abstract member ParseFile: + fileName: string * sourceText: ISourceText * options: FSharpParsingOptions * cache: bool * flatErrors: bool * userOpName: string -> + Async + + abstract member ParseFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string -> Async + + /// Try to get recent approximate type check results for a file. + abstract member TryGetRecentCheckResultsForFile: + fileName: string * options: FSharpProjectOptions * sourceText: ISourceText option * userOpName: string -> + (FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option + + abstract member TryGetRecentCheckResultsForFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string -> + (FSharpParseFileResults * FSharpCheckFileResults) option + + abstract member BeforeBackgroundFileCheck: IEvent + + abstract member FileChecked: IEvent + + abstract member FileParsed: IEvent + + abstract member FrameworkImportsCache: FrameworkImportsCache + + abstract member ProjectChecked: IEvent + +type internal ParseCacheLockToken() = + interface LockToken + +type CheckFileCacheKey = FileName * SourceTextHash * FSharpProjectOptions +type CheckFileCacheValue = FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash * DateTime + +[] +module internal EnvMisc = + let braceMatchCacheSize = GetEnvInteger "FCS_BraceMatchCacheSize" 5 + let parseFileCacheSize = GetEnvInteger "FCS_ParseFileCacheSize" 2 + let checkFileInProjectCacheSize = GetEnvInteger "FCS_CheckFileInProjectCacheSize" 10 + + let projectCacheSizeDefault = GetEnvInteger "FCS_ProjectCacheSizeDefault" 3 + + let frameworkTcImportsCacheStrongSize = + GetEnvInteger "FCS_frameworkTcImportsCacheStrongSizeDefault" 8 + +[] +module internal Helpers = + + /// Determine whether two (fileName,options) keys are identical w.r.t. affect on checking + let AreSameForChecking2 ((fileName1: string, options1: FSharpProjectOptions), (fileName2, options2)) = + (fileName1 = fileName2) + && FSharpProjectOptions.AreSameForChecking(options1, options2) + + /// Determine whether two (fileName,options) keys should be identical w.r.t. resource usage + let AreSubsumable2 ((fileName1: string, o1: FSharpProjectOptions), (fileName2: string, o2: FSharpProjectOptions)) = + (fileName1 = fileName2) && FSharpProjectOptions.UseSameProject(o1, o2) + + /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. parsing + let AreSameForParsing ((fileName1: string, source1Hash: int64, options1), (fileName2, source2Hash, options2)) = + fileName1 = fileName2 && options1 = options2 && source1Hash = source2Hash + + let AreSimilarForParsing ((fileName1, _, _), (fileName2, _, _)) = fileName1 = fileName2 + + /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. checking + let AreSameForChecking3 ((fileName1: string, source1Hash: int64, options1: FSharpProjectOptions), (fileName2, source2Hash, options2)) = + (fileName1 = fileName2) + && FSharpProjectOptions.AreSameForChecking(options1, options2) + && source1Hash = source2Hash + + /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. resource usage + let AreSubsumable3 ((fileName1: string, _, o1: FSharpProjectOptions), (fileName2: string, _, o2: FSharpProjectOptions)) = + (fileName1 = fileName2) && FSharpProjectOptions.UseSameProject(o1, o2) + + /// If a symbol is an attribute check if given set of names contains its name without the Attribute suffix + let rec NamesContainAttribute (symbol: FSharpSymbol) names = + match symbol with + | :? FSharpMemberOrFunctionOrValue as mofov -> + mofov.DeclaringEntity + |> Option.map (fun entity -> NamesContainAttribute entity names) + |> Option.defaultValue false + | :? FSharpEntity as entity when entity.IsAttributeType && symbol.DisplayNameCore.EndsWithOrdinal "Attribute" -> + let nameWithoutAttribute = String.dropSuffix symbol.DisplayNameCore "Attribute" + names |> Set.contains nameWithoutAttribute + | _ -> false + +// There is only one instance of this type, held in FSharpChecker +type internal BackgroundCompiler + ( + legacyReferenceResolver, + projectCacheSize, + keepAssemblyContents, + keepAllBackgroundResolutions, + tryGetMetadataSnapshot, + suggestNamesForErrors, + keepAllBackgroundSymbolUses, + enableBackgroundItemKeyStoreAndSemanticClassification, + enablePartialTypeChecking, + parallelReferenceResolution, + captureIdentifiersWhenParsing, + getSource: (string -> Async) option, + useChangeNotifications + ) as self = + + let beforeFileChecked = Event() + let fileParsed = Event() + let fileChecked = Event() + let projectChecked = Event() + + // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.backgroundCompiler.scriptClosureCache + /// Information about the derived script closure. + let scriptClosureCache = + MruCache( + projectCacheSize, + areSame = FSharpProjectOptions.AreSameForChecking, + areSimilar = FSharpProjectOptions.UseSameProject + ) + + let frameworkTcImportsCache = + FrameworkImportsCache(frameworkTcImportsCacheStrongSize) + + // We currently share one global dependency provider for all scripts for the FSharpChecker. + // For projects, one is used per project. + // + // Sharing one for all scripts is necessary for good performance from GetProjectOptionsFromScript, + // which requires a dependency provider to process through the project options prior to working out + // if the cached incremental builder can be used for the project. + let dependencyProviderForScripts = new DependencyProvider() + + let getProjectReferences (options: FSharpProjectOptions) userOpName = + [ + for r in options.ReferencedProjects do + + match r with + | FSharpReferencedProject.FSharpReference(nm, opts) -> + // Don't use cross-project references for FSharp.Core, since various bits of code + // require a concrete FSharp.Core to exist on-disk. The only solutions that have + // these cross-project references to FSharp.Core are VisualFSharp.sln and FSharp.sln. The ramification + // of this is that you need to build FSharp.Core to get intellisense in those projects. + + if + (try + Path.GetFileNameWithoutExtension(nm) + with _ -> + "") + <> GetFSharpCoreLibraryName() + then + { new IProjectReference with + member x.EvaluateRawContents() = + async { + Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "GetAssemblyData", nm) + return! self.GetAssemblyData(opts, userOpName + ".CheckReferencedProject(" + nm + ")") + } + + member x.TryGetLogicalTimeStamp(cache) = + self.TryGetLogicalTimeStampForProject(cache, opts) + + member x.FileName = nm + } + + | FSharpReferencedProject.PEReference(getStamp, delayedReader) -> + { new IProjectReference with + member x.EvaluateRawContents() = + async { + let! ilReaderOpt = delayedReader.TryGetILModuleReader() |> Cancellable.toAsync + + match ilReaderOpt with + | Some ilReader -> + let ilModuleDef, ilAsmRefs = ilReader.ILModuleDef, ilReader.ILAssemblyRefs + let data = RawFSharpAssemblyData(ilModuleDef, ilAsmRefs) :> IRawFSharpAssemblyData + return ProjectAssemblyDataResult.Available data + | _ -> + // Note 'false' - if a PEReference doesn't find an ILModuleReader then we don't + // continue to try to use an on-disk DLL + return ProjectAssemblyDataResult.Unavailable false + } + + member x.TryGetLogicalTimeStamp _ = getStamp () |> Some + member x.FileName = delayedReader.OutputFile + } + + | FSharpReferencedProject.ILModuleReference(nm, getStamp, getReader) -> + { new IProjectReference with + member x.EvaluateRawContents() = + cancellable { + let ilReader = getReader () + let ilModuleDef, ilAsmRefs = ilReader.ILModuleDef, ilReader.ILAssemblyRefs + let data = RawFSharpAssemblyData(ilModuleDef, ilAsmRefs) :> IRawFSharpAssemblyData + return ProjectAssemblyDataResult.Available data + } + |> Cancellable.toAsync + + member x.TryGetLogicalTimeStamp _ = getStamp () |> Some + member x.FileName = nm + } + ] + + /// CreateOneIncrementalBuilder (for background type checking). Note that fsc.fs also + /// creates an incremental builder used by the command line compiler. + let CreateOneIncrementalBuilder (options: FSharpProjectOptions, userOpName) = + async { + use _ = + Activity.start "BackgroundCompiler.CreateOneIncrementalBuilder" [| Activity.Tags.project, options.ProjectFileName |] + + Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "CreateOneIncrementalBuilder", options.ProjectFileName) + let projectReferences = getProjectReferences options userOpName + + let loadClosure = scriptClosureCache.TryGet(AnyCallerThread, options) + + let dependencyProvider = + if options.UseScriptResolutionRules then + Some dependencyProviderForScripts + else + None + + let! builderOpt, diagnostics = + IncrementalBuilder.TryCreateIncrementalBuilderForProjectOptions( + legacyReferenceResolver, + FSharpCheckerResultsSettings.defaultFSharpBinariesDir, + frameworkTcImportsCache, + loadClosure, + Array.toList options.SourceFiles, + Array.toList options.OtherOptions, + projectReferences, + options.ProjectDirectory, + options.UseScriptResolutionRules, + keepAssemblyContents, + keepAllBackgroundResolutions, + tryGetMetadataSnapshot, + suggestNamesForErrors, + keepAllBackgroundSymbolUses, + enableBackgroundItemKeyStoreAndSemanticClassification, + enablePartialTypeChecking, + dependencyProvider, + parallelReferenceResolution, + captureIdentifiersWhenParsing, + getSource, + useChangeNotifications + ) + + match builderOpt with + | None -> () + | Some builder -> + +#if !NO_TYPEPROVIDERS + // Register the behaviour that responds to CCUs being invalidated because of type + // provider Invalidate events. This invalidates the configuration in the build. + builder.ImportsInvalidatedByTypeProvider.Add(fun () -> self.InvalidateConfiguration(options, userOpName)) +#endif + + // Register the callback called just before a file is typechecked by the background builder (without recording + // errors or intellisense information). + // + // This indicates to the UI that the file type check state is dirty. If the file is open and visible then + // the UI will sooner or later request a typecheck of the file, recording errors and intellisense information. + builder.BeforeFileChecked.Add(fun file -> beforeFileChecked.Trigger(file, options)) + builder.FileParsed.Add(fun file -> fileParsed.Trigger(file, options)) + builder.FileChecked.Add(fun file -> fileChecked.Trigger(file, options)) + builder.ProjectChecked.Add(fun () -> projectChecked.Trigger options) + + return (builderOpt, diagnostics) + } + + let parseCacheLock = Lock() + + // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.parseFileInProjectCache. Most recently used cache for parsing files. + let parseFileCache = + MruCache( + parseFileCacheSize, + areSimilar = AreSimilarForParsing, + areSame = AreSameForParsing + ) + + // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.checkFileInProjectCache + // + /// Cache which holds recently seen type-checks. + /// This cache may hold out-of-date entries, in two senses + /// - there may be a more recent antecedent state available because the background build has made it available + /// - the source for the file may have changed + + // Also keyed on source. This can only be out of date if the antecedent is out of date + let checkFileInProjectCache = + MruCache>( + keepStrongly = checkFileInProjectCacheSize, + areSame = AreSameForChecking3, + areSimilar = AreSubsumable3 + ) + + // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.backgroundCompiler.incrementalBuildersCache. This root typically holds more + // live information than anything else in the F# Language Service, since it holds up to 3 (projectCacheStrongSize) background project builds + // strongly. + // + /// Cache of builds keyed by options. + let gate = obj () + + let incrementalBuildersCache = + MruCache>( + keepStrongly = projectCacheSize, + keepMax = projectCacheSize, + areSame = FSharpProjectOptions.AreSameForChecking, + areSimilar = FSharpProjectOptions.UseSameProject + ) + + let tryGetBuilderNode options = + incrementalBuildersCache.TryGet(AnyCallerThread, options) + + let tryGetBuilder options : Async option = + tryGetBuilderNode options |> Option.map (fun x -> x.GetOrComputeValue()) + + let tryGetSimilarBuilder options : Async option = + incrementalBuildersCache.TryGetSimilar(AnyCallerThread, options) + |> Option.map (fun x -> x.GetOrComputeValue()) + + let tryGetAnyBuilder options : Async option = + incrementalBuildersCache.TryGetAny(AnyCallerThread, options) + |> Option.map (fun x -> x.GetOrComputeValue()) + + let createBuilderNode (options, userOpName, ct: CancellationToken) = + lock gate (fun () -> + if ct.IsCancellationRequested then + GraphNode.FromResult(None, [||]) + else + let getBuilderNode = GraphNode(CreateOneIncrementalBuilder(options, userOpName)) + incrementalBuildersCache.Set(AnyCallerThread, options, getBuilderNode) + getBuilderNode) + + let createAndGetBuilder (options, userOpName) = + async { + let! ct = Async.CancellationToken + let getBuilderNode = createBuilderNode (options, userOpName, ct) + return! getBuilderNode.GetOrComputeValue() + } + + let getOrCreateBuilder (options, userOpName) : Async = + match tryGetBuilder options with + | Some getBuilder -> + async { + match! getBuilder with + | builderOpt, creationDiags when builderOpt.IsNone || not builderOpt.Value.IsReferencesInvalidated -> + return builderOpt, creationDiags + | _ -> + // The builder could be re-created, + // clear the check file caches that are associated with it. + // We must do this in order to not return stale results when references + // in the project get changed/added/removed. + parseCacheLock.AcquireLock(fun ltok -> + options.SourceFiles + |> Array.iter (fun sourceFile -> + let key = (sourceFile, 0L, options) + checkFileInProjectCache.RemoveAnySimilar(ltok, key))) + + return! createAndGetBuilder (options, userOpName) + } + | _ -> createAndGetBuilder (options, userOpName) + + let getSimilarOrCreateBuilder (options, userOpName) = + match tryGetSimilarBuilder options with + | Some res -> res + // The builder does not exist at all. Create it. + | None -> getOrCreateBuilder (options, userOpName) + + let getOrCreateBuilderWithInvalidationFlag (options, canInvalidateProject, userOpName) = + if canInvalidateProject then + getOrCreateBuilder (options, userOpName) + else + getSimilarOrCreateBuilder (options, userOpName) + + let getAnyBuilder (options, userOpName) = + match tryGetAnyBuilder options with + | Some getBuilder -> getBuilder + | _ -> getOrCreateBuilder (options, userOpName) + + static let mutable actualParseFileCount = 0 + + static let mutable actualCheckFileCount = 0 + + /// Should be a fast operation. Ensures that we have only one async lazy object per file and its hash. + let getCheckFileNode (parseResults, sourceText, fileName, options, _fileVersion, builder, tcPrior, tcInfo, creationDiags) = + + // Here we lock for the creation of the node, not its execution + parseCacheLock.AcquireLock(fun ltok -> + let key = (fileName, sourceText.GetHashCode() |> int64, options) + + match checkFileInProjectCache.TryGet(ltok, key) with + | Some res -> res + | _ -> + let res = + GraphNode( + async { + let! res = + self.CheckOneFileImplAux( + parseResults, + sourceText, + fileName, + options, + builder, + tcPrior, + tcInfo, + creationDiags + ) + + Interlocked.Increment(&actualCheckFileCount) |> ignore + return res + } + ) + + checkFileInProjectCache.Set(ltok, key, res) + res) + + member _.ParseFile + ( + fileName: string, + sourceText: ISourceText, + options: FSharpParsingOptions, + cache: bool, + flatErrors: bool, + userOpName: string + ) = + async { + use _ = + Activity.start + "BackgroundCompiler.ParseFile" + [| + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + Activity.Tags.cache, cache.ToString() + |] + + if cache then + let hash = sourceText.GetHashCode() |> int64 + + match parseCacheLock.AcquireLock(fun ltok -> parseFileCache.TryGet(ltok, (fileName, hash, options))) with + | Some res -> return res + | None -> + Interlocked.Increment(&actualParseFileCount) |> ignore + let! ct = Async.CancellationToken + + let parseDiagnostics, parseTree, anyErrors = + ParseAndCheckFile.parseFile ( + sourceText, + fileName, + options, + userOpName, + suggestNamesForErrors, + flatErrors, + captureIdentifiersWhenParsing, + ct + ) + + let res = + FSharpParseFileResults(parseDiagnostics, parseTree, anyErrors, options.SourceFiles) + + parseCacheLock.AcquireLock(fun ltok -> parseFileCache.Set(ltok, (fileName, hash, options), res)) + return res + else + let! ct = Async.CancellationToken + + let parseDiagnostics, parseTree, anyErrors = + ParseAndCheckFile.parseFile ( + sourceText, + fileName, + options, + userOpName, + false, + flatErrors, + captureIdentifiersWhenParsing, + ct + ) + + return FSharpParseFileResults(parseDiagnostics, parseTree, anyErrors, options.SourceFiles) + } + + /// Fetch the parse information from the background compiler (which checks w.r.t. the FileSystem API) + member _.GetBackgroundParseResultsForFileInProject(fileName, options, userOpName) = + async { + use _ = + Activity.start + "BackgroundCompiler.GetBackgroundParseResultsForFileInProject" + [| Activity.Tags.fileName, fileName; Activity.Tags.userOpName, userOpName |] + + let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> + let parseTree = EmptyParsedInput(fileName, (false, false)) + return FSharpParseFileResults(creationDiags, parseTree, true, [||]) + | Some builder -> + let parseTree, _, _, parseDiagnostics = builder.GetParseResultsForFile fileName + + let parseDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + builder.TcConfig.diagnosticsOptions, + false, + fileName, + parseDiagnostics, + suggestNamesForErrors, + builder.TcConfig.flatErrors, + None + ) + + let diagnostics = [| yield! creationDiags; yield! parseDiagnostics |] + + let parseResults = + FSharpParseFileResults( + diagnostics = diagnostics, + input = parseTree, + parseHadErrors = false, + dependencyFiles = builder.AllDependenciesDeprecated + ) + + return parseResults + } + + member _.GetCachedCheckFileResult(builder: IncrementalBuilder, fileName, sourceText: ISourceText, options) = + async { + use _ = + Activity.start "BackgroundCompiler.GetCachedCheckFileResult" [| Activity.Tags.fileName, fileName |] + + let hash = sourceText.GetHashCode() |> int64 + let key = (fileName, hash, options) + + let cachedResultsOpt = + parseCacheLock.AcquireLock(fun ltok -> checkFileInProjectCache.TryGet(ltok, key)) + + match cachedResultsOpt with + | Some cachedResults -> + match! cachedResults.GetOrComputeValue() with + | parseResults, checkResults, _, priorTimeStamp when + (match builder.GetCheckResultsBeforeFileInProjectEvenIfStale fileName with + | None -> false + | Some(tcPrior) -> + tcPrior.ProjectTimeStamp = priorTimeStamp + && builder.AreCheckResultsBeforeFileInProjectReady(fileName)) + -> + return Some(parseResults, checkResults) + | _ -> + parseCacheLock.AcquireLock(fun ltok -> checkFileInProjectCache.RemoveAnySimilar(ltok, key)) + return None + | _ -> return None + } + + member private _.CheckOneFileImplAux + ( + parseResults: FSharpParseFileResults, + sourceText: ISourceText, + fileName: string, + options: FSharpProjectOptions, + builder: IncrementalBuilder, + tcPrior: PartialCheckResults, + tcInfo: TcInfo, + creationDiags: FSharpDiagnostic[] + ) : Async = + + async { + // Get additional script #load closure information if applicable. + // For scripts, this will have been recorded by GetProjectOptionsFromScript. + let tcConfig = tcPrior.TcConfig + let loadClosure = scriptClosureCache.TryGet(AnyCallerThread, options) + + let! checkAnswer = + FSharpCheckFileResults.CheckOneFile( + parseResults, + sourceText, + fileName, + options.ProjectFileName, + tcConfig, + tcPrior.TcGlobals, + tcPrior.TcImports, + tcInfo.tcState, + tcInfo.moduleNamesDict, + loadClosure, + tcInfo.TcDiagnostics, + options.IsIncompleteTypeCheckEnvironment, + options, + Some builder, + Array.ofList tcInfo.tcDependencyFiles, + creationDiags, + parseResults.Diagnostics, + keepAssemblyContents, + suggestNamesForErrors + ) + |> Cancellable.toAsync + + GraphNode.SetPreferredUILang tcConfig.preferredUiLang + return (parseResults, checkAnswer, sourceText.GetHashCode() |> int64, tcPrior.ProjectTimeStamp) + } + + member private bc.CheckOneFileImpl + ( + parseResults: FSharpParseFileResults, + sourceText: ISourceText, + fileName: string, + options: FSharpProjectOptions, + fileVersion: int, + builder: IncrementalBuilder, + tcPrior: PartialCheckResults, + tcInfo: TcInfo, + creationDiags: FSharpDiagnostic[] + ) = + + async { + match! bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) with + | Some(_, results) -> return FSharpCheckFileAnswer.Succeeded results + | _ -> + let lazyCheckFile = + getCheckFileNode (parseResults, sourceText, fileName, options, fileVersion, builder, tcPrior, tcInfo, creationDiags) + + let! _, results, _, _ = lazyCheckFile.GetOrComputeValue() + return FSharpCheckFileAnswer.Succeeded results + } + + /// Type-check the result obtained by parsing, but only if the antecedent type checking context is available. + member bc.CheckFileInProjectAllowingStaleCachedResults + ( + parseResults: FSharpParseFileResults, + fileName, + fileVersion, + sourceText: ISourceText, + options, + userOpName + ) = + async { + use _ = + Activity.start + "BackgroundCompiler.CheckFileInProjectAllowingStaleCachedResults" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + |] + + let! cachedResults = + async { + let! builderOpt, creationDiags = getAnyBuilder (options, userOpName) + + match builderOpt with + | Some builder -> + match! bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) with + | Some(_, checkResults) -> return Some(builder, creationDiags, Some(FSharpCheckFileAnswer.Succeeded checkResults)) + | _ -> return Some(builder, creationDiags, None) + | _ -> return None // the builder wasn't ready + } + + match cachedResults with + | None -> return None + | Some(_, _, Some x) -> return Some x + | Some(builder, creationDiags, None) -> + Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "CheckFileInProjectAllowingStaleCachedResults.CacheMiss", fileName) + + match builder.GetCheckResultsBeforeFileInProjectEvenIfStale fileName with + | Some tcPrior -> + match tcPrior.TryPeekTcInfo() with + | Some tcInfo -> + let! checkResults = + bc.CheckOneFileImpl( + parseResults, + sourceText, + fileName, + options, + fileVersion, + builder, + tcPrior, + tcInfo, + creationDiags + ) + + return Some checkResults + | None -> return None + | None -> return None // the incremental builder was not up to date + } + + /// Type-check the result obtained by parsing. Force the evaluation of the antecedent type checking context if needed. + member bc.CheckFileInProject + ( + parseResults: FSharpParseFileResults, + fileName, + fileVersion, + sourceText: ISourceText, + options, + userOpName + ) = + async { + use _ = + Activity.start + "BackgroundCompiler.CheckFileInProject" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + |] + + let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> + return FSharpCheckFileAnswer.Succeeded(FSharpCheckFileResults.MakeEmpty(fileName, creationDiags, keepAssemblyContents)) + | Some builder -> + // Check the cache. We can only use cached results when there is no work to do to bring the background builder up-to-date + let! cachedResults = bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) + + match cachedResults with + | Some(_, checkResults) -> return FSharpCheckFileAnswer.Succeeded checkResults + | _ -> + let! tcPrior = builder.GetCheckResultsBeforeFileInProject fileName + let! tcInfo = tcPrior.GetOrComputeTcInfo() + + return! + bc.CheckOneFileImpl( + parseResults, + sourceText, + fileName, + options, + fileVersion, + builder, + tcPrior, + tcInfo, + creationDiags + ) + } + + /// Parses and checks the source file and returns untyped AST and check results. + member bc.ParseAndCheckFileInProject + ( + fileName: string, + fileVersion, + sourceText: ISourceText, + options: FSharpProjectOptions, + userOpName + ) = + async { + use _ = + Activity.start + "BackgroundCompiler.ParseAndCheckFileInProject" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + |] + + let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> + let parseTree = EmptyParsedInput(fileName, (false, false)) + let parseResults = FSharpParseFileResults(creationDiags, parseTree, true, [||]) + return (parseResults, FSharpCheckFileAnswer.Aborted) + + | Some builder -> + let! cachedResults = bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) + + match cachedResults with + | Some(parseResults, checkResults) -> return (parseResults, FSharpCheckFileAnswer.Succeeded checkResults) + | _ -> + let! tcPrior = builder.GetCheckResultsBeforeFileInProject fileName + let! tcInfo = tcPrior.GetOrComputeTcInfo() + // Do the parsing. + let parsingOptions = + FSharpParsingOptions.FromTcConfig( + builder.TcConfig, + Array.ofList builder.SourceFiles, + options.UseScriptResolutionRules + ) + + GraphNode.SetPreferredUILang tcPrior.TcConfig.preferredUiLang + let! ct = Async.CancellationToken + + let parseDiagnostics, parseTree, anyErrors = + ParseAndCheckFile.parseFile ( + sourceText, + fileName, + parsingOptions, + userOpName, + suggestNamesForErrors, + builder.TcConfig.flatErrors, + captureIdentifiersWhenParsing, + ct + ) + + let parseResults = + FSharpParseFileResults(parseDiagnostics, parseTree, anyErrors, builder.AllDependenciesDeprecated) + + let! checkResults = + bc.CheckOneFileImpl( + parseResults, + sourceText, + fileName, + options, + fileVersion, + builder, + tcPrior, + tcInfo, + creationDiags + ) + + return (parseResults, checkResults) + } + + member _.NotifyFileChanged(fileName, options, userOpName) = + async { + use _ = + Activity.start + "BackgroundCompiler.NotifyFileChanged" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + |] + + let! builderOpt, _ = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> return () + | Some builder -> do! builder.NotifyFileChanged(fileName, DateTime.UtcNow) + } + + /// Fetch the check information from the background compiler (which checks w.r.t. the FileSystem API) + member _.GetBackgroundCheckResultsForFileInProject(fileName, options, userOpName) = + async { + use _ = + Activity.start + "BackgroundCompiler.ParseAndCheckFileInProject" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + |] + + let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> + let parseTree = EmptyParsedInput(fileName, (false, false)) + let parseResults = FSharpParseFileResults(creationDiags, parseTree, true, [||]) + let typedResults = FSharpCheckFileResults.MakeEmpty(fileName, creationDiags, true) + return (parseResults, typedResults) + | Some builder -> + let parseTree, _, _, parseDiagnostics = builder.GetParseResultsForFile fileName + let! tcProj = builder.GetFullCheckResultsAfterFileInProject fileName + + let! tcInfo, tcInfoExtras = tcProj.GetOrComputeTcInfoWithExtras() + + let tcResolutions = tcInfoExtras.tcResolutions + let tcSymbolUses = tcInfoExtras.tcSymbolUses + let tcOpenDeclarations = tcInfoExtras.tcOpenDeclarations + let latestCcuSigForFile = tcInfo.latestCcuSigForFile + let tcState = tcInfo.tcState + let tcEnvAtEnd = tcInfo.tcEnvAtEndOfFile + let latestImplementationFile = tcInfoExtras.latestImplFile + let tcDependencyFiles = tcInfo.tcDependencyFiles + let tcDiagnostics = tcInfo.TcDiagnostics + let diagnosticsOptions = builder.TcConfig.diagnosticsOptions + + let symbolEnv = + SymbolEnv(tcProj.TcGlobals, tcInfo.tcState.Ccu, Some tcInfo.tcState.CcuSig, tcProj.TcImports) + |> Some + + let parseDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + diagnosticsOptions, + false, + fileName, + parseDiagnostics, + suggestNamesForErrors, + builder.TcConfig.flatErrors, + None + ) + + let parseDiagnostics = [| yield! creationDiags; yield! parseDiagnostics |] + + let tcDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + diagnosticsOptions, + false, + fileName, + tcDiagnostics, + suggestNamesForErrors, + builder.TcConfig.flatErrors, + symbolEnv + ) + + let tcDiagnostics = [| yield! creationDiags; yield! tcDiagnostics |] + + let parseResults = + FSharpParseFileResults( + diagnostics = parseDiagnostics, + input = parseTree, + parseHadErrors = false, + dependencyFiles = builder.AllDependenciesDeprecated + ) + + let loadClosure = scriptClosureCache.TryGet(AnyCallerThread, options) + + let typedResults = + FSharpCheckFileResults.Make( + fileName, + options.ProjectFileName, + tcProj.TcConfig, + tcProj.TcGlobals, + options.IsIncompleteTypeCheckEnvironment, + Some builder, + options, + Array.ofList tcDependencyFiles, + creationDiags, + parseResults.Diagnostics, + tcDiagnostics, + keepAssemblyContents, + Option.get latestCcuSigForFile, + tcState.Ccu, + tcProj.TcImports, + tcEnvAtEnd.AccessRights, + tcResolutions, + tcSymbolUses, + tcEnvAtEnd.NameEnv, + loadClosure, + latestImplementationFile, + tcOpenDeclarations + ) + + return (parseResults, typedResults) + } + + member _.FindReferencesInFile + ( + fileName: string, + options: FSharpProjectOptions, + symbol: FSharpSymbol, + canInvalidateProject: bool, + userOpName: string + ) = + async { + use _ = + Activity.start + "BackgroundCompiler.FindReferencesInFile" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + "symbol", symbol.FullName + |] + + let! builderOpt, _ = getOrCreateBuilderWithInvalidationFlag (options, canInvalidateProject, userOpName) + + match builderOpt with + | None -> return Seq.empty + | Some builder -> + if builder.ContainsFile fileName then + let! checkResults = builder.GetFullCheckResultsAfterFileInProject fileName + let! keyStoreOpt = checkResults.GetOrComputeItemKeyStoreIfEnabled() + + match keyStoreOpt with + | None -> return Seq.empty + | Some reader -> return reader.FindAll symbol.Item + else + return Seq.empty + } + + member _.GetSemanticClassificationForFile(fileName: string, options: FSharpProjectOptions, userOpName: string) = + async { + use _ = + Activity.start + "BackgroundCompiler.GetSemanticClassificationForFile" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, userOpName + |] + + let! builderOpt, _ = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> return None + | Some builder -> + let! checkResults = builder.GetFullCheckResultsAfterFileInProject fileName + let! scopt = checkResults.GetOrComputeSemanticClassificationIfEnabled() + + match scopt with + | None -> return None + | Some sc -> return Some(sc.GetView()) + } + + /// Try to get recent approximate type check results for a file. + member _.TryGetRecentCheckResultsForFile + ( + fileName: string, + options: FSharpProjectOptions, + sourceText: ISourceText option, + _userOpName: string + ) = + use _ = + Activity.start + "BackgroundCompiler.GetSemanticClassificationForFile" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.fileName, fileName + Activity.Tags.userOpName, _userOpName + |] + + match sourceText with + | Some sourceText -> + let hash = sourceText.GetHashCode() |> int64 + + let resOpt = + parseCacheLock.AcquireLock(fun ltok -> checkFileInProjectCache.TryGet(ltok, (fileName, hash, options))) + + match resOpt with + | Some res -> + match res.TryPeekValue() with + | ValueSome(a, b, c, _) -> Some(a, b, c) + | ValueNone -> None + | None -> None + | None -> None + + member _.TryGetRecentCheckResultsForFile(fileName: string, projectSnapshot: FSharpProjectSnapshot, userOpName: string) = + projectSnapshot.ProjectSnapshot.SourceFiles + |> List.tryFind (fun f -> f.FileName = fileName) + |> Option.bind (fun (f: FSharpFileSnapshot) -> + let options = projectSnapshot.ToOptions() + let sourceText = f.GetSource() |> Async.AwaitTask |> Async.RunSynchronously + + self.TryGetRecentCheckResultsForFile(fileName, options, Some sourceText, userOpName) + |> Option.map (fun (parseFileResults, checkFileResults, _hash) -> (parseFileResults, checkFileResults))) + + /// Parse and typecheck the whole project (the implementation, called recursively as project graph is evaluated) + member private _.ParseAndCheckProjectImpl(options, userOpName) = + async { + + let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> + let emptyResults = + FSharpCheckProjectResults(options.ProjectFileName, None, keepAssemblyContents, creationDiags, None) + + return emptyResults + | Some builder -> + let! tcProj, ilAssemRef, tcAssemblyDataOpt, tcAssemblyExprOpt = builder.GetFullCheckResultsAndImplementationsForProject() + let diagnosticsOptions = tcProj.TcConfig.diagnosticsOptions + let fileName = DummyFileNameForRangesWithoutASpecificLocation + + // Although we do not use 'tcInfoExtras', computing it will make sure we get an extra info. + let! tcInfo, _tcInfoExtras = tcProj.GetOrComputeTcInfoWithExtras() + + let topAttribs = tcInfo.topAttribs + let tcState = tcInfo.tcState + let tcEnvAtEnd = tcInfo.tcEnvAtEndOfFile + let tcDiagnostics = tcInfo.TcDiagnostics + let tcDependencyFiles = tcInfo.tcDependencyFiles + + let symbolEnv = + SymbolEnv(tcProj.TcGlobals, tcInfo.tcState.Ccu, Some tcInfo.tcState.CcuSig, tcProj.TcImports) + |> Some + + let tcDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + diagnosticsOptions, + true, + fileName, + tcDiagnostics, + suggestNamesForErrors, + builder.TcConfig.flatErrors, + symbolEnv + ) + + let diagnostics = [| yield! creationDiags; yield! tcDiagnostics |] + + let getAssemblyData () = + match tcAssemblyDataOpt with + | ProjectAssemblyDataResult.Available data -> Some data + | _ -> None + + let details = + (tcProj.TcGlobals, + tcProj.TcImports, + tcState.Ccu, + tcState.CcuSig, + Choice1Of2 builder, + topAttribs, + getAssemblyData, + ilAssemRef, + tcEnvAtEnd.AccessRights, + tcAssemblyExprOpt, + Array.ofList tcDependencyFiles, + options) + + let results = + FSharpCheckProjectResults( + options.ProjectFileName, + Some tcProj.TcConfig, + keepAssemblyContents, + diagnostics, + Some details + ) + + return results + } + + member _.GetAssemblyData(options, userOpName) = + async { + use _ = + Activity.start + "BackgroundCompiler.GetAssemblyData" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.userOpName, userOpName + |] + + let! builderOpt, _ = getOrCreateBuilder (options, userOpName) + + match builderOpt with + | None -> return ProjectAssemblyDataResult.Unavailable true + | Some builder -> + let! _, _, tcAssemblyDataOpt, _ = builder.GetCheckResultsAndImplementationsForProject() + return tcAssemblyDataOpt + } + + /// Get the timestamp that would be on the output if fully built immediately + member private _.TryGetLogicalTimeStampForProject(cache, options) = + match tryGetBuilderNode options with + | Some lazyWork -> + match lazyWork.TryPeekValue() with + | ValueSome(Some builder, _) -> Some(builder.GetLogicalTimeStampForProject(cache)) + | _ -> None + | _ -> None + + /// Parse and typecheck the whole project. + member bc.ParseAndCheckProject(options, userOpName) = + use _ = + Activity.start + "BackgroundCompiler.ParseAndCheckProject" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.userOpName, userOpName + |] + + bc.ParseAndCheckProjectImpl(options, userOpName) + + member _.GetProjectOptionsFromScript + ( + fileName, + sourceText, + previewEnabled, + loadedTimeStamp, + otherFlags, + useFsiAuxLib: bool option, + useSdkRefs: bool option, + sdkDirOverride: string option, + assumeDotNetFramework: bool option, + optionsStamp: int64 option, + _userOpName + ) = + use _ = + Activity.start + "BackgroundCompiler.GetProjectOptionsFromScript" + [| Activity.Tags.fileName, fileName; Activity.Tags.userOpName, _userOpName |] + + cancellable { + // Do we add a reference to FSharp.Compiler.Interactive.Settings by default? + let useFsiAuxLib = defaultArg useFsiAuxLib true + let useSdkRefs = defaultArg useSdkRefs true + let reduceMemoryUsage = ReduceMemoryFlag.Yes + let previewEnabled = defaultArg previewEnabled false + + // Do we assume .NET Framework references for scripts? + let assumeDotNetFramework = defaultArg assumeDotNetFramework true + + let extraFlags = + if previewEnabled then + [| "--langversion:preview" |] + else + [||] + + let otherFlags = defaultArg otherFlags extraFlags + + use diagnostics = new DiagnosticsScope(otherFlags |> Array.contains "--flaterrors") + + let useSimpleResolution = + otherFlags |> Array.exists (fun x -> x = "--simpleresolution") + + let loadedTimeStamp = defaultArg loadedTimeStamp DateTime.MaxValue // Not 'now', we don't want to force reloading + + let applyCompilerOptions tcConfigB = + let fsiCompilerOptions = GetCoreFsiCompilerOptions tcConfigB + ParseCompilerOptions(ignore, fsiCompilerOptions, Array.toList otherFlags) + + let loadClosure = + LoadClosure.ComputeClosureOfScriptText( + legacyReferenceResolver, + FSharpCheckerResultsSettings.defaultFSharpBinariesDir, + fileName, + sourceText, + CodeContext.Editing, + useSimpleResolution, + useFsiAuxLib, + useSdkRefs, + sdkDirOverride, + Lexhelp.LexResourceManager(), + applyCompilerOptions, + assumeDotNetFramework, + tryGetMetadataSnapshot, + reduceMemoryUsage, + dependencyProviderForScripts + ) + + let otherFlags = + [| + yield "--noframework" + yield "--warn:3" + yield! otherFlags + for r in loadClosure.References do + yield "-r:" + fst r + for code, _ in loadClosure.NoWarns do + yield "--nowarn:" + code + |] + + let options = + { + ProjectFileName = fileName + ".fsproj" // Make a name that is unique in this directory. + ProjectId = None + SourceFiles = loadClosure.SourceFiles |> List.map fst |> List.toArray + OtherOptions = otherFlags + ReferencedProjects = [||] + IsIncompleteTypeCheckEnvironment = false + UseScriptResolutionRules = true + LoadTime = loadedTimeStamp + UnresolvedReferences = Some(FSharpUnresolvedReferencesSet(loadClosure.UnresolvedReferences)) + OriginalLoadReferences = loadClosure.OriginalLoadReferences + Stamp = optionsStamp + } + + scriptClosureCache.Set(AnyCallerThread, options, loadClosure) // Save the full load closure for later correlation. + + let diags = + loadClosure.LoadClosureRootFileDiagnostics + |> List.map (fun (exn, isError) -> + FSharpDiagnostic.CreateFromException( + exn, + isError, + range.Zero, + false, + options.OtherOptions |> Array.contains "--flaterrors", + None + )) + + return options, (diags @ diagnostics.Diagnostics) + } + |> Cancellable.toAsync + + member bc.InvalidateConfiguration(options: FSharpProjectOptions, userOpName) = + use _ = + Activity.start + "BackgroundCompiler.InvalidateConfiguration" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.userOpName, userOpName + |] + + if incrementalBuildersCache.ContainsSimilarKey(AnyCallerThread, options) then + parseCacheLock.AcquireLock(fun ltok -> + for sourceFile in options.SourceFiles do + checkFileInProjectCache.RemoveAnySimilar(ltok, (sourceFile, 0L, options))) + + let _ = createBuilderNode (options, userOpName, CancellationToken.None) + () + + member bc.ClearCache(options: seq, _userOpName) = + use _ = + Activity.start "BackgroundCompiler.ClearCache" [| Activity.Tags.userOpName, _userOpName |] + + lock gate (fun () -> + options + |> Seq.iter (fun options -> + incrementalBuildersCache.RemoveAnySimilar(AnyCallerThread, options) + + parseCacheLock.AcquireLock(fun ltok -> + for sourceFile in options.SourceFiles do + checkFileInProjectCache.RemoveAnySimilar(ltok, (sourceFile, 0L, options))))) + + member _.NotifyProjectCleaned(options: FSharpProjectOptions, userOpName) = + use _ = + Activity.start + "BackgroundCompiler.NotifyProjectCleaned" + [| + Activity.Tags.project, options.ProjectFileName + Activity.Tags.userOpName, userOpName + |] + + async { + + let! ct = Async.CancellationToken + // If there was a similar entry (as there normally will have been) then re-establish an empty builder . This + // is a somewhat arbitrary choice - it will have the effect of releasing memory associated with the previous + // builder, but costs some time. + if incrementalBuildersCache.ContainsSimilarKey(AnyCallerThread, options) then + let _ = createBuilderNode (options, userOpName, ct) + () + } + + member _.BeforeBackgroundFileCheck = beforeFileChecked.Publish + + member _.FileParsed = fileParsed.Publish + + member _.FileChecked = fileChecked.Publish + + member _.ProjectChecked = projectChecked.Publish + + member _.ClearCaches() = + use _ = Activity.startNoTags "BackgroundCompiler.ClearCaches" + + lock gate (fun () -> + parseCacheLock.AcquireLock(fun ltok -> + checkFileInProjectCache.Clear(ltok) + parseFileCache.Clear(ltok)) + + incrementalBuildersCache.Clear(AnyCallerThread) + frameworkTcImportsCache.Clear() + scriptClosureCache.Clear AnyCallerThread) + + member _.DownsizeCaches() = + use _ = Activity.startNoTags "BackgroundCompiler.DownsizeCaches" + + lock gate (fun () -> + parseCacheLock.AcquireLock(fun ltok -> + checkFileInProjectCache.Resize(ltok, newKeepStrongly = 1) + parseFileCache.Resize(ltok, newKeepStrongly = 1)) + + incrementalBuildersCache.Resize(AnyCallerThread, newKeepStrongly = 1, newKeepMax = 1) + frameworkTcImportsCache.Downsize() + scriptClosureCache.Resize(AnyCallerThread, newKeepStrongly = 1, newKeepMax = 1)) + + member _.FrameworkImportsCache = frameworkTcImportsCache + + static member ActualParseFileCount = actualParseFileCount + + static member ActualCheckFileCount = actualCheckFileCount + + interface IBackgroundCompiler with + + member _.BeforeBackgroundFileCheck = self.BeforeBackgroundFileCheck + + member _.CheckFileInProject + ( + parseResults: FSharpParseFileResults, + fileName: string, + fileVersion: int, + sourceText: ISourceText, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + self.CheckFileInProject(parseResults, fileName, fileVersion, sourceText, options, userOpName) + + member _.CheckFileInProjectAllowingStaleCachedResults + ( + parseResults: FSharpParseFileResults, + fileName: string, + fileVersion: int, + sourceText: ISourceText, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + self.CheckFileInProjectAllowingStaleCachedResults(parseResults, fileName, fileVersion, sourceText, options, userOpName) + + member _.ClearCache(options: seq, userOpName: string) : unit = self.ClearCache(options, userOpName) + + member _.ClearCache(projects: ProjectSnapshot.FSharpProjectIdentifier seq, userOpName: string) = ignore (projects, userOpName) + + member _.ClearCaches() : unit = self.ClearCaches() + member _.DownsizeCaches() : unit = self.DownsizeCaches() + member _.FileChecked: IEvent = self.FileChecked + member _.FileParsed: IEvent = self.FileParsed + + member _.FindReferencesInFile + ( + fileName: string, + options: FSharpProjectOptions, + symbol: FSharpSymbol, + canInvalidateProject: bool, + userOpName: string + ) : Async> = + self.FindReferencesInFile(fileName, options, symbol, canInvalidateProject, userOpName) + + member this.FindReferencesInFile(fileName, projectSnapshot, symbol, userOpName) = + this.FindReferencesInFile(fileName, projectSnapshot.ToOptions(), symbol, true, userOpName) + + member _.FrameworkImportsCache: FrameworkImportsCache = self.FrameworkImportsCache + + member _.GetAssemblyData(options: FSharpProjectOptions, _fileName: string, userOpName: string) : Async = + self.GetAssemblyData(options, userOpName) + + member _.GetAssemblyData + ( + projectSnapshot: FSharpProjectSnapshot, + _fileName: string, + userOpName: string + ) : Async = + self.GetAssemblyData(projectSnapshot.ToOptions(), userOpName) + + member _.GetBackgroundCheckResultsForFileInProject + ( + fileName: string, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + self.GetBackgroundCheckResultsForFileInProject(fileName, options, userOpName) + + member _.GetBackgroundParseResultsForFileInProject + ( + fileName: string, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + self.GetBackgroundParseResultsForFileInProject(fileName, options, userOpName) + + member _.GetCachedCheckFileResult + ( + builder: IncrementalBuilder, + fileName: string, + sourceText: ISourceText, + options: FSharpProjectOptions + ) : Async<(FSharpParseFileResults * FSharpCheckFileResults) option> = + self.GetCachedCheckFileResult(builder, fileName, sourceText, options) + + member _.GetProjectOptionsFromScript + ( + fileName: string, + sourceText: ISourceText, + previewEnabled: bool option, + loadedTimeStamp: DateTime option, + otherFlags: string array option, + useFsiAuxLib: bool option, + useSdkRefs: bool option, + sdkDirOverride: string option, + assumeDotNetFramework: bool option, + optionsStamp: int64 option, + userOpName: string + ) : Async = + self.GetProjectOptionsFromScript( + fileName, + sourceText, + previewEnabled, + loadedTimeStamp, + otherFlags, + useFsiAuxLib, + useSdkRefs, + sdkDirOverride, + assumeDotNetFramework, + optionsStamp, + userOpName + ) + + member _.GetProjectSnapshotFromScript + ( + fileName: string, + sourceText: ISourceTextNew, + documentSource: DocumentSource, + previewEnabled: bool option, + loadedTimeStamp: DateTime option, + otherFlags: string array option, + useFsiAuxLib: bool option, + useSdkRefs: bool option, + sdkDirOverride: string option, + assumeDotNetFramework: bool option, + optionsStamp: int64 option, + userOpName: string + ) : Async = + async { + let! options, diagnostics = + self.GetProjectOptionsFromScript( + fileName, + sourceText, + previewEnabled, + loadedTimeStamp, + otherFlags, + useFsiAuxLib, + useSdkRefs, + sdkDirOverride, + assumeDotNetFramework, + optionsStamp, + userOpName + ) + + let! snapshot = FSharpProjectSnapshot.FromOptions(options, documentSource) + return snapshot, diagnostics + } + + member _.GetSemanticClassificationForFile + ( + fileName: string, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + self.GetSemanticClassificationForFile(fileName, options, userOpName) + + member _.GetSemanticClassificationForFile + ( + fileName: string, + snapshot: FSharpProjectSnapshot, + userOpName: string + ) : Async = + self.GetSemanticClassificationForFile(fileName, snapshot.ToOptions(), userOpName) + + member _.InvalidateConfiguration(options: FSharpProjectOptions, userOpName: string) : unit = + self.InvalidateConfiguration(options, userOpName) + + member this.InvalidateConfiguration(projectSnapshot: FSharpProjectSnapshot, userOpName: string) : unit = + let options = projectSnapshot.ToOptions() + self.InvalidateConfiguration(options, userOpName) + + member _.NotifyFileChanged(fileName: string, options: FSharpProjectOptions, userOpName: string) : Async = + self.NotifyFileChanged(fileName, options, userOpName) + + member _.NotifyProjectCleaned(options: FSharpProjectOptions, userOpName: string) : Async = + self.NotifyProjectCleaned(options, userOpName) + + member _.ParseAndCheckFileInProject + ( + fileName: string, + fileVersion: int, + sourceText: ISourceText, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + self.ParseAndCheckFileInProject(fileName, fileVersion, sourceText, options, userOpName) + + member _.ParseAndCheckFileInProject + ( + fileName: string, + projectSnapshot: FSharpProjectSnapshot, + userOpName: string + ) : Async = + async { + let fileSnapshot = + projectSnapshot.ProjectSnapshot.SourceFiles + |> Seq.find (fun f -> f.FileName = fileName) + + let! sourceText = fileSnapshot.GetSource() |> Async.AwaitTask + let options = projectSnapshot.ToOptions() + + return! self.ParseAndCheckFileInProject(fileName, 0, sourceText, options, userOpName) + } + + member _.ParseAndCheckProject(options: FSharpProjectOptions, userOpName: string) : Async = + self.ParseAndCheckProject(options, userOpName) + + member _.ParseAndCheckProject(projectSnapshot: FSharpProjectSnapshot, userOpName: string) : Async = + self.ParseAndCheckProject(projectSnapshot.ToOptions(), userOpName) + + member _.ParseFile + ( + fileName: string, + sourceText: ISourceText, + options: FSharpParsingOptions, + cache: bool, + flatErrors: bool, + userOpName: string + ) = + self.ParseFile(fileName, sourceText, options, cache, flatErrors, userOpName) + + member _.ParseFile(fileName: string, projectSnapshot: FSharpProjectSnapshot, userOpName: string) = + let options = projectSnapshot.ToOptions() + + self.GetBackgroundParseResultsForFileInProject(fileName, options, userOpName) + + member _.ProjectChecked: IEvent = self.ProjectChecked + + member _.TryGetRecentCheckResultsForFile + ( + fileName: string, + options: FSharpProjectOptions, + sourceText: ISourceText option, + userOpName: string + ) : (FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option = + self.TryGetRecentCheckResultsForFile(fileName, options, sourceText, userOpName) + + member _.TryGetRecentCheckResultsForFile + ( + fileName: string, + projectSnapshot: FSharpProjectSnapshot, + userOpName: string + ) : (FSharpParseFileResults * FSharpCheckFileResults) option = + self.TryGetRecentCheckResultsForFile(fileName, projectSnapshot, userOpName) diff --git a/src/fcs-fable/src/Compiler/Service/BackgroundCompiler.fsi b/src/fcs-fable/src/Compiler/Service/BackgroundCompiler.fsi new file mode 100644 index 0000000000..d93ece6217 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/BackgroundCompiler.fsi @@ -0,0 +1,243 @@ +namespace FSharp.Compiler.CodeAnalysis + +open FSharp.Compiler.Text +open FSharp.Compiler.BuildGraph + +open System.Reflection +open FSharp.Compiler.CodeAnalysis +open FSharp.Compiler.CompilerConfig +open FSharp.Compiler.Diagnostics + +type SourceTextHash = int64 + +type CacheStamp = int64 + +type FileName = string + +type FilePath = string + +type ProjectPath = string + +type FileVersion = int + +type FSharpProjectSnapshot = ProjectSnapshot.FSharpProjectSnapshot + +type internal IBackgroundCompiler = + + /// Type-check the result obtained by parsing. Force the evaluation of the antecedent type checking context if needed. + abstract CheckFileInProject: + parseResults: FSharpParseFileResults * + fileName: string * + fileVersion: int * + sourceText: ISourceText * + options: FSharpProjectOptions * + userOpName: string -> + Async + + /// Type-check the result obtained by parsing, but only if the antecedent type checking context is available. + abstract CheckFileInProjectAllowingStaleCachedResults: + parseResults: FSharpParseFileResults * + fileName: string * + fileVersion: int * + sourceText: ISourceText * + options: FSharpProjectOptions * + userOpName: string -> + Async + + abstract ClearCache: options: FSharpProjectOptions seq * userOpName: string -> unit + + abstract ClearCache: projects: ProjectSnapshot.FSharpProjectIdentifier seq * userOpName: string -> unit + + abstract ClearCaches: unit -> unit + + abstract DownsizeCaches: unit -> unit + + abstract FindReferencesInFile: + fileName: string * + projectSnapshot: FSharpProjectSnapshot * + symbol: FSharp.Compiler.Symbols.FSharpSymbol * + userOpName: string -> + Async + + abstract FindReferencesInFile: + fileName: string * + options: FSharpProjectOptions * + symbol: FSharp.Compiler.Symbols.FSharpSymbol * + canInvalidateProject: bool * + userOpName: string -> + Async + + abstract GetAssemblyData: + projectSnapshot: FSharpProjectSnapshot * outputFileName: string * userOpName: string -> + Async + + abstract GetAssemblyData: + options: FSharpProjectOptions * outputFileName: string * userOpName: string -> Async + + /// Fetch the check information from the background compiler (which checks w.r.t. the FileSystem API) + abstract GetBackgroundCheckResultsForFileInProject: + fileName: string * options: FSharpProjectOptions * userOpName: string -> + Async + + /// Fetch the parse information from the background compiler (which checks w.r.t. the FileSystem API) + abstract GetBackgroundParseResultsForFileInProject: + fileName: string * options: FSharpProjectOptions * userOpName: string -> Async + + abstract GetCachedCheckFileResult: + builder: IncrementalBuilder * fileName: string * sourceText: ISourceText * options: FSharpProjectOptions -> + Async<(FSharpParseFileResults * FSharpCheckFileResults) option> + + abstract GetProjectOptionsFromScript: + fileName: string * + sourceText: ISourceText * + previewEnabled: bool option * + loadedTimeStamp: System.DateTime option * + otherFlags: string array option * + useFsiAuxLib: bool option * + useSdkRefs: bool option * + sdkDirOverride: string option * + assumeDotNetFramework: bool option * + optionsStamp: int64 option * + userOpName: string -> + Async + + abstract GetProjectSnapshotFromScript: + fileName: string * + sourceText: ISourceTextNew * + documentSource: DocumentSource * + previewEnabled: bool option * + loadedTimeStamp: System.DateTime option * + otherFlags: string array option * + useFsiAuxLib: bool option * + useSdkRefs: bool option * + sdkDirOverride: string option * + assumeDotNetFramework: bool option * + optionsStamp: int64 option * + userOpName: string -> + Async + + abstract GetSemanticClassificationForFile: + fileName: string * snapshot: FSharpProjectSnapshot * userOpName: string -> + Async + + abstract GetSemanticClassificationForFile: + fileName: string * options: FSharpProjectOptions * userOpName: string -> + Async + + abstract InvalidateConfiguration: options: FSharpProjectOptions * userOpName: string -> unit + + abstract InvalidateConfiguration: projectSnapshot: FSharpProjectSnapshot * userOpName: string -> unit + + abstract NotifyFileChanged: fileName: string * options: FSharpProjectOptions * userOpName: string -> Async + + abstract NotifyProjectCleaned: options: FSharpProjectOptions * userOpName: string -> Async + + abstract ParseAndCheckFileInProject: + fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string -> + Async + + /// Parses and checks the source file and returns untyped AST and check results. + abstract ParseAndCheckFileInProject: + fileName: string * + fileVersion: int * + sourceText: ISourceText * + options: FSharpProjectOptions * + userOpName: string -> + Async + + abstract ParseAndCheckProject: + projectSnapshot: FSharpProjectSnapshot * userOpName: string -> Async + + /// Parse and typecheck the whole project. + abstract ParseAndCheckProject: + options: FSharpProjectOptions * userOpName: string -> Async + + abstract ParseFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string -> Async + + abstract ParseFile: + fileName: string * + sourceText: ISourceText * + options: FSharpParsingOptions * + cache: bool * + flatErrors: bool * + userOpName: string -> + Async + + /// Try to get recent approximate type check results for a file. + abstract TryGetRecentCheckResultsForFile: + fileName: string * options: FSharpProjectOptions * sourceText: ISourceText option * userOpName: string -> + (FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option + + abstract TryGetRecentCheckResultsForFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string -> + (FSharpParseFileResults * FSharpCheckFileResults) option + + abstract BeforeBackgroundFileCheck: IEvent + + abstract FileChecked: IEvent + + abstract FileParsed: IEvent + + abstract FrameworkImportsCache: FrameworkImportsCache + + abstract ProjectChecked: IEvent + +[] +module internal EnvMisc = + + val braceMatchCacheSize: int + + val parseFileCacheSize: int + + val checkFileInProjectCacheSize: int + + val projectCacheSizeDefault: int + + val frameworkTcImportsCacheStrongSize: int + +[] +module internal Helpers = + + /// Determine whether two (fileName,options) keys are identical w.r.t. affect on checking + val AreSameForChecking2: (string * FSharpProjectOptions) * (string * FSharpProjectOptions) -> bool + + /// Determine whether two (fileName,options) keys should be identical w.r.t. resource usage + val AreSubsumable2: (string * FSharpProjectOptions) * (string * FSharpProjectOptions) -> bool + + /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. parsing + val AreSameForParsing: (string * int64 * 'a) * (string * int64 * 'a) -> bool when 'a: equality + + val AreSimilarForParsing: ('a * 'b * 'c) * ('a * 'd * 'e) -> bool when 'a: equality + + /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. checking + val AreSameForChecking3: (string * int64 * FSharpProjectOptions) * (string * int64 * FSharpProjectOptions) -> bool + + /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. resource usage + val AreSubsumable3: (string * 'a * FSharpProjectOptions) * (string * 'b * FSharpProjectOptions) -> bool + + /// If a symbol is an attribute check if given set of names contains its name without the Attribute suffix + val NamesContainAttribute: symbol: FSharp.Compiler.Symbols.FSharpSymbol -> names: Set -> bool + +type internal BackgroundCompiler = + interface IBackgroundCompiler + + new: + legacyReferenceResolver: LegacyReferenceResolver * + projectCacheSize: int * + keepAssemblyContents: bool * + keepAllBackgroundResolutions: bool * + tryGetMetadataSnapshot: FSharp.Compiler.AbstractIL.ILBinaryReader.ILReaderTryGetMetadataSnapshot * + suggestNamesForErrors: bool * + keepAllBackgroundSymbolUses: bool * + enableBackgroundItemKeyStoreAndSemanticClassification: bool * + enablePartialTypeChecking: bool * + parallelReferenceResolution: ParallelReferenceResolution * + captureIdentifiersWhenParsing: bool * + getSource: (string -> Async) option * + useChangeNotifications: bool -> + BackgroundCompiler + + static member ActualCheckFileCount: int + + static member ActualParseFileCount: int diff --git a/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fs b/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fs index ec618440a7..ba40015839 100644 --- a/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fs +++ b/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fs @@ -6,6 +6,7 @@ namespace FSharp.Compiler.CodeAnalysis open System +open System.Collections.Generic open System.Diagnostics open System.IO open System.Reflection @@ -14,12 +15,13 @@ open FSharp.Compiler.IO open FSharp.Compiler.NicePrint open Internal.Utilities.Library open Internal.Utilities.Library.Extras +open Internal.Utilities.TypeHashing open FSharp.Core.Printf open FSharp.Compiler open FSharp.Compiler.Syntax open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AccessibilityLogic -open FSharp.Compiler.CheckExpressions +open FSharp.Compiler.CheckExpressionsOps open FSharp.Compiler.CheckDeclarations open FSharp.Compiler.CompilerConfig open FSharp.Compiler.CompilerDiagnostics @@ -53,9 +55,17 @@ open FSharp.Compiler.TypedTreeOps open Internal.Utilities open Internal.Utilities.Collections open FSharp.Compiler.AbstractIL.ILBinaryReader +open System.Threading.Tasks +open System.Runtime.CompilerServices +open Internal.Utilities.Hashing type FSharpUnresolvedReferencesSet = FSharpUnresolvedReferencesSet of UnresolvedAssemblyReference list +[] +type DocumentSource = + | FileSystem + | Custom of (string -> Async) + [] type DelayedILModuleReader = val private name: string @@ -201,7 +211,10 @@ module internal FSharpCheckerResultsSettings = #else let defaultFSharpBinariesDir = FSharpEnvironment - .BinFolderOfDefaultFSharpCompiler(Some(Path.GetDirectoryName(typeof.Assembly.Location))) + .BinFolderOfDefaultFSharpCompiler( + Path.GetDirectoryName(typeof.Assembly.Location) + |> Option.ofObj + ) .Value #endif @@ -220,27 +233,27 @@ type FSharpSymbolUse(denv: DisplayEnv, symbol: FSharpSymbol, inst: TyparInstanti member x.IsDefinition = x.IsFromDefinition - member _.IsFromDefinition = itemOcc = ItemOccurence.Binding + member _.IsFromDefinition = itemOcc = ItemOccurrence.Binding - member _.IsFromPattern = itemOcc = ItemOccurence.Pattern + member _.IsFromPattern = itemOcc = ItemOccurrence.Pattern - member _.IsFromType = itemOcc = ItemOccurence.UseInType + member _.IsFromType = itemOcc = ItemOccurrence.UseInType - member _.IsFromAttribute = itemOcc = ItemOccurence.UseInAttribute + member _.IsFromAttribute = itemOcc = ItemOccurrence.UseInAttribute - member _.IsFromDispatchSlotImplementation = itemOcc = ItemOccurence.Implemented + member _.IsFromDispatchSlotImplementation = itemOcc = ItemOccurrence.Implemented - member _.IsFromUse = itemOcc = ItemOccurence.Use + member _.IsFromUse = itemOcc = ItemOccurrence.Use member _.IsFromComputationExpression = match symbol.Item, itemOcc with // 'seq' in 'seq { ... }' gets colored as keywords - | Item.Value vref, ItemOccurence.Use when valRefEq denv.g denv.g.seq_vref vref -> true + | Item.Value vref, ItemOccurrence.Use when valRefEq denv.g denv.g.seq_vref vref -> true // custom builders, custom operations get colored as keywords - | (Item.CustomBuilder _ | Item.CustomOperation _), ItemOccurence.Use -> true + | (Item.CustomBuilder _ | Item.CustomOperation _), ItemOccurrence.Use -> true | _ -> false - member _.IsFromOpenStatement = itemOcc = ItemOccurence.Open + member _.IsFromOpenStatement = itemOcc = ItemOccurrence.Open member _.FileName = range.FileName @@ -491,6 +504,8 @@ type internal TypeCheckInfo // // If we're looking for members using a residue, we'd expect only // a single item (pick the first one) and we need the residue (which may be "") + | CNR(_, ItemOccurrence.InvalidUse, _, _, _, _) :: _, _ -> NameResResult.Empty + | CNR(Item.Types(_, ty :: _), _, denv, nenv, ad, m) :: _, Some _ -> let targets = ResolveCompletionTargets.All(ConstraintSolver.IsApplicableMethApprox g amap m) @@ -515,8 +530,8 @@ type internal TypeCheckInfo // let varA = if b then 0 else varA. // then the expression typings get confused (thinking 'varA:int'), so we use name resolution even for usual values. - | CNR(Item.Value(vref), occurence, denv, nenv, ad, m) :: _, Some _ -> - if occurence = ItemOccurence.Binding || occurence = ItemOccurence.Pattern then + | CNR(Item.Value(vref), occurrence, denv, nenv, ad, m) :: _, Some _ -> + if occurrence = ItemOccurrence.Binding || occurrence = ItemOccurrence.Pattern then // Return empty list to stop further lookup - for value declarations NameResResult.Cancel(denv, m) else @@ -531,7 +546,7 @@ type internal TypeCheckInfo // check that type of value is the same or subtype of tcref // yes - allow access to protected members // no - strip ability to access protected members - if TypeRelations.TypeFeasiblySubsumesType 0 g amap m thisTy TypeRelations.CanCoerce ty then + if TypeRelations.TypeFeasiblySubsumesType 0 g amap m thisTy Import.CanCoerce ty then ad else AccessibleFrom(paths, None) @@ -569,13 +584,78 @@ type internal TypeCheckInfo match items, membersByResidue with | CNR(Item.Types(_, ty :: _), _, _, _, _, _) :: _, Some _ -> Some ty - | CNR(Item.Value(vref), occurence, _, _, _, _) :: _, Some _ -> - if (occurence = ItemOccurence.Binding || occurence = ItemOccurence.Pattern) then + | CNR(Item.Value(vref), occurrence, _, _, _, _) :: _, Some _ -> + if (occurrence = ItemOccurrence.Binding || occurrence = ItemOccurrence.Pattern) then None else Some(StripSelfRefCell(g, vref.BaseOrThisInfo, vref.TauType)) | _, _ -> None + /// Build a CompletionItem + let CompletionItemWithMoreSetting + (ty: TyconRef voption) + (assemblySymbol: AssemblySymbol voption) + minorPriority + insertText + displayText + (item: ItemWithInst) + = + let kind = + match item.Item with + | Item.DelegateCtor _ + | Item.CtorGroup _ -> CompletionItemKind.Method false + | Item.MethodGroup(_, minfos, _) -> + match minfos with + | [] -> CompletionItemKind.Method false + | minfo :: _ -> CompletionItemKind.Method minfo.IsExtensionMember + | Item.AnonRecdField _ + | Item.RecdField _ + | Item.UnionCaseField _ + | Item.Property _ -> CompletionItemKind.Property + | Item.Event _ -> CompletionItemKind.Event + | Item.ILField _ + | Item.Value _ -> CompletionItemKind.Field + | Item.CustomOperation _ -> CompletionItemKind.CustomOperation + // These items are not given a completion kind. This could be reviewed + | Item.ActivePatternResult _ + | Item.ExnCase _ + | Item.ImplicitOp _ + | Item.ModuleOrNamespaces _ + | Item.Trait _ + | Item.TypeVar _ + | Item.Types _ + | Item.UnionCase _ + | Item.UnqualifiedType _ + | Item.NewDef _ + | Item.SetterArg _ + | Item.CustomBuilder _ + | Item.OtherName _ + | Item.ActivePatternCase _ -> CompletionItemKind.Other + + let isUnresolved = + match assemblySymbol with + | ValueSome x -> Some x.UnresolvedSymbol + | _ -> None + + let ty = + match ty with + | ValueSome x -> Some x + | _ -> None + + { + ItemWithInst = item + MinorPriority = minorPriority + Kind = kind + IsOwnMember = false + Type = ty + Unresolved = isUnresolved + CustomInsertText = insertText + CustomDisplayText = displayText + } + + let CompletionItem (ty: TyconRef voption) (assemblySymbol: AssemblySymbol voption) (item: ItemWithInst) = + CompletionItemWithMoreSetting ty assemblySymbol 0 ValueNone ValueNone item + let CollectParameters (methods: MethInfo list) amap m : Item list = methods |> List.collect (fun meth -> @@ -895,60 +975,6 @@ type internal TypeCheckInfo if p >= 0 then Some p else None - /// Build a CompetionItem - let CompletionItem (ty: TyconRef voption) (assemblySymbol: AssemblySymbol voption) (item: ItemWithInst) = - let kind = - match item.Item with - | Item.FakeInterfaceCtor _ - | Item.DelegateCtor _ - | Item.CtorGroup _ -> CompletionItemKind.Method false - | Item.MethodGroup(_, minfos, _) -> - match minfos with - | [] -> CompletionItemKind.Method false - | minfo :: _ -> CompletionItemKind.Method minfo.IsExtensionMember - | Item.AnonRecdField _ - | Item.RecdField _ - | Item.UnionCaseField _ - | Item.Property _ -> CompletionItemKind.Property - | Item.Event _ -> CompletionItemKind.Event - | Item.ILField _ - | Item.Value _ -> CompletionItemKind.Field - | Item.CustomOperation _ -> CompletionItemKind.CustomOperation - // These items are not given a completion kind. This could be reviewed - | Item.ActivePatternResult _ - | Item.ExnCase _ - | Item.ImplicitOp _ - | Item.ModuleOrNamespaces _ - | Item.Trait _ - | Item.TypeVar _ - | Item.Types _ - | Item.UnionCase _ - | Item.UnqualifiedType _ - | Item.NewDef _ - | Item.SetterArg _ - | Item.CustomBuilder _ - | Item.OtherName _ - | Item.ActivePatternCase _ -> CompletionItemKind.Other - - let isUnresolved = - match assemblySymbol with - | ValueSome x -> Some x.UnresolvedSymbol - | _ -> None - - let ty = - match ty with - | ValueSome x -> Some x - | _ -> None - - { - ItemWithInst = item - MinorPriority = 0 - Kind = kind - IsOwnMember = false - Type = ty - Unresolved = isUnresolved - } - let DefaultCompletionItem item = CompletionItem ValueNone ValueNone item let CompletionItemSuggestedName displayName = @@ -959,6 +985,8 @@ type internal TypeCheckInfo Kind = CompletionItemKind.SuggestedName IsOwnMember = false Unresolved = None + CustomInsertText = ValueNone + CustomDisplayText = ValueNone } let getItem (x: ItemWithInst) = x.Item @@ -971,7 +999,7 @@ type internal TypeCheckInfo if String.IsNullOrWhiteSpace name then None else - let name = String.lowerCaseFirstChar name + let name = String.lowerCaseFirstChar !!name let unused = sResolutions.CapturedNameResolutions @@ -1043,45 +1071,341 @@ type internal TypeCheckInfo |> Option.defaultValue completions /// Gets all methods that a type can override, but has not yet done so. - let GetOverridableMethods pos typeNameRange = - let isMethodOverridable alreadyOverridden (candidate: MethInfo) = + let GetOverridableMethods pos ctx (typeNameRange: range) spacesBeforeOverrideKeyword hasThis isStatic = + let checkImplementedSlotDeclareType ty slots = + slots + |> Option.map (List.exists (fun (TSlotSig(declaringType = ty2)) -> typeEquiv g ty ty2)) + |> Option.defaultValue false + + let isMethodOverridable superTy alreadyOverridden (candidate: MethInfo) = not candidate.IsFinal && not ( alreadyOverridden - |> List.exists (MethInfosEquivByNameAndSig EraseNone true g amap range0 candidate) + |> ResizeArray.exists (fun i -> + MethInfosEquivByNameAndSig EraseNone true g amap range0 candidate i + && (tyconRefEq g candidate.DeclaringTyconRef i.DeclaringTyconRef + || checkImplementedSlotDeclareType superTy (Option.attempt (fun () -> i.ImplementedSlotSignatures)))) ) + let isMethodOptionOverridable superTy alreadyOverridden candidate = + candidate + |> ValueOption.map (fun i -> isMethodOverridable superTy alreadyOverridden i) + |> ValueOption.defaultValue false + + let isPropertyOverridable superTy alreadyOverridden (candidate: PropInfo) = + if candidate.IsVirtualProperty then + let getterOverridden, setterOverridden = + alreadyOverridden + |> List.filter (fun i -> + PropInfosEquivByNameAndSig EraseNone g amap range0 candidate i + && (tyconRefEq g candidate.DeclaringTyconRef i.DeclaringTyconRef + || checkImplementedSlotDeclareType superTy (Option.attempt (fun () -> i.ImplementedSlotSignatures)))) + |> List.fold + (fun (getterOverridden, setterOverridden) i -> getterOverridden || i.HasGetter, setterOverridden || i.HasSetter) + (false, false) + + not getterOverridden, not setterOverridden + else + false, false + + let rec checkOrGenerateArgName (nameSet: HashSet<_>) name = + let name = if String.IsNullOrEmpty name then "arg" else name + + if nameSet.Add(name) then + name + else + checkOrGenerateArgName nameSet $"{name}_{nameSet.Count}" + let (nenv, ad), m = GetBestEnvForPos pos + let denv = nenv.DisplayEnv - sResolutions.CapturedNameResolutions - |> ResizeArray.tryPick (fun r -> - match r.Item with - | Item.Types(_, ty :: _) when equals r.Range typeNameRange && isAppTy g ty -> - let superTy = - (tcrefOfAppTy g ty).TypeContents.tcaug_super |> Option.defaultValue g.obj_ty + let checkMethAbstractAndGetImplementBody (meth: MethInfo) implementBody = + if meth.IsAbstract then + if nenv.DisplayEnv.openTopPathsSorted.Force() |> List.contains [ "System" ] then + "raise (NotImplementedException())" + else + "raise (System.NotImplementedException())" + else + implementBody + + let newlineIndent = + Environment.NewLine + String.make (spacesBeforeOverrideKeyword + 4) ' ' + + let getOverridableMethods superTy (overriddenMethods: MethInfo list) overriddenProperties = + // Do not check a method with same name twice + //type AA() = + // abstract a: unit -> unit + // default _.a() = printfn "A" + //type BB() = + // inherit AA() + // member _.a() = printfn "B" (* This method covered the `AA.a` *) + //type CC() = + // inherit BB() + // override | (* Here should not suggest to override `AA.a` *) + let checkedMethods = ResizeArray(overriddenMethods) + + let isInterface = isInterfaceTy g superTy + + // reuse between props and methods + let argNames = HashSet() + + let overridableProps = + let generatePropertyOverrideBody (prop: PropInfo) getterMeth setterMeth = + argNames.Clear() + + let parameters = + prop.GetParamNamesAndTypes(amap, m) + |> List.map (fun (ParamNameAndType(name, ty)) -> + let name = + name + |> Option.map _.idText + |> Option.defaultValue String.Empty + |> checkOrGenerateArgName argNames + + $"{name}: {stringOfTy denv ty}") + |> String.concat ", " + + let retTy = prop.GetPropertyType(amap, m) + let retTy = stringOfTy denv retTy + + let getter, getterWithBody = + match getterMeth with + | ValueSome meth -> + let implementBody = + checkMethAbstractAndGetImplementBody + meth + ($"base.{prop.DisplayName}" + (if prop.IsIndexer then $"({parameters})" else "")) + + let getter = $"get ({parameters}): {retTy}" + getter, $"{getter} = {implementBody}" + | _ -> String.Empty, String.Empty + + let setter, setterWithBody = + match setterMeth with + | ValueSome meth -> + let argValue = checkOrGenerateArgName argNames "value" + + let implementBody = + checkMethAbstractAndGetImplementBody + meth + ($"base.{prop.DisplayName}" + + (if prop.IsIndexer then $"({parameters})" else String.Empty) + + $" <- {argValue}") + + let parameters = if prop.IsIndexer then $"({parameters}) " else String.Empty + let setter = $"set {parameters}({argValue}: {retTy})" + setter, $"{setter} = {implementBody}" + | _ -> String.Empty, String.Empty + + let keywordAnd = + if getterMeth.IsNone || setterMeth.IsNone then + String.Empty + else + " and " + + let this = if hasThis || prop.IsStatic then String.Empty else "this." + + let getterWithBody = + if String.IsNullOrWhiteSpace getterWithBody then + String.Empty + else + getterWithBody + newlineIndent + + let name = $"{prop.DisplayName} with {getter}{keywordAnd}{setter}" + + let textInCode = + this + + prop.DisplayName + + newlineIndent + + "with " + + getterWithBody + + keywordAnd + + setterWithBody + + name, textInCode + + GetIntrinsicPropInfoWithOverriddenPropOfType + infoReader + None + ad + TypeHierarchy.AllowMultiIntfInstantiations.No + FindMemberFlag.PreferOverrides + range0 + superTy + |> List.choose (fun struct (prop, baseProp) -> + let getterMeth = + if prop.HasGetter then + ValueSome prop.GetterMethod + else + baseProp |> ValueOption.map _.GetterMethod + + let setterMeth = + if prop.HasSetter then + ValueSome prop.SetterMethod + else + baseProp |> ValueOption.map _.SetterMethod - let overriddenMethods = - GetImmediateIntrinsicMethInfosOfType (None, ad) g amap typeNameRange ty - |> List.filter (fun x -> x.IsDefiniteFSharpOverride) + let isGetterOverridable, isSetterOverridable = + isPropertyOverridable superTy overriddenProperties prop - let overridableMethods = - GetIntrinsicMethInfosOfType - infoReader + let isGetterOverridable = + isGetterOverridable + && isMethodOptionOverridable superTy checkedMethods getterMeth + + let isSetterOverridable = + isSetterOverridable + && isMethodOptionOverridable superTy checkedMethods setterMeth + + let canPick = + prop.IsStatic = isStatic && (isGetterOverridable || isSetterOverridable) + + getterMeth |> ValueOption.iter checkedMethods.Add + setterMeth |> ValueOption.iter checkedMethods.Add + + if not canPick then None - ad - TypeHierarchy.AllowMultiIntfInstantiations.No - FindMemberFlag.PreferOverrides - range0 - superTy - |> List.filter (isMethodOverridable overriddenMethods) - |> List.groupBy (fun x -> x.DisplayName) - |> List.map (fun (name, overloads) -> - Item.MethodGroup(name, overloads, None) + else + let getterMeth = if isGetterOverridable then getterMeth else ValueNone + let setterMeth = if isSetterOverridable then setterMeth else ValueNone + let name, textInCode = generatePropertyOverrideBody prop getterMeth setterMeth + + Item.Property( + name, + [ + prop + if baseProp.IsSome then + baseProp.Value + ], + None + ) |> ItemWithNoInst - |> DefaultCompletionItem) + |> CompletionItemWithMoreSetting ValueNone ValueNone -1 (ValueSome textInCode) (ValueSome name) + |> Some) - Some(overridableMethods, nenv.DisplayEnv, m) - | _ -> None) + let overridableMeths = + let generateMethodOverrideBody (meth: MethInfo) = + argNames.Clear() + + let parameters = + meth.GetParamNames() + |> List.zip (meth.GetParamTypes(amap, m, meth.FormalMethodInst)) + |> List.map (fun (types, names) -> + let names = + names + |> List.zip types + |> List.map (fun (ty, name) -> + let name = + name |> Option.defaultValue String.Empty |> checkOrGenerateArgName argNames + + $"{name}: {stringOfTy denv ty}") + |> String.concat ", " + + $"({names})") + |> String.concat " " + + let retTy = meth.GetFSharpReturnType(amap, m, meth.FormalMethodInst) + + let name = $"{meth.DisplayName} {parameters}: {stringOfTy denv retTy}" + + let textInCode = + let nameWithThis = + if hasThis || not meth.IsInstance then + $"{name} = " + else + $"this.{name} = " + + let implementBody = + checkMethAbstractAndGetImplementBody meth $"base.{meth.DisplayName}{parameters}" + + nameWithThis + newlineIndent + implementBody + + name, textInCode + + GetIntrinsicMethInfosOfType + infoReader + None + ad + TypeHierarchy.AllowMultiIntfInstantiations.No + FindMemberFlag.PreferOverrides + range0 + superTy + |> List.choose (fun meth -> + let canPick = + meth.IsInstance <> isStatic + && isMethodOverridable superTy checkedMethods meth + && (not isInterface + || not (tyconRefEq g meth.DeclaringTyconRef g.system_Object_tcref)) + + checkedMethods.Add meth + + if not canPick then + None + else + let name, textInCode = generateMethodOverrideBody meth + + Item.MethodGroup(name, [ meth ], None) + |> ItemWithNoInst + |> CompletionItemWithMoreSetting ValueNone ValueNone -1 (ValueSome textInCode) (ValueSome name) + |> Some) + + overridableProps @ overridableMeths + + let getTyFromTypeNamePos (endPos: pos) = + let nameResItems = + GetPreciseItemsFromNameResolution(endPos.Line, endPos.Column, None, ResolveTypeNamesToTypeRefs, ResolveOverloads.Yes) + + match nameResItems with + | NameResResult.Members(ls, _, _) -> + ls + |> List.tryPick (function + | { Item = Item.Types(_, ty :: _) } -> Some ty + | _ -> None) + | _ -> None + + let ctx = + match ctx with + | MethodOverrideCompletionContext.Class -> + sResolutions.CapturedNameResolutions + |> ResizeArray.tryPick (fun r -> + match r.Item with + | Item.Types(_, ty :: _) when equals r.Range typeNameRange && isAppTy g ty -> + let superTy = + (tcrefOfAppTy g ty).TypeContents.tcaug_super + |> Option.defaultValue g.obj_ty_noNulls + + Some(ty, superTy) + | _ -> None) + + | MethodOverrideCompletionContext.Interface mTy -> + sResolutions.CapturedNameResolutions + |> ResizeArray.tryPick (fun r -> + match r.Item with + | Item.Types(_, ty :: _) when equals r.Range typeNameRange && isAppTy g ty -> + let superTy = getTyFromTypeNamePos mTy.End |> Option.defaultValue g.obj_ty_noNulls + Some(ty, superTy) + | _ -> None) + | MethodOverrideCompletionContext.ObjExpr m -> + let _, quals = GetExprTypingForPosition(m.End) + + quals + |> Array.tryFind (fun (_, _, _, r) -> posEq m.Start r.Start) + |> Option.map (fun (ty, _, _, _) -> ty, getTyFromTypeNamePos typeNameRange.End |> Option.defaultValue g.obj_ty_noNulls) + + match ctx with + | Some(ty, superTy) -> + let overriddenMethods = + GetImmediateIntrinsicMethInfosWithExplicitImplOfType (None, ad) g amap typeNameRange ty + |> List.filter (fun x -> x.IsDefiniteFSharpOverride) + + let overriddenProperties = + GetImmediateIntrinsicPropInfosWithExplicitImplOfType (None, ad) g amap typeNameRange ty + |> List.filter (fun x -> x.IsDefiniteFSharpOverride) + + let overridableMethods = + getOverridableMethods superTy overriddenMethods overriddenProperties + + Some(overridableMethods, denv, m) + | _ -> None /// Gets all field identifiers of a union case that can be referred to in a pattern. let GetUnionCaseFields caseIdRange alreadyReferencedFields = @@ -1577,6 +1901,8 @@ type internal TypeCheckInfo IsOwnMember = false Type = None Unresolved = None + CustomInsertText = ValueNone + CustomDisplayText = ValueNone }) match declaredItems with @@ -1639,7 +1965,8 @@ type internal TypeCheckInfo getDeclaredItemsNotInRangeOpWithAllSymbols () |> Option.bind (FilterRelevantItemsBy getItem2 None IsPatternCandidate) - | Some(CompletionContext.MethodOverride enclosingTypeNameRange) -> GetOverridableMethods pos enclosingTypeNameRange + | Some(CompletionContext.MethodOverride(ctx, enclosingTypeNameRange, spacesBeforeOverrideKeyword, hasThis, isStatic)) -> + GetOverridableMethods pos ctx enclosingTypeNameRange spacesBeforeOverrideKeyword hasThis isStatic // Other completions | cc -> @@ -1808,10 +2135,9 @@ type internal TypeCheckInfo |> List.sortBy (fun d -> let n = match d.Item with - | Item.Types(_, AbbrevOrAppTy tcref :: _) -> 1 + tcref.TyparsNoRange.Length + | Item.Types(_, AbbrevOrAppTy(tcref, _) :: _) -> 1 + tcref.TyparsNoRange.Length // Put delegate ctors after types, sorted by #typars. RemoveDuplicateItems will remove FakeInterfaceCtor and DelegateCtor if an earlier type is also reported with this name - | Item.FakeInterfaceCtor(AbbrevOrAppTy tcref) - | Item.DelegateCtor(AbbrevOrAppTy tcref) -> 1000 + tcref.TyparsNoRange.Length + | Item.DelegateCtor(AbbrevOrAppTy(tcref, _)) -> 1000 + tcref.TyparsNoRange.Length // Put type ctors after types, sorted by #typars. RemoveDuplicateItems will remove DefaultStructCtors if a type is also reported with this name | Item.CtorGroup(_, cinfo :: _) -> 1000 + 10 * cinfo.DeclaringTyconRef.TyparsNoRange.Length | _ -> 0 @@ -1827,11 +2153,10 @@ type internal TypeCheckInfo items |> List.groupBy (fun d -> match d.Item with - | Item.Types(_, AbbrevOrAppTy tcref :: _) + | Item.Types(_, AbbrevOrAppTy(tcref, _) :: _) | Item.ExnCase tcref -> tcref.LogicalName | Item.UnqualifiedType(tcref :: _) - | Item.FakeInterfaceCtor(AbbrevOrAppTy tcref) - | Item.DelegateCtor(AbbrevOrAppTy tcref) -> tcref.CompiledName + | Item.DelegateCtor(AbbrevOrAppTy(tcref, _)) -> tcref.CompiledName | Item.CtorGroup(_, cinfo :: _) -> cinfo.ApparentEnclosingTyconRef.CompiledName | _ -> d.Item.DisplayName) @@ -1860,7 +2185,7 @@ type internal TypeCheckInfo items |> List.map (fun item -> let symbol = FSharpSymbol.Create(cenv, item.Item) - FSharpSymbolUse(denv, symbol, item.ItemWithInst.TyparInstantiation, ItemOccurence.Use, m))) + FSharpSymbolUse(denv, symbol, item.ItemWithInst.TyparInstantiation, ItemOccurrence.Use, m))) //end filtering items) @@ -1917,7 +2242,7 @@ type internal TypeCheckInfo | Some(_, lines) -> let lines = lines - |> List.filter (fun line -> not (line.StartsWith("//")) && not (String.IsNullOrEmpty line)) + |> List.filter (fun line -> not (line.StartsWithOrdinal("//")) && not (String.IsNullOrEmpty line)) ToolTipText.ToolTipText [ @@ -2260,7 +2585,7 @@ type internal TypeCheckInfo | Some itemRange -> let projectDir = FileSystem.GetDirectoryNameShim( - if projectFileName = "" then + if String.IsNullOrEmpty(projectFileName) then mainInputFileName else projectFileName @@ -2526,6 +2851,11 @@ module internal ParseAndCheckFile = member _.AnyErrors = errorCount > 0 + member _.CollectedPhasedDiagnostics = + [| + for struct (diagnostic, severity) in diagnosticsCollector -> diagnostic, severity + |] + member _.CollectedDiagnostics(symbolEnv: SymbolEnv option) = [| for struct (diagnostic, severity) in diagnosticsCollector do @@ -2686,7 +3016,7 @@ module internal ParseAndCheckFile = | INTERP_STRING_BEGIN_PART _ | INTERP_STRING_PART _ as tok, _ -> let braceOffset = match tok with - | INTERP_STRING_BEGIN_PART(_, SynStringKind.TripleQuote, (LexerContinuation.Token(_, (_, _, dl, _) :: _))) -> + | INTERP_STRING_BEGIN_PART(_, SynStringKind.TripleQuote, (LexerContinuation.Token(_, (_, _, dl, _, _) :: _))) -> dl - 1 | _ -> 0 @@ -2707,7 +3037,7 @@ module internal ParseAndCheckFile = let parseFile ( sourceText: ISourceText, - fileName, + fileName: string, options: FSharpParsingOptions, userOpName: string, suggestNamesForErrors: bool, @@ -2764,7 +3094,7 @@ module internal ParseAndCheckFile = ( tcConfig, parsedMainInput, - mainInputFileName, + mainInputFileName: string, loadClosure: LoadClosure option, tcImports: TcImports, backgroundDiagnostics @@ -2856,7 +3186,7 @@ module internal ParseAndCheckFile = ApplyMetaCommandsFromInputToTcConfig( tcConfig, parsedMainInput, - Path.GetDirectoryName mainInputFileName, + !! Path.GetDirectoryName(mainInputFileName), tcImports.DependencyProvider ) |> ignore @@ -2910,17 +3240,12 @@ module internal ParseAndCheckFile = #if !FABLE_COMPILER // Apply nowarns to tcConfig (may generate errors, so ensure diagnosticsLogger is installed) let tcConfig = - ApplyNoWarnsToTcConfig(tcConfig, parsedMainInput, Path.GetDirectoryName mainInputFileName) + ApplyNoWarnsToTcConfig(tcConfig, parsedMainInput, !! Path.GetDirectoryName(mainInputFileName)) #endif // update the error handler with the modified tcConfig errHandler.DiagnosticOptions <- tcConfig.diagnosticsOptions - // Play background errors and warnings for this file. - do - for err, severity in backgroundDiagnostics do - diagnosticSink (err, severity) - #if !FABLE_COMPILER // If additional references were brought in by the preprocessor then we need to process them ApplyLoadClosure(tcConfig, parsedMainInput, mainInputFileName, loadClosure, tcImports, backgroundDiagnostics) @@ -2966,6 +3291,11 @@ module internal ParseAndCheckFile = return ((tcState.TcEnvFromSignatures, EmptyTopAttrs, [], [ mty ]), tcState) } + // Play background errors and warnings for this file. + do + for err, severity in backgroundDiagnostics do + diagnosticSink (err, severity) + let (tcEnvAtEnd, _, implFiles, ccuSigsForFiles), tcState = resOpt let symbolEnv = SymbolEnv(tcGlobals, tcState.Ccu, Some tcState.CcuSig, tcImports) @@ -3106,7 +3436,7 @@ type FSharpCheckFileResults | Some(scope, _builderOpt) -> scope.GetSymbolUsesAtLocation(line, lineText, colAtEndOfNames, names) |> List.map (fun (sym, itemWithInst, denv, m) -> - FSharpSymbolUse(denv, sym, itemWithInst.TyparInstantiation, ItemOccurence.Use, m)) + FSharpSymbolUse(denv, sym, itemWithInst.TyparInstantiation, ItemOccurrence.Use, m)) member _.GetMethodsAsSymbols(line, colAtEndOfNames, lineText, names) = match details with @@ -3115,7 +3445,7 @@ type FSharpCheckFileResults scope.GetMethodsAsSymbols(line, lineText, colAtEndOfNames, names) |> Option.map (fun (symbols, denv, m) -> symbols - |> List.map (fun (sym, itemWithInst) -> FSharpSymbolUse(denv, sym, itemWithInst.TyparInstantiation, ItemOccurence.Use, m))) + |> List.map (fun (sym, itemWithInst) -> FSharpSymbolUse(denv, sym, itemWithInst.TyparInstantiation, ItemOccurrence.Use, m))) member _.GetSymbolAtLocation(line, colAtEndOfNames, lineStr, names) = match details with @@ -3161,10 +3491,10 @@ type FSharpCheckFileResults for symbolUse in symbolUseChunk do cancellationToken |> Option.iter (fun ct -> ct.ThrowIfCancellationRequested()) - if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then + if symbolUse.ItemOccurrence <> ItemOccurrence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.ItemWithInst.Item) let inst = symbolUse.ItemWithInst.TyparInstantiation - FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurence, symbolUse.Range) + FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurrence, symbolUse.Range) } member _.GetUsesOfSymbolInFile(symbol: FSharpSymbol, ?cancellationToken: CancellationToken) = @@ -3174,12 +3504,12 @@ type FSharpCheckFileResults [| for symbolUse in scope.ScopeSymbolUses.GetUsesOfSymbol(symbol.Item) - |> Seq.distinctBy (fun symbolUse -> symbolUse.ItemOccurence, symbolUse.Range) do + |> Seq.distinctBy (fun symbolUse -> symbolUse.ItemOccurrence, symbolUse.Range) do cancellationToken |> Option.iter (fun ct -> ct.ThrowIfCancellationRequested()) - if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then + if symbolUse.ItemOccurrence <> ItemOccurrence.RelatedText then let inst = symbolUse.ItemWithInst.TyparInstantiation - FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurence, symbolUse.Range) + FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurrence, symbolUse.Range) |] member _.GetVisibleNamespacesAndModulesAtPoint(pos: pos) = @@ -3233,7 +3563,7 @@ type FSharpCheckFileResults |> SourceText.ofString) member internal _.CalculateSignatureHash() = - let visibility = Fsharp.Compiler.SignatureHash.PublicAndInternal + let visibility = PublicAndInternal match details with | None -> failwith "Typechecked details not available for CalculateSignatureHash() operation." @@ -3297,7 +3627,7 @@ type FSharpCheckFileResults tcConfig, tcGlobals, isIncompleteTypeCheckEnvironment: bool, - builder: IncrementalBuilder, + builder: IncrementalBuilder option, projectOptions, dependencyFiles, creationErrors: FSharpDiagnostic[], @@ -3338,7 +3668,7 @@ type FSharpCheckFileResults let errors = FSharpCheckFileResults.JoinErrors(isIncompleteTypeCheckEnvironment, creationErrors, parseErrors, tcErrors) - FSharpCheckFileResults(mainInputFileName, errors, Some tcFileInfo, dependencyFiles, Some builder, keepAssemblyContents) + FSharpCheckFileResults(mainInputFileName, errors, Some tcFileInfo, dependencyFiles, builder, keepAssemblyContents) #if !FABLE_COMPILER @@ -3357,7 +3687,7 @@ type FSharpCheckFileResults backgroundDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity)[], isIncompleteTypeCheckEnvironment: bool, projectOptions: FSharpProjectOptions, - builder: IncrementalBuilder, + builder: IncrementalBuilder option, dependencyFiles: string[], creationErrors: FSharpDiagnostic[], parseErrors: FSharpDiagnostic[], @@ -3386,7 +3716,7 @@ type FSharpCheckFileResults FSharpCheckFileResults.JoinErrors(isIncompleteTypeCheckEnvironment, creationErrors, parseErrors, tcErrors) let results = - FSharpCheckFileResults(mainInputFileName, errors, Some tcFileInfo, dependencyFiles, Some builder, keepAssemblyContents) + FSharpCheckFileResults(mainInputFileName, errors, Some tcFileInfo, dependencyFiles, builder, keepAssemblyContents) return results } @@ -3406,7 +3736,7 @@ type FSharpCheckProjectResults TcImports * CcuThunk * ModuleOrNamespaceType * - Choice * + Choice> * TopAttribs option * (unit -> IRawFSharpAssemblyData option) * ILAssemblyRef * @@ -3444,6 +3774,7 @@ type FSharpCheckProjectResults FSharpAssemblySignature(tcGlobals, thisCcu, ccuSig, tcImports, topAttribs, ccuSig) + // TODO: Looks like we don't need this member _.TypedImplementationFiles = if not keepAssemblyContents then invalidOp @@ -3504,6 +3835,7 @@ type FSharpCheckProjectResults FSharpAssemblyContents(tcGlobals, thisCcu, Some ccuSig, tcImports, mimpls) // Not, this does not have to be a SyncOp, it can be called from any thread + // TODO: this should be async member _.GetUsesOfSymbol(symbol: FSharpSymbol, ?cancellationToken: CancellationToken) = let _, _, _, _, builderOrSymbolUses, _, _, _, _, _, _, _ = getDetails () @@ -3512,7 +3844,7 @@ type FSharpCheckProjectResults | Choice1Of2 builder -> #if FABLE_COMPILER ignore builder - [||] + seq {} #else builder.SourceFiles |> Array.ofList @@ -3523,19 +3855,33 @@ type FSharpCheckProjectResults | Some(_, tcInfoExtras) -> tcInfoExtras.TcSymbolUses.GetUsesOfSymbol symbol.Item | _ -> [||] | _ -> [||]) + |> Array.toSeq #endif //!FABLE_COMPILER - | Choice2Of2 tcSymbolUses -> tcSymbolUses.GetUsesOfSymbol symbol.Item + | Choice2Of2 task -> + Async.RunSynchronously( + async { + let! tcSymbolUses = task + + return + seq { + for symbolUses in tcSymbolUses do + yield! symbolUses.GetUsesOfSymbol symbol.Item + } + }, + ?cancellationToken = cancellationToken + ) results - |> Seq.filter (fun symbolUse -> symbolUse.ItemOccurence <> ItemOccurence.RelatedText) - |> Seq.distinctBy (fun symbolUse -> symbolUse.ItemOccurence, symbolUse.Range) + |> Seq.filter (fun symbolUse -> symbolUse.ItemOccurrence <> ItemOccurrence.RelatedText) + |> Seq.distinctBy (fun symbolUse -> symbolUse.ItemOccurrence, symbolUse.Range) |> Seq.map (fun symbolUse -> cancellationToken |> Option.iter (fun ct -> ct.ThrowIfCancellationRequested()) let inst = symbolUse.ItemWithInst.TyparInstantiation - FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurence, symbolUse.Range)) + FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurrence, symbolUse.Range)) |> Seq.toArray // Not, this does not have to be a SyncOp, it can be called from any thread + // TODO: this should be async member _.GetAllUsesOfAllSymbols(?cancellationToken: CancellationToken) = let tcGlobals, tcImports, thisCcu, ccuSig, builderOrSymbolUses, _, _, _, _, _, _, _ = getDetails () @@ -3547,7 +3893,7 @@ type FSharpCheckProjectResults | Choice1Of2 builder -> #if FABLE_COMPILER ignore builder - [||] + seq {} #else builder.SourceFiles |> Array.ofList @@ -3558,8 +3904,9 @@ type FSharpCheckProjectResults | Some(_, tcInfoExtras) -> tcInfoExtras.TcSymbolUses | _ -> TcSymbolUses.Empty | _ -> TcSymbolUses.Empty) + |> Array.toSeq #endif //!FABLE_COMPILER - | Choice2Of2 tcSymbolUses -> [| tcSymbolUses |] + | Choice2Of2 tcSymbolUses -> Async.RunSynchronously(tcSymbolUses, ?cancellationToken = cancellationToken) [| for r in tcSymbolUses do @@ -3567,10 +3914,10 @@ type FSharpCheckProjectResults for symbolUse in symbolUseChunk do cancellationToken |> Option.iter (fun ct -> ct.ThrowIfCancellationRequested()) - if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then + if symbolUse.ItemOccurrence <> ItemOccurrence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.ItemWithInst.Item) let inst = symbolUse.ItemWithInst.TyparInstantiation - FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurence, symbolUse.Range) + FSharpSymbolUse(symbolUse.DisplayEnv, symbol, inst, symbolUse.ItemOccurrence, symbolUse.Range) |] member _.ProjectContext = @@ -3602,9 +3949,6 @@ type FsiInteractiveChecker(legacyReferenceResolver, tcConfig: TcConfig, tcGlobal member _.ParseAndCheckInteraction(sourceText: ISourceText, ?userOpName: string) = cancellable { - let! ct = Cancellable.token () - use _ = Cancellable.UsingToken(ct) - let userOpName = defaultArg userOpName "Unknown" let fileName = Path.Combine(tcConfig.implicitIncludeDir, "stdin.fsx") let suggestNamesForErrors = true // Will always be true, this is just for readability @@ -3700,7 +4044,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, tcConfig: TcConfig, tcGlobal tcImports, tcFileInfo.ThisCcu, tcFileInfo.CcuSigForFile, - Choice2Of2 tcFileInfo.ScopeSymbolUses, + Choice2Of2(tcFileInfo.ScopeSymbolUses |> Seq.singleton |> async.Return), None, (fun () -> None), mkSimpleAssemblyRef "stdin", diff --git a/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fsi b/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fsi index 7b44066202..cba41faac2 100644 --- a/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fsi +++ b/src/fcs-fable/src/Compiler/Service/FSharpCheckerResults.fsi @@ -3,8 +3,10 @@ namespace FSharp.Compiler.CodeAnalysis open System +open System.Collections.Generic open System.IO open System.Threading +open System.Threading.Tasks open Internal.Utilities.Library open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.ILBinaryReader @@ -26,6 +28,14 @@ open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text +open Internal.Utilities.Collections + +[] +[] +type DocumentSource = + | FileSystem + | Custom of (string -> Async) + /// Delays the creation of an ILModuleReader [] type DelayedILModuleReader = @@ -47,7 +57,7 @@ type public FSharpProjectOptions = // Note that this may not reduce to just the project directory, because there may be two projects in the same directory. ProjectFileName: string - /// This is the unique identifier for the project, it is case sensitive. If it's None, will key off of ProjectFileName in our caching. + /// This is the unique identifier for the project, it is case-sensitive. If it's None, will key off of ProjectFileName in our caching. ProjectId: string option /// The files in the project @@ -182,7 +192,7 @@ type public FSharpSymbolUse = // For internal use only internal new: - denv: DisplayEnv * symbol: FSharpSymbol * inst: TyparInstantiation * itemOcc: ItemOccurence * range: range -> + denv: DisplayEnv * symbol: FSharpSymbol * inst: TyparInstantiation * itemOcc: ItemOccurrence * range: range -> FSharpSymbolUse /// Represents the checking context implied by the ProjectOptions @@ -487,7 +497,7 @@ type public FSharpCheckFileResults = tcConfig: TcConfig * tcGlobals: TcGlobals * isIncompleteTypeCheckEnvironment: bool * - builder: IncrementalBuilder * + builder: IncrementalBuilder option * projectOptions: FSharpProjectOptions * dependencyFiles: string[] * creationErrors: FSharpDiagnostic[] * @@ -522,7 +532,7 @@ type public FSharpCheckFileResults = backgroundDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity)[] * isIncompleteTypeCheckEnvironment: bool * projectOptions: FSharpProjectOptions * - builder: IncrementalBuilder * + builder: IncrementalBuilder option * dependencyFiles: string[] * creationErrors: FSharpDiagnostic[] * parseErrors: FSharpDiagnostic[] * @@ -583,7 +593,7 @@ type public FSharpCheckProjectResults = TcImports * CcuThunk * ModuleOrNamespaceType * - Choice * + Choice> * TopAttribs option * (unit -> IRawFSharpAssemblyData option) * ILAssemblyRef * @@ -615,6 +625,29 @@ module internal ParseAndCheckFile = ct: CancellationToken -> (range * range)[] + /// Diagnostics handler for parsing & type checking while processing a single file + type DiagnosticsHandler = + new: + reportErrors: bool * + mainInputFileName: string * + diagnosticsOptions: FSharpDiagnosticOptions * + sourceText: ISourceText * + suggestNamesForErrors: bool * + flatErrors: bool -> + DiagnosticsHandler + + member DiagnosticsLogger: DiagnosticsLogger + + member ErrorCount: int + + member DiagnosticOptions: FSharpDiagnosticOptions with set + + member AnyErrors: bool + + member CollectedPhasedDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) array + + member CollectedDiagnostics: symbolEnv: SymbolEnv option -> FSharpDiagnostic array + #if !FABLE_COMPILER // An object to typecheck source in a given typechecking environment. diff --git a/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fs b/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fs index 46a5753ba3..612057578f 100644 --- a/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fs +++ b/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fs @@ -6,7 +6,6 @@ open System open System.IO open System.Collections.Generic open System.Diagnostics -open Internal.Utilities.Library open FSharp.Compiler.Diagnostics open FSharp.Compiler.EditorServices open FSharp.Compiler.Syntax @@ -15,7 +14,7 @@ open FSharp.Compiler.Text open FSharp.Compiler.Text.Range module SourceFileImpl = - let IsSignatureFile file = + let IsSignatureFile (file: string) = let ext = Path.GetExtension file 0 = String.Compare(".fsi", ext, StringComparison.OrdinalIgnoreCase) @@ -97,7 +96,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, match expr with // This lets us dive into subexpressions that may contain the binding we're after - | SynExpr.Sequential(_, _, expr1, expr2, _) -> + | SynExpr.Sequential(expr1 = expr1; expr2 = expr2) -> if rangeContainsPos expr1.Range pos then walkBinding expr1 workingRange else @@ -115,201 +114,118 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | _ -> Some workingRange - let visitor = - { new SyntaxVisitorBase<_>() with - override _.VisitExpr(_, _, defaultTraverse, expr) = defaultTraverse expr - - override _.VisitBinding(_path, defaultTraverse, binding) = - match binding with - | SynBinding(valData = SynValData(memberFlags = None); expr = expr) as b when - rangeContainsPos b.RangeOfBindingWithRhs pos - -> - match tryGetIdentRangeFromBinding b with - | Some range -> walkBinding expr range - | None -> None - | _ -> defaultTraverse binding - } - - SyntaxTraversal.Traverse(pos, input, visitor) + (pos, input) + ||> ParsedInput.tryPick (fun _path node -> + match node with + | SyntaxNode.SynBinding(SynBinding(valData = SynValData(memberFlags = None); expr = expr) as b) when + rangeContainsPos b.RangeOfBindingWithRhs pos + -> + match tryGetIdentRangeFromBinding b with + | Some range -> walkBinding expr range + | None -> None + | _ -> None) member _.TryIdentOfPipelineContainingPosAndNumArgsApplied pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, _, defaultTraverse, expr) = - match expr with - | SynExpr.App(_, _, SynExpr.App(_, true, SynExpr.LongIdent(longDotId = SynLongIdent(id = [ ident ])), _, _), argExpr, _) when - rangeContainsPos argExpr.Range pos - -> - match argExpr with - | SynExpr.App(_, _, _, SynExpr.Paren(expr, _, _, _), _) when rangeContainsPos expr.Range pos -> None - | _ -> - if ident.idText = "op_PipeRight" then Some(ident, 1) - elif ident.idText = "op_PipeRight2" then Some(ident, 2) - elif ident.idText = "op_PipeRight3" then Some(ident, 3) - else None - | _ -> defaultTraverse expr - } - - SyntaxTraversal.Traverse(pos, input, visitor) + (pos, input) + ||> ParsedInput.tryPick (fun _path node -> + match node with + | SyntaxNode.SynExpr(SynExpr.App( + funcExpr = SynExpr.App(_, true, SynExpr.LongIdent(longDotId = SynLongIdent(id = [ ident ])), _, _); argExpr = argExpr)) when + rangeContainsPos argExpr.Range pos + -> + match argExpr with + | SynExpr.App(_, _, _, SynExpr.Paren(expr, _, _, _), _) when rangeContainsPos expr.Range pos -> None + | _ -> + if ident.idText = "op_PipeRight" then Some(ident, 1) + elif ident.idText = "op_PipeRight2" then Some(ident, 2) + elif ident.idText = "op_PipeRight3" then Some(ident, 3) + else None + | _ -> None) member _.IsPosContainedInApplication pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, traverseSynExpr, defaultTraverse, expr) = - match expr with - | SynExpr.TypeApp(_, _, _, _, _, _, range) when rangeContainsPos range pos -> Some range - | SynExpr.App(_, _, _, SynExpr.ComputationExpr(_, expr, _), range) when rangeContainsPos range pos -> - traverseSynExpr expr - | SynExpr.App(_, _, _, _, range) when rangeContainsPos range pos -> Some range - | _ -> defaultTraverse expr - } - - let result = SyntaxTraversal.Traverse(pos, input, visitor) - result.IsSome + (pos, input) + ||> ParsedInput.exists (fun _path node -> + match node with + | SyntaxNode.SynExpr(SynExpr.App(argExpr = SynExpr.ComputationExpr _) | SynExpr.TypeApp(expr = SynExpr.ComputationExpr _)) -> + false + | SyntaxNode.SynExpr(SynExpr.App(range = range) | SynExpr.TypeApp(range = range)) when rangeContainsPos range pos -> true + | _ -> false) member _.IsTypeName(range: range) = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitModuleDecl(_, _, synModuleDecl) = - match synModuleDecl with - | SynModuleDecl.Types(typeDefns, _) -> - typeDefns - |> Seq.exists (fun (SynTypeDefn(typeInfo, _, _, _, _, _)) -> typeInfo.Range = range) - |> Some - | _ -> None - } - - let result = SyntaxTraversal.Traverse(range.Start, input, visitor) - result |> Option.contains true + (range.Start, input) + ||> ParsedInput.exists (fun _path node -> + match node with + | SyntaxNode.SynTypeDefn(SynTypeDefn(typeInfo = typeInfo)) -> typeInfo.Range = range + | _ -> false) member _.TryRangeOfFunctionOrMethodBeingApplied pos = - let rec getIdentRangeForFuncExprInApp traverseSynExpr expr pos = - match expr with - | SynExpr.Ident ident -> Some ident.idRange - - | SynExpr.LongIdent(_, _, _, range) -> Some range - - | SynExpr.Paren(expr, _, _, range) when rangeContainsPos range pos -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos - - | SynExpr.TypeApp(expr, _, _, _, _, _, _) -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos - - | SynExpr.App(_, _, funcExpr, argExpr, _) -> - match argExpr with - | SynExpr.App(_, _, _, _, range) when rangeContainsPos range pos -> - getIdentRangeForFuncExprInApp traverseSynExpr argExpr pos - - // Special case: `async { ... }` is actually a ComputationExpr inside of the argExpr of a SynExpr.App - | SynExpr.ComputationExpr(_, expr, range) - | SynExpr.Paren(expr, _, _, range) when rangeContainsPos range pos -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos - - // Yielding values in an array or list that is used as an argument: List.sum [ getVal a b; getVal b c ] - | SynExpr.ArrayOrListComputed(_, expr, range) when rangeContainsPos range pos -> - if rangeContainsPos expr.Range pos then - getIdentRangeForFuncExprInApp traverseSynExpr expr pos - else - (* - In cases like - - let test () = div [] [ - str "" - ; | - ] - - `ProvideParametersAsyncAux` currently works with the wrong symbol or - doesn't detect the previously applied arguments. - Until that is fixed, don't show any tooltips rather than the wrong signature. - *) - None - - | _ -> - match funcExpr with - | SynExpr.App(_, true, _, _, _) when rangeContainsPos argExpr.Range pos -> - // x |> List.map - // Don't dive into the funcExpr (the operator expr) - // because we dont want to offer sig help for that! - getIdentRangeForFuncExprInApp traverseSynExpr argExpr pos - | _ -> - // Generally, we want to dive into the func expr to get the range - // of the identifier of the function we're after - getIdentRangeForFuncExprInApp traverseSynExpr funcExpr pos - - | SynExpr.Sequential(_, _, expr1, expr2, range) when rangeContainsPos range pos -> - if rangeContainsPos expr1.Range pos then - getIdentRangeForFuncExprInApp traverseSynExpr expr1 pos - else - getIdentRangeForFuncExprInApp traverseSynExpr expr2 pos - - | SynExpr.LetOrUse(bindings = bindings; body = body; range = range) when rangeContainsPos range pos -> - let binding = - bindings |> List.tryFind (fun x -> rangeContainsPos x.RangeOfBindingWithRhs pos) - - match binding with - | Some(SynBinding.SynBinding(expr = expr)) -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos - | None -> getIdentRangeForFuncExprInApp traverseSynExpr body pos - - | SynExpr.IfThenElse(ifExpr = ifExpr; thenExpr = thenExpr; elseExpr = elseExpr; range = range) when rangeContainsPos range pos -> - if rangeContainsPos ifExpr.Range pos then - getIdentRangeForFuncExprInApp traverseSynExpr ifExpr pos - elif rangeContainsPos thenExpr.Range pos then - getIdentRangeForFuncExprInApp traverseSynExpr thenExpr pos - else - match elseExpr with - | None -> None - | Some expr -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos + let rec (|FuncIdent|_|) (node, path) = + match node, path with + | SyntaxNode.SynExpr(DeepestIdentifiedFuncInAppChain range), _ -> Some range + | SyntaxNode.SynExpr PossibleBareArg, DeepestIdentifiedFuncInPath range -> Some range + | SyntaxNode.SynExpr(Identifier range), _ -> Some range + | _ -> None - | SynExpr.Match(expr = expr; clauses = clauses; range = range) when rangeContainsPos range pos -> + and (|DeepestIdentifiedFuncInAppChain|_|) expr = + let (|Contains|_|) pos (expr: SynExpr) = if rangeContainsPos expr.Range pos then - getIdentRangeForFuncExprInApp traverseSynExpr expr pos + Some Contains else - let clause = - clauses |> List.tryFind (fun clause -> rangeContainsPos clause.Range pos) - - match clause with - | None -> None - | Some clause -> - match clause with - | SynMatchClause.SynMatchClause(whenExpr = whenExprOpt; resultExpr = resultExpr) -> - match whenExprOpt with - | None -> getIdentRangeForFuncExprInApp traverseSynExpr resultExpr pos - | Some whenExpr -> - if rangeContainsPos whenExpr.Range pos then - getIdentRangeForFuncExprInApp traverseSynExpr whenExpr pos - else - getIdentRangeForFuncExprInApp traverseSynExpr resultExpr pos - - // Ex: C.M(x, y, ...) <--- We want to find where in the tupled application the call is being made - | SynExpr.Tuple(_, exprs, _, tupRange) when rangeContainsPos tupRange pos -> - let expr = exprs |> List.tryFind (fun expr -> rangeContainsPos expr.Range pos) - - match expr with - | None -> None - | Some expr -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos - - // Capture the body of a lambda, often nested in a call to a collection function - | SynExpr.Lambda(body = body) when rangeContainsPos body.Range pos -> getIdentRangeForFuncExprInApp traverseSynExpr body pos + None - | SynExpr.DotLambda(expr = body) when rangeContainsPos body.Range pos -> getIdentRangeForFuncExprInApp traverseSynExpr body pos - - | SynExpr.Do(expr, range) when rangeContainsPos range pos -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos + match expr with + | SynExpr.App(argExpr = Contains pos & DeepestIdentifiedFuncInAppChain range) -> Some range + | SynExpr.App(isInfix = false; funcExpr = Identifier range | DeepestIdentifiedFuncInAppChain range) -> Some range + | SynExpr.TypeApp(expr = Identifier range) -> Some range + | SynExpr.Paren(expr = Contains pos & DeepestIdentifiedFuncInAppChain range) -> Some range + | _ -> None - | SynExpr.Assert(expr, range) when rangeContainsPos range pos -> getIdentRangeForFuncExprInApp traverseSynExpr expr pos + and (|DeepestIdentifiedFuncInPath|_|) path = + match path with + | SyntaxNode.SynExpr(DeepestIdentifiedFuncInAppChain range) :: _ + | SyntaxNode.SynExpr PossibleBareArg :: DeepestIdentifiedFuncInPath range -> Some range + | _ -> None - | SynExpr.ArbitraryAfterError(_debugStr, range) when rangeContainsPos range pos -> Some range + and (|Identifier|_|) expr = + let (|Ident|) (ident: Ident) = ident.idRange - | expr -> traverseSynExpr expr + match expr with + | SynExpr.Ident(ident = Ident range) + | SynExpr.LongIdent(range = range) + | SynExpr.ArbitraryAfterError(range = range) -> Some range + | _ -> None - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, traverseSynExpr, defaultTraverse, expr) = - match expr with - | SynExpr.TypeApp(expr, _, _, _, _, _, range) when rangeContainsPos range pos -> - getIdentRangeForFuncExprInApp traverseSynExpr expr pos - | SynExpr.App(_, _, _funcExpr, _, range) as app when rangeContainsPos range pos -> - getIdentRangeForFuncExprInApp traverseSynExpr app pos - | _ -> defaultTraverse expr - } + and (|PossibleBareArg|_|) expr = + match expr with + | SynExpr.App _ + | SynExpr.TypeApp _ + | SynExpr.Ident _ + | SynExpr.LongIdent _ + | SynExpr.Const _ + | SynExpr.Null _ + | SynExpr.InterpolatedString _ -> Some PossibleBareArg + + // f (g ‸) + | SynExpr.Paren(expr = SynExpr.Ident _ | SynExpr.LongIdent _; range = parenRange) when + rangeContainsPos parenRange pos + && not (expr.Range.End.IsAdjacentTo parenRange.End) + -> + None + + | SynExpr.Paren _ -> Some PossibleBareArg + | _ -> None - SyntaxTraversal.Traverse(pos, input, visitor) + match input |> ParsedInput.tryNode pos with + | Some(FuncIdent range) -> Some range + | Some _ -> None + | None -> + // The cursor is outside any existing node's range, + // so try to drill down into the nearest one. + (pos, input) + ||> ParsedInput.tryPickLast (fun path node -> + match node, path with + | FuncIdent range -> Some range + | _ -> None) member _.GetAllArgumentsForFunctionApplicationAtPosition pos = SynExprAppLocationsImpl.getAllCurriedArgsAtPosition pos input @@ -326,242 +242,161 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, false, SynExpr.App(ExprAtomicFlag.NonAtomic, true, Ident "op_EqualsGreater", actualParamListExpr, _), actualLambdaBodyExpr, - _) -> Some(actualParamListExpr, actualLambdaBodyExpr) + range) -> Some(range, actualParamListExpr, actualLambdaBodyExpr) | _ -> None - SyntaxTraversal.Traverse( - opGreaterEqualPos, - input, - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, _, defaultTraverse, expr) = - match expr with - | SynExpr.Paren(InfixAppOfOpEqualsGreater(lambdaArgs, lambdaBody) as app, _, _, _) -> - Some(app.Range, lambdaArgs.Range, lambdaBody.Range) - | _ -> defaultTraverse expr - - member _.VisitBinding(_path, defaultTraverse, binding) = - match binding with - | SynBinding(kind = SynBindingKind.Normal; expr = InfixAppOfOpEqualsGreater(lambdaArgs, lambdaBody) as app) -> - Some(app.Range, lambdaArgs.Range, lambdaBody.Range) - | _ -> defaultTraverse binding - } - ) + (opGreaterEqualPos, input) + ||> ParsedInput.tryPick (fun _path node -> + match node with + | SyntaxNode.SynExpr(SynExpr.Paren(expr = InfixAppOfOpEqualsGreater(range, lambdaArgs, lambdaBody))) + | SyntaxNode.SynBinding(SynBinding( + kind = SynBindingKind.Normal; expr = InfixAppOfOpEqualsGreater(range, lambdaArgs, lambdaBody))) -> + Some(range, lambdaArgs.Range, lambdaBody.Range) + | _ -> None) member _.TryRangeOfStringInterpolationContainingPos pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, _, defaultTraverse, expr) = - match expr with - | SynExpr.InterpolatedString(range = range) when rangeContainsPos range pos -> Some range - | _ -> defaultTraverse expr - } - - SyntaxTraversal.Traverse(pos, input, visitor) + (pos, input) + ||> ParsedInput.tryPick (fun _path node -> + match node with + | SyntaxNode.SynExpr(SynExpr.InterpolatedString(range = range)) when rangeContainsPos range pos -> Some range + | _ -> None) member _.TryRangeOfExprInYieldOrReturn pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_path, _, defaultTraverse, expr) = - match expr with - | SynExpr.YieldOrReturn(_, expr, range) - | SynExpr.YieldOrReturnFrom(_, expr, range) when rangeContainsPos range pos -> Some expr.Range - | _ -> defaultTraverse expr - } - - SyntaxTraversal.Traverse(pos, input, visitor) + (pos, input) + ||> ParsedInput.tryPick (fun _path node -> + match node with + | SyntaxNode.SynExpr(SynExpr.YieldOrReturn(expr = expr; range = range) | SynExpr.YieldOrReturnFrom(expr = expr; range = range)) when + rangeContainsPos range pos + -> + Some expr.Range + | _ -> None) member _.TryRangeOfRecordExpressionContainingPos pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, _, defaultTraverse, expr) = - match expr with - | SynExpr.Record(_, _, _, range) when rangeContainsPos range pos -> Some range - | _ -> defaultTraverse expr - } - - SyntaxTraversal.Traverse(pos, input, visitor) + (pos, input) + ||> ParsedInput.tryPick (fun _path node -> + match node with + | SyntaxNode.SynExpr(SynExpr.Record(range = range)) when rangeContainsPos range pos -> Some range + | _ -> None) member _.TryRangeOfRefCellDereferenceContainingPos expressionPos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, _, defaultTraverse, expr) = - match expr with - | SynExpr.App(_, false, SynExpr.LongIdent(longDotId = SynLongIdent(id = [ funcIdent ])), expr, _) -> - if funcIdent.idText = "op_Dereference" && rangeContainsPos expr.Range expressionPos then - Some funcIdent.idRange - else - None - | _ -> defaultTraverse expr - } - - SyntaxTraversal.Traverse(expressionPos, input, visitor) + (expressionPos, input) + ||> ParsedInput.tryPick (fun _path node -> + let (|Ident|) (ident: Ident) = ident.idText + + match node with + | SyntaxNode.SynExpr(SynExpr.App( + isInfix = false + funcExpr = SynExpr.LongIdent(longDotId = SynLongIdent(id = [ funcIdent & Ident "op_Dereference" ])) + argExpr = argExpr)) when rangeContainsPos argExpr.Range expressionPos -> Some funcIdent.idRange + | _ -> None) member _.TryRangeOfExpressionBeingDereferencedContainingPos expressionPos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_, _, defaultTraverse, expr) = - match expr with - | SynExpr.App(_, false, SynExpr.LongIdent(longDotId = SynLongIdent(id = [ funcIdent ])), expr, _) -> - if funcIdent.idText = "op_Dereference" && rangeContainsPos expr.Range expressionPos then - Some expr.Range - else - None - | _ -> defaultTraverse expr - } - - SyntaxTraversal.Traverse(expressionPos, input, visitor) + (expressionPos, input) + ||> ParsedInput.tryPick (fun _path node -> + let (|Ident|) (ident: Ident) = ident.idText + + match node with + | SyntaxNode.SynExpr(SynExpr.App( + isInfix = false; funcExpr = SynExpr.LongIdent(longDotId = SynLongIdent(id = [ Ident "op_Dereference" ])); argExpr = argExpr)) when + rangeContainsPos argExpr.Range expressionPos + -> + Some argExpr.Range + | _ -> None) member _.TryRangeOfReturnTypeHint(symbolUseStart: pos, ?skipLambdas) = let skipLambdas = defaultArg skipLambdas true - SyntaxTraversal.Traverse( - symbolUseStart, - input, - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = defaultTraverse expr + (symbolUseStart, input) + ||> ParsedInput.tryPick (fun _path node -> + match node with + | SyntaxNode.SynBinding(SynBinding(expr = SynExpr.Lambda _)) + | SyntaxNode.SynBinding(SynBinding(expr = SynExpr.DotLambda _)) when skipLambdas -> None - override _.VisitBinding(_path, defaultTraverse, binding) = - match binding with - | SynBinding(expr = SynExpr.Lambda _) when skipLambdas -> defaultTraverse binding - | SynBinding(expr = SynExpr.DotLambda _) when skipLambdas -> defaultTraverse binding + // Skip manually type-annotated bindings + | SyntaxNode.SynBinding(SynBinding(returnInfo = Some(SynBindingReturnInfo _))) -> None - // Skip manually type-annotated bindings - | SynBinding(returnInfo = Some(SynBindingReturnInfo _)) -> defaultTraverse binding + // Let binding + | SyntaxNode.SynBinding(SynBinding(trivia = { EqualsRange = Some equalsRange }; range = range)) when + range.Start = symbolUseStart + -> + Some equalsRange.StartRange - // Let binding - | SynBinding(trivia = { EqualsRange = Some equalsRange }; range = range) when range.Start = symbolUseStart -> - Some equalsRange.StartRange + // Member binding + | SyntaxNode.SynBinding(SynBinding( + headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = _ :: ident :: _)); trivia = { EqualsRange = Some equalsRange })) when + ident.idRange.Start = symbolUseStart + -> + Some equalsRange.StartRange - // Member binding - | SynBinding( - headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = _ :: ident :: _)) - trivia = { EqualsRange = Some equalsRange }) when ident.idRange.Start = symbolUseStart -> - Some equalsRange.StartRange - - | _ -> defaultTraverse binding - } - ) + | _ -> None) member _.FindParameterLocations pos = ParameterLocations.Find(pos, input) member _.IsPositionContainedInACurriedParameter pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_path, traverseSynExpr, defaultTraverse, expr) = defaultTraverse (expr) - - override _.VisitBinding(_path, _, binding) = - match binding with - | SynBinding(valData = valData; range = range) when rangeContainsPos range pos -> - let info = valData.SynValInfo.CurriedArgInfos - let mutable found = false - - for group in info do - for arg in group do - match arg.Ident with - | Some ident when rangeContainsPos ident.idRange pos -> found <- true - | _ -> () - - if found then Some range else None - | _ -> None - } - - let result = SyntaxTraversal.Traverse(pos, input, visitor) - result.IsSome + (pos, input) + ||> ParsedInput.exists (fun _path node -> + match node with + | SyntaxNode.SynBinding(SynBinding(valData = valData; range = range)) when rangeContainsPos range pos -> + valData.SynValInfo.CurriedArgInfos + |> List.exists ( + List.exists (function + | SynArgInfo(ident = Some ident) -> rangeContainsPos ident.idRange pos + | _ -> false) + ) + + | _ -> false) member _.IsTypeAnnotationGivenAtPosition pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = - match expr with - | SynExpr.Typed(_expr, _typeExpr, range) when Position.posEq range.Start pos -> Some range - | _ -> defaultTraverse expr - - override _.VisitSimplePats(_path, pats) = - match pats with - | [] -> None - | _ -> - let exprFunc pat = - match pat with - // (s: string) - | SynSimplePat.Typed(_pat, _targetExpr, range) when Position.posEq range.Start pos -> Some range - | _ -> None - - pats |> List.tryPick exprFunc - - override _.VisitPat(_path, defaultTraverse, pat) = - // (s: string) - match pat with - | SynPat.Typed(_pat, _targetType, range) when Position.posEq range.Start pos -> Some range - | _ -> defaultTraverse pat + (pos, input) + ||> ParsedInput.exists (fun _path node -> + let rec (|Typed|_|) (pat: SynPat) = + if not (rangeContainsPos pat.Range pos) then + None + else + let (|AnyTyped|_|) = List.tryPick (|Typed|_|) - override _.VisitBinding(_path, defaultTraverse, binding) = - // let x : int = 12 - match binding with - | SynBinding( - headPat = SynPat.Named(range = patRange); returnInfo = Some(SynBindingReturnInfo(typeName = SynType.LongIdent _))) -> - Some patRange - | _ -> defaultTraverse binding - } + match pat with + | SynPat.Typed(range = range) when Position.posEq range.Start pos -> Some Typed + | SynPat.Paren(pat = Typed) -> Some Typed + | SynPat.Tuple(elementPats = AnyTyped) -> Some Typed + | _ -> None - let result = SyntaxTraversal.Traverse(pos, input, visitor) - result.IsSome + match node with + | SyntaxNode.SynExpr(SynExpr.Typed(range = range)) + | SyntaxNode.SynPat(SynPat.Typed(range = range)) -> Position.posEq range.Start pos + | SyntaxNode.SynTypeDefn(SynTypeDefn(implicitConstructor = Some(SynMemberDefn.ImplicitCtor(ctorArgs = Typed)))) + | SyntaxNode.SynBinding(SynBinding( + headPat = SynPat.Named _; returnInfo = Some(SynBindingReturnInfo(typeName = SynType.LongIdent _)))) -> true + | _ -> false) member _.IsPositionWithinTypeDefinition pos = - let visitor = - { new SyntaxVisitorBase<_>() with - override _.VisitComponentInfo(path, _) = - let typeDefs = - path - |> List.filter (function - | SyntaxNode.SynModule(SynModuleDecl.Types _) -> true - | _ -> false) - - match typeDefs with - | [] -> None - | _ -> Some true - } - - let result = SyntaxTraversal.Traverse(pos, input, visitor) - result.IsSome + (pos, input) + ||> ParsedInput.exists (fun _path node -> + match node with + | SyntaxNode.SynTypeDefn _ -> true + | _ -> false) member _.IsBindingALambdaAtPosition pos = - let visitor = - { new SyntaxVisitorBase<_>() with - member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = defaultTraverse expr - - override _.VisitBinding(_path, defaultTraverse, binding) = - match binding with - | SynBinding.SynBinding(expr = expr; range = range) when Position.posEq range.Start pos -> - match expr with - | SynExpr.Lambda _ -> Some range - | SynExpr.DotLambda _ -> Some range - | _ -> None - | _ -> defaultTraverse binding - } - - let result = SyntaxTraversal.Traverse(pos, input, visitor) - result.IsSome + (pos, input) + ||> ParsedInput.exists (fun _path node -> + match node with + | SyntaxNode.SynBinding(SynBinding(expr = SynExpr.Lambda _; range = range)) + | SyntaxNode.SynBinding(SynBinding(expr = SynExpr.DotLambda _; range = range)) -> Position.posEq range.Start pos + | _ -> false) member _.IsPositionWithinRecordDefinition pos = let isWithin left right middle = Position.posGt right left && Position.posLt middle right - let visitor = - { new SyntaxVisitorBase<_>() with - override _.VisitRecordDefn(_, _, range) = - if pos |> isWithin range.Start range.End then - Some true - else - None - - override _.VisitTypeAbbrev(_, synType, range) = - match synType with - | SynType.AnonRecd _ when pos |> isWithin range.Start range.End -> Some true - | _ -> None - } - - let result = SyntaxTraversal.Traverse(pos, input, visitor) - result.IsSome + (pos, input) + ||> ParsedInput.exists (fun _path node -> + match node with + | SyntaxNode.SynTypeDefn(SynTypeDefn(typeRepr = SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.Record _, range))) + | SyntaxNode.SynTypeDefn(SynTypeDefn(typeRepr = SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.TypeAbbrev _, range))) when + pos |> isWithin range.Start range.End + -> + true + | _ -> false) /// Get declared items and the selected item at the specified location member _.GetNavigationItemsImpl() = @@ -738,12 +573,12 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, yield! checkRange m yield! walkExpr isControlFlow innerExpr - | SynExpr.YieldOrReturn(_, e, m) -> + | SynExpr.YieldOrReturn(_, e, m, _) -> yield! checkRange m yield! walkExpr false e - | SynExpr.YieldOrReturnFrom(_, e, _) - | SynExpr.DoBang(e, _) -> + | SynExpr.YieldOrReturnFrom(_, e, _, _) + | SynExpr.DoBang(expr = e) -> yield! checkRange e.Range yield! walkExpr false e @@ -879,7 +714,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, yield! walkFinallySeqPt spFinally | SynExpr.SequentialOrImplicitYield(spSeq, e1, e2, _, _) - | SynExpr.Sequential(spSeq, _, e1, e2, _) -> + | SynExpr.Sequential(debugPoint = spSeq; expr1 = e1; expr2 = e2) -> let implicit1 = match spSeq with | DebugPointAtSequential.SuppressExpr @@ -979,10 +814,10 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | SynMemberDefn.Interface(members = Some membs) -> for m in membs do yield! walkMember m - | SynMemberDefn.Inherit(_, _, m) -> + | SynMemberDefn.Inherit(range = m) -> // can break on the "inherit" clause yield! checkRange m - | SynMemberDefn.ImplicitInherit(_, arg, _, m) -> + | SynMemberDefn.ImplicitInherit(_, arg, _, m, _) -> // can break on the "inherit" clause yield! checkRange m yield! walkExpr true arg diff --git a/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fsi b/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fsi index e892c78aa8..20fa8dafec 100644 --- a/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fsi +++ b/src/fcs-fable/src/Compiler/Service/FSharpParseFileResults.fsi @@ -47,7 +47,7 @@ type public FSharpParseFileResults = /// /// Given the position of an expression, attempts to find the range of the - /// '!' in a derefence operation of that expression, like: + /// '!' in a dereference operation of that expression, like: /// '!expr', '!(expr)', etc. /// member TryRangeOfRefCellDereferenceContainingPos: expressionPos: pos -> range option diff --git a/src/fcs-fable/src/Compiler/Service/FSharpProjectSnapshot.fs b/src/fcs-fable/src/Compiler/Service/FSharpProjectSnapshot.fs new file mode 100644 index 0000000000..fbff9619b8 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/FSharpProjectSnapshot.fs @@ -0,0 +1,713 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +module FSharp.Compiler.CodeAnalysis.ProjectSnapshot + +open System +open System.Collections.Generic +open System.IO +open System.Reflection +open FSharp.Compiler.IO +open Internal.Utilities.Library +open Internal.Utilities.Library.Extras +open FSharp.Core.Printf +open FSharp.Compiler.Text + +open Internal.Utilities.Collections +open System.Threading.Tasks +open Internal.Utilities.Hashing +open System.Collections.Immutable +open System.Runtime.CompilerServices +open FSharp.Compiler.Syntax +open FSharp.Compiler.Diagnostics +open FSharp.Compiler.DiagnosticsLogger + +type internal ProjectIdentifier = string * string + +/// A common interface for an F# source file snapshot that can be used across all stages (lazy, source loaded, parsed) +type internal IFileSnapshot = + abstract member FileName: string + abstract member Version: byte array + abstract member IsSignatureFile: bool + +[] +module internal Helpers = + + let isSignatureFile (fileName: string) = + // TODO: is this robust enough? + fileName[fileName.Length - 1] = 'i' + + let addFileName (file: IFileSnapshot) = Md5Hasher.addString file.FileName + + let addFileNameAndVersion (file: IFileSnapshot) = + addFileName file >> Md5Hasher.addBytes file.Version + + let signatureHash projectCoreVersion (sourceFiles: IFileSnapshot seq) = + let mutable lastFile = "" + + ((projectCoreVersion, Set.empty), sourceFiles) + ||> Seq.fold (fun (res, sigs) file -> + if file.IsSignatureFile then + lastFile <- file.FileName + res |> addFileNameAndVersion file, sigs |> Set.add file.FileName + else + let sigFileName = $"{file.FileName}i" + + if sigs.Contains sigFileName then + res |> addFileName file, sigs |> Set.remove sigFileName + else + lastFile <- file.FileName + res |> addFileNameAndVersion file, sigs) + |> fst, + lastFile + + let findOutputFileName options = + options + |> Seq.tryFind (fun (x: string) -> x.StartsWith("-o:")) + |> Option.map (fun x -> x.Substring(3)) + +/// A snapshot of an F# source file. +[] +type FSharpFileSnapshot(FileName: string, Version: string, GetSource: unit -> Task) = + + static member Create(fileName: string, version: string, getSource: unit -> Task) = + FSharpFileSnapshot(fileName, version, getSource) + + static member CreateFromFileSystem(fileName: string) = + FSharpFileSnapshot( + fileName, + FileSystem.GetLastWriteTimeShim(fileName).Ticks.ToString(), + fun () -> + FileSystem.OpenFileForReadShim(fileName).ReadAllText() + |> SourceTextNew.ofString + |> Task.FromResult + ) + + static member CreateFromDocumentSource(fileName: string, documentSource: DocumentSource) = + + match documentSource with + | DocumentSource.Custom f -> + let version = DateTime.Now.Ticks.ToString() + + FSharpFileSnapshot( + fileName, + version, + fun () -> + task { + match! f fileName |> Async.StartAsTask with + | Some source -> return SourceTextNew.ofISourceText source + | None -> return failwith $"Couldn't get source for file {f}" + } + ) + + | DocumentSource.FileSystem -> FSharpFileSnapshot.CreateFromFileSystem fileName + + member public _.FileName = FileName + member _.Version = Version + member _.GetSource() = GetSource() + + member val IsSignatureFile = FileName |> isSignatureFile + + member _.GetFileName() = FileName + + override this.Equals(o) = + match o with + | :? FSharpFileSnapshot as o -> o.FileName = this.FileName && o.Version = this.Version + | _ -> false + + override this.GetHashCode() = + this.FileName.GetHashCode() + this.Version.GetHashCode() + + interface IFileSnapshot with + member this.FileName = this.FileName + member this.Version = this.Version |> System.Text.Encoding.UTF8.GetBytes + member this.IsSignatureFile = this.IsSignatureFile + +/// A source file snapshot with loaded source text. +type internal FSharpFileSnapshotWithSource + (FileName: string, SourceHash: ImmutableArray, Source: ISourceTextNew, IsLastCompiland: bool, IsExe: bool) = + + let version = lazy (SourceHash.ToBuilder().ToArray()) + let stringVersion = lazy (version.Value |> BitConverter.ToString) + + member val Version = version.Value + member val StringVersion = stringVersion.Value + member val IsSignatureFile = FileName |> isSignatureFile + + member _.FileName = FileName + member _.Source = Source + member _.IsLastCompiland = IsLastCompiland + member _.IsExe = IsExe + + interface IFileSnapshot with + member this.FileName = this.FileName + member this.Version = this.Version + member this.IsSignatureFile = this.IsSignatureFile + +/// A source file snapshot with parsed syntax tree +type internal FSharpParsedFile + ( + FileName: string, + SyntaxTreeHash: byte array, + SourceText: ISourceText, + ParsedInput: ParsedInput, + ParseDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity)[] + ) = + + member _.FileName = FileName + member _.SourceText = SourceText + member _.ParsedInput = ParsedInput + member _.ParseDiagnostics = ParseDiagnostics + + member val IsSignatureFile = FileName |> isSignatureFile + + interface IFileSnapshot with + member this.FileName = this.FileName + member this.Version = SyntaxTreeHash + member this.IsSignatureFile = this.IsSignatureFile + +/// An on-disk reference needed for project compilation. +[] +type ReferenceOnDisk = + { Path: string; LastModified: DateTime } + +/// A snapshot of an F# project. The source file type can differ based on which stage of compilation the snapshot is used for. +type internal ProjectSnapshotBase<'T when 'T :> IFileSnapshot>(projectCore: ProjectCore, sourceFiles: 'T list) = + + let noFileVersionsHash = + lazy + (projectCore.Version + |> Md5Hasher.addStrings (sourceFiles |> Seq.map (fun x -> x.FileName))) + + let noFileVersionsKey = + lazy + ({ new ICacheKey<_, _> with + member _.GetLabel() = projectCore.Label + member _.GetKey() = projectCore.Identifier + + member _.GetVersion() = + noFileVersionsHash.Value |> Md5Hasher.toString + + }) + + let fullHash = + lazy + (projectCore.Version + |> Md5Hasher.addStrings ( + sourceFiles + |> Seq.collect (fun x -> + seq { + x.FileName + x.Version |> Md5Hasher.toString + }) + )) + + let fullKey = + lazy + ({ new ICacheKey<_, _> with + member _.GetLabel() = projectCore.Label + member _.GetKey() = projectCore.Identifier + member _.GetVersion() = fullHash.Value |> Md5Hasher.toString + }) + + let addHash (file: 'T) hash = + hash |> Md5Hasher.addString file.FileName |> Md5Hasher.addBytes file.Version + + let signatureHash = + lazy (signatureHash projectCore.Version (sourceFiles |> Seq.map (fun x -> x :> IFileSnapshot))) + + let signatureKey = + lazy (projectCore.CacheKeyWith("Signature", signatureHash.Value |> fst |> Md5Hasher.toString)) + + let lastFileHash = + lazy + (let lastFile = sourceFiles |> List.last + let sigHash, f = signatureHash.Value + + (if f = lastFile.FileName then + sigHash + else + sigHash |> Md5Hasher.addBytes lastFile.Version), + lastFile) + + let lastFileKey = + lazy + (let hash, f = lastFileHash.Value + + { new ICacheKey<_, _> with + member _.GetLabel() = $"{f.FileName} ({projectCore.Label})" + member _.GetKey() = f.FileName, projectCore.Identifier + member _.GetVersion() = hash |> Md5Hasher.toString + }) + + let sourceFileNames = lazy (sourceFiles |> List.map (fun x -> x.FileName)) + + member _.ProjectFileName = projectCore.ProjectFileName + member _.ProjectId = projectCore.ProjectId + member _.Identifier = projectCore.Identifier + member _.ReferencesOnDisk = projectCore.ReferencesOnDisk + member _.OtherOptions = projectCore.OtherOptions + member _.ReferencedProjects = projectCore.ReferencedProjects + + member _.IsIncompleteTypeCheckEnvironment = + projectCore.IsIncompleteTypeCheckEnvironment + + member _.UseScriptResolutionRules = projectCore.UseScriptResolutionRules + member _.LoadTime = projectCore.LoadTime + member _.UnresolvedReferences = projectCore.UnresolvedReferences + member _.OriginalLoadReferences = projectCore.OriginalLoadReferences + member _.Stamp = projectCore.Stamp + member _.CommandLineOptions = projectCore.CommandLineOptions + member _.ProjectDirectory = projectCore.ProjectDirectory + + member _.OutputFileName = projectCore.OutputFileName + + member _.ProjectCore = projectCore + + member _.SourceFiles = sourceFiles + + member _.SourceFileNames = sourceFileNames.Value + + member _.Label = projectCore.Label + + member _.IndexOf fileName = + sourceFiles + |> List.tryFindIndex (fun x -> x.FileName = fileName) + |> Option.defaultWith (fun () -> failwith (sprintf "Unable to find file %s in project %s" fileName projectCore.ProjectFileName)) + + member private _.With(sourceFiles: 'T list) = + ProjectSnapshotBase(projectCore, sourceFiles) + + /// Create a new snapshot with given source files replacing files in this snapshot with the same name. Other files remain unchanged. + member this.Replace(changedSourceFiles: 'T list) = + // TODO: validate if changed files are not present in the original list? + + let sourceFiles = + sourceFiles + |> List.map (fun x -> + match changedSourceFiles |> List.tryFind (fun y -> y.FileName = x.FileName) with + | Some y -> y + | None -> x) + + this.With sourceFiles + + /// Create a new snapshot with source files only up to the given index (inclusive) + member this.UpTo fileIndex = this.With sourceFiles[..fileIndex] + + /// Create a new snapshot with source files only up to the given file name (inclusive) + member this.UpTo fileName = this.UpTo(this.IndexOf fileName) + + /// Create a new snapshot with only source files at the given indexes + member this.OnlyWith fileIndexes = + this.With( + fileIndexes + |> Set.toList + |> List.sort + |> List.choose (fun x -> sourceFiles |> List.tryItem x) + ) + + override this.ToString() = + Path.GetFileNameWithoutExtension this.ProjectFileName + |> sprintf "FSharpProjectSnapshot(%s)" + + /// The newest last modified time of any file in this snapshot including the project file + member _.GetLastModifiedTimeOnDisk() = + seq { + projectCore.ProjectFileName + + yield! + sourceFiles + |> Seq.filter (fun x -> not (x.FileName.EndsWith(".AssemblyInfo.fs"))) // TODO: is this safe? any better way of doing this? + |> Seq.filter (fun x -> not (x.FileName.EndsWith(".AssemblyAttributes.fs"))) + |> Seq.map (fun x -> x.FileName) + } + |> Seq.map FileSystem.GetLastWriteTimeShim + |> Seq.max + + member _.FullVersion = fullHash.Value + member _.SignatureVersion = signatureHash.Value |> fst + member _.LastFileVersion = lastFileHash.Value |> fst + + /// Version for parsing - doesn't include any references because they don't affect parsing (...right?) + member _.ParsingVersion = projectCore.VersionForParsing |> Md5Hasher.toString + + /// A key for this snapshot but without file versions. So it will be the same across any in-file changes. + member _.NoFileVersionsKey = noFileVersionsKey.Value + + /// A full key for this snapshot, any change will cause this to change. + member _.FullKey = fullKey.Value + + /// A key including the public surface or signature for this snapshot + member _.SignatureKey = signatureKey.Value + + /// A key including the public surface or signature for this snapshot and the last file (even if it's not a signature file) + member _.LastFileKey = lastFileKey.Value + + //TODO: cache it here? + member this.FileKey(fileName: string) = this.UpTo(fileName).LastFileKey + member this.FileKey(index: FileIndex) = this.UpTo(index).LastFileKey + + member this.FileKeyWithExtraFileSnapshotVersion(fileName: string) = + let fileKey = this.FileKey fileName + let fileSnapshot = this.SourceFiles |> Seq.find (fun f -> f.FileName = fileName) + + fileKey.WithExtraVersion(fileSnapshot.Version |> Md5Hasher.toString) + +/// Project snapshot with filenames and versions given as initial input +and internal ProjectSnapshot = ProjectSnapshotBase + +/// Project snapshot with file sources loaded +and internal ProjectSnapshotWithSources = ProjectSnapshotBase + +/// All required information for compiling a project except the source files. It's kept separate so it can be reused +/// for different stages of a project snapshot and also between changes to the source files. +and internal ProjectCore + ( + ProjectFileName: string, + ProjectId: string option, + ReferencesOnDisk: ReferenceOnDisk list, + OtherOptions: string list, + ReferencedProjects: FSharpReferencedProjectSnapshot list, + IsIncompleteTypeCheckEnvironment: bool, + UseScriptResolutionRules: bool, + LoadTime: DateTime, + UnresolvedReferences: FSharpUnresolvedReferencesSet option, + OriginalLoadReferences: (range * string * string) list, + Stamp: int64 option + ) as self = + + let hashForParsing = + lazy + (Md5Hasher.empty + |> Md5Hasher.addString ProjectFileName + |> Md5Hasher.addStrings OtherOptions + |> Md5Hasher.addBool IsIncompleteTypeCheckEnvironment + |> Md5Hasher.addBool UseScriptResolutionRules) + + let fullHash = + lazy + (hashForParsing.Value + |> Md5Hasher.addStrings (ReferencesOnDisk |> Seq.map (fun r -> r.Path)) + |> Md5Hasher.addDateTimes (ReferencesOnDisk |> Seq.map (fun r -> r.LastModified)) + |> Md5Hasher.addBytes' ( + ReferencedProjects + |> Seq.map (function + | FSharpReference(_name, p) -> p.ProjectSnapshot.SignatureVersion + | PEReference(getStamp, _) -> Md5Hasher.empty |> Md5Hasher.addDateTime (getStamp ()) + | ILModuleReference(_name, getStamp, _) -> Md5Hasher.empty |> Md5Hasher.addDateTime (getStamp ())) + )) + + let fullHashString = lazy (fullHash.Value |> Md5Hasher.toString) + + let commandLineOptions = + lazy + (seq { + yield! OtherOptions + + for r in ReferencesOnDisk do + $"-r:{r.Path}" + } + |> Seq.toList) + + let outputFileName = lazy (OtherOptions |> findOutputFileName) + + let key = lazy (ProjectFileName, outputFileName.Value |> Option.defaultValue "") + + let cacheKey = + lazy + ({ new ICacheKey<_, _> with + member _.GetLabel() = self.Label + member _.GetKey() = self.Identifier + member _.GetVersion() = fullHashString.Value + }) + + member val ProjectDirectory = !! Path.GetDirectoryName(ProjectFileName) + member _.OutputFileName = outputFileName.Value + member _.Identifier: ProjectIdentifier = key.Value + member _.Version = fullHash.Value + member _.Label = ProjectFileName |> shortPath + member _.VersionForParsing = hashForParsing.Value + + member _.CommandLineOptions = commandLineOptions.Value + + member _.ProjectFileName = ProjectFileName + member _.ProjectId = ProjectId + member _.ReferencesOnDisk = ReferencesOnDisk + member _.OtherOptions = OtherOptions + member _.ReferencedProjects = ReferencedProjects + member _.IsIncompleteTypeCheckEnvironment = IsIncompleteTypeCheckEnvironment + member _.UseScriptResolutionRules = UseScriptResolutionRules + member _.LoadTime = LoadTime + member _.UnresolvedReferences = UnresolvedReferences + member _.OriginalLoadReferences = OriginalLoadReferences + member _.Stamp = Stamp + + member _.CacheKeyWith(label, version) = + { new ICacheKey<_, _> with + member _.GetLabel() = $"{label} ({self.Label})" + member _.GetKey() = self.Identifier + member _.GetVersion() = fullHashString.Value, version + } + + member _.CacheKeyWith(label, key, version) = + { new ICacheKey<_, _> with + member _.GetLabel() = $"{label} ({self.Label})" + member _.GetKey() = key, self.Identifier + member _.GetVersion() = fullHashString.Value, version + } + + member _.CacheKey = cacheKey.Value + +and [] FSharpReferencedProjectSnapshot = + /// + /// A reference to an F# project. The physical data for it is stored/cached inside of the compiler service. + /// + /// The fully qualified path to the output of the referenced project. This should be the same value as the -r reference in the project options for this referenced project. + /// Snapshot of the referenced F# project + | FSharpReference of projectOutputFile: string * snapshot: FSharpProjectSnapshot + /// + /// A reference to any portable executable, including F#. The stream is owned by this reference. + /// The stream will be automatically disposed when there are no references to FSharpReferencedProject and is GC collected. + /// Once the stream is evaluated, the function that constructs the stream will no longer be referenced by anything. + /// If the stream evaluation throws an exception, it will be automatically handled. + /// + /// A function that calculates a last-modified timestamp for this reference. This will be used to determine if the reference is up-to-date. + /// A function that opens a Portable Executable data stream for reading. + | PEReference of getStamp: (unit -> DateTime) * delayedReader: DelayedILModuleReader + + /// + /// A reference to an ILModuleReader. + /// + /// The fully qualified path to the output of the referenced project. This should be the same value as the -r reference in the project options for this referenced project. + /// A function that calculates a last-modified timestamp for this reference. This will be used to determine if the reference is up-to-date. + /// A function that creates an ILModuleReader for reading module data. + | ILModuleReference of + projectOutputFile: string * + getStamp: (unit -> DateTime) * + getReader: (unit -> FSharp.Compiler.AbstractIL.ILBinaryReader.ILModuleReader) + + /// + /// The fully qualified path to the output of the referenced project. This should be the same value as the -r + /// reference in the project options for this referenced project. + /// + member this.OutputFile = + match this with + | FSharpReference(projectOutputFile = projectOutputFile) + | ILModuleReference(projectOutputFile = projectOutputFile) -> projectOutputFile + | PEReference(delayedReader = reader) -> reader.OutputFile + + /// + /// Creates a reference for an F# project. The physical data for it is stored/cached inside of the compiler service. + /// + /// The fully qualified path to the output of the referenced project. This should be the same value as the -r reference in the project options for this referenced project. + /// The project snapshot for this F# project + static member CreateFSharp(projectOutputFile, snapshot: FSharpProjectSnapshot) = + FSharpReference(projectOutputFile, snapshot) + + override this.Equals(o) = + match o with + | :? FSharpReferencedProjectSnapshot as o -> + match this, o with + | FSharpReference(projectOutputFile1, options1), FSharpReference(projectOutputFile2, options2) -> + projectOutputFile1 = projectOutputFile2 && options1 = options2 + | PEReference(getStamp1, reader1), PEReference(getStamp2, reader2) -> + reader1.OutputFile = reader2.OutputFile && (getStamp1 ()) = (getStamp2 ()) + | ILModuleReference(projectOutputFile1, getStamp1, _), ILModuleReference(projectOutputFile2, getStamp2, _) -> + projectOutputFile1 = projectOutputFile2 && (getStamp1 ()) = (getStamp2 ()) + | _ -> false + + | _ -> false + + override this.GetHashCode() = this.OutputFile.GetHashCode() + +/// An identifier of an F# project. This serves to identify the same project as it changes over time and enables us to clear obsolete data from caches. +and [] FSharpProjectIdentifier = + | FSharpProjectIdentifier of projectFileName: string * outputFileName: string + +/// A snapshot of an F# project. This type contains all the necessary information for type checking a project. +and [] FSharpProjectSnapshot internal (projectSnapshot) = + + member internal _.ProjectSnapshot: ProjectSnapshot = projectSnapshot + + /// Create a new snapshot with given source files replacing files in this snapshot with the same name. Other files remain unchanged. + member _.Replace(changedSourceFiles: FSharpFileSnapshot list) = + projectSnapshot.Replace(changedSourceFiles) |> FSharpProjectSnapshot + + member _.Label = projectSnapshot.Label + member _.Identifier = FSharpProjectIdentifier projectSnapshot.ProjectCore.Identifier + member _.ProjectFileName = projectSnapshot.ProjectFileName + member _.ProjectId = projectSnapshot.ProjectId + member _.SourceFiles = projectSnapshot.SourceFiles + member _.ReferencesOnDisk = projectSnapshot.ReferencesOnDisk + member _.OtherOptions = projectSnapshot.OtherOptions + member _.ReferencedProjects = projectSnapshot.ReferencedProjects + + member _.IsIncompleteTypeCheckEnvironment = + projectSnapshot.IsIncompleteTypeCheckEnvironment + + member _.UseScriptResolutionRules = projectSnapshot.UseScriptResolutionRules + member _.LoadTime = projectSnapshot.LoadTime + member _.UnresolvedReferences = projectSnapshot.UnresolvedReferences + member _.OriginalLoadReferences = projectSnapshot.OriginalLoadReferences + member _.Stamp = projectSnapshot.Stamp + + static member Create + ( + projectFileName: string, + projectId: string option, + sourceFiles: FSharpFileSnapshot list, + referencesOnDisk: ReferenceOnDisk list, + otherOptions: string list, + referencedProjects: FSharpReferencedProjectSnapshot list, + isIncompleteTypeCheckEnvironment: bool, + useScriptResolutionRules: bool, + loadTime: DateTime, + unresolvedReferences: FSharpUnresolvedReferencesSet option, + originalLoadReferences: (range * string * string) list, + stamp: int64 option + ) = + + let projectCore = + ProjectCore( + projectFileName, + projectId, + referencesOnDisk, + otherOptions, + referencedProjects, + isIncompleteTypeCheckEnvironment, + useScriptResolutionRules, + loadTime, + unresolvedReferences, + originalLoadReferences, + stamp + ) + + ProjectSnapshotBase(projectCore, sourceFiles) |> FSharpProjectSnapshot + + static member FromOptions(options: FSharpProjectOptions, getFileSnapshot, ?snapshotAccumulator) = + let snapshotAccumulator = defaultArg snapshotAccumulator (Dictionary()) + + async { + + // TODO: check if options is a good key here + if not (snapshotAccumulator.ContainsKey options) then + + let! sourceFiles = + options.SourceFiles + |> Seq.map (getFileSnapshot options) + |> MultipleDiagnosticsLoggers.Parallel + + let! referencedProjects = + options.ReferencedProjects + |> Seq.map (function + | FSharpReferencedProject.FSharpReference(outputName, options) -> + async { + let! snapshot = FSharpProjectSnapshot.FromOptions(options, getFileSnapshot, snapshotAccumulator) + + return FSharpReferencedProjectSnapshot.FSharpReference(outputName, snapshot) + } + | FSharpReferencedProject.PEReference(getStamp, reader) -> + async.Return <| FSharpReferencedProjectSnapshot.PEReference(getStamp, reader) + | FSharpReferencedProject.ILModuleReference(outputName, getStamp, getReader) -> + async.Return + <| FSharpReferencedProjectSnapshot.ILModuleReference(outputName, getStamp, getReader)) + + |> MultipleDiagnosticsLoggers.Sequential + + let referencesOnDisk, otherOptions = + options.OtherOptions + |> Array.partition (fun x -> x.StartsWith("-r:")) + |> map1Of2 ( + Array.map (fun x -> + let path = x.Substring(3) + + { + Path = path + LastModified = FileSystem.GetLastWriteTimeShim(path) + }) + ) + + let snapshot = + FSharpProjectSnapshot.Create( + projectFileName = options.ProjectFileName, + projectId = options.ProjectId, + sourceFiles = (sourceFiles |> List.ofArray), + referencesOnDisk = (referencesOnDisk |> List.ofArray), + otherOptions = (otherOptions |> List.ofArray), + referencedProjects = (referencedProjects |> List.ofArray), + isIncompleteTypeCheckEnvironment = options.IsIncompleteTypeCheckEnvironment, + useScriptResolutionRules = options.UseScriptResolutionRules, + loadTime = options.LoadTime, + unresolvedReferences = options.UnresolvedReferences, + originalLoadReferences = options.OriginalLoadReferences, + stamp = options.Stamp + ) + + snapshotAccumulator.Add(options, snapshot) + + return snapshotAccumulator[options] + } + + static member FromOptions(options: FSharpProjectOptions, documentSource: DocumentSource) = + FSharpProjectSnapshot.FromOptions( + options, + fun _ fileName -> + FSharpFileSnapshot.CreateFromDocumentSource(fileName, documentSource) + |> async.Return + ) + + static member FromOptions + ( + options: FSharpProjectOptions, + fileName: string, + fileVersion: int, + sourceText: ISourceText, + documentSource: DocumentSource + ) = + + let getFileSnapshot _ fName = + if fName = fileName then + FSharpFileSnapshot.Create( + fileName, + $"{fileVersion}{sourceText.GetHashCode().ToString()}", + fun () -> Task.FromResult(SourceTextNew.ofISourceText sourceText) + ) + else + FSharpFileSnapshot.CreateFromDocumentSource(fName, documentSource) + |> async.Return + + FSharpProjectSnapshot.FromOptions(options, getFileSnapshot) + +let rec internal snapshotToOptions (projectSnapshot: ProjectSnapshotBase<_>) = + { + ProjectFileName = projectSnapshot.ProjectFileName + ProjectId = projectSnapshot.ProjectId + SourceFiles = projectSnapshot.SourceFiles |> Seq.map (fun x -> x.FileName) |> Seq.toArray + OtherOptions = projectSnapshot.CommandLineOptions |> List.toArray + ReferencedProjects = + projectSnapshot.ReferencedProjects + |> Seq.map (function + | FSharpReference(name, opts) -> FSharpReferencedProject.FSharpReference(name, opts.ProjectSnapshot |> snapshotToOptions) + | PEReference(getStamp, reader) -> FSharpReferencedProject.PEReference(getStamp, reader) + | ILModuleReference(name, getStamp, getReader) -> FSharpReferencedProject.ILModuleReference(name, getStamp, getReader)) + |> Seq.toArray + IsIncompleteTypeCheckEnvironment = projectSnapshot.IsIncompleteTypeCheckEnvironment + UseScriptResolutionRules = projectSnapshot.UseScriptResolutionRules + LoadTime = projectSnapshot.LoadTime + UnresolvedReferences = projectSnapshot.UnresolvedReferences + OriginalLoadReferences = projectSnapshot.OriginalLoadReferences + Stamp = projectSnapshot.Stamp + } + +[] +type internal Extensions = + + [] + static member ToOptions(this: ProjectSnapshot) = this |> snapshotToOptions + + [] + static member ToOptions(this: FSharpProjectSnapshot) = + this.ProjectSnapshot |> snapshotToOptions + + [] + static member GetProjectIdentifier(this: FSharpProjectOptions) : ProjectIdentifier = + this.ProjectFileName, this.OtherOptions |> findOutputFileName |> Option.defaultValue "" diff --git a/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fs b/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fs index 4f63d5be23..1814573d16 100644 --- a/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fs +++ b/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fs @@ -152,22 +152,22 @@ module IncrementalBuildSyntaxTree = ), sourceRange, fileName, [||] let parse (source: FSharpSource) = - node { + async { IncrementalBuilderEventTesting.MRU.Add(IncrementalBuilderEventTesting.IBEParsed fileName) use _ = Activity.start "IncrementalBuildSyntaxTree.parse" [| Activity.Tags.fileName, fileName - Activity.Tags.buildPhase, BuildPhase.Parse.ToString() + Activity.Tags.buildPhase, !! BuildPhase.Parse.ToString() |] try let diagnosticsLogger = CompilationDiagnosticLogger("Parse", tcConfig.diagnosticsOptions) // Return the disposable object that cleans up use _holder = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.Parse) - use! text = source.GetTextContainer() |> NodeCode.AwaitAsync + use! text = source.GetTextContainer() let input = - match text :?> TextContainer with + match text with | TextContainer.Stream(stream) -> ParseOneInputStream(tcConfig, lexResourceManager, fileName, isLastCompiland, diagnosticsLogger, false, stream) | TextContainer.SourceText(sourceText) -> @@ -268,8 +268,8 @@ type BoundModel private ( ?tcStateOpt: GraphNode * GraphNode ) = - let getTypeCheck (syntaxTree: SyntaxTree) : NodeCode = - node { + let getTypeCheck (syntaxTree: SyntaxTree) : Async = + async { let! input, _sourceRange, fileName, parseErrors = syntaxTree.ParseNode.GetOrComputeValue() use _ = Activity.start "BoundModel.TypeCheck" [|Activity.Tags.fileName, fileName|] @@ -280,7 +280,7 @@ type BoundModel private ( beforeFileChecked.Trigger fileName - ApplyMetaCommandsFromInputToTcConfig (tcConfig, input, Path.GetDirectoryName fileName, tcImports.DependencyProvider) |> ignore + ApplyMetaCommandsFromInputToTcConfig (tcConfig, input, !! Path.GetDirectoryName(fileName), tcImports.DependencyProvider) |> ignore let sink = TcResultsSinkImpl(tcGlobals) let hadParseErrors = not (Array.isEmpty parseErrors) let input, moduleNamesDict = DeduplicateParsedInputModuleName prevTcInfo.moduleNamesDict input @@ -293,7 +293,7 @@ type BoundModel private ( None, TcResultsSink.WithSink sink, prevTcInfo.tcState, input ) - |> NodeCode.FromCancellable + |> Cancellable.toAsync fileChecked.Trigger fileName @@ -319,7 +319,7 @@ type BoundModel private ( return tcInfo, sink, implFile, fileName, newErrors } - let skippedImplemetationTypeCheck = + let skippedImplementationTypeCheck = match syntaxTreeOpt, prevTcInfo.sigNameOpt with | Some syntaxTree, Some (_, qualifiedName) when syntaxTree.HasSignature -> let input, _, fileName, _ = syntaxTree.Skip qualifiedName @@ -338,13 +338,13 @@ type BoundModel private ( | _ -> None let getTcInfo (typeCheck: GraphNode) = - node { + async { let! tcInfo , _, _, _, _ = typeCheck.GetOrComputeValue() return tcInfo } |> GraphNode let getTcInfoExtras (typeCheck: GraphNode) = - node { + async { let! _ , sink, implFile, fileName, _ = typeCheck.GetOrComputeValue() // Build symbol keys let itemKeyStore, semanticClassification = @@ -382,17 +382,17 @@ type BoundModel private ( } } |> GraphNode - let defaultTypeCheck = node { return prevTcInfo, TcResultsSinkImpl(tcGlobals), None, "default typecheck - no syntaxTree", [||] } + let defaultTypeCheck = async { return prevTcInfo, TcResultsSinkImpl(tcGlobals), None, "default typecheck - no syntaxTree", [||] } let typeCheckNode = syntaxTreeOpt |> Option.map getTypeCheck |> Option.defaultValue defaultTypeCheck |> GraphNode let tcInfoExtras = getTcInfoExtras typeCheckNode let diagnostics = - node { + async { let! _, _, _, _, diags = typeCheckNode.GetOrComputeValue() return diags } |> GraphNode let startComputingFullTypeCheck = - node { + async { let! _ = tcInfoExtras.GetOrComputeValue() return! diagnostics.GetOrComputeValue() } @@ -401,13 +401,13 @@ type BoundModel private ( match tcStateOpt with | Some tcState -> tcState | _ -> - match skippedImplemetationTypeCheck with + match skippedImplementationTypeCheck with | Some tcInfo -> // For skipped implementation sources do full type check only when requested. GraphNode.FromResult tcInfo, tcInfoExtras | _ -> // start computing extras, so that typeCheckNode can be GC'd quickly - startComputingFullTypeCheck |> Async.AwaitNodeCode |> Async.Catch |> Async.Ignore |> Async.Start + startComputingFullTypeCheck |> Async.Catch |> Async.Ignore |> Async.Start getTcInfo typeCheckNode, tcInfoExtras member val Diagnostics = diagnostics @@ -433,13 +433,13 @@ type BoundModel private ( member this.GetOrComputeTcInfoExtras = this.TcInfoExtras.GetOrComputeValue - member this.GetOrComputeTcInfoWithExtras() = node { + member this.GetOrComputeTcInfoWithExtras() = async { let! tcInfo = this.TcInfo.GetOrComputeValue() let! tcInfoExtras = this.TcInfoExtras.GetOrComputeValue() return tcInfo, tcInfoExtras } - member this.Next(syntaxTree) = node { + member this.Next(syntaxTree) = async { let! tcInfo = this.TcInfo.GetOrComputeValue() return BoundModel( @@ -458,7 +458,7 @@ type BoundModel private ( } member this.Finish(finalTcDiagnosticsRev, finalTopAttribs) = - node { + async { let! tcInfo = this.TcInfo.GetOrComputeValue() let finishState = { tcInfo with tcDiagnosticsRev = finalTcDiagnosticsRev; topAttribs = finalTopAttribs } return @@ -501,10 +501,19 @@ type BoundModel private ( syntaxTreeOpt ) - /// Global service state -type FrameworkImportsCacheKey = FrameworkImportsCacheKey of resolvedpath: string list * assemblyName: string * targetFrameworkDirectories: string list * fsharpBinaries: string * langVersion: decimal +type FrameworkImportsCacheKey = + | FrameworkImportsCacheKey of resolvedpath: string list * assemblyName: string * targetFrameworkDirectories: string list * fsharpBinaries: string * langVersion: decimal * checkNulls: bool + + interface ICacheKey with + member this.GetKey() = + this |> function FrameworkImportsCacheKey(assemblyName=a;checkNulls=c) -> if c then a + "CheckNulls" else a + + member this.GetLabel() = + this |> function FrameworkImportsCacheKey(assemblyName=a;checkNulls=c) -> if c then a + "CheckNulls" else a + member this.GetVersion() = this + /// Represents a cache of 'framework' references that can be shared between multiple incremental builds type FrameworkImportsCache(size) = @@ -514,10 +523,12 @@ type FrameworkImportsCache(size) = let frameworkTcImportsCache = AgedLookup>(size, areSimilar=(fun (x, y) -> x = y)) /// Reduce the size of the cache in low-memory scenarios - member _.Downsize() = frameworkTcImportsCache.Resize(AnyCallerThread, newKeepStrongly=0) + member _.Downsize() = lock gate <| fun () -> + frameworkTcImportsCache.Resize(AnyCallerThread, newKeepStrongly=0) /// Clear the cache - member _.Clear() = frameworkTcImportsCache.Clear AnyCallerThread + member _.Clear() = lock gate <| fun () -> + frameworkTcImportsCache.Clear AnyCallerThread /// This function strips the "System" assemblies from the tcConfig and returns a age-cached TcImports for them. member _.GetNode(tcConfig: TcConfig, frameworkDLLs: AssemblyResolution list, nonFrameworkResolutions: AssemblyResolution list) = @@ -536,14 +547,15 @@ type FrameworkImportsCache(size) = tcConfig.primaryAssembly.Name, tcConfig.GetTargetFrameworkDirectories(), tcConfig.fsharpBinariesDir, - tcConfig.langVersion.SpecifiedVersion) + tcConfig.langVersion.SpecifiedVersion, + tcConfig.checkNullness) let node = lock gate (fun () -> match frameworkTcImportsCache.TryGet (AnyCallerThread, key) with | Some lazyWork -> lazyWork | None -> - let lazyWork = GraphNode(node { + let lazyWork = GraphNode(async { let tcConfigP = TcConfigProvider.Constant tcConfig return! TcImports.BuildFrameworkTcImports (tcConfigP, frameworkDLLs, nonFrameworkResolutions) }) @@ -551,15 +563,43 @@ type FrameworkImportsCache(size) = lazyWork ) node - + /// This function strips the "System" assemblies from the tcConfig and returns a age-cached TcImports for them. member this.Get(tcConfig: TcConfig) = - node { + async { // Split into installed and not installed. let frameworkDLLs, nonFrameworkResolutions, unresolved = TcAssemblyResolutions.SplitNonFoundationalResolutions(tcConfig) let node = this.GetNode(tcConfig, frameworkDLLs, nonFrameworkResolutions) let! tcGlobals, frameworkTcImports = node.GetOrComputeValue() + + // If the tcGlobals was loaded from a different project, langVersion and realsig may be different + // for each cached project. So here we create a new tcGlobals, with the existing framework values + // and updated realsig and langversion + let tcGlobals = + if tcGlobals.langVersion.SpecifiedVersion <> tcConfig.langVersion.SpecifiedVersion + || tcGlobals.realsig <> tcConfig.realsig then + TcGlobals( + tcGlobals.compilingFSharpCore, + tcGlobals.ilg, + tcGlobals.fslibCcu, + tcGlobals.directoryToResolveRelativePaths, + tcGlobals.mlCompatibility, + tcGlobals.isInteractive, + tcGlobals.checkNullness, + tcGlobals.useReflectionFreeCodeGen, + tcGlobals.tryFindSysTypeCcuHelper, + tcGlobals.emitDebugInfoInQuotations, + tcGlobals.noDebugAttributes, + tcGlobals.pathMap, + tcConfig.langVersion, + tcConfig.realsig, + tcConfig.compilationMode + ) + + else + tcGlobals + return tcGlobals, frameworkTcImports, nonFrameworkResolutions, unresolved } @@ -586,13 +626,13 @@ type PartialCheckResults (boundModel: BoundModel, timeStamp: DateTime, projectTi member _.GetOrComputeTcInfoWithExtras() = boundModel.GetOrComputeTcInfoWithExtras() member _.GetOrComputeItemKeyStoreIfEnabled() = - node { + async { let! info = boundModel.GetOrComputeTcInfoExtras() return info.itemKeyStore } member _.GetOrComputeSemanticClassificationIfEnabled() = - node { + async { let! info = boundModel.GetOrComputeTcInfoExtras() return info.semanticClassificationKeyStore } @@ -609,15 +649,14 @@ module Utilities = /// Constructs the build data (IRawFSharpAssemblyData) representing the assembly when used /// as a cross-assembly reference. Note the assembly has not been generated on disk, so this is /// a virtualized view of the assembly contents as computed by background checking. +[] type RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, generatedCcu: CcuThunk, outfile, topAttrs, assemblyName, ilAssemRef) = let exportRemapping = MakeExportRemapping generatedCcu generatedCcu.Contents let sigData = let _sigDataAttributes, sigDataResources = EncodeSignatureData(tcConfig, tcGlobals, exportRemapping, generatedCcu, outfile, true) - [ for r in sigDataResources do - GetResourceNameAndSignatureDataFunc r - ] + GetResourceNameAndSignatureDataFuncs sigDataResources let autoOpenAttrs = topAttrs.assemblyAttrs |> List.choose (List.singleton >> TryFindFSharpStringAttribute tcGlobals tcGlobals.attrib_AutoOpenAttribute) @@ -664,14 +703,14 @@ module IncrementalBuilderHelpers = #if !NO_TYPEPROVIDERS ,importsInvalidatedByTypeProvider: Event #endif - ) : NodeCode = + ) : Async = - node { + async { let diagnosticsLogger = CompilationDiagnosticLogger("CombineImportedAssembliesTask", tcConfig.diagnosticsOptions) use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.Parameter) let! tcImports = - node { + async { try let! tcImports = TcImports.BuildNonFrameworkTcImports(tcConfigP, frameworkTcImports, nonFrameworkResolutions, unresolvedReferences, dependencyProvider) #if !NO_TYPEPROVIDERS @@ -742,28 +781,28 @@ module IncrementalBuilderHelpers = /// Finish up the typechecking to produce outputs for the rest of the compilation process let FinalizeTypeCheckTask (tcConfig: TcConfig) tcGlobals partialCheck assemblyName outfile (boundModels: GraphNode seq) = - node { + async { let diagnosticsLogger = CompilationDiagnosticLogger("FinalizeTypeCheckTask", tcConfig.diagnosticsOptions) use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.TypeCheck) - let! computedBoundModels = boundModels |> Seq.map (fun g -> g.GetOrComputeValue()) |> NodeCode.Sequential + let! computedBoundModels = boundModels |> Seq.map (fun g -> g.GetOrComputeValue()) |> MultipleDiagnosticsLoggers.Sequential let! tcInfos = computedBoundModels - |> Seq.map (fun boundModel -> node { return! boundModel.GetOrComputeTcInfo() }) - |> NodeCode.Sequential + |> Seq.map (fun boundModel -> async { return! boundModel.GetOrComputeTcInfo() }) + |> MultipleDiagnosticsLoggers.Sequential // tcInfoExtras can be computed in parallel. This will check any previously skipped implementation files in parallel, too. let! latestImplFiles = computedBoundModels - |> Seq.map (fun boundModel -> node { + |> Seq.map (fun boundModel -> async { if partialCheck then return None else let! tcInfoExtras = boundModel.GetOrComputeTcInfoExtras() return tcInfoExtras.latestImplFile }) - |> NodeCode.Parallel + |> MultipleDiagnosticsLoggers.Parallel let results = [ for tcInfo, latestImplFile in Seq.zip tcInfos latestImplFiles -> @@ -807,12 +846,12 @@ module IncrementalBuilderHelpers = let tcAssemblyDataOpt = try - // Assemblies containing type provider components can not successfully be used via cross-assembly references. + // Assemblies containing type provider components cannot successfully be used via cross-assembly references. // We return 'None' for the assembly portion of the cross-assembly reference let hasTypeProviderAssemblyAttrib = topAttrs.assemblyAttrs |> List.exists (fun (Attrib(tcref, _, _, _, _, _, _)) -> let nm = tcref.CompiledRepresentationForNamedType.BasicQualifiedName - nm = typeof.FullName) + nm = !! typeof.FullName) if tcState.CreatesGeneratedProvidedTypes || hasTypeProviderAssemblyAttrib then ProjectAssemblyDataResult.Unavailable true @@ -832,7 +871,7 @@ module IncrementalBuilderHelpers = let! partialDiagnostics = computedBoundModels |> Seq.map (fun m -> m.Diagnostics.GetOrComputeValue()) - |> NodeCode.Parallel + |> MultipleDiagnosticsLoggers.Parallel let diagnostics = [ diagnosticsLogger.GetDiagnostics() yield! partialDiagnostics |> Seq.rev @@ -866,7 +905,6 @@ type IncrementalBuilderInitialState = defaultTimeStamp: DateTime mutable isImportsInvalidated: bool useChangeNotifications: bool - useSyntaxTreeCache: bool } static member Create @@ -888,8 +926,7 @@ type IncrementalBuilderInitialState = #endif allDependencies, defaultTimeStamp: DateTime, - useChangeNotifications: bool, - useSyntaxTreeCache + useChangeNotifications: bool ) = let initialState = @@ -915,7 +952,6 @@ type IncrementalBuilderInitialState = defaultTimeStamp = defaultTimeStamp isImportsInvalidated = false useChangeNotifications = useChangeNotifications - useSyntaxTreeCache = useSyntaxTreeCache } #if !NO_TYPEPROVIDERS importsInvalidatedByTypeProvider.Publish.Add(fun () -> initialState.isImportsInvalidated <- true) @@ -955,13 +991,13 @@ module IncrementalBuilderStateHelpers = type BuildStatus = Invalidated | Good let createBoundModelGraphNode (prevBoundModel: GraphNode) syntaxTree = - GraphNode(node { + GraphNode(async { let! prevBoundModel = prevBoundModel.GetOrComputeValue() return! prevBoundModel.Next(syntaxTree) }) let createFinalizeBoundModelGraphNode (initialState: IncrementalBuilderInitialState) (boundModels: GraphNode seq) = - GraphNode(node { + GraphNode(async { use _ = Activity.start "GetCheckResultsAndImplementationsForProject" [|Activity.Tags.project, initialState.outfile|] let! result = FinalizeTypeCheckTask @@ -1129,7 +1165,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc tryGetSlot state (slot - 1) let evalUpToTargetSlot (state: IncrementalBuilderState) targetSlot = - node { + async { if targetSlot < 0 then return Some(initialBoundModel, defaultTimeStamp) else @@ -1161,8 +1197,8 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc let mutable currentState = state let setCurrentState state cache (ct: CancellationToken) = - node { - do! semaphore.WaitAsync(ct) |> NodeCode.AwaitTask + async { + do! semaphore.WaitAsync(ct) |> Async.AwaitTask try ct.ThrowIfCancellationRequested() currentState <- computeStampedFileNames initialState state cache @@ -1171,8 +1207,8 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc } let checkFileTimeStamps (cache: TimeStampCache) = - node { - let! ct = NodeCode.CancellationToken + async { + let! ct = Async.CancellationToken do! setCurrentState currentState cache ct } @@ -1202,7 +1238,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc member _.AllDependenciesDeprecated = allDependencies member _.PopulatePartialCheckingResults () = - node { + async { let cache = TimeStampCache defaultTimeStamp // One per step do! checkFileTimeStamps cache let! _ = currentState.finalizedBoundModel.GetOrComputeValue() @@ -1244,7 +1280,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc (builder.TryGetCheckResultsBeforeFileInProject fileName).IsSome member builder.GetCheckResultsBeforeSlotInProject slotOfFile = - node { + async { let cache = TimeStampCache defaultTimeStamp do! checkFileTimeStamps cache let! result = evalUpToTargetSlot currentState (slotOfFile - 1) @@ -1256,7 +1292,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc } member builder.GetFullCheckResultsBeforeSlotInProject slotOfFile = - node { + async { let cache = TimeStampCache defaultTimeStamp do! checkFileTimeStamps cache let! result = evalUpToTargetSlot currentState (slotOfFile - 1) @@ -1281,7 +1317,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc builder.GetFullCheckResultsBeforeSlotInProject slotOfFile member builder.GetFullCheckResultsAfterFileInProject fileName = - node { + async { let slotOfFile = builder.GetSlotOfFileName fileName + 1 let! result = builder.GetFullCheckResultsBeforeSlotInProject(slotOfFile) return result @@ -1291,7 +1327,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc builder.GetCheckResultsBeforeSlotInProject(builder.GetSlotsCount()) member builder.GetCheckResultsAndImplementationsForProject() = - node { + async { let cache = TimeStampCache(defaultTimeStamp) do! checkFileTimeStamps cache let! result = currentState.finalizedBoundModel.GetOrComputeValue() @@ -1303,7 +1339,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc } member builder.GetFullCheckResultsAndImplementationsForProject() = - node { + async { let! result = builder.GetCheckResultsAndImplementationsForProject() let results, _, _, _ = result let! _ = results.GetOrComputeTcInfoWithExtras() // Make sure we forcefully evaluate the info @@ -1348,14 +1384,13 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc let slotOfFile = builder.GetSlotOfFileName fileName let syntaxTree = currentState.slots[slotOfFile].SyntaxTree syntaxTree.ParseNode.GetOrComputeValue() - |> Async.AwaitNodeCode |> Async.RunSynchronously member builder.NotifyFileChanged(fileName, timeStamp) = - node { + async { let slotOfFile = builder.GetSlotOfFileName fileName let cache = TimeStampCache defaultTimeStamp - let! ct = NodeCode.CancellationToken + let! ct = Async.CancellationToken do! setCurrentState { currentState with slots = currentState.slots |> List.updateAt slotOfFile (currentState.slots[slotOfFile].Notify timeStamp) } @@ -1388,20 +1423,19 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc parallelReferenceResolution, captureIdentifiersWhenParsing, getSource, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) = let useSimpleResolutionSwitch = "--simpleresolution" - node { + async { // Trap and report diagnostics from creation. let delayedLogger = CapturingDiagnosticsLogger("IncrementalBuilderCreation") use _ = new CompilationGlobalsScope(delayedLogger, BuildPhase.Parameter) let! builderOpt = - node { + async { try // Create the builder. @@ -1453,6 +1487,8 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc tcConfigB.useSimpleResolution <- (getSwitchValue useSimpleResolutionSwitch) |> Option.isSome + tcConfigB.realsig <- List.contains "--realsig" commandLineArgs || List.contains "--realsig+" commandLineArgs + // Apply command-line arguments and collect more source files if they are in the arguments let sourceFilesNew = ApplyCommandLineArgs(tcConfigB, sourceFiles, commandLineArgs) @@ -1463,7 +1499,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc { new IXmlDocumentationInfoLoader with /// Try to load xml documentation associated with an assembly by the same file path with the extension ".xml". member _.TryLoad(assemblyFileName) = - let xmlFileName = Path.ChangeExtension(assemblyFileName, ".xml") + let xmlFileName = !! Path.ChangeExtension(assemblyFileName, ".xml") // REVIEW: File IO - Will eventually need to change this to use a file system interface of some sort. XmlDocumentationInfo.TryCreateFromFile(xmlFileName) @@ -1629,8 +1665,7 @@ type IncrementalBuilder(initialState: IncrementalBuilderInitialState, state: Inc #endif allDependencies, defaultTimeStamp, - useChangeNotifications, - useSyntaxTreeCache + useChangeNotifications ) let builder = IncrementalBuilder(initialState, IncrementalBuilderState.Create(initialState)) diff --git a/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fsi b/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fsi index c5742d9d15..758c63a7d3 100644 --- a/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fsi +++ b/src/fcs-fable/src/Compiler/Service/IncrementalBuild.fsi @@ -24,6 +24,7 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.Text open FSharp.Compiler.TypedTree open FSharp.Compiler.BuildGraph +open Internal.Utilities.Collections #if FABLE_COMPILER // stub @@ -35,11 +36,22 @@ type internal IncrementalBuilder = #else //!FABLE_COMPILER +type internal FrameworkImportsCacheKey = + | FrameworkImportsCacheKey of + resolvedpath: string list * + assemblyName: string * + targetFrameworkDirectories: string list * + fsharpBinaries: string * + langVersion: decimal * + checkNulls: bool + + interface ICacheKey + /// Lookup the global static cache for building the FrameworkTcImports type internal FrameworkImportsCache = new: size: int -> FrameworkImportsCache - member Get: TcConfig -> NodeCode + member Get: TcConfig -> Async member Clear: unit -> unit @@ -122,28 +134,42 @@ type internal PartialCheckResults = /// Compute the "TcInfo" part of the results. If `enablePartialTypeChecking` is false then /// extras will also be available. - member GetOrComputeTcInfo: unit -> NodeCode + member GetOrComputeTcInfo: unit -> Async /// Compute both the "TcInfo" and "TcInfoExtras" parts of the results. /// Can cause a second type-check if `enablePartialTypeChecking` is true in the checker. /// Only use when it's absolutely necessary to get rich information on a file. - member GetOrComputeTcInfoWithExtras: unit -> NodeCode + member GetOrComputeTcInfoWithExtras: unit -> Async /// Compute the "ItemKeyStore" parts of the results. /// Can cause a second type-check if `enablePartialTypeChecking` is true in the checker. /// Only use when it's absolutely necessary to get rich information on a file. /// /// Will return 'None' for enableBackgroundItemKeyStoreAndSemanticClassification=false. - member GetOrComputeItemKeyStoreIfEnabled: unit -> NodeCode + member GetOrComputeItemKeyStoreIfEnabled: unit -> Async /// Can cause a second type-check if `enablePartialTypeChecking` is true in the checker. /// Only use when it's absolutely necessary to get rich information on a file. /// /// Will return 'None' for enableBackgroundItemKeyStoreAndSemanticClassification=false. - member GetOrComputeSemanticClassificationIfEnabled: unit -> NodeCode + member GetOrComputeSemanticClassificationIfEnabled: unit -> Async member TimeStamp: DateTime +[] +type internal RawFSharpAssemblyDataBackedByLanguageService = + new: + tcConfig: TcConfig * + tcGlobals: TcGlobals * + generatedCcu: CcuThunk * + outfile: string * + topAttrs: TopAttribs * + assemblyName: string * + ilAssemRef: FSharp.Compiler.AbstractIL.IL.ILAssemblyRef -> + RawFSharpAssemblyDataBackedByLanguageService + + interface IRawFSharpAssemblyData + /// Manages an incremental build graph for the build of an F# project [] type internal IncrementalBuilder = @@ -181,7 +207,7 @@ type internal IncrementalBuilder = member AllDependenciesDeprecated: string[] /// The project build. Return true if the background work is finished. - member PopulatePartialCheckingResults: unit -> NodeCode + member PopulatePartialCheckingResults: unit -> Async /// Get the preceding typecheck state of a slot, without checking if it is up-to-date w.r.t. /// the timestamps on files and referenced DLLs prior to this one. Return None if the result is not available. @@ -215,38 +241,36 @@ type internal IncrementalBuilder = /// Get the preceding typecheck state of a slot. Compute the entire type check of the project up /// to the necessary point if the result is not available. This may be a long-running operation. - member GetCheckResultsBeforeFileInProject: fileName: string -> NodeCode + member GetCheckResultsBeforeFileInProject: fileName: string -> Async /// Get the preceding typecheck state of a slot. Compute the entire type check of the project up /// to the necessary point if the result is not available. This may be a long-running operation. /// This will get full type-check info for the file, meaning no partial type-checking. - member GetFullCheckResultsBeforeFileInProject: fileName: string -> NodeCode + member GetFullCheckResultsBeforeFileInProject: fileName: string -> Async /// Get the typecheck state after checking a file. Compute the entire type check of the project up /// to the necessary point if the result is not available. This may be a long-running operation. - member GetCheckResultsAfterFileInProject: fileName: string -> NodeCode + member GetCheckResultsAfterFileInProject: fileName: string -> Async /// Get the typecheck state after checking a file. Compute the entire type check of the project up /// to the necessary point if the result is not available. This may be a long-running operation. /// This will get full type-check info for the file, meaning no partial type-checking. - member GetFullCheckResultsAfterFileInProject: fileName: string -> NodeCode + member GetFullCheckResultsAfterFileInProject: fileName: string -> Async /// Get the typecheck result after the end of the last file. The typecheck of the project is not 'completed'. /// This may be a long-running operation. - member GetCheckResultsAfterLastFileInProject: unit -> NodeCode + member GetCheckResultsAfterLastFileInProject: unit -> Async /// Get the final typecheck result. If 'generateTypedImplFiles' was set on Create then the CheckedAssemblyAfterOptimization will contain implementations. /// This may be a long-running operation. member GetCheckResultsAndImplementationsForProject: - unit -> - NodeCode + unit -> Async /// Get the final typecheck result. If 'generateTypedImplFiles' was set on Create then the CheckedAssemblyAfterOptimization will contain implementations. /// This may be a long-running operation. /// This will get full type-check info for the project, meaning no partial type-checking. member GetFullCheckResultsAndImplementationsForProject: - unit -> - NodeCode + unit -> Async /// Get the logical time stamp that is associated with the output of the project if it were fully built immediately member GetLogicalTimeStampForProject: TimeStampCache -> DateTime @@ -260,7 +284,7 @@ type internal IncrementalBuilder = member GetParseResultsForFile: fileName: string -> ParsedInput * range * string * (PhasedDiagnostic * FSharpDiagnosticSeverity)[] - member NotifyFileChanged: fileName: string * timeStamp: DateTime -> NodeCode + member NotifyFileChanged: fileName: string * timeStamp: DateTime -> Async /// Create the incremental builder static member TryCreateIncrementalBuilderForProjectOptions: @@ -284,9 +308,8 @@ type internal IncrementalBuilder = parallelReferenceResolution: ParallelReferenceResolution * captureIdentifiersWhenParsing: bool * getSource: (string -> Async) option * - useChangeNotifications: bool * - useSyntaxTreeCache: bool -> - NodeCode + useChangeNotifications: bool -> + Async /// Generalized Incremental Builder. This is exposed only for unit testing purposes. module internal IncrementalBuild = diff --git a/src/fcs-fable/src/Compiler/Service/ItemKey.fs b/src/fcs-fable/src/Compiler/Service/ItemKey.fs index daf6a28f54..3c030f84c9 100644 --- a/src/fcs-fable/src/Compiler/Service/ItemKey.fs +++ b/src/fcs-fable/src/Compiler/Service/ItemKey.fs @@ -7,6 +7,7 @@ open System.IO open System.IO.MemoryMappedFiles open System.Reflection.Metadata open System.Runtime.InteropServices +open Internal.Utilities.Library open FSharp.NativeInterop open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.Infos @@ -436,7 +437,7 @@ and [] ItemKeyStoreBuilder(tcGlobals: TcGlobals) = writeString ItemKeyTags.itemActivePattern match apInfo.ActiveTagsWithRanges with - | (_, m) :: _ -> m.FileName |> Path.GetFileNameWithoutExtension |> writeString + | (_, m) :: _ -> m.FileName |> Path.GetFileNameWithoutExtension |> (!!) |> writeString | _ -> () for tag in apInfo.ActiveTags do @@ -562,7 +563,6 @@ and [] ItemKeyStoreBuilder(tcGlobals: TcGlobals) = // We should consider writing ItemKey for each of these | Item.OtherName _ -> () - | Item.FakeInterfaceCtor _ -> () | Item.CustomOperation _ -> () | Item.CustomBuilder _ -> () | Item.ImplicitOp _ -> () diff --git a/src/fcs-fable/src/Compiler/Service/QuickParse.fs b/src/fcs-fable/src/Compiler/Service/QuickParse.fs index cf5acbef6d..391eff0fe1 100644 --- a/src/fcs-fable/src/Compiler/Service/QuickParse.fs +++ b/src/fcs-fable/src/Compiler/Service/QuickParse.fs @@ -36,7 +36,7 @@ type PartialLongName = /// /// These methods are very old and are mostly to do with extracting "long identifier islands" /// A.B.C -/// from F# source code, an approach taken from pre-F# VS samples for implementing intelliense. +/// from F# source code, an approach taken from pre-F# VS samples for implementing intellisense. /// /// This code should really no longer be needed since the language service has access to /// parsed F# source code ASTs. However, the long identifiers are still passed back to GetDeclarations and friends in the @@ -89,7 +89,7 @@ module QuickParse = | _ -> false let GetCompleteIdentifierIslandImplAux (lineStr: string) (index: int) : (string * int * bool) option = - if index < 0 || isNull lineStr || index >= lineStr.Length then + if index < 0 || index >= lineStr.Length then None else let fixup = diff --git a/src/fcs-fable/src/Compiler/Service/QuickParse.fsi b/src/fcs-fable/src/Compiler/Service/QuickParse.fsi index c2ecb049da..ad3d434ada 100644 --- a/src/fcs-fable/src/Compiler/Service/QuickParse.fsi +++ b/src/fcs-fable/src/Compiler/Service/QuickParse.fsi @@ -28,7 +28,7 @@ type public PartialLongName = /// /// These methods are very old and are mostly to do with extracting "long identifier islands" /// A.B.C -/// from F# source code, an approach taken from pre-F# VS samples for implementing intelliense. +/// from F# source code, an approach taken from pre-F# VS samples for implementing intellisense. /// /// This code should really no longer be needed since the language service has access to /// parsed F# source code ASTs. However, the long identifiers are still passed back to GetDeclarations and friends in the diff --git a/src/fcs-fable/src/Compiler/Service/SemanticClassification.fs b/src/fcs-fable/src/Compiler/Service/SemanticClassification.fs index d78d0579b7..fc45cb6fd3 100644 --- a/src/fcs-fable/src/Compiler/Service/SemanticClassification.fs +++ b/src/fcs-fable/src/Compiler/Service/SemanticClassification.fs @@ -58,7 +58,6 @@ type SemanticClassificationType = | TypeDef = 35 | Plaintext = 36 -[] [] type SemanticClassificationItem = val Range: range @@ -68,14 +67,14 @@ type SemanticClassificationItem = [] module TcResolutionsExtensions = let (|CNR|) (cnr: CapturedNameResolution) = - (cnr.Item, cnr.ItemOccurence, cnr.DisplayEnv, cnr.NameResolutionEnv, cnr.AccessorDomain, cnr.Range) + (cnr.Item, cnr.ItemOccurrence, cnr.DisplayEnv, cnr.NameResolutionEnv, cnr.AccessorDomain, cnr.Range) let isDisposableTy g amap (ty: TType) = not (typeEquiv g ty g.system_IDisposable_ty) && protectAssemblyExplorationNoReraise false false (fun () -> ExistsHeadTypeInEntireHierarchy g amap range0 ty g.tcref_System_IDisposable) - let isDiscard (str: string) = str.StartsWith("_") + let isDiscard (str: string) = str.StartsWithOrdinal("_") let isValRefDisposable g amap (vref: ValRef) = not (isDiscard vref.DisplayName) @@ -145,14 +144,14 @@ module TcResolutionsExtensions = DiagnosticsScope.Protect range0 (fun () -> - let (|LegitTypeOccurence|_|) occ = + let (|LegitTypeOccurrence|_|) occ = match occ with - | ItemOccurence.UseInType - | ItemOccurence.UseInAttribute - | ItemOccurence.Use - | ItemOccurence.Binding - | ItemOccurence.Pattern - | ItemOccurence.Open -> Some() + | ItemOccurrence.UseInType + | ItemOccurrence.UseInAttribute + | ItemOccurrence.Use + | ItemOccurrence.Binding + | ItemOccurrence.Pattern + | ItemOccurrence.Open -> Some() | _ -> None let (|KeywordIntrinsicValue|_|) (vref: ValRef) = @@ -176,7 +175,7 @@ module TcResolutionsExtensions = | _ -> None | _ -> None - // Custome builders like 'async { }' are both Item.Value and Item.CustomBuilder. + // Custom builders like 'async { }' are both Item.Value and Item.CustomBuilder. // We should prefer the latter, otherwise they would not get classified as CEs. let takeCustomBuilder (cnrs: CapturedNameResolution[]) = assert (cnrs.Length > 0) @@ -210,13 +209,13 @@ module TcResolutionsExtensions = resolutions |> Array.iter (fun cnr -> - match cnr.Item, cnr.ItemOccurence, cnr.Range with - | (Item.CustomBuilder _ | Item.CustomOperation _), ItemOccurence.Use, m -> + match cnr.Item, cnr.ItemOccurrence, cnr.Range with + | (Item.CustomBuilder _ | Item.CustomOperation _), ItemOccurrence.Use, m -> add m SemanticClassificationType.ComputationExpression | Item.Value vref, _, m when isValRefMutable g vref -> add m SemanticClassificationType.MutableVar - | Item.Value KeywordIntrinsicValue, ItemOccurence.Use, m -> add m SemanticClassificationType.IntrinsicFunction + | Item.Value KeywordIntrinsicValue, ItemOccurrence.Use, m -> add m SemanticClassificationType.IntrinsicFunction | Item.Value vref, _, m when isForallFunctionTy g vref.Type -> if isDiscard vref.DisplayName then @@ -287,8 +286,6 @@ module TcResolutionsExtensions = | Item.DelegateCtor _, _, m -> add m SemanticClassificationType.ConstructorForReferenceType - | Item.FakeInterfaceCtor _, _, m -> add m SemanticClassificationType.ConstructorForReferenceType - | Item.MethodGroup(_, minfos, _), _, m -> match minfos with | [] -> add m SemanticClassificationType.Method @@ -302,12 +299,12 @@ module TcResolutionsExtensions = add m SemanticClassificationType.Method // Special case measures for struct types - | Item.Types(_, AppTy g (tyconRef, TType_measure _ :: _) :: _), LegitTypeOccurence, m when + | Item.Types(_, AppTy g (tyconRef, TType_measure _ :: _) :: _), LegitTypeOccurrence, m when isStructTyconRef g tyconRef -> add m SemanticClassificationType.ValueType - | Item.Types(_, ty :: _), LegitTypeOccurence, m -> + | Item.Types(_, ty :: _), LegitTypeOccurrence, m -> let ty = stripTyEqns g ty if isDisposableTy g amap ty then @@ -327,11 +324,11 @@ module TcResolutionsExtensions = else add m SemanticClassificationType.TypeDef - | Item.TypeVar _, LegitTypeOccurence, m -> add m SemanticClassificationType.TypeArgument + | Item.TypeVar _, LegitTypeOccurrence, m -> add m SemanticClassificationType.TypeArgument - | Item.ExnCase _, LegitTypeOccurence, m -> add m SemanticClassificationType.Exception + | Item.ExnCase _, LegitTypeOccurrence, m -> add m SemanticClassificationType.Exception - | Item.ModuleOrNamespaces(modref :: _), LegitTypeOccurence, m -> + | Item.ModuleOrNamespaces(modref :: _), LegitTypeOccurrence, m -> if modref.IsNamespace then add m SemanticClassificationType.Namespace else @@ -355,7 +352,7 @@ module TcResolutionsExtensions = | Item.SetterArg _, _, m -> add m SemanticClassificationType.NamedArgument - | Item.UnqualifiedType(tcref :: _), LegitTypeOccurence, m -> + | Item.UnqualifiedType(tcref :: _), LegitTypeOccurrence, m -> if tcref.IsEnumTycon || tcref.IsILEnumTycon then add m SemanticClassificationType.Enumeration elif tcref.IsFSharpException then diff --git a/src/fcs-fable/src/Compiler/Service/SemanticClassification.fsi b/src/fcs-fable/src/Compiler/Service/SemanticClassification.fsi index ce5d6d88ae..031192570c 100644 --- a/src/fcs-fable/src/Compiler/Service/SemanticClassification.fsi +++ b/src/fcs-fable/src/Compiler/Service/SemanticClassification.fsi @@ -49,7 +49,6 @@ type SemanticClassificationType = | TypeDef = 35 | Plaintext = 36 -[] [] type SemanticClassificationItem = val Range: range @@ -60,7 +59,7 @@ type SemanticClassificationItem = [] module internal TcResolutionsExtensions = val (|CNR|): - cnr: CapturedNameResolution -> Item * ItemOccurence * DisplayEnv * NameResolutionEnv * AccessorDomain * range + cnr: CapturedNameResolution -> Item * ItemOccurrence * DisplayEnv * NameResolutionEnv * AccessorDomain * range type TcResolutions with diff --git a/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fs b/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fs index 777a967876..26b2ea1f7a 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fs @@ -2,12 +2,12 @@ namespace FSharp.Compiler.EditorServices +open System open System.Collections.Generic open System.Runtime.CompilerServices open Internal.Utilities.Library open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.Symbols -open FSharp.Compiler.Syntax open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.Text open FSharp.Compiler.Text.Range @@ -51,6 +51,11 @@ module UnusedOpens = if not entity.IsNamespace && not entity.IsFSharpModule then for fv in entity.MembersFunctionsAndValues do fv + + if entity.IsEnum then + for field in entity.FSharpFields do + if field.IsStatic && field.IsLiteral then + field |] HashSet<_>(symbols, symbolHash) @@ -296,12 +301,19 @@ module UnusedOpens = /// Async to allow cancellation. let getUnusedOpens (checkFileResults: FSharpCheckFileResults, getSourceLineStr: int -> string) : Async = async { - let! ct = Async.CancellationToken - let symbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile(ct) - let symbolUses = filterSymbolUses getSourceLineStr symbolUses - let symbolUses = splitSymbolUses symbolUses - let openStatements = getOpenStatements checkFileResults.OpenDeclarations - return! filterOpenStatements symbolUses openStatements + if checkFileResults.OpenDeclarations.Length = 0 then + return [] + else + let! ct = Async.CancellationToken + let symbolUses = checkFileResults.GetAllUsesOfAllSymbolsInFile(ct) + let symbolUses = filterSymbolUses getSourceLineStr symbolUses + let symbolUses = splitSymbolUses symbolUses + let openStatements = getOpenStatements checkFileResults.OpenDeclarations + + if openStatements.Length = 0 then + return [] + else + return! filterOpenStatements symbolUses openStatements } module SimplifyNames = @@ -332,7 +344,10 @@ module SimplifyNames = - partialName.PartialIdent.Length - (getPlidLength partialName.QualifyingIdents) - if partialName.PartialIdent = "" || List.isEmpty partialName.QualifyingIdents then + if + String.IsNullOrEmpty(partialName.PartialIdent) + || List.isEmpty partialName.QualifyingIdents + then None else Some(symbolUse, partialName.QualifyingIdents, plidStartCol, partialName.PartialIdent)) @@ -435,7 +450,7 @@ module UnusedDeclarations = su.IsFromDefinition && su.Symbol.DeclarationLocation.IsSome && (isScript || su.IsPrivateToFile) - && not (su.Symbol.DisplayName.StartsWith "_") + && not (su.Symbol.DisplayName.StartsWithOrdinal "_") && isPotentiallyUnusedDeclaration su.Symbol then Some(su, usages.Contains su.Symbol.DeclarationLocation.Value) @@ -452,1273 +467,3 @@ module UnusedDeclarations = let unusedRanges = getUnusedDeclarationRanges allSymbolUsesInFile isScriptFile return unusedRanges } - -module UnnecessaryParentheses = - open System - - let (|Ident|) (ident: Ident) = ident.idText - - /// Represents an expression's precedence, or, - /// for a few few types of expression whose exact - /// kind can be significant, the expression's exact kind. - /// - /// Use Precedence.sameKind to determine whether two expressions - /// have the same kind. Use Precedence.compare to compare two - /// expressions' precedence. Avoid using relational operators or the - /// built-in compare function on this type. - type Precedence = - /// yield, yield!, return, return! - | Low - - /// <- - | Set - - /// := - | ColonEquals - - /// , - | Comma - - /// or, || - /// - /// Refers to the exact operators or and ||. - /// Instances with leading dots or question marks or trailing characters are parsed as Bar instead. - | BarBar - - /// &, && - /// - /// Refers to the exact operators & and &&. - /// Instances with leading dots or question marks or trailing characters are parsed as Amp instead. - | AmpAmp - - /// :?> - | Downcast - - /// :> - | Upcast - - /// =… - | Eq - - /// |… - | Bar - - /// &… - | Amp - - /// $… - | Dollar - - /// >… - | Greater - - /// <… - | Less - - /// !=… - | BangEq - - /// ^… - | Hat - - /// @… - | At - - /// :: - | Cons - - /// :? - | TypeTest - - /// -… - | Sub - - /// +… - | Add - - /// %… - | Mod - - /// /… - | Div - - /// *… - | Mul - - /// **… - | Exp - - /// - x - | UnaryPrefix - - /// f x - | Apply - - /// -x, !… x, ~~… x - | High - - // x.y - | Dot - - module Precedence = - /// Returns true only if the two expressions are of the - /// exact same kind. E.g., Add = Add and Sub = Sub, - /// but Add <> Sub, even though their precedence compares equally. - let sameKind prec1 prec2 = prec1 = prec2 - - /// Compares two expressions' precedence. - let compare prec1 prec2 = - match prec1, prec2 with - | Dot, Dot -> 0 - | Dot, _ -> 1 - | _, Dot -> -1 - - | High, High -> 0 - | High, _ -> 1 - | _, High -> -1 - - | Apply, Apply -> 0 - | Apply, _ -> 1 - | _, Apply -> -1 - - | UnaryPrefix, UnaryPrefix -> 0 - | UnaryPrefix, _ -> 1 - | _, UnaryPrefix -> -1 - - | Exp, Exp -> 0 - | Exp, _ -> 1 - | _, Exp -> -1 - - | (Mod | Div | Mul), (Mod | Div | Mul) -> 0 - | (Mod | Div | Mul), _ -> 1 - | _, (Mod | Div | Mul) -> -1 - - | (Sub | Add), (Sub | Add) -> 0 - | (Sub | Add), _ -> 1 - | _, (Sub | Add) -> -1 - - | TypeTest, TypeTest -> 0 - | TypeTest, _ -> 1 - | _, TypeTest -> -1 - - | Cons, Cons -> 0 - | Cons, _ -> 1 - | _, Cons -> -1 - - | (Hat | At), (Hat | At) -> 0 - | (Hat | At), _ -> 1 - | _, (Hat | At) -> -1 - - | (Eq | Bar | Amp | Dollar | Greater | Less | BangEq), (Eq | Bar | Amp | Dollar | Greater | Less | BangEq) -> 0 - | (Eq | Bar | Amp | Dollar | Greater | Less | BangEq), _ -> 1 - | _, (Eq | Bar | Amp | Dollar | Greater | Less | BangEq) -> -1 - - | (Downcast | Upcast), (Downcast | Upcast) -> 0 - | (Downcast | Upcast), _ -> 1 - | _, (Downcast | Upcast) -> -1 - - | AmpAmp, AmpAmp -> 0 - | AmpAmp, _ -> 1 - | _, AmpAmp -> -1 - - | BarBar, BarBar -> 0 - | BarBar, _ -> 1 - | _, BarBar -> -1 - - | Comma, Comma -> 0 - | Comma, _ -> 1 - | _, Comma -> -1 - - | ColonEquals, ColonEquals -> 0 - | ColonEquals, _ -> 1 - | _, ColonEquals -> -1 - - | Set, Set -> 0 - | Set, _ -> 1 - | _, Set -> -1 - - | Low, Low -> 0 - - /// Associativity/association. - type Assoc = - /// Non-associative or no association. - | Non - - /// Left-associative or left-hand association. - | Left - - /// Right-associative or right-hand association. - | Right - - module Assoc = - let ofPrecedence precedence = - match precedence with - | Low -> Non - | Set -> Non - | ColonEquals -> Right - | Comma -> Non - | BarBar -> Left - | AmpAmp -> Left - | Upcast - | Downcast -> Right - | Eq - | Bar - | Amp - | Dollar - | Greater - | Less - | BangEq -> Left - | At - | Hat -> Right - | Cons -> Right - | TypeTest -> Non - | Add - | Sub -> Left - | Mul - | Div - | Mod -> Left - | Exp -> Right - | UnaryPrefix -> Left - | Apply -> Left - | High -> Left - | Dot -> Left - - /// Matches if the two expressions or patterns refer to the same object. - [] - let inline (|Is|_|) (inner1: 'a) (inner2: 'a) = - if obj.ReferenceEquals(inner1, inner2) then - ValueSome Is - else - ValueNone - - module SynExpr = - open FSharp.Compiler.SyntaxTrivia - - /// See atomicExprAfterType in pars.fsy. - [] - let (|AtomicExprAfterType|_|) expr = - match expr with - | SynExpr.Paren _ - | SynExpr.Quote _ - | SynExpr.Const _ - | SynExpr.Tuple(isStruct = true) - | SynExpr.Record _ - | SynExpr.AnonRecd _ - | SynExpr.InterpolatedString _ - | SynExpr.Null _ - | SynExpr.ArrayOrList(isArray = true) - | SynExpr.ArrayOrListComputed(isArray = true) -> ValueSome AtomicExprAfterType - | _ -> ValueNone - - /// Matches if the given expression represents a high-precedence - /// function application, e.g., - /// - /// f x - /// - /// (+) x y - [] - let (|HighPrecedenceApp|_|) expr = - match expr with - | SynExpr.App(isInfix = false; funcExpr = SynExpr.Ident _) - | SynExpr.App(isInfix = false; funcExpr = SynExpr.LongIdent _) - | SynExpr.App(isInfix = false; funcExpr = SynExpr.App(isInfix = false)) -> ValueSome HighPrecedenceApp - | _ -> ValueNone - - module FuncExpr = - /// Matches when the given funcExpr is a direct application - /// of a symbolic operator, e.g., -, _not_ (~-). - [] - let (|SymbolicOperator|_|) funcExpr = - match funcExpr with - | SynExpr.LongIdent(longDotId = SynLongIdent(trivia = trivia)) -> - let rec tryPick = - function - | [] -> ValueNone - | Some(IdentTrivia.OriginalNotation op) :: _ -> ValueSome op - | _ :: rest -> tryPick rest - - tryPick trivia - | _ -> ValueNone - - /// Matches when the given expression is a prefix operator application, e.g., - /// - /// -x - /// - /// ~~~x - [] - let (|PrefixApp|_|) expr : Precedence voption = - match expr with - | SynExpr.App(isInfix = false; funcExpr = funcExpr & FuncExpr.SymbolicOperator op; argExpr = argExpr) -> - if funcExpr.Range.IsAdjacentTo argExpr.Range then - ValueSome High - else - assert (op.Length > 0) - - match op[0] with - | '!' - | '~' -> ValueSome High - | _ -> ValueSome UnaryPrefix - - | SynExpr.AddressOf(expr = expr; opRange = opRange) -> - if opRange.IsAdjacentTo expr.Range then - ValueSome High - else - ValueSome UnaryPrefix - - | _ -> ValueNone - - /// Tries to parse the given original notation as a symbolic infix operator. - [] - let (|SymbolPrec|_|) (originalNotation: string) = - // Trim any leading dots or question marks from the given symbolic operator. - // Leading dots or question marks have no effect on operator precedence or associativity - // with the exception of &, &&, and ||. - let ignoredLeadingChars = ".?".AsSpan() - let trimmed = originalNotation.AsSpan().TrimStart ignoredLeadingChars - assert (trimmed.Length > 0) - - match trimmed[0], originalNotation with - | _, ":=" -> ValueSome ColonEquals - | _, ("||" | "or") -> ValueSome BarBar - | _, ("&" | "&&") -> ValueSome AmpAmp - | '|', _ -> ValueSome Bar - | '&', _ -> ValueSome Amp - | '<', _ -> ValueSome Less - | '>', _ -> ValueSome Greater - | '=', _ -> ValueSome Eq - | '$', _ -> ValueSome Dollar - | '!', _ when trimmed.Length > 1 && trimmed[1] = '=' -> ValueSome BangEq - | '^', _ -> ValueSome Hat - | '@', _ -> ValueSome At - | _, "::" -> ValueSome Cons - | '+', _ -> ValueSome Add - | '-', _ -> ValueSome Sub - | '/', _ -> ValueSome Div - | '%', _ -> ValueSome Mod - | '*', _ when trimmed.Length > 1 && trimmed[1] = '*' -> ValueSome Exp - | '*', _ -> ValueSome Mul - | _ -> ValueNone - - /// Any expressions in which the removal of parens would - /// lead to something like the following that would be - /// confused by the parser with a type parameter application: - /// - /// xz - /// - /// xz - [] - let rec (|ConfusableWithTypeApp|_|) synExpr = - match synExpr with - | SynExpr.Paren(expr = ConfusableWithTypeApp) - | SynExpr.App(funcExpr = ConfusableWithTypeApp) - | SynExpr.App(isInfix = true; funcExpr = FuncExpr.SymbolicOperator(SymbolPrec Greater); argExpr = ConfusableWithTypeApp) -> - ValueSome ConfusableWithTypeApp - | SynExpr.App(isInfix = true; funcExpr = funcExpr & FuncExpr.SymbolicOperator(SymbolPrec Less); argExpr = argExpr) when - argExpr.Range.IsAdjacentTo funcExpr.Range - -> - ValueSome ConfusableWithTypeApp - | SynExpr.Tuple(exprs = exprs) -> - let rec anyButLast = - function - | _ :: [] - | [] -> ValueNone - | ConfusableWithTypeApp :: _ -> ValueSome ConfusableWithTypeApp - | _ :: tail -> anyButLast tail - - anyButLast exprs - | _ -> ValueNone - - /// Matches when the expression represents the infix application of a symbolic operator. - /// - /// (x λ y) ρ z - /// - /// x λ (y ρ z) - [] - let (|InfixApp|_|) synExpr : struct (Precedence * Assoc) voption = - match synExpr with - | SynExpr.App(funcExpr = SynExpr.App(isInfix = true; funcExpr = FuncExpr.SymbolicOperator(SymbolPrec prec))) -> - ValueSome(prec, Right) - | SynExpr.App(isInfix = true; funcExpr = FuncExpr.SymbolicOperator(SymbolPrec prec)) -> ValueSome(prec, Left) - | SynExpr.Upcast _ -> ValueSome(Upcast, Left) - | SynExpr.Downcast _ -> ValueSome(Downcast, Left) - | SynExpr.TypeTest _ -> ValueSome(TypeTest, Left) - | _ -> ValueNone - - /// Returns the given expression's precedence and the side of the inner expression, - /// if applicable. - [] - let (|OuterBinaryExpr|_|) inner outer : struct (Precedence * Assoc) voption = - match outer with - | SynExpr.YieldOrReturn _ - | SynExpr.YieldOrReturnFrom _ -> ValueSome(Low, Right) - | SynExpr.Tuple(exprs = SynExpr.Paren(expr = Is inner) :: _) -> ValueSome(Comma, Left) - | SynExpr.Tuple _ -> ValueSome(Comma, Right) - | InfixApp(Cons, side) -> ValueSome(Cons, side) - | SynExpr.Assert _ - | SynExpr.Lazy _ - | SynExpr.InferredUpcast _ - | SynExpr.InferredDowncast _ -> ValueSome(Apply, Non) - | PrefixApp prec -> ValueSome(prec, Non) - | InfixApp(prec, side) -> ValueSome(prec, side) - | SynExpr.App(argExpr = SynExpr.ComputationExpr _) -> ValueSome(UnaryPrefix, Left) - | SynExpr.App(funcExpr = SynExpr.Paren(expr = SynExpr.App _)) -> ValueSome(Apply, Left) - | SynExpr.App _ -> ValueSome(Apply, Non) - | SynExpr.DotSet(targetExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Dot, Left) - | SynExpr.DotSet(rhsExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Set, Right) - | SynExpr.DotIndexedSet(objectExpr = SynExpr.Paren(expr = Is inner)) - | SynExpr.DotNamedIndexedPropertySet(targetExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Dot, Left) - | SynExpr.DotIndexedSet(valueExpr = SynExpr.Paren(expr = Is inner)) - | SynExpr.DotNamedIndexedPropertySet(rhsExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Set, Right) - | SynExpr.LongIdentSet(expr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Set, Right) - | SynExpr.Set _ -> ValueSome(Set, Non) - | SynExpr.DotGet _ -> ValueSome(Dot, Left) - | SynExpr.DotIndexedGet(objectExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Dot, Left) - | _ -> ValueNone - - /// Matches a SynExpr.App nested in a sequence of dot-gets. - /// - /// x.M.N().O - [] - let (|NestedApp|_|) expr = - let rec loop = - function - | SynExpr.DotGet(expr = expr) - | SynExpr.DotIndexedGet(objectExpr = expr) -> loop expr - | SynExpr.App _ -> ValueSome NestedApp - | _ -> ValueNone - - loop expr - - /// Returns the given expression's precedence, if applicable. - [] - let (|InnerBinaryExpr|_|) expr : Precedence voption = - match expr with - | SynExpr.Tuple(isStruct = false) -> ValueSome Comma - | SynExpr.DotGet(expr = NestedApp) - | SynExpr.DotIndexedGet(objectExpr = NestedApp) -> ValueSome Apply - | SynExpr.DotGet _ - | SynExpr.DotIndexedGet _ -> ValueSome Dot - | PrefixApp prec -> ValueSome prec - | InfixApp(prec, _) -> ValueSome prec - | SynExpr.App _ - | SynExpr.Assert _ - | SynExpr.Lazy _ - | SynExpr.For _ - | SynExpr.ForEach _ - | SynExpr.While _ - | SynExpr.Do _ - | SynExpr.New _ - | SynExpr.InferredUpcast _ - | SynExpr.InferredDowncast _ -> ValueSome Apply - | SynExpr.DotIndexedSet _ - | SynExpr.DotNamedIndexedPropertySet _ - | SynExpr.DotSet _ -> ValueSome Set - | _ -> ValueNone - - module Dangling = - /// Returns the first matching nested right-hand target expression, if any. - let private dangling (target: SynExpr -> SynExpr option) = - let (|Target|_|) = target - let (|Last|) = List.last - - let rec loop expr = - match expr with - | Target expr -> ValueSome expr - | SynExpr.Tuple(isStruct = false; exprs = Last expr) - | SynExpr.App(argExpr = expr) - | SynExpr.IfThenElse(elseExpr = Some expr) - | SynExpr.IfThenElse(ifExpr = expr) - | SynExpr.Sequential(expr2 = expr) - | SynExpr.YieldOrReturn(expr = expr) - | SynExpr.YieldOrReturnFrom(expr = expr) - | SynExpr.Set(rhsExpr = expr) - | SynExpr.DotSet(rhsExpr = expr) - | SynExpr.DotNamedIndexedPropertySet(rhsExpr = expr) - | SynExpr.DotIndexedSet(valueExpr = expr) - | SynExpr.LongIdentSet(expr = expr) - | SynExpr.LetOrUse(body = expr) - | SynExpr.Lambda(body = expr) - | SynExpr.Match(clauses = Last(SynMatchClause(resultExpr = expr))) - | SynExpr.MatchLambda(matchClauses = Last(SynMatchClause(resultExpr = expr))) - | SynExpr.MatchBang(clauses = Last(SynMatchClause(resultExpr = expr))) - | SynExpr.TryWith(withCases = Last(SynMatchClause(resultExpr = expr))) - | SynExpr.TryFinally(finallyExpr = expr) -> loop expr - | _ -> ValueNone - - loop - - /// Matches a dangling if-then construct. - [] - let (|IfThen|_|) = - dangling (function - | SynExpr.IfThenElse _ as expr -> Some expr - | _ -> None) - - /// Matches a dangling sequential expression. - [] - let (|Sequential|_|) = - dangling (function - | SynExpr.Sequential _ as expr -> Some expr - | _ -> None) - - /// Matches a dangling try-with or try-finally construct. - [] - let (|Try|_|) = - dangling (function - | SynExpr.TryWith _ - | SynExpr.TryFinally _ as expr -> Some expr - | _ -> None) - - /// Matches a dangling match-like construct. - [] - let (|Match|_|) = - dangling (function - | SynExpr.Match _ - | SynExpr.MatchBang _ - | SynExpr.MatchLambda _ - | SynExpr.TryWith _ - | SynExpr.Lambda _ as expr -> Some expr - | _ -> None) - - /// Matches a nested dangling construct that could become problematic - /// if the surrounding parens were removed. - [] - let (|Problematic|_|) = - dangling (function - | SynExpr.Lambda _ - | SynExpr.MatchLambda _ - | SynExpr.Match _ - | SynExpr.MatchBang _ - | SynExpr.TryWith _ - | SynExpr.TryFinally _ - | SynExpr.IfThenElse _ - | SynExpr.Sequential _ - | SynExpr.LetOrUse _ - | SynExpr.Set _ - | SynExpr.LongIdentSet _ - | SynExpr.DotIndexedSet _ - | SynExpr.DotNamedIndexedPropertySet _ - | SynExpr.DotSet _ - | SynExpr.NamedIndexedPropertySet _ as expr -> Some expr - | _ -> None) - - /// If the given expression is a parenthesized expression and the parentheses - /// are unnecessary in the given context, returns the unnecessary parentheses' range. - let rec unnecessaryParentheses (getSourceLineStr: int -> string) expr path = - let unnecessaryParentheses = unnecessaryParentheses getSourceLineStr - - // Indicates whether the parentheses with the given range - // enclose an expression whose indentation would be invalid - // in context if it were not surrounded by parentheses. - let containsSensitiveIndentation outerOffsides (parenRange: range) = - let startLine = parenRange.StartLine - let endLine = parenRange.EndLine - - if startLine = endLine then - false - else - let rec loop offsides lineNo startCol = - if lineNo <= endLine then - let line = getSourceLineStr lineNo - - match offsides with - | ValueNone -> - let i = line.AsSpan(startCol).IndexOfAnyExcept(' ', ')') - - if i >= 0 then - let newOffsides = i + startCol - newOffsides <= outerOffsides || loop (ValueSome newOffsides) (lineNo + 1) 0 - else - loop offsides (lineNo + 1) 0 - - | ValueSome offsidesCol -> - let i = line.AsSpan(0, min offsidesCol line.Length).IndexOfAnyExcept(' ', ')') - - if i >= 0 && i < offsidesCol then - let slice = line.AsSpan(i, min (offsidesCol - i) (line.Length - i)) - let j = slice.IndexOfAnyExcept("*/%-+:^@><=!|0$.?".AsSpan()) - - let lo = i + (if j >= 0 && slice[j] = ' ' then j else 0) - lo < offsidesCol - 1 || lo <= outerOffsides || loop offsides (lineNo + 1) 0 - else - loop offsides (lineNo + 1) 0 - else - false - - loop ValueNone startLine (parenRange.StartColumn + 1) - - // Matches if the given expression starts with a symbol, e.g., <@ … @>, $"…", @"…", +1, -1… - let (|StartsWithSymbol|_|) = - let (|TextStartsWith|) (m: range) = - let line = getSourceLineStr m.StartLine - line[m.StartColumn] - - let (|StartsWith|) (s: string) = s[0] - - function - | SynExpr.Quote _ - | SynExpr.InterpolatedString _ - | SynExpr.Const(SynConst.String(synStringKind = SynStringKind.Verbatim), _) - | SynExpr.Const(SynConst.Byte _, TextStartsWith '+') - | SynExpr.Const(SynConst.UInt16 _, TextStartsWith '+') - | SynExpr.Const(SynConst.UInt32 _, TextStartsWith '+') - | SynExpr.Const(SynConst.UInt64 _, TextStartsWith '+') - | SynExpr.Const(SynConst.UIntPtr _, TextStartsWith '+') - | SynExpr.Const(SynConst.SByte _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.Int16 _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.Int32 _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.Int64 _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.IntPtr _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.Decimal _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.Double _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.Single _, TextStartsWith('-' | '+')) - | SynExpr.Const(SynConst.Measure(_, TextStartsWith('-' | '+'), _, _), _) - | SynExpr.Const(SynConst.UserNum(StartsWith('-' | '+'), _), _) -> Some StartsWithSymbol - | _ -> None - - // Matches if the given expression is a numeric literal - // that it is safe to "dot into," e.g., 1l, 0b1, 1e10, 1d, 1.0… - let (|DotSafeNumericLiteral|_|) = - /// 1l, 1d, 0b1, 0x1, 0o1, 1e10… - let (|TextContainsLetter|_|) (m: range) = - let line = getSourceLineStr m.StartLine - let span = line.AsSpan(m.StartColumn, m.EndColumn - m.StartColumn) - - if span.LastIndexOfAnyInRange('A', 'z') >= 0 then - Some TextContainsLetter - else - None - - // 1.0… - let (|TextEndsWithNumber|_|) (m: range) = - let line = getSourceLineStr m.StartLine - let span = line.AsSpan(m.StartColumn, m.EndColumn - m.StartColumn) - - if Char.IsDigit span[span.Length - 1] then - Some TextEndsWithNumber - else - None - - function - | SynExpr.Const(SynConst.Byte _, _) - | SynExpr.Const(SynConst.UInt16 _, _) - | SynExpr.Const(SynConst.UInt32 _, _) - | SynExpr.Const(SynConst.UInt64 _, _) - | SynExpr.Const(SynConst.UIntPtr _, _) - | SynExpr.Const(SynConst.SByte _, _) - | SynExpr.Const(SynConst.Int16 _, _) - | SynExpr.Const(SynConst.Int32 _, TextContainsLetter) - | SynExpr.Const(SynConst.Int64 _, _) - | SynExpr.Const(SynConst.IntPtr _, _) - | SynExpr.Const(SynConst.Decimal _, _) - | SynExpr.Const(SynConst.Double _, (TextEndsWithNumber | TextContainsLetter)) - | SynExpr.Const(SynConst.Single _, _) - | SynExpr.Const(SynConst.Measure _, _) - | SynExpr.Const(SynConst.UserNum _, _) -> Some DotSafeNumericLiteral - | _ -> None - - match expr, path with - // Check for nested matches, e.g., - // - // match … with … -> (…, match … with … -> … | … -> …) | … -> … - | SynExpr.Paren _, SyntaxNode.SynMatchClause _ :: path -> unnecessaryParentheses expr path - - // We always need parens for trait calls, e.g., - // - // let inline f x = (^a : (static member Parse : string -> ^a) x) - | SynExpr.Paren(expr = SynExpr.TraitCall _), _ -> ValueNone - - // Don't touch library-only stuff: - // - // (# "ldlen.multi 2 0" array : int #) - | SynExpr.Paren(expr = SynExpr.LibraryOnlyILAssembly _), _ - | SynExpr.Paren(expr = SynExpr.LibraryOnlyStaticOptimization _), _ - | SynExpr.Paren(expr = SynExpr.LibraryOnlyUnionCaseFieldGet _), _ - | SynExpr.Paren(expr = SynExpr.LibraryOnlyUnionCaseFieldSet _), _ -> ValueNone - - // Parens are required around the body expresion of a binding - // if the parenthesized expression would be invalid without its parentheses, e.g., - // - // let x = (x - // + y) - | SynExpr.Paren(rightParenRange = Some _; range = parenRange), - SyntaxNode.SynBinding(SynBinding(trivia = { LeadingKeyword = leadingKeyword })) :: _ when - containsSensitiveIndentation leadingKeyword.Range.StartColumn parenRange - -> - ValueNone - - // Parens are otherwise never required for binding bodies or for top-level expressions, e.g., - // - // let x = (…) - // _.member X = (…) - // (printfn "Hello, world.") - | SynExpr.Paren(rightParenRange = Some _; range = range), SyntaxNode.SynBinding _ :: _ - | SynExpr.Paren(rightParenRange = Some _; range = range), SyntaxNode.SynModule _ :: _ -> ValueSome range - - // Parens must be kept when there is a high-precedence function application - // before a prefix operator application before another expression that starts with a symbol, e.g., - // - // id -(-x) - // id -(-1y) - // id -($"") - // id -(@"") - // id -(<@ ValueNone @>) - // let (~+) _ = true in assert +($"{true}") - | SynExpr.Paren(expr = PrefixApp _ | StartsWithSymbol), - SyntaxNode.SynExpr(SynExpr.App _) :: SyntaxNode.SynExpr(HighPrecedenceApp | SynExpr.Assert _ | SynExpr.InferredUpcast _ | SynExpr.InferredDowncast _) :: _ -> - ValueNone - - // Parens are never required around suffixed or infixed numeric literals, e.g., - // - // (1l).ToString() - // (1uy).ToString() - // (0b1).ToString() - // (1e10).ToString() - // (1.0).ToString() - | SynExpr.Paren(expr = DotSafeNumericLiteral; rightParenRange = Some _; range = range), _ -> ValueSome range - - // Parens are required around bare decimal ints or doubles ending - // in dots when being dotted into, e.g., - // - // (1).ToString() - // (1.).ToString() - | SynExpr.Paren(expr = SynExpr.Const(constant = SynConst.Int32 _ | SynConst.Double _)), - SyntaxNode.SynExpr(SynExpr.DotGet _) :: _ -> ValueNone - - // Parens are required around join conditions: - // - // join … on (… = …) - | SynExpr.Paren(expr = SynExpr.App _), SyntaxNode.SynExpr(SynExpr.App _) :: SyntaxNode.SynExpr(SynExpr.JoinIn _) :: _ -> - ValueNone - - // Parens are not required around a few anointed expressions after inherit: - // - // inherit T(3) - // inherit T(null) - // inherit T("") - // … - | SynExpr.Paren(expr = AtomicExprAfterType; range = range), SyntaxNode.SynMemberDefn(SynMemberDefn.ImplicitInherit _) :: _ -> - ValueSome range - - // Parens are otherwise required in inherit T(x), etc. - | SynExpr.Paren _, SyntaxNode.SynMemberDefn(SynMemberDefn.ImplicitInherit _) :: _ -> ValueNone - - // We can't remove parens when they're required for fluent calls: - // - // x.M(y).N z - // x.M(y).[z] - // (f x)[z] - // (f(x))[z] - // x.M(y)[z] - | SynExpr.Paren _, SyntaxNode.SynExpr(SynExpr.App _) :: SyntaxNode.SynExpr(SynExpr.DotGet _ | SynExpr.DotIndexedGet _) :: _ - | SynExpr.Paren(expr = SynExpr.App _), - SyntaxNode.SynExpr(SynExpr.App(argExpr = SynExpr.ArrayOrListComputed(isArray = false))) :: _ - | SynExpr.Paren _, - SyntaxNode.SynExpr(SynExpr.App _) :: SyntaxNode.SynExpr(SynExpr.App(argExpr = SynExpr.ArrayOrListComputed(isArray = false))) :: _ -> - ValueNone - - // Parens must stay around binary equals expressions in argument - // position lest they be interpreted as named argument assignments: - // - // o.M((x = y)) - // o.N((x = y), z) - | SynExpr.Paren(expr = SynExpr.Paren(expr = InfixApp(Eq, _))), - SyntaxNode.SynExpr(SynExpr.App(funcExpr = SynExpr.LongIdent _)) :: _ - | SynExpr.Paren(expr = InfixApp(Eq, _)), - SyntaxNode.SynExpr(SynExpr.Paren _) :: SyntaxNode.SynExpr(SynExpr.App(funcExpr = SynExpr.LongIdent _)) :: _ - | SynExpr.Paren(expr = InfixApp(Eq, _)), - SyntaxNode.SynExpr(SynExpr.Tuple(isStruct = false)) :: SyntaxNode.SynExpr(SynExpr.Paren _) :: SyntaxNode.SynExpr(SynExpr.App( - funcExpr = SynExpr.LongIdent _)) :: _ -> ValueNone - - // The :: operator is parsed differently from other symbolic infix operators, - // so we need to give it special treatment. - - // Outer right: - // - // (x) :: xs - // (x * y) :: zs - // … - | SynExpr.Paren(rightParenRange = Some _), - SyntaxNode.SynExpr(SynExpr.Tuple(isStruct = false; exprs = [ SynExpr.Paren _; _ ])) :: (SyntaxNode.SynExpr(SynExpr.App( - isInfix = true)) :: _ as path) -> unnecessaryParentheses expr path - - // Outer left: - // - // x :: (xs) - // x :: (ys @ zs) - // … - | SynExpr.Paren(rightParenRange = Some _) as argExpr, - SyntaxNode.SynExpr(SynExpr.Tuple(isStruct = false; exprs = [ _; SynExpr.Paren _ ])) :: SyntaxNode.SynExpr(SynExpr.App( - isInfix = true) as outer) :: path -> - unnecessaryParentheses - expr - (SyntaxNode.SynExpr(SynExpr.App(ExprAtomicFlag.NonAtomic, false, outer, argExpr, outer.Range)) - :: path) - - // Ordinary nested expressions. - | SynExpr.Paren(expr = inner; leftParenRange = leftParenRange; rightParenRange = Some _ as rightParenRange; range = range), - SyntaxNode.SynExpr outer :: outerPath when not (containsSensitiveIndentation outer.Range.StartColumn range) -> - let dangling expr = - match expr with - | Dangling.Problematic subExpr -> - let parenzedSubExpr = SynExpr.Paren(subExpr, leftParenRange, rightParenRange, range) - - match outer with - | SynExpr.Tuple(exprs = exprs) -> not (obj.ReferenceEquals(subExpr, List.last exprs)) - | InfixApp(_, Left) -> true - | _ -> unnecessaryParentheses parenzedSubExpr outerPath |> ValueOption.isNone - - | _ -> false - - let problematic (exprRange: range) (delimiterRange: range) = - exprRange.EndLine = delimiterRange.EndLine - && exprRange.EndColumn < delimiterRange.StartColumn - - let anyProblematic matchOrTryRange clauses = - let rec loop = - function - | [] -> false - | SynMatchClause(trivia = trivia) :: clauses -> - trivia.BarRange |> Option.exists (problematic matchOrTryRange) - || trivia.ArrowRange |> Option.exists (problematic matchOrTryRange) - || loop clauses - - loop clauses - - match outer, inner with - | ConfusableWithTypeApp, _ -> ValueNone - - | SynExpr.IfThenElse _, Dangling.Sequential _ -> ValueNone - - | SynExpr.IfThenElse(trivia = trivia), Dangling.IfThen ifThenElse when - problematic ifThenElse.Range trivia.ThenKeyword - || trivia.ElseKeyword |> Option.exists (problematic ifThenElse.Range) - -> - ValueNone - - | SynExpr.TryFinally(trivia = trivia), Dangling.Try tryExpr when problematic tryExpr.Range trivia.FinallyKeyword -> - ValueNone - - | SynExpr.Match(clauses = clauses; trivia = { WithKeyword = withKeyword }), Dangling.Match matchOrTry when - problematic matchOrTry.Range withKeyword - || anyProblematic matchOrTry.Range clauses - -> - ValueNone - - | SynExpr.MatchBang(clauses = clauses; trivia = { WithKeyword = withKeyword }), Dangling.Match matchOrTry when - problematic matchOrTry.Range withKeyword - || anyProblematic matchOrTry.Range clauses - -> - ValueNone - - | SynExpr.MatchLambda(matchClauses = clauses), Dangling.Match matchOrTry when anyProblematic matchOrTry.Range clauses -> - ValueNone - - | SynExpr.TryWith(withCases = clauses; trivia = trivia), Dangling.Match matchOrTry when - problematic matchOrTry.Range trivia.WithKeyword - || anyProblematic matchOrTry.Range clauses - -> - ValueNone - - | SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is inner); expr2 = expr2), Dangling.Problematic _ when - problematic inner.Range expr2.Range - -> - ValueNone - - | SynExpr.Record(copyInfo = Some(SynExpr.Paren(expr = Is inner), _)), Dangling.Problematic _ - | SynExpr.AnonRecd(copyInfo = Some(SynExpr.Paren(expr = Is inner), _)), Dangling.Problematic _ -> ValueNone - - | SynExpr.Record(recordFields = recordFields), Dangling.Problematic _ -> - let rec loop recordFields = - match recordFields with - | [] -> ValueSome range - | SynExprRecordField(expr = Some(SynExpr.Paren(expr = Is inner)); blockSeparator = Some _) :: SynExprRecordField( - fieldName = SynLongIdent(id = id :: _), _) :: _ -> - if problematic inner.Range id.idRange then - ValueNone - else - ValueSome range - | _ :: recordFields -> loop recordFields - - loop recordFields - - | SynExpr.AnonRecd(recordFields = recordFields), Dangling.Problematic _ -> - let rec loop recordFields = - match recordFields with - | [] -> ValueSome range - | (_, Some _blockSeparator, SynExpr.Paren(expr = Is inner)) :: (SynLongIdent(id = id :: _), _, _) :: _ -> - if problematic inner.Range id.idRange then - ValueNone - else - ValueSome range - | _ :: recordFields -> loop recordFields - - loop recordFields - - | SynExpr.Paren _, SynExpr.Typed _ - | SynExpr.Quote _, SynExpr.Typed _ - | SynExpr.AnonRecd _, SynExpr.Typed _ - | SynExpr.Record _, SynExpr.Typed _ - | SynExpr.While(doExpr = SynExpr.Paren(expr = Is inner)), SynExpr.Typed _ - | SynExpr.WhileBang(doExpr = SynExpr.Paren(expr = Is inner)), SynExpr.Typed _ - | SynExpr.For(doBody = Is inner), SynExpr.Typed _ - | SynExpr.ForEach(bodyExpr = Is inner), SynExpr.Typed _ - | SynExpr.Match _, SynExpr.Typed _ - | SynExpr.Do _, SynExpr.Typed _ - | SynExpr.LetOrUse(body = Is inner), SynExpr.Typed _ - | SynExpr.TryWith _, SynExpr.Typed _ - | SynExpr.TryFinally _, SynExpr.Typed _ -> ValueSome range - | _, SynExpr.Typed _ -> ValueNone - - | OuterBinaryExpr inner (outerPrecedence, side), InnerBinaryExpr innerPrecedence -> - let ambiguous = - match Precedence.compare outerPrecedence innerPrecedence with - | 0 -> - match side, Assoc.ofPrecedence innerPrecedence with - | Non, _ - | _, Non - | Left, Right -> true - | Right, Right - | Left, Left -> false - | Right, Left -> - not (Precedence.sameKind outerPrecedence innerPrecedence) - || match innerPrecedence with - | Div - | Mod - | Sub -> true - | _ -> false - - | c -> c > 0 - - if ambiguous || dangling inner then - ValueNone - else - ValueSome range - - | OuterBinaryExpr inner (_, Right), (SynExpr.Sequential _ | SynExpr.LetOrUse(trivia = { InKeyword = None })) -> ValueNone - | OuterBinaryExpr inner (_, Right), inner -> if dangling inner then ValueNone else ValueSome range - - // new T(expr) - | SynExpr.New _, AtomicExprAfterType -> ValueSome range - | SynExpr.New _, _ -> ValueNone - - // { inherit T(expr); … } - | SynExpr.Record(baseInfo = Some(_, SynExpr.Paren(expr = Is inner), _, _, _)), AtomicExprAfterType -> ValueSome range - | SynExpr.Record(baseInfo = Some(_, SynExpr.Paren(expr = Is inner), _, _, _)), _ -> ValueNone - - | _, SynExpr.Paren _ - | _, SynExpr.Quote _ - | _, SynExpr.Const _ - | _, SynExpr.Tuple(isStruct = true) - | _, SynExpr.AnonRecd _ - | _, SynExpr.ArrayOrList _ - | _, SynExpr.Record _ - | _, SynExpr.ObjExpr _ - | _, SynExpr.ArrayOrListComputed _ - | _, SynExpr.ComputationExpr _ - | _, SynExpr.TypeApp _ - | _, SynExpr.Ident _ - | _, SynExpr.LongIdent _ - | _, SynExpr.DotGet _ - | _, SynExpr.DotLambda _ - | _, SynExpr.DotIndexedGet _ - | _, SynExpr.Null _ - | _, SynExpr.InterpolatedString _ - - | SynExpr.Paren _, _ - | SynExpr.Quote _, _ - | SynExpr.Typed _, _ - | SynExpr.AnonRecd _, _ - | SynExpr.Record _, _ - | SynExpr.ObjExpr _, _ - | SynExpr.While _, _ - | SynExpr.WhileBang _, _ - | SynExpr.For _, _ - | SynExpr.ForEach _, _ - | SynExpr.Lambda _, _ - | SynExpr.MatchLambda _, _ - | SynExpr.Match _, _ - | SynExpr.MatchBang _, _ - | SynExpr.LetOrUse _, _ - | SynExpr.LetOrUseBang _, _ - | SynExpr.Sequential _, _ - | SynExpr.Do _, _ - | SynExpr.DoBang _, _ - | SynExpr.IfThenElse _, _ - | SynExpr.TryWith _, _ - | SynExpr.TryFinally _, _ - | SynExpr.ComputationExpr _, _ - | SynExpr.InterpolatedString _, _ -> ValueSome range - - | _ -> ValueNone - - | _ -> ValueNone - - module SynPat = - let (|Last|) = List.last - - /// Matches if any pattern in the given list is a SynPat.Typed. - [] - let (|AnyTyped|_|) pats = - if - pats - |> List.exists (function - | SynPat.Typed _ -> true - | _ -> false) - then - ValueSome AnyTyped - else - ValueNone - - /// Matches if any member in the given list is an inherit - /// or implementation of an interface with generic type args. - [] - let (|AnyGenericInheritOrInterfaceImpl|_|) members = - if - members - |> List.exists (function - | SynMemberDefn.ImplicitInherit(inheritType = SynType.App(typeArgs = _ :: _)) - | SynMemberDefn.ImplicitInherit(inheritType = SynType.LongIdentApp(typeArgs = _ :: _)) - | SynMemberDefn.Interface(interfaceType = SynType.App(typeArgs = _ :: _)) - | SynMemberDefn.Interface(interfaceType = SynType.LongIdentApp(typeArgs = _ :: _)) -> true - | _ -> false) - then - ValueSome AnyGenericInheritOrInterfaceImpl - else - ValueNone - - /// Matches the rightmost potentially dangling nested pattern. - let rec (|Rightmost|) pat = - match pat with - | SynPat.Or(rhsPat = Rightmost pat) - | SynPat.ListCons(rhsPat = Rightmost pat) - | SynPat.As(rhsPat = Rightmost pat) - | SynPat.Ands(pats = Last(Rightmost pat)) - | SynPat.Tuple(isStruct = false; elementPats = Last(Rightmost pat)) -> pat - | pat -> pat - - /// Matches if the given pattern is atomic. - [] - let (|Atomic|_|) pat = - match pat with - | SynPat.Named _ - | SynPat.Wild _ - | SynPat.Paren _ - | SynPat.Tuple(isStruct = true) - | SynPat.Record _ - | SynPat.ArrayOrList _ - | SynPat.Const _ - | SynPat.LongIdent(argPats = SynArgPats.Pats []) - | SynPat.Null _ - | SynPat.QuoteExpr _ -> ValueSome Atomic - | _ -> ValueNone - - /// If the given pattern is a parenthesized pattern and the parentheses - /// are unnecessary in the given context, returns the unnecessary parentheses' range. - let unnecessaryParentheses pat path = - match pat, path with - // Parens are needed in: - // - // let (Pattern …) = … - // let (x: …, y…) = … - // let (x: …), (y: …) = … - // let! (x: …) = … - // and! (x: …) = … - // use! (x: …) = … - // _.member M(x: …) = … - // match … with (x: …) -> … - // match … with (x, y: …) -> … - // function (x: …) -> … - // fun (x, y, …) -> … - // fun (x: …) -> … - // fun (Pattern …) -> … - | SynPat.Paren(SynPat.Typed _, _), SyntaxNode.SynPat(Rightmost rightmost) :: SyntaxNode.SynMatchClause _ :: _ when - obj.ReferenceEquals(pat, rightmost) - -> - ValueNone - | SynPat.Paren(Rightmost(SynPat.Typed _), _), SyntaxNode.SynMatchClause _ :: _ - | SynPat.Paren(SynPat.Typed _, _), SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ - | SynPat.Paren(SynPat.Typed _, _), - SyntaxNode.SynPat(SynPat.Tuple(isStruct = false)) :: SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ - | SynPat.Paren(SynPat.Tuple(isStruct = false; elementPats = AnyTyped), _), SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ - | SynPat.Paren(SynPat.Typed _, _), SyntaxNode.SynPat(SynPat.Tuple(isStruct = false)) :: SyntaxNode.SynBinding _ :: _ - | SynPat.Paren(SynPat.Tuple(isStruct = false; elementPats = AnyTyped), _), SyntaxNode.SynBinding _ :: _ - | SynPat.Paren(SynPat.LongIdent(argPats = SynArgPats.Pats(_ :: _)), _), SyntaxNode.SynBinding _ :: _ - | SynPat.Paren(SynPat.LongIdent(argPats = SynArgPats.Pats(_ :: _)), _), SyntaxNode.SynExpr(SynExpr.Lambda _) :: _ - | SynPat.Paren(SynPat.Tuple(isStruct = false), _), SyntaxNode.SynExpr(SynExpr.Lambda(parsedData = Some _)) :: _ - | SynPat.Paren(SynPat.Typed _, _), SyntaxNode.SynExpr(SynExpr.Lambda(parsedData = Some _)) :: _ -> ValueNone - - // () is parsed as this. - | SynPat.Paren(SynPat.Const(SynConst.Unit, _), _), _ -> ValueNone - - // (()) is required when overriding a generic member - // where unit is the generic type argument: - // - // type C<'T> = abstract M : 'T -> unit - // let _ = { new C with override _.M (()) = () } - | SynPat.Paren(SynPat.Paren(SynPat.Const(SynConst.Unit, _), _), _), - SyntaxNode.SynPat(SynPat.LongIdent _) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynExpr(SynExpr.ObjExpr( - objType = SynType.App(typeArgs = _ :: _) | SynType.LongIdentApp(typeArgs = _ :: _))) :: _ - | SynPat.Paren(SynPat.Paren(SynPat.Const(SynConst.Unit, _), _), _), - SyntaxNode.SynPat(SynPat.LongIdent _) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynMemberDefn _ :: SyntaxNode.SynTypeDefn(SynTypeDefn( - typeRepr = SynTypeDefnRepr.ObjectModel(members = AnyGenericInheritOrInterfaceImpl))) :: _ -> ValueNone - - // Parens are required around the atomic argument of - // any additional `new` constructor that is not the last. - // - // type T … = - // new (x) = … - // new (x, y) = … - | SynPat.Paren(Atomic, range), - SyntaxNode.SynPat(SynPat.LongIdent(longDotId = SynLongIdent(id = [ Ident "new" ]))) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynMemberDefn _ :: SyntaxNode.SynTypeDefn(SynTypeDefn( - typeRepr = SynTypeDefnRepr.ObjectModel(members = members))) :: _ -> - let lastNew = - (ValueNone, members) - ||> List.fold (fun lastNew ``member`` -> - match ``member`` with - | SynMemberDefn.Member( - memberDefn = SynBinding(headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = [ Ident "new" ])))) -> - ValueSome ``member`` - | _ -> lastNew) - - match lastNew with - | ValueSome(SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.LongIdent(argPats = SynArgPats.Pats [ Is pat ])))) -> - ValueSome range - | _ -> ValueNone - - // Parens are otherwise never needed in these cases: - // - // let (x: …) = … - // for (…) in (…) do … - // let! (…) = … - // and! (…) = … - // use! (…) = … - // match … with (…) -> … - // function (…) -> … - // function (Pattern …) -> … - // fun (x) -> … - | SynPat.Paren(_, range), SyntaxNode.SynBinding _ :: _ - | SynPat.Paren(_, range), SyntaxNode.SynExpr(SynExpr.ForEach _) :: _ - | SynPat.Paren(_, range), SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ - | SynPat.Paren(_, range), SyntaxNode.SynMatchClause _ :: _ - | SynPat.Paren(Atomic, range), SyntaxNode.SynExpr(SynExpr.Lambda(parsedData = Some _)) :: _ -> ValueSome range - - // Nested patterns. - | SynPat.Paren(inner, range), SyntaxNode.SynPat outer :: _ -> - match outer, inner with - // (x :: xs) :: ys - // (x, xs) :: ys - | SynPat.ListCons(lhsPat = SynPat.Paren(pat = Is inner)), SynPat.ListCons _ - | SynPat.ListCons(lhsPat = SynPat.Paren(pat = Is inner)), SynPat.Tuple(isStruct = false) -> ValueNone - - // A as (B | C) - // A as (B & C) - // x as (y, z) - // xs as (y :: zs) - | SynPat.As(rhsPat = SynPat.Paren(pat = Is inner)), - (SynPat.Or _ | SynPat.Ands _ | SynPat.Tuple(isStruct = false) | SynPat.ListCons _) -> ValueNone - - // (A | B) :: xs - // (A & B) :: xs - // (x as y) :: xs - | SynPat.ListCons _, SynPat.Or _ - | SynPat.ListCons _, SynPat.Ands _ - | SynPat.ListCons _, SynPat.As _ -> ValueNone - - // Pattern (x = (…)) - | SynPat.LongIdent(argPats = SynArgPats.NamePatPairs _), _ -> ValueSome range - - // Pattern (x : int) - // Pattern ([] x) - // Pattern (:? int) - // Pattern (A :: _) - // Pattern (A | B) - // Pattern (A & B) - // Pattern (A as B) - // Pattern (A, B) - // Pattern1 (Pattern2 (x = A)) - // Pattern1 (Pattern2 x y) - | SynPat.LongIdent _, SynPat.Typed _ - | SynPat.LongIdent _, SynPat.Attrib _ - | SynPat.LongIdent _, SynPat.IsInst _ - | SynPat.LongIdent _, SynPat.ListCons _ - | SynPat.LongIdent _, SynPat.Or _ - | SynPat.LongIdent _, SynPat.Ands _ - | SynPat.LongIdent _, SynPat.As _ - | SynPat.LongIdent _, SynPat.Tuple(isStruct = false) - | SynPat.LongIdent _, SynPat.LongIdent(argPats = SynArgPats.NamePatPairs _) - | SynPat.LongIdent _, SynPat.LongIdent(argPats = SynArgPats.Pats(_ :: _)) - - // A | (B as C) - // A & (B as C) - // A, (B as C) - | SynPat.Or _, SynPat.As _ - | SynPat.Ands _, SynPat.As _ - | SynPat.Tuple _, SynPat.As _ - - // x, (y, z) - // x & (y, z) - // (x, y) & z - | SynPat.Tuple _, SynPat.Tuple(isStruct = false) - | SynPat.Ands _, SynPat.Tuple(isStruct = false) - - // A, (B | C) - // A & (B | C) - | SynPat.Tuple _, SynPat.Or _ - | SynPat.Ands _, SynPat.Or _ -> ValueNone - - // (x : int) & y - // x & (y : int) & z - | SynPat.Ands(Last(SynPat.Paren(pat = Is inner)), _), SynPat.Typed _ -> ValueSome range - | SynPat.Ands _, SynPat.Typed _ -> ValueNone - - | _, SynPat.Const _ - | _, SynPat.Wild _ - | _, SynPat.Named _ - | _, SynPat.Typed _ - | _, SynPat.LongIdent(argPats = SynArgPats.Pats []) - | _, SynPat.Tuple(isStruct = true) - | _, SynPat.Paren _ - | _, SynPat.ArrayOrList _ - | _, SynPat.Record _ - | _, SynPat.Null _ - | _, SynPat.OptionalVal _ - | _, SynPat.IsInst _ - | _, SynPat.QuoteExpr _ - - | SynPat.Or _, _ - | SynPat.ListCons _, _ - | SynPat.Ands _, _ - | SynPat.As _, _ - | SynPat.LongIdent _, _ - | SynPat.Tuple _, _ - | SynPat.Paren _, _ - | SynPat.ArrayOrList _, _ - | SynPat.Record _, _ -> ValueSome range - - | _ -> ValueNone - - | _ -> ValueNone - - let getUnnecessaryParentheses (getSourceLineStr: int -> string) (parsedInput: ParsedInput) : Async = - async { - let ranges = HashSet Range.comparer - - let visitor = - { new SyntaxVisitorBase() with - member _.VisitExpr(path, _, defaultTraverse, expr) = - SynExpr.unnecessaryParentheses getSourceLineStr expr path - |> ValueOption.iter (ranges.Add >> ignore) - - defaultTraverse expr - - member _.VisitPat(path, defaultTraverse, pat) = - SynPat.unnecessaryParentheses pat path - |> ValueOption.iter (ranges.Add >> ignore) - - defaultTraverse pat - } - - SyntaxTraversal.traverseAll visitor parsedInput - return ranges - } diff --git a/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fsi b/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fsi index 836bfce0c5..672cf08875 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fsi +++ b/src/fcs-fable/src/Compiler/Service/ServiceAnalysis.fsi @@ -3,7 +3,6 @@ namespace FSharp.Compiler.EditorServices open FSharp.Compiler.CodeAnalysis -open FSharp.Compiler.Syntax open FSharp.Compiler.Text module public UnusedOpens = @@ -32,14 +31,3 @@ module public UnusedDeclarations = /// Get all unused declarations in a file val getUnusedDeclarations: checkFileResults: FSharpCheckFileResults * isScriptFile: bool -> Async> - -module public UnnecessaryParentheses = - - /// Gets the ranges of all unnecessary pairs of parentheses in a file. - /// - /// Note that this may include pairs of nested ranges each of whose - /// lack of necessity depends on the other's presence, such - /// that it is valid to remove either set of parentheses but not both, e.g.: - /// - /// (x.M(y)).N → (x.M y).N ↮ x.M(y).N - val getUnnecessaryParentheses: getSourceLineStr: (int -> string) -> parsedInput: ParsedInput -> Async diff --git a/src/fcs-fable/src/Compiler/Service/ServiceAssemblyContent.fs b/src/fcs-fable/src/Compiler/Service/ServiceAssemblyContent.fs index 46d5ad97d7..49c63aa31b 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceAssemblyContent.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceAssemblyContent.fs @@ -13,6 +13,19 @@ open Internal.Utilities.Library open FSharp.Compiler.Diagnostics open FSharp.Compiler.IO open FSharp.Compiler.Symbols +open FSharp.Compiler.Syntax + +module Utils = + let replaceLastIdentToDisplayName idents (displayName: string) = + match idents |> Array.tryFindIndexBack (fun i -> displayName.StartsWith(i, System.StringComparison.Ordinal)) with + | Some x when x = idents.Length - 1 -> idents |> Array.replace (idents.Length - 1) displayName + | Some x -> + let newIdents = Array.zeroCreate (x + 1) + Array.Copy(idents, newIdents, x) + newIdents[x] <- displayName + newIdents + | _ -> idents + type IsAutoOpen = bool @@ -80,10 +93,9 @@ type Parent = else ident) let removeModuleSuffix (idents: ShortIdents) = - if entity.IsFSharpModule && idents.Length > 0 then + if (entity.IsFSharpModule || PrettyNaming.DoesIdentifierNeedBackticks entity.DisplayName) && idents.Length > 0 then let lastIdent = idents[idents.Length - 1] - if lastIdent <> entity.DisplayName then - idents |> Array.replace (idents.Length - 1) entity.DisplayName + if lastIdent <> entity.DisplayName then Utils.replaceLastIdentToDisplayName idents entity.DisplayName else idents else idents @@ -110,19 +122,22 @@ type IAssemblyContentCache = module AssemblyContent = - let UnresolvedSymbol (topRequireQualifiedAccessParent: ShortIdents option) (cleanedIdents: ShortIdents) (fullName: string) = + let UnresolvedSymbol (topRequireQualifiedAccessParent: ShortIdents option) (cleanedIdents: ShortIdents) (fullName: string) ns = let getNamespace (idents: ShortIdents) = if idents.Length > 1 then Some idents[..idents.Length - 2] else None + // 1. get namespace/module to open from topRequireQualifiedAccessParent + // 2. if the topRequireQualifiedAccessParent is None, use the namespace, as we don't know whether an ident is namespace/module or not let ns = topRequireQualifiedAccessParent - |> Option.bind getNamespace - |> Option.orElseWith (fun () -> getNamespace cleanedIdents) - |> Option.defaultValue [||] - + |> Option.bind getNamespace + |> Option.orElse ns + |> Option.defaultWith (fun _ -> Array.empty) + |> Array.map PrettyNaming.NormalizeIdentifierBackticks + let displayName = let nameIdents = if cleanedIdents.Length > ns.Length then cleanedIdents |> Array.skip ns.Length else cleanedIdents - nameIdents |> String.concat "." + nameIdents |> Array.map PrettyNaming.NormalizeIdentifierBackticks |> String.concat "." { FullName = fullName DisplayName = displayName @@ -132,6 +147,7 @@ module AssemblyContent = parent.FormatEntityFullName entity |> Option.map (fun (fullName, cleanIdents) -> let topRequireQualifiedAccessParent = parent.TopRequiresQualifiedAccess false |> Option.map parent.FixParentModuleSuffix + { FullName = fullName CleanedIdents = cleanIdents Namespace = ns @@ -151,7 +167,7 @@ module AssemblyContent = match entity with | FSharpSymbolPatterns.Attribute -> EntityKind.Attribute | _ -> EntityKind.Type - UnresolvedSymbol = UnresolvedSymbol topRequireQualifiedAccessParent cleanIdents fullName + UnresolvedSymbol = UnresolvedSymbol topRequireQualifiedAccessParent cleanIdents fullName ns }) let traverseMemberFunctionAndValues ns (parent: Parent) (membersFunctionsAndValues: seq) = @@ -170,10 +186,18 @@ module AssemblyContent = AutoOpenParent = autoOpenParent Symbol = func Kind = fun _ -> EntityKind.FunctionOrValue func.IsActivePattern - UnresolvedSymbol = UnresolvedSymbol topRequireQualifiedAccessParent cleanedIdents fullName } + UnresolvedSymbol = UnresolvedSymbol topRequireQualifiedAccessParent cleanedIdents fullName ns } [ yield! func.TryGetFullDisplayName() - |> Option.map (fun fullDisplayName -> processIdents func.FullName (fullDisplayName.Split '.')) + |> Option.map (fun fullDisplayName -> + let idents = (fullDisplayName.Split '.') + let lastIdent = idents[idents.Length - 1] + let idents = + match Option.attempt (fun _ -> func.DisplayName) with + | Some shortDisplayName when PrettyNaming.DoesIdentifierNeedBackticks shortDisplayName && lastIdent <> shortDisplayName -> + Utils.replaceLastIdentToDisplayName idents shortDisplayName + | _ -> idents + processIdents func.FullName idents) |> Option.toList (* for [] diff --git a/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fs b/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fs index 90b83fd377..acae7acdea 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fs @@ -86,7 +86,9 @@ type CompletionItem = IsOwnMember: bool MinorPriority: int Type: TyconRef option - Unresolved: UnresolvedSymbol option } + Unresolved: UnresolvedSymbol option + CustomInsertText: string voption + CustomDisplayText: string voption } member x.Item = x.ItemWithInst.Item [] @@ -119,7 +121,7 @@ module DeclarationListHelpers = { new IPartialEqualityComparer with member x.InEqualityRelation item = itemComparer.InEqualityRelation item.Item - member x.Equals(item1, item2) = itemComparer.Equals(item1.Item, item2.Item) + member x.Equals(item1, item2) = nullSafeEquality item1 item2 (fun item1 item2 -> itemComparer.Equals(item1.Item, item2.Item)) member x.GetHashCode item = itemComparer.GetHashCode(item.Item) } /// Remove all duplicate items @@ -136,7 +138,7 @@ module DeclarationListHelpers = modrefs |> IPartialEqualityComparer.partialDistinctBy { new IPartialEqualityComparer with member x.InEqualityRelation _ = true - member x.Equals(item1, item2) = (fullDisplayTextOfModRef item1 = fullDisplayTextOfModRef item2) + member x.Equals(item1, item2) = nullSafeEquality item1 item2 (fun item1 item2 -> fullDisplayTextOfModRef item1 = fullDisplayTextOfModRef item2) member x.GetHashCode item = hash item.Stamp } let OutputFullName displayFullName ppF fnF r = @@ -155,7 +157,7 @@ module DeclarationListHelpers = let rec FormatItemDescriptionToToolTipElement displayFullName (infoReader: InfoReader) ad m denv (item: ItemWithInst) symbol (width: int option) = let g = infoReader.g let amap = infoReader.amap - let denv = SimplerDisplayEnv denv + let denv = {SimplerDisplayEnv denv with showCsharpCodeAnalysisAttributes = true } let xml = GetXmlCommentForItem infoReader m item.Item match item.Item with @@ -358,19 +360,7 @@ module DeclarationListHelpers = | Item.CtorGroup(_, minfos) | Item.MethodGroup(_, minfos, _) -> FormatOverloadsToList infoReader m denv item minfos symbol width - - // The 'fake' zero-argument constructors of .NET interfaces. - // This ideally should never appear in intellisense, but we do get here in repros like: - // type IFoo = abstract F : int - // type II = IFoo // remove 'type II = ' and quickly hover over IFoo before it gets squiggled for 'invalid use of interface type' - // and in that case we'll just show the interface type name. - | Item.FakeInterfaceCtor ty -> - let ty, _ = PrettyTypes.PrettifyType g ty - let layout = NicePrint.layoutTyconRef denv (tcrefOfAppTy g ty) - let layout = PrintUtilities.squashToWidth width layout - let layout = toArray layout - ToolTipElement.Single(layout, xml, ?symbol = symbol) - + // The 'fake' representation of constructors of .NET delegate types | Item.DelegateCtor delTy -> let delTy, _cxs = PrettyTypes.PrettifyType g delTy @@ -848,14 +838,10 @@ module internal DescriptionListsImpl = let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInstantiation [] retTy [], prettyRetTyL // no parameter data available for binary operators like 'zip', 'join' and 'groupJoin' since they use bespoke syntax - | Item.FakeInterfaceCtor ty -> - let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInstantiation [] ty - [], prettyRetTyL - | Item.DelegateCtor delTy -> let (SigOfFunctionForDelegate(_, _, _, delFuncTy)) = GetSigOfFunctionForDelegate infoReader delTy m AccessibleFromSomewhere - // No need to pass more generic type information in here since the instanitations have already been applied + // No need to pass more generic type information in here since the instantiations have already been applied let _prettyTyparInst, prettyParams, prettyRetTyL, _prettyConstraintsL = PrettyParamsOfParamDatas g denv item.TyparInstantiation [ParamData(false, false, false, NotOptional, NoCallerInfo, None, ReflectedArgInfo.None, delFuncTy)] delTy // FUTURE: prettyTyparInst is the pretty version of the known instantiations of type parameters in the output. It could be returned @@ -940,7 +926,6 @@ module internal DescriptionListsImpl = | Item.Property _ -> FSharpGlyph.Property | Item.CtorGroup _ | Item.DelegateCtor _ - | Item.FakeInterfaceCtor _ | Item.CustomOperation _ -> FSharpGlyph.Method | Item.MethodGroup (_, minfos, _) when minfos |> List.forall (fun minfo -> minfo.IsExtensionMember) -> FSharpGlyph.ExtensionMethod | Item.MethodGroup _ -> FSharpGlyph.Method @@ -986,7 +971,6 @@ module internal DescriptionListsImpl = | Item.CtorGroup(nm, cinfos) -> List.map (fun minfo -> Item.CtorGroup(nm, [minfo])) cinfos | Item.Trait traitInfo -> if traitInfo.GetLogicalArgumentTypes(g).IsEmpty then [] else [item] - | Item.FakeInterfaceCtor _ | Item.DelegateCtor _ -> [item] | Item.NewDef _ | Item.ILField _ -> [] @@ -1107,9 +1091,9 @@ type DeclarationListInfo(declarations: DeclarationListItem[], isForType: bool, i items |> List.map (fun x -> match x.Item with + | Item.Types (_, TType_app(tcref, _, _) :: _) when isInterfaceTyconRef tcref -> { x with MinorPriority = 1000 + tcref.TyparsNoRange.Length } | Item.Types (_, TType_app(tcref, _, _) :: _) -> { x with MinorPriority = 1 + tcref.TyparsNoRange.Length } // Put delegate ctors after types, sorted by #typars. RemoveDuplicateItems will remove FakeInterfaceCtor and DelegateCtor if an earlier type is also reported with this name - | Item.FakeInterfaceCtor (TType_app(tcref, _, _)) | Item.DelegateCtor (TType_app(tcref, _, _)) -> { x with MinorPriority = 1000 + tcref.TyparsNoRange.Length } // Put type ctors after types, sorted by #typars. RemoveDuplicateItems will remove DefaultStructCtors if a type is also reported with this name | Item.CtorGroup (_, cinfo :: _) -> { x with MinorPriority = 1000 + 10 * cinfo.DeclaringTyconRef.TyparsNoRange.Length } @@ -1143,19 +1127,23 @@ type DeclarationListInfo(declarations: DeclarationListItem[], isForType: bool, i match u.Namespace with | [||] -> u.DisplayName | ns -> (ns |> String.concat ".") + "." + u.DisplayName - | None -> x.Item.DisplayName) + | None when x.CustomDisplayText.IsSome -> x.CustomDisplayText.Value + | None -> x.Item.DisplayName + ) |> List.map ( let textInDeclList item = match item.Unresolved with | Some u -> u.DisplayName + | None when item.CustomDisplayText.IsSome -> item.CustomDisplayText.Value | None -> item.Item.DisplayNameCore let textInCode (item: CompletionItem) = match item.Item with | Item.TypeVar (name, typar) -> (if typar.StaticReq = Syntax.TyparStaticReq.None then "'" else " ^") + name | _ -> - match item.Unresolved with - | Some u -> u.DisplayName - | None -> item.Item.DisplayName + match item.Unresolved, item.CustomInsertText with + | Some u, _ -> u.DisplayName + | None, ValueSome textInCode -> textInCode + | None, _ -> item.Item.DisplayName if not supportsPreferExtsMethodsOverProperty then // we don't pay the cost of filtering specific to RFC-1137 // nor risk a change in behaviour for the intellisense item list @@ -1325,15 +1313,15 @@ type MethodGroup( name: string, unsortedMethods: MethodGroupItem[] ) = unsortedMethods // Methods with zero arguments show up here as taking a single argument of type 'unit'. Patch them now to appear as having zero arguments. |> Array.map (fun meth -> - let parms = meth.Parameters - if parms.Length = 1 && parms[0].CanonicalTypeTextForSorting="Microsoft.FSharp.Core.Unit" then + let params_ = meth.Parameters + if params_.Length = 1 && params_[0].CanonicalTypeTextForSorting="Microsoft.FSharp.Core.Unit" then MethodGroupItem(meth.Description, meth.XmlDoc, meth.ReturnTypeText, [||], true, meth.HasParamArrayArg, meth.StaticParameters) else meth) // Fix the order of methods, to be stable for unit testing. |> Array.sortBy (fun meth -> - let parms = meth.Parameters - parms.Length, (parms |> Array.map (fun p -> p.CanonicalTypeTextForSorting))) + let params_ = meth.Parameters + params_.Length, (params_ |> Array.map (fun p -> p.CanonicalTypeTextForSorting))) member _.MethodName = name diff --git a/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fsi b/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fsi index 4611ff86a1..3aeaa11112 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fsi +++ b/src/fcs-fable/src/Compiler/Service/ServiceDeclarationLists.fsi @@ -91,6 +91,9 @@ type internal CompletionItem = Type: TyconRef option Unresolved: UnresolvedSymbol option + + CustomInsertText: string voption + CustomDisplayText: string voption } member Item: Item diff --git a/src/fcs-fable/src/Compiler/Service/ServiceInterfaceStubGenerator.fs b/src/fcs-fable/src/Compiler/Service/ServiceInterfaceStubGenerator.fs index e02df4c7da..fb3e8dfbec 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceInterfaceStubGenerator.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceInterfaceStubGenerator.fs @@ -41,7 +41,7 @@ module internal CodeGenerationUtils = member _.Unindent i = indentWriter.Indent <- max 0 (indentWriter.Indent - i) - member _.Dump() = indentWriter.InnerWriter.ToString() + member _.Dump() = !! indentWriter.InnerWriter.ToString() interface IDisposable with member _.Dispose() = @@ -154,7 +154,7 @@ module InterfaceStubGenerator = Writer: ColumnIndentedTextWriter /// Map generic types to specific instances for specialized interface implementation - TypeInstantations: Map + TypeInstantiations: Map /// Data for interface instantiation ArgInstantiations: (FSharpGenericParameter * FSharpType) seq @@ -192,7 +192,7 @@ module InterfaceStubGenerator = let genericDefinition = ty.Instantiate(Seq.toList ctx.ArgInstantiations).Format(ctx.DisplayContext) - (genericDefinition, ctx.TypeInstantations) + (genericDefinition, ctx.TypeInstantiations) ||> Map.fold (fun s k v -> s.Replace(k, v)) // Format each argument, including its name and type @@ -680,7 +680,7 @@ module InterfaceStubGenerator = let ctx = { Writer = writer - TypeInstantations = instantiations + TypeInstantiations = instantiations ArgInstantiations = Seq.empty Indentation = indentation ObjectIdent = objectIdent @@ -825,7 +825,7 @@ module InterfaceStubGenerator = | SynMemberDefn.Open _ | SynMemberDefn.ImplicitCtor _ | SynMemberDefn.Inherit _ -> None - | SynMemberDefn.ImplicitInherit(_, expr, _, _) -> walkExpr expr + | SynMemberDefn.ImplicitInherit(_, expr, _, _, _) -> walkExpr expr and walkBinding (SynBinding(expr = expr)) = walkExpr expr @@ -952,9 +952,9 @@ module InterfaceStubGenerator = | SynExpr.Null _range | SynExpr.ImplicitZero _range -> None - | SynExpr.YieldOrReturn(_, synExpr, _range) - | SynExpr.YieldOrReturnFrom(_, synExpr, _range) - | SynExpr.DoBang(synExpr, _range) -> walkExpr synExpr + | SynExpr.YieldOrReturn(expr = synExpr) + | SynExpr.YieldOrReturnFrom(expr = synExpr) + | SynExpr.DoBang(expr = synExpr) -> walkExpr synExpr | SynExpr.LetOrUseBang(rhs = synExpr1; andBangs = synExprAndBangs; body = synExpr2) -> [ diff --git a/src/fcs-fable/src/Compiler/Service/ServiceLexing.fs b/src/fcs-fable/src/Compiler/Service/ServiceLexing.fs index 7a7f305b22..91498ea799 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceLexing.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceLexing.fs @@ -392,6 +392,7 @@ module internal TokenClassifications = | HIGH_PRECEDENCE_PAREN_APP | FIXED | HIGH_PRECEDENCE_BRACK_APP + | BAR_JUST_BEFORE_NULL | TYPE_COMING_SOON | TYPE_IS_HERE | MODULE_COMING_SOON @@ -438,7 +439,7 @@ module internal TestExpose = /// many allocated objects. /// /// The encoding is lossy so some incremental lexing scenarios such as deeply nested #if -/// or accurate error messages from lexing for mismtached #if are not supported. +/// or accurate error messages from lexing for mismatched #if are not supported. [] type FSharpTokenizerLexState = { @@ -621,12 +622,12 @@ module internal LexerStateEncoding = let tag1, i1, kind1, rest = match stringNest with | [] -> false, 0, 0, [] - | (i1, kind1, _, _) :: rest -> true, i1, encodeStringStyle kind1, rest + | (i1, kind1, _, _, _) :: rest -> true, i1, encodeStringStyle kind1, rest let tag2, i2, kind2 = match rest with | [] -> false, 0, 0 - | (i2, kind2, _, _) :: _ -> true, i2, encodeStringStyle kind2 + | (i2, kind2, _, _, _) :: _ -> true, i2, encodeStringStyle kind2 (if tag1 then 0b100000000000 else 0) ||| (if tag2 then 0b010000000000 else 0) @@ -696,9 +697,9 @@ module internal LexerStateEncoding = let nest = [ if tag1 then - i1, decodeStringStyle kind1, 0, range0 + i1, decodeStringStyle kind1, 0, None, range0 if tag2 then - i2, decodeStringStyle kind2, 0, range0 + i2, decodeStringStyle kind2, 0, None, range0 ] nest @@ -733,7 +734,7 @@ module internal LexerStateEncoding = ) | LexCont.EndLine(ifdefs, stringNest, econt) -> match econt with - | LexerEndlineContinuation.Skip(n, m) -> + | LexerEndlineContinuation.IfdefSkip(n, m) -> encodeLexCont ( FSharpTokenizerColorState.EndLineThenSkip, int64 n, @@ -833,7 +834,7 @@ module internal LexerStateEncoding = | FSharpTokenizerColorState.ExtendedInterpolatedString -> LexCont.String(ifdefs, stringNest, LexerStringStyle.ExtendedInterpolated, stringKind, delimLen, mkRange "file" p1 p1) | FSharpTokenizerColorState.EndLineThenSkip -> - LexCont.EndLine(ifdefs, stringNest, LexerEndlineContinuation.Skip(n1, mkRange "file" p1 p1)) + LexCont.EndLine(ifdefs, stringNest, LexerEndlineContinuation.IfdefSkip(n1, mkRange "file" p1 p1)) | FSharpTokenizerColorState.EndLineThenToken -> LexCont.EndLine(ifdefs, stringNest, LexerEndlineContinuation.Token) | _ -> LexCont.Token([], stringNest) @@ -1046,8 +1047,8 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, maxLength: int option, fi false, (RQUOTE(s, raw), leftc, rightc - 1) | INFIX_COMPARE_OP(LexFilter.TyparsCloseOp(greaters, afterOp) as opstr) -> match afterOp with - | None -> () - | Some tok -> delayToken (tok, leftc + greaters.Length, rightc) + | ValueNone -> () + | ValueSome tok -> delayToken (tok, leftc + greaters.Length, rightc) for i = greaters.Length - 1 downto 1 do delayToken (greaters[i]false, leftc + i, rightc - opstr.Length + i + 1) diff --git a/src/fcs-fable/src/Compiler/Service/ServiceNavigation.fs b/src/fcs-fable/src/Compiler/Service/ServiceNavigation.fs index 7f912e07e0..48f7d6dc01 100755 --- a/src/fcs-fable/src/Compiler/Service/ServiceNavigation.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceNavigation.fs @@ -332,13 +332,21 @@ module NavigationImpl = [ createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, range, enclosingEntityKind, false, access) ] - | SynMemberDefn.AutoProperty(ident = id; accessibility = access) -> + | SynMemberDefn.AutoProperty(ident = id; accessibility = access; propKind = propKind) -> + let getterAccessibility, setterAccessibility = access.GetSetAccessNoCheck() + [ - createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access) + match propKind with + | SynMemberKind.PropertyGetSet -> + yield createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, getterAccessibility) + yield createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, setterAccessibility) + | SynMemberKind.PropertySet -> + yield createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, setterAccessibility) + | _ -> yield createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, getterAccessibility) ] | SynMemberDefn.AbstractSlot(slotSig = SynValSig(ident = SynIdent(id, _); synType = ty; accessibility = access)) -> [ - createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access) + createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access.SingleAccess()) ] | SynMemberDefn.NestedType _ -> failwith "tycon as member????" //processTycon tycon | SynMemberDefn.Interface(members = Some(membs)) -> processMembers membs enclosingEntityKind |> snd @@ -377,7 +385,14 @@ module NavigationImpl = | SynModuleDecl.NestedModule(moduleInfo = SynComponentInfo(longId = lid; accessibility = access); decls = decls; range = m) -> // Find let bindings (for the right dropdown) let nested = processNestedDeclarations (decls) - let newBaseName = (if (baseName = "") then "" else baseName + ".") + (textOfLid lid) + + let newBaseName = + (if (String.IsNullOrEmpty(baseName)) then + "" + else + baseName + ".") + + (textOfLid lid) + let other = processNavigationTopLevelDeclarations (newBaseName, decls) let mBody = unionRangesChecked (rangeOfDecls nested) (moduleRange (rangeOfLid lid) other) @@ -557,10 +572,18 @@ module NavigationImpl = [ for memb in members do match memb with - | SynMemberSig.Member(memberSig = SynValSig.SynValSig(ident = SynIdent(id, _); accessibility = access; range = m)) -> - createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, access) + | SynMemberSig.Member(memberSig = SynValSig.SynValSig(ident = SynIdent(id, _); accessibility = access; range = m); flags = { MemberKind = propKind }) -> + let getterAccessibility, setterAccessibility = access.GetSetAccessNoCheck() + + match propKind with + | SynMemberKind.PropertyGetSet -> + yield createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, getterAccessibility) + yield createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, setterAccessibility) + | SynMemberKind.PropertySet -> + yield createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, setterAccessibility) + | _ -> yield createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, getterAccessibility) | SynMemberSig.ValField(SynField(idOpt = Some rcid; fieldType = ty; accessibility = access), _) -> - createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, ty.Range, NavigationEntityKind.Class, false, access) + yield createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, ty.Range, NavigationEntityKind.Class, false, access) | _ -> () ] @@ -570,7 +593,7 @@ module NavigationImpl = for decl in decls do match decl with | SynModuleSigDecl.Val(SynValSig.SynValSig(ident = SynIdent(id, _); accessibility = access; range = m), _) -> - createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Module, false, access) + createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Module, false, access.SingleAccess()) | _ -> () ] @@ -587,7 +610,14 @@ module NavigationImpl = | SynModuleSigDecl.NestedModule(moduleInfo = SynComponentInfo(longId = lid; accessibility = access); moduleDecls = decls; range = m) -> // Find let bindings (for the right dropdown) let nested = processNestedSigDeclarations (decls) - let newBaseName = (if baseName = "" then "" else baseName + ".") + (textOfLid lid) + + let newBaseName = + (if String.IsNullOrEmpty(baseName) then + "" + else + baseName + ".") + + (textOfLid lid) + let other = processNavigationTopLevelSigDeclarations (newBaseName, decls) // Get nested modules and types (for the left dropdown) diff --git a/src/fcs-fable/src/Compiler/Service/ServiceParamInfoLocations.fs b/src/fcs-fable/src/Compiler/Service/ServiceParamInfoLocations.fs index 129a40b93f..2556111a21 100755 --- a/src/fcs-fable/src/Compiler/Service/ServiceParamInfoLocations.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceParamInfoLocations.fs @@ -62,6 +62,7 @@ module internal ParameterLocationsImpl = let isStaticArg (StripParenTypes synType) = match synType with | SynType.StaticConstant _ + | SynType.StaticConstantNull _ | SynType.StaticConstantExpr _ | SynType.StaticConstantNamed _ -> true | SynType.LongIdent _ -> true // NOTE: this is not a static constant, but it is a prefix of incomplete code, e.g. "TP<42, Arg3" is a prefix of "TP<42, Arg3=6>" and Arg3 shows up as a LongId diff --git a/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fs b/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fs index 317f4bf84d..4c55c78a43 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fs @@ -13,7 +13,6 @@ open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range -/// used to track route during traversal AST [] type SyntaxNode = | SynPat of SynPat @@ -31,6 +30,23 @@ type SyntaxNode = | SynTypeDefnSig of SynTypeDefnSig | SynMemberSig of SynMemberSig + member this.Range = + match this with + | SynPat pat -> pat.Range + | SynType ty -> ty.Range + | SynExpr expr -> expr.Range + | SynModule modul -> modul.Range + | SynModuleOrNamespace moduleOrNamespace -> moduleOrNamespace.Range + | SynTypeDefn tyDef -> tyDef.Range + | SynMemberDefn memberDef -> memberDef.Range + | SynMatchClause matchClause -> matchClause.Range + | SynBinding binding -> binding.RangeOfBindingWithRhs + | SynModuleOrNamespaceSig moduleOrNamespaceSig -> moduleOrNamespaceSig.Range + | SynModuleSigDecl moduleSigDecl -> moduleSigDecl.Range + | SynValSig(SynValSig.SynValSig(range = range)) -> range + | SynTypeDefnSig tyDefSig -> tyDefSig.Range + | SynMemberSig memberSig -> memberSig.Range + type SyntaxVisitorPath = SyntaxNode list [] @@ -163,10 +179,10 @@ type SyntaxVisitorBase<'T>() = None /// VisitSimplePats allows overriding behavior when visiting simple pats - abstract VisitSimplePats: path: SyntaxVisitorPath * synPats: SynSimplePat list -> 'T option + abstract VisitSimplePats: path: SyntaxVisitorPath * pat: SynPat -> 'T option - default _.VisitSimplePats(path, synPats) = - ignore (path, synPats) + default _.VisitSimplePats(path, pat) = + ignore (path, pat) None /// VisitPat allows overriding behavior when visiting patterns @@ -211,6 +227,15 @@ type SyntaxVisitorBase<'T>() = ignore path defaultTraverse valSig +[] +module private ParsedInputExtensions = + type ParsedInput with + + member parsedInput.Contents = + match parsedInput with + | ParsedInput.ImplFile file -> file.Contents |> List.map SyntaxNode.SynModuleOrNamespace + | ParsedInput.SigFile file -> file.Contents |> List.map SyntaxNode.SynModuleOrNamespaceSig + /// A range of utility functions to assist with traversing an AST module SyntaxTraversal = // treat ranges as though they are half-open: [,) @@ -304,7 +329,7 @@ module SyntaxTraversal = (pick: pos -> range -> obj -> (range * (unit -> 'T option)) list -> 'T option) (pos: pos) (visitor: SyntaxVisitorBase<'T>) - (parseTree: ParsedInput) + (ast: SyntaxNode list) : 'T option = let pick x = pick pos x @@ -354,6 +379,31 @@ module SyntaxTraversal = and traverseSynExpr origPath (expr: SynExpr) = let pick = pick expr.Range + /// Sequential expressions are more likely than + /// most other expression kinds to be deeply nested, + /// e.g., in very large list or array expressions. + /// We treat them specially to avoid blowing the stack, + /// since traverseSynExpr itself is not tail-recursive. + let rec traverseSequentials path expr = + seq { + match expr with + | SynExpr.Sequential(expr1 = expr1; expr2 = SynExpr.Sequential _ as expr2) -> + // It's a nested sequential expression. + // Visit it, but make defaultTraverse do nothing, + // since we're going to traverse its descendants ourselves. + yield dive expr expr.Range (fun expr -> visitor.VisitExpr(path, traverseSynExpr path, (fun _ -> None), expr)) + + // Now traverse its descendants. + let path = SyntaxNode.SynExpr expr :: path + yield dive expr1 expr1.Range (traverseSynExpr path) + yield! traverseSequentials path expr2 + + | _ -> + // It's not a nested sequential expression. + // Traverse it normally. + yield dive expr expr.Range (traverseSynExpr path) + } + let defaultTraverse e = let path = SyntaxNode.SynExpr e :: origPath let traverseSynExpr = traverseSynExpr path @@ -549,9 +599,16 @@ module SyntaxTraversal = | _ -> () for b in binds do yield dive b b.RangeOfBindingWithRhs (traverseSynBinding path) - for SynInterfaceImpl(bindings = binds) in ifaces do + for SynInterfaceImpl(ty, withKeyword, binds, members, range) in ifaces do + let path = + SyntaxNode.SynMemberDefn(SynMemberDefn.Interface(ty, withKeyword, Some members, range)) + :: path + for b in binds do yield dive b b.RangeOfBindingWithRhs (traverseSynBinding path) + + for m in members do + yield dive m m.Range (traverseSynMemberDefn path (fun _ -> None)) ] |> pick expr @@ -655,11 +712,19 @@ module SyntaxTraversal = ] |> pick expr + // Nested sequentials. + | SynExpr.Sequential(expr1 = synExpr1; expr2 = synExpr2 & SynExpr.Sequential _) -> + [ + dive synExpr1 synExpr1.Range traverseSynExpr + yield! traverseSequentials path synExpr2 + ] + |> pick expr + + | SynExpr.Sequential(expr1 = synExpr1; expr2 = synExpr2) | SynExpr.Set(targetExpr = synExpr1; rhsExpr = synExpr2) | SynExpr.DotSet(targetExpr = synExpr1; rhsExpr = synExpr2) | SynExpr.TryFinally(tryExpr = synExpr1; finallyExpr = synExpr2) | SynExpr.SequentialOrImplicitYield(expr1 = synExpr1; expr2 = synExpr2) - | SynExpr.Sequential(expr1 = synExpr1; expr2 = synExpr2) | SynExpr.While(whileExpr = synExpr1; doExpr = synExpr2) | SynExpr.WhileBang(whileExpr = synExpr1; doExpr = synExpr2) | SynExpr.DotIndexedGet(objectExpr = synExpr1; indexArgs = synExpr2) @@ -749,15 +814,18 @@ module SyntaxTraversal = visitor.VisitPat(origPath, defaultTraverse, pat) - and traverseSynSimplePats origPath (pats: SynSimplePat list) = - match visitor.VisitSimplePats(origPath, pats) with + and traverseSynSimplePats origPath (pat: SynPat) = + match visitor.VisitSimplePats(origPath, pat) with | None -> - pats - |> List.tryPick (fun pat -> + let rec loop (pat: SynPat) = match pat with - | SynSimplePat.Attrib(attributes = attributes; range = m) -> - attributeApplicationDives origPath attributes |> pick m attributes - | _ -> None) + | SynPat.Paren(pat = pat) + | SynPat.Typed(pat = pat) -> loop pat + | SynPat.Tuple(elementPats = pats) -> List.tryPick loop pats + | SynPat.Attrib(_, attributes, m) -> attributeApplicationDives origPath attributes |> pick m attributes + | _ -> None + + loop pat | x -> x and traverseSynType origPath (StripParenTypes ty) = @@ -770,6 +838,7 @@ module SyntaxTraversal = | SynType.Fun(argType = ty1; returnType = ty2) -> [ ty1; ty2 ] |> List.tryPick (traverseSynType path) | SynType.MeasurePower(ty, _, _) | SynType.HashConstraint(ty, _) + | SynType.WithNull(innerType = ty) | SynType.WithGlobalConstraints(ty, _, _) | SynType.Array(_, ty, _) -> traverseSynType path ty | SynType.StaticConstantNamed(ty1, ty2, _) @@ -779,6 +848,7 @@ module SyntaxTraversal = | SynType.Paren(innerType = t) | SynType.SignatureParameter(usedType = t) -> traverseSynType path t | SynType.Intersection(types = types) -> List.tryPick (traverseSynType path) types + | SynType.StaticConstantNull _ | SynType.Anon _ | SynType.AnonRecd _ | SynType.LongIdent _ @@ -886,10 +956,9 @@ module SyntaxTraversal = traverseSynBinding path getBinding |> Option.orElseWith (fun () -> traverseSynBinding path setBinding) - | SynMemberDefn.ImplicitCtor(ctorArgs = simplePats) -> - match simplePats with - | SynSimplePats.SimplePats(pats = simplePats) -> traverseSynSimplePats path simplePats - | SynMemberDefn.ImplicitInherit(synType, synExpr, _identOption, range) -> + | SynMemberDefn.ImplicitCtor(ctorArgs = pat) -> traverseSynSimplePats path pat + + | SynMemberDefn.ImplicitInherit(synType, synExpr, _identOption, range, _) -> [ dive () synType.Range (fun () -> match traverseInherit (synType, range) with @@ -924,9 +993,11 @@ module SyntaxTraversal = x |> normalizeMembersToDealWithPeculiaritiesOfGettersAndSetters path (fun _ -> None) ] + |> pick x | ok -> ok - | SynMemberDefn.Inherit(synType, _identOption, range) -> traverseInherit (synType, range) + | SynMemberDefn.Inherit(Some synType, _identOption, range, _) -> traverseInherit (synType, range) + | SynMemberDefn.Inherit(None, _, _, _) -> None | SynMemberDefn.ValField _ -> None | SynMemberDefn.NestedType(synTypeDefn, _synAccessOption, _range) -> traverseSynTypeDefn path synTypeDefn @@ -1060,40 +1131,182 @@ module SyntaxTraversal = attributeApplicationDives path attributes |> pick m.Range attributes | SynMemberSig.NestedType(nestedType = nestedType) -> traverseSynTypeDefnSig path nestedType - match parseTree with - | ParsedInput.ImplFile file -> - let l = file.Contents + let fileRange = + (range0, ast) ||> List.fold (fun acc node -> unionRanges acc node.Range) + + ast + |> List.map (fun node -> + match node with + | SyntaxNode.SynModuleOrNamespace moduleOrNamespace -> + dive moduleOrNamespace moduleOrNamespace.Range (traverseSynModuleOrNamespace []) + | SyntaxNode.SynModuleOrNamespaceSig moduleOrNamespaceSig -> + dive moduleOrNamespaceSig moduleOrNamespaceSig.Range (traverseSynModuleOrNamespaceSig []) + | SyntaxNode.SynPat pat -> dive pat pat.Range (traversePat []) + | SyntaxNode.SynType ty -> dive ty ty.Range (traverseSynType []) + | SyntaxNode.SynExpr expr -> dive expr expr.Range (traverseSynExpr []) + | SyntaxNode.SynModule modul -> dive modul modul.Range (traverseSynModuleDecl []) + | SyntaxNode.SynTypeDefn tyDef -> dive tyDef tyDef.Range (traverseSynTypeDefn []) + | SyntaxNode.SynMemberDefn memberDef -> dive memberDef memberDef.Range (traverseSynMemberDefn [] (fun _ -> None)) + | SyntaxNode.SynMatchClause matchClause -> dive matchClause matchClause.Range (traverseSynMatchClause []) + | SyntaxNode.SynBinding binding -> dive binding binding.RangeOfBindingWithRhs (traverseSynBinding []) + | SyntaxNode.SynModuleSigDecl moduleSigDecl -> dive moduleSigDecl moduleSigDecl.Range (traverseSynModuleSigDecl []) + | SyntaxNode.SynValSig(SynValSig.SynValSig(range = range) as valSig) -> dive valSig range (traverseSynValSig []) + | SyntaxNode.SynTypeDefnSig tyDefSig -> dive tyDefSig tyDefSig.Range (traverseSynTypeDefnSig []) + | SyntaxNode.SynMemberSig memberSig -> dive memberSig memberSig.Range (traverseSynMemberSig [])) + |> pick fileRange ast - let fileRange = -#if DEBUG - match l with - | [] -> range0 - | _ -> l |> List.map (fun x -> x.Range) |> List.reduce unionRanges -#else - range0 // only used for asserting, does not matter in non-debug -#endif - l - |> List.map (fun x -> dive x x.Range (traverseSynModuleOrNamespace [])) - |> pick fileRange l - | ParsedInput.SigFile sigFile -> - let l = sigFile.Contents + /// traverse an implementation file walking all the way down to SynExpr or TypeAbbrev at a particular location + /// + let Traverse (pos: pos, parseTree: ParsedInput, visitor: SyntaxVisitorBase<'T>) = + traverseUntil pick pos visitor parseTree.Contents - let fileRange = -#if DEBUG - match l with - | [] -> range0 - | _ -> l |> List.map (fun x -> x.Range) |> List.reduce unionRanges -#else - range0 // only used for asserting, does not matter in non-debug -#endif - l - |> List.map (fun x -> dive x x.Range (traverseSynModuleOrNamespaceSig [])) - |> pick fileRange l - - let traverseAll (visitor: SyntaxVisitorBase<'T>) (parseTree: ParsedInput) : unit = - let pick _ _ _ diveResults = - let rec loop = - function +[] +[] +module SyntaxNode = + let (|Attributes|) node = + let (|All|) = List.collect + let field (SynField(attributes = attributes)) = attributes + let unionCase (SynUnionCase(attributes = attributes)) = attributes + let enumCase (SynEnumCase(attributes = attributes)) = attributes + let typar (SynTyparDecl(attributes = attributes)) = attributes + + let (|SynComponentInfo|) componentInfo = + match componentInfo with + | SynComponentInfo(attributes = attributes; typeParams = Some(SynTyparDecls.PrefixList(decls = All typar attributes'))) + | SynComponentInfo(attributes = attributes; typeParams = Some(SynTyparDecls.PostfixList(decls = All typar attributes'))) + | SynComponentInfo( + attributes = attributes; typeParams = Some(SynTyparDecls.SinglePrefix(decl = SynTyparDecl(attributes = attributes')))) -> + attributes @ attributes' + | SynComponentInfo(attributes = attributes) -> attributes + + let (|SynBinding|) binding = + match binding with + | SynBinding(attributes = attributes; returnInfo = Some(SynBindingReturnInfo(attributes = attributes'))) -> + attributes @ attributes' + | SynBinding(attributes = attributes) -> attributes + + match node with + | SyntaxNode.SynModuleOrNamespace(SynModuleOrNamespace(attribs = attributes)) + | SyntaxNode.SynModuleOrNamespaceSig(SynModuleOrNamespaceSig(attribs = attributes)) + | SyntaxNode.SynModule(SynModuleDecl.Attributes(attributes = attributes)) + | SyntaxNode.SynTypeDefn(SynTypeDefn(typeInfo = SynComponentInfo attributes)) + | SyntaxNode.SynTypeDefn(SynTypeDefn( + typeRepr = SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.Record(recordFields = All field attributes), _))) + | SyntaxNode.SynTypeDefn(SynTypeDefn( + typeRepr = SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.Union(unionCases = All unionCase attributes), _))) + | SyntaxNode.SynTypeDefn(SynTypeDefn( + typeRepr = SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.Enum(cases = All enumCase attributes), _))) + | SyntaxNode.SynMemberDefn(SynMemberDefn.AutoProperty(attributes = attributes)) + | SyntaxNode.SynMemberDefn(SynMemberDefn.AbstractSlot(slotSig = SynValSig(attributes = attributes))) + | SyntaxNode.SynMemberDefn(SynMemberDefn.ImplicitCtor(attributes = attributes)) + | SyntaxNode.SynBinding(SynBinding attributes) + | SyntaxNode.SynPat(SynPat.Attrib(attributes = attributes)) + | SyntaxNode.SynType(SynType.SignatureParameter(attributes = attributes)) + | SyntaxNode.SynValSig(SynValSig(attributes = attributes)) -> attributes + | _ -> [] + +[] +[] +module internal SyntaxNodes = + let fold folder state (ast: SyntaxNode list) = + let mutable state = state + + let visitor = + { new SyntaxVisitorBase() with + member _.VisitExpr(path, _, defaultTraverse, expr) = + match path with + | SyntaxNode.SynMemberDefn _ as parent :: path -> state <- folder state path parent + | _ -> () + + state <- folder state path (SyntaxNode.SynExpr expr) + defaultTraverse expr + + member _.VisitPat(path, defaultTraverse, pat) = + state <- folder state path (SyntaxNode.SynPat pat) + defaultTraverse pat + + member _.VisitType(path, defaultTraverse, synType) = + match path with + | SyntaxNode.SynMemberDefn _ | SyntaxNode.SynMemberSig _ as parent :: path -> state <- folder state path parent + | _ -> () + + state <- folder state path (SyntaxNode.SynType synType) + defaultTraverse synType + + member _.VisitModuleDecl(path, defaultTraverse, synModuleDecl) = + state <- folder state path (SyntaxNode.SynModule synModuleDecl) + + match synModuleDecl with + | SynModuleDecl.Types(types, _) -> + let path = SyntaxNode.SynModule synModuleDecl :: path + + for ty in types do + state <- folder state path (SyntaxNode.SynTypeDefn ty) + + | _ -> () + + defaultTraverse synModuleDecl + + member _.VisitModuleOrNamespace(path, synModuleOrNamespace) = + state <- folder state path (SyntaxNode.SynModuleOrNamespace synModuleOrNamespace) + None + + member _.VisitMatchClause(path, defaultTraverse, matchClause) = + state <- folder state path (SyntaxNode.SynMatchClause matchClause) + defaultTraverse matchClause + + member _.VisitBinding(path, defaultTraverse, synBinding) = + match path with + | SyntaxNode.SynMemberDefn _ as parent :: path -> state <- folder state path parent + | _ -> () + + state <- folder state path (SyntaxNode.SynBinding synBinding) + defaultTraverse synBinding + + member _.VisitModuleOrNamespaceSig(path, synModuleOrNamespaceSig) = + state <- folder state path (SyntaxNode.SynModuleOrNamespaceSig synModuleOrNamespaceSig) + None + + member _.VisitModuleSigDecl(path, defaultTraverse, synModuleSigDecl) = + state <- folder state path (SyntaxNode.SynModuleSigDecl synModuleSigDecl) + + match synModuleSigDecl with + | SynModuleSigDecl.Types(types, _) -> + let path = SyntaxNode.SynModuleSigDecl synModuleSigDecl :: path + + for ty in types do + state <- folder state path (SyntaxNode.SynTypeDefnSig ty) + + | _ -> () + + defaultTraverse synModuleSigDecl + + member _.VisitValSig(path, defaultTraverse, valSig) = + match path with + | SyntaxNode.SynMemberSig _ as parent :: path -> state <- folder state path parent + | _ -> () + + state <- folder state path (SyntaxNode.SynValSig valSig) + defaultTraverse valSig + + member _.VisitSimplePats(path, _pat) = + match path with + | SyntaxNode.SynMemberDefn _ as node :: path -> state <- folder state path node + | _ -> () + + None + + member _.VisitInterfaceSynMemberDefnType(path, _synType) = + match path with + | SyntaxNode.SynMemberDefn _ as node :: path -> state <- folder state path node + | _ -> () + + None + } + + let pickAll _ _ _ diveResults = + let rec loop diveResults = + match diveResults with | [] -> None | (_, project) :: rest -> ignore (project ()) @@ -1101,9 +1314,319 @@ module SyntaxTraversal = loop diveResults - ignore<'T option> (traverseUntil pick parseTree.Range.End visitor parseTree) + let m = (range0, ast) ||> List.fold (fun acc node -> unionRanges acc node.Range) + ignore (SyntaxTraversal.traverseUntil pickAll m.End visitor ast) + state + + let private foldWhileImpl pick pos folder state (ast: SyntaxNode list) = + let mutable state = state + + let visitor = + { new SyntaxVisitorBase() with + member _.VisitExpr(path, _, defaultTraverse, expr) = + match path with + | SyntaxNode.SynMemberDefn _ as parent :: path -> + match folder state path parent with + | Some state' -> + match folder state' path (SyntaxNode.SynExpr expr) with + | Some state' -> + state <- state' + defaultTraverse expr + | None -> Some() + | None -> Some() + | _ -> + match folder state path (SyntaxNode.SynExpr expr) with + | Some state' -> + state <- state' + defaultTraverse expr + | None -> Some() + + member _.VisitPat(path, defaultTraverse, pat) = + match folder state path (SyntaxNode.SynPat pat) with + | Some state' -> + state <- state' + defaultTraverse pat + | None -> Some() + + member _.VisitType(path, defaultTraverse, synType) = + match path with + | SyntaxNode.SynMemberDefn _ | SyntaxNode.SynMemberSig _ as parent :: path -> + match folder state path parent with + | Some state' -> + match folder state' path (SyntaxNode.SynType synType) with + | Some state' -> + state <- state' + defaultTraverse synType + | None -> Some() + | None -> Some() + | _ -> + match folder state path (SyntaxNode.SynType synType) with + | Some state' -> + state <- state' + defaultTraverse synType + | None -> Some() + + member _.VisitModuleDecl(path, defaultTraverse, synModuleDecl) = + match folder state path (SyntaxNode.SynModule synModuleDecl) with + | Some state' -> + state <- state' + + match synModuleDecl with + | SynModuleDecl.Types(types, _) -> + let path = SyntaxNode.SynModule synModuleDecl :: path + + let rec loop types = + match types with + | [] -> defaultTraverse synModuleDecl + | ty :: types -> + match folder state path (SyntaxNode.SynTypeDefn ty) with + | Some state' -> + state <- state' + loop types + | None -> Some() + + loop types + + | _ -> defaultTraverse synModuleDecl + + | None -> Some() + + member _.VisitModuleOrNamespace(path, synModuleOrNamespace) = + match folder state path (SyntaxNode.SynModuleOrNamespace synModuleOrNamespace) with + | Some state' -> + state <- state' + None + | None -> Some() + + member _.VisitMatchClause(path, defaultTraverse, matchClause) = + match folder state path (SyntaxNode.SynMatchClause matchClause) with + | Some state' -> + state <- state' + defaultTraverse matchClause + | None -> Some() + + member _.VisitBinding(path, defaultTraverse, synBinding) = + match path with + | SyntaxNode.SynMemberDefn _ as parent :: path -> + match folder state path parent with + | Some state' -> + match folder state' path (SyntaxNode.SynBinding synBinding) with + | Some state' -> + state <- state' + defaultTraverse synBinding + | None -> Some() + | None -> Some() + | _ -> + match folder state path (SyntaxNode.SynBinding synBinding) with + | Some state' -> + state <- state' + defaultTraverse synBinding + | None -> Some() + + member _.VisitModuleOrNamespaceSig(path, synModuleOrNamespaceSig) = + match folder state path (SyntaxNode.SynModuleOrNamespaceSig synModuleOrNamespaceSig) with + | Some state' -> + state <- state' + None + | None -> Some() + + member _.VisitModuleSigDecl(path, defaultTraverse, synModuleSigDecl) = + match folder state path (SyntaxNode.SynModuleSigDecl synModuleSigDecl) with + | Some state' -> + state <- state' + + match synModuleSigDecl with + | SynModuleSigDecl.Types(types, _) -> + let path = SyntaxNode.SynModuleSigDecl synModuleSigDecl :: path + + let rec loop types = + match types with + | [] -> defaultTraverse synModuleSigDecl + | ty :: types -> + match folder state path (SyntaxNode.SynTypeDefnSig ty) with + | Some state' -> + state <- state' + loop types + | None -> Some() + + loop types + + | _ -> defaultTraverse synModuleSigDecl + + | None -> Some() + + member _.VisitValSig(path, defaultTraverse, valSig) = + match path with + | SyntaxNode.SynMemberSig _ as parent :: path -> + match folder state path parent with + | Some state' -> + match folder state' path (SyntaxNode.SynValSig valSig) with + | Some state' -> + state <- state' + defaultTraverse valSig + | None -> Some() + | None -> Some() + | _ -> + match folder state path (SyntaxNode.SynValSig valSig) with + | Some state' -> + state <- state' + defaultTraverse valSig + | None -> Some() + + member _.VisitSimplePats(path, _pat) = + match path with + | SyntaxNode.SynMemberDefn _ as node :: path -> + match folder state path node with + | Some state' -> + state <- state' + None + | None -> Some() + | _ -> None - /// traverse an implementation file walking all the way down to SynExpr or TypeAbbrev at a particular location - /// - let Traverse (pos: pos, parseTree, visitor: SyntaxVisitorBase<'T>) = - traverseUntil pick pos visitor parseTree + member _.VisitInterfaceSynMemberDefnType(path, _synType) = + match path with + | SyntaxNode.SynMemberDefn _ as node :: path -> + match folder state path node with + | Some state' -> + state <- state' + None + | None -> Some() + | _ -> None + } + + ignore (SyntaxTraversal.traverseUntil pick pos visitor ast) + state + + let foldWhile folder state (ast: SyntaxNode list) = + let pickAll _ _ _ diveResults = + let rec loop diveResults = + match diveResults with + | [] -> None + | (_, project) :: rest -> + ignore (project ()) + loop rest + + loop diveResults + + let m = (range0, ast) ||> List.fold (fun acc node -> unionRanges acc node.Range) + foldWhileImpl pickAll m.End folder state ast + + let tryPick chooser position (ast: SyntaxNode list) = + let visitor = + { new SyntaxVisitorBase<'T>() with + member _.VisitExpr(path, _, defaultTraverse, expr) = + (match path with + | SyntaxNode.SynMemberDefn _ as parent :: parentPath -> chooser parentPath parent + | _ -> None) + |> Option.orElseWith (fun () -> chooser path (SyntaxNode.SynExpr expr)) + |> Option.orElseWith (fun () -> defaultTraverse expr) + + member _.VisitPat(path, defaultTraverse, pat) = + chooser path (SyntaxNode.SynPat pat) + |> Option.orElseWith (fun () -> defaultTraverse pat) + + member _.VisitType(path, defaultTraverse, synType) = + (match path with + | SyntaxNode.SynMemberDefn _ | SyntaxNode.SynMemberSig _ as parent :: parentPath -> chooser parentPath parent + | _ -> None) + |> Option.orElseWith (fun () -> chooser path (SyntaxNode.SynType synType)) + |> Option.orElseWith (fun () -> defaultTraverse synType) + + member _.VisitModuleDecl(path, defaultTraverse, synModuleDecl) = + chooser path (SyntaxNode.SynModule synModuleDecl) + |> Option.orElseWith (fun () -> + match synModuleDecl with + | SynModuleDecl.Types(types, _) -> + let path = SyntaxNode.SynModule synModuleDecl :: path + types |> List.tryPick (SyntaxNode.SynTypeDefn >> chooser path) + | _ -> None) + |> Option.orElseWith (fun () -> defaultTraverse synModuleDecl) + + member _.VisitModuleOrNamespace(path, synModuleOrNamespace) = + chooser path (SyntaxNode.SynModuleOrNamespace synModuleOrNamespace) + + member _.VisitMatchClause(path, defaultTraverse, matchClause) = + chooser path (SyntaxNode.SynMatchClause matchClause) + |> Option.orElseWith (fun () -> defaultTraverse matchClause) + + member _.VisitBinding(path, defaultTraverse, synBinding) = + (match path with + | SyntaxNode.SynMemberDefn _ as parent :: parentPath -> chooser parentPath parent + | _ -> None) + |> Option.orElseWith (fun () -> chooser path (SyntaxNode.SynBinding synBinding)) + |> Option.orElseWith (fun () -> defaultTraverse synBinding) + + member _.VisitModuleOrNamespaceSig(path, synModuleOrNamespaceSig) = + chooser path (SyntaxNode.SynModuleOrNamespaceSig synModuleOrNamespaceSig) + + member _.VisitModuleSigDecl(path, defaultTraverse, synModuleSigDecl) = + chooser path (SyntaxNode.SynModuleSigDecl synModuleSigDecl) + |> Option.orElseWith (fun () -> + match synModuleSigDecl with + | SynModuleSigDecl.Types(types, _) -> + let path = SyntaxNode.SynModuleSigDecl synModuleSigDecl :: path + types |> List.tryPick (SyntaxNode.SynTypeDefnSig >> chooser path) + | _ -> None) + |> Option.orElseWith (fun () -> defaultTraverse synModuleSigDecl) + + member _.VisitValSig(path, defaultTraverse, valSig) = + (match path with + | SyntaxNode.SynMemberSig _ as parent :: parentPath -> chooser parentPath parent + | _ -> None) + |> Option.orElseWith (fun () -> chooser path (SyntaxNode.SynValSig valSig)) + |> Option.orElseWith (fun () -> defaultTraverse valSig) + + member _.VisitSimplePats(path, _pat) = + match path with + | SyntaxNode.SynMemberDefn _ as node :: path -> chooser path node + | _ -> None + + member _.VisitInterfaceSynMemberDefnType(path, _synType) = + match path with + | SyntaxNode.SynMemberDefn _ as node :: path -> chooser path node + | _ -> None + } + + SyntaxTraversal.traverseUntil SyntaxTraversal.pick position visitor ast + + let tryPickLast chooser position (ast: SyntaxNode list) = + (None, ast) + ||> foldWhileImpl SyntaxTraversal.pick position (fun prev path node -> + match chooser path node with + | Some _ as next -> Some next + | None -> Some prev) + + let tryNode position (ast: SyntaxNode list) = + let Matching = Some + + (None, ast) + ||> foldWhileImpl SyntaxTraversal.pick position (fun _prev path node -> + if rangeContainsPos node.Range position then + Some(Matching(node, path)) + else + None) + + let exists predicate position ast = + tryPick (fun path node -> if predicate path node then Some() else None) position ast + |> Option.isSome + +[] +[] +module ParsedInput = + let fold folder state (parsedInput: ParsedInput) = + SyntaxNodes.fold folder state parsedInput.Contents + + let foldWhile folder state (parsedInput: ParsedInput) = + SyntaxNodes.foldWhile folder state parsedInput.Contents + + let tryPick chooser position (parsedInput: ParsedInput) = + SyntaxNodes.tryPick chooser position parsedInput.Contents + + let tryPickLast chooser position (parsedInput: ParsedInput) = + SyntaxNodes.tryPickLast chooser position parsedInput.Contents + + let tryNode position (parsedInput: ParsedInput) = + SyntaxNodes.tryNode position parsedInput.Contents + + let exists predicate position (parsedInput: ParsedInput) = + SyntaxNodes.exists predicate position parsedInput.Contents diff --git a/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fsi b/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fsi index ef118baf12..ab9e98f6e8 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fsi +++ b/src/fcs-fable/src/Compiler/Service/ServiceParseTreeWalk.fsi @@ -5,7 +5,7 @@ namespace FSharp.Compiler.Syntax open FSharp.Compiler.Syntax open FSharp.Compiler.Text -/// Used to track route during traversal of syntax using SyntaxTraversal.Traverse +/// Represents a major syntax node in the untyped abstract syntax tree. [] type SyntaxNode = | SynPat of SynPat @@ -23,6 +23,11 @@ type SyntaxNode = | SynTypeDefnSig of SynTypeDefnSig | SynMemberSig of SynMemberSig + /// The range of the syntax node, inclusive of its contents. + member Range: range + +/// Represents the set of ancestor nodes traversed before reaching +/// the current node in a traversal of the untyped abstract syntax tree. type SyntaxVisitorPath = SyntaxNode list [] @@ -152,8 +157,8 @@ type SyntaxVisitorBase<'T> = default VisitRecordField: path: SyntaxVisitorPath * copyOpt: SynExpr option * recordField: SynLongIdent option -> 'T option - abstract VisitSimplePats: path: SyntaxVisitorPath * synPats: SynSimplePat list -> 'T option - default VisitSimplePats: path: SyntaxVisitorPath * synPats: SynSimplePat list -> 'T option + abstract VisitSimplePats: path: SyntaxVisitorPath * pat: SynPat -> 'T option + default VisitSimplePats: path: SyntaxVisitorPath * pat: SynPat -> 'T option abstract VisitType: path: SyntaxVisitorPath * defaultTraverse: (SynType -> 'T option) * synType: SynType -> 'T option @@ -199,6 +204,286 @@ module public SyntaxTraversal = val internal pick: pos: pos -> outerRange: range -> debugObj: obj -> diveResults: (range * (unit -> 'a option)) list -> 'a option - val internal traverseAll: visitor: SyntaxVisitorBase<'T> -> parseTree: ParsedInput -> unit - val Traverse: pos: pos * parseTree: ParsedInput * visitor: SyntaxVisitorBase<'T> -> 'T option + +/// +/// Holds operations for working with s +/// in the untyped abstract syntax tree (AST). +/// +[] +[] +module SyntaxNode = + /// + /// Extracts the , if any, + /// from the given . + /// + val (|Attributes|): node: SyntaxNode -> SynAttributes + +/// +/// Holds operations for working with the untyped abstract syntax tree. +/// +[] +[] +module internal SyntaxNodes = + /// + /// Applies the given predicate to each node of the AST and its context (path) + /// down to a given position, returning true if a matching node is found, otherwise false. + /// Traversal is short-circuited if no matching node is found through the given position. + /// + /// The predicate to match each node against. + /// The position in the input file down to which to apply the function. + /// The AST to search. + /// True if a matching node is found, or false if no matching node is found. + /// + /// + /// let isInTypeDefn = + /// (pos, ast) + /// ||> SyntaxNodes.exists (fun _path node -> + /// match node with + /// | SyntaxNode.SynTypeDefn _ -> true + /// | _ -> false) + /// + /// + val exists: predicate: (SyntaxVisitorPath -> SyntaxNode -> bool) -> position: pos -> ast: SyntaxNode list -> bool + + /// + /// Applies a function to each node of the AST and its context (path), + /// threading an accumulator through the computation. + /// + /// The function to use to update the state given each node and its context. + /// The initial state. + /// The AST to fold over. + /// The final state. + /// + /// + /// let unnecessaryParentheses = + /// (HashSet Range.comparer, ast) ||> SyntaxNodes.fold (fun acc path node -> + /// match node with + /// | SyntaxNode.SynExpr (SynExpr.Paren (expr = inner; rightParenRange = Some _; range = range)) when + /// not (SynExpr.shouldBeParenthesizedInContext getLineString path inner) + /// -> + /// ignore (acc.Add range) + /// acc + /// + /// | SyntaxNode.SynPat (SynPat.Paren (inner, range)) when + /// not (SynPat.shouldBeParenthesizedInContext path inner) + /// -> + /// ignore (acc.Add range) + /// acc + /// + /// | _ -> acc) + /// + /// + val fold: + folder: ('State -> SyntaxVisitorPath -> SyntaxNode -> 'State) -> state: 'State -> ast: SyntaxNode list -> 'State + + /// + /// Applies a function to each node of the AST and its context (path) + /// until the folder returns None, threading an accumulator through the computation. + /// + /// The function to use to update the state given each node and its context, or to stop traversal by returning None. + /// The initial state. + /// The AST to fold over. + /// The final state. + val foldWhile: + folder: ('State -> SyntaxVisitorPath -> SyntaxNode -> 'State option) -> + state: 'State -> + ast: SyntaxNode list -> + 'State + + /// + /// Dives to the deepest node that contains the given position, + /// returning the node and its path if found, or None if no + /// node contains the position. + /// + /// The position in the input file down to which to dive. + /// The AST to search. + /// The deepest node containing the given position, along with the path taken through the node's ancestors to find it. + val tryNode: position: pos -> ast: SyntaxNode list -> (SyntaxNode * SyntaxVisitorPath) option + + /// + /// Applies the given function to each node of the AST and its context (path) + /// down to a given position, returning Some x for the first node + /// for which the function returns Some x for some value x, otherwise None. + /// Traversal is short-circuited if no matching node is found through the given position. + /// + /// The function to apply to each node and its context to derive an optional value. + /// The position in the input file down to which to apply the function. + /// The AST to search. + /// The first value for which the function returns Some, or None if no matching node is found. + /// + /// + /// let range = + /// (pos, ast) ||> SyntaxNodes.tryPick (fun _path node -> + /// match node with + /// | SyntaxNode.SynExpr (SynExpr.InterpolatedString (range = range)) when + /// rangeContainsPos range pos + /// -> Some range + /// | _ -> None) + /// + /// + val tryPick: + chooser: (SyntaxVisitorPath -> SyntaxNode -> 'T option) -> position: pos -> ast: SyntaxNode list -> 'T option + + /// + /// Applies the given function to each node of the AST and its context (path) + /// down to a given position, returning Some x for the last (deepest) node + /// for which the function returns Some x for some value x, otherwise None. + /// Traversal is short-circuited if no matching node is found through the given position. + /// + /// The function to apply to each node and its context to derive an optional value. + /// The position in the input file down to which to apply the function. + /// The AST to search. + /// The last (deepest) value for which the function returns Some, or None if no matching node is found. + /// + /// + /// let range = + /// (pos, ast) + /// ||> SyntaxNodes.tryPickLast (fun path node -> + /// match node, path with + /// | FuncIdent range -> Some range + /// | _ -> None) + /// + /// + val tryPickLast: + chooser: (SyntaxVisitorPath -> SyntaxNode -> 'T option) -> position: pos -> ast: SyntaxNode list -> 'T option + +/// +/// Holds operations for working with the +/// untyped abstract syntax tree (). +/// +[] +[] +module ParsedInput = + /// + /// Applies the given predicate to each node of the AST and its context (path) + /// down to a given position, returning true if a matching node is found, otherwise false. + /// Traversal is short-circuited if no matching node is found through the given position. + /// + /// The predicate to match each node against. + /// The position in the input file down to which to apply the function. + /// The AST to search. + /// True if a matching node is found, or false if no matching node is found. + /// + /// + /// let isInTypeDefn = + /// (pos, parsedInput) + /// ||> ParsedInput.exists (fun _path node -> + /// match node with + /// | SyntaxNode.SynTypeDefn _ -> true + /// | _ -> false) + /// + /// + val exists: + predicate: (SyntaxVisitorPath -> SyntaxNode -> bool) -> position: pos -> parsedInput: ParsedInput -> bool + + /// + /// Applies a function to each node of the AST and its context (path), + /// threading an accumulator through the computation. + /// + /// The function to use to update the state given each node and its context. + /// The initial state. + /// The AST to fold over. + /// The final state. + /// + /// + /// let unnecessaryParentheses = + /// (HashSet Range.comparer, parsedInput) ||> ParsedInput.fold (fun acc path node -> + /// match node with + /// | SyntaxNode.SynExpr (SynExpr.Paren (expr = inner; rightParenRange = Some _; range = range)) when + /// not (SynExpr.shouldBeParenthesizedInContext getLineString path inner) + /// -> + /// ignore (acc.Add range) + /// acc + /// + /// | SyntaxNode.SynPat (SynPat.Paren (inner, range)) when + /// not (SynPat.shouldBeParenthesizedInContext path inner) + /// -> + /// ignore (acc.Add range) + /// acc + /// + /// | _ -> acc) + /// + /// + val fold: + folder: ('State -> SyntaxVisitorPath -> SyntaxNode -> 'State) -> + state: 'State -> + parsedInput: ParsedInput -> + 'State + + /// + /// Applies a function to each node of the AST and its context (path) + /// until the folder returns None, threading an accumulator through the computation. + /// + /// The function to use to update the state given each node and its context, or to stop traversal by returning None. + /// The initial state. + /// The AST to fold over. + /// The final state. + val foldWhile: + folder: ('State -> SyntaxVisitorPath -> SyntaxNode -> 'State option) -> + state: 'State -> + parsedInput: ParsedInput -> + 'State + + /// + /// Dives to the deepest node that contains the given position, + /// returning the node and its path if found, or None if no + /// node contains the position. + /// + /// The position in the input file down to which to dive. + /// The AST to search. + /// The deepest node containing the given position, along with the path taken through the node's ancestors to find it. + val tryNode: position: pos -> parsedInput: ParsedInput -> (SyntaxNode * SyntaxVisitorPath) option + + /// + /// Applies the given function to each node of the AST and its context (path) + /// down to a given position, returning Some x for the first node + /// for which the function returns Some x for some value x, otherwise None. + /// Traversal is short-circuited if no matching node is found through the given position. + /// + /// The function to apply to each node and its context to derive an optional value. + /// The position in the input file down to which to apply the function. + /// The AST to search. + /// The first value for which the function returns Some, or None if no matching node is found. + /// + /// + /// let range = + /// (pos, parsedInput) ||> ParsedInput.tryPick (fun _path node -> + /// match node with + /// | SyntaxNode.SynExpr (SynExpr.InterpolatedString (range = range)) when + /// rangeContainsPos range pos + /// -> Some range + /// | _ -> None) + /// + /// + val tryPick: + chooser: (SyntaxVisitorPath -> SyntaxNode -> 'T option) -> + position: pos -> + parsedInput: ParsedInput -> + 'T option + + /// + /// Applies the given function to each node of the AST and its context (path) + /// down to a given position, returning Some x for the last (deepest) node + /// for which the function returns Some x for some value x, otherwise None. + /// Traversal is short-circuited if no matching node is found through the given position. + /// + /// The function to apply to each node and its context to derive an optional value. + /// The position in the input file down to which to apply the function. + /// The AST to search. + /// The last (deepest) value for which the function returns Some, or None if no matching node is found. + /// + /// + /// let range = + /// (pos, parsedInput) + /// ||> ParsedInput.tryPickLast (fun path node -> + /// match node, path with + /// | FuncIdent range -> Some range + /// | _ -> None) + /// + /// + val tryPickLast: + chooser: (SyntaxVisitorPath -> SyntaxNode -> 'T option) -> + position: pos -> + parsedInput: ParsedInput -> + 'T option diff --git a/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fs b/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fs index 8836b3afab..e9bca75e14 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fs @@ -17,7 +17,7 @@ open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range module SourceFileImpl = - let IsSignatureFile file = + let IsSignatureFile (file: string) = let ext = Path.GetExtension file 0 = String.Compare(".fsi", ext, StringComparison.OrdinalIgnoreCase) @@ -70,6 +70,12 @@ type PatternContext = /// Any other position in a pattern that does not need special handling | Other +[] +type MethodOverrideCompletionContext = + | Class + | Interface of mInterfaceName: range + | ObjExpr of mExpr: range + [] type CompletionContext = /// Completion context cannot be determined due to errors @@ -107,7 +113,12 @@ type CompletionContext = | Pattern of context: PatternContext /// Completing a method override (e.g. override this.ToStr|) - | MethodOverride of enclosingTypeNameRange: range + | MethodOverride of + ctx: MethodOverrideCompletionContext * + enclosingTypeNameRange: range * + spacesBeforeOverrideKeyword: int * + hasThis: bool * + isStatic: bool type ShortIdent = string @@ -263,8 +274,8 @@ module ParsedInput = let rec collect expr acc = match expr with - | SynExpr.Sequential(_, _, e1, (SynExpr.Sequential _ as e2), _) -> collect e2 (e1 :: acc) - | SynExpr.Sequential(_, _, e1, e2, _) -> e2 :: e1 :: acc + | SynExpr.Sequential(expr1 = e1; expr2 = (SynExpr.Sequential _ as e2)) -> collect e2 (e1 :: acc) + | SynExpr.Sequential(expr1 = e1; expr2 = e2) -> e2 :: e1 :: acc | _ -> acc match collect expr [] with @@ -636,6 +647,7 @@ module ParsedInput = | SynTypeConstraint.WhereTyparIsReferenceType(t, _) -> walkTypar t | SynTypeConstraint.WhereTyparIsUnmanaged(t, _) -> walkTypar t | SynTypeConstraint.WhereTyparSupportsNull(t, _) -> walkTypar t + | SynTypeConstraint.WhereTyparNotSupportsNull(genericName = t) -> walkTypar t | SynTypeConstraint.WhereTyparIsComparable(t, _) -> walkTypar t | SynTypeConstraint.WhereTyparIsEquatable(t, _) -> walkTypar t | SynTypeConstraint.WhereTyparSubtypeOfType(t, ty, _) -> walkTypar t |> Option.orElseWith (fun () -> walkType ty) @@ -699,6 +711,7 @@ module ParsedInput = | SynType.Array(_, t, _) -> walkType t | SynType.Fun(argType = t1; returnType = t2) -> walkType t1 |> Option.orElseWith (fun () -> walkType t2) | SynType.WithGlobalConstraints(t, _, _) -> walkType t + | SynType.WithNull(innerType = t) | SynType.HashConstraint(t, _) -> walkType t | SynType.Or(t1, t2, _, _) -> walkType t1 |> Option.orElseWith (fun () -> walkType t2) | SynType.MeasurePower(t, _, _) -> walkType t @@ -707,6 +720,7 @@ module ParsedInput = | SynType.StaticConstantExpr(e, _) -> walkExpr e | SynType.StaticConstantNamed(ident, value, _) -> List.tryPick walkType [ ident; value ] | SynType.Intersection(types = types) -> List.tryPick walkType types + | SynType.StaticConstantNull _ | SynType.Anon _ | SynType.AnonRecd _ | SynType.LongIdent _ @@ -888,11 +902,10 @@ module ParsedInput = | None, Some binding -> walkBinding binding | Some getBinding, Some setBinding -> walkBinding getBinding |> Option.orElseWith (fun () -> walkBinding setBinding) - | SynMemberDefn.ImplicitCtor(attributes = Attributes attrs; ctorArgs = SynSimplePats.SimplePats(pats = simplePats)) -> - List.tryPick walkAttribute attrs - |> Option.orElseWith (fun () -> List.tryPick walkSimplePat simplePats) + | SynMemberDefn.ImplicitCtor(attributes = Attributes attrs; ctorArgs = pat) -> + List.tryPick walkAttribute attrs |> Option.orElseWith (fun _ -> walkPat pat) - | SynMemberDefn.ImplicitInherit(t, e, _, _) -> walkType t |> Option.orElseWith (fun () -> walkExpr e) + | SynMemberDefn.ImplicitInherit(t, e, _, _, _) -> walkType t |> Option.orElseWith (fun () -> walkExpr e) | SynMemberDefn.LetBindings(bindings, _, _, _) -> List.tryPick walkBinding bindings @@ -900,8 +913,8 @@ module ParsedInput = walkType t |> Option.orElseWith (fun () -> members |> Option.bind (List.tryPick walkMember)) - | SynMemberDefn.Inherit(t, _, _) -> walkType t - + | SynMemberDefn.Inherit(baseType = Some baseType) -> walkType baseType + | SynMemberDefn.Inherit(baseType = None) -> None | SynMemberDefn.ValField(fieldInfo = field) -> walkField field | SynMemberDefn.NestedType(tdef, _, _) -> walkTypeDefn tdef @@ -1091,6 +1104,20 @@ module ParsedInput = | Operator "op_Equality" (SynExpr.Ident id, _) -> Some id | _ -> None + let posAfterRangeAndBetweenSpaces (lineStr: string) (m: range) pos = + let rec loop max i = + if i >= lineStr.Length || i >= max then true + elif Char.IsWhiteSpace lineStr[i] then loop max (i + 1) + else false + + posGt pos m.End && pos.Line = m.End.Line && loop pos.Column m.End.Column + + let rangeContainsPosOrIsSpacesBetweenRangeAndPos (lineStr: string) m pos = + rangeContainsPos m pos + // pos is before m + || posLt pos m.Start + || posAfterRangeAndBetweenSpaces lineStr m pos + let findSetters argList = match argList with | SynExpr.Paren(SynExpr.Tuple(false, parameters, _, _), _, _, _) -> @@ -1474,6 +1501,12 @@ module ParsedInput = |> List.tryPick (fun pat -> TryGetCompletionContextInPattern true pat None pos) |> Option.orElseWith (fun () -> defaultTraverse expr) + // { new | } + | SynExpr.ComputationExpr(expr = SynExpr.ArbitraryAfterError _) when + lineStr.Trim().Split(' ') |> Array.contains "new" + -> + Some(CompletionContext.Inherit(InheritanceContext.Unknown, ([], None))) + | _ -> defaultTraverse expr member _.VisitRecordField(path, copyOpt, field) = @@ -1531,36 +1564,123 @@ module ParsedInput = (SynBinding(headPat = headPat; trivia = trivia; returnInfo = returnInfo) as synBinding) ) = - let isOverride leadingKeyword = + let isOverrideOrMember leadingKeyword = + match leadingKeyword with + | SynLeadingKeyword.Override _ + | SynLeadingKeyword.Member _ -> true + | _ -> false + + let isStaticMember leadingKeyword = + match leadingKeyword with + | SynLeadingKeyword.StaticMember _ -> true + | _ -> false + + let isMember leadingKeyword = match leadingKeyword with - | SynLeadingKeyword.Override _ -> true + | SynLeadingKeyword.Member _ -> true | _ -> false - let overrideContext path = + let overrideContext path (mOverride: range) hasThis isStatic isMember = match path with - | _ :: SyntaxNode.SynTypeDefn(SynTypeDefn(typeInfo = SynComponentInfo(longId = [ enclosingType ]))) :: _ -> - Some(CompletionContext.MethodOverride enclosingType.idRange) + | _ :: SyntaxNode.SynTypeDefn(SynTypeDefn(typeInfo = SynComponentInfo(longId = [ enclosingType ]))) :: _ when + not isMember + -> + Some( + CompletionContext.MethodOverride( + MethodOverrideCompletionContext.Class, + enclosingType.idRange, + mOverride.StartColumn, + hasThis, + isStatic + ) + ) + | SyntaxNode.SynMemberDefn(SynMemberDefn.Interface(interfaceType = ty)) :: SyntaxNode.SynTypeDefn(SynTypeDefn( + typeInfo = SynComponentInfo(longId = [ enclosingType ]))) :: _ + | _ :: SyntaxNode.SynMemberDefn(SynMemberDefn.Interface(interfaceType = ty)) :: SyntaxNode.SynTypeDefn(SynTypeDefn( + typeInfo = SynComponentInfo(longId = [ enclosingType ]))) :: _ -> + let ty = + match ty with + | SynType.App(typeName = ty) -> ty + | _ -> ty + + Some( + CompletionContext.MethodOverride( + MethodOverrideCompletionContext.Interface ty.Range, + enclosingType.idRange, + mOverride.StartColumn, + hasThis, + isStatic + ) + ) + | SyntaxNode.SynMemberDefn(SynMemberDefn.Interface(interfaceType = ty)) :: (SyntaxNode.SynExpr(SynExpr.ObjExpr _) as expr) :: _ + | _ :: SyntaxNode.SynMemberDefn(SynMemberDefn.Interface(interfaceType = ty)) :: (SyntaxNode.SynExpr(SynExpr.ObjExpr _) as expr) :: _ -> + let ty = + match ty with + | SynType.App(typeName = ty) -> ty + | _ -> ty + + Some( + CompletionContext.MethodOverride( + MethodOverrideCompletionContext.ObjExpr expr.Range, + ty.Range, + mOverride.StartColumn, + hasThis, + isStatic + ) + ) + | SyntaxNode.SynExpr(SynExpr.ObjExpr(objType = ty)) as expr :: _ -> + let ty = + match ty with + | SynType.App(typeName = ty) -> ty + | _ -> ty + + Some( + CompletionContext.MethodOverride( + MethodOverrideCompletionContext.ObjExpr expr.Range, + ty.Range, + mOverride.StartColumn, + hasThis, + isStatic + ) + ) | _ -> Some CompletionContext.Invalid match returnInfo with - | Some(SynBindingReturnInfo(range = m)) when rangeContainsPos m pos -> Some CompletionContext.Type + | Some(SynBindingReturnInfo(range = m)) when rangeContainsPosOrIsSpacesBetweenRangeAndPos lineStr m pos -> + Some CompletionContext.Type | _ -> match headPat with + // static member | + | SynPat.FromParseError _ when isStaticMember trivia.LeadingKeyword -> + overrideContext path trivia.LeadingKeyword.Range false true false + + // override | + | SynPat.FromParseError _ when isOverrideOrMember trivia.LeadingKeyword && lineStr.[pos.Column - 1] = ' ' -> + overrideContext path trivia.LeadingKeyword.Range false false (isMember trivia.LeadingKeyword) + // override _.| - | SynPat.FromParseError _ when isOverride trivia.LeadingKeyword -> overrideContext path + | SynPat.FromParseError _ when isOverrideOrMember trivia.LeadingKeyword -> + overrideContext path trivia.LeadingKeyword.Range true false (isMember trivia.LeadingKeyword) // override this.| | SynPat.Named(ident = SynIdent(ident = selfId)) when - isOverride trivia.LeadingKeyword && selfId.idRange.End.IsAdjacentTo pos + isOverrideOrMember trivia.LeadingKeyword && selfId.idRange.End.IsAdjacentTo pos -> - overrideContext path + overrideContext path trivia.LeadingKeyword.Range true false (isMember trivia.LeadingKeyword) // override this.ToStr| | SynPat.LongIdent(longDotId = SynLongIdent(id = [ _; methodId ])) when - isOverride trivia.LeadingKeyword && rangeContainsPos methodId.idRange pos + isOverrideOrMember trivia.LeadingKeyword + && rangeContainsPos methodId.idRange pos -> - overrideContext path + overrideContext path trivia.LeadingKeyword.Range true false (isMember trivia.LeadingKeyword) + + // static member A| + | SynPat.LongIdent(longDotId = SynLongIdent(id = [ methodId ])) when + isStaticMember trivia.LeadingKeyword && rangeContainsPos methodId.idRange pos + -> + overrideContext path trivia.LeadingKeyword.Range false true false | SynPat.LongIdent(longDotId = lidwd; argPats = SynArgPats.Pats pats; range = m) when rangeContainsPos m pos -> if rangeContainsPos lidwd.Range pos then @@ -1616,25 +1736,36 @@ module ParsedInput = | [] when range.StartLine = pos.Line -> Some CompletionContext.Invalid | _ -> None - member _.VisitSimplePats(_, pats) = + member _.VisitSimplePats(_, pat) = // Lambdas and their patterns are processed above in VisitExpr, // so VisitSimplePats is only called for primary constructors - pats - |> List.tryPick (fun pat -> - match pat with - // type C (x| ) - | SynSimplePat.Id(range = range) when rangeContainsPos range pos -> Some CompletionContext.Invalid - | SynSimplePat.Typed(pat = SynSimplePat.Id(range = idRange); targetType = synType) -> - // type C (x|: int) -> - if rangeContainsPos idRange pos then - Some CompletionContext.Invalid - // type C (x: int|) -> - elif rangeContainsPos synType.Range pos then - Some CompletionContext.Type - else - None - | _ -> None) + let rec loop (pat: SynPat) = + if not (rangeContainsPos pat.Range pos) then + None + else + + match pat with + // type C (x{caret} ) + | SynPat.Named _ + | SynPat.Const(SynConst.Unit, _) -> Some CompletionContext.Invalid + + | SynPat.Attrib(pat, _, _) + | SynPat.Paren(pat, _) -> loop pat + + | SynPat.Tuple(_, pats, _, _) -> List.tryPick loop pats + + | SynPat.Typed(pat, synType, _) -> + // type C (x: int{caret}) -> + if rangeContainsPos synType.Range pos then + Some CompletionContext.Type + else + // type C (x{caret}: int) -> + loop pat + + | _ -> None + + loop pat member _.VisitPat(_, defaultTraverse, pat) = TryGetCompletionContextInPattern false pat None pos @@ -1662,7 +1793,7 @@ module ParsedInput = None // module Namespace.Top - // module Neste| + // module Nested | SynModuleDecl.NestedModule(moduleInfo = SynComponentInfo(longId = [ ident ])) when rangeContainsPos ident.idRange pos -> Some CompletionContext.Invalid @@ -1673,16 +1804,21 @@ module ParsedInput = | SynType.LongIdent _ when rangeContainsPos ty.Range pos -> Some CompletionContext.Type | _ -> defaultTraverse ty - member _.VisitRecordDefn(_, fields, _) = + member _.VisitRecordDefn(_, fields, range) = fields - |> List.tryPick (fun (SynField(idOpt = idOpt; range = fieldRange)) -> - match idOpt with - | Some id when rangeContainsPos id.idRange pos -> + |> List.tryPick (fun (SynField(idOpt = idOpt; range = fieldRange; fieldType = fieldType)) -> + match idOpt, fieldType with + | Some id, _ when rangeContainsPos id.idRange pos -> Some(CompletionContext.RecordField(RecordContext.Declaration true)) | _ when rangeContainsPos fieldRange pos -> Some(CompletionContext.RecordField(RecordContext.Declaration false)) + | _, SynType.FromParseError _ -> Some(CompletionContext.RecordField(RecordContext.Declaration false)) | _ -> None) // No completions in a record outside of all fields, except in attributes, which is established earlier in VisitAttributeApplication - |> Option.orElse (Some CompletionContext.Invalid) + |> Option.orElseWith (fun _ -> + if rangeContainsPos range pos then + Some CompletionContext.Invalid + else + None) member _.VisitUnionDefn(_, cases, _) = cases @@ -1732,6 +1868,12 @@ module ParsedInput = Some(CompletionContext.ParameterList(att.TypeName.Range.End, findSetters att.ArgExpr)) else None) + + override _.VisitInterfaceSynMemberDefnType(_, synType: SynType) = + match synType with + | SynType.FromParseError(range = m) when rangeContainsPosOrIsSpacesBetweenRangeAndPos lineStr m pos -> + Some(CompletionContext.Inherit(InheritanceContext.Interface, ([], None))) + | _ -> None } let ctxt = SyntaxTraversal.Traverse(pos, parsedInput, visitor) @@ -1811,6 +1953,7 @@ module ParsedInput = | SynTypeConstraint.WhereTyparIsReferenceType(t, _) | SynTypeConstraint.WhereTyparIsUnmanaged(t, _) | SynTypeConstraint.WhereTyparSupportsNull(t, _) + | SynTypeConstraint.WhereTyparNotSupportsNull(genericName = t) | SynTypeConstraint.WhereTyparIsComparable(t, _) | SynTypeConstraint.WhereTyparIsEquatable(t, _) -> walkTypar t | SynTypeConstraint.WhereTyparDefaultsToType(t, ty, _) @@ -1872,6 +2015,7 @@ module ParsedInput = | SynType.Array(_, t, _) | SynType.HashConstraint(t, _) | SynType.MeasurePower(t, _, _) + | SynType.WithNull(innerType = t) | SynType.Paren(t, _) | SynType.SignatureParameter(usedType = t) -> walkType t | SynType.Fun(argType = t1; returnType = t2) @@ -1892,6 +2036,7 @@ module ParsedInput = walkType ident walkType value | SynType.Intersection(types = types) -> List.iter walkType types + | SynType.StaticConstantNull _ | SynType.Anon _ | SynType.AnonRecd _ | SynType.Var _ @@ -2124,17 +2269,18 @@ module ParsedInput = | SynMemberDefn.GetSetMember(getBinding, setBinding, _, _) -> Option.iter walkBinding getBinding Option.iter walkBinding setBinding - | SynMemberDefn.ImplicitCtor(attributes = Attributes attrs; ctorArgs = SynSimplePats.SimplePats(pats = simplePats)) -> + | SynMemberDefn.ImplicitCtor(attributes = Attributes attrs; ctorArgs = pat) -> List.iter walkAttribute attrs - List.iter walkSimplePat simplePats - | SynMemberDefn.ImplicitInherit(t, e, _, _) -> + walkPat pat + | SynMemberDefn.ImplicitInherit(t, e, _, _, _) -> walkType t walkExpr e | SynMemberDefn.LetBindings(bindings, _, _, _) -> List.iter walkBinding bindings | SynMemberDefn.Interface(interfaceType = t; members = members) -> walkType t members |> Option.iter (List.iter walkMember) - | SynMemberDefn.Inherit(t, _, _) -> walkType t + | SynMemberDefn.Inherit(baseType = Some baseType) -> walkType baseType + | SynMemberDefn.Inherit(baseType = None) -> () | SynMemberDefn.ValField(fieldInfo = field) -> walkField field | SynMemberDefn.NestedType(tdef, _, _) -> walkTypeDefn tdef | SynMemberDefn.AutoProperty(attributes = Attributes attrs; typeOpt = t; synExpr = e) -> diff --git a/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fsi b/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fsi index 336e6213a7..427ffda43a 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fsi +++ b/src/fcs-fable/src/Compiler/Service/ServiceParsedInputOps.fsi @@ -42,6 +42,12 @@ type public PatternContext = /// Any other position in a pattern that does not need special handling | Other +[] +type MethodOverrideCompletionContext = + | Class + | Interface of mInterfaceName: range + | ObjExpr of mExpr: range + [] type public CompletionContext = /// Completion context cannot be determined due to errors @@ -79,7 +85,12 @@ type public CompletionContext = | Pattern of context: PatternContext /// Completing a method override (e.g. override this.ToStr|) - | MethodOverride of enclosingTypeNameRange: range + | MethodOverride of + ctx: MethodOverrideCompletionContext * + enclosingTypeNameRange: range * + spacesBeforeOverrideKeyword: int * + hasThis: bool * + isStatic: bool type public ModuleKind = { IsAutoOpen: bool diff --git a/src/fcs-fable/src/Compiler/Service/ServiceStructure.fs b/src/fcs-fable/src/Compiler/Service/ServiceStructure.fs index e2e8e4c20b..5fab5ef9eb 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceStructure.fs +++ b/src/fcs-fable/src/Compiler/Service/ServiceStructure.fs @@ -246,15 +246,15 @@ module Structure = rcheck Scope.New Collapse.Below r e.Range parseExpr e - | SynExpr.YieldOrReturn(_, e, r) -> + | SynExpr.YieldOrReturn(_, e, r, _) -> rcheck Scope.YieldOrReturn Collapse.Below r r parseExpr e - | SynExpr.YieldOrReturnFrom(_, e, r) -> + | SynExpr.YieldOrReturnFrom(_, e, r, _) -> rcheck Scope.YieldOrReturnBang Collapse.Below r r parseExpr e - | SynExpr.DoBang(e, r) -> + | SynExpr.DoBang(expr = e; range = r) -> rcheck Scope.Do Collapse.Below r <| Range.modStart 3 r parseExpr e @@ -337,7 +337,7 @@ module Structure = parseExpr argExpr parseExpr funcExpr - | SynExpr.Sequential(_, _, e1, e2, _) -> + | SynExpr.Sequential(expr1 = e1; expr2 = e2) -> parseExpr e1 parseExpr e2 diff --git a/src/fcs-fable/src/Compiler/Service/ServiceStructure.fsi b/src/fcs-fable/src/Compiler/Service/ServiceStructure.fsi index 6c09e63e99..8771162967 100644 --- a/src/fcs-fable/src/Compiler/Service/ServiceStructure.fsi +++ b/src/fcs-fable/src/Compiler/Service/ServiceStructure.fsi @@ -65,7 +65,7 @@ module public Structure = | Comment | XmlDocComment - /// Stores the range for a construct, the sub-range that should be collapsed for outlinging, + /// Stores the range for a construct, the sub-range that should be collapsed for outlining, /// a tag for the construct type, and a tag for the collapse style [] type ScopeRange = diff --git a/src/fcs-fable/src/Compiler/Service/SynExpr.fs b/src/fcs-fable/src/Compiler/Service/SynExpr.fs new file mode 100644 index 0000000000..d3bac8650c --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/SynExpr.fs @@ -0,0 +1,1241 @@ +namespace FSharp.Compiler.Syntax + +open System +open FSharp.Compiler.SyntaxTrivia +open FSharp.Compiler.Text + +[] +[] +module SynExpr = + let (|Last|) = List.last + + /// Matches if the two values refer to the same object. + [] + let inline (|Is|_|) (inner1: 'a) (inner2: 'a) = + if obj.ReferenceEquals(inner1, inner2) then + ValueSome Is + else + ValueNone + + /// Represents a symbolic infix operator with the precedence of *, /, or %. + /// All instances of this type are considered equal. + [] + type MulDivMod = + | Mul + | Div + | Mod + + member _.CompareTo(_other: MulDivMod) = 0 + override this.Equals obj = this.CompareTo(unbox obj) = 0 + override _.GetHashCode() = 0 + + interface IComparable with + member this.CompareTo obj = this.CompareTo(unbox obj) + + /// Represents a symbolic infix operator with the precedence of + or -. + /// All instances of this type are considered equal. + [] + type AddSub = + | Add + | Sub + + member _.CompareTo(_other: AddSub) = 0 + override this.Equals obj = this.CompareTo(unbox obj) = 0 + override _.GetHashCode() = 0 + + interface IComparable with + member this.CompareTo obj = this.CompareTo(unbox obj) + + /// Holds a symbolic operator's original notation. + /// Equality is based on the contents of the string. + /// Comparison always returns 0. + [] + type OriginalNotation = + | OriginalNotation of string + + member _.CompareTo(_other: OriginalNotation) = 0 + + override this.Equals obj = + match this, obj with + | OriginalNotation this, (:? OriginalNotation as OriginalNotation other) -> String.Equals(this, other, StringComparison.Ordinal) + | _ -> false + + override this.GetHashCode() = + match this with + | OriginalNotation notation -> notation.GetHashCode() + + interface IComparable with + member this.CompareTo obj = this.CompareTo(unbox obj) + + /// Represents an expression's precedence. + /// Comparison is based only on the precedence case. + /// Equality considers the embedded original notation, if any. + /// + /// For example: + /// + /// compare (AddSub (Add, OriginalNotation "+")) (AddSub (Add, OriginalNotation "++")) = 0 + /// + /// but + /// + /// AddSub (Add, OriginalNotation "+") <> AddSub (Add, OriginalNotation "++") + type Precedence = + /// yield, yield!, return, return! + | Low + + /// <- + | Set + + /// := + | ColonEquals + + /// , + | Comma + + /// or, || + /// + /// Refers to the exact operators or and ||. + /// Instances with leading dots or question marks or trailing characters are parsed as Bar instead. + | BarBar of OriginalNotation + + /// &, && + /// + /// Refers to the exact operators & and &&. + /// Instances with leading dots or question marks or trailing characters are parsed as Amp instead. + | AmpAmp of OriginalNotation + + /// :>, :?> + | UpcastDowncast + + /// =…, |…, &…, $…, >…, <…, !=… + | Relational of OriginalNotation + + /// ^…, @… + | HatAt + + /// :: + | Cons + + /// :? + | TypeTest + + /// +…, -… + | AddSub of AddSub * OriginalNotation + + /// *…, /…, %… + | MulDivMod of MulDivMod * OriginalNotation + + /// **… + | Exp + + /// - x + | UnaryPrefix + + /// f x + | Apply + + /// -x, !… x, ~~… x + | High + + // x.y + | Dot + + /// Associativity/association. + type Assoc = + /// Non-associative or no association. + | Non + + /// Left-associative or left-hand association. + | Left + + /// Right-associative or right-hand association. + | Right + + module Assoc = + let ofPrecedence precedence = + match precedence with + | Low -> Non + | Set -> Non + | ColonEquals -> Right + | Comma -> Non + | BarBar _ -> Left + | AmpAmp _ -> Left + | UpcastDowncast -> Right + | Relational _ -> Left + | HatAt -> Right + | Cons -> Right + | TypeTest -> Non + | AddSub _ -> Left + | MulDivMod _ -> Left + | Exp -> Right + | UnaryPrefix -> Left + | Apply -> Left + | High -> Left + | Dot -> Left + + /// See atomicExprAfterType in pars.fsy. + [] + let (|AtomicExprAfterType|_|) expr = + match expr with + | SynExpr.Paren _ + | SynExpr.Quote _ + | SynExpr.Const _ + | SynExpr.Tuple(isStruct = true) + | SynExpr.Record _ + | SynExpr.AnonRecd _ + | SynExpr.InterpolatedString _ + | SynExpr.Null _ + | SynExpr.ArrayOrList(isArray = true) + | SynExpr.ArrayOrListComputed(isArray = true) -> ValueSome AtomicExprAfterType + | _ -> ValueNone + + /// Matches if the given expression represents a high-precedence + /// function application, e.g., + /// + /// f x + /// + /// (+) x y + [] + let (|HighPrecedenceApp|_|) expr = + match expr with + | SynExpr.App(isInfix = false; funcExpr = SynExpr.Ident _) + | SynExpr.App(isInfix = false; funcExpr = SynExpr.LongIdent _) + | SynExpr.App(isInfix = false; funcExpr = SynExpr.App(isInfix = false)) -> ValueSome HighPrecedenceApp + | _ -> ValueNone + + module FuncExpr = + /// Matches when the given funcExpr is a direct application + /// of a symbolic operator, e.g., -, _not_ (~-). + [] + let (|SymbolicOperator|_|) funcExpr = + match funcExpr with + | SynExpr.LongIdent(longDotId = SynLongIdent(trivia = trivia)) -> + let rec tryPick = + function + | [] -> ValueNone + | Some(IdentTrivia.OriginalNotation op) :: _ -> ValueSome op + | _ :: rest -> tryPick rest + + tryPick trivia + | _ -> ValueNone + + /// Matches when the given expression is a prefix operator application, e.g., + /// + /// -x + /// + /// ~~~x + [] + let (|PrefixApp|_|) expr : Precedence voption = + match expr with + | SynExpr.App(isInfix = false; funcExpr = funcExpr & FuncExpr.SymbolicOperator op; argExpr = argExpr) -> + if funcExpr.Range.IsAdjacentTo argExpr.Range then + ValueSome High + else + assert (op.Length > 0) + + match op[0] with + | '!' + | '~' -> ValueSome High + | _ -> ValueSome UnaryPrefix + + | SynExpr.AddressOf(expr = expr; opRange = opRange) -> + if opRange.IsAdjacentTo expr.Range then + ValueSome High + else + ValueSome UnaryPrefix + + | _ -> ValueNone + + /// Tries to parse the given original notation as a symbolic infix operator. + [] + let (|SymbolPrec|_|) (originalNotation: string) = + // Trim any leading dots or question marks from the given symbolic operator. + // Leading dots or question marks have no effect on operator precedence or associativity + // with the exception of &, &&, and ||. +#if FABLE_COMPILER + let trimmed = originalNotation.TrimStart([|'.'; '?'|]) +#else + let ignoredLeadingChars = ".?".AsSpan() + let trimmed = originalNotation.AsSpan().TrimStart ignoredLeadingChars +#endif + assert (trimmed.Length > 0) + + match trimmed[0], originalNotation with + | _, ":=" -> ValueSome ColonEquals + | _, ("||" | "or") -> ValueSome(BarBar(OriginalNotation originalNotation)) + | _, ("&" | "&&") -> ValueSome(AmpAmp(OriginalNotation originalNotation)) + | '|', _ + | '&', _ + | '<', _ + | '>', _ + | '=', _ + | '$', _ -> ValueSome(Relational(OriginalNotation originalNotation)) + | '!', _ when trimmed.Length > 1 && trimmed[1] = '=' -> ValueSome(Relational(OriginalNotation originalNotation)) + | '^', _ + | '@', _ -> ValueSome HatAt + | _, "::" -> ValueSome Cons + | '+', _ -> ValueSome(AddSub(Add, OriginalNotation originalNotation)) + | '-', _ -> ValueSome(AddSub(Sub, OriginalNotation originalNotation)) + | '/', _ -> ValueSome(MulDivMod(Div, OriginalNotation originalNotation)) + | '%', _ -> ValueSome(MulDivMod(Mod, OriginalNotation originalNotation)) + | '*', _ when trimmed.Length > 1 && trimmed[1] = '*' -> ValueSome Exp + | '*', _ -> ValueSome(MulDivMod(Mul, OriginalNotation originalNotation)) + | _ -> ValueNone + + [] + let (|Contains|_|) (c: char) (s: string) = + if s.IndexOf c >= 0 then ValueSome Contains else ValueNone + + /// Any expressions in which the removal of parens would + /// lead to something like the following that would be + /// confused by the parser with a type parameter application: + /// + /// xz + /// + /// xz + [] + let rec (|ConfusableWithTypeApp|_|) synExpr = + match synExpr with + | SynExpr.Paren(expr = ConfusableWithTypeApp) + | SynExpr.App(funcExpr = ConfusableWithTypeApp) + | SynExpr.App(isInfix = true; funcExpr = FuncExpr.SymbolicOperator(Contains '>'); argExpr = ConfusableWithTypeApp) -> + ValueSome ConfusableWithTypeApp + | SynExpr.App(isInfix = true; funcExpr = funcExpr & FuncExpr.SymbolicOperator(Contains '<'); argExpr = argExpr) when + argExpr.Range.IsAdjacentTo funcExpr.Range + -> + ValueSome ConfusableWithTypeApp + | SynExpr.Tuple(exprs = exprs) -> + let rec anyButLast = + function + | _ :: [] + | [] -> ValueNone + | ConfusableWithTypeApp :: _ -> ValueSome ConfusableWithTypeApp + | _ :: tail -> anyButLast tail + + anyButLast exprs + | _ -> ValueNone + + /// Matches when the expression represents the infix application of a symbolic operator. + /// + /// (x λ y) ρ z + /// + /// x λ (y ρ z) + [] + let (|InfixApp|_|) synExpr : struct (Precedence * Assoc) voption = + match synExpr with + | SynExpr.App(funcExpr = SynExpr.App(isInfix = true; funcExpr = FuncExpr.SymbolicOperator(SymbolPrec prec))) -> + ValueSome(prec, Right) + | SynExpr.App(isInfix = true; funcExpr = FuncExpr.SymbolicOperator(SymbolPrec prec)) -> ValueSome(prec, Left) + | SynExpr.Upcast _ + | SynExpr.Downcast _ -> ValueSome(UpcastDowncast, Left) + | SynExpr.TypeTest _ -> ValueSome(TypeTest, Left) + | _ -> ValueNone + + /// Returns the given expression's precedence and the side of the inner expression, + /// if applicable. + [] + let (|OuterBinaryExpr|_|) inner outer : struct (Precedence * Assoc) voption = + match outer with + | SynExpr.YieldOrReturn _ + | SynExpr.YieldOrReturnFrom _ -> ValueSome(Low, Right) + | SynExpr.Tuple(exprs = SynExpr.Paren(expr = Is inner) :: _) -> ValueSome(Comma, Left) + | SynExpr.Tuple _ -> ValueSome(Comma, Right) + | InfixApp(Cons, side) -> ValueSome(Cons, side) + | SynExpr.Assert _ + | SynExpr.Lazy _ + | SynExpr.InferredUpcast _ + | SynExpr.InferredDowncast _ -> ValueSome(Apply, Non) + | PrefixApp prec -> ValueSome(prec, Non) + | InfixApp(prec, side) -> ValueSome(prec, side) + | SynExpr.App(argExpr = SynExpr.ComputationExpr _) -> ValueSome(UnaryPrefix, Left) + | SynExpr.App(funcExpr = SynExpr.Paren(expr = SynExpr.App _)) -> ValueSome(Apply, Left) + | SynExpr.App(flag = ExprAtomicFlag.Atomic) -> ValueSome(Dot, Non) + | SynExpr.App _ -> ValueSome(Apply, Non) + | SynExpr.DotSet(targetExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Dot, Left) + | SynExpr.DotSet(rhsExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Set, Right) + | SynExpr.DotIndexedSet(objectExpr = SynExpr.Paren(expr = Is inner)) + | SynExpr.DotNamedIndexedPropertySet(targetExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Dot, Left) + | SynExpr.DotIndexedSet(valueExpr = SynExpr.Paren(expr = Is inner)) + | SynExpr.DotNamedIndexedPropertySet(rhsExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Set, Right) + | SynExpr.LongIdentSet(expr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Set, Right) + | SynExpr.Set _ -> ValueSome(Set, Non) + | SynExpr.DotGet _ -> ValueSome(Dot, Left) + | SynExpr.DotIndexedGet(objectExpr = SynExpr.Paren(expr = Is inner)) -> ValueSome(Dot, Left) + | _ -> ValueNone + + /// Matches a SynExpr.App nested in a sequence of dot-gets. + /// + /// x.M.N().O + [] + let (|NestedApp|_|) expr = + let rec loop = + function + | SynExpr.DotGet(expr = expr) + | SynExpr.DotIndexedGet(objectExpr = expr) -> loop expr + | SynExpr.App _ -> ValueSome NestedApp + | _ -> ValueNone + + loop expr + + /// Returns the given expression's precedence, if applicable. + [] + let (|InnerBinaryExpr|_|) expr : Precedence voption = + match expr with + | SynExpr.Tuple(isStruct = false) -> ValueSome Comma + | SynExpr.DotGet(expr = NestedApp) + | SynExpr.DotIndexedGet(objectExpr = NestedApp) -> ValueSome Apply + | SynExpr.DotGet _ + | SynExpr.DotIndexedGet _ -> ValueSome Dot + | PrefixApp prec -> ValueSome prec + | InfixApp(prec, _) -> ValueSome prec + | SynExpr.App _ + | SynExpr.Assert _ + | SynExpr.Lazy _ + | SynExpr.For _ + | SynExpr.ForEach _ + | SynExpr.While _ + | SynExpr.Do _ + | SynExpr.New _ + | SynExpr.InferredUpcast _ + | SynExpr.InferredDowncast _ -> ValueSome Apply + | SynExpr.DotIndexedSet _ + | SynExpr.DotNamedIndexedPropertySet _ + | SynExpr.DotSet _ -> ValueSome Set + | _ -> ValueNone + + module Dangling = + /// Returns the first matching nested right-hand target expression, if any. + let private dangling (target: SynExpr -> SynExpr option) = + let (|Target|_|) = target + + let rec loop expr = + match expr with + | Target expr -> ValueSome expr + | SynExpr.Tuple(isStruct = false; exprs = Last expr) + | SynExpr.App(argExpr = expr) + | SynExpr.IfThenElse(elseExpr = Some expr) + | SynExpr.IfThenElse(ifExpr = expr) + | SynExpr.Sequential(expr2 = expr) + | SynExpr.YieldOrReturn(expr = expr) + | SynExpr.YieldOrReturnFrom(expr = expr) + | SynExpr.Set(rhsExpr = expr) + | SynExpr.DotSet(rhsExpr = expr) + | SynExpr.DotNamedIndexedPropertySet(rhsExpr = expr) + | SynExpr.DotIndexedSet(valueExpr = expr) + | SynExpr.LongIdentSet(expr = expr) + | SynExpr.LetOrUse(body = expr) + | SynExpr.Lambda(body = expr) + | SynExpr.Match(clauses = Last(SynMatchClause(resultExpr = expr))) + | SynExpr.MatchLambda(matchClauses = Last(SynMatchClause(resultExpr = expr))) + | SynExpr.MatchBang(clauses = Last(SynMatchClause(resultExpr = expr))) + | SynExpr.TryWith(withCases = Last(SynMatchClause(resultExpr = expr))) + | SynExpr.TryFinally(finallyExpr = expr) + | SynExpr.Do(expr = expr) + | SynExpr.DoBang(expr = expr) -> loop expr + | _ -> ValueNone + + loop + + /// Matches a dangling if-then construct. + [] + let (|IfThen|_|) = + dangling (function + | SynExpr.IfThenElse _ as expr -> Some expr + | _ -> None) + + /// Matches a dangling let or use construct. + [] + let (|LetOrUse|_|) = + dangling (function + | SynExpr.LetOrUse _ + | SynExpr.LetOrUseBang _ as expr -> Some expr + | _ -> None) + + /// Matches a dangling sequential expression. + [] + let (|Sequential|_|) = + dangling (function + | SynExpr.Sequential _ as expr -> Some expr + | _ -> None) + + /// Matches a dangling try-with or try-finally construct. + [] + let (|Try|_|) = + dangling (function + | SynExpr.TryWith _ + | SynExpr.TryFinally _ as expr -> Some expr + | _ -> None) + + /// Matches a dangling match-like construct. + [] + let (|Match|_|) = + dangling (function + | SynExpr.Match _ + | SynExpr.MatchBang _ + | SynExpr.MatchLambda _ + | SynExpr.TryWith _ + | SynExpr.Lambda _ as expr -> Some expr + | _ -> None) + + /// Matches a dangling arrow-sensitive construct. + [] + let (|ArrowSensitive|_|) = + dangling (function + | SynExpr.Match _ + | SynExpr.MatchBang _ + | SynExpr.MatchLambda _ + | SynExpr.TryWith _ + | SynExpr.Lambda _ + | SynExpr.Typed _ + | SynExpr.TypeTest _ + | SynExpr.Upcast _ + | SynExpr.Downcast _ as expr -> Some expr + | _ -> None) + + /// Matches a nested dangling construct that could become problematic + /// if the surrounding parens were removed. + [] + let (|Problematic|_|) = + dangling (function + | SynExpr.Lambda _ + | SynExpr.MatchLambda _ + | SynExpr.Match _ + | SynExpr.MatchBang _ + | SynExpr.TryWith _ + | SynExpr.TryFinally _ + | SynExpr.IfThenElse _ + | SynExpr.Sequential _ + | SynExpr.LetOrUse _ + | SynExpr.Set _ + | SynExpr.LongIdentSet _ + | SynExpr.DotIndexedSet _ + | SynExpr.DotNamedIndexedPropertySet _ + | SynExpr.DotSet _ + | SynExpr.NamedIndexedPropertySet _ as expr -> Some expr + | _ -> None) + + /// Indicates whether the expression with the given range + /// includes indentation that would be invalid + /// in context if it were not wrapped in parentheses. + let containsSensitiveIndentation (getSourceLineStr: int -> string) outerOffsidesColumn (range: range) = + let startLine = range.StartLine + let endLine = range.EndLine + + if startLine = endLine then + range.StartColumn <= outerOffsidesColumn + else + let rec loop offsides lineNo (startCol: int) = + if lineNo <= endLine then + let line = getSourceLineStr lineNo + + match offsides with + | ValueNone -> +#if FABLE_COMPILER + let slice = line[startCol..] + let mutable i = -1 + let i = if slice |> String.forall (fun c -> i <- i + 1; c = ' ' || c = ')') then -1 else i +#else + let i = line.AsSpan(startCol).IndexOfAnyExcept(' ', ')') +#endif + + if i >= 0 then + let newOffsides = i + startCol + + newOffsides <= outerOffsidesColumn + || loop (ValueSome newOffsides) (lineNo + 1) 0 + else + loop offsides (lineNo + 1) 0 + + | ValueSome offsidesCol -> +#if FABLE_COMPILER + let mutable i = -1 + let i = if line |> String.forall (fun c -> i <- i + 1; i < offsidesCol && (c = ' ' || c = ')')) then -1 else i + if i >= 0 && i < offsidesCol then + let slice = line[i .. (min (offsidesCol - i) (line.Length - i)) - 1] + let mutable j = -1 + let j = if slice |> String.forall (fun c -> j <- j + 1; "*/%-+:^@><=!|0$.?".Contains(string c)) then -1 else j +#else + let i = line.AsSpan(0, min offsidesCol line.Length).IndexOfAnyExcept(' ', ')') + + if i >= 0 && i < offsidesCol then + let slice = line.AsSpan(i, min (offsidesCol - i) (line.Length - i)) + let j = slice.IndexOfAnyExcept("*/%-+:^@><=!|0$.?".AsSpan()) +#endif + + let lo = i + (if j >= 0 && slice[j] = ' ' then j else 0) + + lo < offsidesCol - 1 + || lo <= outerOffsidesColumn + || loop offsides (lineNo + 1) 0 + else + loop offsides (lineNo + 1) 0 + else + false + + loop ValueNone startLine range.StartColumn + + /// Matches constructs that are sensitive to + /// certain kinds of undentation in sequential expressions. + [] + let (|UndentationSensitive|_|) expr = + match expr with + | SynExpr.TryWith _ + | SynExpr.TryFinally _ + | SynExpr.For _ + | SynExpr.ForEach _ + | SynExpr.IfThenElse _ + | SynExpr.Match _ + | SynExpr.While _ + | SynExpr.Do _ -> ValueSome UndentationSensitive + | _ -> ValueNone + + let rec shouldBeParenthesizedInContext (getSourceLineStr: int -> string) path expr : bool = + let shouldBeParenthesizedInContext = shouldBeParenthesizedInContext getSourceLineStr + let containsSensitiveIndentation = containsSensitiveIndentation getSourceLineStr + + let (|StartsWith|) (s: string) = s[0] + + // Matches if the given expression starts with a symbol, e.g., <@ … @>, $"…", @"…", +1, -1… + let (|StartsWithSymbol|_|) = + let (|TextStartsWith|) (m: range) = + let line = getSourceLineStr m.StartLine + line[m.StartColumn] + + function + | SynExpr.Quote _ + | SynExpr.InterpolatedString _ + | SynExpr.Const(SynConst.String(synStringKind = SynStringKind.Verbatim), _) + | SynExpr.Const(SynConst.Byte _, TextStartsWith '+') + | SynExpr.Const(SynConst.UInt16 _, TextStartsWith '+') + | SynExpr.Const(SynConst.UInt32 _, TextStartsWith '+') + | SynExpr.Const(SynConst.UInt64 _, TextStartsWith '+') + | SynExpr.Const(SynConst.UIntPtr _, TextStartsWith '+') + | SynExpr.Const(SynConst.SByte _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.Int16 _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.Int32 _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.Int64 _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.IntPtr _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.Decimal _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.Double _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.Single _, TextStartsWith('-' | '+')) + | SynExpr.Const(SynConst.Measure(_, TextStartsWith('-' | '+'), _, _), _) + | SynExpr.Const(SynConst.UserNum(StartsWith('-' | '+'), _), _) -> Some StartsWithSymbol + | _ -> None + + // Matches if the given expression is a numeric literal + // that it is safe to "dot into," e.g., 1l, 0b1, 1e10, 1d, 1.0… + let (|DotSafeNumericLiteral|_|) = + /// 1l, 1d, 0b1, 0x1, 0o1, 1e10… + let (|TextContainsLetter|_|) (m: range) = + let line = getSourceLineStr m.StartLine +#if FABLE_COMPILER + let span = line[m.StartColumn .. (m.EndColumn - m.StartColumn - 1)] + if span |> String.exists (fun c -> c >= 'A' && c <= 'z') then +#else + let span = line.AsSpan(m.StartColumn, m.EndColumn - m.StartColumn) + if span.LastIndexOfAnyInRange('A', 'z') >= 0 then +#endif + Some TextContainsLetter + else + None + + // 1.0… + let (|TextEndsWithNumber|_|) (m: range) = + let line = getSourceLineStr m.StartLine +#if FABLE_COMPILER + if Char.IsDigit line[m.EndColumn - 1] then +#else + let span = line.AsSpan(m.StartColumn, m.EndColumn - m.StartColumn) + + if Char.IsDigit span[span.Length - 1] then +#endif + Some TextEndsWithNumber + else + None + + function + | SynExpr.Const(SynConst.Byte _, _) + | SynExpr.Const(SynConst.UInt16 _, _) + | SynExpr.Const(SynConst.UInt32 _, _) + | SynExpr.Const(SynConst.UInt64 _, _) + | SynExpr.Const(SynConst.UIntPtr _, _) + | SynExpr.Const(SynConst.SByte _, _) + | SynExpr.Const(SynConst.Int16 _, _) + | SynExpr.Const(SynConst.Int32 _, TextContainsLetter) + | SynExpr.Const(SynConst.Int64 _, _) + | SynExpr.Const(SynConst.IntPtr _, _) + | SynExpr.Const(SynConst.Decimal _, _) + | SynExpr.Const(SynConst.Double _, (TextEndsWithNumber | TextContainsLetter)) + | SynExpr.Const(SynConst.Single _, _) + | SynExpr.Const(SynConst.Measure _, _) + | SynExpr.Const(SynConst.UserNum _, _) -> Some DotSafeNumericLiteral + | _ -> None + + match expr, path with + // Parens must stay around binary equals expressions in argument + // position lest they be interpreted as named argument assignments: + // + // o.M((x = y)) + // o.N((x = y), z) + // + // Likewise, double parens must stay around a tuple, since we don't know whether + // the method being invoked might have a signature like + // + // val TryGetValue : 'Key * outref<'Value> -> bool + // + // where 'Key is 'a * 'b, in which case the double parens are required. + | SynExpr.Paren(expr = InfixApp(Relational(OriginalNotation "="), _)), + SyntaxNode.SynExpr(SynExpr.App(funcExpr = SynExpr.LongIdent _ | SynExpr.DotGet _ | SynExpr.Ident _)) :: _ + | InfixApp(Relational(OriginalNotation "="), _), + SyntaxNode.SynExpr(SynExpr.Paren _) :: SyntaxNode.SynExpr(SynExpr.App( + funcExpr = SynExpr.LongIdent _ | SynExpr.DotGet _ | SynExpr.Ident _)) :: _ + | InfixApp(Relational(OriginalNotation "="), _), + SyntaxNode.SynExpr(SynExpr.Tuple(isStruct = false)) :: SyntaxNode.SynExpr(SynExpr.Paren _) :: SyntaxNode.SynExpr(SynExpr.App( + funcExpr = SynExpr.LongIdent _ | SynExpr.DotGet _ | SynExpr.Ident _)) :: _ + | SynExpr.Paren(expr = SynExpr.Tuple(isStruct = false)), + SyntaxNode.SynExpr(SynExpr.App(funcExpr = SynExpr.LongIdent _ | SynExpr.DotGet _ | SynExpr.Ident _)) :: _ + | SynExpr.Tuple(isStruct = false), + SyntaxNode.SynExpr(SynExpr.Paren _) :: SyntaxNode.SynExpr(SynExpr.App( + funcExpr = SynExpr.LongIdent _ | SynExpr.DotGet _ | SynExpr.Ident _)) :: _ + | SynExpr.Const(SynConst.Unit, _), + SyntaxNode.SynExpr(SynExpr.App(funcExpr = SynExpr.LongIdent _ | SynExpr.DotGet _ | SynExpr.Ident _)) :: _ -> true + + // Already parenthesized. + | _, SyntaxNode.SynExpr(SynExpr.Paren _) :: _ -> false + + // Parens must stay around indentation that would otherwise be invalid: + // + // let _ = (x + // +y) + | _, SyntaxNode.SynBinding(SynBinding(trivia = trivia)) :: _ when + containsSensitiveIndentation trivia.LeadingKeyword.Range.StartColumn expr.Range + -> + true + + // Parens must stay around indentation that would otherwise be invalid: + // + // return ( + // x + // ) + | _, SyntaxNode.SynExpr(SynExpr.YieldOrReturn _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.YieldOrReturnFrom _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.Assert _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.Lazy _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.App(argExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.LetOrUse _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.LetOrUseBang _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.TryWith _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.TryFinally _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.For _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.ForEach _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.IfThenElse _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.New _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.Set(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.DotIndexedSet(valueExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.DotNamedIndexedPropertySet(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.DotSet(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.LibraryOnlyUnionCaseFieldSet(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.LongIdentSet(expr = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.NamedIndexedPropertySet(expr2 = SynExpr.Paren(expr = Is expr)) as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.InferredUpcast _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.InferredDowncast _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.Match _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.MatchBang _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.While _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.WhileBang _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.Do _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.DoBang _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.Fixed _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.Record _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.AnonRecd _ as outer) :: _ + | _, SyntaxNode.SynExpr(SynExpr.InterpolatedString _ as outer) :: _ when + containsSensitiveIndentation outer.Range.StartColumn expr.Range + -> + true + + // Hanging tuples: + // + // let _ = + // ( + // 1, 2, + // 3, 4 + // ) + // + // or + // + // [ + // 1, 2, + // 3, 4 + // (1, 2, + // 3, 4) + // ] + | SynExpr.Tuple(isStruct = false; exprs = exprs; range = range), _ when + range.StartLine <> range.EndLine + && exprs |> List.exists (fun e -> e.Range.StartColumn < range.StartColumn) + -> + true + + // There are certain constructs whose indentation in + // a sequential expression is valid when parenthesized + // (and separated from the following expression by a semicolon), + // but where the parsing of the outer expression would change if + // the parentheses were removed in place, e.g., + // + // [ + // (if p then q else r); // Cannot remove in place because of the indentation of y below. + // y + // ] + // + // or + // + // [ + // x; + // (if p then q else r); // Cannot remove in place because of the indentation of x above. + // z + // ] + // + // This analysis is imperfect in that it sometimes requires parens when they + // may not be required, but the only way to know for sure in such cases would be to walk up + // an unknown number of ancestral sequential expressions to check for problematic + // indentation (or to keep track of the offsides line throughout the AST traversal): + // + // [ + // x; // This line's indentation means we cannot remove below. + // (…); + // (…); + // (* 𝑛 more such lines. *) + // (…); + // (…); + // (if p then q else r); // Can no longer remove here because of the indentation of x above. + // z + // ] + | UndentationSensitive, + SyntaxNode.SynExpr(SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is expr))) :: SyntaxNode.SynExpr(SynExpr.Sequential( + expr1 = SynExpr.Paren(expr = other) | other)) :: _ + | UndentationSensitive, + SyntaxNode.SynExpr(SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is expr); expr2 = other)) :: SyntaxNode.SynExpr(SynExpr.Sequential _) :: _ + | UndentationSensitive, + SyntaxNode.SynExpr(SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is expr); expr2 = other)) :: SyntaxNode.SynExpr(SynExpr.ArrayOrListComputed _) :: _ + | UndentationSensitive, + SyntaxNode.SynExpr(SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is expr); expr2 = other)) :: SyntaxNode.SynExpr(SynExpr.ArrayOrList _) :: _ + | UndentationSensitive, + SyntaxNode.SynExpr(SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is expr); expr2 = other)) :: SyntaxNode.SynExpr(SynExpr.ComputationExpr _) :: _ when + expr.Range.StartLine <> other.Range.StartLine + && expr.Range.StartColumn <= other.Range.StartColumn + -> + true + + // Check for nested matches, e.g., + // + // match … with … -> (…, match … with … -> … | … -> …) | … -> … + | _, SyntaxNode.SynMatchClause _ :: path -> shouldBeParenthesizedInContext path expr + + // We always need parens for trait calls, e.g., + // + // let inline f x = (^a : (static member Parse : string -> ^a) x) + | SynExpr.TraitCall _, _ -> true + + // Don't touch library-only stuff: + // + // (# "ldlen.multi 2 0" array : int #) + | SynExpr.LibraryOnlyILAssembly _, _ + | SynExpr.LibraryOnlyStaticOptimization _, _ + | SynExpr.LibraryOnlyUnionCaseFieldGet _, _ + | SynExpr.LibraryOnlyUnionCaseFieldSet _, _ -> true + + // Parens are otherwise never required for binding bodies or for top-level expressions, e.g., + // + // let x = (…) + // _.member X = (…) + // (printfn "Hello, world.") + | _, SyntaxNode.SynBinding _ :: _ + | _, SyntaxNode.SynModule _ :: _ -> false + + // Parens must be kept when there is a high-precedence function application + // before a prefix operator application before another expression that starts with a symbol, e.g., + // + // id -(-x) + // id -(-1y) + // id -($"") + // id -(@"") + // id -(<@ ValueNone @>) + // let (~+) _ = true in assert +($"{true}") + | (PrefixApp _ | StartsWithSymbol), + SyntaxNode.SynExpr(SynExpr.App _) :: SyntaxNode.SynExpr(HighPrecedenceApp | SynExpr.Assert _ | SynExpr.InferredUpcast _ | SynExpr.InferredDowncast _) :: _ -> + true + + // Parens must be kept in a scenario like + // + // !x.M(y) + // ~~~x.M(y) + // + // since prefix ! or ~~~ (with no space) have higher + // precedence than regular function application. + | _, SyntaxNode.SynExpr(SynExpr.App _) :: SyntaxNode.SynExpr(PrefixApp High) :: _ -> true + + // Parens are never required around suffixed or infixed numeric literals, e.g., + // + // (1l).ToString() + // (1uy).ToString() + // (0b1).ToString() + // (1e10).ToString() + // (1.0).ToString() + | DotSafeNumericLiteral, _ -> false + + // Parens are required around bare decimal ints or doubles ending + // in dots when being dotted into, e.g., + // + // (1).ToString() + // (1.).ToString() + | SynExpr.Const(constant = SynConst.Int32 _ | SynConst.Double _), SyntaxNode.SynExpr(SynExpr.DotGet _) :: _ -> true + + // Parens are required around join conditions: + // + // join … on (… = …) + | SynExpr.App _, SyntaxNode.SynExpr(SynExpr.App _) :: SyntaxNode.SynExpr(SynExpr.JoinIn _) :: _ -> true + + // Parens are not required around a few anointed expressions after inherit: + // + // inherit T(3) + // inherit T(null) + // inherit T("") + // … + | AtomicExprAfterType, SyntaxNode.SynMemberDefn(SynMemberDefn.ImplicitInherit _) :: _ -> false + + // Parens are otherwise required in inherit T(x), etc. + | _, SyntaxNode.SynMemberDefn(SynMemberDefn.ImplicitInherit _) :: _ -> true + + // We can't remove parens when they're required for fluent calls: + // + // x.M(y).N z + // x.M(y).[z] + // _.M(x) + // (f x)[z] + // (f(x))[z] + // x.M(y)[z] + // M(x).N <- y + | SynExpr.App _, SyntaxNode.SynExpr(SynExpr.App(argExpr = SynExpr.ArrayOrListComputed(isArray = false))) :: _ -> true + + | _, SyntaxNode.SynExpr(SynExpr.App _) :: path + | _, SyntaxNode.SynExpr(OuterBinaryExpr expr (Dot, _)) :: SyntaxNode.SynExpr(SynExpr.App _) :: path when + let rec appChainDependsOnDotOrPseudoDotPrecedence path = + match path with + | SyntaxNode.SynExpr(SynExpr.DotGet _) :: _ + | SyntaxNode.SynExpr(SynExpr.DotLambda _) :: _ + | SyntaxNode.SynExpr(SynExpr.DotIndexedGet _) :: _ + | SyntaxNode.SynExpr(SynExpr.Set _) :: _ + | SyntaxNode.SynExpr(SynExpr.DotSet _) :: _ + | SyntaxNode.SynExpr(SynExpr.DotIndexedSet _) :: _ + | SyntaxNode.SynExpr(SynExpr.DotNamedIndexedPropertySet _) :: _ + | SyntaxNode.SynExpr(SynExpr.App(argExpr = SynExpr.ArrayOrListComputed(isArray = false))) :: _ -> true + | SyntaxNode.SynExpr(SynExpr.App _) :: path -> appChainDependsOnDotOrPseudoDotPrecedence path + | _ -> false + + appChainDependsOnDotOrPseudoDotPrecedence path + -> + true + + // The :: operator is parsed differently from other symbolic infix operators, + // so we need to give it special treatment. + + // Outer right: + // + // (x) :: xs + // (x * y) :: zs + // … + | _, + SyntaxNode.SynExpr(SynExpr.Tuple(isStruct = false; exprs = [ SynExpr.Paren _; _ ])) :: (SyntaxNode.SynExpr(SynExpr.App( + isInfix = true)) :: _ as path) -> shouldBeParenthesizedInContext path expr + + // Outer left: + // + // x :: (xs) + // x :: (ys @ zs) + // … + | argExpr, + SyntaxNode.SynExpr(SynExpr.Tuple(isStruct = false; exprs = [ _; SynExpr.Paren _ ])) :: SyntaxNode.SynExpr(SynExpr.App( + isInfix = true) as outer) :: path -> + shouldBeParenthesizedInContext + (SyntaxNode.SynExpr(SynExpr.App(ExprAtomicFlag.NonAtomic, false, outer, argExpr, outer.Range)) + :: path) + expr + + // Ordinary nested expressions. + | inner, SyntaxNode.SynExpr outer :: outerPath -> + let dangling expr = + match expr with + | Dangling.Problematic subExpr -> + match outer with + | SynExpr.Tuple(exprs = exprs) -> not (obj.ReferenceEquals(subExpr, List.last exprs)) + | InfixApp(_, Left) -> true + | _ -> shouldBeParenthesizedInContext outerPath subExpr + + | _ -> false + + let problematic (exprRange: range) (delimiterRange: range) = + exprRange.EndLine = delimiterRange.EndLine + && exprRange.EndColumn < delimiterRange.StartColumn + + let anyProblematic matchOrTryRange clauses = + let rec loop = + function + | [] -> false + | SynMatchClause(trivia = trivia) :: clauses -> + trivia.BarRange |> Option.exists (problematic matchOrTryRange) + || trivia.ArrowRange |> Option.exists (problematic matchOrTryRange) + || loop clauses + + loop clauses + + let innerBindingsWouldShadowOuter expr1 (expr2: SynExpr) = + let identsBoundInInner = + (Set.empty, [ SyntaxNode.SynExpr expr1 ]) + ||> SyntaxNodes.fold (fun idents _path node -> + match node with + | SyntaxNode.SynPat(SynPat.Named(ident = SynIdent(ident = ident))) -> idents.Add ident.idText + | _ -> idents) + + if identsBoundInInner.IsEmpty then + false + else + (expr2.Range.End, [ SyntaxNode.SynExpr expr2 ]) + ||> SyntaxNodes.exists (fun _path node -> + match node with + | SyntaxNode.SynExpr(SynExpr.Ident ident) -> identsBoundInInner.Contains ident.idText + | _ -> false) + + match outer, inner with + | ConfusableWithTypeApp, _ -> true + + | SynExpr.IfThenElse(trivia = trivia), Dangling.LetOrUse letOrUse -> + Position.posLt letOrUse.Range.Start trivia.ThenKeyword.Start + + | SynExpr.IfThenElse(trivia = trivia), Dangling.IfThen dangling + | SynExpr.IfThenElse(trivia = trivia), Dangling.Match dangling -> + problematic dangling.Range trivia.ThenKeyword + || trivia.ElseKeyword |> Option.exists (problematic dangling.Range) + + | SynExpr.IfThenElse(ifExpr = expr), Dangling.Sequential dangling + | SynExpr.While(whileExpr = expr), Dangling.Problematic dangling + | SynExpr.ForEach(enumExpr = expr), Dangling.Problematic dangling -> Range.rangeContainsRange expr.Range dangling.Range + + | SynExpr.TryFinally(trivia = trivia), Dangling.Try tryExpr when problematic tryExpr.Range trivia.FinallyKeyword -> true + + | SynExpr.Match(clauses = clauses; trivia = { WithKeyword = withKeyword }), Dangling.ArrowSensitive dangling when + problematic dangling.Range withKeyword || anyProblematic dangling.Range clauses + -> + true + + | SynExpr.MatchBang(clauses = clauses; trivia = { WithKeyword = withKeyword }), Dangling.ArrowSensitive dangling when + problematic dangling.Range withKeyword || anyProblematic dangling.Range clauses + -> + true + + | SynExpr.MatchLambda(matchClauses = clauses), Dangling.ArrowSensitive dangling when anyProblematic dangling.Range clauses -> + true + + | SynExpr.TryWith(withCases = clauses; trivia = trivia), Dangling.ArrowSensitive dangling when + problematic dangling.Range trivia.WithKeyword + || anyProblematic dangling.Range clauses + -> + true + + // A match-like construct could be problematically nested like this: + // + // match () with + // | _ when + // p && + // let x = f () + // (let y = z + // match x with + // | 3 | _ -> y) -> () + // | _ -> () + | _, Dangling.ArrowSensitive dangling when + let rec ancestralTrailingArrow path = + match path with + | SyntaxNode.SynMatchClause _ :: _ -> shouldBeParenthesizedInContext path dangling + + | SyntaxNode.SynExpr(SynExpr.Tuple _) :: path + | SyntaxNode.SynExpr(SynExpr.App _) :: path + | SyntaxNode.SynExpr(SynExpr.IfThenElse _) :: path + | SyntaxNode.SynExpr(SynExpr.IfThenElse _) :: path + | SyntaxNode.SynExpr(SynExpr.Sequential _) :: path + | SyntaxNode.SynExpr(SynExpr.YieldOrReturn _) :: path + | SyntaxNode.SynExpr(SynExpr.YieldOrReturnFrom _) :: path + | SyntaxNode.SynExpr(SynExpr.Set _) :: path + | SyntaxNode.SynExpr(SynExpr.DotSet _) :: path + | SyntaxNode.SynExpr(SynExpr.DotNamedIndexedPropertySet _) :: path + | SyntaxNode.SynExpr(SynExpr.DotIndexedSet _) :: path + | SyntaxNode.SynExpr(SynExpr.LongIdentSet _) :: path + | SyntaxNode.SynExpr(SynExpr.LetOrUse _) :: path + | SyntaxNode.SynExpr(SynExpr.Lambda _) :: path + | SyntaxNode.SynExpr(SynExpr.Match _) :: path + | SyntaxNode.SynExpr(SynExpr.MatchLambda _) :: path + | SyntaxNode.SynExpr(SynExpr.MatchBang _) :: path + | SyntaxNode.SynExpr(SynExpr.TryWith _) :: path + | SyntaxNode.SynExpr(SynExpr.TryFinally _) :: path + | SyntaxNode.SynExpr(SynExpr.Do _) :: path + | SyntaxNode.SynExpr(SynExpr.DoBang _) :: path -> ancestralTrailingArrow path + + | _ -> false + + ancestralTrailingArrow outerPath + -> + true + + | SynExpr.Sequential _, Dangling.Problematic(SynExpr.Sequential _) -> true + + | SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is inner); expr2 = expr2), Dangling.Problematic _ when + problematic inner.Range expr2.Range + -> + true + + // Keep parens if a name in the outer scope is rebound + // in the inner scope and would shadow the outer binding + // if the parens were removed, e.g.: + // + // let x = 3 + // ( + // let x = 4 + // printfn $"{x}" + // ) + // x + | SynExpr.Sequential(expr1 = SynExpr.Paren(expr = Is inner); expr2 = expr2), _ when innerBindingsWouldShadowOuter inner expr2 -> + true + + | SynExpr.InterpolatedString _, SynExpr.Sequential _ + | SynExpr.InterpolatedString _, SynExpr.Tuple(isStruct = false) -> true + + | SynExpr.InterpolatedString(contents = contents), Dangling.Problematic _ -> + contents + |> List.exists (function + | SynInterpolatedStringPart.FillExpr(qualifiers = Some _) -> true + | _ -> false) + + // { (!x) with … } + | SynExpr.Record(copyInfo = Some(SynExpr.Paren(expr = Is inner), _)), + SynExpr.App(isInfix = false; funcExpr = FuncExpr.SymbolicOperator(StartsWith('!' | '~'))) + | SynExpr.AnonRecd(copyInfo = Some(SynExpr.Paren(expr = Is inner), _)), + SynExpr.App(isInfix = false; funcExpr = FuncExpr.SymbolicOperator(StartsWith('!' | '~'))) -> false + + // { (+x) with … } + // { (x + y) with … } + // { (x |> f) with … } + // { (printfn "…"; x) with … } + | SynExpr.Record(copyInfo = Some(SynExpr.Paren(expr = Is inner), _)), (PrefixApp _ | InfixApp _ | Dangling.Problematic _) + | SynExpr.AnonRecd(copyInfo = Some(SynExpr.Paren(expr = Is inner), _)), (PrefixApp _ | InfixApp _ | Dangling.Problematic _) -> + true + + | SynExpr.Record(recordFields = recordFields), Dangling.Problematic _ -> + let rec loop recordFields = + match recordFields with + | [] -> false + | SynExprRecordField(expr = Some(SynExpr.Paren(expr = Is inner)); blockSeparator = Some _) :: SynExprRecordField( + fieldName = SynLongIdent(id = id :: _), _) :: _ -> problematic inner.Range id.idRange + | _ :: recordFields -> loop recordFields + + loop recordFields + + | SynExpr.AnonRecd(recordFields = recordFields), Dangling.Problematic _ -> + let rec loop recordFields = + match recordFields with + | [] -> false + | (_, Some _blockSeparator, SynExpr.Paren(expr = Is inner)) :: (SynLongIdent(id = id :: _), _, _) :: _ -> + problematic inner.Range id.idRange + | _ :: recordFields -> loop recordFields + + loop recordFields + + | SynExpr.Paren _, SynExpr.Typed _ + | SynExpr.Quote _, SynExpr.Typed _ + | SynExpr.While(doExpr = SynExpr.Paren(expr = Is inner)), SynExpr.Typed _ + | SynExpr.WhileBang(doExpr = SynExpr.Paren(expr = Is inner)), SynExpr.Typed _ + | SynExpr.For(doBody = Is inner), SynExpr.Typed _ + | SynExpr.ForEach(bodyExpr = Is inner), SynExpr.Typed _ + | SynExpr.Match _, SynExpr.Typed _ + | SynExpr.Do _, SynExpr.Typed _ + | SynExpr.LetOrUse(body = Is inner), SynExpr.Typed _ + | SynExpr.TryWith _, SynExpr.Typed _ + | SynExpr.TryFinally _, SynExpr.Typed _ -> false + | _, SynExpr.Typed _ -> true + + | OuterBinaryExpr inner (outerPrecedence, side), InnerBinaryExpr innerPrecedence -> + let ambiguous = + match compare outerPrecedence innerPrecedence with + | 0 -> + match side, Assoc.ofPrecedence innerPrecedence with + | Non, _ + | _, Non + | Left, Right -> true + | Right, Right + | Left, Left -> false + | Right, Left -> + outerPrecedence <> innerPrecedence + || match outerPrecedence, innerPrecedence with + | _, MulDivMod(Div, _) + | _, MulDivMod(Mod, _) + | _, AddSub(Sub, _) -> true + | Relational _, Relational _ -> true + | _ -> false + + | c -> c > 0 + + ambiguous || dangling inner + + | OuterBinaryExpr inner (_, Right), (SynExpr.Sequential _ | SynExpr.LetOrUse(trivia = { InKeyword = None })) -> true + | OuterBinaryExpr inner (_, Right), inner -> dangling inner + + // new T(expr) + | SynExpr.New _, AtomicExprAfterType -> false + | SynExpr.New _, _ -> true + + // { inherit T(expr); … } + | SynExpr.Record(baseInfo = Some(_, SynExpr.Paren(expr = Is inner), _, _, _)), AtomicExprAfterType -> false + | SynExpr.Record(baseInfo = Some(_, SynExpr.Paren(expr = Is inner), _, _, _)), _ -> true + + | _, SynExpr.Paren _ + | _, SynExpr.Quote _ + | _, SynExpr.Const _ + | _, SynExpr.Tuple(isStruct = true) + | _, SynExpr.AnonRecd _ + | _, SynExpr.ArrayOrList _ + | _, SynExpr.Record _ + | _, SynExpr.ObjExpr _ + | _, SynExpr.ArrayOrListComputed _ + | _, SynExpr.ComputationExpr _ + | _, SynExpr.TypeApp _ + | _, SynExpr.Ident _ + | _, SynExpr.LongIdent _ + | _, SynExpr.DotGet _ + | _, SynExpr.DotLambda _ + | _, SynExpr.DotIndexedGet _ + | _, SynExpr.Null _ + | _, SynExpr.InterpolatedString _ + + | SynExpr.Paren _, _ + | SynExpr.Quote _, _ + | SynExpr.Typed _, _ + | SynExpr.AnonRecd _, _ + | SynExpr.Record _, _ + | SynExpr.ObjExpr _, _ + | SynExpr.While _, _ + | SynExpr.WhileBang _, _ + | SynExpr.For _, _ + | SynExpr.ForEach _, _ + | SynExpr.Lambda _, _ + | SynExpr.MatchLambda _, _ + | SynExpr.Match _, _ + | SynExpr.MatchBang _, _ + | SynExpr.LetOrUse _, _ + | SynExpr.LetOrUseBang _, _ + | SynExpr.Sequential _, _ + | SynExpr.Do _, _ + | SynExpr.DoBang _, _ + | SynExpr.IfThenElse _, _ + | SynExpr.TryWith _, _ + | SynExpr.TryFinally _, _ + | SynExpr.ComputationExpr _, _ + | SynExpr.InterpolatedString _, _ -> false + + | _ -> true + + | _ -> true diff --git a/src/fcs-fable/src/Compiler/Service/SynExpr.fsi b/src/fcs-fable/src/Compiler/Service/SynExpr.fsi new file mode 100644 index 0000000000..9e74ce6c1e --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/SynExpr.fsi @@ -0,0 +1,15 @@ +namespace FSharp.Compiler.Syntax + +[] +[] +module public SynExpr = + + /// + /// Returns true if the given expression should be parenthesized in the given context, otherwise false. + /// + /// A function for getting the text of a given source line. + /// The expression's ancestor nodes. + /// The expression to check. + /// True if the given expression should be parenthesized in the given context, otherwise false. + val shouldBeParenthesizedInContext: + getSourceLineStr: (int -> string) -> path: SyntaxVisitorPath -> expr: SynExpr -> bool diff --git a/src/fcs-fable/src/Compiler/Service/SynPat.fs b/src/fcs-fable/src/Compiler/Service/SynPat.fs new file mode 100644 index 0000000000..c94448ce31 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/SynPat.fs @@ -0,0 +1,345 @@ +namespace FSharp.Compiler.Syntax + +[] +[] +module SynPat = + let (|Last|) = List.last + + /// Matches if the two values refer to the same object. + [] + let inline (|Is|_|) (inner1: 'a) (inner2: 'a) = + if obj.ReferenceEquals(inner1, inner2) then + ValueSome Is + else + ValueNone + + let (|Ident|) (ident: Ident) = ident.idText + + /// Matches if any pattern in the given list is a SynPat.Typed. + [] + let (|AnyTyped|_|) pats = + if + pats + |> List.exists (function + | SynPat.Typed _ -> true + | _ -> false) + then + ValueSome AnyTyped + else + ValueNone + + /// Matches the rightmost potentially dangling nested pattern. + let rec (|Rightmost|) pat = + match pat with + | SynPat.Or(rhsPat = Rightmost pat) + | SynPat.ListCons(rhsPat = Rightmost pat) + | SynPat.As(rhsPat = Rightmost pat) + | SynPat.Ands(pats = Last(Rightmost pat)) + | SynPat.Tuple(isStruct = false; elementPats = Last(Rightmost pat)) -> pat + | pat -> pat + + /// Matches a nested as pattern. + [] + let rec (|DanglingAs|_|) pat = + let (|AnyDanglingAs|_|) = + List.tryPick (function + | DanglingAs -> Some() + | _ -> None) + + match pat with + | SynPat.As _ -> ValueSome() + | SynPat.Or(lhsPat = DanglingAs) + | SynPat.Or(rhsPat = DanglingAs) + | SynPat.ListCons(lhsPat = DanglingAs) + | SynPat.ListCons(rhsPat = DanglingAs) + | SynPat.Ands(pats = AnyDanglingAs) + | SynPat.Tuple(isStruct = false; elementPats = AnyDanglingAs) -> ValueSome() + | _ -> ValueNone + + /// Matches if the given pattern is atomic. + [] + let (|Atomic|_|) pat = + match pat with + | SynPat.Named _ + | SynPat.Wild _ + | SynPat.Paren _ + | SynPat.Tuple(isStruct = true) + | SynPat.Record _ + | SynPat.ArrayOrList _ + | SynPat.Const _ + | SynPat.LongIdent(argPats = SynArgPats.Pats []) + | SynPat.Null _ + | SynPat.QuoteExpr _ -> ValueSome Atomic + | _ -> ValueNone + + let shouldBeParenthesizedInContext path pat : bool = + match pat, path with + // Parens are needed in: + // + // let (Pattern …) = … + // let (x: …, y…) = … + // let (x: …), (y: …) = … + // let! (x: …) = … + // and! (x: …) = … + // use! (x: …) = … + // _.member M(x: …) = … + // match … with (x: …) -> … + // match … with (x, y: …) -> … + // function (x: …) -> … + // fun (x, y, …) -> … + // fun (x: …) -> … + // fun (Pattern …) -> … + // set (x: …, y: …) = … + | SynPat.Typed _, SyntaxNode.SynPat(Rightmost(SynPat.Paren(Is pat, _))) :: SyntaxNode.SynMatchClause _ :: _ + | Rightmost(SynPat.Typed _), SyntaxNode.SynMatchClause _ :: _ + | SynPat.Typed _, SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ + | SynPat.Typed _, SyntaxNode.SynPat(SynPat.Tuple(isStruct = false)) :: SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ + | SynPat.Tuple(isStruct = false; elementPats = AnyTyped), SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ + | SynPat.Typed _, SyntaxNode.SynPat(SynPat.Tuple(isStruct = false)) :: SyntaxNode.SynBinding _ :: _ + | SynPat.Tuple(isStruct = false; elementPats = AnyTyped), SyntaxNode.SynBinding _ :: _ + | SynPat.LongIdent(argPats = SynArgPats.Pats(_ :: _)), SyntaxNode.SynBinding _ :: _ + | SynPat.LongIdent(argPats = SynArgPats.Pats(_ :: _)), SyntaxNode.SynExpr(SynExpr.Lambda _) :: _ + | SynPat.Tuple(isStruct = false), SyntaxNode.SynExpr(SynExpr.Lambda(parsedData = Some _)) :: _ + | SynPat.Typed _, SyntaxNode.SynExpr(SynExpr.Lambda(parsedData = Some _)) :: _ + | SynPat.Typed _, + SyntaxNode.SynPat(SynPat.Tuple(isStruct = false)) :: SyntaxNode.SynPat(SynPat.LongIdent _) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynMemberDefn(SynMemberDefn.GetSetMember _) :: _ + | SynPat.Typed _, + SyntaxNode.SynPat(SynPat.Tuple(isStruct = false)) :: SyntaxNode.SynPat(SynPat.LongIdent _) :: SyntaxNode.SynBinding(SynBinding( + valData = SynValData( + memberFlags = Some { + MemberKind = SynMemberKind.PropertyGetSet | SynMemberKind.PropertyGet | SynMemberKind.PropertySet + }))) :: _ -> true + + // Parens must be kept when there is a multiline expression + // to the right whose offsides line would be shifted if the + // parentheses were removed from a leading pattern on the same line, e.g., + // + // match maybe with + // | Some(x) -> let y = x * 2 + // let z = 99 + // x + y + z + // | None -> 3 + // + // or + // + // let (x) = printfn "…" + // printfn "…" + | _ when + // This is arbitrary and will result in some false positives. + let maxBacktracking = 10 + + let rec wouldMoveRhsOffsides n pat path = + if n = maxBacktracking then + true + else + // This does not thoroughly search the trailing + // expression — nor does it go up the expression + // tree and search farther rightward, or look at record bindings, + // etc., etc., etc. — and will result in some false negatives. + match path with + // Expand the range to that of the outer pattern, since + // the parens may extend beyond the inner pat + | SyntaxNode.SynPat outer :: path when n = 1 -> wouldMoveRhsOffsides (n + 1) outer path + | SyntaxNode.SynPat _ :: path -> wouldMoveRhsOffsides (n + 1) pat path + + | SyntaxNode.SynExpr(SynExpr.Lambda(body = rhs)) :: _ + | SyntaxNode.SynExpr(SynExpr.LetOrUse(body = rhs)) :: _ + | SyntaxNode.SynExpr(SynExpr.LetOrUseBang(body = rhs)) :: _ + | SyntaxNode.SynBinding(SynBinding(expr = rhs)) :: _ + | SyntaxNode.SynMatchClause(SynMatchClause(resultExpr = rhs)) :: _ -> + let rhsRange = rhs.Range + rhsRange.StartLine <> rhsRange.EndLine && pat.Range.EndLine = rhsRange.StartLine + + | _ -> false + + wouldMoveRhsOffsides 1 pat path + -> + true + + // () is parsed as this. + | SynPat.Const(SynConst.Unit, _), _ -> true + + // (()) is required when overriding a generic member + // where unit or a tuple type is the generic type argument: + // + // type C<'T> = abstract M : 'T -> unit + // let _ = { new C with override _.M (()) = () } + // let _ = { new C with override _.M ((x, y)) = () } + // + // Single versus double parens are also compiled differently in cases like these: + // + // type T = + // static member M () = () // .method public static void M() + // static member M (()) = () // .method public static void M(class [FSharp.Core]Microsoft.FSharp.Core.Unit _arg1) + // static member M (_ : int, _ : int) = () // .method public static void M(int32 _arg1, int32 _arg2) + // static member M ((_ : int, _ : int)) = () // .method public static void M(class [System.Runtime]System.Tuple`2 _arg1) + | SynPat.Paren((SynPat.Const(SynConst.Unit, _) | SynPat.Tuple(isStruct = false)), _), + SyntaxNode.SynPat(SynPat.LongIdent _) :: SyntaxNode.SynBinding _ :: _ + | SynPat.Tuple(isStruct = false), + SyntaxNode.SynPat(SynPat.Paren _) :: SyntaxNode.SynPat(SynPat.LongIdent _) :: SyntaxNode.SynBinding _ :: _ + | SynPat.Paren((SynPat.Const(SynConst.Unit, _) | SynPat.Tuple(isStruct = false)), _), + SyntaxNode.SynPat(SynPat.LongIdent _) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynMemberDefn _ :: _ -> true + + // Not required: + // + // let (a, + // b, + // c) = … + // + // Required: + // + // let (a, + // b, + // c) = + // … + | SynPat.Tuple(isStruct = false; range = innerRange), SyntaxNode.SynBinding(SynBinding(expr = body)) :: _ -> + innerRange.StartLine <> innerRange.EndLine + && innerRange.StartLine < body.Range.StartLine + && body.Range.StartColumn <= innerRange.StartColumn + + // The parens could be required by a signature file like this: + // + // type SemanticClassificationItem = + // new: (range * SemanticClassificationType) -> SemanticClassificationItem + | SynPat.Paren(SynPat.Tuple(isStruct = false), _), + SyntaxNode.SynPat(SynPat.LongIdent(longDotId = SynLongIdent(id = [ Ident "new" ]))) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynMemberDefn _ :: SyntaxNode.SynTypeDefn _ :: _ + | SynPat.Tuple(isStruct = false), + SyntaxNode.SynPat(SynPat.Paren _) :: SyntaxNode.SynPat(SynPat.LongIdent(longDotId = SynLongIdent(id = [ Ident "new" ]))) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynMemberDefn _ :: SyntaxNode.SynTypeDefn _ :: _ -> + true + + // Parens are required around the atomic argument of + // any additional `new` constructor that is not the last. + // + // type T … = + // new (x) = … + // new (x, y) = … + | Atomic, + SyntaxNode.SynPat(SynPat.LongIdent(longDotId = SynLongIdent(id = [ Ident "new" ]))) :: SyntaxNode.SynBinding _ :: SyntaxNode.SynMemberDefn _ :: SyntaxNode.SynTypeDefn(SynTypeDefn( + typeRepr = SynTypeDefnRepr.ObjectModel(members = members))) :: _ -> + let lastNew = + (ValueNone, members) + ||> List.fold (fun lastNew ``member`` -> + match ``member`` with + | SynMemberDefn.Member( + memberDefn = SynBinding(headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = [ Ident "new" ])))) -> + ValueSome ``member`` + | _ -> lastNew) + + match lastNew with + | ValueSome(SynMemberDefn.Member( + memberDefn = SynBinding(headPat = SynPat.LongIdent(argPats = SynArgPats.Pats [ SynPat.Paren(Is pat, _) ])))) -> false + | _ -> true + + // Parens are otherwise never needed in these cases: + // + // let (x: …) = … + // for (…) in (…) do … + // let! (…) = … + // and! (…) = … + // use! (…) = … + // match … with (…) -> … + // function (…) -> … + // function (Pattern …) -> … + // fun (x) -> … + | _, SyntaxNode.SynBinding _ :: _ + | _, SyntaxNode.SynExpr(SynExpr.ForEach _) :: _ + | _, SyntaxNode.SynExpr(SynExpr.LetOrUseBang _) :: _ + | _, SyntaxNode.SynMatchClause _ :: _ + | Atomic, SyntaxNode.SynExpr(SynExpr.Lambda(parsedData = Some _)) :: _ -> false + + // Nested patterns. + | inner, SyntaxNode.SynPat outer :: _ -> + match outer, inner with + // (x :: xs) :: ys + // (x, xs) :: ys + | SynPat.ListCons(lhsPat = SynPat.Paren(pat = Is inner)), SynPat.ListCons _ + | SynPat.ListCons(lhsPat = SynPat.Paren(pat = Is inner)), SynPat.Tuple(isStruct = false) -> true + + // A as (B | C) + // A as (B & C) + // x as (y, z) + // xs as (y :: zs) + | SynPat.As(rhsPat = SynPat.Paren(pat = Is inner)), + (SynPat.Or _ | SynPat.Ands _ | SynPat.Tuple(isStruct = false) | SynPat.ListCons _) -> true + + // (A | B) :: xs + // (A & B) :: xs + // (x as y) :: xs + | SynPat.ListCons _, SynPat.Or _ + | SynPat.ListCons _, SynPat.Ands _ + | SynPat.ListCons _, SynPat.As _ -> true + + // Pattern (x = (…)) + | SynPat.LongIdent(argPats = SynArgPats.NamePatPairs _), _ -> false + + // Pattern (x : int) + // Pattern ([] x) + // Pattern (:? int) + // Pattern (A :: _) + // Pattern (A | B) + // Pattern (A & B) + // Pattern (A as B) + // Pattern (A, B) + // Pattern1 (Pattern2 (x = A)) + // Pattern1 (Pattern2 x y) + | SynPat.LongIdent _, SynPat.Typed _ + | SynPat.LongIdent _, SynPat.Attrib _ + | SynPat.LongIdent _, SynPat.IsInst _ + | SynPat.LongIdent _, SynPat.ListCons _ + | SynPat.LongIdent _, SynPat.Or _ + | SynPat.LongIdent _, SynPat.Ands _ + | SynPat.LongIdent _, SynPat.As _ + | SynPat.LongIdent _, SynPat.Tuple(isStruct = false) + | SynPat.LongIdent _, SynPat.LongIdent(argPats = SynArgPats.NamePatPairs _) + | SynPat.LongIdent _, SynPat.LongIdent(argPats = SynArgPats.Pats(_ :: _)) + + // A | (B as C) + // A & (B as C) + // A, (B as C) + | SynPat.Or _, (SynPat.As _ | DanglingAs) + | SynPat.Ands _, (SynPat.As _ | DanglingAs) + | SynPat.Tuple _, (SynPat.As _ | DanglingAs) + + // x, (y, z) + // x & (y, z) + // (x, y) & z + | SynPat.Tuple _, SynPat.Tuple(isStruct = false) + | SynPat.Ands _, SynPat.Tuple(isStruct = false) + + // A, (B | C) + // A & (B | C) + | SynPat.Tuple _, SynPat.Or _ + | SynPat.Ands _, SynPat.Or _ -> true + + // (x : int) & y + // x & (y : int) & z + | SynPat.Ands(Last(SynPat.Paren(pat = Is inner)), _), SynPat.Typed _ -> false + | SynPat.Ands _, SynPat.Typed _ -> true + + | _, SynPat.Const _ + | _, SynPat.Wild _ + | _, SynPat.Named _ + | _, SynPat.Typed _ + | _, SynPat.LongIdent(argPats = SynArgPats.Pats []) + | _, SynPat.Tuple(isStruct = true) + | _, SynPat.Paren _ + | _, SynPat.ArrayOrList _ + | _, SynPat.Record _ + | _, SynPat.Null _ + | _, SynPat.OptionalVal _ + | _, SynPat.IsInst _ + | _, SynPat.QuoteExpr _ + + | SynPat.Or _, _ + | SynPat.ListCons _, _ + | SynPat.Ands _, _ + | SynPat.As _, _ + | SynPat.LongIdent _, _ + | SynPat.Tuple _, _ + | SynPat.Paren _, _ + | SynPat.ArrayOrList _, _ + | SynPat.Record _, _ -> false + + | _ -> true + + | _ -> true diff --git a/src/fcs-fable/src/Compiler/Service/SynPat.fsi b/src/fcs-fable/src/Compiler/Service/SynPat.fsi new file mode 100644 index 0000000000..77bcd9c600 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/SynPat.fsi @@ -0,0 +1,13 @@ +namespace FSharp.Compiler.Syntax + +[] +[] +module public SynPat = + + /// + /// Returns true if the given pattern should be parenthesized in the given context, otherwise false. + /// + /// The pattern's ancestor nodes. + /// The pattern to check. + /// True if the given pattern should be parenthesized in the given context, otherwise false. + val shouldBeParenthesizedInContext: path: SyntaxVisitorPath -> pat: SynPat -> bool diff --git a/src/fcs-fable/src/Compiler/Service/TransparentCompiler.fs b/src/fcs-fable/src/Compiler/Service/TransparentCompiler.fs new file mode 100644 index 0000000000..5158ac7f25 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/TransparentCompiler.fs @@ -0,0 +1,2520 @@ +namespace FSharp.Compiler.CodeAnalysis.TransparentCompiler + +open System +open System.Linq +open System.Collections.Generic +open System.Runtime.CompilerServices +open System.Diagnostics +open System.IO + +open Internal.Utilities.Collections +open Internal.Utilities.Library + +open FSharp.Compiler +open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler.AbstractIL.ILBinaryReader +open FSharp.Compiler.BuildGraph +open FSharp.Compiler.CodeAnalysis +open FSharp.Compiler.CompilerConfig +open FSharp.Compiler.CompilerImports +open FSharp.Compiler.CompilerOptions +open FSharp.Compiler.CheckBasics +open FSharp.Compiler.DependencyManager +open FSharp.Compiler.Diagnostics +open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.IO +open FSharp.Compiler.ScriptClosure +open FSharp.Compiler.Symbols +open FSharp.Compiler.TcGlobals +open FSharp.Compiler.Text +open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml +open System.Threading.Tasks +open FSharp.Compiler.ParseAndCheckInputs +open FSharp.Compiler.GraphChecking +open FSharp.Compiler.Syntax +open FSharp.Compiler.CompilerDiagnostics +open FSharp.Compiler.NameResolution +open Internal.Utilities.Library.Extras +open FSharp.Compiler.TypedTree +open FSharp.Compiler.CheckDeclarations +open FSharp.Compiler.EditorServices +open FSharp.Compiler.CodeAnalysis +open FSharp.Compiler.CreateILModule +open FSharp.Compiler.TypedTreeOps +open System.Threading +open Internal.Utilities.Hashing + +open FSharp.Compiler.CodeAnalysis.ProjectSnapshot + +/// Accumulated results of type checking. The minimum amount of state in order to continue type-checking following files. +[] +type internal TcInfo = + { + tcState: TcState + tcEnvAtEndOfFile: TcEnv + + /// Disambiguation table for module names + moduleNamesDict: ModuleNamesDict + + topAttribs: TopAttribs option + + latestCcuSigForFile: ModuleOrNamespaceType option + + /// Accumulated diagnostics, last file first + tcDiagnosticsRev: (PhasedDiagnostic * FSharpDiagnosticSeverity)[] list + + tcDependencyFiles: string list + + sigNameOpt: (string * QualifiedNameOfFile) option + + graphNode: NodeToTypeCheck option + + stateContainsNodes: Set + + sink: TcResultsSinkImpl list + } + + member x.TcDiagnostics = Array.concat (List.rev x.tcDiagnosticsRev) + +[] +type internal TcIntermediate = + { + finisher: Finisher + //tcEnvAtEndOfFile: TcEnv + + /// Disambiguation table for module names + moduleNamesDict: ModuleNamesDict + + /// Accumulated diagnostics, last file first + tcDiagnosticsRev: (PhasedDiagnostic * FSharpDiagnosticSeverity)[] list + + tcDependencyFiles: string list + + sink: TcResultsSinkImpl + } + +/// Things we need to start parsing and checking files for a given project snapshot +type internal BootstrapInfo = + { + // Each instance gets an Id on creation, unfortunately partial type check results using different instances are not compatible + // So if this needs to be recreated for whatever reason then we need to re type check all files + Id: int + + AssemblyName: string + OutFile: string + TcConfig: TcConfig + TcImports: TcImports + TcGlobals: TcGlobals + InitialTcInfo: TcInfo + + // TODO: Figure out how these work and if they need to be added to the snapshot... + LoadedSources: (range * FSharpFileSnapshot) list + + // TODO: Might be a bit more complicated if we want to support adding files to the project via OtherOptions + // ExtraSourceFilesAfter: FSharpFileSnapshot list + + LoadClosure: LoadClosure option + LastFileName: string + ImportsInvalidatedByTypeProvider: Event + } + +type internal TcIntermediateResult = TcInfo * TcResultsSinkImpl * CheckedImplFile option * string + +[] +type internal DependencyGraphType = + /// A dependency graph for a single file - it will be missing files which this file does not depend on + | File + /// A dependency graph for a project - it will contain all files in the project + | Project + +[] +type internal Extensions = + [] + static member Key<'T when 'T :> IFileSnapshot>(fileSnapshots: 'T list, ?extraKeyFlag) = + + { new ICacheKey<_, _> with + member _.GetLabel() = + let lastFile = + fileSnapshots + |> List.tryLast + |> Option.map (fun f -> f.FileName |> shortPath) + |> Option.defaultValue "[no file]" + + $"%d{fileSnapshots.Length} files ending with {lastFile}" + + member _.GetKey() = + Md5Hasher.empty + |> Md5Hasher.addStrings (fileSnapshots |> Seq.map (fun f -> f.FileName)) + |> pair extraKeyFlag + + member _.GetVersion() = + Md5Hasher.empty + |> Md5Hasher.addBytes' (fileSnapshots |> Seq.map (fun f -> f.Version)) + |> Md5Hasher.toString + } + +[] +module private TypeCheckingGraphProcessing = + open FSharp.Compiler.GraphChecking.GraphProcessing + + // TODO Do we need to suppress some error logging if we + // TODO apply the same partial results multiple times? + // TODO Maybe we can enable logging only for the final fold + /// + /// Combine type-checking results of dependencies needed to type-check a 'higher' node in the graph + /// + /// Initial state + /// Direct dependencies of a node + /// Transitive dependencies of a node + /// A way to fold a single result into existing state + let private combineResults + (emptyState: TcInfo) + (deps: ProcessedNode> array) + (transitiveDeps: ProcessedNode> array) + (folder: TcInfo -> Finisher -> TcInfo) + : TcInfo = + match deps with + | [||] -> emptyState + | _ -> + // Instead of starting with empty state, + // reuse state produced by the dependency with the biggest number of transitive dependencies. + // This is to reduce the number of folds required to achieve the final state. + let biggestDependency = + let sizeMetric (node: ProcessedNode<_, _>) = node.Info.TransitiveDeps.Length + deps |> Array.maxBy sizeMetric + + let firstState = biggestDependency.Result |> fst + + // Find items not already included in the state. + let itemsPresent = + set + [| + yield! biggestDependency.Info.TransitiveDeps + yield biggestDependency.Info.Item + |] + + let resultsToAdd = + transitiveDeps + |> Array.filter (fun dep -> itemsPresent.Contains dep.Info.Item = false) + |> Array.distinctBy (fun dep -> dep.Info.Item) + |> Array.sortWith (fun a b -> + // We preserve the order in which items are folded to the state. + match a.Info.Item, b.Info.Item with + | NodeToTypeCheck.PhysicalFile aIdx, NodeToTypeCheck.PhysicalFile bIdx + | NodeToTypeCheck.ArtificialImplFile aIdx, NodeToTypeCheck.ArtificialImplFile bIdx -> aIdx.CompareTo bIdx + | NodeToTypeCheck.PhysicalFile _, NodeToTypeCheck.ArtificialImplFile _ -> -1 + | NodeToTypeCheck.ArtificialImplFile _, NodeToTypeCheck.PhysicalFile _ -> 1) + |> Array.map (fun dep -> dep.Result |> snd) + + // Fold results not already included and produce the final state + let state = Array.fold folder firstState resultsToAdd + state + + /// + /// Process a graph of items. + /// A version of 'GraphProcessing.processGraph' with a signature specific to type-checking. + /// + let processTypeCheckingGraph + (graph: Graph) + (work: NodeToTypeCheck -> TcInfo -> Async>) + (emptyState: TcInfo) + : Async<(int * PartialResult) list * TcInfo> = + async { + + let workWrapper + (getProcessedNode: + NodeToTypeCheck -> ProcessedNode>) + (node: NodeInfo) + : Async> = + async { + let folder (state: TcInfo) (Finisher(finisher = finisher)) : TcInfo = finisher state |> snd + let deps = node.Deps |> Array.except [| node.Item |] |> Array.map getProcessedNode + + let transitiveDeps = + node.TransitiveDeps + |> Array.except [| node.Item |] + |> Array.map getProcessedNode + + let inputState = combineResults emptyState deps transitiveDeps folder + + let! singleRes = work node.Item inputState + let state = folder inputState singleRes + return state, singleRes + } + + let! results = processGraphAsync graph workWrapper + + let finalFileResults, state = + (([], emptyState), + results + |> Array.choose (fun (item, res) -> + match item with + | NodeToTypeCheck.ArtificialImplFile _ -> None + | NodeToTypeCheck.PhysicalFile file -> Some(file, res))) + ||> Array.fold (fun (fileResults, state) (item, (_, Finisher(finisher = finisher))) -> + let fileResult, state = finisher state + (item, fileResult) :: fileResults, state) + + return finalFileResults, state + } + +type internal CompilerCaches(sizeFactor: int) = + + let sf = sizeFactor + + member _.SizeFactor = sf + + member val ParseFile = AsyncMemoize(keepStrongly = 50 * sf, keepWeakly = 20 * sf, name = "ParseFile") + + member val ParseFileWithoutProject = + AsyncMemoize(keepStrongly = 5 * sf, keepWeakly = 2 * sf, name = "ParseFileWithoutProject") + + member val ParseAndCheckFileInProject = AsyncMemoize(sf, 2 * sf, name = "ParseAndCheckFileInProject") + + member val ParseAndCheckAllFilesInProject = AsyncMemoizeDisabled(sf, 2 * sf, name = "ParseAndCheckFullProject") + + member val ParseAndCheckProject = AsyncMemoize(sf, 2 * sf, name = "ParseAndCheckProject") + + member val FrameworkImports = AsyncMemoize(sf, 2 * sf, name = "FrameworkImports") + + member val BootstrapInfoStatic = AsyncMemoize(sf, 2 * sf, name = "BootstrapInfoStatic") + + member val BootstrapInfo = AsyncMemoize(sf, 2 * sf, name = "BootstrapInfo") + + member val TcLastFile = AsyncMemoizeDisabled(sf, 2 * sf, name = "TcLastFile") + + member val TcIntermediate = AsyncMemoize(20 * sf, 20 * sf, name = "TcIntermediate") + + member val DependencyGraph = AsyncMemoize(sf, 2 * sf, name = "DependencyGraph") + + member val ProjectExtras = AsyncMemoizeDisabled(sf, 2 * sf, name = "ProjectExtras") + + member val AssemblyData = AsyncMemoize(sf, 2 * sf, name = "AssemblyData") + + member val SemanticClassification = AsyncMemoize(sf, 2 * sf, name = "SemanticClassification") + + member val ItemKeyStore = AsyncMemoize(sf, 2 * sf, name = "ItemKeyStore") + + member val ScriptClosure = AsyncMemoize(sf, 2 * sf, name = "ScriptClosure") + + member this.Clear(projects: Set) = + let shouldClear project = projects |> Set.contains project + + this.ParseFile.Clear(fst >> shouldClear) + this.ParseAndCheckFileInProject.Clear(snd >> shouldClear) + this.ParseAndCheckProject.Clear(shouldClear) + this.BootstrapInfoStatic.Clear(shouldClear) + this.BootstrapInfo.Clear(shouldClear) + this.TcIntermediate.Clear(snd >> shouldClear) + this.AssemblyData.Clear(shouldClear) + this.SemanticClassification.Clear(snd >> shouldClear) + this.ItemKeyStore.Clear(snd >> shouldClear) + this.ScriptClosure.Clear(snd >> shouldClear) + +type internal TransparentCompiler + ( + legacyReferenceResolver, + projectCacheSize, + keepAssemblyContents, + keepAllBackgroundResolutions, + tryGetMetadataSnapshot, + suggestNamesForErrors, + keepAllBackgroundSymbolUses, + enableBackgroundItemKeyStoreAndSemanticClassification, + enablePartialTypeChecking, + parallelReferenceResolution, + captureIdentifiersWhenParsing, + getSource: (string -> Async) option, + useChangeNotifications + ) as self = + + let documentSource = + match getSource with + | Some getSource -> DocumentSource.Custom getSource + | None -> DocumentSource.FileSystem + + // Is having just one of these ok? + let lexResourceManager = Lexhelp.LexResourceManager() + + // Mutable so we can easily clear them by creating a new instance + let mutable caches = CompilerCaches(100) + + // TODO: do we need this? + //let maxTypeCheckingParallelism = max 1 (Environment.ProcessorCount / 2) + //let maxParallelismSemaphore = new SemaphoreSlim(maxTypeCheckingParallelism) + + // We currently share one global dependency provider for all scripts for the FSharpChecker. + // For projects, one is used per project. + // + // Sharing one for all scripts is necessary for good performance from GetProjectOptionsFromScript, + // which requires a dependency provider to process through the project options prior to working out + // if the cached incremental builder can be used for the project. + let dependencyProviderForScripts = new DependencyProvider() + + // Legacy events, they're used in tests... eventually they should go away + let beforeFileChecked = Event() + let fileParsed = Event() + let fileChecked = Event() + let projectChecked = Event() + + // use this to process not-yet-implemented tasks + let backgroundCompiler = + BackgroundCompiler( + legacyReferenceResolver, + projectCacheSize, + keepAssemblyContents, + keepAllBackgroundResolutions, + tryGetMetadataSnapshot, + suggestNamesForErrors, + keepAllBackgroundSymbolUses, + enableBackgroundItemKeyStoreAndSemanticClassification, + enablePartialTypeChecking, + parallelReferenceResolution, + captureIdentifiersWhenParsing, + getSource, + useChangeNotifications + ) + :> IBackgroundCompiler + + let ComputeScriptClosureInner + (fileName: string) + (source: ISourceTextNew) + (defaultFSharpBinariesDir: string) + (useSimpleResolution: bool) + (useFsiAuxLib: bool) + (useSdkRefs: bool) + (sdkDirOverride: string option) + (assumeDotNetFramework: bool) + (otherOptions: string list) + = + let reduceMemoryUsage = ReduceMemoryFlag.Yes + + let applyCompilerOptions tcConfig = + let fsiCompilerOptions = GetCoreFsiCompilerOptions tcConfig + ParseCompilerOptions(ignore, fsiCompilerOptions, otherOptions) + + let closure = + LoadClosure.ComputeClosureOfScriptText( + legacyReferenceResolver, + defaultFSharpBinariesDir, + fileName, + source, + CodeContext.Editing, + useSimpleResolution, + useFsiAuxLib, + useSdkRefs, + sdkDirOverride, + Lexhelp.LexResourceManager(), + applyCompilerOptions, + assumeDotNetFramework, + tryGetMetadataSnapshot, + reduceMemoryUsage, + dependencyProviderForScripts + ) + + closure + + let mkScriptClosureCacheKey + (fileName: string) + (source: ISourceTextNew) + (useSimpleResolution: bool) + (useFsiAuxLib: bool) + (useSdkRefs: bool) + (assumeDotNetFramework: bool) + (projectIdentifier: ProjectIdentifier) + (otherOptions: string list) + (stamp: int64 option) + = + { new ICacheKey with + member _.GetKey() = fileName, projectIdentifier + member _.GetLabel() = $"ScriptClosure for %s{fileName}" + + member _.GetVersion() = + Md5Hasher.empty + |> Md5Hasher.addStrings + [| + yield! otherOptions + match stamp with + | None -> () + | Some stamp -> string stamp + |] + |> Md5Hasher.addBytes (source.GetChecksum().ToArray()) + |> Md5Hasher.addBool useSimpleResolution + |> Md5Hasher.addBool useFsiAuxLib + |> Md5Hasher.addBool useSdkRefs + |> Md5Hasher.addBool assumeDotNetFramework + |> Md5Hasher.toString + } + + let ComputeScriptClosure + (fileName: string) + (source: ISourceTextNew) + (defaultFSharpBinariesDir: string) + (useSimpleResolution: bool) + (useFsiAuxLib: bool option) + (useSdkRefs: bool option) + (sdkDirOverride: string option) + (assumeDotNetFramework: bool option) + (projectIdentifier: ProjectIdentifier) + (otherOptions: string list) + (stamp: int64 option) + = + let useFsiAuxLib = defaultArg useFsiAuxLib true + let useSdkRefs = defaultArg useSdkRefs true + let assumeDotNetFramework = defaultArg assumeDotNetFramework false + + let key: ICacheKey = + mkScriptClosureCacheKey + fileName + source + useSimpleResolution + useFsiAuxLib + useSdkRefs + assumeDotNetFramework + projectIdentifier + otherOptions + stamp + + caches.ScriptClosure.Get( + key, + async { + return + ComputeScriptClosureInner + fileName + source + defaultFSharpBinariesDir + useSimpleResolution + useFsiAuxLib + useSdkRefs + sdkDirOverride + assumeDotNetFramework + otherOptions + } + ) + + let ComputeFrameworkImports (tcConfig: TcConfig) frameworkDLLs nonFrameworkResolutions = + let frameworkDLLsKey = + frameworkDLLs + |> List.map (fun ar -> ar.resolvedPath) // The cache key. Just the minimal data. + |> List.sort // Sort to promote cache hits. + + // The data elements in this key are very important. There should be nothing else in the TcConfig that logically affects + // the import of a set of framework DLLs into F# CCUs. That is, the F# CCUs that result from a set of DLLs (including + // FSharp.Core.dll and mscorlib.dll) must be logically invariant of all the other compiler configuration parameters. + let key = + FrameworkImportsCacheKey( + frameworkDLLsKey, + tcConfig.primaryAssembly.Name, + tcConfig.GetTargetFrameworkDirectories(), + tcConfig.fsharpBinariesDir, + tcConfig.langVersion.SpecifiedVersion, + tcConfig.checkNullness + ) + + caches.FrameworkImports.Get( + key, + async { + use _ = Activity.start "ComputeFrameworkImports" [] + let tcConfigP = TcConfigProvider.Constant tcConfig + + return! TcImports.BuildFrameworkTcImports(tcConfigP, frameworkDLLs, nonFrameworkResolutions) + } + ) + + // Link all the assemblies together and produce the input typecheck accumulator + let CombineImportedAssembliesTask + ( + assemblyName, + tcConfig: TcConfig, + tcConfigP, + tcGlobals, + frameworkTcImports, + nonFrameworkResolutions, + unresolvedReferences, + dependencyProvider, + loadClosureOpt: LoadClosure option, + basicDependencies, + importsInvalidatedByTypeProvider: Event + ) = + + async { + let diagnosticsLogger = + CompilationDiagnosticLogger("CombineImportedAssembliesTask", tcConfig.diagnosticsOptions) + + use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.Parameter) + + let! tcImports = + async { + try + let! tcImports = + TcImports.BuildNonFrameworkTcImports( + tcConfigP, + frameworkTcImports, + nonFrameworkResolutions, + unresolvedReferences, + dependencyProvider + ) +#if !NO_TYPEPROVIDERS + // TODO: review and handle the event + tcImports.GetCcusExcludingBase() + |> Seq.iter (fun ccu -> + // When a CCU reports an invalidation, merge them together and just report a + // general "imports invalidated". This triggers a rebuild. + // + // We are explicit about what the handler closure captures to help reason about the + // lifetime of captured objects, especially in case the type provider instance gets leaked + // or keeps itself alive mistakenly, e.g. via some global state in the type provider instance. + // + // The handler only captures + // 1. a weak reference to the importsInvalidated event. + // + // The IncrementalBuilder holds the strong reference the importsInvalidated event. + // + // In the invalidation handler we use a weak reference to allow the IncrementalBuilder to + // be collected if, for some reason, a TP instance is not disposed or not GC'd. + let capturedImportsInvalidated = WeakReference<_>(importsInvalidatedByTypeProvider) + + ccu.Deref.InvalidateEvent.Add(fun _ -> + match capturedImportsInvalidated.TryGetTarget() with + | true, tg -> tg.Trigger() + | _ -> ())) +#endif +#if NO_TYPEPROVIDERS + ignore importsInvalidatedByTypeProvider +#endif + return tcImports + with + | :? OperationCanceledException -> + // if it's been canceled then it shouldn't be needed anymore + return frameworkTcImports + | exn -> + Debug.Assert(false, sprintf "Could not BuildAllReferencedDllTcImports %A" exn) + diagnosticsLogger.Warning exn + return frameworkTcImports + } + + let tcInitial, openDecls0 = + GetInitialTcEnv(assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals) + + let tcState = + GetInitialTcState(rangeStartup, assemblyName, tcConfig, tcGlobals, tcImports, tcInitial, openDecls0) + + let loadClosureErrors = + [ + match loadClosureOpt with + | None -> () + | Some loadClosure -> + for inp in loadClosure.Inputs do + yield! inp.MetaCommandDiagnostics + ] + + let initialErrors = + Array.append (Array.ofList loadClosureErrors) (diagnosticsLogger.GetDiagnostics()) + + let tcInfo = + { + tcState = tcState + tcEnvAtEndOfFile = tcInitial + topAttribs = None + latestCcuSigForFile = None + tcDiagnosticsRev = [ initialErrors ] + moduleNamesDict = Map.empty + tcDependencyFiles = basicDependencies + sigNameOpt = None + graphNode = None + stateContainsNodes = Set.empty + sink = [] + } + + return tcImports, tcInfo + } + + let getProjectReferences (project: ProjectSnapshotBase<_>) userOpName = + [ + for r in project.ReferencedProjects do + + match r with + | FSharpReferencedProjectSnapshot.FSharpReference(nm, projectSnapshot) -> + // Don't use cross-project references for FSharp.Core, since various bits of code + // require a concrete FSharp.Core to exist on-disk. The only solutions that have + // these cross-project references to FSharp.Core are VisualFSharp.sln and FSharp.sln. The ramification + // of this is that you need to build FSharp.Core to get intellisense in those projects. + + if + (try + Path.GetFileNameWithoutExtension(nm) + with _ -> + "") + <> GetFSharpCoreLibraryName() + then + { new IProjectReference with + member x.EvaluateRawContents() = + async { + Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "GetAssemblyData", nm) + + return! + self.GetAssemblyData( + projectSnapshot.ProjectSnapshot, + nm, + userOpName + ".CheckReferencedProject(" + nm + ")" + ) + } + + member x.TryGetLogicalTimeStamp(cache) = + // TODO: + None + + member x.FileName = nm + } + | FSharpReferencedProjectSnapshot.PEReference(getStamp, delayedReader) -> + { new IProjectReference with + member x.EvaluateRawContents() = + async { + let! ilReaderOpt = delayedReader.TryGetILModuleReader() |> Cancellable.toAsync + + match ilReaderOpt with + | Some ilReader -> + let ilModuleDef, ilAsmRefs = ilReader.ILModuleDef, ilReader.ILAssemblyRefs + let data = RawFSharpAssemblyData(ilModuleDef, ilAsmRefs) :> IRawFSharpAssemblyData + return ProjectAssemblyDataResult.Available data + | _ -> + // Note 'false' - if a PEReference doesn't find an ILModuleReader then we don't + // continue to try to use an on-disk DLL + return ProjectAssemblyDataResult.Unavailable false + } + + member x.TryGetLogicalTimeStamp _ = getStamp () |> Some + member x.FileName = delayedReader.OutputFile + } + + | FSharpReferencedProjectSnapshot.ILModuleReference(nm, getStamp, getReader) -> + { new IProjectReference with + member x.EvaluateRawContents() = + cancellable { + let ilReader = getReader () + let ilModuleDef, ilAsmRefs = ilReader.ILModuleDef, ilReader.ILAssemblyRefs + let data = RawFSharpAssemblyData(ilModuleDef, ilAsmRefs) :> IRawFSharpAssemblyData + return ProjectAssemblyDataResult.Available data + } + |> Cancellable.toAsync + + member x.TryGetLogicalTimeStamp _ = getStamp () |> Some + member x.FileName = nm + } + ] + + let ComputeTcConfigBuilder (projectSnapshot: ProjectSnapshot) = + async { + let useSimpleResolutionSwitch = "--simpleresolution" + let commandLineArgs = projectSnapshot.CommandLineOptions + let defaultFSharpBinariesDir = FSharpCheckerResultsSettings.defaultFSharpBinariesDir + let useScriptResolutionRules = projectSnapshot.UseScriptResolutionRules + + let projectReferences = + getProjectReferences projectSnapshot "ComputeTcConfigBuilder" + + let getSwitchValue (switchString: string) = + match commandLineArgs |> List.tryFindIndex (fun s -> s.StartsWithOrdinal switchString) with + | Some idx -> Some(commandLineArgs[idx].Substring(switchString.Length)) + | _ -> None + + let useSimpleResolution = + (getSwitchValue useSimpleResolutionSwitch) |> Option.isSome + + let! (loadClosureOpt: LoadClosure option) = + let lastScriptFile = + match List.tryLast projectSnapshot.SourceFiles with + | None -> None + | Some file -> if IsScript file.FileName then Some file else None + + match lastScriptFile, projectSnapshot.UseScriptResolutionRules with + | Some fsxFile, true -> // assuming UseScriptResolutionRules and a single source file means we are doing this for a script + async { + let! source = fsxFile.GetSource() |> Async.AwaitTask + + let! closure = + ComputeScriptClosure + fsxFile.FileName + source + defaultFSharpBinariesDir + useSimpleResolution + None + None + None + None + projectSnapshot.Identifier + projectSnapshot.OtherOptions + projectSnapshot.Stamp + + return (Some closure) + } + | _ -> async { return None } + + let sdkDirOverride = + match loadClosureOpt with + | None -> None + | Some loadClosure -> loadClosure.SdkDirOverride + + // see also fsc.fs: runFromCommandLineToImportingAssemblies(), as there are many similarities to where the PS creates a tcConfigB + let tcConfigB = + TcConfigBuilder.CreateNew( + legacyReferenceResolver, + defaultFSharpBinariesDir, + implicitIncludeDir = projectSnapshot.ProjectDirectory, + reduceMemoryUsage = ReduceMemoryFlag.Yes, + isInteractive = useScriptResolutionRules, + isInvalidationSupported = true, + defaultCopyFSharpCore = CopyFSharpCoreFlag.No, + tryGetMetadataSnapshot = tryGetMetadataSnapshot, + sdkDirOverride = sdkDirOverride, + rangeForErrors = range0 + ) + + tcConfigB.primaryAssembly <- + match loadClosureOpt with + | None -> PrimaryAssembly.Mscorlib + | Some loadClosure -> + if loadClosure.UseDesktopFramework then + PrimaryAssembly.Mscorlib + else + PrimaryAssembly.System_Runtime + + tcConfigB.resolutionEnvironment <- (LegacyResolutionEnvironment.EditingOrCompilation true) + + tcConfigB.conditionalDefines <- + let define = + if useScriptResolutionRules then + "INTERACTIVE" + else + "COMPILED" + + define :: tcConfigB.conditionalDefines + + tcConfigB.realsig <- + List.contains "--realsig" commandLineArgs + || List.contains "--realsig+" commandLineArgs + + tcConfigB.projectReferences <- projectReferences + + tcConfigB.useSimpleResolution <- useSimpleResolution + + // Apply command-line arguments and collect more source files if they are in the arguments + let sourceFilesNew = + ApplyCommandLineArgs(tcConfigB, projectSnapshot.SourceFileNames, commandLineArgs) + + // Never open PDB files for the language service, even if --standalone is specified + tcConfigB.openDebugInformationForLaterStaticLinking <- false + + tcConfigB.xmlDocInfoLoader <- + { new IXmlDocumentationInfoLoader with + /// Try to load xml documentation associated with an assembly by the same file path with the extension ".xml". + member _.TryLoad(assemblyFileName) = + let xmlFileName = !! Path.ChangeExtension(assemblyFileName, ".xml") + + // REVIEW: File IO - Will eventually need to change this to use a file system interface of some sort. + XmlDocumentationInfo.TryCreateFromFile(xmlFileName) + } + |> Some + + tcConfigB.parallelReferenceResolution <- parallelReferenceResolution + tcConfigB.captureIdentifiersWhenParsing <- captureIdentifiersWhenParsing + + return tcConfigB, sourceFilesNew, loadClosureOpt + } + + let mutable BootstrapInfoIdCounter = 0 + + /// Bootstrap info that does not depend source files + let ComputeBootstrapInfoStatic (projectSnapshot: ProjectCore, tcConfig: TcConfig, assemblyName: string, loadClosureOpt) = + let cacheKey = projectSnapshot.CacheKeyWith("BootstrapInfoStatic", assemblyName) + + caches.BootstrapInfoStatic.Get( + cacheKey, + async { + use _ = + Activity.start + "ComputeBootstrapInfoStatic" + [| + Activity.Tags.project, projectSnapshot.ProjectFileName |> Path.GetFileName |> (!!) + "references", projectSnapshot.ReferencedProjects.Length.ToString() + |] + + // Resolve assemblies and create the framework TcImports. This caches a level of "system" references. No type providers are + // included in these references. + + let frameworkDLLs, nonFrameworkResolutions, unresolvedReferences = + TcAssemblyResolutions.SplitNonFoundationalResolutions(tcConfig) + + // Prepare the frameworkTcImportsCache + let! tcGlobals, frameworkTcImports = ComputeFrameworkImports tcConfig frameworkDLLs nonFrameworkResolutions + + // Note we are not calling diagnosticsLogger.GetDiagnostics() anywhere for this task. + // This is ok because not much can actually go wrong here. + let diagnosticsLogger = + CompilationDiagnosticLogger("nonFrameworkAssemblyInputs", tcConfig.diagnosticsOptions) + + use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.Parameter) + + let tcConfigP = TcConfigProvider.Constant tcConfig + + let importsInvalidatedByTypeProvider = Event() + + let basicDependencies = + [ + for UnresolvedAssemblyReference(referenceText, _) in unresolvedReferences do + // Exclude things that are definitely not a file name + if not (FileSystem.IsInvalidPathShim referenceText) then + let file = + if FileSystem.IsPathRootedShim referenceText then + referenceText + else + Path.Combine(projectSnapshot.ProjectDirectory, referenceText) + + yield file + + for r in nonFrameworkResolutions do + yield r.resolvedPath + ] + + // For scripts, the dependency provider is already available. + // For projects create a fresh one for the project. + let dependencyProvider = + if projectSnapshot.UseScriptResolutionRules then + dependencyProviderForScripts + else + new DependencyProvider() + + let! tcImports, initialTcInfo = + CombineImportedAssembliesTask( + assemblyName, + tcConfig, + tcConfigP, + tcGlobals, + frameworkTcImports, + nonFrameworkResolutions, + unresolvedReferences, + dependencyProvider, + loadClosureOpt, + basicDependencies, + importsInvalidatedByTypeProvider + ) + + let bootstrapId = Interlocked.Increment &BootstrapInfoIdCounter + + // TODO: In the future it might make sense to expose the event on the ProjectSnapshot and let the consumer deal with this. + // We could include a timestamp as part of the ProjectSnapshot key that represents the last time since the TypeProvider assembly was invalidated. + // When the event trigger, the consumer could then create a new snapshot based on the updated time. + importsInvalidatedByTypeProvider.Publish.Add(fun () -> caches.Clear(Set.singleton projectSnapshot.Identifier)) + + return bootstrapId, tcImports, tcGlobals, initialTcInfo, importsInvalidatedByTypeProvider + } + ) + + let computeBootstrapInfoInner (projectSnapshot: ProjectSnapshot) = + async { + + let! tcConfigB, sourceFiles, loadClosureOpt = ComputeTcConfigBuilder projectSnapshot + + // If this is a builder for a script, re-apply the settings inferred from the + // script and its load closure to the configuration. + // + // NOTE: it would probably be cleaner and more accurate to re-run the load closure at this point. + let setupConfigFromLoadClosure () = + match loadClosureOpt with + | Some loadClosure -> + let dllReferences = + [ + for reference in tcConfigB.referencedDLLs do + // If there's (one or more) resolutions of closure references then yield them all + match + loadClosure.References + |> List.tryFind (fun (resolved, _) -> resolved = reference.Text) + with + | Some(resolved, closureReferences) -> + for closureReference in closureReferences do + yield AssemblyReference(closureReference.originalReference.Range, resolved, None) + | None -> yield reference + ] + + tcConfigB.referencedDLLs <- [] + + tcConfigB.primaryAssembly <- + (if loadClosure.UseDesktopFramework then + PrimaryAssembly.Mscorlib + else + PrimaryAssembly.System_Runtime) + // Add one by one to remove duplicates + dllReferences + |> List.iter (fun dllReference -> tcConfigB.AddReferencedAssemblyByPath(dllReference.Range, dllReference.Text)) + + tcConfigB.knownUnresolvedReferences <- loadClosure.UnresolvedReferences + | None -> () + + setupConfigFromLoadClosure () + + let tcConfig = TcConfig.Create(tcConfigB, validate = true) + let outFile, _, assemblyName = tcConfigB.DecideNames sourceFiles + + let! bootstrapId, tcImports, tcGlobals, initialTcInfo, importsInvalidatedByTypeProvider = + ComputeBootstrapInfoStatic(projectSnapshot.ProjectCore, tcConfig, assemblyName, loadClosureOpt) + + // Check for the existence of loaded sources and prepend them to the sources list if present. + let loadedSources = + tcConfig.GetAvailableLoadedSources() + |> List.map (fun (m, fileName) -> m, FSharpFileSnapshot.CreateFromFileSystem(fileName)) + + return + match sourceFiles with + | [] -> None + | _ -> + Some + { + Id = bootstrapId + AssemblyName = assemblyName + OutFile = outFile + TcConfig = tcConfig + TcImports = tcImports + TcGlobals = tcGlobals + InitialTcInfo = initialTcInfo + LoadedSources = loadedSources + LoadClosure = loadClosureOpt + LastFileName = sourceFiles |> List.tryLast |> Option.defaultValue "" + ImportsInvalidatedByTypeProvider = importsInvalidatedByTypeProvider + } + } + + let ComputeBootstrapInfo (projectSnapshot: ProjectSnapshot) = + + caches.BootstrapInfo.Get( + projectSnapshot.NoFileVersionsKey, + async { + use _ = + Activity.start + "ComputeBootstrapInfo" + [| + Activity.Tags.project, projectSnapshot.ProjectFileName |> Path.GetFileName |> (!!) + |] + + // Trap and report diagnostics from creation. + let delayedLogger = CapturingDiagnosticsLogger("IncrementalBuilderCreation") + use _ = new CompilationGlobalsScope(delayedLogger, BuildPhase.Parameter) + + let! bootstrapInfoOpt = + async { + try + return! computeBootstrapInfoInner projectSnapshot + with exn -> + errorRecoveryNoRange exn + return None + } + + let diagnostics = + match bootstrapInfoOpt with + | Some bootstrapInfo -> + let diagnosticsOptions = bootstrapInfo.TcConfig.diagnosticsOptions + + let diagnosticsLogger = + CompilationDiagnosticLogger("IncrementalBuilderCreation", diagnosticsOptions) + + delayedLogger.CommitDelayedDiagnostics diagnosticsLogger + diagnosticsLogger.GetDiagnostics() + | _ -> Array.ofList delayedLogger.Diagnostics + |> Array.map (fun (diagnostic, severity) -> + let flatErrors = + bootstrapInfoOpt + |> Option.map (fun bootstrapInfo -> bootstrapInfo.TcConfig.flatErrors) + |> Option.defaultValue false // TODO: do we need to figure this out? + + FSharpDiagnostic.CreateFromException(diagnostic, severity, range.Zero, suggestNamesForErrors, flatErrors, None)) + + return bootstrapInfoOpt, diagnostics + } + ) + + // TODO: Not sure if we should cache this. For VS probably not. Maybe it can be configurable by FCS user. + let LoadSource (file: FSharpFileSnapshot) isExe isLastCompiland = + async { + let! source = file.GetSource() |> Async.AwaitTask + + return + FSharpFileSnapshotWithSource( + FileName = file.FileName, + Source = source, + SourceHash = source.GetChecksum(), + IsLastCompiland = isLastCompiland, + IsExe = isExe + ) + } + + let LoadSources (bootstrapInfo: BootstrapInfo) (projectSnapshot: ProjectSnapshot) = + async { + let isExe = bootstrapInfo.TcConfig.target.IsExe + + let! sources = + projectSnapshot.SourceFiles + |> Seq.map (fun f -> LoadSource f isExe (f.FileName = bootstrapInfo.LastFileName)) + |> MultipleDiagnosticsLoggers.Parallel + + return ProjectSnapshotWithSources(projectSnapshot.ProjectCore, sources |> Array.toList) + + } + + let ComputeParseFile (projectSnapshot: ProjectSnapshotBase<_>) (tcConfig: TcConfig) (file: FSharpFileSnapshotWithSource) = + + let key = + { new ICacheKey<_, _> with + member _.GetLabel() = file.FileName |> shortPath + + member _.GetKey() = + projectSnapshot.ProjectCore.Identifier, file.FileName + + member _.GetVersion() = + projectSnapshot.ParsingVersion, + file.StringVersion, + // TODO: is there a situation where this is not enough and we need to have them separate? + file.IsLastCompiland && file.IsExe + } + + caches.ParseFile.Get( + key, + async { + use _ = + Activity.start + "ComputeParseFile" + [| + Activity.Tags.fileName, file.FileName |> shortPath + Activity.Tags.version, file.StringVersion + |] + + let diagnosticsLogger = + CompilationDiagnosticLogger("Parse", tcConfig.diagnosticsOptions) + // Return the disposable object that cleans up + use _holder = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.Parse) + + let flags = file.IsLastCompiland, file.IsExe + let fileName = file.FileName + let sourceText = file.Source + + let input = + ParseOneInputSourceText(tcConfig, lexResourceManager, fileName, flags, diagnosticsLogger, sourceText) + + // TODO: Hashing of syntax tree + let inputHash = file.Version + + fileParsed.Trigger(fileName, Unchecked.defaultof<_>) + + return FSharpParsedFile(fileName, inputHash, sourceText, input, diagnosticsLogger.GetDiagnostics()) + } + ) + + // In case we don't want to use any parallel processing + let mkLinearGraph count : Graph = + seq { + 0, [||] + + yield! + [ 0 .. count - 1 ] + |> Seq.rev + |> Seq.pairwise + |> Seq.map (fun (a, b) -> a, [| b |]) + } + |> Graph.make + + let computeDependencyGraph (tcConfig: TcConfig) parsedInputs (processGraph: Graph -> Graph) = + async { + let sourceFiles: FileInProject array = + parsedInputs + |> Seq.toArray + |> Array.mapi (fun idx (input: ParsedInput) -> + { + Idx = idx + FileName = input.FileName + ParsedInput = input + }) + + use _ = + Activity.start "ComputeDependencyGraph" [| Activity.Tags.fileName, (sourceFiles |> Array.last).FileName |] + + let filePairs = FilePairMap(sourceFiles) + + // TODO: we will probably want to cache and re-use larger graphs if available + + let graph = + if tcConfig.compilingFSharpCore then + mkLinearGraph sourceFiles.Length + else + DependencyResolution.mkGraph filePairs sourceFiles |> fst |> processGraph + + let nodeGraph = TransformDependencyGraph(graph, filePairs) + + let fileNames = + parsedInputs + |> Seq.mapi (fun idx input -> idx, Path.GetFileName input.FileName) + |> Map.ofSeq + + let debugGraph = + nodeGraph + |> Graph.map (function + | NodeToTypeCheck.PhysicalFile i -> i, $"[{i}] {fileNames[i]}" + | NodeToTypeCheck.ArtificialImplFile i -> -(i + 1), $"AIF [{i}] : {fileNames[i]}") + |> Graph.serialiseToMermaid + + //Trace.TraceInformation("\n" + debugGraph) + + match Activity.Current with + | Null -> () + | NonNull a -> a.AddTag("graph", debugGraph) |> ignore + + return nodeGraph, graph + } + + let removeImplFilesThatHaveSignatures (projectSnapshot: ProjectSnapshot) (graph: Graph) = + + let removeIndexes = + projectSnapshot.SourceFileNames + |> Seq.mapi pair + |> Seq.groupBy ( + snd + >> (fun fileName -> + if fileName.EndsWith(".fsi") then + fileName.Substring(0, fileName.Length - 1) + else + fileName) + ) + |> Seq.map (snd >> (Seq.toList)) + |> Seq.choose (function + | [ idx1, _; idx2, _ ] -> max idx1 idx2 |> Some + | _ -> None) + |> Set + + graph + |> Seq.filter (fun x -> not (removeIndexes.Contains x.Key)) + |> Seq.map (fun x -> x.Key, x.Value |> Array.filter (fun node -> not (removeIndexes.Contains node))) + |> Graph.make + + let removeImplFilesThatHaveSignaturesExceptLastOne (projectSnapshot: ProjectSnapshotBase<_>) (graph: Graph) = + + let removeIndexes = + projectSnapshot.SourceFileNames + |> Seq.mapi pair + |> Seq.groupBy ( + snd + >> (fun fileName -> + if fileName.EndsWith(".fsi") then + fileName.Substring(0, fileName.Length - 1) + else + fileName) + ) + |> Seq.map (snd >> (Seq.toList)) + |> Seq.choose (function + | [ idx1, _; idx2, _ ] -> max idx1 idx2 |> Some + | _ -> None) + |> Set + // Don't remove the last file + |> Set.remove (projectSnapshot.SourceFiles.Length - 1) + + graph + |> Seq.filter (fun x -> not (removeIndexes.Contains x.Key)) + |> Seq.map (fun x -> x.Key, x.Value |> Array.filter (fun node -> not (removeIndexes.Contains node))) + |> Graph.make + + let ComputeDependencyGraphForFile (tcConfig: TcConfig) (priorSnapshot: ProjectSnapshotBase) = + let key = priorSnapshot.SourceFiles.Key(DependencyGraphType.File) + //let lastFileIndex = (parsedInputs |> Array.length) - 1 + //caches.DependencyGraph.Get(key, computeDependencyGraph parsedInputs (Graph.subGraphFor lastFileIndex)) + caches.DependencyGraph.Get( + key, + computeDependencyGraph + tcConfig + (priorSnapshot.SourceFiles |> Seq.map (fun f -> f.ParsedInput)) + (removeImplFilesThatHaveSignaturesExceptLastOne priorSnapshot) + ) + + let ComputeDependencyGraphForProject (tcConfig: TcConfig) (projectSnapshot: ProjectSnapshotBase) = + + let key = projectSnapshot.SourceFiles.Key(DependencyGraphType.Project) + //caches.DependencyGraph.Get(key, computeDependencyGraph parsedInputs (removeImplFilesThatHaveSignatures projectSnapshot)) + caches.DependencyGraph.Get( + key, + computeDependencyGraph tcConfig (projectSnapshot.SourceFiles |> Seq.map (fun f -> f.ParsedInput)) id + ) + + let ComputeTcIntermediate + (projectSnapshot: ProjectSnapshotBase) + (dependencyGraph: Graph) + (index: FileIndex) + (nodeToCheck: NodeToTypeCheck) + bootstrapInfo + (prevTcInfo: TcInfo) + = + + ignore dependencyGraph + + let key = projectSnapshot.FileKey(index).WithExtraVersion(bootstrapInfo.Id) + + let _label, _k, _version = key.GetLabel(), key.GetKey(), key.GetVersion() + + caches.TcIntermediate.Get( + key, + async { + + let file = projectSnapshot.SourceFiles[index] + + let input = file.ParsedInput + let fileName = file.FileName + + use _ = + Activity.start + "ComputeTcIntermediate" + [| + Activity.Tags.fileName, fileName |> Path.GetFileName |> (!!) + "key", key.GetLabel() + "version", "-" // key.GetVersion() + |] + + beforeFileChecked.Trigger(fileName, Unchecked.defaultof<_>) + + let tcConfig = bootstrapInfo.TcConfig + let tcGlobals = bootstrapInfo.TcGlobals + let tcImports = bootstrapInfo.TcImports + + let mainInputFileName = file.FileName + let sourceText = file.SourceText + let parsedMainInput = file.ParsedInput + + // Initialize the error handler + let errHandler = + ParseAndCheckFile.DiagnosticsHandler( + true, + mainInputFileName, + tcConfig.diagnosticsOptions, + sourceText, + suggestNamesForErrors, + tcConfig.flatErrors + ) + + // Apply nowarns to tcConfig (may generate errors, so ensure diagnosticsLogger is installed) + let tcConfig = + ApplyNoWarnsToTcConfig(tcConfig, parsedMainInput, !! Path.GetDirectoryName(mainInputFileName)) + + let diagnosticsLogger = errHandler.DiagnosticsLogger + + let diagnosticsLogger = + GetDiagnosticsLoggerFilteringByScopedPragmas(false, input.ScopedPragmas, tcConfig.diagnosticsOptions, diagnosticsLogger) + + use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.TypeCheck) + + //beforeFileChecked.Trigger fileName + + ApplyMetaCommandsFromInputToTcConfig(tcConfig, input, Path.GetDirectoryName fileName |> (!!), tcImports.DependencyProvider) + |> ignore + + let sink = TcResultsSinkImpl(tcGlobals, file.SourceText) + + let hadParseErrors = + file.ParseDiagnostics + |> Array.exists (snd >> (=) FSharpDiagnosticSeverity.Error) + + let input, moduleNamesDict = + DeduplicateParsedInputModuleName prevTcInfo.moduleNamesDict input + + //let! ct = NodeCode.CancellationToken + + try + //do! maxParallelismSemaphore.WaitAsync(ct) |> NodeCode.AwaitTask + + let! finisher = + CheckOneInputWithCallback + nodeToCheck + ((fun () -> hadParseErrors || diagnosticsLogger.CheckForRealErrorsIgnoringWarnings), + tcConfig, + tcImports, + tcGlobals, + None, + TcResultsSink.WithSink sink, + prevTcInfo.tcState, + input, + true) + |> Cancellable.toAsync + + //fileChecked.Trigger fileName + + fileChecked.Trigger(fileName, Unchecked.defaultof<_>) + + return + { + finisher = finisher + moduleNamesDict = moduleNamesDict + tcDiagnosticsRev = [ errHandler.CollectedPhasedDiagnostics ] + tcDependencyFiles = [ fileName ] + sink = sink + } + finally + () + //maxParallelismSemaphore.Release() |> ignore + } + ) + + let processGraphNode projectSnapshot bootstrapInfo dependencyFiles collectSinks (fileNode: NodeToTypeCheck) tcInfo = + // TODO: should this be node? + async { + match fileNode with + | NodeToTypeCheck.PhysicalFile index -> + + let! tcIntermediate = ComputeTcIntermediate projectSnapshot dependencyFiles index fileNode bootstrapInfo tcInfo + + let (Finisher(node = node; finisher = finisher)) = tcIntermediate.finisher + + return + Finisher( + node, + (fun tcInfo -> + + if tcInfo.stateContainsNodes |> Set.contains fileNode then + failwith $"Oops!" + + //if + // tcInfo.stateContainsNodes + // Signature files don't have to be right above the impl file... if we need this check then + // we need to do it differently + // |> Set.contains (NodeToTypeCheck.ArtificialImplFile(index - 1)) + //then + // failwith $"Oops???" + + let partialResult, tcState = finisher tcInfo.tcState + + let tcEnv, topAttribs, _checkImplFileOpt, ccuSigForFile = partialResult + + let tcEnvAtEndOfFile = + if keepAllBackgroundResolutions then + tcEnv + else + tcState.TcEnvFromImpls + + partialResult, + { tcInfo with + tcState = tcState + tcEnvAtEndOfFile = tcEnvAtEndOfFile + moduleNamesDict = tcIntermediate.moduleNamesDict + topAttribs = Some topAttribs + tcDiagnosticsRev = tcIntermediate.tcDiagnosticsRev @ tcInfo.tcDiagnosticsRev + tcDependencyFiles = tcIntermediate.tcDependencyFiles @ tcInfo.tcDependencyFiles + latestCcuSigForFile = Some ccuSigForFile + graphNode = Some node + stateContainsNodes = tcInfo.stateContainsNodes |> Set.add node + sink = + if collectSinks then + tcIntermediate.sink :: tcInfo.sink + else + [ tcIntermediate.sink ] + }) + ) + + | NodeToTypeCheck.ArtificialImplFile index -> + return + Finisher( + fileNode, + (fun tcInfo -> + + if tcInfo.stateContainsNodes |> Set.contains fileNode then + failwith $"Oops!" + + // if + // tcInfo.stateContainsNodes + // |> Set.contains (NodeToTypeCheck.PhysicalFile(index + 1)) + // then + // failwith $"Oops!!!" + + let parsedInput = projectSnapshot.SourceFiles[index].ParsedInput + let prefixPathOpt = None + // Retrieve the type-checked signature information and add it to the TcEnvFromImpls. + let partialResult, tcState = + AddSignatureResultToTcImplEnv + (bootstrapInfo.TcImports, + bootstrapInfo.TcGlobals, + prefixPathOpt, + TcResultsSink.NoSink, + tcInfo.tcState, + parsedInput) + tcInfo.tcState + + let tcEnv, topAttribs, _checkImplFileOpt, ccuSigForFile = partialResult + + let tcEnvAtEndOfFile = + if keepAllBackgroundResolutions then + tcEnv + else + tcState.TcEnvFromImpls + + partialResult, + { tcInfo with + tcState = tcState + tcEnvAtEndOfFile = tcEnvAtEndOfFile + topAttribs = Some topAttribs + latestCcuSigForFile = Some ccuSigForFile + graphNode = Some fileNode + stateContainsNodes = tcInfo.stateContainsNodes |> Set.add fileNode + }) + ) + + } + + let parseSourceFiles (projectSnapshot: ProjectSnapshotWithSources) tcConfig = + async { + let! parsedInputs = + projectSnapshot.SourceFiles + |> Seq.map (ComputeParseFile projectSnapshot tcConfig) + |> MultipleDiagnosticsLoggers.Parallel + + return ProjectSnapshotBase<_>(projectSnapshot.ProjectCore, parsedInputs |> Array.toList) + } + + // Type check file and all its dependencies + let ComputeTcLastFile (bootstrapInfo: BootstrapInfo) (projectSnapshot: ProjectSnapshotWithSources) = + let fileName = projectSnapshot.SourceFiles |> List.last |> (fun f -> f.FileName) + + caches.TcLastFile.Get( + projectSnapshot.FileKey fileName, + async { + let file = projectSnapshot.SourceFiles |> List.last + + use _ = + Activity.start "ComputeTcLastFile" [| Activity.Tags.fileName, file.FileName |> Path.GetFileName |> (!!) |] + + let! projectSnapshot = parseSourceFiles projectSnapshot bootstrapInfo.TcConfig + + let! graph, dependencyFiles = ComputeDependencyGraphForFile bootstrapInfo.TcConfig projectSnapshot + + let! results, tcInfo = + processTypeCheckingGraph + graph + (processGraphNode projectSnapshot bootstrapInfo dependencyFiles false) + bootstrapInfo.InitialTcInfo + + let lastResult = results |> List.head |> snd + + return lastResult, tcInfo + } + ) + + let getParseResult (projectSnapshot: ProjectSnapshot) creationDiags file (tcConfig: TcConfig) = + async { + let! parsedFile = ComputeParseFile projectSnapshot tcConfig file + + let parseDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + tcConfig.diagnosticsOptions, + false, + file.FileName, + parsedFile.ParseDiagnostics, + suggestNamesForErrors, + tcConfig.flatErrors, + None + ) + + let diagnostics = [| yield! creationDiags; yield! parseDiagnostics |] + + return + FSharpParseFileResults( + diagnostics = diagnostics, + input = parsedFile.ParsedInput, + parseHadErrors = (parseDiagnostics.Length > 0), + // TODO: check if we really need this in parse results + dependencyFiles = [||] + ) + } + + let emptyParseResult fileName diagnostics = + let parseTree = EmptyParsedInput(fileName, (false, false)) + FSharpParseFileResults(diagnostics, parseTree, true, [||]) + + let ComputeParseAndCheckFileInProject (fileName: string) (projectSnapshot: ProjectSnapshot) = + caches.ParseAndCheckFileInProject.Get( + projectSnapshot.FileKeyWithExtraFileSnapshotVersion fileName, + async { + use _ = + Activity.start "ComputeParseAndCheckFileInProject" [| Activity.Tags.fileName, fileName |> Path.GetFileName |> (!!) |] + + match! ComputeBootstrapInfo projectSnapshot with + | None, creationDiags -> return emptyParseResult fileName creationDiags, FSharpCheckFileAnswer.Aborted + + | Some bootstrapInfo, creationDiags -> + + let priorSnapshot = projectSnapshot.UpTo fileName + let! snapshotWithSources = LoadSources bootstrapInfo priorSnapshot + let file = snapshotWithSources.SourceFiles |> List.last + + let! parseResults = getParseResult projectSnapshot Seq.empty file bootstrapInfo.TcConfig + + let! result, tcInfo = ComputeTcLastFile bootstrapInfo snapshotWithSources + + let (tcEnv, _topAttribs, checkedImplFileOpt, ccuSigForFile) = result + + let tcState = tcInfo.tcState + + let sink = tcInfo.sink.Head // TODO: don't use head + + let tcResolutions = sink.GetResolutions() + let tcSymbolUses = sink.GetSymbolUses() + let tcOpenDeclarations = sink.GetOpenDeclarations() + + // TODO: Apparently creating diagnostics can produce further diagnostics. So let's capture those too. Hopefully there is a more elegant solution... + // Probably diagnostics need to be evaluated during typecheck anyway for proper formatting, which might take care of this too. + let extraLogger = CapturingDiagnosticsLogger("DiagnosticsWhileCreatingDiagnostics") + use _ = new CompilationGlobalsScope(extraLogger, BuildPhase.TypeCheck) + + // Apply nowarns to tcConfig (may generate errors, so ensure diagnosticsLogger is installed) + let tcConfig = + ApplyNoWarnsToTcConfig(bootstrapInfo.TcConfig, parseResults.ParseTree, Path.GetDirectoryName fileName |> (!!)) + + let diagnosticsOptions = tcConfig.diagnosticsOptions + + let symbolEnv = + SymbolEnv(bootstrapInfo.TcGlobals, tcState.Ccu, Some tcState.CcuSig, bootstrapInfo.TcImports) + + let tcDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + diagnosticsOptions, + false, + fileName, + tcInfo.TcDiagnostics, + suggestNamesForErrors, + bootstrapInfo.TcConfig.flatErrors, + Some symbolEnv + ) + + let extraDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + diagnosticsOptions, + false, + fileName, + extraLogger.Diagnostics, + suggestNamesForErrors, + bootstrapInfo.TcConfig.flatErrors, + Some symbolEnv + ) + + let tcDiagnostics = [| yield! extraDiagnostics; yield! tcDiagnostics |] + + let! loadClosure = + ComputeScriptClosure + fileName + file.Source + tcConfig.fsharpBinariesDir + tcConfig.useSimpleResolution + (Some tcConfig.useFsiAuxLib) + (Some tcConfig.useSdkRefs) + tcConfig.sdkDirOverride + (Some tcConfig.assumeDotNetFramework) + projectSnapshot.Identifier + projectSnapshot.OtherOptions + projectSnapshot.Stamp + + let typedResults = + FSharpCheckFileResults.Make( + fileName, + projectSnapshot.ProjectFileName, + bootstrapInfo.TcConfig, + bootstrapInfo.TcGlobals, + projectSnapshot.IsIncompleteTypeCheckEnvironment, + None, + projectSnapshot.ToOptions(), + Array.ofList tcInfo.tcDependencyFiles, + creationDiags, + parseResults.Diagnostics, + tcDiagnostics, + keepAssemblyContents, + ccuSigForFile, + tcState.Ccu, + bootstrapInfo.TcImports, + tcEnv.AccessRights, + tcResolutions, + tcSymbolUses, + tcEnv.NameEnv, + Some loadClosure, + checkedImplFileOpt, + tcOpenDeclarations + ) + + return (parseResults, FSharpCheckFileAnswer.Succeeded typedResults) + } + ) + + let ComputeParseAndCheckAllFilesInProject (bootstrapInfo: BootstrapInfo) (projectSnapshot: ProjectSnapshotWithSources) = + caches.ParseAndCheckAllFilesInProject.Get( + projectSnapshot.FullKey, + async { + use _ = + Activity.start + "ComputeParseAndCheckAllFilesInProject" + [| + Activity.Tags.project, projectSnapshot.ProjectFileName |> Path.GetFileName |> (!!) + |] + + let! projectSnapshot = parseSourceFiles projectSnapshot bootstrapInfo.TcConfig + + let! graph, dependencyFiles = ComputeDependencyGraphForProject bootstrapInfo.TcConfig projectSnapshot + + return! + processTypeCheckingGraph + graph + (processGraphNode projectSnapshot bootstrapInfo dependencyFiles true) + bootstrapInfo.InitialTcInfo + } + ) + + let TryGetRecentCheckResultsForFile + ( + fileName: string, + projectSnapshot: FSharpProjectSnapshot, + userOpName: string + ) : (FSharpParseFileResults * FSharpCheckFileResults) option = + ignore userOpName + + let cacheKey = + projectSnapshot.ProjectSnapshot.FileKeyWithExtraFileSnapshotVersion fileName + + let version = cacheKey.GetVersion() + + let parseFileResultsAndcheckFileAnswer = + caches.ParseAndCheckFileInProject.TryGet( + cacheKey.GetKey(), + (fun (_fullVersion, fileContentVersion) -> fileContentVersion = (snd version)) + ) + + match parseFileResultsAndcheckFileAnswer with + | Some(parseFileResults, FSharpCheckFileAnswer.Succeeded checkFileResults) -> Some(parseFileResults, checkFileResults) + | _ -> None + + let ComputeProjectExtras (bootstrapInfo: BootstrapInfo) (projectSnapshot: ProjectSnapshotWithSources) = + caches.ProjectExtras.Get( + projectSnapshot.SignatureKey, + async { + + let! results, finalInfo = ComputeParseAndCheckAllFilesInProject bootstrapInfo projectSnapshot + + let assemblyName = bootstrapInfo.AssemblyName + let tcConfig = bootstrapInfo.TcConfig + let tcGlobals = bootstrapInfo.TcGlobals + + let results = results |> Seq.sortBy fst |> Seq.map snd |> Seq.toList + + // Finish the checking + let (_tcEnvAtEndOfLastFile, topAttrs, checkedImplFiles, _), tcState = + CheckMultipleInputsFinish(results, finalInfo.tcState) + + let tcState, _, ccuContents = CheckClosedInputSetFinish([], tcState) + + let generatedCcu = tcState.Ccu.CloneWithFinalizedContents(ccuContents) + + // Compute the identity of the generated assembly based on attributes, options etc. + // Some of this is duplicated from fsc.fs + let ilAssemRef = + let publicKey = + try + let signingInfo = ValidateKeySigningAttributes(tcConfig, tcGlobals, topAttrs) + + match GetStrongNameSigner signingInfo with + | None -> None + | Some s -> Some(PublicKey.KeyAsToken(s.PublicKey)) + with exn -> + errorRecoveryNoRange exn + None + + let locale = + TryFindFSharpStringAttribute + tcGlobals + (tcGlobals.FindSysAttrib "System.Reflection.AssemblyCultureAttribute") + topAttrs.assemblyAttrs + + let assemVerFromAttrib = + TryFindFSharpStringAttribute + tcGlobals + (tcGlobals.FindSysAttrib "System.Reflection.AssemblyVersionAttribute") + topAttrs.assemblyAttrs + |> Option.bind (fun v -> + try + Some(parseILVersion v) + with _ -> + None) + + let ver = + match assemVerFromAttrib with + | None -> tcConfig.version.GetVersionInfo(tcConfig.implicitIncludeDir) + | Some v -> v + + ILAssemblyRef.Create(assemblyName, None, publicKey, false, Some ver, locale) + + let assemblyDataResult = + try + // Assemblies containing type provider components cannot successfully be used via cross-assembly references. + // We return 'None' for the assembly portion of the cross-assembly reference + let hasTypeProviderAssemblyAttrib = + topAttrs.assemblyAttrs + |> List.exists (fun (Attrib(tcref, _, _, _, _, _, _)) -> + let nm = tcref.CompiledRepresentationForNamedType.BasicQualifiedName + + nm = !!typeof.FullName) + + if tcState.CreatesGeneratedProvidedTypes || hasTypeProviderAssemblyAttrib then + ProjectAssemblyDataResult.Unavailable true + else + ProjectAssemblyDataResult.Available( + RawFSharpAssemblyDataBackedByLanguageService( + bootstrapInfo.TcConfig, + bootstrapInfo.TcGlobals, + generatedCcu, + bootstrapInfo.OutFile, + topAttrs, + bootstrapInfo.AssemblyName, + ilAssemRef + ) + :> IRawFSharpAssemblyData + ) + with exn -> + errorRecoveryNoRange exn + ProjectAssemblyDataResult.Unavailable true + + return finalInfo, ilAssemRef, assemblyDataResult, checkedImplFiles + } + ) + + let ComputeAssemblyData (projectSnapshot: ProjectSnapshot) fileName = + caches.AssemblyData.Get( + projectSnapshot.SignatureKey, + async { + + try + + let availableOnDiskModifiedTime = + if FileSystem.FileExistsShim fileName then + Some <| FileSystem.GetLastWriteTimeShim fileName + else + None + + // TODO: This kinda works, but the problem is that in order to switch a project to "in-memory" mode + // - some file needs to be edited (this triggers a re-check, but LastModifiedTimeOnDisk won't change) + // - saved (this will not trigger anything) + // - and then another change has to be made (to any file buffer) - so that recheck is triggered and we get here again + // Until that sequence happens the project will be used from disk (if available). + // To get around it we probably need to detect changes made in the editor and record a timestamp for them. + let shouldUseOnDisk = + availableOnDiskModifiedTime + |> Option.exists (fun t -> t >= projectSnapshot.GetLastModifiedTimeOnDisk()) + + let name = projectSnapshot.ProjectFileName |> Path.GetFileNameWithoutExtension + + if shouldUseOnDisk then + Trace.TraceInformation($"Using assembly on disk: {name}") + return ProjectAssemblyDataResult.Unavailable true + else + match! ComputeBootstrapInfo projectSnapshot with + | None, _ -> + Trace.TraceInformation($"Using assembly on disk (unintentionally): {name}") + return ProjectAssemblyDataResult.Unavailable true + | Some bootstrapInfo, _creationDiags -> + + let! snapshotWithSources = LoadSources bootstrapInfo projectSnapshot + + let! _, _, assemblyDataResult, _ = ComputeProjectExtras bootstrapInfo snapshotWithSources + Trace.TraceInformation($"Using in-memory project reference: {name}") + + return assemblyDataResult + with + | TaskCancelled ex -> return raise ex + | ex -> + errorR (exn ($"Error while computing assembly data for project {projectSnapshot.Label}: {ex}")) + return ProjectAssemblyDataResult.Unavailable true + } + ) + + let ComputeParseAndCheckProject (projectSnapshot: ProjectSnapshot) = + caches.ParseAndCheckProject.Get( + projectSnapshot.FullKey, + async { + + match! ComputeBootstrapInfo projectSnapshot with + | None, creationDiags -> + return FSharpCheckProjectResults(projectSnapshot.ProjectFileName, None, keepAssemblyContents, creationDiags, None) + | Some bootstrapInfo, creationDiags -> + let! snapshotWithSources = LoadSources bootstrapInfo projectSnapshot + + let! tcInfo, ilAssemRef, assemblyDataResult, checkedImplFiles = ComputeProjectExtras bootstrapInfo snapshotWithSources + + let diagnosticsOptions = bootstrapInfo.TcConfig.diagnosticsOptions + let fileName = DummyFileNameForRangesWithoutASpecificLocation + + let topAttribs = tcInfo.topAttribs + let tcState = tcInfo.tcState + let tcEnvAtEnd = tcInfo.tcEnvAtEndOfFile + let tcDiagnostics = tcInfo.TcDiagnostics + let tcDependencyFiles = tcInfo.tcDependencyFiles + + let symbolEnv = + SymbolEnv(bootstrapInfo.TcGlobals, tcInfo.tcState.Ccu, Some tcInfo.tcState.CcuSig, bootstrapInfo.TcImports) + |> Some + + let tcDiagnostics = + DiagnosticHelpers.CreateDiagnostics( + diagnosticsOptions, + true, + fileName, + tcDiagnostics, + suggestNamesForErrors, + bootstrapInfo.TcConfig.flatErrors, + symbolEnv + ) + + let diagnostics = [| yield! creationDiags; yield! tcDiagnostics |] + + let getAssemblyData () = + match assemblyDataResult with + | ProjectAssemblyDataResult.Available data -> Some data + | _ -> None + + let symbolUses = + tcInfo.sink |> Seq.rev |> Seq.map (fun sink -> sink.GetSymbolUses()) + + let details = + (bootstrapInfo.TcGlobals, + bootstrapInfo.TcImports, + tcState.Ccu, + tcState.CcuSig, + Choice2Of2(async.Return symbolUses), + topAttribs, + getAssemblyData, + ilAssemRef, + tcEnvAtEnd.AccessRights, + Some checkedImplFiles, + Array.ofList tcDependencyFiles, + projectSnapshot.ToOptions()) + + let results = + FSharpCheckProjectResults( + projectSnapshot.ProjectFileName, + Some bootstrapInfo.TcConfig, + keepAssemblyContents, + diagnostics, + Some details + ) + + return results + } + ) + + let tryGetSink (fileName: string) (projectSnapshot: ProjectSnapshot) = + async { + match! ComputeBootstrapInfo projectSnapshot with + | None, _ -> return None + | Some bootstrapInfo, _creationDiags -> + + let! snapshotWithSources = projectSnapshot.UpTo fileName |> LoadSources bootstrapInfo + + let! _, tcInfo = ComputeTcLastFile bootstrapInfo snapshotWithSources + + return tcInfo.sink |> List.tryHead |> Option.map (fun sink -> sink, bootstrapInfo) + } + + let ComputeSemanticClassification (fileName: string, projectSnapshot: ProjectSnapshot) = + caches.SemanticClassification.Get( + projectSnapshot.FileKey fileName, + async { + use _ = + Activity.start "ComputeSemanticClassification" [| Activity.Tags.fileName, fileName |> Path.GetFileName |> (!!) |] + + let! sinkOpt = tryGetSink fileName projectSnapshot + + return + sinkOpt + |> Option.bind (fun (sink, bootstrapInfo) -> + let sResolutions = sink.GetResolutions() + + let semanticClassification = + sResolutions.GetSemanticClassification( + bootstrapInfo.TcGlobals, + bootstrapInfo.TcImports.GetImportMap(), + sink.GetFormatSpecifierLocations(), + None + ) + + let sckBuilder = SemanticClassificationKeyStoreBuilder() + sckBuilder.WriteAll semanticClassification + + sckBuilder.TryBuildAndReset()) + |> Option.map (fun sck -> sck.GetView()) + } + ) + + let ComputeItemKeyStore (fileName: string, projectSnapshot: ProjectSnapshot) = + caches.ItemKeyStore.Get( + projectSnapshot.FileKey fileName, + async { + use _ = + Activity.start "ComputeItemKeyStore" [| Activity.Tags.fileName, fileName |> Path.GetFileName |> (!!) |] + + let! sinkOpt = tryGetSink fileName projectSnapshot + + return + sinkOpt + |> Option.bind (fun (sink, { TcGlobals = g }) -> + let sResolutions = sink.GetResolutions() + + let builder = ItemKeyStoreBuilder(g) + + let preventDuplicates = + HashSet( + { new IEqualityComparer with + member _.Equals((s1, e1): struct (pos * pos), (s2, e2): struct (pos * pos)) = + Position.posEq s1 s2 && Position.posEq e1 e2 + + member _.GetHashCode o = o.GetHashCode() + } + ) + + sResolutions.CapturedNameResolutions + |> Seq.iter (fun cnr -> + let r = cnr.Range + + if preventDuplicates.Add struct (r.Start, r.End) then + builder.Write(cnr.Range, cnr.Item)) + + builder.TryBuildAndReset()) + } + ) + + member _.ParseFile(fileName, projectSnapshot: ProjectSnapshot, _userOpName) = + async { + //use _ = + // Activity.start "ParseFile" [| Activity.Tags.fileName, fileName |> Path.GetFileName |] + + // TODO: might need to deal with exceptions here: + use _ = new CompilationGlobalsScope(DiscardErrorsLogger, BuildPhase.Parse) + let! tcConfigB, sourceFileNames, _ = ComputeTcConfigBuilder projectSnapshot + + let tcConfig = TcConfig.Create(tcConfigB, validate = true) + + let _index, fileSnapshot = + projectSnapshot.SourceFiles + |> Seq.mapi pair + |> Seq.tryFind (fun (_, f) -> f.FileName = fileName) + |> Option.defaultWith (fun () -> failwith $"File not found: {fileName}") + + let isExe = tcConfig.target.IsExe + let isLastCompiland = fileName = (sourceFileNames |> List.last) + + let! file = LoadSource fileSnapshot isExe isLastCompiland + let! parseResult = getParseResult projectSnapshot Seq.empty file tcConfig + return parseResult + } + + member _.ParseFileWithoutProject + ( + fileName: string, + sourceText: ISourceText, + options: FSharpParsingOptions, + cache: bool, + flatErrors: bool, + userOpName: string + ) : Async = + let parseFileAsync = + async { + let! ct = Async.CancellationToken + + let diagnostics, parsedInput, anyErrors = + ParseAndCheckFile.parseFile (sourceText, fileName, options, userOpName, false, flatErrors, false, ct) + + return FSharpParseFileResults(diagnostics, parsedInput, anyErrors, Array.empty) + } + + if not cache then + parseFileAsync + else + let cacheKey = + let sourceText = SourceTextNew.ofISourceText sourceText + + { new ICacheKey<_, _> with + member _.GetLabel() = shortPath fileName + + member _.GetKey() = fileName + + member _.GetVersion() = + Md5Hasher.empty + |> Md5Hasher.addStrings + [ + yield fileName + yield! options.ConditionalDefines + yield! options.SourceFiles + yield options.LangVersionText + ] + |> Md5Hasher.addBytes (sourceText.GetChecksum().ToArray()) + |> Md5Hasher.addIntegers + [ + yield options.DiagnosticOptions.WarnLevel + yield! options.DiagnosticOptions.WarnOff + yield! options.DiagnosticOptions.WarnOn + yield! options.DiagnosticOptions.WarnAsError + yield! options.DiagnosticOptions.WarnAsWarn + ] + |> Md5Hasher.addBooleans + [ + yield options.ApplyLineDirectives + yield options.DiagnosticOptions.GlobalWarnAsError + yield options.IsInteractive + yield! (Option.toList options.IndentationAwareSyntax) + yield! (Option.toList options.StrictIndentation) + yield options.CompilingFSharpCore + yield options.IsExe + ] + |> Md5Hasher.toString + } + + caches.ParseFileWithoutProject.Get(cacheKey, parseFileAsync) + + member _.ParseAndCheckFileInProject(fileName: string, projectSnapshot: ProjectSnapshot, userOpName: string) = + ignore userOpName + ComputeParseAndCheckFileInProject fileName projectSnapshot + + member _.FindReferencesInFile(fileName: string, projectSnapshot: ProjectSnapshot, symbol: FSharpSymbol, userOpName: string) = + ignore userOpName + + async { + match! ComputeItemKeyStore(fileName, projectSnapshot) with + | None -> return Seq.empty + | Some itemKeyStore -> return itemKeyStore.FindAll symbol.Item + } + + member _.GetAssemblyData(projectSnapshot: ProjectSnapshot, fileName, _userOpName) = + ComputeAssemblyData projectSnapshot fileName + + member _.Caches = caches + + member _.SetCacheSizeFactor(sizeFactor: int) = + if sizeFactor <> caches.SizeFactor then + caches <- CompilerCaches(sizeFactor) + + interface IBackgroundCompiler with + + member this.CheckFileInProject + ( + parseResults: FSharpParseFileResults, + fileName: string, + fileVersion: int, + sourceText: ISourceText, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + async { + let! snapshot = FSharpProjectSnapshot.FromOptions(options, fileName, fileVersion, sourceText, documentSource) + + ignore parseResults + + let! _, result = this.ParseAndCheckFileInProject(fileName, snapshot.ProjectSnapshot, userOpName) + + return result + } + + member this.CheckFileInProjectAllowingStaleCachedResults + ( + parseResults: FSharpParseFileResults, + fileName: string, + fileVersion: int, + sourceText: ISourceText, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + async { + let! snapshot = FSharpProjectSnapshot.FromOptions(options, fileName, fileVersion, sourceText, documentSource) + + ignore parseResults + + let! _, result = this.ParseAndCheckFileInProject(fileName, snapshot.ProjectSnapshot, userOpName) + + return Some result + } + + member this.ClearCache(projects: FSharpProjectIdentifier seq, userOpName: string) : unit = + use _ = + Activity.start "TransparentCompiler.ClearCache" [| Activity.Tags.userOpName, userOpName |] + + this.Caches.Clear( + projects + |> Seq.map (function + | FSharpProjectIdentifier(x, y) -> (x, y)) + |> Set + ) + + member this.ClearCache(options: seq, userOpName: string) : unit = + use _ = + Activity.start "TransparentCompiler.ClearCache" [| Activity.Tags.userOpName, userOpName |] + + backgroundCompiler.ClearCache(options, userOpName) + this.Caches.Clear(options |> Seq.map (fun o -> o.GetProjectIdentifier()) |> Set) + + member _.ClearCaches() : unit = + backgroundCompiler.ClearCaches() + caches <- CompilerCaches(100) // TODO: check + + member _.DownsizeCaches() : unit = backgroundCompiler.DownsizeCaches() + + member _.BeforeBackgroundFileCheck = beforeFileChecked.Publish + + member _.FileParsed = fileParsed.Publish + + member _.FileChecked = fileChecked.Publish + + member _.ProjectChecked = projectChecked.Publish + + member this.FindReferencesInFile + ( + fileName: string, + options: FSharpProjectOptions, + symbol: FSharpSymbol, + canInvalidateProject: bool, + userOpName: string + ) : Async> = + async { + ignore canInvalidateProject + + let! snapshot = FSharpProjectSnapshot.FromOptions(options, documentSource) + + return! this.FindReferencesInFile(fileName, snapshot.ProjectSnapshot, symbol, userOpName) + } + + member this.FindReferencesInFile(fileName, projectSnapshot, symbol, userOpName) = + this.FindReferencesInFile(fileName, projectSnapshot.ProjectSnapshot, symbol, userOpName) + + member _.FrameworkImportsCache: FrameworkImportsCache = + backgroundCompiler.FrameworkImportsCache + + member this.GetAssemblyData(options: FSharpProjectOptions, fileName, userOpName: string) : Async = + async { + let! snapshot = FSharpProjectSnapshot.FromOptions(options, documentSource) + + return! this.GetAssemblyData(snapshot.ProjectSnapshot, fileName, userOpName) + } + + member this.GetAssemblyData + ( + projectSnapshot: FSharpProjectSnapshot, + fileName, + userOpName: string + ) : Async = + this.GetAssemblyData(projectSnapshot.ProjectSnapshot, fileName, userOpName) + + member this.GetBackgroundCheckResultsForFileInProject + ( + fileName: string, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + async { + let! snapshot = FSharpProjectSnapshot.FromOptions(options, documentSource) + + match! this.ParseAndCheckFileInProject(fileName, snapshot.ProjectSnapshot, userOpName) with + | parseResult, FSharpCheckFileAnswer.Succeeded checkResult -> return parseResult, checkResult + | parseResult, FSharpCheckFileAnswer.Aborted -> return parseResult, FSharpCheckFileResults.MakeEmpty(fileName, [||], true) + } + + member this.GetBackgroundParseResultsForFileInProject + ( + fileName: string, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + async { + let! snapshot = FSharpProjectSnapshot.FromOptions(options, documentSource) + + return! this.ParseFile(fileName, snapshot.ProjectSnapshot, userOpName) + } + + member this.GetCachedCheckFileResult + ( + builder: IncrementalBuilder, + fileName: string, + sourceText: ISourceText, + options: FSharpProjectOptions + ) : Async<(FSharpParseFileResults * FSharpCheckFileResults) option> = + async { + ignore builder + + let! snapshot = FSharpProjectSnapshot.FromOptions(options, fileName, 1, sourceText, documentSource) + + match! this.ParseAndCheckFileInProject(fileName, snapshot.ProjectSnapshot, "GetCachedCheckFileResult") with + | parseResult, FSharpCheckFileAnswer.Succeeded checkResult -> return Some(parseResult, checkResult) + | _, FSharpCheckFileAnswer.Aborted -> return None + } + + member this.GetProjectOptionsFromScript + ( + fileName: string, + sourceText: ISourceText, + previewEnabled: bool option, + loadedTimeStamp: DateTime option, + otherFlags: string array option, + useFsiAuxLib: bool option, + useSdkRefs: bool option, + sdkDirOverride: string option, + assumeDotNetFramework: bool option, + optionsStamp: int64 option, + userOpName: string + ) : Async = + async { + let bc = this :> IBackgroundCompiler + + let! snapshot, diagnostics = + bc.GetProjectSnapshotFromScript( + fileName, + SourceTextNew.ofISourceText sourceText, + DocumentSource.FileSystem, + previewEnabled, + loadedTimeStamp, + otherFlags, + useFsiAuxLib, + useSdkRefs, + sdkDirOverride, + assumeDotNetFramework, + optionsStamp, + userOpName + ) + + let projectOptions = snapshot.ToOptions() + return projectOptions, diagnostics + } + + member this.GetProjectSnapshotFromScript + ( + fileName: string, + sourceText: ISourceTextNew, + documentSource: DocumentSource, + previewEnabled: bool option, + loadedTimeStamp: DateTime option, + otherFlags: string array option, + useFsiAuxLib: bool option, + useSdkRefs: bool option, + sdkDirOverride: string option, + assumeDotNetFramework: bool option, + optionsStamp: int64 option, + userOpName: string + ) : Async = + use _ = + Activity.start + "BackgroundCompiler.GetProjectOptionsFromScript" + [| Activity.Tags.fileName, fileName; Activity.Tags.userOpName, userOpName |] + + async { + // Use the same default as the background compiler. + let useFsiAuxLib = defaultArg useFsiAuxLib true + let useSdkRefs = defaultArg useSdkRefs true + let previewEnabled = defaultArg previewEnabled false + + // Do we assume .NET Framework references for scripts? + // No, because the bootstrap info call also doesn't + let assumeDotNetFramework = defaultArg assumeDotNetFramework false + + let extraFlags = + if previewEnabled then + [| "--langversion:preview" |] + else + [||] + + let otherFlags = defaultArg otherFlags extraFlags + use diagnostics = new DiagnosticsScope(otherFlags |> Array.contains "--flaterrors") + + let useSimpleResolution = + otherFlags |> Array.exists (fun x -> x = "--simpleresolution") + + let loadedTimeStamp = defaultArg loadedTimeStamp DateTime.MaxValue // Not 'now', we don't want to force reloading + let projectFileName = fileName + ".fsproj" + + let currentSourceFile = + FSharpFileSnapshot.Create(fileName, sourceText.GetHashCode().ToString(), (fun () -> Task.FromResult sourceText)) + + let otherFlags = List.ofArray otherFlags + + // Always perform the load closure as we cannot be sure that the incoming file does not load any new additional files. + // Consider the scenario where a.fsx loads b.fsx. Based purely on a.fsx, we cannot know if b.fsx loads another file. + // Therefore we cannot rely on any caching for the script closure in this API. + let loadClosure = + ComputeScriptClosureInner + fileName + sourceText + FSharpCheckerResultsSettings.defaultFSharpBinariesDir + useSimpleResolution + useFsiAuxLib + useSdkRefs + sdkDirOverride + assumeDotNetFramework + otherFlags + + let otherFlags = + [ + yield "--noframework" + yield "--warn:3" + yield! otherFlags + for code, _ in loadClosure.NoWarns do + yield "--nowarn:" + code + ] + + // Once we do have the script closure, we can populate the cache to re-use can later. + let loadClosureKey = + mkScriptClosureCacheKey + fileName + sourceText + useSimpleResolution + useFsiAuxLib + useSdkRefs + assumeDotNetFramework + (projectFileName, "") + otherFlags + optionsStamp + + // Populate the cache. + let! _ = caches.ScriptClosure.Get(loadClosureKey, async { return loadClosure }) + + let sourceFiles = + loadClosure.SourceFiles + |> List.map (fun (sf, _) -> + if sf = fileName then + currentSourceFile + else + FSharpFileSnapshot.CreateFromDocumentSource(sf, documentSource)) + + let references = + loadClosure.References + |> List.map (fun (r, _) -> + let lastModified = FileSystem.GetLastWriteTimeShim r + + { + Path = r + LastModified = lastModified + }) + + let snapshot = + FSharpProjectSnapshot.Create( + fileName + ".fsproj", + None, + sourceFiles, + references, + otherFlags, + List.empty, + false, + true, + loadedTimeStamp, + Some(FSharpUnresolvedReferencesSet(loadClosure.UnresolvedReferences)), + loadClosure.OriginalLoadReferences, + optionsStamp + ) + + let diags = + loadClosure.LoadClosureRootFileDiagnostics + |> List.map (fun (exn, isError) -> + FSharpDiagnostic.CreateFromException( + exn, + isError, + range.Zero, + false, + otherFlags |> List.contains "--flaterrors", + None + )) + + return snapshot, (diags @ diagnostics.Diagnostics) + } + + member this.GetSemanticClassificationForFile(fileName: string, snapshot: FSharpProjectSnapshot, userOpName: string) = + async { + ignore userOpName + return! ComputeSemanticClassification(fileName, snapshot.ProjectSnapshot) + } + + member this.GetSemanticClassificationForFile + ( + fileName: string, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + async { + ignore userOpName + + let! snapshot = FSharpProjectSnapshot.FromOptions(options, documentSource) + + return! ComputeSemanticClassification(fileName, snapshot.ProjectSnapshot) + } + + member this.InvalidateConfiguration(options: FSharpProjectOptions, userOpName: string) : unit = + backgroundCompiler.InvalidateConfiguration(options, userOpName) + + member this.InvalidateConfiguration(projectSnapshot: FSharpProjectSnapshot, _userOpName: string) : unit = + let (FSharpProjectIdentifier(projectFileName, outputFileName)) = + projectSnapshot.Identifier + + this.Caches.Clear(Set.singleton (ProjectIdentifier(projectFileName, outputFileName))) + + member this.NotifyFileChanged(fileName: string, options: FSharpProjectOptions, userOpName: string) : Async = + backgroundCompiler.NotifyFileChanged(fileName, options, userOpName) + + member this.NotifyProjectCleaned(options: FSharpProjectOptions, userOpName: string) : Async = + backgroundCompiler.NotifyProjectCleaned(options, userOpName) + + member this.ParseAndCheckFileInProject + ( + fileName: string, + fileVersion: int, + sourceText: ISourceText, + options: FSharpProjectOptions, + userOpName: string + ) : Async = + async { + let! snapshot = FSharpProjectSnapshot.FromOptions(options, fileName, fileVersion, sourceText, documentSource) + + return! this.ParseAndCheckFileInProject(fileName, snapshot.ProjectSnapshot, userOpName) + } + + member this.ParseAndCheckFileInProject(fileName: string, projectSnapshot: FSharpProjectSnapshot, userOpName: string) = + this.ParseAndCheckFileInProject(fileName, projectSnapshot.ProjectSnapshot, userOpName) + + member this.ParseAndCheckProject(options: FSharpProjectOptions, userOpName: string) : Async = + async { + ignore userOpName + + let! snapshot = FSharpProjectSnapshot.FromOptions(options, documentSource) + + return! ComputeParseAndCheckProject snapshot.ProjectSnapshot + } + + member this.ParseAndCheckProject(projectSnapshot: FSharpProjectSnapshot, userOpName: string) : Async = + async { + ignore userOpName + return! ComputeParseAndCheckProject projectSnapshot.ProjectSnapshot + } + + member this.ParseFile(fileName, projectSnapshot, userOpName) = + this.ParseFile(fileName, projectSnapshot.ProjectSnapshot, userOpName) + + member this.ParseFile + ( + fileName: string, + sourceText: ISourceText, + options: FSharpParsingOptions, + cache: bool, + flatErrors: bool, + userOpName: string + ) : Async = + this.ParseFileWithoutProject(fileName, sourceText, options, cache, flatErrors, userOpName) + + member this.TryGetRecentCheckResultsForFile + ( + fileName: string, + options: FSharpProjectOptions, + sourceText: ISourceText option, + userOpName: string + ) : (FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option = + backgroundCompiler.TryGetRecentCheckResultsForFile(fileName, options, sourceText, userOpName) + + member this.TryGetRecentCheckResultsForFile + ( + fileName: string, + projectSnapshot: FSharpProjectSnapshot, + userOpName: string + ) : (FSharpParseFileResults * FSharpCheckFileResults) option = + TryGetRecentCheckResultsForFile(fileName, projectSnapshot, userOpName) diff --git a/src/fcs-fable/src/Compiler/Service/TransparentCompiler.fsi b/src/fcs-fable/src/Compiler/Service/TransparentCompiler.fsi new file mode 100644 index 0000000000..7746445c0a --- /dev/null +++ b/src/fcs-fable/src/Compiler/Service/TransparentCompiler.fsi @@ -0,0 +1,179 @@ +namespace FSharp.Compiler.CodeAnalysis.TransparentCompiler + +open Internal.Utilities.Collections + +open FSharp.Compiler.AbstractIL.ILBinaryReader +open FSharp.Compiler.BuildGraph +open FSharp.Compiler.CodeAnalysis +open FSharp.Compiler.CompilerConfig +open FSharp.Compiler.CompilerImports +open FSharp.Compiler.CheckBasics +open FSharp.Compiler.Diagnostics +open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.ScriptClosure +open FSharp.Compiler.Symbols +open FSharp.Compiler.TcGlobals +open FSharp.Compiler.Text +open FSharp.Compiler.ParseAndCheckInputs +open FSharp.Compiler.GraphChecking +open FSharp.Compiler.Syntax +open FSharp.Compiler.NameResolution +open FSharp.Compiler.TypedTree +open FSharp.Compiler.CheckDeclarations +open FSharp.Compiler.EditorServices + +/// Accumulated results of type checking. The minimum amount of state in order to continue type-checking following files. +[] +type internal TcInfo = + { + tcState: TcState + tcEnvAtEndOfFile: TcEnv + + /// Disambiguation table for module names + moduleNamesDict: ModuleNamesDict + + topAttribs: TopAttribs option + + latestCcuSigForFile: ModuleOrNamespaceType option + + /// Accumulated diagnostics, last file first + tcDiagnosticsRev: (PhasedDiagnostic * FSharpDiagnosticSeverity)[] list + + tcDependencyFiles: string list + + sigNameOpt: (string * QualifiedNameOfFile) option + + graphNode: NodeToTypeCheck option + + stateContainsNodes: Set + + sink: TcResultsSinkImpl list + } + +[] +type internal TcIntermediate = + { + finisher: Finisher + + /// Disambiguation table for module names + moduleNamesDict: ModuleNamesDict + + /// Accumulated diagnostics, last file first + tcDiagnosticsRev: (PhasedDiagnostic * FSharpDiagnosticSeverity) array list + tcDependencyFiles: string list + sink: TcResultsSinkImpl + } + +/// Things we need to start parsing and checking files for a given project snapshot +type internal BootstrapInfo = + { Id: int + AssemblyName: string + OutFile: string + TcConfig: TcConfig + TcImports: TcImports + TcGlobals: TcGlobals + InitialTcInfo: TcInfo + LoadedSources: (range * ProjectSnapshot.FSharpFileSnapshot) list + LoadClosure: LoadClosure option + LastFileName: string + ImportsInvalidatedByTypeProvider: Event } + +type internal TcIntermediateResult = TcInfo * TcResultsSinkImpl * CheckedImplFile option * string + +[] +type internal DependencyGraphType = + + /// A dependency graph for a single file - it will be missing files which this file does not depend on + | File + + /// A dependency graph for a project - it will contain all files in the project + | Project + +[] +type internal Extensions = + + [] + static member Key: + fileSnapshots: #ProjectSnapshot.IFileSnapshot list * ?extraKeyFlag: DependencyGraphType -> + ICacheKey<(DependencyGraphType option * byte array), string> + +type internal CompilerCaches = + + new: sizeFactor: int -> CompilerCaches + + member AssemblyData: AsyncMemoize<(string * string), (string * string), ProjectAssemblyDataResult> + + member BootstrapInfo: AsyncMemoize<(string * string), string, (BootstrapInfo option * FSharpDiagnostic array)> + + member BootstrapInfoStatic: + AsyncMemoize<(string * string), (string * string), (int * TcImports * TcGlobals * TcInfo * Event)> + + member DependencyGraph: + AsyncMemoize<(DependencyGraphType option * byte array), string, (Graph * Graph)> + + member FrameworkImports: AsyncMemoize + + member ItemKeyStore: AsyncMemoize<(string * (string * string)), string, ItemKeyStore option> + + member ParseAndCheckAllFilesInProject: AsyncMemoizeDisabled + + member ParseAndCheckFileInProject: + AsyncMemoize<(string * (string * string)), string * string, (FSharpParseFileResults * FSharpCheckFileAnswer)> + + member ParseAndCheckProject: AsyncMemoize<(string * string), string, FSharpCheckProjectResults> + + member ParseFile: + AsyncMemoize<((string * string) * string), (string * string * bool), ProjectSnapshot.FSharpParsedFile> + + member ParseFileWithoutProject: AsyncMemoize + + member ProjectExtras: AsyncMemoizeDisabled + + member SemanticClassification: AsyncMemoize<(string * (string * string)), string, SemanticClassificationView option> + + member SizeFactor: int + + member TcIntermediate: AsyncMemoize<(string * (string * string)), (string * int), TcIntermediate> + + member ScriptClosure: AsyncMemoize<(string * (string * string)), string, LoadClosure> + + member TcLastFile: AsyncMemoizeDisabled + +type internal TransparentCompiler = + interface IBackgroundCompiler + + new: + legacyReferenceResolver: LegacyReferenceResolver * + projectCacheSize: int * + keepAssemblyContents: bool * + keepAllBackgroundResolutions: bool * + tryGetMetadataSnapshot: ILReaderTryGetMetadataSnapshot * + suggestNamesForErrors: bool * + keepAllBackgroundSymbolUses: bool * + enableBackgroundItemKeyStoreAndSemanticClassification: bool * + enablePartialTypeChecking: bool * + parallelReferenceResolution: ParallelReferenceResolution * + captureIdentifiersWhenParsing: bool * + getSource: (string -> Async) option * + useChangeNotifications: bool -> + TransparentCompiler + + member FindReferencesInFile: + fileName: string * projectSnapshot: ProjectSnapshot.ProjectSnapshot * symbol: FSharpSymbol * userOpName: string -> + Async + + member GetAssemblyData: + projectSnapshot: ProjectSnapshot.ProjectSnapshot * fileName: string * _userOpName: string -> + Async + + member ParseAndCheckFileInProject: + fileName: string * projectSnapshot: ProjectSnapshot.ProjectSnapshot * userOpName: string -> + Async + + member ParseFile: + fileName: string * projectSnapshot: ProjectSnapshot.ProjectSnapshot * _userOpName: 'a -> + Async + + member SetCacheSizeFactor: sizeFactor: int -> unit + + member Caches: CompilerCaches diff --git a/src/fcs-fable/src/Compiler/Service/service.fs b/src/fcs-fable/src/Compiler/Service/service.fs index 0d00e832e4..83164c2d9f 100644 --- a/src/fcs-fable/src/Compiler/Service/service.fs +++ b/src/fcs-fable/src/Compiler/Service/service.fs @@ -19,6 +19,9 @@ open FSharp.Compiler.AbstractIL.ILBinaryReader open FSharp.Compiler.AbstractIL.ILDynamicAssemblyWriter #endif open FSharp.Compiler.CodeAnalysis +#if !FABLE_COMPILER +open FSharp.Compiler.CodeAnalysis.TransparentCompiler +#endif open FSharp.Compiler.CompilerConfig open FSharp.Compiler.CompilerDiagnostics open FSharp.Compiler.CompilerImports @@ -42,70 +45,12 @@ open FSharp.Compiler.Text.Range open FSharp.Compiler.TcGlobals open FSharp.Compiler.BuildGraph -[] -module EnvMisc = - let braceMatchCacheSize = GetEnvInteger "FCS_BraceMatchCacheSize" 5 - let parseFileCacheSize = GetEnvInteger "FCS_ParseFileCacheSize" 2 - let checkFileInProjectCacheSize = GetEnvInteger "FCS_CheckFileInProjectCacheSize" 10 - - let projectCacheSizeDefault = GetEnvInteger "FCS_ProjectCacheSizeDefault" 3 - let frameworkTcImportsCacheStrongSize = GetEnvInteger "FCS_frameworkTcImportsCacheStrongSizeDefault" 8 - #if !FABLE_COMPILER -//---------------------------------------------------------------------------- -// BackgroundCompiler -// - -[] -type DocumentSource = - | FileSystem - | Custom of (string -> Async) - /// Callback that indicates whether a requested result has become obsolete. [] type IsResultObsolete = IsResultObsolete of (unit -> bool) -[] -module Helpers = - - /// Determine whether two (fileName,options) keys are identical w.r.t. affect on checking - let AreSameForChecking2 ((fileName1: string, options1: FSharpProjectOptions), (fileName2, options2)) = - (fileName1 = fileName2) - && FSharpProjectOptions.AreSameForChecking(options1, options2) - - /// Determine whether two (fileName,options) keys should be identical w.r.t. resource usage - let AreSubsumable2 ((fileName1: string, o1: FSharpProjectOptions), (fileName2: string, o2: FSharpProjectOptions)) = - (fileName1 = fileName2) && FSharpProjectOptions.UseSameProject(o1, o2) - - /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. parsing - let AreSameForParsing ((fileName1: string, source1Hash: int64, options1), (fileName2, source2Hash, options2)) = - fileName1 = fileName2 && options1 = options2 && source1Hash = source2Hash - - let AreSimilarForParsing ((fileName1, _, _), (fileName2, _, _)) = fileName1 = fileName2 - - /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. checking - let AreSameForChecking3 ((fileName1: string, source1Hash: int64, options1: FSharpProjectOptions), (fileName2, source2Hash, options2)) = - (fileName1 = fileName2) - && FSharpProjectOptions.AreSameForChecking(options1, options2) - && source1Hash = source2Hash - - /// Determine whether two (fileName,sourceText,options) keys should be identical w.r.t. resource usage - let AreSubsumable3 ((fileName1: string, _, o1: FSharpProjectOptions), (fileName2: string, _, o2: FSharpProjectOptions)) = - (fileName1 = fileName2) && FSharpProjectOptions.UseSameProject(o1, o2) - - /// If a symbol is an attribute check if given set of names contains its name without the Attribute suffix - let rec NamesContainAttribute (symbol: FSharpSymbol) names = - match symbol with - | :? FSharpMemberOrFunctionOrValue as mofov -> - mofov.DeclaringEntity - |> Option.map (fun entity -> NamesContainAttribute entity names) - |> Option.defaultValue false - | :? FSharpEntity as entity when entity.IsAttributeType && symbol.DisplayNameCore.EndsWithOrdinal "Attribute" -> - let nameWithoutAttribute = String.dropSuffix symbol.DisplayNameCore "Attribute" - names |> Set.contains nameWithoutAttribute - | _ -> false - module CompileHelpers = let mkCompilationDiagnosticsHandlers (flatErrors) = let diagnostics = ResizeArray<_>() @@ -137,10 +82,10 @@ module CompileHelpers = try f exiter - 0 + None with e -> stopProcessingRecovery e range0 - 1 + Some e /// Compile using the given flags. Source files names are resolved via the FileSystem API. The output file must be given by a -o flag. let compileFromArgs (ctok, argv: string[], legacyReferenceResolver, tcImportsCapture, dynamicAssemblyCreator) = @@ -165,1198 +110,6 @@ module CompileHelpers = diagnostics.ToArray(), result - let setOutputStreams execute = - // Set the output streams, if requested - match execute with - | Some(writer, error) -> - Console.SetOut writer - Console.SetError error - | None -> () - -type SourceTextHash = int64 -type CacheStamp = int64 -type FileName = string -type FilePath = string -type ProjectPath = string -type FileVersion = int - -type ParseCacheLockToken() = - interface LockToken - -type ScriptClosureCacheToken() = - interface LockToken - -type CheckFileCacheKey = FileName * SourceTextHash * FSharpProjectOptions -type CheckFileCacheValue = FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash * DateTime - -// There is only one instance of this type, held in FSharpChecker -type BackgroundCompiler - ( - legacyReferenceResolver, - projectCacheSize, - keepAssemblyContents, - keepAllBackgroundResolutions, - tryGetMetadataSnapshot, - suggestNamesForErrors, - keepAllBackgroundSymbolUses, - enableBackgroundItemKeyStoreAndSemanticClassification, - enablePartialTypeChecking, - parallelReferenceResolution, - captureIdentifiersWhenParsing, - getSource: (string -> Async) option, - useChangeNotifications, - useSyntaxTreeCache - ) as self = - - let beforeFileChecked = Event() - let fileParsed = Event() - let fileChecked = Event() - let projectChecked = Event() - - // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.backgroundCompiler.scriptClosureCache - /// Information about the derived script closure. - let scriptClosureCache = - MruCache( - projectCacheSize, - areSame = FSharpProjectOptions.AreSameForChecking, - areSimilar = FSharpProjectOptions.UseSameProject - ) - - let frameworkTcImportsCache = FrameworkImportsCache(frameworkTcImportsCacheStrongSize) - - // We currently share one global dependency provider for all scripts for the FSharpChecker. - // For projects, one is used per project. - // - // Sharing one for all scripts is necessary for good performance from GetProjectOptionsFromScript, - // which requires a dependency provider to process through the project options prior to working out - // if the cached incremental builder can be used for the project. - let dependencyProviderForScripts = new DependencyProvider() - - let getProjectReferences (options: FSharpProjectOptions) userOpName = - [ - for r in options.ReferencedProjects do - - match r with - | FSharpReferencedProject.FSharpReference(nm, opts) -> - // Don't use cross-project references for FSharp.Core, since various bits of code - // require a concrete FSharp.Core to exist on-disk. The only solutions that have - // these cross-project references to FSharp.Core are VisualFSharp.sln and FSharp.sln. The ramification - // of this is that you need to build FSharp.Core to get intellisense in those projects. - - if - (try - Path.GetFileNameWithoutExtension(nm) - with _ -> - "") - <> GetFSharpCoreLibraryName() - then - { new IProjectReference with - member x.EvaluateRawContents() = - node { - Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "GetAssemblyData", nm) - return! self.GetAssemblyData(opts, userOpName + ".CheckReferencedProject(" + nm + ")") - } - - member x.TryGetLogicalTimeStamp(cache) = - self.TryGetLogicalTimeStampForProject(cache, opts) - - member x.FileName = nm - } - - | FSharpReferencedProject.PEReference(getStamp, delayedReader) -> - { new IProjectReference with - member x.EvaluateRawContents() = - node { - let! ilReaderOpt = delayedReader.TryGetILModuleReader() |> NodeCode.FromCancellable - - match ilReaderOpt with - | Some ilReader -> - let ilModuleDef, ilAsmRefs = ilReader.ILModuleDef, ilReader.ILAssemblyRefs - let data = RawFSharpAssemblyData(ilModuleDef, ilAsmRefs) :> IRawFSharpAssemblyData - return ProjectAssemblyDataResult.Available data - | _ -> - // Note 'false' - if a PEReference doesn't find an ILModuleReader then we don't - // continue to try to use an on-disk DLL - return ProjectAssemblyDataResult.Unavailable false - } - - member x.TryGetLogicalTimeStamp _ = getStamp () |> Some - member x.FileName = delayedReader.OutputFile - } - - | FSharpReferencedProject.ILModuleReference(nm, getStamp, getReader) -> - { new IProjectReference with - member x.EvaluateRawContents() = - cancellable { - let ilReader = getReader () - let ilModuleDef, ilAsmRefs = ilReader.ILModuleDef, ilReader.ILAssemblyRefs - let data = RawFSharpAssemblyData(ilModuleDef, ilAsmRefs) :> IRawFSharpAssemblyData - return ProjectAssemblyDataResult.Available data - } - |> NodeCode.FromCancellable - - member x.TryGetLogicalTimeStamp _ = getStamp () |> Some - member x.FileName = nm - } - ] - - /// CreateOneIncrementalBuilder (for background type checking). Note that fsc.fs also - /// creates an incremental builder used by the command line compiler. - let CreateOneIncrementalBuilder (options: FSharpProjectOptions, userOpName) = - node { - use _ = - Activity.start "BackgroundCompiler.CreateOneIncrementalBuilder" [| Activity.Tags.project, options.ProjectFileName |] - - Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "CreateOneIncrementalBuilder", options.ProjectFileName) - let projectReferences = getProjectReferences options userOpName - - let loadClosure = scriptClosureCache.TryGet(AnyCallerThread, options) - - let dependencyProvider = - if options.UseScriptResolutionRules then - Some dependencyProviderForScripts - else - None - - let! builderOpt, diagnostics = - IncrementalBuilder.TryCreateIncrementalBuilderForProjectOptions( - legacyReferenceResolver, - FSharpCheckerResultsSettings.defaultFSharpBinariesDir, - frameworkTcImportsCache, - loadClosure, - Array.toList options.SourceFiles, - Array.toList options.OtherOptions, - projectReferences, - options.ProjectDirectory, - options.UseScriptResolutionRules, - keepAssemblyContents, - keepAllBackgroundResolutions, - tryGetMetadataSnapshot, - suggestNamesForErrors, - keepAllBackgroundSymbolUses, - enableBackgroundItemKeyStoreAndSemanticClassification, - enablePartialTypeChecking, - dependencyProvider, - parallelReferenceResolution, - captureIdentifiersWhenParsing, - getSource, - useChangeNotifications, - useSyntaxTreeCache - ) - - match builderOpt with - | None -> () - | Some builder -> - -#if !NO_TYPEPROVIDERS - // Register the behaviour that responds to CCUs being invalidated because of type - // provider Invalidate events. This invalidates the configuration in the build. - builder.ImportsInvalidatedByTypeProvider.Add(fun () -> self.InvalidateConfiguration(options, userOpName)) -#endif - - // Register the callback called just before a file is typechecked by the background builder (without recording - // errors or intellisense information). - // - // This indicates to the UI that the file type check state is dirty. If the file is open and visible then - // the UI will sooner or later request a typecheck of the file, recording errors and intellisense information. - builder.BeforeFileChecked.Add(fun file -> beforeFileChecked.Trigger(file, options)) - builder.FileParsed.Add(fun file -> fileParsed.Trigger(file, options)) - builder.FileChecked.Add(fun file -> fileChecked.Trigger(file, options)) - builder.ProjectChecked.Add(fun () -> projectChecked.Trigger options) - - return (builderOpt, diagnostics) - } - - let parseCacheLock = Lock() - - // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.parseFileInProjectCache. Most recently used cache for parsing files. - let parseFileCache = - MruCache(parseFileCacheSize, areSimilar = AreSimilarForParsing, areSame = AreSameForParsing) - - // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.checkFileInProjectCache - // - /// Cache which holds recently seen type-checks. - /// This cache may hold out-of-date entries, in two senses - /// - there may be a more recent antecedent state available because the background build has made it available - /// - the source for the file may have changed - - // Also keyed on source. This can only be out of date if the antecedent is out of date - let checkFileInProjectCache = - MruCache>( - keepStrongly = checkFileInProjectCacheSize, - areSame = AreSameForChecking3, - areSimilar = AreSubsumable3 - ) - - // STATIC ROOT: FSharpLanguageServiceTestable.FSharpChecker.backgroundCompiler.incrementalBuildersCache. This root typically holds more - // live information than anything else in the F# Language Service, since it holds up to 3 (projectCacheStrongSize) background project builds - // strongly. - // - /// Cache of builds keyed by options. - let gate = obj () - - let incrementalBuildersCache = - MruCache>( - keepStrongly = projectCacheSize, - keepMax = projectCacheSize, - areSame = FSharpProjectOptions.AreSameForChecking, - areSimilar = FSharpProjectOptions.UseSameProject - ) - - let tryGetBuilderNode options = - incrementalBuildersCache.TryGet(AnyCallerThread, options) - - let tryGetBuilder options : NodeCode option = - tryGetBuilderNode options |> Option.map (fun x -> x.GetOrComputeValue()) - - let tryGetSimilarBuilder options : NodeCode option = - incrementalBuildersCache.TryGetSimilar(AnyCallerThread, options) - |> Option.map (fun x -> x.GetOrComputeValue()) - - let tryGetAnyBuilder options : NodeCode option = - incrementalBuildersCache.TryGetAny(AnyCallerThread, options) - |> Option.map (fun x -> x.GetOrComputeValue()) - - let createBuilderNode (options, userOpName, ct: CancellationToken) = - lock gate (fun () -> - if ct.IsCancellationRequested then - GraphNode.FromResult(None, [||]) - else - let getBuilderNode = GraphNode(CreateOneIncrementalBuilder(options, userOpName)) - incrementalBuildersCache.Set(AnyCallerThread, options, getBuilderNode) - getBuilderNode) - - let createAndGetBuilder (options, userOpName) = - node { - let! ct = NodeCode.CancellationToken - let getBuilderNode = createBuilderNode (options, userOpName, ct) - return! getBuilderNode.GetOrComputeValue() - } - - let getOrCreateBuilder (options, userOpName) : NodeCode = - match tryGetBuilder options with - | Some getBuilder -> - node { - match! getBuilder with - | builderOpt, creationDiags when builderOpt.IsNone || not builderOpt.Value.IsReferencesInvalidated -> return builderOpt, creationDiags - | _ -> - // The builder could be re-created, - // clear the check file caches that are associated with it. - // We must do this in order to not return stale results when references - // in the project get changed/added/removed. - parseCacheLock.AcquireLock(fun ltok -> - options.SourceFiles - |> Array.iter (fun sourceFile -> - let key = (sourceFile, 0L, options) - checkFileInProjectCache.RemoveAnySimilar(ltok, key))) - - return! createAndGetBuilder (options, userOpName) - } - | _ -> createAndGetBuilder (options, userOpName) - - let getSimilarOrCreateBuilder (options, userOpName) = - match tryGetSimilarBuilder options with - | Some res -> res - // The builder does not exist at all. Create it. - | None -> getOrCreateBuilder (options, userOpName) - - let getOrCreateBuilderWithInvalidationFlag (options, canInvalidateProject, userOpName) = - if canInvalidateProject then - getOrCreateBuilder (options, userOpName) - else - getSimilarOrCreateBuilder (options, userOpName) - - let getAnyBuilder (options, userOpName) = - match tryGetAnyBuilder options with - | Some getBuilder -> getBuilder - | _ -> getOrCreateBuilder (options, userOpName) - - static let mutable actualParseFileCount = 0 - - static let mutable actualCheckFileCount = 0 - - /// Should be a fast operation. Ensures that we have only one async lazy object per file and its hash. - let getCheckFileNode (parseResults, sourceText, fileName, options, _fileVersion, builder, tcPrior, tcInfo, creationDiags) = - - // Here we lock for the creation of the node, not its execution - parseCacheLock.AcquireLock(fun ltok -> - let key = (fileName, sourceText.GetHashCode() |> int64, options) - - match checkFileInProjectCache.TryGet(ltok, key) with - | Some res -> res - | _ -> - let res = - GraphNode( - node { - let! res = self.CheckOneFileImplAux(parseResults, sourceText, fileName, options, builder, tcPrior, tcInfo, creationDiags) - Interlocked.Increment(&actualCheckFileCount) |> ignore - return res - } - ) - - checkFileInProjectCache.Set(ltok, key, res) - res) - - member _.ParseFile(fileName: string, sourceText: ISourceText, options: FSharpParsingOptions, cache: bool, flatErrors: bool, userOpName: string) = - async { - use _ = - Activity.start - "BackgroundCompiler.ParseFile" - [| - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - Activity.Tags.cache, cache.ToString() - |] - - let! ct = Async.CancellationToken - use _ = Cancellable.UsingToken(ct) - - if cache then - let hash = sourceText.GetHashCode() |> int64 - - match parseCacheLock.AcquireLock(fun ltok -> parseFileCache.TryGet(ltok, (fileName, hash, options))) with - | Some res -> return res - | None -> - Interlocked.Increment(&actualParseFileCount) |> ignore - let! ct = Async.CancellationToken - - let parseDiagnostics, parseTree, anyErrors = - ParseAndCheckFile.parseFile ( - sourceText, - fileName, - options, - userOpName, - suggestNamesForErrors, - flatErrors, - captureIdentifiersWhenParsing, - ct - ) - - let res = FSharpParseFileResults(parseDiagnostics, parseTree, anyErrors, options.SourceFiles) - parseCacheLock.AcquireLock(fun ltok -> parseFileCache.Set(ltok, (fileName, hash, options), res)) - return res - else - let! ct = Async.CancellationToken - - let parseDiagnostics, parseTree, anyErrors = - ParseAndCheckFile.parseFile (sourceText, fileName, options, userOpName, false, flatErrors, captureIdentifiersWhenParsing, ct) - - return FSharpParseFileResults(parseDiagnostics, parseTree, anyErrors, options.SourceFiles) - } - - /// Fetch the parse information from the background compiler (which checks w.r.t. the FileSystem API) - member _.GetBackgroundParseResultsForFileInProject(fileName, options, userOpName) = - node { - use _ = - Activity.start - "BackgroundCompiler.GetBackgroundParseResultsForFileInProject" - [| Activity.Tags.fileName, fileName; Activity.Tags.userOpName, userOpName |] - - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> - let parseTree = EmptyParsedInput(fileName, (false, false)) - return FSharpParseFileResults(creationDiags, parseTree, true, [||]) - | Some builder -> - let parseTree, _, _, parseDiagnostics = builder.GetParseResultsForFile fileName - - let parseDiagnostics = - DiagnosticHelpers.CreateDiagnostics( - builder.TcConfig.diagnosticsOptions, - false, - fileName, - parseDiagnostics, - suggestNamesForErrors, - builder.TcConfig.flatErrors, - None - ) - - let diagnostics = [| yield! creationDiags; yield! parseDiagnostics |] - - let parseResults = - FSharpParseFileResults( - diagnostics = diagnostics, - input = parseTree, - parseHadErrors = false, - dependencyFiles = builder.AllDependenciesDeprecated - ) - - return parseResults - } - - member _.GetCachedCheckFileResult(builder: IncrementalBuilder, fileName, sourceText: ISourceText, options) = - node { - use _ = - Activity.start "BackgroundCompiler.GetCachedCheckFileResult" [| Activity.Tags.fileName, fileName |] - - let hash = sourceText.GetHashCode() |> int64 - let key = (fileName, hash, options) - let cachedResultsOpt = parseCacheLock.AcquireLock(fun ltok -> checkFileInProjectCache.TryGet(ltok, key)) - - match cachedResultsOpt with - | Some cachedResults -> - match! cachedResults.GetOrComputeValue() with - | parseResults, checkResults, _, priorTimeStamp when - (match builder.GetCheckResultsBeforeFileInProjectEvenIfStale fileName with - | None -> false - | Some(tcPrior) -> - tcPrior.ProjectTimeStamp = priorTimeStamp - && builder.AreCheckResultsBeforeFileInProjectReady(fileName)) - -> - return Some(parseResults, checkResults) - | _ -> - parseCacheLock.AcquireLock(fun ltok -> checkFileInProjectCache.RemoveAnySimilar(ltok, key)) - return None - | _ -> return None - } - - member private _.CheckOneFileImplAux - ( - parseResults: FSharpParseFileResults, - sourceText: ISourceText, - fileName: string, - options: FSharpProjectOptions, - builder: IncrementalBuilder, - tcPrior: PartialCheckResults, - tcInfo: TcInfo, - creationDiags: FSharpDiagnostic[] - ) : NodeCode = - - node { - // Get additional script #load closure information if applicable. - // For scripts, this will have been recorded by GetProjectOptionsFromScript. - let tcConfig = tcPrior.TcConfig - let loadClosure = scriptClosureCache.TryGet(AnyCallerThread, options) - - let! checkAnswer = - FSharpCheckFileResults.CheckOneFile( - parseResults, - sourceText, - fileName, - options.ProjectFileName, - tcConfig, - tcPrior.TcGlobals, - tcPrior.TcImports, - tcInfo.tcState, - tcInfo.moduleNamesDict, - loadClosure, - tcInfo.TcDiagnostics, - options.IsIncompleteTypeCheckEnvironment, - options, - builder, - Array.ofList tcInfo.tcDependencyFiles, - creationDiags, - parseResults.Diagnostics, - keepAssemblyContents, - suggestNamesForErrors - ) - |> NodeCode.FromCancellable - - GraphNode.SetPreferredUILang tcConfig.preferredUiLang - return (parseResults, checkAnswer, sourceText.GetHashCode() |> int64, tcPrior.ProjectTimeStamp) - } - - member private bc.CheckOneFileImpl - ( - parseResults: FSharpParseFileResults, - sourceText: ISourceText, - fileName: string, - options: FSharpProjectOptions, - fileVersion: int, - builder: IncrementalBuilder, - tcPrior: PartialCheckResults, - tcInfo: TcInfo, - creationDiags: FSharpDiagnostic[] - ) = - - node { - match! bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) with - | Some(_, results) -> return FSharpCheckFileAnswer.Succeeded results - | _ -> - let lazyCheckFile = - getCheckFileNode (parseResults, sourceText, fileName, options, fileVersion, builder, tcPrior, tcInfo, creationDiags) - - let! _, results, _, _ = lazyCheckFile.GetOrComputeValue() - return FSharpCheckFileAnswer.Succeeded results - } - - /// Type-check the result obtained by parsing, but only if the antecedent type checking context is available. - member bc.CheckFileInProjectAllowingStaleCachedResults - ( - parseResults: FSharpParseFileResults, - fileName, - fileVersion, - sourceText: ISourceText, - options, - userOpName - ) = - node { - use _ = - Activity.start - "BackgroundCompiler.CheckFileInProjectAllowingStaleCachedResults" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - |] - - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! cachedResults = - node { - let! builderOpt, creationDiags = getAnyBuilder (options, userOpName) - - match builderOpt with - | Some builder -> - match! bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) with - | Some(_, checkResults) -> return Some(builder, creationDiags, Some(FSharpCheckFileAnswer.Succeeded checkResults)) - | _ -> return Some(builder, creationDiags, None) - | _ -> return None // the builder wasn't ready - } - - match cachedResults with - | None -> return None - | Some(_, _, Some x) -> return Some x - | Some(builder, creationDiags, None) -> - Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "CheckFileInProjectAllowingStaleCachedResults.CacheMiss", fileName) - - match builder.GetCheckResultsBeforeFileInProjectEvenIfStale fileName with - | Some tcPrior -> - match tcPrior.TryPeekTcInfo() with - | Some tcInfo -> - let! checkResults = - bc.CheckOneFileImpl(parseResults, sourceText, fileName, options, fileVersion, builder, tcPrior, tcInfo, creationDiags) - - return Some checkResults - | None -> return None - | None -> return None // the incremental builder was not up to date - } - - /// Type-check the result obtained by parsing. Force the evaluation of the antecedent type checking context if needed. - member bc.CheckFileInProject(parseResults: FSharpParseFileResults, fileName, fileVersion, sourceText: ISourceText, options, userOpName) = - node { - use _ = - Activity.start - "BackgroundCompiler.CheckFileInProject" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - |] - - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> return FSharpCheckFileAnswer.Succeeded(FSharpCheckFileResults.MakeEmpty(fileName, creationDiags, keepAssemblyContents)) - | Some builder -> - // Check the cache. We can only use cached results when there is no work to do to bring the background builder up-to-date - let! cachedResults = bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) - - match cachedResults with - | Some(_, checkResults) -> return FSharpCheckFileAnswer.Succeeded checkResults - | _ -> - let! tcPrior = builder.GetCheckResultsBeforeFileInProject fileName - let! tcInfo = tcPrior.GetOrComputeTcInfo() - return! bc.CheckOneFileImpl(parseResults, sourceText, fileName, options, fileVersion, builder, tcPrior, tcInfo, creationDiags) - } - - /// Parses and checks the source file and returns untyped AST and check results. - member bc.ParseAndCheckFileInProject(fileName: string, fileVersion, sourceText: ISourceText, options: FSharpProjectOptions, userOpName) = - node { - use _ = - Activity.start - "BackgroundCompiler.ParseAndCheckFileInProject" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - |] - - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> - let parseTree = EmptyParsedInput(fileName, (false, false)) - let parseResults = FSharpParseFileResults(creationDiags, parseTree, true, [||]) - return (parseResults, FSharpCheckFileAnswer.Aborted) - - | Some builder -> - let! cachedResults = bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) - - match cachedResults with - | Some(parseResults, checkResults) -> return (parseResults, FSharpCheckFileAnswer.Succeeded checkResults) - | _ -> - let! tcPrior = builder.GetCheckResultsBeforeFileInProject fileName - let! tcInfo = tcPrior.GetOrComputeTcInfo() - // Do the parsing. - let parsingOptions = - FSharpParsingOptions.FromTcConfig(builder.TcConfig, Array.ofList builder.SourceFiles, options.UseScriptResolutionRules) - - GraphNode.SetPreferredUILang tcPrior.TcConfig.preferredUiLang - let! ct = NodeCode.CancellationToken - - let parseDiagnostics, parseTree, anyErrors = - ParseAndCheckFile.parseFile ( - sourceText, - fileName, - parsingOptions, - userOpName, - suggestNamesForErrors, - builder.TcConfig.flatErrors, - captureIdentifiersWhenParsing, - ct - ) - - let parseResults = - FSharpParseFileResults(parseDiagnostics, parseTree, anyErrors, builder.AllDependenciesDeprecated) - - let! checkResults = - bc.CheckOneFileImpl(parseResults, sourceText, fileName, options, fileVersion, builder, tcPrior, tcInfo, creationDiags) - - return (parseResults, checkResults) - } - - member _.NotifyFileChanged(fileName, options, userOpName) = - node { - use _ = - Activity.start - "BackgroundCompiler.NotifyFileChanged" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - |] - - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! builderOpt, _ = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> return () - | Some builder -> do! builder.NotifyFileChanged(fileName, DateTime.UtcNow) - } - - /// Fetch the check information from the background compiler (which checks w.r.t. the FileSystem API) - member _.GetBackgroundCheckResultsForFileInProject(fileName, options, userOpName) = - node { - use _ = - Activity.start - "BackgroundCompiler.ParseAndCheckFileInProject" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - |] - - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> - let parseTree = EmptyParsedInput(fileName, (false, false)) - let parseResults = FSharpParseFileResults(creationDiags, parseTree, true, [||]) - let typedResults = FSharpCheckFileResults.MakeEmpty(fileName, creationDiags, true) - return (parseResults, typedResults) - | Some builder -> - let parseTree, _, _, parseDiagnostics = builder.GetParseResultsForFile fileName - let! tcProj = builder.GetFullCheckResultsAfterFileInProject fileName - - let! tcInfo, tcInfoExtras = tcProj.GetOrComputeTcInfoWithExtras() - - let tcResolutions = tcInfoExtras.tcResolutions - let tcSymbolUses = tcInfoExtras.tcSymbolUses - let tcOpenDeclarations = tcInfoExtras.tcOpenDeclarations - let latestCcuSigForFile = tcInfo.latestCcuSigForFile - let tcState = tcInfo.tcState - let tcEnvAtEnd = tcInfo.tcEnvAtEndOfFile - let latestImplementationFile = tcInfoExtras.latestImplFile - let tcDependencyFiles = tcInfo.tcDependencyFiles - let tcDiagnostics = tcInfo.TcDiagnostics - let diagnosticsOptions = builder.TcConfig.diagnosticsOptions - - let symbolEnv = - SymbolEnv(tcProj.TcGlobals, tcInfo.tcState.Ccu, Some tcInfo.tcState.CcuSig, tcProj.TcImports) - |> Some - - let parseDiagnostics = - DiagnosticHelpers.CreateDiagnostics( - diagnosticsOptions, - false, - fileName, - parseDiagnostics, - suggestNamesForErrors, - builder.TcConfig.flatErrors, - None - ) - - let parseDiagnostics = [| yield! creationDiags; yield! parseDiagnostics |] - - let tcDiagnostics = - DiagnosticHelpers.CreateDiagnostics( - diagnosticsOptions, - false, - fileName, - tcDiagnostics, - suggestNamesForErrors, - builder.TcConfig.flatErrors, - symbolEnv - ) - - let tcDiagnostics = [| yield! creationDiags; yield! tcDiagnostics |] - - let parseResults = - FSharpParseFileResults( - diagnostics = parseDiagnostics, - input = parseTree, - parseHadErrors = false, - dependencyFiles = builder.AllDependenciesDeprecated - ) - - let loadClosure = scriptClosureCache.TryGet(AnyCallerThread, options) - - let typedResults = - FSharpCheckFileResults.Make( - fileName, - options.ProjectFileName, - tcProj.TcConfig, - tcProj.TcGlobals, - options.IsIncompleteTypeCheckEnvironment, - builder, - options, - Array.ofList tcDependencyFiles, - creationDiags, - parseResults.Diagnostics, - tcDiagnostics, - keepAssemblyContents, - Option.get latestCcuSigForFile, - tcState.Ccu, - tcProj.TcImports, - tcEnvAtEnd.AccessRights, - tcResolutions, - tcSymbolUses, - tcEnvAtEnd.NameEnv, - loadClosure, - latestImplementationFile, - tcOpenDeclarations - ) - - return (parseResults, typedResults) - } - - member _.FindReferencesInFile - ( - fileName: string, - options: FSharpProjectOptions, - symbol: FSharpSymbol, - canInvalidateProject: bool, - userOpName: string - ) = - node { - use _ = - Activity.start - "BackgroundCompiler.FindReferencesInFile" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - "symbol", symbol.FullName - |] - - let! builderOpt, _ = getOrCreateBuilderWithInvalidationFlag (options, canInvalidateProject, userOpName) - - match builderOpt with - | None -> return Seq.empty - | Some builder -> - if builder.ContainsFile fileName then - let! checkResults = builder.GetFullCheckResultsAfterFileInProject fileName - let! keyStoreOpt = checkResults.GetOrComputeItemKeyStoreIfEnabled() - - match keyStoreOpt with - | None -> return Seq.empty - | Some reader -> return reader.FindAll symbol.Item - else - return Seq.empty - } - - member _.GetSemanticClassificationForFile(fileName: string, options: FSharpProjectOptions, userOpName: string) = - node { - use _ = - Activity.start - "BackgroundCompiler.GetSemanticClassificationForFile" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, userOpName - |] - - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! builderOpt, _ = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> return None - | Some builder -> - let! checkResults = builder.GetFullCheckResultsAfterFileInProject fileName - let! scopt = checkResults.GetOrComputeSemanticClassificationIfEnabled() - - match scopt with - | None -> return None - | Some sc -> return Some(sc.GetView()) - } - - /// Try to get recent approximate type check results for a file. - member _.TryGetRecentCheckResultsForFile(fileName: string, options: FSharpProjectOptions, sourceText: ISourceText option, _userOpName: string) = - use _ = - Activity.start - "BackgroundCompiler.GetSemanticClassificationForFile" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.fileName, fileName - Activity.Tags.userOpName, _userOpName - |] - - match sourceText with - | Some sourceText -> - let hash = sourceText.GetHashCode() |> int64 - - let resOpt = - parseCacheLock.AcquireLock(fun ltok -> checkFileInProjectCache.TryGet(ltok, (fileName, hash, options))) - - match resOpt with - | Some res -> - match res.TryPeekValue() with - | ValueSome(a, b, c, _) -> Some(a, b, c) - | ValueNone -> None - | None -> None - | None -> None - - /// Parse and typecheck the whole project (the implementation, called recursively as project graph is evaluated) - member private _.ParseAndCheckProjectImpl(options, userOpName) = - node { - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! builderOpt, creationDiags = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> - let emptyResults = - FSharpCheckProjectResults(options.ProjectFileName, None, keepAssemblyContents, creationDiags, None) - - return emptyResults - | Some builder -> - let! tcProj, ilAssemRef, tcAssemblyDataOpt, tcAssemblyExprOpt = builder.GetFullCheckResultsAndImplementationsForProject() - let diagnosticsOptions = tcProj.TcConfig.diagnosticsOptions - let fileName = DummyFileNameForRangesWithoutASpecificLocation - - // Although we do not use 'tcInfoExtras', computing it will make sure we get an extra info. - let! tcInfo, _tcInfoExtras = tcProj.GetOrComputeTcInfoWithExtras() - - let topAttribs = tcInfo.topAttribs - let tcState = tcInfo.tcState - let tcEnvAtEnd = tcInfo.tcEnvAtEndOfFile - let tcDiagnostics = tcInfo.TcDiagnostics - let tcDependencyFiles = tcInfo.tcDependencyFiles - - let symbolEnv = - SymbolEnv(tcProj.TcGlobals, tcInfo.tcState.Ccu, Some tcInfo.tcState.CcuSig, tcProj.TcImports) - |> Some - - let tcDiagnostics = - DiagnosticHelpers.CreateDiagnostics( - diagnosticsOptions, - true, - fileName, - tcDiagnostics, - suggestNamesForErrors, - builder.TcConfig.flatErrors, - symbolEnv - ) - - let diagnostics = [| yield! creationDiags; yield! tcDiagnostics |] - - let getAssemblyData () = - match tcAssemblyDataOpt with - | ProjectAssemblyDataResult.Available data -> Some data - | _ -> None - - let details = - (tcProj.TcGlobals, - tcProj.TcImports, - tcState.Ccu, - tcState.CcuSig, - Choice1Of2 builder, - topAttribs, - getAssemblyData, - ilAssemRef, - tcEnvAtEnd.AccessRights, - tcAssemblyExprOpt, - Array.ofList tcDependencyFiles, - options) - - let results = - FSharpCheckProjectResults(options.ProjectFileName, Some tcProj.TcConfig, keepAssemblyContents, diagnostics, Some details) - - return results - } - - member _.GetAssemblyData(options, userOpName) = - node { - use _ = - Activity.start - "BackgroundCompiler.GetAssemblyData" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.userOpName, userOpName - |] - - let! builderOpt, _ = getOrCreateBuilder (options, userOpName) - - match builderOpt with - | None -> return ProjectAssemblyDataResult.Unavailable true - | Some builder -> - let! _, _, tcAssemblyDataOpt, _ = builder.GetCheckResultsAndImplementationsForProject() - return tcAssemblyDataOpt - } - - /// Get the timestamp that would be on the output if fully built immediately - member private _.TryGetLogicalTimeStampForProject(cache, options) = - match tryGetBuilderNode options with - | Some lazyWork -> - match lazyWork.TryPeekValue() with - | ValueSome(Some builder, _) -> Some(builder.GetLogicalTimeStampForProject(cache)) - | _ -> None - | _ -> None - - /// Parse and typecheck the whole project. - member bc.ParseAndCheckProject(options, userOpName) = - use _ = - Activity.start - "BackgroundCompiler.ParseAndCheckProject" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.userOpName, userOpName - |] - - bc.ParseAndCheckProjectImpl(options, userOpName) - - member _.GetProjectOptionsFromScript - ( - fileName, - sourceText, - previewEnabled, - loadedTimeStamp, - otherFlags, - useFsiAuxLib: bool option, - useSdkRefs: bool option, - sdkDirOverride: string option, - assumeDotNetFramework: bool option, - optionsStamp: int64 option, - _userOpName - ) = - use _ = - Activity.start - "BackgroundCompiler.GetProjectOptionsFromScript" - [| Activity.Tags.fileName, fileName; Activity.Tags.userOpName, _userOpName |] - - cancellable { - // Do we add a reference to FSharp.Compiler.Interactive.Settings by default? - let useFsiAuxLib = defaultArg useFsiAuxLib true - let useSdkRefs = defaultArg useSdkRefs true - let reduceMemoryUsage = ReduceMemoryFlag.Yes - let previewEnabled = defaultArg previewEnabled false - - // Do we assume .NET Framework references for scripts? - let assumeDotNetFramework = defaultArg assumeDotNetFramework true - - let! ct = Cancellable.token () - use _ = Cancellable.UsingToken(ct) - - let extraFlags = - if previewEnabled then - [| "--langversion:preview" |] - else - [||] - - let otherFlags = defaultArg otherFlags extraFlags - - use diagnostics = new DiagnosticsScope(otherFlags |> Array.contains "--flaterrors") - - let useSimpleResolution = otherFlags |> Array.exists (fun x -> x = "--simpleresolution") - - let loadedTimeStamp = defaultArg loadedTimeStamp DateTime.MaxValue // Not 'now', we don't want to force reloading - - let applyCompilerOptions tcConfigB = - let fsiCompilerOptions = GetCoreFsiCompilerOptions tcConfigB - ParseCompilerOptions(ignore, fsiCompilerOptions, Array.toList otherFlags) - - let loadClosure = - LoadClosure.ComputeClosureOfScriptText( - legacyReferenceResolver, - FSharpCheckerResultsSettings.defaultFSharpBinariesDir, - fileName, - sourceText, - CodeContext.Editing, - useSimpleResolution, - useFsiAuxLib, - useSdkRefs, - sdkDirOverride, - Lexhelp.LexResourceManager(), - applyCompilerOptions, - assumeDotNetFramework, - tryGetMetadataSnapshot, - reduceMemoryUsage, - dependencyProviderForScripts - ) - - let otherFlags = - [| - yield "--noframework" - yield "--warn:3" - yield! otherFlags - for r in loadClosure.References do - yield "-r:" + fst r - for code, _ in loadClosure.NoWarns do - yield "--nowarn:" + code - |] - - let options = - { - ProjectFileName = fileName + ".fsproj" // Make a name that is unique in this directory. - ProjectId = None - SourceFiles = loadClosure.SourceFiles |> List.map fst |> List.toArray - OtherOptions = otherFlags - ReferencedProjects = [||] - IsIncompleteTypeCheckEnvironment = false - UseScriptResolutionRules = true - LoadTime = loadedTimeStamp - UnresolvedReferences = Some(FSharpUnresolvedReferencesSet(loadClosure.UnresolvedReferences)) - OriginalLoadReferences = loadClosure.OriginalLoadReferences - Stamp = optionsStamp - } - - scriptClosureCache.Set(AnyCallerThread, options, loadClosure) // Save the full load closure for later correlation. - - let diags = - loadClosure.LoadClosureRootFileDiagnostics - |> List.map (fun (exn, isError) -> - FSharpDiagnostic.CreateFromException( - exn, - isError, - range.Zero, - false, - options.OtherOptions |> Array.contains "--flaterrors", - None - )) - - return options, (diags @ diagnostics.Diagnostics) - } - |> Cancellable.toAsync - - member bc.InvalidateConfiguration(options: FSharpProjectOptions, userOpName) = - use _ = - Activity.start - "BackgroundCompiler.InvalidateConfiguration" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.userOpName, userOpName - |] - - if incrementalBuildersCache.ContainsSimilarKey(AnyCallerThread, options) then - parseCacheLock.AcquireLock(fun ltok -> - for sourceFile in options.SourceFiles do - checkFileInProjectCache.RemoveAnySimilar(ltok, (sourceFile, 0L, options))) - - let _ = createBuilderNode (options, userOpName, CancellationToken.None) - () - - member bc.ClearCache(options: seq, _userOpName) = - use _ = Activity.start "BackgroundCompiler.ClearCache" [| Activity.Tags.userOpName, _userOpName |] - - lock gate (fun () -> - options - |> Seq.iter (fun options -> - incrementalBuildersCache.RemoveAnySimilar(AnyCallerThread, options) - - parseCacheLock.AcquireLock(fun ltok -> - for sourceFile in options.SourceFiles do - checkFileInProjectCache.RemoveAnySimilar(ltok, (sourceFile, 0L, options))))) - - member _.NotifyProjectCleaned(options: FSharpProjectOptions, userOpName) = - use _ = - Activity.start - "BackgroundCompiler.NotifyProjectCleaned" - [| - Activity.Tags.project, options.ProjectFileName - Activity.Tags.userOpName, userOpName - |] - - async { - let! ct = Async.CancellationToken - use _ = Cancellable.UsingToken(ct) - - let! ct = Async.CancellationToken - // If there was a similar entry (as there normally will have been) then re-establish an empty builder . This - // is a somewhat arbitrary choice - it will have the effect of releasing memory associated with the previous - // builder, but costs some time. - if incrementalBuildersCache.ContainsSimilarKey(AnyCallerThread, options) then - let _ = createBuilderNode (options, userOpName, ct) - () - } - - member _.BeforeBackgroundFileCheck = beforeFileChecked.Publish - - member _.FileParsed = fileParsed.Publish - - member _.FileChecked = fileChecked.Publish - - member _.ProjectChecked = projectChecked.Publish - - member _.ClearCaches() = - use _ = Activity.startNoTags "BackgroundCompiler.ClearCaches" - - lock gate (fun () -> - parseCacheLock.AcquireLock(fun ltok -> - checkFileInProjectCache.Clear(ltok) - parseFileCache.Clear(ltok)) - - incrementalBuildersCache.Clear(AnyCallerThread) - frameworkTcImportsCache.Clear() - scriptClosureCache.Clear AnyCallerThread) - - member _.DownsizeCaches() = - use _ = Activity.startNoTags "BackgroundCompiler.DownsizeCaches" - - lock gate (fun () -> - parseCacheLock.AcquireLock(fun ltok -> - checkFileInProjectCache.Resize(ltok, newKeepStrongly = 1) - parseFileCache.Resize(ltok, newKeepStrongly = 1)) - - incrementalBuildersCache.Resize(AnyCallerThread, newKeepStrongly = 1, newKeepMax = 1) - frameworkTcImportsCache.Downsize() - scriptClosureCache.Resize(AnyCallerThread, newKeepStrongly = 1, newKeepMax = 1)) - - member _.FrameworkImportsCache = frameworkTcImportsCache - - static member ActualParseFileCount = actualParseFileCount - - static member ActualCheckFileCount = actualCheckFileCount - [] // There is typically only one instance of this type in an IDE process. type FSharpChecker @@ -1374,26 +127,44 @@ type FSharpChecker captureIdentifiersWhenParsing, getSource, useChangeNotifications, - useSyntaxTreeCache + useTransparentCompiler ) = let backgroundCompiler = - BackgroundCompiler( - legacyReferenceResolver, - projectCacheSize, - keepAssemblyContents, - keepAllBackgroundResolutions, - tryGetMetadataSnapshot, - suggestNamesForErrors, - keepAllBackgroundSymbolUses, - enableBackgroundItemKeyStoreAndSemanticClassification, - enablePartialTypeChecking, - parallelReferenceResolution, - captureIdentifiersWhenParsing, - getSource, - useChangeNotifications, - useSyntaxTreeCache - ) + if useTransparentCompiler = Some true then + TransparentCompiler( + legacyReferenceResolver, + projectCacheSize, + keepAssemblyContents, + keepAllBackgroundResolutions, + tryGetMetadataSnapshot, + suggestNamesForErrors, + keepAllBackgroundSymbolUses, + enableBackgroundItemKeyStoreAndSemanticClassification, + enablePartialTypeChecking, + parallelReferenceResolution, + captureIdentifiersWhenParsing, + getSource, + useChangeNotifications + ) + :> IBackgroundCompiler + else + BackgroundCompiler( + legacyReferenceResolver, + projectCacheSize, + keepAssemblyContents, + keepAllBackgroundResolutions, + tryGetMetadataSnapshot, + suggestNamesForErrors, + keepAllBackgroundSymbolUses, + enableBackgroundItemKeyStoreAndSemanticClassification, + enablePartialTypeChecking, + parallelReferenceResolution, + captureIdentifiersWhenParsing, + getSource, + useChangeNotifications + ) + :> IBackgroundCompiler static let globalInstance = lazy FSharpChecker.Create() @@ -1437,7 +208,7 @@ type FSharpChecker ?parallelReferenceResolution: bool, ?captureIdentifiersWhenParsing: bool, ?documentSource: DocumentSource, - ?useSyntaxTreeCache: bool + ?useTransparentCompiler: bool ) = use _ = Activity.startNoTags "FSharpChecker.Create" @@ -1465,8 +236,6 @@ type FSharpChecker | Some(DocumentSource.Custom _) -> true | _ -> false - let useSyntaxTreeCache = defaultArg useSyntaxTreeCache true - if keepAssemblyContents && enablePartialTypeChecking then invalidArg "enablePartialTypeChecking" "'keepAssemblyContents' and 'enablePartialTypeChecking' cannot be both enabled." @@ -1488,9 +257,18 @@ type FSharpChecker | Some(DocumentSource.Custom f) -> Some f | _ -> None), useChangeNotifications, - useSyntaxTreeCache + useTransparentCompiler ) + member _.UsesTransparentCompiler = useTransparentCompiler = Some true + + member _.TransparentCompiler = + match useTransparentCompiler with + | Some true -> backgroundCompiler :?> TransparentCompiler + | _ -> failwith "Transparent Compiler is not enabled." + + member this.Caches = this.TransparentCompiler.Caches + member _.ReferenceResolver = legacyReferenceResolver member _.MatchBraces(fileName, sourceText: ISourceText, options: FSharpParsingOptions, ?userOpName: string) = @@ -1529,6 +307,11 @@ type FSharpChecker let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.ParseFile(fileName, sourceText, options, cache, false, userOpName) + member _.ParseFile(fileName, projectSnapshot, ?userOpName) = + let userOpName = defaultArg userOpName "Unknown" + + backgroundCompiler.ParseFile(fileName, projectSnapshot, userOpName) + member ic.ParseFileInProject(fileName, source: string, options, ?cache: bool, ?userOpName: string) = let parsingOptions, _ = ic.GetParsingOptionsFromProjectOptions(options) ic.ParseFile(fileName, SourceText.ofString source, parsingOptions, ?cache = cache, ?userOpName = userOpName) @@ -1537,27 +320,26 @@ type FSharpChecker let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.GetBackgroundParseResultsForFileInProject(fileName, options, userOpName) - |> Async.AwaitNodeCode member _.GetBackgroundCheckResultsForFileInProject(fileName, options, ?userOpName: string) = let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.GetBackgroundCheckResultsForFileInProject(fileName, options, userOpName) - |> Async.AwaitNodeCode /// Try to get recent approximate type check results for a file. member _.TryGetRecentCheckResultsForFile(fileName: string, options: FSharpProjectOptions, ?sourceText, ?userOpName: string) = let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.TryGetRecentCheckResultsForFile(fileName, options, sourceText, userOpName) + member _.TryGetRecentCheckResultsForFile(fileName: string, projectSnapshot: FSharpProjectSnapshot, ?userOpName: string) = + let userOpName = defaultArg userOpName "Unknown" + backgroundCompiler.TryGetRecentCheckResultsForFile(fileName, projectSnapshot, userOpName) + member _.Compile(argv: string[], ?userOpName: string) = let _userOpName = defaultArg userOpName "Unknown" use _ = Activity.start "FSharpChecker.Compile" [| Activity.Tags.userOpName, _userOpName |] async { - let! ct = Async.CancellationToken - use _ = Cancellable.UsingToken(ct) - let ctok = CompilationThreadToken() return CompileHelpers.compileFromArgs (ctok, argv, legacyReferenceResolver, None, None) } @@ -1572,7 +354,6 @@ type FSharpChecker backgroundCompiler.ClearCaches() ClearAllILModuleReaderCache() - // This is for unit testing only member ic.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() = use _ = Activity.startNoTags "FsharpChecker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients" @@ -1588,11 +369,19 @@ type FSharpChecker let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.InvalidateConfiguration(options, userOpName) + member _.InvalidateConfiguration(projectSnapshot: FSharpProjectSnapshot, ?userOpName: string) = + let userOpName = defaultArg userOpName "Unknown" + backgroundCompiler.InvalidateConfiguration(projectSnapshot, userOpName) + /// Clear the internal cache of the given projects. member _.ClearCache(options: seq, ?userOpName: string) = let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.ClearCache(options, userOpName) + member _.ClearCache(projects: ProjectSnapshot.FSharpProjectIdentifier seq, ?userOpName: string) = + let userOpName = defaultArg userOpName "Unknown" + backgroundCompiler.ClearCache(projects, userOpName) + /// This function is called when a project has been cleaned, and thus type providers should be refreshed. member _.NotifyProjectCleaned(options: FSharpProjectOptions, ?userOpName: string) = let userOpName = defaultArg userOpName "Unknown" @@ -1602,7 +391,6 @@ type FSharpChecker let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.NotifyFileChanged(fileName, options, userOpName) - |> Async.AwaitNodeCode /// Typecheck a source code file, returning a handle to the results of the /// parse including the reconstructed types in the file. @@ -1625,7 +413,6 @@ type FSharpChecker options, userOpName ) - |> Async.AwaitNodeCode /// Typecheck a source code file, returning a handle to the results of the /// parse including the reconstructed types in the file. @@ -1641,7 +428,6 @@ type FSharpChecker let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.CheckFileInProject(parseResults, fileName, fileVersion, sourceText, options, userOpName) - |> Async.AwaitNodeCode /// Typecheck a source code file, returning a handle to the results of the /// parse including the reconstructed types in the file. @@ -1656,13 +442,21 @@ type FSharpChecker let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.ParseAndCheckFileInProject(fileName, fileVersion, sourceText, options, userOpName) - |> Async.AwaitNodeCode - member _.ParseAndCheckProject(options, ?userOpName: string) = + member _.ParseAndCheckFileInProject(fileName: string, projectSnapshot: FSharpProjectSnapshot, ?userOpName: string) = + let userOpName = defaultArg userOpName "Unknown" + + backgroundCompiler.ParseAndCheckFileInProject(fileName, projectSnapshot, userOpName) + + member _.ParseAndCheckProject(options: FSharpProjectOptions, ?userOpName: string) = let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.ParseAndCheckProject(options, userOpName) - |> Async.AwaitNodeCode + + member _.ParseAndCheckProject(projectSnapshot: FSharpProjectSnapshot, ?userOpName: string) = + let userOpName = defaultArg userOpName "Unknown" + + backgroundCompiler.ParseAndCheckProject(projectSnapshot, userOpName) member _.FindBackgroundReferencesInFile ( @@ -1676,10 +470,7 @@ type FSharpChecker let canInvalidateProject = defaultArg canInvalidateProject true let userOpName = defaultArg userOpName "Unknown" - node { - let! ct = NodeCode.CancellationToken - use _ = Cancellable.UsingToken(ct) - + async { if fastCheck <> Some true || not captureIdentifiersWhenParsing then return! backgroundCompiler.FindReferencesInFile(fileName, options, symbol, canInvalidateProject, userOpName) else @@ -1693,13 +484,31 @@ type FSharpChecker else return Seq.empty } - |> Async.AwaitNodeCode + + member _.FindBackgroundReferencesInFile(fileName: string, projectSnapshot: FSharpProjectSnapshot, symbol: FSharpSymbol, ?userOpName: string) = + let userOpName = defaultArg userOpName "Unknown" + + async { + let! parseResults = backgroundCompiler.ParseFile(fileName, projectSnapshot, userOpName) + + if + parseResults.ParseTree.Identifiers |> Set.contains symbol.DisplayNameCore + || parseResults.ParseTree.Identifiers |> NamesContainAttribute symbol + then + return! backgroundCompiler.FindReferencesInFile(fileName, projectSnapshot, symbol, userOpName) + else + return Seq.empty + } member _.GetBackgroundSemanticClassificationForFile(fileName: string, options: FSharpProjectOptions, ?userOpName) = let userOpName = defaultArg userOpName "Unknown" backgroundCompiler.GetSemanticClassificationForFile(fileName, options, userOpName) - |> Async.AwaitNodeCode + + member _.GetBackgroundSemanticClassificationForFile(fileName: string, snapshot: FSharpProjectSnapshot, ?userOpName) = + let userOpName = defaultArg userOpName "Unknown" + + backgroundCompiler.GetSemanticClassificationForFile(fileName, snapshot, userOpName) /// For a given script file, get the ProjectOptions implied by the #load closure member _.GetProjectOptionsFromScript @@ -1732,6 +541,40 @@ type FSharpChecker userOpName ) + /// For a given script file, get the ProjectSnapshot implied by the #load closure + member _.GetProjectSnapshotFromScript + ( + fileName, + source, + ?documentSource, + ?previewEnabled, + ?loadedTimeStamp, + ?otherFlags, + ?useFsiAuxLib, + ?useSdkRefs, + ?assumeDotNetFramework, + ?sdkDirOverride, + ?optionsStamp: int64, + ?userOpName: string + ) = + let userOpName = defaultArg userOpName "Unknown" + let documentSource = defaultArg documentSource DocumentSource.FileSystem + + backgroundCompiler.GetProjectSnapshotFromScript( + fileName, + source, + documentSource, + previewEnabled, + loadedTimeStamp, + otherFlags, + useFsiAuxLib, + useSdkRefs, + sdkDirOverride, + assumeDotNetFramework, + optionsStamp, + userOpName + ) + member _.GetProjectOptionsFromCommandLineArgs(projectFileName, argv, ?loadedTimeStamp, ?isInteractive, ?isEditing) = let isEditing = defaultArg isEditing false let isInteractive = defaultArg isInteractive false @@ -1793,6 +636,8 @@ type FSharpChecker if isEditing then tcConfigB.conditionalDefines <- "EDITING" :: tcConfigB.conditionalDefines + tcConfigB.realsig <- List.contains "--realsig" argv || List.contains "--realsig+" argv + // Apply command-line arguments and collect more source files if they are in the arguments let sourceFilesNew = ApplyCommandLineArgs(tcConfigB, sourceFiles, argv) FSharpParsingOptions.FromTcConfigBuilder(tcConfigB, Array.ofList sourceFilesNew, isInteractive), errorScope.Diagnostics @@ -1903,14 +748,14 @@ type CompilerEnvironment() = static member IsScriptFile(fileName: string) = ParseAndCheckInputs.IsScript fileName /// Whether or not this file is compilable - static member IsCompilable file = + static member IsCompilable(file: string) = let ext = Path.GetExtension file compilableExtensions |> List.exists (fun e -> 0 = String.Compare(e, ext, StringComparison.OrdinalIgnoreCase)) /// Whether or not this file should be a single-file project - static member MustBeSingleFileProject file = + static member MustBeSingleFileProject(file: string) = let ext = Path.GetExtension file singleFileProjectExtensions diff --git a/src/fcs-fable/src/Compiler/Service/service.fsi b/src/fcs-fable/src/Compiler/Service/service.fsi index c70939b58b..dda0ff9a1c 100644 --- a/src/fcs-fable/src/Compiler/Service/service.fsi +++ b/src/fcs-fable/src/Compiler/Service/service.fsi @@ -6,8 +6,13 @@ namespace FSharp.Compiler.CodeAnalysis open System open System.IO +open System.Threading +open System.Threading.Tasks open FSharp.Compiler.AbstractIL.ILBinaryReader open FSharp.Compiler.CodeAnalysis +#if !FABLE_COMPILER +open FSharp.Compiler.CodeAnalysis.TransparentCompiler +#endif open FSharp.Compiler.CompilerConfig open FSharp.Compiler.Diagnostics open FSharp.Compiler.EditorServices @@ -18,12 +23,6 @@ open FSharp.Compiler.Tokenization #if !FABLE_COMPILER -[] -[] -type DocumentSource = - | FileSystem - | Custom of (string -> Async) - /// Used to parse and check F# source code. [] type public FSharpChecker = @@ -39,11 +38,11 @@ type public FSharpChecker = /// Indicate whether name suggestion should be enabled /// Indicate whether all symbol uses should be kept in background checking /// Indicates whether a table of symbol keys should be kept for background compilation - /// Indicates whether to perform partial type checking. Cannot be set to true if keepAssmeblyContents is true. If set to true, can cause duplicate type-checks when richer information on a file is needed, but can skip background type-checking entirely on implementation files with signature files. + /// Indicates whether to perform partial type checking. Cannot be set to true if keepAssemblyContents is true. If set to true, can cause duplicate type-checks when richer information on a file is needed, but can skip background type-checking entirely on implementation files with signature files. /// Indicates whether to resolve references in parallel. /// When set to true we create a set of all identifiers for each parsed file which can be used to speed up finding references. /// Default: FileSystem. You can use Custom source to provide a function that will return the source for a given file path instead of reading it from the file system. Note that with this option the FSharpChecker will also not monitor the file system for file changes. It will expect to be notified of changes via the NotifyFileChanged method. - /// Default: true. Indicates whether to keep parsing results in a cache. + /// Default: false. Indicates whether we use a new experimental background compiler. This does not yet support all features static member Create: ?projectCacheSize: int * ?keepAssemblyContents: bool * @@ -58,10 +57,13 @@ type public FSharpChecker = ?captureIdentifiersWhenParsing: bool * [] ?documentSource: DocumentSource * - [] ?useSyntaxTreeCache: + [] ?useTransparentCompiler: bool -> FSharpChecker + [] + member UsesTransparentCompiler: bool + /// /// Parse a source code file, returning information about brace matching in the file. /// Return an enumeration of the matching parenthetical tokens in the file. @@ -96,12 +98,16 @@ type public FSharpChecker = /// The path for the file. The file name is used as a module name for implicit top level modules (e.g. in scripts). /// The source to be parsed. /// Parsing options for the project or script. - /// Store the parse in a size-limited cache assocaited with the FSharpChecker. Default: true + /// Store the parse in a size-limited cache associated with the FSharpChecker. Default: true /// An optional string used for tracing compiler operations associated with this request. member ParseFile: fileName: string * sourceText: ISourceText * options: FSharpParsingOptions * ?cache: bool * ?userOpName: string -> Async + [] + member ParseFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * ?userOpName: string -> Async + /// /// Parses a source code for a file. Returns an AST that can be traversed for various features. /// @@ -109,7 +115,7 @@ type public FSharpChecker = /// The path for the file. The file name is also as a module name for implicit top level modules (e.g. in scripts). /// The source to be parsed. /// Parsing options for the project or script. - /// Store the parse in a size-limited cache assocaited with the FSharpChecker. Default: true + /// Store the parse in a size-limited cache associated with the FSharpChecker. Default: true /// An optional string used for tracing compiler operations associated with this request. [] member ParseFileInProject: @@ -195,6 +201,11 @@ type public FSharpChecker = ?userOpName: string -> Async + [] + member ParseAndCheckFileInProject: + fileName: string * projectSnapshot: FSharpProjectSnapshot * ?userOpName: string -> + Async + /// /// Parse and typecheck all files in a project. /// All files are read from the FileSystem API @@ -205,6 +216,10 @@ type public FSharpChecker = /// An optional string used for tracing compiler operations associated with this request. member ParseAndCheckProject: options: FSharpProjectOptions * ?userOpName: string -> Async + [] + member ParseAndCheckProject: + projectSnapshot: FSharpProjectSnapshot * ?userOpName: string -> Async + /// /// For a given script file, get the FSharpProjectOptions implied by the #load closure. /// All files are read from the FileSystem API, except the file being checked. @@ -237,6 +252,36 @@ type public FSharpChecker = ?userOpName: string -> Async + /// Used to differentiate between scripts, to consider each script a separate project. Also used in formatted error messages. + /// The source for the file. + /// DocumentSource to load any additional files. + /// Is the preview compiler enabled. + /// Indicates when the script was loaded into the editing environment, + /// so that an 'unload' and 'reload' action will cause the script to be considered as a new project, + /// so that references are re-resolved. + /// Other flags for compilation. + /// Add a default reference to the FSharp.Compiler.Interactive.Settings library. + /// Use the implicit references from the .NET SDK. + /// Set up compilation and analysis for .NET Framework scripts. + /// Override the .NET SDK used for default references. + /// An optional unique stamp for the options. + /// An optional string used for tracing compiler operations associated with this request. + [] + member GetProjectSnapshotFromScript: + fileName: string * + source: ISourceTextNew * + ?documentSource: DocumentSource * + ?previewEnabled: bool * + ?loadedTimeStamp: DateTime * + ?otherFlags: string[] * + ?useFsiAuxLib: bool * + ?useSdkRefs: bool * + ?assumeDotNetFramework: bool * + ?sdkDirOverride: string * + ?optionsStamp: int64 * + ?userOpName: string -> + Async + /// Get the FSharpProjectOptions implied by a set of command line arguments. /// /// Used to differentiate between projects and for the base directory of the project. @@ -325,6 +370,11 @@ type public FSharpChecker = ?userOpName: string -> Async + [] + member FindBackgroundReferencesInFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * symbol: FSharpSymbol * ?userOpName: string -> + Async + /// /// Get semantic classification for a file. /// All files are read from the FileSystem API, including the file being checked. @@ -338,15 +388,28 @@ type public FSharpChecker = fileName: string * options: FSharpProjectOptions * ?userOpName: string -> Async + /// + /// Get semantic classification for a file. + /// + /// + /// The file name for the file. + /// The project snapshot for which we want to get the semantic classification. + /// An optional string used for tracing compiler operations associated with this request. + [] + member GetBackgroundSemanticClassificationForFile: + fileName: string * snapshot: FSharpProjectSnapshot * ?userOpName: string -> + Async + /// /// Compile using the given flags. Source files names are resolved via the FileSystem API. /// The output file must be given by a -o flag. /// The first argument is ignored and can just be "fsc.exe". + /// The method returns the collected diagnostics, and (possibly) a terminating exception. /// /// /// The command line arguments for the project build. /// An optional string used for tracing compiler operations associated with this request. - member Compile: argv: string[] * ?userOpName: string -> Async + member Compile: argv: string[] * ?userOpName: string -> Async /// /// Try to get type check results for a file. This looks up the results of recent type checks of the @@ -363,6 +426,11 @@ type public FSharpChecker = fileName: string * options: FSharpProjectOptions * ?sourceText: ISourceText * ?userOpName: string -> (FSharpParseFileResults * FSharpCheckFileResults (* hash *) * int64) option + [] + member TryGetRecentCheckResultsForFile: + fileName: string * projectSnapshot: FSharpProjectSnapshot * ?userOpName: string -> + (FSharpParseFileResults * FSharpCheckFileResults) option + /// This function is called when the entire environment is known to have changed for reasons not encoded in the ProjectOptions of any project/compilation. member InvalidateAll: unit -> unit @@ -374,11 +442,20 @@ type public FSharpChecker = /// An optional string used for tracing compiler operations associated with this request. member InvalidateConfiguration: options: FSharpProjectOptions * ?userOpName: string -> unit + /// + /// This function is called when the configuration is known to have changed for reasons not encoded in the projectSnapshot. + /// For example, dependent references may have been deleted or created. + /// + [] + member InvalidateConfiguration: projectSnapshot: FSharpProjectSnapshot * ?userOpName: string -> unit + /// Clear the internal cache of the given projects. /// The given project options. /// An optional string used for tracing compiler operations associated with this request. member ClearCache: options: FSharpProjectOptions seq * ?userOpName: string -> unit + member ClearCache: projects: ProjectSnapshot.FSharpProjectIdentifier seq * ?userOpName: string -> unit + /// Report a statistic for testability static member ActualParseFileCount: int @@ -423,6 +500,10 @@ type public FSharpChecker = /// The event may be raised on a background thread. member ProjectChecked: IEvent + member internal TransparentCompiler: TransparentCompiler + + member internal Caches: CompilerCaches + [] static member Instance: FSharpChecker diff --git a/src/fcs-fable/src/Compiler/Symbols/Exprs.fs b/src/fcs-fable/src/Compiler/Symbols/Exprs.fs index 24d9118a69..0cfa901c87 100644 --- a/src/fcs-fable/src/Compiler/Symbols/Exprs.fs +++ b/src/fcs-fable/src/Compiler/Symbols/Exprs.fs @@ -121,7 +121,7 @@ type E = | ValueSet of FSharpMemberOrFunctionOrValue * FSharpExpr | Unused | DefaultValue of FSharpType - | Const of obj * FSharpType + | Const of objnull * FSharpType | AddressOf of FSharpExpr | Sequential of FSharpExpr * FSharpExpr | IntegerForLoop of FSharpExpr * FSharpExpr * FSharpExpr * bool * DebugPointAtFor * DebugPointAtInOrTo @@ -327,7 +327,7 @@ module FSharpExprConvert = let ConvILTypeRefApp (cenv: SymbolEnv) m tref tyargs = let tcref = Import.ImportILTypeRef cenv.amap m tref - ConvType cenv (mkAppTy tcref tyargs) + ConvType cenv (mkWoNullAppTy tcref tyargs) let ConvUnionCaseRef cenv (ucref: UnionCaseRef) = FSharpUnionCase(cenv, ucref) @@ -378,7 +378,7 @@ module FSharpExprConvert = // Large lists | Expr.Op (TOp.UnionCase ucref, tyargs, [e1;e2], _) -> let mkR = ConvUnionCaseRef cenv ucref - let typR = ConvType cenv (mkAppTy ucref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy ucref.TyconRef tyargs) let e1R = ConvExpr cenv env e1 // tail recursive ConvExprLinear cenv env e2 (contF << (fun e2R -> E.NewUnionCase(typR, mkR, [e1R; e2R]) )) @@ -625,7 +625,7 @@ module FSharpExprConvert = match op, tyargs, args with | TOp.UnionCase ucref, _, _ -> let mkR = ConvUnionCaseRef cenv ucref - let typR = ConvType cenv (mkAppTy ucref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy ucref.TyconRef tyargs) let argsR = ConvExprs cenv env args E.NewUnionCase(typR, mkR, argsR) @@ -640,13 +640,13 @@ module FSharpExprConvert = E.NewTuple(tyR, argsR) | TOp.Recd (_, tcref), _, _ -> - let typR = ConvType cenv (mkAppTy tcref tyargs) + let typR = ConvType cenv (mkWoNullAppTy tcref tyargs) let argsR = ConvExprs cenv env args E.NewRecord(typR, argsR) | TOp.UnionCaseFieldGet (ucref, n), tyargs, [e1] -> let mkR = ConvUnionCaseRef cenv ucref - let typR = ConvType cenv (mkAppTy ucref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy ucref.TyconRef tyargs) let projR = FSharpField(cenv, ucref, n) E.UnionCaseGet(ConvExpr cenv env e1, typR, mkR, projR) @@ -656,7 +656,7 @@ module FSharpExprConvert = | TOp.UnionCaseFieldSet (ucref, n), tyargs, [e1;e2] -> let mkR = ConvUnionCaseRef cenv ucref - let typR = ConvType cenv (mkAppTy ucref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy ucref.TyconRef tyargs) let projR = FSharpField(cenv, ucref, n) E.UnionCaseSet(ConvExpr cenv env e1, typR, mkR, projR, ConvExpr cenv env e2) @@ -668,13 +668,13 @@ module FSharpExprConvert = | TOp.ValFieldGet rfref, tyargs, [] -> let projR = ConvRecdFieldRef cenv rfref - let typR = ConvType cenv (mkAppTy rfref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy rfref.TyconRef tyargs) E.FSharpFieldGet(None, typR, projR) | TOp.ValFieldGet rfref, tyargs, [obj] -> let objR = ConvLValueExpr cenv env obj let projR = ConvRecdFieldRef cenv rfref - let typR = ConvType cenv (mkAppTy rfref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy rfref.TyconRef tyargs) E.FSharpFieldGet(Some objR, typR, projR) | TOp.TupleFieldGet (tupInfo, n), tyargs, [e] -> @@ -778,7 +778,7 @@ module FSharpExprConvert = let argTy2 = tyOfExpr g arg2 let resTy = match getMeasureOfType g argTy1, getMeasureOfType g argTy2 with - | Some (tcref, ms1), Some (_tcref2, ms2) -> mkAppTy tcref [TType_measure (Measure.Prod(ms1, if isMul then ms2 else Measure.Inv ms2))] + | Some (tcref, ms1), Some (_tcref2, ms2) -> mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if isMul then ms2 else Measure.Inv ms2))] | Some _, None -> argTy1 | None, Some _ -> argTy2 | None, None -> argTy1 @@ -808,18 +808,18 @@ module FSharpExprConvert = E.ILAsm(sprintf "%+A" instrs, ConvTypes cenv tyargs, ConvExprs cenv env args) | TOp.ExnConstr tcref, tyargs, args -> - E.NewRecord(ConvType cenv (mkAppTy tcref tyargs), ConvExprs cenv env args) + E.NewRecord(ConvType cenv (mkWoNullAppTy tcref tyargs), ConvExprs cenv env args) | TOp.ValFieldSet rfref, _tinst, [obj;arg] -> let objR = ConvLValueExpr cenv env obj let argR = ConvExpr cenv env arg - let typR = ConvType cenv (mkAppTy rfref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy rfref.TyconRef tyargs) let projR = ConvRecdFieldRef cenv rfref E.FSharpFieldSet(Some objR, typR, projR, argR) | TOp.ValFieldSet rfref, _tinst, [arg] -> let argR = ConvExpr cenv env arg - let typR = ConvType cenv (mkAppTy rfref.TyconRef tyargs) + let typR = ConvType cenv (mkWoNullAppTy rfref.TyconRef tyargs) let projR = ConvRecdFieldRef cenv rfref E.FSharpFieldSet(None, typR, projR, argR) @@ -827,16 +827,16 @@ module FSharpExprConvert = let exnc = stripExnEqns tcref let fspec = exnc.TrueInstanceFieldsAsList[i] let fref = mkRecdFieldRef tcref fspec.LogicalName - let typR = ConvType cenv (mkAppTy tcref tyargs) - let objR = ConvExpr cenv env (mkCoerceExpr (obj, mkAppTy tcref [], m, g.exn_ty)) + let typR = ConvType cenv (mkWoNullAppTy tcref tyargs) + let objR = ConvExpr cenv env (mkCoerceExpr (obj, mkWoNullAppTy tcref [], m, g.exn_ty)) E.FSharpFieldGet(Some objR, typR, ConvRecdFieldRef cenv fref) | TOp.ExnFieldSet (tcref, i), [], [obj;e2] -> let exnc = stripExnEqns tcref let fspec = exnc.TrueInstanceFieldsAsList[i] let fref = mkRecdFieldRef tcref fspec.LogicalName - let typR = ConvType cenv (mkAppTy tcref tyargs) - let objR = ConvExpr cenv env (mkCoerceExpr (obj, mkAppTy tcref [], m, g.exn_ty)) + let typR = ConvType cenv (mkWoNullAppTy tcref tyargs) + let objR = ConvExpr cenv env (mkCoerceExpr (obj, mkWoNullAppTy tcref [], m, g.exn_ty)) E.FSharpFieldSet(Some objR, typR, ConvRecdFieldRef cenv fref, ConvExpr cenv env e2) | TOp.Coerce, [tgtTy;srcTy], [x] -> @@ -899,15 +899,15 @@ module FSharpExprConvert = | TOp.UnionCaseProof _, _, [e] -> ConvExprPrim cenv env e // Note: we erase the union case proof conversions when converting to quotations | TOp.UnionCaseTagGet tycr, tyargs, [arg1] -> - let typR = ConvType cenv (mkAppTy tycr tyargs) + let typR = ConvType cenv (mkWoNullAppTy tycr tyargs) E.UnionCaseTag(ConvExpr cenv env arg1, typR) - | TOp.TraitCall (TTrait(tys, nm, memFlags, argTys, _retTy, _solution)), _, _ -> - let tysR = ConvTypes cenv tys + | TOp.TraitCall traitInfo, _, _ -> + let tysR = ConvTypes cenv traitInfo.SupportTypes let tyargsR = ConvTypes cenv tyargs - let argTysR = ConvTypes cenv argTys + let argTysR = ConvTypes cenv traitInfo.CompiledObjectAndArgumentTypes let argsR = ConvExprs cenv env args - E.TraitCall(tysR, nm, memFlags, argTysR, tyargsR, argsR) + E.TraitCall(tysR, traitInfo.MemberLogicalName, traitInfo.MemberFlags, argTysR, tyargsR, argsR) | TOp.RefAddrGet readonly, [ty], [e] -> let replExpr = mkRecdFieldGetAddrViaExprAddr(readonly, e, mkRefCellContentsRef g, [ty], m) @@ -1022,7 +1022,7 @@ module FSharpExprConvert = | [v] -> makeFSCall isMember v | [] -> - let typR = ConvType cenv (mkAppTy tcref enclTypeArgs) + let typR = ConvType cenv (mkWoNullAppTy tcref enclTypeArgs) if enclosingEntity.IsModuleOrNamespace then let findModuleMemberByName = enclosingEntity.ModuleOrNamespaceType.AllValsAndMembers @@ -1152,9 +1152,12 @@ module FSharpExprConvert = // TODO: this will not work for curried methods in F# classes. // This is difficult to solve as the information in the ILMethodRef // is not sufficient to resolve to a symbol unambiguously in these cases. - let argTys = [ ilMethRef.ArgTypes |> List.map (ImportILTypeFromMetadata cenv.amap m scoref tinst1 tinst2) ] + + // If this was an ILTycon with potential nullness, try1 is Some(..) and this branch not hit + let argTys = [ ilMethRef.ArgTypes |> List.map (ImportILTypeFromMetadataSkipNullness cenv.amap m scoref tinst1 tinst2) ] let retTy = - match ImportReturnTypeFromMetadata cenv.amap m ilMethRef.ReturnType (fun _ -> emptyILCustomAttrs) scoref tinst1 tinst2 with + let nullableAttributes = Import.Nullness.NullableAttributesSource.Empty + match ImportReturnTypeFromMetadata cenv.amap m nullableAttributes ilMethRef.ReturnType scoref tinst1 tinst2 with | None -> if isCtor then enclosingTy else g.unit_ty | Some ty -> ty @@ -1295,7 +1298,7 @@ module FSharpExprConvert = | DecisionTreeTest.UnionCase (ucref, tyargs) -> let objR = ConvExpr cenv env inpExpr let ucR = ConvUnionCaseRef cenv ucref - let utypR = ConvType cenv (mkAppTy ucref.TyconRef tyargs) + let utypR = ConvType cenv (mkWoNullAppTy ucref.TyconRef tyargs) E.IfThenElse (E.UnionCaseTest (objR, utypR, ucR) |> Mk cenv m g.bool_ty, ConvDecisionTree cenv env dtreeRetTy dtree m, acc) | DecisionTreeTest.Const (Const.Bool true) -> let e1R = ConvExpr cenv env inpExpr diff --git a/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fs b/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fs index 3374a292dd..78283463ff 100644 --- a/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fs +++ b/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fs @@ -106,6 +106,13 @@ module ExtendedData = member x.ImplementationName = implArg.idText member x.SignatureRange = sigArg.idRange member x.ImplementationRange = implArg.idRange + + [] + type DefinitionsInSigAndImplNotCompatibleAbbreviationsDifferExtendedData + internal(signatureType: Tycon, implementationType: Tycon) = + interface IFSharpDiagnosticExtendedData + member x.SignatureRange: range = signatureType.Range + member x.ImplementationRange: range = implementationType.Range open ExtendedData @@ -191,6 +198,9 @@ type FSharpDiagnostic(m: range, severity: FSharpDiagnosticSeverity, message: str | ArgumentsInSigAndImplMismatch(sigArg, implArg) -> Some(ArgumentsInSigAndImplMismatchExtendedData(sigArg, implArg)) + | DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(implTycon = implTycon; sigTycon = sigTycon) -> + Some(DefinitionsInSigAndImplNotCompatibleAbbreviationsDifferExtendedData(sigTycon, implTycon)) + | _ -> None let msg = @@ -298,13 +308,12 @@ type internal CompilationDiagnosticLogger (debugName: string, options: FSharpDia | Some f -> f diagnostic | None -> diagnostic - if diagnostic.ReportAsError (options, severity) then + match diagnostic.AdjustSeverity(options, severity) with + | FSharpDiagnosticSeverity.Error -> diagnostics.Add(diagnostic, FSharpDiagnosticSeverity.Error) errorCount <- errorCount + 1 - elif diagnostic.ReportAsWarning (options, severity) then - diagnostics.Add(diagnostic, FSharpDiagnosticSeverity.Warning) - elif diagnostic.ReportAsInfo (options, severity) then - diagnostics.Add(diagnostic, severity) + | FSharpDiagnosticSeverity.Hidden -> () + | sev -> diagnostics.Add(diagnostic, sev) override _.ErrorCount = errorCount @@ -313,23 +322,18 @@ type internal CompilationDiagnosticLogger (debugName: string, options: FSharpDia module DiagnosticHelpers = let ReportDiagnostic (options: FSharpDiagnosticOptions, allErrors, mainInputFileName, fileInfo, diagnostic: PhasedDiagnostic, severity, suggestNames, flatErrors, symbolEnv) = - [ let severity = - if diagnostic.ReportAsError (options, severity) then - FSharpDiagnosticSeverity.Error - else - severity - - if severity = FSharpDiagnosticSeverity.Error || - diagnostic.ReportAsWarning (options, severity) || - diagnostic.ReportAsInfo (options, severity) then + match diagnostic.AdjustSeverity(options, severity) with + | FSharpDiagnosticSeverity.Hidden -> [] + | adjustedSeverity -> // We use the first line of the file as a fallbackRange for reporting unexpected errors. // Not ideal, but it's hard to see what else to do. let fallbackRange = rangeN mainInputFileName 1 - let diagnostic = FSharpDiagnostic.CreateFromExceptionAndAdjustEof (diagnostic, severity, fallbackRange, fileInfo, suggestNames, flatErrors, symbolEnv) + let diagnostic = FSharpDiagnostic.CreateFromExceptionAndAdjustEof (diagnostic, adjustedSeverity, fallbackRange, fileInfo, suggestNames, flatErrors, symbolEnv) let fileName = diagnostic.Range.FileName if allErrors || fileName = mainInputFileName || fileName = TcGlobals.DummyFileNameForRangesWithoutASpecificLocation then - yield diagnostic ] + [diagnostic] + else [] let CreateDiagnostics (options, allErrors, mainInputFileName, diagnostics, suggestNames, flatErrors, symbolEnv) = let fileInfo = (Int32.MaxValue, Int32.MaxValue) diff --git a/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fsi b/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fsi index 252a15a33c..6c941bdd84 100644 --- a/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fsi +++ b/src/fcs-fable/src/Compiler/Symbols/FSharpDiagnostic.fsi @@ -101,6 +101,14 @@ module public ExtendedData = /// Argument identifier range within implementation file member ImplementationRange: range + [] + type DefinitionsInSigAndImplNotCompatibleAbbreviationsDifferExtendedData = + interface IFSharpDiagnosticExtendedData + /// Range of the signature type identifier. + member SignatureRange: range + /// Range of the implementation type identifier. + member ImplementationRange: range + open ExtendedData /// Represents a diagnostic produced by the F# compiler diff --git a/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fs b/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fs index ab0076847f..4ecdf64869 100644 --- a/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fs +++ b/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fs @@ -2,6 +2,7 @@ namespace FSharp.Compiler.Symbols +open System open System.IO open Internal.Utilities.Library @@ -117,8 +118,7 @@ module internal SymbolHelpers = | Item.ImplicitOp (_, {contents = Some(TraitConstraintSln.FSMethSln(vref=vref))}) -> Some vref.Range | Item.ImplicitOp _ -> None | Item.UnqualifiedType tcrefs -> tcrefs |> List.tryPick (rangeOfEntityRef preferFlag >> Some) - | Item.DelegateCtor ty - | Item.FakeInterfaceCtor ty -> ty |> tryNiceEntityRefOfTyOption |> Option.map (rangeOfEntityRef preferFlag) + | Item.DelegateCtor ty -> ty |> tryNiceEntityRefOfTyOption |> Option.map (rangeOfEntityRef preferFlag) | Item.NewDef _ -> None // Provided type definitions do not have a useful F# CCU for the purposes of goto-definition. @@ -189,7 +189,6 @@ module internal SymbolHelpers = | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTyOption >> Option.bind computeCcuOfTyconRef) - | Item.FakeInterfaceCtor(ty) | Item.DelegateCtor(ty) -> ty |> tryNiceEntityRefOfTyOption |> Option.bind computeCcuOfTyconRef @@ -262,7 +261,7 @@ module internal SymbolHelpers = | FSharpXmlDoc.None | FSharpXmlDoc.FromXmlText _ -> xmlDoc | FSharpXmlDoc.FromXmlFile(dllName, xmlSig) -> - TryFindXmlDocByAssemblyNameAndSig infoReader (Path.GetFileNameWithoutExtension dllName) xmlSig + TryFindXmlDocByAssemblyNameAndSig infoReader (!!Path.GetFileNameWithoutExtension(dllName)) xmlSig |> Option.map FSharpXmlDoc.FromXmlText |> Option.defaultValue xmlDoc @@ -289,11 +288,10 @@ module internal SymbolHelpers = | Item.ILField finfo -> mkXmlComment (GetXmlDocSigOfILFieldInfo infoReader m finfo) - | Item.FakeInterfaceCtor ty | Item.DelegateCtor ty | Item.Types(_, ty :: _) -> match ty with - | AbbrevOrAppTy tcref -> + | AbbrevOrAppTy(tcref, _) -> mkXmlComment (GetXmlDocSigOfEntityRef infoReader m tcref) | _ -> FSharpXmlDoc.None @@ -365,13 +363,13 @@ module internal SymbolHelpers = [ for tp, ty in prettyTyparInst -> wordL (tagTypeParameter ("'" + tp.DisplayName)) ^^ wordL (tagText (FSComp.SR.descriptionWordIs())) ^^ NicePrint.layoutType denv ty ] + [] let (|ItemWhereTypIsPreferred|_|) item = match item with | Item.DelegateCtor ty | Item.CtorGroup(_, [DefaultStructCtor(_, ty)]) - | Item.FakeInterfaceCtor ty - | Item.Types(_, [ty]) -> Some ty - | _ -> None + | Item.Types(_, [ty]) -> ValueSome ty + | _ -> ValueNone /// Specifies functions for comparing 'Item' objects with respect to the user /// (this means that some values that are not technically equal are treated as equal @@ -404,7 +402,6 @@ module internal SymbolHelpers = | Item.ActivePatternResult _ | Item.AnonRecdField _ | Item.OtherName _ - | Item.FakeInterfaceCtor _ | Item.ImplicitOp _ | Item.NewDef _ | Item.UnionCaseField _ @@ -416,66 +413,72 @@ module internal SymbolHelpers = //| _ -> false member x.Equals(item1, item2) = - // This may explore assemblies that are not in the reference set. - // In this case just bail out and assume items are not equal - protectAssemblyExploration false (fun () -> - let equalHeadTypes(ty1, ty2) = - match tryTcrefOfAppTy g ty1 with - | ValueSome tcref1 -> - match tryTcrefOfAppTy g ty2 with - | ValueSome tcref2 -> tyconRefEq g tcref1 tcref2 - | _ -> typeEquiv g ty1 ty2 - | _ -> typeEquiv g ty1 ty2 - - ItemsAreEffectivelyEqual g item1 item2 || - - // Much of this logic is already covered by 'ItemsAreEffectivelyEqual' - match item1, item2 with - | Item.DelegateCtor ty1, Item.DelegateCtor ty2 -> equalHeadTypes(ty1, ty2) - | Item.Types(dn1, ty1 :: _), Item.Types(dn2, ty2 :: _) -> - // Bug 4403: We need to compare names as well, because 'int' and 'Int32' are physically the same type, but we want to show both - dn1 = dn2 && equalHeadTypes(ty1, ty2) +#if !NO_CHECKNULLS + match item1,item2 with + | null,null -> true + | null,_ | _,null -> false + | item1,item2 -> +#endif + // This may explore assemblies that are not in the reference set. + // In this case just bail out and assume items are not equal + protectAssemblyExploration false (fun () -> + let equalHeadTypes(ty1, ty2) = + match tryTcrefOfAppTy g ty1 with + | ValueSome tcref1 -> + match tryTcrefOfAppTy g ty2 with + | ValueSome tcref2 -> tyconRefEq g tcref1 tcref2 + | _ -> typeEquiv g ty1 ty2 + | _ -> typeEquiv g ty1 ty2 + + ItemsAreEffectivelyEqual g item1 item2 || + + // Much of this logic is already covered by 'ItemsAreEffectivelyEqual' + match item1, item2 with + | Item.DelegateCtor ty1, Item.DelegateCtor ty2 -> equalHeadTypes(ty1, ty2) + | Item.Types(dn1, ty1 :: _), Item.Types(dn2, ty2 :: _) -> + // Bug 4403: We need to compare names as well, because 'int' and 'Int32' are physically the same type, but we want to show both + dn1 = dn2 && equalHeadTypes(ty1, ty2) - // Prefer a type to a DefaultStructCtor, a DelegateCtor and a FakeInterfaceCtor - | ItemWhereTypIsPreferred ty1, ItemWhereTypIsPreferred ty2 -> equalHeadTypes(ty1, ty2) - - | Item.ExnCase tcref1, Item.ExnCase tcref2 -> tyconRefEq g tcref1 tcref2 - | Item.ILField(fld1), Item.ILField(fld2) -> - ILFieldInfo.ILFieldInfosUseIdenticalDefinitions fld1 fld2 - | Item.CustomOperation (_, _, Some minfo1), Item.CustomOperation (_, _, Some minfo2) -> - MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2 - | Item.TypeVar (nm1, tp1), Item.TypeVar (nm2, tp2) -> - (nm1 = nm2) && typarRefEq tp1 tp2 - | Item.ModuleOrNamespaces(modref1 :: _), Item.ModuleOrNamespaces(modref2 :: _) -> fullDisplayTextOfModRef modref1 = fullDisplayTextOfModRef modref2 - | Item.SetterArg(id1, _), Item.SetterArg(id2, _) -> Range.equals id1.idRange id2.idRange && id1.idText = id2.idText - | Item.MethodGroup(_, meths1, _), Item.MethodGroup(_, meths2, _) -> - Seq.zip meths1 meths2 |> Seq.forall (fun (minfo1, minfo2) -> - MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2) - | (Item.Value vref1 | Item.CustomBuilder (_, vref1)), (Item.Value vref2 | Item.CustomBuilder (_, vref2)) -> - valRefEq g vref1 vref2 - | Item.ActivePatternCase(APElemRef(_apinfo1, vref1, idx1, _)), Item.ActivePatternCase(APElemRef(_apinfo2, vref2, idx2, _)) -> - idx1 = idx2 && valRefEq g vref1 vref2 - | Item.UnionCase(UnionCaseInfo(_, ur1), _), Item.UnionCase(UnionCaseInfo(_, ur2), _) -> - g.unionCaseRefEq ur1 ur2 - | Item.RecdField(RecdFieldInfo(_, RecdFieldRef(tcref1, n1))), Item.RecdField(RecdFieldInfo(_, RecdFieldRef(tcref2, n2))) -> - (tyconRefEq g tcref1 tcref2) && (n1 = n2) // there is no direct function as in the previous case - | Item.Property(info = pi1s), Item.Property(info = pi2s) -> - (pi1s, pi2s) ||> List.forall2 PropInfo.PropInfosUseIdenticalDefinitions - | Item.Event evt1, Item.Event evt2 -> - EventInfo.EventInfosUseIdenticalDefinitions evt1 evt2 - | Item.AnonRecdField(anon1, _, i1, _), Item.AnonRecdField(anon2, _, i2, _) -> - anonInfoEquiv anon1 anon2 && i1 = i2 - | Item.Trait traitInfo1, Item.Trait traitInfo2 -> - (traitInfo1.MemberLogicalName = traitInfo2.MemberLogicalName) - | Item.CtorGroup(_, meths1), Item.CtorGroup(_, meths2) -> - (meths1, meths2) - ||> List.forall2 MethInfo.MethInfosUseIdenticalDefinitions - | Item.UnqualifiedType tcrefs1, Item.UnqualifiedType tcrefs2 -> - (tcrefs1, tcrefs2) - ||> List.forall2 (fun tcref1 tcref2 -> tyconRefEq g tcref1 tcref2) - | Item.Types(_, [AbbrevOrAppTy tcref1]), Item.UnqualifiedType([tcref2]) -> tyconRefEq g tcref1 tcref2 - | Item.UnqualifiedType([tcref1]), Item.Types(_, [AbbrevOrAppTy tcref2]) -> tyconRefEq g tcref1 tcref2 - | _ -> false) + // Prefer a type to a DefaultStructCtor, a DelegateCtor and a FakeInterfaceCtor + | ItemWhereTypIsPreferred ty1, ItemWhereTypIsPreferred ty2 -> equalHeadTypes(ty1, ty2) + + | Item.ExnCase tcref1, Item.ExnCase tcref2 -> tyconRefEq g tcref1 tcref2 + | Item.ILField(fld1), Item.ILField(fld2) -> + ILFieldInfo.ILFieldInfosUseIdenticalDefinitions fld1 fld2 + | Item.CustomOperation (_, _, Some minfo1), Item.CustomOperation (_, _, Some minfo2) -> + MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2 + | Item.TypeVar (nm1, tp1), Item.TypeVar (nm2, tp2) -> + (nm1 = nm2) && typarRefEq tp1 tp2 + | Item.ModuleOrNamespaces(modref1 :: _), Item.ModuleOrNamespaces(modref2 :: _) -> fullDisplayTextOfModRef modref1 = fullDisplayTextOfModRef modref2 + | Item.SetterArg(id1, _), Item.SetterArg(id2, _) -> Range.equals id1.idRange id2.idRange && id1.idText = id2.idText + | Item.MethodGroup(_, meths1, _), Item.MethodGroup(_, meths2, _) -> + Seq.zip meths1 meths2 |> Seq.forall (fun (minfo1, minfo2) -> + MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2) + | (Item.Value vref1 | Item.CustomBuilder (_, vref1)), (Item.Value vref2 | Item.CustomBuilder (_, vref2)) -> + valRefEq g vref1 vref2 + | Item.ActivePatternCase(APElemRef(_apinfo1, vref1, idx1, _)), Item.ActivePatternCase(APElemRef(_apinfo2, vref2, idx2, _)) -> + idx1 = idx2 && valRefEq g vref1 vref2 + | Item.UnionCase(UnionCaseInfo(_, ur1), _), Item.UnionCase(UnionCaseInfo(_, ur2), _) -> + g.unionCaseRefEq ur1 ur2 + | Item.RecdField(RecdFieldInfo(_, RecdFieldRef(tcref1, n1))), Item.RecdField(RecdFieldInfo(_, RecdFieldRef(tcref2, n2))) -> + (tyconRefEq g tcref1 tcref2) && (n1 = n2) // there is no direct function as in the previous case + | Item.Property(info = pi1s), Item.Property(info = pi2s) -> + (pi1s, pi2s) ||> List.forall2 PropInfo.PropInfosUseIdenticalDefinitions + | Item.Event evt1, Item.Event evt2 -> + EventInfo.EventInfosUseIdenticalDefinitions evt1 evt2 + | Item.AnonRecdField(anon1, _, i1, _), Item.AnonRecdField(anon2, _, i2, _) -> + anonInfoEquiv anon1 anon2 && i1 = i2 + | Item.Trait traitInfo1, Item.Trait traitInfo2 -> + (traitInfo1.MemberLogicalName = traitInfo2.MemberLogicalName) + | Item.CtorGroup(_, meths1), Item.CtorGroup(_, meths2) -> + (meths1, meths2) + ||> List.forall2 MethInfo.MethInfosUseIdenticalDefinitions + | Item.UnqualifiedType tcrefs1, Item.UnqualifiedType tcrefs2 -> + (tcrefs1, tcrefs2) + ||> List.forall2 (fun tcref1 tcref2 -> tyconRefEq g tcref1 tcref2) + | Item.Types(_, [AbbrevOrAppTy(tcref1, _)]), Item.UnqualifiedType([tcref2]) -> tyconRefEq g tcref1 tcref2 + | Item.UnqualifiedType([tcref1]), Item.Types(_, [AbbrevOrAppTy(tcref2, _)]) -> tyconRefEq g tcref1 tcref2 + | _ -> false) member x.GetHashCode item = // This may explore assemblies that are not in the reference set. @@ -510,7 +513,6 @@ module internal SymbolHelpers = | Item.ActivePatternResult _ | Item.AnonRecdField _ | Item.OtherName _ - | Item.FakeInterfaceCtor _ | Item.ImplicitOp _ | Item.NewDef _ | Item.UnionCaseField _ @@ -553,6 +555,7 @@ module internal SymbolHelpers = let SimplerDisplayEnv denv = { denv with shortConstraints=true showStaticallyResolvedTyparAnnotations=false + showNullnessAnnotations = Some true abbreviateAdditionalConstraints=false suppressNestedTypes=true maxMembers=Some EnvMisc2.maxMembers } @@ -577,7 +580,6 @@ module internal SymbolHelpers = | Item.MethodGroup(_, _, Some minfo) -> buildString (fun os -> NicePrint.outputTyconRef denv os minfo.DeclaringTyconRef; bprintf os ".%s" minfo.DisplayName) | Item.MethodGroup(_, minfo :: _, _) -> buildString (fun os -> NicePrint.outputTyconRef denv os minfo.DeclaringTyconRef; bprintf os ".%s" minfo.DisplayName) | Item.UnqualifiedType (tcref :: _) -> buildString (fun os -> NicePrint.outputTyconRef denv os tcref) - | Item.FakeInterfaceCtor ty | Item.DelegateCtor ty | Item.Types(_, ty :: _) -> match tryTcrefOfAppTy g ty with @@ -661,7 +663,7 @@ module internal SymbolHelpers = | Item.Types(_, tys) -> let doc = match tys with - | AbbrevOrAppTy tcref :: _ -> + | AbbrevOrAppTy(tcref, _) :: _ -> if tyconRefUsesLocalXmlDoc g.compilingFSharpCore tcref || tcref.XmlDoc.NonEmpty then Some tcref.XmlDoc else @@ -722,7 +724,6 @@ module internal SymbolHelpers = | Item.ActivePatternResult _ | Item.NewDef _ | Item.ILField _ - | Item.FakeInterfaceCtor _ | Item.DelegateCtor _ -> //| _ -> GetXmlCommentForItemAux None infoReader m item @@ -744,19 +745,21 @@ module internal SymbolHelpers = #if !NO_TYPEPROVIDERS /// Determine if an item is a provided type + [] let (|ItemIsProvidedType|_|) g item = match item with | Item.Types(_name, tys) -> match tys with | [AppTy g (tcref, _typeInst)] -> if tcref.IsProvidedErasedTycon || tcref.IsProvidedGeneratedTycon then - Some tcref + ValueSome tcref else - None - | _ -> None - | _ -> None + ValueNone + | _ -> ValueNone + | _ -> ValueNone /// Determine if an item is a provided type that has static parameters + [] let (|ItemIsProvidedTypeWithStaticArguments|_|) m g item = match item with | Item.Types(_name, tys) -> @@ -769,38 +772,40 @@ module internal SymbolHelpers = | _ -> failwith "unreachable" let staticParameters = typeBeforeArguments.PApplyWithProvider((fun (typeBeforeArguments, provider) -> typeBeforeArguments.GetStaticParameters provider), range=m) let staticParameters = staticParameters.PApplyArray(id, "GetStaticParameters", m) - Some staticParameters + ValueSome staticParameters else - None - | _ -> None - | _ -> None + ValueNone + | _ -> ValueNone + | _ -> ValueNone + [] let (|ItemIsProvidedMethodWithStaticArguments|_|) item = match item with // Prefer the static parameters from the uninstantiated method info | Item.MethodGroup(_, _, Some minfo) -> match minfo.ProvidedStaticParameterInfo with - | Some (_, staticParameters) -> Some staticParameters - | _ -> None + | Some (_, staticParameters) -> ValueSome staticParameters + | _ -> ValueNone | Item.MethodGroup(_, [minfo], _) -> match minfo.ProvidedStaticParameterInfo with - | Some (_, staticParameters) -> Some staticParameters - | _ -> None - | _ -> None + | Some (_, staticParameters) -> ValueSome staticParameters + | _ -> ValueNone + | _ -> ValueNone /// Determine if an item has static arguments + [] let (|ItemIsWithStaticArguments|_|) m g item = match item with - | ItemIsProvidedTypeWithStaticArguments m g staticParameters -> Some staticParameters - | ItemIsProvidedMethodWithStaticArguments staticParameters -> Some staticParameters - | _ -> None + | ItemIsProvidedTypeWithStaticArguments m g staticParameters -> ValueSome staticParameters + | ItemIsProvidedMethodWithStaticArguments staticParameters -> ValueSome staticParameters + | _ -> ValueNone #endif /// Get the "F1 Keyword" associated with an item, for looking up documentation help indexes on the web let rec GetF1Keyword (g: TcGlobals) item = - let getKeywordForMethInfo (minfo : MethInfo) = + let rec getKeywordForMethInfo (minfo : MethInfo) = match minfo with | FSMeth(_, _, vref, _) -> match vref.TryDeclaringEntity with @@ -815,6 +820,7 @@ module internal SymbolHelpers = if nGenericParams > 0 then "``"+(nGenericParams.ToString()) else "" sprintf "%s.%s%s" typeString minfo.RawMetadata.Name paramString |> Some + | MethInfoWithModifiedReturnType(mi,_) -> getKeywordForMethInfo mi | DefaultStructCtor _ -> None #if !NO_TYPEPROVIDERS | ProvidedMeth _ -> None @@ -854,7 +860,6 @@ module internal SymbolHelpers = #endif | Item.Types(_, AppTy g (tcref, _) :: _) | Item.DelegateCtor(AppTy g (tcref, _)) - | Item.FakeInterfaceCtor(AppTy g (tcref, _)) | Item.UnqualifiedType (tcref :: _) | Item.ExnCase tcref -> // strip off any abbreviation @@ -865,7 +870,6 @@ module internal SymbolHelpers = // Pathological cases of the above | Item.Types _ | Item.DelegateCtor _ - | Item.FakeInterfaceCtor _ | Item.UnqualifiedType [] -> None @@ -882,7 +886,7 @@ module internal SymbolHelpers = // works similar to generation of xml-docs at tastops.fs, probably too similar // TODO: check if this code can be implemented using xml-doc generation functionality let prefix = path.AccessPath |> Seq.map fst |> String.concat "." - let fullName = if prefix = "" then modref.CompiledName else prefix + "." + modref.CompiledName + let fullName = if String.IsNullOrEmpty(prefix) then modref.CompiledName else prefix + "." + modref.CompiledName Some fullName ) #endif @@ -964,7 +968,6 @@ module internal SymbolHelpers = minfos |> List.map (fun minfo -> { Item = Item.MethodGroup(nm, [minfo], orig); TyparInstantiation = item.TyparInstantiation }) | Item.CtorGroup(nm, cinfos) -> cinfos |> List.map (fun minfo -> { Item = Item.CtorGroup(nm, [minfo]); TyparInstantiation = item.TyparInstantiation }) - | Item.FakeInterfaceCtor _ | Item.DelegateCtor _ -> [item] | Item.NewDef _ | Item.ILField _ -> [] diff --git a/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fsi b/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fsi index b25bf18d60..e2eef38bbb 100755 --- a/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fsi +++ b/src/fcs-fable/src/Compiler/Symbols/SymbolHelpers.fsi @@ -59,13 +59,16 @@ module internal SymbolHelpers = val SelectMethodGroupItems2: TcGlobals -> range -> ItemWithInst -> ItemWithInst list #if !NO_TYPEPROVIDERS - val (|ItemIsProvidedType|_|): TcGlobals -> Item -> TyconRef option + [] + val (|ItemIsProvidedType|_|): TcGlobals -> Item -> TyconRef voption + [] val (|ItemIsWithStaticArguments|_|): - range -> TcGlobals -> Item -> Tainted[] option + range -> TcGlobals -> Item -> Tainted[] voption + [] val (|ItemIsProvidedTypeWithStaticArguments|_|): - range -> TcGlobals -> Item -> Tainted[] option + range -> TcGlobals -> Item -> Tainted[] voption #endif val SimplerDisplayEnv: DisplayEnv -> DisplayEnv diff --git a/src/fcs-fable/src/Compiler/Symbols/Symbols.fs b/src/fcs-fable/src/Compiler/Symbols/Symbols.fs index 08e9fac7d4..f8793c7f52 100644 --- a/src/fcs-fable/src/Compiler/Symbols/Symbols.fs +++ b/src/fcs-fable/src/Compiler/Symbols/Symbols.fs @@ -26,15 +26,16 @@ open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics open FSharp.Compiler.TypedTreeOps open FSharp.Compiler.TypeHierarchy +open FSharp.Compiler.CheckExpressionsOps type FSharpAccessibility(a:Accessibility, ?isProtected) = let isProtected = defaultArg isProtected false let isInternalCompPath x = match x with - | CompPath(ILScopeRef.Local, []) -> true + | CompPath(ILScopeRef.Local, _, []) -> true | _ -> false - + let (|Public|Internal|Private|) (TAccess p) = match p with | [] -> Public @@ -53,12 +54,12 @@ type FSharpAccessibility(a:Accessibility, ?isProtected) = override _.ToString() = let (TAccess paths) = a - let mangledTextOfCompPath (CompPath(scoref, path)) = getNameOfScopeRef scoref + "/" + textOfPath (List.map fst path) + let mangledTextOfCompPath (CompPath(scoref, _, path)) = getNameOfScopeRef scoref + "/" + textOfPath (List.map fst path) String.concat ";" (List.map mangledTextOfCompPath paths) type SymbolEnv(g: TcGlobals, thisCcu: CcuThunk, thisCcuTyp: ModuleOrNamespaceType option, tcImports: TcImports, amap: Import.ImportMap, infoReader: InfoReader) = - let tcVal = CheckExpressions.LightweightTcValForUsingInBuildMethodCall g + let tcVal = LightweightTcValForUsingInBuildMethodCall g new(g: TcGlobals, thisCcu: CcuThunk, thisCcuTyp: ModuleOrNamespaceType option, tcImports: TcImports) = let amap = tcImports.GetImportMap() @@ -126,7 +127,7 @@ module Impl = | ILScopeRef.Assembly aref -> aref.Name | ILScopeRef.Module mref -> mref.Name | ILScopeRef.PrimaryAssembly -> ilg.primaryAssemblyName - let canAccessCompPathFromCrossProject (CompPath(scoref1, cpath1)) (CompPath(scoref2, cpath2)) = + let canAccessCompPathFromCrossProject (CompPath(scoref1, _, cpath1)) (CompPath(scoref2, _, cpath2)) = let rec loop p1 p2 = match p1, p2 with | (a1, k1) :: rest1, (a2, k2) :: rest2 -> (a1=a2) && (k1=k2) && loop rest1 rest2 @@ -145,7 +146,7 @@ module Impl = | ILMemberAccess.CompilerControlled | ILMemberAccess.FamilyAndAssembly | ILMemberAccess.Assembly -> - taccessPrivate (CompPath(declaringEntity.CompilationPath.ILScopeRef, [])) + taccessPrivate (CompPath(declaringEntity.CompilationPath.ILScopeRef, SyntaxAccess.Unknown, [])) | ILMemberAccess.Private -> taccessPrivate declaringEntity.CompilationPath @@ -170,7 +171,7 @@ module Impl = match td.Access with | ILTypeDefAccess.Public | ILTypeDefAccess.Nested ILMemberAccess.Public -> taccessPublic - | ILTypeDefAccess.Private -> taccessPrivate (CompPath(entity.CompilationPath.ILScopeRef, [])) + | ILTypeDefAccess.Private -> taccessPrivate (CompPath(entity.CompilationPath.ILScopeRef, SyntaxAccess.Unknown, [])) | ILTypeDefAccess.Nested nested -> getApproxFSharpAccessibilityOfMember entity nested | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> @@ -296,12 +297,12 @@ type FSharpSymbol(cenv: SymbolEnv, item: unit -> Item, access: FSharpSymbol -> C | Item.CtorGroup(_, cinfo :: _) -> FSharpMemberOrFunctionOrValue(cenv, C cinfo, item) :> _ - | Item.DelegateCtor (AbbrevOrAppTy tcref) -> - FSharpEntity(cenv, tcref) :>_ + | Item.DelegateCtor (AbbrevOrAppTy(tcref, tyargs)) + | Item.Types(_, AbbrevOrAppTy(tcref, tyargs) :: _) -> + FSharpEntity(cenv, tcref, tyargs) :>_ - | Item.UnqualifiedType(tcref :: _) - | Item.Types(_, AbbrevOrAppTy tcref :: _) -> - FSharpEntity(cenv, tcref) :>_ + | Item.UnqualifiedType(tcref :: _) -> + FSharpEntity(cenv, tcref) :> _ | Item.ModuleOrNamespaces(modref :: _) -> FSharpEntity(cenv, modref) :> _ @@ -335,7 +336,6 @@ type FSharpSymbol(cenv: SymbolEnv, item: unit -> Item, access: FSharpSymbol -> C // TODO: the following don't currently return any interesting subtype | Item.ImplicitOp _ | Item.ILField _ - | Item.FakeInterfaceCtor _ | Item.NewDef _ -> dflt() // These cases cover unreachable cases | Item.CustomOperation (_, _, None) @@ -360,7 +360,7 @@ type FSharpSymbol(cenv: SymbolEnv, item: unit -> Item, access: FSharpSymbol -> C member sym.TryGetAttribute<'T>() = sym.Attributes |> Seq.tryFind (fun attr -> attr.IsAttribute<'T>()) -type FSharpEntity(cenv: SymbolEnv, entity: EntityRef) = +type FSharpEntity(cenv: SymbolEnv, entity: EntityRef, tyargs: TType list) = inherit FSharpSymbol(cenv, (fun () -> checkEntityIsResolved entity @@ -388,6 +388,10 @@ type FSharpEntity(cenv: SymbolEnv, entity: EntityRef) = | None -> false | Some ccu -> ccuEq ccu cenv.g.fslibCcu + new(cenv: SymbolEnv, tcref: TyconRef) = + let _, _, tyargs = FreshenTypeInst cenv.g range0 (tcref.Typars range0) + FSharpEntity(cenv, tcref, tyargs) + member _.Entity = entity member _.LogicalName = @@ -410,13 +414,13 @@ type FSharpEntity(cenv: SymbolEnv, entity: EntityRef) = checkIsResolved() match entity.CompilationPathOpt with | None -> "global" - | Some (CompPath(_, [])) -> "global" + | Some (CompPath(_, _, [])) -> "global" | Some cp -> buildAccessPath (Some cp) member x.DeclaringEntity = match entity.CompilationPathOpt with | None -> None - | Some (CompPath(_, [])) -> None + | Some (CompPath(_, _, [])) -> None | Some cp -> match x.Assembly.Contents.FindEntityByPath cp.MangledPath with | Some res -> Some res @@ -432,7 +436,7 @@ type FSharpEntity(cenv: SymbolEnv, entity: EntityRef) = checkIsResolved() match entity.CompilationPathOpt with | None -> None - | Some (CompPath(_, [])) -> None + | Some (CompPath(_, _, [])) -> None | Some cp when cp.AccessPath |> List.forall (function _, ModuleOrNamespaceKind.Namespace _ -> true | _ -> false) -> Some (buildAccessPath (Some cp)) | Some _ -> None @@ -485,6 +489,10 @@ type FSharpEntity(cenv: SymbolEnv, entity: EntityRef) = checkIsResolved() entity.TyparsNoRange |> List.map (fun tp -> FSharpGenericParameter(cenv, tp)) |> makeReadOnlyCollection + member _.GenericArguments = + checkIsResolved() + tyargs |> List.map (fun ty -> FSharpType(cenv, ty)) |> makeReadOnlyCollection + member _.IsMeasure = isResolvedAndFSharp() && (entity.TypeOrMeasureKind = TyparKind.Measure) @@ -723,7 +731,7 @@ type FSharpEntity(cenv: SymbolEnv, entity: EntityRef) = if isUnresolved() then makeReadOnlyCollection [] else entity.ModuleOrNamespaceType.AllEntities |> QueueList.toList - |> List.map (fun x -> FSharpEntity(cenv, entity.NestedTyconRef x)) + |> List.map (fun x -> FSharpEntity(cenv, entity.NestedTyconRef x, tyargs)) |> makeReadOnlyCollection member _.UnionCases = @@ -771,7 +779,7 @@ type FSharpEntity(cenv: SymbolEnv, entity: EntityRef) = member _.AllCompilationPaths = checkIsResolved() - let (CompPath(_, parts)) = entity.CompilationPath + let (CompPath(_, _, parts)) = entity.CompilationPath let partsList = [ yield parts match parts with @@ -1465,18 +1473,18 @@ type FSharpGenericParameterMemberConstraint(cenv, info: TraitConstraintInfo) = (fun () -> Item.Trait(info)), (fun _ _ _ad -> true)) - let (TTrait(tys, nm, flags, atys, retTy, _)) = info member _.MemberSources = - tys |> List.map (fun ty -> FSharpType(cenv, ty)) |> makeReadOnlyCollection + info.SupportTypes |> List.map (fun ty -> FSharpType(cenv, ty)) |> makeReadOnlyCollection - member _.MemberName = nm + member _.MemberName = info.MemberLogicalName - member _.MemberIsStatic = not flags.IsInstance + member _.MemberIsStatic = not info.MemberFlags.IsInstance - member _.MemberArgumentTypes = atys |> List.map (fun ty -> FSharpType(cenv, ty)) |> makeReadOnlyCollection + member _.MemberArgumentTypes = + info.CompiledObjectAndArgumentTypes |> List.map (fun ty -> FSharpType(cenv, ty)) |> makeReadOnlyCollection member _.MemberReturnType = - match retTy with + match info.CompiledReturnType with | None -> FSharpType(cenv, cenv.g.unit_ty) | Some ty -> FSharpType(cenv, ty) override x.ToString() = "" @@ -1567,6 +1575,11 @@ type FSharpGenericParameterConstraint(cenv, cx: TyparConstraint) = | TyparConstraint.SupportsComparison _ -> true | _ -> false + member _.IsNotSupportsNullConstraint = + match cx with + | TyparConstraint.NotSupportsNull _ -> true + | _ -> false + member _.IsEqualityConstraint = match cx with | TyparConstraint.SupportsEquality _ -> true @@ -1693,7 +1706,7 @@ type FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = | Some v -> v | None -> failwith "DeclarationLocation property not available" - member _.DeclaringEntity = + member _.DeclaringEntity: FSharpEntity option = checkIsResolved() match d with | E e -> FSharpEntity(cenv, e.DeclaringTyconRef) |> Some @@ -1704,12 +1717,16 @@ type FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = | ParentNone -> None | Parent p -> FSharpEntity(cenv, p) |> Some - member _.ApparentEnclosingEntity = + member _.ApparentEnclosingEntity: FSharpEntity = + let createEntity (ttype: TType) = + let tcref, tyargs = destAppTy cenv.g ttype + FSharpEntity(cenv, tcref, tyargs) + checkIsResolved() match d with - | E e -> FSharpEntity(cenv, e.ApparentEnclosingTyconRef) - | P p -> FSharpEntity(cenv, p.ApparentEnclosingTyconRef) - | M m | C m -> FSharpEntity(cenv, m.ApparentEnclosingTyconRef) + | E e -> createEntity e.ApparentEnclosingType + | P p -> createEntity p.ApparentEnclosingType + | M m | C m -> createEntity m.ApparentEnclosingType | V v -> match v.ApparentEnclosingEntity with | ParentNone -> invalidOp "the value or member doesn't have a logical parent" @@ -1775,7 +1792,11 @@ type FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = match d with | P p -> p.IsUnionCaseTester | M m -> m.IsUnionCaseTester - | E _ | C _ | V _ -> invalidOp "the value or member is not a property" + | V v -> + v.IsPropertyGetterMethod && + v.LogicalName.StartsWith("get_Is") && + v.IsImplied && v.MemberApparentEntity.IsUnionTycon + | E _ | C _ -> false member _.EventAddMethod = checkIsResolved() @@ -2376,18 +2397,54 @@ type FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = | _ -> NicePrint.stringOfMethInfoFSharpStyle cenv.infoReader m displayEnv methInfo let stringValOfPropInfo (p: PropInfo) = - match p with - | DifferentGetterAndSetter(getValRef, setValRef) -> - let g = NicePrint.stringValOrMember displayEnv cenv.infoReader getValRef - let s = NicePrint.stringValOrMember displayEnv cenv.infoReader setValRef - $"{g}\n{s}" - | _ -> - let t = p.GetPropertyType(cenv.amap, m ) |> NicePrint.layoutType displayEnv |> LayoutRender.showL + let supportAccessModifiersBeforeGetSet = + cenv.g.langVersion.SupportsFeature Features.LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters + if not supportAccessModifiersBeforeGetSet then + match p with + | DifferentGetterAndSetter(getValRef, setValRef) -> + let g = NicePrint.stringValOrMember displayEnv cenv.infoReader getValRef + let s = NicePrint.stringValOrMember displayEnv cenv.infoReader setValRef + $"{g}\n{s}" + | _ -> + let t = p.GetPropertyType(cenv.amap, m) |> NicePrint.layoutType displayEnv |> LayoutRender.showL + let withGetSet = + if p.HasGetter && p.HasSetter then "with get, set" + elif p.HasGetter then "with get" + elif p.HasSetter then "with set" + else "" + + $"member %s{p.DisplayName}: %s{t} %s{withGetSet}" + else + let layoutAccessibilityCore (denv: DisplayEnv) accessibility = + let isInternalCompPath x = + match x with + | CompPath(ILScopeRef.Local, _, []) -> true + | _ -> false + let (|Public|Internal|Private|) (TAccess p) = + match p with + | [] -> Public + | _ when List.forall isInternalCompPath p -> Internal + | _ -> Private + match denv.contextAccessibility, accessibility with + | Public, Internal -> "internal " + | Public, Private -> "private " + | Internal, Private -> "private " + | _ -> String.Empty + + let getterAccess, setterAccess = + layoutAccessibilityCore displayEnv (Option.defaultValue taccessPublic p.GetterAccessibility), + layoutAccessibilityCore displayEnv (Option.defaultValue taccessPublic p.SetterAccessibility) + let t = p.GetPropertyType(cenv.amap, m) |> NicePrint.layoutType displayEnv |> LayoutRender.showL let withGetSet = - if p.HasGetter && p.HasSetter then "with get, set" - elif p.HasGetter then "with get" - elif p.HasSetter then "with set" - else "" + match p.HasGetter, p.HasSetter with + | true, false -> + $"with %s{getterAccess}get" + | false, true -> + $"with %s{setterAccess}set" + | true, true -> + $"with %s{getterAccess}get, %s{setterAccess}set" + | false, false -> + String.Empty $"member %s{p.DisplayName}: %s{t} %s{withGetSet}" @@ -2458,7 +2515,7 @@ type FSharpType(cenv, ty:TType) = let isUnresolved() = DiagnosticsLogger.protectAssemblyExploration true <| fun () -> match stripTyparEqns ty with - | TType_app (tcref, _, _) -> FSharpEntity(cenv, tcref).IsUnresolved + | TType_app (tcref, tyargs, _) -> FSharpEntity(cenv, tcref, tyargs).IsUnresolved | TType_measure (Measure.Const tcref) -> FSharpEntity(cenv, tcref).IsUnresolved | TType_measure (Measure.Prod _) -> FSharpEntity(cenv, cenv.g.measureproduct_tcr).IsUnresolved | TType_measure Measure.One -> FSharpEntity(cenv, cenv.g.measureone_tcr).IsUnresolved @@ -2502,13 +2559,30 @@ type FSharpType(cenv, ty:TType) = member _.TypeDefinition = protect <| fun () -> match stripTyparEqns ty with - | TType_app (tcref, _, _) -> FSharpEntity(cenv, tcref) + | TType_app (tcref, tyargs, _) -> FSharpEntity(cenv, tcref, tyargs) | TType_measure (Measure.Const tcref) -> FSharpEntity(cenv, tcref) | TType_measure (Measure.Prod _) -> FSharpEntity(cenv, cenv.g.measureproduct_tcr) | TType_measure Measure.One -> FSharpEntity(cenv, cenv.g.measureone_tcr) | TType_measure (Measure.Inv _) -> FSharpEntity(cenv, cenv.g.measureinverse_tcr) | _ -> invalidOp "not a named type" + member _.HasNullAnnotation = + protect <| fun () -> + match stripTyparEqns ty with + | TType_var (_, nullness) + | TType_app (_, _, nullness) + | TType_fun(_, _, nullness) -> match nullness.Evaluate() with NullnessInfo.WithNull -> true | _ -> false + | TType_tuple (_, _) -> false + | _ -> false + + member _.IsNullAmbivalent = + protect <| fun () -> + match stripTyparEqns ty with + | TType_app (_, _, nullness) + | TType_fun(_, _, nullness) -> match nullness.Evaluate() with NullnessInfo.AmbivalentToNull -> true | _ -> false + | TType_tuple (_, _) -> false + | _ -> false + member _.GenericArguments = protect <| fun () -> match stripTyparEqns ty with @@ -2731,8 +2805,8 @@ type FSharpAttribute(cenv: SymbolEnv, attrib: AttribInfo) = | AttribInfo.FSAttribInfo(g, attrib) -> NicePrint.stringOfFSAttrib (context.Contents g) attrib | AttribInfo.ILAttribInfo (g, _, _scoref, cattr, _) -> - let parms, _args = decodeILAttribData cattr - NicePrint.stringOfILAttrib (context.Contents g) (cattr.Method.DeclaringType, parms) + let params_, _args = decodeILAttribData cattr + NicePrint.stringOfILAttrib (context.Contents g) (cattr.Method.DeclaringType, params_) member _.Range = attrib.Range @@ -2961,4 +3035,3 @@ type FSharpOpenDeclaration(target: SynOpenDeclTarget, range: range option, modul member _.AppliedScope = appliedScope member _.IsOwnNamespace = isOwnNamespace - diff --git a/src/fcs-fable/src/Compiler/Symbols/Symbols.fsi b/src/fcs-fable/src/Compiler/Symbols/Symbols.fsi index 4050073c70..5c26d2d42e 100644 --- a/src/fcs-fable/src/Compiler/Symbols/Symbols.fsi +++ b/src/fcs-fable/src/Compiler/Symbols/Symbols.fsi @@ -108,7 +108,7 @@ type FSharpSymbol = /// Gets the display name for the symbol. Double backticks are added if the name is not a valid identifier. /// - /// For FSharpParameter symbols without a name for the paramater, this returns "````" + /// For FSharpParameter symbols without a name for the parameter, this returns "````" member DisplayName: string /// Get the implementation location for the symbol if it was declared in a signature that has an implementation @@ -265,6 +265,10 @@ type FSharpEntity = /// Get the generic parameters, possibly including unit-of-measure parameters member GenericParameters: IList + + /// Get the generic parameters, possibly including unit-of-measure parameters + member GenericArguments: IList + #if !NO_TYPEPROVIDERS /// Get the static parameters for a provided type member StaticParameters: IList @@ -656,7 +660,7 @@ type FSharpGenericParameterMemberConstraint = /// Get the name of the method required by the constraint member MemberName: string - /// Indicates if the the method required by the constraint must be static + /// Indicates if the method required by the constraint must be static member MemberIsStatic: bool /// Get the argument types of the method required by the constraint @@ -973,7 +977,7 @@ type FSharpMemberOrFunctionOrValue = /// Get the signature text to include this Symbol into an existing signature file. member GetValSignatureText: displayContext: FSharpDisplayContext * m: range -> string option - /// Check if this method has an entrpoint that accepts witness arguments and if so return + /// Check if this method has an entrypoint that accepts witness arguments and if so return /// the name of that entrypoint and information about the additional witness arguments member GetWitnessPassingInfo: unit -> (string * IList) option @@ -1084,6 +1088,12 @@ type FSharpType = /// Get the type definition for a type member TypeDefinition: FSharpEntity + /// Indicates this type is known to have a null annotation + member HasNullAnnotation: bool + + /// Indicates this type is assumed to support the null value + member IsNullAmbivalent: bool + /// Get the generic arguments for a tuple type, a function type or a type constructed using a named entity member GenericArguments: IList @@ -1193,7 +1203,7 @@ type FSharpAttribute = /// Get the range of the name of the attribute member Range: range - /// Indicates if attribute matchies the full name of the given type parameter + /// Indicates if attribute matches the full name of the given type parameter member IsAttribute<'T> : unit -> bool /// Represents open declaration in F# code. diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fs b/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fs index e592960c6b..e6d90a4b04 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fs @@ -4,13 +4,14 @@ /// Implements the offside rule and a couple of other lexical transformations. module internal FSharp.Compiler.LexFilter +open System open System.Collections.Generic open Internal.Utilities.Text.Lexing -open FSharp.Compiler open Internal.Utilities.Library open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Features +open FSharp.Compiler.LexerStore open FSharp.Compiler.Lexhelp open FSharp.Compiler.ParseHelpers open FSharp.Compiler.Parser @@ -181,18 +182,20 @@ let infixTokenLength token = // // LBRACK_LESS and GREATER_RBRACK are not here because adding them in these active patterns // causes more offside warnings, while removing them doesn't add offside warnings in attributes. +[] let (|TokenLExprParen|_|) token = match token with | BEGIN | LPAREN | LBRACE _ | LBRACE_BAR | LBRACK | LBRACK_BAR | LQUOTE _ | LESS true - -> Some () - | _ -> None + -> ValueSome () + | _ -> ValueNone /// Matches against a right-parenthesis-like token that is valid in expressions. +[] let (|TokenRExprParen|_|) token = match token with | END | RPAREN | RBRACE _ | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true - -> Some () - | _ -> None + -> ValueSome () + | _ -> ValueNone /// Determine the tokens that may align with the 'if' of an 'if/then/elif/else' without closing /// the construct @@ -511,55 +514,93 @@ type TokenTupPool() = // Utilities for the tokenizer that are needed in other places //--------------------------------------------------------------------------*) +#if FABLE_COMPILER + +[] +let (|Equals|_|) (s: string) (span: string) = + if span.Equals(s) then ValueSome Equals + else ValueNone + +[] +let (|StartsWith|_|) (s: string) (span: string) = + if span.StartsWith(s) then ValueSome StartsWith + else ValueNone + +#else + +[] +let (|Equals|_|) (s: string) (span: ReadOnlySpan) = + if span.SequenceEqual(s.AsSpan()) then ValueSome Equals + else ValueNone + +[] +let (|StartsWith|_|) (s: string) (span: ReadOnlySpan) = + if span.StartsWith(s.AsSpan()) then ValueSome StartsWith + else ValueNone + +#endif + // Strip a bunch of leading '>' of a token, at the end of a typar application // Note: this is used in the 'service.fs' to do limited postprocessing +[] let (|TyparsCloseOp|_|) (txt: string) = - let angles = txt |> Seq.takeWhile (fun c -> c = '>') |> Seq.toList - let afterAngles = txt |> Seq.skipWhile (fun c -> c = '>') |> Seq.toList - if List.isEmpty angles then None else - - let afterOp = - match (System.String(Array.ofSeq afterAngles)) with - | "." -> Some DOT - | "]" -> Some RBRACK - | "-" -> Some MINUS - | ".." -> Some DOT_DOT - | "?" -> Some QMARK - | "??" -> Some QMARK_QMARK - | ":=" -> Some COLON_EQUALS - | "::" -> Some COLON_COLON - | "*" -> Some STAR - | "&" -> Some AMP - | "->" -> Some RARROW - | "<-" -> Some LARROW - | "=" -> Some EQUALS - | "<" -> Some (LESS false) - | "$" -> Some DOLLAR - | "%" -> Some (PERCENT_OP("%") ) - | "%%" -> Some (PERCENT_OP("%%")) - | "" -> None - | s -> - match List.ofSeq afterAngles with - | '=' :: _ - | '!' :: '=' :: _ - | '<' :: _ - | '>' :: _ - | '$' :: _ -> Some (INFIX_COMPARE_OP s) - | '&' :: _ -> Some (INFIX_AMP_OP s) - | '|' :: _ -> Some (INFIX_BAR_OP s) - | '!' :: _ - | '?' :: _ - | '~' :: _ -> Some (PREFIX_OP s) - | '@' :: _ - | '^' :: _ -> Some (INFIX_AT_HAT_OP s) - | '+' :: _ - | '-' :: _ -> Some (PLUS_MINUS_OP s) - | '*' :: '*' :: _ -> Some (INFIX_STAR_STAR_OP s) - | '*' :: _ - | '/' :: _ - | '%' :: _ -> Some (INFIX_STAR_DIV_MOD_OP s) - | _ -> None - Some([| for _c in angles do yield GREATER |], afterOp) + if not (txt.StartsWith ">") then + ValueNone + else +#if FABLE_COMPILER + let afterAngles = txt.TrimStart('>') + let angles = txt.Length - afterAngles.Length + if afterAngles.Length = 0 then + ValueSome(struct (Array.init txt.Length (fun _ -> GREATER), ValueNone)) + else +#else + match txt.AsSpan().IndexOfAnyExcept '>' with + | -1 -> ValueSome(struct (Array.init txt.Length (fun _ -> GREATER), ValueNone)) + | angles -> + let afterAngles = txt.AsSpan angles +#endif + + let afterOp = + match afterAngles with + | Equals "." -> ValueSome DOT + | Equals "]" -> ValueSome RBRACK + | Equals "-" -> ValueSome MINUS + | Equals ".." -> ValueSome DOT_DOT + | Equals "?" -> ValueSome QMARK + | Equals "??" -> ValueSome QMARK_QMARK + | Equals ":=" -> ValueSome COLON_EQUALS + | Equals "::" -> ValueSome COLON_COLON + | Equals "*" -> ValueSome STAR + | Equals "&" -> ValueSome AMP + | Equals "->" -> ValueSome RARROW + | Equals "<-" -> ValueSome LARROW + | Equals "=" -> ValueSome EQUALS + | Equals "<" -> ValueSome (LESS false) + | Equals "$" -> ValueSome DOLLAR + | Equals "%" -> ValueSome (PERCENT_OP "%") + | Equals "%%" -> ValueSome (PERCENT_OP "%%") + | Equals "" -> ValueNone + | StartsWith "=" + | StartsWith "!=" + | StartsWith "<" + | StartsWith ">" + | StartsWith "$" -> ValueSome (INFIX_COMPARE_OP (afterAngles.ToString())) + | StartsWith "&" -> ValueSome (INFIX_AMP_OP (afterAngles.ToString())) + | StartsWith "|" -> ValueSome (INFIX_BAR_OP (afterAngles.ToString())) + | StartsWith "!" + | StartsWith "?" + | StartsWith "~" -> ValueSome (PREFIX_OP (afterAngles.ToString())) + | StartsWith "@" + | StartsWith "^" -> ValueSome (INFIX_AT_HAT_OP (afterAngles.ToString())) + | StartsWith "+" + | StartsWith "-" -> ValueSome (PLUS_MINUS_OP (afterAngles.ToString())) + | StartsWith "**" -> ValueSome (INFIX_STAR_STAR_OP (afterAngles.ToString())) + | StartsWith "*" + | StartsWith "/" + | StartsWith "%" -> ValueSome (INFIX_STAR_DIV_MOD_OP (afterAngles.ToString())) + | _ -> ValueNone + + ValueSome(struct (Array.init angles (fun _ -> GREATER), afterOp)) [] type PositionWithColumn = @@ -648,7 +689,7 @@ type LexFilterImpl ( let lastTokenEnd = state.EndPos let token = lexer lexbuf - LexbufLocalXmlDocStore.AddGrabPoint(lexbuf) + XmlDocStore.AddGrabPoint(lexbuf) // Now we've got the token, remember the lexbuf state, associating it with the token // and remembering it as the last observed lexbuf state for the wrapped lexer function. @@ -1128,7 +1169,9 @@ type LexFilterImpl ( // f<{| C : int |}>x // fx // fx + // fx | DEFAULT | COLON | COLON_GREATER | STRUCT | NULL | DELEGATE | AND | WHEN | AMP + | BAR_JUST_BEFORE_NULL | BAR | DOT_DOT | NEW | LBRACE_BAR @@ -1195,8 +1238,8 @@ type LexFilterImpl ( pool.Return tokenTup | INFIX_COMPARE_OP (TyparsCloseOp(greaters, afterOp) as opstr) -> match afterOp with - | None -> () - | Some tok -> delayToken (pool.UseShiftedLocation(tokenTup, tok, greaters.Length, 0)) + | ValueNone -> () + | ValueSome tok -> delayToken (pool.UseShiftedLocation(tokenTup, tok, greaters.Length, 0)) for i = greaters.Length - 1 downto 0 do delayToken (pool.UseShiftedLocation(tokenTup, greaters[i] res, i, -opstr.Length + i + 1)) pool.Return tokenTup @@ -2466,6 +2509,9 @@ type LexFilterImpl ( pool.Return tokenTup hwTokenFetch useBlockRule + | BAR, _ when (lexbuf.SupportsFeature(LanguageFeature.NullnessChecking) && match peekNextToken() with NULL -> true | _ -> false) -> + returnToken tokenLexbufState BAR_JUST_BEFORE_NULL + // Ordinary tokens start a vanilla block | _, CtxtSeqBlock _ :: _ -> pushCtxt tokenTup (CtxtVanilla(tokenStartPos, isLongIdentEquals token)) diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fsi index 769fe4fcf0..0e469a9a36 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fsi +++ b/src/fcs-fable/src/Compiler/SyntaxTree/LexFilter.fsi @@ -10,7 +10,8 @@ open FSharp.Compiler.Parser /// Match the close of '>' of a set of type parameters. /// This is done for tokens such as '>>' by smashing the token -val (|TyparsCloseOp|_|): txt: string -> ((bool -> token)[] * token option) option +[] +val (|TyparsCloseOp|_|): txt: string -> struct ((bool -> token)[] * token voption) voption /// A stateful filter over the token stream that adjusts it for indentation-aware syntax rules /// Process the token stream prior to parsing. Implements the offside rule and other lexical transformations. diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fs b/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fs index c756f1e806..ca9a361e33 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fs @@ -12,6 +12,7 @@ open Internal.Utilities.Text.Lexing open FSharp.Compiler.IO open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Features +open FSharp.Compiler.LexerStore open FSharp.Compiler.ParseHelpers open FSharp.Compiler.UnicodeLexing open FSharp.Compiler.Parser @@ -98,10 +99,8 @@ let mkLexargs } /// Register the lexbuf and call the given function -let reusingLexbufForParsing lexbuf f = +let reusingLexbufForParsing (lexbuf: Lexbuf) f = use _ = UseBuildPhase BuildPhase.Parse - LexbufLocalXmlDocStore.ClearXmlDoc lexbuf - LexbufCommentStore.ClearComments lexbuf try f () @@ -236,26 +235,45 @@ let addUnicodeChar buf c = addIntChar buf (int c) let addByteChar buf (c: char) = addIntChar buf (int32 c % 256) +type LargerThanOneByte = int +type LargerThan127ButInsideByte = int + /// Sanity check that high bytes are zeros. Further check each low byte <= 127 -let stringBufferIsBytes (buf: ByteBuffer) = +let errorsInByteStringBuffer (buf: ByteBuffer) = #if FABLE_COMPILER let bytes = buf.Close() #else let bytes = buf.AsMemory() #endif - let mutable ok = true + assert (bytes.Length % 2 = 0) + + // Enhancement?: return faulty values? + // But issue: we don't know range of values -> no direct mapping from value to range & notation + + // values with high byte <> 0 + let mutable largerThanOneByteCount = 0 + // values with high byte = 0, but low byte > 127 + let mutable largerThan127ButSingleByteCount = 0 for i = 0 to bytes.Length / 2 - 1 do #if FABLE_COMPILER - if bytes[i * 2 + 1] <> 0uy then ok <- false + if bytes[i * 2 + 1] <> 0uy then + largerThanOneByteCount <- largerThanOneByteCount + 1 + elif bytes[i * 2] > 127uy then + largerThan127ButSingleByteCount <- largerThan127ButSingleByteCount + 1 #else if bytes.Span[i * 2 + 1] <> 0uy then - ok <- false + largerThanOneByteCount <- largerThanOneByteCount + 1 + elif bytes.Span[i * 2] > 127uy then + largerThan127ButSingleByteCount <- largerThan127ButSingleByteCount + 1 #endif - ok + if largerThanOneByteCount + largerThan127ButSingleByteCount > 0 then + Some(largerThanOneByteCount, largerThan127ButSingleByteCount) + else + None -let newline (lexbuf: LexBuffer<_>) = lexbuf.EndPos <- lexbuf.EndPos.NextLine +let incrLine (lexbuf: LexBuffer<_>) = lexbuf.EndPos <- lexbuf.EndPos.NextLine let advanceColumnBy (lexbuf: LexBuffer<_>) n = lexbuf.EndPos <- lexbuf.EndPos.ShiftColumnBy(n) @@ -499,13 +517,14 @@ module Keywords = fileName |> FileSystem.GetFullPathShim (* asserts that path is already absolute *) |> System.IO.Path.GetDirectoryName + |> (!!) if String.IsNullOrEmpty dirname then dirname else PathMap.applyDir args.pathMap dirname |> fun dir -> KEYWORD_STRING(s, dir) - | "__SOURCE_FILE__" -> KEYWORD_STRING(s, System.IO.Path.GetFileName(FileIndex.fileOfFileIndex lexbuf.StartPos.FileIndex)) + | "__SOURCE_FILE__" -> KEYWORD_STRING(s, !! System.IO.Path.GetFileName(FileIndex.fileOfFileIndex lexbuf.StartPos.FileIndex)) | "__LINE__" -> KEYWORD_STRING(s, string lexbuf.StartPos.Line) | _ -> IdentifierToken args lexbuf s diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fsi index 616bfa8a6f..63997f0898 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fsi +++ b/src/fcs-fable/src/Compiler/SyntaxTree/LexHelpers.fsi @@ -97,9 +97,11 @@ val stringBufferAsString: ByteBuffer -> string val stringBufferAsBytes: ByteBuffer -> byte[] -val stringBufferIsBytes: ByteBuffer -> bool +type LargerThanOneByte = int +type LargerThan127ButInsideByte = int +val errorsInByteStringBuffer: ByteBuffer -> Option -val newline: Lexing.LexBuffer<'a> -> unit +val incrLine: Lexing.LexBuffer<'a> -> unit val advanceColumnBy: Lexing.LexBuffer<'a> -> n: int -> unit diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/LexerStore.fs b/src/fcs-fable/src/Compiler/SyntaxTree/LexerStore.fs new file mode 100644 index 0000000000..711e9530cd --- /dev/null +++ b/src/fcs-fable/src/Compiler/SyntaxTree/LexerStore.fs @@ -0,0 +1,169 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +module internal FSharp.Compiler.LexerStore + +open FSharp.Compiler.SyntaxTreeOps +open FSharp.Compiler.SyntaxTrivia +open FSharp.Compiler.UnicodeLexing +open FSharp.Compiler.Text +open FSharp.Compiler.Text.Position +open FSharp.Compiler.Text.Range +open FSharp.Compiler.Xml + +//------------------------------------------------------------------------ +// Lexbuf.BufferLocalStore is used during lexing/parsing of a file for different purposes. +// All access happens through the functions and modules below. +//------------------------------------------------------------------------ + +let private getStoreData<'T when 'T: not null> (lexbuf: Lexbuf) key (getInitialData: unit -> 'T) = + let store = lexbuf.BufferLocalStore + + match store.TryGetValue key with + | true, data -> data :?> 'T + | _ -> + let data = getInitialData () + store[key] <- data + data + +let private tryGetStoreData<'T when 'T: not null> (lexbuf: Lexbuf) key = + let store = lexbuf.BufferLocalStore + + match store.TryGetValue key with + | true, data -> Some(data :?> 'T) + | _ -> None + +let private setStoreData (lexbuf: Lexbuf) key data = lexbuf.BufferLocalStore[key] <- data + +//------------------------------------------------------------------------ +// A SynArgNameGenerator for the current file, used by the parser +//------------------------------------------------------------------------ + +let getSynArgNameGenerator (lexbuf: Lexbuf) = + getStoreData lexbuf "SynArgNameGenerator" SynArgNameGenerator + +//------------------------------------------------------------------------ +// A XmlDocCollector, used to hold the current accumulated Xml doc lines, and related access functions +//------------------------------------------------------------------------ + +[] +module XmlDocStore = + let private xmlDocKey = "XmlDoc" + + let private getCollector (lexbuf: Lexbuf) = + getStoreData lexbuf xmlDocKey XmlDocCollector + + /// Called from the lexer to save a single line of XML doc comment. + let SaveXmlDocLine (lexbuf: Lexbuf, lineText, range: range) = + let collector = getCollector lexbuf + collector.AddXmlDocLine(lineText, range) + + let AddGrabPoint (lexbuf: Lexbuf) = + let collector = getCollector lexbuf + let startPos = lexbuf.StartPos + collector.AddGrabPoint(mkPos startPos.Line startPos.Column) + + /// Allowed cases when there are comments after XmlDoc + /// + /// /// X xmlDoc + /// // comment + /// //// comment + /// (* multiline comment *) + /// let x = ... // X xmlDoc + /// + /// Remember the first position when a comment (//, (* *), ////) is encountered after the XmlDoc block + /// then add a grab point if a new XmlDoc block follows the comments + let AddGrabPointDelayed (lexbuf: Lexbuf) = + let collector = getCollector lexbuf + let startPos = lexbuf.StartPos + collector.AddGrabPointDelayed(mkPos startPos.Line startPos.Column) + + /// Called from the parser each time we parse a construct that marks the end of an XML doc comment range, + /// e.g. a 'type' declaration. The markerRange is the range of the keyword that delimits the construct. + let GrabXmlDocBeforeMarker (lexbuf: Lexbuf, markerRange: range) = + match tryGetStoreData lexbuf xmlDocKey with + | Some collector -> PreXmlDoc.CreateFromGrabPoint(collector, markerRange.Start) + | _ -> PreXmlDoc.Empty + + let ReportInvalidXmlDocPositions (lexbuf: Lexbuf) = + let collector = getCollector lexbuf + collector.CheckInvalidXmlDocPositions() + +//------------------------------------------------------------------------ +// Storage to hold the current accumulated ConditionalDirectiveTrivia, and related types and access functions +//------------------------------------------------------------------------ + +type LexerIfdefExpression = + | IfdefAnd of LexerIfdefExpression * LexerIfdefExpression + | IfdefOr of LexerIfdefExpression * LexerIfdefExpression + | IfdefNot of LexerIfdefExpression + | IfdefId of string + +let rec LexerIfdefEval (lookup: string -> bool) = + function + | IfdefAnd(l, r) -> (LexerIfdefEval lookup l) && (LexerIfdefEval lookup r) + | IfdefOr(l, r) -> (LexerIfdefEval lookup l) || (LexerIfdefEval lookup r) + | IfdefNot e -> not (LexerIfdefEval lookup e) + | IfdefId id -> lookup id + +[] +module IfdefStore = + let private getStore (lexbuf: Lexbuf) = + getStoreData lexbuf "Ifdef" ResizeArray + + let private mkRangeWithoutLeadingWhitespace (lexed: string) (m: range) : range = + let startColumn = lexed.Length - lexed.TrimStart().Length + mkFileIndexRange m.FileIndex (mkPos m.StartLine startColumn) m.End + + let SaveIfHash (lexbuf: Lexbuf, lexed: string, expr: LexerIfdefExpression, range: range) = + let store = getStore lexbuf + + let expr = + let rec visit (expr: LexerIfdefExpression) : IfDirectiveExpression = + match expr with + | LexerIfdefExpression.IfdefAnd(l, r) -> IfDirectiveExpression.And(visit l, visit r) + | LexerIfdefExpression.IfdefOr(l, r) -> IfDirectiveExpression.Or(visit l, visit r) + | LexerIfdefExpression.IfdefNot e -> IfDirectiveExpression.Not(visit e) + | LexerIfdefExpression.IfdefId id -> IfDirectiveExpression.Ident id + + visit expr + + let m = mkRangeWithoutLeadingWhitespace lexed range + + store.Add(ConditionalDirectiveTrivia.If(expr, m)) + + let SaveElseHash (lexbuf: Lexbuf, lexed: string, range: range) = + let store = getStore lexbuf + let m = mkRangeWithoutLeadingWhitespace lexed range + store.Add(ConditionalDirectiveTrivia.Else(m)) + + let SaveEndIfHash (lexbuf: Lexbuf, lexed: string, range: range) = + let store = getStore lexbuf + let m = mkRangeWithoutLeadingWhitespace lexed range + store.Add(ConditionalDirectiveTrivia.EndIf(m)) + + let GetTrivia (lexbuf: Lexbuf) : ConditionalDirectiveTrivia list = + let store = getStore lexbuf + Seq.toList store + +//------------------------------------------------------------------------ +// Storage to hold the current accumulated CommentTrivia, and related access functions +//------------------------------------------------------------------------ + +[] +module CommentStore = + let private getStore (lexbuf: Lexbuf) = + getStoreData lexbuf "Comments" ResizeArray + + let SaveSingleLineComment (lexbuf: Lexbuf, startRange: range, endRange: range) = + let store = getStore lexbuf + let m = unionRanges startRange endRange + store.Add(CommentTrivia.LineComment(m)) + + let SaveBlockComment (lexbuf: Lexbuf, startRange: range, endRange: range) = + let store = getStore lexbuf + let m = unionRanges startRange endRange + store.Add(CommentTrivia.BlockComment(m)) + + let GetComments (lexbuf: Lexbuf) : CommentTrivia list = + let store = getStore lexbuf + Seq.toList store diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/LexerStore.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/LexerStore.fsi new file mode 100644 index 0000000000..952a0cc6f8 --- /dev/null +++ b/src/fcs-fable/src/Compiler/SyntaxTree/LexerStore.fsi @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +module internal FSharp.Compiler.LexerStore + +open FSharp.Compiler.SyntaxTreeOps +open FSharp.Compiler.SyntaxTrivia +open FSharp.Compiler.UnicodeLexing +open FSharp.Compiler.Text +open FSharp.Compiler.Xml + +val getSynArgNameGenerator: Lexbuf -> SynArgNameGenerator + +[] +module XmlDocStore = + + val SaveXmlDocLine: lexbuf: Lexbuf * lineText: string * range: range -> unit + + val GrabXmlDocBeforeMarker: lexbuf: Lexbuf * markerRange: range -> PreXmlDoc + + val AddGrabPoint: lexbuf: Lexbuf -> unit + + val AddGrabPointDelayed: lexbuf: Lexbuf -> unit + + val ReportInvalidXmlDocPositions: lexbuf: Lexbuf -> range list + +type LexerIfdefExpression = + | IfdefAnd of LexerIfdefExpression * LexerIfdefExpression + | IfdefOr of LexerIfdefExpression * LexerIfdefExpression + | IfdefNot of LexerIfdefExpression + | IfdefId of string + +val LexerIfdefEval: lookup: (string -> bool) -> _arg1: LexerIfdefExpression -> bool + +[] +module IfdefStore = + + val SaveIfHash: lexbuf: Lexbuf * lexed: string * expr: LexerIfdefExpression * range: range -> unit + + val SaveElseHash: lexbuf: Lexbuf * lexed: string * range: range -> unit + + val SaveEndIfHash: lexbuf: Lexbuf * lexed: string * range: range -> unit + + val GetTrivia: lexbuf: Lexbuf -> ConditionalDirectiveTrivia list + +[] +module CommentStore = + + val SaveSingleLineComment: lexbuf: Lexbuf * startRange: range * endRange: range -> unit + + val SaveBlockComment: lexbuf: Lexbuf * startRange: range * endRange: range -> unit + + val GetComments: lexbuf: Lexbuf -> CommentTrivia list diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fs index cfe45ed00d..f46002caa0 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fs @@ -16,6 +16,7 @@ open FSharp.Compiler.Xml open Internal.Utilities.Library open Internal.Utilities.Text.Lexing open Internal.Utilities.Text.Parsing +open FSharp.Compiler.LexerStore //------------------------------------------------------------------------ // Parsing: Error recovery exception for fsyacc @@ -43,7 +44,11 @@ let posOfLexPosition (p: Position) = mkPos p.Line p.Column /// Get an F# compiler range from a lexer range let mkSynRange (p1: Position) (p2: Position) = - mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition p2) + if p1.FileIndex = p2.FileIndex then + mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition p2) + else + // This means we had a #line directive in the middle of this syntax element. + mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition (p1.ShiftColumnBy 1)) type LexBuffer<'Char> with @@ -64,88 +69,8 @@ let rhs2 (parseState: IParseState) i j = /// Get the range corresponding to one of the r.h.s. symbols of a grammar rule while it is being reduced let rhs parseState i = rhs2 parseState i i -type IParseState with - - /// Get the generator used for compiler-generated argument names. - member x.SynArgNameGenerator = - let key = "SynArgNameGenerator" - let bls = x.LexBuffer.BufferLocalStore - - let gen = - match bls.TryGetValue key with - | true, gen -> gen - | _ -> - let gen = box (SynArgNameGenerator()) - bls[key] <- gen - gen - - gen :?> SynArgNameGenerator - - /// Reset the generator used for compiler-generated argument names. - member x.ResetSynArgNameGenerator() = x.SynArgNameGenerator.Reset() - -//------------------------------------------------------------------------ -// Parsing: grabbing XmlDoc -//------------------------------------------------------------------------ - -/// XmlDoc F# lexer/parser state, held in the BufferLocalStore for the lexer. -module LexbufLocalXmlDocStore = - // The key into the BufferLocalStore used to hold the current accumulated XmlDoc lines - let private xmlDocKey = "XmlDoc" - - let private getCollector (lexbuf: Lexbuf) = - match lexbuf.BufferLocalStore.TryGetValue xmlDocKey with - | true, collector -> collector - | _ -> - let collector = box (XmlDocCollector()) - lexbuf.BufferLocalStore[xmlDocKey] <- collector - collector - - |> unbox - - let ClearXmlDoc (lexbuf: Lexbuf) = - lexbuf.BufferLocalStore[xmlDocKey] <- box (XmlDocCollector()) - - /// Called from the lexer to save a single line of XML doc comment. - let SaveXmlDocLine (lexbuf: Lexbuf, lineText, range: range) = - let collector = getCollector lexbuf - collector.AddXmlDocLine(lineText, range) - - let AddGrabPoint (lexbuf: Lexbuf) = - let collector = getCollector lexbuf - let startPos = lexbuf.StartPos - collector.AddGrabPoint(mkPos startPos.Line startPos.Column) - - /// Allowed cases when there are comments after XmlDoc - /// - /// /// X xmlDoc - /// // comment - /// //// comment - /// (* multiline comment *) - /// let x = ... // X xmlDoc - /// - /// Remember the first position when a comment (//, (* *), ////) is encountered after the XmlDoc block - /// then add a grab point if a new XmlDoc block follows the comments - let AddGrabPointDelayed (lexbuf: Lexbuf) = - let collector = getCollector lexbuf - let startPos = lexbuf.StartPos - collector.AddGrabPointDelayed(mkPos startPos.Line startPos.Column) - - /// Called from the parser each time we parse a construct that marks the end of an XML doc comment range, - /// e.g. a 'type' declaration. The markerRange is the range of the keyword that delimits the construct. - let GrabXmlDocBeforeMarker (lexbuf: Lexbuf, markerRange: range) = - match lexbuf.BufferLocalStore.TryGetValue xmlDocKey with - | true, collector -> - let collector = unbox (collector) - PreXmlDoc.CreateFromGrabPoint(collector, markerRange.Start) - | _ -> PreXmlDoc.Empty - - let ReportInvalidXmlDocPositions (lexbuf: Lexbuf) = - let collector = getCollector lexbuf - collector.CheckInvalidXmlDocPositions() - //------------------------------------------------------------------------ -// Parsing/lexing: status of #if/#endif processing in lexing, used for continutations +// Parsing/lexing: status of #if/#endif processing in lexing, used for continuations // for whitespace tokens in parser specification. //------------------------------------------------------------------------ @@ -161,103 +86,10 @@ type LexerIfdefStack = LexerIfdefStackEntries /// Specifies how the 'endline' function in the lexer should continue after /// it reaches end of line or eof. The options are to continue with 'token' function /// or to continue with 'skip' function. +[] type LexerEndlineContinuation = | Token - | Skip of int * range: range - -type LexerIfdefExpression = - | IfdefAnd of LexerIfdefExpression * LexerIfdefExpression - | IfdefOr of LexerIfdefExpression * LexerIfdefExpression - | IfdefNot of LexerIfdefExpression - | IfdefId of string - -let rec LexerIfdefEval (lookup: string -> bool) = - function - | IfdefAnd(l, r) -> (LexerIfdefEval lookup l) && (LexerIfdefEval lookup r) - | IfdefOr(l, r) -> (LexerIfdefEval lookup l) || (LexerIfdefEval lookup r) - | IfdefNot e -> not (LexerIfdefEval lookup e) - | IfdefId id -> lookup id - -/// Ifdef F# lexer/parser state, held in the BufferLocalStore for the lexer. -/// Used to capture #if, #else and #endif as syntax trivia. -module LexbufIfdefStore = - // The key into the BufferLocalStore used to hold the compiler directives - let private ifDefKey = "Ifdef" - - let private getStore (lexbuf: Lexbuf) : ResizeArray = - match lexbuf.BufferLocalStore.TryGetValue ifDefKey with - | true, store -> store - | _ -> - let store = box (ResizeArray()) - lexbuf.BufferLocalStore[ifDefKey] <- store - store - |> unbox> - - let private mkRangeWithoutLeadingWhitespace (lexed: string) (m: range) : range = - let startColumn = lexed.Length - lexed.TrimStart().Length - mkFileIndexRange m.FileIndex (mkPos m.StartLine startColumn) m.End - - let SaveIfHash (lexbuf: Lexbuf, lexed: string, expr: LexerIfdefExpression, range: range) = - let store = getStore lexbuf - - let expr = - let rec visit (expr: LexerIfdefExpression) : IfDirectiveExpression = - match expr with - | LexerIfdefExpression.IfdefAnd(l, r) -> IfDirectiveExpression.And(visit l, visit r) - | LexerIfdefExpression.IfdefOr(l, r) -> IfDirectiveExpression.Or(visit l, visit r) - | LexerIfdefExpression.IfdefNot e -> IfDirectiveExpression.Not(visit e) - | LexerIfdefExpression.IfdefId id -> IfDirectiveExpression.Ident id - - visit expr - - let m = mkRangeWithoutLeadingWhitespace lexed range - - store.Add(ConditionalDirectiveTrivia.If(expr, m)) - - let SaveElseHash (lexbuf: Lexbuf, lexed: string, range: range) = - let store = getStore lexbuf - let m = mkRangeWithoutLeadingWhitespace lexed range - store.Add(ConditionalDirectiveTrivia.Else(m)) - - let SaveEndIfHash (lexbuf: Lexbuf, lexed: string, range: range) = - let store = getStore lexbuf - let m = mkRangeWithoutLeadingWhitespace lexed range - store.Add(ConditionalDirectiveTrivia.EndIf(m)) - - let GetTrivia (lexbuf: Lexbuf) : ConditionalDirectiveTrivia list = - let store = getStore lexbuf - Seq.toList store - -/// Used to capture the ranges of code comments as syntax trivia -module LexbufCommentStore = - // The key into the BufferLocalStore used to hold the compiler directives - let private commentKey = "Comments" - - let private getStore (lexbuf: Lexbuf) : ResizeArray = - match lexbuf.BufferLocalStore.TryGetValue commentKey with - | true, store -> store - | _ -> - let store = box (ResizeArray()) - lexbuf.BufferLocalStore[commentKey] <- store - store - |> unbox> - - let SaveSingleLineComment (lexbuf: Lexbuf, startRange: range, endRange: range) = - let store = getStore lexbuf - let m = unionRanges startRange endRange - store.Add(CommentTrivia.LineComment(m)) - - let SaveBlockComment (lexbuf: Lexbuf, startRange: range, endRange: range) = - let store = getStore lexbuf - let m = unionRanges startRange endRange - store.Add(CommentTrivia.BlockComment(m)) - - let GetComments (lexbuf: Lexbuf) : CommentTrivia list = - let store = getStore lexbuf - Seq.toList store - - let ClearComments (lexbuf: Lexbuf) : unit = - lexbuf.BufferLocalStore.Remove(commentKey) |> ignore + | IfdefSkip of int * range: range //------------------------------------------------------------------------ // Parsing: continuations for whitespace tokens @@ -308,7 +140,7 @@ type LexerStringKind = /// Represents the degree of nesting of '{..}' and the style of the string to continue afterwards, in an interpolation fill. /// Nesting counters and styles of outer interpolating strings are pushed on this stack. -type LexerInterpolatedStringNesting = (int * LexerStringStyle * int * range) list +type LexerInterpolatedStringNesting = (int * LexerStringStyle * int * range option * range) list /// The parser defines a number of tokens for whitespace and /// comments eliminated by the lexer. These carry a specification of @@ -407,7 +239,7 @@ let grabXmlDocAtRangeStart (parseState: IParseState, optAttributes: SynAttribute | [] -> range | h :: _ -> h.Range - LexbufLocalXmlDocStore.GrabXmlDocBeforeMarker(parseState.LexBuffer, grabPoint) + XmlDocStore.GrabXmlDocBeforeMarker(parseState.LexBuffer, grabPoint) let grabXmlDoc (parseState: IParseState, optAttributes: SynAttributeList list, elemIdx) = grabXmlDocAtRangeStart (parseState, optAttributes, rhs parseState elemIdx) @@ -899,7 +731,7 @@ let mkRecdField (lidwd: SynLongIdent) = lidwd, true // Used for 'do expr' in a class. let mkSynDoBinding (vis: SynAccess option, mDo, expr, m) = match vis with - | Some vis -> errorR (Error(FSComp.SR.parsDoCannotHaveVisibilityDeclarations (vis.ToString()), m)) + | Some vis -> errorR (Error(FSComp.SR.parsDoCannotHaveVisibilityDeclarations (vis |> string), m)) | None -> () SynBinding( @@ -968,7 +800,7 @@ let checkEndOfFileError t = | LexCont.MLOnly(_, _, m) -> reportParseErrorAt m (FSComp.SR.parsEofInIfOcaml ()) - | LexCont.EndLine(_, _, LexerEndlineContinuation.Skip(_, m)) -> reportParseErrorAt m (FSComp.SR.parsEofInDirective ()) + | LexCont.EndLine(_, _, LexerEndlineContinuation.IfdefSkip(_, m)) -> reportParseErrorAt m (FSComp.SR.parsEofInDirective ()) | LexCont.EndLine(endifs, nesting, LexerEndlineContinuation.Token) | LexCont.Token(endifs, nesting) -> @@ -978,7 +810,7 @@ let checkEndOfFileError t = match nesting with | [] -> () - | (_, _, _, m) :: _ -> reportParseErrorAt m (FSComp.SR.parsEofInInterpolatedStringFill ()) + | (_, _, _, _, m) :: _ -> reportParseErrorAt m (FSComp.SR.parsEofInInterpolatedStringFill ()) type BindingSet = BindingSetPreAttrs of range * bool * bool * (SynAttributes -> SynAccess option -> SynAttributes * SynBinding list) * range @@ -1050,7 +882,22 @@ let mkLocalBindings (mWhole, BindingSetPreAttrs(_, isRec, isUse, declsPreAttrs, else Some mIn) - SynExpr.LetOrUse(isRec, isUse, decls, body, mWhole, { InKeyword = mIn }) + let mLetOrUse = + match decls with + | SynBinding(trivia = trivia) :: _ -> trivia.LeadingKeyword.Range + | _ -> Range.Zero + + SynExpr.LetOrUse( + isRec, + isUse, + decls, + body, + mWhole, + { + LetOrUseKeyword = mLetOrUse + InKeyword = mIn + } + ) let mkDefnBindings (mWhole, BindingSetPreAttrs(_, isRec, isUse, declsPreAttrs, _bindingSetRange), attrs, vis, attrsm) = if isUse then @@ -1106,7 +953,8 @@ let mkSynUnionCase attributes (access: SynAccess option) id kind mDecl (xmlDoc, SynUnionCase(attributes, id, kind, xmlDoc, None, mDecl, trivia) let mkAutoPropDefn mVal access ident typ mEquals (expr: SynExpr) accessors xmlDoc attribs flags rangeStart = - let mWith, (getSet, getSetOpt) = accessors + let mWith, (getSet, getSetOpt, getterAccess, setterAccess) = accessors + let access = SynValSigAccess.GetSet(access, getterAccess, setterAccess) let memberRange = match getSetOpt with @@ -1164,7 +1012,7 @@ let mkSynField let mType, mStart = idOpt - |> Option.map _.idRange + |> Option.map (fun x -> x.idRange) |> Option.orElseWith (fun _ -> vis |> Option.map (fun v -> v.Range)) |> Option.orElse isMutable |> Option.orElseWith (fun _ -> leadingKeyword |> Option.map (fun k -> k.Range)) @@ -1213,3 +1061,11 @@ let mkValField mkSynField parseState idOpt typ isMutable access attribs mStaticOpt rangeStart (Some leadingKeyword) SynMemberDefn.ValField(field, field.Range) + +let leadingKeywordIsAbstract = + function + | SynLeadingKeyword.Abstract _ + | SynLeadingKeyword.AbstractMember _ + | SynLeadingKeyword.StaticAbstract _ + | SynLeadingKeyword.StaticAbstractMember _ -> true + | _ -> false diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fsi index 9add16af68..84be5f0e4f 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fsi +++ b/src/fcs-fable/src/Compiler/SyntaxTree/ParseHelpers.fsi @@ -38,25 +38,6 @@ val rhs2: parseState: IParseState -> i: int -> j: int -> range val rhs: parseState: IParseState -> i: int -> range -type IParseState with - - member SynArgNameGenerator: SyntaxTreeOps.SynArgNameGenerator - member ResetSynArgNameGenerator: unit -> unit - -module LexbufLocalXmlDocStore = - - val ClearXmlDoc: lexbuf: UnicodeLexing.Lexbuf -> unit - - val SaveXmlDocLine: lexbuf: UnicodeLexing.Lexbuf * lineText: string * range: range -> unit - - val GrabXmlDocBeforeMarker: lexbuf: UnicodeLexing.Lexbuf * markerRange: range -> PreXmlDoc - - val AddGrabPoint: lexbuf: UnicodeLexing.Lexbuf -> unit - - val AddGrabPointDelayed: lexbuf: UnicodeLexing.Lexbuf -> unit - - val ReportInvalidXmlDocPositions: lexbuf: UnicodeLexing.Lexbuf -> range list - type LexerIfdefStackEntry = | IfDefIf | IfDefElse @@ -67,35 +48,7 @@ type LexerIfdefStack = LexerIfdefStackEntries type LexerEndlineContinuation = | Token - | Skip of int * range: range - -type LexerIfdefExpression = - | IfdefAnd of LexerIfdefExpression * LexerIfdefExpression - | IfdefOr of LexerIfdefExpression * LexerIfdefExpression - | IfdefNot of LexerIfdefExpression - | IfdefId of string - -val LexerIfdefEval: lookup: (string -> bool) -> _arg1: LexerIfdefExpression -> bool - -module LexbufIfdefStore = - - val SaveIfHash: lexbuf: UnicodeLexing.Lexbuf * lexed: string * expr: LexerIfdefExpression * range: range -> unit - - val SaveElseHash: lexbuf: UnicodeLexing.Lexbuf * lexed: string * range: range -> unit - - val SaveEndIfHash: lexbuf: UnicodeLexing.Lexbuf * lexed: string * range: range -> unit - - val GetTrivia: lexbuf: UnicodeLexing.Lexbuf -> ConditionalDirectiveTrivia list - -module LexbufCommentStore = - - val SaveSingleLineComment: lexbuf: UnicodeLexing.Lexbuf * startRange: range * endRange: range -> unit - - val SaveBlockComment: lexbuf: UnicodeLexing.Lexbuf * startRange: range * endRange: range -> unit - - val GetComments: lexbuf: UnicodeLexing.Lexbuf -> CommentTrivia list - - val ClearComments: lexbuf: UnicodeLexing.Lexbuf -> unit + | IfdefSkip of int * range: range [] type LexerStringStyle = @@ -118,7 +71,7 @@ type LexerStringKind = static member String: LexerStringKind -type LexerInterpolatedStringNesting = (int * LexerStringStyle * int * range) list +type LexerInterpolatedStringNesting = (int * LexerStringStyle * int * range option * range) list [] type LexerContinuation = @@ -272,7 +225,7 @@ val mkAutoPropDefn: typ: SynType option -> mEquals: range option -> expr: SynExpr -> - accessors: range option * (SynMemberKind * GetSetKeywords option) -> + accessors: range option * (SynMemberKind * GetSetKeywords option * SynAccess option * SynAccess option) -> xmlDoc: PreXmlDoc -> attribs: SynAttributes -> flags: (SynMemberKind -> SynMemberFlags) * SynLeadingKeyword -> @@ -302,3 +255,5 @@ val mkSynField: rangeStart: range -> leadingKeyword: SynLeadingKeyword option -> SynField + +val leadingKeywordIsAbstract: SynLeadingKeyword -> bool diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fs b/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fs index 559e9b2d33..10712039e1 100755 --- a/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fs @@ -363,6 +363,8 @@ let IsOperatorDisplayName (name: string) = let IsPossibleOpName (name: string) = name.StartsWithOrdinal(opNamePrefix) +let ordinalStringComparer: IEqualityComparer = StringComparer.Ordinal + /// Compiles a custom operator into a mangled operator name. /// For example, "!%" becomes "op_DereferencePercent". /// This function should only be used for custom operators @@ -387,35 +389,36 @@ let compileCustomOpName = /// Memoize compilation of custom operators. /// They're typically used more than once so this avoids some CPU and GC overhead. - let compiledOperators = ConcurrentDictionary<_, string> StringComparer.Ordinal + let compiledOperators = ConcurrentDictionary ordinalStringComparer - fun opp -> - // Has this operator already been compiled? - compiledOperators.GetOrAdd( - opp, - fun (op: string) -> - let opLength = op.Length + // Cache this as a delegate. + let compiledOperatorsAddDelegate = + Func(fun (op: string) -> + let opLength = op.Length + + let sb = + StringBuilder(opNamePrefix, opNamePrefix.Length + (opLength * maxOperatorNameLength)) - let sb = - StringBuilder(opNamePrefix, opNamePrefix.Length + (opLength * maxOperatorNameLength)) + for i = 0 to opLength - 1 do + let c = op[i] - for i = 0 to opLength - 1 do - let c = op[i] + match t2.TryGetValue c with + | true, x -> sb.Append(x) |> ignore + | false, _ -> sb.Append(c) |> ignore - match t2.TryGetValue c with - | true, x -> sb.Append(x) |> ignore - | false, _ -> sb.Append(c) |> ignore + /// The compiled (mangled) operator name. + let opName = sb.ToString() - /// The compiled (mangled) operator name. - let opName = sb.ToString() + // Cache the compiled name so it can be reused. + opName) - // Cache the compiled name so it can be reused. - opName - ) + fun opp -> + // Has this operator already been compiled? + compiledOperators.GetOrAdd(opp, compiledOperatorsAddDelegate) /// Maps the built-in F# operators to their mangled operator names. let standardOpNames = - let opNames = Dictionary<_, _>(opNameTable.Length, StringComparer.Ordinal) + let opNames = Dictionary<_, _>(opNameTable.Length, ordinalStringComparer) for x, y in opNameTable do opNames.Add(x, y) @@ -439,7 +442,7 @@ let CompileOpName op = let decompileCustomOpName = // Memoize this operation. Custom operators are typically used more than once // so this avoids repeating decompilation. - let decompiledOperators = ConcurrentDictionary<_, _> StringComparer.Ordinal + let decompiledOperators = ConcurrentDictionary<_, _> ordinalStringComparer /// The minimum length of the name for a custom operator character. /// This value is used when initializing StringBuilders to avoid resizing. @@ -506,7 +509,7 @@ let decompileCustomOpName = /// Maps the mangled operator names of built-in F# operators back to the operators. let standardOpsDecompile = - let ops = Dictionary(opNameTable.Length, StringComparer.Ordinal) + let ops = Dictionary(opNameTable.Length, ordinalStringComparer) for x, y in opNameTable do ops.Add(y, x) @@ -623,7 +626,7 @@ let IsValidPrefixOperatorUse s = if String.IsNullOrEmpty s then false else - match s with + match !!s with | "?+" | "?-" | "+" @@ -634,12 +637,13 @@ let IsValidPrefixOperatorUse s = | "%%" | "&" | "&&" -> true - | _ -> s[0] = '!' || isTildeOnlyString s + | s -> s[0] = '!' || isTildeOnlyString s let IsValidPrefixOperatorDefinitionName s = if String.IsNullOrEmpty s then false else + let s = !!s match s[0] with | '~' -> @@ -666,8 +670,8 @@ let IsLogicalPrefixOperator logicalName = if String.IsNullOrEmpty logicalName then false else - let displayName = ConvertValLogicalNameToDisplayNameCore logicalName - displayName <> logicalName && IsValidPrefixOperatorDefinitionName displayName + let displayName = ConvertValLogicalNameToDisplayNameCore !!logicalName + displayName <> !!logicalName && IsValidPrefixOperatorDefinitionName displayName let IsLogicalTernaryOperator logicalName = let displayName = ConvertValLogicalNameToDisplayNameCore logicalName @@ -719,7 +723,7 @@ let ignoredChars = [| '.'; '?' |] // where certain operator tokens are accepted in infix forms, i.e. . // The lexer defines the strings that lead to those tokens. //------ -// This function recognises these "infix operator" names. +// This function recognizes these "infix operator" names. let IsLogicalInfixOpName logicalName = let s = ConvertValLogicalNameToDisplayNameCore logicalName let skipIgnoredChars = s.TrimStart(ignoredChars) @@ -963,6 +967,14 @@ type ActivePatternInfo = member x.ActiveTagsWithRanges = let (APInfo(_, tags, _)) = x in tags + member x.LogicalName = + let (APInfo(isTotal, tags, _)) = x + + tags + |> List.map fst + |> String.concat "|" + |> (fun s -> if isTotal then "(|" + s + "|)" else "(|" + s + "|_|)") + member x.Range = let (APInfo(_, _, m)) = x in m let ActivePatternInfoOfValName nm (m: range) = @@ -1038,7 +1050,7 @@ let MangleProvidedTypeName (typeLogicalName, nonDefaultArgs) = let nonDefaultArgsText = nonDefaultArgs |> Array.map mangleStaticStringArg |> String.concat "," - if nonDefaultArgsText = "" then + if String.IsNullOrEmpty(nonDefaultArgsText) then typeLogicalName else typeLogicalName + "," + nonDefaultArgsText @@ -1101,12 +1113,21 @@ let FSharpOptimizationDataResourceName = "FSharpOptimizationData." let FSharpSignatureDataResourceName = "FSharpSignatureData." +let FSharpOptimizationDataResourceNameB = "FSharpOptimizationDataB." + +let FSharpSignatureDataResourceNameB = "FSharpSignatureDataB." + // Compressed OptimizationData/SignatureData name for embedded resource let FSharpOptimizationCompressedDataResourceName = "FSharpOptimizationCompressedData." let FSharpSignatureCompressedDataResourceName = "FSharpSignatureCompressedData." +let FSharpOptimizationCompressedDataResourceNameB = + "FSharpOptimizationCompressedDataB." + +let FSharpSignatureCompressedDataResourceNameB = "FSharpSignatureCompressedDataB." + // For historical reasons, we use a different resource name for FSharp.Core, so older F# compilers // don't complain when they see the resource. The prefix of these names must not be 'FSharpOptimizationData' // or 'FSharpSignatureData' diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fsi index 05478070e1..9843656e46 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fsi +++ b/src/fcs-fable/src/Compiler/SyntaxTree/PrettyNaming.fsi @@ -58,7 +58,7 @@ val IsIdentifierName: name: string -> bool /// TBD: needs unit testing val IsActivePatternName: name: string -> bool -val internal DoesIdentifierNeedBackticks: string -> bool +val DoesIdentifierNeedBackticks: string -> bool /// Adds double backticks if necessary to make a valid identifier, e.g. /// op_Addition --> op_Addition @@ -114,7 +114,7 @@ val internal ConvertLogicalNameToDisplayName: name: string -> string /// In any cases it is used it probably indicates that text is being /// generated which: /// 1. does not contain double-backticks for non-identifiers -/// 2. does not put parentheses arounf operators or active pattern names +/// 2. does not put parentheses around operators or active pattern names /// /// If the text is immediately in quotes, this is generally ok, e.g. /// @@ -228,6 +228,7 @@ type internal ActivePatternInfo = member ActiveTags: string list member ActiveTagsWithRanges: (string * range) list + member LogicalName: string member IsTotal: bool member Range: range @@ -267,10 +268,18 @@ val internal FSharpOptimizationDataResourceName: string val internal FSharpSignatureDataResourceName: string +val internal FSharpOptimizationDataResourceNameB: string + +val internal FSharpSignatureDataResourceNameB: string + val internal FSharpOptimizationCompressedDataResourceName: string val internal FSharpSignatureCompressedDataResourceName: string +val internal FSharpOptimizationCompressedDataResourceNameB: string + +val internal FSharpSignatureCompressedDataResourceNameB: string + val internal FSharpOptimizationDataResourceName2: string val internal FSharpSignatureDataResourceName2: string diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fs index 97f40bee62..8977e8fba6 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fs @@ -16,7 +16,19 @@ type Ident(text: string, range: range) = member _.idRange = range override _.ToString() = text -type SynIdent = SynIdent of ident: Ident * trivia: IdentTrivia option +type SynIdent = + | SynIdent of ident: Ident * trivia: IdentTrivia option + + member this.Range = + match this with + | SynIdent(ident, trivia) -> + match trivia with + | Some value -> + match value with + | IdentTrivia.OriginalNotationWithParen(leftParen, _, rightParen) + | IdentTrivia.HasParenthesis(leftParen, rightParen) -> unionRanges leftParen rightParen + | _ -> ident.idRange + | None -> ident.idRange type LongIdent = Ident list @@ -25,7 +37,7 @@ type SynLongIdent = member this.Range = match this with - | SynLongIdent([], _, _) -> failwith "rangeOfLidwd" + | SynLongIdent([], _, _) -> failwith "rangeOfLid" | SynLongIdent([ id ], [], _) -> id.idRange | SynLongIdent([ id ], [ m ], _) -> unionRanges id.idRange m | SynLongIdent(h :: t, [], _) -> unionRanges h.idRange (List.last t).idRange @@ -269,13 +281,9 @@ type DebugPointAtWhile = [] type DebugPointAtBinding = | Yes of range: range - | NoneAtDo - | NoneAtLet - | NoneAtSticky - | NoneAtInvisible member x.Combine(y: DebugPointAtBinding) = @@ -324,6 +332,8 @@ type SynTypeConstraint = | WhereTyparSupportsNull of typar: SynTypar * range: range + | WhereTyparNotSupportsNull of genericName: SynTypar * range: range * trivia: SynTypeConstraintWhereTyparNotSupportsNullTrivia + | WhereTyparIsComparable of typar: SynTypar * range: range | WhereTyparIsEquatable of typar: SynTypar * range: range @@ -346,6 +356,7 @@ type SynTypeConstraint = | WhereTyparIsReferenceType(range = range) | WhereTyparIsUnmanaged(range = range) | WhereTyparSupportsNull(range = range) + | WhereTyparNotSupportsNull(range = range) | WhereTyparIsComparable(range = range) | WhereTyparIsEquatable(range = range) | WhereTyparDefaultsToType(range = range) @@ -448,10 +459,14 @@ type SynType = | StaticConstant of constant: SynConst * range: range + | StaticConstantNull of range: range + | StaticConstantExpr of expr: SynExpr * range: range | StaticConstantNamed of ident: SynType * value: SynType * range: range + | WithNull of innerType: SynType * ambivalent: bool * range: range * trivia: SynTypeWithNullTrivia + | Paren of innerType: SynType * range: range | SignatureParameter of attributes: SynAttributes * optional: bool * id: Ident option * usedType: SynType * range: range @@ -474,9 +489,11 @@ type SynType = | SynType.Anon(range = m) | SynType.WithGlobalConstraints(range = m) | SynType.StaticConstant(range = m) + | SynType.StaticConstantNull(range = m) | SynType.StaticConstantExpr(range = m) | SynType.StaticConstantNamed(range = m) | SynType.HashConstraint(range = m) + | SynType.WithNull(range = m) | SynType.MeasurePower(range = m) | SynType.Paren(range = m) | SynType.SignatureParameter(range = m) @@ -618,7 +635,13 @@ type SynExpr = | Lazy of expr: SynExpr * range: range - | Sequential of debugPoint: DebugPointAtSequential * isTrueSeq: bool * expr1: SynExpr * expr2: SynExpr * range: range + | Sequential of + debugPoint: DebugPointAtSequential * + isTrueSeq: bool * + expr1: SynExpr * + expr2: SynExpr * + range: range * + trivia: SynExprSequentialTrivia | IfThenElse of ifExpr: SynExpr * @@ -681,9 +704,9 @@ type SynExpr = | SequentialOrImplicitYield of debugPoint: DebugPointAtSequential * expr1: SynExpr * expr2: SynExpr * ifNotStmt: SynExpr * range: range - | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnTrivia - | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnFromTrivia | LetOrUseBang of bindDebugPoint: DebugPointAtBinding * @@ -703,7 +726,7 @@ type SynExpr = range: range * trivia: SynExprMatchBangTrivia - | DoBang of expr: SynExpr * range: range + | DoBang of expr: SynExpr * range: range * trivia: SynExprDoBangTrivia | WhileBang of whileDebugPoint: DebugPointAtWhile * whileExpr: SynExpr * doExpr: SynExpr * range: range @@ -823,9 +846,9 @@ type SynExpr = match e with // these are better than just .Range, and also commonly applicable inside queries | SynExpr.Paren(_, m, _, _) -> m - | SynExpr.Sequential(_, _, e1, _, _) - | SynExpr.SequentialOrImplicitYield(_, e1, _, _, _) - | SynExpr.App(_, _, e1, _, _) -> e1.RangeOfFirstPortion + | SynExpr.Sequential(expr1 = e1) + | SynExpr.SequentialOrImplicitYield(expr1 = e1) + | SynExpr.App(funcExpr = e1) -> e1.RangeOfFirstPortion | SynExpr.ForEach(pat = pat; range = r) -> let e = (pat.Range: range).Start withEnd e r @@ -847,6 +870,14 @@ type SynExprAndBang = range: range * trivia: SynExprAndBangTrivia + member x.Range = + match x with + | SynExprAndBang(range = range) -> range + + member this.Trivia = + match this with + | SynExprAndBang(trivia = trivia) -> trivia + [] type SynExprRecordField = | SynExprRecordField of @@ -1016,6 +1047,10 @@ type SynMatchClause = | None -> e.Range | Some x -> unionRanges e.Range x.Range + member this.IsTrueMatchClause = + let (SynMatchClause(trivia = trivia)) = this + trivia.BarRange.IsSome && trivia.ArrowRange.IsSome + member this.Range = match this with | SynMatchClause(range = m) -> m @@ -1184,7 +1219,7 @@ type SynTypeDefnSimpleRepr = fields: SynField list * isConcrete: bool * isIncrClass: bool * - implicitCtorSynPats: SynSimplePats option * + implicitCtorSynPats: SynPat option * range: range | LibraryOnlyILAssembly of @@ -1308,6 +1343,24 @@ type SynComponentInfo = match this with | SynComponentInfo(range = m) -> m +[] +type SynValSigAccess = + | Single of accessibility: SynAccess option + | GetSet of accessibility: SynAccess option * getterAccessibility: SynAccess option * setterAccessibility: SynAccess option + + member this.SingleAccess() = + match this with + | Single(access) + | GetSet(accessibility = access) -> access + + member this.GetSetAccessNoCheck() = + match this with + | Single(access) -> access, access + | GetSet(access, getterAccess, setterAccess) -> + let getterAccess = getterAccess |> Option.orElse access + let setterAccess = setterAccess |> Option.orElse access + getterAccess, setterAccess + [] type SynValSig = | SynValSig of @@ -1319,7 +1372,7 @@ type SynValSig = isInline: bool * isMutable: bool * xmlDoc: PreXmlDoc * - accessibility: SynAccess option * + accessibility: SynValSigAccess * synExpr: SynExpr option * range: range * trivia: SynValSigTrivia @@ -1433,13 +1486,18 @@ type SynMemberDefn = | ImplicitCtor of accessibility: SynAccess option * attributes: SynAttributes * - ctorArgs: SynSimplePats * + ctorArgs: SynPat * selfIdentifier: Ident option * xmlDoc: PreXmlDoc * range: range * trivia: SynMemberDefnImplicitCtorTrivia - | ImplicitInherit of inheritType: SynType * inheritArgs: SynExpr * inheritAlias: Ident option * range: range + | ImplicitInherit of + inheritType: SynType * + inheritArgs: SynExpr * + inheritAlias: Ident option * + range: range * + trivia: SynMemberDefnInheritTrivia | LetBindings of bindings: SynBinding list * isStatic: bool * isRecursive: bool * range: range @@ -1447,7 +1505,7 @@ type SynMemberDefn = | Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range - | Inherit of baseType: SynType * asIdent: Ident option * range: range + | Inherit of baseType: SynType option * asIdent: Ident option * range: range * trivia: SynMemberDefnInheritTrivia | ValField of fieldInfo: SynField * range: range @@ -1462,7 +1520,7 @@ type SynMemberDefn = memberFlags: SynMemberFlags * memberFlagsForSet: SynMemberFlags * xmlDoc: PreXmlDoc * - accessibility: SynAccess option * + accessibility: SynValSigAccess * synExpr: SynExpr * range: range * trivia: SynMemberDefnAutoPropertyTrivia @@ -1629,13 +1687,19 @@ type SynModuleOrNamespaceSig = [] type ParsedHashDirectiveArgument = + | Ident of value: Ident * range: range + | Int32 of value: Int32 * range: range + | LongIdent of value: SynLongIdent * range: range | String of value: string * stringKind: SynStringKind * range: range | SourceIdentifier of constant: string * value: string * range: range member this.Range = match this with + | ParsedHashDirectiveArgument.Ident(range = m) + | ParsedHashDirectiveArgument.Int32(range = m) | ParsedHashDirectiveArgument.String(range = m) - | ParsedHashDirectiveArgument.SourceIdentifier(range = m) -> m + | ParsedHashDirectiveArgument.SourceIdentifier(range = m) + | ParsedHashDirectiveArgument.LongIdent(range = m) -> m [] type ParsedHashDirective = ParsedHashDirective of ident: string * args: ParsedHashDirectiveArgument list * range: range diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fsi index 72e4a9d216..654a397117 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fsi +++ b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTree.fsi @@ -16,7 +16,10 @@ type Ident = member idRange: range /// Represents an identifier with potentially additional trivia information. -type SynIdent = SynIdent of ident: Ident * trivia: IdentTrivia option +type SynIdent = + | SynIdent of ident: Ident * trivia: IdentTrivia option + + member Range: range /// Represents a long identifier e.g. 'A.B.C' type LongIdent = Ident list @@ -405,6 +408,12 @@ type SynTypeConstraint = /// F# syntax is 'typar: null | WhereTyparSupportsNull of typar: SynTypar * range: range + /// F# syntax is 'typar : null + | WhereTyparNotSupportsNull of + genericName: SynTypar * + range: range * + trivia: SynTypeConstraintWhereTyparNotSupportsNullTrivia + /// F# syntax is 'typar: comparison | WhereTyparIsComparable of typar: SynTypar * range: range @@ -512,12 +521,17 @@ type SynType = /// For the dimensionless units i.e. 1, and static parameters to provided types | StaticConstant of constant: SynConst * range: range + /// F# syntax: null, used in parameters to type providers + | StaticConstantNull of range: range + /// F# syntax: const expr, used in static parameters to type providers | StaticConstantExpr of expr: SynExpr * range: range /// F# syntax: ident=1 etc., used in static parameters to type providers | StaticConstantNamed of ident: SynType * value: SynType * range: range + | WithNull of innerType: SynType * ambivalent: bool * range: range * trivia: SynTypeWithNullTrivia + | Paren of innerType: SynType * range: range /// F# syntax: a: b, used in signatures and type annotations @@ -751,7 +765,8 @@ type SynExpr = isTrueSeq: bool * expr1: SynExpr * expr2: SynExpr * - range: range + range: range * + trivia: SynExprSequentialTrivia /// F# syntax: if expr then expr /// F# syntax: if expr then expr else expr @@ -862,12 +877,12 @@ type SynExpr = /// F# syntax: yield expr /// F# syntax: return expr /// Computation expressions only - | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturn of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnTrivia /// F# syntax: yield! expr /// F# syntax: return! expr /// Computation expressions only - | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range + | YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnFromTrivia /// F# syntax: let! pat = expr in expr /// F# syntax: use! pat = expr in expr @@ -894,7 +909,7 @@ type SynExpr = /// F# syntax: do! expr /// Computation expressions only - | DoBang of expr: SynExpr * range: range + | DoBang of expr: SynExpr * range: range * trivia: SynExprDoBangTrivia /// F# syntax: 'while! ... do ...' | WhileBang of whileDebugPoint: DebugPointAtWhile * whileExpr: SynExpr * doExpr: SynExpr * range: range @@ -970,6 +985,12 @@ type SynExprAndBang = range: range * trivia: SynExprAndBangTrivia + /// Gets the syntax range of this construct + member Range: range + + /// Gets the trivia associated with this construct + member Trivia: SynExprAndBangTrivia + [] type SynExprRecordField = | SynExprRecordField of @@ -1156,6 +1177,9 @@ type SynMatchClause = /// Gets the syntax range of part of this construct member RangeOfGuardAndRhs: range + /// Is a pattern used in a true match clause e.g. | pat -> expr + member IsTrueMatchClause: bool + /// Gets the syntax range of this construct member Range: range @@ -1343,7 +1367,7 @@ type SynTypeDefnSimpleRepr = fields: SynField list * isConcrete: bool * isIncrClass: bool * - implicitCtorSynPats: SynSimplePats option * + implicitCtorSynPats: SynPat option * range: range /// A type defined by using an IL assembly representation. Only used in FSharp.Core. @@ -1477,6 +1501,18 @@ type SynComponentInfo = /// Gets the syntax range of this construct member Range: range +/// Represents one or two access modifier(s) in a property signature +[] +type SynValSigAccess = + | Single of accessibility: SynAccess option + | GetSet of + accessibility: SynAccess option * + getterAccessibility: SynAccess option * + setterAccessibility: SynAccess option + + member SingleAccess: unit -> SynAccess option + member GetSetAccessNoCheck: unit -> SynAccess option * SynAccess option + /// Represents the syntax tree for a 'val' definition in an abstract slot or a signature file [] type SynValSig = @@ -1489,7 +1525,7 @@ type SynValSig = isInline: bool * isMutable: bool * xmlDoc: PreXmlDoc * - accessibility: SynAccess option * + accessibility: SynValSigAccess * synExpr: SynExpr option * range: range * trivia: SynValSigTrivia @@ -1614,14 +1650,19 @@ type SynMemberDefn = | ImplicitCtor of accessibility: SynAccess option * attributes: SynAttributes * - ctorArgs: SynSimplePats * + ctorArgs: SynPat * selfIdentifier: Ident option * xmlDoc: PreXmlDoc * range: range * trivia: SynMemberDefnImplicitCtorTrivia /// An implicit inherit definition, 'inherit (args...) as base' - | ImplicitInherit of inheritType: SynType * inheritArgs: SynExpr * inheritAlias: Ident option * range: range + | ImplicitInherit of + inheritType: SynType * + inheritArgs: SynExpr * + inheritAlias: Ident option * + range: range * + trivia: SynMemberDefnInheritTrivia /// A 'let' definition within a class | LetBindings of bindings: SynBinding list * isStatic: bool * isRecursive: bool * range: range @@ -1637,7 +1678,7 @@ type SynMemberDefn = | Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range /// An 'inherit' definition within a class - | Inherit of baseType: SynType * asIdent: Ident option * range: range + | Inherit of baseType: SynType option * asIdent: Ident option * range: range * trivia: SynMemberDefnInheritTrivia /// A 'val' definition within a class | ValField of fieldInfo: SynField * range: range @@ -1655,7 +1696,7 @@ type SynMemberDefn = memberFlags: SynMemberFlags * memberFlagsForSet: SynMemberFlags * xmlDoc: PreXmlDoc * - accessibility: SynAccess option * + accessibility: SynValSigAccess * synExpr: SynExpr * range: range * trivia: SynMemberDefnAutoPropertyTrivia @@ -1822,6 +1863,9 @@ type SynModuleOrNamespaceSig = /// Represents a parsed hash directive argument [] type ParsedHashDirectiveArgument = + | Ident of value: Ident * range: range + | Int32 of value: Int32 * range: range + | LongIdent of value: SynLongIdent * range: range | String of value: string * stringKind: SynStringKind * range: range | SourceIdentifier of constant: string * value: string * range: range diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fs b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fs index 4f25985461..7b392487ad 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fs @@ -4,6 +4,7 @@ module FSharp.Compiler.SyntaxTreeOps open Internal.Utilities.Library open FSharp.Compiler.DiagnosticsLogger +open FSharp.Compiler.Features open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Syntax.PrettyNaming @@ -100,71 +101,82 @@ let rec pushUnaryArg expr arg = | SynExpr.TypeApp(innerExpr, mLess, tyargs, mCommas, mGreater, mTypars, m) -> let innerExpr = pushUnaryArg innerExpr arg SynExpr.TypeApp(innerExpr, mLess, tyargs, mCommas, mGreater, mTypars, m) + | SynExpr.ArbitraryAfterError(_, m) when m.Start = m.End -> + SynExpr.DiscardAfterMissingQualificationAfterDot(SynExpr.Ident arg, m.StartRange, unionRanges arg.idRange m) | _ -> errorR (Error(FSComp.SR.tcDotLambdaAtNotSupportedExpression (), expr.Range)) expr +[] let (|SynSingleIdent|_|) x = match x with - | SynLongIdent([ id ], _, _) -> Some id - | _ -> None + | SynLongIdent([ id ], _, _) -> ValueSome id + | _ -> ValueNone /// Match a long identifier, including the case for single identifiers which gets a more optimized node in the syntax tree. +[] let (|LongOrSingleIdent|_|) inp = match inp with - | SynExpr.LongIdent(isOpt, lidwd, altId, _m) -> Some(isOpt, lidwd, altId, lidwd.RangeWithoutAnyExtraDot) - | SynExpr.Ident id -> Some(false, SynLongIdent([ id ], [], [ None ]), None, id.idRange) + | SynExpr.LongIdent(isOpt, lidwd, altId, _m) -> ValueSome(isOpt, lidwd, altId, lidwd.RangeWithoutAnyExtraDot) + | SynExpr.Ident id -> ValueSome(false, SynLongIdent([ id ], [], [ None ]), None, id.idRange) | SynExpr.DiscardAfterMissingQualificationAfterDot(synExpr, dotRange, _) -> match synExpr with - | SynExpr.Ident ident -> Some(false, SynLongIdent([ ident ], [ dotRange ], [ None ]), None, ident.idRange) + | SynExpr.Ident ident -> ValueSome(false, SynLongIdent([ ident ], [ dotRange ], [ None ]), None, ident.idRange) | SynExpr.LongIdent(false, SynLongIdent(idents, dotRanges, trivia), _, range) -> - Some(false, SynLongIdent(idents, dotRanges @ [ dotRange ], trivia), None, range) - | _ -> None + ValueSome(false, SynLongIdent(idents, dotRanges @ [ dotRange ], trivia), None, range) + | _ -> ValueNone - | _ -> None + | _ -> ValueNone +[] let (|SingleIdent|_|) inp = match inp with - | SynExpr.LongIdent(false, SynSingleIdent(id), None, _) -> Some id - | SynExpr.Ident id -> Some id - | _ -> None + | SynExpr.LongIdent(false, SynSingleIdent(id), None, _) -> ValueSome id + | SynExpr.Ident id -> ValueSome id + | _ -> ValueNone +[] let (|SynBinOp|_|) input = match input with | SynExpr.App(ExprAtomicFlag.NonAtomic, false, SynExpr.App(ExprAtomicFlag.NonAtomic, true, SynExpr.LongIdent(longDotId = SynLongIdent(id = [ synId ])), x1, _m1), x2, - _m2) -> Some(synId, x1, x2) - | _ -> None + _m2) -> ValueSome(synId, x1, x2) + | _ -> ValueNone +[] let (|SynPipeRight|_|) input = match input with - | SynBinOp(synId, x1, x2) when synId.idText = "op_PipeRight" -> Some(x1, x2) - | _ -> None + | SynBinOp(synId, x1, x2) when synId.idText = "op_PipeRight" -> ValueSome(x1, x2) + | _ -> ValueNone +[] let (|SynPipeRight2|_|) input = match input with | SynBinOp(synId, SynExpr.Paren(SynExpr.Tuple(false, [ x1a; x1b ], _, _), _, _, _), x2) when synId.idText = "op_PipeRight2" -> - Some(x1a, x1b, x2) - | _ -> None + ValueSome(x1a, x1b, x2) + | _ -> ValueNone +[] let (|SynPipeRight3|_|) input = match input with | SynBinOp(synId, SynExpr.Paren(SynExpr.Tuple(false, [ x1a; x1b; x1c ], _, _), _, _, _), x2) when synId.idText = "op_PipeRight3" -> - Some(x1a, x1b, x1c, x2) - | _ -> None + ValueSome(x1a, x1b, x1c, x2) + | _ -> ValueNone +[] let (|SynAndAlso|_|) input = match input with - | SynBinOp(synId, x1, x2) when synId.idText = "op_BooleanAnd" -> Some(x1, x2) - | _ -> None + | SynBinOp(synId, x1, x2) when synId.idText = "op_BooleanAnd" -> ValueSome(x1, x2) + | _ -> ValueNone +[] let (|SynOrElse|_|) input = match input with - | SynBinOp(synId, x1, x2) when synId.idText = "op_BooleanOr" -> Some(x1, x2) - | _ -> None + | SynBinOp(synId, x1, x2) when synId.idText = "op_BooleanOr" -> ValueSome(x1, x2) + | _ -> ValueNone /// This affects placement of debug points let rec IsControlFlowExpression e = @@ -198,7 +210,7 @@ let rec IsControlFlowExpression e = // // For example // let x = 1 + 1 -// gets extended to inludde the 'let x'. +// gets extended to include the 'let x'. // // A corner case: some things that look like simple value bindings get generalized, e.g. // let empty = [] @@ -237,26 +249,29 @@ let mkSynPatMaybeVar lidwd vis m = SynPat.LongIdent(lidwd, None, None, SynArgPats.Pats [], vis, m) /// Extract the argument for patterns corresponding to the declaration of 'new ... = ...' +[] let (|SynPatForConstructorDecl|_|) x = match x with - | SynPat.LongIdent(longDotId = SynSingleIdent _; argPats = SynArgPats.Pats [ arg ]) -> Some arg - | _ -> None + | SynPat.LongIdent(longDotId = SynSingleIdent _; argPats = SynArgPats.Pats [ arg ]) -> ValueSome arg + | _ -> ValueNone /// Recognize the '()' in 'new()' +[] let (|SynPatForNullaryArgs|_|) x = match x with - | SynPat.Paren(SynPat.Const(SynConst.Unit, _), _) -> Some() - | _ -> None + | SynPat.Paren(SynPat.Const(SynConst.Unit, _), _) -> ValueSome() + | _ -> ValueNone let (|SynExprErrorSkip|) (p: SynExpr) = match p with | SynExpr.FromParseError(p, _) -> p | _ -> p +[] let (|SynExprParen|_|) (e: SynExpr) = match e with - | SynExpr.Paren(SynExprErrorSkip e, a, b, c) -> Some(e, a, b, c) - | _ -> None + | SynExpr.Paren(SynExprErrorSkip e, a, b, c) -> ValueSome(e, a, b, c) + | _ -> ValueNone let (|SynPatErrorSkip|) (p: SynPat) = match p with @@ -409,7 +424,10 @@ let opNameQMark = CompileOpName qmark let mkSynOperator (opm: range) (oper: string) = let trivia = - if oper.StartsWith("~") && ((opm.EndColumn - opm.StartColumn) = (oper.Length - 1)) then + if + oper.StartsWithOrdinal("~") + && ((opm.EndColumn - opm.StartColumn) = (oper.Length - 1)) + then // PREFIX_OP token where the ~ was actually absent IdentTrivia.OriginalNotation(string (oper.[1..])) else @@ -865,9 +883,9 @@ let rec synExprContainsError inpExpr = | SynExpr.InferredDowncast(e, _) | SynExpr.Lazy(e, _) | SynExpr.TraitCall(_, _, e, _) - | SynExpr.YieldOrReturn(_, e, _) - | SynExpr.YieldOrReturnFrom(_, e, _) - | SynExpr.DoBang(e, _) + | SynExpr.YieldOrReturn(_, e, _, _) + | SynExpr.YieldOrReturnFrom(_, e, _, _) + | SynExpr.DoBang(e, _, _) | SynExpr.Fixed(e, _) | SynExpr.DebugPoint(_, _, e) | SynExpr.Paren(e, _, _, _) -> walkExpr e @@ -925,7 +943,7 @@ let rec synExprContainsError inpExpr = | SynExpr.TryFinally(tryExpr = e1; finallyExpr = e2) -> walkExpr e1 || walkExpr e2 - | SynExpr.Sequential(_, _, e1, e2, _) -> walkExpr e1 || walkExpr e2 + | SynExpr.Sequential(expr1 = e1; expr2 = e2) -> walkExpr e1 || walkExpr e2 | SynExpr.SequentialOrImplicitYield(_, e1, e2, _, _) -> walkExpr e1 || walkExpr e2 @@ -965,11 +983,52 @@ let rec synExprContainsError inpExpr = walkExpr inpExpr -let (|ParsedHashDirectiveArguments|) (input: ParsedHashDirectiveArgument list) = +let longIdentToString (ident: SynLongIdent) = + System.String.Join(".", ident.LongIdent |> List.map (fun ident -> ident.idText.ToString())) + +let parsedHashDirectiveArguments (input: ParsedHashDirectiveArgument list) (langVersion: LanguageVersion) = + List.choose + (function + | ParsedHashDirectiveArgument.String(s, _, _) -> Some s + | ParsedHashDirectiveArgument.SourceIdentifier(_, v, _) -> Some v + | ParsedHashDirectiveArgument.Int32(n, m) -> + match tryCheckLanguageFeatureAndRecover langVersion LanguageFeature.ParsedHashDirectiveArgumentNonQuotes m with + | true -> Some(string n) + | false -> None + | ParsedHashDirectiveArgument.Ident(ident, m) -> + match tryCheckLanguageFeatureAndRecover langVersion LanguageFeature.ParsedHashDirectiveArgumentNonQuotes m with + | true -> Some(ident.idText) + | false -> None + | ParsedHashDirectiveArgument.LongIdent(ident, m) -> + match tryCheckLanguageFeatureAndRecover langVersion LanguageFeature.ParsedHashDirectiveArgumentNonQuotes m with + | true -> Some(longIdentToString ident) + | false -> None) + input + +let parsedHashDirectiveArgumentsNoCheck (input: ParsedHashDirectiveArgument list) = List.map (function | ParsedHashDirectiveArgument.String(s, _, _) -> s - | ParsedHashDirectiveArgument.SourceIdentifier(_, v, _) -> v) + | ParsedHashDirectiveArgument.SourceIdentifier(_, v, _) -> v + | ParsedHashDirectiveArgument.Int32(n, m) -> string n + | ParsedHashDirectiveArgument.Ident(ident, m) -> ident.idText + | ParsedHashDirectiveArgument.LongIdent(ident, m) -> longIdentToString ident) + input + +let parsedHashDirectiveStringArguments (input: ParsedHashDirectiveArgument list) (_langVersion: LanguageVersion) = + List.choose + (function + | ParsedHashDirectiveArgument.String(s, _, _) -> Some s + | ParsedHashDirectiveArgument.Int32(n, m) -> + errorR (Error(FSComp.SR.featureParsedHashDirectiveUnexpectedInteger (n), m)) + None + | ParsedHashDirectiveArgument.SourceIdentifier(_, v, _) -> Some v + | ParsedHashDirectiveArgument.Ident(ident, m) -> + errorR (Error(FSComp.SR.featureParsedHashDirectiveUnexpectedIdentifier (ident.idText), m)) + None + | ParsedHashDirectiveArgument.LongIdent(ident, m) -> + errorR (Error(FSComp.SR.featureParsedHashDirectiveUnexpectedIdentifier (longIdentToString ident), m)) + None) input let prependIdentInLongIdentWithTrivia (SynIdent(ident, identTrivia)) mDot lid = @@ -1022,6 +1081,7 @@ let getTypeFromTuplePath (path: SynTupleTypeSegment list) : SynType list = | SynTupleTypeSegment.Type t -> Some t | _ -> None) +[] let (|MultiDimensionArrayType|_|) (t: SynType) = match t with | SynType.App(StripParenTypes(SynType.LongIdent(SynLongIdent([ identifier ], _, _))), _, [ elementType ], _, _, true, m) -> @@ -1033,10 +1093,10 @@ let (|MultiDimensionArrayType|_|) (t: SynType) = |> System.String |> int - Some(rank, elementType, m) + ValueSome(rank, elementType, m) else - None - | _ -> None + ValueNone + | _ -> ValueNone let (|TypesForTypar|) (t: SynType) = let rec visit continuation t = @@ -1046,3 +1106,64 @@ let (|TypesForTypar|) (t: SynType) = | _ -> continuation [ t ] visit id t + +[] +let (|Get_OrSet_Ident|_|) (ident: Ident) = + if ident.idText.StartsWithOrdinal("get_") then ValueSome() + elif ident.idText.StartsWithOrdinal("set_") then ValueSome() + else ValueNone + +let getGetterSetterAccess synValSigAccess memberKind (langVersion: Features.LanguageVersion) = + match synValSigAccess with + | SynValSigAccess.Single(access) -> access, access + | SynValSigAccess.GetSet(access, getterAccess, setterAccess) -> + let checkAccess (access: SynAccess option) (accessBeforeGetSet: SynAccess option) = + match accessBeforeGetSet, access with + | None, _ -> access + | Some x, Some _ -> + errorR (Error(FSComp.SR.parsMultipleAccessibilitiesForGetSet (), x.Range)) + None + | Some x, None -> + checkLanguageFeatureAndRecover + langVersion + Features.LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters + x.Range + + accessBeforeGetSet + + match memberKind with + | SynMemberKind.PropertyGetSet -> + match access, (getterAccess, setterAccess) with + | _, (None, None) -> access, access + | None, (Some x, _) + | None, (_, Some x) -> + checkLanguageFeatureAndRecover + langVersion + Features.LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters + x.Range + + getterAccess, setterAccess + | _, (Some x, _) + | _, (_, Some x) -> + errorR (Error(FSComp.SR.parsMultipleAccessibilitiesForGetSet (), x.Range)) + None, None + + | SynMemberKind.PropertySet -> None, checkAccess access setterAccess + | SynMemberKind.Member + | SynMemberKind.PropertyGet + | _ -> checkAccess access getterAccess, None + +let addEmptyMatchClause (mBar1: range) (mBar2: range) (clauses: SynMatchClause list) = + let rec addOrPat (pat: SynPat) = + match pat with + | SynPat.As(lhsPat, rhsPat, range) -> SynPat.As(addOrPat lhsPat, rhsPat, range) + | _ -> + let mPat1 = mBar1.EndRange + let pat1 = SynPat.Wild(mPat1) + SynPat.Or(pat1, pat, unionRanges mPat1 pat.Range, { BarRange = mBar2 }) + + match clauses with + | [] -> [] + | SynMatchClause(pat, whenExpr, resultExpr, range, debugPoint, trivia) :: restClauses -> + SynMatchClause(addOrPat pat, whenExpr, resultExpr, range, debugPoint, trivia) + :: restClauses diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi index 03fc0be628..3ca2b58be4 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi +++ b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi @@ -2,6 +2,7 @@ module internal FSharp.Compiler.SyntaxTreeOps +open FSharp.Compiler.Features open FSharp.Compiler.Text open FSharp.Compiler.Xml open FSharp.Compiler.Syntax @@ -44,10 +45,12 @@ val mkSynCompGenSimplePatVar: id: Ident -> SynSimplePat val pushUnaryArg: expr: SynExpr -> arg: Ident -> SynExpr /// Match a long identifier, including the case for single identifiers which gets a more optimized node in the syntax tree. +[] val (|LongOrSingleIdent|_|): - inp: SynExpr -> (bool * SynLongIdent * SynSimplePatAlternativeIdInfo ref option * range) option + inp: SynExpr -> (bool * SynLongIdent * SynSimplePatAlternativeIdInfo ref option * range) voption -val (|SingleIdent|_|): inp: SynExpr -> Ident option +[] +val (|SingleIdent|_|): inp: SynExpr -> Ident voption /// This affects placement of debug points val IsControlFlowExpression: e: SynExpr -> bool @@ -66,14 +69,17 @@ val mkSynThisPatVar: id: Ident -> SynPat val mkSynPatMaybeVar: lidwd: SynLongIdent -> vis: SynAccess option -> m: range -> SynPat -val (|SynPatForConstructorDecl|_|): x: SynPat -> SynPat option +[] +val (|SynPatForConstructorDecl|_|): x: SynPat -> SynPat voption /// Recognize the '()' in 'new()' -val (|SynPatForNullaryArgs|_|): x: SynPat -> unit option +[] +val (|SynPatForNullaryArgs|_|): x: SynPat -> unit voption val (|SynExprErrorSkip|): p: SynExpr -> SynExpr -val (|SynExprParen|_|): e: SynExpr -> (SynExpr * range * range option * range) option +[] +val (|SynExprParen|_|): e: SynExpr -> (SynExpr * range * range option * range) voption val (|SynPatErrorSkip|): p: SynPat -> SynPat @@ -314,22 +320,31 @@ val unionBindingAndMembers: bindings: SynBinding list -> members: SynMemberDefn val synExprContainsError: inpExpr: SynExpr -> bool -val (|ParsedHashDirectiveArguments|): ParsedHashDirectiveArgument list -> string list +val parsedHashDirectiveArguments: ParsedHashDirectiveArgument list -> LanguageVersion -> string list + +val parsedHashDirectiveArgumentsNoCheck: ParsedHashDirectiveArgument list -> string list + +val parsedHashDirectiveStringArguments: ParsedHashDirectiveArgument list -> LanguageVersion -> string list /// 'e1 && e2' -val (|SynAndAlso|_|): SynExpr -> (SynExpr * SynExpr) option +[] +val (|SynAndAlso|_|): SynExpr -> (SynExpr * SynExpr) voption /// 'e1 || e2' -val (|SynOrElse|_|): SynExpr -> (SynExpr * SynExpr) option +[] +val (|SynOrElse|_|): SynExpr -> (SynExpr * SynExpr) voption /// 'e1 |> e2' -val (|SynPipeRight|_|): SynExpr -> (SynExpr * SynExpr) option +[] +val (|SynPipeRight|_|): SynExpr -> (SynExpr * SynExpr) voption /// 'e1 ||> e2' -val (|SynPipeRight2|_|): SynExpr -> (SynExpr * SynExpr * SynExpr) option +[] +val (|SynPipeRight2|_|): SynExpr -> (SynExpr * SynExpr * SynExpr) voption /// 'e1 |||> e2' -val (|SynPipeRight3|_|): SynExpr -> (SynExpr * SynExpr * SynExpr * SynExpr) option +[] +val (|SynPipeRight3|_|): SynExpr -> (SynExpr * SynExpr * SynExpr * SynExpr) voption val prependIdentInLongIdentWithTrivia: ident: SynIdent -> mDot: range -> lid: SynLongIdent -> SynLongIdent @@ -341,6 +356,17 @@ val desugarGetSetMembers: memberDefns: SynMemberDefns -> SynMemberDefns val getTypeFromTuplePath: path: SynTupleTypeSegment list -> SynType list -val (|MultiDimensionArrayType|_|): t: SynType -> (int * SynType * range) option +[] +val (|MultiDimensionArrayType|_|): t: SynType -> (int * SynType * range) voption val (|TypesForTypar|): t: SynType -> SynType list + +/// Generated get_XYZ or set_XYZ ident text +[] +val (|Get_OrSet_Ident|_|): Ident -> unit voption + +val getGetterSetterAccess: + SynValSigAccess -> SynMemberKind -> Features.LanguageVersion -> SynAccess option * SynAccess option + +/// Adds SynPat.Or pattern for unfinished empty clause above +val addEmptyMatchClause: mBar1: range -> mBar2: range -> clauses: SynMatchClause list -> SynMatchClause list diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 7330ac9b69..2cd42701e7 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -85,18 +85,28 @@ type SynExprDotLambdaTrivia = [] type SynExprLetOrUseTrivia = { + LetOrUseKeyword: range InKeyword: range option } - static member Zero: SynExprLetOrUseTrivia = { InKeyword = None } + static member Zero: SynExprLetOrUseTrivia = + { + InKeyword = None + LetOrUseKeyword = Range.Zero + } [] type SynExprLetOrUseBangTrivia = { + LetOrUseBangKeyword: range EqualsRange: range option } - static member Zero: SynExprLetOrUseBangTrivia = { EqualsRange = None } + static member Zero: SynExprLetOrUseBangTrivia = + { + LetOrUseBangKeyword = Range.Zero + EqualsRange = None + } [] type SynExprMatchTrivia = @@ -112,9 +122,39 @@ type SynExprMatchBangTrivia = WithKeyword: range } +[] +type SynExprYieldOrReturnTrivia = + { + YieldOrReturnKeyword: range + } + + static member Zero: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = Range.Zero } + +[] +type SynExprYieldOrReturnFromTrivia = + { + YieldOrReturnFromKeyword: range + } + + static member Zero: SynExprYieldOrReturnFromTrivia = + { + YieldOrReturnFromKeyword = Range.Zero + } + +[] +type SynExprDoBangTrivia = { DoBangKeyword: range } + [] type SynExprAnonRecdTrivia = { OpeningBraceRange: range } +[] +type SynExprSequentialTrivia = + { + SeparatorRange: range option + } + + static member val Zero = { SeparatorRange = None } + [] type SynMatchClauseTrivia = { @@ -262,6 +302,7 @@ type SynBindingTrivia = [] type SynExprAndBangTrivia = { + AndBangKeyword: range EqualsRange: range InKeyword: range option } @@ -379,6 +420,9 @@ type SynMemberDefnAbstractSlotTrivia = static member Zero = { GetSetKeywords = None } +[] +type SynMemberDefnInheritTrivia = { InheritKeyword: range } + [] type SynFieldTrivia = { @@ -395,6 +439,9 @@ type SynFieldTrivia = [] type SynTypeOrTrivia = { OrKeyword: range } +[] +type SynTypeWithNullTrivia = { BarRange: range } + [] type SynBindingReturnInfoTrivia = { ColonRange: range option } @@ -420,3 +467,6 @@ type SynMeasureConstantTrivia = LessRange: range GreaterRange: range } + +[] +type SynTypeConstraintWhereTyparNotSupportsNullTrivia = { ColonRange: range; NotRange: range } diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 137f543280..ab6525bc01 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/fcs-fable/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -129,6 +129,8 @@ type SynExprDotLambdaTrivia = [] type SynExprLetOrUseTrivia = { + /// The syntax range of the `let` or `use` keyword. + LetOrUseKeyword: range /// The syntax range of the `in` keyword. InKeyword: range option } @@ -139,6 +141,8 @@ type SynExprLetOrUseTrivia = [] type SynExprLetOrUseBangTrivia = { + /// The syntax range of the `let!` or `use!` keyword. + LetOrUseBangKeyword: range /// The syntax range of the `=` token. EqualsRange: range option } @@ -167,6 +171,32 @@ type SynExprMatchBangTrivia = WithKeyword: range } +/// Represents additional information for SynExpr.DoBang +[] +type SynExprDoBangTrivia = + { + /// The syntax range of the `do!` keyword + DoBangKeyword: range + } + +/// Represents additional information for SynExpr.YieldOrReturn +[] +type SynExprYieldOrReturnTrivia = + { + /// The syntax range of the `yield` or `return` keyword. + YieldOrReturnKeyword: range + } + + static member Zero: SynExprYieldOrReturnTrivia + +/// Represents additional information for SynExpr.YieldOrReturnFrom +[] +type SynExprYieldOrReturnFromTrivia = + { + /// The syntax range of the `yield!` or `return!` keyword. + YieldOrReturnFromKeyword: range + } + /// Represents additional information for SynExpr.AnonRecd [] type SynExprAnonRecdTrivia = @@ -175,6 +205,17 @@ type SynExprAnonRecdTrivia = OpeningBraceRange: range } +/// Represents additional information for SynExpr.Sequential +[] +type SynExprSequentialTrivia = + { + /// The syntax range of the `;` token. + /// Could also be the `then` keyword. + SeparatorRange: range option + } + + static member Zero: SynExprSequentialTrivia + /// Represents additional information for SynMatchClause [] type SynMatchClauseTrivia = @@ -323,9 +364,10 @@ type SynBindingTrivia = [] type SynExprAndBangTrivia = { + /// The syntax range of the `and!` keyword + AndBangKeyword: range /// The syntax range of the `=` token. EqualsRange: range - /// The syntax range of the `in` keyword. InKeyword: range option } @@ -480,6 +522,10 @@ type SynMemberDefnAbstractSlotTrivia = static member Zero: SynMemberDefnAbstractSlotTrivia +/// Represents additional information for SynMemberDefn.Inherit +[] +type SynMemberDefnInheritTrivia = { InheritKeyword: range } + /// Represents additional information for SynField [] type SynFieldTrivia = @@ -500,6 +546,14 @@ type SynTypeOrTrivia = OrKeyword: range } +/// Represents additional information for SynType.WithNull +[] +type SynTypeWithNullTrivia = + { + /// The syntax range of the `|` token + BarRange: range + } + /// Represents additional information for SynBindingReturnInfo [] type SynBindingReturnInfoTrivia = @@ -533,3 +587,14 @@ type SynTyparDeclTrivia = type SynMeasureConstantTrivia = { LessRange: range GreaterRange: range } + +/// Represents additional information for SynTypeConstraint.WhereTyparNotSupportsNull +[] +type SynTypeConstraintWhereTyparNotSupportsNullTrivia = + { + /// The syntax range of `:` + ColonRange: range + + /// The syntax range of `not` + NotRange: range + } diff --git a/src/fcs-fable/src/Compiler/SyntaxTree/XmlDoc.fs b/src/fcs-fable/src/Compiler/SyntaxTree/XmlDoc.fs index ca2c21a6de..9d91417ae6 100644 --- a/src/fcs-fable/src/Compiler/SyntaxTree/XmlDoc.fs +++ b/src/fcs-fable/src/Compiler/SyntaxTree/XmlDoc.fs @@ -25,7 +25,7 @@ type XmlDoc(unprocessedLines: string[], range: range) = | lineA :: rest as lines -> let lineAT = lineA.TrimStart([| ' ' |]) - if lineAT = "" then + if String.IsNullOrEmpty(lineAT) then processLines rest elif lineAT.StartsWithOrdinal("<") then lines @@ -82,7 +82,7 @@ type XmlDoc(unprocessedLines: string[], range: range) = | Some paramNames -> for p in xml.Descendants(XName.op_Implicit "param") do - match p.Attribute(XName.op_Implicit "name") with + match p.Attribute(!!(XName.op_Implicit "name")) with | null -> warning (Error(FSComp.SR.xmlDocMissingParameterName (), doc.Range)) | attr -> let nm = attr.Value @@ -93,9 +93,9 @@ type XmlDoc(unprocessedLines: string[], range: range) = let paramsWithDocs = [ for p in xml.Descendants(XName.op_Implicit "param") do - match p.Attribute(XName.op_Implicit "name") with - | null -> () - | attr -> attr.Value + match p.Attribute(!!(XName.op_Implicit "name")) with + | Null -> () + | NonNull attr -> attr.Value ] if paramsWithDocs.Length > 0 then @@ -110,7 +110,7 @@ type XmlDoc(unprocessedLines: string[], range: range) = warning (Error(FSComp.SR.xmlDocDuplicateParameter (d), doc.Range)) for pref in xml.Descendants(XName.op_Implicit "paramref") do - match pref.Attribute(XName.op_Implicit "name") with + match pref.Attribute(!!(XName.op_Implicit "name")) with | null -> warning (Error(FSComp.SR.xmlDocMissingParameterName (), doc.Range)) | attr -> let nm = attr.Value @@ -122,46 +122,6 @@ type XmlDoc(unprocessedLines: string[], range: range) = warning (Error(FSComp.SR.xmlDocBadlyFormed (e.Message), doc.Range)) #endif //!FABLE_COMPILER -#if CREF_ELABORATION - member doc.Elaborate(crefResolver) = - for see in - seq { - yield! xml.Descendants(XName.op_Implicit "see") - yield! xml.Descendants(XName.op_Implicit "seealso") - yield! xml.Descendants(XName.op_Implicit "exception") - } do - match see.Attribute(XName.op_Implicit "cref") with - | null -> warning (Error(FSComp.SR.xmlDocMissingCrossReference (), doc.Range)) - | attr -> - let cref = attr.Value - - if - cref.StartsWith("T:") - || cref.StartsWith("P:") - || cref.StartsWith("M:") - || cref.StartsWith("E:") - || cref.StartsWith("F:") - then - () - else - match crefResolver cref with - | None -> warning (Error(FSComp.SR.xmlDocUnresolvedCrossReference (nm), doc.Range)) - | Some text -> - attr.Value <- text - modified <- true - - if modified then - let m = doc.Range - - let newLines = - [| - for e in xml.Elements() do - yield! e.ToString().Split([| '\r'; '\n' |], StringSplitOptions.RemoveEmptyEntries) - |] - - lines <- newLines -#endif - // Discriminated unions can't contain statics, so we use a separate type and XmlDocStatics() = @@ -366,7 +326,7 @@ type XmlDocumentationInfo private (tryGetXmlDocument: unit -> XmlDocument option let lines = Array.zeroCreate childNodes.Count for i = 0 to childNodes.Count - 1 do - let childNode = childNodes[i] + let childNode = !!childNodes[i] lines[i] <- childNode.OuterXml XmlDoc(lines, range0)) diff --git a/src/fcs-fable/src/Compiler/TypedTree/CompilerGlobalState.fs b/src/fcs-fable/src/Compiler/TypedTree/CompilerGlobalState.fs index 0565c8b2be..8085a82bd0 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/CompilerGlobalState.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/CompilerGlobalState.fs @@ -5,7 +5,6 @@ module FSharp.Compiler.CompilerGlobalState open System -open System.Collections.Generic open System.Collections.Concurrent open System.Threading open FSharp.Compiler.Syntax.PrettyNaming @@ -19,15 +18,19 @@ open FSharp.Compiler.Text /// policy to make all globally-allocated objects concurrency safe in case future versions of the compiler /// are used to host multiple concurrent instances of compilation. type NiceNameGenerator() = - let basicNameCounts = ConcurrentDictionary>(max Environment.ProcessorCount 1, 127) + let basicNameCounts = ConcurrentDictionary(max Environment.ProcessorCount 1, 127) + // Cache this as a delegate. + let basicNameCountsAddDelegate = Func(fun _ -> ref 0) - member _.FreshCompilerGeneratedName (name, m: range) = - let basicName = GetBasicNameOfPossibleCompilerGeneratedName name - let countCell = basicNameCounts.GetOrAdd(basicName, fun _k -> ref 0) + member _.FreshCompilerGeneratedNameOfBasicName (basicName, m: range) = + let countCell = basicNameCounts.GetOrAdd(basicName, basicNameCountsAddDelegate) let count = Interlocked.Increment(countCell) - + CompilerGeneratedNameSuffix basicName (string m.StartLine + (match (count-1) with 0 -> "" | n -> "-" + string n)) + member this.FreshCompilerGeneratedName (name, m: range) = + this.FreshCompilerGeneratedNameOfBasicName (GetBasicNameOfPossibleCompilerGeneratedName name, m) + /// Generates compiler-generated names marked up with a source code location, but if given the same unique value then /// return precisely the same name. Each name generated also includes the StartLine number of the range passed in /// at the point of first generation. @@ -42,7 +45,7 @@ type StableNiceNameGenerator() = member x.GetUniqueCompilerGeneratedName (name, m: range, uniq) = let basicName = GetBasicNameOfPossibleCompilerGeneratedName name let key = basicName, uniq - niceNames.GetOrAdd(key, fun _ -> innerGenerator.FreshCompilerGeneratedName(name, m)) + niceNames.GetOrAdd(key, fun (basicName, _) -> innerGenerator.FreshCompilerGeneratedNameOfBasicName(basicName, m)) type internal CompilerGlobalState () = /// A global generator of compiler generated names diff --git a/src/fcs-fable/src/Compiler/TypedTree/QuotationPickler.fs b/src/fcs-fable/src/Compiler/TypedTree/QuotationPickler.fs index addd6bac6e..5580a5120a 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/QuotationPickler.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/QuotationPickler.fs @@ -249,7 +249,11 @@ let PickleBufferCapacity = 100000 module SimplePickle = - type Table<'T> = + type Table<'T +#if !NO_CHECKNULLS + when 'T:not null +#endif + > = { tbl: HashMultiMap<'T, int> // This should be "Dictionary" mutable rows: 'T list mutable count: int } diff --git a/src/fcs-fable/src/Compiler/TypedTree/TcGlobals.fs b/src/fcs-fable/src/Compiler/TypedTree/TcGlobals.fs index 3a9a8ae519..63c8607d9e 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TcGlobals.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/TcGlobals.fs @@ -17,7 +17,6 @@ open System.Diagnostics open Internal.Utilities.Library open Internal.Utilities.Library.Extras open FSharp.Compiler.AbstractIL.IL -open FSharp.Compiler.AbstractIL.ILX open FSharp.Compiler.CompilerGlobalState open FSharp.Compiler.Features open FSharp.Compiler.IO @@ -26,9 +25,7 @@ open FSharp.Compiler.Text.FileIndex open FSharp.Compiler.Text.Range open FSharp.Compiler.TypedTree open FSharp.Compiler.TypedTreeBasics - open Internal.Utilities -open System.Reflection let internal DummyFileNameForRangesWithoutASpecificLocation = startupFileName let private envRange = rangeN DummyFileNameForRangesWithoutASpecificLocation 0 @@ -67,7 +64,6 @@ module FSharpLib = let LanguagePrimitivesName = Root + ".Core.LanguagePrimitives" let CompilerServicesName = Root + ".Core.CompilerServices" let LinqRuntimeHelpersName = Root + ".Linq.RuntimeHelpers" - let RuntimeHelpersName = Root + ".Core.CompilerServices.RuntimeHelpers" let ExtraTopLevelOperatorsName = Root + ".Core.ExtraTopLevelOperators" let NativeInteropName = Root + ".NativeInterop" @@ -79,7 +75,6 @@ module FSharpLib = let NativeInteropPath = splitNamespace NativeInteropName |> Array.ofList let CompilerServicesPath = splitNamespace CompilerServicesName |> Array.ofList let LinqRuntimeHelpersPath = splitNamespace LinqRuntimeHelpersName |> Array.ofList - let RuntimeHelpersPath = splitNamespace RuntimeHelpersName |> Array.ofList let QuotationsPath = splitNamespace QuotationsName |> Array.ofList let RootPathArray = RootPath |> Array.ofList @@ -182,6 +177,13 @@ let tname_IsByRefLikeAttribute = "System.Runtime.CompilerServices.IsByRefLikeAtt // Table of all these "globals" //------------------------------------------------------------------------- +[] +type CompilationMode = + | Unset + | OneOff + | Service + | Interactive + type TcGlobals( compilingFSharpCore: bool, ilg: ILGlobals, @@ -189,19 +191,29 @@ type TcGlobals( directoryToResolveRelativePaths, mlCompatibility: bool, isInteractive: bool, + checkNullness: bool, useReflectionFreeCodeGen: bool, // The helper to find system types amongst referenced DLLs - tryFindSysTypeCcuHelper, + tryFindSysTypeCcuHelper: string list -> string -> bool -> FSharp.Compiler.TypedTree.CcuThunk option, emitDebugInfoInQuotations: bool, noDebugAttributes: bool, pathMap: PathMap, - langVersion: LanguageVersion) = + langVersion: LanguageVersion, + realsig: bool, + compilationMode: CompilationMode) = + + let v_langFeatureNullness = langVersion.SupportsFeature LanguageFeature.NullnessChecking + + let v_knownWithNull = + if v_langFeatureNullness then KnownWithNull else KnownAmbivalentToNull - // empty flags - let v_knownWithoutNull = 0uy + let v_knownWithoutNull = + if v_langFeatureNullness then KnownWithoutNull else KnownAmbivalentToNull let mkNonGenericTy tcref = TType_app(tcref, [], v_knownWithoutNull) + let mkNonGenericTyWithNullness tcref nullness = TType_app(tcref, [], nullness) + let mkNonLocalTyconRef2 ccu path n = mkNonLocalTyconRef (mkNonLocalEntityRef ccu path) n let mk_MFCore_tcref ccu n = mkNonLocalTyconRef2 ccu CorePathArray n @@ -209,14 +221,11 @@ type TcGlobals( let mk_MFLinq_tcref ccu n = mkNonLocalTyconRef2 ccu LinqPathArray n let mk_MFCollections_tcref ccu n = mkNonLocalTyconRef2 ccu CollectionsPathArray n let mk_MFCompilerServices_tcref ccu n = mkNonLocalTyconRef2 ccu CompilerServicesPath n - let mk_MFRuntimeHelpers_tcref ccu n = mkNonLocalTyconRef2 ccu RuntimeHelpersPath n let mk_MFControl_tcref ccu n = mkNonLocalTyconRef2 ccu ControlPathArray n - let tryFindSysTypeCcu path nm = - tryFindSysTypeCcuHelper path nm false + let tryFindSysTypeCcu path nm = tryFindSysTypeCcuHelper path nm false - let tryFindPublicSysTypeCcu path nm = - tryFindSysTypeCcuHelper path nm true + let tryFindPublicSysTypeCcu path nm = tryFindSysTypeCcuHelper path nm true let vara = Construct.NewRigidTypar "a" envRange let varb = Construct.NewRigidTypar "b" envRange @@ -341,6 +350,9 @@ type TcGlobals( match name with | "System.Runtime.CompilerServices.IsReadOnlyAttribute" | "System.Runtime.CompilerServices.IsUnmanagedAttribute" + | "System.Runtime.CompilerServices.NullableAttribute" + | "System.Runtime.CompilerServices.NullableContextAttribute" + | "System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute" | "System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute" | "System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes" -> true | _ -> false @@ -356,7 +368,7 @@ type TcGlobals( let attrRef = ILTypeRef.Create(ILScopeRef.Local, [], nm) let attrTycon = Construct.NewTycon( - Some (CompPath(ILScopeRef.Local, [])), + Some (CompPath(ILScopeRef.Local, SyntaxAccess.Internal, [])), attrRef.Name, range0, taccessInternal, @@ -375,14 +387,12 @@ type TcGlobals( let tryMkSysNonGenericTy path n = tryFindSysTyconRef path n |> Option.map mkNonGenericTy let sys = ["System"] - let sysLinq = ["System";"Linq"] let sysCollections = ["System";"Collections"] let sysGenerics = ["System";"Collections";"Generic"] let sysCompilerServices = ["System";"Runtime";"CompilerServices"] let lazy_tcr = findSysTyconRef sys "Lazy`1" let v_fslib_IEvent2_tcr = mk_MFControl_tcref fslibCcu "IEvent`2" - let v_tcref_IQueryable = findSysTyconRef sysLinq "IQueryable`1" let v_tcref_IObservable = findSysTyconRef sys "IObservable`1" let v_tcref_IObserver = findSysTyconRef sys "IObserver`1" let v_fslib_IDelegateEvent_tcr = mk_MFControl_tcref fslibCcu "IDelegateEvent`1" @@ -430,7 +440,9 @@ type TcGlobals( let v_enum_ty = mkNonGenericTy v_int_tcr let v_bool_ty = mkNonGenericTy v_bool_tcr let v_char_ty = mkNonGenericTy v_char_tcr - let v_obj_ty = mkNonGenericTy v_obj_tcr + let v_obj_ty_without_null = mkNonGenericTyWithNullness v_obj_tcr v_knownWithoutNull + let v_obj_ty_ambivalent = mkNonGenericTyWithNullness v_obj_tcr KnownAmbivalentToNull + let v_obj_ty_with_null = mkNonGenericTyWithNullness v_obj_tcr v_knownWithNull let v_IFormattable_tcref = findSysTyconRef sys "IFormattable" let v_FormattableString_tcref = findSysTyconRef sys "FormattableString" let v_IFormattable_ty = mkNonGenericTy v_IFormattable_tcref @@ -438,6 +450,7 @@ type TcGlobals( let v_FormattableStringFactory_tcref = findSysTyconRef sysCompilerServices "FormattableStringFactory" let v_FormattableStringFactory_ty = mkNonGenericTy v_FormattableStringFactory_tcref let v_string_ty = mkNonGenericTy v_string_tcr + let v_string_ty_ambivalent = mkNonGenericTyWithNullness v_string_tcr KnownAmbivalentToNull let v_decimal_ty = mkSysNonGenericTy sys "Decimal" let v_unit_ty = mkNonGenericTy v_unit_tcr_nice let v_system_Type_ty = mkSysNonGenericTy sys "Type" @@ -450,6 +463,7 @@ type TcGlobals( let mkByrefTy ty = TType_app(v_byref_tcr, [ty], v_knownWithoutNull) let mkNativePtrTy ty = TType_app(v_nativeptr_tcr, [ty], v_knownWithoutNull) let mkFunTy d r = TType_fun (d, r, v_knownWithoutNull) + let mkFunTyWithNullness d r nullness = TType_fun (d, r, nullness) let (-->) d r = mkFunTy d r let mkIteratedFunTy dl r = List.foldBack mkFunTy dl r let mkSmallRefTupledTy l = match l with [] -> v_unit_ty | [h] -> h | tys -> mkRawRefTupleTy tys @@ -647,16 +661,18 @@ type TcGlobals( | [_] -> None | _ -> TType_tuple (tupInfo, l) |> Some - - let decodeTupleTy tupInfo l = - match tryDecodeTupleTy tupInfo l with + let decodeTupleTyAndNullness tupInfo tinst _nullness = + match tryDecodeTupleTy tupInfo tinst with | Some ty -> ty | None -> failwith "couldn't decode tuple ty" - let decodeTupleTyIfPossible tcref tupInfo l = - match tryDecodeTupleTy tupInfo l with + let decodeTupleTyAndNullnessIfPossible tcref tupInfo tinst nullness = + match tryDecodeTupleTy tupInfo tinst with | Some ty -> ty - | None -> TType_app(tcref, l, v_knownWithoutNull) + | None -> TType_app(tcref, tinst, nullness) + + let decodeTupleTy tupInfo tinst = + decodeTupleTyAndNullness tupInfo tinst v_knownWithoutNull let mk_MFCore_attrib nm : BuiltinAttribInfo = AttribInfo(mkILTyRef(ilg.fsharpCoreAssemblyScopeRef, Core + "." + nm), mk_MFCore_tcref fslibCcu nm) @@ -721,11 +737,11 @@ type TcGlobals( let v_generic_hash_withc_inner_info = makeIntrinsicValRef(fslib_MFHashCompare_nleref, "GenericHashWithComparerIntrinsic" , None , None , [vara], mk_hash_withc_sig varaTy) let v_create_instance_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "CreateInstance" , None , None , [vara], ([[v_unit_ty]], varaTy)) - let v_unbox_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "UnboxGeneric" , None , None , [vara], ([[v_obj_ty]], varaTy)) + let v_unbox_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "UnboxGeneric" , None , None , [vara], ([[v_obj_ty_with_null]], varaTy)) - let v_unbox_fast_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "UnboxFast" , None , None , [vara], ([[v_obj_ty]], varaTy)) - let v_istype_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "TypeTestGeneric" , None , None , [vara], ([[v_obj_ty]], v_bool_ty)) - let v_istype_fast_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "TypeTestFast" , None , None , [vara], ([[v_obj_ty]], v_bool_ty)) + let v_unbox_fast_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "UnboxFast" , None , None , [vara], ([[v_obj_ty_with_null]], varaTy)) + let v_istype_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "TypeTestGeneric" , None , None , [vara], ([[v_obj_ty_with_null]], v_bool_ty)) + let v_istype_fast_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "TypeTestFast" , None , None , [vara], ([[v_obj_ty_with_null]], v_bool_ty)) let v_dispose_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "Dispose" , None , None , [vara], ([[varaTy]], v_unit_ty)) @@ -777,7 +793,6 @@ type TcGlobals( let v_sbyte_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "sbyte" , None , Some "ToSByte", [vara], ([[varaTy]], v_sbyte_ty)) let v_int16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int16" , None , Some "ToInt16", [vara], ([[varaTy]], v_int16_ty)) let v_uint16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint16" , None , Some "ToUInt16", [vara], ([[varaTy]], v_uint16_ty)) - let v_int_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int" , None , Some "ToInt", [vara], ([[varaTy]], v_int_ty)) let v_int32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int32" , None , Some "ToInt32", [vara], ([[varaTy]], v_int32_ty)) let v_uint32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint32" , None , Some "ToUInt32", [vara], ([[varaTy]], v_uint32_ty)) let v_int64_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int64" , None , Some "ToInt64", [vara], ([[varaTy]], v_int64_ty)) @@ -791,7 +806,7 @@ type TcGlobals( let v_enum_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "enum" , None , Some "ToEnum", [vara], ([[varaTy]], v_enum_ty)) let v_hash_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "hash" , None , Some "Hash" , [vara], ([[varaTy]], v_int_ty)) - let v_box_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "box" , None , Some "Box" , [vara], ([[varaTy]], v_obj_ty)) + let v_box_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "box" , None , Some "Box" , [vara], ([[varaTy]], v_obj_ty_with_null)) let v_isnull_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "isNull" , None , Some "IsNull" , [vara], ([[varaTy]], v_bool_ty)) let v_raise_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "raise" , None , Some "Raise" , [vara], ([[mkSysNonGenericTy sys "Exception"]], varaTy)) let v_failwith_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "failwith" , None , Some "FailWith" , [vara], ([[v_string_ty]], varaTy)) @@ -811,6 +826,18 @@ type TcGlobals( let v_range_op_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Range" , None , None , [vara], ([[varaTy];[varaTy]], mkSeqTy varaTy)) let v_range_step_op_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_RangeStep" , None , None , [vara;varb], ([[varaTy];[varbTy];[varaTy]], mkSeqTy varaTy)) let v_range_int32_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeInt32" , None , None , [], ([[v_int_ty];[v_int_ty];[v_int_ty]], mkSeqTy v_int_ty)) + let v_range_int64_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeInt64" , None , None , [], ([[v_int64_ty];[v_int64_ty];[v_int64_ty]], mkSeqTy v_int64_ty)) + let v_range_uint64_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUInt64" , None , None , [], ([[v_uint64_ty];[v_uint64_ty];[v_uint64_ty]], mkSeqTy v_uint64_ty)) + let v_range_uint32_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUInt32" , None , None , [], ([[v_uint32_ty];[v_uint32_ty];[v_uint32_ty]], mkSeqTy v_uint32_ty)) + let v_range_nativeint_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeIntPtr" , None , None , [], ([[v_nativeint_ty];[v_nativeint_ty];[v_nativeint_ty]], mkSeqTy v_nativeint_ty)) + let v_range_unativeint_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUIntPtr" , None , None , [], ([[v_unativeint_ty];[v_unativeint_ty];[v_unativeint_ty]], mkSeqTy v_unativeint_ty)) + let v_range_int16_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeInt16" , None , None , [], ([[v_int16_ty];[v_int16_ty];[v_int16_ty]], mkSeqTy v_int16_ty)) + let v_range_uint16_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUInt16" , None , None , [], ([[v_uint16_ty];[v_uint16_ty];[v_uint16_ty]], mkSeqTy v_uint16_ty)) + let v_range_sbyte_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeSByte" , None , None , [], ([[v_sbyte_ty];[v_sbyte_ty];[v_sbyte_ty]], mkSeqTy v_sbyte_ty)) + let v_range_byte_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeByte" , None , None , [], ([[v_byte_ty];[v_byte_ty];[v_byte_ty]], mkSeqTy v_byte_ty)) + let v_range_char_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeChar" , None , None , [], ([[v_char_ty];[v_char_ty];[v_char_ty]], mkSeqTy v_char_ty)) + let v_range_generic_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeGeneric" , None , None , [vara], ([[varaTy];[varaTy]], mkSeqTy varaTy)) + let v_range_step_generic_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeStepGeneric" , None , None , [vara;varb], ([[varaTy];[varbTy];[varaTy]], mkSeqTy varaTy)) let v_array_length_info = makeIntrinsicValRef(fslib_MFArrayModule_nleref, "length" , None , Some "Length" , [vara], ([[mkArrayType 1 varaTy]], v_int_ty)) let v_array_get_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "GetArray" , None , None , [vara], ([[mkArrayType 1 varaTy]; [v_int_ty]], varaTy)) @@ -835,7 +862,7 @@ type TcGlobals( let v_seq_finally_info = makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref, "EnumerateThenFinally" , None , None , [varb], ([[mkSeqTy varbTy]; [v_unit_ty --> v_unit_ty]], mkSeqTy varbTy)) let v_seq_trywith_info = makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref, "EnumerateTryWith" , None , None , [varb], ([[mkSeqTy varbTy]; [mkNonGenericTy v_exn_tcr --> v_int32_ty]; [mkNonGenericTy v_exn_tcr --> mkSeqTy varbTy]], mkSeqTy varbTy)) let v_seq_of_functions_info = makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref, "EnumerateFromFunctions" , None , None , [vara;varb], ([[v_unit_ty --> varaTy]; [varaTy --> v_bool_ty]; [varaTy --> varbTy]], mkSeqTy varbTy)) - let v_create_event_info = makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref, "CreateEvent" , None , None , [vara;varb], ([[varaTy --> v_unit_ty]; [varaTy --> v_unit_ty]; [(v_obj_ty --> (varbTy --> v_unit_ty)) --> varaTy]], mkIEvent2Ty varaTy varbTy)) + let v_create_event_info = makeIntrinsicValRef(fslib_MFRuntimeHelpers_nleref, "CreateEvent" , None , None , [vara;varb], ([[varaTy --> v_unit_ty]; [varaTy --> v_unit_ty]; [(v_obj_ty_with_null --> (varbTy --> v_unit_ty)) --> varaTy]], mkIEvent2Ty varaTy varbTy)) let v_cgh__useResumableCode_info = makeIntrinsicValRef(fslib_MFStateMachineHelpers_nleref, "__useResumableCode" , None , None , [vara], ([[]], v_bool_ty)) let v_cgh__debugPoint_info = makeIntrinsicValRef(fslib_MFStateMachineHelpers_nleref, "__debugPoint" , None , None , [vara], ([[v_int_ty]; [varaTy]], varaTy)) let v_cgh__resumeAt_info = makeIntrinsicValRef(fslib_MFStateMachineHelpers_nleref, "__resumeAt" , None , None , [vara], ([[v_int_ty]; [varaTy]], varaTy)) @@ -852,7 +879,6 @@ type TcGlobals( let v_lazy_create_info = makeIntrinsicValRef(fslib_MFLazyExtensions_nleref, "Create" , Some "Lazy`1" , None , [vara], ([[v_unit_ty --> varaTy]], mkLazyTy varaTy)) let v_seq_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "seq" , None , Some "CreateSequence" , [vara], ([[mkSeqTy varaTy]], mkSeqTy varaTy)) - let v_refcell_info = makeIntrinsicValRef(fslib_MFCore_nleref, "ref" , Some "FSharpRef`1" , None , [vara], ([[mkRefCellTy varaTy]; []], varaTy)) let v_splice_expr_info = makeIntrinsicValRef(fslib_MFExtraTopLevelOperators_nleref, "op_Splice" , None , None , [vara], ([[mkQuotedExprTy varaTy]], varaTy)) let v_splice_raw_expr_info = makeIntrinsicValRef(fslib_MFExtraTopLevelOperators_nleref, "op_SpliceUntyped" , None , None , [vara], ([[mkRawQuotedExprTy]], varaTy)) let v_new_decimal_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "MakeDecimal" , None , None , [], ([[v_int_ty]; [v_int_ty]; [v_int_ty]; [v_bool_ty]; [v_byte_ty]], v_decimal_ty)) @@ -873,7 +899,6 @@ type TcGlobals( let v_query_source_info = makeIntrinsicValRef(fslib_MFLinq_nleref, "Source" , Some "QueryBuilder" , None , [vara], ([[mkQueryBuilderTy];[mkSeqTy varaTy ]], mkQuerySourceTy varaTy (mkNonGenericTy v_tcref_System_Collections_IEnumerable)) ) let v_query_source_as_enum_info = makeIntrinsicValRef(fslib_MFLinq_nleref, "get_Source" , Some "QuerySource`2" , None , [vara; vare], ([[mkQuerySourceTy varaTy vareTy];[]], mkSeqTy varaTy) ) let v_new_query_source_info = makeIntrinsicValRef(fslib_MFLinq_nleref, ".ctor" , Some "QuerySource`2" , None , [vara; vare], ([[mkSeqTy varaTy]], mkQuerySourceTy varaTy vareTy) ) - let v_query_where_value_info = makeIntrinsicValRef(fslib_MFLinq_nleref, "Where" , Some "QueryBuilder" , None , [vara; vare], ([[mkQueryBuilderTy];[mkQuerySourceTy varaTy vareTy;varaTy --> v_bool_ty]], mkQuerySourceTy varaTy vareTy) ) let v_query_zero_value_info = makeIntrinsicValRef(fslib_MFLinq_nleref, "Zero" , Some "QueryBuilder" , None , [vara; vare], ([[mkQueryBuilderTy];[]], mkQuerySourceTy varaTy vareTy) ) let v_fail_init_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "FailInit" , None , None , [], ([[v_unit_ty]], v_unit_ty)) let v_fail_static_init_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "FailStaticInit" , None , None , [], ([[v_unit_ty]], v_unit_ty)) @@ -957,25 +982,28 @@ type TcGlobals( "Single" , v_float32_tcr |] |> Array.map (fun (nm, tcr) -> let ty = mkNonGenericTy tcr - nm, findSysTyconRef sys nm, (fun _ -> ty)) + nm, findSysTyconRef sys nm, (fun _ nullness -> + match nullness with + | Nullness.Known NullnessInfo.WithoutNull -> ty + | _ -> mkNonGenericTyWithNullness tcr nullness)) let decompileTyconEntries = [| - "FSharpFunc`2" , v_fastFunc_tcr , (fun tinst -> mkFunTy (List.item 0 tinst) (List.item 1 tinst)) - "Tuple`2" , v_ref_tuple2_tcr , decodeTupleTy tupInfoRef - "Tuple`3" , v_ref_tuple3_tcr , decodeTupleTy tupInfoRef - "Tuple`4" , v_ref_tuple4_tcr , decodeTupleTy tupInfoRef - "Tuple`5" , v_ref_tuple5_tcr , decodeTupleTy tupInfoRef - "Tuple`6" , v_ref_tuple6_tcr , decodeTupleTy tupInfoRef - "Tuple`7" , v_ref_tuple7_tcr , decodeTupleTy tupInfoRef - "Tuple`8" , v_ref_tuple8_tcr , decodeTupleTyIfPossible v_ref_tuple8_tcr tupInfoRef - "ValueTuple`2" , v_struct_tuple2_tcr , decodeTupleTy tupInfoStruct - "ValueTuple`3" , v_struct_tuple3_tcr , decodeTupleTy tupInfoStruct - "ValueTuple`4" , v_struct_tuple4_tcr , decodeTupleTy tupInfoStruct - "ValueTuple`5" , v_struct_tuple5_tcr , decodeTupleTy tupInfoStruct - "ValueTuple`6" , v_struct_tuple6_tcr , decodeTupleTy tupInfoStruct - "ValueTuple`7" , v_struct_tuple7_tcr , decodeTupleTy tupInfoStruct - "ValueTuple`8" , v_struct_tuple8_tcr , decodeTupleTyIfPossible v_struct_tuple8_tcr tupInfoStruct |] + "FSharpFunc`2" , v_fastFunc_tcr , (fun tinst -> mkFunTyWithNullness (List.item 0 tinst) (List.item 1 tinst)) + "Tuple`2" , v_ref_tuple2_tcr , decodeTupleTyAndNullness tupInfoRef + "Tuple`3" , v_ref_tuple3_tcr , decodeTupleTyAndNullness tupInfoRef + "Tuple`4" , v_ref_tuple4_tcr , decodeTupleTyAndNullness tupInfoRef + "Tuple`5" , v_ref_tuple5_tcr , decodeTupleTyAndNullness tupInfoRef + "Tuple`6" , v_ref_tuple6_tcr , decodeTupleTyAndNullness tupInfoRef + "Tuple`7" , v_ref_tuple7_tcr , decodeTupleTyAndNullness tupInfoRef + "Tuple`8" , v_ref_tuple8_tcr , decodeTupleTyAndNullnessIfPossible v_ref_tuple8_tcr tupInfoRef + "ValueTuple`2" , v_struct_tuple2_tcr , decodeTupleTyAndNullness tupInfoStruct + "ValueTuple`3" , v_struct_tuple3_tcr , decodeTupleTyAndNullness tupInfoStruct + "ValueTuple`4" , v_struct_tuple4_tcr , decodeTupleTyAndNullness tupInfoStruct + "ValueTuple`5" , v_struct_tuple5_tcr , decodeTupleTyAndNullness tupInfoStruct + "ValueTuple`6" , v_struct_tuple6_tcr , decodeTupleTyAndNullness tupInfoStruct + "ValueTuple`7" , v_struct_tuple7_tcr , decodeTupleTyAndNullness tupInfoStruct + "ValueTuple`8" , v_struct_tuple8_tcr , decodeTupleTyAndNullnessIfPossible v_struct_tuple8_tcr tupInfoStruct |] let betterEntries = Array.append betterTyconEntries decompileTyconEntries @@ -1006,11 +1034,11 @@ type TcGlobals( let t = Dictionary.newWithSize entries.Length for nm, tcref, builder in entries do t.Add(nm, - (fun tcref2 tinst2 -> + (fun tcref2 tinst2 nullness -> if tyconRefEq tcref tcref2 then - builder tinst2 + builder tinst2 nullness else - TType_app (tcref2, tinst2, v_knownWithoutNull))) + TType_app (tcref2, tinst2, nullness))) betterTypeDict1 <- t t | _ -> betterTypeDict1 @@ -1032,32 +1060,32 @@ type TcGlobals( /// For logical purposes equate some F# types with .NET types, e.g. TType_tuple == System.Tuple/ValueTuple. /// Doing this normalization is a fairly performance critical piece of code as it is frequently invoked /// in the process of converting .NET metadata to F# internal compiler data structures (see import.fs). - let decompileTy (tcref: EntityRef) tinst = + let decompileTy (tcref: EntityRef) tinst nullness = if compilingFSharpCore then // No need to decompile when compiling FSharp.Core.dll - TType_app (tcref, tinst, v_knownWithoutNull) + TType_app (tcref, tinst, nullness) else let dict = getDecompileTypeDict() match dict.TryGetValue tcref.Stamp with - | true, builder -> builder tinst - | _ -> TType_app (tcref, tinst, v_knownWithoutNull) + | true, builder -> builder tinst nullness + | _ -> TType_app (tcref, tinst, nullness) /// For cosmetic purposes "improve" some .NET types, e.g. Int32 --> int32. /// Doing this normalization is a fairly performance critical piece of code as it is frequently invoked /// in the process of converting .NET metadata to F# internal compiler data structures (see import.fs). - let improveTy (tcref: EntityRef) tinst = + let improveTy (tcref: EntityRef) tinst nullness = if compilingFSharpCore then let dict = getBetterTypeDict1() match dict.TryGetValue tcref.LogicalName with - | true, builder -> builder tcref tinst - | _ -> TType_app (tcref, tinst, v_knownWithoutNull) + | true, builder -> builder tcref tinst nullness + | _ -> TType_app (tcref, tinst, nullness) else let dict = getBetterTypeDict2() match dict.TryGetValue tcref.Stamp with - | true, builder -> builder tinst - | _ -> TType_app (tcref, tinst, v_knownWithoutNull) + | true, builder -> builder tinst nullness + | _ -> TType_app (tcref, tinst, nullness) - // Adding an unnecessary "let" instead of inlining into a muiti-line pipelined compute-once "member val" that is too complex for @dsyme + // Adding an unnecessary "let" instead of inlining into a multi-line pipelined compute-once "member val" that is too complex for @dsyme let v_attribs_Unsupported = [ tryFindSysAttrib "System.Runtime.CompilerServices.ModuleInitializerAttribute" tryFindSysAttrib "System.Runtime.CompilerServices.CallerArgumentExpressionAttribute" @@ -1067,13 +1095,17 @@ type TcGlobals( tryFindSysAttrib "System.Runtime.CompilerServices.RequiredMemberAttribute" ] |> List.choose (Option.map (fun x -> x.TyconRef)) + static member IsInEmbeddableKnownSet name = isInEmbeddableKnownSet name + override _.ToString() = "" + member _.directoryToResolveRelativePaths = directoryToResolveRelativePaths + member _.ilg = ilg - static member IsInEmbeddableKnownSet name = isInEmbeddableKnownSet name + member _.noDebugAttributes = noDebugAttributes - member _.embeddedTypeDefs = embeddedILTypeDefs.Values |> Seq.toList + member _.tryFindSysTypeCcuHelper: string list -> string -> bool -> FSharp.Compiler.TypedTree.CcuThunk option = tryFindSysTypeCcuHelper member _.tryRemoveEmbeddedILTypeDefs () = [ #if FABLE_COMPILER @@ -1089,7 +1121,12 @@ type TcGlobals( // A table of all intrinsics that the compiler cares about member _.knownIntrinsics = v_knownIntrinsics - // empty flags + member _.checkNullness = checkNullness + + member _.langFeatureNullness = v_langFeatureNullness + + member _.knownWithNull = v_knownWithNull + member _.knownWithoutNull = v_knownWithoutNull // A table of known modules in FSharp.Core. Not all modules are necessarily listed, but the more we list the @@ -1104,12 +1141,12 @@ type TcGlobals( member _.emitDebugInfoInQuotations = emitDebugInfoInQuotations - member _.directoryToResolveRelativePaths = directoryToResolveRelativePaths - member _.pathMap = pathMap member _.langVersion = langVersion + member _.realsig = realsig + member _.unionCaseRefEq x y = primUnionCaseRefEq compilingFSharpCore fslibCcu x y member _.valRefEq x y = primValRefEq compilingFSharpCore fslibCcu x y @@ -1124,10 +1161,6 @@ type TcGlobals( member _.list_tcr_canon = v_list_tcr_canon - member val set_tcr_canon = mk_MFCollections_tcref fslibCcu "Set`1" - - member val map_tcr_canon = mk_MFCollections_tcref fslibCcu "Map`2" - member _.lazy_tcr_canon = lazy_tcr member val refcell_tcr_nice = v_refcell_tcr_nice @@ -1152,10 +1185,6 @@ type TcGlobals( member _.nativeint_tcr = v_nativeint_tcr - member _.unativeint_tcr = v_unativeint_tcr - - member _.int_tcr = v_int_tcr - member _.int32_tcr = v_int32_tcr member _.int16_tcr = v_int16_tcr @@ -1182,8 +1211,6 @@ type TcGlobals( member _.unit_tcr_canon = v_unit_tcr_canon - member _.unit_tcr_nice = v_unit_tcr_nice - member _.exn_tcr = v_exn_tcr member _.char_tcr = v_char_tcr @@ -1234,7 +1261,6 @@ type TcGlobals( member _.MatchFailureException_tcr = v_mfe_tcr - member _.tcref_IQueryable = v_tcref_IQueryable member _.tcref_IObservable = v_tcref_IObservable @@ -1320,14 +1346,16 @@ type TcGlobals( member _.bool_ty = v_bool_ty member _.int_ty = v_int_ty member _.string_ty = v_string_ty + member _.string_ty_ambivalent = v_string_ty_ambivalent member _.system_IFormattable_tcref = v_IFormattable_tcref member _.system_FormattableString_tcref = v_FormattableString_tcref - member _.system_FormattableStringFactory_tcref = v_FormattableStringFactory_tcref member _.system_IFormattable_ty = v_IFormattable_ty member _.system_FormattableString_ty = v_FormattableString_ty member _.system_FormattableStringFactory_ty = v_FormattableStringFactory_ty member _.unit_ty = v_unit_ty - member _.obj_ty = v_obj_ty + member _.obj_ty_noNulls = v_obj_ty_without_null + member _.obj_ty_ambivalent = v_obj_ty_ambivalent + member _.obj_ty_withNulls = v_obj_ty_with_null member _.char_ty = v_char_ty member _.decimal_ty = v_decimal_ty @@ -1346,10 +1374,7 @@ type TcGlobals( member val system_Delegate_ty = mkSysNonGenericTy sys "Delegate" member val system_MulticastDelegate_ty = mkSysNonGenericTy sys "MulticastDelegate" member val system_Enum_ty = mkSysNonGenericTy sys "Enum" - member val system_Exception_ty = mkSysNonGenericTy sys "Exception" - member val system_String_typ = mkSysNonGenericTy sys "String" member val system_String_tcref = findSysTyconRef sys "String" - member val system_Int32_ty = mkSysNonGenericTy sys "Int32" member _.system_Type_ty = v_system_Type_ty member val system_TypedReference_tcref = tryFindSysTyconRef sys "TypedReference" member val system_ArgIterator_tcref = tryFindSysTyconRef sys "ArgIterator" @@ -1370,7 +1395,6 @@ type TcGlobals( member val system_Single_tcref = findSysTyconRef sys "Single" member val system_Double_tcref = findSysTyconRef sys "Double" member val system_RuntimeTypeHandle_ty = mkSysNonGenericTy sys "RuntimeTypeHandle" - member _.system_RuntimeMethodHandle_ty = v_system_RuntimeMethodHandle_ty member val system_MarshalByRefObject_tcref = tryFindSysTyconRef sys "MarshalByRefObject" member val system_MarshalByRefObject_ty = tryMkSysNonGenericTy sys "MarshalByRefObject" @@ -1378,14 +1402,11 @@ type TcGlobals( member val system_ExceptionDispatchInfo_ty = tryMkSysNonGenericTy ["System"; "Runtime"; "ExceptionServices"] "ExceptionDispatchInfo" - member _.system_Reflection_MethodInfo_ty = v_system_Reflection_MethodInfo_ty member _.mk_IAsyncStateMachine_ty = mkSysNonGenericTy sysCompilerServices "IAsyncStateMachine" - member val system_Array_tcref = v_Array_tcref member val system_Object_tcref = findSysTyconRef sys "Object" member val system_Value_tcref = findSysTyconRef sys "ValueType" member val system_Void_tcref = findSysTyconRef sys "Void" - member val system_IndexOutOfRangeException_tcref = findSysTyconRef sys "IndexOutOfRangeException" member val system_Nullable_tcref = v_nullable_tcr member val system_GenericIComparable_tcref = findSysTyconRef sys "IComparable`1" member val system_GenericIEquatable_tcref = findSysTyconRef sys "IEquatable`1" @@ -1403,7 +1424,6 @@ type TcGlobals( member val tcref_System_Collections_IEqualityComparer = findSysTyconRef sysCollections "IEqualityComparer" member val tcref_System_Collections_Generic_IEqualityComparer = findSysTyconRef sysGenerics "IEqualityComparer`1" member val tcref_System_Collections_Generic_Dictionary = findSysTyconRef sysGenerics "Dictionary`2" - member val tcref_System_Collections_Generic_IDictionary = findSysTyconRef sysGenerics "IDictionary`2" member val tcref_System_IComparable = findSysTyconRef sys "IComparable" member val tcref_System_IStructuralComparable = findSysTyconRef sysCollections "IStructuralComparable" @@ -1412,7 +1432,6 @@ type TcGlobals( member val tcref_LanguagePrimitives = mk_MFCore_tcref fslibCcu "LanguagePrimitives" - member val tcref_System_Collections_Generic_List = findSysTyconRef sysGenerics "List`1" member val tcref_System_Collections_Generic_IList = findSysTyconRef sysGenerics "IList`1" member val tcref_System_Collections_Generic_IReadOnlyList = findSysTyconRef sysGenerics "IReadOnlyList`1" member val tcref_System_Collections_Generic_ICollection = findSysTyconRef sysGenerics "ICollection`1" @@ -1427,7 +1446,6 @@ type TcGlobals( // Review: Does this need to be an option type? member val System_Runtime_CompilerServices_RuntimeFeature_ty = tryFindSysTyconRef sysCompilerServices "RuntimeFeature" |> Option.map mkNonGenericTy - member val iltyp_TypedReference = tryFindSysILTypeRef "System.TypedReference" |> Option.map mkILNonGenericValueTy member val iltyp_StreamingContext = tryFindSysILTypeRef tname_StreamingContext |> Option.map mkILNonGenericValueTy member val iltyp_SerializationInfo = tryFindSysILTypeRef tname_SerializationInfo |> Option.map mkILNonGenericBoxedTy member val iltyp_Missing = findSysILTypeRef tname_Missing |> mkILNonGenericBoxedTy @@ -1452,6 +1470,11 @@ type TcGlobals( member val attrib_IsReadOnlyAttribute = findOrEmbedSysPublicType "System.Runtime.CompilerServices.IsReadOnlyAttribute" member val attrib_IsUnmanagedAttribute = findOrEmbedSysPublicType "System.Runtime.CompilerServices.IsUnmanagedAttribute" member val attrib_DynamicDependencyAttribute = findOrEmbedSysPublicType "System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute" + member val attrib_NullableAttribute_opt = tryFindSysAttrib "System.Runtime.CompilerServices.NullableAttribute" + member val attrib_NullableContextAttribute_opt = tryFindSysAttrib "System.Runtime.CompilerServices.NullableContextAttribute" + member val attrib_NullableAttribute = findOrEmbedSysPublicType "System.Runtime.CompilerServices.NullableAttribute" + member val attrib_NullableContextAttribute = findOrEmbedSysPublicType "System.Runtime.CompilerServices.NullableContextAttribute" + member val attrib_MemberNotNullWhenAttribute = findOrEmbedSysPublicType "System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute" member val enum_DynamicallyAccessedMemberTypes = findOrEmbedSysPublicType "System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes" member val attrib_SystemObsolete = findSysAttrib "System.ObsoleteAttribute" @@ -1467,7 +1490,6 @@ type TcGlobals( member val attrib_OptionalAttribute = tryFindSysAttrib "System.Runtime.InteropServices.OptionalAttribute" member val attrib_DefaultParameterValueAttribute = tryFindSysAttrib "System.Runtime.InteropServices.DefaultParameterValueAttribute" member val attrib_ThreadStaticAttribute = tryFindSysAttrib "System.ThreadStaticAttribute" - member val attrib_SpecialNameAttribute = tryFindSysAttrib "System.Runtime.CompilerServices.SpecialNameAttribute" member val attrib_VolatileFieldAttribute = mk_MFCore_attrib "VolatileFieldAttribute" member val attrib_NoEagerConstraintApplicationAttribute = mk_MFCompilerServices_attrib "NoEagerConstraintApplicationAttribute" member val attrib_ContextStaticAttribute = tryFindSysAttrib "System.ContextStaticAttribute" @@ -1481,8 +1503,8 @@ type TcGlobals( member val attrib_CallerLineNumberAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerLineNumberAttribute" member val attrib_CallerFilePathAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerFilePathAttribute" member val attrib_CallerMemberNameAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerMemberNameAttribute" - member val attrib_ReferenceAssemblyAttribute = findSysAttrib "System.Runtime.CompilerServices.ReferenceAssemblyAttribute" member val attrib_SkipLocalsInitAttribute = findSysAttrib "System.Runtime.CompilerServices.SkipLocalsInitAttribute" + member val attrib_DecimalConstantAttribute = findSysAttrib "System.Runtime.CompilerServices.DecimalConstantAttribute" member val attribs_Unsupported = v_attribs_Unsupported member val attrib_ProjectionParameterAttribute = mk_MFCore_attrib "ProjectionParameterAttribute" @@ -1531,6 +1553,7 @@ type TcGlobals( member val attrib_MeasureableAttribute = mk_MFCore_attrib "MeasureAnnotatedAbbreviationAttribute" member val attrib_NoDynamicInvocationAttribute = mk_MFCore_attrib "NoDynamicInvocationAttribute" member val attrib_NoCompilerInliningAttribute = mk_MFCore_attrib "NoCompilerInliningAttribute" + member val attrib_WarnOnWithoutNullArgumentAttribute = mk_MFCore_attrib "WarnOnWithoutNullArgumentAttribute" member val attrib_SecurityAttribute = tryFindSysAttrib "System.Security.Permissions.SecurityAttribute" member val attrib_SecurityCriticalAttribute = findSysAttrib "System.Security.SecurityCriticalAttribute" member val attrib_SecuritySafeCriticalAttribute = findSysAttrib "System.Security.SecuritySafeCriticalAttribute" @@ -1538,7 +1561,6 @@ type TcGlobals( member val attrib_CompilerFeatureRequiredAttribute = findSysAttrib "System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute" member val attrib_SetsRequiredMembersAttribute = findSysAttrib "System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute" member val attrib_RequiredMemberAttribute = findSysAttrib "System.Runtime.CompilerServices.RequiredMemberAttribute" - member val attrib_TailCallAttribute = mk_MFCore_attrib "TailCallAttribute" member g.improveType tcref tinst = improveTy tcref tinst @@ -1547,7 +1569,6 @@ type TcGlobals( member _.new_decimal_info = v_new_decimal_info member _.seq_info = v_seq_info member val seq_vref = (ValRefForIntrinsic v_seq_info) - member val fsharpref_vref = (ValRefForIntrinsic v_refcell_info) member val and_vref = (ValRefForIntrinsic v_and_info) member val and2_vref = (ValRefForIntrinsic v_and2_info) member val addrof_vref = (ValRefForIntrinsic v_addrof_info) @@ -1605,9 +1626,7 @@ type TcGlobals( member _.unchecked_multiply_info = v_unchecked_multiply_info member _.unchecked_division_info = v_unchecked_division_info member _.unchecked_modulus_info = v_unchecked_modulus_info - member _.unchecked_unary_plus_info = v_unchecked_unary_plus_info member _.unchecked_unary_minus_info = v_unchecked_unary_minus_info - member _.unchecked_unary_not_info = v_unchecked_unary_not_info member _.unchecked_defaultof_info = v_unchecked_defaultof_info member _.checked_addition_info = v_checked_addition_info @@ -1631,7 +1650,6 @@ type TcGlobals( member _.sbyte_operator_info = v_sbyte_operator_info member _.int16_operator_info = v_int16_operator_info member _.uint16_operator_info = v_uint16_operator_info - member _.int_operator_info = v_int_operator_info member _.int32_operator_info = v_int32_operator_info member _.uint32_operator_info = v_uint32_operator_info member _.int64_operator_info = v_int64_operator_info @@ -1673,13 +1691,7 @@ type TcGlobals( member _.box_info = v_box_info member _.isnull_info = v_isnull_info member _.raise_info = v_raise_info - member _.failwith_info = v_failwith_info - member _.invalid_arg_info = v_invalid_arg_info - member _.null_arg_info = v_null_arg_info - member _.invalid_op_info = v_invalid_op_info - member _.failwithf_info = v_failwithf_info member _.reraise_info = v_reraise_info - member _.methodhandleof_info = v_methodhandleof_info member _.typeof_info = v_typeof_info member _.typedefof_info = v_typedefof_info @@ -1694,6 +1706,18 @@ type TcGlobals( member val range_op_vref = ValRefForIntrinsic v_range_op_info member val range_step_op_vref = ValRefForIntrinsic v_range_step_op_info member val range_int32_op_vref = ValRefForIntrinsic v_range_int32_op_info + member val range_int64_op_vref = ValRefForIntrinsic v_range_int64_op_info + member val range_uint64_op_vref = ValRefForIntrinsic v_range_uint64_op_info + member val range_uint32_op_vref = ValRefForIntrinsic v_range_uint32_op_info + member val range_nativeint_op_vref = ValRefForIntrinsic v_range_nativeint_op_info + member val range_unativeint_op_vref = ValRefForIntrinsic v_range_unativeint_op_info + member val range_int16_op_vref = ValRefForIntrinsic v_range_int16_op_info + member val range_uint16_op_vref = ValRefForIntrinsic v_range_uint16_op_info + member val range_sbyte_op_vref = ValRefForIntrinsic v_range_sbyte_op_info + member val range_byte_op_vref = ValRefForIntrinsic v_range_byte_op_info + member val range_char_op_vref = ValRefForIntrinsic v_range_char_op_info + member val range_generic_op_vref = ValRefForIntrinsic v_range_generic_op_info + member val range_step_generic_op_vref = ValRefForIntrinsic v_range_step_generic_op_info member val array_get_vref = ValRefForIntrinsic v_array_get_info member val array2D_get_vref = ValRefForIntrinsic v_array2D_get_info member val array3D_get_vref = ValRefForIntrinsic v_array3D_get_info @@ -1706,7 +1730,6 @@ type TcGlobals( member val seq_append_vref = ValRefForIntrinsic v_seq_append_info member val seq_generated_vref = ValRefForIntrinsic v_seq_generated_info member val seq_finally_vref = ValRefForIntrinsic v_seq_finally_info - member val seq_of_functions_vref = ValRefForIntrinsic v_seq_of_functions_info member val seq_map_vref = ValRefForIntrinsic v_seq_map_info member val seq_empty_vref = ValRefForIntrinsic v_seq_empty_info member val new_format_vref = ValRefForIntrinsic v_new_format_info @@ -1723,7 +1746,6 @@ type TcGlobals( member val query_yield_vref = ValRefForIntrinsic v_query_yield_value_info member val query_yield_from_vref = ValRefForIntrinsic v_query_yield_from_value_info member val query_select_vref = ValRefForIntrinsic v_query_select_value_info - member val query_where_vref = ValRefForIntrinsic v_query_where_value_info member val query_zero_vref = ValRefForIntrinsic v_query_zero_value_info member val seq_to_list_vref = ValRefForIntrinsic v_seq_to_list_info member val seq_to_array_vref = ValRefForIntrinsic v_seq_to_array_info @@ -1749,7 +1771,6 @@ type TcGlobals( member _.getstring_info = v_getstring_info member _.unbox_fast_info = v_unbox_fast_info member _.istype_info = v_istype_info - member _.istype_fast_info = v_istype_fast_info member _.lazy_force_info = v_lazy_force_info member _.lazy_create_info = v_lazy_create_info member _.create_instance_info = v_create_instance_info @@ -1818,6 +1839,8 @@ type TcGlobals( /// Are we assuming all code gen is for F# interactive, with no static linking member _.isInteractive=isInteractive + member val compilationMode = compilationMode + /// Indicates if we are generating witness arguments for SRTP constraints. Only done if the FSharp.Core /// supports witness arguments. member g.generateWitnesses = @@ -1827,6 +1850,10 @@ type TcGlobals( /// Indicates if we can use System.Array.Empty when emitting IL for empty array literals member val isArrayEmptyAvailable = v_Array_tcref.ILTyconRawMetadata.Methods.FindByName "Empty" |> List.isEmpty |> not + member g.isSpliceOperator v = + primValRefEq g.compilingFSharpCore g.fslibCcu v g.splice_expr_vref || + primValRefEq g.compilingFSharpCore g.fslibCcu v g.splice_raw_expr_vref + member _.FindSysTyconRef path nm = findSysTyconRef path nm member _.TryFindSysTyconRef path nm = tryFindSysTyconRef path nm @@ -1859,11 +1886,11 @@ type TcGlobals( member _.DebuggerBrowsableNeverAttribute = debuggerBrowsableNeverAttribute - member _.mkDebuggableAttributeV2(jitTracking, jitOptimizerDisabled, enableEnC) = + member _.mkDebuggableAttributeV2(jitTracking, jitOptimizerDisabled) = let debuggingMode = + 0x3 (* Default ||| IgnoreSymbolStoreSequencePoints *) ||| (if jitTracking then 1 else 0) ||| - (if jitOptimizerDisabled then 256 else 0) ||| - (if enableEnC then 4 else 0) + (if jitOptimizerDisabled then 256 else 0) let tref_DebuggableAttribute_DebuggingModes = mkILTyRefInTyRef (tref_DebuggableAttribute, tname_DebuggableAttribute_DebuggingModes) mkILCustomAttribute (tref_DebuggableAttribute, [mkILNonGenericValueTy tref_DebuggableAttribute_DebuggingModes], @@ -1876,16 +1903,20 @@ type TcGlobals( member _.DebuggerNonUserCodeAttribute = debuggerNonUserCodeAttribute + member _.HasTailCallAttrib (attribs: Attribs) = + attribs + |> List.exists (fun a -> a.TyconRef.CompiledRepresentationForNamedType.FullName = "Microsoft.FSharp.Core.TailCallAttribute") + member _.MakeInternalsVisibleToAttribute(simpleAssemName) = mkILCustomAttribute (tref_InternalsVisibleToAttribute, [ilg.typ_String], [ILAttribElem.String (Some simpleAssemName)], []) - /// Find an FSharp.Core LaguagePrimitives dynamic function that corresponds to a trait witness, e.g. + /// Find an FSharp.Core LanguagePrimitives dynamic function that corresponds to a trait witness, e.g. /// AdditionDynamic for op_Addition. Also work out the type instantiation of the dynamic function. member _.MakeBuiltInWitnessInfo (t: TraitConstraintInfo) = let memberName = let nm = t.MemberLogicalName let coreName = - if nm.StartsWith "op_" then nm[3..] + if nm.StartsWithOrdinal "op_" then nm[3..] elif nm = "get_Zero" then "GenericZero" elif nm = "get_One" then "GenericOne" else nm diff --git a/src/fcs-fable/src/Compiler/TypedTree/TcGlobals.fsi b/src/fcs-fable/src/Compiler/TypedTree/TcGlobals.fsi new file mode 100644 index 0000000000..73d26a64b6 --- /dev/null +++ b/src/fcs-fable/src/Compiler/TypedTree/TcGlobals.fsi @@ -0,0 +1,1389 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +module internal FSharp.Compiler.TcGlobals + +/// Signals how checker/compiler was invoked - from FSC task/process (a one-off compilation), from tooling or from interactive session. +/// This is used to determine if we want to use certain features in the pipeline, for example, type subsumption cache is only used in one-off compilation now. +[] +type CompilationMode = + | Unset // Default: not set + | OneOff // Running the FSC task/process + | Service // Running from service + | Interactive // Running from interactive session + +val internal DummyFileNameForRangesWithoutASpecificLocation: string + +/// Represents an intrinsic value from FSharp.Core known to the compiler +[] +type internal IntrinsicValRef = + | IntrinsicValRef of + FSharp.Compiler.TypedTree.NonLocalEntityRef * + string * + bool * + FSharp.Compiler.TypedTree.TType * + FSharp.Compiler.TypedTree.ValLinkageFullKey + + /// For debugging + override ToString: unit -> string + + /// For debugging + [ (0))>] + member DebugText: string + + member Name: string + +val internal ValRefForIntrinsic: IntrinsicValRef -> FSharp.Compiler.TypedTree.ValRef + +[] +module internal FSharpLib = + + val Root: string + + val RootPath: string list + + val Core: string + + val CorePath: string list + + val CoreOperatorsCheckedName: string + + val ControlName: string + + val LinqName: string + + val CollectionsName: string + + val LanguagePrimitivesName: string + + val CompilerServicesName: string + + val LinqRuntimeHelpersName: string + + val ExtraTopLevelOperatorsName: string + + val NativeInteropName: string + + val QuotationsName: string + + val ControlPath: string list + + val LinqPath: string list + + val CollectionsPath: string list + + val NativeInteropPath: string array + + val CompilerServicesPath: string array + + val LinqRuntimeHelpersPath: string array + + val QuotationsPath: string array + + val RootPathArray: string array + + val CorePathArray: string array + + val LinqPathArray: string array + + val ControlPathArray: string array + + val CollectionsPathArray: string array + +[] +type internal BuiltinAttribInfo = + | AttribInfo of FSharp.Compiler.AbstractIL.IL.ILTypeRef * FSharp.Compiler.TypedTree.TyconRef + + /// For debugging + override ToString: unit -> string + + /// For debugging + [ (0))>] + member DebugText: string + + member TyconRef: FSharp.Compiler.TypedTree.TyconRef + + member TypeRef: FSharp.Compiler.AbstractIL.IL.ILTypeRef + +[] +val internal tname_InternalsVisibleToAttribute: string = "System.Runtime.CompilerServices.InternalsVisibleToAttribute" + +[] +val internal tname_DebuggerHiddenAttribute: string = "System.Diagnostics.DebuggerHiddenAttribute" + +[] +val internal tname_DebuggerStepThroughAttribute: string = "System.Diagnostics.DebuggerStepThroughAttribute" + +[] +val internal tname_StringBuilder: string = "System.Text.StringBuilder" + +[] +val internal tname_FormattableString: string = "System.FormattableString" + +[] +val internal tname_SecurityPermissionAttribute: string = "System.Security.Permissions.SecurityPermissionAttribute" + +[] +val internal tname_Delegate: string = "System.Delegate" + +[] +val internal tname_Enum: string = "System.Enum" + +[] +val internal tname_FlagsAttribute: string = "System.FlagsAttribute" + +[] +val internal tname_Array: string = "System.Array" + +[] +val internal tname_RuntimeArgumentHandle: string = "System.RuntimeArgumentHandle" + +[] +val internal tname_IsByRefLikeAttribute: string = "System.Runtime.CompilerServices.IsByRefLikeAttribute" + +type internal TcGlobals = + + new: + compilingFSharpCore: bool * + ilg: FSharp.Compiler.AbstractIL.IL.ILGlobals * + fslibCcu: FSharp.Compiler.TypedTree.CcuThunk * + directoryToResolveRelativePaths: string * + mlCompatibility: bool * + isInteractive: bool * + checkNullness: bool * + useReflectionFreeCodeGen: bool * + tryFindSysTypeCcuHelper: (string list -> string -> bool -> FSharp.Compiler.TypedTree.CcuThunk option) * + emitDebugInfoInQuotations: bool * + noDebugAttributes: bool * + pathMap: Internal.Utilities.PathMap * + langVersion: FSharp.Compiler.Features.LanguageVersion * + realsig: bool * + compilationMode: CompilationMode -> + TcGlobals + + static member IsInEmbeddableKnownSet: name: string -> bool + + member directoryToResolveRelativePaths: string + + member noDebugAttributes: bool + + member tryFindSysTypeCcuHelper: (string list -> string -> bool -> FSharp.Compiler.TypedTree.CcuThunk option) with get + + member AddFieldGeneratedAttributes: + mdef: FSharp.Compiler.AbstractIL.IL.ILFieldDef -> FSharp.Compiler.AbstractIL.IL.ILFieldDef + + member AddFieldNeverAttributes: + mdef: FSharp.Compiler.AbstractIL.IL.ILFieldDef -> FSharp.Compiler.AbstractIL.IL.ILFieldDef + + member AddGeneratedAttributes: + attrs: FSharp.Compiler.AbstractIL.IL.ILAttributes -> FSharp.Compiler.AbstractIL.IL.ILAttributes + + member AddMethodGeneratedAttributes: + mdef: FSharp.Compiler.AbstractIL.IL.ILMethodDef -> FSharp.Compiler.AbstractIL.IL.ILMethodDef + + member AddPropertyGeneratedAttributes: + mdef: FSharp.Compiler.AbstractIL.IL.ILPropertyDef -> FSharp.Compiler.AbstractIL.IL.ILPropertyDef + + member AddPropertyNeverAttributes: + mdef: FSharp.Compiler.AbstractIL.IL.ILPropertyDef -> FSharp.Compiler.AbstractIL.IL.ILPropertyDef + + member AddValGeneratedAttributes: v: FSharp.Compiler.TypedTree.Val -> (FSharp.Compiler.Text.range -> unit) + + member FindSysAttrib: nm: string -> BuiltinAttribInfo + + member FindSysILTypeRef: nm: string -> FSharp.Compiler.AbstractIL.IL.ILTypeRef + + member isSpliceOperator: FSharp.Compiler.TypedTree.ValRef -> bool + + member FindSysTyconRef: path: string list -> nm: string -> FSharp.Compiler.TypedTree.EntityRef + + member HasTailCallAttrib: attribs: FSharp.Compiler.TypedTree.Attribs -> bool + + /// Find an FSharp.Core LanguagePrimitives dynamic function that corresponds to a trait witness, e.g. + /// AdditionDynamic for op_Addition. Also work out the type instantiation of the dynamic function. + member MakeBuiltInWitnessInfo: + t: FSharp.Compiler.TypedTree.TraitConstraintInfo -> IntrinsicValRef * FSharp.Compiler.TypedTree.TType list + + member MakeInternalsVisibleToAttribute: simpleAssemName: string -> FSharp.Compiler.AbstractIL.IL.ILAttribute + + member MkDebuggerTypeProxyAttribute: + ty: FSharp.Compiler.AbstractIL.IL.ILType -> FSharp.Compiler.AbstractIL.IL.ILAttribute + + member TryEmbedILType: + tref: FSharp.Compiler.AbstractIL.IL.ILTypeRef * + mkEmbeddableType: (unit -> FSharp.Compiler.AbstractIL.IL.ILTypeDef) -> + unit + + member TryFindSysAttrib: nm: string -> BuiltinAttribInfo option + + member TryFindSysILTypeRef: nm: string -> FSharp.Compiler.AbstractIL.IL.ILTypeRef option + + member TryFindSysTyconRef: path: string list -> nm: string -> FSharp.Compiler.TypedTree.EntityRef option + + /// Find an FSharp.Core operator that corresponds to a trait witness + member TryMakeOperatorAsBuiltInWitnessInfo: + isStringTy: (TcGlobals -> FSharp.Compiler.TypedTree.TType -> bool) -> + isArrayTy: (TcGlobals -> FSharp.Compiler.TypedTree.TType -> bool) -> + t: FSharp.Compiler.TypedTree.TraitConstraintInfo -> + argExprs: 'a list -> + (IntrinsicValRef * FSharp.Compiler.TypedTree.TType list * 'a list) option + + member decompileType: + tcref: FSharp.Compiler.TypedTree.EntityRef -> + tinst: FSharp.Compiler.TypedTree.TypeInst -> + (FSharp.Compiler.TypedTree.Nullness -> FSharp.Compiler.TypedTree.TType) + + member improveType: + tcref: FSharp.Compiler.TypedTree.EntityRef -> + tinst: FSharp.Compiler.TypedTree.TType list -> + (FSharp.Compiler.TypedTree.Nullness -> FSharp.Compiler.TypedTree.TType) + + /// Memoization table to help minimize the number of ILSourceDocument objects we create + member memoize_file: x: int -> FSharp.Compiler.AbstractIL.IL.ILSourceDocument + + member mkDebuggableAttributeV2: + jitTracking: bool * jitOptimizerDisabled: bool -> FSharp.Compiler.AbstractIL.IL.ILAttribute + + member mkDebuggerDisplayAttribute: s: string -> FSharp.Compiler.AbstractIL.IL.ILAttribute + + member mk_ArrayCollector_ty: seqElemTy: FSharp.Compiler.TypedTree.TType -> FSharp.Compiler.TypedTree.TType + + member mk_GeneratedSequenceBase_ty: seqElemTy: FSharp.Compiler.TypedTree.TType -> FSharp.Compiler.TypedTree.TType + + member mk_IResumableStateMachine_ty: dataTy: FSharp.Compiler.TypedTree.TType -> FSharp.Compiler.TypedTree.TType + + member mk_ListCollector_ty: seqElemTy: FSharp.Compiler.TypedTree.TType -> FSharp.Compiler.TypedTree.TType + + member mk_ResumableStateMachine_ty: dataTy: FSharp.Compiler.TypedTree.TType -> FSharp.Compiler.TypedTree.TType + + member tryRemoveEmbeddedILTypeDefs: unit -> FSharp.Compiler.AbstractIL.IL.ILTypeDef list + + member unionCaseRefEq: + x: FSharp.Compiler.TypedTree.UnionCaseRef -> y: FSharp.Compiler.TypedTree.UnionCaseRef -> bool + + member valRefEq: x: FSharp.Compiler.TypedTree.ValRef -> y: FSharp.Compiler.TypedTree.ValRef -> bool + + member CompilerGeneratedAttribute: FSharp.Compiler.AbstractIL.IL.ILAttribute + + member CompilerGlobalState: FSharp.Compiler.CompilerGlobalState.CompilerGlobalState option + + member DebuggerBrowsableNeverAttribute: FSharp.Compiler.AbstractIL.IL.ILAttribute + + member DebuggerNonUserCodeAttribute: FSharp.Compiler.AbstractIL.IL.ILAttribute + + member IComparer_ty: FSharp.Compiler.TypedTree.TType + + member IEqualityComparer_ty: FSharp.Compiler.TypedTree.TType + + member ListCollector_tcr: FSharp.Compiler.TypedTree.EntityRef + + member MatchFailureException_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ResumableCode_tcr: FSharp.Compiler.TypedTree.EntityRef + + member System_Runtime_CompilerServices_RuntimeFeature_ty: FSharp.Compiler.TypedTree.TType option + + member addrof2_vref: FSharp.Compiler.TypedTree.ValRef + + member addrof_vref: FSharp.Compiler.TypedTree.ValRef + + member and2_vref: FSharp.Compiler.TypedTree.ValRef + + member and_vref: FSharp.Compiler.TypedTree.ValRef + + member array2D_get_info: IntrinsicValRef + + member array2D_get_vref: FSharp.Compiler.TypedTree.ValRef + + member array2D_set_info: IntrinsicValRef + + member array3D_get_info: IntrinsicValRef + + member array3D_get_vref: FSharp.Compiler.TypedTree.ValRef + + member array3D_set_info: IntrinsicValRef + + member array4D_get_info: IntrinsicValRef + + member array4D_get_vref: FSharp.Compiler.TypedTree.ValRef + + member array4D_set_info: IntrinsicValRef + + member array_get_info: IntrinsicValRef + + member array_get_vref: FSharp.Compiler.TypedTree.ValRef + + member array_length_info: IntrinsicValRef + + member array_set_info: IntrinsicValRef + + member array_tcr_nice: FSharp.Compiler.TypedTree.EntityRef + + member attrib_AbstractClassAttribute: BuiltinAttribInfo + + member attrib_AllowNullLiteralAttribute: BuiltinAttribInfo + + member attrib_AttributeUsageAttribute: BuiltinAttribInfo + + member attrib_AutoOpenAttribute: BuiltinAttribInfo + + member attrib_AutoSerializableAttribute: BuiltinAttribInfo + + member attrib_CLIEventAttribute: BuiltinAttribInfo + + member attrib_CLIMutableAttribute: BuiltinAttribInfo + + member attrib_CallerFilePathAttribute: BuiltinAttribInfo + + member attrib_CallerLineNumberAttribute: BuiltinAttribInfo + + member attrib_CallerMemberNameAttribute: BuiltinAttribInfo + + member attrib_ClassAttribute: BuiltinAttribInfo + + member attrib_ComImportAttribute: BuiltinAttribInfo option + + member attrib_ComVisibleAttribute: BuiltinAttribInfo + + member attrib_ComparisonConditionalOnAttribute: BuiltinAttribInfo + + member attrib_CompilationArgumentCountsAttribute: BuiltinAttribInfo + + member attrib_CompilationMappingAttribute: BuiltinAttribInfo + + member attrib_CompilationRepresentationAttribute: BuiltinAttribInfo + + member attrib_CompiledNameAttribute: BuiltinAttribInfo + + member attrib_CompilerFeatureRequiredAttribute: BuiltinAttribInfo + + member attrib_CompilerMessageAttribute: BuiltinAttribInfo + + member attrib_ComponentModelEditorBrowsableAttribute: BuiltinAttribInfo + + member attrib_ConditionalAttribute: BuiltinAttribInfo + + member attrib_ContextStaticAttribute: BuiltinAttribInfo option + + member attrib_CustomComparisonAttribute: BuiltinAttribInfo + + member attrib_CustomEqualityAttribute: BuiltinAttribInfo + + member attrib_CustomOperationAttribute: BuiltinAttribInfo + + member attrib_DebuggerDisplayAttribute: BuiltinAttribInfo + + member attrib_DebuggerTypeProxyAttribute: BuiltinAttribInfo + + member attrib_DefaultAugmentationAttribute: BuiltinAttribInfo + + member attrib_DefaultMemberAttribute: BuiltinAttribInfo + + member attrib_DefaultParameterValueAttribute: BuiltinAttribInfo option + + member attrib_DefaultValueAttribute: BuiltinAttribInfo + + member attrib_DllImportAttribute: BuiltinAttribInfo option + + member attrib_DynamicDependencyAttribute: BuiltinAttribInfo + + member attrib_EntryPointAttribute: BuiltinAttribInfo + + member attrib_EqualityConditionalOnAttribute: BuiltinAttribInfo + + member attrib_ExperimentalAttribute: BuiltinAttribInfo + + member attrib_ExtensionAttribute: BuiltinAttribInfo + + member attrib_FieldOffsetAttribute: BuiltinAttribInfo + + member attrib_FlagsAttribute: BuiltinAttribInfo + + member attrib_GeneralizableValueAttribute: BuiltinAttribInfo + + member attrib_IDispatchConstantAttribute: BuiltinAttribInfo option + + member attrib_IUnknownConstantAttribute: BuiltinAttribInfo option + + member attrib_InAttribute: BuiltinAttribInfo + + member attrib_InlineIfLambdaAttribute: BuiltinAttribInfo + + member attrib_InterfaceAttribute: BuiltinAttribInfo + + member attrib_InternalsVisibleToAttribute: BuiltinAttribInfo + + member attrib_IsReadOnlyAttribute: BuiltinAttribInfo + + member attrib_IsUnmanagedAttribute: BuiltinAttribInfo + + member attrib_LiteralAttribute: BuiltinAttribInfo + + member attrib_MarshalAsAttribute: BuiltinAttribInfo option + + member attrib_MeasureAttribute: BuiltinAttribInfo + + member attrib_MeasureableAttribute: BuiltinAttribInfo + + member attrib_MemberNotNullWhenAttribute: BuiltinAttribInfo + + member attrib_MethodImplAttribute: BuiltinAttribInfo + + member attrib_NoComparisonAttribute: BuiltinAttribInfo + + member attrib_NoCompilerInliningAttribute: BuiltinAttribInfo + + member attrib_NoDynamicInvocationAttribute: BuiltinAttribInfo + + member attrib_NoEagerConstraintApplicationAttribute: BuiltinAttribInfo + + member attrib_NoEqualityAttribute: BuiltinAttribInfo + + member attrib_NonSerializedAttribute: BuiltinAttribInfo option + + member attrib_NullableAttribute: BuiltinAttribInfo + + member attrib_NullableAttribute_opt: BuiltinAttribInfo option + + member attrib_NullableContextAttribute: BuiltinAttribInfo + + member attrib_NullableContextAttribute_opt: BuiltinAttribInfo option + + member attrib_OptionalArgumentAttribute: BuiltinAttribInfo + + member attrib_OptionalAttribute: BuiltinAttribInfo option + + member attrib_OutAttribute: BuiltinAttribInfo + + member attrib_ParamArrayAttribute: BuiltinAttribInfo + + member attrib_PreserveSigAttribute: BuiltinAttribInfo option + + member attrib_ProjectionParameterAttribute: BuiltinAttribInfo + + member attrib_ReferenceEqualityAttribute: BuiltinAttribInfo + + member attrib_ReflectedDefinitionAttribute: BuiltinAttribInfo + + member attrib_RequireQualifiedAccessAttribute: BuiltinAttribInfo + + member attrib_RequiredMemberAttribute: BuiltinAttribInfo + + member attrib_RequiresExplicitTypeArgumentsAttribute: BuiltinAttribInfo + + member attrib_RequiresLocationAttribute: BuiltinAttribInfo + + member attrib_SealedAttribute: BuiltinAttribInfo + + member attrib_SecurityAttribute: BuiltinAttribInfo option + + member attrib_SecurityCriticalAttribute: BuiltinAttribInfo + + member attrib_SecuritySafeCriticalAttribute: BuiltinAttribInfo + + member attrib_SetsRequiredMembersAttribute: BuiltinAttribInfo + + member attrib_SkipLocalsInitAttribute: BuiltinAttribInfo + + member attrib_DecimalConstantAttribute: BuiltinAttribInfo + + member attrib_StructAttribute: BuiltinAttribInfo + + member attrib_StructLayoutAttribute: BuiltinAttribInfo + + member attrib_StructuralComparisonAttribute: BuiltinAttribInfo + + member attrib_StructuralEqualityAttribute: BuiltinAttribInfo + + member attrib_SystemObsolete: BuiltinAttribInfo + + member attrib_ThreadStaticAttribute: BuiltinAttribInfo option + + member attrib_TypeForwardedToAttribute: BuiltinAttribInfo + + member attrib_UnverifiableAttribute: BuiltinAttribInfo + + member attrib_VolatileFieldAttribute: BuiltinAttribInfo + + member attrib_WarnOnWithoutNullArgumentAttribute: BuiltinAttribInfo + + member attribs_Unsupported: FSharp.Compiler.TypedTree.TyconRef list + + member bitwise_and_info: IntrinsicValRef + + member bitwise_and_vref: FSharp.Compiler.TypedTree.ValRef + + member bitwise_or_info: IntrinsicValRef + + member bitwise_or_vref: FSharp.Compiler.TypedTree.ValRef + + member bitwise_shift_left_info: IntrinsicValRef + + member bitwise_shift_left_vref: FSharp.Compiler.TypedTree.ValRef + + member bitwise_shift_right_info: IntrinsicValRef + + member bitwise_shift_right_vref: FSharp.Compiler.TypedTree.ValRef + + member bitwise_unary_not_info: IntrinsicValRef + + member bitwise_unary_not_vref: FSharp.Compiler.TypedTree.ValRef + + member bitwise_xor_info: IntrinsicValRef + + member bitwise_xor_vref: FSharp.Compiler.TypedTree.ValRef + + member bool_tcr: FSharp.Compiler.TypedTree.EntityRef + + member bool_ty: FSharp.Compiler.TypedTree.TType + + member box_info: IntrinsicValRef + + member byref2_tcr: FSharp.Compiler.TypedTree.EntityRef + + member byref_tcr: FSharp.Compiler.TypedTree.EntityRef + + member byrefkind_InOut_tcr: FSharp.Compiler.TypedTree.EntityRef + + member byrefkind_In_tcr: FSharp.Compiler.TypedTree.EntityRef + + member byrefkind_Out_tcr: FSharp.Compiler.TypedTree.EntityRef + + member byte_checked_info: IntrinsicValRef + + member byte_operator_info: IntrinsicValRef + + member byte_tcr: FSharp.Compiler.TypedTree.EntityRef + + member byte_ty: FSharp.Compiler.TypedTree.TType + + member call_with_witnesses_info: IntrinsicValRef + + member cast_quotation_info: IntrinsicValRef + + member cgh__debugPoint_vref: FSharp.Compiler.TypedTree.ValRef + + member cgh__resumableEntry_vref: FSharp.Compiler.TypedTree.ValRef + + member cgh__resumeAt_vref: FSharp.Compiler.TypedTree.ValRef + + member cgh__stateMachine_vref: FSharp.Compiler.TypedTree.ValRef + + member cgh__useResumableCode_vref: FSharp.Compiler.TypedTree.ValRef + + member char_operator_info: IntrinsicValRef + + member char_tcr: FSharp.Compiler.TypedTree.EntityRef + + member char_ty: FSharp.Compiler.TypedTree.TType + + member checkNullness: bool + + member check_this_info: IntrinsicValRef + + member checked_addition_info: IntrinsicValRef + + member checked_multiply_info: IntrinsicValRef + + member checked_subtraction_info: IntrinsicValRef + + member checked_unary_minus_info: IntrinsicValRef + + member choice2_tcr: FSharp.Compiler.TypedTree.EntityRef + + member choice3_tcr: FSharp.Compiler.TypedTree.EntityRef + + member choice4_tcr: FSharp.Compiler.TypedTree.EntityRef + + member choice5_tcr: FSharp.Compiler.TypedTree.EntityRef + + member choice6_tcr: FSharp.Compiler.TypedTree.EntityRef + + member choice7_tcr: FSharp.Compiler.TypedTree.EntityRef + + member compare_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member compilingFSharpCore: bool + + member cons_ucref: FSharp.Compiler.TypedTree.UnionCaseRef + + member create_event_info: IntrinsicValRef + + member create_instance_info: IntrinsicValRef + + member date_tcr: FSharp.Compiler.TypedTree.EntityRef + + member decimal_tcr: FSharp.Compiler.TypedTree.EntityRef + + member decimal_ty: FSharp.Compiler.TypedTree.TType + + member deserialize_quoted_FSharp_20_plus_info: IntrinsicValRef + + member deserialize_quoted_FSharp_40_plus_info: IntrinsicValRef + + member dispose_info: IntrinsicValRef + + member emitDebugInfoInQuotations: bool + + member enumOfValue_vref: FSharp.Compiler.TypedTree.ValRef + + member enum_DynamicallyAccessedMemberTypes: BuiltinAttribInfo + + member enum_operator_info: IntrinsicValRef + + member enum_vref: FSharp.Compiler.TypedTree.ValRef + + member equals_nullable_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member equals_operator_info: IntrinsicValRef + + member equals_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member exn_tcr: FSharp.Compiler.TypedTree.EntityRef + + member exn_ty: FSharp.Compiler.TypedTree.TType + + member exponentiation_vref: FSharp.Compiler.TypedTree.ValRef + + member expr_tcr: FSharp.Compiler.TypedTree.EntityRef + + member fail_init_info: IntrinsicValRef + + member fail_static_init_info: IntrinsicValRef + + member failwith_vref: FSharp.Compiler.TypedTree.ValRef + + member failwithf_vref: FSharp.Compiler.TypedTree.ValRef + + member fastFunc_tcr: FSharp.Compiler.TypedTree.EntityRef + + member float32_operator_info: IntrinsicValRef + + member float32_tcr: FSharp.Compiler.TypedTree.EntityRef + + member float32_ty: FSharp.Compiler.TypedTree.TType + + member float_operator_info: IntrinsicValRef + + member float_tcr: FSharp.Compiler.TypedTree.EntityRef + + member float_ty: FSharp.Compiler.TypedTree.TType + + member format4_tcr: FSharp.Compiler.TypedTree.EntityRef + + member format_tcr: FSharp.Compiler.TypedTree.EntityRef + + member fslibCcu: FSharp.Compiler.TypedTree.CcuThunk + + member fslib_IDelegateEvent_tcr: FSharp.Compiler.TypedTree.EntityRef + + member fslib_IEvent2_tcr: FSharp.Compiler.TypedTree.EntityRef + + /// Indicates if we are generating witness arguments for SRTP constraints. Only done if the FSharp.Core + /// supports witness arguments. + member generateWitnesses: bool + + member generic_compare_withc_tuple2_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_compare_withc_tuple3_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_compare_withc_tuple4_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_compare_withc_tuple5_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_comparison_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_comparison_withc_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_comparison_withc_outer_info: IntrinsicValRef + + member generic_equality_er_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_equality_er_outer_info: IntrinsicValRef + + member generic_equality_per_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_equality_withc_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_equality_withc_outer_info: IntrinsicValRef + + member generic_equality_withc_outer_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_equals_withc_tuple2_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_equals_withc_tuple3_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_equals_withc_tuple4_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_equals_withc_tuple5_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_hash_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_hash_withc_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_hash_withc_outer_info: IntrinsicValRef + + member generic_hash_withc_tuple2_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_hash_withc_tuple3_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_hash_withc_tuple4_vref: FSharp.Compiler.TypedTree.ValRef + + member generic_hash_withc_tuple5_vref: FSharp.Compiler.TypedTree.ValRef + + member get_generic_comparer_info: IntrinsicValRef + + member get_generic_er_equality_comparer_info: IntrinsicValRef + + member get_generic_per_equality_comparer_info: IntrinsicValRef + + member getstring_info: IntrinsicValRef + + member greater_than_operator: IntrinsicValRef + + member greater_than_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member greater_than_or_equals_operator: IntrinsicValRef + + member greater_than_or_equals_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member hash_info: IntrinsicValRef + + member il_arr_tcr_map: FSharp.Compiler.TypedTree.EntityRef array + + member ilg: FSharp.Compiler.AbstractIL.IL.ILGlobals + + member ilsigptr_tcr: FSharp.Compiler.TypedTree.EntityRef + + member iltyp_AsyncCallback: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_Exception: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_IAsyncResult: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_IComparable: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_Missing: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_ReferenceAssemblyAttributeOpt: FSharp.Compiler.AbstractIL.IL.ILType option + + member iltyp_RuntimeFieldHandle: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_RuntimeMethodHandle: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_RuntimeTypeHandle: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_SerializationInfo: FSharp.Compiler.AbstractIL.IL.ILType option + + member iltyp_StreamingContext: FSharp.Compiler.AbstractIL.IL.ILType option + + member iltyp_UnmanagedType: FSharp.Compiler.AbstractIL.IL.ILType + + member iltyp_ValueType: FSharp.Compiler.AbstractIL.IL.ILType + + member inref_tcr: FSharp.Compiler.TypedTree.EntityRef + + member int16_checked_info: IntrinsicValRef + + member int16_operator_info: IntrinsicValRef + + member int16_tcr: FSharp.Compiler.TypedTree.EntityRef + + member int16_ty: FSharp.Compiler.TypedTree.TType + + member int32_checked_info: IntrinsicValRef + + member int32_operator_info: IntrinsicValRef + + member int32_tcr: FSharp.Compiler.TypedTree.EntityRef + + member int32_ty: FSharp.Compiler.TypedTree.TType + + member int64_checked_info: IntrinsicValRef + + member int64_operator_info: IntrinsicValRef + + member int64_tcr: FSharp.Compiler.TypedTree.EntityRef + + member int64_ty: FSharp.Compiler.TypedTree.TType + + member int_checked_info: IntrinsicValRef + + member int_ty: FSharp.Compiler.TypedTree.TType + + member invalid_arg_vref: FSharp.Compiler.TypedTree.ValRef + + member invalid_op_vref: FSharp.Compiler.TypedTree.ValRef + + /// Indicates if we can use System.Array.Empty when emitting IL for empty array literals + member isArrayEmptyAvailable: bool + + /// Are we assuming all code gen is for F# interactive, with no static linking + member isInteractive: bool + + member compilationMode: CompilationMode + + member isnull_info: IntrinsicValRef + + member istype_fast_vref: FSharp.Compiler.TypedTree.ValRef + + member istype_info: IntrinsicValRef + + member istype_vref: FSharp.Compiler.TypedTree.ValRef + + member knownFSharpCoreModules: System.Collections.Generic.IDictionary + + member knownIntrinsics: + System.Collections.Concurrent.ConcurrentDictionary<(string * string option * string * int), FSharp.Compiler.TypedTree.ValRef> + + member knownWithNull: FSharp.Compiler.TypedTree.Nullness + + member knownWithoutNull: FSharp.Compiler.TypedTree.Nullness + + member langFeatureNullness: bool + + member langVersion: FSharp.Compiler.Features.LanguageVersion + + member lazy_create_info: IntrinsicValRef + + member lazy_force_info: IntrinsicValRef + + member lazy_tcr_canon: FSharp.Compiler.TypedTree.EntityRef + + member lazy_tcr_nice: FSharp.Compiler.TypedTree.EntityRef + + member less_than_operator: IntrinsicValRef + + member less_than_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member less_than_or_equals_operator: IntrinsicValRef + + member less_than_or_equals_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member lift_value_info: IntrinsicValRef + + member lift_value_with_defn_info: IntrinsicValRef + + member lift_value_with_name_info: IntrinsicValRef + + member list_tcr_canon: FSharp.Compiler.TypedTree.EntityRef + + member list_tcr_nice: FSharp.Compiler.TypedTree.EntityRef + + member measureinverse_tcr: FSharp.Compiler.TypedTree.EntityRef + + member measureone_tcr: FSharp.Compiler.TypedTree.EntityRef + + member measureproduct_tcr: FSharp.Compiler.TypedTree.EntityRef + + member methodhandleof_vref: FSharp.Compiler.TypedTree.ValRef + + member mk_Attribute_ty: FSharp.Compiler.TypedTree.TType + + member mk_IAsyncStateMachine_ty: FSharp.Compiler.TypedTree.TType + + member mk_IComparable_ty: FSharp.Compiler.TypedTree.TType + + member mk_IStructuralComparable_ty: FSharp.Compiler.TypedTree.TType + + member mk_IStructuralEquatable_ty: FSharp.Compiler.TypedTree.TType + + member mlCompatibility: bool + + member nameof_vref: FSharp.Compiler.TypedTree.ValRef + + member nativeint_checked_info: IntrinsicValRef + + member nativeint_operator_info: IntrinsicValRef + + member nativeint_tcr: FSharp.Compiler.TypedTree.EntityRef + + member nativeint_ty: FSharp.Compiler.TypedTree.TType + + member nativeptr_tcr: FSharp.Compiler.TypedTree.EntityRef + + member nativeptr_tobyref_vref: FSharp.Compiler.TypedTree.ValRef + + member new_decimal_info: IntrinsicValRef + + member new_format_info: IntrinsicValRef + + member new_format_vref: FSharp.Compiler.TypedTree.ValRef + + member new_query_source_info: IntrinsicValRef + + member nil_ucref: FSharp.Compiler.TypedTree.UnionCaseRef + + member not_equals_operator: IntrinsicValRef + + member not_equals_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member null_arg_vref: FSharp.Compiler.TypedTree.ValRef + + member nullable_equals_nullable_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member nullable_equals_operator_vref: FSharp.Compiler.TypedTree.ValRef + + member obj_ty_ambivalent: FSharp.Compiler.TypedTree.TType + + member obj_ty_noNulls: FSharp.Compiler.TypedTree.TType + + member obj_ty_withNulls: FSharp.Compiler.TypedTree.TType + + member option_defaultValue_info: IntrinsicValRef + + member option_tcr_canon: FSharp.Compiler.TypedTree.EntityRef + + member option_tcr_nice: FSharp.Compiler.TypedTree.EntityRef + + member option_toNullable_info: IntrinsicValRef + + member or2_vref: FSharp.Compiler.TypedTree.ValRef + + member or_vref: FSharp.Compiler.TypedTree.ValRef + + member outref_tcr: FSharp.Compiler.TypedTree.EntityRef + + member pathMap: Internal.Utilities.PathMap + + member pdecimal_tcr: FSharp.Compiler.TypedTree.EntityRef + + member pfloat32_tcr: FSharp.Compiler.TypedTree.EntityRef + + member pfloat_tcr: FSharp.Compiler.TypedTree.EntityRef + + member pint16_tcr: FSharp.Compiler.TypedTree.EntityRef + + member pint64_tcr: FSharp.Compiler.TypedTree.EntityRef + + member pint8_tcr: FSharp.Compiler.TypedTree.EntityRef + + member pint_tcr: FSharp.Compiler.TypedTree.EntityRef + + member piperight2_vref: FSharp.Compiler.TypedTree.ValRef + + member piperight3_vref: FSharp.Compiler.TypedTree.ValRef + + member piperight_vref: FSharp.Compiler.TypedTree.ValRef + + member pnativeint_tcr: FSharp.Compiler.TypedTree.EntityRef + + member puint16_tcr: FSharp.Compiler.TypedTree.EntityRef + + member puint64_tcr: FSharp.Compiler.TypedTree.EntityRef + + member puint8_tcr: FSharp.Compiler.TypedTree.EntityRef + + member puint_tcr: FSharp.Compiler.TypedTree.EntityRef + + member punativeint_tcr: FSharp.Compiler.TypedTree.EntityRef + + member query_builder_tcref: FSharp.Compiler.TypedTree.EntityRef + + member query_for_vref: FSharp.Compiler.TypedTree.ValRef + + member query_run_enumerable_vref: FSharp.Compiler.TypedTree.ValRef + + member query_run_value_vref: FSharp.Compiler.TypedTree.ValRef + + member query_select_vref: FSharp.Compiler.TypedTree.ValRef + + member query_source_as_enum_info: IntrinsicValRef + + member query_source_vref: FSharp.Compiler.TypedTree.ValRef + + member query_value_vref: FSharp.Compiler.TypedTree.ValRef + + member query_yield_from_vref: FSharp.Compiler.TypedTree.ValRef + + member query_yield_vref: FSharp.Compiler.TypedTree.ValRef + + member query_zero_vref: FSharp.Compiler.TypedTree.ValRef + + member quote_to_linq_lambda_info: IntrinsicValRef + + member raise_info: IntrinsicValRef + + member raise_vref: FSharp.Compiler.TypedTree.ValRef + + member range_byte_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_char_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_generic_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_int16_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_int32_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_int64_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_nativeint_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_sbyte_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_step_generic_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_step_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_uint16_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_uint32_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_uint64_op_vref: FSharp.Compiler.TypedTree.ValRef + + member range_unativeint_op_vref: FSharp.Compiler.TypedTree.ValRef + + member raw_expr_tcr: FSharp.Compiler.TypedTree.EntityRef + + member realsig: bool + + member ref_tuple1_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ref_tuple2_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ref_tuple3_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ref_tuple4_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ref_tuple5_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ref_tuple6_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ref_tuple7_tcr: FSharp.Compiler.TypedTree.EntityRef + + member ref_tuple8_tcr: FSharp.Compiler.TypedTree.EntityRef + + member refcell_assign_vref: FSharp.Compiler.TypedTree.ValRef + + member refcell_decr_vref: FSharp.Compiler.TypedTree.ValRef + + member refcell_deref_vref: FSharp.Compiler.TypedTree.ValRef + + member refcell_incr_vref: FSharp.Compiler.TypedTree.ValRef + + member refcell_tcr_canon: FSharp.Compiler.TypedTree.EntityRef + + member refcell_tcr_nice: FSharp.Compiler.TypedTree.EntityRef + + member reference_equality_inner_vref: FSharp.Compiler.TypedTree.ValRef + + member reraise_info: IntrinsicValRef + + member reraise_vref: FSharp.Compiler.TypedTree.ValRef + + member sbyte_checked_info: IntrinsicValRef + + member sbyte_operator_info: IntrinsicValRef + + member sbyte_tcr: FSharp.Compiler.TypedTree.EntityRef + + member sbyte_ty: FSharp.Compiler.TypedTree.TType + + member seq_append_info: IntrinsicValRef + + member seq_append_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_collect_info: IntrinsicValRef + + member seq_collect_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_delay_info: IntrinsicValRef + + member seq_delay_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_empty_info: IntrinsicValRef + + member seq_empty_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_finally_info: IntrinsicValRef + + member seq_finally_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_generated_info: IntrinsicValRef + + member seq_generated_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_info: IntrinsicValRef + + member seq_map_info: IntrinsicValRef + + member seq_map_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_of_functions_info: IntrinsicValRef + + member seq_singleton_info: IntrinsicValRef + + member seq_singleton_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_tcr: FSharp.Compiler.TypedTree.EntityRef + + member seq_to_array_info: IntrinsicValRef + + member seq_to_array_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_to_list_info: IntrinsicValRef + + member seq_to_list_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_trywith_info: IntrinsicValRef + + member seq_using_info: IntrinsicValRef + + member seq_using_vref: FSharp.Compiler.TypedTree.ValRef + + member seq_vref: FSharp.Compiler.TypedTree.ValRef + + member sizeof_vref: FSharp.Compiler.TypedTree.ValRef + + member splice_expr_vref: FSharp.Compiler.TypedTree.ValRef + + member splice_raw_expr_vref: FSharp.Compiler.TypedTree.ValRef + + member sprintf_info: IntrinsicValRef + + member sprintf_vref: FSharp.Compiler.TypedTree.ValRef + + member string_ty: FSharp.Compiler.TypedTree.TType + + member string_ty_ambivalent: FSharp.Compiler.TypedTree.TType + + member struct_tuple1_tcr: FSharp.Compiler.TypedTree.EntityRef + + member struct_tuple2_tcr: FSharp.Compiler.TypedTree.EntityRef + + member struct_tuple3_tcr: FSharp.Compiler.TypedTree.EntityRef + + member struct_tuple4_tcr: FSharp.Compiler.TypedTree.EntityRef + + member struct_tuple5_tcr: FSharp.Compiler.TypedTree.EntityRef + + member struct_tuple6_tcr: FSharp.Compiler.TypedTree.EntityRef + + member struct_tuple7_tcr: FSharp.Compiler.TypedTree.EntityRef + + member struct_tuple8_tcr: FSharp.Compiler.TypedTree.EntityRef + + member suppressed_types: FSharp.Compiler.TypedTree.EntityRef list + + member system_ArgIterator_tcref: FSharp.Compiler.TypedTree.EntityRef option + + member system_Array_ty: FSharp.Compiler.TypedTree.TType + + member system_Bool_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Byte_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Char_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Decimal_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Delegate_ty: FSharp.Compiler.TypedTree.TType + + member system_Double_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Enum_ty: FSharp.Compiler.TypedTree.TType + + member system_ExceptionDispatchInfo_ty: FSharp.Compiler.TypedTree.TType option + + member system_FormattableStringFactory_ty: FSharp.Compiler.TypedTree.TType + + member system_FormattableString_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_FormattableString_ty: FSharp.Compiler.TypedTree.TType + + member system_GenericIComparable_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_GenericIEquatable_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_IDisposable_ty: FSharp.Compiler.TypedTree.TType + + member system_IFormattable_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_IFormattable_ty: FSharp.Compiler.TypedTree.TType + + member system_Int16_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Int32_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Int64_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_IntPtr_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_LinqExpression_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_MarshalByRefObject_tcref: FSharp.Compiler.TypedTree.EntityRef option + + member system_MarshalByRefObject_ty: FSharp.Compiler.TypedTree.TType option + + member system_MulticastDelegate_ty: FSharp.Compiler.TypedTree.TType + + member system_Nullable_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Object_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Object_ty: FSharp.Compiler.TypedTree.TType + + member system_RuntimeArgumentHandle_tcref: FSharp.Compiler.TypedTree.EntityRef option + + member system_RuntimeHelpers_ty: FSharp.Compiler.TypedTree.TType + + member system_RuntimeTypeHandle_ty: FSharp.Compiler.TypedTree.TType + + member system_SByte_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Single_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_String_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Type_ty: FSharp.Compiler.TypedTree.TType + + member system_TypedReference_tcref: FSharp.Compiler.TypedTree.EntityRef option + + member system_UInt16_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_UInt32_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_UInt64_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_UIntPtr_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Value_tcref: FSharp.Compiler.TypedTree.EntityRef + + member system_Value_ty: FSharp.Compiler.TypedTree.TType + + member system_Void_tcref: FSharp.Compiler.TypedTree.EntityRef + + member tcref_IObservable: FSharp.Compiler.TypedTree.EntityRef + + member tcref_IObserver: FSharp.Compiler.TypedTree.EntityRef + + member tcref_LanguagePrimitives: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Attribute: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_Dictionary: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_ICollection: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_IEnumerable: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_IEnumerator: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_IEqualityComparer: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_IList: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_IReadOnlyCollection: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_Generic_IReadOnlyList: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_IComparer: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_IEnumerable: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_Collections_IEqualityComparer: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_IComparable: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_IDisposable: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_IStructuralComparable: FSharp.Compiler.TypedTree.EntityRef + + member tcref_System_IStructuralEquatable: FSharp.Compiler.TypedTree.EntityRef + + member typedefof_info: IntrinsicValRef + + member typedefof_vref: FSharp.Compiler.TypedTree.ValRef + + member typeof_info: IntrinsicValRef + + member typeof_vref: FSharp.Compiler.TypedTree.ValRef + + member uint16_checked_info: IntrinsicValRef + + member uint16_operator_info: IntrinsicValRef + + member uint16_tcr: FSharp.Compiler.TypedTree.EntityRef + + member uint16_ty: FSharp.Compiler.TypedTree.TType + + member uint32_checked_info: IntrinsicValRef + + member uint32_operator_info: IntrinsicValRef + + member uint32_tcr: FSharp.Compiler.TypedTree.EntityRef + + member uint32_ty: FSharp.Compiler.TypedTree.TType + + member uint64_checked_info: IntrinsicValRef + + member uint64_operator_info: IntrinsicValRef + + member uint64_tcr: FSharp.Compiler.TypedTree.EntityRef + + member uint64_ty: FSharp.Compiler.TypedTree.TType + + member unativeint_checked_info: IntrinsicValRef + + member unativeint_operator_info: IntrinsicValRef + + member unativeint_ty: FSharp.Compiler.TypedTree.TType + + member unbox_fast_info: IntrinsicValRef + + member unbox_fast_vref: FSharp.Compiler.TypedTree.ValRef + + member unbox_info: IntrinsicValRef + + member unbox_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_addition_info: IntrinsicValRef + + member unchecked_addition_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_defaultof_info: IntrinsicValRef + + member unchecked_defaultof_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_division_info: IntrinsicValRef + + member unchecked_division_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_modulus_info: IntrinsicValRef + + member unchecked_modulus_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_multiply_info: IntrinsicValRef + + member unchecked_multiply_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_subtraction_info: IntrinsicValRef + + member unchecked_subtraction_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_unary_minus_info: IntrinsicValRef + + member unchecked_unary_minus_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_unary_not_vref: FSharp.Compiler.TypedTree.ValRef + + member unchecked_unary_plus_vref: FSharp.Compiler.TypedTree.ValRef + + member unit_tcr_canon: FSharp.Compiler.TypedTree.EntityRef + + member unit_ty: FSharp.Compiler.TypedTree.TType + + member useReflectionFreeCodeGen: bool + + member valueoption_tcr_canon: FSharp.Compiler.TypedTree.EntityRef + + member valueoption_tcr_nice: FSharp.Compiler.TypedTree.EntityRef + + member voidptr_tcr: FSharp.Compiler.TypedTree.EntityRef + +#if DEBUG +// This global is only used during debug output +val mutable internal global_g: TcGlobals option +#endif diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fs b/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fs index 9eb7609189..be22209a27 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fs @@ -37,7 +37,7 @@ type ResolutionEnvironment = GetReferencedAssemblies: unit -> string[] TemporaryFolder: string } -/// Load a the design-time part of a type-provider into the host process, and look for types +/// Load the design-time part of a type-provider into the host process, and look for types /// marked with the TypeProviderAttribute attribute. let GetTypeProviderImplementationTypes ( runTimeAssemblyFileName, @@ -49,7 +49,7 @@ let GetTypeProviderImplementationTypes ( // Report an error, blaming the particular type provider component let raiseError designTimeAssemblyPathOpt (e: exn) = let attrName = typeof.Name - let exnTypeName = e.GetType().FullName + let exnTypeName = !! e.GetType().FullName let exnMsg = e.Message match designTimeAssemblyPathOpt with | None -> @@ -69,16 +69,13 @@ let GetTypeProviderImplementationTypes ( [ for t in exportedTypes do let ca = t.GetCustomAttributes(typeof, true) - match ca with - | Null -> () - | NonNull ca -> - if ca.Length > 0 then - yield t + if ca.Length > 0 then + yield t ] filtered with e -> - let folder = Path.GetDirectoryName loadedDesignTimeAssembly.Location - let exnTypeName = e.GetType().FullName + let folder = !! Path.GetDirectoryName(loadedDesignTimeAssembly.Location) + let exnTypeName = !! e.GetType().FullName let exnMsg = e.Message match e with | :? FileLoadException -> @@ -92,8 +89,8 @@ let GetTypeProviderImplementationTypes ( let StripException (e: exn) = match e with - | :? TargetInvocationException as e -> e.InnerException - | :? TypeInitializationException as e -> e.InnerException + | :? TargetInvocationException as e when isNotNull e.InnerException -> !! e.InnerException + | :? TypeInitializationException as e when isNotNull e.InnerException -> !! e.InnerException | _ -> e /// Create an instance of a type provider from the implementation type for the type provider in the @@ -116,7 +113,7 @@ let CreateTypeProvider ( f () with err -> let e = StripException (StripException err) - raise (TypeProviderError(FSComp.SR.etTypeProviderConstructorException(e.Message), typeProviderImplementationType.FullName, m)) + raise (TypeProviderError(FSComp.SR.etTypeProviderConstructorException(e.Message), !! typeProviderImplementationType.FullName, m)) let getReferencedAssemblies () = resolutionEnvironment.GetReferencedAssemblies() |> Array.distinct @@ -144,14 +141,14 @@ let CreateTypeProvider ( IsHostedExecution= isInteractive, SystemRuntimeAssemblyVersion = systemRuntimeAssemblyVersion) #endif - protect (fun () -> Activator.CreateInstance(typeProviderImplementationType, [| box e|]) :?> ITypeProvider ) + protect (fun () -> !!(Activator.CreateInstance(typeProviderImplementationType, [| box e|])) :?> ITypeProvider ) elif not(isNull(typeProviderImplementationType.GetConstructor [| |])) then - protect (fun () -> Activator.CreateInstance typeProviderImplementationType :?> ITypeProvider ) + protect (fun () -> !!(Activator.CreateInstance typeProviderImplementationType) :?> ITypeProvider ) else // No appropriate constructor found - raise (TypeProviderError(FSComp.SR.etProviderDoesNotHaveValidConstructor(), typeProviderImplementationType.FullName, m)) + raise (TypeProviderError(FSComp.SR.etProviderDoesNotHaveValidConstructor(), !! typeProviderImplementationType.FullName, m)) let GetTypeProvidersOfAssembly ( runtimeAssemblyFilename: string, @@ -171,7 +168,7 @@ let GetTypeProvidersOfAssembly ( let designTimeAssemblyName = try if designTimeName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) then - Some (AssemblyName (Path.GetFileNameWithoutExtension designTimeName)) + Some (AssemblyName (!!Path.GetFileNameWithoutExtension(designTimeName))) else Some (AssemblyName designTimeName) with :? ArgumentException -> @@ -193,7 +190,7 @@ let GetTypeProvidersOfAssembly ( CreateTypeProvider (t, runtimeAssemblyFilename, resolutionEnvironment, isInvalidationSupported, isInteractive, systemRuntimeContainsType, systemRuntimeAssemblyVersion, m) match box resolver with - | Null -> () + | null -> () | _ -> yield (resolver, ilScopeRefOfRuntimeAssembly) | None, _ -> @@ -227,8 +224,13 @@ let TryTypeMemberArray (st: Tainted<_>, fullName, memberName, m, f) = [||] /// Try to access a member on a provided type, catching and reporting errors and checking the result is non-null, +#if NO_CHECKNULLS let TryTypeMemberNonNull<'T, 'U when 'U : null and 'U : not struct>(st: Tainted<'T>, fullName, memberName, m, recover: 'U, (f: 'T -> 'U)) : Tainted<'U> = match TryTypeMember(st, fullName, memberName, m, recover, f) with +#else +let TryTypeMemberNonNull<'T, 'U when 'U : not null and 'U : not struct>(st: Tainted<'T>, fullName, memberName, m, recover: 'U, (f: 'T -> 'U | null)) : Tainted<'U> = + match TryTypeMember<'T, 'U | null>(st, fullName, memberName, m, withNull recover, f) with +#endif | Tainted.Null -> errorR(Error(FSComp.SR.etUnexpectedNullFromProvidedTypeMember(fullName, memberName), m)) st.PApplyNoFailure(fun _ -> recover) @@ -287,7 +289,7 @@ type ProvidedTypeComparer() = interface IEqualityComparer with member _.GetHashCode(ty: ProvidedType) = hash (key ty) - member _.Equals(ty1: ProvidedType, ty2: ProvidedType) = (key ty1 = key ty2) + member _.Equals(ty1: ProvidedType, ty2: ProvidedType) = nullSafeEquality ty1 ty2 (fun ty1 ty2 -> key ty1 = key ty2) /// The context used to interpret information in the closure of System.Type, System.MethodInfo and other /// info objects coming from the type provider. @@ -340,14 +342,17 @@ type ProvidedTypeContext = dict )) -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedType (x: Type, ctxt: ProvidedTypeContext) = inherit ProvidedMemberInfo(x, ctxt) let isMeasure = lazy x.CustomAttributes - |> Seq.exists (fun a -> a.Constructor.DeclaringType.FullName = typeof.FullName) + |> Seq.exists (fun a -> (!! a.Constructor.DeclaringType).FullName = typeof.FullName) let provide () = ProvidedCustomAttributeProvider (fun _ -> x.CustomAttributes) :> IProvidedCustomAttributeProvider @@ -408,14 +413,14 @@ type ProvidedType (x: Type, ctxt: ProvidedTypeContext) = /// Type.BaseType can be null when Type is interface or object member _.BaseType = x.BaseType |> ProvidedType.Create ctxt - member _.GetStaticParameters(provider: ITypeProvider) = provider.GetStaticParameters x |> ProvidedParameterInfo.CreateArray ctxt + member _.GetStaticParameters(provider: ITypeProvider) : ProvidedParameterInfo[] MaybeNull = provider.GetStaticParameters x |> ProvidedParameterInfo.CreateArray ctxt /// Type.GetElementType can be null if i.e. Type is not array\pointer\byref type member _.GetElementType() = x.GetElementType() |> ProvidedType.Create ctxt member _.GetGenericArguments() = x.GetGenericArguments() |> ProvidedType.CreateArray ctxt - member _.ApplyStaticArguments(provider: ITypeProvider, fullTypePathAfterArguments, staticArgs: obj[]) = + member _.ApplyStaticArguments(provider: ITypeProvider, fullTypePathAfterArguments, staticArgs: objnull[]) = provider.ApplyStaticArguments(x, fullTypePathAfterArguments, staticArgs) |> ProvidedType.Create ctxt member _.IsVoid = (Type.op_Equality(x, typeof) || (x.Namespace = "System" && x.Name = "Void")) @@ -467,17 +472,28 @@ type ProvidedType (x: Type, ctxt: ProvidedTypeContext) = let argTypes = args |> Array.map (fun arg -> arg.RawSystemType) ProvidedType.CreateNoContext(x.MakeGenericType(argTypes)) - member _.AsProvidedVar name = ProvidedVar.Create ctxt (Var(name, x)) + member _.AsProvidedVar name = ProvidedVar.CreateNonNull ctxt (Quotations.Var(name, x)) - static member Create ctxt x = match x with null -> null | t -> ProvidedType (t, ctxt) + static member Create ctxt x : ProvidedType MaybeNull = + match x with + | Null -> null + | NonNull t -> ProvidedType (t, ctxt) - static member CreateWithNullCheck ctxt name x = match x with null -> nullArg name | t -> ProvidedType (t, ctxt) + static member CreateNonNull ctxt x = ProvidedType (x, ctxt) + + static member CreateWithNullCheck ctxt name (x:Type MaybeNull) = + match x with + | null -> nullArg name + | t -> ProvidedType (t, ctxt) - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedType.Create ctxt) + static member CreateArray ctxt (xs: Type[] MaybeNull) : ProvidedType[] MaybeNull = + match xs with + | Null -> null + | NonNull xs -> xs |> Array.map (ProvidedType.CreateNonNull ctxt) - static member CreateNoContext (x: Type) = ProvidedType.Create ProvidedTypeContext.Empty x + static member CreateNoContext (x:Type) = ProvidedType.Create ProvidedTypeContext.Empty x - static member Void = ProvidedType.CreateNoContext typeof + static member Void = ProvidedType.CreateNoContext typeof member _.Handle = x @@ -496,17 +512,28 @@ type ProvidedType (x: Type, ctxt: ProvidedTypeContext) = static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) -[] +#if NO_CHECKNULLS +[] +#endif type IProvidedCustomAttributeProvider = - abstract GetDefinitionLocationAttribute: provider: ITypeProvider -> (string * int * int) option - abstract GetXmlDocAttributes: provider: ITypeProvider -> string[] - abstract GetHasTypeProviderEditorHideMethodsAttribute: provider: ITypeProvider -> bool - abstract GetAttributeConstructorArgs: provider: ITypeProvider * attribName: string -> (obj option list * (string * obj option) list) option + abstract GetDefinitionLocationAttribute : provider: ITypeProvider -> (string MaybeNull * int * int) option + + abstract GetXmlDocAttributes : provider: ITypeProvider -> string[] + + abstract GetHasTypeProviderEditorHideMethodsAttribute : provider:ITypeProvider -> bool + + abstract GetAttributeConstructorArgs: provider:ITypeProvider * attribName:string -> (obj option list * (string * obj option) list) option type ProvidedCustomAttributeProvider (attributes :ITypeProvider -> seq) = - let (|Member|_|) (s: string) (x: CustomAttributeNamedArgument) = if x.MemberName = s then Some x.TypedValue else None - let (|Arg|_|) (x: CustomAttributeTypedArgument) = match x.Value with null -> None | v -> Some v - let findAttribByName tyFullName (a: CustomAttributeData) = (a.Constructor.DeclaringType.FullName = tyFullName) + + [] + let (|Member|_|) (s: string) (x: CustomAttributeNamedArgument) = if x.MemberName = s then ValueSome x.TypedValue else ValueNone + + [] + let (|Arg|_|) (x: CustomAttributeTypedArgument) = match x.Value with null -> ValueNone | v -> ValueSome v + + let findAttribByName tyFullName (a: CustomAttributeData) = ((!!a.Constructor.DeclaringType).FullName = tyFullName) + let findAttrib (ty: Type) a = findAttribByName ty.FullName a interface IProvidedCustomAttributeProvider with member _.GetAttributeConstructorArgs (provider, attribName) = @@ -516,11 +543,11 @@ type ProvidedCustomAttributeProvider (attributes :ITypeProvider -> seq Seq.toList - |> List.map (function Arg null -> None | Arg obj -> Some obj | _ -> None) + |> List.map (function Arg obj -> Some obj | _ -> None) let namedArgs = a.NamedArguments |> Seq.toList - |> List.map (fun arg -> arg.MemberName, match arg.TypedValue with Arg null -> None | Arg obj -> Some obj | _ -> None) + |> List.map (fun arg -> arg.MemberName, match arg.TypedValue with Arg obj -> Some obj | _ -> None) ctorArgs, namedArgs) member _.GetHasTypeProviderEditorHideMethodsAttribute provider = @@ -531,7 +558,7 @@ type ProvidedCustomAttributeProvider (attributes :ITypeProvider -> seq Seq.tryFind (findAttrib typeof) |> Option.map (fun a -> - let filePath = defaultArg (a.NamedArguments |> Seq.tryPick (function Member "FilePath" (Arg (:? string as v)) -> Some v | _ -> None)) null + let filePath : string MaybeNull = defaultArg (a.NamedArguments |> Seq.tryPick (function Member "FilePath" (Arg (:? string as v)) -> Some v | _ -> None)) null let line = defaultArg (a.NamedArguments |> Seq.tryPick (function Member "Line" (Arg (:? int as v)) -> Some v | _ -> None)) 0 let column = defaultArg (a.NamedArguments |> Seq.tryPick (function Member "Column" (Arg (:? int as v)) -> Some v | _ -> None)) 0 (filePath, line, column)) @@ -547,7 +574,10 @@ type ProvidedCustomAttributeProvider (attributes :ITypeProvider -> seq Seq.toArray -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedMemberInfo (x: MemberInfo, ctxt) = let provide () = ProvidedCustomAttributeProvider (fun _ -> x.CustomAttributes) :> IProvidedCustomAttributeProvider @@ -569,11 +599,14 @@ type ProvidedMemberInfo (x: MemberInfo, ctxt) = member _.GetAttributeConstructorArgs (provider, attribName) = provide().GetAttributeConstructorArgs (provider, attribName) -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedParameterInfo (x: ParameterInfo, ctxt) = let provide () = ProvidedCustomAttributeProvider (fun _ -> x.CustomAttributes) :> IProvidedCustomAttributeProvider - member _.Name = x.Name + member _.Name = let nm = x.Name in match box nm with null -> "" | _ -> !!nm member _.IsOut = x.IsOut @@ -586,12 +619,25 @@ type ProvidedParameterInfo (x: ParameterInfo, ctxt) = member _.HasDefaultValue = x.Attributes.HasFlag(ParameterAttributes.HasDefault) /// ParameterInfo.ParameterType cannot be null - member _.ParameterType = ProvidedType.CreateWithNullCheck ctxt "ParameterType" x.ParameterType - - static member Create ctxt x = match x with null -> null | t -> ProvidedParameterInfo (t, ctxt) - - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedParameterInfo.Create ctxt) // TODO null wrong? - + member _.ParameterType = ProvidedType.CreateWithNullCheck ctxt "ParameterType" x.ParameterType + + static member Create ctxt (x: ParameterInfo MaybeNull) : ProvidedParameterInfo MaybeNull = + match x with + | Null -> null + | NonNull x -> ProvidedParameterInfo (x, ctxt) + + static member CreateNonNull ctxt x = ProvidedParameterInfo (x, ctxt) + + static member CreateArray ctxt (xs: ParameterInfo[] MaybeNull) : ProvidedParameterInfo[] MaybeNull = + match xs with + | Null -> null + | NonNull xs -> xs |> Array.map (ProvidedParameterInfo.CreateNonNull ctxt) + + static member CreateArrayNonNull ctxt xs : ProvidedParameterInfo[] = + match box xs with + | Null -> [| |] + | _ -> xs |> Array.map (ProvidedParameterInfo.CreateNonNull ctxt) + interface IProvidedCustomAttributeProvider with member _.GetHasTypeProviderEditorHideMethodsAttribute provider = provide().GetHasTypeProviderEditorHideMethodsAttribute provider @@ -611,16 +657,19 @@ type ProvidedParameterInfo (x: ParameterInfo, ctxt) = override _.GetHashCode() = assert false; x.GetHashCode() -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedAssembly (x: Assembly) = member _.GetName() = x.GetName() - member _.FullName = x.FullName + member _.FullName = !!x.FullName member _.GetManifestModuleContents(provider: ITypeProvider) = provider.GetGeneratedAssemblyContents x - static member Create (x: Assembly) = match x with null -> null | t -> ProvidedAssembly t + static member Create (x: Assembly MaybeNull) : ProvidedAssembly MaybeNull = match x with null -> null | t -> ProvidedAssembly (t) member _.Handle = x @@ -628,7 +677,10 @@ type ProvidedAssembly (x: Assembly) = override _.GetHashCode() = assert false; x.GetHashCode() -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedMethodBase (x: MethodBase, ctxt) = inherit ProvidedMemberInfo(x, ctxt) @@ -663,12 +715,14 @@ type ProvidedMethodBase (x: MethodBase, ctxt) = member _.Handle = x static member TaintedGetHashCode (x: Tainted) = - Tainted.GetHashCodeTainted (x.PApplyNoFailure(fun st -> (st.Name, st.DeclaringType.Assembly.FullName, st.DeclaringType.FullName))) + Tainted.GetHashCodeTainted + (x.PApplyNoFailure(fun st -> (st.Name, (nonNull (nonNull st.DeclaringType).Assembly).FullName, + (nonNull st.DeclaringType).FullName))) static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) - member _.GetStaticParametersForMethod(provider: ITypeProvider) = + member _.GetStaticParametersForMethod(provider: ITypeProvider) : ProvidedParameterInfo[] = let bindingFlags = BindingFlags.Instance ||| BindingFlags.NonPublic ||| BindingFlags.Public let staticParams = @@ -683,13 +737,13 @@ type ProvidedMethodBase (x: MethodBase, ctxt) = [| typeof |], null) if isNull meth then [| |] else let paramsAsObj = - try meth.Invoke(provider, bindingFlags ||| BindingFlags.InvokeMethod, null, [| box x |], null) + try (!!meth).Invoke(provider, bindingFlags ||| BindingFlags.InvokeMethod, null, [| box x |], null) with err -> raise (StripException (StripException err)) - paramsAsObj :?> ParameterInfo[] + !!paramsAsObj :?> ParameterInfo[] - staticParams |> ProvidedParameterInfo.CreateArray ctxt + staticParams |> ProvidedParameterInfo.CreateArrayNonNull ctxt - member _.ApplyStaticArgumentsForMethod(provider: ITypeProvider, fullNameAfterArguments: string, staticArgs: obj[]) = + member _.ApplyStaticArgumentsForMethod(provider: ITypeProvider, fullNameAfterArguments: string, staticArgs: objnull[]) = let bindingFlags = BindingFlags.Instance ||| BindingFlags.Public ||| BindingFlags.InvokeMethod let mb = @@ -705,7 +759,8 @@ type ProvidedMethodBase (x: MethodBase, ctxt) = match meth with | null -> failwith (FSComp.SR.estApplyStaticArgumentsForMethodNotImplemented()) - | _ -> + | meth -> + let mbAsObj = try meth.Invoke(provider, bindingFlags ||| BindingFlags.InvokeMethod, null, [| box x; box fullNameAfterArguments; box staticArgs |], null) with err -> raise (StripException (StripException err)) @@ -714,18 +769,29 @@ type ProvidedMethodBase (x: MethodBase, ctxt) = | :? MethodBase as mb -> mb | _ -> failwith (FSComp.SR.estApplyStaticArgumentsForMethodNotImplemented()) match mb with - | :? MethodInfo as mi -> (mi |> ProvidedMethodInfo.Create ctxt: ProvidedMethodInfo) :> ProvidedMethodBase - | :? ConstructorInfo as ci -> (ci |> ProvidedConstructorInfo.Create ctxt: ProvidedConstructorInfo) :> ProvidedMethodBase + | :? MethodInfo as mi -> (mi |> ProvidedMethodInfo.CreateNonNull ctxt : ProvidedMethodInfo) :> ProvidedMethodBase + | :? ConstructorInfo as ci -> (ci |> ProvidedConstructorInfo.CreateNonNull ctxt : ProvidedConstructorInfo) :> ProvidedMethodBase | _ -> failwith (FSComp.SR.estApplyStaticArgumentsForMethodNotImplemented()) -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedFieldInfo (x: FieldInfo, ctxt) = inherit ProvidedMemberInfo(x, ctxt) - static member Create ctxt x = match x with null -> null | t -> ProvidedFieldInfo (t, ctxt) + static member CreateNonNull ctxt x = ProvidedFieldInfo (x, ctxt) + + static member Create ctxt x : ProvidedFieldInfo MaybeNull = + match x with + | Null -> null + | NonNull x -> ProvidedFieldInfo (x, ctxt) - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedFieldInfo.Create ctxt) + static member CreateArray ctxt (xs: FieldInfo[] MaybeNull) : ProvidedFieldInfo[] MaybeNull = + match xs with + | Null -> null + | NonNull xs -> xs |> Array.map (ProvidedFieldInfo.CreateNonNull ctxt) member _.IsInitOnly = x.IsInitOnly @@ -760,15 +826,28 @@ type ProvidedFieldInfo (x: FieldInfo, ctxt) = static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedMethodInfo (x: MethodInfo, ctxt) = inherit ProvidedMethodBase(x, ctxt) member _.ReturnType = x.ReturnType |> ProvidedType.CreateWithNullCheck ctxt "ReturnType" - static member Create ctxt x = match x with null -> null | t -> ProvidedMethodInfo (t, ctxt) + static member CreateNonNull ctxt (x: MethodInfo) : ProvidedMethodInfo = + ProvidedMethodInfo (x, ctxt) + + static member Create ctxt (x: MethodInfo MaybeNull) : ProvidedMethodInfo MaybeNull = + match x with + | Null -> null + | NonNull x -> ProvidedMethodInfo (x, ctxt) - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedMethodInfo.Create ctxt) + + static member CreateArray ctxt (xs: MethodInfo[] MaybeNull) : ProvidedMethodInfo[] MaybeNull = + match xs with + | Null -> null + | NonNull xs -> xs |> Array.map (ProvidedMethodInfo.CreateNonNull ctxt) member _.Handle = x @@ -778,7 +857,10 @@ type ProvidedMethodInfo (x: MethodInfo, ctxt) = override _.GetHashCode() = assert false; x.GetHashCode() -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedPropertyInfo (x: PropertyInfo, ctxt) = inherit ProvidedMemberInfo(x, ctxt) @@ -795,9 +877,17 @@ type ProvidedPropertyInfo (x: PropertyInfo, ctxt) = /// PropertyInfo.PropertyType cannot be null member _.PropertyType = x.PropertyType |> ProvidedType.CreateWithNullCheck ctxt "PropertyType" - static member Create ctxt x = match x with null -> null | t -> ProvidedPropertyInfo (t, ctxt) + static member CreateNonNull ctxt x = ProvidedPropertyInfo (x, ctxt) - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedPropertyInfo.Create ctxt) + static member Create ctxt x : ProvidedPropertyInfo MaybeNull = + match x with + | Null -> null + | NonNull x -> ProvidedPropertyInfo (x, ctxt) + + static member CreateArray ctxt (xs: PropertyInfo[] MaybeNull) : ProvidedPropertyInfo[] MaybeNull = + match xs with + | Null -> null + | NonNull xs -> xs |> Array.map (ProvidedPropertyInfo.CreateNonNull ctxt) member _.Handle = x @@ -806,12 +896,17 @@ type ProvidedPropertyInfo (x: PropertyInfo, ctxt) = override _.GetHashCode() = assert false; x.GetHashCode() static member TaintedGetHashCode (x: Tainted) = - Tainted.GetHashCodeTainted (x.PApplyNoFailure(fun st -> (st.Name, st.DeclaringType.Assembly.FullName, st.DeclaringType.FullName))) + Tainted.GetHashCodeTainted + (x.PApplyNoFailure(fun st -> (st.Name, (nonNull (nonNull st.DeclaringType).Assembly).FullName, + (nonNull st.DeclaringType).FullName))) static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedEventInfo (x: EventInfo, ctxt) = inherit ProvidedMemberInfo(x, ctxt) @@ -821,11 +916,19 @@ type ProvidedEventInfo (x: EventInfo, ctxt) = /// EventInfo.EventHandlerType cannot be null member _.EventHandlerType = x.EventHandlerType |> ProvidedType.CreateWithNullCheck ctxt "EventHandlerType" - - static member Create ctxt x = match x with null -> null | t -> ProvidedEventInfo (t, ctxt) - - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedEventInfo.Create ctxt) - + + static member CreateNonNull ctxt x = ProvidedEventInfo (x, ctxt) + + static member Create ctxt x : ProvidedEventInfo MaybeNull = + match x with + | Null -> null + | NonNull x -> ProvidedEventInfo (x, ctxt) + + static member CreateArray ctxt (xs: EventInfo[] MaybeNull) : ProvidedEventInfo[] MaybeNull = + match xs with + | Null -> null + | NonNull xs -> xs |> Array.map (ProvidedEventInfo.CreateNonNull ctxt) + member _.Handle = x override _.Equals y = assert false; match y with :? ProvidedEventInfo as y -> x.Equals y.Handle | _ -> false @@ -833,18 +936,31 @@ type ProvidedEventInfo (x: EventInfo, ctxt) = override _.GetHashCode() = assert false; x.GetHashCode() static member TaintedGetHashCode (x: Tainted) = - Tainted.GetHashCodeTainted (x.PApplyNoFailure(fun st -> (st.Name, st.DeclaringType.Assembly.FullName, st.DeclaringType.FullName))) + Tainted.GetHashCodeTainted + (x.PApplyNoFailure(fun st -> (st.Name, (nonNull (nonNull st.DeclaringType).Assembly).FullName, + (nonNull st.DeclaringType).FullName))) static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedConstructorInfo (x: ConstructorInfo, ctxt) = inherit ProvidedMethodBase(x, ctxt) - static member Create ctxt x = match x with null -> null | t -> ProvidedConstructorInfo (t, ctxt) + static member CreateNonNull ctxt x = ProvidedConstructorInfo (x, ctxt) - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedConstructorInfo.Create ctxt) + static member Create ctxt (x: ConstructorInfo MaybeNull) : ProvidedConstructorInfo MaybeNull = + match x with + | Null -> null + | NonNull x -> ProvidedConstructorInfo (x, ctxt) + + static member CreateArray ctxt (xs: ConstructorInfo[] MaybeNull) : ProvidedConstructorInfo[] MaybeNull = + match xs with + | Null -> null + | NonNull xs -> xs |> Array.map (ProvidedConstructorInfo.CreateNonNull ctxt) member _.Handle = x @@ -854,9 +970,6 @@ type ProvidedConstructorInfo (x: ConstructorInfo, ctxt) = type ProvidedExprType = | ProvidedNewArrayExpr of ProvidedType * ProvidedExpr[] -#if PROVIDED_ADDRESS_OF - | ProvidedAddressOfExpr of ProvidedExpr -#endif | ProvidedNewObjectExpr of ProvidedConstructorInfo * ProvidedExpr[] | ProvidedWhileLoopExpr of ProvidedExpr * ProvidedExpr | ProvidedNewDelegateExpr of ProvidedType * ProvidedVar[] * ProvidedExpr @@ -866,7 +979,7 @@ type ProvidedExprType = | ProvidedTryFinallyExpr of ProvidedExpr * ProvidedExpr | ProvidedLambdaExpr of ProvidedVar * ProvidedExpr | ProvidedCallExpr of ProvidedExpr option * ProvidedMethodInfo * ProvidedExpr[] - | ProvidedConstantExpr of obj * ProvidedType + | ProvidedConstantExpr of objnull * ProvidedType | ProvidedDefaultExpr of ProvidedType | ProvidedNewTupleExpr of ProvidedExpr[] | ProvidedTupleGetExpr of ProvidedExpr * int @@ -877,7 +990,11 @@ type ProvidedExprType = | ProvidedIfThenElseExpr of ProvidedExpr * ProvidedExpr * ProvidedExpr | ProvidedVarExpr of ProvidedVar +#if NO_CHECKNULLS [] +#else +[] +#endif type ProvidedExpr (x: Expr, ctxt) = member _.Type = x.Type |> ProvidedType.Create ctxt @@ -891,85 +1008,102 @@ type ProvidedExpr (x: Expr, ctxt) = member _.GetExprType() = match x with | Patterns.NewObject(ctor, args) -> - Some (ProvidedNewObjectExpr (ProvidedConstructorInfo.Create ctxt ctor, [| for a in args -> ProvidedExpr.Create ctxt a |])) + Some (ProvidedNewObjectExpr (ProvidedConstructorInfo.CreateNonNull ctxt ctor, [| for a in args -> ProvidedExpr.CreateNonNull ctxt a |])) | Patterns.WhileLoop(guardExpr, bodyExpr) -> - Some (ProvidedWhileLoopExpr (ProvidedExpr.Create ctxt guardExpr, ProvidedExpr.Create ctxt bodyExpr)) + Some (ProvidedWhileLoopExpr (ProvidedExpr.CreateNonNull ctxt guardExpr, ProvidedExpr.CreateNonNull ctxt bodyExpr)) | Patterns.NewDelegate(ty, vs, expr) -> - Some (ProvidedNewDelegateExpr(ProvidedType.Create ctxt ty, ProvidedVar.CreateArray ctxt (List.toArray vs), ProvidedExpr.Create ctxt expr)) + Some (ProvidedNewDelegateExpr(ProvidedType.CreateNonNull ctxt ty, ProvidedVar.CreateArray ctxt (List.toArray vs), ProvidedExpr.CreateNonNull ctxt expr)) | Patterns.Call(objOpt, meth, args) -> - Some (ProvidedCallExpr((match objOpt with None -> None | Some obj -> Some (ProvidedExpr.Create ctxt obj)), - ProvidedMethodInfo.Create ctxt meth, [| for a in args -> ProvidedExpr.Create ctxt a |])) + Some (ProvidedCallExpr((match objOpt with None -> None | Some obj -> Some (ProvidedExpr.CreateNonNull ctxt obj)), + ProvidedMethodInfo.CreateNonNull ctxt meth, [| for a in args -> ProvidedExpr.CreateNonNull ctxt a |])) | Patterns.DefaultValue ty -> - Some (ProvidedDefaultExpr (ProvidedType.Create ctxt ty)) + Some (ProvidedDefaultExpr (ProvidedType.CreateNonNull ctxt ty)) | Patterns.Value(obj, ty) -> - Some (ProvidedConstantExpr (obj, ProvidedType.Create ctxt ty)) + Some (ProvidedConstantExpr (obj, ProvidedType.CreateNonNull ctxt ty)) | Patterns.Coerce(arg, ty) -> - Some (ProvidedTypeAsExpr (ProvidedExpr.Create ctxt arg, ProvidedType.Create ctxt ty)) + Some (ProvidedTypeAsExpr (ProvidedExpr.CreateNonNull ctxt arg, ProvidedType.CreateNonNull ctxt ty)) | Patterns.NewTuple args -> Some (ProvidedNewTupleExpr(ProvidedExpr.CreateArray ctxt (Array.ofList args))) | Patterns.TupleGet(arg, n) -> - Some (ProvidedTupleGetExpr (ProvidedExpr.Create ctxt arg, n)) + Some (ProvidedTupleGetExpr (ProvidedExpr.CreateNonNull ctxt arg, n)) | Patterns.NewArray(ty, args) -> - Some (ProvidedNewArrayExpr(ProvidedType.Create ctxt ty, ProvidedExpr.CreateArray ctxt (Array.ofList args))) + Some (ProvidedNewArrayExpr(ProvidedType.CreateNonNull ctxt ty, ProvidedExpr.CreateArray ctxt (Array.ofList args))) | Patterns.Sequential(e1, e2) -> - Some (ProvidedSequentialExpr(ProvidedExpr.Create ctxt e1, ProvidedExpr.Create ctxt e2)) + Some (ProvidedSequentialExpr(ProvidedExpr.CreateNonNull ctxt e1, ProvidedExpr.CreateNonNull ctxt e2)) | Patterns.Lambda(v, body) -> - Some (ProvidedLambdaExpr (ProvidedVar.Create ctxt v, ProvidedExpr.Create ctxt body)) + Some (ProvidedLambdaExpr (ProvidedVar.CreateNonNull ctxt v, ProvidedExpr.CreateNonNull ctxt body)) | Patterns.TryFinally(b1, b2) -> - Some (ProvidedTryFinallyExpr (ProvidedExpr.Create ctxt b1, ProvidedExpr.Create ctxt b2)) + Some (ProvidedTryFinallyExpr (ProvidedExpr.CreateNonNull ctxt b1, ProvidedExpr.CreateNonNull ctxt b2)) | Patterns.TryWith(b, v1, e1, v2, e2) -> - Some (ProvidedTryWithExpr (ProvidedExpr.Create ctxt b, ProvidedVar.Create ctxt v1, ProvidedExpr.Create ctxt e1, ProvidedVar.Create ctxt v2, ProvidedExpr.Create ctxt e2)) -#if PROVIDED_ADDRESS_OF - | Patterns.AddressOf e -> Some (ProvidedAddressOfExpr (ProvidedExpr.Create ctxt e)) -#endif + Some (ProvidedTryWithExpr (ProvidedExpr.CreateNonNull ctxt b, ProvidedVar.CreateNonNull ctxt v1, ProvidedExpr.CreateNonNull ctxt e1, ProvidedVar.CreateNonNull ctxt v2, ProvidedExpr.CreateNonNull ctxt e2)) | Patterns.TypeTest(e, ty) -> - Some (ProvidedTypeTestExpr(ProvidedExpr.Create ctxt e, ProvidedType.Create ctxt ty)) + Some (ProvidedTypeTestExpr(ProvidedExpr.CreateNonNull ctxt e, ProvidedType.CreateNonNull ctxt ty)) | Patterns.Let(v, e, b) -> - Some (ProvidedLetExpr (ProvidedVar.Create ctxt v, ProvidedExpr.Create ctxt e, ProvidedExpr.Create ctxt b)) + Some (ProvidedLetExpr (ProvidedVar.CreateNonNull ctxt v, ProvidedExpr.CreateNonNull ctxt e, ProvidedExpr.CreateNonNull ctxt b)) | Patterns.ForIntegerRangeLoop (v, e1, e2, e3) -> - Some (ProvidedForIntegerRangeLoopExpr (ProvidedVar.Create ctxt v, ProvidedExpr.Create ctxt e1, ProvidedExpr.Create ctxt e2, ProvidedExpr.Create ctxt e3)) + Some (ProvidedForIntegerRangeLoopExpr (ProvidedVar.CreateNonNull ctxt v, ProvidedExpr.CreateNonNull ctxt e1, ProvidedExpr.CreateNonNull ctxt e2, ProvidedExpr.CreateNonNull ctxt e3)) | Patterns.VarSet(v, e) -> - Some (ProvidedVarSetExpr (ProvidedVar.Create ctxt v, ProvidedExpr.Create ctxt e)) + Some (ProvidedVarSetExpr (ProvidedVar.CreateNonNull ctxt v, ProvidedExpr.CreateNonNull ctxt e)) | Patterns.IfThenElse(g, t, e) -> - Some (ProvidedIfThenElseExpr (ProvidedExpr.Create ctxt g, ProvidedExpr.Create ctxt t, ProvidedExpr.Create ctxt e)) + Some (ProvidedIfThenElseExpr (ProvidedExpr.CreateNonNull ctxt g, ProvidedExpr.CreateNonNull ctxt t, ProvidedExpr.CreateNonNull ctxt e)) | Patterns.Var v -> - Some (ProvidedVarExpr (ProvidedVar.Create ctxt v)) + Some (ProvidedVarExpr (ProvidedVar.CreateNonNull ctxt v)) | _ -> None + static member Create ctxt t : ProvidedExpr MaybeNull = + match box t with + | Null -> null + | _ -> ProvidedExpr (t, ctxt) - static member Create ctxt t = match box t with null -> null | _ -> ProvidedExpr (t, ctxt) + static member CreateNonNull ctxt t : ProvidedExpr = + ProvidedExpr (t, ctxt) - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedExpr.Create ctxt) + static member CreateArray ctxt xs : ProvidedExpr[] = + match box xs with + | Null -> [| |] + | _ -> xs |> Array.map (ProvidedExpr.CreateNonNull ctxt) override _.Equals y = match y with :? ProvidedExpr as y -> x.Equals y.Handle | _ -> false override _.GetHashCode() = x.GetHashCode() +#if NO_CHECKNULLS [] +#else +[] +#endif type ProvidedVar (x: Var, ctxt) = member _.Type = x.Type |> ProvidedType.Create ctxt member _.Name = x.Name member _.IsMutable = x.IsMutable member _.Handle = x member _.Context = ctxt - static member Create ctxt t = match box t with null -> null | _ -> ProvidedVar (t, ctxt) - static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedVar.Create ctxt) + + static member CreateNonNull ctxt t = + ProvidedVar (t, ctxt) + + static member CreateArray ctxt xs : ProvidedVar[] = + match box xs with + | Null -> [| |] + | _ -> xs |> Array.map (ProvidedVar.CreateNonNull ctxt) + override _.Equals y = match y with :? ProvidedVar as y -> x.Equals y.Handle | _ -> false + override _.GetHashCode() = x.GetHashCode() /// Get the provided invoker expression for a particular use of a method. let GetInvokerExpression (provider: ITypeProvider, methodBase: ProvidedMethodBase, paramExprs: ProvidedVar[]) = - provider.GetInvokerExpression(methodBase.Handle, [| for p in paramExprs -> Expr.Var p.Handle |]) |> ProvidedExpr.Create methodBase.Context + provider.GetInvokerExpression(methodBase.Handle, [| for p in paramExprs -> Quotations.Expr.Var p.Handle |]) |> ProvidedExpr.Create methodBase.Context /// Compute the Name or FullName property of a provided type, reporting appropriate errors let CheckAndComputeProvidedNameProperty(m, st: Tainted, proj, propertyString) = - let name = + let name : string MaybeNull = try st.PUntaint(proj, m) with :? TypeProviderError as tpe -> let newError = tpe.MapText((fun msg -> FSComp.SR.etProvidedTypeWithNameException(propertyString, msg)), st.TypeProviderDesignation, m) raise newError if String.IsNullOrEmpty name then raise (TypeProviderError(FSComp.SR.etProvidedTypeWithNullOrEmptyName propertyString, st.TypeProviderDesignation, m)) - name + !!name /// Verify that this type provider has supported attributes let ValidateAttributesOfProvidedType (m, st: Tainted) = @@ -978,8 +1112,7 @@ let ValidateAttributesOfProvidedType (m, st: Tainted) = errorR(Error(FSComp.SR.etMustNotBeGeneric fullName, m)) if TryTypeMember(st, fullName, "IsArray", m, false, fun st->st.IsArray) |> unmarshal then errorR(Error(FSComp.SR.etMustNotBeAnArray fullName, m)) - TryTypeMemberNonNull(st, fullName, "GetInterfaces", m, [||], fun st -> st.GetInterfaces()) |> ignore - + TryTypeMemberNonNull(st, fullName, "GetInterfaces", m, [||], fun st -> st.GetInterfaces()) |> ignore /// Verify that a provided type has the expected name let ValidateExpectedName m expectedPath expectedName (st: Tainted) = @@ -987,19 +1120,23 @@ let ValidateExpectedName m expectedPath expectedName (st: Tainted) if name <> expectedName then raise (TypeProviderError(FSComp.SR.etProvidedTypeHasUnexpectedName(expectedName, name), st.TypeProviderDesignation, m)) +#if NO_CHECKNULLS let namespaceName = TryTypeMember(st, name, "Namespace", m, "", fun st -> st.Namespace) |> unmarshal +#else + let namespaceName = TryTypeMember<_, string | null>(st, name, "Namespace", m, "", fun st -> st.Namespace) |> unmarshal // TODO NULLNESS: why is this explicit instantiation needed? +#endif let rec declaringTypes (st: Tainted) accu = match TryTypeMember(st, name, "DeclaringType", m, null, fun st -> st.DeclaringType) with | Tainted.Null -> accu - | dt -> declaringTypes dt (CheckAndComputeProvidedNameProperty(m, dt, (fun dt -> dt.Name), "Name") :: accu) + | Tainted.NonNull dt -> declaringTypes dt (CheckAndComputeProvidedNameProperty(m, dt, (fun dt -> dt.Name), "Name") :: accu) let path = - [| match namespaceName with - | null -> () - | _ -> yield! namespaceName.Split([|'.'|]) - yield! declaringTypes st [] |] - + [| match namespaceName with + | Null -> () + | NonNull namespaceName -> yield! namespaceName.Split([|'.'|]) + yield! declaringTypes st [] |] + if path <> expectedPath then let expectedPath = String.Join(".", expectedPath) let path = String.Join(".", path) @@ -1010,7 +1147,11 @@ let ValidateProvidedTypeAfterStaticInstantiation(m, st: Tainted, e // Do all the calling into st up front with recovery let fullName, namespaceName, usedMembers = let name = CheckAndComputeProvidedNameProperty(m, st, (fun st -> st.Name), "Name") +#if NO_CHECKNULLS let namespaceName = TryTypeMember(st, name, "Namespace", m, FSComp.SR.invalidNamespaceForProvidedType(), fun st -> st.Namespace) |> unmarshal +#else + let namespaceName = TryTypeMember<_, string | null>(st, name, "Namespace", m, FSComp.SR.invalidNamespaceForProvidedType(), fun st -> st.Namespace) |> unmarshal +#endif let fullName = TryTypeMemberNonNull(st, name, "FullName", m, FSComp.SR.invalidFullNameForProvidedType(), fun st -> st.FullName) |> unmarshal ValidateExpectedName m expectedPath expectedName st // Must be able to call (GetMethods|GetEvents|GetProperties|GetNestedTypes|GetConstructors)(bindingFlags). @@ -1035,23 +1176,22 @@ let ValidateProvidedTypeAfterStaticInstantiation(m, st: Tainted, e for mi in usedMembers do match mi with | Tainted.Null -> errorR(Error(FSComp.SR.etNullMember fullName, m)) - | _ -> + | Tainted.NonNull _ -> let memberName = TryMemberMember(mi, fullName, "Name", "Name", m, "invalid provided type member name", fun mi -> mi.Name) |> unmarshal if String.IsNullOrEmpty memberName then errorR(Error(FSComp.SR.etNullOrEmptyMemberName fullName, m)) else let miDeclaringType = TryMemberMember(mi, fullName, memberName, "DeclaringType", m, ProvidedType.CreateNoContext(typeof), fun mi -> mi.DeclaringType) - match miDeclaringType with // Generated nested types may have null DeclaringType | Tainted.Null when mi.OfType().IsSome -> () | Tainted.Null -> errorR(Error(FSComp.SR.etNullMemberDeclaringType(fullName, memberName), m)) - | _ -> + | Tainted.NonNull miDeclaringType -> let miDeclaringTypeFullName = TryMemberMember (miDeclaringType, fullName, memberName, "FullName", m, "invalid declaring type full name", - fun miDeclaringType -> miDeclaringType.FullName) + fun miDeclaringType -> !!miDeclaringType.FullName) |> unmarshal if not (ProvidedType.TaintedEquals (st, miDeclaringType)) then @@ -1064,11 +1204,9 @@ let ValidateProvidedTypeAfterStaticInstantiation(m, st: Tainted, e if not isPublic || isGenericMethod then errorR(Error(FSComp.SR.etMethodHasRequirements(fullName, memberName), m)) | None -> - match mi.OfType() with | Some subType -> ValidateAttributesOfProvidedType(m, subType) | None -> - match mi.OfType() with | Some pi -> // Property must have a getter or setter @@ -1093,8 +1231,8 @@ let ValidateProvidedTypeAfterStaticInstantiation(m, st: Tainted, e | true, false -> errorR(Error(FSComp.SR.etPropertyHasSetterButNoCanWrite(memberName, fullName), m)) if not canRead && not canWrite then errorR(Error(FSComp.SR.etPropertyNeedsCanWriteOrCanRead(memberName, fullName), m)) - | None -> + | None -> match mi.OfType() with | Some ei -> // Event must have adder and remover @@ -1106,11 +1244,9 @@ let ValidateProvidedTypeAfterStaticInstantiation(m, st: Tainted, e | _, Tainted.Null -> errorR(Error(FSComp.SR.etEventNoRemove(memberName, fullName), m)) | _, _ -> () | None -> - match mi.OfType() with | Some _ -> () // TODO: Constructors must be public etc. | None -> - match mi.OfType() with | Some _ -> () // TODO: Fields must be public, literals must have a value etc. | None -> @@ -1120,7 +1256,11 @@ let ValidateProvidedTypeDefinition(m, st: Tainted, expectedPath: s // Validate the Name, Namespace and FullName properties let name = CheckAndComputeProvidedNameProperty(m, st, (fun st -> st.Name), "Name") +#if NO_CHECKNULLS let _namespaceName = TryTypeMember(st, name, "Namespace", m, FSComp.SR.invalidNamespaceForProvidedType(), fun st -> st.Namespace) |> unmarshal +#else + let _namespaceName = TryTypeMember<_, string | null>(st, name, "Namespace", m, FSComp.SR.invalidNamespaceForProvidedType(), fun st -> st.Namespace) |> unmarshal +#endif let _fullname = TryTypeMemberNonNull(st, name, "FullName", m, FSComp.SR.invalidFullNameForProvidedType(), fun st -> st.FullName) |> unmarshal ValidateExpectedName m expectedPath expectedName st @@ -1131,15 +1271,15 @@ let ValidateProvidedTypeDefinition(m, st: Tainted, expectedPath: s | -1 -> () | n -> errorR(Error(FSComp.SR.etIllegalCharactersInTypeName(string expectedName[n], expectedName), m)) - let staticParameters = st.PApplyWithProvider((fun (st, provider) -> st.GetStaticParameters provider), range=m) - if staticParameters.PUntaint((fun a -> a.Length), m) = 0 then + let staticParameters : Tainted = st.PApplyWithProvider((fun (st, provider) -> st.GetStaticParameters provider), range=m) + if staticParameters.PUntaint((fun a -> (nonNull a).Length), m) = 0 then ValidateProvidedTypeAfterStaticInstantiation(m, st, expectedPath, expectedName) /// Resolve a (non-nested) provided type given a full namespace name and a type name. /// May throw an exception which will be turned into an error message by one of the 'Try' function below. /// If resolution is successful the type is then validated. -let ResolveProvidedType (resolver: Tainted, m, moduleOrNamespace: string[], typeName) = +let ResolveProvidedType (resolver: Tainted, m, moduleOrNamespace: string[], typeName) : Tainted = let displayName = String.Join(".", moduleOrNamespace) // Try to find the type in the given provided namespace @@ -1169,7 +1309,7 @@ let ResolveProvidedType (resolver: Tainted, m, moduleOrNamespace: match tryNamespaces providedNamespaces with | None -> resolver.PApply((fun _ -> null), m) | Some res -> res - + /// Try to resolve a type against the given host with the given resolution environment. let TryResolveProvidedType(resolver: Tainted, m, moduleOrNamespace, typeName) = try @@ -1186,14 +1326,14 @@ let ILPathToProvidedType (st: Tainted, m) = match st.PApply((fun st -> st.DeclaringType), m) with | Tainted.Null -> match st.PUntaint((fun st -> st.Namespace), m) with - | Null -> typeName + | Null -> typeName | NonNull ns -> ns + "." + typeName | _ -> typeName let rec encContrib (st: Tainted) = match st.PApply((fun st ->st.DeclaringType), m) with | Tainted.Null -> [] - | enc -> encContrib enc @ [ nameContrib enc ] + | Tainted.NonNull enc -> encContrib enc @ [ nameContrib enc ] encContrib st, nameContrib st @@ -1205,7 +1345,7 @@ let ComputeMangledNameForApplyStaticParameters(nm, staticArgs, staticParams: Tai PrettyNaming.ComputeMangledNameWithoutDefaultArgValues(nm, staticArgs, defaultArgValues) /// Apply the given provided method to the given static arguments (the arguments are assumed to have been sorted into application order) -let TryApplyProvidedMethod(methBeforeArgs: Tainted, staticArgs: obj[], m: range) = +let TryApplyProvidedMethod(methBeforeArgs: Tainted, staticArgs: objnull[], m: range) = if staticArgs.Length = 0 then Some methBeforeArgs else @@ -1214,7 +1354,6 @@ let TryApplyProvidedMethod(methBeforeArgs: Tainted, staticAr let staticParams = methBeforeArgs.PApplyWithProvider((fun (mb, resolver) -> mb.GetStaticParametersForMethod resolver), range=m) let mangledName = ComputeMangledNameForApplyStaticParameters(nm, staticArgs, staticParams, m) mangledName - match methBeforeArgs.PApplyWithProvider((fun (mb, provider) -> mb.ApplyStaticArgumentsForMethod(provider, mangledName, staticArgs)), range=m) with | Tainted.Null -> None | Tainted.NonNull methWithArguments -> @@ -1225,11 +1364,11 @@ let TryApplyProvidedMethod(methBeforeArgs: Tainted, staticAr /// Apply the given provided type to the given static arguments (the arguments are assumed to have been sorted into application order -let TryApplyProvidedType(typeBeforeArguments: Tainted, optGeneratedTypePath: string list option, staticArgs: obj[], m: range) = +let TryApplyProvidedType(typeBeforeArguments: Tainted, optGeneratedTypePath: string list option, staticArgs: objnull[], m: range) = if staticArgs.Length = 0 then Some (typeBeforeArguments, (fun () -> ())) else - + let fullTypePathAfterArguments = // If there is a generated type name, then use that match optGeneratedTypePath with @@ -1238,10 +1377,10 @@ let TryApplyProvidedType(typeBeforeArguments: Tainted, optGenerate // Otherwise, use the full path of the erased type, including mangled arguments let nm = typeBeforeArguments.PUntaint((fun x -> x.Name), m) let enc, _ = ILPathToProvidedType (typeBeforeArguments, m) - let staticParams = typeBeforeArguments.PApplyWithProvider((fun (mb, resolver) -> mb.GetStaticParameters resolver), range=m) + let staticParams : Tainted = typeBeforeArguments.PApplyWithProvider((fun (st, resolver) -> st.GetStaticParameters resolver |> nonNull), range=m) let mangledName = ComputeMangledNameForApplyStaticParameters(nm, staticArgs, staticParams, m) enc @ [ mangledName ] - + match typeBeforeArguments.PApplyWithProvider((fun (typeBeforeArguments, provider) -> typeBeforeArguments.ApplyStaticArguments(provider, Array.ofList fullTypePathAfterArguments, staticArgs)), range=m) with | Tainted.Null -> None | Tainted.NonNull typeWithArguments -> @@ -1255,7 +1394,7 @@ let TryApplyProvidedType(typeBeforeArguments: Tainted, optGenerate /// Given a mangled name reference to a non-nested provided type, resolve it. /// If necessary, demangle its static arguments before applying them. let TryLinkProvidedType(resolver: Tainted, moduleOrNamespace: string[], typeLogicalName: string, range: range) = - + // Demangle the static parameters let typeName, argNamesAndValues = try @@ -1268,7 +1407,7 @@ let TryLinkProvidedType(resolver: Tainted, moduleOrNamespace: str match typeBeforeArguments with | Tainted.Null -> None - | _ -> + | Tainted.NonNull typeBeforeArguments -> // Take the static arguments (as strings, taken from the text in the reference we're relinking), // and convert them to objects of the appropriate type, based on the expected kind. let staticParameters = @@ -1276,7 +1415,7 @@ let TryLinkProvidedType(resolver: Tainted, moduleOrNamespace: str typeBeforeArguments.GetStaticParameters resolver),range=range0) let staticParameters = staticParameters.PApplyArray(id, "", range) - + let staticArgs = staticParameters |> Array.map (fun sp -> let typeBeforeArgumentsName = typeBeforeArguments.PUntaint ((fun st -> st.Name), range) @@ -1288,7 +1427,7 @@ let TryLinkProvidedType(resolver: Tainted, moduleOrNamespace: str sp.PUntaint((fun sp -> let pt = sp.ParameterType let uet = if pt.IsEnum then pt.GetEnumUnderlyingType() else pt - uet.FullName), range) + !!uet.FullName), range) match spReprTypeName with | "System.SByte" -> box (sbyte arg) @@ -1310,11 +1449,11 @@ let TryLinkProvidedType(resolver: Tainted, moduleOrNamespace: str | _ -> if sp.PUntaint ((fun sp -> sp.IsOptional), range) then match sp.PUntaint((fun sp -> sp.RawDefaultValue), range) with - | Null -> error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, typeBeforeArgumentsName, typeBeforeArgumentsName, spName), range0)) - | NonNull v -> v + | null -> error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, typeBeforeArgumentsName, typeBeforeArgumentsName, spName), range0)) + | v -> v else error(Error(FSComp.SR.etProvidedTypeReferenceMissingArgument spName, range0))) - + match TryApplyProvidedType(typeBeforeArguments, None, staticArgs, range0) with | Some (typeWithArguments, checkTypeName) -> @@ -1323,15 +1462,15 @@ let TryLinkProvidedType(resolver: Tainted, moduleOrNamespace: str | None -> None /// Get the parts of a .NET namespace. Special rules: null means global, empty is not allowed. -let GetPartsOfNamespaceRecover(namespaceName: string) = +let GetPartsOfNamespaceRecover(namespaceName: string MaybeNull) = match namespaceName with | Null -> [] | NonNull namespaceName -> if namespaceName.Length = 0 then [""] - else splitNamespace (nonNull namespaceName) + else splitNamespace namespaceName /// Get the parts of a .NET namespace. Special rules: null means global, empty is not allowed. -let GetProvidedNamespaceAsPath (m, resolver: Tainted, namespaceName: string) = +let GetProvidedNamespaceAsPath (m, resolver: Tainted, namespaceName:string MaybeNull) = match namespaceName with | Null -> [] | NonNull namespaceName -> @@ -1344,7 +1483,7 @@ let GetFSharpPathToProvidedType (st: Tainted, range) = // Can't use st.Fullname because it may be like IEnumerable // We want [System;Collections;Generic] let namespaceParts = GetPartsOfNamespaceRecover(st.PUntaint((fun st -> st.Namespace), range)) - let rec walkUpNestedClasses(st: Tainted, soFar) = + let rec walkUpNestedClasses(st: Tainted, soFar) = match st with | Tainted.Null -> soFar | Tainted.NonNull st -> walkUpNestedClasses(st.PApply((fun st ->st.DeclaringType), range), soFar) @ [st.PUntaint((fun st -> st.Name), range)] @@ -1361,8 +1500,8 @@ let GetOriginalILAssemblyRefOfProvidedAssembly (assembly: Tainted, range) = - - let aref = GetOriginalILAssemblyRefOfProvidedAssembly (st.PApply((fun st -> st.Assembly), range), range) + + let aref = GetOriginalILAssemblyRefOfProvidedAssembly (st.PApply((fun st -> nonNull st.Assembly), range), range) // NULLNESS TODO: why is explicit instantiation needed here let scoperef = ILScopeRef.Assembly aref let enc, nm = ILPathToProvidedType (st, range) let tref = ILTypeRef.Create(scoperef, enc, nm) @@ -1381,7 +1520,6 @@ type ProviderGeneratedType = ProviderGeneratedType of ilOrigTyRef: ILTypeRef * i /// names in the statically linked, embedded assembly, plus what types are nested in side what types. type ProvidedAssemblyStaticLinkingMap = { ILTypeMap: Dictionary } - static member CreateNew() = { ILTypeMap = Dictionary() } diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fsi b/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fsi index b1e3ccaf85..c99f2ab377 100755 --- a/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fsi +++ b/src/fcs-fable/src/Compiler/TypedTree/TypeProviders.fsi @@ -9,6 +9,7 @@ module internal rec FSharp.Compiler.TypeProviders open System open System.Collections.Concurrent open System.Collections.Generic +open Internal.Utilities.Library open FSharp.Core.CompilerServices open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.Text @@ -90,7 +91,10 @@ type ProvidedTypeContext = /// Map the TyconRef objects, if any member RemapTyconRefs: (obj -> obj) -> ProvidedTypeContext -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedType = inherit ProvidedMemberInfo @@ -110,7 +114,7 @@ type ProvidedType = member Assembly: ProvidedAssembly - member BaseType: ProvidedType + member BaseType: ProvidedType MaybeNull member GetNestedType: string -> ProvidedType @@ -204,21 +208,24 @@ type ProvidedType = static member TaintedEquals: Tainted * Tainted -> bool +#if NO_CHECKNULLS [] +#endif type IProvidedCustomAttributeProvider = - abstract GetHasTypeProviderEditorHideMethodsAttribute: provider: ITypeProvider -> bool - abstract GetDefinitionLocationAttribute: provider: ITypeProvider -> (string * int * int) option + abstract GetDefinitionLocationAttribute: provider: ITypeProvider -> (string MaybeNull * int * int) option abstract GetXmlDocAttributes: provider: ITypeProvider -> string[] abstract GetAttributeConstructorArgs: provider: ITypeProvider * attribName: string -> (obj option list * (string * obj option) list) option - -[] -type ProvidedAssembly = - + +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedAssembly = member GetName: unit -> System.Reflection.AssemblyName member FullName: string @@ -227,18 +234,23 @@ type ProvidedAssembly = member Handle: System.Reflection.Assembly -[] -type ProvidedMemberInfo = +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedMemberInfo = member Name: string - member DeclaringType: ProvidedType - - interface IProvidedCustomAttributeProvider + member DeclaringType: ProvidedType MaybeNull -[] -type ProvidedMethodBase = + interface IProvidedCustomAttributeProvider +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedMethodBase = inherit ProvidedMemberInfo member IsGenericMethod: bool @@ -273,8 +285,11 @@ type ProvidedMethodBase = static member TaintedEquals: Tainted * Tainted -> bool -[] -type ProvidedMethodInfo = +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedMethodInfo = inherit ProvidedMethodBase @@ -282,8 +297,11 @@ type ProvidedMethodInfo = member MetadataToken: int -[] -type ProvidedParameterInfo = +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedParameterInfo = member Name: string @@ -295,14 +313,17 @@ type ProvidedParameterInfo = member IsOptional: bool - member RawDefaultValue: obj + member RawDefaultValue: objnull member HasDefaultValue: bool interface IProvidedCustomAttributeProvider -[] -type ProvidedFieldInfo = +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedFieldInfo = inherit ProvidedMemberInfo @@ -330,8 +351,11 @@ type ProvidedFieldInfo = static member TaintedEquals: Tainted * Tainted -> bool -[] -type ProvidedPropertyInfo = +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedPropertyInfo = inherit ProvidedMemberInfo @@ -351,8 +375,11 @@ type ProvidedPropertyInfo = static member TaintedEquals: Tainted * Tainted -> bool -[] -type ProvidedEventInfo = +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedEventInfo = inherit ProvidedMemberInfo @@ -366,18 +393,17 @@ type ProvidedEventInfo = static member TaintedEquals: Tainted * Tainted -> bool -[] -type ProvidedConstructorInfo = +[] +#if NO_CHECKNULLS +[] +#endif +type ProvidedConstructorInfo = inherit ProvidedMethodBase type ProvidedExprType = | ProvidedNewArrayExpr of ProvidedType * ProvidedExpr[] -#if PROVIDED_ADDRESS_OF - | ProvidedAddressOfExpr of ProvidedExpr -#endif - | ProvidedNewObjectExpr of ProvidedConstructorInfo * ProvidedExpr[] | ProvidedWhileLoopExpr of ProvidedExpr * ProvidedExpr @@ -415,8 +441,11 @@ type ProvidedExprType = | ProvidedIfThenElseExpr of ProvidedExpr * ProvidedExpr * ProvidedExpr | ProvidedVarExpr of ProvidedVar - -[] + +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedExpr = member Type: ProvidedType @@ -426,7 +455,10 @@ type ProvidedExpr = member GetExprType: unit -> ProvidedExprType option -[] +[] +#if NO_CHECKNULLS +[] +#endif type ProvidedVar = member Type: ProvidedType @@ -450,12 +482,12 @@ val ValidateProvidedTypeAfterStaticInstantiation: /// to check the type name is as expected (this function is called by the caller of TryApplyProvidedType /// after other checks are made). val TryApplyProvidedType: - typeBeforeArguments: Tainted * optGeneratedTypePath: string list option * staticArgs: obj[] * range -> + typeBeforeArguments: Tainted * optGeneratedTypePath: string list option * staticArgs: objnull[] * range -> (Tainted * (unit -> unit)) option /// Try to apply a provided method to the given static arguments. val TryApplyProvidedMethod: - methBeforeArgs: Tainted * staticArgs: obj[] * range -> Tainted option + methBeforeArgs: Tainted * staticArgs: objnull[] * range -> Tainted option /// Try to resolve a type in the given extension type resolver val TryResolveProvidedType: Tainted * range * string[] * typeName: string -> Tainted option diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fs b/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fs index c244a0ab48..496c6023af 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fs @@ -48,8 +48,8 @@ type ValInline = /// Indicates the value must never be inlined by the optimizer | Never - /// Returns true if the implementation of a value must always be inlined - member x.MustInline = + /// Returns true if the implementation of a value should be inlined + member x.ShouldInline = match x with | ValInline.Always -> true | ValInline.Optional | ValInline.Never -> false @@ -90,7 +90,7 @@ type ValBaseOrThisInfo = /// Indicates a normal value | NormalVal - /// Indicates the 'this' value specified in a memberm e.g. 'x' in 'member x.M() = 1' + /// Indicates the 'this' value specified in a member e.g. 'x' in 'member x.M() = 1' | MemberThisVal /// Flags on values @@ -300,7 +300,7 @@ type TyparRigidity = [] type TyparFlags(flags: int32) = - new (kind: TyparKind, rigidity: TyparRigidity, isFromError: bool, isCompGen: bool, staticReq: TyparStaticReq, dynamicReq: TyparDynamicReq, equalityDependsOn: bool, comparisonDependsOn: bool) = + new (kind: TyparKind, rigidity: TyparRigidity, isFromError: bool, isCompGen: bool, staticReq: TyparStaticReq, dynamicReq: TyparDynamicReq, equalityDependsOn: bool, comparisonDependsOn: bool, supportsNullFlex: bool) = TyparFlags((if isFromError then 0b00000000000000010 else 0) ||| (if isCompGen then 0b00000000000000100 else 0) ||| (match staticReq with @@ -321,7 +321,11 @@ type TyparFlags(flags: int32) = | TyparDynamicReq.No -> 0b00000000000000000 | TyparDynamicReq.Yes -> 0b00000010000000000) ||| (if equalityDependsOn then - 0b00000100000000000 else 0)) + 0b00000100000000000 else 0) ||| + // 0b00001000100000000 is being checked by x.Kind, but never set in this version of the code + // 0b00010000000000000 is taken by compat flex + (if supportsNullFlex then + 0b00100000000000000 else 0)) /// Indicates if the type inference variable was generated after an error when type checking expressions or patterns member x.IsFromError = (flags &&& 0b00000000000000010) <> 0x0 @@ -380,8 +384,20 @@ type TyparFlags(flags: int32) = else TyparFlags(flags &&& ~~~0b00010000000000000) + /// Indicates that whether this type parameter is flexible for 'supports null' constraint, e.g. in the case of assignment to a mutable value + member x.IsSupportsNullFlex = + (flags &&& 0b00100000000000000) <> 0x0 + + member x.WithSupportsNullFlex b = + if b then + TyparFlags(flags ||| 0b00100000000000000) + else + TyparFlags(flags &&& ~~~0b00100000000000000) + + + member x.WithStaticReq staticReq = - TyparFlags(x.Kind, x.Rigidity, x.IsFromError, x.IsCompilerGenerated, staticReq, x.DynamicReq, x.EqualityConditionalOn, x.ComparisonConditionalOn) + TyparFlags(x.Kind, x.Rigidity, x.IsFromError, x.IsCompilerGenerated, staticReq, x.DynamicReq, x.EqualityConditionalOn, x.ComparisonConditionalOn, x.IsSupportsNullFlex) /// Get the flags as included in the F# binary metadata. We pickle this as int64 to allow for future expansion member x.PickledBits = flags @@ -519,14 +535,21 @@ type PublicPath = assert (pp.Length >= 1) pp[0..pp.Length-2] +/// Represents the specified visibility of the accessibility -- used to ensure IL visibility +[] +type SyntaxAccess = + | Public + | Internal + | Private + | Unknown /// The information ILXGEN needs about the location of an item -type CompilationPath = - | CompPath of ILScopeRef * (string * ModuleOrNamespaceKind) list +type CompilationPath = + | CompPath of ILScopeRef * SyntaxAccess * (string * ModuleOrNamespaceKind) list - member x.ILScopeRef = let (CompPath(scoref, _)) = x in scoref + member x.ILScopeRef = let (CompPath(scoref, _, _)) = x in scoref - member x.AccessPath = let (CompPath(_, p)) = x in p + member x.AccessPath = let (CompPath(_, _, p)) = x in p member x.MangledPath = List.map fst x.AccessPath @@ -534,10 +557,10 @@ type CompilationPath = member x.ParentCompPath = let a, _ = List.frontAndBack x.AccessPath - CompPath(x.ILScopeRef, a) + CompPath(x.ILScopeRef, x.SyntaxAccess, a) member x.NestedCompPath n moduleKind = - CompPath(x.ILScopeRef, x.AccessPath@[(n, moduleKind)]) + CompPath(x.ILScopeRef, x.SyntaxAccess, x.AccessPath@[(n, moduleKind)]) member x.DemangledPath = x.AccessPath |> List.map (fun (nm, k) -> CompilationPath.DemangleEntityName nm k) @@ -548,6 +571,8 @@ type CompilationPath = | FSharpModuleWithSuffix -> String.dropSuffix nm FSharpModuleSuffix | _ -> nm + member x.SyntaxAccess = let (CompPath(_, access, _)) = x in access + [] type EntityOptionalData = { @@ -1237,7 +1262,7 @@ type Entity = member x.GeneratedHashAndEqualsValues = x.TypeContents.tcaug_equals /// Gets all implicit hash/equals/compare methods added to an F# record, union or struct type definition. - member x.AllGeneratedValues = + member x.AllGeneratedInterfaceImplsAndOverrides = [ match x.GeneratedCompareToValues with | None -> () | Some (vref1, vref2) -> yield vref1; yield vref2 @@ -1249,7 +1274,8 @@ type Entity = | Some (vref1, vref2) -> yield vref1; yield vref2 match x.GeneratedHashAndEqualsWithComparerValues with | None -> () - | Some (vref1, vref2, vref3) -> yield vref1; yield vref2; yield vref3 ] + // vref4 is compiled as a sealed instance member, not an interface impl or an override. + | Some (vref1, vref2, vref3, _) -> yield vref1; yield vref2; yield vref3 ] /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. @@ -1271,7 +1297,7 @@ type Entity = | TProvidedNamespaceRepr _ -> failwith "No compiled representation for provided namespace" | _ -> #endif - let ilTypeRefForCompilationPath (CompPath(sref, p)) item = + let ilTypeRefForCompilationPath (CompPath(sref, _, p)) item = let rec top racc p = match p with | [] -> ILTypeRef.Create(sref, [], textOfPath (List.rev (item :: racc))) @@ -1389,10 +1415,10 @@ type TyconAugmentation = /// of Object.Equals or if the type doesn't override Object.Equals implicitly. mutable tcaug_equals: (ValRef * ValRef) option - /// This is the value implementing the auto-generated comparison + /// This is the value implementing the auto-generated equality /// semantics if any. It is not present if the type defines its own implementation - /// of IStructuralEquatable or if the type doesn't implement IComparable implicitly. - mutable tcaug_hash_and_equals_withc: (ValRef * ValRef * ValRef) option + /// of IStructuralEquatable or if the type doesn't override Object.Equals implicitly. + mutable tcaug_hash_and_equals_withc: (ValRef * ValRef * ValRef * ValRef option) option /// True if the type defined an Object.GetHashCode method. In this /// case we give a warning if we auto-generate a hash method since the semantics may not match up @@ -2138,19 +2164,78 @@ type ModuleOrNamespaceType(kind: ModuleOrNamespaceKind, vals: QueueList, en type ModuleOrNamespace = Entity /// Represents a type or exception definition in the typed AST -type Tycon = Entity +type Tycon = Entity + +let getNameOfScopeRef sref = + match sref with + | ILScopeRef.Local -> "" + | ILScopeRef.Module mref -> mref.Name + | ILScopeRef.Assembly aref -> aref.Name + | ILScopeRef.PrimaryAssembly -> "" + +let private isInternalCompPath x = + match x with + | CompPath(ILScopeRef.Local, _, []) -> true + | _ -> false + +let private (|Public|Internal|Private|) (TAccess p) = + match p with + | [] -> Public + | _ when List.forall isInternalCompPath p -> Internal + | _ -> Private + +let getSyntaxAccessForCompPath (TAccess a) = match a with | CompPath(_, sa, _) :: _ -> sa | _ -> TypedTree.SyntaxAccess.Unknown + +let updateSyntaxAccessForCompPath access syntaxAccess = + match access with + | CompPath(sc, sa, p) :: rest when sa <> syntaxAccess -> ([CompPath(sc, syntaxAccess, p)]@rest) + | _ -> access /// Represents the constraint on access for a construct [] -type Accessibility = - +type Accessibility = /// Indicates the construct can only be accessed from any code in the given type constructor, module or assembly. [] indicates global scope. | TAccess of compilationPaths: CompilationPath list - + + member public x.IsPublic = match x with Public -> true | _ -> false + + member public x.IsInternal = match x with Internal -> true | _ -> false + + member public x.IsPrivate = match x with Private -> true | _ -> false + [] member x.DebugText = x.ToString() - override x.ToString() = "Accessibility(...)" + member x.AsILMemberAccess () = + match getSyntaxAccessForCompPath x with + | TypedTree.SyntaxAccess.Public -> ILMemberAccess.Public + | TypedTree.SyntaxAccess.Internal -> ILMemberAccess.Assembly + | TypedTree.SyntaxAccess.Private -> ILMemberAccess.Private + | _ -> + if x.IsPublic then ILMemberAccess.Public + elif x.IsInternal then ILMemberAccess.Assembly + else ILMemberAccess.Private + + member x.AsILTypeDefAccess () = + if x.IsPublic then ILTypeDefAccess.Public + else ILTypeDefAccess.Private + + member x.CompilationPaths = match x with | TAccess compilationPaths -> compilationPaths + + override x.ToString() = + match x with + | TAccess (paths) -> + let mangledTextOfCompPath (CompPath(scoref, _, path)) = getNameOfScopeRef scoref + "/" + textOfPath (List.map fst path) + let scopename = + if x.IsPublic then "public" + elif x.IsInternal then "internal" + else "private" + let paths = String.concat ";" (List.map mangledTextOfCompPath paths) + if paths = "" then + scopename + else + $"{scopename} {paths}" + /// Represents less-frequently-required data about a type parameter of type inference variable [] @@ -2169,6 +2254,9 @@ type TyparOptionalData = /// The declared attributes of the type parameter. Empty for type inference variables. mutable typar_attribs: Attribs + + /// Set to true if the typar is contravariant, i.e. declared as in C# + mutable typar_is_contravariant: bool } [] @@ -2252,6 +2340,8 @@ type Typar = /// Set whether this type parameter is a compat-flex type parameter (i.e. where "expr :> tp" only emits an optional warning) member x.SetIsCompatFlex b = x.typar_flags <- x.typar_flags.WithCompatFlex b + member x.SetSupportsNullFlex b = x.typar_flags <- x.typar_flags.WithSupportsNullFlex b + /// Indicates whether a type variable can be instantiated by types or units-of-measure. member x.Kind = x.typar_flags.Kind @@ -2268,12 +2358,12 @@ type Typar = member x.SetAttribs attribs = match attribs, x.typar_opt_data with | [], None -> () - | [], Some { typar_il_name = None; typar_xmldoc = doc; typar_constraints = [] } when doc.IsEmpty -> + | [], Some { typar_il_name = None; typar_xmldoc = doc; typar_constraints = []; typar_is_contravariant = false } when doc.IsEmpty -> x.typar_opt_data <- None | _, Some optData -> optData.typar_attribs <- attribs - | _ -> x.typar_opt_data <- Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = attribs } + | _ -> x.typar_opt_data <- Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = attribs; typar_is_contravariant = false } - /// Get the XML documetnation for the type parameter + /// Get the XML documentation for the type parameter member x.XmlDoc = match x.typar_opt_data with | Some optData -> optData.typar_xmldoc @@ -2289,7 +2379,7 @@ type Typar = member x.SetILName il_name = match x.typar_opt_data with | Some optData -> optData.typar_il_name <- il_name - | _ -> x.typar_opt_data <- Some { typar_il_name = il_name; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = [] } + | _ -> x.typar_opt_data <- Some { typar_il_name = il_name; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = []; typar_is_contravariant = false } /// Indicates the display name of a type variable member x.DisplayName = if x.Name = "?" then "?"+string x.Stamp else x.Name @@ -2298,10 +2388,17 @@ type Typar = member x.SetConstraints cs = match cs, x.typar_opt_data with | [], None -> () - | [], Some { typar_il_name = None; typar_xmldoc = doc; typar_attribs = [] } when doc.IsEmpty -> + | [], Some { typar_il_name = None; typar_xmldoc = doc; typar_attribs = [];typar_is_contravariant = false } when doc.IsEmpty -> x.typar_opt_data <- None | _, Some optData -> optData.typar_constraints <- cs - | _ -> x.typar_opt_data <- Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = cs; typar_attribs = [] } + | _ -> x.typar_opt_data <- Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = cs; typar_attribs = []; typar_is_contravariant = false } + + /// Marks the typar as being contravariant + member x.MarkAsContravariant() = + match x.typar_opt_data with + | Some optData -> optData.typar_is_contravariant <- true + | _ -> + x.typar_opt_data <- Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = []; typar_is_contravariant = true } /// Creates a type variable that contains empty data, and is not yet linked. Only used during unpickling of F# metadata. static member NewUnlinked() : Typar = @@ -2323,19 +2420,23 @@ type Typar = x.typar_solution <- tg.typar_solution match tg.typar_opt_data with | Some tg -> - let optData = { typar_il_name = tg.typar_il_name; typar_xmldoc = tg.typar_xmldoc; typar_constraints = tg.typar_constraints; typar_attribs = tg.typar_attribs } + let optData = { typar_il_name = tg.typar_il_name; typar_xmldoc = tg.typar_xmldoc; typar_constraints = tg.typar_constraints; typar_attribs = tg.typar_attribs; typar_is_contravariant = tg.typar_is_contravariant } x.typar_opt_data <- Some optData | None -> () /// Links a previously unlinked type variable to the given data. Only used during unpickling of F# metadata. - member x.AsType = - let ty = x.typar_astype - match box ty with - | null -> - let ty2 = TType_var (x, 0uy) - x.typar_astype <- ty2 - ty2 - | _ -> ty + member x.AsType nullness = + match nullness with + | Nullness.Known NullnessInfo.AmbivalentToNull -> + let ty = x.typar_astype + match box ty with + | null -> + let ty2 = TType_var (x, Nullness.Known NullnessInfo.AmbivalentToNull) + x.typar_astype <- ty2 + ty2 + | _ -> ty + | _ -> + TType_var (x, nullness) /// Indicates if a type variable has been linked. Only used during unpickling of F# metadata. member x.IsLinked = x.typar_stamp <> -1L @@ -2352,12 +2453,12 @@ type Typar = /// Sets the rigidity of a type variable member x.SetRigidity b = let flags = x.typar_flags - x.typar_flags <- TyparFlags(flags.Kind, b, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + x.typar_flags <- TyparFlags(flags.Kind, b, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn, flags.IsSupportsNullFlex) /// Sets whether a type variable is compiler generated member x.SetCompilerGenerated b = let flags = x.typar_flags - x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, b, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, b, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn, flags.IsSupportsNullFlex) /// Sets whether a type variable has a static requirement member x.SetStaticReq b = @@ -2366,17 +2467,17 @@ type Typar = /// Sets whether a type variable is required at runtime member x.SetDynamicReq b = let flags = x.typar_flags - x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, b, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, b, flags.EqualityConditionalOn, flags.ComparisonConditionalOn, flags.IsSupportsNullFlex) /// Sets whether the equality constraint of a type definition depends on this type variable member x.SetEqualityDependsOn b = let flags = x.typar_flags - x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, b, flags.ComparisonConditionalOn) + x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, b, flags.ComparisonConditionalOn, flags.IsSupportsNullFlex) /// Sets whether the comparison constraint of a type definition depends on this type variable member x.SetComparisonDependsOn b = let flags = x.typar_flags - x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, b) + x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, b, flags.IsSupportsNullFlex) [] member x.DebugText = x.ToString() @@ -2396,6 +2497,9 @@ type TyparConstraint = /// A constraint that a type has a 'null' value | SupportsNull of range: range + /// A constraint that a type doesn't support nullness + | NotSupportsNull of range + /// A constraint that a type has a member with the given signature | MayResolveMember of constraintInfo: TraitConstraintInfo * range: range @@ -2427,6 +2531,9 @@ type TyparConstraint = /// A constraint that a type is .NET unmanaged type | IsUnmanaged of range: range + + /// An anti-constraint indicating that ref structs (e.g. Span<>) are allowed here + | AllowsRefStruct of range:range // %+A formatting is used, so this is not needed //[] @@ -2465,29 +2572,41 @@ type TraitWitnessInfo = type TraitConstraintInfo = /// Indicates the signature of a member constraint. Contains a mutable solution cell - /// to store the inferred solution of the constraint. - | TTrait of tys: TTypes * memberName: string * memberFlags: SynMemberFlags * objAndArgTys: TTypes * returnTyOpt: TType option * solution: TraitConstraintSln option ref + /// to store the inferred solution of the constraint. And a mutable source cell to store + /// the name of the type or member that defined the constraint. + | TTrait of + tys: TTypes * + memberName: string * + memberFlags: SynMemberFlags * + objAndArgTys: TTypes * + returnTyOpt: TType option * + source: string option ref * + solution: TraitConstraintSln option ref /// Get the types that may provide solutions for the traits - member x.SupportTypes = (let (TTrait(tys, _, _, _, _, _)) = x in tys) + member x.SupportTypes = (let (TTrait(tys = tys)) = x in tys) /// Get the logical member name associated with the member constraint. - member x.MemberLogicalName = (let (TTrait(_, nm, _, _, _, _)) = x in nm) + member x.MemberLogicalName = (let (TTrait(memberName = nm)) = x in nm) /// Get the member flags associated with the member constraint. - member x.MemberFlags = (let (TTrait(_, _, flags, _, _, _)) = x in flags) - - member x.CompiledObjectAndArgumentTypes = (let (TTrait(_, _, _, objAndArgTys, _, _)) = x in objAndArgTys) - - member x.WithMemberKind(kind) = (let (TTrait(a, b, c, d, e, f)) = x in TTrait(a, b, { c with MemberKind=kind }, d, e, f)) + member x.MemberFlags = (let (TTrait(memberFlags = flags)) = x in flags) + member x.CompiledObjectAndArgumentTypes = (let (TTrait(objAndArgTys = objAndArgTys)) = x in objAndArgTys) + /// Get the optional return type recorded in the member constraint. - member x.CompiledReturnType = (let (TTrait(_, _, _, _, retTy, _)) = x in retTy) - + member x.CompiledReturnType = (let (TTrait(returnTyOpt = retTy)) = x in retTy) + /// Get or set the solution of the member constraint during inference member x.Solution - with get() = (let (TTrait(_, _, _, _, _, sln)) = x in sln.Value) - and set v = (let (TTrait(_, _, _, _, _, sln)) = x in sln.Value <- v) + with get() = (let (TTrait(solution = sln)) = x in sln.Value) + and set v = (let (TTrait(solution = sln)) = x in sln.Value <- v) + + member x.WithMemberKind(kind) = (let (TTrait(a, b, c, d, e, f, g)) = x in TTrait(a, b, { c with MemberKind=kind }, d, e, f, g)) + + member x.WithSupportTypes(tys) = (let (TTrait(_, b, c, d, e, f, g)) = x in TTrait(tys, b, c, d, e, f, g)) + + member x.WithMemberName(name) = (let (TTrait(a, _, c, d, e, f, g)) = x in TTrait(a, name, c, d, e, f, g)) [] member x.DebugText = x.ToString() @@ -2905,8 +3024,8 @@ type Val = /// Determines if the values is implied by another construct, e.g. a `IsA` property is implied by the union case for A member x.IsImplied = x.val_flags.IsImplied - /// Indicates whether the inline declaration for the value indicate that the value must be inlined? - member x.MustInline = x.InlineInfo.MustInline + /// Indicates whether the inline declaration for the value indicate that the value should be inlined? + member x.ShouldInline = x.InlineInfo.ShouldInline /// Indicates whether this value was generated by the compiler. /// @@ -2992,7 +3111,7 @@ type Val = // - in opt.fs: when compiling fslib, we bind an entry for the value in a global table (see bind_escaping_local_vspec) // - in ilxgen.fs: when compiling fslib, we bind an entry for the value in a global table (see bind_escaping_local_vspec) // - in opt.fs: (fullDebugTextOfValRef) for error reporting of non-inlinable values - // - in service.fs (boutput_item_description): to display the full text of a value's binding location + // - in service.fs (output_item_description): to display the full text of a value's binding location // - in check.fs: as a boolean to detect public values for saving quotations // - in ilxgen.fs: as a boolean to detect public values for saving quotations // - in MakeExportRemapping, to build non-local references for values @@ -3287,7 +3406,7 @@ type NonLocalValOrMemberRef = member x.DebugText = x.ToString() /// For debugging - override x.ToString() = x.EnclosingEntity.nlr.ToString() + "::" + x.ItemKey.PartialKey.LogicalName + override x.ToString() = !! x.EnclosingEntity.nlr.ToString() + "::" + x.ItemKey.PartialKey.LogicalName /// Represents the path information for a reference to a value or member in another assembly, disassociated /// from any particular reference. @@ -4064,7 +4183,7 @@ type ValRef = member x.InlineIfLambda = x.Deref.InlineIfLambda /// Indicates whether the inline declaration for the value indicate that the value must be inlined? - member x.MustInline = x.Deref.MustInline + member x.ShouldInline = x.Deref.ShouldInline /// Indicates whether this value was generated by the compiler. /// @@ -4214,6 +4333,72 @@ type RecdFieldRef = override x.ToString() = x.FieldName +[] +type Nullness = + | Known of NullnessInfo + | Variable of NullnessVar + + member n.Evaluate() = + match n with + | Known info -> info + | Variable v -> v.Evaluate() + + member n.TryEvaluate() = + match n with + | Known info -> ValueSome info + | Variable v -> v.TryEvaluate() + + override n.ToString() = match n.Evaluate() with NullnessInfo.WithNull -> "?" | NullnessInfo.WithoutNull -> "" | NullnessInfo.AmbivalentToNull -> "%" + + member n.ToFsharpCodeString() = match n.Evaluate() with NullnessInfo.WithNull -> " | null " | NullnessInfo.WithoutNull -> "" | NullnessInfo.AmbivalentToNull -> "" + +// Note, nullness variables are only created if the nullness checking feature is on +[] +type NullnessVar() = + let mutable solution: Nullness option = None + + member nv.Evaluate() = + match solution with + | None -> NullnessInfo.WithoutNull + | Some soln -> soln.Evaluate() + + member nv.TryEvaluate() = + match solution with + | None -> ValueNone + | Some soln -> soln.TryEvaluate() + + member nv.IsSolved = solution.IsSome + + member nv.IsFullySolved = + match solution with + | None -> false + | Some (Nullness.Known _) -> true + | Some (Nullness.Variable v) -> v.IsFullySolved + + member nv.Set(nullness) = + assert (not nv.IsSolved) + solution <- Some nullness + + member nv.Unset() = + assert nv.IsSolved + solution <- None + + member nv.Solution = + assert nv.IsSolved + solution.Value + +[] +type NullnessInfo = + + /// we know that there is an extra null value in the type + | WithNull + + /// we know that there is no extra null value in the type + | WithoutNull + + /// we know we don't care + | AmbivalentToNull + /// Represents a type in the typed abstract syntax [] type TType = @@ -4221,10 +4406,10 @@ type TType = /// Indicates the type is a universal type, only used for types of values and members | TType_forall of typars: Typars * bodyTy: TType - /// Indicates the type is built from a named type and a number of type arguments. + /// TType_app(tyconRef, typeInstantiation, nullness). /// - /// 'flags' is a placeholder for future features, in particular nullness analysis - | TType_app of tyconRef: TyconRef * typeInstantiation: TypeInst * flags: byte + /// Indicates the type is built from a named type and a number of type arguments + | TType_app of tyconRef: TyconRef * typeInstantiation: TypeInst * nullness: Nullness /// Indicates the type is an anonymous record type whose compiled representation is located in the given assembly | TType_anon of anonInfo: AnonRecdTypeInfo * tys: TType list @@ -4232,10 +4417,10 @@ type TType = /// Indicates the type is a tuple type. elementTypes must be of length 2 or greater. | TType_tuple of tupInfo: TupInfo * elementTypes: TTypes - /// Indicates the type is a function type. + /// TType_fun(domainType, rangeType, nullness). /// - /// 'flags' is a placeholder for future features, in particular nullness analysis. - | TType_fun of domainType: TType * rangeType: TType * flags: byte + /// Indicates the type is a function type + | TType_fun of domainType: TType * rangeType: TType * nullness: Nullness /// Indicates the type is a non-F#-visible type representing a "proof" that a union value belongs to a particular union case /// These types are not user-visible and will never appear as an inferred type. They are the types given to @@ -4243,9 +4428,7 @@ type TType = | TType_ucase of unionCaseRef: UnionCaseRef * typeInstantiation: TypeInst /// Indicates the type is a variable type, whether declared, generalized or an inference type parameter - /// - /// 'flags' is a placeholder for future features, in particular nullness analysis - | TType_var of typar: Typar * flags: byte + | TType_var of typar: Typar * nullness: Nullness /// Indicates the type is a unit-of-measure expression being used as an argument to a type or member | TType_measure of measure: Measure @@ -4271,18 +4454,18 @@ type TType = override x.ToString() = match x with | TType_forall (_tps, ty) -> "forall ... " + ty.ToString() - | TType_app (tcref, tinst, _) -> tcref.DisplayName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") + | TType_app (tcref, tinst, nullness) -> tcref.DisplayName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") + nullness.ToString() | TType_tuple (tupInfo, tinst) -> (match tupInfo with | TupInfo.Const false -> "" | TupInfo.Const true -> "struct ") - + String.concat "," (List.map string tinst) + + String.concat "," (List.map string tinst) + ")" | TType_anon (anonInfo, tinst) -> (match anonInfo.TupInfo with | TupInfo.Const false -> "" | TupInfo.Const true -> "struct ") + "{|" + String.concat "," (Seq.map2 (fun nm ty -> nm + " " + string ty + ";") anonInfo.SortedNames tinst) + "|}" - | TType_fun (domainTy, retTy, _) -> "(" + string domainTy + " -> " + string retTy + ")" + | TType_fun (domainTy, retTy, nullness) -> "(" + string domainTy + " -> " + string retTy + ")" + nullness.ToString() | TType_ucase (uc, tinst) -> "ucase " + uc.CaseName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") | TType_var (tp, _) -> match tp.Solution with @@ -4363,7 +4546,7 @@ type AnonRecdTypeInfo = x.SortedNames <- sortedNames x.IlTypeName <- d.IlTypeName - member x.IsLinked = (match x.SortedIds with null -> true | _ -> false) + member x.IsLinked = (match box x.SortedIds with null -> true | _ -> false) member x.DisplayNameCoreByIdx idx = x.SortedNames[idx] @@ -4564,6 +4747,17 @@ type DecisionTreeCase = member x.DebugText = x.ToString() override x.ToString() = sprintf "DecisionTreeCase(...)" + +[] +type ActivePatternReturnKind = + | RefTypeWrapper + | StructTypeWrapper + | Boolean + member this.IsStruct with get () = + match this with + | RefTypeWrapper -> false + | StructTypeWrapper + | Boolean -> true [] type DecisionTreeTest = @@ -4584,20 +4778,20 @@ type DecisionTreeTest = /// Test if the input to a decision tree is an instance of the given type | IsInst of source: TType * target: TType - /// Test.ActivePatternCase(activePatExpr, activePatResTys, isStructRetTy, activePatIdentity, idx, activePatInfo) + /// Test.ActivePatternCase(activePatExpr, activePatResTys, activePatRetKind, activePatIdentity, idx, activePatInfo) /// /// Run the active pattern and bind a successful result to a /// variable in the remaining tree. /// activePatExpr -- The active pattern function being called, perhaps applied to some active pattern parameters. /// activePatResTys -- The result types (case types) of the active pattern. - /// isStructRetTy -- Is the active pattern a struct return + /// activePatRetKind -- Indicating what is returning from the active pattern /// activePatIdentity -- The value and the types it is applied to. If there are any active pattern parameters then this is empty. /// idx -- The case number of the active pattern which the test relates to. /// activePatternInfo -- The extracted info for the active pattern. | ActivePatternCase of activePatExpr: Expr * activePatResTys: TTypes * - isStructRetTy: bool * + activePatRetKind: ActivePatternReturnKind * activePatIdentity: (ValRef * TypeInst) option * idx: int * activePatternInfo: ActivePatternInfo @@ -4615,7 +4809,7 @@ type DecisionTreeTest = /// -- boundVals - The values bound at the target, matching the valuesin the TDSuccess /// -- targetExpr - The expression to evaluate if we branch to the target /// -- debugPoint - The debug point for the target -/// -- isStateVarFlags - Indicates which, if any, of the values are repesents as state machine variables +/// -- isStateVarFlags - Indicates which, if any, of the values are represents as state machine variables [] type DecisionTreeTarget = | TTarget of @@ -4666,7 +4860,7 @@ type ActivePatternElemRef = activePatternInfo: ActivePatternInfo * activePatternVal: ValRef * caseIndex: int * - isStructRetTy: bool + activePatRetKind: ActivePatternReturnKind /// Get the full information about the active pattern being referred to member x.ActivePatternInfo = (let (APElemRef(info, _, _, _)) = x in info) @@ -4675,7 +4869,7 @@ type ActivePatternElemRef = member x.ActivePatternVal = (let (APElemRef(_, vref, _, _)) = x in vref) /// Get a reference to the value for the active pattern being referred to - member x.IsStructReturn = (let (APElemRef(_, _, _, isStructRetTy)) = x in isStructRetTy) + member x.ActivePatternRetKind = (let (APElemRef(_, _, _, activePatRetKind)) = x in activePatRetKind) /// Get the index of the active pattern element within the overall active pattern member x.CaseIndex = (let (APElemRef(_, _, n, _)) = x in n) @@ -4938,11 +5132,11 @@ type Expr = override expr.ToString() = expr.ToDebugString(3) - member expr.ToDebugString(depth: int) = + member expr.ToDebugString(depth: int) : string = if depth = 0 then ".." else let depth = depth - 1 match expr with - | Const (c, _, _) -> c.ToString() + | Const (c, _, _) -> string c | Val (v, _, _) -> v.LogicalName | Sequential (e1, e2, _, _) -> "Sequential(" + e1.ToDebugString(depth) + ", " + e2.ToDebugString(depth) + ")" | Lambda (_, _, _, vs, body, _, _) -> sprintf "Lambda(%+A, " vs + body.ToDebugString(depth) + ")" @@ -5521,13 +5715,13 @@ module CcuTypeForwarderTable = if remainingPath.Count = 0 then finalKey else - remainingPath.Array.[remainingPath.Offset] + (!!remainingPath.Array).[remainingPath.Offset] match nodes.TryGetValue searchTerm with | true, innerTree -> if remainingPath.Count = 0 then innerTree.Value else - findInTree (ArraySegment(remainingPath.Array, remainingPath.Offset + 1, remainingPath.Count - 1)) finalKey innerTree + findInTree (ArraySegment((!!remainingPath.Array), remainingPath.Offset + 1, remainingPath.Count - 1)) finalKey innerTree | false, _ -> None /// Represents a table of .NET CLI type forwarders for an assembly @@ -5571,12 +5765,12 @@ type CcuThunk = /// Dereference the assembly reference member ccu.Deref = - if isNull (ccu.target :> obj) then + if isNull (box ccu.target) then raise(UnresolvedReferenceNoRange ccu.name) ccu.target /// Indicates if this assembly reference is unresolved - member ccu.IsUnresolvedReference = isNull (ccu.target :> obj) + member ccu.IsUnresolvedReference = isNull (box ccu.target) /// Ensure the ccu is derefable in advance. Supply a path to attach to any resulting error message. member ccu.EnsureDerefable(requiringPath: string[]) = @@ -5674,7 +5868,7 @@ type CcuThunk = [] member x.DebugText = x.ToString() - /// Used at the end of comppiling an assembly to get a frozen, final stable CCU + /// Used at the end of compiling an assembly to get a frozen, final stable CCU /// for the compilation which we no longer mutate. member x.CloneWithFinalizedContents(ccuContents) = { x with target = { x.target with Contents = ccuContents } } @@ -5837,7 +6031,7 @@ type Construct() = let lazyBaseTy = LazyWithContext.Create ((fun (m, objTy) -> - let baseSystemTy = st.PApplyOption((fun st -> match st.BaseType with null -> None | ty -> Some ty), m) + let baseSystemTy = st.PApplyOption((fun st -> match st.BaseType with null -> None | ty -> Some (ty)), m) match baseSystemTy with | None -> objTy | Some t -> importProvidedType t), @@ -5851,7 +6045,9 @@ type Construct() = IsDelegate = (fun () -> st.PUntaint((fun st -> let baseType = st.BaseType match baseType with - | null -> false + | Null -> false + | NonNull x -> + match x with | x when x.IsGenericType -> false | x when x.DeclaringType <> null -> false | x -> x.FullName = "System.Delegate" || x.FullName = "System.MulticastDelegate"), m)) @@ -5886,7 +6082,7 @@ type Construct() = | None -> let ilScopeRef = st.TypeProviderAssemblyRef let enclosingName = GetFSharpPathToProvidedType(st, m) - CompPath(ilScopeRef, enclosingName |> List.map(fun id->id, ModuleOrNamespaceKind.Namespace true)) + CompPath(ilScopeRef, SyntaxAccess.Unknown, enclosingName |> List.map(fun id->id, ModuleOrNamespaceKind.Namespace true)) | Some p -> p let pubpath = cpath.NestedPublicPath id @@ -5970,13 +6166,13 @@ type Construct() = Typar.New { typar_id = id typar_stamp = newStamp() - typar_flags= TyparFlags(kind, rigid, isFromError, isCompGen, staticReq, dynamicReq, eqDep, compDep) + typar_flags= TyparFlags(kind, rigid, isFromError, isCompGen, staticReq, dynamicReq, eqDep, compDep, false) typar_solution = None typar_astype = Unchecked.defaultof<_> typar_opt_data = match attribs with | [] -> None - | _ -> Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = attribs } } + | _ -> Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = attribs; typar_is_contravariant = false } } /// Create a new type parameter node for a declared type parameter static member NewRigidTypar nm m = @@ -6115,7 +6311,7 @@ type Construct() = /// Create the new contents of an overall assembly static member NewCcuContents sref m nm mty = - Construct.NewModuleOrNamespace (Some(CompPath(sref, []))) taccessPublic (ident(nm, m)) XmlDoc.Empty [] (MaybeLazy.Strict mty) + Construct.NewModuleOrNamespace (Some(CompPath(sref, SyntaxAccess.Unknown, []))) taccessPublic (ident(nm, m)) XmlDoc.Empty [] (MaybeLazy.Strict mty) /// Create a tycon based on an existing one using the function 'f'. /// We require that we be given the new parent for the new tycon. @@ -6153,10 +6349,10 @@ type Construct() = static member ComputeDefinitionLocationOfProvidedItem<'T when 'T :> IProvidedCustomAttributeProvider> (p: Tainted<'T>) : range option = let attrs = p.PUntaintNoFailure(fun x -> x.GetDefinitionLocationAttribute(p.TypeProvider.PUntaintNoFailure id)) match attrs with - | None | Some (null, _, _) -> None - | Some (filePath, line, column) -> + | None | Some (Null, _, _) -> None + | Some (NonNull filePath, line, column) -> // Coordinates from type provider are 1-based for lines and columns // Coordinates internally in the F# compiler are 1-based for lines and 0-based for columns let pos = Position.mkPos line (max 0 (column - 1)) - mkRange filePath pos pos |> Some + mkRange !!filePath pos pos |> Some #endif diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fsi b/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fsi index 3489535158..d2410571e9 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fsi +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTree.fsi @@ -19,6 +19,8 @@ open FSharp.Compiler.TypeProviders open FSharp.Compiler.Xml open FSharp.Core.CompilerServices +val getNameOfScopeRef: sref: ILScopeRef -> string + type Stamp = int64 type StampMap<'T> = Map @@ -36,7 +38,7 @@ type ValInline = | Never /// Returns true if the implementation of a value must always be inlined - member MustInline: bool + member ShouldInline: bool /// A flag associated with values that indicates whether the recursive scope of the value is currently being processed, type /// if the value has been generalized or not as yet. @@ -205,7 +207,8 @@ type TyparFlags = staticReq: Syntax.TyparStaticReq * dynamicReq: TyparDynamicReq * equalityDependsOn: bool * - comparisonDependsOn: bool -> + comparisonDependsOn: bool * + supportsNullFlex: bool -> TyparFlags new: flags: int32 -> TyparFlags @@ -232,6 +235,9 @@ type TyparFlags = /// Indicates if the type inference variable was generated after an error when type checking expressions or patterns member IsFromError: bool + /// Indicates whether this type parameter is flexible for 'supports null' constraint, e.g. in the case of assignment to a mutable value + member IsSupportsNullFlex: bool + /// Indicates whether a type variable can be instantiated by types or units-of-measure. member Kind: TyparKind @@ -322,9 +328,17 @@ type PublicPath = member EnclosingPath: string[] +/// Represents the specified visibility of the accessibility -- used to ensure IL visibility +[] +type SyntaxAccess = + | Public + | Internal + | Private + | Unknown + /// The information ILXGEN needs about the location of an item type CompilationPath = - | CompPath of ILScopeRef * (string * ModuleOrNamespaceKind) list + | CompPath of ILScopeRef * SyntaxAccess * (string * ModuleOrNamespaceKind) list /// String 'Module' off an F# module name, if FSharpModuleWithSuffix is used static member DemangleEntityName: nm: string -> k: ModuleOrNamespaceKind -> string @@ -343,6 +357,8 @@ type CompilationPath = member ParentCompPath: CompilationPath + member SyntaxAccess: SyntaxAccess + [] type EntityOptionalData = { @@ -498,7 +514,7 @@ type Entity = member AllFieldsAsList: RecdField list /// Gets all implicit hash/equals/compare methods added to an F# record, union or struct type definition. - member AllGeneratedValues: ValRef list + member AllGeneratedInterfaceImplsAndOverrides: ValRef list /// Get a list of all instance fields for F#-defined record, struct type class fields in this type definition. /// including hidden fields from the compilation of implicit class constructions. @@ -577,7 +593,7 @@ type Entity = member GeneratedHashAndEqualsValues: (ValRef * ValRef) option /// Gets any implicit hash/equals (with comparer argument) methods added to an F# record, union or struct type definition. - member GeneratedHashAndEqualsWithComparerValues: (ValRef * ValRef * ValRef) option + member GeneratedHashAndEqualsWithComparerValues: (ValRef * ValRef * ValRef * ValRef option) option /// Indicates if we have pre-determined that a type definition has a self-referential constructor using 'as x' member HasSelfReferentialConstructor: bool @@ -835,10 +851,10 @@ type TyconAugmentation = /// of Object.Equals or if the type doesn't override Object.Equals implicitly. mutable tcaug_equals: (ValRef * ValRef) option - /// This is the value implementing the auto-generated comparison + /// This is the value implementing the auto-generated equality /// semantics if any. It is not present if the type defines its own implementation - /// of IStructuralEquatable or if the type doesn't implement IComparable implicitly. - mutable tcaug_hash_and_equals_withc: (ValRef * ValRef * ValRef) option + /// of IStructuralEquatable or if the type doesn't override Object.Equals implicitly. + mutable tcaug_hash_and_equals_withc: (ValRef * ValRef * ValRef * ValRef option) option /// True if the type defined an Object.GetHashCode method. In this /// case we give a warning if we auto-generate a hash method since the semantics may not match up @@ -875,7 +891,7 @@ type TyconAugmentation = member SetHasObjectGetHashCode: b: bool -> unit - member SetHashAndEqualsWith: x: (ValRef * ValRef * ValRef) -> unit + member SetHashAndEqualsWith: x: (ValRef * ValRef * ValRef * ValRef option) -> unit override ToString: unit -> string @@ -1426,6 +1442,8 @@ type ModuleOrNamespace = Entity /// Represents a type or exception definition in the typed AST type Tycon = Entity +val updateSyntaxAccessForCompPath: CompilationPath list -> TypedTree.SyntaxAccess -> CompilationPath list + /// Represents the constraint on access for a construct [] type Accessibility = @@ -1433,6 +1451,19 @@ type Accessibility = /// Indicates the construct can only be accessed from any code in the given type constructor, module or assembly. [] indicates global scope. | TAccess of compilationPaths: CompilationPath list + member AsILMemberAccess: unit -> ILMemberAccess + + member AsILTypeDefAccess: unit -> ILTypeDefAccess + + member CompilationPaths: CompilationPath list + + member IsPublic: bool + + member IsInternal: bool + + member IsPrivate: bool + + /// Readable rendering of Accessibility override ToString: unit -> string [] @@ -1456,6 +1487,9 @@ type TyparOptionalData = /// The declared attributes of the type parameter. Empty for type inference variables. mutable typar_attribs: Attribs + + /// Set to true if the typar is contravariant, i.e. declared as in C# + mutable typar_is_contravariant: bool } override ToString: unit -> string @@ -1512,6 +1546,9 @@ type Typar = /// Adjusts the constraints associated with a type variable member SetConstraints: cs: TyparConstraint list -> unit + /// Marks the typar as being contravariant + member MarkAsContravariant: unit -> unit + /// Sets whether a type variable is required at runtime member SetDynamicReq: b: TyparDynamicReq -> unit @@ -1527,6 +1564,9 @@ type Typar = /// Set whether this type parameter is a compat-flex type parameter (i.e. where "expr :> tp" only emits an optional warning) member SetIsCompatFlex: b: bool -> unit + /// Set whether this type parameter is flexible for 'supports null' constraint, e.g. in the case of assignment to a mutable value + member SetSupportsNullFlex: b: bool -> unit + /// Sets the rigidity of a type variable member SetRigidity: b: TyparRigidity -> unit @@ -1536,7 +1576,7 @@ type Typar = override ToString: unit -> string /// Links a previously unlinked type variable to the given data. Only used during unpickling of F# metadata. - member AsType: TType + member AsType: nullness: Nullness -> TType /// The declared attributes of the type parameter. Empty for type inference variables type parameters from .NET. member Attribs: Attribs @@ -1605,7 +1645,7 @@ type Typar = /// Indicates if the type variable has a static "head type" requirement, i.e. ^a variables used in FSharp.Core type member constraints. member StaticReq: Syntax.TyparStaticReq - /// Get the XML documetnation for the type parameter + /// Get the XML documentation for the type parameter member XmlDoc: XmlDoc /// Represents a constraint on a type parameter or type @@ -1621,6 +1661,9 @@ type TyparConstraint = /// A constraint that a type has a 'null' value | SupportsNull of range: range + /// A constraint that a type doesn't support nullness + | NotSupportsNull of range + /// A constraint that a type has a member with the given signature | MayResolveMember of constraintInfo: TraitConstraintInfo * range: range @@ -1653,6 +1696,9 @@ type TyparConstraint = /// A constraint that a type is .NET unmanaged type | IsUnmanaged of range: range + /// An anti-constraint indicating that ref structs (e.g. Span<>) are allowed here + | AllowsRefStruct of range: range + override ToString: unit -> string #if FABLE_COMPILER @@ -1690,13 +1736,15 @@ type TraitWitnessInfo = type TraitConstraintInfo = /// Indicates the signature of a member constraint. Contains a mutable solution cell - /// to store the inferred solution of the constraint. + /// to store the inferred solution of the constraint. And a mutable source cell to store + /// the name of the type or member that defined the constraint. | TTrait of tys: TTypes * memberName: string * memberFlags: Syntax.SynMemberFlags * objAndArgTys: TTypes * returnTyOpt: TType option * + source: string option ref * solution: TraitConstraintSln option ref override ToString: unit -> string @@ -1731,6 +1779,10 @@ type TraitConstraintInfo = /// the extension property MemberDisplayNameCore member WithMemberKind: SynMemberKind -> TraitConstraintInfo + member WithSupportTypes: TTypes -> TraitConstraintInfo + + member WithMemberName: string -> TraitConstraintInfo + /// Represents the solution of a member constraint during inference. [] type TraitConstraintSln = @@ -2161,8 +2213,8 @@ type Val = /// a true body. These cases are often causes of bugs in the compiler. member MemberInfo: ValMemberInfo option - /// Indicates whether the inline declaration for the value indicate that the value must be inlined? - member MustInline: bool + /// Indicates whether the inline declaration for the value indicates that the value should be inlined. + member ShouldInline: bool /// Get the number of 'this'/'self' object arguments for the member. Instance extension members return '1'. member NumObjArgs: int @@ -2479,7 +2531,7 @@ type EntityRef = member GeneratedHashAndEqualsValues: (ValRef * ValRef) option /// Gets any implicit hash/equals (with comparer argument) methods added to an F# record, union or struct type definition. - member GeneratedHashAndEqualsWithComparerValues: (ValRef * ValRef * ValRef) option + member GeneratedHashAndEqualsWithComparerValues: (ValRef * ValRef * ValRef * ValRef option) option /// Indicates if we have pre-determined that a type definition has a self-referential constructor using 'as x' member HasSelfReferentialConstructor: bool @@ -2876,8 +2928,8 @@ type ValRef = /// Is this a member, if so some more data about the member. member MemberInfo: ValMemberInfo option - /// Indicates whether the inline declaration for the value indicate that the value must be inlined? - member MustInline: bool + /// Indicates whether the inline declaration for the value indicate that the value should be inlined? + member ShouldInline: bool /// Get the number of 'this'/'self' object arguments for the member. Instance extension members return '1'. member NumObjArgs: int @@ -3031,6 +3083,40 @@ type RecdFieldRef = /// Get a reference to the type containing this record field member TyconRef: TyconRef +[] +type NullnessInfo = + + /// we know that there is an extra null value in the type + | WithNull + + /// we know that there is no extra null value in the type + | WithoutNull + + /// we know we don't care + | AmbivalentToNull + +[] +type Nullness = + | Known of NullnessInfo + | Variable of NullnessVar + + member Evaluate: unit -> NullnessInfo + + member TryEvaluate: unit -> NullnessInfo voption + + member ToFsharpCodeString: unit -> string + +[] +type NullnessVar = + new: unit -> NullnessVar + member Evaluate: unit -> NullnessInfo + member TryEvaluate: unit -> NullnessInfo voption + member IsSolved: bool + member IsFullySolved: bool + member Set: Nullness -> unit + member Unset: unit -> unit + member Solution: Nullness + /// Represents a type in the typed abstract syntax [] type TType = @@ -3038,10 +3124,10 @@ type TType = /// Indicates the type is a universal type, only used for types of values type members | TType_forall of typars: Typars * bodyTy: TType - /// Indicates the type is built from a named type type a number of type arguments. + /// Indicates the type is built from a named type and a number of type arguments. /// /// 'flags' is a placeholder for future features, in particular nullness analysis - | TType_app of tyconRef: TyconRef * typeInstantiation: TypeInst * flags: byte + | TType_app of tyconRef: TyconRef * typeInstantiation: TypeInst * nullness: Nullness /// Indicates the type is an anonymous record type whose compiled representation is located in the given assembly | TType_anon of anonInfo: AnonRecdTypeInfo * tys: TType list @@ -3052,7 +3138,7 @@ type TType = /// Indicates the type is a function type. /// /// 'flags' is a placeholder for future features, in particular nullness analysis. - | TType_fun of domainType: TType * rangeType: TType * flags: byte + | TType_fun of domainType: TType * rangeType: TType * nullness: Nullness /// Indicates the type is a non-F#-visible type representing a "proof" that a union value belongs to a particular union case /// These types are not user-visible type will never appear as an inferred type. They are the types given to @@ -3062,14 +3148,14 @@ type TType = /// Indicates the type is a variable type, whether declared, generalized or an inference type parameter /// /// 'flags' is a placeholder for future features, in particular nullness analysis - | TType_var of typar: Typar * flags: byte + | TType_var of typar: Typar * nullness: Nullness /// Indicates the type is a unit-of-measure expression being used as an argument to a type or member | TType_measure of measure: Measure /// For now, used only as a discriminant in error message. /// See https://github.com/dotnet/fsharp/issues/2561 - member GetAssemblyName: unit -> string + member GetAssemblyName: unit -> string MaybeNull override ToString: unit -> string @@ -3273,6 +3359,18 @@ type DecisionTreeCase = /// Get the discriminator associated with the case member Discriminator: DecisionTreeTest +/// Indicating what is returning from an AP +[] +type ActivePatternReturnKind = + /// Returning `_ option` or `Choice<_, _, .., _>` + | RefTypeWrapper + /// Returning `_ voption` + | StructTypeWrapper + /// Returning bool + | Boolean + + member IsStruct: bool + [] type DecisionTreeTest = @@ -3293,20 +3391,20 @@ type DecisionTreeTest = /// Test if the input to a decision tree is an instance of the given type | IsInst of source: TType * target: TType - /// Test.ActivePatternCase(activePatExpr, activePatResTys, isStructRetTy, activePatIdentity, idx, activePatInfo) + /// Test.ActivePatternCase(activePatExpr, activePatResTys, activePatRetKind, activePatIdentity, idx, activePatInfo) /// /// Run the active pattern type bind a successful result to a /// variable in the remaining tree. /// activePatExpr -- The active pattern function being called, perhaps applied to some active pattern parameters. /// activePatResTys -- The result types (case types) of the active pattern. - /// isStructRetTy -- Is the active pattern a struct return + /// activePatRetKind -- Indicating what is returning from the active pattern /// activePatIdentity -- The value type the types it is applied to. If there are any active pattern parameters then this is empty. /// idx -- The case number of the active pattern which the test relates to. /// activePatternInfo -- The extracted info for the active pattern. | ActivePatternCase of activePatExpr: Expr * activePatResTys: TTypes * - isStructRetTy: bool * + activePatRetKind: ActivePatternReturnKind * activePatIdentity: (ValRef * TypeInst) option * idx: int * activePatternInfo: Syntax.PrettyNaming.ActivePatternInfo @@ -3320,7 +3418,7 @@ type DecisionTreeTest = /// -- boundVals - The values bound at the target, matching the valuesin the TDSuccess /// -- targetExpr - The expression to evaluate if we branch to the target /// -- debugPoint - The debug point for the target -/// -- isStateVarFlags - Indicates which, if any, of the values are repesents as state machine variables +/// -- isStateVarFlags - Indicates which, if any, of the values are represents as state machine variables [] type DecisionTreeTarget = | TTarget of boundVals: Val list * targetExpr: Expr * isStateVarFlags: bool list option @@ -3365,7 +3463,7 @@ type ActivePatternElemRef = activePatternInfo: Syntax.PrettyNaming.ActivePatternInfo * activePatternVal: ValRef * caseIndex: int * - isStructRetTy: bool + activePatRetKind: ActivePatternReturnKind override ToString: unit -> string @@ -3382,7 +3480,7 @@ type ActivePatternElemRef = member DebugText: string /// Get a reference to the value for the active pattern being referred to - member IsStructReturn: bool + member ActivePatternRetKind: ActivePatternReturnKind /// Records the "extra information" for a value compiled as a method (rather /// than a closure or a local), including argument names, attributes etc. @@ -4104,7 +4202,7 @@ type CcuThunk = /// Create a CCU with the given name but where the contents have not yet been specified static member CreateDelayed: nm: CcuReference -> CcuThunk - /// Used at the end of comppiling an assembly to get a frozen, final stable CCU + /// Used at the end of compiling an assembly to get a frozen, final stable CCU /// for the compilation which we no longer mutate. member CloneWithFinalizedContents: ccuContents: ModuleOrNamespace -> CcuThunk diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fs b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fs index 3ad3de57db..29c2d788e2 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fs @@ -19,13 +19,6 @@ assert (sizeof = 8) assert (sizeof = 4) #endif -let getNameOfScopeRef sref = - match sref with - | ILScopeRef.Local -> "" - | ILScopeRef.Module mref -> mref.Name - | ILScopeRef.Assembly aref -> aref.Name - | ILScopeRef.PrimaryAssembly -> "" - /// Metadata on values (names of arguments etc.) module ValReprInfo = @@ -189,15 +182,23 @@ let ccuOfTyconRef eref = // Type parameters and inference unknowns //------------------------------------------------------------------------- -let mkTyparTy (tp: Typar) = +let NewNullnessVar() = Nullness.Variable (NullnessVar()) // we don't known (and if we never find out then it's non-null) + +let KnownAmbivalentToNull = Nullness.Known NullnessInfo.AmbivalentToNull + +let KnownWithNull = Nullness.Known NullnessInfo.WithNull + +let KnownWithoutNull = Nullness.Known NullnessInfo.WithoutNull + +let mkTyparTy (tp:Typar) = match tp.Kind with - | TyparKind.Type -> tp.AsType + | TyparKind.Type -> tp.AsType KnownWithoutNull | TyparKind.Measure -> TType_measure (Measure.Var tp) // For fresh type variables clear the StaticReq when copying because the requirement will be re-established through the // process of type inference. let copyTypar clearStaticReq (tp: Typar) = - let optData = tp.typar_opt_data |> Option.map (fun tg -> { typar_il_name = tg.typar_il_name; typar_xmldoc = tg.typar_xmldoc; typar_constraints = tg.typar_constraints; typar_attribs = tg.typar_attribs }) + let optData = tp.typar_opt_data |> Option.map (fun tg -> { typar_il_name = tg.typar_il_name; typar_xmldoc = tg.typar_xmldoc; typar_constraints = tg.typar_constraints; typar_attribs = tg.typar_attribs; typar_is_contravariant = tg.typar_is_contravariant }) let flags = if clearStaticReq then tp.typar_flags.WithStaticReq(TyparStaticReq.None) else tp.typar_flags Typar.New { typar_id = tp.typar_id typar_flags = flags @@ -234,9 +235,71 @@ let rec stripUnitEqnsAux canShortcut unt = | Measure.Var r when r.IsSolved -> stripUnitEqnsAux canShortcut (tryShortcutSolvedUnitPar canShortcut r) | _ -> unt -let rec stripTyparEqnsAux canShortcut ty = +let combineNullness (nullnessOrig: Nullness) (nullnessNew: Nullness) = + match nullnessOrig, nullnessNew with + | Nullness.Variable _, Nullness.Known NullnessInfo.WithoutNull -> + nullnessOrig + | _ -> + match nullnessOrig.Evaluate() with + | NullnessInfo.WithoutNull -> nullnessNew + | NullnessInfo.AmbivalentToNull -> + match nullnessNew.Evaluate() with + | NullnessInfo.WithoutNull -> nullnessOrig + | NullnessInfo.AmbivalentToNull -> nullnessOrig + | NullnessInfo.WithNull -> nullnessNew + | NullnessInfo.WithNull -> + match nullnessNew.Evaluate() with + | NullnessInfo.WithoutNull -> nullnessOrig + | NullnessInfo.AmbivalentToNull -> nullnessNew + | NullnessInfo.WithNull -> nullnessOrig + +let nullnessEquiv (nullnessOrig: Nullness) (nullnessNew: Nullness) = LanguagePrimitives.PhysicalEquality nullnessOrig nullnessNew + +let tryAddNullnessToTy nullnessNew (ty:TType) = + match ty with + | TType_var (tp, nullnessOrig) -> + let nullnessAfter = combineNullness nullnessOrig nullnessNew + if nullnessEquiv nullnessAfter nullnessOrig then + Some ty + else + Some (TType_var (tp, nullnessAfter)) + | TType_app (tcr, tinst, nullnessOrig) -> + let nullnessAfter = combineNullness nullnessOrig nullnessNew + if nullnessEquiv nullnessAfter nullnessOrig then + Some ty + else + Some (TType_app (tcr, tinst, nullnessAfter)) + | TType_ucase _ -> None + | TType_tuple _ -> None + | TType_anon _ -> None + | TType_fun (d, r, nullnessOrig) -> + let nullnessAfter = combineNullness nullnessOrig nullnessNew + if nullnessEquiv nullnessAfter nullnessOrig then + Some ty + else + Some (TType_fun (d, r, nullnessAfter)) + | TType_forall _ -> None + | TType_measure _ -> None + +let addNullnessToTy (nullness: Nullness) (ty:TType) = + match nullness with + | Nullness.Known NullnessInfo.WithoutNull -> ty + | Nullness.Variable nv when nv.IsFullySolved && nv.TryEvaluate() = ValueSome NullnessInfo.WithoutNull -> ty + | _ -> + match ty with + | TType_var (tp, nullnessOrig) -> TType_var (tp, combineNullness nullnessOrig nullness) + | TType_app (tcr, tinst, nullnessOrig) -> + let tycon = tcr.Deref + if tycon.IsStructRecordOrUnionTycon || tycon.IsStructOrEnumTycon then + ty + else + TType_app (tcr, tinst, combineNullness nullnessOrig nullness) + | TType_fun (d, r, nullnessOrig) -> TType_fun (d, r, combineNullness nullnessOrig nullness) + | _ -> ty + +let rec stripTyparEqnsAux nullness0 canShortcut ty = match ty with - | TType_var (r, _) -> + | TType_var (r, nullness) -> match r.Solution with | Some soln -> if canShortcut then @@ -245,28 +308,39 @@ let rec stripTyparEqnsAux canShortcut ty = // This is only because IterType likes to walk _all_ the constraints _everywhere_ in a type, including // those attached to _solved_ type variables. In an ideal world this would never be needed - see the notes // on IterType. - | TType_var (r2, _) when r2.Constraints.IsEmpty -> - match r2.Solution with - | None -> () - | Some _ as soln2 -> - r.typar_solution <- soln2 + | TType_var (r2, nullness2) when r2.Constraints.IsEmpty -> + match nullness2.Evaluate() with + | NullnessInfo.WithoutNull -> + match r2.Solution with + | None -> () + | Some _ as soln2 -> + r.typar_solution <- soln2 + | _ -> () | _ -> () - stripTyparEqnsAux canShortcut soln + stripTyparEqnsAux (combineNullness nullness0 nullness) canShortcut soln | None -> - ty + addNullnessToTy nullness0 ty | TType_measure unt -> TType_measure (stripUnitEqnsAux canShortcut unt) - | _ -> ty + | _ -> addNullnessToTy nullness0 ty -let stripTyparEqns ty = stripTyparEqnsAux false ty +let stripTyparEqns ty = stripTyparEqnsAux KnownWithoutNull false ty let stripUnitEqns unt = stripUnitEqnsAux false unt +let replaceNullnessOfTy nullness (ty:TType) = + match stripTyparEqns ty with + | TType_var (tp, _) -> TType_var (tp, nullness) + | TType_app (tcr, tinst, _) -> TType_app (tcr, tinst, nullness) + | TType_fun (d, r, _) -> TType_fun (d, r, nullness) + | sty -> sty + /// Detect a use of a nominal type, including type abbreviations. +[] let (|AbbrevOrAppTy|_|) (ty: TType) = match stripTyparEqns ty with - | TType_app (tcref, _, _) -> Some tcref - | _ -> None + | TType_app (tcref, tinst, _) -> ValueSome(tcref, tinst) + | _ -> ValueNone //--------------------------------------------------------------------------- // These make local/non-local references to values according to whether @@ -436,11 +510,11 @@ let primValRefEq compilingFSharpCore fslibCcu (x: ValRef) (y: ValRef) = //--------------------------------------------------------------------------- let fullCompPathOfModuleOrNamespace (m: ModuleOrNamespace) = - let (CompPath(scoref, cpath)) = m.CompilationPath - CompPath(scoref, cpath@[(m.LogicalName, m.ModuleOrNamespaceType.ModuleOrNamespaceKind)]) + let (CompPath(scoref, sa, cpath)) = m.CompilationPath + CompPath(scoref, sa, cpath@[(m.LogicalName, m.ModuleOrNamespaceType.ModuleOrNamespaceKind)]) // Can cpath2 be accessed given a right to access cpath1. That is, is cpath2 a nested type or namespace of cpath1. Note order of arguments. -let inline canAccessCompPathFrom (CompPath(scoref1, cpath1)) (CompPath(scoref2, cpath2)) = +let inline canAccessCompPathFrom (CompPath(scoref1, _, cpath1)) (CompPath(scoref2, _, cpath2)) = let rec loop p1 p2 = match p1, p2 with | (a1, k1) :: rest1, (a2, k2) :: rest2 -> (a1=a2) && (k1=k2) && loop rest1 rest2 @@ -465,12 +539,20 @@ let accessSubstPaths (newPath, oldPath) (TAccess paths) = let subst cpath = if cpath=oldPath then newPath else cpath TAccess (List.map subst paths) -let compPathOfCcu (ccu: CcuThunk) = CompPath(ccu.ILScopeRef, []) +let compPathOfCcu (ccu: CcuThunk) = CompPath(ccu.ILScopeRef, SyntaxAccess.Unknown, []) let taccessPublic = TAccess [] -let taccessPrivate accessPath = TAccess [accessPath] -let compPathInternal = CompPath(ILScopeRef.Local, []) +let compPathInternal = CompPath(ILScopeRef.Local, SyntaxAccess.Internal, []) let taccessInternal = TAccess [compPathInternal] -let combineAccess (TAccess a1) (TAccess a2) = TAccess(a1@a2) +let taccessPrivate accessPath = let (CompPath(sc,_, paths)) = accessPath in TAccess [CompPath(sc, TypedTree.SyntaxAccess.Private, paths)] + +let combineAccess access1 access2 = + let (TAccess a1) = access1 + let (TAccess a2) = access2 + let combined = + if access1 = taccessPublic then updateSyntaxAccessForCompPath (a1@a2) TypedTree.SyntaxAccess.Public + elif access1 = taccessInternal then updateSyntaxAccessForCompPath (a1@a2) TypedTree.SyntaxAccess.Internal + else (a1@a2) + TAccess combined exception Duplicate of string * string * range exception NameClash of string * string * string * range * string * string * range diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fsi b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fsi index 8a73a60931..c064be67c9 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fsi +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeBasics.fsi @@ -12,8 +12,6 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.TypedTree -val getNameOfScopeRef: sref: ILScopeRef -> string - /// Metadata on values (names of arguments etc. module ValReprInfo = @@ -120,6 +118,20 @@ val ccuOfValRef: vref: ValRef -> CcuThunk option val ccuOfTyconRef: eref: EntityRef -> CcuThunk option +val NewNullnessVar: unit -> Nullness + +val KnownAmbivalentToNull: Nullness + +val KnownWithNull: Nullness + +val KnownWithoutNull: Nullness + +val combineNullness: Nullness -> Nullness -> Nullness + +val tryAddNullnessToTy: Nullness -> TType -> TType option + +val addNullnessToTy: Nullness -> TType -> TType + val mkTyparTy: tp: Typar -> TType val copyTypars: clearStaticReq: bool -> tps: Typar list -> Typar list @@ -128,14 +140,17 @@ val tryShortcutSolvedUnitPar: canShortcut: bool -> r: Typar -> Measure val stripUnitEqnsAux: canShortcut: bool -> unt: Measure -> Measure -val stripTyparEqnsAux: canShortcut: bool -> ty: TType -> TType +val stripTyparEqnsAux: nullness0: Nullness -> canShortcut: bool -> ty: TType -> TType + +val replaceNullnessOfTy: nullness: Nullness -> ty: TType -> TType val stripTyparEqns: ty: TType -> TType val stripUnitEqns: unt: Measure -> Measure /// Detect a use of a nominal type, including type abbreviations. -val (|AbbrevOrAppTy|_|): ty: TType -> TyconRef option +[] +val (|AbbrevOrAppTy|_|): ty: TType -> (TyconRef * TypeInst) voption val mkLocalValRef: v: Val -> ValRef diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fs b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fs index 2034d5ecb2..49655deb03 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fs @@ -3,6 +3,7 @@ /// Defines derived expression manipulation and construction functions. module internal FSharp.Compiler.TypedTreeOps +open System open System.CodeDom.Compiler open System.Collections.Generic open System.Collections.Immutable @@ -37,6 +38,19 @@ let AccFreeVarsStackGuardDepth = GetEnvInteger "FSHARP_AccFreeVars" 100 let RemapExprStackGuardDepth = GetEnvInteger "FSHARP_RemapExpr" 50 let FoldExprStackGuardDepth = GetEnvInteger "FSHARP_FoldExpr" 50 +let inline compareBy (x: 'T MaybeNull) (y: 'T MaybeNull) ([]func: 'T -> 'K) = +#if NO_CHECKNULLS + compare (func x) (func y) +#else + match x,y with + | null,null -> 0 + | null,_ -> -1 + | _,null -> 1 + | x,y -> compare (func !!x) (func !!y) +#endif + + + //--------------------------------------------------------------------------- // Basic data structures //--------------------------------------------------------------------------- @@ -165,8 +179,9 @@ let generalizeTypars tps = List.map generalizeTypar tps let rec remapTypeAux (tyenv: Remap) (ty: TType) = let ty = stripTyparEqns ty match ty with - | TType_var (tp, _) as ty -> - instTyparRef tyenv.tpinst ty tp + | TType_var (tp, nullness) as ty -> + let res = instTyparRef tyenv.tpinst ty tp + addNullnessToTy nullness res | TType_app (tcref, tinst, flags) as ty -> match tyenv.tyconRefRemap.TryFind tcref with @@ -256,12 +271,14 @@ and remapTyparConstraintsAux tyenv cs = | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ - | TyparConstraint.IsUnmanaged _ + | TyparConstraint.NotSupportsNull _ + | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> Some x) -and remapTraitInfo tyenv (TTrait(tys, nm, flags, argTys, retTy, slnCell)) = +and remapTraitInfo tyenv (TTrait(tys, nm, flags, argTys, retTy, source, slnCell)) = let slnCell = match slnCell.Value with | None -> None @@ -297,7 +314,7 @@ and remapTraitInfo tyenv (TTrait(tys, nm, flags, argTys, retTy, slnCell)) = // in the same way as types let newSlnCell = ref slnCell - TTrait(tysR, nm, flags, argTysR, retTyR, newSlnCell) + TTrait(tysR, nm, flags, argTysR, retTyR, source, newSlnCell) and bindTypars tps tyargs tpinst = match tps with @@ -621,12 +638,12 @@ let mkByrefTyWithInference (g: TcGlobals) ty1 ty2 = else TType_app (g.byref_tcr, [ty1], g.knownWithoutNull) -let mkArrayTy (g: TcGlobals) rank ty m = +let mkArrayTy (g: TcGlobals) rank nullness ty m = if rank < 1 || rank > 32 then errorR(Error(FSComp.SR.tastopsMaxArrayThirtyTwo rank, m)) - TType_app (g.il_arr_tcr_map[3], [ty], g.knownWithoutNull) + TType_app (g.il_arr_tcr_map[3], [ty], nullness) else - TType_app (g.il_arr_tcr_map[rank - 1], [ty], g.knownWithoutNull) + TType_app (g.il_arr_tcr_map[rank - 1], [ty], nullness) //-------------------------------------------------------------------------- // Tuple compilation (types) @@ -717,7 +734,7 @@ let reduceTyconMeasureableOrProvided (g: TcGlobals) (tycon: Tycon) tyargs = | TMeasureableRepr ty -> if isNil tyargs then ty else instType (mkTyconInst tycon tyargs) ty #if !NO_TYPEPROVIDERS - | TProvidedTypeRepr info when info.IsErased -> info.BaseTypeForErased (range0, g.obj_ty) + | TProvidedTypeRepr info when info.IsErased -> info.BaseTypeForErased (range0, g.obj_ty_withNulls) #endif | _ -> invalidArg "tc" "this type definition is not a refinement" @@ -725,13 +742,15 @@ let reduceTyconRefMeasureableOrProvided (g: TcGlobals) (tcref: TyconRef) tyargs reduceTyconMeasureableOrProvided g tcref.Deref tyargs let rec stripTyEqnsA g canShortcut ty = - let ty = stripTyparEqnsAux canShortcut ty + let ty = stripTyparEqnsAux KnownWithoutNull canShortcut ty match ty with - | TType_app (tcref, tinst, _) -> + | TType_app (tcref, tinst, nullness) -> let tycon = tcref.Deref match tycon.TypeAbbrev with | Some abbrevTy -> - stripTyEqnsA g canShortcut (applyTyconAbbrev abbrevTy tycon tinst) + let reducedTy = applyTyconAbbrev abbrevTy tycon tinst + let reducedTy2 = addNullnessToTy nullness reducedTy + stripTyEqnsA g canShortcut reducedTy2 | None -> // This is the point where we get to add additional conditional normalizing equations // into the type system. Such power! @@ -743,7 +762,9 @@ let rec stripTyEqnsA g canShortcut ty = // Add the equation double<1> = double for units of measure. elif tycon.IsMeasureableReprTycon && List.forall (isDimensionless g) tinst then - stripTyEqnsA g canShortcut (reduceTyconMeasureableOrProvided g tycon tinst) + let reducedTy = reduceTyconMeasureableOrProvided g tycon tinst + let reducedTy2 = addNullnessToTy nullness reducedTy + stripTyEqnsA g canShortcut reducedTy2 else ty | ty -> ty @@ -758,23 +779,25 @@ let evalAnonInfoIsStruct (anonInfo: AnonRecdTypeInfo) = evalTupInfoIsStruct anonInfo.TupInfo /// This erases outermost occurrences of inference equations, type abbreviations, non-generated provided types -/// and measureable types (float<_>). +/// and measurable types (float<_>). /// It also optionally erases all "compilation representations", i.e. function and /// tuple types, and also "nativeptr<'T> --> System.IntPtr" let rec stripTyEqnsAndErase eraseFuncAndTuple (g: TcGlobals) ty = let ty = stripTyEqns g ty match ty with - | TType_app (tcref, args, _) -> + | TType_app (tcref, args, nullness) -> let tycon = tcref.Deref - if tycon.IsErased then - stripTyEqnsAndErase eraseFuncAndTuple g (reduceTyconMeasureableOrProvided g tycon args) + if tycon.IsErased then + let reducedTy = reduceTyconMeasureableOrProvided g tycon args + let reducedTy2 = addNullnessToTy nullness reducedTy + stripTyEqnsAndErase eraseFuncAndTuple g reducedTy2 elif tyconRefEq g tcref g.nativeptr_tcr && eraseFuncAndTuple then stripTyEqnsAndErase eraseFuncAndTuple g g.nativeint_ty else ty - | TType_fun(domainTy, rangeTy, flags) when eraseFuncAndTuple -> - TType_app(g.fastFunc_tcr, [ domainTy; rangeTy ], flags) + | TType_fun(domainTy, rangeTy, nullness) when eraseFuncAndTuple -> + TType_app(g.fastFunc_tcr, [ domainTy; rangeTy ], nullness) | TType_tuple(tupInfo, l) when eraseFuncAndTuple -> mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) l @@ -854,7 +877,7 @@ let isMeasureTy g ty = ty |> stripTyEqns g |> (function TType_measure _ -> true let isProvenUnionCaseTy ty = match ty with TType_ucase _ -> true | _ -> false -let mkAppTy tcref tyargs = TType_app(tcref, tyargs, 0uy) +let mkWoNullAppTy tcref tyargs = TType_app(tcref, tyargs, KnownWithoutNull) let mkProvenUnionCaseTy ucref tyargs = TType_ucase(ucref, tyargs) @@ -880,21 +903,24 @@ let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var (v, _) -> Valu let tryAnyParTyOption g ty = ty |> stripTyEqns g |> (function TType_var (v, _) -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) -let (|AppTy|_|) g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst, _) -> Some (tcref, tinst) | _ -> None) +[] +let (|AppTy|_|) g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst, _) -> ValueSome (tcref, tinst) | _ -> ValueNone) -let (|RefTupleTy|_|) g ty = ty |> stripTyEqns g |> (function TType_tuple(tupInfo, tys) when not (evalTupInfoIsStruct tupInfo) -> Some tys | _ -> None) +[] +let (|RefTupleTy|_|) g ty = ty |> stripTyEqns g |> (function TType_tuple(tupInfo, tys) when not (evalTupInfoIsStruct tupInfo) -> ValueSome tys | _ -> ValueNone) -let (|FunTy|_|) g ty = ty |> stripTyEqns g |> (function TType_fun(domainTy, rangeTy, _) -> Some (domainTy, rangeTy) | _ -> None) +[] +let (|FunTy|_|) g ty = ty |> stripTyEqns g |> (function TType_fun(domainTy, rangeTy, _) -> ValueSome (domainTy, rangeTy) | _ -> ValueNone) let tryNiceEntityRefOfTy ty = - let ty = stripTyparEqnsAux false ty + let ty = stripTyparEqnsAux KnownWithoutNull false ty match ty with | TType_app (tcref, _, _) -> ValueSome tcref | TType_measure (Measure.Const tcref) -> ValueSome tcref | _ -> ValueNone let tryNiceEntityRefOfTyOption ty = - let ty = stripTyparEqnsAux false ty + let ty = stripTyparEqnsAux KnownWithoutNull false ty match ty with | TType_app (tcref, _, _) -> Some tcref | TType_measure (Measure.Const tcref) -> Some tcref @@ -914,7 +940,7 @@ let convertToTypeWithMetadataIfPossible g ty = mkOuterCompiledTupleTy g (evalTupInfoIsStruct tupInfo) tupElemTys elif isFunTy g ty then let a,b = destFunTy g ty - mkAppTy g.fastFunc_tcr [a; b] + mkWoNullAppTy g.fastFunc_tcr [a; b] else ty //--------------------------------------------------------------------------- @@ -923,9 +949,9 @@ let convertToTypeWithMetadataIfPossible g ty = let stripMeasuresFromTy g ty = match ty with - | TType_app(tcref, tinst, flags) -> + | TType_app(tcref, tinst, nullness) -> let tinstR = tinst |> List.filter (isMeasureTy g >> not) - TType_app(tcref, tinstR, flags) + TType_app(tcref, tinstR, nullness) | _ -> ty //--------------------------------------------------------------------------- @@ -960,8 +986,8 @@ type TypeEquivEnv with TypeEquivEnv.Empty.BindEquivTypars tps1 tps2 let rec traitsAEquivAux erasureFlag g aenv traitInfo1 traitInfo2 = - let (TTrait(tys1, nm, mf1, argTys, retTy, _)) = traitInfo1 - let (TTrait(tys2, nm2, mf2, argTys2, retTy2, _)) = traitInfo2 + let (TTrait(tys1, nm, mf1, argTys, retTy, _, _)) = traitInfo1 + let (TTrait(tys2, nm2, mf2, argTys2, retTy2, _, _)) = traitInfo2 mf1.IsInstance = mf2.IsInstance && nm = nm2 && ListSet.equals (typeAEquivAux erasureFlag g aenv) tys1 tys2 && @@ -1010,9 +1036,11 @@ and typarConstraintsAEquivAux erasureFlag g aenv tpc1 tpc2 = | TyparConstraint.SupportsComparison _, TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _, TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _, TyparConstraint.SupportsNull _ + | TyparConstraint.NotSupportsNull _, TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsReferenceType _, TyparConstraint.IsReferenceType _ | TyparConstraint.IsUnmanaged _, TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _, TyparConstraint.AllowsRefStruct _ | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false @@ -1036,7 +1064,7 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = | TType_forall(tps1, rty1), TType_forall(tps2, retTy2) -> typarsAEquivAux erasureFlag g aenv tps1 tps2 && typeAEquivAux erasureFlag g (aenv.BindEquivTypars tps1 tps2) rty1 retTy2 - | TType_var (tp1, _), TType_var (tp2, _) when typarEq tp1 tp2 -> + | TType_var (tp1, _), TType_var (tp2, _) when typarEq tp1 tp2 -> // NOTE: nullness annotations are ignored for type equivalence true | TType_var (tp1, _), _ -> @@ -1044,7 +1072,8 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = | Some tpTy1 -> typeEquivAux erasureFlag g tpTy1 ty2 | None -> false - | TType_app (tcref1, tinst1, _), TType_app (tcref2, tinst2, _) -> + // NOTE: nullness annotations are ignored for type equivalence + | TType_app (tcref1, tinst1, _), TType_app (tcref2, tinst2, _) -> tcrefAEquiv g aenv tcref1 tcref2 && typesAEquivAux erasureFlag g aenv tinst1 tinst2 @@ -1056,13 +1085,14 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> structnessAEquiv tupInfo1 tupInfo2 && typesAEquivAux erasureFlag g aenv l1 l2 + // NOTE: nullness annotations are ignored for type equivalence + | TType_fun (domainTy1, rangeTy1, _), TType_fun (domainTy2, rangeTy2, _) -> + typeAEquivAux erasureFlag g aenv domainTy1 domainTy2 && typeAEquivAux erasureFlag g aenv rangeTy1 rangeTy2 + | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> anonInfoEquiv anonInfo1 anonInfo2 && typesAEquivAux erasureFlag g aenv l1 l2 - | TType_fun (domainTy1, rangeTy1, _), TType_fun (domainTy2, rangeTy2, _) -> - typeAEquivAux erasureFlag g aenv domainTy1 domainTy2 && typeAEquivAux erasureFlag g aenv rangeTy1 rangeTy2 - | TType_measure m1, TType_measure m2 -> match erasureFlag with | EraseNone -> measureAEquiv g aenv m1 m2 @@ -1070,6 +1100,18 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = | _ -> false +and nullnessSensitivetypeAEquivAux erasureFlag g aenv ty1 ty2 = + let ty1 = stripTyEqnsWrtErasure erasureFlag g ty1 + let ty2 = stripTyEqnsWrtErasure erasureFlag g ty2 + match ty1, ty2 with + | TType_var (_,n1), TType_var (_,n2) + | TType_app (_,_,n1), TType_app (_,_,n2) + | TType_fun (_,_,n1), TType_fun (_,_,n2) -> + n1 === n2 + | _ -> true + + && typeAEquivAux erasureFlag g aenv ty1 ty2 + and anonInfoEquiv (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = ccuEq anonInfo1.Assembly anonInfo2.Assembly && structnessAEquiv anonInfo1.TupInfo anonInfo2.TupInfo && @@ -1129,18 +1171,30 @@ let isErasedType g ty = | _ -> false // Return all components of this type expression that cannot be tested at runtime -let rec getErasedTypes g ty = +let rec getErasedTypes g ty checkForNullness = let ty = stripTyEqns g ty if isErasedType g ty then [ty] else match ty with | TType_forall(_, bodyTy) -> - getErasedTypes g bodyTy - | TType_var (tp, _) -> - if tp.IsErased then [ty] else [] - | TType_app (_, b, _) | TType_ucase(_, b) | TType_anon (_, b) | TType_tuple (_, b) -> - List.foldBack (fun ty tys -> getErasedTypes g ty @ tys) b [] - | TType_fun (domainTy, rangeTy, _) -> - getErasedTypes g domainTy @ getErasedTypes g rangeTy + getErasedTypes g bodyTy checkForNullness + + | TType_var (tp, nullness) -> + match checkForNullness, nullness.Evaluate() with + | true, NullnessInfo.WithNull -> [ty] // with-null annotations can't be tested at runtime, Nullable<> is not part of Nullness feature as of now. + | _ -> if tp.IsErased then [ty] else [] + + | TType_app (_, b, nullness) -> + match checkForNullness, nullness.Evaluate() with + | true, NullnessInfo.WithNull -> [ty] + | _ -> List.foldBack (fun ty tys -> getErasedTypes g ty false @ tys) b [] + + | TType_ucase(_, b) | TType_anon (_, b) | TType_tuple (_, b) -> + List.foldBack (fun ty tys -> getErasedTypes g ty false @ tys) b [] + + | TType_fun (domainTy, rangeTy, nullness) -> + match checkForNullness, nullness.Evaluate() with + | true, NullnessInfo.WithNull -> [ty] + | _ -> getErasedTypes g domainTy false @ getErasedTypes g rangeTy false | TType_measure _ -> [ty] @@ -1148,9 +1202,9 @@ let rec getErasedTypes g ty = // Standard orderings, e.g. for order set/map keys //--------------------------------------------------------------------------- -let valOrder = { new IComparer with member _.Compare(v1, v2) = compare v1.Stamp v2.Stamp } +let valOrder = { new IComparer with member _.Compare(v1, v2) = compareBy v1 v2 _.Stamp } -let tyconOrder = { new IComparer with member _.Compare(tycon1, tycon2) = compare tycon1.Stamp tycon2.Stamp } +let tyconOrder = { new IComparer with member _.Compare(tycon1, tycon2) = compareBy tycon1 tycon2 _.Stamp } let recdFieldRefOrder = { new IComparer with @@ -1197,7 +1251,7 @@ let mkMultiLambdaTy g m vs bodyTy = mkFunTy g (typeOfLambdaArg m vs) bodyTy /// the library arising from env.fs. Part of this means that we have to be able to resolve these /// references. This function artificially forces the existence of a module or namespace at a /// particular point in order to do this. -let ensureCcuHasModuleOrNamespaceAtPath (ccu: CcuThunk) path (CompPath(_, cpath)) xml = +let ensureCcuHasModuleOrNamespaceAtPath (ccu: CcuThunk) path (CompPath(_, sa, cpath)) xml = let scoref = ccu.ILScopeRef let rec loop prior_cpath (path: Ident list) cpath (modul: ModuleOrNamespace) = let mtype = modul.ModuleOrNamespaceType @@ -1206,7 +1260,7 @@ let ensureCcuHasModuleOrNamespaceAtPath (ccu: CcuThunk) path (CompPath(_, cpath) let modName = hpath.idText if not (Map.containsKey modName mtype.AllEntitiesByCompiledAndLogicalMangledNames) then let mty = Construct.NewEmptyModuleOrNamespaceType mkind - let cpath = CompPath(scoref, prior_cpath) + let cpath = CompPath(scoref, sa, prior_cpath) let smodul = Construct.NewModuleOrNamespace (Some cpath) taccessPublic hpath xml [] (MaybeLazy.Strict mty) mtype.AddModuleOrNamespaceByMutation smodul let modul = Map.find modName mtype.AllEntitiesByCompiledAndLogicalMangledNames @@ -1232,11 +1286,14 @@ let rec stripDebugPoints expr = | Expr.DebugPoint (_, innerExpr) -> stripDebugPoints innerExpr | expr -> expr -// Strip debug points and remember how to recrete them +// Strip debug points and remember how to recreate them let (|DebugPoints|) expr = - match stripExpr expr with - | Expr.DebugPoint (dp, innerExpr) -> innerExpr, (fun e -> Expr.DebugPoint(dp, e)) - | expr -> expr, id + let rec loop expr debug = + match stripExpr expr with + | Expr.DebugPoint (dp, innerExpr) -> loop innerExpr (debug << fun e -> Expr.DebugPoint (dp, e)) + | expr -> expr, debug + + loop expr id let mkCase (a, b) = TCase(a, b) @@ -1796,7 +1853,20 @@ let isArray1DTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) - let isUnitTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.unit_tcr_canon tcref | _ -> false) -let isObjTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) +let isObjTyAnyNullness g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) + +let isObjNullTy g ty = + ty + |> stripTyEqns g + |> (function TType_app(tcref, _, n) when (not g.checkNullness) || (n.TryEvaluate() <> ValueSome(NullnessInfo.WithoutNull)) + -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) + +let isObjTyWithoutNull (g:TcGlobals) ty = + g.checkNullness && + ty + |> stripTyEqns g + |> (function TType_app(tcref, _, n) when (n.TryEvaluate() = ValueSome(NullnessInfo.WithoutNull)) + -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) let isValueTypeTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> tyconRefEq g g.system_Value_tcref tcref | _ -> false) @@ -1819,6 +1889,7 @@ let isInByrefTy g ty = | _ -> false) let isOutByrefTag g ty = ty |> stripTyEqns g |> (function TType_app(tcref, [], _) -> tyconRefEq g g.byrefkind_Out_tcr tcref | _ -> false) + let isOutByrefTy g ty = ty |> stripTyEqns g |> (function | TType_app(tcref, [_; tagTy], _) when g.byref2_tcr.CanDeref -> tyconRefEq g g.byref2_tcr tcref && isOutByrefTag g tagTy @@ -2125,7 +2196,7 @@ let unionFreeTycons s1 s2 = let typarOrder = { new IComparer with - member x.Compare (v1: Typar, v2: Typar) = compare v1.Stamp v2.Stamp } + member x.Compare (v1: Typar, v2: Typar) = compareBy v1 v2 _.Stamp } let emptyFreeTypars = Zset.empty typarOrder let unionFreeTypars s1 s2 = @@ -2285,12 +2356,14 @@ and accFreeInTyparConstraint opts tpc acc = | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ + | TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.RequiresDefaultConstructor _ -> acc -and accFreeInTrait opts (TTrait(tys, _, _, argTys, retTy, sln)) acc = +and accFreeInTrait opts (TTrait(tys, _, _, argTys, retTy, _, sln)) acc = Option.foldBack (accFreeInTraitSln opts) sln.Value (accFreeInTypes opts tys (accFreeInTypes opts argTys @@ -2420,12 +2493,14 @@ and accFreeInTyparConstraintLeftToRight g cxFlag thruFlag acc tpc = | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ + | TyparConstraint.NotSupportsNull _ | TyparConstraint.IsNonNullableStruct _ | TyparConstraint.IsUnmanaged _ + | TyparConstraint.AllowsRefStruct _ | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> acc -and accFreeInTraitLeftToRight g cxFlag thruFlag acc (TTrait(tys, _, _, argTys, retTy, _)) = +and accFreeInTraitLeftToRight g cxFlag thruFlag acc (TTrait(tys, _, _, argTys, retTy, _, _)) = let acc = accFreeInTypesLeftToRight g cxFlag thruFlag acc tys let acc = accFreeInTypesLeftToRight g cxFlag thruFlag acc argTys let acc = Option.fold (accFreeInTypeLeftToRight g cxFlag thruFlag) acc retTy @@ -2468,7 +2543,7 @@ and accFreeInTypeLeftToRight g cxFlag thruFlag acc ty = let racc = accFreeInTypeLeftToRight g cxFlag thruFlag emptyFreeTyparsLeftToRight r unionFreeTyparsLeftToRight (boundTyparsLeftToRight g cxFlag thruFlag tps racc) acc - | TType_measure unt -> + | TType_measure unt -> let mvars = ListMeasureVarOccsWithNonZeroExponents unt List.foldBack (fun (tp, _) acc -> accFreeTyparRefLeftToRight g cxFlag thruFlag acc tp) mvars acc @@ -2632,7 +2707,7 @@ type TraitConstraintInfo with /// Get the key associated with the member constraint. member traitInfo.GetWitnessInfo() = - let (TTrait(tys, nm, memFlags, objAndArgTys, rty, _)) = traitInfo + let (TTrait(tys, nm, memFlags, objAndArgTys, rty, _, _)) = traitInfo TraitWitnessInfo(tys, nm, memFlags, objAndArgTys, rty) /// Get information about the trait constraints for a set of typars. @@ -2806,7 +2881,10 @@ let generalizedTyconRef (g: TcGlobals) tcref = let tinst = generalTyconRefInst tcref TType_app(tcref, tinst, g.knownWithoutNull) -let isTTyparCoercesToType = function TyparConstraint.CoercesTo _ -> true | _ -> false +let isTTyparCoercesToType tpc = + match tpc with + | TyparConstraint.CoercesTo _ -> true + | _ -> false //-------------------------------------------------------------------------- // Print Signatures/Types - prelude @@ -2944,7 +3022,7 @@ module PrettyTypes = // Hence we double check here that the thing is really a type variable let safeDestAnyParTy orig g ty = match tryAnyParTy g ty with ValueNone -> orig | ValueSome x -> x - let foldUnurriedArgInfos f z (x: UncurriedArgInfos) = List.fold (fold1Of2 f) z x + let foldUncurriedArgInfos f z (x: UncurriedArgInfos) = List.fold (fold1Of2 f) z x let foldTypar f z (x: Typar) = foldOn mkTyparTy f z x let mapTypar g f (x: Typar) : Typar = (mkTyparTy >> f >> safeDestAnyParTy x g) x @@ -2962,7 +3040,7 @@ module PrettyTypes = let PrettifyInstAndUncurriedSig g (x: TyparInstantiation * UncurriedArgInfos * TType) = PrettifyThings g - (fun f -> foldTriple (foldTyparInst f, foldUnurriedArgInfos f, f)) + (fun f -> foldTriple (foldTyparInst f, foldUncurriedArgInfos f, f)) (fun f -> mapTriple (mapTyparInst g f, List.map (map1Of2 f), f)) x @@ -3097,8 +3175,10 @@ type DisplayEnv = shortConstraints: bool useColonForReturnType: bool showAttributes: bool + showCsharpCodeAnalysisAttributes: bool showOverrides: bool showStaticallyResolvedTyparAnnotations: bool + showNullnessAnnotations: bool option abbreviateAdditionalConstraints: bool showTyparDefaultConstraints: bool showDocumentation: bool @@ -3131,8 +3211,10 @@ type DisplayEnv = suppressMutableKeyword = false showMemberContainers = false showAttributes = false + showCsharpCodeAnalysisAttributes = false showOverrides = true showStaticallyResolvedTyparAnnotations = true + showNullnessAnnotations = None showDocumentation = false abbreviateAdditionalConstraints = false showTyparDefaultConstraints = false @@ -3178,7 +3260,7 @@ type DisplayEnv = ControlPath (splitNamespace ExtraTopLevelOperatorsName) ] -let (+.+) s1 s2 = if s1 = "" then s2 else s1+"."+s2 +let (+.+) s1 s2 = if String.IsNullOrEmpty(s1) then s2 else !!s1+"."+s2 let layoutOfPath p = sepListL SepL.dot (List.map (tagNamespace >> wordL) p) @@ -3383,7 +3465,7 @@ let trimPathByDisplayEnv denv path = let superOfTycon (g: TcGlobals) (tycon: Tycon) = match tycon.TypeContents.tcaug_super with - | None -> g.obj_ty + | None -> g.obj_ty_noNulls | Some ty -> ty /// walk a TyconRef's inheritance tree, yielding any parent types as an array @@ -3425,14 +3507,24 @@ let TryFindFSharpAttributeOpt g tref attrs = match tref with None -> None | Some let HasFSharpAttributeOpt g trefOpt attrs = match trefOpt with Some tref -> List.exists (IsMatchingFSharpAttribute g tref) attrs | _ -> false let IsMatchingFSharpAttributeOpt g attrOpt (Attrib(tcref2, _, _, _, _, _, _)) = match attrOpt with Some (AttribInfo(_, tcref)) -> tyconRefEq g tcref tcref2 | _ -> false +[] let (|ExtractAttribNamedArg|_|) nm args = - args |> List.tryPick (function AttribNamedArg(nm2, _, _, v) when nm = nm2 -> Some v | _ -> None) + args |> List.tryPick (function AttribNamedArg(nm2, _, _, v) when nm = nm2 -> Some v | _ -> None) |> ValueOptionInternal.ofOption + +[] +let (|StringExpr|_|) = function Expr.Const (Const.String n, _, _) -> ValueSome n | _ -> ValueNone -let (|StringExpr|_|) = function Expr.Const (Const.String n, _, _) -> Some n | _ -> None -let (|AttribInt32Arg|_|) = function AttribExpr(_, Expr.Const (Const.Int32 n, _, _)) -> Some n | _ -> None -let (|AttribInt16Arg|_|) = function AttribExpr(_, Expr.Const (Const.Int16 n, _, _)) -> Some n | _ -> None -let (|AttribBoolArg|_|) = function AttribExpr(_, Expr.Const (Const.Bool n, _, _)) -> Some n | _ -> None -let (|AttribStringArg|_|) = function AttribExpr(_, Expr.Const (Const.String n, _, _)) -> Some n | _ -> None +[] +let (|AttribInt32Arg|_|) = function AttribExpr(_, Expr.Const (Const.Int32 n, _, _)) -> ValueSome n | _ -> ValueNone + +[] +let (|AttribInt16Arg|_|) = function AttribExpr(_, Expr.Const (Const.Int16 n, _, _)) -> ValueSome n | _ -> ValueNone + +[] +let (|AttribBoolArg|_|) = function AttribExpr(_, Expr.Const (Const.Bool n, _, _)) -> ValueSome n | _ -> ValueNone + +[] +let (|AttribStringArg|_|) = function AttribExpr(_, Expr.Const (Const.String n, _, _)) -> ValueSome n | _ -> ValueNone let TryFindFSharpBoolAttributeWithDefault dflt g nm attrs = match TryFindFSharpAttribute g nm attrs with @@ -3452,6 +3544,19 @@ let TryFindFSharpStringAttribute g nm attrs = match TryFindFSharpAttribute g nm attrs with | Some(Attrib(_, _, [ AttribStringArg b ], _, _, _, _)) -> Some b | _ -> None + +let TryFindLocalizedFSharpStringAttribute g nm attrs = + match TryFindFSharpAttribute g nm attrs with + | Some(Attrib(_, _, [ AttribStringArg b ], namedArgs, _, _, _)) -> + match namedArgs with + | ExtractAttribNamedArg "Localize" (AttribBoolArg true) -> + #if PROTO || BUILDING_WITH_LKG + Some b + #else + FSComp.SR.GetTextOpt(b) + #endif + | _ -> Some b + | _ -> None let TryFindILAttribute (AttribInfo (atref, _)) attrs = HasILAttribute atref attrs @@ -3461,6 +3566,9 @@ let TryFindILAttributeOpt attr attrs = | Some (AttribInfo (atref, _)) -> HasILAttribute atref attrs | _ -> false +let IsILAttrib (AttribInfo (builtInAttrRef, _)) attr = isILAttrib builtInAttrRef attr + + /// Analyze three cases for attributes declared on type definitions: IL-declared attributes, F#-declared attributes and /// provided attributes. // @@ -3596,7 +3704,7 @@ let isSpanTyconRef g m tcref = let isSpanTy g m ty = ty |> stripTyEqns g |> (function TType_app(tcref, _, _) -> isSpanTyconRef g m tcref | _ -> false) -let rec tryDestSpanTy g m ty = +let tryDestSpanTy g m ty = match tryAppTy g ty with | ValueSome(tcref, [ty]) when isSpanTyconRef g m tcref -> Some(tcref, ty) | _ -> None @@ -3633,9 +3741,10 @@ let destByrefTy g ty = | TType_app(tcref, [x], _) when tyconRefEq g g.byref_tcr tcref -> x // all others | _ -> failwith "destByrefTy: not a byref type" +[] let (|ByrefTy|_|) g ty = // Because of byref = byref2 it is better to write this using is/dest - if isByrefTy g ty then Some (destByrefTy g ty) else None + if isByrefTy g ty then ValueSome (destByrefTy g ty) else ValueNone let destNativePtrTy g ty = match ty |> stripTyEqns g with @@ -3671,6 +3780,13 @@ let mkNullableTy (g: TcGlobals) ty = TType_app (g.system_Nullable_tcref, [ty], g let mkListTy (g: TcGlobals) ty = TType_app (g.list_tcr_nice, [ty], g.knownWithoutNull) +let isBoolTy (g: TcGlobals) ty = + match tryTcrefOfAppTy g ty with + | ValueNone -> false + | ValueSome tcref -> + tyconRefEq g g.system_Bool_tcref tcref || + tyconRefEq g g.bool_tcr tcref + let isValueOptionTy (g: TcGlobals) ty = match tryTcrefOfAppTy g ty with | ValueNone -> false @@ -3681,6 +3797,17 @@ let isOptionTy (g: TcGlobals) ty = | ValueNone -> false | ValueSome tcref -> tyconRefEq g g.option_tcr_canon tcref +let isChoiceTy (g: TcGlobals) ty = + match tryTcrefOfAppTy g ty with + | ValueNone -> false + | ValueSome tcref -> + tyconRefEq g g.choice2_tcr tcref || + tyconRefEq g g.choice3_tcr tcref || + tyconRefEq g g.choice4_tcr tcref || + tyconRefEq g g.choice5_tcr tcref || + tyconRefEq g g.choice6_tcr tcref || + tyconRefEq g g.choice7_tcr tcref + let tryDestOptionTy g ty = match argsOfAppTy g ty with | [ty1] when isOptionTy g ty -> ValueSome ty1 @@ -3691,6 +3818,11 @@ let tryDestValueOptionTy g ty = | [ty1] when isValueOptionTy g ty -> ValueSome ty1 | _ -> ValueNone +let tryDestChoiceTy g ty idx = + match argsOfAppTy g ty with + | ls when isChoiceTy g ty && ls.Length > idx -> ValueSome ls[idx] + | _ -> ValueNone + let destOptionTy g ty = match tryDestOptionTy g ty with | ValueSome ty -> ty @@ -3701,6 +3833,11 @@ let destValueOptionTy g ty = | ValueSome ty -> ty | ValueNone -> failwith "destValueOptionTy: not a value option type" +let destChoiceTy g ty idx = + match tryDestChoiceTy g ty idx with + | ValueSome ty -> ty + | ValueNone -> failwith "destChoiceTy: not a Choice type" + let isNullableTy (g: TcGlobals) ty = match tryTcrefOfAppTy g ty with | ValueNone -> false @@ -3716,10 +3853,11 @@ let destNullableTy g ty = | ValueSome ty -> ty | ValueNone -> failwith "destNullableTy: not a Nullable type" +[] let (|NullableTy|_|) g ty = match tryAppTy g ty with - | ValueSome (tcref, [tyarg]) when tyconRefEq g tcref g.system_Nullable_tcref -> Some tyarg - | _ -> None + | ValueSome (tcref, [tyarg]) when tyconRefEq g tcref g.system_Nullable_tcref -> ValueSome tyarg + | _ -> ValueNone let (|StripNullableTy|) g ty = match tryDestNullableTy g ty with @@ -3759,21 +3897,25 @@ type ValRef with | Some membInfo -> membInfo.MemberFlags.IsDispatchSlot | None -> false +[] let (|UnopExpr|_|) _g expr = match expr with - | Expr.App (Expr.Val (vref, _, _), _, _, [arg1], _) -> Some (vref, arg1) - | _ -> None + | Expr.App (Expr.Val (vref, _, _), _, _, [arg1], _) -> ValueSome (vref, arg1) + | _ -> ValueNone +[] let (|BinopExpr|_|) _g expr = match expr with - | Expr.App (Expr.Val (vref, _, _), _, _, [arg1;arg2], _) -> Some (vref, arg1, arg2) - | _ -> None + | Expr.App (Expr.Val (vref, _, _), _, _, [arg1;arg2], _) -> ValueSome (vref, arg1, arg2) + | _ -> ValueNone +[] let (|SpecificUnopExpr|_|) g vrefReqd expr = match expr with - | UnopExpr g (vref, arg1) when valRefEq g vref vrefReqd -> Some arg1 - | _ -> None + | UnopExpr g (vref, arg1) when valRefEq g vref vrefReqd -> ValueSome arg1 + | _ -> ValueNone +[] let (|SignedConstExpr|_|) expr = match expr with | Expr.Const (Const.Int32 _, _, _) @@ -3781,9 +3923,10 @@ let (|SignedConstExpr|_|) expr = | Expr.Const (Const.Int16 _, _, _) | Expr.Const (Const.Int64 _, _, _) | Expr.Const (Const.Single _, _, _) - | Expr.Const (Const.Double _, _, _) -> Some () - | _ -> None + | Expr.Const (Const.Double _, _, _) -> ValueSome () + | _ -> ValueNone +[] let (|IntegerConstExpr|_|) expr = match expr with | Expr.Const (Const.Int32 _, _, _) @@ -3793,37 +3936,42 @@ let (|IntegerConstExpr|_|) expr = | Expr.Const (Const.Byte _, _, _) | Expr.Const (Const.UInt16 _, _, _) | Expr.Const (Const.UInt32 _, _, _) - | Expr.Const (Const.UInt64 _, _, _) -> Some () - | _ -> None + | Expr.Const (Const.UInt64 _, _, _) -> ValueSome () + | _ -> ValueNone +[] let (|FloatConstExpr|_|) expr = match expr with | Expr.Const (Const.Single _, _, _) - | Expr.Const (Const.Double _, _, _) -> Some () - | _ -> None + | Expr.Const (Const.Double _, _, _) -> ValueSome () + | _ -> ValueNone +[] let (|SpecificBinopExpr|_|) g vrefReqd expr = match expr with - | BinopExpr g (vref, arg1, arg2) when valRefEq g vref vrefReqd -> Some (arg1, arg2) - | _ -> None + | BinopExpr g (vref, arg1, arg2) when valRefEq g vref vrefReqd -> ValueSome (arg1, arg2) + | _ -> ValueNone +[] let (|EnumExpr|_|) g expr = match (|SpecificUnopExpr|_|) g g.enum_vref expr with - | None -> (|SpecificUnopExpr|_|) g g.enumOfValue_vref expr + | ValueNone -> (|SpecificUnopExpr|_|) g g.enumOfValue_vref expr | x -> x +[] let (|BitwiseOrExpr|_|) g expr = (|SpecificBinopExpr|_|) g g.bitwise_or_vref expr +[] let (|AttribBitwiseOrExpr|_|) g expr = match expr with - | BitwiseOrExpr g (arg1, arg2) -> Some(arg1, arg2) + | BitwiseOrExpr g (arg1, arg2) -> ValueSome(arg1, arg2) // Special workaround, only used when compiling FSharp.Core.dll. Uses of 'a ||| b' occur before the '|||' bitwise or operator // is defined. These get through type checking because enums implicitly support the '|||' operator through // the automatic resolution of undefined operators (see tc.fs, Item.ImplicitOp). This then compiles as an // application of a lambda to two arguments. We recognize this pattern here | Expr.App (Expr.Lambda _, _, _, [arg1;arg2], _) when g.compilingFSharpCore -> - Some(arg1, arg2) - | _ -> None + ValueSome(arg1, arg2) + | _ -> ValueNone let isUncheckedDefaultOfValRef g vref = valRefEq g vref g.unchecked_defaultof_vref @@ -3850,35 +3998,41 @@ let isTypeDefOfValRef g vref = // There is an internal version of typedefof defined in prim-types.fs that needs to be detected || (g.compilingFSharpCore && vref.LogicalName = "typedefof") +[] let (|UncheckedDefaultOfExpr|_|) g expr = match expr with - | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isUncheckedDefaultOfValRef g vref -> Some ty - | _ -> None + | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isUncheckedDefaultOfValRef g vref -> ValueSome ty + | _ -> ValueNone +[] let (|TypeOfExpr|_|) g expr = match expr with - | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isTypeOfValRef g vref -> Some ty - | _ -> None + | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isTypeOfValRef g vref -> ValueSome ty + | _ -> ValueNone +[] let (|SizeOfExpr|_|) g expr = match expr with - | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isSizeOfValRef g vref -> Some ty - | _ -> None + | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isSizeOfValRef g vref -> ValueSome ty + | _ -> ValueNone +[] let (|TypeDefOfExpr|_|) g expr = match expr with - | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isTypeDefOfValRef g vref -> Some ty - | _ -> None + | Expr.App (Expr.Val (vref, _, _), _, [ty], [], _) when isTypeDefOfValRef g vref -> ValueSome ty + | _ -> ValueNone +[] let (|NameOfExpr|_|) g expr = match expr with - | Expr.App(Expr.Val(vref,_,_),_,[ty],[],_) when isNameOfValRef g vref -> Some ty - | _ -> None + | Expr.App(Expr.Val(vref,_,_),_,[ty],[],_) when isNameOfValRef g vref -> ValueSome ty + | _ -> ValueNone +[] let (|SeqExpr|_|) g expr = match expr with - | Expr.App(Expr.Val(vref,_,_),_,_,_,_) when valRefEq g vref g.seq_vref -> Some() - | _ -> None + | Expr.App(Expr.Val(vref,_,_),_,_,_,_) when valRefEq g vref g.seq_vref -> ValueSome() + | _ -> ValueNone //-------------------------------------------------------------------------- // DEBUG layout @@ -3945,32 +4099,44 @@ module DebugPrint = else tupleL tinstL ^^ tcL + and auxAddNullness coreL (nullness: Nullness) = + match nullness.Evaluate() with + | NullnessInfo.WithNull -> coreL ^^ wordL (tagText "?") + | NullnessInfo.WithoutNull -> coreL + | NullnessInfo.AmbivalentToNull -> coreL //^^ wordL (tagText "%") + and auxTypeWrapL env isAtomic ty = let wrap x = bracketIfL isAtomic x in // wrap iff require atomic expr match stripTyparEqns ty with | TType_forall (typars, bodyTy) -> (leftL (tagText "!") ^^ layoutTyparDecls typars --- auxTypeL env bodyTy) |> wrap - | TType_ucase (UnionCaseRef(tcref, _), tinst) - - | TType_app (tcref, tinst, _) -> + | TType_ucase (UnionCaseRef(tcref, _), tinst) -> let prefix = tcref.IsPrefixDisplay let tcL = layoutTyconRef tcref auxTyparsL env tcL prefix tinst + | TType_app (tcref, tinst, nullness) -> + let prefix = tcref.IsPrefixDisplay + let tcL = layoutTyconRef tcref + let coreL = auxTyparsL env tcL prefix tinst + auxAddNullness coreL nullness + | TType_tuple (_tupInfo, tys) -> sepListL (wordL (tagText "*")) (List.map (auxTypeAtomL env) tys) |> wrap - | TType_fun (domainTy, rangeTy, _) -> - ((auxTypeAtomL env domainTy ^^ wordL (tagText "->")) --- auxTypeL env rangeTy) |> wrap + | TType_fun (domainTy, rangeTy, nullness) -> + let coreL = ((auxTypeAtomL env domainTy ^^ wordL (tagText "->")) --- auxTypeL env rangeTy) |> wrap + auxAddNullness coreL nullness - | TType_var (typar, _) -> - auxTyparWrapL env isAtomic typar + | TType_var (typar, nullness) -> + let coreL = auxTyparWrapL env isAtomic typar + auxAddNullness coreL nullness | TType_anon (anonInfo, tys) -> - braceBarL (sepListL (wordL (tagText ";")) (List.map2 (fun nm ty -> wordL (tagField nm) --- auxTypeAtomL env ty) (Array.toList anonInfo.SortedNames) tys)) + braceBarL (sepListL (wordL (tagText ";")) (List.map2 (fun nm ty -> wordL (tagField nm) --- auxTypeAtomL env ty) (Array.toList anonInfo.SortedNames) tys)) - | TType_measure unt -> + | TType_measure unt -> #if DEBUG leftL (tagText "{") ^^ (match global_g with @@ -4032,7 +4198,7 @@ module DebugPrint = and auxTraitL env (ttrait: TraitConstraintInfo) = #if DEBUG - let (TTrait(tys, nm, memFlags, argTys, retTy, _)) = ttrait + let (TTrait(tys, nm, memFlags, argTys, retTy, _, _)) = ttrait match global_g with | None -> wordL (tagText "") | Some g -> @@ -4070,8 +4236,12 @@ module DebugPrint = wordL (tagText "struct") |> constraintPrefix | TyparConstraint.IsReferenceType _ -> wordL (tagText "not struct") |> constraintPrefix + | TyparConstraint.NotSupportsNull _ -> + wordL (tagText "not null") |> constraintPrefix | TyparConstraint.IsUnmanaged _ -> wordL (tagText "unmanaged") |> constraintPrefix + | TyparConstraint.AllowsRefStruct _ -> + wordL (tagText "allows ref struct") |> constraintPrefix | TyparConstraint.SimpleChoice(tys, _) -> bracketL (sepListL (sepL (tagText "|")) (List.map (auxTypeL env) tys)) |> constraintPrefix | TyparConstraint.RequiresDefaultConstructor _ -> @@ -4142,7 +4312,7 @@ module DebugPrint = let typeOfValL (v: Val) = valL v - ^^ (if v.MustInline then wordL (tagText "inline ") else emptyL) + ^^ (if v.ShouldInline then wordL (tagText "inline ") else emptyL) ^^ (if v.IsMutable then wordL(tagText "mutable ") else emptyL) ^^ (if layoutTypes then wordL (tagText ":") ^^ typeL v.Type else emptyL) @@ -4625,11 +4795,11 @@ module DebugPrint = let body = moduleOrNamespaceTypeL ms.ModuleOrNamespaceType (header @@-- body) @@ footer - let rec implFilesL implFiles = - aboveListL (List.map implFileL implFiles) - - and implFileL (CheckedImplFile (signature=implFileTy; contents=implFileContents)) = + let implFileL (CheckedImplFile (signature=implFileTy; contents=implFileContents)) = aboveListL [(wordL(tagText "top implementation ")) @@-- mexprL implFileTy implFileContents] + + let implFilesL implFiles = + aboveListL (List.map implFileL implFiles) let showType x = showL (typeL x) @@ -4932,20 +5102,36 @@ let rec accImplHidingInfoAtAssemblyBoundary mdef acc = let ComputeImplementationHidingInfoAtAssemblyBoundary mty acc = accImplHidingInfoAtAssemblyBoundary mty acc +let DoRemap setF remapF = + let rec remap mrmi x = + + match mrmi with + | [] -> x + | (rpi, mhi) :: rest -> + // Explicitly hidden? + if Zset.contains x (setF mhi) then + x + else + remap rest (remapF rpi x) + fun mrmi x -> remap mrmi x + +let DoRemapTycon mrmi x = DoRemap (fun mhi -> mhi.HiddenTycons) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) mrmi x + +let DoRemapVal mrmi x = DoRemap (fun mhi -> mhi.HiddenVals) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) mrmi x + //-------------------------------------------------------------------------- // Compute instances of the above for mexpr -> mty //-------------------------------------------------------------------------- - let IsHidden setF accessF remapF = - let rec check mrmi x = - // Internal/private? - not (canAccessFromEverywhere (accessF x)) || - (match mrmi with - | [] -> false // Ah! we escaped to freedom! - | (rpi, mhi) :: rest -> - // Explicitly hidden? - Zset.contains x (setF mhi) || - // Recurse... + let rec check mrmi x = + // Internal/private? + not (canAccessFromEverywhere (accessF x)) || + (match mrmi with + | [] -> false // Ah! we escaped to freedom! + | (rpi, mhi) :: rest -> + // Explicitly hidden? + Zset.contains x (setF mhi) || + // Recurse... check rest (remapF rpi x)) check @@ -5006,22 +5192,24 @@ let freeTyvarsAllPublic tyvars = /// -- if then else /// -- match e with pat[vs] -> e1[vs] | _ -> e2 +[] let (|LinearMatchExpr|_|) expr = match expr with - | Expr.Match (sp, m, dtree, [|tg1;(TTarget([], e2, _))|], m2, ty) -> Some(sp, m, dtree, tg1, e2, m2, ty) - | _ -> None + | Expr.Match (sp, m, dtree, [|tg1;(TTarget([], e2, _))|], m2, ty) -> ValueSome(sp, m, dtree, tg1, e2, m2, ty) + | _ -> ValueNone let rebuildLinearMatchExpr (sp, m, dtree, tg1, e2, m2, ty) = primMkMatch (sp, m, dtree, [|tg1;(TTarget([], e2, None))|], m2, ty) /// Detect a subset of 'Expr.Op' expressions we process in a linear way (i.e. using tailcalls, rather than /// unbounded stack). Only covers Cons(args,Cons(args,Cons(args,Cons(args,...._)))). +[] let (|LinearOpExpr|_|) expr = match expr with | Expr.Op (TOp.UnionCase _ as op, tinst, args, m) when not args.IsEmpty -> let argsFront, argLast = List.frontAndBack args - Some (op, tinst, argsFront, argLast, m) - | _ -> None + ValueSome (op, tinst, argsFront, argLast, m) + | _ -> ValueNone let rebuildLinearOpExpr (op, tinst, argsFront, argLast, m) = Expr.Op (op, tinst, argsFront@[argLast], m) @@ -5096,6 +5284,33 @@ let tryGetFreeVarsCacheValue opts cache = if opts.canCache then tryGetCacheValue cache else ValueNone +let accFreeLocalVal opts v fvs = + if not opts.includeLocals then fvs else + if Zset.contains v fvs.FreeLocals then fvs + else + let fvs = accFreevarsInVal opts v fvs + {fvs with FreeLocals=Zset.add v fvs.FreeLocals} + +let accFreeInValFlags opts flag acc = + let isMethLocal = + match flag with + | VSlotDirectCall + | CtorValUsedAsSelfInit + | CtorValUsedAsSuperInit -> true + | PossibleConstrainedCall _ + | NormalValUse -> false + let acc = accUsesFunctionLocalConstructs isMethLocal acc + match flag with + | PossibleConstrainedCall ty -> accFreeTyvars opts accFreeInType ty acc + | _ -> acc + +let accLocalTyconRepr opts b fvs = + if not opts.includeLocalTyconReprs then fvs else + if Zset.contains b fvs.FreeLocalTyconReprs then fvs + else { fvs with FreeLocalTyconReprs = Zset.add b fvs.FreeLocalTyconReprs } + +let inline accFreeExnRef _exnc fvs = fvs // Note: this exnc (TyconRef) should be collected the surround types, e.g. tinst of Expr.Op + let rec accBindRhs opts (TBind(_, repr, _)) acc = accFreeInExpr opts repr acc and accFreeInSwitchCases opts csl dflt (acc: FreeVars) = @@ -5122,31 +5337,6 @@ and accFreeInDecisionTree opts x (acc: FreeVars) = | TDSwitch(e1, csl, dflt, _) -> accFreeInExpr opts e1 (accFreeInSwitchCases opts csl dflt acc) | TDSuccess (es, _) -> accFreeInFlatExprs opts es acc | TDBind (bind, body) -> unionFreeVars (bindLhs opts bind (accBindRhs opts bind (freeInDecisionTree opts body))) acc - -and accFreeInValFlags opts flag acc = - let isMethLocal = - match flag with - | VSlotDirectCall - | CtorValUsedAsSelfInit - | CtorValUsedAsSuperInit -> true - | PossibleConstrainedCall _ - | NormalValUse -> false - let acc = accUsesFunctionLocalConstructs isMethLocal acc - match flag with - | PossibleConstrainedCall ty -> accFreeTyvars opts accFreeInType ty acc - | _ -> acc - -and accFreeLocalVal opts v fvs = - if not opts.includeLocals then fvs else - if Zset.contains v fvs.FreeLocals then fvs - else - let fvs = accFreevarsInVal opts v fvs - {fvs with FreeLocals=Zset.add v fvs.FreeLocals} - -and accLocalTyconRepr opts b fvs = - if not opts.includeLocalTyconReprs then fvs else - if Zset.contains b fvs.FreeLocalTyconReprs then fvs - else { fvs with FreeLocalTyconReprs = Zset.add b fvs.FreeLocalTyconReprs } and accUsedRecdOrUnionTyconRepr opts (tc: Tycon) fvs = if (match tc.TypeReprInfo with TFSharpTyconRepr _ -> true | _ -> false) then @@ -5169,8 +5359,7 @@ and accFreeRecdFieldRef opts rfref fvs = let fvs = fvs |> accUsedRecdOrUnionTyconRepr opts rfref.Tycon let fvs = fvs |> accFreevarsInTycon opts rfref.TyconRef { fvs with FreeRecdFields = Zset.add rfref fvs.FreeRecdFields } - -and accFreeExnRef _exnc fvs = fvs // Note: this exnc (TyconRef) should be collected the surround types, e.g. tinst of Expr.Op + and accFreeValRef opts (vref: ValRef) fvs = match vref.IsLocalRef with | true -> accFreeLocalVal opts vref.ResolvedTarget fvs @@ -5365,7 +5554,7 @@ and accFreeInOp opts op acc = | TOp.Reraise -> accUsesRethrow true acc - | TOp.TraitCall (TTrait(tys, _, _, argTys, retTy, sln)) -> + | TOp.TraitCall (TTrait(tys, _, _, argTys, retTy, _, sln)) -> Option.foldBack (accFreeVarsInTraitSln opts) sln.Value (accFreeVarsInTys opts tys (accFreeVarsInTys opts argTys @@ -5743,7 +5932,7 @@ and mapImmediateValsAndTycons ft fv (x: ModuleOrNamespaceType) = let vals = x.AllValsAndMembers |> QueueList.map fv let tycons = x.AllEntities |> QueueList.map ft ModuleOrNamespaceType(x.ModuleOrNamespaceKind, vals, tycons) - + and copyVal compgen (v: Val) = match compgen with | OnlyCloneExprVals when v.IsMemberOrModuleBinding -> v @@ -6074,12 +6263,12 @@ and remapTyconRepr ctxt tmenv repr = | TProvidedTypeRepr info -> TProvidedTypeRepr { info with - LazyBaseType = info.LazyBaseType.Force (range0, ctxt.g.obj_ty) |> remapType tmenv |> LazyWithContext.NotLazy + LazyBaseType = info.LazyBaseType.Force (range0, ctxt.g.obj_ty_withNulls) |> remapType tmenv |> LazyWithContext.NotLazy // The load context for the provided type contains TyconRef objects. We must remap these. // This is actually done on-demand (see the implementation of ProvidedTypeContext) ProvidedType = info.ProvidedType.PApplyNoFailure (fun st -> - let ctxt = st.Context.RemapTyconRefs(unbox >> remapTyconRef tmenv.tyconRefRemap >> box) + let ctxt = st.Context.RemapTyconRefs(unbox >> remapTyconRef tmenv.tyconRefRemap >> box >> (!!)) ProvidedType.ApplyContext (st, ctxt)) } #endif | TNoRepr -> repr @@ -6091,7 +6280,7 @@ and remapTyconAug tmenv (x: TyconAugmentation) = tcaug_equals = x.tcaug_equals |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) tcaug_compare = x.tcaug_compare |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) tcaug_compare_withc = x.tcaug_compare_withc |> Option.map(remapValRef tmenv) - tcaug_hash_and_equals_withc = x.tcaug_hash_and_equals_withc |> Option.map (mapTriple (remapValRef tmenv, remapValRef tmenv, remapValRef tmenv)) + tcaug_hash_and_equals_withc = x.tcaug_hash_and_equals_withc |> Option.map (mapQuadruple (remapValRef tmenv, remapValRef tmenv, remapValRef tmenv, Option.map (remapValRef tmenv))) tcaug_adhoc = x.tcaug_adhoc |> NameMap.map (List.map (remapValRef tmenv)) tcaug_adhoc_list = x.tcaug_adhoc_list |> ResizeArray.map (fun (flag, vref) -> (flag, remapValRef tmenv vref)) tcaug_super = x.tcaug_super |> Option.map (remapType tmenv) @@ -6120,10 +6309,7 @@ and copyAndRemapAndBindModTy ctxt compgen tmenv mty = let tycons = allEntitiesOfModuleOrNamespaceTy mty let vs = allValsOfModuleOrNamespaceTy mty let _, _, tmenvinner = copyAndRemapAndBindTyconsAndVals ctxt compgen tmenv tycons vs - remapModTy compgen tmenvinner mty, tmenvinner - -and remapModTy _compgen tmenv mty = - mapImmediateValsAndTycons (renameTycon tmenv) (renameVal tmenv) mty + (mapImmediateValsAndTycons (renameTycon tmenvinner) (renameVal tmenvinner) mty), tmenvinner and renameTycon tyenv x = let tcref = @@ -6364,7 +6550,7 @@ let rec remarkExpr (m: range) x = // This code allows a feature where if a 'while'/'for' etc in a computation expression is // implemented using code inlining and is ultimately implemented by a corresponding construct somewhere - // in the remark'd code then aat least one debug point is recovered, based on the noted debug point for the original construct. + // in the remark'd code then at least one debug point is recovered, based on the noted debug point for the original construct. // // However it is imperfect, since only one debug point is recovered let op = @@ -6554,7 +6740,7 @@ let rec tyOfExpr g expr = | TOp.ILCall (_, _, _, _, _, _, _, _, _, _, retTypes) | TOp.ILAsm (_, retTypes) -> (match retTypes with [h] -> h | _ -> g.unit_ty) | TOp.UnionCase uc -> actualResultTyOfUnionCase tinst uc | TOp.UnionCaseProof uc -> mkProvenUnionCaseTy uc tinst - | TOp.Recd (_, tcref) -> mkAppTy tcref tinst + | TOp.Recd (_, tcref) -> mkWoNullAppTy tcref tinst | TOp.ExnConstr _ -> g.exn_ty | TOp.Bytes _ -> mkByteArrayTy g | TOp.UInt16s _ -> mkArrayType g g.uint16_ty @@ -6608,7 +6794,7 @@ let isExpansiveUnderInstantiation g fty0 tyargs pargs argsl = | _ :: t -> not (isFunTy g fty) || loop (rangeOfFunTy g fty) t loop fty1 argsl) -let rec mkExprAppAux g f fty argsl m = +let mkExprAppAux g f fty argsl m = match argsl with | [] -> f | _ -> @@ -6779,7 +6965,7 @@ let foldLinearBindingTargetsOfMatch tree (targets: _[]) = treeR, targetsR // Simplify a little as we go, including dead target elimination -let rec simplifyTrivialMatch spBind mExpr mMatch ty tree (targets : _[]) = +let simplifyTrivialMatch spBind mExpr mMatch ty tree (targets : _[]) = match tree with | TDSuccess(es, n) -> if n >= targets.Length then failwith "simplifyTrivialMatch: target out of range" @@ -7394,6 +7580,40 @@ let mkTwo g m = mkInt g m 2 let mkMinusOne g m = mkInt g m -1 +let mkTypedZero g m ty = + if typeEquivAux EraseMeasures g ty g.int32_ty then Expr.Const (Const.Int32 0, m, ty) + elif typeEquivAux EraseMeasures g ty g.int64_ty then Expr.Const (Const.Int64 0L, m, ty) + elif typeEquivAux EraseMeasures g ty g.uint64_ty then Expr.Const (Const.UInt64 0UL, m, ty) + elif typeEquivAux EraseMeasures g ty g.uint32_ty then Expr.Const (Const.UInt32 0u, m, ty) + elif typeEquivAux EraseMeasures g ty g.nativeint_ty then Expr.Const (Const.IntPtr 0L, m, ty) + elif typeEquivAux EraseMeasures g ty g.unativeint_ty then Expr.Const (Const.UIntPtr 0UL, m, ty) + elif typeEquivAux EraseMeasures g ty g.int16_ty then Expr.Const (Const.Int16 0s, m, ty) + elif typeEquivAux EraseMeasures g ty g.uint16_ty then Expr.Const (Const.UInt16 0us, m, ty) + elif typeEquivAux EraseMeasures g ty g.sbyte_ty then Expr.Const (Const.SByte 0y, m, ty) + elif typeEquivAux EraseMeasures g ty g.byte_ty then Expr.Const (Const.Byte 0uy, m, ty) + elif typeEquivAux EraseMeasures g ty g.char_ty then Expr.Const (Const.Char '\000', m, ty) + elif typeEquivAux EraseMeasures g ty g.float32_ty then Expr.Const (Const.Single 0.0f, m, ty) + elif typeEquivAux EraseMeasures g ty g.float_ty then Expr.Const (Const.Double 0.0, m, ty) + elif typeEquivAux EraseMeasures g ty g.decimal_ty then Expr.Const (Const.Decimal 0m, m, ty) + else error (InternalError ($"Unrecognized numeric type '{ty}'.", m)) + +let mkTypedOne g m ty = + if typeEquivAux EraseMeasures g ty g.int32_ty then Expr.Const (Const.Int32 1, m, ty) + elif typeEquivAux EraseMeasures g ty g.int64_ty then Expr.Const (Const.Int64 1L, m, ty) + elif typeEquivAux EraseMeasures g ty g.uint64_ty then Expr.Const (Const.UInt64 1UL, m, ty) + elif typeEquivAux EraseMeasures g ty g.uint32_ty then Expr.Const (Const.UInt32 1u, m, ty) + elif typeEquivAux EraseMeasures g ty g.nativeint_ty then Expr.Const (Const.IntPtr 1L, m, ty) + elif typeEquivAux EraseMeasures g ty g.unativeint_ty then Expr.Const (Const.UIntPtr 1UL, m, ty) + elif typeEquivAux EraseMeasures g ty g.int16_ty then Expr.Const (Const.Int16 1s, m, ty) + elif typeEquivAux EraseMeasures g ty g.uint16_ty then Expr.Const (Const.UInt16 1us, m, ty) + elif typeEquivAux EraseMeasures g ty g.sbyte_ty then Expr.Const (Const.SByte 1y, m, ty) + elif typeEquivAux EraseMeasures g ty g.byte_ty then Expr.Const (Const.Byte 1uy, m, ty) + elif typeEquivAux EraseMeasures g ty g.char_ty then Expr.Const (Const.Char '\001', m, ty) + elif typeEquivAux EraseMeasures g ty g.float32_ty then Expr.Const (Const.Single 1.0f, m, ty) + elif typeEquivAux EraseMeasures g ty g.float_ty then Expr.Const (Const.Double 1.0, m, ty) + elif typeEquivAux EraseMeasures g ty g.decimal_ty then Expr.Const (Const.Decimal 1m, m, ty) + else error (InternalError ($"Unrecognized numeric type '{ty}'.", m)) + let destInt32 = function Expr.Const (Const.Int32 n, _, _) -> Some n | _ -> None let isIDelegateEventType g ty = @@ -7510,7 +7730,7 @@ let permuteExprList (sigma: int[]) (exprs: Expr list) (ty: TType list) (names: s /// We still need to sort by index. let mkRecordExpr g (lnk, tcref, tinst, unsortedRecdFields: RecdFieldRef list, unsortedFieldExprs, m) = // Remove any abbreviations - let tcref, tinst = destAppTy g (mkAppTy tcref tinst) + let tcref, tinst = destAppTy g (mkWoNullAppTy tcref tinst) let sortedRecdFields = unsortedRecdFields |> List.indexed |> Array.ofList |> Array.sortBy (fun (_, r) -> r.Index) let sigma = Array.create sortedRecdFields.Length -1 @@ -7795,9 +8015,9 @@ let TryEliminateDesugaredConstants g m c = | _ -> None -let mkSeqTy (g: TcGlobals) ty = mkAppTy g.seq_tcr [ty] +let mkSeqTy (g: TcGlobals) ty = mkWoNullAppTy g.seq_tcr [ty] -let mkIEnumeratorTy (g: TcGlobals) ty = mkAppTy g.tcref_System_Collections_Generic_IEnumerator [ty] +let mkIEnumeratorTy (g: TcGlobals) ty = mkWoNullAppTy g.tcref_System_Collections_Generic_IEnumerator [ty] let mkCallSeqCollect g m alphaTy betaTy arg1 arg2 = let enumty2 = try rangeOfFunTy g (tyOfExpr g arg1) with _ -> (* defensive programming *) (mkSeqTy g betaTy) @@ -8022,12 +8242,12 @@ let mkCompilationMappingAttrForQuotationResource (g: TcGlobals) (nm, tys: ILType #if !NO_TYPEPROVIDERS let isTypeProviderAssemblyAttr (cattr: ILAttribute) = - cattr.Method.DeclaringType.BasicQualifiedName = typeof.FullName + cattr.Method.DeclaringType.BasicQualifiedName = !! typeof.FullName let TryDecodeTypeProviderAssemblyAttr (cattr: ILAttribute) : string MaybeNull option = if isTypeProviderAssemblyAttr cattr then - let parms, _args = decodeILAttribData cattr - match parms with // The first parameter to the attribute is the name of the assembly with the compiler extensions. + let params_, _args = decodeILAttribData cattr + match params_ with // The first parameter to the attribute is the name of the assembly with the compiler extensions. | ILAttribElem.String (Some assemblyName) :: _ -> Some assemblyName | ILAttribElem.String None :: _ -> Some null | [] -> Some null @@ -8139,10 +8359,11 @@ let MultiLambdaToTupledLambda g vs body = let tupledv, untupler = untupledToRefTupled g vs tupledv, untupler body +[] let (|RefTuple|_|) expr = match expr with - | Expr.Op (TOp.Tuple (TupInfo.Const false), _, args, _) -> Some args - | _ -> None + | Expr.Op (TOp.Tuple (TupInfo.Const false), _, args, _) -> ValueSome args + | _ -> ValueNone let MultiLambdaToTupledLambdaIfNeeded g (vs, arg) body = match vs, arg with @@ -8215,39 +8436,44 @@ let rec MakeApplicationAndBetaReduceAux g (f, fty, tyargsl: TType list list, arg let MakeApplicationAndBetaReduce g (f, fty, tyargsl, argl, m) = MakeApplicationAndBetaReduceAux g (f, fty, tyargsl, argl, m) +[] let (|NewDelegateExpr|_|) g expr = match expr with | Expr.Obj (lambdaId, ty, a, b, [TObjExprMethod(c, d, e, tmvs, body, f)], [], m) when isDelegateTy g ty -> - Some (lambdaId, List.concat tmvs, body, m, (fun bodyR -> Expr.Obj (lambdaId, ty, a, b, [TObjExprMethod(c, d, e, tmvs, bodyR, f)], [], m))) - | _ -> None + ValueSome (lambdaId, List.concat tmvs, body, m, (fun bodyR -> Expr.Obj (lambdaId, ty, a, b, [TObjExprMethod(c, d, e, tmvs, bodyR, f)], [], m))) + | _ -> ValueNone +[] let (|DelegateInvokeExpr|_|) g expr = match expr with | Expr.App ((Expr.Val (invokeRef, _, _)) as delInvokeRef, delInvokeTy, [], [delExpr;delInvokeArg], m) when invokeRef.LogicalName = "Invoke" && isFSharpDelegateTy g (tyOfExpr g delExpr) -> - Some(delInvokeRef, delInvokeTy, delExpr, delInvokeArg, m) - | _ -> None + ValueSome(delInvokeRef, delInvokeTy, delExpr, delInvokeArg, m) + | _ -> ValueNone +[] let (|OpPipeRight|_|) g expr = match expr with | Expr.App (Expr.Val (vref, _, _), _, [_; resType], [xExpr; fExpr], m) when valRefEq g vref g.piperight_vref -> - Some(resType, xExpr, fExpr, m) - | _ -> None + ValueSome(resType, xExpr, fExpr, m) + | _ -> ValueNone +[] let (|OpPipeRight2|_|) g expr = match expr with | Expr.App (Expr.Val (vref, _, _), _, [_; _; resType], [Expr.Op (TOp.Tuple _, _, [arg1; arg2], _); fExpr], m) when valRefEq g vref g.piperight2_vref -> - Some(resType, arg1, arg2, fExpr, m) - | _ -> None + ValueSome(resType, arg1, arg2, fExpr, m) + | _ -> ValueNone +[] let (|OpPipeRight3|_|) g expr = match expr with | Expr.App (Expr.Val (vref, _, _), _, [_; _; _; resType], [Expr.Op (TOp.Tuple _, _, [arg1; arg2; arg3], _); fExpr], m) when valRefEq g vref g.piperight3_vref -> - Some(resType, arg1, arg2, arg3, fExpr, m) - | _ -> None + ValueSome(resType, arg1, arg2, arg3, fExpr, m) + | _ -> ValueNone let rec MakeFSharpDelegateInvokeAndTryBetaReduce g (delInvokeRef, delExpr, delInvokeTy, delInvokeArg, m) = match delExpr with @@ -8298,14 +8524,15 @@ let stripTupledFunTy g ty = let curriedArgTys = argTys |> List.map (tryDestRefTupleTy g) curriedArgTys, retTy +[] let (|ExprValWithPossibleTypeInst|_|) expr = match expr with | Expr.App (Expr.Val (vref, flags, m), _fty, tyargs, [], _) -> - Some (vref, flags, tyargs, m) + ValueSome (vref, flags, tyargs, m) | Expr.Val (vref, flags, m) -> - Some (vref, flags, [], m) + ValueSome (vref, flags, [], m) | _ -> - None + ValueNone let mkCoerceIfNeeded g tgtTy srcTy expr = if typeEquiv g tgtTy srcTy then @@ -8317,6 +8544,10 @@ let mkCompGenLetIn m nm ty e f = let v, ve = mkCompGenLocal m nm ty mkCompGenLet m v e (f (v, ve)) +let mkCompGenLetMutableIn m nm ty e f = + let v, ve = mkMutableCompGenLocal m nm ty + mkCompGenLet m v e (f (v, ve)) + /// Take a node representing a coercion from one function type to another, e.g. /// A -> A * A -> int /// to @@ -8714,7 +8945,7 @@ let typarEnc _g (gtpsType, gtpsMethod) typar = warning(InternalError("Typar not found during XmlDoc generation", typar.Range)) "``0" -let rec typeEnc g (gtpsType, gtpsMethod) ty = +let rec typeEnc g (gtpsType, gtpsMethod) ty = let stripped = stripTyEqnsAndMeasureEqns g ty match stripped with | TType_forall _ -> @@ -8728,8 +8959,8 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = let ety = destNativePtrTy g ty typeEnc g (gtpsType, gtpsMethod) ety + "*" - | _ when isArrayTy g ty -> - let tcref, tinst = destAppTy g ty + | TType_app (_, _, _nullness) when isArrayTy g ty -> + let tcref, tinst = destAppTy g ty let rank = rankOfArrayTyconRef g tcref let arraySuffix = "[" + String.concat ", " (List.replicate (rank-1) "0:") + "]" typeEnc g (gtpsType, gtpsMethod) (List.head tinst) + arraySuffix @@ -8739,7 +8970,7 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = let tyName = let ty = stripTyEqnsAndMeasureEqns g ty match ty with - | TType_app (tcref, _tinst, _) -> + | TType_app (tcref, _tinst, _nullness) -> // Generic type names are (name + "`" + digits) where name does not contain "`". // In XML doc, when used in type instances, these do not use the ticks. let path = Array.toList (fullMangledPathToTyconRef tcref) @ [tcref.CompiledName] @@ -8758,10 +8989,10 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = else sprintf "System.Tuple%s"(tyargsEnc g (gtpsType, gtpsMethod) tys) - | TType_fun (domainTy, rangeTy, _) -> + | TType_fun (domainTy, rangeTy, _nullness) -> "Microsoft.FSharp.Core.FSharpFunc" + tyargsEnc g (gtpsType, gtpsMethod) [domainTy; rangeTy] - | TType_var (typar, _) -> + | TType_var (typar, _nullness) -> typarEnc g (gtpsType, gtpsMethod) typar | TType_measure _ -> "?" @@ -8774,7 +9005,7 @@ and tyargsEnc g (gtpsType, gtpsMethod) args = let XmlDocArgsEnc g (gtpsType, gtpsMethod) argTys = if isNil argTys then "" - else "(" + String.concat "," (List.map (typeEnc g (gtpsType, gtpsMethod)) argTys) + ")" + else "(" + String.concat "," (List.map (typeEnc g (gtpsType, gtpsMethod)) argTys) + ")" let buildAccessPath (cp: CompilationPath option) = match cp with @@ -8783,7 +9014,7 @@ let buildAccessPath (cp: CompilationPath option) = System.String.Join(".", ap) | None -> "Extension Type" -let prependPath path name = if path = "" then name else path + "." + name +let prependPath path name = if String.IsNullOrEmpty(path) then name else !!path + "." + name let XmlDocSigOfVal g full path (v: Val) = let parentTypars, methTypars, cxs, argInfos, retTy, prefix, path, name = @@ -8898,64 +9129,135 @@ let isNonNullableStructTyparTy g ty = | ValueNone -> false -// Note, isRefTy does not include type parameters with the ': not struct' constraint +// Note, isRefTy does not include type parameters with the ': not struct' or ': null' constraints // This predicate is used to detect those type parameters. let isReferenceTyparTy g ty = match tryDestTyparTy g ty with | ValueSome tp -> - tp.Constraints |> List.exists (function TyparConstraint.IsReferenceType _ -> true | _ -> false) + tp.Constraints |> List.exists (function + | TyparConstraint.IsReferenceType _ -> true + | TyparConstraint.SupportsNull _ -> true + | _ -> false) | ValueNone -> false +let isSupportsNullTyparTy g ty = + if isReferenceTyparTy g ty then + (destTyparTy g ty).Constraints |> List.exists (function TyparConstraint.SupportsNull _ -> true | _ -> false) + else + false + let TypeNullNever g ty = let underlyingTy = stripTyEqnsAndMeasureEqns g ty isStructTy g underlyingTy || isByrefTy g underlyingTy || isNonNullableStructTyparTy g ty -/// Indicates if the type admits the use of 'null' as a value +/// The pre-nullness logic about whether a type admits the use of 'null' as a value. let TypeNullIsExtraValue g m ty = if isILReferenceTy g ty || isDelegateTy g ty then - // Putting AllowNullLiteralAttribute(false) on an IL or provided type means 'null' can't be used with that type - not (match tryTcrefOfAppTy g ty with ValueSome tcref -> TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref = Some false | _ -> false) + match tryTcrefOfAppTy g ty with + | ValueSome tcref -> + // Putting AllowNullLiteralAttribute(false) on an IL or provided + // type means 'null' can't be used with that type, otherwise it can + TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref <> Some false + | _ -> + // In pre-nullness, other IL reference types (e.g. arrays) always support null + true elif TypeNullNever g ty then false else - // Putting AllowNullLiteralAttribute(true) on an F# type means 'null' can be used with that type + // In F# 4.x, putting AllowNullLiteralAttribute(true) on an F# type means 'null' can be used with that type match tryTcrefOfAppTy g ty with | ValueSome tcref -> TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref = Some true | ValueNone -> // Consider type parameters - if isReferenceTyparTy g ty then - (destTyparTy g ty).Constraints |> List.exists (function TyparConstraint.SupportsNull _ -> true | _ -> false) - else - false - + isSupportsNullTyparTy g ty + +// Any mention of a type with AllowNullLiteral(true) is considered to be with-null +let intrinsicNullnessOfTyconRef g (tcref: TyconRef) = + match TryFindTyconRefBoolAttribute g tcref.Range g.attrib_AllowNullLiteralAttribute tcref with + | Some true -> g.knownWithNull + | _ -> g.knownWithoutNull + +let nullnessOfTy g ty = + ty + |> stripTyEqns g + |> function + | TType_app(tcref, _, nullness) -> + let nullness2 = intrinsicNullnessOfTyconRef g tcref + if nullness2 === g.knownWithoutNull then + nullness + else + combineNullness nullness nullness2 + | TType_fun (_, _, nullness) | TType_var (_, nullness) -> + nullness + | _ -> g.knownWithoutNull + +let changeWithNullReqTyToVariable g reqTy = + let sty = stripTyEqns g reqTy + match isTyparTy g sty with + | false -> + match nullnessOfTy g sty with + | Nullness.Known NullnessInfo.AmbivalentToNull + | Nullness.Known NullnessInfo.WithNull when g.checkNullness -> + reqTy |> replaceNullnessOfTy (NewNullnessVar()) + | _ -> reqTy + | true -> reqTy + +/// When calling a null-allowing API, we prefer to infer a without null argument for idiomatic F# code. +/// That is, unless caller explicitly marks a value (e.g. coming from a function parameter) as WithNull, it should not be inferred as such. +let reqTyForArgumentNullnessInference g actualTy reqTy = + // Only change reqd nullness if actualTy is an inference variable + match tryDestTyparTy g actualTy with + | ValueSome t when t.IsCompilerGenerated && not(t.Constraints |> List.exists(function | TyparConstraint.SupportsNull _ -> true | _ -> false))-> + changeWithNullReqTyToVariable g reqTy + | _ -> reqTy + +let TypeHasAllowNull (tcref:TyconRef) g m = + not tcref.IsStructOrEnumTycon && + not (isByrefLikeTyconRef g m tcref) && + (TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref = Some true) + +/// The new logic about whether a type admits the use of 'null' as a value. +let TypeNullIsExtraValueNew g m ty = + let sty = stripTyparEqns ty + + // Check if the type has AllowNullLiteral + (match tryTcrefOfAppTy g sty with + | ValueSome tcref -> TypeHasAllowNull tcref g m + | _ -> false) + || + // Check if the type has a nullness annotation + (match (nullnessOfTy g sty).Evaluate() with + | NullnessInfo.AmbivalentToNull -> false + | NullnessInfo.WithoutNull -> false + | NullnessInfo.WithNull -> true) + || + // Check if the type has a ': null' constraint + isSupportsNullTyparTy g ty + +/// The pre-nullness logic about whether a type uses 'null' as a true representation value let TypeNullIsTrueValue g ty = (match tryTcrefOfAppTy g ty with | ValueSome tcref -> IsUnionTypeWithNullAsTrueValue g tcref.Deref | _ -> false) || isUnitTy g ty +/// Indicates if unbox(null) is actively rejected at runtime. See nullability RFC. This applies to types that don't have null +/// as a valid runtime representation under old compatibility rules. let TypeNullNotLiked g m ty = not (TypeNullIsExtraValue g m ty) && not (TypeNullIsTrueValue g ty) && not (TypeNullNever g ty) -// The non-inferring counter-part to SolveTypeUseSupportsNull -let TypeSatisfiesNullConstraint g m ty = - TypeNullIsExtraValue g m ty -// The non-inferring counter-part to SolveTypeRequiresDefaultValue (and SolveTypeRequiresDefaultConstructor for struct types) -let rec TypeHasDefaultValue g m ty = +let rec TypeHasDefaultValueAux isNew g m ty = let ty = stripTyEqnsAndMeasureEqns g ty - // Check reference types - precisely the ones satisfying the ': null' constraint have default values - TypeSatisfiesNullConstraint g m ty - || - // Check nominal struct types - (isStructTy g ty && - // F# struct types have a DefaultValue if all their field types have a default value excluding those with DefaultValue(false) + (if isNew then TypeNullIsExtraValueNew g m ty else TypeNullIsExtraValue g m ty) + || (isStructTy g ty && + // Is it an F# struct type? (if isFSharpStructTy g ty then let tcref, tinst = destAppTy g ty let flds = @@ -8964,17 +9266,17 @@ let rec TypeHasDefaultValue g m ty = // We can ignore fields with the DefaultValue(false) attribute |> List.filter (fun fld -> TryFindFSharpBoolAttribute g g.attrib_DefaultValueAttribute fld.FieldAttribs <> Some false) - flds |> List.forall (actualTyOfRecdField (mkTyconRefInst tcref tinst) >> TypeHasDefaultValue g m) + flds |> List.forall (actualTyOfRecdField (mkTyconRefInst tcref tinst) >> TypeHasDefaultValueAux isNew g m) // Struct tuple types have a DefaultValue if all their element types have a default value elif isStructTupleTy g ty then - destStructTupleTy g ty |> List.forall (TypeHasDefaultValue g m) + destStructTupleTy g ty |> List.forall (TypeHasDefaultValueAux isNew g m) // Struct anonymous record types have a DefaultValue if all their element types have a default value elif isStructAnonRecdTy g ty then match tryDestAnonRecdTy g ty with | ValueNone -> true - | ValueSome (_, ptys) -> ptys |> List.forall (TypeHasDefaultValue g m) + | ValueSome (_, ptys) -> ptys |> List.forall (TypeHasDefaultValueAux isNew g m) else // All nominal struct types defined in other .NET languages have a DefaultValue regardless of their instantiation true)) @@ -8983,32 +9285,56 @@ let rec TypeHasDefaultValue g m ty = (isNonNullableStructTyparTy g ty && (destTyparTy g ty).Constraints |> List.exists (function TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false)) +let TypeHasDefaultValue (g: TcGlobals) m ty = TypeHasDefaultValueAux false g m ty + +let TypeHasDefaultValueNew g m ty = TypeHasDefaultValueAux true g m ty + /// Determines types that are potentially known to satisfy the 'comparable' constraint and returns /// a set of residual types that must also satisfy the constraint +[] let (|SpecialComparableHeadType|_|) g ty = if isAnyTupleTy g ty then let _tupInfo, elemTys = destAnyTupleTy g ty - Some elemTys + ValueSome elemTys elif isAnonRecdTy g ty then match tryDestAnonRecdTy g ty with - | ValueNone -> Some [] - | ValueSome (_anonInfo, elemTys) -> Some elemTys + | ValueNone -> ValueSome [] + | ValueSome (_anonInfo, elemTys) -> ValueSome elemTys else match tryAppTy g ty with | ValueSome (tcref, tinst) -> if isArrayTyconRef g tcref || tyconRefEq g tcref g.system_UIntPtr_tcref || tyconRefEq g tcref g.system_IntPtr_tcref then - Some tinst + ValueSome tinst else - None + ValueNone | _ -> - None + ValueNone +[] let (|SpecialEquatableHeadType|_|) g ty = (|SpecialComparableHeadType|_|) g ty +[] let (|SpecialNotEquatableHeadType|_|) g ty = - if isFunTy g ty then Some() else None + if isFunTy g ty then ValueSome() else ValueNone + +let (|TyparTy|NullableTypar|StructTy|NullTrueValue|NullableRefType|WithoutNullRefType|UnresolvedRefType|) (ty,g) = + let sty = ty |> stripTyEqns g + if isTyparTy g sty then + if (nullnessOfTy g sty).TryEvaluate() = ValueSome NullnessInfo.WithNull then + NullableTypar + else + TyparTy + elif isStructTy g sty then + StructTy + elif TypeNullIsTrueValue g sty then + NullTrueValue + else + match (nullnessOfTy g sty).TryEvaluate() with + | ValueSome NullnessInfo.WithNull -> NullableRefType + | ValueSome NullnessInfo.WithoutNull -> WithoutNullRefType + | _ -> UnresolvedRefType // Can we use the fast helper for the 'LanguagePrimitives.IntrinsicFunctions.TypeTestGeneric'? let canUseTypeTestFast g ty = @@ -9016,9 +9342,14 @@ let canUseTypeTestFast g ty = not (TypeNullIsTrueValue g ty) // Can we use the fast helper for the 'LanguagePrimitives.IntrinsicFunctions.UnboxGeneric'? -let canUseUnboxFast g m ty = - not (isTyparTy g ty) && - not (TypeNullNotLiked g m ty) +let canUseUnboxFast (g:TcGlobals) m ty = + if g.checkNullness then + match (ty,g) with + | TyparTy | WithoutNullRefType | UnresolvedRefType -> false + | StructTy | NullTrueValue | NullableRefType | NullableTypar -> true + else + not (isTyparTy g ty) && + not (TypeNullNotLiked g m ty) //-------------------------------------------------------------------------- // Nullness tests and pokes @@ -9215,7 +9546,7 @@ let mkChoiceTy (g: TcGlobals) m tinst = match List.length tinst with | 0 -> g.unit_ty | 1 -> List.head tinst - | length -> mkAppTy (mkChoiceTyconRef g m length) tinst + | length -> mkWoNullAppTy (mkChoiceTyconRef g m length) tinst let mkChoiceCaseRef g m n i = mkUnionCaseRef (mkChoiceTyconRef g m n) ("Choice"+string (i+1)+"Of"+string n) @@ -9226,14 +9557,17 @@ type ActivePatternInfo with member x.DisplayNameByIdx idx = x.ActiveTags[idx] |> ConvertLogicalNameToDisplayName - member apinfo.ResultType g m retTys isStruct = + member apinfo.ResultType g m retTys retKind = let choicety = mkChoiceTy g m retTys if apinfo.IsTotal then choicety - elif isStruct then mkValueOptionTy g choicety - else mkOptionTy g choicety + else + match retKind with + | ActivePatternReturnKind.RefTypeWrapper -> mkOptionTy g choicety + | ActivePatternReturnKind.StructTypeWrapper -> mkValueOptionTy g choicety + | ActivePatternReturnKind.Boolean -> g.bool_ty - member apinfo.OverallType g m argTy retTys isStruct = - mkFunTy g argTy (apinfo.ResultType g m retTys isStruct) + member apinfo.OverallType g m argTy retTys retKind = + mkFunTy g argTy (apinfo.ResultType g m retTys retKind) //--------------------------------------------------------------------------- // Active pattern validation @@ -9722,7 +10056,7 @@ let EvalArithUnOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt3 | _ -> error (Error ( FSComp.SR.tastNotAConstantExpression(), m)) with :? System.OverflowException -> error (Error ( FSComp.SR.tastConstantExpressionOverflow(), m)) -let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt32, opUInt64, opSingle, opDouble) (arg1: Expr) (arg2: Expr) = +let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt32, opUInt64, opSingle, opDouble, opDecimal) (arg1: Expr) (arg2: Expr) = // At compile-time we check arithmetic let m = unionRanges arg1.Range arg2.Range try @@ -9737,6 +10071,7 @@ let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt | Expr.Const (Const.UInt64 x1, _, ty), Expr.Const (Const.UInt64 x2, _, _) -> Expr.Const (Const.UInt64 (opUInt64 x1 x2), m, ty) | Expr.Const (Const.Single x1, _, ty), Expr.Const (Const.Single x2, _, _) -> Expr.Const (Const.Single (opSingle x1 x2), m, ty) | Expr.Const (Const.Double x1, _, ty), Expr.Const (Const.Double x2, _, _) -> Expr.Const (Const.Double (opDouble x1 x2), m, ty) + | Expr.Const (Const.Decimal x1, _, ty), Expr.Const (Const.Decimal x2, _, _) -> Expr.Const (Const.Decimal (opDecimal x1 x2), m, ty) | _ -> error (Error ( FSComp.SR.tastNotAConstantExpression(), m)) with :? System.OverflowException -> error (Error ( FSComp.SR.tastConstantExpressionOverflow(), m)) @@ -9768,9 +10103,10 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = | Const.Single _ | Const.Char _ | Const.Zero - | Const.String _ -> + | Const.String _ + | Const.Decimal _ -> x - | Const.Decimal _ | Const.IntPtr _ | Const.UIntPtr _ | Const.Unit -> + | Const.IntPtr _ | Const.UIntPtr _ | Const.Unit -> errorR (Error ( FSComp.SR.tastNotAConstantExpression(), m)) x @@ -9786,7 +10122,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | IntegerConstExpr -> - EvalArithBinOp ((|||), (|||), (|||), (|||), (|||), (|||), (|||), (|||), ignore2, ignore2) v1 (EvalAttribArgExpr suppressLangFeatureCheck g arg2) + EvalArithBinOp ((|||), (|||), (|||), (|||), (|||), (|||), (|||), (|||), ignore2, ignore2, ignore2) v1 (EvalAttribArgExpr suppressLangFeatureCheck g arg2) | _ -> errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -9801,7 +10137,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = Expr.Const (Const.Char (x1 + x2), m, ty) | _ -> checkFeature() - EvalArithBinOp (Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+)) v1 v2 + EvalArithBinOp (Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+)) v1 v2 | SpecificBinopExpr g g.unchecked_subtraction_vref (arg1, arg2) -> checkFeature() let v1, v2 = EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1, EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2 @@ -9814,16 +10150,16 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = Expr.Const (Const.Char (x1 - x2), m, ty) #endif | _ -> - EvalArithBinOp (Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-)) v1 v2 + EvalArithBinOp (Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-), Checked.(-)) v1 v2 | SpecificBinopExpr g g.unchecked_multiply_vref (arg1, arg2) -> checkFeature() - EvalArithBinOp (Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp (Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | SpecificBinopExpr g g.unchecked_division_vref (arg1, arg2) -> checkFeature() - EvalArithBinOp ((/), (/), (/), (/), (/), (/), (/), (/), (/), (/)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((/), (/), (/), (/), (/), (/), (/), (/), (/), (/), (/)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | SpecificBinopExpr g g.unchecked_modulus_vref (arg1, arg2) -> checkFeature() - EvalArithBinOp ((%), (%), (%), (%), (%), (%), (%), (%), (%), (%)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((%), (%), (%), (%), (%), (%), (%), (%), (%), (%), (%)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | SpecificBinopExpr g g.bitwise_shift_left_vref (arg1, arg2) -> checkFeature() EvalArithShiftOp ((<<<), (<<<), (<<<), (<<<), (<<<), (<<<), (<<<), (<<<)) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg1) (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) @@ -9836,7 +10172,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | IntegerConstExpr -> - EvalArithBinOp ((&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), (&&&), ignore2, ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | _ -> errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -9846,7 +10182,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | IntegerConstExpr -> - EvalArithBinOp ((^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp ((^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), (^^^), ignore2, ignore2, ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | _ -> errorR (Error (FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -9856,7 +10192,7 @@ let rec EvalAttribArgExpr suppressLangFeatureCheck (g: TcGlobals) (x: Expr) = match v1 with | FloatConstExpr -> - EvalArithBinOp (ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ( ** ), ( ** )) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) + EvalArithBinOp (ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ignore2, ( ** ), ( ** ), ignore2) v1 (EvalAttribArgExpr SuppressLanguageFeatureCheck.Yes g arg2) | _ -> errorR (Error (FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -9922,23 +10258,24 @@ and EvaledAttribExprEquality g e1 e2 = | TypeDefOfExpr g ty1, TypeDefOfExpr g ty2 -> typeEquiv g ty1 ty2 | _ -> false +[] let (|ConstToILFieldInit|_|) c = match c with - | Const.SByte n -> Some (ILFieldInit.Int8 n) - | Const.Int16 n -> Some (ILFieldInit.Int16 n) - | Const.Int32 n -> Some (ILFieldInit.Int32 n) - | Const.Int64 n -> Some (ILFieldInit.Int64 n) - | Const.Byte n -> Some (ILFieldInit.UInt8 n) - | Const.UInt16 n -> Some (ILFieldInit.UInt16 n) - | Const.UInt32 n -> Some (ILFieldInit.UInt32 n) - | Const.UInt64 n -> Some (ILFieldInit.UInt64 n) - | Const.Bool n -> Some (ILFieldInit.Bool n) - | Const.Char n -> Some (ILFieldInit.Char (uint16 n)) - | Const.Single n -> Some (ILFieldInit.Single n) - | Const.Double n -> Some (ILFieldInit.Double n) - | Const.String s -> Some (ILFieldInit.String s) - | Const.Zero -> Some ILFieldInit.Null - | _ -> None + | Const.SByte n -> ValueSome (ILFieldInit.Int8 n) + | Const.Int16 n -> ValueSome (ILFieldInit.Int16 n) + | Const.Int32 n -> ValueSome (ILFieldInit.Int32 n) + | Const.Int64 n -> ValueSome (ILFieldInit.Int64 n) + | Const.Byte n -> ValueSome (ILFieldInit.UInt8 n) + | Const.UInt16 n -> ValueSome (ILFieldInit.UInt16 n) + | Const.UInt32 n -> ValueSome (ILFieldInit.UInt32 n) + | Const.UInt64 n -> ValueSome (ILFieldInit.UInt64 n) + | Const.Bool n -> ValueSome (ILFieldInit.Bool n) + | Const.Char n -> ValueSome (ILFieldInit.Char (uint16 n)) + | Const.Single n -> ValueSome (ILFieldInit.Single n) + | Const.Double n -> ValueSome (ILFieldInit.Double n) + | Const.String s -> ValueSome (ILFieldInit.String s) + | Const.Zero -> ValueSome ILFieldInit.Null + | _ -> ValueNone let EvalLiteralExprOrAttribArg g x = match x with @@ -10019,49 +10356,56 @@ let mkGetTupleItemN g m n (ty: ILType) isStruct expr retTy = mkAsmExpr ([mkNormalCall(mkILMethodSpecForTupleItem g ty n)], [], [expr], [retTy], m) /// Match an Int32 constant expression +[] let (|Int32Expr|_|) expr = match expr with - | Expr.Const (Const.Int32 n, _, _) -> Some n - | _ -> None + | Expr.Const (Const.Int32 n, _, _) -> ValueSome n + | _ -> ValueNone /// Match a try-finally expression +[] let (|TryFinally|_|) expr = match expr with - | Expr.Op (TOp.TryFinally _, [_resTy], [Expr.Lambda (_, _, _, [_], e1, _, _); Expr.Lambda (_, _, _, [_], e2, _, _)], _) -> Some(e1, e2) - | _ -> None + | Expr.Op (TOp.TryFinally _, [_resTy], [Expr.Lambda (_, _, _, [_], e1, _, _); Expr.Lambda (_, _, _, [_], e2, _, _)], _) -> ValueSome(e1, e2) + | _ -> ValueNone // detect ONLY the while loops that result from compiling 'for ... in ... do ...' +[] let (|WhileLoopForCompiledForEachExpr|_|) expr = match expr with | Expr.Op (TOp.While (spInWhile, WhileLoopForCompiledForEachExprMarker), _, [Expr.Lambda (_, _, _, [_], e1, _, _); Expr.Lambda (_, _, _, [_], e2, _, _)], m) -> - Some(spInWhile, e1, e2, m) - | _ -> None + ValueSome(spInWhile, e1, e2, m) + | _ -> ValueNone +[] let (|Let|_|) expr = match expr with - | Expr.Let (TBind(v, e1, sp), e2, _, _) -> Some(v, e1, sp, e2) - | _ -> None + | Expr.Let (TBind(v, e1, sp), e2, _, _) -> ValueSome(v, e1, sp, e2) + | _ -> ValueNone +[] let (|RangeInt32Step|_|) g expr = match expr with // detect 'n .. m' | Expr.App (Expr.Val (vf, _, _), _, [tyarg], [startExpr;finishExpr], _) - when valRefEq g vf g.range_op_vref && typeEquiv g tyarg g.int_ty -> Some(startExpr, 1, finishExpr) + when valRefEq g vf g.range_op_vref && typeEquiv g tyarg g.int_ty -> ValueSome(startExpr, 1, finishExpr) // detect (RangeInt32 startExpr N finishExpr), the inlined/compiled form of 'n .. m' and 'n .. N .. m' | Expr.App (Expr.Val (vf, _, _), _, [], [startExpr; Int32Expr n; finishExpr], _) - when valRefEq g vf g.range_int32_op_vref -> Some(startExpr, n, finishExpr) + when valRefEq g vf g.range_int32_op_vref -> ValueSome(startExpr, n, finishExpr) - | _ -> None + | _ -> ValueNone +[] let (|GetEnumeratorCall|_|) expr = match expr with | Expr.Op (TOp.ILCall ( _, _, _, _, _, _, _, ilMethodRef, _, _, _), _, [Expr.Val (vref, _, _) | Expr.Op (_, _, [Expr.Val (vref, ValUseFlag.NormalValUse, _)], _) ], _) -> - if ilMethodRef.Name = "GetEnumerator" then Some vref - else None - | _ -> None + if ilMethodRef.Name = "GetEnumerator" then ValueSome vref + else ValueNone + | _ -> ValueNone // This code matches exactly the output of TcForEachExpr +[] let (|CompiledForEachExpr|_|) g expr = match expr with | Let (enumerableVar, enumerableExpr, spFor, @@ -10085,16 +10429,727 @@ let (|CompiledForEachExpr|_|) g expr = let spInWhile = match spIn with DebugPointAtInOrTo.Yes m -> DebugPointAtWhile.Yes m | DebugPointAtInOrTo.No -> DebugPointAtWhile.No let enumerableTy = tyOfExpr g enumerableExpr - Some (enumerableTy, enumerableExpr, elemVar, bodyExpr, (mBody, spFor, spIn, mFor, mIn, spInWhile, mWholeExpr)) - | _ -> None - + ValueSome (enumerableTy, enumerableExpr, elemVar, bodyExpr, (mBody, spFor, spIn, mFor, mIn, spInWhile, mWholeExpr)) + | _ -> ValueNone +[] let (|CompiledInt32RangeForEachExpr|_|) g expr = match expr with | CompiledForEachExpr g (_, RangeInt32Step g (startExpr, step, finishExpr), elemVar, bodyExpr, ranges) -> - Some (startExpr, step, finishExpr, elemVar, bodyExpr, ranges) - | _ -> None + ValueSome (startExpr, step, finishExpr, elemVar, bodyExpr, ranges) + | _ -> ValueNone + +[] +let (|ValApp|_|) g vref expr = + match expr with + | Expr.App (Expr.Val (vref2, _, _), _f0ty, tyargs, args, m) when valRefEq g vref vref2 -> ValueSome (tyargs, args, m) + | _ -> ValueNone + +[] +module IntegralConst = + /// Constant 0. + [] + let (|Zero|_|) c = + match c with + | Const.Zero + | Const.Int32 0 + | Const.Int64 0L + | Const.UInt64 0UL + | Const.UInt32 0u + | Const.IntPtr 0L + | Const.UIntPtr 0UL + | Const.Int16 0s + | Const.UInt16 0us + | Const.SByte 0y + | Const.Byte 0uy + | Const.Char '\000' -> ValueSome Zero + | _ -> ValueNone + + /// Constant 1. + [] + let (|One|_|) expr = + match expr with + | Const.Int32 1 + | Const.Int64 1L + | Const.UInt64 1UL + | Const.UInt32 1u + | Const.IntPtr 1L + | Const.UIntPtr 1UL + | Const.Int16 1s + | Const.UInt16 1us + | Const.SByte 1y + | Const.Byte 1uy + | Const.Char '\001' -> ValueSome One + | _ -> ValueNone + + /// Constant -1. + [] + let (|MinusOne|_|) c = + match c with + | Const.Int32 -1 + | Const.Int64 -1L + | Const.IntPtr -1L + | Const.Int16 -1s + | Const.SByte -1y -> ValueSome MinusOne + | _ -> ValueNone + + /// Positive constant. + [] + let (|Positive|_|) c = + match c with + | Const.Int32 v when v > 0 -> ValueSome Positive + | Const.Int64 v when v > 0L -> ValueSome Positive + // sizeof is not constant, so |𝑐| ≥ 0x80000000n cannot be treated as a constant. + | Const.IntPtr v when v > 0L && uint64 v < 0x80000000UL -> ValueSome Positive + | Const.Int16 v when v > 0s -> ValueSome Positive + | Const.SByte v when v > 0y -> ValueSome Positive + | Const.UInt64 v when v > 0UL -> ValueSome Positive + | Const.UInt32 v when v > 0u -> ValueSome Positive + // sizeof is not constant, so |𝑐| > 0xffffffffun cannot be treated as a constant. + | Const.UIntPtr v when v > 0UL && v <= 0xffffffffUL -> ValueSome Positive + | Const.UInt16 v when v > 0us -> ValueSome Positive + | Const.Byte v when v > 0uy -> ValueSome Positive + | Const.Char v when v > '\000' -> ValueSome Positive + | _ -> ValueNone + + /// Negative constant. + [] + let (|Negative|_|) c = + match c with + | Const.Int32 v when v < 0 -> ValueSome Negative + | Const.Int64 v when v < 0L -> ValueSome Negative + // sizeof is not constant, so |𝑐| ≥ 0x80000000n cannot be treated as a constant. + | Const.IntPtr v when v < 0L && uint64 v < 0x80000000UL -> ValueSome Negative + | Const.Int16 v when v < 0s -> ValueSome Negative + | Const.SByte v when v < 0y -> ValueSome Negative + | _ -> ValueNone + + /// Returns the absolute value of the given integral constant. + let abs c = + match c with + | Const.Int32 Int32.MinValue -> Const.UInt32 (uint Int32.MaxValue + 1u) + | Const.Int64 Int64.MinValue -> Const.UInt64 (uint64 Int64.MaxValue + 1UL) + | Const.IntPtr Int64.MinValue -> Const.UIntPtr (uint64 Int64.MaxValue + 1UL) + | Const.Int16 Int16.MinValue -> Const.UInt16 (uint16 Int16.MaxValue + 1us) + | Const.SByte SByte.MinValue -> Const.Byte (byte SByte.MaxValue + 1uy) + | Const.Int32 v -> Const.Int32 (abs v) + | Const.Int64 v -> Const.Int64 (abs v) + | Const.IntPtr v -> Const.IntPtr (abs v) + | Const.Int16 v -> Const.Int16 (abs v) + | Const.SByte v -> Const.SByte (abs v) + | _ -> c + +/// start..finish +/// start..step..finish +[] +let (|IntegralRange|_|) g expr = + match expr with + | ValApp g g.range_int32_op_vref ([], [start; step; finish], _) -> ValueSome (g.int32_ty, (start, step, finish)) + | ValApp g g.range_int64_op_vref ([], [start; step; finish], _) -> ValueSome (g.int64_ty, (start, step, finish)) + | ValApp g g.range_uint64_op_vref ([], [start; step; finish], _) -> ValueSome (g.uint64_ty, (start, step, finish)) + | ValApp g g.range_uint32_op_vref ([], [start; step; finish], _) -> ValueSome (g.uint32_ty, (start, step, finish)) + | ValApp g g.range_nativeint_op_vref ([], [start; step; finish], _) -> ValueSome (g.nativeint_ty, (start, step, finish)) + | ValApp g g.range_unativeint_op_vref ([], [start; step; finish], _) -> ValueSome (g.unativeint_ty, (start, step, finish)) + | ValApp g g.range_int16_op_vref ([], [start; step; finish], _) -> ValueSome (g.int16_ty, (start, step, finish)) + | ValApp g g.range_uint16_op_vref ([], [start; step; finish], _) -> ValueSome (g.uint16_ty, (start, step, finish)) + | ValApp g g.range_sbyte_op_vref ([], [start; step; finish], _) -> ValueSome (g.sbyte_ty, (start, step, finish)) + | ValApp g g.range_byte_op_vref ([], [start; step; finish], _) -> ValueSome (g.byte_ty, (start, step, finish)) + | ValApp g g.range_char_op_vref ([], [start; finish], _) -> ValueSome (g.char_ty, (start, Expr.Const (Const.Char '\001', Text.Range.range0, g.char_ty), finish)) + | ValApp g g.range_op_vref (ty :: _, [start; finish], _) when isIntegerTy g ty || typeEquivAux EraseMeasures g ty g.char_ty -> ValueSome (ty, (start, mkTypedOne g Text.Range.range0 ty, finish)) + | ValApp g g.range_step_op_vref ([ty; ty2], [start; step; finish], _) when typeEquiv g ty ty2 && (isIntegerTy g ty || typeEquivAux EraseMeasures g ty g.char_ty) -> ValueSome (ty, (start, step, finish)) + | ValApp g g.range_generic_op_vref ([ty; ty2], [_one; _add; start; finish], _) when typeEquiv g ty ty2 && (isIntegerTy g ty || typeEquivAux EraseMeasures g ty g.char_ty) -> ValueSome (ty, (start, mkTypedOne g Text.Range.range0 ty, finish)) + | ValApp g g.range_step_generic_op_vref ([ty; ty2], [_zero; _add; start; step; finish], _) when typeEquiv g ty ty2 && (isIntegerTy g ty || typeEquivAux EraseMeasures g ty g.char_ty) -> ValueSome (ty, (start, step, finish)) + | _ -> ValueNone + +/// 5..1 +/// 1..-5 +/// 1..-1..5 +/// -5..-1..-1 +/// 5..2..1 +[] +let (|EmptyRange|_|) (start, step, finish) = + match start, step, finish with + | Expr.Const (value = Const.Int32 start), Expr.Const (value = Const.Int32 step), Expr.Const (value = Const.Int32 finish) when finish < start && step > 0 || finish > start && step < 0 -> ValueSome EmptyRange + | Expr.Const (value = Const.Int64 start), Expr.Const (value = Const.Int64 step), Expr.Const (value = Const.Int64 finish) when finish < start && step > 0L || finish > start && step < 0L -> ValueSome EmptyRange + | Expr.Const (value = Const.UInt64 start), Expr.Const (value = Const.UInt64 _), Expr.Const (value = Const.UInt64 finish) when finish < start -> ValueSome EmptyRange + | Expr.Const (value = Const.UInt32 start), Expr.Const (value = Const.UInt32 _), Expr.Const (value = Const.UInt32 finish) when finish < start -> ValueSome EmptyRange + + // sizeof is not constant, so |𝑐| ≥ 0x80000000n cannot be treated as a constant. + | Expr.Const (value = Const.IntPtr start), Expr.Const (value = Const.IntPtr step), Expr.Const (value = Const.IntPtr finish) when + uint64 start < 0x80000000UL + && uint64 step < 0x80000000UL + && uint64 finish < 0x80000000UL + && (finish < start && step > 0L || finish > start && step < 0L) + -> + ValueSome EmptyRange + + // sizeof is not constant, so |𝑐| > 0xffffffffun cannot be treated as a constant. + | Expr.Const (value = Const.UIntPtr start), Expr.Const (value = Const.UIntPtr step), Expr.Const (value = Const.UIntPtr finish) when + start <= 0xffffffffUL + && step <= 0xffffffffUL + && finish <= 0xffffffffUL + && finish <= start + -> + ValueSome EmptyRange + + | Expr.Const (value = Const.Int16 start), Expr.Const (value = Const.Int16 step), Expr.Const (value = Const.Int16 finish) when finish < start && step > 0s || finish > start && step < 0s -> ValueSome EmptyRange + | Expr.Const (value = Const.UInt16 start), Expr.Const (value = Const.UInt16 _), Expr.Const (value = Const.UInt16 finish) when finish < start -> ValueSome EmptyRange + | Expr.Const (value = Const.SByte start), Expr.Const (value = Const.SByte step), Expr.Const (value = Const.SByte finish) when finish < start && step > 0y || finish > start && step < 0y -> ValueSome EmptyRange + | Expr.Const (value = Const.Byte start), Expr.Const (value = Const.Byte _), Expr.Const (value = Const.Byte finish) when finish < start -> ValueSome EmptyRange + | Expr.Const (value = Const.Char start), Expr.Const (value = Const.Char _), Expr.Const (value = Const.Char finish) when finish < start -> ValueSome EmptyRange + | _ -> ValueNone +/// Note: this assumes that an empty range has already been checked for +/// (otherwise the conversion operations here might overflow). +[] +let (|ConstCount|_|) (start, step, finish) = + match start, step, finish with + // The count for these ranges is 2⁶⁴ + 1. We must handle such ranges at runtime. + | Expr.Const (value = Const.Int64 Int64.MinValue), Expr.Const (value = Const.Int64 1L), Expr.Const (value = Const.Int64 Int64.MaxValue) + | Expr.Const (value = Const.Int64 Int64.MaxValue), Expr.Const (value = Const.Int64 -1L), Expr.Const (value = Const.Int64 Int64.MinValue) + | Expr.Const (value = Const.UInt64 UInt64.MinValue), Expr.Const (value = Const.UInt64 1UL), Expr.Const (value = Const.UInt64 UInt64.MaxValue) + | Expr.Const (value = Const.IntPtr Int64.MinValue), Expr.Const (value = Const.IntPtr 1L), Expr.Const (value = Const.IntPtr Int64.MaxValue) + | Expr.Const (value = Const.IntPtr Int64.MaxValue), Expr.Const (value = Const.IntPtr -1L), Expr.Const (value = Const.IntPtr Int64.MinValue) + | Expr.Const (value = Const.UIntPtr UInt64.MinValue), Expr.Const (value = Const.UIntPtr 1UL), Expr.Const (value = Const.UIntPtr UInt64.MaxValue) -> ValueNone + + // We must special-case a step of Int64.MinValue, since we cannot call abs on it. + | Expr.Const (value = Const.Int64 start), Expr.Const (value = Const.Int64 Int64.MinValue), Expr.Const (value = Const.Int64 finish) when start <= finish -> ValueSome (Const.UInt64 ((uint64 finish - uint64 start) / (uint64 Int64.MaxValue + 1UL) + 1UL)) + | Expr.Const (value = Const.Int64 start), Expr.Const (value = Const.Int64 Int64.MinValue), Expr.Const (value = Const.Int64 finish) -> ValueSome (Const.UInt64 ((uint64 start - uint64 finish) / (uint64 Int64.MaxValue + 1UL) + 1UL)) + | Expr.Const (value = Const.IntPtr start), Expr.Const (value = Const.IntPtr Int64.MinValue), Expr.Const (value = Const.IntPtr finish) when start <= finish -> ValueSome (Const.UIntPtr ((uint64 start - uint64 finish) / (uint64 Int64.MaxValue + 1UL) + 1UL)) + | Expr.Const (value = Const.IntPtr start), Expr.Const (value = Const.IntPtr Int64.MinValue), Expr.Const (value = Const.IntPtr finish) -> ValueSome (Const.UIntPtr ((uint64 start - uint64 finish) / (uint64 Int64.MaxValue + 1UL) + 1UL)) + + | Expr.Const (value = Const.Int64 start), Expr.Const (value = Const.Int64 step), Expr.Const (value = Const.Int64 finish) when start <= finish -> ValueSome (Const.UInt64 ((uint64 finish - uint64 start) / uint64 (abs step) + 1UL)) + | Expr.Const (value = Const.Int64 start), Expr.Const (value = Const.Int64 step), Expr.Const (value = Const.Int64 finish) -> ValueSome (Const.UInt64 ((uint64 start - uint64 finish) / uint64 (abs step) + 1UL)) + + // sizeof is not constant, so |𝑐| ≥ 0x80000000n cannot be treated as a constant. + | Expr.Const (value = Const.IntPtr start), Expr.Const (value = Const.IntPtr step), Expr.Const (value = Const.IntPtr finish) when + uint64 start < 0x80000000UL + && uint64 step < 0x80000000UL + && uint64 finish < 0x80000000UL + && start <= finish + -> + ValueSome (Const.UIntPtr ((uint64 finish - uint64 start) / uint64 (abs step) + 1UL)) + + | Expr.Const (value = Const.IntPtr start), Expr.Const (value = Const.IntPtr step), Expr.Const (value = Const.IntPtr finish) when + uint64 start < 0x80000000UL + && uint64 step < 0x80000000UL + && uint64 finish < 0x80000000UL + -> + ValueSome (Const.UIntPtr ((uint64 start - uint64 finish) / uint64 (abs step) + 1UL)) + + | Expr.Const (value = Const.Int32 start), Expr.Const (value = Const.Int32 step), Expr.Const (value = Const.Int32 finish) when start <= finish -> ValueSome (Const.UInt64 ((uint64 finish - uint64 start) / uint64 (abs (int64 step)) + 1UL)) + | Expr.Const (value = Const.Int32 start), Expr.Const (value = Const.Int32 step), Expr.Const (value = Const.Int32 finish) -> ValueSome (Const.UInt64 ((uint64 start - uint64 finish) / uint64 (abs (int64 step)) + 1UL)) + + | Expr.Const (value = Const.Int16 start), Expr.Const (value = Const.Int16 step), Expr.Const (value = Const.Int16 finish) when start <= finish -> ValueSome (Const.UInt32 ((uint finish - uint start) / uint (abs (int step)) + 1u)) + | Expr.Const (value = Const.Int16 start), Expr.Const (value = Const.Int16 step), Expr.Const (value = Const.Int16 finish) -> ValueSome (Const.UInt32 ((uint start - uint finish) / uint (abs (int step)) + 1u)) + + | Expr.Const (value = Const.SByte start), Expr.Const (value = Const.SByte step), Expr.Const (value = Const.SByte finish) when start <= finish -> ValueSome (Const.UInt16 ((uint16 finish - uint16 start) / uint16 (abs (int16 step)) + 1us)) + | Expr.Const (value = Const.SByte start), Expr.Const (value = Const.SByte step), Expr.Const (value = Const.SByte finish) -> ValueSome (Const.UInt16 ((uint16 start - uint16 finish) / uint16 (abs (int16 step)) + 1us)) + + // sizeof is not constant, so |𝑐| > 0xffffffffun cannot be treated as a constant. + | Expr.Const (value = Const.UIntPtr start), Expr.Const (value = Const.UIntPtr step), Expr.Const (value = Const.UIntPtr finish) when + start <= 0xffffffffUL + && step <= 0xffffffffUL + && finish <= 0xffffffffUL + -> + ValueSome (Const.UIntPtr ((finish - start) / step + 1UL)) + + | Expr.Const (value = Const.UInt64 start), Expr.Const (value = Const.UInt64 step), Expr.Const (value = Const.UInt64 finish) when start <= finish -> ValueSome (Const.UInt64 ((finish - start) / step + 1UL)) + | Expr.Const (value = Const.UInt64 start), Expr.Const (value = Const.UInt64 step), Expr.Const (value = Const.UInt64 finish) -> ValueSome (Const.UInt64 ((start - finish) / step + 1UL)) + | Expr.Const (value = Const.UInt32 start), Expr.Const (value = Const.UInt32 step), Expr.Const (value = Const.UInt32 finish) when start <= finish -> ValueSome (Const.UInt64 (uint64 (finish - start) / uint64 step + 1UL)) + | Expr.Const (value = Const.UInt32 start), Expr.Const (value = Const.UInt32 step), Expr.Const (value = Const.UInt32 finish) -> ValueSome (Const.UInt64 (uint64 (start - finish) / uint64 step + 1UL)) + | Expr.Const (value = Const.UInt16 start), Expr.Const (value = Const.UInt16 step), Expr.Const (value = Const.UInt16 finish) when start <= finish -> ValueSome (Const.UInt32 (uint (finish - start) / uint step + 1u)) + | Expr.Const (value = Const.UInt16 start), Expr.Const (value = Const.UInt16 step), Expr.Const (value = Const.UInt16 finish) -> ValueSome (Const.UInt32 (uint (start - finish) / uint step + 1u)) + | Expr.Const (value = Const.Byte start), Expr.Const (value = Const.Byte step), Expr.Const (value = Const.Byte finish) when start <= finish -> ValueSome (Const.UInt16 (uint16 (finish - start) / uint16 step + 1us)) + | Expr.Const (value = Const.Byte start), Expr.Const (value = Const.Byte step), Expr.Const (value = Const.Byte finish) -> ValueSome (Const.UInt16 (uint16 (start - finish) / uint16 step + 1us)) + | Expr.Const (value = Const.Char start), Expr.Const (value = Const.Char step), Expr.Const (value = Const.Char finish) when start <= finish -> ValueSome (Const.UInt32 (uint (finish - start) / uint step + 1u)) + | Expr.Const (value = Const.Char start), Expr.Const (value = Const.Char step), Expr.Const (value = Const.Char finish) -> ValueSome (Const.UInt32 (uint (start - finish) / uint step + 1u)) + + | _ -> ValueNone + +type Count = Expr +type Idx = Expr +type Elem = Expr +type Body = Expr +type Loop = Expr +type WouldOvf = Expr + +[] +type RangeCount = + /// An expression representing a count known at compile time. + | Constant of Count + + /// An expression representing a "count" whose step is known to be zero at compile time. + /// Evaluating this expression at runtime will raise an exception. + | ConstantZeroStep of Expr + + /// An expression to compute a count at runtime that will definitely fit in 64 bits without overflow. + | Safe of Count + + /// A function for building a loop given an expression that may produce a count that + /// would not fit in 64 bits without overflow, and an expression indicating whether + /// evaluating the first expression directly would in fact overflow. + | PossiblyOversize of ((Count -> WouldOvf -> Expr) -> Expr) + +/// Makes an expression to compute the iteration count for the given integral range. +let mkRangeCount g m rangeTy rangeExpr start step finish = + /// This will raise an exception at runtime if step is zero. + let mkCallAndIgnoreRangeExpr start step finish = + // Use the potentially-evaluated-and-bound start, step, and finish. + let rangeExpr = + match rangeExpr with + // Type-specific range op (RangeInt32, etc.). + | Expr.App (funcExpr, formalType, tyargs, [_start; _step; _finish], m) -> Expr.App (funcExpr, formalType, tyargs, [start; step; finish], m) + // Generic range–step op (RangeStepGeneric). + | Expr.App (funcExpr, formalType, tyargs, [zero; add; _start; _step; _finish], m) -> Expr.App (funcExpr, formalType, tyargs, [zero; add; start; step; finish], m) + | _ -> error (InternalError ($"Unrecognized range function application '{rangeExpr}'.", m)) + + mkSequential + m + rangeExpr + (mkUnit g m) + + let mkSignednessAppropriateClt ty e1 e2 = + if isSignedIntegerTy g ty then + mkILAsmClt g m e1 e2 + else + mkAsmExpr ([AI_clt_un], [], [e1; e2], [g.bool_ty], m) + + let unsignedEquivalent ty = + if typeEquivAux EraseMeasures g ty g.int64_ty then g.uint64_ty + elif typeEquivAux EraseMeasures g ty g.int32_ty then g.uint32_ty + elif typeEquivAux EraseMeasures g ty g.int16_ty then g.uint16_ty + elif typeEquivAux EraseMeasures g ty g.sbyte_ty then g.byte_ty + else ty + + /// Find the unsigned type with twice the width of the given type, if available. + let nextWidestUnsignedTy ty = + if typeEquivAux EraseMeasures g ty g.int64_ty || typeEquivAux EraseMeasures g ty g.int32_ty || typeEquivAux EraseMeasures g ty g.uint32_ty then + g.uint64_ty + elif typeEquivAux EraseMeasures g ty g.int16_ty || typeEquivAux EraseMeasures g ty g.uint16_ty || typeEquivAux EraseMeasures g ty g.char_ty then + g.uint32_ty + elif typeEquivAux EraseMeasures g ty g.sbyte_ty || typeEquivAux EraseMeasures g ty g.byte_ty then + g.uint16_ty + else + ty + + /// Convert the value to the next-widest unsigned type. + /// We do this so that adding one won't result in overflow. + let mkWiden e = + if typeEquivAux EraseMeasures g rangeTy g.int32_ty then + mkAsmExpr ([AI_conv DT_I8], [], [e], [g.uint64_ty], m) + elif typeEquivAux EraseMeasures g rangeTy g.uint32_ty then + mkAsmExpr ([AI_conv DT_U8], [], [e], [g.uint64_ty], m) + elif typeEquivAux EraseMeasures g rangeTy g.int16_ty then + mkAsmExpr ([AI_conv DT_I4], [], [e], [g.uint32_ty], m) + elif typeEquivAux EraseMeasures g rangeTy g.uint16_ty || typeEquivAux EraseMeasures g rangeTy g.char_ty then + mkAsmExpr ([AI_conv DT_U4], [], [e], [g.uint32_ty], m) + elif typeEquivAux EraseMeasures g rangeTy g.sbyte_ty then + mkAsmExpr ([AI_conv DT_I2], [], [e], [g.uint16_ty], m) + elif typeEquivAux EraseMeasures g rangeTy g.byte_ty then + mkAsmExpr ([AI_conv DT_U2], [], [e], [g.uint16_ty], m) + else + e + + /// Expects that |e1| ≥ |e2|. + let mkDiff e1 e2 = mkAsmExpr ([AI_sub], [], [e1; e2], [unsignedEquivalent (tyOfExpr g e1)], m) + + /// diff / step + let mkQuotient diff step = mkAsmExpr ([AI_div_un], [], [diff; step], [tyOfExpr g diff], m) + + /// Whether the total count might not fit in 64 bits. + let couldBeTooBig ty = + typeEquivAux EraseMeasures g ty g.int64_ty + || typeEquivAux EraseMeasures g ty g.uint64_ty + || typeEquivAux EraseMeasures g ty g.nativeint_ty + || typeEquivAux EraseMeasures g ty g.unativeint_ty + + /// pseudoCount + 1 + let mkAddOne pseudoCount = + let pseudoCount = mkWiden pseudoCount + let ty = tyOfExpr g pseudoCount + + if couldBeTooBig rangeTy then + mkAsmExpr ([AI_add_ovf_un], [], [pseudoCount; mkTypedOne g m ty], [ty], m) + else + mkAsmExpr ([AI_add], [], [pseudoCount; mkTypedOne g m ty], [ty], m) + + let mkRuntimeCalc mkThrowIfStepIsZero pseudoCount count = + if typeEquivAux EraseMeasures g rangeTy g.int64_ty || typeEquivAux EraseMeasures g rangeTy g.uint64_ty then + RangeCount.PossiblyOversize (fun mkLoopExpr -> + mkThrowIfStepIsZero + (mkCompGenLetIn m (nameof pseudoCount) (tyOfExpr g pseudoCount) pseudoCount (fun (_, pseudoCount) -> + let wouldOvf = mkILAsmCeq g m pseudoCount (Expr.Const (Const.UInt64 UInt64.MaxValue, m, g.uint64_ty)) + mkCompGenLetIn m (nameof wouldOvf) g.bool_ty wouldOvf (fun (_, wouldOvf) -> + mkLoopExpr count wouldOvf)))) + elif typeEquivAux EraseMeasures g rangeTy g.nativeint_ty || typeEquivAux EraseMeasures g rangeTy g.unativeint_ty then // We have a nativeint ty whose size we won't know till runtime. + RangeCount.PossiblyOversize (fun mkLoopExpr -> + mkThrowIfStepIsZero + (mkCompGenLetIn m (nameof pseudoCount) (tyOfExpr g pseudoCount) pseudoCount (fun (_, pseudoCount) -> + let wouldOvf = + mkCond + DebugPointAtBinding.NoneAtInvisible + m + g.bool_ty + (mkILAsmCeq g m (mkAsmExpr ([I_sizeof g.ilg.typ_IntPtr], [], [], [g.uint32_ty], m)) (Expr.Const (Const.UInt32 4u, m, g.uint32_ty))) + (mkILAsmCeq g m pseudoCount (Expr.Const (Const.UIntPtr (uint64 UInt32.MaxValue), m, g.unativeint_ty))) + (mkILAsmCeq g m pseudoCount (Expr.Const (Const.UIntPtr UInt64.MaxValue, m, g.unativeint_ty))) + + mkCompGenLetIn m (nameof wouldOvf) g.bool_ty wouldOvf (fun (_, wouldOvf) -> + mkLoopExpr count wouldOvf)))) + else + RangeCount.Safe (mkThrowIfStepIsZero count) + + match start, step, finish with + // start..0..finish + | _, Expr.Const (value = IntegralConst.Zero), _ -> RangeCount.ConstantZeroStep (mkSequential m (mkCallAndIgnoreRangeExpr start step finish) (mkTypedZero g m rangeTy)) + + // 5..1 + // 1..-1..5 + | EmptyRange -> RangeCount.Constant (mkTypedZero g m rangeTy) + + // 1..5 + // 1..2..5 + // 5..-1..1 + | ConstCount count -> RangeCount.Constant (Expr.Const (count, m, nextWidestUnsignedTy rangeTy)) + + // start..finish + // start..1..finish + // + // if finish < start then 0 else finish - start + 1 + | _, Expr.Const (value = IntegralConst.One), _ -> + let mkCount mkAddOne = + let count = mkAddOne (mkDiff finish start) + let countTy = tyOfExpr g count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + countTy + (mkSignednessAppropriateClt rangeTy finish start) + (mkTypedZero g m countTy) + count + + match start, finish with + // The total count could exceed 2⁶⁴. + | Expr.Const (value = Const.Int64 Int64.MinValue), _ | _, Expr.Const (value = Const.Int64 Int64.MaxValue) + | Expr.Const (value = Const.UInt64 UInt64.MinValue), _ | _, Expr.Const (value = Const.UInt64 UInt64.MaxValue) -> + mkRuntimeCalc id (mkCount id) (mkCount mkAddOne) + + // The total count could not exceed 2⁶⁴. + | Expr.Const (value = Const.Int64 _), _ | _, Expr.Const (value = Const.Int64 _) + | Expr.Const (value = Const.UInt64 _), _ | _, Expr.Const (value = Const.UInt64 _) -> + RangeCount.Safe (mkCount mkAddOne) + + | _ -> mkRuntimeCalc id (mkCount id) (mkCount mkAddOne) + + // (Only possible for signed types.) + // + // start..-1..finish + // + // if start < finish then 0 else start - finish + 1 + | _, Expr.Const (value = IntegralConst.MinusOne), _ -> + let mkCount mkAddOne = + let count = mkAddOne (mkDiff start finish) + let countTy = tyOfExpr g count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + countTy + (mkSignednessAppropriateClt rangeTy start finish) + (mkTypedZero g m countTy) + count + + match start, finish with + // The total count could exceed 2⁶⁴. + | Expr.Const (value = Const.Int64 Int64.MaxValue), _ | _, Expr.Const (value = Const.Int64 Int64.MinValue) -> + mkRuntimeCalc id (mkCount id) (mkCount mkAddOne) + + // The total count could not exceed 2⁶⁴. + | Expr.Const (value = Const.Int64 _), _ | _, Expr.Const (value = Const.Int64 _) -> + RangeCount.Safe (mkCount mkAddOne) + + | _ -> mkRuntimeCalc id (mkCount id) (mkCount mkAddOne) + + // start..2..finish + // + // if finish < start then 0 else (finish - start) / step + 1 + | _, Expr.Const (value = IntegralConst.Positive), _ -> + let count = + let count = mkAddOne (mkQuotient (mkDiff finish start) step) + let countTy = tyOfExpr g count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + countTy + (mkSignednessAppropriateClt rangeTy finish start) + (mkTypedZero g m countTy) + count + + // We know that the magnitude of step is greater than one, + // so we know that the total count won't overflow. + RangeCount.Safe count + + // (Only possible for signed types.) + // + // start..-2..finish + // + // if start < finish then 0 else (start - finish) / abs step + 1 + | _, Expr.Const (value = IntegralConst.Negative as negativeStep), _ -> + let count = + let count = mkAddOne (mkQuotient (mkDiff start finish) (Expr.Const (IntegralConst.abs negativeStep, m, unsignedEquivalent rangeTy))) + let countTy = tyOfExpr g count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + countTy + (mkSignednessAppropriateClt rangeTy start finish) + (mkTypedZero g m countTy) + count + + // We know that the magnitude of step is greater than one, + // so we know that the total count won't overflow. + RangeCount.Safe count + + // start..step..finish + // + // if step = 0 then + // ignore ((.. ..) start step finish) // Throws. + // if 0 < step then + // if finish < start then 0 else unsigned (finish - start) / unsigned step + 1 + // else // step < 0 + // if start < finish then 0 else unsigned (start - finish) / unsigned (abs step) + 1 + | _, _, _ -> + // Let the range call throw the appropriate localized + // exception at runtime if step is zero: + // + // if step = 0 then ignore ((.. ..) start step finish) + let mkThrowIfStepIsZero count = + let throwIfStepIsZero = + mkCond + DebugPointAtBinding.NoneAtInvisible + m + g.unit_ty + (mkILAsmCeq g m step (mkTypedZero g m rangeTy)) + (mkCallAndIgnoreRangeExpr start step finish) + (mkUnit g m) + + mkSequential m throwIfStepIsZero count + + let mkCount mkAddOne = + if isSignedIntegerTy g rangeTy then + let positiveStep = + let count = mkAddOne (mkQuotient (mkDiff finish start) step) + let countTy = tyOfExpr g count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + countTy + (mkSignednessAppropriateClt rangeTy finish start) + (mkTypedZero g m countTy) + count + + let negativeStep = + let absStep = mkAsmExpr ([AI_add], [], [mkAsmExpr ([AI_not], [], [step], [rangeTy], m); mkTypedOne g m rangeTy], [rangeTy], m) + let count = mkAddOne (mkQuotient (mkDiff start finish) absStep) + let countTy = tyOfExpr g count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + countTy + (mkSignednessAppropriateClt rangeTy start finish) + (mkTypedZero g m countTy) + count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + (tyOfExpr g positiveStep) + (mkSignednessAppropriateClt rangeTy (mkTypedZero g m rangeTy) step) + positiveStep + negativeStep + else // Unsigned. + let count = mkAddOne (mkQuotient (mkDiff finish start) step) + let countTy = tyOfExpr g count + + mkCond + DebugPointAtBinding.NoneAtInvisible + m + countTy + (mkSignednessAppropriateClt rangeTy finish start) + (mkTypedZero g m countTy) + count + + match start, finish with + // The total count could exceed 2⁶⁴. + | Expr.Const (value = Const.Int64 Int64.MinValue), _ | _, Expr.Const (value = Const.Int64 Int64.MaxValue) + | Expr.Const (value = Const.Int64 Int64.MaxValue), _ | _, Expr.Const (value = Const.Int64 Int64.MinValue) + | Expr.Const (value = Const.UInt64 UInt64.MinValue), _ | _, Expr.Const (value = Const.UInt64 UInt64.MaxValue) -> + mkRuntimeCalc mkThrowIfStepIsZero (mkCount id) (mkCount mkAddOne) + + // The total count could not exceed 2⁶⁴. + | Expr.Const (value = Const.Int64 _), _ | _, Expr.Const (value = Const.Int64 _) + | Expr.Const (value = Const.UInt64 _), _ | _, Expr.Const (value = Const.UInt64 _) -> + RangeCount.Safe (mkThrowIfStepIsZero (mkCount mkAddOne)) + + | _ -> mkRuntimeCalc mkThrowIfStepIsZero (mkCount id) (mkCount mkAddOne) + +let mkOptimizedRangeLoop (g: TcGlobals) (mBody, mFor, mIn, spInWhile) (rangeTy, rangeExpr) (start, step, finish) (buildLoop: (Count -> ((Idx -> Elem -> Body) -> Loop) -> Expr)) = + let inline mkLetBindingsIfNeeded f = + match start, step, finish with + | (Expr.Const _ | Expr.Val _), (Expr.Const _ | Expr.Val _), (Expr.Const _ | Expr.Val _) -> + f start step finish + + | (Expr.Const _ | Expr.Val _), (Expr.Const _ | Expr.Val _), _ -> + mkCompGenLetIn finish.Range (nameof finish) rangeTy finish (fun (_, finish) -> + f start step finish) + + | _, (Expr.Const _ | Expr.Val _), (Expr.Const _ | Expr.Val _) -> + mkCompGenLetIn start.Range (nameof start) rangeTy start (fun (_, start) -> + f start step finish) + + | (Expr.Const _ | Expr.Val _), _, (Expr.Const _ | Expr.Val _) -> + mkCompGenLetIn step.Range (nameof step) rangeTy step (fun (_, step) -> + f start step finish) + + | _, (Expr.Const _ | Expr.Val _), _ -> + mkCompGenLetIn start.Range (nameof start) rangeTy start (fun (_, start) -> + mkCompGenLetIn finish.Range (nameof finish) rangeTy finish (fun (_, finish) -> + f start step finish)) + + | (Expr.Const _ | Expr.Val _), _, _ -> + mkCompGenLetIn step.Range (nameof step) rangeTy step (fun (_, step) -> + mkCompGenLetIn finish.Range (nameof finish) rangeTy finish (fun (_, finish) -> + f start step finish)) + + | _, _, (Expr.Const _ | Expr.Val _) -> + mkCompGenLetIn start.Range (nameof start) rangeTy start (fun (_, start) -> + mkCompGenLetIn step.Range (nameof step) rangeTy step (fun (_, step) -> + f start step finish)) + + | _, _, _ -> + mkCompGenLetIn start.Range (nameof start) rangeTy start (fun (_, start) -> + mkCompGenLetIn step.Range (nameof step) rangeTy step (fun (_, step) -> + mkCompGenLetIn finish.Range (nameof finish) rangeTy finish (fun (_, finish) -> + f start step finish))) + + mkLetBindingsIfNeeded (fun start step finish -> + /// Start at 0 and count up through count - 1. + /// + /// while i < count do + /// + /// i <- i + 1 + let mkCountUpExclusive mkBody count = + let countTy = tyOfExpr g count + + mkCompGenLetMutableIn mIn "i" countTy (mkTypedZero g mIn countTy) (fun (idxVal, idxVar) -> + mkCompGenLetMutableIn mIn "loopVar" rangeTy start (fun (loopVal, loopVar) -> + // loopVar <- loopVar + step + let incrV = mkValSet mIn (mkLocalValRef loopVal) (mkAsmExpr ([AI_add], [], [loopVar; step], [rangeTy], mIn)) + + // i <- i + 1 + let incrI = mkValSet mIn (mkLocalValRef idxVal) (mkAsmExpr ([AI_add], [], [idxVar; mkTypedOne g mIn countTy], [rangeTy], mIn)) + + // + // loopVar <- loopVar + step + // i <- i + 1 + let body = mkSequentials g mBody [mkBody idxVar loopVar; incrV; incrI] + + // i < count + let guard = mkAsmExpr ([AI_clt_un], [], [idxVar; count], [g.bool_ty], mFor) + + // while i < count do + // + // loopVar <- loopVar + step + // i <- i + 1 + mkWhile + g + ( + spInWhile, + WhileLoopForCompiledForEachExprMarker, + guard, + body, + mBody + ) + ) + ) + + /// Start at 0 and count up till we have wrapped around. + /// We only emit this if the type is or may be 64-bit and step is not constant, + /// and we only execute it if step = 1 and |finish - step| = 2⁶⁴ + 1. + /// + /// Logically equivalent to (pseudo-code): + /// + /// while true do + /// + /// loopVar <- loopVar + step + /// i <- i + 1 + /// if i = 0 then break + let mkCountUpInclusive mkBody countTy = + mkCompGenLetMutableIn mFor "guard" g.bool_ty (mkTrue g mFor) (fun (guardVal, guardVar) -> + mkCompGenLetMutableIn mIn "i" countTy (mkTypedZero g mIn countTy) (fun (idxVal, idxVar) -> + mkCompGenLetMutableIn mIn "loopVar" rangeTy start (fun (loopVal, loopVar) -> + // loopVar <- loopVar + step + let incrV = mkValSet mIn (mkLocalValRef loopVal) (mkAsmExpr ([AI_add], [], [loopVar; step], [rangeTy], mIn)) + + // i <- i + 1 + let incrI = mkValSet mIn (mkLocalValRef idxVal) (mkAsmExpr ([AI_add], [], [idxVar; mkTypedOne g mIn countTy], [rangeTy], mIn)) + + // guard <- i <> 0 + let breakIfZero = mkValSet mFor (mkLocalValRef guardVal) (mkAsmExpr ([ILInstr.AI_cgt_un], [], [idxVar; mkTypedZero g mFor countTy], [g.bool_ty], mFor)) + + // + // loopVar <- loopVar + step + // i <- i + 1 + // guard <- i <> 0 + let body = mkSequentials g mBody [mkBody idxVar loopVar; incrV; incrI; breakIfZero] + + // while guard do + // + // loopVar <- loopVar + step + // i <- i + 1 + // guard <- i <> 0 + mkWhile + g + ( + spInWhile, + WhileLoopForCompiledForEachExprMarker, + guardVar, + body, + mBody + ) + ) + ) + ) + + match mkRangeCount g mIn rangeTy rangeExpr start step finish with + | RangeCount.Constant count -> + buildLoop count (fun mkBody -> mkCountUpExclusive mkBody count) + + | RangeCount.ConstantZeroStep count -> + mkCompGenLetIn mIn (nameof count) (tyOfExpr g count) count (fun (_, count) -> + buildLoop count (fun mkBody -> mkCountUpExclusive mkBody count)) + + | RangeCount.Safe count -> + mkCompGenLetIn mIn (nameof count) (tyOfExpr g count) count (fun (_, count) -> + buildLoop count (fun mkBody -> mkCountUpExclusive mkBody count)) + + | RangeCount.PossiblyOversize calc -> + calc (fun count wouldOvf -> + buildLoop count (fun mkBody -> + mkCond + DebugPointAtBinding.NoneAtInvisible + mIn + g.unit_ty + wouldOvf + (mkCountUpInclusive mkBody (tyOfExpr g count)) + (mkCompGenLetIn mIn (nameof count) (tyOfExpr g count) count (fun (_, count) -> mkCountUpExclusive mkBody count)))) + ) let mkDebugPoint m expr = Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, expr) @@ -10111,6 +11166,18 @@ let DetectAndOptimizeForEachExpression g option expr = let spFor = match spFor with DebugPointAtBinding.Yes mFor -> DebugPointAtFor.Yes mFor | _ -> DebugPointAtFor.No mkFastForLoop g (spFor, spIn, mWholeExpr, elemVar, startExpr, (step = 1), finishExpr, bodyExpr) + | OptimizeAllForExpressions, CompiledForEachExpr g (_enumTy, rangeExpr & IntegralRange g (rangeTy, (start, step, finish)), elemVar, bodyExpr, ranges) when + g.langVersion.SupportsFeature LanguageFeature.LowerIntegralRangesToFastLoops + -> + let mBody, _spFor, _spIn, mFor, mIn, spInWhile, _mWhole = ranges + + mkOptimizedRangeLoop + g + (mBody, mFor, mIn, spInWhile) + (rangeTy, rangeExpr) + (start, step, finish) + (fun _count mkLoop -> mkLoop (fun _idxVar loopVar -> mkInvisibleLet elemVar.Range elemVar loopVar bodyExpr)) + | OptimizeAllForExpressions, CompiledForEachExpr g (enumerableTy, enumerableExpr, elemVar, bodyExpr, ranges) -> let mBody, spFor, spIn, mFor, mIn, spInWhile, mWholeExpr = ranges @@ -10204,30 +11271,27 @@ let mkUnitDelayLambda (g: TcGlobals) m e = let uv, _ = mkCompGenLocal m "unitVar" g.unit_ty mkLambda m uv (e, tyOfExpr g e) - -let (|ValApp|_|) g vref expr = - match expr with - | Expr.App (Expr.Val (vref2, _, _), _f0ty, tyargs, args, m) when valRefEq g vref vref2 -> Some (tyargs, args, m) - | _ -> None - +[] let (|UseResumableStateMachinesExpr|_|) g expr = match expr with - | ValApp g g.cgh__useResumableCode_vref (_, _, _m) -> Some () - | _ -> None + | ValApp g g.cgh__useResumableCode_vref (_, _, _m) -> ValueSome () + | _ -> ValueNone /// Match an if...then...else expression or the result of "a && b" or "a || b" +[] let (|IfThenElseExpr|_|) expr = match expr with | Expr.Match (_spBind, _exprm, TDSwitch(cond, [ TCase( DecisionTreeTest.Const (Const.Bool true), TDSuccess ([], 0) )], Some (TDSuccess ([], 1)), _), [| TTarget([], thenExpr, _); TTarget([], elseExpr, _) |], _m, _ty) -> - Some (cond, thenExpr, elseExpr) - | _ -> None + ValueSome (cond, thenExpr, elseExpr) + | _ -> ValueNone /// if __useResumableCode then ... else ... +[] let (|IfUseResumableStateMachinesExpr|_|) g expr = match expr with - | IfThenElseExpr(UseResumableStateMachinesExpr g (), thenExpr, elseExpr) -> Some (thenExpr, elseExpr) - | _ -> None + | IfThenElseExpr(UseResumableStateMachinesExpr g (), thenExpr, elseExpr) -> ValueSome (thenExpr, elseExpr) + | _ -> ValueNone /// Combine a list of ModuleOrNamespaceType's making up the description of a CCU. checking there are now /// duplicate modules etc. @@ -10290,7 +11354,7 @@ let CombineCcuContentFragments l = CombineModuleOrNamespaceTypeList [] l -/// An immutable mappping from witnesses to some data. +/// An immutable mapping from witnesses to some data. /// /// Note: this uses an immutable HashMap/Dictionary with an IEqualityComparer that captures TcGlobals, see EmptyTraitWitnessInfoHashMap type TraitWitnessInfoHashMap<'T> = ImmutableDictionary @@ -10299,34 +11363,39 @@ type TraitWitnessInfoHashMap<'T> = ImmutableDictionary let EmptyTraitWitnessInfoHashMap g : TraitWitnessInfoHashMap<'T> = ImmutableDictionary.Create( { new IEqualityComparer<_> with - member _.Equals(a, b) = traitKeysAEquiv g TypeEquivEnv.Empty a b + member _.Equals(a, b) = nullSafeEquality a b (fun a b -> traitKeysAEquiv g TypeEquivEnv.Empty a b) member _.GetHashCode(a) = hash a.MemberName }) +[] let (|WhileExpr|_|) expr = match expr with | Expr.Op (TOp.While (sp1, sp2), _, [Expr.Lambda (_, _, _, [_gv], guardExpr, _, _);Expr.Lambda (_, _, _, [_bv], bodyExpr, _, _)], m) -> - Some (sp1, sp2, guardExpr, bodyExpr, m) - | _ -> None + ValueSome (sp1, sp2, guardExpr, bodyExpr, m) + | _ -> ValueNone +[] let (|TryFinallyExpr|_|) expr = match expr with | Expr.Op (TOp.TryFinally (sp1, sp2), [ty], [Expr.Lambda (_, _, _, [_], e1, _, _); Expr.Lambda (_, _, _, [_], e2, _, _)], m) -> - Some (sp1, sp2, ty, e1, e2, m) - | _ -> None + ValueSome (sp1, sp2, ty, e1, e2, m) + | _ -> ValueNone +[] let (|IntegerForLoopExpr|_|) expr = match expr with | Expr.Op (TOp.IntegerForLoop (sp1, sp2, style), _, [Expr.Lambda (_, _, _, [_], e1, _, _);Expr.Lambda (_, _, _, [_], e2, _, _);Expr.Lambda (_, _, _, [v], e3, _, _)], m) -> - Some (sp1, sp2, style, e1, e2, v, e3, m) - | _ -> None + ValueSome (sp1, sp2, style, e1, e2, v, e3, m) + | _ -> ValueNone +[] let (|TryWithExpr|_|) expr = match expr with | Expr.Op (TOp.TryWith (spTry, spWith), [resTy], [Expr.Lambda (_, _, _, [_], bodyExpr, _, _); Expr.Lambda (_, _, _, [filterVar], filterExpr, _, _); Expr.Lambda (_, _, _, [handlerVar], handlerExpr, _, _)], m) -> - Some (spTry, spWith, resTy, bodyExpr, filterVar, filterExpr, handlerVar, handlerExpr, m) - | _ -> None + ValueSome (spTry, spWith, resTy, bodyExpr, filterVar, filterExpr, handlerVar, handlerExpr, m) + | _ -> ValueNone +[] let (|MatchTwoCasesExpr|_|) expr = match expr with | Expr.Match (spBind, mExpr, TDSwitch(cond, [ TCase( DecisionTreeTest.UnionCase (ucref, a), TDSuccess ([], tg1) )], Some (TDSuccess ([], tg2)), b), tgs, m, ty) -> @@ -10335,11 +11404,12 @@ let (|MatchTwoCasesExpr|_|) expr = let rebuild (cond, ucref, tg1, tg2, tgs) = Expr.Match (spBind, mExpr, TDSwitch(cond, [ TCase( DecisionTreeTest.UnionCase (ucref, a), TDSuccess ([], tg1) )], Some (TDSuccess ([], tg2)), b), tgs, m, ty) - Some (cond, ucref, tg1, tg2, tgs, rebuild) + ValueSome (cond, ucref, tg1, tg2, tgs, rebuild) - | _ -> None + | _ -> ValueNone /// match e with None -> ... | Some v -> ... or other variations of the same +[] let (|MatchOptionExpr|_|) expr = match expr with | MatchTwoCasesExpr(cond, ucref, tg1, tg2, tgs, rebuildTwoCases) -> @@ -10358,16 +11428,18 @@ let (|MatchOptionExpr|_|) expr = Expr.Let(TBind(someVar, Expr.Op(TOp.UnionCaseFieldGet (a6a, a6b), a7, a8, a9), a10), someBranchExpr, a11, a12), a13, a14), a16) rebuildTwoCases (cond, ucref, tg1, tg2, tgs) - Some (cond, noneBranchExpr, someVar, someBranchExpr, rebuild) - | _ -> None - | _ -> None + ValueSome (cond, noneBranchExpr, someVar, someBranchExpr, rebuild) + | _ -> ValueNone + | _ -> ValueNone +[] let (|ResumableEntryAppExpr|_|) g expr = match expr with - | ValApp g g.cgh__resumableEntry_vref (_, _, _m) -> Some () - | _ -> None + | ValApp g g.cgh__resumableEntry_vref (_, _, _m) -> ValueSome () + | _ -> ValueNone /// Match an (unoptimized) __resumableEntry expression +[] let (|ResumableEntryMatchExpr|_|) g expr = match expr with | Expr.Let(TBind(matchVar, matchExpr, sp1), MatchOptionExpr (Expr.Val(matchVar2, b, c), noneBranchExpr, someVar, someBranchExpr, rebuildMatch), d, e) -> @@ -10379,13 +11451,14 @@ let (|ResumableEntryMatchExpr|_|) g expr = let rebuild (noneBranchExpr, someBranchExpr) = Expr.Let(TBind(matchVar, matchExpr, sp1), rebuildMatch (Expr.Val(matchVar2, b, c), noneBranchExpr, someVar, someBranchExpr), d, e) - Some (noneBranchExpr, someVar, someBranchExpr, rebuild) + ValueSome (noneBranchExpr, someVar, someBranchExpr, rebuild) - else None + else ValueNone - | _ -> None - | _ -> None + | _ -> ValueNone + | _ -> ValueNone +[] let (|StructStateMachineExpr|_|) g expr = match expr with | ValApp g g.cgh__stateMachine_vref ([dataTy; _resultTy], [moveNext; setStateMachine; afterCode], _m) -> @@ -10393,37 +11466,40 @@ let (|StructStateMachineExpr|_|) g expr = | NewDelegateExpr g (_, [moveNextThisVar], moveNextBody, _, _), NewDelegateExpr g (_, [setStateMachineThisVar;setStateMachineStateVar], setStateMachineBody, _, _), NewDelegateExpr g (_, [afterCodeThisVar], afterCodeBody, _, _) -> - Some (dataTy, + ValueSome (dataTy, (moveNextThisVar, moveNextBody), (setStateMachineThisVar, setStateMachineStateVar, setStateMachineBody), (afterCodeThisVar, afterCodeBody)) - | _ -> None - | _ -> None + | _ -> ValueNone + | _ -> ValueNone +[] let (|ResumeAtExpr|_|) g expr = match expr with - | ValApp g g.cgh__resumeAt_vref (_, [pcExpr], _m) -> Some pcExpr - | _ -> None + | ValApp g g.cgh__resumeAt_vref (_, [pcExpr], _m) -> ValueSome pcExpr + | _ -> ValueNone // Detect __debugPoint calls +[] let (|DebugPointExpr|_|) g expr = match expr with - | ValApp g g.cgh__debugPoint_vref (_, [StringExpr debugPointName], _m) -> Some debugPointName - | _ -> None + | ValApp g g.cgh__debugPoint_vref (_, [StringExpr debugPointName], _m) -> ValueSome debugPointName + | _ -> ValueNone // Detect sequencing constructs in state machine code +[] let (|SequentialResumableCode|_|) (g: TcGlobals) expr = match expr with // e1; e2 | Expr.Sequential(e1, e2, NormalSeq, m) -> - Some (e1, e2, m, (fun e1 e2 -> Expr.Sequential(e1, e2, NormalSeq, m))) + ValueSome (e1, e2, m, (fun e1 e2 -> Expr.Sequential(e1, e2, NormalSeq, m))) // let __stack_step = e1 in e2 - | Expr.Let(bind, e2, m, _) when bind.Var.CompiledName(g.CompilerGlobalState).StartsWith(stackVarPrefix) -> - Some (bind.Expr, e2, m, (fun e1 e2 -> mkLet bind.DebugPoint m bind.Var e1 e2)) + | Expr.Let(bind, e2, m, _) when bind.Var.CompiledName(g.CompilerGlobalState).StartsWithOrdinal(stackVarPrefix) -> + ValueSome (bind.Expr, e2, m, (fun e1 e2 -> mkLet bind.DebugPoint m bind.Var e1 e2)) - | _ -> None + | _ -> ValueNone let mkLabelled m l e = mkCompGenSequential m (Expr.Op (TOp.Label l, [], [], m)) e @@ -10433,13 +11509,14 @@ let rec isReturnsResumableCodeTy g ty = if isFunTy g ty then isReturnsResumableCodeTy g (rangeOfFunTy g ty) else isResumableCodeTy g ty +[] let (|ResumableCodeInvoke|_|) g expr = match expr with // defn.Invoke x --> let arg = x in [defn][arg/x] | Expr.App ((Expr.Val (invokeRef, _, _) as iref), a, b, (f :: args), m) when invokeRef.LogicalName = "Invoke" && isReturnsResumableCodeTy g (tyOfExpr g f) -> - Some (iref, f, args, m, (fun (f2, args2) -> Expr.App ((iref, a, b, (f2 :: args2), m)))) - | _ -> None + ValueSome (iref, f, args, m, (fun (f2, args2) -> Expr.App ((iref, a, b, (f2 :: args2), m)))) + | _ -> ValueNone let ComputeUseMethodImpl g (v: Val) = v.ImplementedSlotSigs |> List.exists (fun slotsig -> @@ -10469,27 +11546,31 @@ let ComputeUseMethodImpl g (v: Val) = not isStructural)) +[] let (|Seq|_|) g expr = match expr with // use 'seq { ... }' as an indicator - | ValApp g g.seq_vref ([elemTy], [e], _m) -> Some (e, elemTy) - | _ -> None + | ValApp g g.seq_vref ([elemTy], [e], _m) -> ValueSome (e, elemTy) + | _ -> ValueNone /// Detect a 'yield x' within a 'seq { ... }' +[] let (|SeqYield|_|) g expr = match expr with - | ValApp g g.seq_singleton_vref (_, [arg], m) -> Some (arg, m) - | _ -> None + | ValApp g g.seq_singleton_vref (_, [arg], m) -> ValueSome (arg, m) + | _ -> ValueNone /// Detect a 'expr; expr' within a 'seq { ... }' +[] let (|SeqAppend|_|) g expr = match expr with - | ValApp g g.seq_append_vref (_, [arg1; arg2], m) -> Some (arg1, arg2, m) - | _ -> None + | ValApp g g.seq_append_vref (_, [arg1; arg2], m) -> ValueSome (arg1, arg2, m) + | _ -> ValueNone let isVarFreeInExpr v e = Zset.contains v (freeInExpr CollectTyparsAndLocals e).FreeLocals /// Detect a 'while gd do expr' within a 'seq { ... }' +[] let (|SeqWhile|_|) g expr = match expr with | ValApp g g.seq_generated_vref (_, [Expr.Lambda (_, _, _, [dummyv], guardExpr, _, _);innerExpr], m) @@ -10498,11 +11579,12 @@ let (|SeqWhile|_|) g expr = // The debug point for 'while' is attached to the innerExpr, see TcSequenceExpression let mWhile = innerExpr.Range let spWhile = match mWhile.NotedSourceConstruct with NotedSourceConstruct.While -> DebugPointAtWhile.Yes mWhile | _ -> DebugPointAtWhile.No - Some (guardExpr, innerExpr, spWhile, m) + ValueSome (guardExpr, innerExpr, spWhile, m) | _ -> - None + ValueNone +[] let (|SeqTryFinally|_|) g expr = match expr with | ValApp g g.seq_finally_vref (_, [arg1;Expr.Lambda (_, _, _, [dummyv], compensation, _, _) as arg2], m) @@ -10515,53 +11597,58 @@ let (|SeqTryFinally|_|) g expr = let spTry = match mTry.NotedSourceConstruct with NotedSourceConstruct.Try -> DebugPointAtTry.Yes mTry | _ -> DebugPointAtTry.No let spFinally = match mFinally.NotedSourceConstruct with NotedSourceConstruct.Finally -> DebugPointAtFinally.Yes mFinally | _ -> DebugPointAtFinally.No - Some (arg1, compensation, spTry, spFinally, m) + ValueSome (arg1, compensation, spTry, spFinally, m) | _ -> - None + ValueNone +[] let (|SeqUsing|_|) g expr = match expr with | ValApp g g.seq_using_vref ([_;_;elemTy], [resource;Expr.Lambda (_, _, _, [v], body, mBind, _)], m) -> // The debug point mFor at the 'use x = ... ' gets attached to the lambda let spBind = match mBind.NotedSourceConstruct with NotedSourceConstruct.Binding -> DebugPointAtBinding.Yes mBind | _ -> DebugPointAtBinding.NoneAtInvisible - Some (resource, v, body, elemTy, spBind, m) + ValueSome (resource, v, body, elemTy, spBind, m) | _ -> - None + ValueNone +[] let (|SeqForEach|_|) g expr = match expr with // Nested for loops are represented by calls to Seq.collect | ValApp g g.seq_collect_vref ([_inpElemTy;_enumty2;genElemTy], [Expr.Lambda (_, _, _, [v], body, mIn, _); inp], mFor) -> // The debug point mIn at the 'in' gets attached to the first argument, see TcSequenceExpression let spIn = match mIn.NotedSourceConstruct with NotedSourceConstruct.InOrTo -> DebugPointAtInOrTo.Yes mIn | _ -> DebugPointAtInOrTo.No - Some (inp, v, body, genElemTy, mFor, mIn, spIn) + ValueSome (inp, v, body, genElemTy, mFor, mIn, spIn) // "for x in e -> e2" is converted to a call to Seq.map by the F# type checker. This could be removed, except it is also visible in F# quotations. | ValApp g g.seq_map_vref ([_inpElemTy;genElemTy], [Expr.Lambda (_, _, _, [v], body, mIn, _); inp], mFor) -> let spIn = match mIn.NotedSourceConstruct with NotedSourceConstruct.InOrTo -> DebugPointAtInOrTo.Yes mIn | _ -> DebugPointAtInOrTo.No // The debug point mFor at the 'for' gets attached to the first argument, see TcSequenceExpression - Some (inp, v, mkCallSeqSingleton g body.Range genElemTy body, genElemTy, mFor, mIn, spIn) + ValueSome (inp, v, mkCallSeqSingleton g body.Range genElemTy body, genElemTy, mFor, mIn, spIn) - | _ -> None + | _ -> ValueNone +[] let (|SeqDelay|_|) g expr = match expr with | ValApp g g.seq_delay_vref ([elemTy], [Expr.Lambda (_, _, _, [v], e, _, _)], _m) when not (isVarFreeInExpr v e) -> - Some (e, elemTy) - | _ -> None + ValueSome (e, elemTy) + | _ -> ValueNone +[] let (|SeqEmpty|_|) g expr = match expr with - | ValApp g g.seq_empty_vref (_, [], m) -> Some m - | _ -> None + | ValApp g g.seq_empty_vref (_, [], m) -> ValueSome m + | _ -> ValueNone let isFSharpExceptionTy g ty = match tryTcrefOfAppTy g ty with | ValueSome tcref -> tcref.IsFSharpException | _ -> false +[] let (|EmptyModuleOrNamespaces|_|) (moduleOrNamespaceContents: ModuleOrNamespaceContents) = match moduleOrNamespaceContents with | TMDefs(defs = defs) -> @@ -10590,10 +11677,10 @@ let (|EmptyModuleOrNamespaces|_|) (moduleOrNamespaceContents: ModuleOrNamespaceC | _ -> None) if mdDefsLength = emptyModuleOrNamespaces.Length then - Some emptyModuleOrNamespaces + ValueSome emptyModuleOrNamespaces else - None - | _ -> None + ValueNone + | _ -> ValueNone let tryFindExtensionAttribute (g: TcGlobals) (attribs: Attrib list): Attrib option = attribs @@ -10727,7 +11814,7 @@ let rec serializeNode (writer: IndentedTextWriter) (addTrailingComma:bool) (node else writer.WriteLine("}") -let rec serializeEntity path (entity: Entity) = +let serializeEntity path (entity: Entity) = let root = visitEntity entity use sw = new System.IO.StringWriter() use writer = new IndentedTextWriter(sw) diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fsi b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fsi index f2fa42412e..7260366be1 100755 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fsi +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTreeOps.fsi @@ -73,7 +73,8 @@ val (|DebugPoints|): Expr -> Expr * (Expr -> Expr) val valsOfBinds: Bindings -> Vals /// Look for a use of an F# value, possibly including application of a generic thing to a set of type arguments -val (|ExprValWithPossibleTypeInst|_|): Expr -> (ValRef * ValUseFlag * TType list * range) option +[] +val (|ExprValWithPossibleTypeInst|_|): Expr -> (ValRef * ValUseFlag * TType list * range) voption /// Build decision trees imperatively type MatchBuilder = @@ -218,6 +219,10 @@ val mkCompGenLet: range -> Val -> Expr -> Expr -> Expr /// is returned by the given continuation. Compiler-generated bindings do not give rise to a sequence point in debugging. val mkCompGenLetIn: range -> string -> TType -> Expr -> (Val * Expr -> Expr) -> Expr +/// Make a mutable let-expression that locally binds a compiler-generated value to an expression, where the expression +/// is returned by the given continuation. Compiler-generated bindings do not give rise to a sequence point in debugging. +val mkCompGenLetMutableIn: range -> string -> TType -> Expr -> (Val * Expr -> Expr) -> Expr + /// Make a let-expression that locally binds a value to an expression in an "invisible" way. /// Invisible bindings are not given a sequence point and should not have side effects. val mkInvisibleLet: range -> Val -> Expr -> Expr -> Expr @@ -370,7 +375,7 @@ val mkCompiledTupleTy: TcGlobals -> bool -> TTypes -> TType /// Convert from F# tuple creation expression to .NET tuple creation expressions val mkCompiledTuple: TcGlobals -> bool -> TTypes * Exprs * range -> TyconRef * TTypes * Exprs * range -/// Make a TAST expression representing getting an item fromm a tuple +/// Make a TAST expression representing getting an item from a tuple val mkGetTupleItemN: TcGlobals -> range -> int -> ILType -> bool -> Expr -> TType -> Expr /// Evaluate the TupInfo to work out if it is a struct or a ref. Currently this is very simple @@ -642,6 +647,12 @@ val destStructAnonRecdTy: TcGlobals -> TType -> TTypes val tryDestForallTy: TcGlobals -> TType -> Typars * TType +val nullnessOfTy: TcGlobals -> TType -> Nullness + +val changeWithNullReqTyToVariable: TcGlobals -> reqTy: TType -> TType + +val reqTyForArgumentNullnessInference: TcGlobals -> actualTy: TType -> reqTy: TType -> TType + val isFunTy: TcGlobals -> TType -> bool val isForallTy: TcGlobals -> TType -> bool @@ -680,7 +691,7 @@ val tryAnyParTyOption: TcGlobals -> TType -> Typar option val isMeasureTy: TcGlobals -> TType -> bool -val mkAppTy: TyconRef -> TypeInst -> TType +val mkWoNullAppTy: TyconRef -> TypeInst -> TType val mkProvenUnionCaseTy: UnionCaseRef -> TypeInst -> TType @@ -894,6 +905,8 @@ val typarsAEquiv: TcGlobals -> TypeEquivEnv -> Typars -> Typars -> bool val typeAEquivAux: Erasure -> TcGlobals -> TypeEquivEnv -> TType -> TType -> bool +val nullnessSensitivetypeAEquivAux: Erasure -> TcGlobals -> TypeEquivEnv -> TType -> TType -> bool + val typeAEquiv: TcGlobals -> TypeEquivEnv -> TType -> TType -> bool val returnTypesAEquivAux: Erasure -> TcGlobals -> TypeEquivEnv -> TType option -> TType option -> bool @@ -914,7 +927,7 @@ val anonInfoEquiv: AnonRecdTypeInfo -> AnonRecdTypeInfo -> bool val isErasedType: TcGlobals -> TType -> bool // Return all components (units-of-measure, and types) of this type that would be erased -val getErasedTypes: TcGlobals -> TType -> TType list +val getErasedTypes: TcGlobals -> TType -> checkForNullness: bool -> TType list //------------------------------------------------------------------------- // Unit operations @@ -1066,8 +1079,10 @@ type DisplayEnv = shortConstraints: bool useColonForReturnType: bool showAttributes: bool + showCsharpCodeAnalysisAttributes: bool showOverrides: bool showStaticallyResolvedTyparAnnotations: bool + showNullnessAnnotations: bool option abbreviateAdditionalConstraints: bool showTyparDefaultConstraints: bool /// If set, signatures will be rendered with XML documentation comments for members if they exist @@ -1331,6 +1346,12 @@ val MakeExportRemapping: CcuThunk -> ModuleOrNamespace -> Remap /// Make a remapping table for viewing a module or namespace 'from the outside' val ApplyExportRemappingToEntity: TcGlobals -> Remap -> ModuleOrNamespace -> ModuleOrNamespace +/// Get the value including fsi remapping +val DoRemapTycon: (Remap * SignatureHidingInfo) list -> Tycon -> Tycon + +/// Get the value including fsi remapping +val DoRemapVal: (Remap * SignatureHidingInfo) list -> Val -> Val + /// Determine if a type definition is hidden by a signature val IsHiddenTycon: (Remap * SignatureHidingInfo) list -> Tycon -> bool @@ -1528,12 +1549,18 @@ val mkVoidPtrTy: TcGlobals -> TType /// Build a single-dimensional array type val mkArrayType: TcGlobals -> TType -> TType +/// Determine if a type is a bool type +val isBoolTy: TcGlobals -> TType -> bool + /// Determine if a type is a value option type val isValueOptionTy: TcGlobals -> TType -> bool /// Determine if a type is an option type val isOptionTy: TcGlobals -> TType -> bool +/// Determine if a type is an Choice type +val isChoiceTy: TcGlobals -> TType -> bool + /// Take apart an option type val destOptionTy: TcGlobals -> TType -> TType @@ -1543,6 +1570,12 @@ val tryDestOptionTy: TcGlobals -> TType -> TType voption /// Try to take apart an option type val destValueOptionTy: TcGlobals -> TType -> TType +/// Take apart an Choice type +val tryDestChoiceTy: TcGlobals -> TType -> int -> TType voption + +/// Try to take apart an Choice type +val destChoiceTy: TcGlobals -> TType -> int -> TType + /// Determine is a type is a System.Nullable type val isNullableTy: TcGlobals -> TType -> bool @@ -1622,7 +1655,7 @@ val destArrayTy: TcGlobals -> TType -> TType val destListTy: TcGlobals -> TType -> TType /// Build an array type of the given rank -val mkArrayTy: TcGlobals -> int -> TType -> range -> TType +val mkArrayTy: TcGlobals -> int -> Nullness -> TType -> range -> TType /// Check if a type definition is one of the artificial type definitions used for array types of different ranks val isArrayTyconRef: TcGlobals -> TyconRef -> bool @@ -1633,8 +1666,14 @@ val rankOfArrayTyconRef: TcGlobals -> TyconRef -> int /// Determine if a type is the F# unit type val isUnitTy: TcGlobals -> TType -> bool -/// Determine if a type is the System.Object type -val isObjTy: TcGlobals -> TType -> bool +/// Determine if a type is the System.Object type with any nullness qualifier +val isObjTyAnyNullness: TcGlobals -> TType -> bool + +/// Determine if a type is the (System.Object | null) type. Allows either nullness if null checking is disabled. +val isObjNullTy: TcGlobals -> TType -> bool + +/// Determine if a type is a strictly non-nullable System.Object type. If nullness checking is disabled, this returns false. +val isObjTyWithoutNull: TcGlobals -> TType -> bool /// Determine if a type is the System.ValueType type val isValueTypeTy: TcGlobals -> TType -> bool @@ -1660,7 +1699,7 @@ val isFSharpDelegateTy: TcGlobals -> TType -> bool /// Determine if a type is an interface type val isInterfaceTy: TcGlobals -> TType -> bool -/// Determine if a type is a FSharpRef type +/// Determine if a type is a reference type val isRefTy: TcGlobals -> TType -> bool /// Determine if a type is a function (including generic). Not the same as isFunTy. @@ -1737,16 +1776,20 @@ val isStructRecordOrUnionTyconTy: TcGlobals -> TType -> bool val StripSelfRefCell: TcGlobals * ValBaseOrThisInfo * TType -> TType /// An active pattern to determine if a type is a nominal type, possibly instantiated -val (|AppTy|_|): TcGlobals -> TType -> (TyconRef * TType list) option +[] +val (|AppTy|_|): TcGlobals -> TType -> (TyconRef * TType list) voption /// An active pattern to match System.Nullable types -val (|NullableTy|_|): TcGlobals -> TType -> TType option +[] +val (|NullableTy|_|): TcGlobals -> TType -> TType voption /// An active pattern to transform System.Nullable types to their input, otherwise leave the input unchanged +[] val (|StripNullableTy|): TcGlobals -> TType -> TType /// Matches any byref type, yielding the target type -val (|ByrefTy|_|): TcGlobals -> TType -> TType option +[] +val (|ByrefTy|_|): TcGlobals -> TType -> TType voption //------------------------------------------------------------------------- // Special semantic constraints @@ -1768,18 +1811,20 @@ val ModuleNameIsMangled: TcGlobals -> Attribs -> bool val CompileAsEvent: TcGlobals -> Attribs -> bool +val TypeNullIsTrueValue: TcGlobals -> TType -> bool + val TypeNullIsExtraValue: TcGlobals -> range -> TType -> bool -val TypeNullIsTrueValue: TcGlobals -> TType -> bool +val TypeHasAllowNull: TyconRef -> TcGlobals -> range -> bool -val TypeNullNotLiked: TcGlobals -> range -> TType -> bool +val TypeNullIsExtraValueNew: TcGlobals -> range -> TType -> bool val TypeNullNever: TcGlobals -> TType -> bool -val TypeSatisfiesNullConstraint: TcGlobals -> range -> TType -> bool - val TypeHasDefaultValue: TcGlobals -> range -> TType -> bool +val TypeHasDefaultValueNew: TcGlobals -> range -> TType -> bool + val isAbstractTycon: Tycon -> bool val isUnionCaseRefDefinitelyMutable: UnionCaseRef -> bool @@ -1951,6 +1996,12 @@ val mkTwo: TcGlobals -> range -> Expr val mkMinusOne: TcGlobals -> range -> Expr +/// Makes an expression holding a constant 0 value of the given numeric type. +val mkTypedZero: g: TcGlobals -> m: range -> ty: TType -> Expr + +/// Makes an expression holding a constant 1 value of the given numeric type. +val mkTypedOne: g: TcGlobals -> m: range -> ty: TType -> Expr + val destInt32: Expr -> int32 option //------------------------------------------------------------------------- @@ -2238,6 +2289,8 @@ val mkLdelem: TcGlobals -> range -> TType -> Expr -> Expr -> Expr val TryDecodeILAttribute: ILTypeRef -> ILAttributes -> (ILAttribElem list * ILAttributeNamedArg list) option +val IsILAttrib: BuiltinAttribInfo -> ILAttribute -> bool + val TryFindILAttribute: BuiltinAttribInfo -> ILAttributes -> bool val TryFindILAttributeOpt: BuiltinAttribInfo option -> ILAttributes -> bool @@ -2260,6 +2313,8 @@ val TryFindFSharpBoolAttributeAssumeFalse: TcGlobals -> BuiltinAttribInfo -> Att val TryFindFSharpStringAttribute: TcGlobals -> BuiltinAttribInfo -> Attribs -> string option +val TryFindLocalizedFSharpStringAttribute: TcGlobals -> BuiltinAttribInfo -> Attribs -> string option + val TryFindFSharpInt32Attribute: TcGlobals -> BuiltinAttribInfo -> Attribs -> int32 option /// Try to find a specific attribute on a type definition, where the attribute accepts a string argument. @@ -2449,10 +2504,11 @@ type PrettyNaming.ActivePatternInfo with member DisplayNameByIdx: idx: int -> string /// Get the result type for the active pattern - member ResultType: g: TcGlobals -> range -> TType list -> bool -> TType + member ResultType: g: TcGlobals -> range -> TType list -> ActivePatternReturnKind -> TType /// Get the overall type for a function that implements the active pattern - member OverallType: g: TcGlobals -> m: range -> argTy: TType -> retTys: TType list -> isStruct: bool -> TType + member OverallType: + g: TcGlobals -> m: range -> argTy: TType -> retTys: TType list -> retKind: ActivePatternReturnKind -> TType val doesActivePatternHaveFreeTypars: TcGlobals -> ValRef -> bool @@ -2494,19 +2550,25 @@ type EntityRef with member HasMember: TcGlobals -> string -> TType list -> bool -val (|AttribBitwiseOrExpr|_|): TcGlobals -> Expr -> (Expr * Expr) option +[] +val (|AttribBitwiseOrExpr|_|): TcGlobals -> Expr -> (Expr * Expr) voption -val (|EnumExpr|_|): TcGlobals -> Expr -> Expr option +[] +val (|EnumExpr|_|): TcGlobals -> Expr -> Expr voption -val (|TypeOfExpr|_|): TcGlobals -> Expr -> TType option +[] +val (|TypeOfExpr|_|): TcGlobals -> Expr -> TType voption -val (|TypeDefOfExpr|_|): TcGlobals -> Expr -> TType option +[] +val (|TypeDefOfExpr|_|): TcGlobals -> Expr -> TType voption val isNameOfValRef: TcGlobals -> ValRef -> bool -val (|NameOfExpr|_|): TcGlobals -> Expr -> TType option +[] +val (|NameOfExpr|_|): TcGlobals -> Expr -> TType voption -val (|SeqExpr|_|): TcGlobals -> Expr -> unit option +[] +val (|SeqExpr|_|): TcGlobals -> Expr -> unit voption val EvalLiteralExprOrAttribArg: TcGlobals -> Expr -> Expr @@ -2514,27 +2576,84 @@ val EvaledAttribExprEquality: TcGlobals -> Expr -> Expr -> bool val IsSimpleSyntacticConstantExpr: TcGlobals -> Expr -> bool -val (|ConstToILFieldInit|_|): Const -> ILFieldInit option +[] +val (|ConstToILFieldInit|_|): Const -> ILFieldInit voption -val (|ExtractAttribNamedArg|_|): string -> AttribNamedArg list -> AttribExpr option +[] +val (|ExtractAttribNamedArg|_|): string -> AttribNamedArg list -> AttribExpr voption -val (|AttribInt32Arg|_|): AttribExpr -> int32 option +[] +val (|AttribInt32Arg|_|): (AttribExpr -> int32 voption) -val (|AttribInt16Arg|_|): AttribExpr -> int16 option +[] +val (|AttribInt16Arg|_|): (AttribExpr -> int16 voption) -val (|AttribBoolArg|_|): AttribExpr -> bool option +[] +val (|AttribBoolArg|_|): (AttribExpr -> bool voption) -val (|AttribStringArg|_|): AttribExpr -> string option +[] +val (|AttribStringArg|_|): (AttribExpr -> string voption) -val (|Int32Expr|_|): Expr -> int32 option +[] +val (|Int32Expr|_|): Expr -> int32 voption /// Determines types that are potentially known to satisfy the 'comparable' constraint and returns /// a set of residual types that must also satisfy the constraint -val (|SpecialComparableHeadType|_|): TcGlobals -> TType -> TType list option +[] +val (|SpecialComparableHeadType|_|): TcGlobals -> TType -> TType list voption + +[] +val (|SpecialEquatableHeadType|_|): TcGlobals -> TType -> TType list voption -val (|SpecialEquatableHeadType|_|): TcGlobals -> TType -> TType list option +[] +val (|SpecialNotEquatableHeadType|_|): TcGlobals -> TType -> unit voption -val (|SpecialNotEquatableHeadType|_|): TcGlobals -> TType -> unit option +val (|TyparTy|NullableTypar|StructTy|NullTrueValue|NullableRefType|WithoutNullRefType|UnresolvedRefType|): + TType * TcGlobals -> Choice + +/// Matches if the given expression is an application +/// of the range or range-step operator on an integral type +/// and returns the type, start, step, and finish if so. +/// +/// start..finish +/// +/// start..step..finish +[] +val (|IntegralRange|_|): g: TcGlobals -> expr: Expr -> (TType * (Expr * Expr * Expr)) voption + +[] +module IntegralConst = + /// Constant 0. + [] + val (|Zero|_|): c: Const -> unit voption + +/// An expression holding the loop's iteration count. +type Count = Expr + +/// An expression representing the loop's current iteration index. +type Idx = Expr + +/// An expression representing the current loop element. +type Elem = Expr + +/// An expression representing the loop body. +type Body = Expr + +/// An expression representing the overall loop. +type Loop = Expr + +/// Makes an optimized while-loop for a range expression with the given integral start, step, and finish: +/// +/// start..step..finish +/// +/// The buildLoop function enables using the precomputed iteration count in an optional initialization step before the loop is executed. +val mkOptimizedRangeLoop: + g: TcGlobals -> + mBody: range * mFor: range * mIn: range * spInWhile: DebugPointAtWhile -> + rangeTy: TType * rangeExpr: Expr -> + start: Expr * step: Expr * finish: Expr -> + buildLoop: (Count -> ((Idx -> Elem -> Body) -> Loop) -> Expr) -> + Expr type OptimizeForExpressionOptions = | OptimizeIntRangesOnly @@ -2550,18 +2669,21 @@ val ValIsExplicitImpl: TcGlobals -> Val -> bool val ValRefIsExplicitImpl: TcGlobals -> ValRef -> bool +[] val (|LinearMatchExpr|_|): - Expr -> (DebugPointAtBinding * range * DecisionTree * DecisionTreeTarget * Expr * range * TType) option + Expr -> (DebugPointAtBinding * range * DecisionTree * DecisionTreeTarget * Expr * range * TType) voption val rebuildLinearMatchExpr: DebugPointAtBinding * range * DecisionTree * DecisionTreeTarget * Expr * range * TType -> Expr -val (|LinearOpExpr|_|): Expr -> (TOp * TypeInst * Expr list * Expr * range) option +[] +val (|LinearOpExpr|_|): Expr -> (TOp * TypeInst * Expr list * Expr * range) voption val rebuildLinearOpExpr: TOp * TypeInst * Expr list * Expr * range -> Expr val mkCoerceIfNeeded: TcGlobals -> tgtTy: TType -> srcTy: TType -> Expr -> Expr +[] val (|InnerExprPat|): Expr -> Expr val allValsOfModDef: ModuleOrNamespaceContents -> seq @@ -2582,7 +2704,7 @@ val GetTraitConstraintInfosOfTypars: TcGlobals -> Typars -> TraitConstraintInfo val GetTraitWitnessInfosOfTypars: TcGlobals -> numParentTypars: int -> typars: Typars -> TraitWitnessInfos -/// An immutable mappping from witnesses to some data. +/// An immutable mapping from witnesses to some data. /// /// Note: this uses an immutable HashMap/Dictionary with an IEqualityComparer that captures TcGlobals, see EmptyTraitWitnessInfoHashMap type TraitWitnessInfoHashMap<'T> = ImmutableDictionary @@ -2591,48 +2713,61 @@ type TraitWitnessInfoHashMap<'T> = ImmutableDictionary val EmptyTraitWitnessInfoHashMap: TcGlobals -> TraitWitnessInfoHashMap<'T> /// Match expressions that are an application of a particular F# function value -val (|ValApp|_|): TcGlobals -> ValRef -> Expr -> (TypeInst * Exprs * range) option +[] +val (|ValApp|_|): TcGlobals -> ValRef -> Expr -> (TypeInst * Exprs * range) voption /// Match expressions that represent the creation of an instance of an F# delegate value -val (|NewDelegateExpr|_|): TcGlobals -> Expr -> (Unique * Val list * Expr * range * (Expr -> Expr)) option +[] +val (|NewDelegateExpr|_|): TcGlobals -> Expr -> (Unique * Val list * Expr * range * (Expr -> Expr)) voption /// Match a .Invoke on a delegate -val (|DelegateInvokeExpr|_|): TcGlobals -> Expr -> (Expr * TType * Expr * Expr * range) option +[] +val (|DelegateInvokeExpr|_|): TcGlobals -> Expr -> (Expr * TType * Expr * Expr * range) voption /// Match 'if __useResumableCode then ... else ...' expressions -val (|IfUseResumableStateMachinesExpr|_|): TcGlobals -> Expr -> (Expr * Expr) option +[] +val (|IfUseResumableStateMachinesExpr|_|): TcGlobals -> Expr -> (Expr * Expr) voption val CombineCcuContentFragments: ModuleOrNamespaceType list -> ModuleOrNamespaceType /// Recognise a 'match __resumableEntry() with ...' expression -val (|ResumableEntryMatchExpr|_|): g: TcGlobals -> Expr -> (Expr * Val * Expr * (Expr * Expr -> Expr)) option +[] +val (|ResumableEntryMatchExpr|_|): g: TcGlobals -> Expr -> (Expr * Val * Expr * (Expr * Expr -> Expr)) voption /// Recognise a '__stateMachine' expression +[] val (|StructStateMachineExpr|_|): - g: TcGlobals -> expr: Expr -> (TType * (Val * Expr) * (Val * Val * Expr) * (Val * Expr)) option + g: TcGlobals -> expr: Expr -> (TType * (Val * Expr) * (Val * Val * Expr) * (Val * Expr)) voption /// Recognise a sequential or binding construct in a resumable code -val (|SequentialResumableCode|_|): g: TcGlobals -> Expr -> (Expr * Expr * range * (Expr -> Expr -> Expr)) option +[] +val (|SequentialResumableCode|_|): g: TcGlobals -> Expr -> (Expr * Expr * range * (Expr -> Expr -> Expr)) voption /// Recognise a '__debugPoint' expression -val (|DebugPointExpr|_|): g: TcGlobals -> Expr -> string option +[] +val (|DebugPointExpr|_|): g: TcGlobals -> Expr -> string voption /// Recognise a '__resumeAt' expression -val (|ResumeAtExpr|_|): g: TcGlobals -> Expr -> Expr option +[] +val (|ResumeAtExpr|_|): g: TcGlobals -> Expr -> Expr voption /// Recognise a while expression -val (|WhileExpr|_|): Expr -> (DebugPointAtWhile * SpecialWhileLoopMarker * Expr * Expr * range) option +[] +val (|WhileExpr|_|): Expr -> (DebugPointAtWhile * SpecialWhileLoopMarker * Expr * Expr * range) voption /// Recognise an integer for-loop expression +[] val (|IntegerForLoopExpr|_|): - Expr -> (DebugPointAtFor * DebugPointAtInOrTo * ForLoopStyle * Expr * Expr * Val * Expr * range) option + Expr -> (DebugPointAtFor * DebugPointAtInOrTo * ForLoopStyle * Expr * Expr * Val * Expr * range) voption /// Recognise a try-with expression +[] val (|TryWithExpr|_|): - Expr -> (DebugPointAtTry * DebugPointAtWith * TType * Expr * Val * Expr * Val * Expr * range) option + Expr -> (DebugPointAtTry * DebugPointAtWith * TType * Expr * Val * Expr * Val * Expr * range) voption /// Recognise a try-finally expression -val (|TryFinallyExpr|_|): Expr -> (DebugPointAtTry * DebugPointAtFinally * TType * Expr * Expr * range) option +[] +val (|TryFinallyExpr|_|): Expr -> (DebugPointAtTry * DebugPointAtFinally * TType * Expr * Expr * range) voption /// Add a label to use as the target for a goto val mkLabelled: range -> ILCodeLabel -> Expr -> Expr @@ -2656,49 +2791,63 @@ val TryBindTyconRefAttribute: val HasDefaultAugmentationAttribute: g: TcGlobals -> tcref: TyconRef -> bool +[] val (|ResumableCodeInvoke|_|): - g: TcGlobals -> expr: Expr -> (Expr * Expr * Expr list * range * (Expr * Expr list -> Expr)) option + g: TcGlobals -> expr: Expr -> (Expr * Expr * Expr list * range * (Expr * Expr list -> Expr)) voption -val (|OpPipeRight|_|): g: TcGlobals -> expr: Expr -> (TType * Expr * Expr * range) option +[] +val (|OpPipeRight|_|): g: TcGlobals -> expr: Expr -> (TType * Expr * Expr * range) voption -val (|OpPipeRight2|_|): g: TcGlobals -> expr: Expr -> (TType * Expr * Expr * Expr * range) option +[] +val (|OpPipeRight2|_|): g: TcGlobals -> expr: Expr -> (TType * Expr * Expr * Expr * range) voption -val (|OpPipeRight3|_|): g: TcGlobals -> expr: Expr -> (TType * Expr * Expr * Expr * Expr * range) option +[] +val (|OpPipeRight3|_|): g: TcGlobals -> expr: Expr -> (TType * Expr * Expr * Expr * Expr * range) voption val mkDebugPoint: m: range -> expr: Expr -> Expr /// Match an if...then...else expression or the result of "a && b" or "a || b" -val (|IfThenElseExpr|_|): expr: Expr -> (Expr * Expr * Expr) option +[] +val (|IfThenElseExpr|_|): expr: Expr -> (Expr * Expr * Expr) voption /// Determine if a value is a method implementing an interface dispatch slot using a private method impl val ComputeUseMethodImpl: g: TcGlobals -> v: Val -> bool /// Detect the de-sugared form of a 'yield x' within a 'seq { ... }' -val (|SeqYield|_|): TcGlobals -> Expr -> (Expr * range) option +[] +val (|SeqYield|_|): TcGlobals -> Expr -> (Expr * range) voption /// Detect the de-sugared form of a 'expr; expr' within a 'seq { ... }' -val (|SeqAppend|_|): TcGlobals -> Expr -> (Expr * Expr * range) option +[] +val (|SeqAppend|_|): TcGlobals -> Expr -> (Expr * Expr * range) voption /// Detect the de-sugared form of a 'while gd do expr' within a 'seq { ... }' -val (|SeqWhile|_|): TcGlobals -> Expr -> (Expr * Expr * DebugPointAtWhile * range) option +[] +val (|SeqWhile|_|): TcGlobals -> Expr -> (Expr * Expr * DebugPointAtWhile * range) voption /// Detect the de-sugared form of a 'try .. finally .. ' within a 'seq { ... }' -val (|SeqTryFinally|_|): TcGlobals -> Expr -> (Expr * Expr * DebugPointAtTry * DebugPointAtFinally * range) option +[] +val (|SeqTryFinally|_|): TcGlobals -> Expr -> (Expr * Expr * DebugPointAtTry * DebugPointAtFinally * range) voption /// Detect the de-sugared form of a 'use x = ..' within a 'seq { ... }' -val (|SeqUsing|_|): TcGlobals -> Expr -> (Expr * Val * Expr * TType * DebugPointAtBinding * range) option +[] +val (|SeqUsing|_|): TcGlobals -> Expr -> (Expr * Val * Expr * TType * DebugPointAtBinding * range) voption /// Detect the de-sugared form of a 'for x in collection do ..' within a 'seq { ... }' -val (|SeqForEach|_|): TcGlobals -> Expr -> (Expr * Val * Expr * TType * range * range * DebugPointAtInOrTo) option +[] +val (|SeqForEach|_|): TcGlobals -> Expr -> (Expr * Val * Expr * TType * range * range * DebugPointAtInOrTo) voption /// Detect the outer 'Seq.delay' added for a construct 'seq { ... }' -val (|SeqDelay|_|): TcGlobals -> Expr -> (Expr * TType) option +[] +val (|SeqDelay|_|): TcGlobals -> Expr -> (Expr * TType) voption /// Detect a 'Seq.empty' implicit in the implied 'else' branch of an 'if .. then' in a seq { ... } -val (|SeqEmpty|_|): TcGlobals -> Expr -> range option +[] +val (|SeqEmpty|_|): TcGlobals -> Expr -> range voption /// Detect a 'seq { ... }' expression -val (|Seq|_|): TcGlobals -> Expr -> (Expr * TType) option +[] +val (|Seq|_|): TcGlobals -> Expr -> (Expr * TType) voption /// Indicates if an F# type is the type associated with an F# exception declaration val isFSharpExceptionTy: g: TcGlobals -> ty: TType -> bool @@ -2724,8 +2873,9 @@ type TraitConstraintInfo with /// Matches a ModuleOrNamespaceContents that is empty from a signature printing point of view. /// Signatures printed via the typed tree in NicePrint don't print TMDefOpens or TMDefDo. /// This will match anything that does not have any types or bindings. +[] val (|EmptyModuleOrNamespaces|_|): - moduleOrNamespaceContents: ModuleOrNamespaceContents -> (ModuleOrNamespace list) option + moduleOrNamespaceContents: ModuleOrNamespaceContents -> (ModuleOrNamespace list) voption val tryFindExtensionAttribute: g: TcGlobals -> attribs: Attrib list -> Attrib option diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fs b/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fs index cb7d654bfd..b1e325c079 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fs @@ -67,7 +67,11 @@ type PickledDataWithReferences<'rawData> = //--------------------------------------------------------------------------- [] +#if NO_CHECKNULLS type Table<'T> = +#else +type Table<'T when 'T: not null> = +#endif { name: string tbl: Dictionary<'T, int> mutable rows: ResizeArray<'T> @@ -121,6 +125,7 @@ type NodeOutTable<'Data, 'Node> = [] type WriterState = { os: ByteBuffer + osB: ByteBuffer oscope: CcuThunk occus: Table oentities: NodeOutTable @@ -154,6 +159,8 @@ type NodeInTable<'Data, 'Node> = [] type ReaderState = { is: ByteStream + // secondary stream of information for F# 5.0 + isB: ByteStream iilscope: ILScopeRef iccus: InputTable ientities: NodeInTable @@ -178,18 +185,28 @@ type 'T pickler = 'T -> WriterState -> unit let p_byte b st = st.os.EmitIntAsByte b +let p_byteB b st = st.osB.EmitIntAsByte b + let p_bool b st = p_byte (if b then 1 else 0) st -let prim_p_int32 i st = +/// Write an uncompressed integer to the main stream. +let prim_p_int32 i st = p_byte (b0 i) st p_byte (b1 i) st p_byte (b2 i) st p_byte (b3 i) st -/// Compress integers according to the same scheme used by CLR metadata -/// This halves the size of pickled data -let p_int32 n st = - if n >= 0 && n <= 0x7F then +/// Write an uncompressed integer to the B stream. +let prim_p_int32B i st = + p_byteB (b0 i) st + p_byteB (b1 i) st + p_byteB (b2 i) st + p_byteB (b3 i) st + +/// Compress integers according to the same scheme used by CLR metadata +/// This halves the size of pickled data +let p_int32 n st = + if n >= 0 && n <= 0x7F then p_byte (b0 n) st else if n >= 0x80 && n <= 0x3FFF then p_byte (0x80 ||| (n >>> 8)) st @@ -198,6 +215,17 @@ let p_int32 n st = p_byte 0xFF st prim_p_int32 n st +/// Write a compressed integer to the B stream. +let p_int32B n st = + if n >= 0 && n <= 0x7F then + p_byteB (b0 n) st + else if n >= 0x80 && n <= 0x3FFF then + p_byteB ( (0x80 ||| (n >>> 8))) st + p_byteB ( (n &&& 0xFF)) st + else + p_byteB 0xFF st + prim_p_int32B n st + let space = () let p_space n () st = for i = 0 to n - 1 do @@ -229,6 +257,7 @@ let p_prim_string (s: string) st = st.os.EmitBytes bytes let p_int c st = p_int32 c st +let p_intB c st = p_int32B c st let p_int8 (i: sbyte) st = p_int32 (int32 i) st let p_uint8 (i: byte) st = p_byte (int i) st let p_int16 (i: int16) st = p_int32 (int32 i) st @@ -269,12 +298,16 @@ let inline p_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (a, b, c, d, e, f, x7, x8 let u_byte st = int (st.is.ReadByte()) +/// Unpickle an uncompressed integer from the B stream +/// The extra B stream of bytes is implicitly 0 if not present +let u_byteB st = + if st.isB.IsEOF then 0 else int (st.isB.ReadByte()) + type unpickler<'T> = ReaderState -> 'T let u_bool st = let b = u_byte st in (b = 1) - - +/// Unpickle an uncompressed integer from the main stream let prim_u_int32 st = let b0 = (u_byte st) let b1 = (u_byte st) @@ -282,6 +315,14 @@ let prim_u_int32 st = let b3 = (u_byte st) b0 ||| (b1 <<< 8) ||| (b2 <<< 16) ||| (b3 <<< 24) +/// Unpickle an uncompressed integer from the B stream +let prim_u_int32B st = + let b0 = u_byteB st + let b1 = u_byteB st + let b2 = u_byteB st + let b3 = u_byteB st + b0 ||| (b1 <<< 8) ||| (b2 <<< 16) ||| (b3 <<< 24) + let u_int32 st = let b0 = u_byte st if b0 <= 0x7F then b0 @@ -293,6 +334,19 @@ let u_int32 st = assert(b0 = 0xFF) prim_u_int32 st +/// Unpickle a compressed integer from the B stream. +/// The integer is 0 if the B stream is not present. +let u_int32B st = + let b0 = u_byteB st + if b0 <= 0x7F then b0 + else if b0 <= 0xbf then + let b0 = b0 &&& 0x7F + let b1 = u_byteB st + (b0 <<< 8) ||| b1 + else + assert(b0 = 0xFF) + prim_u_int32B st + let u_byte_memory st = let n = (u_int32 st) st.is.ReadBytes n @@ -305,6 +359,7 @@ let u_prim_string st = st.is.ReadUtf8String len let u_int st = u_int32 st +let u_intB st = u_int32B st let u_int8 st = sbyte (u_int32 st) let u_uint8 st = byte (u_byte st) let u_int16 st = int16 (u_int32 st) @@ -446,7 +501,12 @@ let p_list_core f (xs: 'T list) st = let p_list f x st = p_int (List.length x) st p_list_core f x st -let p_list_ext extraf f x st = + +let p_listB f x st = + p_intB (List.length x) st + p_list_core f x st + +let p_list_ext extraf f x st = let n = List.length x let n = if Option.isSome extraf then n ||| 0x80000000 else n p_int n st @@ -532,6 +592,12 @@ let u_list_core f n st = let u_list f st = let n = u_int st u_list_core f n st + +/// Unpickle a list from the B stream. The resulting list is empty if the B stream is not present. +let u_listB f st = + let n = u_intB st + u_list_core f n st + let u_list_ext extra f st = let n = u_int st let extraItem = @@ -542,18 +608,7 @@ let u_list_ext extra f st = let list = u_list_core f (n &&& 0x7FFFFFFF) st extraItem, list -#if FLAT_LIST_AS_LIST -#else let u_List f st = u_list f st // new List<_> (u_array f st) -#endif -#if FLAT_LIST_AS_ARRAY_STRUCT -//#else -let u_List f st = List(u_array f st) -#endif -#if FLAT_LIST_AS_ARRAY -//#else -let u_List f st = u_array f st -#endif // Mark up default constraints with a priority in reverse order: last gets 0 etc. See comment on TyparConstraint.DefaultsTo let u_list_revi f st = @@ -571,12 +626,6 @@ let u_option f st = | 1 -> Some (f st) | n -> ufailwith st ("u_option: found number " + string n) -// Boobytrap an OSGN node with a force of a lazy load of a bunch of pickled data -#if LAZY_UNPICKLE -let wire (x: osgn<_>) (res: Lazy<_>) = - x.osgnTripWire <- Some(fun () -> res.Force() |> ignore) -#endif - let u_lazy u st = // Read the number of bytes in the record @@ -589,26 +638,8 @@ let u_lazy u st = let ovalsIdx1 = prim_u_int32 st // fixupPos6 let ovalsIdx2 = prim_u_int32 st // fixupPos7 -#if LAZY_UNPICKLE - // Record the position in the bytestream to use when forcing the read of the data - let idx1 = st.is.Position - // Skip the length of data - st.is.Skip len - // This is the lazy computation that wil force the unpickling of the term. - // This term must contain OSGN definitions of the given nodes. - let res = - lazy (let st = { st with is = st.is.CloneAndSeek idx1 } - u st) - // Force the reading of the data as a "tripwire" for each of the OSGN thunks - for i = otyconsIdx1 to otyconsIdx2-1 do wire (st.ientities.Get i) res done - for i = ovalsIdx1 to ovalsIdx2-1 do wire (st.ivals.Get i) res done - for i = otyparsIdx1 to otyparsIdx2-1 do wire (st.itypars.Get i) res done - res -#else ignore (len, otyconsIdx1, otyconsIdx2, otyparsIdx1, otyparsIdx2, ovalsIdx1, ovalsIdx2) InterruptibleLazy.FromValue(u st) -#endif - let u_hole () = let mutable h = None @@ -684,7 +715,12 @@ let p_nleref x st = p_int (encode_nleref st.occus st.ostrings st.onlerefs st.osc // Simple types are types like "int", represented as TType(Ref_nonlocal(..., "int"), []). // A huge number of these occur in pickled F# data, so make them unique. -let decode_simpletyp st _ccuTab _stringTab nlerefTab a = TType_app(ERefNonLocal (lookup_nleref st nlerefTab a), [], 0uy) +// +// NULLNESS - the simpletyp table now holds KnownAmbivalentToNull by default. +// For old assemblies it is, if we give those assemblies the ambivalent interpretation. +// For new assemblies compiled with null-checking on it isn't, if the default is to give +// those the KnownWithoutNull interpretation by default. +let decode_simpletyp st _ccuTab _stringTab nlerefTab a = TType_app(ERefNonLocal (lookup_nleref st nlerefTab a), [], KnownAmbivalentToNull) let u_encoded_simpletyp st = u_int st let u_simpletyp st = lookup_uniq st st.isimpletys (u_int st) let encode_simpletyp ccuTab stringTab nlerefTab simpleTyTab thisCcu a = encode_uniq simpleTyTab (encode_nleref ccuTab stringTab nlerefTab thisCcu a) @@ -698,6 +734,7 @@ let PickleBufferCapacity = 50000 let pickleObjWithDanglingCcus inMem file g scope p x = let st1 = { os = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true) + osB = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true) oscope=scope occus= Table<_>.Create "occus" oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), id , "otycons") @@ -711,8 +748,9 @@ let pickleObjWithDanglingCcus inMem file g scope p x = oglobals=g ofile=file oInMem=inMem - isStructThisArgPos = false} - let ccuNameTab, (ntycons, ntypars, nvals, nanoninfos), stringTab, pubpathTab, nlerefTab, simpleTyTab, phase1bytes = + isStructThisArgPos = false } + + let ccuNameTab,(ntycons, ntypars, nvals, nanoninfos),stringTab,pubpathTab,nlerefTab,simpleTyTab,phase1bytes,phase1bytesB = p x st1 let sizes = st1.oentities.Size, @@ -720,17 +758,18 @@ let pickleObjWithDanglingCcus inMem file g scope p x = st1.ovals.Size, st1.oanoninfos.Size #if FABLE_COMPILER - st1.occus, sizes, st1.ostrings, st1.opubpaths, st1.onlerefs, st1.osimpletys, st1.os.Close() + st1.occus, sizes, st1.ostrings, st1.opubpaths, st1.onlerefs, st1.osimpletys, st1.os.Close(), st1.osB #else - st1.occus, sizes, st1.ostrings, st1.opubpaths, st1.onlerefs, st1.osimpletys, st1.os.AsMemory() + st1.occus, sizes, st1.ostrings, st1.opubpaths, st1.onlerefs, st1.osimpletys, st1.os.AsMemory(), st1.osB #endif let st2 = { os = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true) + osB = ByteBuffer.Create(PickleBufferCapacity, useArrayPool = true) oscope=scope occus= Table<_>.Create "occus (fake)" - oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), id , "otycons") - otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), id , "otypars") + oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), id, "otycons") + otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), id, "otypars") ovals=NodeOutTable<_, _>.Create((fun (v: Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") oanoninfos=NodeOutTable<_, _>.Create((fun (v: AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.IlTypeName), (fun _ -> range0), id, "oanoninfos") ostrings=Table<_>.Create "ostrings (fake)" @@ -762,12 +801,22 @@ let pickleObjWithDanglingCcus inMem file g scope p x = #endif (stringTab.AsArray, pubpathTab.AsArray, nlerefTab.AsArray, simpleTyTab.AsArray, phase1bytes) st2 + + // The B stream should be empty in the second phase +#if FABLE_COMPILER + let phase2bytesB = st2.osB.Close() +#else + let phase2bytesB = st2.osB.AsMemory() +#endif + if phase2bytesB.Length <> 0 then failwith "expected phase2bytesB.Length = 0" + (st2.osB :> System.IDisposable).Dispose() st2.os (st1.os :> System.IDisposable).Dispose() - phase2bytes -let check (ilscope: ILScopeRef) (inMap: NodeInTable<_, _>) = + phase2bytes, phase1bytesB + +let check (ilscope: ILScopeRef) (inMap: NodeInTable<_,_>) = for i = 0 to inMap.Count - 1 do let n = inMap.Get i if not (inMap.IsLinked n) then @@ -777,9 +826,10 @@ let check (ilscope: ILScopeRef) (inMap: NodeInTable<_, _>) = // an identical copy of the source for the DLL containing the data being unpickled. A message will // then be printed indicating the name of the item. -let unpickleObjWithDanglingCcus file viewedScope (ilModule: ILModuleDef option) u (phase2bytes: ReadOnlyByteMemory) = +let unpickleObjWithDanglingCcus file viewedScope (ilModule: ILModuleDef option) u (phase2bytes: ReadOnlyByteMemory) (phase1bytesB: ReadOnlyByteMemory) = let st2 = { is = ByteStream.FromBytes (phase2bytes, 0, phase2bytes.Length) + isB = ByteStream.FromBytes (ByteMemory.FromArray([| |]).AsReadOnly(), 0, 0) iilscope = viewedScope iccus = new_itbl "iccus (fake)" [| |] ientities = NodeInTable<_, _>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", 0) @@ -813,6 +863,7 @@ let unpickleObjWithDanglingCcus file viewedScope (ilModule: ILModuleDef option) let data = let st1 = { is = ByteStream.FromBytes (phase1bytes, 0, phase1bytes.Length) + isB = ByteStream.FromBytes (phase1bytesB, 0, phase1bytesB.Length) iccus = ccuTab iilscope = viewedScope ientities = NodeInTable<_, _>.Create(Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", ntycons) @@ -827,6 +878,7 @@ let unpickleObjWithDanglingCcus file viewedScope (ilModule: ILModuleDef option) iILModule = ilModule } let res = u st1 check viewedScope st1.ientities + check viewedScope st1.ientities check viewedScope st1.ivals check viewedScope st1.itypars res @@ -1447,7 +1499,7 @@ let p_trait_sln sln st = p_byte 7 st; p_tup4 p_ty (p_vref "trait") p_tys p_ty (a, b, c, d) st -let p_trait (TTrait(a, b, c, d, e, f)) st = +let p_trait (TTrait(a, b, c, d, e, _, f)) st = p_tup6 p_tys p_string p_MemberFlags p_tys (p_option p_ty) (p_option p_trait_sln) (a, b, c, d, e, f.Value) st let u_anonInfo_data st = @@ -1487,7 +1539,7 @@ let u_trait_sln st = let u_trait st = let a, b, c, d, e, f = u_tup6 u_tys u_string u_MemberFlags u_tys (u_option u_ty) (u_option u_trait_sln) st - TTrait (a, b, c, d, e, ref f) + TTrait (a, b, c, d, e, ref None, ref f) let p_rational q st = p_int32 (GetNumerator q) st; p_int32 (GetDenominator q) st @@ -1574,7 +1626,23 @@ let p_tyar_constraint x st = | TyparConstraint.SupportsComparison _ -> p_byte 10 st | TyparConstraint.SupportsEquality _ -> p_byte 11 st | TyparConstraint.IsUnmanaged _ -> p_byte 12 st -let p_tyar_constraints = (p_list p_tyar_constraint) + + | TyparConstraint.NotSupportsNull _ + | TyparConstraint.AllowsRefStruct _ -> + failwith $"%A{x} constraints should only be emitted to streamB" + +// Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers +let p_tyar_constraintB x st = + match x with + | TyparConstraint.NotSupportsNull _ -> p_byteB 1 st + | TyparConstraint.AllowsRefStruct _ -> p_byteB 2 st + | _ -> failwith "only NotSupportsNull and AllowsRefStruct constraints should be emitted to streamB" + +let p_tyar_constraints cxs st = + let cxs1, cxs2 = cxs |> List.partition (function TyparConstraint.NotSupportsNull _ | TyparConstraint.AllowsRefStruct _ -> false | _ -> true) + p_list p_tyar_constraint cxs1 st + // Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers + p_listB p_tyar_constraintB cxs2 st let u_tyar_constraint st = let tag = u_byte st @@ -1594,9 +1662,22 @@ let u_tyar_constraint st = | 12 -> (fun _ -> TyparConstraint.IsUnmanaged range0) | _ -> ufailwith st "u_tyar_constraint" - -let u_tyar_constraints = (u_list_revi u_tyar_constraint) - +// Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers +let u_tyar_constraintB st = + let tag = u_byteB st + match tag with + | 1 -> TyparConstraint.NotSupportsNull range0 + | 2 -> TyparConstraint.AllowsRefStruct range0 + | _ -> ufailwith st "u_tyar_constraintB - unexpected constraint in streamB" + +let u_tyar_constraints st = + let cxs1 = u_list_revi u_tyar_constraint st + // Some extra F#9+ constraints are stored in stream B, these will be ignored by earlier F# compilers + // + // If the B stream is not present (e.g. reading F# 4.5 components) then this list will be empty + // via the implementation of u_listB. + let cxs2 = u_listB u_tyar_constraintB st + cxs1 @ cxs2 let p_tyar_spec_data (x: Typar) st = p_tup5 @@ -1624,7 +1705,7 @@ let u_tyar_spec_data st = typar_opt_data= match g, e, c with | doc, [], [] when doc.IsEmpty -> None - | _ -> Some { typar_il_name = None; typar_xmldoc = g; typar_constraints = e; typar_attribs = c } } + | _ -> Some { typar_il_name = None; typar_xmldoc = g; typar_constraints = e; typar_attribs = c;typar_is_contravariant = false } } let u_tyar_spec st = u_osgn_decl st.itypars u_tyar_spec_data st @@ -1649,19 +1730,41 @@ let _ = fill_p_ty2 (fun isStructThisArgPos ty st -> else p_byte 0 st; p_tys l st - | TType_app(ERefNonLocal nleref, [], _) -> + | TType_app(ERefNonLocal nleref, [], nullness) -> + if st.oglobals.langFeatureNullness then + match nullness.Evaluate() with + | NullnessInfo.WithNull -> p_byteB 9 st + | NullnessInfo.WithoutNull -> p_byteB 10 st + | NullnessInfo.AmbivalentToNull -> p_byteB 11 st p_byte 1 st; p_simpletyp nleref st - | TType_app (tc, tinst, _) -> - p_byte 2 st; p_tup2 (p_tcref "typ") p_tys (tc, tinst) st - - | TType_fun (d, r, _) -> + | TType_app (tc, tinst, nullness) -> + if st.oglobals.langFeatureNullness then + match nullness.Evaluate() with + | NullnessInfo.WithNull -> p_byteB 12 st + | NullnessInfo.WithoutNull -> p_byteB 13 st + | NullnessInfo.AmbivalentToNull -> p_byteB 14 st + p_byte 2 st; p_tcref "typ" tc st; p_tys tinst st + + | TType_fun (d,r,nullness) -> + if st.oglobals.langFeatureNullness then + match nullness.Evaluate() with + | NullnessInfo.WithNull -> p_byteB 15 st + | NullnessInfo.WithoutNull -> p_byteB 16 st + | NullnessInfo.AmbivalentToNull -> p_byteB 17 st p_byte 3 st // Note, the "this" argument may be found in the domain position of a function type, so propagate the isStructThisArgPos value p_ty2 isStructThisArgPos d st p_ty r st - | TType_var (r, _) -> p_byte 4 st; p_tpref r st + | TType_var (r, nullness) -> + if st.oglobals.langFeatureNullness then + match nullness.Evaluate() with + | NullnessInfo.WithNull -> p_byteB 18 st + | NullnessInfo.WithoutNull -> p_byteB 19 st + | NullnessInfo.AmbivalentToNull -> p_byteB 20 st + p_byte 4 st + p_tpref r st | TType_forall (tps, r) -> p_byte 5 st @@ -1687,27 +1790,59 @@ let _ = fill_p_ty2 (fun isStructThisArgPos ty st -> let _ = fill_u_ty (fun st -> let tag = u_byte st + match tag with | 0 -> let l = u_tys st TType_tuple (tupInfoRef, l) - - | 1 -> - u_simpletyp st - - | 2 -> - let tc = u_tcref st + | 1 -> + let tagB = u_byteB st + let sty = u_simpletyp st + match tagB with + | 0 -> + sty + | 9 -> + match sty with + | TType_app(tcref, _, _) -> TType_app(tcref, [], KnownWithNull) + | _ -> ufailwith st "u_ty 9a" + | 10 -> + match sty with + | TType_app(tcref, _, _) -> TType_app(tcref, [], KnownWithoutNull) + | _ -> ufailwith st "u_ty 9b" + | 11 -> + match sty with + | TType_app(tcref, _, _) -> TType_app(tcref, [], KnownAmbivalentToNull) + | _ -> ufailwith st "u_ty 9c" + | b -> ufailwith st (sprintf "u_ty - 1/B, byte = %A" b) + | 2 -> + let tagB = u_byteB st + let tcref = u_tcref st let tinst = u_tys st - TType_app (tc, tinst, 0uy) - - | 3 -> + match tagB with + | 0 -> TType_app (tcref, tinst, KnownAmbivalentToNull) + | 12 -> TType_app (tcref, tinst, KnownWithNull) + | 13 -> TType_app (tcref, tinst, KnownWithoutNull) + | 14 -> TType_app (tcref, tinst, KnownAmbivalentToNull) + | _ -> ufailwith st "u_ty - 2/B" + | 3 -> + let tagB = u_byteB st let d = u_ty st let r = u_ty st - TType_fun (d, r, 0uy) - + match tagB with + | 0 -> TType_fun (d, r, KnownAmbivalentToNull) + | 15 -> TType_fun (d, r, KnownWithNull) + | 16 -> TType_fun (d, r, KnownWithoutNull) + | 17 -> TType_fun (d, r, KnownAmbivalentToNull) + | _ -> ufailwith st "u_ty - 3/B" | 4 -> + let tagB = u_byteB st let r = u_tpref st - r.AsType + match tagB with + | 0 -> r.AsType KnownAmbivalentToNull + | 18 -> r.AsType KnownWithNull + | 19 -> r.AsType KnownWithoutNull + | 20 -> r.AsType KnownAmbivalentToNull + | _ -> ufailwith st "u_ty - 4/B" | 5 -> let tps = u_tyar_specs st @@ -1787,7 +1922,7 @@ let p_istype x st = | ModuleOrType -> p_byte 1 st | Namespace _ -> p_byte 2 st -let p_cpath (CompPath(a, b)) st = +let p_cpath (CompPath(a, _, b)) st = p_tup2 p_ILScopeRef (p_list (p_tup2 p_string p_istype)) (a, b) st let u_ranges st = u_option (u_tup2 u_range u_range) st @@ -1802,7 +1937,7 @@ let u_istype st = let u_cpath st = let a, b = u_tup2 u_ILScopeRef (u_list (u_tup2 u_string u_istype)) st - CompPath(a, b) + CompPath(a, SyntaxAccess.Unknown, b) let rec p_tycon_repr x st = // The leading "p_byte 1" and "p_byte 0" come from the F# 2.0 format, which used an option value at this point. @@ -1959,7 +2094,7 @@ and p_tcaug p st = (p_space 1) (p.tcaug_compare, p.tcaug_compare_withc, - p.tcaug_hash_and_equals_withc, + p.tcaug_hash_and_equals_withc |> Option.map (fun (v1, v2, v3, _) -> (v1, v2, v3)), p.tcaug_equals, (p.tcaug_adhoc_list |> ResizeArray.toList @@ -2266,7 +2401,7 @@ and u_tcaug st = st {tcaug_compare=a1 tcaug_compare_withc=a2 - tcaug_hash_and_equals_withc=a3 + tcaug_hash_and_equals_withc=a3 |> Option.map (fun (v1, v2, v3) -> (v1, v2, v3, None)) tcaug_equals=b2 // only used for code generation and checking - hence don't care about the values when reading back in tcaug_hasObjectGetHashCode=false diff --git a/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fsi b/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fsi index 5e0fa9915c..3e3910bd4e 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fsi +++ b/src/fcs-fable/src/Compiler/TypedTree/TypedTreePickle.fsi @@ -85,7 +85,7 @@ val internal pickleCcuInfo: pickler /// Serialize an arbitrary object using the given pickler val pickleObjWithDanglingCcus: - inMem: bool -> file: string -> TcGlobals -> scope: CcuThunk -> pickler<'T> -> 'T -> ByteBuffer + inMem: bool -> file: string -> TcGlobals -> scope: CcuThunk -> pickler<'T> -> 'T -> ByteBuffer * ByteBuffer /// The type of state unpicklers read from type ReaderState @@ -151,5 +151,6 @@ val internal unpickleObjWithDanglingCcus: viewedScope: ILScopeRef -> ilModule: ILModuleDef option -> 'T unpickler -> + ReadOnlyByteMemory -> ReadOnlyByteMemory -> PickledDataWithReferences<'T> diff --git a/src/fcs-fable/src/Compiler/TypedTree/tainted.fs b/src/fcs-fable/src/Compiler/TypedTree/tainted.fs index f586f99a3c..d23b5183a5 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/tainted.fs +++ b/src/fcs-fable/src/Compiler/TypedTree/tainted.fs @@ -89,7 +89,7 @@ type internal Tainted<'T> (context: TaintedContext, value: 'T) = | _ -> () member _.TypeProviderDesignation = - context.TypeProvider.GetType().FullName + !! context.TypeProvider.GetType().FullName member _.TypeProviderAssemblyRef = context.TypeProviderAssemblyRef @@ -101,11 +101,12 @@ type internal Tainted<'T> (context: TaintedContext, value: 'T) = | :? TypeProviderError -> reraise() | :? AggregateException as ae -> let errNum,_ = FSComp.SR.etProviderError("", "") - let messages = [for e in ae.InnerExceptions -> e.Message] + let messages = [for e in ae.InnerExceptions -> if isNull e.InnerException then e.Message else (e.Message + ": " + e.GetBaseException().Message)] raise <| TypeProviderError(errNum, this.TypeProviderDesignation, range, messages) | e -> let errNum,_ = FSComp.SR.etProviderError("", "") - raise <| TypeProviderError((errNum, e.Message), this.TypeProviderDesignation, range) + let error = if isNull e.InnerException then e.Message else (e.Message + ": " + e.GetBaseException().Message) + raise <| TypeProviderError((errNum, error), this.TypeProviderDesignation, range) member _.TypeProvider = Tainted<_>(context, context.TypeProvider) @@ -131,8 +132,8 @@ type internal Tainted<'T> (context: TaintedContext, value: 'T) = let u = this.Protect (fun x -> f (x, context.TypeProvider)) range Tainted(context, u) - member this.PApplyArray(f, methodName, range: range) = - let a : 'U[] = this.Protect f range + member this.PApplyArray(f, methodName, range:range) = + let a : 'U[] MaybeNull = this.Protect f range match a with | Null -> raise <| TypeProviderError(FSComp.SR.etProviderReturnedNull(methodName), this.TypeProviderDesignation, range) | NonNull a -> a |> Array.map (fun u -> Tainted(context,u)) @@ -163,8 +164,14 @@ type internal Tainted<'T> (context: TaintedContext, value: 'T) = Tainted(context, this.Protect(fun value -> box value :?> 'U) range) module internal Tainted = - let (|Null|NonNull|) (p:Tainted<'T>) : Choice> when 'T : null and 'T : not struct = + +#if NO_CHECKNULLS + let (|Null|NonNull|) (p:Tainted<'T>) : Choice> when 'T : null and 'T : not struct = if p.PUntaintNoFailure isNull then Null else NonNull (p.PApplyNoFailure id) +#else + let (|Null|NonNull|) (p:Tainted<'T | null>) : Choice> when 'T : not null and 'T : not struct = + if p.PUntaintNoFailure isNull then Null else NonNull (p.PApplyNoFailure nonNull) +#endif let Eq (p:Tainted<'T>) (v:'T) = p.PUntaintNoFailure (fun pv -> pv = v) diff --git a/src/fcs-fable/src/Compiler/TypedTree/tainted.fsi b/src/fcs-fable/src/Compiler/TypedTree/tainted.fsi index ee1a6d9406..61392794b5 100644 --- a/src/fcs-fable/src/Compiler/TypedTree/tainted.fsi +++ b/src/fcs-fable/src/Compiler/TypedTree/tainted.fsi @@ -101,7 +101,11 @@ type internal Tainted<'T> = module internal Tainted = /// Test whether the tainted value is null - val (|Null|NonNull|): Tainted<'T MaybeNull> -> Choice> when 'T: null and 'T: not struct +#if NO_CHECKNULLS + val (|Null|NonNull|) : Tainted<'T MaybeNull> -> Choice> when 'T : null and 'T : not struct +#else + val (|Null|NonNull|) : Tainted<'T MaybeNull> -> Choice> when 'T : not null and 'T : not struct +#endif /// Test whether the tainted value equals given value. /// Failure in call to equality operation will be blamed on type provider of first operand diff --git a/src/fcs-fable/src/Compiler/Utilities/Activity.fs b/src/fcs-fable/src/Compiler/Utilities/Activity.fs index f8f29acbd5..a7e2aa54d5 100644 --- a/src/fcs-fable/src/Compiler/Utilities/Activity.fs +++ b/src/fcs-fable/src/Compiler/Utilities/Activity.fs @@ -6,6 +6,8 @@ open System open System.Diagnostics open System.IO open System.Text +open Internal.Utilities.Library + module ActivityNames = [] @@ -33,6 +35,13 @@ module internal Activity = let gc2 = "gc2" let outputDllFile = "outputDllFile" let buildPhase = "buildPhase" + let version = "version" + let stackGuardName = "stackGuardName" + let stackGuardCurrentDepth = "stackGuardCurrentDepth" + let stackGuardMaxDepth = "stackGuardMaxDepth" + let callerMemberName = "callerMemberName" + let callerFilePath = "callerFilePath" + let callerLineNumber = "callerLineNumber" let AllKnownTags = [| @@ -49,12 +58,19 @@ module internal Activity = gc2 outputDllFile buildPhase + stackGuardName + stackGuardCurrentDepth + stackGuardMaxDepth + callerMemberName + callerFilePath + callerLineNumber |] module Events = let cacheHit = "cacheHit" #if FABLE_COMPILER + let start (name: string) (tags: (string * string) seq) : IDisposable = ignore name ignore tags @@ -70,20 +86,21 @@ module internal Activity = #else //!FABLE_COMPILER - type System.Diagnostics.Activity with + type Diagnostics.Activity with member this.RootId = let rec rootID (act: Activity) = - if isNull act.ParentId then act.Id else rootID act.Parent + match act.Parent with + | null -> act.Id + | parent -> rootID parent rootID this member this.Depth = let rec depth (act: Activity) acc = - if isNull act.ParentId then - acc - else - depth act.Parent (acc + 1) + match act.Parent with + | null -> acc + | parent -> depth parent (acc + 1) depth this 0 @@ -103,8 +120,10 @@ module internal Activity = let startNoTags (name: string) : IDisposable = activitySource.StartActivity name let addEvent name = - if (not (isNull Activity.Current)) && Activity.Current.Source = activitySource then - Activity.Current.AddEvent(ActivityEvent name) |> ignore + match Activity.Current with + | null -> () + | activity when activity.Source = activitySource -> activity.AddEvent(ActivityEvent name) |> ignore + | _ -> () module Profiling = @@ -137,16 +156,17 @@ module internal Activity = ActivityStarted = (fun a -> a.AddTag(gcStatsInnerTag, collectGCStats ()) |> ignore), ActivityStopped = (fun a -> - let statsBefore = a.GetTagItem(gcStatsInnerTag) :?> GCStats let statsAfter = collectGCStats () let p = Process.GetCurrentProcess() a.AddTag(Tags.workingSetMB, p.WorkingSet64 / 1_000_000L) |> ignore a.AddTag(Tags.handles, p.HandleCount) |> ignore a.AddTag(Tags.threads, p.Threads.Count) |> ignore - for i = 0 to statsAfter.Length - 1 do - a.AddTag($"gc{i}", statsAfter[i] - statsBefore[i]) |> ignore) - + match a.GetTagItem(gcStatsInnerTag) with + | :? GCStats as statsBefore -> + for i = 0 to statsAfter.Length - 1 do + a.AddTag($"gc{i}", statsAfter[i] - statsBefore[i]) |> ignore + | _ -> ()) ) ActivitySource.AddActivityListener(l) @@ -197,11 +217,11 @@ module internal Activity = module CsvExport = - let private escapeStringForCsv (o: obj) = - if isNull o then - "" - else - let mutable txtVal = o.ToString() + let private escapeStringForCsv (o: obj MaybeNull) = + match o with + | null -> "" + | o -> + let mutable txtVal = match o.ToString() with | null -> "" | s -> s let hasComma = txtVal.IndexOf(',') > -1 let hasQuote = txtVal.IndexOf('"') > -1 @@ -216,7 +236,7 @@ module internal Activity = let private createCsvRow (a: Activity) = let sb = new StringBuilder(128) - let appendWithLeadingComma (s: string) = + let appendWithLeadingComma (s: string MaybeNull) = sb.Append(',') |> ignore sb.Append(s) |> ignore @@ -234,7 +254,7 @@ module internal Activity = sb.ToString() - let addCsvFileListener pathToFile = + let addCsvFileListener (pathToFile:string) = if pathToFile |> File.Exists |> not then File.WriteAllLines( pathToFile, @@ -256,7 +276,7 @@ module internal Activity = let l = new ActivityListener( - ShouldListenTo = (fun a -> ActivityNames.AllRelevantNames |> Array.contains a.Name), + ShouldListenTo = (fun a ->ActivityNames.AllRelevantNames |> Array.contains a.Name), Sample = (fun _ -> ActivitySamplingResult.AllData), ActivityStopped = (fun a -> msgQueue.Post(createCsvRow a)) ) diff --git a/src/fcs-fable/src/Compiler/Utilities/Activity.fsi b/src/fcs-fable/src/Compiler/Utilities/Activity.fsi index 3ccef5979e..c1f896a75f 100644 --- a/src/fcs-fable/src/Compiler/Utilities/Activity.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/Activity.fsi @@ -1,5 +1,4 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - namespace FSharp.Compiler.Diagnostics open System @@ -29,6 +28,13 @@ module internal Activity = val length: string val cache: string val buildPhase: string + val version: string + val stackGuardName: string + val stackGuardCurrentDepth: string + val stackGuardMaxDepth: string + val callerMemberName: string + val callerFilePath: string + val callerLineNumber: string module Events = val cacheHit: string diff --git a/src/fcs-fable/src/Compiler/Utilities/Cancellable.fs b/src/fcs-fable/src/Compiler/Utilities/Cancellable.fs index ec5036027b..d6ead500ff 100644 --- a/src/fcs-fable/src/Compiler/Utilities/Cancellable.fs +++ b/src/fcs-fable/src/Compiler/Utilities/Cancellable.fs @@ -2,32 +2,30 @@ namespace FSharp.Compiler open System open System.Threading +open Internal.Utilities.Library [] type Cancellable = - [] - static val mutable private token: CancellationToken + static let token = AsyncLocal() - static member UsingToken(ct) = - let oldCt = Cancellable.token + static member Token = token.Value - Cancellable.token <- ct + static member UsingToken(ct) = + let oldCt = token.Value + token.Value <- ct { new IDisposable with - member this.Dispose() = Cancellable.token <- oldCt + member this.Dispose() = token.Value <- oldCt } - static member Token - with get () = Cancellable.token - and internal set v = Cancellable.token <- v - static member CheckAndThrow() = - Cancellable.token.ThrowIfCancellationRequested() + token.Value.ThrowIfCancellationRequested() namespace Internal.Utilities.Library open System open System.Threading +open FSharp.Compiler #if !FSHARPCORE_USE_PACKAGE open FSharp.Core.CompilerServices.StateMachineHelpers @@ -51,6 +49,7 @@ module Cancellable = oper ct #else try + use _ = Cancellable.UsingToken(ct) oper ct with :? OperationCanceledException as e -> ValueOrCancelled.Cancelled(OperationCanceledException e.CancellationToken) diff --git a/src/fcs-fable/src/Compiler/Utilities/Cancellable.fsi b/src/fcs-fable/src/Compiler/Utilities/Cancellable.fsi index 6e36d7ecb6..23515432bd 100644 --- a/src/fcs-fable/src/Compiler/Utilities/Cancellable.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/Cancellable.fsi @@ -7,7 +7,6 @@ open System.Threading type Cancellable = static member internal UsingToken: CancellationToken -> IDisposable static member Token: CancellationToken - static member internal Token: CancellationToken with set static member CheckAndThrow: unit -> unit namespace Internal.Utilities.Library diff --git a/src/fcs-fable/src/Compiler/Utilities/EditDistance.fs b/src/fcs-fable/src/Compiler/Utilities/EditDistance.fs index 10595b0b99..c1f4cadf3b 100644 --- a/src/fcs-fable/src/Compiler/Utilities/EditDistance.fs +++ b/src/fcs-fable/src/Compiler/Utilities/EditDistance.fs @@ -100,7 +100,7 @@ let JaroWinklerDistance s1 s2 = let p = 0.1 jaroScore + (l * p * (1.0 - jaroScore)) -/// Computes the restricted Damerau-Levenstein edit distance, +/// Computes the restricted Damerau-Levenshtein edit distance, /// also known as the "optimal string alignment" distance. /// - read more at https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance /// - Implementation taken from http://www.navision-blog.de/2008/11/01/damerau-levenshtein-distance-in-fsharp-part-ii/ diff --git a/src/fcs-fable/src/Compiler/Utilities/FileSystem.fs b/src/fcs-fable/src/Compiler/Utilities/FileSystem.fs index 8ee2930149..f931c5a842 100644 --- a/src/fcs-fable/src/Compiler/Utilities/FileSystem.fs +++ b/src/fcs-fable/src/Compiler/Utilities/FileSystem.fs @@ -167,7 +167,7 @@ type ByteArrayMemory(bytes: byte[], offset, length) = type SafeUnmanagedMemoryStream = inherit UnmanagedMemoryStream - val mutable private holder: obj + val mutable private holder: objnull val mutable private isDisposed: bool new(addr, length, holder) = @@ -447,7 +447,7 @@ module internal FileSystemUtils = if not (hasExtensionWithValidate false path) then raise (ArgumentException("chopExtension")) // message has to be precisely this, for OCaml compatibility, and no argument name can be set - Path.Combine(Path.GetDirectoryName path, Path.GetFileNameWithoutExtension(path)) + Path.Combine(!! Path.GetDirectoryName(path), !! Path.GetFileNameWithoutExtension(path)) let fileNameOfPath path = checkPathForIllegalChars path @@ -592,7 +592,7 @@ type DefaultFileSystem() as this = let fileStream = new FileStream(filePath, fileMode, fileAccess, fileShare) let length = fileStream.Length - // We want to use mmaped files only when: + // We want to use mmapped files only when: // - Opening large binary files (no need to use for source or resource files really) if not useMemoryMappedFile then @@ -680,16 +680,16 @@ type DefaultFileSystem() as this = default _.IsInvalidPathShim(path: string) = let isInvalidPath (p: string MaybeNull) = - match p with - | Null - | "" -> true - | NonNull p -> p.IndexOfAny(Path.GetInvalidPathChars()) <> -1 + if String.IsNullOrEmpty(p) then + true + else + p.IndexOfAny(Path.GetInvalidPathChars()) <> -1 let isInvalidFilename (p: string MaybeNull) = - match p with - | Null - | "" -> true - | NonNull p -> p.IndexOfAny(Path.GetInvalidFileNameChars()) <> -1 + if String.IsNullOrEmpty(p) then + true + else + p.IndexOfAny(Path.GetInvalidFileNameChars()) <> -1 let isInvalidDirectory (d: string MaybeNull) = match d with @@ -709,7 +709,7 @@ type DefaultFileSystem() as this = default _.GetDirectoryNameShim(path: string) = FileSystemUtils.checkPathForIllegalChars path - if path = "" then + if String.IsNullOrEmpty(path) then "." else match Path.GetDirectoryName(path) with @@ -718,7 +718,7 @@ type DefaultFileSystem() as this = path else "." - | res -> if res = "" then "." else res + | res -> if String.IsNullOrEmpty(res) then "." else res abstract GetLastWriteTimeShim: fileName: string -> DateTime default _.GetLastWriteTimeShim(fileName: string) = File.GetLastWriteTimeUtc fileName @@ -758,15 +758,19 @@ type DefaultFileSystem() as this = default _.IsStableFileHeuristic(fileName: string) = let directory = Path.GetDirectoryName fileName - directory.Contains("Reference Assemblies/") - || directory.Contains("Reference Assemblies\\") - || directory.Contains("packages/") - || directory.Contains("packages\\") - || directory.Contains("lib/mono/") + match directory with + | Null -> false + | NonNull directory -> + directory.Contains("Reference Assemblies/") + || directory.Contains("Reference Assemblies\\") + || directory.Contains("packages/") + || directory.Contains("packages\\") + || directory.Contains("lib/mono/") abstract ChangeExtensionShim: path: string * extension: string -> string - default _.ChangeExtensionShim(path: string, extension: string) : string = Path.ChangeExtension(path, extension) + default _.ChangeExtensionShim(path: string, extension: string) : string = + !! Path.ChangeExtension(path, extension) interface IFileSystem with member _.AssemblyLoader = this.AssemblyLoader @@ -884,7 +888,7 @@ module public StreamExtensions = use sr = new StreamReader(s, encoding, true) while not <| sr.EndOfStream do - yield sr.ReadLine() + yield !! sr.ReadLine() } member s.ReadAllLines(?encoding: Encoding) : string array = @@ -988,16 +992,6 @@ type internal ByteStream = res member b.Position = b.pos -#if LAZY_UNPICKLE - member b.CloneAndSeek = - { - bytes = b.bytes - pos = pos - max = b.max - } - - member b.Skip = b.pos <- b.pos + n -#endif type internal ByteBuffer = { diff --git a/src/fcs-fable/src/Compiler/Utilities/FileSystem.fsi b/src/fcs-fable/src/Compiler/Utilities/FileSystem.fsi index 568eb5c627..cb746208dc 100644 --- a/src/fcs-fable/src/Compiler/Utilities/FileSystem.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/FileSystem.fsi @@ -400,12 +400,6 @@ type internal ByteStream = static member FromBytes: ReadOnlyByteMemory * start: int * length: int -> ByteStream -#if LAZY_UNPICKLE - member CloneAndSeek: int -> ByteStream - - member Skip: int -> unit -#endif - #if FABLE_COMPILER /// Imperative buffers and streams of byte[] diff --git a/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fs b/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fs index 92eaa750cd..f0eea8fa89 100644 --- a/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fs +++ b/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fs @@ -3,50 +3,60 @@ namespace Internal.Utilities.Collections open System.Collections.Generic +open System.Collections.Concurrent // Each entry in the HashMultiMap dictionary has at least one entry. Under normal usage each entry has _only_ // one entry. So use two hash tables: one for the main entries and one for the overflow. [] -type internal HashMultiMap<'Key, 'Value>(size: int, comparer: IEqualityComparer<'Key>) = +type internal HashMultiMap<'Key, 'Value +#if !NO_CHECKNULLS + when 'Key:not null +#endif + >(size: int, comparer: IEqualityComparer<'Key>, ?useConcurrentDictionary: bool) = - let firstEntries = Dictionary<_, _>(size, comparer) + let comparer = comparer - let rest = Dictionary<_, _>(3, comparer) + let firstEntries: IDictionary<_, _> = + if defaultArg useConcurrentDictionary false then + ConcurrentDictionary<_, _>(comparer) + else + Dictionary<_, _>(size, comparer) -#if !FABLE_COMPILER - new(comparer: IEqualityComparer<'Key>) = HashMultiMap<'Key, 'Value>(11, comparer) + let rest: IDictionary<_, _> = + if defaultArg useConcurrentDictionary false then + ConcurrentDictionary<_, _>(comparer) + else + Dictionary<_, _>(3, comparer) - new(entries: seq<'Key * 'Value>, comparer: IEqualityComparer<'Key>) as x = - new HashMultiMap<'Key, 'Value>(11, comparer) - then entries |> Seq.iter (fun (k, v) -> x.Add(k, v)) -#endif + new(comparer: IEqualityComparer<'Key>, ?useConcurrentDictionary: bool) = + HashMultiMap<'Key, 'Value>(11, comparer, defaultArg useConcurrentDictionary false) + + new(entries: seq<'Key * 'Value>, comparer: IEqualityComparer<'Key>, ?useConcurrentDictionary: bool) as this = + HashMultiMap<'Key, 'Value>(11, comparer, defaultArg useConcurrentDictionary false) + then entries |> Seq.iter (fun (k, v) -> this.Add(k, v)) - member x.GetRest(k) = + member _.GetRest(k) = match rest.TryGetValue k with | true, res -> res | _ -> [] - member x.Add(y, z) = + member this.Add(y, z) = match firstEntries.TryGetValue y with - | true, res -> rest[y] <- res :: x.GetRest(y) + | true, res -> rest[y] <- res :: this.GetRest(y) | _ -> () firstEntries[y] <- z - member x.Clear() = + member _.Clear() = firstEntries.Clear() rest.Clear() - member x.FirstEntries = firstEntries + member _.FirstEntries = firstEntries - member x.Rest = rest + member _.Rest = rest - member x.Copy() = -#if FABLE_COMPILER - let res = HashMultiMap<'Key,'Value>(firstEntries.Count, comparer) -#else - let res = HashMultiMap<'Key, 'Value>(firstEntries.Count, firstEntries.Comparer) -#endif + member _.Copy() = + let res = HashMultiMap<'Key, 'Value>(firstEntries.Count, comparer) for kvp in firstEntries do res.FirstEntries.Add(kvp.Key, kvp.Value) @@ -92,11 +102,11 @@ type internal HashMultiMap<'Key, 'Value>(size: int, comparer: IEqualityComparer< for z in rest do f kvp.Key z - member x.Contains(y) = firstEntries.ContainsKey(y) + member _.Contains(y) = firstEntries.ContainsKey(y) - member x.ContainsKey(y) = firstEntries.ContainsKey(y) + member _.ContainsKey(y) = firstEntries.ContainsKey(y) - member x.Remove(y) = + member _.Remove(y) = match firstEntries.TryGetValue y with // NOTE: If not ok then nothing to remove - nop | true, _res -> @@ -114,14 +124,14 @@ type internal HashMultiMap<'Key, 'Value>(size: int, comparer: IEqualityComparer< | _ -> firstEntries.Remove(y) |> ignore | _ -> () - member x.Replace(y, z) = firstEntries[y] <- z + member _.Replace(y, z) = firstEntries[y] <- z - member x.TryFind(y) = + member _.TryFind(y) = match firstEntries.TryGetValue y with | true, res -> Some res | _ -> None - member x.Count = firstEntries.Count + member _.Count = firstEntries.Count #if FABLE_COMPILER interface System.Collections.IEnumerable with @@ -208,6 +218,6 @@ type internal HashMultiMap<'Key, 'Value>(size: int, comparer: IEqualityComparer< member s.CopyTo(arr, arrIndex) = s |> Seq.iteri (fun j x -> arr[arrIndex + j] <- x) - member s.IsReadOnly = false + member _.IsReadOnly = false member s.Count = s.Count diff --git a/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fsi b/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fsi index 7565b102e6..8a10b9d7b6 100644 --- a/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/HashMultiMap.fsi @@ -7,20 +7,20 @@ open System.Collections.Generic /// Hash tables, by default based on F# structural "hash" and (=) functions. /// The table may map a single key to multiple bindings. [] -type internal HashMultiMap<'Key, 'Value> = -#if !FABLE_COMPILER - /// Create a new empty mutable HashMultiMap with the given key hash/equality functions. - new: comparer: IEqualityComparer<'Key> -> HashMultiMap<'Key, 'Value> +type internal HashMultiMap<'Key, 'Value +#if !NO_CHECKNULLS + when 'Key:not null #endif + > = + /// Create a new empty mutable HashMultiMap with the given key hash/equality functions. + new: comparer: IEqualityComparer<'Key> * ?useConcurrentDictionary: bool -> HashMultiMap<'Key, 'Value> /// Create a new empty mutable HashMultiMap with an internal bucket array of the given approximate size /// and with the given key hash/equality functions. - new: size: int * comparer: IEqualityComparer<'Key> -> HashMultiMap<'Key, 'Value> + new: size: int * comparer: IEqualityComparer<'Key> * ?useConcurrentDictionary: bool -> HashMultiMap<'Key, 'Value> -#if !FABLE_COMPILER /// Build a map that contains the bindings of the given IEnumerable. - new: entries: seq<'Key * 'Value> * comparer: IEqualityComparer<'Key> -> HashMultiMap<'Key, 'Value> -#endif + new: entries: seq<'Key * 'Value> * comparer: IEqualityComparer<'Key> * ?useConcurrentDictionary: bool -> HashMultiMap<'Key, 'Value> /// Make a shallow copy of the collection. member Copy: unit -> HashMultiMap<'Key, 'Value> diff --git a/src/fcs-fable/src/Compiler/Utilities/InternalCollections.fs b/src/fcs-fable/src/Compiler/Utilities/InternalCollections.fs index 7d35083037..07bbcf3d3d 100755 --- a/src/fcs-fable/src/Compiler/Utilities/InternalCollections.fs +++ b/src/fcs-fable/src/Compiler/Utilities/InternalCollections.fs @@ -7,11 +7,7 @@ open System [] type internal ValueStrength<'T when 'T: not struct> = | Strong of 'T -#if FX_NO_GENERIC_WEAKREFERENCE - | Weak of WeakReference -#else | Weak of WeakReference<'T> -#endif type internal AgedLookup<'Token, 'Key, 'Value when 'Value: not struct>(keepStrongly: int, areSimilar, ?requiredToKeep, ?keepMax: int) = /// The list of items stored. Youngest is at the end of the list. @@ -28,7 +24,7 @@ type internal AgedLookup<'Token, 'Key, 'Value when 'Value: not struct>(keepStron let mutable keepMax = max keepStrongly keepMax let requiredToKeep = defaultArg requiredToKeep (fun _ -> false) - /// Look up a the given key, return None if not found. + /// Look up the given key, return None if not found. let TryPeekKeyValueImpl (data, key) = let rec Lookup key = function @@ -78,17 +74,10 @@ type internal AgedLookup<'Token, 'Key, 'Value when 'Value: not struct>(keepStron match value with | Strong(value) -> yield (key, value) | Weak(weakReference) -> -#if FX_NO_GENERIC_WEAKREFERENCE - match weakReference.Target with - | Null -> () - | NonNull value -> yield key, (value :?> 'Value) - ] -#else match weakReference.TryGetTarget() with | false, _ -> () | true, value -> yield key, value ] -#endif let AssignWithStrength (tok, newData) = let actualLength = List.length newData @@ -106,11 +95,7 @@ type internal AgedLookup<'Token, 'Key, 'Value when 'Value: not struct>(keepStron |> List.map (fun (n: int, (k, v)) -> let handle = if n < weakThreshold && not (requiredToKeep v) then -#if FX_NO_GENERIC_WEAKREFERENCE - Weak(WeakReference(v)) -#else Weak(WeakReference<_>(v)) -#endif else Strong(v) diff --git a/src/fcs-fable/src/Compiler/Utilities/LruCache.fs b/src/fcs-fable/src/Compiler/Utilities/LruCache.fs new file mode 100644 index 0000000000..92f73885eb --- /dev/null +++ b/src/fcs-fable/src/Compiler/Utilities/LruCache.fs @@ -0,0 +1,291 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Internal.Utilities.Collections + +open System +open System.Collections.Generic +open System.Diagnostics + +open Internal.Utilities.Library +open Internal.Utilities.Library.Extras + +[] +type internal CacheEvent = + | Evicted + | Collected + | Weakened + | Strengthened + | Cleared + +[] +type internal ValueLink<'T when 'T: not struct> = + | Strong of 'T + | Weak of WeakReference<'T> + +[] +type internal LruCache<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVersion: equality and 'TValue: not struct +#if !NO_CHECKNULLS + and 'TKey:not null + and 'TVersion:not null +#endif + > + (keepStrongly, ?keepWeakly, ?requiredToKeep, ?event) = + + let keepWeakly = defaultArg keepWeakly 100 + let requiredToKeep = defaultArg requiredToKeep (fun _ -> false) + let event = defaultArg event (fun _ _ -> ()) + + let dictionary = Dictionary<'TKey, Dictionary<'TVersion, _>>() + + // Lists to keep track of when items were last accessed. First item is most recently accessed. + let strongList = LinkedList<'TKey * 'TVersion * string * ValueLink<'TValue>>() + let weakList = LinkedList<'TKey * 'TVersion * string * ValueLink<'TValue>>() + + let rec removeCollected (possiblyNullNode: LinkedListNode<_> MaybeNull) = + match possiblyNullNode with + | null -> () + | node -> + let key, version, label, value = node.Value + + match value with + | Weak w -> + let next = node.Next + + match w.TryGetTarget() with + | false, _ -> + weakList.Remove node + dictionary[key].Remove version |> ignore + + if dictionary[key].Count = 0 then + dictionary.Remove key |> ignore + + event CacheEvent.Collected (label, key, version) + | _ -> () + + removeCollected next + | _ -> failwith "Illegal state, strong reference in weak list" + + let cutWeakListIfTooLong () = + if weakList.Count > keepWeakly then + removeCollected weakList.First + + let mutable node = weakList.Last + + while weakList.Count > keepWeakly && node <> null do + let notNullNode = !! node + let previous = notNullNode.Previous + let key, version, label, _ = notNullNode.Value + weakList.Remove notNullNode + dictionary[key].Remove version |> ignore + + if dictionary[key].Count = 0 then + dictionary.Remove key |> ignore + + event CacheEvent.Evicted (label, key, version) + node <- previous + + let cutStrongListIfTooLong () = + let mutable node = strongList.Last + + let mutable anythingWeakened = false + + while strongList.Count > keepStrongly && node <> null do + let notNullNode = !! node + let previous = notNullNode.Previous + + match notNullNode.Value with + | _, _, _, Strong v when requiredToKeep v -> () + | key, version, label, Strong v -> + strongList.Remove notNullNode + notNullNode.Value <- key, version, label, Weak(WeakReference<_> v) + weakList.AddFirst notNullNode + event CacheEvent.Weakened (label, key, version) + anythingWeakened <- true + | _key, _version, _label, _ -> failwith "Invalid state, weak reference in strong list" + + node <- previous + + if anythingWeakened then + cutWeakListIfTooLong () + + let pushNodeToTop (node: LinkedListNode<_>) = + match node.Value with + | _, _, _, Strong _ -> + strongList.AddFirst node + cutStrongListIfTooLong () + | _, _, _, Weak _ -> failwith "Invalid operation, pushing weak reference to strong list" + + let pushValueToTop key version label value = + strongList.AddFirst(value = (key, version, label, Strong value)) + + member _.DebuggerDisplay = $"Cache(S:{strongList.Count} W:{weakList.Count})" + + member _.Set(key, version, label, value) = + match dictionary.TryGetValue key with + | true, versionDict -> + + if versionDict.ContainsKey version then + // TODO this is normal for unversioned cache; + // failwith "Suspicious - overwriting existing version" + + let node: LinkedListNode<_> = versionDict[version] + + match node.Value with + | _, _, _, Strong _ -> strongList.Remove node + | _, _, _, Weak _ -> + weakList.Remove node + event CacheEvent.Strengthened (label, key, version) + + node.Value <- key, version, label, Strong value + pushNodeToTop node + + else + let node = pushValueToTop key version label value + versionDict[version] <- node + // weaken all other versions (unless they're required to be kept) + let versionsToWeaken = versionDict.Keys |> Seq.filter ((<>) version) |> Seq.toList + + let mutable anythingWeakened = false + + for otherVersion in versionsToWeaken do + let node = versionDict[otherVersion] + + match node.Value with + | _, _, _, Strong value when not (requiredToKeep value) -> + strongList.Remove node + node.Value <- key, otherVersion, label, Weak(WeakReference<_> value) + weakList.AddFirst node + event CacheEvent.Weakened (label, key, otherVersion) + anythingWeakened <- true + | _ -> () + + if anythingWeakened then + cutWeakListIfTooLong () + else + cutStrongListIfTooLong () + + | false, _ -> + let node = pushValueToTop key version label value + cutStrongListIfTooLong () + dictionary[key] <- Dictionary() + dictionary[key][version] <- node + + member this.Set(key, version, value) = + this.Set(key, version, "[no label]", value) + + member _.TryGet(key, version) = + + match dictionary.TryGetValue key with + | false, _ -> None + | true, versionDict -> + match versionDict.TryGetValue version with + | false, _ -> None + | true, node -> + match node.Value with + | _, _, _, Strong v -> + strongList.Remove node + pushNodeToTop node + Some v + + | _, _, label, Weak w -> + match w.TryGetTarget() with + | true, value -> + weakList.Remove node + let node = pushValueToTop key version label value + event CacheEvent.Strengthened (label, key, version) + cutStrongListIfTooLong () + versionDict[version] <- node + Some value + | _ -> + weakList.Remove node + versionDict.Remove version |> ignore + + if versionDict.Count = 0 then + dictionary.Remove key |> ignore + + event CacheEvent.Collected (label, key, version) + None + + /// Returns an option of a value for given key and version, and also a list of all other versions for given key + member this.GetAll(key, version) = + let others = + this.GetAll(key) |> Seq.filter (fun (ver, _val) -> ver <> version) |> Seq.toList + + this.TryGet(key, version), others + + /// Returns a list of version * value pairs for a given key. The strongly held value is first in the list. + member _.GetAll(key: 'TKey) : ('TVersion * 'TValue) seq = + match dictionary.TryGetValue key with + | false, _ -> [] + | true, versionDict -> + versionDict.Values + |> Seq.map (_.Value) + |> Seq.sortBy (function + | _, _, _, Strong _ -> 0 + | _ -> 1) + |> Seq.choose (function + | _, ver, _, Strong v -> Some(ver, v) + | _, ver, _, Weak r -> + match r.TryGetTarget() with + | true, x -> Some(ver, x) + | _ -> None) + + member _.Remove(key, version) = + match dictionary.TryGetValue key with + | false, _ -> () + | true, versionDict -> + match versionDict.TryGetValue version with + | true, node -> + versionDict.Remove version |> ignore + + if versionDict.Count = 0 then + dictionary.Remove key |> ignore + + match node.Value with + | _, _, _, Strong _ -> strongList.Remove node + | _, _, _, Weak _ -> weakList.Remove node + | _ -> () + + member this.Set(key, value) = + this.Set(key, Unchecked.defaultof<_>, value) + + member this.TryGet(key) = + this.TryGet(key, Unchecked.defaultof<_>) + + member this.Remove(key) = + this.Remove(key, Unchecked.defaultof<_>) + + member _.Clear() = + dictionary.Clear() + strongList.Clear() + weakList.Clear() + + member _.Clear(predicate) = + let keysToRemove = dictionary.Keys |> Seq.filter predicate |> Seq.toList + + for key in keysToRemove do + match dictionary.TryGetValue key with + | true, versionDict -> + versionDict.Values + |> Seq.iter (fun node -> + match node.Value with + | _, _, _, Strong _ -> strongList.Remove node + | _, _, _, Weak _ -> weakList.Remove node + + match node.Value with + | key, version, label, _ -> event CacheEvent.Cleared (label, key, version)) + + dictionary.Remove key |> ignore + | _ -> () + + member _.GetValues() = + strongList + |> Seq.append weakList + |> Seq.choose (function + | _k, version, label, Strong value -> Some(label, version, value) + | _k, version, label, Weak w -> + match w.TryGetTarget() with + | true, value -> Some(label, version, value) + | _ -> None) + + member this.Count = Seq.length (this.GetValues()) diff --git a/src/fcs-fable/src/Compiler/Utilities/LruCache.fsi b/src/fcs-fable/src/Compiler/Utilities/LruCache.fsi new file mode 100644 index 0000000000..5979304f16 --- /dev/null +++ b/src/fcs-fable/src/Compiler/Utilities/LruCache.fsi @@ -0,0 +1,63 @@ +namespace Internal.Utilities.Collections + +[] +type internal CacheEvent = + | Evicted + | Collected + | Weakened + | Strengthened + | Cleared + +/// A cache where least recently used items are removed when the cache is full. +/// +/// It's also versioned, meaning each key can have multiple versions and only the latest one is kept strongly. +/// Older versions are kept weakly and can be collected by GC. +type internal LruCache<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVersion: equality and 'TValue: not struct +#if !NO_CHECKNULLS + and 'TKey:not null + and 'TVersion:not null +#endif + > = + + /// Maximum number of strongly held results to keep in the cache + /// Maximum number of weakly held results to keep in the cache + /// A predicate that determines if a value should be kept strongly (no matter what) + /// An event that is called when an item is evicted, collected, weakened or strengthened + new: + keepStrongly: int * + ?keepWeakly: int * + ?requiredToKeep: ('TValue -> bool) * + ?event: (CacheEvent -> string * 'TKey * 'TVersion -> unit) -> + LruCache<'TKey, 'TVersion, 'TValue> + + member Clear: unit -> unit + + /// Clear any keys that match the given predicate + member Clear: predicate: ('TKey -> bool) -> unit + + /// Returns an option of a value for given key and version, and also a list of all other versions for given key + member GetAll: key: 'TKey * version: 'TVersion -> 'TValue option * ('TVersion * 'TValue) list + + /// Returns a list of version * value pairs for a given key. The strongly held value is first in the list. + member GetAll: key: 'TKey -> ('TVersion * 'TValue) seq + + member GetValues: unit -> (string * 'TVersion * 'TValue) seq + + /// Gets the number of items in the cache + member Count: int + + member Remove: key: 'TKey -> unit + + member Remove: key: 'TKey * version: 'TVersion -> unit + + member Set: key: 'TKey * value: 'TValue -> unit + + member Set: key: 'TKey * version: 'TVersion * value: 'TValue -> unit + + member Set: key: 'TKey * version: 'TVersion * label: string * value: 'TValue -> unit + + member TryGet: key: 'TKey -> 'TValue option + + member TryGet: key: 'TKey * version: 'TVersion -> 'TValue option + + member DebuggerDisplay: string diff --git a/src/fcs-fable/src/Compiler/Utilities/NullnessShims.fs b/src/fcs-fable/src/Compiler/Utilities/NullnessShims.fs new file mode 100644 index 0000000000..785a6c6a3b --- /dev/null +++ b/src/fcs-fable/src/Compiler/Utilities/NullnessShims.fs @@ -0,0 +1,72 @@ +namespace Internal.Utilities.Library + +open System + +[] +module internal NullnessShims = + + let inline isNotNull (x: 'T) = not (isNull x) + +#if NO_CHECKNULLS || BUILDING_WITH_LKG + type 'T MaybeNull when 'T: not struct = 'T + type objnull = obj + + let inline (^) (a: 'a) ([] b: 'a -> 'b) : 'b = + match a with + | null -> Unchecked.defaultof<'b> + | _ -> b a + + let inline (|NonNullQuick|) (x: 'T MaybeNull) = + match x with + | null -> raise (NullReferenceException()) + | v -> v + + let inline nonNull<'T when 'T:not struct and 'T:null> (x: 'T MaybeNull ) = + match x with + | null -> raise (NullReferenceException()) + | v -> v + + let inline (|Null|NonNull|) (x: 'T MaybeNull) : Choice = + match x with + | null -> Null + | v -> NonNull v + + let inline nullArgCheck paramName (x: 'T MaybeNull) = + if isNull (box x) then raise (ArgumentNullException(paramName)) + else x + + let inline (!!) x = x + + let inline defaultIfNull defaultValue arg = match arg with | null -> defaultValue | _ -> arg + + let inline nullSafeEquality (x: MaybeNull<'T>) (y: MaybeNull<'T>) ([]nonNullEqualityFunc:'T->'T->bool) = + match box x, box y with + | null, null -> true + | null,_ | _, null -> false + | _,_ -> nonNullEqualityFunc x y +#else + type 'T MaybeNull when 'T: not null and 'T: not struct = 'T | null + + let inline (^) (a: 'a | null) ([] b: 'a -> 'b) : ('b | null) = + match a with + | Null -> null + | NonNull v -> b v + + let inline (!!) (x:'T | null) = Unchecked.nonNull x + + let inline nullSafeEquality (x: MaybeNull<'T>) (y: MaybeNull<'T>) ([]nonNullEqualityFunc:'T->'T->bool) = + match x, y with + | null, null -> true + | null,_ | _, null -> false + | x, y -> nonNullEqualityFunc !!x !!y + +#endif + + + + [] + let inline (|NonEmptyString|_|) (x: string MaybeNull) = + match x with + | null -> ValueNone + | "" -> ValueNone + | v -> ValueSome v \ No newline at end of file diff --git a/src/fcs-fable/src/Compiler/Utilities/PathMap.fs b/src/fcs-fable/src/Compiler/Utilities/PathMap.fs index 8d2a9a87b1..af2525953e 100644 --- a/src/fcs-fable/src/Compiler/Utilities/PathMap.fs +++ b/src/fcs-fable/src/Compiler/Utilities/PathMap.fs @@ -6,6 +6,7 @@ namespace Internal.Utilities open System open System.IO +open Internal.Utilities.Library open FSharp.Compiler.IO type PathMap = PathMap of Map @@ -26,7 +27,7 @@ module internal PathMap = #endif let oldPrefix = - if normalSrc.EndsWith dirSepStr then + if normalSrc.EndsWithOrdinal dirSepStr then normalSrc else normalSrc + dirSepStr @@ -45,7 +46,7 @@ module internal PathMap = // oldPrefix always ends with a path separator, so there's no need // to check if it was a partial match // e.g. for the map /goo=/bar and file name /goooo - if filePath.StartsWith(oldPrefix, StringComparison.Ordinal) then + if filePath.StartsWithOrdinal oldPrefix then let replacement = replacementPrefix + filePath.Substring(oldPrefix.Length - 1) // Normalize the path separators if used uniformly in the replacement @@ -64,7 +65,7 @@ module internal PathMap = |> Option.defaultValue filePath let applyDir pathMap (dirName: string) : string = - if dirName.EndsWith dirSepStr then + if dirName.EndsWithOrdinal dirSepStr then apply pathMap dirName else let mapped = apply pathMap (dirName + dirSepStr) diff --git a/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fs b/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fs index ec673f18fd..a01439bee6 100644 --- a/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fs +++ b/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fs @@ -34,6 +34,18 @@ type ReadOnlySpanExtensions = if found then i else -1 + [] + static member IndexOfAnyExcept(span: ReadOnlySpan, value: char) = + let mutable i = 0 + let mutable found = false + + while not found && i < span.Length do + let c = span[i] + + if c <> value then found <- true else i <- i + 1 + + if found then i else -1 + [] static member LastIndexOfAnyInRange(span: ReadOnlySpan, lowInclusive: char, highInclusive: char) = let mutable i = span.Length - 1 @@ -47,4 +59,16 @@ type ReadOnlySpanExtensions = i <- i - 1 if found then i else -1 + + [] + static member LastIndexOfAnyExcept(span: ReadOnlySpan, value: char) = + let mutable i = span.Length - 1 + let mutable found = false + + while not found && i >= 0 do + let c = span[i] + + if c <> value then found <- true else i <- i - 1 + + if found then i else -1 #endif diff --git a/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fsi b/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fsi index 875ffba28a..b772ab5864 100644 --- a/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/ReadOnlySpan.fsi @@ -12,6 +12,12 @@ type internal ReadOnlySpanExtensions = [] static member IndexOfAnyExcept: span: ReadOnlySpan * values: ReadOnlySpan -> int + [] + static member IndexOfAnyExcept: span: ReadOnlySpan * value: char -> int + [] static member LastIndexOfAnyInRange: span: ReadOnlySpan * lowInclusive: char * highInclusive: char -> int + + [] + static member LastIndexOfAnyExcept: span: ReadOnlySpan * value: char -> int #endif diff --git a/src/fcs-fable/src/Compiler/Utilities/TaggedCollections.fs b/src/fcs-fable/src/Compiler/Utilities/TaggedCollections.fs index 438a17cd02..295e4be425 100644 --- a/src/fcs-fable/src/Compiler/Utilities/TaggedCollections.fs +++ b/src/fcs-fable/src/Compiler/Utilities/TaggedCollections.fs @@ -9,6 +9,7 @@ namespace Internal.Utilities.Collections.Tagged open Microsoft.FSharp.Core open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators open System.Collections.Generic +open Internal.Utilities.Library [] [] @@ -141,7 +142,7 @@ module SetTree = | _ -> add comparer k (add comparer t2.Key t1) | _ -> add comparer k (add comparer t1.Key t2) - let rec split (comparer: IComparer<'T>) pivot (t: SetTree<'T>) = + let rec split (comparer: IComparer<'T>) (pivot: 'T) (t: SetTree<'T>) = // Given a pivot and a set t // Return { x in t s.t. x < pivot }, pivot in t?, { x in t s.t. x > pivot } if isEmpty t then @@ -178,7 +179,7 @@ module SetTree = let k3, l' = spliceOutSuccessor tn.Left in k3, mk l' tn.Key tn.Right | _ -> t.Key, empty - let rec remove (comparer: IComparer<'T>) k (t: SetTree<'T>) = + let rec remove (comparer: IComparer<'T>) (k: 'T) (t: SetTree<'T>) = if isEmpty t then t else @@ -200,7 +201,7 @@ module SetTree = rebalance tn.Left tn.Key (remove comparer k tn.Right) | _ -> if c = 0 then empty else t - let rec contains (comparer: IComparer<'T>) k (t: SetTree<'T>) = + let rec contains (comparer: IComparer<'T>) (k: 'T) (t: SetTree<'T>) = if isEmpty t then false else @@ -670,8 +671,8 @@ type internal Set<'T, 'ComparerTag> when 'ComparerTag :> IComparer<'T>(comparer: interface System.IComparable with // Cast s2 to the exact same type as s1, see 4884. // It is not OK to cast s2 to seq<'T>, since different compares could permute the elements. - member s1.CompareTo(s2: obj) = - SetTree.compare s1.Comparer s1.Tree (s2 :?> Set<'T, 'ComparerTag>).Tree + member s1.CompareTo(s2: objnull) = + SetTree.compare s1.Comparer s1.Tree (!!s2 :?> Set<'T, 'ComparerTag>).Tree member this.ComputeHashCode() = let combineHash x y = (x <<< 1) + y + 631 @@ -813,7 +814,7 @@ module MapTree = let indexNotFound () = raise (KeyNotFoundException("An index satisfying the predicate was not found in the collection")) - let rec tryGetValue (comparer: IComparer<'Key>) k (v: byref<'Value>) (m: MapTree<'Key, 'Value>) = + let rec tryGetValue (comparer: IComparer<'Key>) (k: 'Key) (v: byref<'Value>) (m: MapTree<'Key, 'Value>) = if isEmpty m then false else @@ -836,7 +837,7 @@ module MapTree = #endif | _ -> false - let find (comparer: IComparer<'Key>) k (m: MapTree<'Key, 'Value>) = + let find (comparer: IComparer<'Key>) (k: 'Key) (m: MapTree<'Key, 'Value>) = let mutable v = Unchecked.defaultof<'Value> if tryGetValue comparer k &v m then v else indexNotFound () @@ -1255,7 +1256,7 @@ type internal Map<'Key, 'T, 'ComparerTag> when 'ComparerTag :> IComparer<'Key>(c #endif interface System.IComparable with - member m1.CompareTo(m2: obj) = + member m1.CompareTo(m2: objnull) = Seq.compareWith (fun (kvp1: KeyValuePair<_, _>) (kvp2: KeyValuePair<_, _>) -> let c = m1.Comparer.Compare(kvp1.Key, kvp2.Key) in @@ -1267,7 +1268,7 @@ type internal Map<'Key, 'T, 'ComparerTag> when 'ComparerTag :> IComparer<'Key>(c // Cast m2 to the exact same type as m1, see 4884. // It is not OK to cast m2 to seq>, since different compares could permute the KVPs. m1 - (m2 :?> Map<'Key, 'T, 'ComparerTag>) + (!!m2 :?> Map<'Key, 'T, 'ComparerTag>) member this.ComputeHashCode() = let combineHash x y = (x <<< 1) + y + 631 diff --git a/src/fcs-fable/src/Compiler/Utilities/TypeHashing.fs b/src/fcs-fable/src/Compiler/Utilities/TypeHashing.fs new file mode 100644 index 0000000000..bcdface38b --- /dev/null +++ b/src/fcs-fable/src/Compiler/Utilities/TypeHashing.fs @@ -0,0 +1,346 @@ +module internal Internal.Utilities.TypeHashing + +open Internal.Utilities.Rational +open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler.Syntax +open FSharp.Compiler.TcGlobals +open FSharp.Compiler.Text +open FSharp.Compiler.TypedTree +open FSharp.Compiler.TypedTreeBasics +open FSharp.Compiler.TypedTreeOps + +type ObserverVisibility = + | PublicOnly + | PublicAndInternal + +[] +module internal HashingPrimitives = + + type Hash = int + + let inline hashText (s: string) : Hash = hash s + let inline combineHash acc y : Hash = (acc <<< 1) + y + 631 + let inline pipeToHash (value: Hash) (acc: Hash) = combineHash acc value + let inline addFullStructuralHash (value) (acc: Hash) = combineHash (acc) (hash value) + + let inline hashListOrderMatters ([] func) (items: #seq<'T>) : Hash = + let mutable acc = 0 + + for i in items do + let valHash = func i + // We are calling hashListOrderMatters for things like list of types, list of properties, list of fields etc. The ones which are visibility-hidden will return 0, and are omitted. + if valHash <> 0 then + acc <- combineHash acc valHash + + acc + + let inline hashListOrderIndependent ([] func) (items: #seq<'T>) : Hash = + let mutable acc = 0 + + for i in items do + let valHash = func i + acc <- acc ^^^ valHash + + acc + + let (@@) (h1: Hash) (h2: Hash) = combineHash h1 h2 + +[] +module internal HashUtilities = + + let private hashEntityRefName (xref: EntityRef) name = + let tag = + if xref.IsNamespace then + TextTag.Namespace + elif xref.IsModule then + TextTag.Module + elif xref.IsTypeAbbrev then + TextTag.Alias + elif xref.IsFSharpDelegateTycon then + TextTag.Delegate + elif xref.IsILEnumTycon || xref.IsFSharpEnumTycon then + TextTag.Enum + elif xref.IsStructOrEnumTycon then + TextTag.Struct + elif isInterfaceTyconRef xref then + TextTag.Interface + elif xref.IsUnionTycon then + TextTag.Union + elif xref.IsRecordTycon then + TextTag.Record + else + TextTag.Class + + (hash tag) @@ (hashText name) + + let hashTyconRefImpl (tcref: TyconRef) = + let demangled = tcref.DisplayNameWithStaticParameters + let tyconHash = hashEntityRefName tcref demangled + + tcref.CompilationPath.AccessPath + |> hashListOrderMatters (fst >> hashText) + |> pipeToHash tyconHash + +module HashIL = + + let hashILTypeRef (tref: ILTypeRef) = + tref.Enclosing + |> hashListOrderMatters hashText + |> addFullStructuralHash tref.Name + + let private hashILArrayShape (sh: ILArrayShape) = sh.Rank + + let rec hashILType (ty: ILType) : Hash = + match ty with + | ILType.Void -> hash ILType.Void + | ILType.Array(sh, t) -> hashILType t @@ hashILArrayShape sh + | ILType.Value t + | ILType.Boxed t -> hashILTypeRef t.TypeRef @@ (t.GenericArgs |> hashListOrderMatters (hashILType)) + | ILType.Ptr t + | ILType.Byref t -> hashILType t + | ILType.FunctionPointer t -> hashILCallingSignature t + | ILType.TypeVar n -> hash n + | ILType.Modified(_, _, t) -> hashILType t + + and hashILCallingSignature (signature: ILCallingSignature) = + let res = signature.ReturnType |> hashILType + signature.ArgTypes |> hashListOrderMatters (hashILType) |> pipeToHash res + +module HashAccessibility = + + let isHiddenToObserver (TAccess access) (observer: ObserverVisibility) = + let isInternalCompPath x = + match x with + | CompPath(ILScopeRef.Local, _, []) -> true + | _ -> false + + match access with + | [] -> false + | _ when List.forall isInternalCompPath access -> + match observer with + // The 'access' means internal, but our observer can see it (e.g. because of IVT attribute) + | PublicAndInternal -> false + | PublicOnly -> true + | _ -> true + +module rec HashTypes = + open Microsoft.FSharp.Core.LanguagePrimitives + + let stampEquals g ty1 ty2 = + match (stripTyEqns g ty1), (stripTyEqns g ty2) with + | TType_app(tcref1, _, _), TType_app(tcref2, _, _) -> tcref1.Stamp.Equals(tcref2.Stamp) + | TType_var(r1, _), TType_var(r2, _) -> r1.Stamp.Equals(r2.Stamp) + | _ -> false + + /// Get has for Stamp for TType_app tyconref and TType_var typar + let hashStamp g ty = + let v: Stamp = + match (stripTyEqns g ty) with + | TType_app(tcref, _, _) -> tcref.Stamp + | TType_var(r, _) -> r.Stamp + | _ -> GenericZero + + hash v + + /// Hash a reference to a type + let hashTyconRef tcref = hashTyconRefImpl tcref + + /// Hash the flags of a member + let hashMemberFlags (memFlags: SynMemberFlags) = hash memFlags + + /// Hash an attribute 'Type(arg1, ..., argN)' + let private hashAttrib (Attrib(tyconRef = tcref)) = hashTyconRefImpl tcref + + let hashAttributeList attrs = + attrs |> hashListOrderIndependent hashAttrib + + let private hashTyparRef (typar: Typar) = + hashText typar.DisplayName + |> addFullStructuralHash (typar.Rigidity) + |> addFullStructuralHash (typar.StaticReq) + + let private hashTyparRefWithInfo (typar: Typar) = + hashTyparRef typar @@ hashAttributeList typar.Attribs + + let private hashConstraint (g: TcGlobals) struct (tp, tpc) = + let tpHash = hashTyparRefWithInfo tp + + match tpc with + | TyparConstraint.CoercesTo(tgtTy, _) -> tpHash @@ 1 @@ hashTType g tgtTy + | TyparConstraint.MayResolveMember(traitInfo, _) -> tpHash @@ 2 @@ hashTraitWithInfo (* denv *) g traitInfo + | TyparConstraint.DefaultsTo(_, ty, _) -> tpHash @@ 3 @@ hashTType g ty + | TyparConstraint.IsEnum(ty, _) -> tpHash @@ 4 @@ hashTType g ty + | TyparConstraint.SupportsComparison _ -> tpHash @@ 5 + | TyparConstraint.SupportsEquality _ -> tpHash @@ 6 + | TyparConstraint.IsDelegate(aty, bty, _) -> tpHash @@ 7 @@ hashTType g aty @@ hashTType g bty + | TyparConstraint.SupportsNull _ -> tpHash @@ 8 + | TyparConstraint.IsNonNullableStruct _ -> tpHash @@ 9 + | TyparConstraint.IsUnmanaged _ -> tpHash @@ 10 + | TyparConstraint.IsReferenceType _ -> tpHash @@ 11 + | TyparConstraint.SimpleChoice(tys, _) -> tpHash @@ 12 @@ (tys |> hashListOrderIndependent (hashTType g)) + | TyparConstraint.RequiresDefaultConstructor _ -> tpHash @@ 13 + | TyparConstraint.NotSupportsNull(_) -> tpHash @@ 14 + | TyparConstraint.AllowsRefStruct _ -> tpHash @@ 15 + + /// Hash type parameter constraints + let private hashConstraints (g: TcGlobals) cxs = + cxs |> hashListOrderIndependent (hashConstraint g) + + let private hashTraitWithInfo (g: TcGlobals) traitInfo = + let nameHash = hashText traitInfo.MemberLogicalName + let memberHash = hashMemberFlags traitInfo.MemberFlags + + let returnTypeHash = + match traitInfo.CompiledReturnType with + | Some t -> hashTType g t + | _ -> -1 + + traitInfo.CompiledObjectAndArgumentTypes + |> hashListOrderIndependent (hashTType g) + |> pipeToHash (nameHash) + |> pipeToHash (returnTypeHash) + |> pipeToHash memberHash + + /// Hash a unit of measure expression + let private hashMeasure unt = + let measuresWithExponents = + ListMeasureVarOccsWithNonZeroExponents unt + |> List.sortBy (fun (tp: Typar, _) -> tp.DisplayName) + + measuresWithExponents + |> hashListOrderIndependent (fun (typar, exp: Rational) -> hashTyparRef typar @@ hash exp) + + /// Hash a type, taking precedence into account to insert brackets where needed + let hashTType (g: TcGlobals) ty = + + match stripTyparEqns ty |> (stripTyEqns g) with + | TType_ucase(UnionCaseRef(tc, _), args) + | TType_app(tc, args, _) -> args |> hashListOrderMatters (hashTType g) |> pipeToHash (hashTyconRef tc) + | TType_anon(anonInfo, tys) -> + tys + |> hashListOrderMatters (hashTType g) + |> pipeToHash (anonInfo.SortedNames |> hashListOrderMatters hashText) + |> addFullStructuralHash (evalAnonInfoIsStruct anonInfo) + | TType_tuple(tupInfo, t) -> + t + |> hashListOrderMatters (hashTType g) + |> addFullStructuralHash (evalTupInfoIsStruct tupInfo) + // Hash a first-class generic type. + | TType_forall(tps, tau) -> tps |> hashListOrderMatters (hashTyparRef) |> pipeToHash (hashTType g tau) + | TType_fun _ -> + let argTys, retTy = stripFunTy g ty + argTys |> hashListOrderMatters (hashTType g) |> pipeToHash (hashTType g retTy) + | TType_var(r, _) -> hashTyparRefWithInfo r + | TType_measure unt -> hashMeasure unt + + // Hash a single argument, including its name and type + let private hashArgInfo (g: TcGlobals) (ty, argInfo: ArgReprInfo) = + + let attributesHash = hashAttributeList argInfo.Attribs + + let nameHash = + match argInfo.Name with + | Some i -> hashText i.idText + | _ -> -1 + + let typeHash = hashTType g ty + + typeHash @@ nameHash @@ attributesHash + + let private hashCurriedArgInfos (g: TcGlobals) argInfos = + argInfos + |> hashListOrderMatters (fun l -> l |> hashListOrderMatters (hashArgInfo g)) + + /// Hash a single type used as the type of a member or value + let hashTopType (g: TcGlobals) argInfos retTy cxs = + let retTypeHash = hashTType g retTy + let cxsHash = hashConstraints g cxs + let argHash = hashCurriedArgInfos g argInfos + + retTypeHash @@ cxsHash @@ argHash + + let private hashTyparInclConstraints (g: TcGlobals) (typar: Typar) = + typar.Constraints + |> hashListOrderIndependent (fun tpc -> hashConstraint g (typar, tpc)) + |> pipeToHash (hashTyparRef typar) + + /// Hash type parameters + let hashTyparDecls (g: TcGlobals) (typars: Typars) = + typars |> hashListOrderMatters (hashTyparInclConstraints g) + + let private hashUncurriedSig (g: TcGlobals) typarInst argInfos retTy = + typarInst + |> hashListOrderMatters (fun (typar, ttype) -> hashTyparInclConstraints g typar @@ hashTType g ttype) + |> pipeToHash (hashTopType g argInfos retTy []) + + let private hashMemberSigCore (g: TcGlobals) memberToParentInst (typarInst, methTypars: Typars, argInfos, retTy) = + typarInst + |> hashListOrderMatters (fun (typar, ttype) -> hashTyparInclConstraints g typar @@ hashTType g ttype) + |> pipeToHash (hashTopType g argInfos retTy []) + |> pipeToHash ( + memberToParentInst + |> hashListOrderMatters (fun (typar, ty) -> hashTyparRef typar @@ hashTType g ty) + ) + |> pipeToHash (hashTyparDecls g methTypars) + + let hashMemberType (g: TcGlobals) vref typarInst argInfos retTy = + match PartitionValRefTypars g vref with + | Some(_, _, memberMethodTypars, memberToParentInst, _) -> + hashMemberSigCore g memberToParentInst (typarInst, memberMethodTypars, argInfos, retTy) + | None -> hashUncurriedSig g typarInst argInfos retTy + +module HashTastMemberOrVals = + open HashTypes + + let private hashMember (g: TcGlobals, observer) typarInst (v: Val) = + let vref = mkLocalValRef v + + if HashAccessibility.isHiddenToObserver vref.Accessibility observer then + 0 + else + let membInfo = Option.get vref.MemberInfo + let _tps, argInfos, retTy, _ = GetTypeOfMemberInFSharpForm g vref + + let memberFlagsHash = hashMemberFlags membInfo.MemberFlags + let parentTypeHash = hashTyconRef membInfo.ApparentEnclosingEntity + let memberTypeHash = hashMemberType g vref typarInst argInfos retTy + let flagsHash = hash v.val_flags.PickledBits + let nameHash = hashText v.DisplayNameCoreMangled + let attribsHash = hashAttributeList v.Attribs + + let combinedHash = + memberFlagsHash + @@ parentTypeHash + @@ memberTypeHash + @@ flagsHash + @@ nameHash + @@ attribsHash + + combinedHash + + let private hashNonMemberVal (g: TcGlobals, observer) (tps, v: Val, tau, cxs) = + if HashAccessibility.isHiddenToObserver v.Accessibility observer then + 0 + else + let valReprInfo = arityOfValForDisplay v + let nameHash = hashText v.DisplayNameCoreMangled + let typarHash = hashTyparDecls g tps + let argInfos, retTy = GetTopTauTypeInFSharpForm g valReprInfo.ArgInfos tau v.Range + let typeHash = hashTopType g argInfos retTy cxs + let flagsHash = hash v.val_flags.PickledBits + let attribsHash = hashAttributeList v.Attribs + + let combinedHash = nameHash @@ typarHash @@ typeHash @@ flagsHash @@ attribsHash + combinedHash + + let hashValOrMemberNoInst (g, obs) (vref: ValRef) = + match vref.MemberInfo with + | None -> + let tps, tau = vref.GeneralizedType + + let cxs = + tps + |> Seq.collect (fun tp -> tp.Constraints |> Seq.map (fun cx -> struct (tp, cx))) + + hashNonMemberVal (g, obs) (tps, vref.Deref, tau, cxs) + | Some _ -> hashMember (g, obs) emptyTyparInst vref.Deref diff --git a/src/fcs-fable/src/Compiler/Utilities/illib.fs b/src/fcs-fable/src/Compiler/Utilities/illib.fs index c4367cd8b8..8a297239e6 100644 --- a/src/fcs-fable/src/Compiler/Utilities/illib.fs +++ b/src/fcs-fable/src/Compiler/Utilities/illib.fs @@ -14,29 +14,33 @@ open System.Runtime.CompilerServices [] type InterruptibleLazy<'T> private (value, valueFactory: unit -> 'T) = let syncObj = obj () - let mutable valueFactory = valueFactory + + [] + // TODO nullness - this is boxed to obj because of an attribute targets bug fixed in main, but not yet shipped (needs shipped 8.0.400) + let mutable valueFactory : objnull = valueFactory + + let mutable value = value new(valueFactory: unit -> 'T) = InterruptibleLazy(Unchecked.defaultof<_>, valueFactory) member this.IsValueCreated = - match box valueFactory with + match valueFactory with | null -> true | _ -> false member this.Value = - match box valueFactory with + match valueFactory with | null -> value | _ -> - Monitor.Enter(syncObj) try - match box valueFactory with + match valueFactory with | null -> () | _ -> - value <- valueFactory () + value <- (valueFactory |> unbox 'T>) () valueFactory <- Unchecked.defaultof<_> finally Monitor.Exit(syncObj) @@ -83,30 +87,6 @@ module internal PervasiveAutoOpens = | [ _ ] -> true | _ -> false - type 'T MaybeNull when 'T: null and 'T: not struct = 'T - - let inline isNotNull (x: 'T) = not (isNull x) - - let inline (|NonNullQuick|) (x: 'T MaybeNull) = - match x with - | null -> raise (NullReferenceException()) - | v -> v - - let inline nonNull (x: 'T MaybeNull) = - match x with - | null -> raise (NullReferenceException()) - | v -> v - - let inline (|Null|NonNull|) (x: 'T MaybeNull) : Choice = - match x with - | null -> Null - | v -> NonNull v - - let inline nullArgCheck paramName (x: 'T MaybeNull) = - match x with - | null -> raise (ArgumentNullException(paramName)) - | v -> v - let inline (===) x y = LanguagePrimitives.PhysicalEquality x y /// Per the docs the threshold for the Large Object Heap is 85000 bytes: https://learn.microsoft.com/dotnet/standard/garbage-collection/large-object-heap#how-an-object-ends-up-on-the-large-object-heap-and-how-gc-handles-them @@ -124,28 +104,35 @@ module internal PervasiveAutoOpens = member inline x.EndsWithOrdinalIgnoreCase value = x.EndsWith(value, StringComparison.OrdinalIgnoreCase) + member inline x.IndexOfOrdinal (value:string) = + x.IndexOf(value, StringComparison.Ordinal) + + member inline x.IndexOfOrdinal(value, startIndex) = + x.IndexOf(value, startIndex, StringComparison.Ordinal) + + member inline x.IndexOfOrdinal(value, startIndex, count) = + x.IndexOf(value, startIndex, count, StringComparison.Ordinal) + /// Get an initialization hole let getHole (r: _ ref) = match r.Value with | None -> failwith "getHole" | Some x -> x - let reportTime: (string -> unit) = - let mutable tPrev: IDisposable = null + let reportTime = + let mutable tPrev: IDisposable MaybeNull = null fun descr -> if isNotNull tPrev then tPrev.Dispose() + tPrev <- null - tPrev <- - if descr <> "Finish" then + if descr <> "Finish" then #if FABLE_COMPILER - null + tPrev <- null #else - FSharp.Compiler.Diagnostics.Activity.Profiling.startAndMeasureEnvironmentStats descr + tPrev <- FSharp.Compiler.Diagnostics.Activity.Profiling.startAndMeasureEnvironmentStats descr #endif - else - null let foldOn p f z x = f z (p x) @@ -156,20 +143,25 @@ module internal PervasiveAutoOpens = static member RunImmediate(computation: Async<'T>, ?cancellationToken) = let cancellationToken = defaultArg cancellationToken Async.DefaultCancellationToken + let ts = TaskCompletionSource<'T>() + let task = ts.Task Async.StartWithContinuations(computation, (ts.SetResult), (ts.SetException), (fun _ -> ts.SetCanceled()), cancellationToken) - task.Result + try + task.Result + with :? AggregateException as ex when ex.InnerExceptions.Count = 1 -> + raise (ex.InnerExceptions[0]) #endif //!FABLE_COMPILER [] type DelayInitArrayMap<'T, 'TDictKey, 'TDictValue>(f: unit -> 'T[]) = let syncObj = obj () - let mutable arrayStore = null - let mutable dictStore = null + let mutable arrayStore : _ array MaybeNull = null + let mutable dictStore : _ MaybeNull = null let mutable func = f @@ -183,11 +175,11 @@ type DelayInitArrayMap<'T, 'TDictKey, 'TDictValue>(f: unit -> 'T[]) = match arrayStore with | NonNull value -> value | _ -> - - arrayStore <- func () + let freshArray = func () + arrayStore <- freshArray func <- Unchecked.defaultof<_> - arrayStore + freshArray finally Monitor.Exit(syncObj) @@ -202,9 +194,9 @@ type DelayInitArrayMap<'T, 'TDictKey, 'TDictValue>(f: unit -> 'T[]) = match dictStore with | NonNull value -> value | _ -> - - dictStore <- this.CreateDictionary(array) - dictStore + let dict = this.CreateDictionary(array) + dictStore <- dict + dict finally Monitor.Exit(syncObj) @@ -217,7 +209,7 @@ type DelayInitArrayMap<'T, 'TDictKey, 'TDictValue>(f: unit -> 'T[]) = module Order = let orderBy (p: 'T -> 'U) = { new IComparer<'T> with - member _.Compare(x, xx) = compare (p x) (p xx) + member _.Compare(x, xx) = compare (p !!x) (p !!xx) } let orderOn p (pxOrder: IComparer<'U>) = @@ -256,6 +248,7 @@ module Array = let order (eltOrder: IComparer<'T>) = { new IComparer<'T array> with member _.Compare(xs, ys) = + let xs,ys = nullArgCheck "xs" xs, nullArgCheck "ys" ys let c = compare xs.Length ys.Length if c <> 0 then @@ -351,10 +344,7 @@ module Array = /// ~0.8x slower for ints let inline areEqual (xs: 'T[]) (ys: 'T[]) = match xs, ys with - | null, null -> true | [||], [||] -> true - | null, _ - | _, null -> false | _ when xs.Length <> ys.Length -> false | _ -> let mutable break' = false @@ -428,6 +418,9 @@ module Option = with _ -> None +module internal ValueTuple = + let inline map1Of2 ([]f) struct(a1, a2) = struct(f a1, a2) + module List = let sortWithOrder (c: IComparer<'T>) elements = @@ -554,6 +547,7 @@ module List = let order (eltOrder: IComparer<'T>) = { new IComparer<'T list> with member _.Compare(xs, ys) = + let xs,ys = nullArgCheck "xs" xs, nullArgCheck "ys" ys let rec loop xs ys = match xs, ys with | [], [] -> 0 @@ -656,6 +650,22 @@ module List = | Some x -> x :: l | _ -> l + + [] + let rec private vMapFoldWithAcc<'T, 'State, 'Result> (mapping: 'State -> 'T -> struct('Result * 'State)) state list acc : struct('Result list * 'State) = + match list with + | [] -> acc, state + | [h] -> + mapping state h + |> ValueTuple.map1Of2 (fun x -> x::acc) + | h :: t -> + let struct(mappedHead, stateHead) = mapping state h + vMapFoldWithAcc mapping stateHead t (mappedHead :: acc) + + let vMapFold<'T, 'State, 'Result> (mapping: 'State -> 'T -> struct('Result * 'State)) state list : struct('Result list * 'State) = + vMapFoldWithAcc mapping state list [] + |> ValueTuple.map1Of2 List.rev + module ResizeArray = /// Split a ResizeArray into an array of smaller chunks. @@ -747,7 +757,7 @@ module String = let uppercase (s: string) = s.ToUpperInvariant() // Scripts that distinguish between upper and lower case (bicameral) DU Discriminators and Active Pattern identifiers are required to start with an upper case character. - // For valid identifiers where the case of the identifier can not be determined because there is no upper and lower case we will allow DU Discriminators and upper case characters + // For valid identifiers where the case of the identifier cannot be determined because there is no upper and lower case we will allow DU Discriminators and upper case characters // to be used. This means that developers using unicameral scripts such as hindi, are not required to prefix these identifiers with an Upper case latin character. // let isLeadingIdentifierCharacterUpperCase (s: string) = @@ -801,7 +811,7 @@ module String = String digits |> function - | "" -> str, None + | x when String.IsNullOrEmpty(x) -> str, None | index -> str.Substring(0, str.Length - index.Length), Some(int index) /// Splits a string into substrings based on the strings in the array separators @@ -809,13 +819,16 @@ module String = let (|StartsWith|_|) pattern value = if String.IsNullOrWhiteSpace value then None - elif value.StartsWithOrdinal pattern then Some() + elif (!!value).StartsWithOrdinal pattern then Some() else None - let (|Contains|_|) (pattern: string) (value: string) = - if String.IsNullOrWhiteSpace value then None - elif value.Contains pattern then Some() - else None + let (|Contains|_|) (pattern:string) value = + match value with + | value when String.IsNullOrWhiteSpace value -> None + | null -> None + | value -> + if value.Contains pattern then Some() + else None let getLines (str: string) = #if FABLE_COMPILER @@ -960,7 +973,11 @@ module ResultOrException = | Exception _err -> f () /// Generates unique stamps -type UniqueStampGenerator<'T when 'T: equality>() = +type UniqueStampGenerator<'T when 'T: equality +#if !NO_CHECKNULLS + and 'T:not null +#endif + >() = let encodeTable = ConcurrentDictionary<'T, Lazy>(HashIdentity.Structural) let mutable nItems = -1 @@ -976,7 +993,11 @@ type UniqueStampGenerator<'T when 'T: equality>() = #endif /// memoize tables (all entries cached, never collected) -type MemoizationTable<'T, 'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer<'T>, ?canMemoize) = +type MemoizationTable<'T, 'U +#if !NO_CHECKNULLS + when 'T:not null +#endif + >(compute: 'T -> 'U, keyComparer: IEqualityComparer<'T>, ?canMemoize) = let table = new ConcurrentDictionary<'T, Lazy<'U>>(keyComparer) let computeFunc = Func<_, _>(fun key -> lazy (compute key)) @@ -992,7 +1013,11 @@ type MemoizationTable<'T, 'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer< compute x /// A thread-safe lookup table which is assigning an auto-increment stamp with each insert -type internal StampedDictionary<'T, 'U>(keyComparer: IEqualityComparer<'T>) = +type internal StampedDictionary<'T, 'U +#if !NO_CHECKNULLS + when 'T:not null +#endif + >(keyComparer: IEqualityComparer<'T>) = let table = new ConcurrentDictionary<'T, Lazy>(keyComparer) let mutable count = -1 @@ -1034,7 +1059,7 @@ type LazyWithContext<'T, 'Ctxt> = /// This field holds either the function to run or a LazyWithContextFailure object recording the exception raised /// from running the function. It is null if the thunk has been evaluated successfully. - mutable funcOrException: obj + mutable funcOrException: objnull /// A helper to ensure we rethrow the "original" exception findOriginalException: exn -> exn @@ -1125,7 +1150,7 @@ module IPartialEqualityComparer = let On f (c: IPartialEqualityComparer<_>) = { new IPartialEqualityComparer<_> with member _.InEqualityRelation x = c.InEqualityRelation(f x) - member _.Equals(x, y) = c.Equals(f x, f y) + member _.Equals(x, y) = c.Equals(f !!x, f !!y) member _.GetHashCode x = c.GetHashCode(f x) } @@ -1142,7 +1167,7 @@ module IPartialEqualityComparer = member _.GetHashCode(Wrap x) = per.GetHashCode x } // Wrap a Wrap _ around all keys in case the key type is itself a type using null as a representation - let dict = Dictionary, obj>(wper) + let dict = Dictionary, _>(wper) seq |> List.filter (fun v -> diff --git a/src/fcs-fable/src/Compiler/Utilities/illib.fsi b/src/fcs-fable/src/Compiler/Utilities/illib.fsi index 0b06de7787..abfa2b1334 100644 --- a/src/fcs-fable/src/Compiler/Utilities/illib.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/illib.fsi @@ -41,25 +41,6 @@ module internal PervasiveAutoOpens = /// Returns true if the list contains exactly 1 element. Otherwise false. val inline isSingleton: l: 'a list -> bool - /// Returns true if the argument is non-null. - val inline isNotNull: x: 'T -> bool when 'T: null - - /// Indicates that a type may be null. 'MaybeNull' is used internally in the F# compiler as - /// replacement for 'string?' to align with FS-1060. - type 'T MaybeNull when 'T: null and 'T: not struct = 'T - - /// Asserts the argument is non-null and raises an exception if it is - val inline (|NonNullQuick|): 'T MaybeNull -> 'T - - /// Match on the nullness of an argument. - val inline (|Null|NonNull|): 'T MaybeNull -> Choice - - /// Asserts the argument is non-null and raises an exception if it is - val inline nonNull: x: 'T MaybeNull -> 'T - - /// Checks the argument is non-null - val inline nullArgCheck: paramName: string -> x: 'T MaybeNull -> 'T - val inline (===): x: 'a -> y: 'a -> bool when 'a: not struct /// Per the docs the threshold for the Large Object Heap is 85000 bytes: https://learn.microsoft.com/dotnet/standard/garbage-collection/large-object-heap#how-an-object-ends-up-on-the-large-object-heap-and-how-gc-handles-them @@ -79,6 +60,12 @@ module internal PervasiveAutoOpens = member inline EndsWithOrdinalIgnoreCase: value: string -> bool + member inline IndexOfOrdinal: value: string -> int + + member inline IndexOfOrdinal: value: string * startIndex: int -> int + + member inline IndexOfOrdinal: value: string * startIndex: int * count: int -> int + #if !FABLE_COMPILER type Async with @@ -101,7 +88,12 @@ type DelayInitArrayMap<'T, 'TDictKey, 'TDictValue> = module internal Order = - val orderBy: p: ('T -> 'U) -> IComparer<'T> when 'U: comparison + val orderBy: p: ('T -> 'U) -> IComparer<'T> + when 'U: comparison +#if !NO_CHECKNULLS + and 'T:not null + and 'T:not struct +#endif val orderOn: p: ('T -> 'U) -> pxOrder: IComparer<'U> -> IComparer<'T> @@ -236,6 +228,8 @@ module internal List = val prependIfSome: x: 'a option -> l: 'a list -> 'a list + val vMapFold<'T,'State,'Result> : mapping:('State -> 'T -> struct('Result * 'State)) -> state:'State -> list:'T list -> struct('Result list * 'State) + module internal ResizeArray = /// Split a ResizeArray into an array of smaller chunks. @@ -395,7 +389,11 @@ module internal ResultOrException = val otherwise: f: (unit -> ResultOrException<'a>) -> x: ResultOrException<'a> -> ResultOrException<'a> /// Generates unique stamps -type internal UniqueStampGenerator<'T when 'T: equality> = +type internal UniqueStampGenerator<'T when 'T: equality +#if !NO_CHECKNULLS + and 'T:not null +#endif + > = new: unit -> UniqueStampGenerator<'T> @@ -404,7 +402,11 @@ type internal UniqueStampGenerator<'T when 'T: equality> = member Table: ICollection<'T> /// Memoize tables (all entries cached, never collected unless whole table is collected) -type internal MemoizationTable<'T, 'U> = +type internal MemoizationTable<'T, 'U +#if !NO_CHECKNULLS + when 'T:not null +#endif + > = new: compute: ('T -> 'U) * keyComparer: IEqualityComparer<'T> * ?canMemoize: ('T -> bool) -> MemoizationTable<'T, 'U> @@ -412,7 +414,11 @@ type internal MemoizationTable<'T, 'U> = member Apply: x: 'T -> 'U /// A thread-safe lookup table which is assigning an auto-increment stamp with each insert -type internal StampedDictionary<'T, 'U> = +type internal StampedDictionary<'T, 'U +#if !NO_CHECKNULLS + when 'T:not null +#endif + > = new: keyComparer: IEqualityComparer<'T> -> StampedDictionary<'T, 'U> @@ -445,7 +451,11 @@ type internal LazyWithContext<'T, 'ctxt> = /// Intern tables to save space. module internal Tables = - val memoize: f: ('a -> 'b) -> ('a -> 'b) when 'a: equality + val memoize: f: ('a -> 'b) -> ('a -> 'b) + when 'a: equality +#if !NO_CHECKNULLS && NET8_0_OR_GREATER + and 'a:not null +#endif /// Interface that defines methods for comparing objects using partial equality relation type internal IPartialEqualityComparer<'T> = @@ -455,6 +465,10 @@ type internal IPartialEqualityComparer<'T> = /// Interface that defines methods for comparing objects using partial equality relation module internal IPartialEqualityComparer = val On: f: ('a -> 'b) -> c: IPartialEqualityComparer<'b> -> IPartialEqualityComparer<'a> +#if !NO_CHECKNULLS + when 'a:not null + and 'a:not struct +#endif /// Like Seq.distinctBy but only filters out duplicates for some of the elements val partialDistinctBy: per: IPartialEqualityComparer<'T> -> seq: 'T list -> 'T list diff --git a/src/fcs-fable/src/Compiler/Utilities/lib.fs b/src/fcs-fable/src/Compiler/Utilities/lib.fs index 65456ef7ec..a4531be92d 100755 --- a/src/fcs-fable/src/Compiler/Utilities/lib.fs +++ b/src/fcs-fable/src/Compiler/Utilities/lib.fs @@ -337,15 +337,15 @@ type Graph<'Data, 'Id when 'Id : comparison and 'Id : equality> // with care. //---------------------------------------------------------------------------- -type NonNullSlot<'T> = 'T -let nullableSlotEmpty() = Unchecked.defaultof<'T> -let nullableSlotFull x = x +type NonNullSlot<'T when 'T : not struct> = 'T +let nullableSlotEmpty() : NonNullSlot<'T> = Unchecked.defaultof<_> +let nullableSlotFull (x: 'T) : NonNullSlot<'T> = x //--------------------------------------------------------------------------- // Caches, mainly for free variables //--------------------------------------------------------------------------- -type cache<'T> = { mutable cacheVal: 'T NonNullSlot } +type cache<'T when 'T : not struct> = { mutable cacheVal: NonNullSlot<'T> } let newCache() = { cacheVal = nullableSlotEmpty() } let inline cached cache ([] resF) = diff --git a/src/fcs-fable/src/Compiler/Utilities/lib.fsi b/src/fcs-fable/src/Compiler/Utilities/lib.fsi index 2db164157a..0421a919e5 100644 --- a/src/fcs-fable/src/Compiler/Utilities/lib.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/lib.fsi @@ -230,24 +230,24 @@ type Graph<'Data, 'Id when 'Id: comparison> = /// This is an unsafe trick, as it relies on the fact that the type of values /// being placed into the slot never utilizes "null" as a representation. To be used with /// with care. -type NonNullSlot<'T> = 'T +type NonNullSlot<'T when 'T: not struct> = 'T -val nullableSlotEmpty: unit -> 'T +val nullableSlotEmpty: unit -> NonNullSlot<'T> -val nullableSlotFull: x: 'a -> 'a +val nullableSlotFull: x: 'a -> NonNullSlot<'a> /// Caches, mainly for free variables -type cache<'T> = { mutable cacheVal: NonNullSlot<'T> } +type cache<'T when 'T: not struct> = { mutable cacheVal: NonNullSlot<'T> } -val newCache: unit -> cache<'a> +val newCache: unit -> cache<'a> when 'a: not struct -val inline cached: cache: cache<'a> -> resF: (unit -> 'a) -> 'a +val inline cached: cache: cache<'a> -> resF: (unit -> 'a) -> 'a when 'a: not struct val inline cacheOptByref: cache: byref<'T option> -> f: (unit -> 'T) -> 'T val inline cacheOptRef: cache: 'a option ref -> f: (unit -> 'a) -> 'a -val inline tryGetCacheValue: cache: cache<'a> -> NonNullSlot<'a> voption +val inline tryGetCacheValue: cache: cache<'a> -> NonNullSlot<'a> voption when 'a: not struct [] type MaybeLazy<'T> = diff --git a/src/fcs-fable/src/Compiler/Utilities/range.fs b/src/fcs-fable/src/Compiler/Utilities/range.fs index 0af81a95ca..a37146dc50 100755 --- a/src/fcs-fable/src/Compiler/Utilities/range.fs +++ b/src/fcs-fable/src/Compiler/Utilities/range.fs @@ -375,7 +375,7 @@ type Range(code1: int64, code2: int64) = if FileSystem.IsInvalidPathShim m.FileName then "path invalid: " + m.FileName elif not (FileSystem.FileExistsShim m.FileName) then - "non existing file: " + m.FileName + "nonexistent file: " + m.FileName else FileSystem.OpenFileForReadShim(m.FileName).ReadLines() |> Seq.skip (m.StartLine - 1) diff --git a/src/fcs-fable/src/Compiler/Utilities/range.fsi b/src/fcs-fable/src/Compiler/Utilities/range.fsi index 7b422fcd30..40a52efa87 100755 --- a/src/fcs-fable/src/Compiler/Utilities/range.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/range.fsi @@ -39,7 +39,7 @@ type internal NotedSourceConstruct = /// This does include "expr; cexpr" sequentials where the "expr" is interpreted as an implicit yield + Combine call | Combine - /// Notes that a range is related to an implied "Delay"m "Quote" or "Run" at the entry to a computation expression. THis doesn't + /// Notes that a range is related to an implied "Delay"m "Quote" or "Run" at the entry to a computation expression. This doesn't /// apply to the "Delay" calls added for try/with, try/finally, while or for constructs. | DelayOrQuoteOrRun @@ -56,7 +56,7 @@ type Position = /// The encoding of the position as a 64-bit integer member internal Encoding: int64 - /// Check if the position is adjacent to another postition + /// Check if the position is adjacent to another position member internal IsAdjacentTo: otherPos: Position -> bool /// Decode a position fro a 64-bit integer diff --git a/src/fcs-fable/src/Compiler/Utilities/sformat.fs b/src/fcs-fable/src/Compiler/Utilities/sformat.fs index a7c54db543..80ca1dbf5b 100644 --- a/src/fcs-fable/src/Compiler/Utilities/sformat.fs +++ b/src/fcs-fable/src/Compiler/Utilities/sformat.fs @@ -7,9 +7,6 @@ // The one implementation file is used because we keep the implementations of // structured formatting the same for fsi.exe and '%A' printing. However F# Interactive has // a richer feature set. - -#nowarn "52" // The value has been copied to ensure the original is not mutated by this operation - #if COMPILER namespace FSharp.Compiler.Text #else @@ -17,8 +14,14 @@ namespace FSharp.Compiler.Text namespace Microsoft.FSharp.Text.StructuredPrintfImpl #endif +#nowarn "52" // The value has been copied to ensure the original is not mutated by this operation +// 3261 and 3262 Nullness warnings - this waits for LKG update, since this file is included in fsharp.core and fsharp.compiler.service and goes via proto build. +// Supporting all possible combinations of available library+compiler versions would complicate code in this source files too much at the moment. +#nowarn "3261" +#nowarn "3262" + // Breakable block layout implementation. -// This is a fresh implementation of pre-existing ideas. +// This is a fresh implementation of preexisting ideas. open System open System.IO @@ -29,6 +32,9 @@ open Microsoft.FSharp.Core open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators open Microsoft.FSharp.Reflection open Microsoft.FSharp.Collections +#if COMPILER +open Internal.Utilities.Library +#endif [] type TextTag = @@ -116,6 +122,13 @@ type IEnvironment = abstract MaxColumns: int abstract MaxRows: int +#if NO_CHECKNULLS +[] +module NullShim = + // Shim to match nullness checking library support in preview + let inline (|Null|NonNull|) (x: 'T) : Choice = match x with null -> Null | v -> NonNull v +#endif + [] module TaggedText = let mkTag tag text = TaggedText(tag, text) @@ -255,6 +268,7 @@ module TaggedText = let keywordInline = tagKeyword "inline" let keywordModule = tagKeyword "module" let keywordNamespace = tagKeyword "namespace" + let keywordReturn = tagKeyword "return" let punctuationUnit = tagPunctuation "()" #endif @@ -279,13 +293,13 @@ module Layout = let isEmptyL layout = match layout with - | Leaf(true, s, true) -> s.Text = "" + | Leaf(true, s, true) -> String.IsNullOrEmpty(s.Text) | _ -> false #if COMPILER let rec endsWithL (text: string) layout = match layout with - | Leaf(_, s, _) -> s.Text.EndsWith(text) + | Leaf(_, s, _) -> s.Text.EndsWith(text, StringComparison.Ordinal) | Node(_, r, _) -> endsWithL text r | Attr(_, _, l) -> endsWithL text l | ObjLeaf _ -> false @@ -411,7 +425,7 @@ type FormatOptions = FloatingPointFormat: string AttributeProcessor: string -> (string * string) list -> bool -> unit #if COMPILER // This is the PrintIntercepts extensibility point currently revealed by fsi.exe's AddPrinter - PrintIntercepts: (IEnvironment -> obj -> Layout option) list + PrintIntercepts: (IEnvironment -> objnull -> Layout option) list StringLimit: int #endif FormatProvider: IFormatProvider @@ -498,7 +512,7 @@ module ReflectUtils = // of an F# value. let GetValueInfoOfObject (bindingFlags: BindingFlags) (obj: obj) = match obj with - | null -> NullValue + | Null -> NullValue | _ -> let reprty = obj.GetType() @@ -514,7 +528,7 @@ module ReflectUtils = FSharpValue.GetTupleFields obj |> Array.mapi (fun i v -> (v, tyArgs[i])) let tupleType = - if reprty.Name.StartsWith "ValueTuple" then + if reprty.Name.StartsWith("ValueTuple", StringComparison.Ordinal) then TupleType.Value else TupleType.Reference @@ -563,9 +577,8 @@ module ReflectUtils = let GetValueInfo bindingFlags (x: 'a, ty: Type) (* x could be null *) = let obj = (box x) - match obj with - | null -> + | Null -> let isNullaryUnion = match ty.GetCustomAttributes(typeof, false) with | [| :? CompilationRepresentationAttribute as attr |] -> @@ -583,7 +596,8 @@ module ReflectUtils = UnitValue else NullValue - | _ -> GetValueInfoOfObject bindingFlags obj + | NonNull obj -> + GetValueInfoOfObject bindingFlags obj module Display = open ReflectUtils @@ -843,8 +857,8 @@ module Display = let getListValueInfo bindingFlags (x: obj, ty: Type) = match x with - | null -> None - | _ -> + | Null -> None + | NonNull x -> match Value.GetValueInfo bindingFlags (x, ty) with | UnionCaseValue("Cons", recd) -> Some(unpackCons recd) | UnionCaseValue("Empty", [||]) -> None @@ -938,7 +952,7 @@ module Display = // // Note: The layout code forces breaks based on leaf size and possible break points. // It does not force leaf size based on width. - // So long leaf-string width can not depend on their printing context... + // So long leaf-string width cannot depend on their printing context... // // The suffix like "+[dd chars]" is 11 chars. // 12345678901 @@ -1000,16 +1014,15 @@ module Display = // Recursive descent let rec nestedObjL depthLim prec (x: obj, ty: Type) = objL ShowAll depthLim prec (x, ty) - and objL showMode depthLim prec (x: obj, ty: Type) = + and objL showMode depthLim prec (x: objnull, ty: Type) = let info = Value.GetValueInfo bindingFlags (x, ty) - try if depthLim <= 0 || exceededPrintSize () then wordL (tagPunctuation "...") else match x with - | null -> reprL showMode (depthLim - 1) prec info x - | _ -> + | Null -> reprL showMode (depthLim - 1) prec info x + | NonNull x -> if (path.ContainsKey(x)) then wordL (tagPunctuation "...") else @@ -1023,10 +1036,9 @@ module Display = Some(wordL (tagText (x.ToString()))) else // Try the StructuredFormatDisplayAttribute extensibility attribute - match ty.GetCustomAttributes(typeof, true) with - | null - | [||] -> None - | res -> structuredFormatObjectL showMode ty depthLim (res[0] :?> StructuredFormatDisplayAttribute) x + match ty.GetCustomAttributes (typeof, true) with + | Null | [| |] -> None + | NonNull res -> structuredFormatObjectL showMode ty depthLim (res[0] :?> StructuredFormatDisplayAttribute) x #if COMPILER // This is the PrintIntercepts extensibility point currently revealed by fsi.exe's AddPrinter @@ -1059,8 +1071,7 @@ module Display = // Format an object that has a layout specified by StructuredFormatAttribute and structuredFormatObjectL showMode ty depthLim (attr: StructuredFormatDisplayAttribute) (obj: obj) = let txt = attr.Value - - if isNull txt || txt.Length <= 1 then + if isNull (box txt) || txt.Length <= 1 then None else @@ -1127,7 +1138,7 @@ module Display = :: layouts match postText with - | "" -> + | _ when String.IsNullOrEmpty(postText) -> //We are done, build a space-delimited layout from the collection of layouts we've accumulated Some(spaceListL (List.rev newLayouts)) @@ -1144,9 +1155,9 @@ module Display = let openingBracketIndex = postTextMatch.Groups["prop"].Index - 1 buildObjMessageL remainingPropertyText[openingBracketIndex..] newLayouts - | remaingPropertyText -> + | remainingPropertyText -> // make sure we don't have any stray brackets - let strayClosingMatch = illFormedBracketPatternLookup.IsMatch remaingPropertyText + let strayClosingMatch = illFormedBracketPatternLookup.IsMatch remainingPropertyText if strayClosingMatch then None @@ -1158,7 +1169,7 @@ module Display = List.rev ( (sepL (tagText preText) ^^ alternativeObjL - ^^ sepL (tagText (replaceEscapedBrackets (remaingPropertyText)))) + ^^ sepL (tagText (replaceEscapedBrackets (remainingPropertyText)))) :: layouts ) ) @@ -1328,9 +1339,6 @@ module Display = if word = "map" - && (match v with - | null -> false - | _ -> true) && tyv.IsGenericType && tyv.GetGenericTypeDefinition() = typedefof> then @@ -1525,7 +1533,7 @@ module Display = let leafFormatter (opts: FormatOptions) (obj: obj) = match obj with - | null -> tagKeyword "null" + | Null -> tagKeyword "null" | :? double as d -> let s = d.ToString(opts.FloatingPointFormat, opts.FormatProvider) @@ -1589,7 +1597,7 @@ module Display = match text with | null -> "" - | _ -> text + | text -> text with e -> // If a .ToString() call throws an exception, catch it and use the message as the result. // This may be informative, e.g. division by zero etc... diff --git a/src/fcs-fable/src/Compiler/Utilities/sformat.fsi b/src/fcs-fable/src/Compiler/Utilities/sformat.fsi index 5b2467b9d7..d8146b46a0 100644 --- a/src/fcs-fable/src/Compiler/Utilities/sformat.fsi +++ b/src/fcs-fable/src/Compiler/Utilities/sformat.fsi @@ -22,8 +22,8 @@ open System open System.IO open Microsoft.FSharp.Core open Microsoft.FSharp.Collections - #if COMPILER +open Internal.Utilities.Library /// Data representing joints in structured layouts of terms. The representation /// of this data type is only for the consumption of formatting engines. @@ -213,6 +213,7 @@ module internal TaggedText = val internal keywordInline: TaggedText val internal keywordModule: TaggedText val internal keywordNamespace: TaggedText + val internal keywordReturn: TaggedText val internal punctuationUnit: TaggedText type internal IEnvironment = @@ -367,7 +368,7 @@ type internal FormatOptions = { FloatingPointFormat: string AttributeProcessor: string -> (string * string) list -> bool -> unit #if COMPILER // FSharp.Core.dll: PrintIntercepts aren't used there - PrintIntercepts: (IEnvironment -> obj -> Layout option) list + PrintIntercepts: (IEnvironment -> objnull -> Layout option) list StringLimit: int #endif FormatProvider: IFormatProvider @@ -396,7 +397,7 @@ module internal Display = val output_layout_tagged: options: FormatOptions -> writer: TaggedTextWriter -> layout: Layout -> unit #else - // Most functions aren't needed in FSharp.Core.dll, but we add one inernal entry for printf + // Most functions aren't needed in FSharp.Core.dll, but we add one internal entry for printf val anyToStringForPrintf: options: FormatOptions -> bindingFlags: System.Reflection.BindingFlags -> value: 'T * Type -> string #endif diff --git a/src/fcs-fable/src/Compiler/Utilities/sr.fs b/src/fcs-fable/src/Compiler/Utilities/sr.fs index b081dfb608..10a615846e 100644 --- a/src/fcs-fable/src/Compiler/Utilities/sr.fs +++ b/src/fcs-fable/src/Compiler/Utilities/sr.fs @@ -2,9 +2,11 @@ namespace FSharp.Compiler +open System open Microsoft.FSharp.Core open Microsoft.FSharp.Collections open Microsoft.FSharp.Reflection +open Internal.Utilities.Library module internal SR = let private resources = @@ -19,13 +21,13 @@ module internal SR = if isNull s then System.Diagnostics.Debug.Assert(false, sprintf "**RESOURCE ERROR**: Resource token %s does not exist!" name) #endif - s + !!s module internal DiagnosticMessage = open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators - let mkFunctionValue (tys: System.Type[]) (impl: obj -> obj) = + let mkFunctionValue (tys: System.Type[]) (impl: objnull -> objnull) = FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys[0], tys[1]), impl) let funTyC = typeof obj>.GetGenericTypeDefinition() @@ -52,7 +54,7 @@ module internal DiagnosticMessage = // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf "%x"') mkFunctionValue tys (fun inp -> impl rty inp) - let capture1 (fmt: string) i args ty (go: obj list -> System.Type -> int -> obj) : obj = + let capture1 (fmt: string) i args ty (go: objnull list -> System.Type -> int -> obj) : obj = match fmt[i] with | '%' -> go args ty (i + 1) | 'd' @@ -74,7 +76,7 @@ module internal DiagnosticMessage = if i >= len || (fmt[i] = '%' && i + 1 >= len) then let b = System.Text.StringBuilder() b.AppendFormat(messageString, (Array.ofList (List.rev args))) |> ignore - box (b.ToString()) + !!(box (b.ToString())) // REVIEW: For these purposes, this should be a nop, but I'm leaving it // in case we ever decide to support labels for the error format string // E.g., "%s%d" @@ -98,7 +100,7 @@ module internal DiagnosticMessage = // validate that the message string exists let fmtString = fmt.Value - if isNull messageString then + if isNull (box messageString) then System.Diagnostics.Debug.Assert(false, sprintf "**DECLARED MESSAGE ERROR** String resource %s does not exist" messageID) messageString <- "" @@ -132,7 +134,7 @@ module internal DiagnosticMessage = // strip any escaped % characters - yes, this will fail if given %%%... let s = s.Replace("%%", "") - if s = "" then + if String.IsNullOrEmpty(s) then 0 else let len = s.Length - 1 @@ -148,7 +150,7 @@ module internal DiagnosticMessage = nFmt - let nHoles, holes = countFormatHoles messageString + let nHoles, holes = countFormatHoles !!messageString let nPlaceholders = countFormatPlaceholders fmtString // first, verify that the number of holes in the message string does not exceed the @@ -171,5 +173,5 @@ module internal DiagnosticMessage = ) #endif - messageString <- postProcessString messageString - new ResourceString<'T>(messageString, fmt) + messageString <- postProcessString !!messageString + new ResourceString<'T>(!!messageString, fmt) diff --git a/src/fcs-fable/src/Compiler/lex.fsl b/src/fcs-fable/src/Compiler/lex.fsl index 3d8f761d1b..8e0504a56a 100644 --- a/src/fcs-fable/src/Compiler/lex.fsl +++ b/src/fcs-fable/src/Compiler/lex.fsl @@ -177,10 +177,14 @@ let startString args (lexbuf: UnicodeLexing.Lexbuf) = if kind.IsInterpolated then fail args lexbuf (FSComp.SR.lexByteStringMayNotBeInterpolated()) () BYTEARRAY (Lexhelp.stringBufferAsBytes buf, synByteStringKind, cont) - elif Lexhelp.stringBufferIsBytes buf then - BYTEARRAY (Lexhelp.stringBufferAsBytes buf, synByteStringKind, cont) else - fail args lexbuf (FSComp.SR.lexByteArrayCannotEncode()) () + match Lexhelp.errorsInByteStringBuffer buf with + | Some (largerThanOneByte, largerThan127) -> + if largerThanOneByte > 0 then + fail args lexbuf (FSComp.SR.lexByteArrayCannotEncode(largerThanOneByte)) () + if largerThan127 > 0 then + warning (Error(FSComp.SR.lexByteArrayOutisdeAscii(largerThan127), lexbuf.LexemeRange)) + | None -> () BYTEARRAY (Lexhelp.stringBufferAsBytes buf, synByteStringKind, cont) elif kind.IsInterpolated then let s = Lexhelp.stringBufferAsString buf @@ -225,7 +229,7 @@ let trySaveXmlDoc (lexbuf: LexBuffer) (buff: (range * StringBuilder) optio | None -> () | Some (start, sb) -> let xmlCommentLineRange = mkFileIndexRange start.FileIndex start.Start (posOfLexPosition lexbuf.StartPos) - LexbufLocalXmlDocStore.SaveXmlDocLine (lexbuf, sb.ToString(), xmlCommentLineRange) + XmlDocStore.SaveXmlDocLine (lexbuf, sb.ToString(), xmlCommentLineRange) let tryAppendXmlDoc (buff: (range * StringBuilder) option) (s:string) = match buff with @@ -234,9 +238,8 @@ let tryAppendXmlDoc (buff: (range * StringBuilder) option) (s:string) = // Utilities for parsing #if/#else/#endif -let shouldStartLine args lexbuf (m:range) err tok = - if (m.StartColumn <> 0) then fail args lexbuf err tok - else tok +let shouldStartLine args lexbuf (m:range) err = + if (m.StartColumn <> 0) then fail args lexbuf err () let shouldStartFile args lexbuf (m:range) err tok = if (m.StartColumn <> 0 || m.StartLine <> 1) then fail args lexbuf err tok @@ -378,6 +381,8 @@ let ident_char = let ident = ident_start_char ident_char* +// skip = true: skip whitespace (used by compiler, fsi etc) +// skip = false: send artificial tokens for whitespace (used by VS) rule token (args: LexArgs) (skip: bool) = parse | ident { Keywords.KeywordOrIdentifierToken args lexbuf (lexeme lexbuf) } @@ -536,7 +541,7 @@ rule token (args: LexArgs) (skip: bool) = parse let d = System.Decimal.Parse(s,System.Globalization.NumberStyles.AllowExponent ||| System.Globalization.NumberStyles.Number,System.Globalization.CultureInfo.InvariantCulture) DECIMAL d with - e -> fail args lexbuf (FSComp.SR.lexOusideDecimal()) (DECIMAL (decimal 0)) + e -> fail args lexbuf (FSComp.SR.lexOutsideDecimal()) (DECIMAL (decimal 0)) } | xieee32 { @@ -546,7 +551,7 @@ rule token (args: LexArgs) (skip: bool) = parse let s = removeUnderscores (lexemeTrimRight lexbuf 2) // Even though the intermediate step is an int64, display the "invalid float" message, since it will be less confusing to the user let n64 = (try (int64 s) with _ -> fail args lexbuf (FSComp.SR.lexInvalidFloat()) 0L) - if n64 > 0xFFFFFFFFL || n64 < 0L then fail args lexbuf (FSComp.SR.lexOusideThirtyTwoBitFloat()) (IEEE32 0.0f) else + if n64 > 0xFFFFFFFFL || n64 < 0L then fail args lexbuf (FSComp.SR.lexOutsideThirtyTwoBitFloat()) (IEEE32 0.0f) else IEEE32 (System.BitConverter.ToSingle(System.BitConverter.GetBytes(int32 (uint32 (uint64 n64))),0)) #endif } @@ -576,7 +581,7 @@ rule token (args: LexArgs) (skip: bool) = parse { let s = lexeme lexbuf let x = int32 (if s.[1] = '\\' then escape s.[2] else s.[1]) if x < 0 || x > 127 then - fail args lexbuf (FSComp.SR.lexInvalidByteLiteral()) (UINT8(byte 0)) + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) else UINT8 (byte(x)) } @@ -593,26 +598,50 @@ rule token (args: LexArgs) (skip: bool) = parse { let s = lexeme lexbuf let x = int32 (trigraph s.[2] s.[3] s.[4]) if x < 0 || x > 255 then - fail args lexbuf (FSComp.SR.lexInvalidByteLiteral()) (UINT8(byte 0)) + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) + elif x > 127 then + // TODO: Promote to Error: + // * Adjust range check in `if` above to `x > 127` + // * Remove this `elif` expression + // * Remove `lexInvalidTrigraphAsciiByteLiteral` from `FSComp.txt` + warning (Error(FSComp.SR.lexInvalidTrigraphAsciiByteLiteral(), lexbuf.LexemeRange)) + UINT8 (byte(x)) else UINT8 (byte(x)) } + | '\'' unicodeGraphShort '\'' { CHAR (char (int32 (unicodeGraphShort (lexemeTrimBoth lexbuf 3 1)))) } + | '\'' unicodeGraphShort '\'' 'B' { let x = int32 (unicodeGraphShort (lexemeTrimBoth lexbuf 3 2)) if x < 0 || x > 127 then - fail args lexbuf (FSComp.SR.lexInvalidByteLiteral()) (UINT8(byte 0)) + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) else UINT8 (byte(x)) } | '\'' hexGraphShort '\'' { CHAR (char (int32 (hexGraphShort (lexemeTrimBoth lexbuf 3 1)))) } - | '\'' unicodeGraphShort '\'' { CHAR (char (int32 (unicodeGraphShort (lexemeTrimBoth lexbuf 3 1)))) } + | '\'' hexGraphShort '\'' 'B' + { let x = int32 (hexGraphShort (lexemeTrimBoth lexbuf 3 2)) + if x < 0 || x > 127 then + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) + else + UINT8 (byte(x)) } | '\'' unicodeGraphLong '\'' { match unicodeGraphLong (lexemeTrimBoth lexbuf 3 1) with | SingleChar(c) -> CHAR (char c) | _ -> fail args lexbuf (FSComp.SR.lexThisUnicodeOnlyInStringLiterals()) (CHAR (char 0)) } + | '\'' unicodeGraphLong '\'' 'B' + { match unicodeGraphLong (lexemeTrimBoth lexbuf 3 2) with + | SingleChar(c) -> + let x = int32 c + if x < 0 || x > 127 then + fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) + else + UINT8 (byte(x)) + | _ -> fail args lexbuf (FSComp.SR.lexInvalidAsciiByteLiteral()) (UINT8(byte 0)) } + | "(*IF-FSHARP" { if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then mlCompatWarning (FSComp.SR.lexIndentOffForML()) lexbuf.LexemeRange @@ -649,8 +678,8 @@ rule token (args: LexArgs) (skip: bool) = parse // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, LexerStringStyle.ExtendedInterpolated, _, _) :: _ - | (_, LexerStringStyle.TripleQuote, _, _) :: _ -> () + | (_, LexerStringStyle.ExtendedInterpolated, _, _, _) :: _ + | (_, LexerStringStyle.TripleQuote, _, _, _) :: _ -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | [] -> () @@ -697,7 +726,7 @@ rule token (args: LexArgs) (skip: bool) = parse // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, style, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () + | (_, style, _, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | _ -> () @@ -726,8 +755,8 @@ rule token (args: LexArgs) (skip: bool) = parse // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, LexerStringStyle.ExtendedInterpolated, _, _) :: _ - | (_, LexerStringStyle.TripleQuote, _, _) :: _ -> () + | (_, LexerStringStyle.ExtendedInterpolated, _, _, _) :: _ + | (_, LexerStringStyle.TripleQuote, _, _, _) :: _ -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | _ -> () @@ -741,7 +770,7 @@ rule token (args: LexArgs) (skip: bool) = parse // Single quote in triple quote ok, others disallowed match args.stringNest with - | (_, style, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () + | (_, style, _, _, _) :: _ when style = LexerStringStyle.ExtendedInterpolated || style = LexerStringStyle.TripleQuote -> () | _ :: _ -> errorR(Error(FSComp.SR.lexSingleQuoteInSingleQuote(), m)) | _ -> () @@ -762,7 +791,7 @@ rule token (args: LexArgs) (skip: bool) = parse | "////" op_char* { // 4+ slash are 1-line comments, online 3 slash are XmlDoc let m = lexbuf.LexemeRange - LexbufLocalXmlDocStore.AddGrabPointDelayed(lexbuf) + XmlDocStore.AddGrabPointDelayed(lexbuf) if not skip then LINE_COMMENT (LexCont.SingleLineComment(args.ifdefStack, args.stringNest, 1, m)) else singleLineComment (None,1,m,m,args) skip lexbuf } @@ -777,12 +806,12 @@ rule token (args: LexArgs) (skip: bool) = parse | "//" op_char* { // Need to read all operator symbols too, otherwise it might be parsed by a rule below let m = lexbuf.LexemeRange - LexbufLocalXmlDocStore.AddGrabPointDelayed(lexbuf) + XmlDocStore.AddGrabPointDelayed(lexbuf) if not skip then LINE_COMMENT (LexCont.SingleLineComment(args.ifdefStack, args.stringNest, 1, m)) else singleLineComment (None,1,m,m,args) skip lexbuf } | newline - { newline lexbuf + { incrLine lexbuf if not skip then WHITESPACE (LexCont.Token(args.ifdefStack, args.stringNest)) else token args skip lexbuf } @@ -849,12 +878,12 @@ rule token (args: LexArgs) (skip: bool) = parse lexbuf.EndPos <- pos.ApplyLineDirective((match file with Some f -> FileIndex.fileIndexOfFile f | None -> pos.FileIndex), line) else // add a newline when we don't apply a directive since we consumed a newline getting here - newline lexbuf + incrLine lexbuf token args skip lexbuf else // add a newline when we don't apply a directive since we consumed a newline getting here - newline lexbuf + incrLine lexbuf HASH_LINE (LexCont.Token (args.ifdefStack, args.stringNest)) } @@ -946,10 +975,10 @@ rule token (args: LexArgs) (skip: bool) = parse { match args.stringNest with | [] -> () - | (counter, style, d, m) :: rest -> + | (counter, style, d, _, m) :: rest -> // Note, we do not update the 'm', any incomplete-interpolation error // will be reported w.r.t. the first '{' - args.stringNest <- (counter + 1, style, d, m) :: rest + args.stringNest <- (counter + 1, style, d, None, m) :: rest // To continue token-by-token lexing may involve picking up the new args.stringNes let cont = LexCont.Token(args.ifdefStack, args.stringNest) LBRACE cont @@ -962,11 +991,20 @@ rule token (args: LexArgs) (skip: bool) = parse // We encounter a '}' in the expression token stream. First check if we're in an interpolated string expression // and continue the string if necessary match args.stringNest with - | (1, LexerStringStyle.ExtendedInterpolated, delimLength, r) :: rest when delimLength > 1 -> - args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, delimLength - 1, r) :: rest + | (1, LexerStringStyle.ExtendedInterpolated, delimLength, altR, r) :: rest when delimLength > 1 -> + // On the first "}" of multiple "}", keep the range of the starting "}" for later processing in startString + let altStart = + match altR with + | None -> Some lexbuf.LexemeRange + | _ -> altR + args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, delimLength - 1, altStart, r) :: rest token args skip lexbuf - | (1, style, _, _) :: rest -> + | (1, style, _, altR, _r) :: rest -> args.stringNest <- rest + altR + |> Option.iter (fun r -> + let n = r.StartColumn - lexbuf.StartPos.Column + lexbuf.StartPos <- lexbuf.StartPos.ShiftColumnBy(n)) let buf, fin, m = startString args lexbuf if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, style, LexerStringKind.InterpolatedStringPart, args.interpolationDelimiterLength, m)) @@ -976,11 +1014,10 @@ rule token (args: LexArgs) (skip: bool) = parse | LexerStringStyle.SingleQuote -> singleQuoteString (buf, fin, m, LexerStringKind.InterpolatedStringPart, args) skip lexbuf | LexerStringStyle.TripleQuote -> tripleQuoteString (buf, fin, m, LexerStringKind.InterpolatedStringPart, args) skip lexbuf | LexerStringStyle.ExtendedInterpolated -> extendedInterpolatedString (buf, fin, m, LexerStringKind.InterpolatedStringPart, args) skip lexbuf - - | (counter, style, d, m) :: rest -> + | (counter, style, d, altR, m) :: rest -> // Note, we do not update the 'm', any incomplete-interpolation error // will be reported w.r.t. the first '{' - args.stringNest <- (counter - 1, style, d, m) :: rest + args.stringNest <- (counter - 1, style, d, altR, m) :: rest let cont = LexCont.Token(args.ifdefStack, args.stringNest) RBRACE cont @@ -1052,56 +1089,47 @@ rule token (args: LexArgs) (skip: bool) = parse | anywhite* "#if" anywhite+ anystring { let m = lexbuf.LexemeRange + shouldStartLine args lexbuf m (FSComp.SR.lexHashIfMustBeFirst()) let lookup id = List.contains id args.conditionalDefines let lexed = lexeme lexbuf let isTrue, expr = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion lexbuf.StrictIndentation args lookup lexed args.ifdefStack <- (IfDefIf,m) :: args.ifdefStack - LexbufIfdefStore.SaveIfHash(lexbuf, lexed, expr, m) - - // Get the token; make sure it starts at zero position & return - let cont, f = - if isTrue then - let cont = LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token) - let f = endline LexerEndlineContinuation.Token args skip - cont, f - else - let cont = LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(0, m)) - let f = endline (LexerEndlineContinuation.Skip(0, m)) args skip - cont, f - - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashIfMustBeFirst()) (HASH_IF(m,lexed,cont)) - if not skip then tok else f lexbuf } - - | anywhite* "#else" anywhite* ("//" [^'\n''\r']*)? + IfdefStore.SaveIfHash(lexbuf, lexed, expr, m) + let contCase = if isTrue then LexerEndlineContinuation.Token else LexerEndlineContinuation.IfdefSkip(0, m) + let tok = HASH_IF(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, contCase)) + if skip then endline contCase args skip lexbuf else tok } + + | anywhite* "#else" anywhite* ("//" anystring)? { let lexed = (lexeme lexbuf) match args.ifdefStack with | [] -> LEX_FAILURE (FSComp.SR.lexHashElseNoMatchingIf()) | (IfDefElse,_) :: _rest -> LEX_FAILURE (FSComp.SR.lexHashEndifRequiredForElse()) | (IfDefIf,_) :: rest -> let m = lexbuf.LexemeRange + shouldStartLine args lexbuf m (FSComp.SR.lexHashElseMustBeFirst()) args.ifdefStack <- (IfDefElse,m) :: rest - LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) - let tok = HASH_ELSE(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(0, m))) - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashElseMustBeFirst()) tok - if not skip then tok else endline (LexerEndlineContinuation.Skip(0, m)) args skip lexbuf } + IfdefStore.SaveElseHash(lexbuf, lexed, m) + let tok = HASH_ELSE(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(0, m))) + if skip then endline (LexerEndlineContinuation.IfdefSkip(0, m)) args skip lexbuf else tok } - | anywhite* "#endif" anywhite* ("//" [^'\n''\r']*)? + | anywhite* "#endif" anywhite* ("//" anystring)? { let lexed = (lexeme lexbuf) let m = lexbuf.LexemeRange match args.ifdefStack with | []-> LEX_FAILURE (FSComp.SR.lexHashEndingNoMatchingIf()) | _ :: rest -> + shouldStartLine args lexbuf m (FSComp.SR.lexHashEndifMustBeFirst()) args.ifdefStack <- rest - LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) + IfdefStore.SaveEndIfHash(lexbuf, lexed, m) let tok = HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashEndifMustBeFirst()) tok if not skip then tok else endline LexerEndlineContinuation.Token args skip lexbuf } | "#if" { let tok = WHITESPACE (LexCont.Token (args.ifdefStack, args.stringNest)) let tok = fail args lexbuf (FSComp.SR.lexHashIfMustHaveIdent()) tok - if not skip then tok else token args skip lexbuf } + if skip then token args skip lexbuf else tok } + // Let the parser deal with these invalid directives | anywhite* "#if" ident_char+ | anywhite* "#else" ident_char+ | anywhite* "#endif" ident_char+ @@ -1126,17 +1154,17 @@ and ifdefSkip (n: int) (m: range) (args: LexArgs) (skip: bool) = parse // If #if is the first thing on the line then increase depth, otherwise skip, because it is invalid (e.g. "(**) #if ...") if (m.StartColumn <> 0) then - if not skip then INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) - else ifdefSkip n m args skip lexbuf + if skip then ifdefSkip n m args skip lexbuf + else INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) else let lexed = lexeme lexbuf let lookup id = List.contains id args.conditionalDefines let _, expr = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion lexbuf.StrictIndentation args lookup lexed - LexbufIfdefStore.SaveIfHash(lexbuf, lexed, expr, m) - let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n+1, m))) - if not skip then tok else endline (LexerEndlineContinuation.Skip(n+1, m)) args skip lexbuf } + IfdefStore.SaveIfHash(lexbuf, lexed, expr, m) + let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(n+1, m))) + if skip then endline (LexerEndlineContinuation.IfdefSkip(n+1, m)) args skip lexbuf else tok } - | anywhite* "#else" anywhite* ("//" [^'\n''\r']*)? + | anywhite* "#else" anywhite* ("//" anystring)? { let lexed = (lexeme lexbuf) let m = lexbuf.LexemeRange @@ -1150,16 +1178,16 @@ and ifdefSkip (n: int) (m: range) (args: LexArgs) (skip: bool) = parse | (IfDefElse,_) :: _rest -> LEX_FAILURE (FSComp.SR.lexHashEndifRequiredForElse()) | (IfDefIf,_) :: rest -> let m = lexbuf.LexemeRange - LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) + IfdefStore.SaveElseHash(lexbuf, lexed, m) args.ifdefStack <- (IfDefElse,m) :: rest if not skip then HASH_ELSE(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) else endline LexerEndlineContinuation.Token args skip lexbuf - else - LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) - if not skip then INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n, m))) - else endline (LexerEndlineContinuation.Skip(n, m)) args skip lexbuf } + else + IfdefStore.SaveElseHash(lexbuf, lexed, m) + if not skip then INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(n, m))) + else endline (LexerEndlineContinuation.IfdefSkip(n, m)) args skip lexbuf } - | anywhite* "#endif" anywhite* ("//" [^'\n''\r']*)? + | anywhite* "#endif" anywhite* ("//" anystring)? { let lexed = lexeme lexbuf let m = lexbuf.LexemeRange @@ -1171,18 +1199,18 @@ and ifdefSkip (n: int) (m: range) (args: LexArgs) (skip: bool) = parse match args.ifdefStack with | [] -> LEX_FAILURE (FSComp.SR.lexHashEndingNoMatchingIf()) | _ :: rest -> - LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) + IfdefStore.SaveEndIfHash(lexbuf, lexed, m) args.ifdefStack <- rest if not skip then HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) else endline LexerEndlineContinuation.Token args skip lexbuf else - LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) - let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n-1, m))) - let tok = shouldStartLine args lexbuf m (FSComp.SR.lexWrongNestedHashEndif()) tok - if not skip then tok else endline (LexerEndlineContinuation.Skip(n-1, m)) args skip lexbuf } + shouldStartLine args lexbuf m (FSComp.SR.lexWrongNestedHashEndif()) + IfdefStore.SaveEndIfHash(lexbuf, lexed, m) + let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.IfdefSkip(n-1, m))) + if not skip then tok else endline (LexerEndlineContinuation.IfdefSkip(n-1, m)) args skip lexbuf } | newline - { newline lexbuf; ifdefSkip n m args skip lexbuf } + { incrLine lexbuf; ifdefSkip n m args skip lexbuf } | [^ ' ' '\n' '\r' ]+ @@ -1202,13 +1230,13 @@ and ifdefSkip (n: int) (m: range) (args: LexArgs) (skip: bool) = parse // or end of file and then calls the lexing function specified by 'cont' - either token or ifdefSkip and endline (cont: LexerEndlineContinuation) (args: LexArgs) (skip: bool) = parse | newline - { newline lexbuf + { incrLine lexbuf match cont with | LexerEndlineContinuation.Token -> if not skip then WHITESPACE(LexCont.Token (args.ifdefStack, args.stringNest)) else token args skip lexbuf - | LexerEndlineContinuation.Skip(n, m) -> + | LexerEndlineContinuation.IfdefSkip(n, m) -> if not skip then INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) else ifdefSkip n m args skip lexbuf } @@ -1217,7 +1245,7 @@ and endline (cont: LexerEndlineContinuation) (args: LexArgs) (skip: bool) = pars { match cont with | LexerEndlineContinuation.Token -> EOF(LexCont.Token(args.ifdefStack, args.stringNest)) - | LexerEndlineContinuation.Skip(n, m) -> + | LexerEndlineContinuation.IfdefSkip(n, m) -> EOF(LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) } @@ -1231,7 +1259,7 @@ and endline (cont: LexerEndlineContinuation) (args: LexArgs) (skip: bool) = pars and singleQuoteString (sargs: LexerStringArgs) (skip: bool) = parse | '\\' newline anywhite* { let (_buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf let text = lexeme lexbuf let text2 = text |> String.filter (fun c -> c <> ' ' && c <> '\t') advanceColumnBy lexbuf (text.Length - text2.Length) @@ -1251,11 +1279,26 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) = parse | trigraph { let (buf, _fin, m, kind, args) = sargs let s = lexeme lexbuf - addByteChar buf (trigraph s.[1] s.[2] s.[3]) - if not skip then - STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) + let result() = + if not skip then + STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) + else + singleQuoteString sargs skip lexbuf + let c = trigraph s.[1] s.[2] s.[3] + let x = int c + if x < 0 || x > 255 then + // TODO: Promote to Error: + // * remove `addByteChar ...` + // * remove `warning ...` + // * Adjust `lexInvalidCharLiteralInString` in `FSComp.txt`: remove `Note` (incl. 2nd placeholder) + // * uncomment `fail ...` + addByteChar buf c + warning (Error(FSComp.SR.lexInvalidCharLiteralInString (s[0..3], sprintf "\\%03i" (x % 256)), lexbuf.LexemeRange)) + //fail args lexbuf (FSComp.SR.lexInvalidCharLiteralInString (s[0..3])) () + result() else - singleQuoteString sargs skip lexbuf } + addByteChar buf c + result() } | hexGraphShort { let (buf, _fin, m, kind, args) = sargs @@ -1283,7 +1326,8 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) = parse singleQuoteString sargs skip lexbuf match unicodeGraphLong hexChars with | Invalid -> - fail args lexbuf (FSComp.SR.lexInvalidUnicodeLiteral hexChars) (result()) + fail args lexbuf (FSComp.SR.lexInvalidUnicodeLiteral hexChars) () + result() | SingleChar(c) -> addUnicodeChar buf (int c) result() @@ -1318,7 +1362,7 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) = parse if kind.IsInterpolated then // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.SingleQuote, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.SingleQuote, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind LexerStringFinisherContext.InterpolatedPart cont else @@ -1344,7 +1388,7 @@ and singleQuoteString (sargs: LexerStringArgs) (skip: bool) = parse | newline { let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, kind, args.interpolationDelimiterLength, m)) @@ -1413,7 +1457,7 @@ and verbatimString (sargs: LexerStringArgs) (skip: bool) = parse | newline { let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, kind, args.interpolationDelimiterLength, m)) @@ -1434,7 +1478,7 @@ and verbatimString (sargs: LexerStringArgs) (skip: bool) = parse if kind.IsInterpolated then // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.Verbatim, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.Verbatim, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind (LexerStringFinisherContext.InterpolatedPart ||| LexerStringFinisherContext.Verbatim) cont else @@ -1506,7 +1550,7 @@ and tripleQuoteString (sargs: LexerStringArgs) (skip: bool) = parse | newline { let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, kind, args.interpolationDelimiterLength, m)) @@ -1553,7 +1597,7 @@ and tripleQuoteString (sargs: LexerStringArgs) (skip: bool) = parse if kind.IsInterpolated then // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.TripleQuote, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.TripleQuote, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind (LexerStringFinisherContext.InterpolatedPart ||| LexerStringFinisherContext.TripleQuote) cont else @@ -1600,7 +1644,7 @@ and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) = parse | newline { let (buf, _fin, m, kind, args) = sargs - newline lexbuf + incrLine lexbuf addUnicodeString buf (lexeme lexbuf) if not skip then STRING_TEXT (LexCont.String(args.ifdefStack, args.stringNest, LexerStringStyle.ExtendedInterpolated, kind, args.interpolationDelimiterLength, m)) @@ -1658,7 +1702,7 @@ and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) = parse let maxBraces = 2 * args.interpolationDelimiterLength - 1 if numBraces > maxBraces then let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fail args lexbuf (FSComp.SR.lexTooManyLBracesInTripleQuote()) @@ -1679,7 +1723,7 @@ and extendedInterpolatedString (sargs: LexerStringArgs) (skip: bool) = parse String.replicate extraBraces "{" |> addUnicodeString buf // get a new range for where the fill starts let m2 = lexbuf.LexemeRange - args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, m2) :: args.stringNest + args.stringNest <- (1, LexerStringStyle.ExtendedInterpolated, args.interpolationDelimiterLength, None, m2) :: args.stringNest let cont = LexCont.Token(args.ifdefStack, args.stringNest) fin.Finish buf kind (LexerStringFinisherContext.InterpolatedPart ||| LexerStringFinisherContext.TripleQuote) cont } @@ -1717,17 +1761,17 @@ and singleLineComment (cargs: SingleLineCommentArgs) (skip: bool) = parse | newline { let buff,_n, mStart, mEnd, args = cargs trySaveXmlDoc lexbuf buff - newline lexbuf + incrLine lexbuf // Saves the documentation (if we're collecting any) into a buffer-local variable. if not skip then LINE_COMMENT (LexCont.Token(args.ifdefStack, args.stringNest)) else - if Option.isNone buff then LexbufCommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) + if Option.isNone buff then CommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) token args skip lexbuf } | eof { let buff, _n, mStart, mEnd, args = cargs trySaveXmlDoc lexbuf buff - LexbufCommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) + CommentStore.SaveSingleLineComment(lexbuf, mStart, mEnd) // NOTE: it is legal to end a file with this comment, so we'll return EOF as a token EOF (LexCont.Token(args.ifdefStack, args.stringNest)) } @@ -1768,7 +1812,7 @@ and comment (cargs: BlockCommentArgs) (skip: bool) = parse | "(*)" { let n, m, args = cargs - LexbufLocalXmlDocStore.AddGrabPoint(lexbuf) + XmlDocStore.AddGrabPoint(lexbuf) if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment cargs skip lexbuf } @@ -1779,7 +1823,7 @@ and comment (cargs: BlockCommentArgs) (skip: bool) = parse | newline { let n, m, args = cargs - newline lexbuf + incrLine lexbuf if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n, m)) else comment cargs skip lexbuf } | "*)" @@ -1789,10 +1833,10 @@ and comment (cargs: BlockCommentArgs) (skip: bool) = parse if not skip then COMMENT (LexCont.Comment(args.ifdefStack, args.stringNest, n-1, m)) else comment (n-1,m,args) skip lexbuf else - LexbufLocalXmlDocStore.AddGrabPointDelayed(lexbuf) + XmlDocStore.AddGrabPointDelayed(lexbuf) if not skip then COMMENT (LexCont.Token(args.ifdefStack, args.stringNest)) else - LexbufCommentStore.SaveBlockComment(lexbuf, m, lexbuf.LexemeRange) + CommentStore.SaveBlockComment(lexbuf, m, lexbuf.LexemeRange) token args skip lexbuf } | anywhite+ @@ -1813,7 +1857,7 @@ and comment (cargs: BlockCommentArgs) (skip: bool) = parse and stringInComment (n: int) (m: range) (args: LexArgs) (skip: bool) = parse // Follow string lexing, skipping tokens until it finishes | '\\' newline anywhite* - { newline lexbuf + { incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) else stringInComment n m args skip lexbuf } @@ -1835,7 +1879,7 @@ and stringInComment (n: int) (m: range) (args: LexArgs) (skip: bool) = parse else comment (n, m, args) skip lexbuf } | newline - { newline lexbuf + { incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.SingleQuote, n, m)) else stringInComment n m args skip lexbuf } @@ -1865,7 +1909,7 @@ and verbatimStringInComment (n: int) (m: range) (args: LexArgs) (skip: bool) = p else verbatimStringInComment n m args skip lexbuf } | newline - { newline lexbuf + { incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.Verbatim, n, m)) else verbatimStringInComment n m args skip lexbuf } @@ -1891,7 +1935,7 @@ and tripleQuoteStringInComment (n: int) (m: range) (args: LexArgs) (skip: bool) else tripleQuoteStringInComment n m args skip lexbuf } | newline - { newline lexbuf + { incrLine lexbuf if not skip then COMMENT (LexCont.StringInComment(args.ifdefStack, args.stringNest, LexerStringStyle.TripleQuote, n, m)) else tripleQuoteStringInComment n m args skip lexbuf } @@ -1913,7 +1957,7 @@ and mlOnly (m: range) (args: LexArgs) (skip: bool) = parse else mlOnly m args skip lexbuf } | newline - { newline lexbuf + { incrLine lexbuf if not skip then COMMENT (LexCont.MLOnly(args.ifdefStack, args.stringNest, m)) else mlOnly m args skip lexbuf } diff --git a/src/fcs-fable/src/Compiler/pars.fsy b/src/fcs-fable/src/Compiler/pars.fsy index f72129058f..7c48c8a895 100644 --- a/src/fcs-fable/src/Compiler/pars.fsy +++ b/src/fcs-fable/src/Compiler/pars.fsy @@ -3,6 +3,7 @@ %{ #nowarn "1182" // generated code has lots of unused "parseState" +#nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` open System @@ -16,11 +17,13 @@ open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.Features +open FSharp.Compiler.LexerStore open FSharp.Compiler.ParseHelpers open FSharp.Compiler.Syntax open FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.SyntaxTreeOps +open FSharp.Compiler.Text open FSharp.Compiler.Text.Position open FSharp.Compiler.Text.Range open FSharp.Compiler.Xml @@ -89,6 +92,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> %token GREATER_RBRACK STRUCT SIG %token STATIC MEMBER CLASS ABSTRACT OVERRIDE DEFAULT CONSTRUCTOR INHERIT %token EXTERN VOID PUBLIC PRIVATE INTERNAL GLOBAL +%token BAR_JUST_BEFORE_NULL /* for parser 'escape hatch' out of expression context without consuming the 'recover' token */ %token TYPE_COMING_SOON TYPE_IS_HERE MODULE_COMING_SOON MODULE_IS_HERE @@ -105,7 +109,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> %token ODO /* LexFilter #light converts 'DO' tokens to 'ODO' */ %token ODO_BANG /* LexFilter #light converts 'DO_BANG' tokens to 'ODO_BANG' */ %token OTHEN /* LexFilter #light converts 'THEN' tokens to 'OTHEN' */ -%token OELSE /* LexFilter #light converts 'ELSE' tokens to 'OELSE' except if immeditely followed by 'if', when they become 'ELIF' */ +%token OELSE /* LexFilter #light converts 'ELSE' tokens to 'OELSE' except if immediately followed by 'if', when they become 'ELIF' */ %token OWITH /* LexFilter #light converts SOME (but not all) 'WITH' tokens to 'OWITH' */ %token OFUNCTION /* LexFilter #light converts 'FUNCTION' tokens to 'OFUNCTION' */ %token OFUN /* LexFilter #light converts 'FUN' tokens to 'OFUN' */ @@ -141,7 +145,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> %token OBLOCKEND // CtxtSeqBlock(_, _, AddBlockEnd) %token OBLOCKEND_COMING_SOON OBLOCKEND_IS_HERE // CtxtSeqBlock(_, _, AddBlockEnd) -%token OINTERFACE_MEMBER /* inserted for non-paranthetical use of 'INTERFACE', i.e. not INTERFACE/END */ +%token OINTERFACE_MEMBER /* inserted for non-parenthetical use of 'INTERFACE', i.e. not INTERFACE/END */ %token FIXED %token ODUMMY @@ -167,7 +171,9 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> %type argExpr %type declExprBlock %type headBindingPattern +%type appTypeNullableInParens %type atomTypeNonAtomicDeprecated +%type atomTypeOrAnonRecdType %type atomicExprAfterType %type typedSequentialExprBlock %type atomicExpr @@ -228,7 +234,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> * * Dummy terminals (like prec_type_prefix) can assign precedence to a rule. * Doc says rule and (shift) token precedence resolves shift/reduce conflict. - * It seems like dummy terminals can not assign precedence to the shift, + * It seems like dummy terminals cannot assign precedence to the shift, * but including the tokens in the precedences below will order them. * e.g. prec_type_prefix lower precedence than RARROW, LBRACK, IDENT, STAR (all extend types). */ @@ -255,6 +261,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> /* Lower than "if a then b" */ %left prec_then_before %nonassoc prec_then_if +%nonassoc BAR_JUST_BEFORE_NULL %left BAR %right SEMICOLON prec_semiexpr_sep OBLOCKSEP @@ -405,7 +412,7 @@ interactiveTerminator: /* It is important to make this as large as possible given the chunk of input */ /* text. More or less identical to 'moduleDefns' but where SEMICOLON_SEMICOLON is */ /* not part of the grammar of topSeps and HASH interactions are not part of */ -/* the swalloed blob, since things like #use must be processed separately. */ +/* the swallowed blob, since things like #use must be processed separately. */ /* REVIEW: limiting the input chunks until the next # directive can lead to */ /* discrepencies between whole-file type checking in FSI and FSC. */ @@ -491,6 +498,15 @@ hashDirectiveArg: | string { let s, kind = $1 ParsedHashDirectiveArgument.String(s, kind, lhs parseState) } + | INT32 + { let n, _ = $1 + ParsedHashDirectiveArgument.Int32(n, lhs parseState) } + | IDENT + { let m = rhs parseState 1 + ParsedHashDirectiveArgument.Ident(Ident($1, m), lhs parseState) } + | pathOp + { let path = $1 + ParsedHashDirectiveArgument.LongIdent(path, lhs parseState) } | sourceIdentifier { let c, v = $1 ParsedHashDirectiveArgument.SourceIdentifier(c, v, lhs parseState) } @@ -729,6 +745,7 @@ valSpfn: | opt_attributes opt_access VAL opt_attributes opt_inline opt_mutable opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints optLiteralValueSpfn { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let attr1, attr2, isInline, isMutable, vis2, id, doc, explicitValTyparDecls, (ty, arity), (mEquals, konst: SynExpr option) = ($1), ($4), (Option.isSome $5), (Option.isSome $6), ($7), ($8), grabXmlDoc(parseState, $1, 1), ($9), ($11), ($12) + let vis2 = SynValSigAccess.Single(vis2) if not (isNil attr2) then errorR(Deprecated(FSComp.SR.parsAttributesMustComeBeforeVal(), rhs parseState 4)) let m = rhs2 parseState 1 11 @@ -874,7 +891,9 @@ tyconSpfnRhs: { let m = lhs parseState let ty, arity = $3 let flags = AbstractMemberFlags true SynMemberKind.Member - let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero) + let vis2 = SynValSigAccess.Single(None) + + let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, vis2, None, m, SynValSigTrivia.Zero) let invoke = SynMemberSig.Member(valSig, flags, m, SynMemberSigMemberTrivia.Zero) (fun leadingKeyword nameRange nameInfo mEquals augmentation -> if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) @@ -949,7 +968,12 @@ classMemberSpfn: | opt_attributes opt_access memberSpecFlags opt_inline opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet optLiteralValueSpfn { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let isInline, doc, vis2, id, explicitValTyparDecls, (ty, arity), (mEquals, optLiteralValue) = (Option.isSome $4), grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11 - let mWith, (getSet, getSetRangeOpt) = $10 + let mWith, (getSet, getSetRangeOpt, getterAccess, setterAccess) = $10 + let vis2 = + match getterAccess, setterAccess with + | None, None -> SynValSigAccess.Single(vis2) + | _ -> SynValSigAccess.GetSet(vis2, getterAccess, setterAccess) + let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet let mWhole = let m = rhs parseState 3 @@ -962,19 +986,23 @@ classMemberSpfn: match optLiteralValue with | None -> m | Some e -> unionRanges m e.Range - + let flags, leadingKeyword = $3 + if leadingKeywordIsAbstract leadingKeyword then + [ $2; $5; getterAccess; setterAccess ] + |> List.iter (function None -> () | Some access -> errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), access.Range))) + let flags = flags (getSetAdjuster arity) let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $4; WithKeyword = mWith; EqualsRange = mEquals } let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWhole, trivia) let trivia: SynMemberSigMemberTrivia = { GetSetKeywords = getSetRangeOpt } SynMemberSig.Member(valSpfn, flags, mWhole, trivia) } - | opt_attributes opt_access interfaceMember appType + | opt_attributes opt_access interfaceMember appTypeWithoutNull { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) SynMemberSig.Interface($4, unionRanges (rhs parseState 3) ($4).Range) } - | opt_attributes opt_access INHERIT appType + | opt_attributes opt_access INHERIT appTypeWithoutNull { if Option.isSome $2 then errorR (Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) SynMemberSig.Inherit($4, unionRanges (rhs parseState 1) $4.Range) } @@ -1010,18 +1038,19 @@ classMemberSpfn: | opt_attributes opt_access NEW COLON topTypeWithTypeConstraints { let vis, doc, (ty, valSynInfo) = $2, grabXmlDoc(parseState, $1, 1), $5 + let vis2 = SynValSigAccess.Single(vis) let mNew = rhs parseState 3 let m = unionRanges (rhs parseState 1) ty.Range |> unionRangeWithXmlDoc doc let isInline = false let trivia: SynValSigTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; WithKeyword = None; EqualsRange = None } - let valSpfn = SynValSig ($1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, m, trivia) + let valSpfn = SynValSig ($1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, valSynInfo, isInline, false, doc, vis2, None, m, trivia) SynMemberSig.Member(valSpfn, CtorMemberFlags, m, SynMemberSigMemberTrivia.Zero) } /* The optional "with get, set" on a member in a signature */ classMemberSpfnGetSet: | /* EMPTY */ - { None, (SynMemberKind.Member, None) } + { None, (SynMemberKind.Member, None, None, None) } | WITH classMemberSpfnGetSetElements { let mWith = rhs parseState 1 @@ -1039,39 +1068,39 @@ classMemberSpfnGetSet: /* The "get, set" on a property member in a signature */ classMemberSpfnGetSetElements: - | nameop - { (let (SynIdent(id:Ident, _)) = $1 + | opt_access nameop + { (let (SynIdent(id:Ident, _)) = $2 if id.idText = "get" then - SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange) + SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange), $1, None else if id.idText = "set" then - SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange) + SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange), None, $1 else raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) } - | nameop COMMA nameop - { let (SynIdent(id, _)) = $1 - let (SynIdent(id2, _)) = $3 + | opt_access nameop COMMA opt_access nameop + { let (SynIdent(id, _)) = $2 + let (SynIdent(id2, _)) = $5 if not ((id.idText = "get" && id2.idText = "set") || (id.idText = "set" && id2.idText = "get")) then raiseParseErrorAt (rhs2 parseState 1 3) (FSComp.SR.parsGetOrSetRequired()) if id.idText = "get" then - SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id.idRange, id2.idRange)) + SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id.idRange, id2.idRange)), $1, $4 else - SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id2.idRange, id.idRange)) } + SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id2.idRange, id.idRange)), $4, $1 } - | nameop COMMA recover - { (let (SynIdent(id:Ident, _)) = $1 + | opt_access nameop COMMA recover + { (let (SynIdent(id:Ident, _)) = $2 if id.idText = "get" then - SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange) + SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange), $1, None else if id.idText = "set" then - SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange) + SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange), None, $1 else - raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) } + raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsGetOrSetRequired())) } | OBLOCKBEGIN oblockend ODECLEND { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsIdentifierExpected()) - SynMemberKind.Member, None } + SynMemberKind.Member, None, None, None } memberSpecFlags: | memberFlags { $1 } @@ -1274,7 +1303,7 @@ moduleDefn: /* 'let' definitions in non-#light*/ | opt_attributes opt_access defnBindings %prec decl_let { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) - parseState.ResetSynArgNameGenerator() + (getSynArgNameGenerator parseState.LexBuffer).Reset() let (BindingSetPreAttrs(_, _, _, _, mWhole)) = $3 mkDefnBindings (mWhole, $3, $1, $2, mWhole) } @@ -1282,7 +1311,7 @@ moduleDefn: | opt_attributes opt_access hardwhiteLetBindings %prec decl_let { let hwlb, m, _ = $3 if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) - parseState.ResetSynArgNameGenerator() + (getSynArgNameGenerator parseState.LexBuffer).Reset() mkDefnBindings (m, hwlb, $1, $2, m) } /* 'do' definitions in non-#light*/ @@ -1370,7 +1399,7 @@ openDecl: { let mOpen = rhs parseState 1 SynOpenDeclTarget.ModuleOrNamespace(SynLongIdent([], [], []), mOpen.EndRange), mOpen } - | OPEN typeKeyword appType + | OPEN typeKeyword appTypeWithoutNull { let mOpen = rhs parseState 1 let mPath = $3.Range SynOpenDeclTarget.Type($3, mPath), unionRanges mOpen mPath } @@ -1410,9 +1439,9 @@ namedModuleDefnBlock: // The second is a module abbreviation, the first a module containing a single expression. // The resolution is in favour of the module abbreviation, i.e. anything of the form // module M2 = ID.ID.ID.ID - // will be taken as a module abbreviation, regardles of the identifiers themselves. + // will be taken as a module abbreviation, regardless of the identifiers themselves. // - // This is similar to the ambiguitty between + // This is similar to the ambiguity between // type X = int // and // type X = OneValue @@ -1612,20 +1641,17 @@ tyconDefn: SynTypeDefn($1, SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Augmentation mWithKwd, [], m), classDefns, None, m, trivia) } | typeNameInfo opt_attributes opt_access opt_HIGH_PRECEDENCE_APP opt_simplePatterns optAsSpec EQUALS tyconDefnRhsBlock - { let vis, spats, az = $3, $5, $6 + { let vis, pat, az = $3, $5, $6 let nameRange = rhs parseState 1 let (tcDefRepr, mWith, members) = $8 nameRange let (SynComponentInfo(_, _, _, lid, _, _, _, _)) = $1 let mEquals = rhs parseState 7 - // Gets the XML doc comments prior to the implicit constructor let xmlDoc = grabXmlDoc (parseState, $2, 2) - let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid - let memberCtorPattern = - spats |> Option.map (fun spats -> - SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) + pat |> Option.map (fun pat -> + SynMemberDefn.ImplicitCtor(vis, $2, pat, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) ) let tcDefRepr = @@ -1650,31 +1676,27 @@ tyconDefn: | Some(_, Some id) -> reportParseErrorAt (rhs parseState 6) (FSComp.SR.tcLetAndDoRequiresImplicitConstructionSequence ()) | _ -> () - tcDefRepr - let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem: SynMemberDefn) -> mem.Range) |> unionRangeWithXmlDoc xmlDoc - fun leadingKeyword -> let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = Some mEquals; WithKeyword = mWith } SynTypeDefn($1, tcDefRepr, members, memberCtorPattern, mWhole, trivia) } | typeNameInfo opt_attributes opt_access opt_HIGH_PRECEDENCE_APP opt_simplePatterns optAsSpec recover - { let vis, spats, az = $3, $5, $6 + { let vis, pat, az = $3, $5, $6 let (SynComponentInfo(longId = lid)) = $1 // Gets the XML doc comments prior to the implicit constructor let xmlDoc = grabXmlDoc (parseState, $2, 2) let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid let mName = $1.Range let members, mWhole = - match spats, vis, az with - | Some spats, _, _ -> - let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) + match pat, vis, az with + | Some pat, _, _ -> + let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, pat, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) [memberCtorPattern], unionRanges mName memberCtorPattern.Range - | _, _, Some(mAs, asId) -> let mAs = asId |> Option.map (fun id -> @@ -1682,12 +1704,9 @@ tyconDefn: id.idRange ) |> Option.defaultValue mAs - [], unionRanges mName mAs - | _, Some vis, _ -> [], unionRanges mName vis.Range - | _ -> [], mName @@ -1695,7 +1714,6 @@ tyconDefn: let trivia = { SynTypeDefnTrivia.Zero with LeadingKeyword = leadingKeyword } SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mWhole, trivia) } - /* The right-hand-side of a type definition */ tyconDefnRhsBlock: /* This rule allows members to be given for record and union types in the #light syntax */ @@ -1759,7 +1777,8 @@ tyconDefnRhs: { let m = lhs parseState let ty, arity = $3 (fun nameRange augmentation -> - let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero) + let vis2 = SynValSigAccess.Single(None) + let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, vis2, None, m, SynValSigTrivia.Zero) let flags = AbstractMemberFlags true SynMemberKind.Member let invoke = SynMemberDefn.AbstractSlot(valSig, flags, m, SynMemberDefnAbstractSlotTrivia.Zero) if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) @@ -1910,7 +1929,7 @@ memberCore: let memberRange = unionRanges rangeStart mEnd |> unionRangeWithXmlDoc xmlDoc [ SynMemberDefn.Member (binding, memberRange) ] } - | opt_inline bindingPattern opt_topReturnTypeWithTypeConstraints recover + | opt_inline bindingPattern opt_topReturnTypeWithTypeConstraints ends_coming_soon_or_recover { let optReturnType = $3 let bindingPat, mBindLhs = $2 let mEnd = @@ -1918,6 +1937,7 @@ memberCore: | Some(_, ty) -> ty.Range.EndRange | _ -> bindingPat.Range.EndRange let expr = arbExpr ("memberCore2", mEnd) + errorR (Error(FSComp.SR.parsMissingMemberBody(), rhs parseState 4)) fun vis flagsBuilderAndLeadingKeyword attrs rangeStart -> let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, rangeStart) @@ -2015,7 +2035,7 @@ classDefnMember: [SynMemberDefn.Member(binding, mWhole)] } - | opt_attributes opt_access interfaceMember appType opt_interfaceImplDefn + | opt_attributes opt_access interfaceMember appTypeWithoutNull opt_interfaceImplDefn { if not (isNil $1) then errorR(Error(FSComp.SR.parsAttributesAreNotPermittedOnInterfaceImplementations(), rhs parseState 1)) if Option.isSome $2 then errorR(Error(FSComp.SR.parsInterfacesHaveSameVisibilityAsEnclosingType(), rhs parseState 3)) let mWithKwd, members, mWhole = @@ -2031,10 +2051,11 @@ classDefnMember: let ty = SynType.FromParseError(mInterface.EndRange) [ SynMemberDefn.Interface(ty, None, None, rhs2 parseState 1 3) ] } - | opt_attributes opt_access abstractMemberFlags opt_inline nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet opt_ODECLEND - { let ty, arity = $8 - let isInline, doc, id, explicitValTyparDecls = (Option.isSome $4), grabXmlDoc(parseState, $1, 1), $5, $6 - let mWith, (getSet, getSetRangeOpt) = $9 + | opt_attributes opt_access abstractMemberFlags opt_access opt_inline nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet opt_ODECLEND + { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) + let ty, arity = $9 + let isInline, doc, id, explicitValTyparDecls = (Option.isSome $5), grabXmlDoc(parseState, $1, 1), $6, $7 + let mWith, (getSet, getSetRangeOpt, getterAccess, setterAccess) = $10 let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet let mWhole = let m = rhs parseState 1 @@ -2042,10 +2063,14 @@ classDefnMember: | None -> unionRanges m ty.Range | Some gs -> unionRanges m gs.Range |> unionRangeWithXmlDoc doc - if Option.isSome $2 then errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), mWhole)) + + [ $2; $4; getterAccess; setterAccess ] + |> List.iter (function None -> () | Some access -> errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), access.Range))) + let mkFlags, leadingKeyword = $3 - let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $4; WithKeyword = mWith; EqualsRange = None } - let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWhole, trivia) + let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $5; WithKeyword = mWith; EqualsRange = None } + let vis2 = SynValSigAccess.Single(None) + let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, None, mWhole, trivia) let trivia: SynMemberDefnAbstractSlotTrivia = { GetSetKeywords = getSetRangeOpt } [ SynMemberDefn.AbstractSlot(valSpfn, mkFlags (getSetAdjuster arity), mWhole, trivia) ] } @@ -2181,7 +2206,7 @@ autoPropsDefnDecl: errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) fun attribs flags rangeStart -> let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) - [ mkAutoPropDefn mVal $3 $4 $5 None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] } + [ mkAutoPropDefn mVal $3 $4 $5 None expr (None, (SynMemberKind.Member, None, None, None)) xmlDoc attribs flags rangeStart ] } | VAL opt_mutable opt_access ident opt_typ OBLOCKSEP { let mVal = rhs parseState 1 @@ -2194,7 +2219,7 @@ autoPropsDefnDecl: errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) fun attribs flags rangeStart -> let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) - [ mkAutoPropDefn mVal $3 $4 $5 None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] } + [ mkAutoPropDefn mVal $3 $4 $5 None expr (None, (SynMemberKind.Member, None, None, None)) xmlDoc attribs flags rangeStart ] } | VAL opt_mutable opt_access recover { let mVal = rhs parseState 1 @@ -2204,7 +2229,7 @@ autoPropsDefnDecl: errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) fun attribs flags rangeStart -> let xmlDoc = grabXmlDocAtRangeStart(parseState, attribs, rangeStart) - [ mkAutoPropDefn mVal $3 id None None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] } + [ mkAutoPropDefn mVal $3 id None None expr (None, (SynMemberKind.Member, None, None, None)) xmlDoc attribs flags rangeStart ] } /* An optional type on an auto-property definition */ opt_typ: @@ -2299,16 +2324,19 @@ opt_classDefn: inheritsDefn: | INHERIT atomTypeNonAtomicDeprecated optBaseSpec { let mDecl = unionRanges (rhs parseState 1) $2.Range - SynMemberDefn.Inherit($2, $3, mDecl) } + let trivia = { InheritKeyword = rhs parseState 1 } + SynMemberDefn.Inherit(Some $2, $3, mDecl, trivia) } | INHERIT atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType optBaseSpec { let mDecl = unionRanges (rhs parseState 1) $4.Range - SynMemberDefn.ImplicitInherit($2, $4, $5, mDecl) } + let trivia = { InheritKeyword = rhs parseState 1 } + SynMemberDefn.ImplicitInherit($2, $4, $5, mDecl, trivia) } | INHERIT ends_coming_soon_or_recover { let mDecl = (rhs parseState 1) + let trivia = { InheritKeyword = (rhs parseState 1) } if not $2 then errorR (Error(FSComp.SR.parsTypeNameCannotBeEmpty (), mDecl)) - SynMemberDefn.Inherit(SynType.LongIdent(SynLongIdent([], [], [])), None, mDecl) } + SynMemberDefn.Inherit(None, None, mDecl, trivia) } optAsSpec: | asSpec @@ -2374,8 +2402,23 @@ objectImplementationMember: { let rangeStart = rhs parseState 1 $3 $1 $2 rangeStart } - | opt_attributes staticMemberOrMemberOrOverride error - { [] } + | opt_attributes staticMemberOrMemberOrOverride recover + { let rangeStart = rhs parseState 1 + let memFlagsBuilder, leadingKeyword = $2 + let flags = Some(memFlagsBuilder SynMemberKind.Member) + let xmlDoc = grabXmlDocAtRangeStart (parseState, $1, rangeStart) + let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = None; EqualsRange = None } + let mMember = rhs parseState 2 + let mEnd = mMember.EndRange + let bindingPat = patFromParseError (SynPat.Wild(mEnd)) + let expr = arbExpr ("objectImplementationMember1", mEnd) + let mWhole = rhs2 parseState 1 2 + let binding = + mkSynBinding + (xmlDoc, bindingPat) + (None, false, false, mWhole, DebugPointAtBinding.NoneAtInvisible, None, expr, mEnd, [], $1, flags, trivia) + + [SynMemberDefn.Member(binding, mWhole)] } | opt_attributes error memberCore opt_ODECLEND { [] } @@ -2401,12 +2444,12 @@ tyconDefnOrSpfnSimpleRepr: | opt_attributes opt_access path LQUOTE STRING recover { errorR(Error(FSComp.SR.parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString(), rhs parseState 4)) SynTypeDefnSimpleRepr.TypeAbbrev(ParserDetail.ErrorRecovery, SynType.LongIdent($3), unionRanges (rhs parseState 1) $3.Range) } - - /* A type abbreviation */ + + /* A type abbreviation */ | opt_attributes opt_access typ { if not (isNil $1) then errorR(Error(FSComp.SR.parsAttributesIllegalHere(), rhs parseState 1)) if Option.isSome $2 then errorR(Error(FSComp.SR.parsTypeAbbreviationsCannotHaveVisibilityDeclarations(), rhs parseState 2)) - SynTypeDefnSimpleRepr.TypeAbbrev(ParserDetail.Ok, $3, unionRanges (rhs parseState 1) $3.Range) } + SynTypeDefnSimpleRepr.TypeAbbrev(ParserDetail.Ok, $3, unionRanges (rhs parseState 1) $3.Range) } /* A union type definition */ | opt_attributes opt_access unionTypeRepr @@ -2455,7 +2498,7 @@ braceFieldDeclList: { [] } | LBRACE rbrace - { errorR (Error(FSComp.SR.parsExpectingField(), rhs parseState 2)) + { errorR (Error(FSComp.SR.parsExpectingRecordField (), rhs parseState 2)) [] } anonRecdType: @@ -2557,6 +2600,10 @@ opt_explicitValTyparDecls: | { SynValTyparDecls(None, true) } +hashConstraint: + | HASH atomType + { SynType.HashConstraint($2, lhs parseState) } + /* Any tokens in this grammar must be added to the lex filter rule 'peekAdjacentTypars' */ /* See the F# specification "Lexical analysis of type applications and type parameter definitions" */ opt_typeConstraints: @@ -2578,20 +2625,20 @@ typeConstraints: /* Any tokens in this grammar must be added to the lex filter rule 'peekAdjacentTypars' */ /* See the F# specification "Lexical analysis of type applications and type parameter definitions" */ intersectionConstraints: - | intersectionConstraints AMP atomType %prec prec_no_more_attr_bindings // todo precedence + | intersectionConstraints AMP hashConstraint %prec prec_no_more_attr_bindings { let constraints, mAmpersands = $1 + ($3 :: constraints), (rhs parseState 2 :: mAmpersands) } - match $3 with - | SynType.HashConstraint _ -> () - | ty -> errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), ty.Range)) - + | intersectionConstraints AMP atomType %prec prec_no_more_attr_bindings + { let constraints, mAmpersands = $1 + errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), $3.Range)) ($3 :: constraints), (rhs parseState 2 :: mAmpersands) } - | atomType - { match $1 with - | SynType.HashConstraint _ -> () - | ty -> errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), ty.Range)) + | hashConstraint + { [ $1 ], [] } + | atomType + { errorR(Error(FSComp.SR.parsConstraintIntersectionSyntaxUsedWithNonFlexibleType(), $1.Range)) [ $1 ], [] } /* Any tokens in this grammar must be added to the lex filter rule 'peekAdjacentTypars' */ @@ -2614,6 +2661,11 @@ typeConstraint: | typar COLON NULL { SynTypeConstraint.WhereTyparSupportsNull($1, lhs parseState) } + | typar COLON IDENT NULL + { if $3 <> "not" then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier($3 + " (2)")) + let trivia : SynTypeConstraintWhereTyparNotSupportsNullTrivia = { ColonRange = rhs parseState 2; NotRange = rhs parseState 3 } + SynTypeConstraint.WhereTyparNotSupportsNull($1, lhs parseState, trivia) } + | typar COLON LPAREN classMemberSpfn rparen { let tp = $1 SynTypeConstraint.WhereTyparSupportsMember(SynType.Var(tp, tp.Range), $4, lhs parseState) } @@ -2632,25 +2684,25 @@ typeConstraint: | "enum" -> let _ltm, _gtm, args, _commas, mWhole = $4 SynTypeConstraint.WhereTyparIsEnum($1, args, unionRanges $1.Range mWhole) - | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm)) } + | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm + " (3)")) } | typar COLON IDENT { match $3 with | "comparison" -> SynTypeConstraint.WhereTyparIsComparable($1, lhs parseState) | "equality" -> SynTypeConstraint.WhereTyparIsEquatable($1, lhs parseState) | "unmanaged" -> SynTypeConstraint.WhereTyparIsUnmanaged($1, lhs parseState) - | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm)) } + | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm + " (4)")) } - | appType + | appTypeWithoutNull { SynTypeConstraint.WhereSelfConstrained($1, lhs parseState) } typeAlts: - | typeAlts OR appType + | typeAlts OR appTypeWithoutNull { let mOr = rhs parseState 2 let m = unionRanges $1.Range $3.Range SynType.Or($1, $3, m, { OrKeyword = mOr }) } - | appType + | appTypeWithoutNull { $1 } /* The core of a union type definition */ @@ -2687,17 +2739,26 @@ attrUnionCaseDecl: { fun (xmlDoc, mBar) -> mkSynUnionCase $1 $2 (SynIdent(mkSynId mBar.EndRange "", None)) (SynUnionCaseKind.Fields []) mBar (xmlDoc, mBar) |> Choice2Of2 } | opt_attributes opt_access unionCaseName OF unionCaseRepr - { mkSynUnionCase $1 $2 $3 (SynUnionCaseKind.Fields $5) (rhs2 parseState 1 5) >> Choice2Of2 } + { let mId = rhs parseState 3 + let fields, mFields = $5 + let mWhole = unionRanges mId mFields + mkSynUnionCase $1 $2 $3 (SynUnionCaseKind.Fields fields) mWhole >> Choice2Of2 } | opt_attributes opt_access unionCaseName unionCaseRepr { errorR (Error(FSComp.SR.parsMissingKeyword("of"), rhs2 parseState 3 4)) - mkSynUnionCase $1 $2 $3 (SynUnionCaseKind.Fields $4) (rhs2 parseState 1 4) >> Choice2Of2 } + let mAttributes = rhs parseState 1 + let fields, mFields = $4 + let mWhole = unionRanges mAttributes mFields + mkSynUnionCase $1 $2 $3 (SynUnionCaseKind.Fields fields) mWhole >> Choice2Of2 } | opt_attributes opt_access OF unionCaseRepr - { let mOf = rhs parseState 3 + { let mAttributes = rhs parseState 1 + let mOf = rhs parseState 3 let mId = mOf.StartRange + let fields, mFields = $4 + let mWhole = unionRanges mAttributes mFields errorR (Error(FSComp.SR.parsMissingUnionCaseName(), mOf)) - mkSynUnionCase $1 $2 (SynIdent(mkSynId mId "", None)) (SynUnionCaseKind.Fields $4) (rhs2 parseState 1 4) >> Choice2Of2 } + mkSynUnionCase $1 $2 (SynIdent(mkSynId mId "", None)) (SynUnionCaseKind.Fields fields) mWhole >> Choice2Of2 } | opt_attributes opt_access OF recover { let mOf = rhs parseState 3 @@ -2709,18 +2770,33 @@ attrUnionCaseDecl: { mkSynUnionCase $1 $2 $3 (SynUnionCaseKind.Fields []) (rhs2 parseState 1 4) >> Choice2Of2 } | opt_attributes opt_access unionCaseName COLON topType - { if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyWarning(lhs parseState) - mkSynUnionCase $1 $2 $3 (SynUnionCaseKind.FullType $5) (rhs2 parseState 1 5) >> Choice2Of2 } + { let mAttributes = rhs parseState 1 + let fullType, _ = $5 + let mWhole = unionRanges mAttributes fullType.Range + if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyWarning(lhs parseState) + mkSynUnionCase $1 $2 $3 (SynUnionCaseKind.FullType $5) mWhole >> Choice2Of2 } | opt_attributes opt_access unionCaseName EQUALS atomicExpr { if Option.isSome $2 then errorR(Error(FSComp.SR.parsEnumFieldsCannotHaveVisibilityDeclarations(), rhs parseState 2)) let mEquals = rhs parseState 4 - let mDecl = rhs2 parseState 1 5 + let mAttributes = rhs parseState 1 + let expr, _ = $5 + let mDecl = unionRanges mAttributes expr.Range (fun (xmlDoc, mBar) -> let trivia: SynEnumCaseTrivia = { BarRange = Some mBar; EqualsRange = mEquals } let mDecl = unionRangeWithXmlDoc xmlDoc mDecl Choice1Of2 (SynEnumCase ($1, $3, fst $5, xmlDoc, mDecl, trivia))) } + | opt_attributes opt_access unionCaseName EQUALS recover + { if Option.isSome $2 then errorR(Error(FSComp.SR.parsEnumFieldsCannotHaveVisibilityDeclarations(), rhs parseState 2)) + let mEquals = rhs parseState 4 + let expr = arbExpr ("attrUnionCaseDecl", mEquals.EndRange) + let mDecl = rhs2 parseState 1 4 + fun (xmlDoc, mBar) -> + let trivia: SynEnumCaseTrivia = { BarRange = Some mBar; EqualsRange = mEquals } + let mDecl = unionRangeWithXmlDoc xmlDoc mDecl + Choice1Of2 (SynEnumCase ($1, $3, expr, xmlDoc, mDecl, trivia)) } + /* The name of a union case */ unionCaseName: | nameop @@ -2750,15 +2826,34 @@ firstUnionCaseDeclOfMany: let mDecl = (rhs2 parseState 1 3) |> unionRangeWithXmlDoc xmlDoc Choice1Of2 (SynEnumCase ([], SynIdent($1, None), fst $3, xmlDoc, mDecl, trivia)) } + | ident EQUALS recover opt_OBLOCKSEP + { let mEquals = rhs parseState 2 + let expr = arbExpr ("firstUnionCaseDeclOfMany1", mEquals.EndRange) + let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } + let xmlDoc = grabXmlDoc(parseState, [], 1) + let mDecl = (rhs2 parseState 1 2) |> unionRangeWithXmlDoc xmlDoc + Choice1Of2 (SynEnumCase ([], SynIdent($1, None), expr, xmlDoc, mDecl, trivia)) } + | firstUnionCaseDecl opt_OBLOCKSEP { $1 } firstUnionCaseDecl: | ident OF unionCaseRepr - { let trivia: SynUnionCaseTrivia = { BarRange = None } + { let fields, mFields = $3 + let trivia: SynUnionCaseTrivia = { BarRange = None } + let xmlDoc = grabXmlDoc (parseState, [], 1) + let mId = rhs parseState 1 + let mDecl = unionRanges mId mFields |> unionRangeWithXmlDoc xmlDoc + Choice2Of2(SynUnionCase([], SynIdent($1, None), SynUnionCaseKind.Fields fields, xmlDoc, None, mDecl, trivia)) } + + | unionCaseName COLON topType + { if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyWarning(lhs parseState) + let trivia: SynUnionCaseTrivia = { BarRange = None } let xmlDoc = grabXmlDoc (parseState, [], 1) - let mDecl = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc - Choice2Of2(SynUnionCase([], SynIdent($1, None), SynUnionCaseKind.Fields $3, xmlDoc, None, mDecl, trivia)) } + let mId = rhs parseState 1 + let fullType, _ = $3 + let mDecl = unionRanges mId fullType.Range |> unionRangeWithXmlDoc xmlDoc + Choice2Of2(SynUnionCase([], $1, SynUnionCaseKind.FullType $3, xmlDoc, None, mDecl, trivia)) } | ident OF recover { let trivia: SynUnionCaseTrivia = { BarRange = None } @@ -2769,52 +2864,88 @@ firstUnionCaseDecl: | OF unionCaseRepr { let mOf = rhs parseState 1 let mId = mOf.StartRange + let fields, mFields = $2 errorR (Error(FSComp.SR.parsMissingUnionCaseName(), mOf)) let id = SynIdent(mkSynId mId "", None) let trivia: SynUnionCaseTrivia = { BarRange = None } let xmlDoc = grabXmlDoc (parseState, [], 1) - let mDecl = rhs2 parseState 1 2 |> unionRangeWithXmlDoc xmlDoc - Choice2Of2(SynUnionCase([], id, SynUnionCaseKind.Fields $2, xmlDoc, None, mDecl, trivia)) } + let mDecl = unionRanges mOf mFields |> unionRangeWithXmlDoc xmlDoc + Choice2Of2(SynUnionCase([], id, SynUnionCaseKind.Fields fields, xmlDoc, None, mDecl, trivia)) } | ident EQUALS atomicExpr opt_OBLOCKSEP - { let mEquals = rhs parseState 2 + { let mId = rhs parseState 1 + let mEquals = rhs parseState 2 let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } let xmlDoc = grabXmlDoc (parseState, [], 1) - let mDecl = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc + let expr, _ = $3 + let mDecl = unionRanges mId expr.Range |> unionRangeWithXmlDoc xmlDoc Choice1Of2(SynEnumCase([], SynIdent($1, None), fst $3, xmlDoc, mDecl, trivia)) } + | ident EQUALS recover opt_OBLOCKSEP + { let mEquals = rhs parseState 2 + let expr = arbExpr ("firstUnionCaseDecl", mEquals.EndRange) + let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } + let xmlDoc = grabXmlDoc (parseState, [], 1) + let mDecl = rhs2 parseState 1 2 |> unionRangeWithXmlDoc xmlDoc + Choice1Of2(SynEnumCase([], SynIdent($1, None), expr, xmlDoc, mDecl, trivia)) } + + unionCaseReprElements: | unionCaseReprElement STAR unionCaseReprElements - { $1 :: $3 } + { let mField = rhs parseState 1 + let fields, mFields = $3 + $1 :: fields, unionRanges mField mFields } + + | unionCaseReprElement STAR recover + { let mStar = rhs parseState 2 + let ty = SynType.FromParseError mStar.EndRange + let field = mkSynAnonField (ty, PreXmlDoc.Empty) + [$1; field], rhs2 parseState 1 2 } + + | STAR unionCaseReprElements + { let mStar = rhs parseState 1 + errorR (Error(FSComp.SR.parsExpectingUnionCaseField (), rhs parseState 1)) + let fields, mFields = $2 + let ty = SynType.FromParseError mStar.StartRange + let field = mkSynAnonField (ty, PreXmlDoc.Empty) + field :: fields, unionRanges mStar mFields } | unionCaseReprElement %prec prec_toptuptyptail_prefix - { [$1] } + { [$1], $1.Range } unionCaseReprElement: - | ident COLON appType - { let xmlDoc = grabXmlDoc(parseState, [], 1) - let mWhole = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc + | ident COLON appTypeNullableInParens + { let xmlDoc = grabXmlDoc (parseState, [], 1) + let mId = rhs parseState 1 + let mWhole = unionRanges mId $3.Range |> unionRangeWithXmlDoc xmlDoc mkSynNamedField ($1, $3, xmlDoc, mWhole) } - | appType - { let xmlDoc = grabXmlDoc(parseState, [], 1) + | ident COLON recover + { let xmlDoc = grabXmlDoc (parseState, [], 1) + let mColon = rhs parseState 2 + let ty = SynType.FromParseError mColon.EndRange + let mWhole = rhs2 parseState 1 2 |> unionRangeWithXmlDoc xmlDoc + mkSynNamedField ($1, ty, xmlDoc, mWhole) } + + | appTypeNullableInParens + { let xmlDoc = grabXmlDoc (parseState, [], 1) mkSynAnonField ($1, xmlDoc) } | ident COLON invalidUseOfAppTypeFunction - { let xmlDoc = grabXmlDoc(parseState, [], 1) + { let xmlDoc = grabXmlDoc (parseState, [], 1) let mWhole = rhs2 parseState 1 3 |> unionRangeWithXmlDoc xmlDoc - reportParseErrorAt ($3 : SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField()) + reportParseErrorAt ($3: SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField ()) mkSynNamedField ($1, $3, xmlDoc, mWhole) } | invalidUseOfAppTypeFunction - { let xmlDoc = grabXmlDoc(parseState, [], 1) - reportParseErrorAt ($1 : SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField()) + { let xmlDoc = grabXmlDoc (parseState, [], 1) + reportParseErrorAt ($1: SynType).Range (FSComp.SR.tcUnexpectedFunTypeInUnionCaseField ()) mkSynAnonField ($1, xmlDoc) } unionCaseRepr: | braceFieldDeclList { errorR(Deprecated(FSComp.SR.parsConsiderUsingSeparateRecordType(), lhs parseState)) - $1 } + $1, rhs parseState 1 } | unionCaseReprElements { $1 } @@ -2890,7 +3021,8 @@ exconIntro: { SynUnionCase([], SynIdent($1, None), SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) } | ident OF unionCaseRepr - { SynUnionCase([], SynIdent($1, None), SynUnionCaseKind.Fields $3, PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) } + { let fields, _ = $3 + SynUnionCase([], SynIdent($1, None), SynUnionCaseKind.Fields fields, PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) } | ident OF recover { SynUnionCase([], SynIdent($1, None), SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) } @@ -3119,6 +3251,9 @@ cType: { let m = lhs parseState SynType.App(SynType.LongIdent(SynLongIdent([ident("nativeptr", m)], [], [ Some(IdentTrivia.OriginalNotation "*") ])), None, [$1], [], None, true, m) } + | cType BAR_JUST_BEFORE_NULL NULL + { SynType.WithNull($1, false, lhs parseState, { BarRange = rhs parseState 2 }) } + | cType AMP { let m = lhs parseState SynType.App(SynType.LongIdent(SynLongIdent([ident("byref", m)], [], [ Some(IdentTrivia.OriginalNotation "&") ])), None, [$1], [], None, true, m) } @@ -3214,10 +3349,16 @@ localBinding: | opt_inline opt_mutable bindingPattern opt_topReturnTypeWithTypeConstraints recover { if not $5 then reportParseErrorAt (rhs parseState 5) (FSComp.SR.parsUnexpectedEndOfFileDefinition()) + let bindingPat, mBindLhs = $3 let optReturnType = $4 - let mWhole = rhs2 parseState 1 (match optReturnType with None -> 3 | _ -> 4) + let mWhole = + let mStart = rhs parseState 1 + let mEnd = + match optReturnType with + | None -> bindingPat.Range + | Some (_, returnInfo) -> returnInfo.Range + unionRanges mStart mEnd let mRhs = mWhole.EndRange // zero-width range at end of last good token - let bindingPat, mBindLhs = $3 let localBindingBuilder = (fun xmlDoc attrs vis (leadingKeyword: SynLeadingKeyword) -> let spBind = DebugPointAtBinding.Yes(unionRanges leadingKeyword.Range mRhs) @@ -3377,39 +3518,7 @@ constant: bindingPattern: | headBindingPattern - { $1, rhs parseState 1 } - -// Subset of patterns allowed to be used in implicit ctors. -// For a better error recovery we could replace these rules with the actual SynPat parsing -// and use allowed patterns only at a later analysis stage reporting errors along the way. -simplePattern: - | ident - { let m = rhs parseState 1 - SynPat.Named(SynIdent($1, None), false, None, m) } - - | QMARK ident - { SynPat.OptionalVal($2, rhs parseState 2) } - - | simplePattern COLON typeWithTypeConstraints - { SynPat.Typed($1, $3, lhs parseState) } - - | simplePattern COLON recover - { let mColon = rhs parseState 2 - let ty = SynType.FromParseError(mColon.EndRange) - SynPat.Typed($1, ty, unionRanges $1.Range mColon) } - - | attributes simplePattern %prec paren_pat_attribs - { SynPat.Attrib($2, $1, lhs parseState) } - -simplePatternCommaList: - | simplePattern - { $1 } - - | simplePattern COMMA simplePatternCommaList - { let mComma = rhs parseState 2 - match $3 with - | SynPat.Tuple(_, pats, commas, _) -> SynPat.Tuple(false, $1 :: pats, mComma :: commas, rhs2 parseState 1 3) - | _ -> SynPat.Tuple(false, [$1; $3], [mComma], rhs2 parseState 1 3) } + { $1, $1.Range } opt_simplePatterns: | simplePatterns @@ -3418,39 +3527,35 @@ opt_simplePatterns: | { None } simplePatterns: - | LPAREN simplePatternCommaList rparen - { let parenPat = SynPat.Paren($2, rhs2 parseState 1 3) - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat - simplePats } + | LPAREN parenPattern rparen + { SynPat.Paren($2, rhs2 parseState 1 3) } | LPAREN rparen - { let pat = SynPat.Const(SynConst.Unit, rhs2 parseState 1 2) - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator pat - simplePats } - - | LPAREN simplePatternCommaList recover - { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) - let parenPat = SynPat.Paren(SynPat.Tuple(false, [], [], rhs2 parseState 1 2), rhs2 parseState 1 2) // todo: report parsed pats anyway? - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat - simplePats } - - | LPAREN error rparen - { let parenPat = SynPat.Paren(SynPat.Wild(rhs parseState 2), rhs2 parseState 1 3) // silent recovery - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat - simplePats } + { SynPat.Const(SynConst.Unit, rhs2 parseState 1 2) } - | LPAREN recover - { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) - let pat = SynPat.Wild(lhs parseState) - let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator pat - simplePats } +barCanBeRightBeforeNull: + | BAR + { } + | BAR_JUST_BEFORE_NULL + { } headBindingPattern: - | headBindingPattern AS constrPattern + | headBindingPattern AS constrPattern %prec AS { SynPat.As($1, $3, rhs2 parseState 1 3) } - | headBindingPattern BAR headBindingPattern + | headBindingPattern AS recover + { let mAs = rhs parseState 2 + let pat2 = SynPat.Wild(mAs.EndRange) + SynPat.As($1, pat2, rhs2 parseState 1 2) } + + | headBindingPattern AS + { let mAs = rhs parseState 2 + reportParseErrorAt mAs (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mAs.EndRange) + SynPat.As($1, pat2, rhs2 parseState 1 2) } + + | headBindingPattern barCanBeRightBeforeNull headBindingPattern %prec BAR { let mBar = rhs parseState 2 SynPat.Or($1, $3, rhs2 parseState 1 3, { BarRange = mBar }) } @@ -3458,6 +3563,17 @@ headBindingPattern: { let mColonColon = rhs parseState 2 SynPat.ListCons($1, $3, rhs2 parseState 1 3, { ColonColonRange = mColonColon }) } + | headBindingPattern COLON_COLON ends_coming_soon_or_recover + { let mColonColon = rhs parseState 2 + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons($1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) } + + | headBindingPattern COLON_COLON + { let mColonColon = rhs parseState 2 + reportParseErrorAt mColonColon (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons($1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) } + | tuplePatternElements %prec pat_tuple { let pats, commas = $1 let pats, commas = normalizeTuplePat pats commas @@ -3576,7 +3692,21 @@ constrPattern: SynPat.LongIdent(lid, None, None, args, vis, m) } | COLON_QMARK atomTypeOrAnonRecdType %prec pat_isinst - { SynPat.IsInst($2, lhs parseState) } + { let m = unionRanges (rhs parseState 1) $2.Range + SynPat.IsInst($2, m) } + + | COLON_QMARK recover %prec pat_isinst + { let mColon = rhs parseState 1 + if not $2 then + reportParseErrorAt mColon (FSComp.SR.parsExpectingPattern ()) + let ty = SynType.FromParseError(mColon.EndRange) + SynPat.IsInst(ty, mColon) } + + | COLON_QMARK %prec pat_isinst + { let mColon = rhs parseState 1 + let ty = SynType.FromParseError(mColon.EndRange) + reportParseErrorAt mColon (FSComp.SR.parsExpectingType ()) + SynPat.IsInst(ty, mColon) } | atomicPattern { $1 } @@ -3636,8 +3766,7 @@ atomicPattern: mkSynPatMaybeVar lidwd vis (lhs parseState) else let synIdent = List.head lidwd.IdentsWithTrivia - let (SynIdent(id, _)) = synIdent - SynPat.Named(synIdent, false, vis, id.idRange) } + SynPat.Named(synIdent, false, vis, synIdent.Range) } | constant { SynPat.Const(fst $1, snd $1) } @@ -3697,7 +3826,7 @@ parenPatternBody: /* This duplicates out 'patterns' in order to give type annotations */ /* the desired precedence w.r.t. patterns, tuple patterns in particular. */ -/* Duplication requried to minimize the disturbance to the grammar, */ +/* Duplication required to minimize the disturbance to the grammar, */ /* in particular the expected property that "pat" parses the same as */ /* "(pat)"! Here are some examples: */ /* a, b parses as (a, b) */ @@ -3721,10 +3850,21 @@ parenPatternBody: /* duplicating the entire expression grammar, or making a fairly severe breaking change */ /* to the language. */ parenPattern: - | parenPattern AS constrPattern + | parenPattern AS constrPattern %prec AS { SynPat.As($1, $3, rhs2 parseState 1 3) } - | parenPattern BAR parenPattern + | parenPattern AS recover + { let mAs = rhs parseState 2 + let pat2 = SynPat.Wild(mAs.EndRange) + SynPat.As($1, pat2, rhs2 parseState 1 2) } + + | parenPattern AS + { let mAs = rhs parseState 2 + let pat2 = SynPat.Wild(mAs.EndRange) + reportParseErrorAt mAs (FSComp.SR.parsExpectingPattern ()) + SynPat.As($1, pat2, rhs2 parseState 1 2) } + + | parenPattern barCanBeRightBeforeNull parenPattern %prec BAR { let mBar = rhs parseState 2 SynPat.Or($1, $3, rhs2 parseState 1 3, { BarRange = mBar }) } @@ -3743,6 +3883,8 @@ parenPattern: | parenPattern COLON recover { let mColon = rhs parseState 2 + if not $3 then + reportParseErrorAt mColon (FSComp.SR.parsExpectingPattern ()) let ty = SynType.FromParseError(mColon.EndRange) SynPat.Typed($1, ty, unionRanges $1.Range mColon) } @@ -3754,6 +3896,19 @@ parenPattern: { let mColonColon = rhs parseState 2 SynPat.ListCons($1, $3, rhs2 parseState 1 3, { ColonColonRange = mColonColon }) } + | parenPattern COLON_COLON recover + { let mColonColon = rhs parseState 2 + if not $3 then + reportParseErrorAt mColonColon (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons($1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) } + + | parenPattern COLON_COLON + { let mColonColon = rhs parseState 2 + reportParseErrorAt mColonColon (FSComp.SR.parsExpectingPattern ()) + let pat2 = SynPat.Wild(mColonColon.EndRange) + SynPat.ListCons($1, pat2, rhs2 parseState 1 2, { ColonColonRange = mColonColon }) } + | constrPattern { $1 } tupleParenPatternElements: @@ -3893,7 +4048,8 @@ typedSequentialExprEOF: sequentialExpr: | declExpr seps sequentialExpr - { SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, true, $1, $3, unionRanges $1.Range $3.Range) } + { let trivia = { SeparatorRange = $2 } + SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, true, $1, $3, unionRanges $1.Range $3.Range, trivia) } | declExpr seps { $1 } @@ -3902,10 +4058,12 @@ sequentialExpr: { $1 } | declExpr THEN sequentialExpr %prec prec_then_before - { SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, $1, $3, unionRanges $1.Range $3.Range) } + { let trivia = { SeparatorRange = Some (rhs parseState 2) } + SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, $1, $3, unionRanges $1.Range $3.Range, trivia) } | declExpr OTHEN OBLOCKBEGIN typedSequentialExpr oblockend %prec prec_then_before - { SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, $1, $4, unionRanges $1.Range $4.Range) } + { let trivia = { SeparatorRange = Some (rhs parseState 2) } + SynExpr.Sequential(DebugPointAtSequential.SuppressNeither, false, $1, $4, unionRanges $1.Range $4.Range, trivia) } | hardwhiteLetBindings %prec prec_args_error { let hwlb, m, mIn = $1 @@ -3932,7 +4090,8 @@ moreBinders: let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) $4.Range let mIn = rhs parseState 5 - SynExprAndBang(spBind, $1, true, $2, $4, m, { EqualsRange = mEquals; InKeyword = Some mIn }) :: $6 } + let trivia = { AndBangKeyword = rhs parseState 1; EqualsRange = mEquals; InKeyword = Some mIn } + SynExprAndBang(spBind, $1, true, $2, $4, m, trivia) :: $6 } | OAND_BANG headBindingPattern EQUALS typedSequentialExprBlock hardwhiteDefnBindingsTerminator opt_OBLOCKSEP moreBinders %prec expr_let { let report, mIn, _ = $5 @@ -3940,7 +4099,8 @@ moreBinders: let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) (* TODO Pretty sure this is wrong *) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) $4.Range - SynExprAndBang(spBind, $1, true, $2, $4, m, { EqualsRange = mEquals; InKeyword = mIn }) :: $7 } + let trivia = { AndBangKeyword = rhs parseState 1; EqualsRange = mEquals; InKeyword = mIn } + SynExprAndBang(spBind, $1, true, $2, $4, m, trivia) :: $7 } | %prec prec_no_more_attr_bindings { [] } @@ -4253,24 +4413,28 @@ declExpr: exprFromParseError (SynExpr.ForEach(spFor, spIn, SeqExprOnly false, true, $2, arbExpr ("forLoopCollection", mFor), arbExpr ("forLoopBody3", mForLoopBodyArb), mForLoopAll)) } | YIELD declExpr - { SynExpr.YieldOrReturn(($1, not $1), $2, unionRanges (rhs parseState 1) $2.Range) } + { let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn(($1, not $1), $2, (unionRanges (rhs parseState 1) $2.Range), trivia) } | YIELD_BANG declExpr - { SynExpr.YieldOrReturnFrom(($1, not $1), $2, unionRanges (rhs parseState 1) $2.Range) } + { let trivia: SynExprYieldOrReturnFromTrivia = { YieldOrReturnFromKeyword = rhs parseState 1 } + SynExpr.YieldOrReturnFrom(($1, not $1), $2, (unionRanges (rhs parseState 1) $2.Range), trivia) } | YIELD recover { let mYieldAll = rhs parseState 1 - SynExpr.YieldOrReturn(($1, not $1), arbExpr ("yield", mYieldAll), mYieldAll) } + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn(($1, not $1), arbExpr ("yield", mYieldAll), mYieldAll, trivia) } | YIELD_BANG recover { let mYieldAll = rhs parseState 1 - SynExpr.YieldOrReturnFrom(($1, not $1), arbExpr ("yield!", mYieldAll), mYieldAll) } + let trivia: SynExprYieldOrReturnFromTrivia = { YieldOrReturnFromKeyword = rhs parseState 1 } + SynExpr.YieldOrReturnFrom(($1, not $1), arbExpr ("yield!", mYieldAll), mYieldAll, trivia) } | BINDER headBindingPattern EQUALS typedSequentialExprBlock IN opt_OBLOCKSEP moreBinders typedSequentialExprBlock %prec expr_let { let spBind = DebugPointAtBinding.Yes(rhs2 parseState 1 5) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) $8.Range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, ($1 = "use"), true, $2, $4, $7, $8, m, trivia) } | OBINDER headBindingPattern EQUALS typedSequentialExprBlock hardwhiteDefnBindingsTerminator opt_OBLOCKSEP moreBinders typedSequentialExprBlock %prec expr_let @@ -4279,7 +4443,7 @@ declExpr: let spBind = DebugPointAtBinding.Yes(unionRanges (rhs parseState 1) $4.Range) let mEquals = rhs parseState 3 let m = unionRanges (rhs parseState 1) $8.Range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, ($1 = "use"), true, $2, $4, $7, $8, m, trivia) } | OBINDER headBindingPattern EQUALS typedSequentialExprBlock hardwhiteDefnBindingsTerminator opt_OBLOCKSEP error %prec expr_let @@ -4288,16 +4452,19 @@ declExpr: let mEquals = rhs parseState 3 let mAll = unionRanges (rhs parseState 1) (rhs parseState 7) let m = $4.Range.EndRange // zero-width range - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = Some mEquals } + let trivia: SynExprLetOrUseBangTrivia = { LetOrUseBangKeyword = rhs parseState 1 ; EqualsRange = Some mEquals } SynExpr.LetOrUseBang(spBind, ($1 = "use"), true, $2, $4, [], SynExpr.ImplicitZero m, mAll, trivia) } | DO_BANG typedSequentialExpr IN opt_OBLOCKSEP typedSequentialExprBlock %prec expr_let { let spBind = DebugPointAtBinding.NoneAtDo - let trivia: SynExprLetOrUseBangTrivia = { EqualsRange = None } - SynExpr.LetOrUseBang(spBind, false, true, SynPat.Const(SynConst.Unit, $2.Range), $2, [], $5, unionRanges (rhs parseState 1) $5.Range, trivia) } + let trivia: SynExprDoBangTrivia = { DoBangKeyword = rhs parseState 1 } + let m = unionRanges (rhs parseState 1) $5.Range + SynExpr.DoBang($2, m, trivia) } | ODO_BANG typedSequentialExprBlock hardwhiteDefnBindingsTerminator %prec expr_let - { SynExpr.DoBang($2, unionRanges (rhs parseState 1) $2.Range) } + { let trivia: SynExprDoBangTrivia = { DoBangKeyword = rhs parseState 1 } + let m = unionRanges (rhs parseState 1) $2.Range + SynExpr.DoBang($2, m, trivia) } | FIXED declExpr { SynExpr.Fixed($2, (unionRanges (rhs parseState 1) $2.Range)) } @@ -4306,7 +4473,8 @@ declExpr: { errorR(Error(FSComp.SR.parsArrowUseIsLimited(), lhs parseState)) let mArrow = rhs parseState 1 let expr = $2 mArrow - SynExpr.YieldOrReturn((true, true), expr, (unionRanges mArrow expr.Range)) } + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = rhs parseState 1 } + SynExpr.YieldOrReturn((true, true), expr, (unionRanges mArrow expr.Range), trivia) } | declExpr COLON_QMARK typ { SynExpr.TypeTest($1, $3, unionRanges $1.Range $3.Range) } @@ -4620,11 +4788,19 @@ withPatternClauses: | patternClauses { $1 None } - | BAR patternClauses + | barCanBeRightBeforeNull patternClauses { let mBar = rhs parseState 1 |> Some $2 mBar } - | BAR error + | BAR barCanBeRightBeforeNull patternClauses + { let mBar1 = rhs parseState 1 + let mBar2 = rhs parseState 2 + reportParseErrorAt mBar2 (FSComp.SR.parsExpectingPattern ()) + let clauses, mLast = Some mBar1 |> $3 + let clauses = addEmptyMatchClause mBar1 mBar2 clauses + clauses, mLast } + + | barCanBeRightBeforeNull error { // silent recovery let mLast = rhs parseState 1 [], mLast } @@ -4648,7 +4824,7 @@ patternClauses: fun mBar -> [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], mLast } - | patternAndGuard patternResult BAR patternClauses + | patternAndGuard patternResult barCanBeRightBeforeNull patternClauses { let pat, guard = $1 let mArrow, resultExpr = $2 let mNextBar = rhs parseState 3 |> Some @@ -4657,7 +4833,21 @@ patternClauses: fun mBar -> (SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar }) :: clauses), mLast } - | patternAndGuard error BAR patternClauses + | patternAndGuard patternResult BAR barCanBeRightBeforeNull patternClauses + { let pat, guard = $1 + let mArrow, resultExpr = $2 + let mBar1 = rhs parseState 3 + let mBar2 = rhs parseState 4 + reportParseErrorAt mBar2 (FSComp.SR.parsExpectingPattern ()) + let clauses, mLast = Some mBar1 |> $5 + let clauses = addEmptyMatchClause mBar1 mBar2 clauses + + fun mBar -> + let m = unionRanges resultExpr.Range pat.Range + let trivia = { ArrowRange = Some mArrow; BarRange = mBar } + SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, trivia) :: clauses, mLast } + + | patternAndGuard error barCanBeRightBeforeNull patternClauses { let pat, guard = $1 let mNextBar = rhs parseState 3 |> Some let clauses, mLast = $4 mNextBar @@ -4666,7 +4856,7 @@ patternClauses: fun _mBar -> (SynMatchClause(pat, guard, arbExpr ("patternClauses1", m.EndRange), m, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero) :: clauses), mLast } - | patternAndGuard patternResult BAR recover + | patternAndGuard patternResult barCanBeRightBeforeNull recover { let pat, guard = $1 let mArrow, resultExpr = $2 let mLast = rhs parseState 3 @@ -5217,9 +5407,10 @@ typars: SynType.Paren($2, m) } typarAlts: - | typarAlts OR appType + | typarAlts OR appTypeCanBeNullable { let mOr = rhs parseState 2 - let m = unionRanges $1.Range $3.Range + let appType : SynType = $3 + let m = unionRanges $1.Range appType.Range SynType.Or($1, $3, m, { OrKeyword = mOr }) } | typar @@ -5281,7 +5472,8 @@ arrowThenExprR: | RARROW typedSequentialExprBlockR { let mArrow = rhs parseState 1 let expr = $2 mArrow - SynExpr.YieldOrReturn((true, false), expr, unionRanges mArrow expr.Range) } + let trivia: SynExprYieldOrReturnTrivia = { YieldOrReturnKeyword = mArrow } + SynExpr.YieldOrReturn((true, false), expr, (unionRanges mArrow expr.Range), trivia) } forLoopBinder: | parenPattern IN declExpr @@ -5566,7 +5758,7 @@ opt_objExprInterfaces: { (* silent recovery *) $2 } objExprInterface: - | interfaceMember appType opt_objExprBindings opt_declEnd opt_OBLOCKSEP + | interfaceMember appTypeWithoutNull opt_objExprBindings opt_declEnd opt_OBLOCKSEP { let mWithKwd, bindings, members = $3 let m = match List.tryLast members with @@ -5638,44 +5830,44 @@ anonLambdaExpr: | FUN atomicPatterns RARROW typedSequentialExprBlock { let mAll = unionRanges (rhs parseState 1) $4.Range let mArrow = Some(rhs parseState 3) - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll $2 mArrow $4 } + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll $2 mArrow $4 } | FUN atomicPatterns RARROW error { let mAll = rhs2 parseState 1 3 let mArrow = Some(rhs parseState 3) - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll $2 mArrow (arbExpr ("anonLambdaExpr1", (rhs parseState 4))) } + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll $2 mArrow (arbExpr ("anonLambdaExpr1", (rhs parseState 4))) } | OFUN atomicPatterns RARROW typedSequentialExprBlockR OEND { let mArrow = rhs parseState 3 let expr = $4 mArrow let mAll = unionRanges (rhs parseState 1) expr.Range - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll $2 (Some mArrow) expr } + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll $2 (Some mArrow) expr } | OFUN atomicPatterns RARROW typedSequentialExprBlockR recover { if not $5 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileFunBody ()) let mArrow = rhs parseState 3 let expr = $4 mArrow let mAll = unionRanges (rhs parseState 1) expr.Range - exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false mAll $2 (Some mArrow) expr) } + exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mAll $2 (Some mArrow) expr) } | OFUN atomicPatterns RARROW ORIGHT_BLOCK_END OEND { let mLambda = rhs2 parseState 1 3 reportParseErrorAt mLambda (FSComp.SR.parsMissingFunctionBody()) let mArrow = Some(rhs parseState 3) - mkSynFunMatchLambdas parseState.SynArgNameGenerator false mLambda $2 mArrow (arbExpr ("anonLambdaExpr2", mLambda.EndRange)) } + mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mLambda $2 mArrow (arbExpr ("anonLambdaExpr2", mLambda.EndRange)) } | OFUN atomicPatterns RARROW recover { if not $4 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileFunBody()) let mLambda = rhs2 parseState 1 3 let mArrow = Some(rhs parseState 3) - exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false mLambda $2 mArrow (arbExpr ("anonLambdaExpr3", mLambda.EndRange))) } + exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mLambda $2 mArrow (arbExpr ("anonLambdaExpr3", mLambda.EndRange))) } | OFUN atomicPatterns error OEND { let mLambda = rhs2 parseState 1 2 - exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false mLambda $2 None (arbExpr ("anonLambdaExpr4", mLambda.EndRange))) } + exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false mLambda $2 None (arbExpr ("anonLambdaExpr4", mLambda.EndRange))) } | OFUN error OEND - { exprFromParseError (mkSynFunMatchLambdas parseState.SynArgNameGenerator false (rhs parseState 1) [] None (arbExpr ("anonLambdaExpr5", (rhs parseState 2)))) } + { exprFromParseError (mkSynFunMatchLambdas (getSynArgNameGenerator parseState.LexBuffer) false (rhs parseState 1) [] None (arbExpr ("anonLambdaExpr5", (rhs parseState 2)))) } anonMatchingExpr: | FUNCTION withPatternClauses %prec expr_function @@ -5788,14 +5980,14 @@ topTupleTypeElements: [ SynTupleTypeSegment.Type t, Some argInfo ] } topAppType: - | attributes appType COLON appType + | attributes appTypeCanBeNullable COLON appTypeCanBeNullable { match $2 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let m = unionRanges (rhs parseState 1) $4.Range SynType.SignatureParameter($1, false, Some id, $4, m), SynArgInfo($1, false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) } - | attributes appType COLON recover + | attributes appTypeCanBeNullable COLON recover { match $2 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let mColon = rhs parseState 2 @@ -5804,7 +5996,7 @@ topAppType: SynType.SignatureParameter($1, false, Some id, ty, m), SynArgInfo($1, false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) } - | attributes QMARK ident COLON appType + | attributes QMARK ident COLON appTypeCanBeNullable { let m = unionRanges (rhs parseState 1) $5.Range SynType.SignatureParameter($1, true, Some $3, $5, m), SynArgInfo($1, true, Some $3) } @@ -5814,18 +6006,18 @@ topAppType: let ty = SynType.FromParseError(mColon.EndRange) SynType.SignatureParameter($1, true, Some $3, ty, m), SynArgInfo($1, true, Some $3) } - | attributes appType + | attributes appTypeCanBeNullable { let m = unionRanges (rhs parseState 1) $2.Range SynType.SignatureParameter($1, false, None, $2, m), SynArgInfo($1, false, None) } - | appType COLON appType + | appTypeCanBeNullable COLON appTypeCanBeNullable { match $1 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let m = unionRanges (rhs parseState 1) $3.Range SynType.SignatureParameter([], false, Some id, $3, m), SynArgInfo([], false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) } - | appType COLON recover + | appTypeCanBeNullable COLON recover { match $1 with | SynType.LongIdent(SynLongIdent([id], _, _)) -> let mColon = rhs parseState 2 @@ -5834,7 +6026,7 @@ topAppType: SynType.SignatureParameter([], false, Some id, ty, m), SynArgInfo([], false, Some id) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsSyntaxErrorInLabeledType()) } - | QMARK ident COLON appType + | QMARK ident COLON appTypeCanBeNullable { let m = unionRanges (rhs parseState 1) $4.Range SynType.SignatureParameter([], true, Some $2, $4, m), SynArgInfo([], true, Some $2) } @@ -5844,22 +6036,24 @@ topAppType: let ty = SynType.FromParseError(mColon.EndRange) SynType.SignatureParameter([], true, Some $2, ty, m), SynArgInfo([], true, Some $2) } - | appType + | appTypeCanBeNullable { $1, SynArgInfo([], false, None) } /* Grammar rule meant for recovery scenarios */ /* For example in unionCaseReprElement where function type is not allowed */ invalidUseOfAppTypeFunction: - | appType RARROW invalidUseOfAppTypeFunction + | appTypeWithoutNull RARROW invalidUseOfAppTypeFunction { let mArrow = rhs parseState 2 let m = unionRanges (rhs2 parseState 1 2) $3.Range SynType.Fun($1, $3, m, { ArrowRange = mArrow }) } - | appType RARROW recover + + | appTypeWithoutNull RARROW recover { let mArrow = rhs parseState 2 let ty = SynType.FromParseError(mArrow.EndRange) let m = rhs2 parseState 1 2 SynType.Fun($1, ty, m, { ArrowRange = mArrow }) } - | appType RARROW RARROW invalidUseOfAppTypeFunction + + | appTypeWithoutNull RARROW RARROW invalidUseOfAppTypeFunction { let mArrow1 = rhs parseState 2 let mArrow2 = rhs parseState 3 reportParseErrorAt mArrow2 (FSComp.SR.parsExpectingType ()) @@ -5867,7 +6061,8 @@ invalidUseOfAppTypeFunction: let m1 = unionRanges $1.Range $4.Range let m2 = unionRanges mArrow2 $4.Range SynType.Fun($1, SynType.Fun(ty, $4, m2, { ArrowRange = mArrow2 }), m1, { ArrowRange = mArrow1 }) } - | appType RARROW appType + + | appTypeWithoutNull RARROW appTypeWithoutNull { let mArrow = rhs parseState 2 let m = rhs2 parseState 1 3 SynType.Fun($1, $3, m, { ArrowRange = mArrow }) } @@ -5903,12 +6098,12 @@ typEOF: tupleType: - | appType STAR tupleOrQuotTypeElements + | appTypeCanBeNullable STAR tupleOrQuotTypeElements { let mStar = rhs parseState 2 let path = SynTupleTypeSegment.Type $1 :: SynTupleTypeSegment.Star mStar :: $3 mkSynTypeTuple path } - | appType STAR recover + | appTypeCanBeNullable STAR recover { let mStar = rhs parseState 2 let ty = SynType.FromParseError(mStar.EndRange) let path = [SynTupleTypeSegment.Type $1; SynTupleTypeSegment.Star mStar; SynTupleTypeSegment.Type ty] @@ -5934,28 +6129,28 @@ tupleType: let path = [SynTupleTypeSegment.Slash mSlash; SynTupleTypeSegment.Type ty] mkSynTypeTuple path } - | appType INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements + | appTypeCanBeNullable INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements { if $2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator()) let mSlash = rhs parseState 2 let path = SynTupleTypeSegment.Type $1 :: SynTupleTypeSegment.Slash mSlash :: $3 mkSynTypeTuple path } - | appType INFIX_STAR_DIV_MOD_OP recover + | appTypeCanBeNullable INFIX_STAR_DIV_MOD_OP recover { if $2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 2 let ty = SynType.FromParseError(mSlash.EndRange) let path = [SynTupleTypeSegment.Type $1; SynTupleTypeSegment.Slash mSlash; SynTupleTypeSegment.Type ty] mkSynTypeTuple path } - | appType %prec prec_tuptyp_prefix + | appTypeCanBeNullable %prec prec_tuptyp_prefix { $1 } tupleOrQuotTypeElements: - | appType STAR tupleOrQuotTypeElements + | appTypeCanBeNullable STAR tupleOrQuotTypeElements { let mStar = rhs parseState 2 SynTupleTypeSegment.Type $1 :: SynTupleTypeSegment.Star mStar :: $3 } - | appType STAR recover + | appTypeCanBeNullable STAR recover { let mStar = rhs parseState 2 let ty = SynType.FromParseError(mStar.EndRange) [SynTupleTypeSegment.Type $1; SynTupleTypeSegment.Star mStar; SynTupleTypeSegment.Type ty] } @@ -5966,12 +6161,12 @@ tupleOrQuotTypeElements: reportParseErrorAt mStar (FSComp.SR.parsExpectingType ()) SynTupleTypeSegment.Type ty :: SynTupleTypeSegment.Star mStar :: $2 } - | appType INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements + | appTypeCanBeNullable INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements { if $2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 2 SynTupleTypeSegment.Type $1 :: SynTupleTypeSegment.Slash mSlash :: $3 } - | appType INFIX_STAR_DIV_MOD_OP recover + | appTypeCanBeNullable INFIX_STAR_DIV_MOD_OP recover { if $2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator ()) let mSlash = rhs parseState 2 let ty = SynType.FromParseError(mSlash.EndRange) @@ -5984,15 +6179,15 @@ tupleOrQuotTypeElements: reportParseErrorAt mSlash (FSComp.SR.parsExpectingType ()) SynTupleTypeSegment.Type ty :: SynTupleTypeSegment.Slash mSlash :: $2 } - | appType %prec prec_tuptyptail_prefix + | appTypeCanBeNullable %prec prec_tuptyptail_prefix { [ SynTupleTypeSegment.Type $1 ] } intersectionType: - | typar AMP intersectionConstraints %prec prec_no_more_attr_bindings // todo precedence + | typar AMP intersectionConstraints %prec prec_no_more_attr_bindings { let constraints, mAmpersands = $3 SynType.Intersection(Some $1, List.rev constraints, lhs parseState, { AmpersandRanges = rhs parseState 2 :: List.rev mAmpersands }) } - | atomType AMP intersectionConstraints %prec prec_no_more_attr_bindings // todo precedence + | hashConstraint AMP intersectionConstraints %prec prec_no_more_attr_bindings { let constraints, mAmpersands = $3 SynType.Intersection(None, $1 :: List.rev constraints, lhs parseState, { AmpersandRanges = rhs parseState 2 :: List.rev mAmpersands }) } @@ -6016,14 +6211,28 @@ appTypeConPower: | appTypeCon { $1 } -appType: - | appType arrayTypeSuffix +appTypeCanBeNullable: + | appTypeWithoutNull BAR_JUST_BEFORE_NULL NULL + { SynType.WithNull($1, false, lhs parseState, { BarRange = rhs parseState 2 }) } + + | appTypeWithoutNull + { $1 } + +appTypeNullableInParens: + | appTypeWithoutNull + { $1 } + + | LPAREN appTypeCanBeNullable rparen + { SynType.Paren($2, lhs parseState) } + +appTypeWithoutNull: + | appTypeWithoutNull arrayTypeSuffix { SynType.Array($2, $1, lhs parseState) } - | appType HIGH_PRECEDENCE_BRACK_APP arrayTypeSuffix /* only HPA for "name[]" allowed here */ + | appTypeWithoutNull HIGH_PRECEDENCE_BRACK_APP arrayTypeSuffix /* only HPA for "name[]" allowed here */ { SynType.Array($3, $1, lhs parseState) } - | appType appTypeConPower + | appTypeWithoutNull appTypeConPower /* note: use "rhs parseState 1" to deal with parens in "(int) list" */ { SynType.App($2, None, [$1], [], None, true, unionRanges (rhs parseState 1) $2.Range) } @@ -6208,8 +6417,8 @@ atomTypeOrAnonRecdType: /* Any tokens in this grammar must be added to the lex filter rule 'peekAdjacentTypars' */ /* See the F# specification "Lexical analysis of type applications and type parameter definitions" */ atomType: - | HASH atomType - { SynType.HashConstraint($2, lhs parseState) } + | hashConstraint + { $1 } | appTypeConPower %prec prec_atomtyp_path { $1 } @@ -6224,24 +6433,24 @@ atomType: { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen ()) SynType.Paren($2, lhs parseState) } - | STRUCT LPAREN appType STAR tupleOrQuotTypeElements rparen + | STRUCT LPAREN appTypeCanBeNullable STAR tupleOrQuotTypeElements rparen { let mStar = rhs parseState 4 let path = SynTupleTypeSegment.Type $3 :: SynTupleTypeSegment.Star mStar :: $5 let m = rhs2 parseState 1 6 SynType.Tuple(true, path, m) } - | STRUCT LPAREN appType STAR tupleOrQuotTypeElements recover + | STRUCT LPAREN appTypeCanBeNullable STAR tupleOrQuotTypeElements recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) let mStar = rhs parseState 4 let path = SynTupleTypeSegment.Type $3 :: SynTupleTypeSegment.Star mStar :: $5 let m = rhs2 parseState 1 5 SynType.Tuple(true, path, m) } - | STRUCT LPAREN appType STAR recover + | STRUCT LPAREN appTypeCanBeNullable STAR recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) SynType.Anon(lhs parseState) } - | STRUCT LPAREN appType recover + | STRUCT LPAREN appTypeCanBeNullable recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) SynType.Anon(lhs parseState) } @@ -6254,7 +6463,7 @@ atomType: | NULL { let m = rhs parseState 1 - SynType.StaticConstant(SynConst.String(null, SynStringKind.Regular, m), m) } + SynType.StaticConstantNull(m) } | CONST atomicExpr { let e, _ = $2 @@ -6654,12 +6863,12 @@ opt_topSeparators: | topSeparator opt_topSeparators { } | /* EMPTY */ { } -/* Seprators in either #light or non-#light */ +/* Separators in either #light or non-#light */ seps: - | OBLOCKSEP { } - | SEMICOLON { } - | OBLOCKSEP SEMICOLON { } - | SEMICOLON OBLOCKSEP { } + | OBLOCKSEP { None } + | SEMICOLON { Some (rhs parseState 1) } + | OBLOCKSEP SEMICOLON { Some (rhs parseState 2) } + | SEMICOLON OBLOCKSEP { Some (rhs parseState 1) } /* An 'end' that's optional only in #light, where an ODECLEND gets inserted, and explicit 'end's get converted to OEND */ declEnd: @@ -6689,12 +6898,6 @@ deprecated_opt_equals: | EQUALS { deprecatedWithError (FSComp.SR.parsNoEqualShouldFollowNamespace()) (lhs parseState); () } | /* EMPTY */ { } -opt_equals: - | EQUALS - { let mEquals = rhs parseState 1 - Some mEquals } - | /* EMPTY */ { None } - opt_OBLOCKSEP: | OBLOCKSEP { } | /* EMPTY */ { } @@ -6707,10 +6910,6 @@ opt_rec: | REC { true } | /* EMPTY */ { false } -opt_bar: - | BAR { } - | /* EMPTY */ { } - opt_inline: | INLINE { Some(rhs parseState 1) } | /* EMPTY */ { None } @@ -6780,8 +6979,8 @@ interpolatedStringParts: | INTERP_STRING_END { [ SynInterpolatedStringPart.String(fst $1, rhs parseState 1) ] } - | INTERP_STRING_PART interpolatedStringFill interpolatedStringParts - { SynInterpolatedStringPart.String(fst $1, rhs parseState 1) :: SynInterpolatedStringPart.FillExpr $2 :: $3 } + | INTERP_STRING_PART interpolatedStringFill interpolatedStringParts + { SynInterpolatedStringPart.String(fst $1, rhs parseState 1) :: SynInterpolatedStringPart.FillExpr $2 :: $3 } | INTERP_STRING_PART interpolatedStringParts { let rbrace = parseState.InputEndPosition 1 diff --git a/src/fcs-fable/src/Compiler/pppars.fsy b/src/fcs-fable/src/Compiler/pppars.fsy index fb2ae8a1c3..cd27722a25 100644 --- a/src/fcs-fable/src/Compiler/pppars.fsy +++ b/src/fcs-fable/src/Compiler/pppars.fsy @@ -3,6 +3,8 @@ %{ open FSharp.Compiler.DiagnosticsLogger +#nowarn "3261" // the generated code would need to properly annotate nulls, e.g. changing System.Object to `obj|null` + let dummy = IfdefId("DUMMY") let doNothing _ dflt= diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.cs.xlf index 07cccc5618..c74702e5dd 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.cs.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.cs.xlf @@ -52,6 +52,11 @@ Tento výraz je anonymní záznam, použijte {{|...|}} místo {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Duplicitní parametr Parametr {0} byl v této metodě použit vícekrát. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + Metoda getter a setter indexované vlastnosti musí mít stejný typ. Vlastnost{0} má metodu get typu {1}, ale metodu set typu {2}. @@ -122,14 +127,24 @@ Člen nebo funkce „{0}“ má atribut „TailCallAttribute“, ale nepoužívá se koncovým (tail) rekurzivním způsobem. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Statický abstraktní člen nevirtuálního rozhraní by měl být volán pouze prostřednictvím parametru typu (například T.{0}). + + + + Classes cannot contain static abstract members. + Třídy nemůžou obsahovat statické abstraktní členy. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Objektové výrazy nemohou implementovat rozhraní se statickými abstraktními členy ani deklarovat statické členy. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + Atribut TailCall by se měl použít jenom pro rekurzivní funkce. @@ -147,6 +162,11 @@ Dostupná přetížení:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + {0} nepodporuje typ {1}, protože tento typ postrádá požadovaný (skutečný nebo vestavěný) člen {2} + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. Obecná konstrukce vyžaduje, aby byl parametr obecného typu známý jako typ struct nebo reference. Zvažte možnost přidat anotaci typu. @@ -177,6 +197,11 @@ Známý typ parametru: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match Argument na indexu {0} neodpovídá @@ -187,6 +212,16 @@ Argument {0} neodpovídá + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent Omezení „unmanaged“ a „not struct“ jsou nekonzistentní @@ -212,6 +247,11 @@ Atribut sestavení {0} odkazuje na navržené sestavení {1}, které se nedá načíst nebo neexistuje. Ohlášená výjimka: {2} – {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function zkrácený tvar podtržítka pouze pro funkci přístupový objekt @@ -222,6 +262,16 @@ další převody orientované na typ + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions aplikativní výpočetní výrazy @@ -242,6 +292,11 @@ automatické generování vlastnosti Message pro deklarace exception + + Boolean-returning and return-type-directed partial active patterns + Částečné aktivní vzory vracející logickou hodnotu a směrované návratovým typem + + Allow implicit Extension attribute on declaring types, modules Povolit implicitní atribut Extension pro deklarující typy, moduly @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Vyvolá upozornění, pokud je atribut TailCall použit u nerekurzivních funkcí. @@ -272,16 +327,36 @@ opravit překlad názvů typů delegátů, viz https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding vzor discard ve vazbě použití + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal literál float32 bez tečky + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + Vynutit AttributeTargets + + Raises errors for non-virtual members overrides Vyvolá chyby pro přepsání jiných než virtuálních členů @@ -362,6 +437,21 @@ rozhraní s vícenásobným obecným vytvářením instancí + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Optimalizuje v určitých případech interpolované řetězce snížením na zřetězení. + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Optimalizuje určitá použití operátorů integrálního rozsahu (..) a kroku rozsahu (.. ..) pro rychlé smyčky while. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute Povolit duplikát malými písmeny při atributu RequireQualifiedAccess @@ -402,6 +492,11 @@ nepovinný zprostředkovatel komunikace s možnou hodnotou null + + nullness checking + nullness checking + + open type declaration Otevřít deklaraci typu @@ -417,9 +512,24 @@ správa balíčků + + # directives with non-quoted string arguments + Direktivy # s řetězcovými argumenty bez uvozovek + + + + Unexpected identifier '{0}'. + Neočekávaný identifikátor {0}. + + + + Unexpected integer literal '{0}'. + Neočekávaný celočíselný literál {0}. + + prefer extension method over plain property - prefer extension method over plain property + preferovat metodu rozšíření před prostými vlastnostmi @@ -443,8 +553,8 @@ - whitespace relexation - uvolnění prázdných znaků + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Sdílení podkladových polí v rozlišeném sjednocení [<Struct>] za předpokladu, že mají stejný název a typ @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Vlastnosti testu případu sjednocení @@ -517,9 +627,14 @@ Interoperabilita mezi neřízeným obecným omezením jazyka C# a F# (emitovat další modreq) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + Metoda getter a setter indexované vlastnosti musí mít stejný typ. @@ -647,6 +762,11 @@ Používá se ve výpočtových výrazech pro zavedení konstrukce smyčky, kde podmínka je výsledkem jiného výpočtového výrazu. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated Bajtový řetězec se nedá interpolovat. @@ -662,11 +782,26 @@ Oblasti IF-FSHARP/IF-CAML už nejsou podporovány. + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Toto není platný identifikátor + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. Znak }} musí být v interpolovaném řetězci uvozený (zdvojeným znakem). @@ -772,6 +907,11 @@ Vytiskněte odvozená rozhraní všech kompilovaných souborů do přidružených souborů podpisu. + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Vymazat mezipaměť výsledků správce balíčků @@ -807,6 +947,11 @@ Název výstupního souboru pdb se nemůže shodovat s výstupním názvem souboru sestavení pomocí --pdb:filename.pdb. + + Generate assembly with IL visibility that matches the source code visibility + Vygenerovat sestavení s viditelností IL, které odpovídá viditelnosti zdrojového kódu + + Produce a reference assembly, instead of a full assembly, as the primary output Vytvoří referenční sestavení místo úplného sestavení jako primární výstup. @@ -912,21 +1057,26 @@ Byl očekáván výraz. - - Expecting record field - Expecting record field - - Expecting pattern Očekává se vzorek. + + Expecting record field + Expecting record field + + Expecting type Očekává se typ + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Neúplný znakový literál (příklad: Q) nebo volání kvalifikovaného typu (příklad: T.Name) @@ -957,9 +1107,14 @@ Tento přístup člena je nejednoznačný. Při vytváření objektu použijte závorky, např. (new SomeType(args)).MemberName' + + Only simple patterns are allowed in primary constructors + V primárních konstruktorech jsou povoleny pouze jednoduché vzory. + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Neúplná deklarace statického konstruktoru. Pro deklaraci použijte „static let“, „static do“, „static member“ nebo „static val“. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - Ve specifikaci obnovitelného kódu došlo k omezené obecné konstrukci. + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - Ve specifikaci obnovitelného kódu došlo k „let rec“. + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Navržený název) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Tento aktivní vzor očekává tento počet argumentů výrazu: {0}, například {1}{2}. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Tento aktivní vzor očekává tento počet argumentů výrazu: {0} a argument vzoru, například {1}{2} pat. + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Tento aktivní vzor neočekává žádné argumenty, tj. měl by se používat takto: {0} a ne takto: {1} x. + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Tento aktivní vzor očekává přesně jeden argument vzoru, např. {0} pat. + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. Význam _ je tady nejednoznačný. Nelze ho použít pro proměnnou typu discard a zkratku funkce ve stejném oboru. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + Zkrácená syntaxe lambda je podporována pouze pro atomické výrazy, jako je metoda, vlastnost, pole nebo indexer v implicitní argumentu _. Příklad: let f = _. Length'. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Toto je definice funkce, která stínuje případ sjednocení. Pokud je to to, co chcete, toto upozornění ignorujte nebo potlačte. Pokud chcete, aby se jedná o dekonstrukci případu sjednocení, přidejte závorky. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - Je třeba inicializovat následující požadované vlastnosti:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Nenašla se žádný statický abstraktní člen, který by odpovídal tomuto přepsání. No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Nenašla se žádná statická abstraktní vlastnost, která by odpovídala tomuto přepsání. @@ -1327,6 +1517,16 @@ Hodnota {0} není funkce a nepodporuje zápis indexu. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. Syntaxe expr1[expr2] je při použití jako argument nejednoznačná. Více informací: https://aka.ms/fsharp-index-notation. Pokud plánujete indexování nebo vytváření řezů, musíte použít expr1.[expr2] na pozici argumentu. Pokud voláte funkci s vícenásobnými curryfikovanými argumenty, přidejte mezi ně mezeru, třeba someFunction expr1 [expr2]. @@ -1352,6 +1552,41 @@ Syntaxe (expr1)[expr2] je teď pro indexování vyhrazená a je při použití jako argument nejednoznačná. Více informací: https://aka.ms/fsharp-index-notation. Pokud voláte funkci s vícenásobnými curryfikovanými argumenty, přidejte mezi ně mezeru, třeba someFunction (expr1) [expr2]. + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods Konstrukt „let! ... and! ...“ se dá použít jen v případě, že tvůrce výpočetních výrazů definuje buď metodu „{0}“, nebo vhodné metody „MergeSource“ a „Bind“. @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Neplatný obnovitelný kód. Ve specifikaci obnovitelného kódu došlo k „let rec“. + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Pokud je typ sjednocení s více písmeny strukturou, musí být všechna pole se stejným názvem stejného typu. Toto pravidlo platí také pro vygenerovaný název Item v případě nepojmenovaných polí. @@ -1437,6 +1672,11 @@ Vlastnost nesmí určovat volitelné argumenty, in, out, ParamArray, CallerInfo nebo Quote. + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Neplatný interpolovaný řetězec. {0} @@ -1457,6 +1697,11 @@ Deklarování \"interfaces with static abstract methods\" (rozhraní se statickými abstraktními metodami) je pokročilá funkce. Pokyny najdete v https://aka.ms/fsharp-iwsams. Toto upozornění můžete zakázat pomocí #nowarn \"3535\" nebo '--nowarn:3535'. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + Typ {0} má příliš mnoho metod. Nalezeno:{1}, maximum:{2} + + Interface member '{0}' does not have a most specific implementation. Člen rozhraní {0} nemá nejvíce specifickou implementaci. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Je možné odebrat závorky. @@ -2232,11 +2477,6 @@ Definice {0} pro typ {1} v signatuře a implementaci nejsou kompatibilní, protože signatura deklaruje {2}, ale implementace deklaruje {3}. - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Definice {0} pro typ {1} v signatuře a implementaci nejsou kompatibilní, protože se liší zkratky: {2} oproti {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Definice {0} pro typ {1} v signatuře a implementaci nejsou kompatibilní, protože signatura skrývá zkratku. Zkratka musí být viditelná pro ostatní jazyky CLI. Zvažte zviditelnění zkratky v signatuře. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Neplatný výraz záznamu, pořadí nebo výpočtu. Výrazy pořadí by měly mít notaci seq {{ ... }}. + Neplatný výraz záznamu, pořadí nebo výpočtu. Výrazy pořadí by měly mít notaci seq {{ ... }}. @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Toto není platný název aktivního vzoru. + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - Pro F#7 a nižší se definice statických hodnot dají použít jenom v typech s primárním konstruktorem ('type X(args) = ...'). Pokud je chcete povolit ve všech ostatních typech, použijte jazykovou verzi „preview“. + Pro definice F#7 a nižší, „static let“, „do“ a „member val“ lze použít pouze v typech s primárním konstruktorem (typ X(args) = ...). Pokud je chcete povolit ve všech ostatních typech, použijte jazyk verze 8 nebo vyšší. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Zadejte typ ladění: full, portable, embedded, pdbonly. ({0} je výchozí hodnota v případě, že není zadaný žádný typ ladění, a umožňuje připojení ladicího programu ke spuštěnému programu, portable je formát pro různé platformy, embedded je formát pro různé platformy vložený do výstupního souboru). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ Hodnota {0} má označení inline, ale není svázaná s prostředím optimalizace. - - Local value {0} not found during optimization - Lokální hodnota {0} se během optimalizace nenašla. - - A value marked as 'inline' has an unexpected value Hodnota s označením inline má neočekávanou hodnotu. @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Tento literál bajtového pole obsahuje znaky, které se nekódují jako jednobajtové. + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Neplatné číslo s plovoucí desetinnou čárkou - + This number is outside the allowable range for decimal literals Toto číslo je mimo povolený rozsah pro desítkové literály. - + This number is outside the allowable range for 32-bit floats Toto číslo je mimo povolený rozsah pro 32bitové číslo s plovoucí desetinnou čárkou. @@ -6392,11 +6627,6 @@ Toto není platný číselný literál. Platné číselné literály zahrnují hodnoty 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1.0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint). - - This is not a valid byte literal - Toto není platný bajtový literál. - - This is not a valid character literal Toto není platný znakový literál. @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - Rezidentní kompilační služba se nepoužila, protože došlo k potížím při komunikaci se serverem. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Při použití statických argumentů u poskytnutého typu došlo k chybě. + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Základní atribut TypeProviderAssembly sestavení {0} má neplatnou hodnotu {1}. Hodnotou by měl být platný název sestavení. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Při použití statických argumentů u poskytnuté metody došlo k chybě. + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Pokud je typ sjednocení s více písmeny struktura, musí mít všechny případy sjednocení jedinečné názvy. Příklad: 'type A = B of b: int | C z c: int - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Atribut CallerMemberNameAttribute použitý pro parametr {0} nebude mít žádný účinek. Přepisuje ho atribut CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Slouží k uvození bloku kódu, který může vygenerovat výjimku. Používá se společně s with nebo finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - Nejde volat metodu rozšíření byref {0}. První parametr vyžaduje, aby hodnota byla měnitelná nebo typu byref, která není jen pro čtení. + Nejde volat metodu rozšíření byref {0}. Parametr „this“ vyžaduje, aby hodnota byla měnitelná nebo typu byref, která není jen pro čtení. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - Klíč správce balíčků „{0}“ nebyl v {1} zaregistrován. Aktuálně zaregistrováno: {2}. Další informace o rozšířeních najdete tady: https://aka.ms/dotnetdepmanager + Klíč správce balíčků „{0}“ nebyl v {1} zaregistrován. Aktuálně zaregistrováno: {2}. Cesty navíc můžete zadat tak, že do příkazového řádku předáte --compilertool:<extensionsfolder>. Další informace o rozšířeních najdete tady: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.de.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.de.xlf index d9def2b9c6..3e0443ea3b 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.de.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.de.xlf @@ -52,6 +52,11 @@ Dieser Ausdruck ist ein anonymer Datensatz. Verwenden Sie {{|...|}} anstelle von {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Doppelter Parameter. Der Parameter „{0}“ wurde in dieser Methode mehrmals verwendet. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + Getter und Setter einer indizierten Eigenschaft müssen denselben Typ aufweisen. Eigenschaft "{0}" hat einen Getter vom Typ "{1}", jedoch einen Setter vom Typ "{2}". @@ -122,14 +127,24 @@ Der Member oder die Funktion "{0}" weist das Attribut "TailCallAttribute" auf, wird jedoch nicht endrekursiv verwendet. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Ein statischer abstrakter, nicht virtueller Schnittstellenmember sollte nur über den Typparameter aufgerufen werden (z. B. „T.{0}"). + + + + Classes cannot contain static abstract members. + Klassen dürfen keine statischen abstrakten Member enthalten. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Objektausdrücke können keine Schnittstellen mit statischen abstrakten Membern implementieren oder statische Member deklarieren. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + Das Attribut "TailCall" darf nur auf rekursive Funktionen angewendet werden. @@ -147,6 +162,11 @@ Verfügbare Überladungen:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + "{0}" unterstützt den Typ "{1}" nicht, da letzteres nicht das erforderliche (echte oder integrierte) Element "{2}" aufweist. + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. Für ein generisches Konstrukt muss ein generischer Typparameter als Struktur- oder Verweistyp bekannt sein. Erwägen Sie das Hinzufügen einer Typanmerkung. @@ -177,6 +197,11 @@ Bekannter Typparameter: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match Das Argument bei Index {0} stimmt nicht überein. @@ -187,6 +212,16 @@ Das Argument "{0}" stimmt nicht überein. + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent Die Einschränkungen "unmanaged" und "not struct" sind nicht konsistent. @@ -212,6 +247,11 @@ Das Assemblyattribut "{0}" verweist auf eine Designerassembly "{1}", die entweder nicht geladen werden kann oder nicht vorhanden ist. Gemeldete Ausnahme: {2} – {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function Unterstrich-Punkt-Kurzschreibweise für Accessorfunktion @@ -222,6 +262,16 @@ zusätzliche typgesteuerte Konvertierungen + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions applikative Berechnungsausdrücke @@ -242,6 +292,11 @@ Automatische Generierung der Eigenschaft „Message“ für „exception“-Deklarationen + + Boolean-returning and return-type-directed partial active patterns + Teilweise aktive boolesche Rückgabemuster und rückgabetypgesteuerte Muster + + Allow implicit Extension attribute on declaring types, modules Implizites Erweiterungsattribut für deklarierende Typen und Module zulassen @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Löst Warnungen aus, wenn das Attribut "TailCall" für nicht rekursive Funktionen verwendet wird. @@ -272,16 +327,36 @@ Informationen zur Problembehebung bezüglich der Auflösung von Delegattypnamen finden Sie unter https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding Das Verwerfen des verwendeten Musters ist verbindlich. + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal punktloses float32-Literal + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + AttributeTargets erzwingen + + Raises errors for non-virtual members overrides Löst Fehler für Außerkraftsetzungen nicht virtueller Member aus. @@ -362,6 +437,21 @@ Schnittstellen mit mehrfacher generischer Instanziierung + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Optimiert interpolierte Zeichenfolgen in bestimmten Fällen, indem auf Verkettung herabgesetzt wird. + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Optimiert bestimmte Verwendungen der Operatoren des integralen Bereichs (..) und des Bereichsschritts (.. ..) für schnelle WHILE-Schleifen. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute DU in Kleinbuchstaben zulassen, wenn requireQualifiedAccess-Attribut @@ -402,6 +492,11 @@ Interop, NULL-Werte zulassend, optional + + nullness checking + nullness checking + + open type declaration Deklaration für offene Typen @@ -417,9 +512,24 @@ Paketverwaltung + + # directives with non-quoted string arguments + # Direktiven mit Zeichenfolgenargumenten ohne Anführungszeichen + + + + Unexpected identifier '{0}'. + Unerwarteter Bezeichner: "{0}". + + + + Unexpected integer literal '{0}'. + Unerwartetes Ganzzahl-Literal "{0}". + + prefer extension method over plain property - prefer extension method over plain property + Erweiterungsmethode gegenüber plain-Eigenschaft bevorzugen @@ -443,8 +553,8 @@ - whitespace relexation - Lockerung für Leerraum + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Teilen sie zugrunde liegende Felder in einen [<Struct>]-diskriminierten Union, solange sie denselben Namen und Typ aufweisen. @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Eigenschaften von Union-Falltests @@ -517,9 +627,14 @@ Interop zwischen nicht verwalteter generischer Einschränkung in C# und F# (zusätzlicher ModReq ausgeben) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + Getter und Setter für indizierte Eigenschaften müssen denselben Typ aufweisen. @@ -647,6 +762,11 @@ Wird in Berechnungsausdrücken zum Bereitstellen eines Schleifenkonstrukts verwendet, bei dem die Bedingung das Ergebnis eines anderen Berechnungsausdrucks ist. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated Eine Bytezeichenfolge darf nicht interpoliert werden. @@ -662,11 +782,26 @@ IF-FSHARP-/IF-CAML-Regionen werden nicht mehr unterstützt + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Dies ist kein gültiger Bezeichner. + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. Ein }}-Zeichen muss in einer interpolierten Zeichenfolge (durch Verdoppeln) mit Escapezeichen versehen werden. @@ -772,6 +907,11 @@ Drucken der abgeleiteten Schnittstellen aller Dateien an zugehörige Signaturdateien + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Löschen Sie den Ergebniscache des Paketmanagers @@ -807,6 +947,11 @@ Der Name der PDB-Ausgabedatei kann nicht mit dem Ausgabedateinamen für den Build übereinstimmen, verwenden Sie --pdb:filename.pdb + + Generate assembly with IL visibility that matches the source code visibility + Assembly mit IL-Sichtbarkeit generieren, die der Quellcodesichtbarkeit entspricht + + Produce a reference assembly, instead of a full assembly, as the primary output Erstellen einer Referenzassembly anstelle einer vollständigen Assembly als primäre Ausgabe @@ -912,21 +1057,26 @@ Ausdruck wird erwartet - - Expecting record field - Expecting record field - - Expecting pattern Muster wird erwartet + + Expecting record field + Expecting record field + + Expecting type Typ wird erwartet + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Unvollständiges Zeichenliteral (Beispiel: „Q“) oder qualifizierter Typaufruf (Beispiel: „T.Name“) @@ -957,9 +1107,14 @@ Dieser Memberzugriff ist mehrdeutig. Setzen Sie Klammern um die Objekterstellung, z. B. "(new SomeType(args)). MemberName“ + + Only simple patterns are allowed in primary constructors + In primären Konstruktoren sind nur einfache Muster zulässig + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Unvollständige Deklaration eines statischen Konstrukts. Verwenden Sie "static let", "static do", "static member" oder "static val" für die Deklaration. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - In der fortsetzbaren Codespezifikation ist ein eingeschränktes generisches Konstrukt aufgetreten. + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - "Let rec" ist in der fortsetzbaren Codespezifikation aufgetreten. + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Empfohlener Name) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Dieses aktive Muster erwartet {0} Ausdrucksargumente, z. B. „{1}{2}“. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Dieses aktive Muster erwartet {0} Ausdrucksargumente und ein Musterargument, z. B. „{1}{2} pat“. + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Dieses aktive Muster erwartet keine Argumente, d. h., es sollte wie folgt verwendet werden: „{0}“ anstelle von „{1} x“. + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Dieses aktive Muster erwartet genau ein Musterargument, z. B. „{0} pat“. + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. Die Bedeutung von "_" ist hier mehrdeutig. Dieses Zeichen kann nicht in demselben Bereich für eine verworfene Variable und ein Funktionskürzel verwendet werden. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + Die Lambdasyntax der Kurzform wird nur für atomische Ausdrücke wie Methode, Eigenschaft, Feld oder Indexer für das implizite Argument "_" unterstützt. Beispiel: "let f = _. Länge". + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Dies ist eine Funktionsdefinition, die einen Union-Fall überschatten kann. Wenn Sie dies wünschen, ignorieren oder unterdrücken Sie diese Warnung. Wenn es sich um eine Dekonstruktion des Union-Falls handelt, fügen Sie Klammern hinzu. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - Die folgenden erforderlichen Eigenschaften müssen initialisiert werden:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Es wurde kein abstrakter Member gefunden, der dieser Überschreibung entspricht. No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Es wurde keine statische abstrakte Eigenschaft gefunden, die dieser Überschreibung entspricht. @@ -1327,6 +1517,16 @@ Der Wert "{0}" ist keine Funktion und unterstützt keine Indexnotation. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. Die Syntax "expr1[expr2]" ist mehrdeutig, wenn sie als Argument verwendet wird. Siehe https://aka.ms/fsharp-index-notation. Wenn Sie indizieren oder aufteilen möchten, müssen Sie "expr1.[expr2]' in Argumentposition verwenden. Wenn Sie eine Funktion mit mehreren geschweiften Argumenten aufrufen, fügen Sie ein Leerzeichen dazwischen hinzu, z. B. "someFunction expr1 [expr2]". @@ -1352,6 +1552,41 @@ Die Syntax "(expr1)[expr2]" ist jetzt für die Indizierung reserviert und mehrdeutig, wenn sie als Argument verwendet wird. Siehe https://aka.ms/fsharp-index-notation. Wenn Sie eine Funktion mit mehreren geschweiften Argumenten aufrufen, fügen Sie ein Leerzeichen dazwischen hinzu, z. B. "someFunction (expr1) [expr2]". + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods Das Konstrukt "let! ... and! ..." kann nur verwendet werden, wenn der Berechnungsausdrucks-Generator entweder eine {0}-Methode oder geeignete MergeSources- und Bind-Methoden definiert. @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Ungültiger fortsetzbarer Code. "Let rec" ist in der fortsetzbaren Codespezifikation aufgetreten + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Wenn ein Union-Typ mit mehreren Großbuchstaben eine Struktur ist, müssen alle Felder mit demselben Namen denselben Typ aufweisen. Diese Regel gilt auch für den generierten Elementnamen bei unbenannten Feldern. @@ -1437,6 +1672,11 @@ Ein Merkmal darf keine Argumente für „optional“, „in“, „out“, „ParamArray“", „CallerInfo“ oder „Quote“ angeben. + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Ungültige interpolierte Zeichenfolge. {0} @@ -1457,6 +1697,11 @@ Das Deklarieren von \"Schnittstellen mit statischen abstrakten Methoden\" ist ein erweitertes Feature. Anleitungen finden Sie unter https://aka.ms/fsharp-iwsams. Sie können diese Warnung deaktivieren, indem Sie „#nowarn \"3535\"“ or „--nowarn:3535“ verwenden. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + Der Typ "{0}" weist zu viele Methoden auf. Gefunden: "{1}", Maximum: "{2}" + + Interface member '{0}' does not have a most specific implementation. Der Schnittstellenmember "{0}" weist keine spezifischste Implementierung auf. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Klammern können entfernt werden. @@ -2232,11 +2477,6 @@ Die {0} Definitionen für den Typ "{1}" in der Signatur und Implementierung sind nicht kompatibel, weil in der Signatur "{2}", in der Implementierung hingegen "{3}" deklariert wird. - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Die {0} Definitionen für den Typ "{1}" in der Signatur und in der Implementierung sind aufgrund unterschiedlicher Abkürzungen nicht kompatibel: {2} und {3}. - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Die {0} Definitionen für den Typ "{1}" in der Signatur und in der Implementierung sind nicht kompatibel, weil eine Abkürzung von einer Signatur verdeckt wird. Die Abkürzung muss für andere CLI-Sprachen sichtbar sein. Sorgen Sie dafür, dass die Abkürzung in der Signatur sichtbar ist. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Ungültiger Datensatz-, Sequenz- oder Berechnungsausdruck. Sequenzausdrücke müssen das Format "seq {{ ... }}" besitzen. + Ungültiger Datensatz-, Sequenz- oder Berechnungsausdruck. Sequenzausdrücke müssen das Format "seq {{ ... }}" besitzen. @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Dies ist kein gültiger Name für ein aktives Muster. + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - Für F# 7 und früher dürfen statische Wertdefinitionen nur in Typen mit einem primären Konstruktor verwendet werden (type X(args) = ...). Um sie in anderen Typen zu aktivieren, verwenden Sie die Sprachversion "preview". + Für F# 7 und früher dürfen die statische Definitionen "let", "do" und "member" nur in Typen mit einem primären Konstruktor verwendet werden (type X(args) = ...). Um sie in anderen Typen zu aktivieren, verwenden Sie die Sprachversion "8" oder höher. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Geben Sie den Debugtyp an: full, portable, embedded, pdbonly. ("{0}" ist der Standardwert, wenn kein Debugtyp angegeben wird, und ermöglicht das Anfügen eines Debuggers an ein aktuell ausgeführtes Programm. "portable" ist ein plattformübergreifendes Format, "embedded" ein plattformübergreifendes, in die Ausgabedatei eingebettetes Format). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ Der Wert "{0}" war als inline markiert, aber nicht in der Optimierungsumgebung gebunden. - - Local value {0} not found during optimization - Der lokale Wert "{0}" wurde während der Optimierung nicht gefunden. - - A value marked as 'inline' has an unexpected value Ein als "inline" markierter Wert hat einen unerwarteten Wert. @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Dieses Bytearrayliteral enthält Zeichen, die sich nicht als einzelnes Byte codieren lassen. + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Ungültige Gleitkommazahl. - + This number is outside the allowable range for decimal literals Diese Zahl liegt außerhalb des zulässigen Bereichs für Dezimalliterale. - + This number is outside the allowable range for 32-bit floats Diese Zahl liegt außerhalb des zulässigen Bereichs für 32-Bit-Gleitkommastellen. @@ -6392,11 +6627,6 @@ Dies ist kein gültiges numerisches Literal. Unter anderem sind die folgenden numerischen Literale gültig: 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1.0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint). - - This is not a valid byte literal - Dies ist kein gültiges Byteliteral. - - This is not a valid character literal Dies ist kein gültiges Zeichenliteral. @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - Der residente Kompilierungsdienst wurde nicht verwendet, da bei der Kommunikation mit dem Server ein Problem aufgetreten ist. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Fehler beim Anwenden des statischen Arguments auf einen angegebenen Typ. + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Assembly '{0}' verfügt über ein TypeProviderAssembly-Attribut mit dem ungültigen Wert '{1}'. Beim Wert sollte es sich um einen gültigen Assemblynamen handeln. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Fehler beim Anwenden der statischen Argumente auf eine angegebene Methode. + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Wenn ein Mehrfach-Union-Typ eine Struktur ist, müssen alle Union-Fälle eindeutige Namen aufweisen. Beispiel: „type A = B von b: int | C von c: int“. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Das auf Parameter "{0}" angewendete CallerMemberNameAttribute hat keine Auswirkung. Es wird vom CallerFilePathAttribute überschrieben. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Wird verwendet, um einen Codeblock einzuführen, der unter Umständen eine Ausnahme generiert. Wird zusammen mit "with" oder "finally" verwendet. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - Die ByRef-Erweiterungsmethode "{0}" kann nicht aufgerufen werden. Für den ersten Parameter muss der Wert änderbar sein oder einem nicht schreibgeschützten ByRef-Typ entsprechen. + Die ByRef-Erweiterungsmethode "{0}" kann nicht aufgerufen werden. Für den Parameter „this“ muss der Wert änderbar sein oder einem nicht schreibgeschützten ByRef-Typ entsprechen. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - Der Paket-Manager-Schlüssel "{0}" wurde nicht in "{1}" registriert. Zurzeit registriert: {2}. Weitere Informationen zu Erweiterungen finden Sie unter: https://aka.ms/dotnetdepmanager + Der Paket-Manager-Schlüssel "{0}" wurde nicht in "{1}" registriert. Zurzeit registriert: {2}. Sie können zusätzliche Pfade angeben, indem Sie "--compilertool:<extensionsfolder>" an die Befehlszeile übergeben. Weitere Informationen zu Erweiterungen finden Sie unter: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.es.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.es.xlf index 6a6959dc58..ecadc24a02 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.es.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.es.xlf @@ -52,6 +52,11 @@ Esta expresión es un registro anónimo; use {{|...|}} en lugar de {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Parámetro duplicado. El parámetro '{0}' se ha usado más una vez en este método. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + El captador y el establecedor de una propiedad indexada deben tener el mismo tipo. La propiedad '{0}' tiene un captador de tipo '{1}', pero el establecedor es de tipo '{2}'. @@ -122,14 +127,24 @@ El miembro o la función “{0}” tiene el atributo “TailCallAttribute”, pero no se usa de forma de recursión de cola. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Solo se debe llamar a un miembro de interfaz no virtual abstracto estático mediante un parámetro de tipo (por ejemplo: "T.{0}). + + + + Classes cannot contain static abstract members. + Las clases no pueden contener miembros abstractos estáticos. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Las expresiones de objeto no pueden implementar interfaces con miembros abstractos estáticos ni declarar miembros estáticos. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + El atributo TailCall solo se debe aplicar a funciones recursivas. @@ -147,6 +162,11 @@ Sobrecargas disponibles:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + '{0}' no admite el tipo '{1}', porque a este último le falta el '{2}' de miembro necesario (real o integrado) + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. Una construcción genérica requiere que un parámetro de tipo genérico se conozca como tipo de referencia o estructura. Puede agregar una anotación de tipo. @@ -177,6 +197,11 @@ Parámetro de tipo conocido: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match El argumento del índice {0} no coincide. @@ -187,6 +212,16 @@ El argumento "{0}" no coincide. + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent Las restricciones “no administrado” y "no estructurado" son incoherentes @@ -212,6 +247,11 @@ El atributo de ensamblado "{0}" hace referencia a un ensamblado de diseñador "{1}" que no se puede cargar o no existe. Se notificó la excepción: {2} - {3}. + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function forma abreviada de punto y guion bajo para la función de solo descriptor de acceso @@ -222,6 +262,16 @@ conversiones adicionales dirigidas a tipos + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions expresiones de cálculo aplicativas @@ -242,6 +292,11 @@ generación automática de la propiedad 'Message' para declaraciones 'exception' + + Boolean-returning and return-type-directed partial active patterns + Patrones activos parciales de devolución booleana y de tipo devuelto dirigido + + Allow implicit Extension attribute on declaring types, modules Permitir atributo Extension implícito en tipos declarativo, módulos @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Genera advertencias si el atributo 'TailCall' se usa en funciones no recursivas. @@ -272,16 +327,36 @@ corrección para la resolución de nombres de tipo de delegado, consulte https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding descartar enlace de patrón en uso + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal literal float32 sin punto + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + Aplicar AttributeTargets + + Raises errors for non-virtual members overrides Genera errores para invalidaciones de miembros no virtuales @@ -362,6 +437,21 @@ interfaces con creación de instancias genéricas múltiples + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Optimiza las cadenas interpoladas en determinados casos mediante la reducción a la concatenación + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Optimiza ciertos usos de los operadores de intervalo entero (..) y paso de intervalo (.. ..) para acelerar los bucles while. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute Permitir DU en minúsculas con el atributo RequireQualifiedAccess @@ -402,6 +492,11 @@ interoperabilidad opcional que admite valores NULL + + nullness checking + nullness checking + + open type declaration declaración de tipo abierto @@ -417,9 +512,24 @@ administración de paquetes + + # directives with non-quoted string arguments + # directivas con argumentos de cadena sin comillas + + + + Unexpected identifier '{0}'. + Identificador inesperado "{0}". + + + + Unexpected integer literal '{0}'. + Literal entero inesperado "{0}". + + prefer extension method over plain property - prefer extension method over plain property + preferir método de extensión sobre propiedad sin formato @@ -443,8 +553,8 @@ - whitespace relexation - relajación de espacio en blanco + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Compartir campos subyacentes en una unión discriminada [<Struct>] siempre y cuando tengan el mismo nombre y tipo @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Propiedades de prueba de caso de unión @@ -517,9 +627,14 @@ Interoperabilidad entre la restricción genérica no administrada de C# y F# (emitir modreq adicional) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + El captador y el establecedor de propiedades indexadas deben tener el mismo tipo. @@ -647,6 +762,11 @@ Se usa en expresiones de cálculo para introducir una construcción de bucle donde la condición es el resultado de otra expresión de cálculo. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated no se puede interpolar una cadena de bytes @@ -662,11 +782,26 @@ Ya no se admiten las regiones IF-FSHARP/IF-CAML + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Este nombre no es un identificador válido. + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. El carácter "}}" se debe escapar (duplicándose) en las cadenas interpoladas. @@ -772,6 +907,11 @@ Imprimir las interfaces deducidas de todos los archivos de compilación en los archivos de signatura asociados + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Borrar la caché de resultados del administrador de paquetes @@ -807,6 +947,11 @@ El nombre del archivo de salida pdb no puede coincidir con el nombre de archivo de salida de compilación. Use --pdb:filename.pdb + + Generate assembly with IL visibility that matches the source code visibility + Generación de un ensamblado con visibilidad IL que coincida con la visibilidad del código fuente + + Produce a reference assembly, instead of a full assembly, as the primary output Generar un ensamblado de referencia, en lugar de un ensamblado completo, como salida principal @@ -912,21 +1057,26 @@ Se espera una expresión - - Expecting record field - Expecting record field - - Expecting pattern Se espera un patrón + + Expecting record field + Expecting record field + + Expecting type Tipo esperado + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Literal de carácter incompleto (ejemplo: 'Q') o invocación de tipo completo (ejemplo: 'T.Name) @@ -957,9 +1107,14 @@ Este acceso de miembro es ambiguo. Use paréntesis alrededor de la creación del objeto, por ejemplo, '(nuevo AlgúnTipo(args)).NombreMiembro' + + Only simple patterns are allowed in primary constructors + Solo se permiten patrones simples en constructores principales + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Declaración incompleta de una construcción estática. Use "static let", "static do", "static member" o "static val" para la declaración. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - En la especificación del código resumible aparecía una construcción genérica restringida + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - Se ha producido "let rec" en la especificación de código reanudable + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Nombre sugerido) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Este patrón activo espera {0} argumentos de expresión; por ejemplo, "{1}{2}". + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Este patrón activo espera {0} argumentos de expresión y un argumento de patrón, por ejemplo, "{1}{2} pat". + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Este patrón activo no espera argumentos, es decir, debe usarse como "{0}" en lugar de "{1} x". + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Este patrón activo espera exactamente un argumento de patrón, por ejemplo, "{0} pat". + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. El significado de _ es ambiguo aquí. No se puede usar para una variable descartada y una función abreviada en el mismo ámbito. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + La sintaxis lambda abreviada solo se admite para expresiones atómicas, como el método, la propiedad, el campo o el indexador en el argumento '_' implícito. Por ejemplo: 'let f = _.Length'. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Esta es una definición de función que oculta un caso de unión. Si esto es lo que desea, omita o suprima esta advertencia. Si desea que sea una desconstrucción de caso de unión, agregue paréntesis. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - Se deben inicializar las siguientes propiedades necesarias:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + No se encontró ningún miembro abstracto estático que corresponda a esta invalidación. No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + No se encontró ninguna propiedad abstracta estática que corresponda a esta invalidación. @@ -1327,6 +1517,16 @@ El valor "{0}" no es una función y no admite la notación de índices. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. La sintaxis "expr1[expr2]" es ambigua cuando se usa como argumento. Vea https://aka.ms/fsharp-index-notation. Si piensa indexar o segmentar, debe usar "expr1.[expr2]" en la posición del argumento. Si se llama a una función con varios argumentos currificados, se agregará un espacio entre ellos, por ejemplo, "unaFunción expr1 [expr2]". @@ -1352,6 +1552,41 @@ La sintaxis "(expr1)[expr2]" está reservada ahora para la indexación y es ambigua cuando se usa como argumento. Vea https://aka.ms/fsharp-index-notation. Si se llama a una función con varios argumentos currificados, agregue un espacio entre ellos, por ejemplo, "unaFunción (expr1) [expr2]". + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods La construcción "let! ... and! ..." solo se puede usar si el generador de expresiones de cálculo define un método "{0}" o bien los métodos "MergeSources" y "Bind" adecuados. @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Código reanudable no válido. Se ha producido "let rec" en la especificación de código reanudable + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Si un tipo de unión multicase es un struct, todos los campos con el mismo nombre deben ser del mismo tipo. Esta regla se aplica también al nombre "Item" generado en el caso de campos sin nombre. @@ -1437,6 +1672,11 @@ Un rasgo no puede especificar argumentos opcionales, in, out, ParamArray, CallerInfo o Quote + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Cadena interpolada no válida. {0} @@ -1457,6 +1697,11 @@ Declarar \"interfaces con métodos abstractos estáticos\" es una característica avanzada. Consulte https://aka.ms/fsharp-iwsams para obtener instrucciones. Puede deshabilitar esta advertencia con "#nowarn \"3535\"" o "--nowarn:3535". + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + El tipo '{0}' tiene demasiados métodos. Encontrado: '{1}', máximo: '{2}' + + Interface member '{0}' does not have a most specific implementation. El miembro de interfaz "{0}" no tiene una implementación más específica. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Los paréntesis se pueden quitar. @@ -2232,11 +2477,6 @@ Las definiciones de {0} para el tipo "{1}" en la signatura y la implementación no son compatibles porque la signatura declara un {2} mientras la implementación declara un {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Las definiciones de {0} para el tipo "{1}" de la signatura y la implementación no son compatibles porque las abreviaciones difieren: {2} frente a {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Las definiciones de {0} para el tipo "{1}" de la signatura y la implementación no son compatibles porque una signatura oculta una abreviación. La abreviación debe estar visible para otros lenguajes CLI. Considere hacer que la abreviación esté visible en la signatura. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Expresión de registro, secuencia o cómputo no válida. Las expresiones de secuencia deben tener el formato 'seq {{ ... }}'. + Expresión de registro, secuencia o cómputo no válida. Las expresiones de secuencia deben tener el formato 'seq {{ ... }}'. @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Este no es un nombre válido para un patrón activo. + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - Para F#7 y versiones anteriores, las definiciones de valores estáticos solo se pueden usar en tipos con un constructor principal ('type X(args) = ...'). Para habilitarlos en todos los demás tipos, use la versión de idioma "preview". + Para F#7 y versiones anteriores, las definiciones estáticas 'let','do' y 'member val' solo se pueden usar en tipos con un constructor principal ('type X(args) = ...'). Para habilitarlos en todos los demás tipos, use la versión de idioma "8" o una versión posterior. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Especifique el tipo de depuración: full, portable, embedded, pdbonly. ('{0}' es el valor predeterminado si no se especifica ningún tipo de depuración y permite conectar un depurador a un programa en ejecución, 'portable' es un formato multiplataforma, 'embedded' es un formato multiplataforma insertado en el archivo de salida). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ El valor '{0}' estaba marcado como inline pero no estaba enlazado en el entorno de optimización. - - Local value {0} not found during optimization - No se encontró el valor local {0} durante la optimización. - - A value marked as 'inline' has an unexpected value Un valor marcado como 'inline' tiene un valor inesperado. @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Este literal de matriz de bytes contiene caracteres que no se codifican como un solo byte. + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Número de punto flotante no válido. - + This number is outside the allowable range for decimal literals Este número está fuera del intervalo permitido para literales decimales. - + This number is outside the allowable range for 32-bit floats Este número está fuera del intervalo permitido para flotantes de 32 bits. @@ -6392,11 +6627,6 @@ Este literal numérico no es válido. Entre los literales numéricos válidos se incluyen 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1.0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint). - - This is not a valid byte literal - Este no es un literal de byte válido. - - This is not a valid character literal Este no es un literal de carácter válido. @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - El servicio de compilación residente no se usó porque se produjo un problema en la comunicación con el servidor. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Error al aplicar los argumentos estáticos a un tipo proporcionado. + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - El ensamblado '{0}' tiene el atributo TypeProviderAssembly con el valor '{1}' no válido. El valor debe ser un nombre de ensamblado válido. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Se produjo un error al aplicar los argumentos estáticos a un método proporcionado + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Si un tipo de unión multicase es un struct, todos los casos de unión deben tener nombres únicos. Por ejemplo: 'type A = B of b: int | C of c: int'. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - El CallerMemberNameAttribute aplicado al parámetro '{0}' no tendrá ningún efecto. Este se reemplaza por CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Se usa para incluir un bloque de código que puede generar una excepción. Se usa junto con with o finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - No se puede llamar al método de extensión de byref "{0}". El primer parámetro requiere que el valor sea mutable o un tipo de byref que no sea de solo lectura. + No se puede llamar al método de extensión de byref "{0}". El parámetro 'this' requiere que el valor sea mutable o un tipo byref no de solo lectura. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - La clave del administrador de paquetes "{0}" no se registró en {1}. Registrado actualmente: {2}. Para obtener más información sobre las extensiones, visite https://aka.ms/dotnetdepmanager + La clave del administrador de paquetes "{0}" no se registró en {1}. Registrado actualmente: {2}. Puede proporcionar rutas adicionales pasando '--compilertool:<extensionsfolder>' a la línea de comando. Para obtener más información sobre las extensiones, visite https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.fr.xlf index 8bf1b97e9b..7a9769e0d2 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.fr.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.fr.xlf @@ -52,6 +52,11 @@ Cette expression est un enregistrement anonyme, utilisez {{|...|}} au lieu de {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Paramètre dupliqué. Le paramètre « {0} » a été utilisé une fois de plus dans cette méthode. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + Les méthodes getter et setter d’une propriété indexée doivent avoir le même type. La propriété « {0} » a une méthode getter de type « {1} » alors que sa méthode setter est de type « {2} ». @@ -122,14 +127,24 @@ Le membre ou la fonction « {0} » possède l'attribut « TailCallAttribute », mais n'est pas utilisé de manière récursive. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Un membre d’interface non virtuel abstrait statique doit être appelé uniquement via le paramètre de type (par exemple : 'T.{0}). + + + + Classes cannot contain static abstract members. + Les classes ne peuvent pas contenir de membres abstraits statiques. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Les expressions d’objet ne peuvent pas implémenter des interfaces avec des membres abstraits statiques ou déclarer des membres statiques. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + L’attribut TailCall ne doit être appliqué qu’aux fonctions récursives. @@ -147,6 +162,11 @@ Surcharges disponibles :\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + '{0}' ne prend pas en charge le type '{1}', car ce dernier n'a pas le membre requis (réel ou intégré) '{2}' + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. L'utilisation d'une construction générique est possible uniquement si un paramètre de type générique est connu en tant que type struct ou type référence. Ajoutez une annotation de type. @@ -177,6 +197,11 @@ Paramètre de type connu : {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match L'argument à l'index {0} ne correspond pas @@ -187,6 +212,16 @@ L'argument '{0}' ne correspond pas + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent Les contraintes « non gérées » et « non structurées » sont incohérentes @@ -212,6 +247,11 @@ L'attribut d'assembly '{0}' fait référence à un assembly de concepteur '{1}' qui ne peut pas être chargé ou qui n'existe pas. Exception signalée : {2} - {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function raccourci de point de soulignement pour la fonction d'accesseur uniquement @@ -222,6 +262,16 @@ conversions supplémentaires dirigées vers le type + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions expressions de calcul applicatives @@ -242,6 +292,11 @@ génération automatique de la propriété « Message » pour les déclarations « exception » + + Boolean-returning and return-type-directed partial active patterns + Modèles actifs partiels à retour booléen et orientés par le type de retour + + Allow implicit Extension attribute on declaring types, modules Autoriser l’attribut implicite Extension lors de la déclaration des types, modules @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Émet des avertissements si l’attribut « TailCall » est utilisé sur des fonctions non récursives. @@ -272,16 +327,36 @@ corriger pour résoudre les noms de types délégués, voir https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding annuler le modèle dans la liaison d’utilisation + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal littéral float32 sans point + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + Appliquer AttributeTargets + + Raises errors for non-virtual members overrides Déclenche des erreurs pour les remplacements de membres non virtuels @@ -362,6 +437,21 @@ interfaces avec plusieurs instanciations génériques + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Optimise des chaînes interpolées dans certains cas en réduisant la concaténation + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Optimise certaines utilisations des opérateurs de plage intégrale (..) et d’étape de plage (.. ..) en boucles while rapides. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute Autoriser les DU en minuscules pour l'attribut RequireQualifiedAccess @@ -402,6 +492,11 @@ interopérabilité facultative pouvant accepter une valeur null + + nullness checking + nullness checking + + open type declaration déclaration de type ouverte @@ -417,9 +512,24 @@ Package Management + + # directives with non-quoted string arguments + # directives avec des arguments de chaîne non entre guillemets + + + + Unexpected identifier '{0}'. + Identificateur inattendu '{0}'. + + + + Unexpected integer literal '{0}'. + Littéral entier inattendu '{0}'. + + prefer extension method over plain property - prefer extension method over plain property + préférer la méthode d’extension à la propriété simple @@ -443,8 +553,8 @@ - whitespace relexation - assouplissement de la mise en retrait avec des espaces blancs + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Partager les champs sous-jacents dans une union discriminée [<Struct>] tant qu’ils ont le même nom et le même type @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Propriétés du test de cas d’union @@ -517,9 +627,14 @@ Interopérabilité entre les contraintes génériques non gérées de C# et F# (émettre un modreq supplémentaire) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + Les propriétés indexées getter et setter doivent avoir le même type @@ -647,6 +762,11 @@ Utilisé dans les expressions de calcul pour introduire une construction en boucle où la condition est le résultat d'une autre expression de calcul. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated une chaîne d'octets ne peut pas être interpolée @@ -662,11 +782,26 @@ Les régions IF-FSHARP/IF-CAML ne sont plus prises en charge. + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Ceci n'est pas un identifiant valide + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. Un caractère '}}' doit faire l'objet d'une séquence d'échappement (par doublement) dans une chaîne interpolée. @@ -772,6 +907,11 @@ Imprimer les interfaces inférées de tous les fichiers de compilation sur les fichiers de signature associés + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Effacer le cache des résultats du Gestionnaire de package @@ -807,6 +947,11 @@ Le nom du fichier de sortie pdb ne peut pas correspondre au nom de fichier de sortie de build utilisé --pdb:filename.pdb. + + Generate assembly with IL visibility that matches the source code visibility + Générer un assembly avec une visibilité IL qui correspond à la visibilité du code source + + Produce a reference assembly, instead of a full assembly, as the primary output Produire un assembly de référence, au lieu d’un assembly complet, en tant que sortie principale @@ -912,21 +1057,26 @@ Expression attendue - - Expecting record field - Expecting record field - - Expecting pattern Modèle attendu + + Expecting record field + Expecting record field + + Expecting type Type attendu + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Littéral de caractère incomplet (exemple : 'Q') ou appel de type qualifié (exemple : 'T.Name) @@ -957,9 +1107,14 @@ L’accès à ce membre est ambigu. Utilisez des parenthèses autour de la création de l’objet, par exemple' (New SomeType (args)). MemberName + + Only simple patterns are allowed in primary constructors + Seuls les modèles simples sont autorisés dans les constructeurs principaux + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Déclaration incomplète d’une construction statique. Utilisez « static let », « static do », « static member » ou « static val » pour la déclaration. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - Une construction générique contrainte s'est produite dans la spécification de code de reprise + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - Un «let rec» s’est produit dans la spécification de code pouvant être repris + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Nom suggéré) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Ce modèle actif attend {0} argument(s) d’expression, par exemple, '{1}{2}'. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Ce modèle actif attend des arguments d'expression {0} et un argument de modèle, par exemple '{1}{2} pat'. + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Ce modèle actif n’attend aucun argument, c’est-à-dire qu’il doit être utilisé comme «{0}» au lieu de «{1} x ». + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Ce modèle actif attend exactement un argument de modèle, par exemple, «{0} pat ». + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. La signification de _ est ici ambiguë. Il ne peut pas être utilisé pour une variable ignorée et un raccourci de fonction dans la même portée. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + La syntaxe lambda raccourcie est prise en charge uniquement pour les expressions atomiques, telles que la méthode, la propriété, le champ ou l’indexeur sur l’argument ’_’ implicite. Par exemple : « let f = _. Longueur ». + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Il s’agit d’une définition de fonction qui masque un cas d’union. Si c’est ce que vous voulez, ignorez ou supprimez cet avertissement. Si vous voulez qu’il s’agit d’une déconstruction de cas d’union, ajoutez des parenthèses. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - Les propriétés requises suivantes doivent être initialisées :{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Désolé, nous n’avons pas pu trouver un membre abstrait statique qui corresponde à cette substitution No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Désolé, nous n’avons pas pu trouver une propriété abstraite statique qui corresponde à cette substitution @@ -1327,6 +1517,16 @@ La valeur « {0} » n’est pas une fonction et ne prend pas en charge la notation d’index. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. La syntaxe « expr1[expr2] » est ambiguë lorsqu’elle est utilisée comme argument. Voir https://aka.ms/fsharp-index-notation. Si vous avez l’intention d’indexer ou de découper, vous devez utiliser « expr1.[expr2] » en position d’argument. Si vous appelez une fonction avec plusieurs arguments codés, ajoutez un espace entre eux, par exemple « someFunction expr1 [expr2] ». @@ -1352,6 +1552,41 @@ La syntaxe « (expr1)[expr2] » est désormais réservée à l’indexation et est ambiguë lorsqu’elle est utilisée comme argument. Voir https://aka.ms/fsharp-index-notation. Si vous appelez une fonction avec plusieurs arguments codés, ajoutez un espace entre eux, par exemple « someFunction (expr1) [expr2] ». + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods Le « laissez ! » ... et! ...' ne peut être utilisée que si le générateur d'expression de calcul définit soit une méthode '{0}', soit des méthodes 'MergeSources' et 'Bind' appropriées. @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Code pouvant être reprise non valide. Un «let rec» s’est produit dans la spécification de code pouvant être repris + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Si un type union multicase est un struct, tous les champs portant le même nom doivent être du même type. Cette règle s’applique également au nom « Item » généré en cas de champs sans nom. @@ -1437,6 +1672,11 @@ Une caractéristique ne peut pas spécifier d’arguments facultatifs, in, out, ParamArray, CallerInfo ou Quote + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Chaîne interpolée non valide. {0} @@ -1457,6 +1697,11 @@ La déclaration de \"interfaces with static abstract methods\" est une fonctionnalité avancée. Consultez https://aka.ms/fsharp-iwsams pour obtenir de l’aide. Vous pouvez désactiver cet avertissement à l’aide de '#nowarn \"3535\"' or '--nowarn:3535'. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + Le type '{0}' a trop de méthodes. Trouvé : '{1}', maximum : '{2}' + + Interface member '{0}' does not have a most specific implementation. Le membre d'interface '{0}' n'a pas l'implémentation la plus spécifique. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Vous pouvez supprimer les parenthèses. @@ -2232,11 +2477,6 @@ Les {0} définitions pour le type '{1}' dans la signature et l'implémentation ne sont pas compatibles, car la signature déclare {2} alors que l'implémentation déclare {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Les {0} définitions pour le type '{1}' dans la signature et l'implémentation ne sont pas compatibles, car les abréviations sont différentes : {2} par opposition à {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Les {0} définitions pour le type '{1}' dans la signature et l'implémentation ne sont pas compatibles, car une abréviation est masquée par une signature. L'abréviation doit être visible par les autres langages CLI. Rendez l'abréviation visible dans la signature. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Expression d'enregistrement, de séquence ou de calcul non valide. Les expressions de séquence doivent avoir le format 'seq {{ ... }}' + Expression d'enregistrement, de séquence ou de calcul non valide. Les expressions de séquence doivent avoir le format 'seq {{ ... }}' @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Nom non valide pour un modèle actif + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - Pour F#7 et versions antérieures, les définitions de valeurs statiques ne peuvent être utilisées que dans les types avec un constructeur principal (« type X(args) = ... »). Pour les activer dans tous les autres types, utilisez la version linguistique « aperçu ». + Pour les définitions F#7 et inférieures, les définitions statiques « let », « do » et « member val » ne peuvent être utilisées que dans les types avec un constructeur principal (« type X(args) = ... »). Pour les activer dans tous les autres types, utilisez la version linguistique « 8 » ou ultérieure. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Spécifiez le type de débogage : full, portable, embedded, pdbonly. ('{0}' est la valeur par défaut si aucun type de débogage n'est spécifié. Cette valeur permet d'attacher un débogueur à un programme en cours d'exécution, 'portable' est un format multiplateforme, 'embedded' est un format multiplateforme incorporé dans le fichier de sortie). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ La valeur '{0}' a été marquée comme inline mais n'a pas été liée dans l'environnement d'optimisation - - Local value {0} not found during optimization - Valeur locale {0} introuvable durant l'optimisation - - A value marked as 'inline' has an unexpected value Une valeur marquée comme 'inline' a une valeur inattendue @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Ce littéral de tableau d'octets contient des caractères qui ne sont pas encodés sous forme d'octet unique + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Nombre à virgule flottante non valide - + This number is outside the allowable range for decimal literals Ce nombre se trouve en dehors de la plage autorisée pour les littéraux décimaux - + This number is outside the allowable range for 32-bit floats Ce nombre se trouve en dehors de la plage autorisée pour les valeurs float 32 bits @@ -6392,11 +6627,6 @@ Il ne s’agit pas d’un littéral numérique valide. Les littéraux numériques valides incluent 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1,0 (float/double), 1,0f (float32/single), 1,0 m (décimal), 1I (bigint). - - This is not a valid byte literal - Littéral d'octet non valide - - This is not a valid character literal Littéral de caractère non valide @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - Le service de compilation résident n'a pas été utilisé en raison d'un problème lors de la communication avec le serveur. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Une erreur s'est produite lors de l'application des arguments statiques à un type fourni + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - L'assembly '{0}' a un attribut TypeProviderAssembly comportant la valeur non valide '{1}'. La valeur doit être un nom d'assembly valide + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Une erreur s'est produite durant l'application des arguments statiques à une méthode fournie + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Si un type d’union multi-cas est un struct, alors tous les cas d’union doivent avoir des noms uniques. Par exemple : 'type A = B de b : int | C de c : int'. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - CallerMemberNameAttribute, qui est appliqué au paramètre '{0}', n'aura aucun effet. Il est remplacé par CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Permet d'introduire un bloc de code pouvant générer une exception. Utilisé avec with ou finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - Impossible d’appeler la méthode d’extension byref « {0} ». Le premier paramètre nécessite que la valeur soit mutable ou un type byref autre qu'en lecture seule. + Impossible d’appeler la méthode d’extension byref '{0}. Le paramètre 'this' nécessite que la valeur soit mutable ou un type byref non readonly. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - La clé du gestionnaire de packages « {0} » n'a pas été enregistrée dans {1}. Actuellement inscrit : {2}. Pour en savoir plus sur les extensions, visitez : https://aka.ms/dotnetdepmanager + La clé du gestionnaire de package «{0}» n’a pas été inscrite dans {1}. Actuellement inscrit : {2}. Vous pouvez fournir des chemins d’accès supplémentaires en passant « --compilertool :<extensionsfolder> » à la ligne de commande. Pour en savoir plus sur les extensions, consultez : https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.it.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.it.xlf index 135dbc86cf..1db94e74c4 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.it.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.it.xlf @@ -52,6 +52,11 @@ Questa espressione è un record anonimo. Usa {{|...|}} invece di {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Parametro duplicato. Il parametro '{0}' è stato utilizzato più volte in questo metodo. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + Il getter e il setter di una proprietà indicizzata devono essere dello stesso tipo. Il getter della proprietà '{0}' è di tipo '{1}', mentre il setter è di tipo '{2}'. @@ -122,14 +127,24 @@ Il membro o la funzione "{0}" ha l'attributo "TailCallAttribute", ma non è in uso in modo ricorsivo finale. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Un membro di interfaccia non virtuale astratto statico deve essere chiamato solo tramite un parametro di tipo, ad esempio 'T.{0}. + + + + Classes cannot contain static abstract members. + Le classi non possono contenere membri astratti statici. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Le espressioni di oggetto non possono implementare interfacce con membri astratti statici o dichiarare membri statici. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + L'attributo TailCall deve essere applicato solo a funzioni ricorsive. @@ -147,6 +162,11 @@ Overload disponibili:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + '{0}' non supporta il tipo '{1}', perché in quest'ultimo manca il membro '{2}' richiesto (reale o predefinito) + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. Un costrutto generico richiede che un parametro di tipo generico sia noto come tipo riferimento o struct. Provare ad aggiungere un'annotazione di tipo. @@ -177,6 +197,11 @@ Parametro di tipo noto: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match L'argomento alla posizione di indice {0} non corrisponde @@ -187,6 +212,16 @@ L'argomento '{0}' non corrisponde + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent I vincoli 'unmanaged' e 'not struct' sono incoerenti @@ -212,6 +247,11 @@ L'attributo di assembly '{0}' fa riferimento a un assembly '{1}' della finestra di progettazione che non è stato caricato o non esiste. L'eccezione restituita è {2} - {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function sintassi abbreviata del punto di sottolineatura solo per la funzione di accesso @@ -222,6 +262,16 @@ conversioni aggiuntive dirette ai tipi + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions espressioni di calcolo applicativo @@ -242,6 +292,11 @@ generazione automatica della proprietà 'Messaggio' per le dichiarazioni 'eccezione' + + Boolean-returning and return-type-directed partial active patterns + Criteri attivi parziali che restituiscono valori booleani e diretti dal tipo restituito + + Allow implicit Extension attribute on declaring types, modules Consentire l'attributo estensione implicito per i tipi dichiarabili, i moduli @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Genera avvisi se l'attributo 'TailCall' viene utilizzato in funzioni non ricorsive. @@ -272,16 +327,36 @@ correggere la risoluzione dei nomi dei tipi delegati, vedere https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding rimuovi criterio nell'utilizzo dell'associazione + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal valore letterale float32 senza punti + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + Imponi destinazioni attributo + + Raises errors for non-virtual members overrides Genera errori per gli override dei membri non virtuali @@ -362,6 +437,21 @@ interfacce con più creazioni di istanze generiche + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Ottimizza le stringhe interpolate in determinati casi, riducendosi alla concatenazione + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Ottimizza determinati utilizzi degli operatori di intervallo integrale (..) e di intervallo di fase (.. ..) in cicli while veloci. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute Consentire l’unione discriminata minuscola quando l'attributo RequireQualifiedAccess @@ -402,6 +492,11 @@ Interop facoltativo nullable + + nullness checking + nullness checking + + open type declaration dichiarazione di tipo aperto @@ -417,9 +512,24 @@ gestione pacchetti + + # directives with non-quoted string arguments + # direttive con argomenti stringa non delimitati + + + + Unexpected identifier '{0}'. + Identificatore non previsto: '{0}'. + + + + Unexpected integer literal '{0}'. + Valore letterale integer '{0}' imprevisto. + + prefer extension method over plain property - prefer extension method over plain property + preferisci il metodo di estensione alla proprietà normale @@ -443,8 +553,8 @@ - whitespace relexation - uso meno restrittivo degli spazi vuoti + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Condividi i campi sottostanti in un'unione discriminata di [<Struct>] purché abbiano lo stesso nome e tipo @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Proprietà test case di unione @@ -517,9 +627,14 @@ Interoperabilità tra il vincolo generico non gestito di C# e di F# (crea un modreq aggiuntivo) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + Il getter e il setter delle proprietà indicizzate devono avere lo stesso tipo @@ -647,6 +762,11 @@ Usato nelle espressioni di calcolo per introdurre un costrutto con riprodurre a ciclo continuo in cui la condizione è il risultato di un'altra espressione di calcolo. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated non è possibile interpolare una stringa di byte @@ -662,11 +782,26 @@ Le aree IF-FSHARP/IF-CAML non sono più supportate + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Non si tratta di un identificatore valido. + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. In una stringa interpolata è necessario specificare il carattere di escape di un carattere '}}' raddoppiandolo. @@ -772,6 +907,11 @@ Stampare le interfacce derivate di tutti i file di compilazione nei file di firma associati + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Cancellare la cache dei risultati di Gestione pacchetti @@ -807,6 +947,11 @@ Il nome del file di output pdb non può corrispondere all’uso del nome file di output della compilazione --pdb:filename.pdb + + Generate assembly with IL visibility that matches the source code visibility + Genera l'assembly con visibilità IL corrispondente alla visibilità del codice sorgente + + Produce a reference assembly, instead of a full assembly, as the primary output Produce un assembly di riferimento, anziché un assembly completo, come output primario @@ -912,21 +1057,26 @@ Prevista espressione. - - Expecting record field - Expecting record field - - Expecting pattern Criterio previsto + + Expecting record field + Expecting record field + + Expecting type Previsto tipo + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Valore letterale carattere incompleto (ad esempio: 'Q') o chiamata di tipo qualificato (ad esempio: 'T.Name) @@ -957,9 +1107,14 @@ L'accesso ai membri è ambiguo. Utilizzare le parentesi intorno alla creazione oggetto, ad esempio “(New SomeType (args)). MemberName” + + Only simple patterns are allowed in primary constructors + Nei costruttori primari sono consentiti solo criteri semplici + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Dichiarazione incompleta di un costrutto statico. Usare 'static let','static do','static member' o 'static val' per la dichiarazione. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - Costrutto generico vincolato nella specifica del codice ripristinabile + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - È stata rilevata una funzione 'let rec' nella specifica del codice ripristinabile + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Nome consigliato) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Questo criterio attivo prevede {0} argomenti di espressione, ad esempio '{1}{2}'. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Questo criterio attivo prevede {0} argomento/i dell'espressione e un argomento del criterio, ad esempio '{1}{2} pat'. + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Questo criterio attivo non prevede argomenti, ad esempio deve essere usato come '{0}' anziché '{1} x'. + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Questo criterio attivo prevede esattamente un argomento del criterio, ad esempio '{0} pat'. + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. Il significato di _ è ambiguo in questo contesto. Non può essere utilizzato per una variabile eliminata e una sintassi abbreviata di funzione nello stesso ambito. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + La sintassi lambda a sintassi abbreviata è supportata solo per le espressioni atomiche, ad esempio metodo, proprietà, campo o indicizzatore nell'argomento '_' implicito. Ad esempio: 'let f = _. Lunghezza'. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Definizione di funzione che nasconde un case di unione. Se si desidera eseguire questa operazione, ignorare o eliminare questo avviso. Se si desidera che sia una decostruzione di case di unione, aggiungere le parentesi. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - È necessario inizializzare le proprietà obbligatorie seguenti:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Nessun membro astratto statico trovato corrispondente all'override No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Nessuna proprietà astratta statica trovata corrispondente all'override @@ -1327,6 +1517,16 @@ Questo valore '{0}' non è una funzione e non supporta la notazione degli indici. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. La sintassi 'expr1[expr2]' è ambigua se usata come argomento. Vedere https://aka.ms/fsharp-index-notation. Se si intende eseguire l'indicizzazione o il sezionamento, è necessario usare 'expr1.[expr2]' nella posizione dell'argomento. Se si chiama una funzione con più argomenti sottoposti a corsi, aggiungere uno spazio tra di essi, ad esempio 'someFunction expr1 [expr2]'. @@ -1352,6 +1552,41 @@ La sintassi '(expr1)[expr2]' è ora riservata per l'indicizzazione ed è ambigua quando usata come argomento. Vedere https://aka.ms/fsharp-index-notation. Se si chiama una funzione con più argomenti sottoposti a corsi, aggiungere uno spazio tra di essi, ad esempio 'someFunction (expr1) [expr2]'. + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods È possibile usare il costrutto "let! ... and! ..." solo se il generatore di espressioni di calcolo definisce un metodo "{0}" o metodi "MergeSource" e "Bind" appropriati @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Codice ripristinabile non valido. È stato rilevata una funzione 'let rec' nella specifica del codice ripristinabile + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Se un tipo di unione multicase è uno struct, tutti i campi con lo stesso nome devono essere dello stesso tipo. Questa regola si applica anche al nome 'Elemento' generato in caso di campi senza nome. @@ -1437,6 +1672,11 @@ Un tratto non può specificare argomenti optional, in, out, ParamArray, CallerInfo o Quote + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} La stringa interpolata non è valida. {0} @@ -1457,6 +1697,11 @@ La dichiarazione di \"interfaces with static abstract methods\" è una funzionalità avanzata. Per indicazioni, vedere https://aka.ms/fsharp-iwsams. È possibile disabilitare questo avviso usando '#nowarn \"3535\"' o '--nowarn:3535'. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + Il tipo '{0}' contiene troppi metodi. Trovato: '{1}', massimo: '{2}' + + Interface member '{0}' does not have a most specific implementation. Il membro di interfaccia '{0}' non contiene un'implementazione più specifica. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + È possibile rimuovere le parentesi. @@ -2232,11 +2477,6 @@ Le definizioni di {0} per il tipo '{1}' nella firma e nell'implementazione non sono compatibili perché la firma dichiara {2} mentre l'implementazione dichiara {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Le definizioni di {0} per il tipo '{1}' nella firma e nell'implementazione non sono compatibili perché le abbreviazioni sono diverse: {2} invece di {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Le definizioni di {0} per il tipo '{1}' nella firma e nell'implementazione non sono compatibili perché un'abbreviazione è nascosta da una firma. L'abbreviazione deve essere visibile ad altri linguaggi CLI. Provare a rendere visibile l'abbreviazione nella firma. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Espressione di calcolo, sequenza o record non valida. Il formato delle espressioni sequenza deve essere 'seq {{ ... }}' + Espressione di calcolo, sequenza o record non valida. Il formato delle espressioni sequenza deve essere 'seq {{ ... }}' @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Questo non è un nome valido per un criterio attivo + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - Per F#7 e versioni precedenti, le definizioni di valori statici possono essere usate solo in tipi con un costruttore primario ('type X(args) = ...'). Per abilitarli in tutti gli altri tipi, usare la versione di "anteprima" del linguaggio. + Per F#7 e versioni precedenti, le definizioni di valori statici 'let','do' e 'member val' possono essere usate solo in tipi con un costruttore primario ('type X(args) = ...'). Per abilitarli in tutti gli altri tipi, usare la versione del linguaggio '8' o successiva. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Consente di specificare il tipo di debug: full, portable, embedded, pdbonly. '{0}' è l'impostazione predefinita se non viene specificato il tipo di debug e consente di associare un debugger a un programma in esecuzione. 'portable' è un formato multipiattaforma. 'embedded' è un formato multipiattaforma incorporato nel file di output. + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ Il valore '{0}' è stato contrassegnato come inline, tuttavia non è stato associato nell'ambiente di ottimizzazione - - Local value {0} not found during optimization - Valore locale {0} non trovato durante l'ottimizzazione - - A value marked as 'inline' has an unexpected value Valore imprevisto contrassegnato come 'inline' @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Questo valore letterale della matrice di byte contiene caratteri non codificabili come singoli byte + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Numero a virgola mobile non valido - + This number is outside the allowable range for decimal literals Questo numero non è compreso nell'intervallo consentito per valori letterali decimali - + This number is outside the allowable range for 32-bit floats Questo numero non è compreso nell'intervallo consentito per valori float a 32 bit @@ -6392,11 +6627,6 @@ Non è un valore letterale numerico valido. I valori letterali numerici validi includono 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint 32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1,0 (float/double), 1,0f (float32/single), 1,0m (decimale), 1I (bigint). - - This is not a valid byte literal - Valore letterale byte non valido - - This is not a valid character literal Valore letterale carattere non valido @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - Il servizio di compilazione residente non è stato usato perché si è verificato un problema nella comunicazione con il server. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Errore durante l'applicazione degli argomenti statici a un tipo fornito + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Valore '{1}' non valido dell'attributo TypeProviderAssembly nell'assembly '{0}'. Il valore deve essere un nome di assembly valido. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Si è verificato un errore durante l'applicazione degli argomenti statici a un metodo fornito + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Se un tipo di unione multicase è uno struct, tutti i case di unione devono avere nomi univoci. Ad esempio: 'tipo A = B di b: int | C di c: int'. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - CallerMemberNameAttribute applicato al parametro '{0}' non avrà alcun effetto. CallerFilePathAttribute ne eseguirà l'override. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Usata per introdurre un blocco di codice che potrebbe generare un'eccezione. Usata insieme a with o finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - Non è possibile chiamare il metodo di estensione byref '{0}. Il valore del primo parametro deve essere modificabile oppure un tipo byref non di sola lettura. + Non è possibile chiamare il metodo di estensione byref '{0}. ‘questo parametro deve essere modificabile oppure un tipo byref non di sola lettura. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - La chiave "'{0}" del gestione pacchetti non è stata registrata in {1}. Attualmente registrata: {2}. Per altre informazioni sulle estensioni, vedere: https://aka.ms/dotnetdepmanager + La chiave "'{0}" del gestione pacchetti non è stata registrata in {1}. Attualmente registrata: {2}. Per fornire percorsi aggiuntivi, passare '--compilertool:<extensionsfolder>' alla riga di comando. Per altre informazioni sulle estensioni, vedere: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ja.xlf index c4e1d71a82..67b3ad51f9 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ja.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ja.xlf @@ -52,6 +52,11 @@ この式は匿名レコードであり、{{...}} の代わりに {{|...|}} を使用してください。 + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. パラメーターが重複しています。パラメーター '{0}' は、このメソッドで 1 回以上使用されています。 @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + インデックスの付いたプロパティのゲッターとセッターは同じ型でなければなりません。プロパティ '{0}' は、ゲッターの型が '{1}' ですが、セッターの型は '{2}' です。 @@ -122,14 +127,24 @@ メンバーまたは関数 '{0}' には 'TailCallAttribute' 属性がありますが、末尾の再帰的な方法では使用されていません。 + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + 静的抽象非仮想インターフェイス メンバーは、型パラメーターを介してのみ呼び出す必要があります (例: 'T.{0})。 + + + + Classes cannot contain static abstract members. + クラスに静的抽象メンバーを含めることはできません。 + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + オブジェクト式は、静的抽象メンバーを持つインターフェイスを実装したり、静的メンバーを宣言したりすることはできません。 The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + TailCall 属性は再帰関数にのみ適用する必要があります。 @@ -147,6 +162,11 @@ 使用可能なオーバーロード:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + 型 '{1}' には必要な (実数または組み込み) メンバー '{2}' がないため、'{0}' ではサポートされません + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. ジェネリック コンストラクトでは、ジェネリック型パラメーターが構造体または参照型として認識されている必要があります。型の注釈の追加を検討してください。 @@ -177,6 +197,11 @@ 既知の型パラメーター: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match インデックス {0} の引数が一致しません @@ -187,6 +212,16 @@ 引数 '{0}' が一致しません + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent 制約 'unmanaged' と 'not struct' が矛盾しています @@ -212,6 +247,11 @@ アセンブリ属性 '{0}' は、デザイナー アセンブリ '{1}' を参照していますが、これは読み込むことができないか、存在していません。報告された例外: {2} - {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function アクセサー専用関数のアンダースコア ドット短縮形 @@ -222,6 +262,16 @@ その他の型指定された変換 + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions 適用できる計算式 @@ -242,6 +292,11 @@ `exception` 宣言の `Message` プロパティの自動生成 + + Boolean-returning and return-type-directed partial active patterns + ブール値を返すパターンと、戻り値の型が指定された部分的アクティブパターン + + Allow implicit Extension attribute on declaring types, modules 型、モジュールの宣言で暗黙的な拡張属性を許可する @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + 'TailCall' 属性が再帰関数以外で使用されている場合、警告が発せられます。 @@ -272,16 +327,36 @@ デリゲート型名の解決を修正するには、https://github.com/dotnet/fsharp/issues/10228 を参照してください + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding 使用バインドでパターンを破棄する + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal ドットなしの float32 リテラル + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + AttributeTargets を適用する + + Raises errors for non-virtual members overrides 仮想メンバー以外のオーバーライドに対してエラーを発生させます @@ -362,6 +437,21 @@ 複数のジェネリックのインスタンス化を含むインターフェイス + + Optimizes interpolated strings in certain cases, by lowering to concatenation + 特定のケースにおいて、補間された文字列を連結に変換することで最適化します。 + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + 整数範囲 (..) および範囲ステップ (.. ..) 演算子の特定の使用法を最適化し、高速な while ループにします。 + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute RequireQualifiedAccess 属性の場合に小文字 DU を許可する @@ -402,6 +492,11 @@ Null 許容のオプションの相互運用 + + nullness checking + nullness checking + + open type declaration オープン型宣言 @@ -417,9 +512,24 @@ パッケージの管理 + + # directives with non-quoted string arguments + 引用符で囲まれていない文字列引数を含む # ディレクティブ + + + + Unexpected identifier '{0}'. + '{0}' は予期しない識別子です。 + + + + Unexpected integer literal '{0}'. + '{0}' は予期しない整数リテラルです。 + + prefer extension method over plain property - prefer extension method over plain property + plain プロパティよりも拡張メソッドを優先する @@ -443,8 +553,8 @@ - whitespace relexation - 空白の緩和 + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + 名前と型が同じである限り、[<Struct>] 判別可能な共用体で基になるフィールドを共有する @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + ユニオン ケースのテスト プロパティ @@ -517,9 +627,14 @@ C# と F# のアンマネージド ジェネリック制約の間の相互運用 (追加の modreq を出力) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + インデックス付きプロパティのゲッターとセッターの型は同じである必要があります @@ -647,6 +762,11 @@ 条件が別の計算式の結果であるループ構造を導入するために、計算式で使用されます。 + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated バイト文字列は補間されていない可能性があります @@ -662,11 +782,26 @@ IF-FSHARP/IF-CAML リージョンは現在サポートされていません + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier これは有効な識別子ではありません + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. 文字 '}}' は、補間された文字列内で (二重にすることで) エスケープする必要があります。 @@ -772,6 +907,11 @@ すべてのコンパイル ファイルの推定されたインターフェイスを関連する署名ファイルに印刷します + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache パッケージ マネージャーの結果キャッシュをクリアする @@ -807,6 +947,11 @@ PDB 出力ファイル名がビルド出力ファイル名と一致しません - --pdb:filename.pdb を使用してください + + Generate assembly with IL visibility that matches the source code visibility + ソース コードの可視性と一致する IL 可視性を持つアセンブリを生成します + + Produce a reference assembly, instead of a full assembly, as the primary output 完全なアセンブリではなく、参照アセンブリをプライマリ出力として生成します @@ -912,21 +1057,26 @@ 式を指定してください - - Expecting record field - Expecting record field - - Expecting pattern 必要なパターン + + Expecting record field + Expecting record field + + Expecting type 型が必要です + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) 不完全な文字リテラル (例: 'Q') または修飾型の呼び出し (例: 'T.Name) @@ -957,9 +1107,14 @@ このメンバーへのアクセスはあいまいです。オブジェクト作成の前後にはかっこを使用してください。例: '(new SomeType(args)).MemberName' + + Only simple patterns are allowed in primary constructors + プライマリ コンストラクターで使用できるのは単純なパターンのみです + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + 静的コンストラクトの不完全な宣言。宣言には、'static let'、'static do'、'static member'、または 'static val' を使用します。 @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - 再開可能なコード指定で制約付きジェネリック コンストラクトが発生しました + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - 再開可能なコード仕様で 'let rec' が発生しました + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (推奨される名前) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + このアクティブ パターンには、{0} 式の引数が必要です (例: '{1}{2}')。 + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + このアクティブ パターンには、{0} 式の引数とパターン引数 とパターン引数 (例: '{1}{2} pat') が必要です。 + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + このアクティブ パターンには引数は必要ありません。つまり、'{1} x' ではなく、'{0}' のように使用する必要があります。 + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + このアクティブ パターンには、'{0} pat' などのパターン引数が 1 つだけ必要です。 + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. ここでは _ の意味はあいまいです。破棄された変数と、同じスコープ内の関数の短縮形には使用できません。 @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + 短縮ラムダ構文は、暗黙的な '_' 引数のメソッド、プロパティ、フィールド、インデクサーなどのアトミック式でのみサポートされています。例: 'let f = _.Length'。 + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + これは、共用体のケースをシャドウする関数定義です。これが必要な場合は、この警告を無視するか、非表示にしてください。共用体のケース分解にする場合は、かっこを追加します。 @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - 次の必須プロパティを初期化する必要があります:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + このオーバーライドに対応する静的抽象メンバーが見つかりませんでした No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + このオーバーライドに対応する抽象プロパティが見つかりませんでした @@ -1327,6 +1517,16 @@ 値 '{0}' は関数ではなく、インデックス表記をサポートしていません。 + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. 構文 'expr1[expr2]' は引数として使用されている場合、あいまいです。https://aka.ms/fsharp-index-notation を参照してください。インデックス作成またはスライスを行う場合は、'expr1.[expr2]' を引数の位置に使用する必要があります。複数のカリー化された引数を持つ関数を呼び出す場合は、'expr1 [expr2]' のように間にスペースを追加します。 @@ -1352,6 +1552,41 @@ 構文 '(expr1)[expr2]' はインデックス作成に予約されているので、引数として使うとあいまいです。https://aka.ms/fsharp-index-notation を参照してください。複数のカリー化された引数を持つ関数を呼び出す場合には、'someFunction (expr1) [expr2]' のように間にスペースを追加します。 + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods 'let! ... and! ...' コンストラクトは、コンピュテーション式ビルダーが '{0}' メソッドまたは適切な 'MergeSource' および 'Bind' メソッドのいずれかを定義している場合にのみ使用できます @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - 再開可能なコードが無効です。再開可能なコード仕様で 'let rec' が発生しました + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + マルチケース共用体型が構造体の場合、同じ名前を持つすべてのフィールドが同じ型である必要があります。このルールは、名前のないフィールドの場合に生成された 'Item' 名にも適用されます。 @@ -1437,6 +1672,11 @@ 特性では、オプションの、in 引数、out 引数、ParamArray 引数、CallerInfo 引数、または Quote 引数を指定することはできません + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} 補間された文字列が無効です。{0} @@ -1457,6 +1697,11 @@ \"interfaces with static abstract method\" の宣言は高度な機能です。ガイダンスについては https://aka.ms/fsharp-iwsams を参照してください。この警告は、'#nowarn \"3535\"' または '--nowarn:3535' を使用して無効にできます。 + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + 型 '{0}' に含まれるメソッドが多すぎます。検出した内容: '{1}'、最大値: '{2}' + + Interface member '{0}' does not have a most specific implementation. インターフェイス メンバー '{0}' には最も固有な実装がありません。 @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + かっこは削除できます。 @@ -2232,11 +2477,6 @@ シグネチャは {2} を宣言していますが、実装では {3} を宣言しているため、シグネチャおよび実装内の型 '{1}' の {0} 定義は互換性がありません - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - シグネチャおよび実装内の型 '{1}' の {0} 定義は、省略形が異なるため ({2} と {3})、互換性がありません - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. 省略形がシグネチャによって隠ぺいされているため、シグネチャおよび実装の型 '{1}' の {0} 定義に互換性がありません。省略形は他の CLI 言語から参照できるようにする必要があります。シグネチャ内の省略形を参照できるようにしてください。 @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - 無効なレコード、シーケンス式、またはコンピュテーション式です。シーケンス式は 'seq {{ ... }}' という形式にしてください。 + 無効なレコード、シーケンス式、またはコンピュテーション式です。シーケンス式は 'seq {{ ... }}' という形式にしてください。 @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - アクティブ パターンの有効な名前ではありません + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - F#7 以前の場合、静的な値の定義は、プライマリ コンストラクター ('type X(args) = ...') を持つ型でのみ使用できます。他のすべての種類で有効にするには、言語バージョン 'preview' を使用します。 + F#7 以前の場合、静的な 'let'、'do'、'member val' の定義は、プライマリ コンストラクター ('type X(args) = ...') を持つ型でのみ使用できます。他のすべての型で有効にするには、言語バージョン '8' 以降を使用します。 @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - デバッグの種類 full、portable、pdbonly を指定します (デバッグの種類が指定されない場合には '{0}' が既定で、実行中のプログラムにデバッガーを付加することができます。'portable' はクロスプラットフォーム形式、'embedded' は出力ファイルに埋め込まれたクロスプラットフォーム形式です)。 + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ 値 '{0}' は 'inline' とマークされましたが、最適化環境ではバインドされません - - Local value {0} not found during optimization - 最適化中にローカルの値 {0} が見つかりませんでした - - A value marked as 'inline' has an unexpected value 'inline' とマークされた値に予期しない値が含まれます @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - このバイト配列リテラルには、シングル バイトとしてエンコードされない文字が含まれます + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ 浮動小数点数が無効です - + This number is outside the allowable range for decimal literals この数値は、10 進リテラルに使用できる範囲から外れています - + This number is outside the allowable range for 32-bit floats この数値は、32 ビット浮動小数点に使用できる範囲から外れています @@ -6392,11 +6627,6 @@ これは有効な数値リテラルではありません。有効な数値リテラルには、1、0x1、0o1、 0b1、1l (int/int32)、1u (uint/uint32)、1L (int64)、1UL (uint64)、1s (int16)、1us (uint16)、1y (int8/sbyte)、1uy (uint8/byte)、1.0 (float/double)、1.0f (float32/single)、1.0m (10 進)、1I (bigint)。 - - This is not a valid byte literal - これは有効なバイト リテラルではありません - - This is not a valid character literal これは有効な文字リテラルではありません @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - サーバーとの通信で問題が発生したため、常駐コンパイル サービスが使用されませんでした。 + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - 指定された型に静的引数を適用する際にエラーが発生しました + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - アセンブリ '{0}' の TypeProviderAssembly 属性に、無効な値 '{1}' が含まれています。この値は有効なアセンブリ名であることが必要です + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - 静的な引数を指定されたメソッドに適用する際エラーが発生しました + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ マルチケース共用体の型が構造体の場合は、すべての共用体ケースに一意の名前を付ける必要があります。例: 'type A = B of b: int | c の C: int'。 - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - パラメーター '{0}' に適用された CallerMemberNameAttribute は、CallerFilePathAttribute.によってオーバーライドされるため無効となります。 + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - 例外を生成する可能性があるコード ブロックを開始するために使用します。with または finally と一緒に使用します。 + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - byref 拡張メソッド '{0} を呼び出すことはできません。最初のパラメーターでは、値を変更可能な byref 型または読み取り専用以外の byref 型にする必要があります。 + byref 拡張メソッド '{0}を呼び出すことはできません。'this' パラメーターには、値を変更可能にするか、読み取り専用以外の byref 型を指定する必要があります。 @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - パッケージ マネージャー キー '{0}' は {1} に登録されませんでした。現在登録済み: {2}。拡張機能の詳細については、次を参照してください: https://aka.ms/dotnetdepmanager + パッケージ マネージャー キー '{0}' は {1} に登録されませんでした。現在登録されているもの: {2}。'--compilertool:<extensionsfolder>' をコマンド ラインに渡すことで、追加のパスを指定できます。拡張機能の詳細については、次を参照してください: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ko.xlf index 4751ad79eb..d33ad95bff 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ko.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ko.xlf @@ -52,6 +52,11 @@ 이 식은 익명 레코드입니다. {{...}} 대신 {{|...|}}을 사용하세요. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. 매개 변수가 중복되었습니다. 이 메소드에서 매개 변수 '{0}'이(가) 두 번 이상 사용되었습니다. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + 인덱싱된 속성의 getter와 setter의 형식이 같아야 합니다. '{0}' 속성에 '{1}' 형식의 getter가 있지만 '{2}’ 형식의 setter가 있습니다. @@ -122,14 +127,24 @@ 멤버 또는 함수 '{0}'에 'TailCallAttribute' 특성이 있지만 비상 재귀적인 방식으로 사용되고 있지 않습니다. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + 정적 추상 비 가상 인터페이스 구성원은 형식 매개 변수(예: 'T.{0})를 통해서만 호출해야 합니다. + + + + Classes cannot contain static abstract members. + 클래스에는 정적 추상 구성원을 포함할 수 없습니다. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + 개체 식은 정적 추상 멤버가 있는 인터페이스를 구현하거나 정적 멤버를 선언할 수 없습니다. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + TailCall 특성은 재귀 함수에만 적용해야 합니다. @@ -147,6 +162,11 @@ 사용 가능한 오버로드:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + '{1}' 형식에는 필수(실제 또는 기본 제공) 멤버 '{2}'이(가) 없기 때문에 '{0}'이(가) 이 형식을 지원하지 않습니다. + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. 제네릭 구문을 사용하려면 구조체 또는 참조 형식의 제네릭 형식 매개 변수가 필요합니다. 형식 주석을 추가하세요. @@ -177,6 +197,11 @@ 알려진 형식 매개 변수: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match 인덱스 {0}의 인수가 일치하지 않습니다. @@ -187,6 +212,16 @@ '{0}' 인수가 일치하지 않습니다. + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent 제약 조건 'unmanaged' 및 'not struct'가 일치하지 않습니다. @@ -212,6 +247,11 @@ '{0}' 어셈블리 특성이 로드할 수 없거나 존재하지 않는 디자이너 어셈블리'{1}'을(를) 참조합니다. 보고된 예외: {2} - {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function 접근자 전용 함수에 대한 밑줄 점 약어 @@ -222,6 +262,16 @@ 추가 형식-디렉션 변환 + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions 적용 가능한 계산 식 @@ -242,6 +292,11 @@ 'exception' 선언에 대한 'Message' 속성 자동 생성 + + Boolean-returning and return-type-directed partial active patterns + 부울 반환 및 반환 형식 지향 부분 활성 패턴 + + Allow implicit Extension attribute on declaring types, modules 유형, 모듈 선언에 암시적 확장 속성 허용 @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + 'TailCall' 특성이 비 재귀 함수에 사용되는 경우 경고를 발생합니다. @@ -272,16 +327,36 @@ 대리자 형식 이름의 해결 방법을 수정합니다. https://github.com/dotnet/fsharp/issues/10228 참조하세요. + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding 사용 중인 패턴 바인딩 무시 + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal 점이 없는 float32 리터럴 + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + AttributeTargets 적용 + + Raises errors for non-virtual members overrides 비가상 멤버 재정의에 대한 오류 발생 @@ -362,6 +437,21 @@ 여러 제네릭 인스턴스화가 포함된 인터페이스 + + Optimizes interpolated strings in certain cases, by lowering to concatenation + 특정 경우에 보간된 문자열을 연결로 낮추어 최적화합니다. + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + 정수 계열 범위(..) 및 범위 단계(.. ..) 연산자의 특정 사용을 빠른 while 루프에 최적화합니다. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute RequireQualifiedAccess 특성이 있는 경우 소문자 DU 허용 @@ -402,6 +492,11 @@ nullable 선택적 interop + + nullness checking + nullness checking + + open type declaration 개방형 형식 선언 @@ -417,9 +512,24 @@ 패키지 관리 + + # directives with non-quoted string arguments + 따옴표가 없는 문자열 인수가 있는 #개의 지시문 + + + + Unexpected identifier '{0}'. + 예기치 않은 식별자 '{0}' + + + + Unexpected integer literal '{0}'. + 예기치 않은 정수 리터럴 '{0}'. + + prefer extension method over plain property - prefer extension method over plain property + 일반 속성보다 확장 메서드 선호 @@ -443,8 +553,8 @@ - whitespace relexation - 공백 완화 + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + 이름과 형식이 같으면 [<Struct>] 구분된 공용 구조체에서 기본 필드 공유 @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + 공용 구조체 사례 테스트 속성 @@ -517,9 +627,14 @@ C#과 F#의 관리되지 않는 제네릭 제약 조건 간의 Interop(추가 modreq 내보내기) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + 인덱싱된 속성 getter와 setter의 형식이 같아야 합니다. @@ -647,6 +762,11 @@ 계산 식에서 조건이 다른 계산 식의 결과인 루프 구문을 도입하는 데 사용됩니다. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated 바이트 문자열을 보간하지 못할 수 있습니다. @@ -662,11 +782,26 @@ IF-FSHARP/IF-CAML 영역은 더 이상 지원되지 않습니다. + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier 유효한 식별자가 아닙니다. + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. '}}' 문자는 보간된 문자열에서 이중으로 사용하여 이스케이프해야 합니다. @@ -772,6 +907,11 @@ 모든 컴파일 파일의 유추된 인터페이스를 관련 서명 파일로 인쇄합니다. + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache 패키지 관리자 결과 캐시 지우기 @@ -807,6 +947,11 @@ pdb 출력 파일 이름은 빌드 출력 파일 이름 사용 --pdb:filename.pdb와 일치할 수 없습니다. + + Generate assembly with IL visibility that matches the source code visibility + 소스 코드 표시 유형과 일치하는 IL 표시 유형을 사용하여 어셈블리 생성 + + Produce a reference assembly, instead of a full assembly, as the primary output 주 출력으로 전체 어셈블리 대신 참조 어셈블리를 생성합니다. @@ -912,21 +1057,26 @@ 식이 필요함 - - Expecting record field - Expecting record field - - Expecting pattern 예상되는 패턴 + + Expecting record field + Expecting record field + + Expecting type 예상 형식 + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) 불완전한 문자 리터럴(예: 'Q') 또는 정규화된 형식 호출(예: 'T.Name) @@ -957,9 +1107,14 @@ 이 구성원 액세스가 모호합니다. 개체 생성 주위에 괄호를 사용하세요. 예: '(새로운 SomeType(인수)).MemberName' + + Only simple patterns are allowed in primary constructors + 기본 생성자에서는 단순 패턴만 허용됩니다. + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + 정적 구문의 선언이 불완전합니다. 선언에 'static let','static do','static member' 또는 'static val'을 사용합니다. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - 다시 시작 가능한 코드 사양에서 제약이 있는 제네릭 구문이 발생했습니다. + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - 다시 시작 가능한 코드 사양에서 'let rec'가 발생했습니다. + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (제안된 이름) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + 이 활성 패턴에는 {0} 식 인수(예: '{1}{2}')가 필요합니다. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + 이 활성 패턴에는 {0} 식 인수와 패턴 인수가 필요합니다(예: '{1}{2} pat'). + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + 이 활성 패턴에는 인수가 필요하지 않습니다. 즉, '{0} x' 대신 '{1}'을(를) 사용해야 합니다. + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + 이 활성 패턴에는 정확히 하나의 패턴 인수(예: '{0} pat')가 필요합니다. + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. 여기서 _의 의미가 모호합니다. 삭제된 변수와 동일한 범위의 함수 줄임에는 사용할 수 없습니다. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + 줄임 람다 구문은 암시적 '_' 인수의 메서드, 속성, 필드 또는 인덱서와 같은 원자성 식에 대해서만 지원됩니다. 예: 'let f = _.Length'. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + 공용 구조체 케이스를 음영 처리하는 함수입니다. 원하는 경우 이 경고를 무시하거나 표시하지 않습니다. 공용 구조체 케이스 분해가 되도록 하려면 괄호를 추가합니다. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - 다음 필수 속성을 초기화해야 합니다. {0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + 이 재정의에 해당하는 정적 추상 멤버를 찾을 수 없습니다. No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + 이 재정의에 해당하는 정적 추상 속성을 찾을 수 없습니다. @@ -1327,6 +1517,16 @@ '{0}' 값은 함수가 아니며 인덱스 표기법을 지원하지 않습니다. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. 'expr1[expr2]' 구문은 인수로 사용될 때 모호합니다. https://aka.ms/fsharp-index-notation을 참조하세요. 인덱싱이나 슬라이싱을 하려면 인수 위치에 'expr1.[expr2]'를 사용해야 합니다. 여러 개의 커리된 인수로 함수를 호출하는 경우 그 사이에 공백을 추가하세요(예: 'someFunction expr1 [expr2]'). @@ -1352,6 +1552,41 @@ 구문 '(expr1)[expr2]'는 이제 인덱싱을 위해 예약되었으며 인수로 사용될 때 모호합니다. https://aka.ms/fsharp-index-notation을 참조하세요. 여러 개의 커리된 인수로 함수를 호출하는 경우 그 사이에 공백을 추가하세요(예: 'someFunction (expr1) [expr2]'). + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods 'let! ... and! ...' 구문은 계산 식 작성기에서 '{0}' 메서드 또는 적절한 'MergeSources' 및 'Bind' 메서드를 정의한 경우에만 사용할 수 있습니다. @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - 다시 시작 가능한 코드가 잘못되었습니다. 다시 시작 가능한 코드 사양에서 'let rec'가 발생했습니다. + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + 멀티캐시 공용 구조체 형식이 구조체이면 이름이 같은 모든 필드의 형식이 같아야 합니다. 이 규칙은 명명되지 않은 필드의 경우 생성된 '항목' 이름에도 적용됩니다. @@ -1437,6 +1672,11 @@ 특성은 optional, in, out, ParamArray, CallerInfo, Quote 인수를 지정할 수 없습니다. + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} 잘못된 보간 문자열. {0} @@ -1457,6 +1697,11 @@ \"interfaces with static abstract methods\"를 선언하는 것은 고급 기능입니다. 지침은 https://aka.ms/fsharp-iwsams를 참조하세요. '#nowarn \"3535\"' 또는 '--nowarn:3535'를 사용하여 이 경고를 비활성화할 수 있습니다. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + '{0}' 형식에 메서드가 너무 많습니다. 찾은 항목: '{1}', 최대: '{2}' + + Interface member '{0}' does not have a most specific implementation. 인터페이스 멤버 '{0}'에 가장 한정적인 구현이 없습니다. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + 괄호를 제거할 수 있습니다. @@ -2232,11 +2477,6 @@ 시그니처가 {2}을(를) 선언하지만 구현은 {3}을(를) 선언하므로 시그니처 및 구현의 '{1}' 형식에 대한 {0} 정의가 호환되지 않습니다. - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - 약어가 {2}과(와) {3}(으)로 서로 다르므로 시그니처 및 구현의 '{1}' 형식에 대한 {0} 정의가 호환되지 않습니다. - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. 시그니처에 의해 약어가 숨겨져 있으므로 시그니처 및 구현의 '{1}' 형식에 대한 {0} 정의가 호환되지 않습니다. 약어는 다른 CLI 언어에 표시되어야 합니다. 시그니처에서 약어를 표시하세요. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - 레코드, 시퀀스 또는 계산 식이 잘못되었습니다. 시퀀스 식의 형식은 'seq {{ ... }}'여야 합니다. + 레코드, 시퀀스 또는 계산 식이 잘못되었습니다. 시퀀스 식의 형식은 'seq {{ ... }}'여야 합니다. @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - 활성 패턴에 대한 올바른 이름이 아닙니다. + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - F#7 이하의 경우 정적 값 정의는 기본 생성자('type X(args) = ...')가 있는 형식에서만 사용할 수 있습니다. 다른 모든 형식에서 사용하도록 설정하려면 언어 버전 '미리 보기'를 사용합니다. + F#7 이하의 경우, 정적 'let', 'do' 및 'member val' 정의는 기본 생성자가 있는 타입('type X(args) = ...')에서만 사용할 수 있습니다. 다른 모든 형식에서 사용하도록 설정하려면 언어 버전 ‘8’ 또는 그 이상을 사용합니다. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - 디버깅 형식(full, portable, embedded, pdbonly)을 지정합니다. '{0}'은(는) 디버깅 형식을 지정하지 않은 경우 기본값이며 디버거를 실행 중인 프로그램에 연결할 수 있습니다. 'portable'은 플랫폼 간 형식이고, 'embedded'는 출력 파일에 포함된 플랫폼 간 형식입니다. + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ 값 '{0}'이(가) inline으로 표시되었지만 최적화 환경에 바인딩되지 않았습니다. - - Local value {0} not found during optimization - 최적화하는 동안 로컬 값 {0}을(를) 찾을 수 없습니다. - - A value marked as 'inline' has an unexpected value 'inline'으로 표시된 값에 예기치 않은 값이 있습니다. @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - 이 바이트 배열 리터럴에는 단일 바이트로 인코딩되지 않는 문자가 포함되어 있습니다. + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ 부동 소수점 수가 잘못되었습니다. - + This number is outside the allowable range for decimal literals 이 숫자는 10진 리터럴에 대해 허용 가능한 범위를 벗어납니다. - + This number is outside the allowable range for 32-bit floats 이 숫자는 32비트 부동 수에 대해 허용 가능한 범위를 벗어납니다. @@ -6392,11 +6627,6 @@ 유효한 숫자 리터럴이 아닙니다. 유효한 숫자 리터럴은 1, 0x1, 0o1, 0b1, 1l(int/int32), 1u(uint/uint32), 1L(int64), 1UL(uint64), 1s(int16), 1us(uint16), 1y(int8/)입니다. sbyte), 1uy(uint8/byte), 1.0(float/double), 1.0f(float32/single), 1.0m(decimal), 1I(bigint). - - This is not a valid byte literal - 올바른 바이트 리터럴이 아닙니다. - - This is not a valid character literal 올바른 문자 리터럴이 아닙니다. @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - 서버와 통신하는 동안 문제가 발생하여 상주 컴파일 서비스를 사용하지 않았습니다. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - 제공된 형식에 정적 인수를 적용하는 동안 오류가 발생했습니다. + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - {0}' 어셈블리에 포함된 TypeProviderAssembly 특성의 값('{1}')이 잘못되었습니다. 값은 올바른 어셈블리 이름이어야 합니다. + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - 제공된 메서드에 정적 인수를 적용하는 동안 오류가 발생했습니다. + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ 다중 사례 공용 구조체 형식이 구조체인 경우 모든 공용 구조체 사례의 이름이 고유해야 합니다. 예: 'type A = B of b: int | C 중 C: 정수'. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - {0}' 매개 변수에 적용되는 CallerMemberNameAttribute는 효과가 없습니다. CallerFilePathAttribute에서 재정의합니다. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - 예외를 생성할 수 있는 코드 블록을 지정하는 데 사용됩니다. with 또는 finally와 함께 사용됩니다. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - byref 확장 메서드 '{0}'을(를) 호출할 수 없습니다. 첫 번째 매개 변수는 변경할 수 있거나 읽기 전용이 아닌 byref 형식인 값이 필요합니다. + byref 확장 메서드 '{0}'을(를) 호출할 수 없습니다. ‘이’ 매개 변수는 변경할 수 있거나 읽기 전용이 아닌 byref 형식인 값이 필요합니다. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - 패키지 관리자 키 '{0}'이(가) {1}에서 등록되지 않았습니다. 현재 등록: {2}. 확장에 대한 자세한 내용은 다음을 참조하세요. https://aka.ms/dotnetdepmanager + 패키지 관리자 키 '{0}'이(가) {1}에 등록되지 않았습니다. 현재 등록됨: {2}. 명령줄에 '--compilertool:<extensionsfolder>'를 전달하여 추가 경로를 제공할 수 있습니다. 확장에 대한 자세한 내용은 다음을 참조하세요. https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pl.xlf index 81d62979a4..a992a59bb2 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pl.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pl.xlf @@ -52,6 +52,11 @@ To wyrażenie jest rekordem anonimowym. Użyj {{|...|}} zamiast {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Zduplikowany parametr. Parametr „{0}” został użyty więcej niż raz w tej metodzie. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + Metoda pobierająca i metoda ustawiająca właściwości indeksowanej muszą mieć taki sam typ. Właściwość „{0}” ma metodę pobierającą typu „{1}”, ale metodę ustawiającą typu „{2}”. @@ -122,14 +127,24 @@ Składowa lub funkcja „{0}” ma atrybut „TailCallAttribute”, ale nie jest używana w sposób cykliczny końca. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Statyczna abstrakcyjna składowa interfejsu niewirtualnego powinna być wywoływana tylko za pomocą parametru typu (na przykład: „T”).{0} + + + + Classes cannot contain static abstract members. + Klasy nie mogą zawierać statycznych abstrakcyjnych składowych. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Wyrażenia obiektów nie mogą implementować interfejsów ze statycznymi abstrakcyjnymi elementami członkowskimi ani deklarować statycznych elementów członkowskich. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + Atrybut TailCall powinien być stosowany tylko do funkcji rekursywnych. @@ -147,6 +162,11 @@ Dostępne przeciążenia:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + Element „{0}” nie obsługuje typu „{1}”, ponieważ ten drugi nie ma wymaganej (rzeczywistej lub wbudowanej) składowej „{2}” + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. Konstrukcja ogólna wymaga, aby parametr typu ogólnego był znany jako struktura lub typ referencyjny. Rozważ dodanie adnotacji typu. @@ -177,6 +197,11 @@ Parametr znanego typu: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match Argument pod indeksem {0} nie jest zgodny @@ -187,6 +212,16 @@ Argument „{0}” nie jest zgodny + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent Ograniczenia „unmanaged” i „not struct” są niespójne @@ -212,6 +247,11 @@ Atrybut zestawu „{0}” odwołuje się do zestawu projektanta „{1}”, którego nie można załadować lub który nie istnieje. Zgłoszony wyjątek: {2} — {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function skrót podkreślenia kropki dla funkcji tylko metody dostępu @@ -222,6 +262,16 @@ dodatkowe konwersje ukierunkowane na typ + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions praktyczne wyrażenia obliczeniowe @@ -242,6 +292,11 @@ Automatyczne generowanie właściwości „Wiadomość“ dla deklaracji „Wyjątek“ + + Boolean-returning and return-type-directed partial active patterns + Zwracane wartości logiczne i zwracane częściowe wzorce aktywne kierowane do typu zwrotnego + + Allow implicit Extension attribute on declaring types, modules Zezwalaj na niejawny atrybut Rozszerzenie dla deklarujących typów, modułów @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Zgłasza ostrzeżenia, jeśli atrybut „TailCall” jest używany w funkcjach niekursywnych. @@ -272,16 +327,36 @@ naprawa rozpoznawania nazw typów delegatów, sprawdź stronę https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding odrzuć wzorzec w powiązaniu użycia + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal bezkropkowy literał float32 + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + Wymuszaj elementy AttributeTargets + + Raises errors for non-virtual members overrides Zgłasza błędy w przypadku przesłonięć elementów innych niż wirtualne @@ -362,6 +437,21 @@ interfejsy z wieloma ogólnymi wystąpieniami + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Optymalizuje ciągi interpolowane w niektórych przypadkach, obniżając do łączenia + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Optymalizuje niektóre zastosowania operatorów zakresu całkowitego (..) i krok-zakresu (.. .), aby przyspieszyć pętle while. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute Zezwalaj na małą literę DU, gdy występuje RequireQualifiedAccess @@ -402,6 +492,11 @@ opcjonalna międzyoperacyjność dopuszczająca wartość null + + nullness checking + nullness checking + + open type declaration deklaracja typu otwartego @@ -417,9 +512,24 @@ zarządzanie pakietami + + # directives with non-quoted string arguments + Dyrektywy (#) z argumentami ciągu niezawartymi w cudzysłów + + + + Unexpected identifier '{0}'. + Nieoczekiwany identyfikator „{0}”. + + + + Unexpected integer literal '{0}'. + Nieoczekiwany literał liczby całkowitej „{0}”. + + prefer extension method over plain property - prefer extension method over plain property + preferuj metodę rozszerzenia nad zwykłą właściwością @@ -443,8 +553,8 @@ - whitespace relexation - rozluźnianie reguł dotyczących odstępów + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Udostępnij pola źródłowe w unii rozłącznej [<Struct>], o ile mają taką samą nazwę i ten sam typ @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Właściwości testowe przypadku unii @@ -517,9 +627,14 @@ Międzyoperacyjnie między niezarządzanym ograniczeniem ogólnym języka C# i F# (emituj dodatkowe modreq) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + Metoda pobierająca i metoda ustawiająca właściwości indeksowanych muszą mieć taki sam typ. @@ -647,6 +762,11 @@ Używane w wyrażeniach obliczeń w celu wprowadzenia konstrukcji pętli, w której warunek jest wynikiem innego wyrażenia obliczeń. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated ciąg bajtowy nie może być interpolowany @@ -662,11 +782,26 @@ Regiony IF-FSHARP/IF-CAML nie są już obsługiwane + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier To nie jest prawidłowy identyfikator + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. W przypadku znaku „}}” należy zastosować ucieczkę (przez wpisanie dwóch takich znaków) w ciągu interpolowanym. @@ -772,6 +907,11 @@ Drukowanie wywnioskowanych interfejsów wszystkich plików kompilacji do skojarzonych plików sygnatur + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Wyczyść pamięć podręczną wyników menedżera pakietów @@ -807,6 +947,11 @@ Nazwa pliku wyjściowego pdb nie może być zgodna z nazwą pliku wyjściowego kompilacji, użyj parametru --pdb:filename.pdb + + Generate assembly with IL visibility that matches the source code visibility + Generuj zestaw z widocznością IL zgodną z widocznością kodu źródłowego + + Produce a reference assembly, instead of a full assembly, as the primary output Utwórz zestaw odwołania zamiast pełnego zestawu jako podstawowe dane wyjściowe @@ -912,21 +1057,26 @@ Oczekiwanie na wyrażenie - - Expecting record field - Expecting record field - - Expecting pattern Oczekiwano wzorca + + Expecting record field + Expecting record field + + Expecting type Oczekiwano typu + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Niekompletny literał znaku (przykład: „Q”) lub wywołanie typu kwalifikowanego (przykład: „T.Name”) @@ -957,9 +1107,14 @@ Dostęp tego elementu członkowskiego jest niejednoznaczny. W celu utworzenia obiektu użyj nawiasów, na przykład „(nowy SomeType(args)).MemberName” + + Only simple patterns are allowed in primary constructors + Tylko proste wzorce są dozwolone w konstruktorach podstawowych + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Niekompletna deklaracja konstrukcji statycznej. Użyj elementu „static let”, „static do”, „static member” lub „static val” na potrzeby deklaracji. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - W specyfikacji kodu z możliwością wznowienia wystąpiła ograniczona konstrukcja ogólna + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - W specyfikacji kodu z możliwością wznowienia, wystąpił błąd "let rec" + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Sugerowana nazwa) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Ten aktywny wzorzec oczekuje argumentów wyrażenia ({0}), np. „{1}{2}”. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Ten aktywny wzorzec oczekuje argumentów wyrażenia ({0}) i argumentu wzorca, np. „{1}{2} pat”. + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Ten aktywny wzorzec nie oczekuje żadnych argumentów, tj. powinien być używany jak „{0}” zamiast „{1} x”. + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Ten aktywny wzorzec oczekuje dokładnie jednego argumentu wzorca, np. „{0} pat”. + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. Znaczenie elementu _ jest tutaj niejednoznaczne. Nie można go użyć dla odrzuconej zmiennej i skrótu funkcji w tym samym zakresie. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + Składnia lambda skrótu jest obsługiwana tylko w przypadku wyrażeń niepodzielnych, takich jak metoda, właściwość, pole lub indeksator w dorozumianym argumencie „_”. Na przykład: „let f = _. Length”. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + To jest definicja funkcji, która zasłania przypadek unii. Jeśli to jest to, czego chcesz, zignoruj lub pomiń to ostrzeżenie. Jeśli chcesz, aby była to dekonstrukcja przypadku unii, dodaj nawiasy. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - Następujące wymagane właściwości muszą zostać zainicjowane:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Nie odnaleziono żadnego statycznego abstrakcyjnego elementu członkowskiego odpowiadającego temu przesłonięciu No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Nie odnaleziono żadnej statycznej właściwości abstrakcyjnej odpowiadającej temu przesłonięciu @@ -1327,6 +1517,16 @@ Wartość elementu „{0}” nie jest funkcją i nie obsługuje notacji indeksowej. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. Składnia wyrażenia „expr1[expr2]” jest niejednoznaczna, gdy jest używana jako argument. Zobacz https://aka.ms/fsharp-index-notation. Jeśli zamierzasz indeksować lub fragmentować, to w pozycji argumentu musi być użyte wyrażenie „expr1.[expr2]”. Jeśli wywołujesz funkcję z wieloma argumentami typu curried, dodaj spację między nimi, np. „someFunction expr1 [expr2]”. @@ -1352,6 +1552,41 @@ Składnia wyrażenia „(expr1)[expr2]” jest teraz zarezerwowana do indeksowania i jest niejednoznaczna, gdy jest używana jako argument. Zobacz: https://aka.ms/fsharp-index-notation. Jeśli wywołujesz funkcję z wieloma argumentami typu curried, dodaj spację między nimi, np. „someFunction (expr1) [expr2]”. + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods Konstrukcji „let! ... and! ...” można użyć tylko wtedy, gdy konstruktor wyrażeń obliczeniowych definiuje metodę „{0}” lub odpowiednie metody „MergeSource” i „Bind” @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Nieprawidłowy kod z możliwością wznowienia. W specyfikacji kodu z możliwością wznowienia wystąpił element "let rec" + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Jeśli typ unii wieloskładnikowej jest strukturą, wszystkie pola o tej samej nazwie muszą być tego samego typu. Ta reguła ma zastosowanie również do wygenerowanej nazwy „item” w przypadku pól bez nazwy. @@ -1437,6 +1672,11 @@ Cecha nie może określać opcjonalnych argumentów in, out, ParamArray, CallerInfo lub Quote + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Nieprawidłowy ciąg interpolowany. {0} @@ -1457,6 +1697,11 @@ Deklarowanie \"interfejsów ze statycznymi metodami abstrakcyjnymi\" jest funkcją zaawansowaną. Aby uzyskać wskazówki, zobacz https://aka.ms/fsharp-iwsams. To ostrzeżenie można wyłączyć przy użyciu polecenia „#nowarn \"3535\"" lub "--nowarn:3535”. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + Typ „{0}” ma zbyt wiele metod. Znaleziono: „{1}”, maksimum: „{2}” + + Interface member '{0}' does not have a most specific implementation. Składowa interfejsu „{0}” nie ma najbardziej specyficznej implementacji. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Nawiasy można usunąć. @@ -2232,11 +2477,6 @@ Definicje {0} dla typu „{1}” w sygnaturze i implementacji są niezgodne, ponieważ sygnatura deklaruje element {2}, natomiast implementacja deklaruje element {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Definicje {0} dla typu „{1}” w sygnaturze i implementacji są niezgodne, ponieważ skróty są różne: {2} i {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Definicje {0} dla typu „{1}” w sygnaturze i implementacji są niezgodne, ponieważ skrót jest ukrywany przez sygnaturę. Skrót musi być widoczny dla innych języków infrastruktury CLI. Rozważ zapewnienie widoczności skrótu w sygnaturze. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Nieprawidłowe wyrażenie rekordu, sekwencji lub obliczenia. Wyrażenia sekwencji powinny mieć postać „seq {{ ... }}” + Nieprawidłowe wyrażenie rekordu, sekwencji lub obliczenia. Wyrażenia sekwencji powinny mieć postać „seq {{ ... }}” @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - To nie jest prawidłowa nazwa aktywnego wzorca + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - W przypadku języka F#7 i niższych, definicje wartości statycznych mogą być używane tylko w typach z konstruktorem podstawowym („type X(args) = ...”). Aby włączyć je we wszystkich innych typach, użyj wersji językowej „wersja zapoznawcza”. + W przypadku języka F#7 i niższych wersji, definicje statyczne „let”,„do” i „member val” mogą być używane tylko w typach z konstruktorem podstawowym („type X(args) = ...”). Aby włączyć je we wszystkich innych typach, użyj wersji „8” języka lub wyższej. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Określ typ debugowania: full, portable, pdbonly. Wartość „{0}” jest wartością domyślną, jeśli nie określono typu debugowania, i umożliwia dołączenie debugera do działającego programu. Wartość „portable” określa format międzyplatformowy. Wartość „embedded” określa format międzyplatformowy osadzony w pliku wyjściowym. + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ Wartość „{0}” została oznaczona jako śródwierszowa, ale nie powiązano jej w środowisku optymalizacji - - Local value {0} not found during optimization - Nie znaleziono wartości lokalnej {0} podczas optymalizacji - - A value marked as 'inline' has an unexpected value Wartość oznaczona jako „inline” ma nieoczekiwaną wartość @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Ten literał tablicy bajtowej zawiera znaki, które nie są kodowane jako pojedynczy bajt + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Nieprawidłowa liczba zmiennoprzecinkowa - + This number is outside the allowable range for decimal literals Ta liczba jest poza dozwolonym zakresem literałów dziesiętnych - + This number is outside the allowable range for 32-bit floats Ta liczba jest poza dozwolonym zakresem 32-bitowych liczb zmiennoprzecinkowych @@ -6392,11 +6627,6 @@ To nie jest prawidłowy literał liczbowy. Prawidłowe literały liczbowe to 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/bajt), 1,0 (float/double), 1,0f (float32/single), 1,0 m (dziesiętny), 1I (bigint). - - This is not a valid byte literal - Nie jest to prawidłowy literał bajtowy - - This is not a valid character literal Nie jest to prawidłowy literał znakowy @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - Rezydentna usługa kompilacji nie została użyta, ponieważ wystąpił problem z komunikowaniem się z serwerem. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Wystąpił błąd podczas stosowania argumentów statycznych do udostępnionego typu + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - Zestaw „{0}” ma atrybut TypeProviderAssembly z nieprawidłową wartością „{1}”. Wartość powinna być prawidłową nazwą zestawu + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Wystąpił błąd podczas stosowania argumentów statycznych dla podanej metody + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Jeśli typ unii wielokaskładnikowej jest strukturą, wszystkie przypadki unii muszą mieć unikatowe nazwy. Na przykład: „typ A = B z b: int | C z c: int”. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Zastosowanie elementu CallerMemberNameAttribute do parametru „{0}” nie odniesie żadnego skutku. Jest on przesłaniany przez element CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Używane do wprowadzania bloku kodu, który może generować wyjątek. Używane razem ze słowem kluczowym with lub finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - Nie można wywołać metody rozszerzenia byref „{0}”. Pierwszy parametr wymaga, aby wartość była typem byref zmiennym lub innym niż tylko do odczytu. + Nie można wywołać metody rozszerzenia byref „{0}”. parametr „this” wymaga, aby wartość była typem byref podlegającym zmianie lub innym niż tylko do odczytu. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - Klucz menedżera pakietów „{0}” nie został zarejestrowany w {1}. Aktualnie zarejestrowane: {2}. Aby dowiedzieć się więcej o rozszerzeniach, odwiedź stronę: https://aka.ms/dotnetdepmanager + Klucz menedżera pakietów „{0}” nie został zarejestrowany w {1}. Aktualnie zarejestrowane: {2}. Możesz podać dodatkowe ścieżki, przekazując polecenie „--compilertool:<extensionsfolder>” do wiersza polecenia. Aby dowiedzieć się więcej o rozszerzeniach, odwiedź stronę: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pt-BR.xlf index 8cdbcdb29c..d547f088b3 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.pt-BR.xlf @@ -52,6 +52,11 @@ Esta expressão é um registro anônimo, use {{|...|}} em vez de {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Parâmetro duplicado. O parâmetro '{0}' foi usado mais de uma vez neste método. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + O getter e o setter de uma propriedade devem ter o mesmo tipo. A propriedade "{0}" possui getter do tipo "{1}", mas setter do tipo "{2}". @@ -122,14 +127,24 @@ O membro ou a função "{0}" tem o atributo "TailCallAttribute", mas não está sendo usado de maneira recursiva em cauda. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Um membro de interface não virtual abstrato estático só deve ser chamado via parâmetro de tipo (por exemplo: ''T.{0}). + + + + Classes cannot contain static abstract members. + Classes não podem conter membros abstratos estáticos. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Expressões de objeto não podem implementar interfaces com membros abstratos estáticos ou declarar membros estáticos. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + O atributo TailCall só deve ser aplicado a funções recursivas. @@ -147,6 +162,11 @@ Sobrecargas disponíveis:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + "{0}" não dá suporte ao tipo "{1}", pois o último não tem o membro necessário (real ou interno) "{2}: + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. Um constructo genérico exige que um parâmetro de tipo genérico seja conhecido como um tipo de referência ou struct. Considere adicionar uma anotação de tipo. @@ -177,6 +197,11 @@ Parâmetro de tipo conhecido: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match O argumento no índice {0} não corresponde @@ -187,6 +212,16 @@ O argumento '{0}' não corresponde + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent As restrições "unmanaged" e "not struct" são inconsistentes @@ -212,6 +247,11 @@ O atributo de assembly '{0}' refere-se a um assembly de designer '{1}' que não pode ser carregado ou que não existe. A exceção relatada foi {2} – {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function sublinhado ponto abreviação para função somente acessador @@ -222,6 +262,16 @@ conversões direcionadas por tipos adicionais + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions expressões de computação aplicáveis @@ -242,6 +292,11 @@ geração automática da propriedade 'Message' para declarações de 'exception' + + Boolean-returning and return-type-directed partial active patterns + Padrões ativos parciais com retorno booleano e direcionados por tipo de retorno + + Allow implicit Extension attribute on declaring types, modules Permitir atributo de Extensão implícito em tipos declarativos, módulos @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Gera avisos se o atributo "TailCall" for usado em funções não recursivas. @@ -272,16 +327,36 @@ corrigir para resolução de nomes de tipos delegados, consulte https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding descartar o padrão em uso de associação + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal literal float32 sem ponto + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + Impor AttributeTargets + + Raises errors for non-virtual members overrides Gera erros para substituições de membros não virtuais @@ -362,6 +437,21 @@ interfaces com várias instanciações genéricas + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Otimiza cadeias de caracteres interpoladas em determinados casos, diminuindo a concatenação + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Otimiza determinados usos dos operadores de intervalo integral (...) e de etapa de intervalo (... ..) para loops while rápidos. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute Permitir DU em minúsculas quando o atributo RequireQualifiedAccess @@ -402,6 +492,11 @@ interoperabilidade opcional anulável + + nullness checking + nullness checking + + open type declaration declaração de tipo aberto @@ -417,9 +512,24 @@ gerenciamento de pacotes + + # directives with non-quoted string arguments + Diretivas # com argumentos de cadeia de caracteres sem aspas + + + + Unexpected identifier '{0}'. + Identificador inesperado "{0}". + + + + Unexpected integer literal '{0}'. + Literal de inteiro inesperado "{0}". + + prefer extension method over plain property - prefer extension method over plain property + preferir o método de extensão em vez da propriedade simples @@ -443,8 +553,8 @@ - whitespace relexation - atenuação de espaço em branco + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Compartilhar campos subjacentes em uma união discriminada [<Struct>], desde que tenham o mesmo nome e tipo @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Propriedades de teste de caso de união @@ -517,9 +627,14 @@ Interoperabilidade entre a restrição genérica não gerenciada de C# e F# (emitir modreq adicional) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + As propriedades indexadas getter e setter devem ter o mesmo tipo @@ -647,6 +762,11 @@ Usado em expressões de computação para introduzir um constructo de looping em que a condição é o resultado de outra expressão de computação. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated uma cadeia de caracteres de byte não pode ser interpolada @@ -662,11 +782,26 @@ As regiões IF-FSHARP/IF-CAML não são mais suportadas + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Este não é um identificador válido + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. Um caractere ''}}' precisa ser de escape (ao duplicar) em uma cadeia de caracteres interpolada. @@ -772,6 +907,11 @@ Imprimir as interfaces inferidas de todos os arquivos de compilação para os arquivos de assinatura associados + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Limpar o cache de resultados do gerenciador de pacotes @@ -807,6 +947,11 @@ O nome do arquivo de saída pdb não pode corresponder ao nome do arquivo de saída do build. Use --pdb:filename.pdb + + Generate assembly with IL visibility that matches the source code visibility + Gerar um assembly com visibilidade IL que corresponda à visibilidade do código-fonte. + + Produce a reference assembly, instead of a full assembly, as the primary output Produzir um assembly de referência, em vez de um assembly completo, como a saída primária @@ -912,21 +1057,26 @@ Esperando uma expressão - - Expecting record field - Expecting record field - - Expecting pattern Padrão esperado + + Expecting record field + Expecting record field + + Expecting type Esperando tipo + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Literal de caractere incompleto (exemplo: 'Q') ou invocação de tipo qualificado (exemplo: 'T.Name) @@ -957,9 +1107,14 @@ Este acesso de membro é ambíguo. Use parênteses em torno da criação do objeto, por exemplo, '(new SomeType(args)).MemberName''. + + Only simple patterns are allowed in primary constructors + Somente padrões simples são permitidos em construtores primários + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Declaração incompleta de um constructo estático. Use "static let","static do","static member" ou "static val" para declaração. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - Um constructo genérico restrito ocorreu na especificação de código retomável + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - Ocorreu um "let rec" na especificação do código retomável + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Nome sugerido) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Este padrão ativo espera argumentos de expressão {0}, por exemplo, ''{1}{2}''. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Este padrão ativo espera argumento(s) de expressão {0} e um argumento de padrão, por exemplo, ''{1}{2} pat''. + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Este padrão ativo não espera argumentos, ou seja, ele deve ser usado como ''{0}'' em vez de ''{1} x''. + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Este padrão ativo espera exatamente um argumento de padrão, por exemplo, ''{0} pat''. + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. O significado de _ é ambíguo aqui. Ele não pode ser usado para uma variável descartada e uma abreviação de função no mesmo escopo. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + A sintaxe lambda abreviada só tem suporte para expressões atômicas, como método, propriedade, campo ou indexador no argumento '_' implícito. Por exemplo: 'let f = _. Comprimento'. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Essa é uma definição de função que sombra um caso de união. Se isso for o que você deseja, ignore ou suprime este aviso. Se você quiser que ele seja uma desconstrução de caso de união, adicione parênteses. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - As seguintes propriedades necessárias precisam ser inicializadas:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Nenhum membro abstrato estático encontrado que corresponda a esta substituição No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Nenhuma propriedade abstrata que corresponde a esta substituição foi encontrada @@ -1327,6 +1517,16 @@ O valor '{0}' não é uma função e não dá suporte à notação de índice. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. A sintaxe '[expr1][expr2]' é ambígua quando usada como um argumento. Consulte https://aka.ms/fsharp-index-notation. Se você pretende indexar ou colocar em fatias, deve usar '(expr1).[expr2]' na posição do argumento. Se chamar uma função com vários argumentos na forma curried, adicione um espaço entre eles, por exemplo, 'someFunction [expr1] [expr2]'. @@ -1352,6 +1552,41 @@ A sintaxe 'expr1[expr2]' agora está reservada para indexação e é ambígua quando usada como um argumento. Consulte https://aka.ms/fsharp-index-notation. Se chamar uma função com vários argumentos na forma curried, adicione um espaço entre eles, por exemplo, 'someFunction expr1 [expr2]'. + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods O “let! ... and! ...” só poderá ser usada se o construtor de expressão de cálculo definir um método “{0}” ou métodos “MergeSources” e “Bind” apropriados @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Código inválido retomável. Ocorreu um "let rec" na especificação do código retomável + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Se um tipo de união multicase for um struct, todos os campos com o mesmo nome deverão ser do mesmo tipo. Essa regra também se aplica ao nome 'Item' gerado no caso de campos sem nome. @@ -1437,6 +1672,11 @@ Uma característica não pode especificar os argumentos optional, in, out, ParamArray, CallerInfo ou Quote + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Cadeia de caracteres interpolada inválida. {0} @@ -1457,6 +1697,11 @@ Declarando \"interfaces com métodos abstratos estáticos\" é um recurso avançado. Consulte https://aka.ms/fsharp-iwsams para obter diretrizes. Você pode desabilitar esse aviso usando '#nowarn \"3535\"' ou '--nowarn:3535'. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + O tipo "{0}" tem muitos métodos. Encontrado: "{1}", máximo: "{2}" + + Interface member '{0}' does not have a most specific implementation. O membro de interface '{0}' não tem uma implementação mais específica. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Os parênteses podem ser removidos. @@ -2232,11 +2477,6 @@ As definições {0} para o tipo '{1}' na assinatura e implementação não são compatíveis, pois a assinatura declara um {2} enquanto a implementação declara um {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - As definições {0} para o tipo '{1}' na assinatura e implementação não são compatíveis, pois as abreviações são diferentes: {2} versus {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. As definições {0} para o tipo '{1}' na assinatura e implementação não são compatíveis, pois uma abreviação está sendo ocultada por uma assinatura. A abreviação deve estar visível a outras linguagens CLIs. Considere deixar a abreviação visível na assinatura. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Expressão de registro, sequência ou computação inválida. Expressões de sequência devem estar na forma 'seq {{ ... }}' + Expressão de registro, sequência ou computação inválida. Expressões de sequência devem estar na forma 'seq {{ ... }}' @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Este não é um nome válido para um padrão ativo + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - Para F#7 e inferior, as definições de valores estáticos só podem ser usadas em tipos com um construtor primário ('type X(args) = ...'). Para habilitá-los em todos os outros tipos, use a versão do idioma “versão prévia”. + Para F#7 e inferior, as definições de valores estáticos só podem ser usadas em tipos com um construtor primário ('type X(args) = ...'). Para habilitá-los em todos os outros tipos, use a versão do idioma “versão prévia”. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Especificar tipo de depuração: completo, portátil, incorporado, somente PDB. ('{0}' será o padrão se nenhum tipo de depuração for especificado e permite anexar um depurador a um programa em execução; 'portátil' é um formato multiplataforma; 'incorporado' é um formato multiplataforma incorporado no arquivo de saída). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ O valor '{0}' foi marcado como embutido, mas não está associado no ambiente de otimização - - Local value {0} not found during optimization - O valor local {0} não foi encontrado durante a otimização - - A value marked as 'inline' has an unexpected value Um valor marcado como 'embutido' possui um valor inesperado @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Este literal matriz de byte contém caracteres não codificados como um byte simples + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Número do ponto flutuante inválido - + This number is outside the allowable range for decimal literals Este número está fora do intervalo permitido para literais decimais - + This number is outside the allowable range for 32-bit floats Este número está fora do intervalo permitido para floats de 32-bit @@ -6392,11 +6627,6 @@ Este não é um literal numérico válido. Os literais numéricos válidos incluem 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/ sbyte), 1uy (uint8/byte), 1.0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint). - - This is not a valid byte literal - Este não é um literal de byte válido - - This is not a valid character literal Este não é um literal de caractere válido @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - O serviço de compilação residente não foi usado porque houve um problema de comunicação com o servidor. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Erro ao aplicar os argumentos estáticos a um tipo fornecido + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - O assembly '{0}' possui um atributo TypeProviderAssembly com valor inválido '{1}'. O valor deve ser um nome de assembly válido + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Ocorreu um erro ao aplicar os argumentos estáticos para um método fornecido + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Se um tipo de união multicase for um struct, todos os casos união deverão ter nomes exclusivos. Por exemplo: tipo A = B de b: int | C de c: int'. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - O CallerMemberNameAttribute aplicado ao parâmetro "{0}" não terá efeito. Ele é substituído pelo CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Usado para introduzir um bloco de código que pode gerar uma exceção. Usado junto com with ou finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - Não é possível chamar o método de extensão de byref '{0}. O primeiro parâmetro requer que o valor seja mutável ou não seja byref somente leitura. + Não é possível chamar o método de extensão de byref '{0}. O primeiro parâmetro requer que o valor seja mutável ou não seja byref somente leitura. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - A chave do gerenciador de pacotes “{0}” não foi registrada em {1}. Atualmente cadastrado: {2}. Para saber mais sobre extensões, visite: https://aka.ms/dotnetdepmanager + A chave do gerenciador de pacotes “{0}” não foi registrada em {1}. Atualmente cadastrado: {2}. Você pode fornecer caminhos extras passando "--compilertool:<extensionsfolder>" para a linha de comando. Para saber mais sobre extensões, visite: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ru.xlf index 1319210fbc..1da17d068c 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ru.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.ru.xlf @@ -52,6 +52,11 @@ Это выражение является анонимной записью. Используйте {{|...|}} вместо {{...}}. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Повторяющийся параметр. Параметр "{0}" использовался в этом методе несколько раз. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + Методы получения и установки индексированного свойства должны иметь один и тот же тип. Свойство "{0}" имеет метод получения типа "{1}" и метод задания типа "{2}". @@ -122,14 +127,24 @@ Элемент или функция "{0}" содержит атрибут "TailCallAttribute", но не используется в рекурсивном хвостовом режиме. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Статический абстрактный невиртуальный элемент интерфейса должен вызываться только с помощью параметра типа (например, 'T.{0}). + + + + Classes cannot contain static abstract members. + Классы не могут содержать статические абстрактные элементы. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Выражения объектов не могут реализовывать интерфейсы со статическими абстрактными членами или объявлять статические члены. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + Атрибут TailCall следует применять только к рекурсивным функциям. @@ -147,6 +162,11 @@ Доступные перегрузки:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + '{0}' не поддерживает тип '{1}', поскольку у последнего отсутствует необходимый (реальный или встроенный) член '{2}' + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. В универсальной конструкции требуется использовать параметр универсального типа, известный как структура или ссылочный тип. Рекомендуется добавить заметку с типом. @@ -177,6 +197,11 @@ Известный параметр типа: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match Аргумент в индексе {0} не соответствует @@ -187,6 +212,16 @@ Аргумент "{0}" не соответствует + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent Ограничения "unmanaged" и "not struct" несовместимы @@ -212,6 +247,11 @@ Атрибут сборки "{0}" ссылается на сборку конструктора "{1}", которая не может быть загружена или не существует. Получено исключение: {2} — {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function символ подчеркивания, сокращение точки для функции только для метода доступа @@ -222,6 +262,16 @@ дополнительные преобразования на основе типа + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions применимые вычислительные выражения @@ -242,6 +292,11 @@ автоматическое создание свойства “Message” для объявлений “exception” + + Boolean-returning and return-type-directed partial active patterns + Логические возвращаемые и направленные на возвращаемый тип частичные активные шаблоны + + Allow implicit Extension attribute on declaring types, modules Разрешить атрибут неявного расширения для объявляющих типов, модулей @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + Выдает предупреждения, если атрибут TailCall используется в нерекурсивных функциях. @@ -272,16 +327,36 @@ исправить разрешение имен типов делегатов, см. https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding шаблон отмены в привязке использования + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal литерал float32 без точки + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + Принудительно применить AttributeTargets + + Raises errors for non-virtual members overrides Вызывает ошибки при переопределениях невиртуальных элементов @@ -362,6 +437,21 @@ интерфейсы с множественным универсальным созданием экземпляра + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Оптимизирует интерполированные строки в определенных случаях путем понижения до объединения + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + Оптимизирует определенные варианты использования операторов целого диапазона (..) и шага диапазона (.. ..) для быстрых циклов while. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute Разрешить du в нижнем регистре, если атрибут RequireQualifiedAccess @@ -402,6 +492,11 @@ необязательное взаимодействие, допускающее значение NULL + + nullness checking + nullness checking + + open type declaration объявление открытого типа @@ -417,9 +512,24 @@ управление пакетами + + # directives with non-quoted string arguments + Директивы # с аргументами строк без кавычек + + + + Unexpected identifier '{0}'. + Недопустимый идентификатор: "{0}". + + + + Unexpected integer literal '{0}'. + Непредвиденный литерал целого числа "{0}". + + prefer extension method over plain property - prefer extension method over plain property + предпочитать метод расширения вместо простого свойства @@ -443,8 +553,8 @@ - whitespace relexation - уменьшение строгости для пробелов + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Совместное использование базовых полей в дискриминируемом объединении [<Struct>], если они имеют одинаковое имя и тип. @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Свойства теста союзного случая @@ -517,9 +627,14 @@ Взаимодействие между универсальным ограничением "unmanaged" C# и F#(создание дополнительного modreq) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + Методы получения и установки индексированных свойств должны иметь один и тот же тип. @@ -647,6 +762,11 @@ Используется в вычислительных выражениях для введения циклической конструкции, в которой условие является результатом другого вычислительного выражения. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated невозможно выполнить интерполяцию для строки байтов @@ -662,11 +782,26 @@ Регионы IF-FSHARP/IF-CAML больше не поддерживаются + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Это недопустимый идентификатор + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. Символ "}}" необходимо экранировать (путем дублирования) в интерполированной строке. @@ -772,6 +907,11 @@ Печать определяемых интерфейсов всех файлов компиляции в связанные файлы подписей + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Очистка кэша результатов диспетчера пакетов @@ -807,6 +947,11 @@ Имя выходного файла pdb не может совпадать с именем выходного файла сборки. Используйте --pdb:filename.pdb + + Generate assembly with IL visibility that matches the source code visibility + Создать сборку с видимостью IL, соответствующей видимости исходного кода + + Produce a reference assembly, instead of a full assembly, as the primary output Создайте базовую сборку вместо полной сборки в качестве основных выходных данных @@ -912,21 +1057,26 @@ Ожидается выражение - - Expecting record field - Expecting record field - - Expecting pattern Ожидается шаблон + + Expecting record field + Expecting record field + + Expecting type Требуется тип + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Неполный символьный литерал (например: "Q") или вызов квалифицированного типа (например: "T.Name) @@ -957,9 +1107,14 @@ Неоднозначный доступ к этому элементу. Заключите операцию создания объекта в круглые скобки, например (new Объект(аргументы)).Элемент + + Only simple patterns are allowed in primary constructors + В первичных конструкторах разрешены только простые шаблоны + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Неполное объявление статической конструкции. Для объявления используйте «static let», «static do», «staticmember» или «static val». @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - В спецификации возобновляемого кода возникла ограниченная универсальная конструкция + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - В спецификации возобновляемого кода возникла ошибка "let rec" + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (предложенное имя) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Этот активный шаблон ожидает аргументы выражения ({0}), например "{1}{2}". + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Этот активный шаблон ожидает аргументы выражения ({0}) и аргумент шаблона, например "{1}{2} pat". + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Этот активный шаблон не ожидает аргументов, то есть его следует использовать как "{0}" вместо "{1} x". + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Этот активный шаблон ожидает ровно один аргумент шаблона, например "{0} pat". + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. Неоднозначное значение символа _ здесь. Его нельзя использовать для пустой переменной и сокращенной функции в одной области. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + Сокращенный синтаксис лямбда-выражений поддерживается только для атомарных выражений, таких как метод, свойство, поле или индексатор подразумеваемого аргумента «_». Например: 'let f = _.Length'. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Это определение функции, которое отражает случай объединения. Если это то, что вы хотите, игнорируйте или подавляйте это предупреждение. Если вы хотите, чтобы это была деконструкция регистра объединения, добавьте круглые скобки. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - Необходимо инициализировать следующие обязательные свойства:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Не найден статический абстрактный элемент, соответствующий этому переопределению. No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Не найдено статическое абстрактное свойство, соответствующее этому переопределению. @@ -1327,6 +1517,16 @@ Значение {0} не является функцией и не поддерживает нотацию индекса. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. Синтаксис "expr1[expr2]" неоднозначен при использовании в качестве аргумента. См. https://aka.ms/fsharp-index-notation. Если вы намереваетесь индексировать или разрезать, необходимо использовать "expr1.[expr2]" в позиции аргумента. При вызове функции с несколькими каррированными аргументами добавьте пробел между ними, например "someFunction expr1 [expr2]". @@ -1352,6 +1552,41 @@ Синтаксис "(expr1)[expr2]" теперь зарезервирован для индексирования и неоднозначен при использовании в качестве аргумента. См. https://aka.ms/fsharp-index-notation. При вызове функции с несколькими каррированными аргументами добавьте между ними пробел, например "someFunction (expr1) [expr2]". + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods Конструкцию "let! ... and! ..." можно использовать только в том случае, если построитель выражений с вычислениями определяет либо метод "{0}", либо соответствующие методы "MergeSources" и "Bind" @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Недопустимый возобновляемый код. В спецификации возобновляемого кода возникла ошибка "let rec" + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Если тип объединения нескольких регистров является структурой, то все поля с одинаковым именем должны быть одного типа. Это правило также применяется к сгенерированному имени «Элемент» в случае безымянных полей. @@ -1437,6 +1672,11 @@ Признак не может указывать необязательные аргументы in, out, ParamArray, CallerInfo или Quote + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Недопустимая интерполированная строка. {0} @@ -1457,6 +1697,11 @@ Объявление \"интерфейсов со статическими абстрактными методами\" является расширенной функцией. См. руководство на https://aka.ms/fsharp-iwsams. Это предупреждение можно отключить с помощью используя "#nowarn \"3535\"" or "--nowarn:3535". + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + Тип '{0}' имеет слишком много методов. Найдено: '{1}', максимально: '{2}' + + Interface member '{0}' does not have a most specific implementation. Элемент интерфейса "{0}" не имеет наиболее конкретной реализации. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Круглые скобки можно убрать. @@ -2232,11 +2477,6 @@ Определения {0} для типа "{1}" в сигнатуре и реализации несовместимы, так как сигнатура объявляет {2}, а реализация — {3}. - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Определения {0} для типа "{1}" в сигнатуре и реализации несовместимы, так как сокращения различаются: {2} в сравнении с {3}. - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Определения {0} для типа "{1}" в сигнатуре и реализации несовместимы, так как сокращение скрывается сигнатурой. Сокращение должно быть видимым для других языков CLI. Попробуйте сделать сокращение видимым в сигнатуре. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Недопустимая запись, выражение последовательности или вычислительное выражение. Выражения последовательностей должны иметь форму "seq {{ ... }}' + Недопустимая запись, выражение последовательности или вычислительное выражение. Выражения последовательностей должны иметь форму "seq {{ ... }}' @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Недопустимое имя для активного шаблона + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - Определения статических значений для F#7 и ниже можно использовать только в типах с первичным конструктором ("type X(args) = ..."). Чтобы включить их во всех других типах, используйте версию языка "preview". + Определения статических значений "let","do" и "member val" для F#7 и ниже можно использовать только в типах с первичным конструктором ("type X(args) = ..."). Чтобы включить их во всех других типах, используйте версию языка "8" или выше. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Укажите тип отладки: full, portable, embedded, pdbonly (если тип отладки не указан, по умолчанию используется тип "{0}", позволяющий подключить отладчик к выполняющейся программе; тип portable представляет собой кроссплатформенный формат; тип embedded — кроссплатформенный формат, встроенный в выходной файл). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ Значение "{0}" отмечено как "inline", однако не было привязано в среде оптимизации - - Local value {0} not found during optimization - В процессе оптимизации не найдено локальное значение {0} - - A value marked as 'inline' has an unexpected value Недопустимое значение для значения, отмеченного как "inline" @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Этот литерал массива байтов содержит знаки, не поддерживающие однобайтовую кодировку + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Недопустимое число с плавающей точкой - + This number is outside the allowable range for decimal literals Это число находится вне допустимого диапазона для десятичных литералов - + This number is outside the allowable range for 32-bit floats Это число находится вне допустимого диапазона для 32-битных чисел с плавающей точкой @@ -6392,11 +6627,6 @@ Это значение не является допустимым числовым литералом. Допустимые числовые литералы: 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1,0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint). - - This is not a valid byte literal - Не является допустимым байтовым литералом. - - This is not a valid character literal Не является допустимым символьным литералом. @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - Служба резидентной компиляции не использовалась, поскольку возникла проблема при взаимодействии с сервером. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Ошибка при применении статических аргументов к предоставленному типу + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - У сборки "{0}" имеется атрибут TypeProviderAssembly с недопустимым значением "{1}". Значение должно представлять собой допустимое имя сборки + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Произошла ошибка при применении статических аргументов к предоставленному методу + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Если тип объединения с несколькими регистрами является структурой, все случаи объединения должны иметь уникальные имена. Например: "type A = B of b: int | C of c: int". - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Атрибут CallerMemberNameAttribute, примененный для параметра "{0}", не будет действовать. Он будет переопределен атрибутом CallerFilePathAttribute. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Используется для введения блока кода, который может создать исключение. Используется вместе с with или finally. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - Не удается вызвать метод расширения byref "{0}". В качестве первого параметра необходимо указать изменяемое значение или значение типа byref, доступное не только для чтения. + Не удается вызвать метод расширения byref "{0}". В качестве параметра "this" необходимо указать изменяемое значение или значение типа byref, доступное не только для чтения. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - Ключ диспетчера пакетов "{0}" не зарегистрирован в {1}. Сейчас зарегистрировано: {2}. Дополнительные сведения о расширениях см. на странице https://aka.ms/dotnetdepmanager + Ключ диспетчера пакетов "{0}" не зарегистрирован в {1}. Сейчас зарегистрировано: {2}. Чтобы указать дополнительные пути, передайте в командную строку "--compilertool:<extensionsfolder>". Дополнительные сведения о расширениях см. на странице https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.tr.xlf index d9143a0db5..fe29aebcff 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.tr.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.tr.xlf @@ -52,6 +52,11 @@ Bu ifade, anonim bir kayıt, {{...}} yerine {{|...|}} kullanın. + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. Yinelenen parametre. '{0}' parametresi bu metotta bir kereden fazla kullanıldı. @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + Dizini oluşturulmuş bir özelliğin alıcısı ve ayarlayıcısı aynı türde olmalıdır. '{0}' özelliği '{1}' türünde alıcıya ancak '{2}' türünde ayarlayıcıya sahip. @@ -122,14 +127,24 @@ Üye veya '{0}' işlevi, 'TailCallAttribute' özniteliğine sahip ancak kuyruk özyinelemeli bir şekilde kullanılmıyor. + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + Statik soyut sanal olmayan arabirim üyesi yalnızca tür parametresi aracılığıyla çağrılmalıdır (örneğin: 'T.{0}). + + + + Classes cannot contain static abstract members. + Sınıflar statik soyut üyeler içeremez. + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + Nesne ifadeleri, statik soyut üyeler içeren arabirimleri uygulayamaz veya statik üyeleri bildiremez. The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + TailCall özniteliği yalnızca özyinelemeli işlevlere uygulanmalıdır. @@ -147,6 +162,11 @@ Kullanılabilir aşırı yüklemeler:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + '{0}', gerekli (gerçek veya yerleşik) '{2}' üyesine sahip olmadığından '{1}' türünü desteklemiyor + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. Genel yapı, genel bir tür parametresinin yapı veya başvuru türü olarak bilinmesini gerektirir. Tür ek açıklaması eklemeyi düşünün. @@ -177,6 +197,11 @@ Bilinen tür parametresi: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match {0} dizinindeki bağımsız değişken eşleşmiyor @@ -187,6 +212,16 @@ '{0}' bağımsız değişkeni eşleşmiyor + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent 'unmanaged' ve 'not struct' kısıtlamaları tutarsız @@ -212,6 +247,11 @@ '{0}' bütünleştirilmiş kod özniteliği, yüklenemeyen veya mevcut olmayan '{1}' tasarımcı bütünleştirilmiş koduna başvuruyor. Bildirilen özel durum: {2} - {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function yalnızca erişimci işlevi için alt çizgi nokta kısaltma @@ -222,6 +262,16 @@ ek tür ile yönlendirilen dönüştürmeler + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions uygulama hesaplama ifadeleri @@ -242,6 +292,11 @@ 'exception' bildirimleri için 'Message' özelliğinin otomatik olarak oluşturulması + + Boolean-returning and return-type-directed partial active patterns + Boole döndüren ve dönüş türü yönlendiren kısmi etkin desenler + + Allow implicit Extension attribute on declaring types, modules Türler, modüller bildirirken örtük Extension özniteliğine izin ver @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + 'TailCall' özniteliği özyinelemeli olmayan işlevlerde kullanılıyorsa uyarılar oluşturur. @@ -272,16 +327,36 @@ temsilci türü adlarının çözümlenmesiyle ilgili sorunun çözümü için bkz. https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding kullanım bağlamasında deseni at + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal noktasız float32 sabit değeri + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + AttributeTargets'ı zorla + + Raises errors for non-virtual members overrides Sanal olmayan üyelerde geçersiz kılmalar için hatalar oluştur @@ -362,6 +437,21 @@ birden çok genel örnek oluşturma içeren arabirimler + + Optimizes interpolated strings in certain cases, by lowering to concatenation + Birleştirmeye indirerek belirli durumlarda düz metin arasına kod eklenmiş dizeleri en iyi duruma getirir + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + İntegral aralığı (..) ve aralık adımı (.. ..) işleçlerinin belirli kullanımlarını hızlı while döngüsünde en iyi duruma getirir. + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute RequireQualifiedAccess özniteliğinde küçük harf DU'ya izin ver @@ -402,6 +492,11 @@ null atanabilir isteğe bağlı birlikte çalışma + + nullness checking + nullness checking + + open type declaration açık tür bildirimi @@ -417,9 +512,24 @@ paket yönetimi + + # directives with non-quoted string arguments + Tırnak içine alınmamış dize bağımsız değişkenlerine sahip # yönergeleri + + + + Unexpected identifier '{0}'. + Beklenmeyen tanımlayıcı: '{0}'. + + + + Unexpected integer literal '{0}'. + Beklenmeyen tamsayı değişmez değeri '{0}'. + + prefer extension method over plain property - prefer extension method over plain property + Basit özellik yerine genişletme yöntemini tercih edin @@ -443,8 +553,8 @@ - whitespace relexation - boşluk genişlemesi + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + Aynı ada ve türe sahip oldukları sürece temel alınan alanları [<Struct>] ayırt edici birleşim biçiminde paylaşın @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + Birleşim durumu test özellikleri @@ -517,9 +627,14 @@ C# ile F#' arasında yönetilmeyen genel kısıtlama (ek modreq yayın) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + Dizini oluşturulmuş özelliklerin alıcısı ve ayarlayıcısı aynı türde olmalıdır @@ -647,6 +762,11 @@ Hesaplama ifadelerinde, koşulun başka bir hesaplama ifadesinin sonucu olduğu bir döngü yapısı eklemek için kullanılır. + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated bir bayt dizesi, düz metin arasına kod eklenerek kullanılamaz @@ -662,11 +782,26 @@ IF-FSHARP/IF-CAML bölgeleri artık desteklenmiyor + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier Bu, geçerli bir tanımlayıcı değil + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. Bir '}}' karakteri, düz metin arasına kod eklenmiş bir dizede kaçış dizisi ile (yineleme yapılarak) belirtilir. @@ -772,6 +907,11 @@ Tüm derleme dosyalarının çıkarsanan arabirimlerini ilişkili imza dosyalarına yazdır + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache Paket yöneticisi sonuçları önbelleğini temizle @@ -807,6 +947,11 @@ pdb çıkış dosyası adı, derleme çıkış dosya adı kullanımı --pdb:filename.pdb ile eşleşmiyor + + Generate assembly with IL visibility that matches the source code visibility + Kaynak kodu görünürlüğüyle eşleşen IL görünürlüğüne sahip bütünleştirilmiş kod oluşturma + + Produce a reference assembly, instead of a full assembly, as the primary output Birincil çıktı olarak, tam bir derleme yerine, başvuru bütünleştirilmiş kodu üretin @@ -912,21 +1057,26 @@ İfade bekleniyor - - Expecting record field - Expecting record field - - Expecting pattern Desen bekleniyor + + Expecting record field + Expecting record field + + Expecting type Tür bekleniyor + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) Eksik karakter değişmez değeri (örnek: 'Q') veya tam tür çağrısı (örnek: 'T.Name) @@ -957,9 +1107,14 @@ Bu üye erişimi belirsiz. Lütfen nesne oluşturma etrafında parantez kullanın, örneğin '(yeni SomeType (args)).MemberName’ + + Only simple patterns are allowed in primary constructors + Birincil oluşturucularda yalnızca basit desenlere izin verilir + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + Statik yapının bildirimi eksik. Bildirim için 'static let','static do','static member' veya 'static val' kullanın. @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - Sürdürülebilir kod belirtiminde kısıtlanmış bir genel yapı oluştu + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - Sürdürülebilir kod belirtiminde 'let rec' oluştu + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (Önerilen ad) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + Bu etkin desen, {0} ifade bağımsız değişkenlerini bekliyor, ör. '{1}{2}'. + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + Bu etkin desen, {0} bağımsız değişkenlerini ve desen bağımsız değişkenlerini bekliyor, ör. '{1}{2}. + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + Bu etkin desen herhangi bir bağımsız değişken beklemiyor, yani '{1} x' yerine '{0}' gibi kullanılmalıdır. + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + Bu etkin desen, tam olarak bir desen bağımsız değişkeni bekliyor, ör. '{0} pat'. + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. _ öğesinin anlamı burada belirsiz. Aynı kapsamda, atılan bir değişken ve işlev kısaltması için kullanılamaz. @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + Toplu lambda söz dizimi yalnızca örtülü '_' bağımsız değişkeninde yöntem, özellik, alan veya dizin oluşturucu gibi atomik ifadeler için destekleniyor. Örnek: 'let f = _.Length'. + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + Bu, bir birleşim durumunu gizleyen bir işlev tanımıdır. Bunu istiyorsanız, bu uyarıyı yoksayın veya durdurun. Bunun bir birleşim durumu ayrıştırması olmasını istiyorsanız, parantezler ekleyin. @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - Aşağıdaki gerekli özelliklerin başlatılması gerekiyor:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + Bu geçersiz kılmaya karşılık gelen hiçbir statik soyut üye bulunamadı No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + Bu geçersiz kılmaya karşılık gelen hiçbir statik soyut özellik bulunamadı @@ -1327,6 +1517,16 @@ “{0}” değeri bir işlev değildir ve dizin gösterimini desteklemez. + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. Söz dizimi “expr1[expr2]” artık dizin oluşturma için ayrılmıştır ve bağımsız değişken olarak kullanıldığında belirsizdir. https://aka.ms/fsharp-index-notation'a bakın. Dizin oluşturmayı veya dilimlemeyi düşünüyorsanız, bağımsız değişken konumunda “expr1.[expr2]” kullanmalısınız. Birden çok curry bağımsız değişkenli bir işlev çağırıyorsanız, aralarına bir boşluk ekleyin, örn. “someFunction expr1 [expr2]”. @@ -1352,6 +1552,41 @@ Söz dizimi “(expr1)[expr2]” artık dizin oluşturma için ayrılmıştır ve bağımsız değişken olarak kullanıldığında belirsizdir. https://aka.ms/fsharp-index-notation'a bakın. Birden çok curry bağımsız değişkenli bir işlev çağırıyorsanız, aralarına bir boşluk ekleyin, örn. “someFunction (expr1) [expr2]”. + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods 'let! ... and! ...' yapısı, yalnızca hesaplama ifadesi oluşturucu bir '{0}' metodunu ya da uygun 'MergeSources' ve 'Bind' metotlarını tanımlarsa kullanılabilir @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - Geçersiz sürdürülebilir kod. Sürdürülebilir kod belirtiminde bir 'let rec' oluştu + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + Çok durumlu bir birleşim türü bir yapıysa, aynı ada sahip tüm alanların aynı türde olması gerekir. Bu kural adlandırılmamış alanlar olması durumunda oluşturulan ‘Öğe’ adı için de geçerlidir. @@ -1437,6 +1672,11 @@ Bir nitelik optional, in, out, ParamArray, CallerInfo veya Quote bağımsız değişkenlerini belirtemiyor + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} Geçersiz düz metin arasına kod eklenmiş dize. {0} @@ -1457,6 +1697,11 @@ \"interfaces with static abstract methods\" bildirimi gelişmiş bir özelliktir. Rehber için bkz. https://aka.ms/fsharp-iwsams. '#nowarn \"3535\"' veya '--nowarn:3535'. kullanarak bu uyarıyı devre dışı bırakabilirsiniz. + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + '{0}' türü çok fazla yöntem içeriyor. Bulunan: '{1}', üst sınır: '{2}' + + Interface member '{0}' does not have a most specific implementation. '{0}' arabirim üyesinin en belirgin uygulaması yok. @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + Parantezler kaldırılamaz. @@ -2232,11 +2477,6 @@ İmzada {2} bildirilirken uygulamada {3} bildirildiğinden, imza ve uygulamadaki '{1}' türü için {0} tanımları uyumlu değil - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - Kısaltmalar farklı olduğundan ({2} ve {3}), imza ve uygulamadaki '{1}' türü için {0} tanımları uyumlu değil - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. Bir kısaltma imza ile gizlendiğinden, imza ve uygulamadaki '{1}' türü için {0} tanımları uyumlu değil. Kısaltmanın diğer CLI dilleri tarafından görünebilir olması gerekir. Kısaltmayı imzada görünür yapmayı düşünün. @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - Geçersiz kayıt, dizi veya hesaplama ifadesi. Dizi ifadeleri 'seq {{ ... }}' biçiminde olmalıdır + Geçersiz kayıt, dizi veya hesaplama ifadesi. Dizi ifadeleri 'seq {{ ... }}' biçiminde olmalıdır @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - Etkin desen için bu geçerli bir ad değil + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - F#7 ve altı için, statik değer tanımları yalnızca birincil oluşturucu ('type X(args) = ...') içeren türlerde kullanılabilir. Bunları diğer tüm türlerde etkinleştirmek için 'önizleme' dil sürümünü kullanın. + F#7 ve altı için, 'let', 'do' ve 'member val' statik değer tanımları yalnızca birincil oluşturucu ('type X(args) = ...') içeren türlerde kullanılabilir. Bunları diğer tüm türlerde etkinleştirmek için dil sürümü '8' ve üstünü kullanın. @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - Hata ayıklama türünü belirtin: full, portable, embedded, pdbonly. (Hata ayıklama türü belirtilmemişse '{0}' varsayılandır ve çalışan bir programa hata ayıklayıcı iliştirmeyi etkinleştirir. 'portable' bir çoklu platform biçimidir, 'embedded' çıkış dosyasına gömülü bir çoklu platform biçimidir). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ '{0}' değeri satır içi olarak işaretlenmiş ancak iyileştirme ortamında bağlanmamış - - Local value {0} not found during optimization - İyileştirme sırasında {0} yerel değeri bulunamadı - - A value marked as 'inline' has an unexpected value 'inline' olarak işaretlenmiş değerde beklenmeyen bir değer var @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - Bu bayt dizisi sabit değeri tek bayt olarak kodlanmayan karakterler içeriyor + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ Geçersiz kayan noktalı sayı - + This number is outside the allowable range for decimal literals Bu sayı, ondalık sabit değerleri için izin verilen aralığın dışında - + This number is outside the allowable range for 32-bit floats Bu sayı, 32 bit kayan noktalı sayılar için izin verilen aralığın dışında @@ -6392,11 +6627,6 @@ Bu, geçerli bir sayısal değişmez değer değil. Geçerli sayısal değişmez değerler şunları içerir: 1, 0x1, 0o1, 0b1, 1l (int/int32), 1u (uint/uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (int8/sbyte), 1uy (uint8/byte), 1.0 (float/double), 1.0f (float32/single), 1.0m (decimal), 1I (bigint). - - This is not a valid byte literal - Bu geçerli bir bayt sabit değeri değil - - This is not a valid character literal Bu geçerli bir karakter sabit değeri değil @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - Sunucuyla iletişimde bir sorun oluştuğu için yerleşik derleme hizmeti kullanılmadı. + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - Sağlanan türe statik bağımsız değişkenler uygulanırken bir hata oluştu + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - {0}' bütünleştirilmiş kodunun geçersiz '{1}' değerli TypeProviderAssembly özniteliği var. Bu değer geçerli bir bütünleştirilmiş kod adı olmalıdır + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - Sağlanan metoda statik bağımsız değişkenler uygulanırken bir sorun oluştu + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ Çok durumlu bir birleşim türü bir yapıysa, tüm birleşim durumlarının adları benzersiz olmalıdır. Örneğin: 'type A = B of b: int | C of c: int'. - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - {0}' parametresi için geçerli olan CallerMemberNameAttribute öğesinin hiçbir etkisi olmaz. CallerFilePathAttribute tarafından geçersiz kılındı. + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - Özel durum oluşturabilen bir kod bloğunu tanıtmak için kullanılır. with veya finally ile birlikte kullanılır. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - '{0}' byref genişletme metodu çağrılamıyor. İlk parametre, değerin değişebilir olmasını veya salt okunur olmayan bir byref türünde olmasını gerektiriyor. + '{0}' byref genişletme metodu çağrılamıyor. ‘this’ parametresi, değerin değişebilir olmasını veya salt okunur olmayan bir byref türünde olmasını gerektiriyor. @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - Paket yöneticisi '{0}' anahtar anahtarı bu makinede {1}. Şu anda kayıtlı: {2}. Uzantılar hakkında daha fazla bilgi edinmek için şu adresi ziyaret edin: https://aka.ms/dotnetdepmanager + Paket yöneticisi anahtarı '{0}' {1} altında kayıtlı değil. Şu anda kayıtlı: {2}. Komut satırına '--compilertool:<extensionsfolder>' geçirerek ek yollar sağlayabilirsiniz. Uzantılar hakkında daha fazla bilgi edinmek için şu adresi ziyaret edin: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf index c62c1e73f6..c1b2b3d468 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf @@ -52,6 +52,11 @@ 此表达式是匿名记录,请使用 {{|...|}} 而不是 {{...}}。 + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. 参数重复。此方法中多次使用了参数“{0}”。 @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + 索引属性的 Getter 和 Setter 的类型必须相同。属性“{0}”的 Getter 的类型为“{1}”,而 Setter 的类型为“{2}”。 @@ -122,14 +127,24 @@ 成员或函数“{0}”具有 "TailCallAttribute" 属性,但未以尾递归方式使用。 + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + 应仅通过类型参数调用静态抽象非虚拟接口成员(例如: “T.{0}”)。 + + + + Classes cannot contain static abstract members. + 类不能包含静态抽象成员。 + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + 对象表达式无法实现具有静态抽象成员或声明静态成员的接口。 The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + TailCall 属性应仅应用于递归函数。 @@ -147,6 +162,11 @@ 可用重载:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + “{0}”不支持类型“{1}”,因为后者缺少所需的(实际或内置)成员“{2}” + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. 泛型构造要求泛型类型参数被视为结构或引用类型。请考虑添加类型注释。 @@ -177,6 +197,11 @@ 已知类型参数: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match 索引 {0} 处的参数不匹配 @@ -187,6 +212,16 @@ 参数 "{0}" 不匹配 + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent 约束 "unmanaged" 和 "not struct" 不一致 @@ -212,6 +247,11 @@ 程序集属性“{0}”引用了无法加载或不存在的设计器程序集“{1}”。报告的异常是: {2} - {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function 用于仅存取器函数的下划线点速记 @@ -222,6 +262,16 @@ 附加类型定向转换 + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions 适用的计算表达式 @@ -242,6 +292,11 @@ 自动生成“异常”声明的“消息”属性 + + Boolean-returning and return-type-directed partial active patterns + 布尔返回模式和返回类型定向部分活动模式 + + Allow implicit Extension attribute on declaring types, modules 允许对声明类型、模块使用隐式扩展属性 @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + 如果在非递归函数上使用“TailCall”属性,则引发警告。 @@ -272,16 +327,36 @@ 修复了委托类型名称的解析,请参阅 https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding 放弃使用绑定模式 + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal 无点 float32 文本 + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + 强制使用 AttributeTargets + + Raises errors for non-virtual members overrides 引发非虚拟成员替代的错误 @@ -362,6 +437,21 @@ 具有多个泛型实例化的接口 + + Optimizes interpolated strings in certain cases, by lowering to concatenation + 降低为串联,以在某些情况下优化内插字符串 + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + 将整型范围 (..) 和范围步骤 (.. ..) 运算符的某些用途优化为快速 while 循环。 + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute 当 RequireQualifiedAccess 属性时允许小写 DU @@ -402,6 +492,11 @@ 可以为 null 的可选互操作 + + nullness checking + nullness checking + + open type declaration 开放类型声明 @@ -417,9 +512,24 @@ 包管理 + + # directives with non-quoted string arguments + # 指令的字符串参数不带引号 + + + + Unexpected identifier '{0}'. + 意外的标识符:“{0}”。 + + + + Unexpected integer literal '{0}'. + 意外的整数文本“{0}”。 + + prefer extension method over plain property - prefer extension method over plain property + 首选扩展方法而不是纯属性 @@ -443,8 +553,8 @@ - whitespace relexation - 空格松弛法 + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + 只要它们具有相同的名称和类型,即可在 [<Struct>] 中共享基础字段 @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + 联合用例测试属性 @@ -517,9 +627,14 @@ C# 和 F# 的非托管泛型约束之间的互操作(发出额外的 modreq) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + 索引属性 getter 和 setter 必须具有相同的类型 @@ -647,6 +762,11 @@ 在计算表达式中用于引入循环构造,其中条件是另一个计算表达式的结果。 + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated 不能内插字节字符串 @@ -662,11 +782,26 @@ 不再支持 IF-FSHARP/IF-CAML 区域 + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier 这不是有效的标识符 + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. 在内插字符串中,必需对 "}}" 字符进行转义(通过加倍)。 @@ -772,6 +907,11 @@ 将所有编译文件的推断接口打印到关联的签名文件 + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache 清除包管理器结果缓存 @@ -807,6 +947,11 @@ pdb 输出文件名不能与生成输出文件名 use --pdb: filename.pdb 匹配 + + Generate assembly with IL visibility that matches the source code visibility + 生成具有与源代码可见性匹配的 IL 可见性的程序集 + + Produce a reference assembly, instead of a full assembly, as the primary output 生成引用程序集而不是完整程序集作为主输出 @@ -912,21 +1057,26 @@ 应为表达式 - - Expecting record field - Expecting record field - - Expecting pattern 预期模式 + + Expecting record field + Expecting record field + + Expecting type 预期类型 + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) 字符文本不完整(示例: "Q")或限定类型调用(示例: "T.Name") @@ -957,9 +1107,14 @@ 此成员访问权限不明确。请在对象创建周围使用括号,例如 “(new SomeType(args)).MemberName” + + Only simple patterns are allowed in primary constructors + 主构造函数中只允许使用简单模式 + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + 静态构造的声明不完整。使用“static let”、“static do”、“static member”或“static val”进行声明。 @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - 可恢复代码规范中发生受约束的泛型构造 + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - 可恢复代码规范中出现 "let rec" + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (建议名称) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + 此活动模式需要 {0} 个表达式参数,例如“{1}{2}”。 + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + 此活动模式需要 {0} 个表达式参数和一个模式参数,例如 “{1}{2} pat”。 + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + 此活动模式不需要任何参数,即它应像“{0}”而不是 “{1}x” 一样使用。 + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + 此活动模式只需要一个模式参数,例如 “{0} pat”。 + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. 此处的 _ 含义不明确。它不能用于同一范围内的已放弃变量和函数速记。 @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + 仅原子表达式支持速记 lambda 语法,例如隐含的“_”参数上的方法、属性、字段或索引器。例如:“let f = _.Length”。 + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + 这是一个隐藏联合事例的函数定义。如果这是你想要的,请忽略或取消此警告。如果希望它是联合大小写析构,请添加括号。 @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - 必须初始化以下必需属性: {0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + 找不到与此替代对应的静态抽象成员 No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + 未找到与此重写对应的静态抽象属性 @@ -1327,6 +1517,16 @@ 值 '{0}' 不是函数,不支持索引表示法。 + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. 语法“expr1[expr2]”用作参数时不明确。请参阅 https://aka.ms/fsharp-index-notation。如果要索引或切片,则必须在参数位置使用“expr1.[expr2]”。如果使用多个扩充参数调用函数,请在它们之间添加空格,例如“someFunction expr1 [expr2]”。 @@ -1352,6 +1552,41 @@ 语法“(expr1)[expr2]”现在保留用于索引,用作参数时不明确。请参见 https://aka.ms/fsharp-index-notation。如果使用多个扩充参数调用函数, 请在它们之间添加空格,例如“someFunction (expr1) [expr2]”。 + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods 仅当计算表达式生成器定义了 "{0}" 方法或适当的 "MergeSources" 和 "Bind" 方法时,才可以使用 "let! ... and! ..." 构造 @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - 可恢复代码无效。可恢复代码规范中出现 "let rec" + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + 如果多重联合类型是结构,则具有相同名称的所有字段必须具有相同的类型。对于未命名字段,此规则也适用于生成的“Item”名称。 @@ -1437,6 +1672,11 @@ 特征不能指定 option、in、out、ParamArray、CallerInfo 或 Quote 参数 + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} 内插字符串无效。{0} @@ -1457,6 +1697,11 @@ 声明“使用静态抽象方法的接口”是一项高级功能。有关指南,请参阅 https://aka.ms/fsharp-iwsams。可以使用 "#nowarn \"3535\"' 或 '--nowarn:3535' 禁用此警告。 + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + 类型“{0}”的方法太多。1️⃣找到:“{1}”,最大值:“{2}” + + Interface member '{0}' does not have a most specific implementation. 接口成员“{0}”没有最具体的实现。 @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + 可以移除括号。 @@ -2232,11 +2477,6 @@ 签名和实现中类型“{1}”的 {0} 定义不兼容,因为签名声明的是 {2},而实现声明的是 {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - 签名和实现中类型“{1}”的 {0} 定义不兼容,因为缩写不同: {2} 与 {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. 签名和实现中类型“{1}”的 {0} 定义不兼容,因为签名将隐藏缩写。缩写必须对其他 CLI 语言可见。请考虑使缩写在签名中可见。 @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - 记录、序列或计算表达式无效。序列表达式的格式应为“seq {{ ... }}” + 记录、序列或计算表达式无效。序列表达式的格式应为“seq {{ ... }}” @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - 对于活动模式来说,这不是有效的名称 + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - 对于 F#7 及更低版本,静态值定义只能用于具有主构造函数的类型 ("type X(args) = ...")。若要在所有其他类型中启用它们,请使用“预览版”语言版本。 + 对于 F#7 及更低版本,静态“let”、“do”和“member val”定义只能用于具有主构造函数的类型 ("type X(args) = ...")。若要在所有其他类型中启用它们,请使用语言版本“8”或更高版本。 @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - 指定调试类型: full、portable、embedded、pdbonly。(若未指定调试类型,则默认为“{0}”,它允许将调试程序附加到正在运行的程序。"portable" 是跨平台格式,"embedded" 是嵌入到输出文件中的跨平台格式)。 + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ 值“{0}”已标记为“inline”,但其未在优化环境中绑定 - - Local value {0} not found during optimization - 优化过程中未找到本地值 {0} - - A value marked as 'inline' has an unexpected value 标记为“inline”的值具有意外的值 @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - 此字节数组文本包含不会以单字节形式进行编码的字符 + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ 浮点数无效 - + This number is outside the allowable range for decimal literals 此数字在允许的十进制文本范围之外 - + This number is outside the allowable range for 32-bit floats 此数字在允许的 32 位浮点数范围之外 @@ -6392,11 +6627,6 @@ 这不是有效的数值文本。有效数值包括 1、0x1、0o1、0b1、1l (int/int32)、1u (uint/uint32)、1L (int64)、1UL (uint64)、1s (int16)、1us (uint16)、1y (int8/sbyte)、1uy (uint8/byte)、1.0 (float/double)、1.0f (float32/single)、1.0m (decimal)、1I (bigint)。 - - This is not a valid byte literal - 这不是有效的字节文本 - - This is not a valid character literal 这不是有效的字符文本 @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - 未使用驻留编译服务,因为与服务器通信时发生问题。 + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - 将静态参数应用于所提供类型时发生错误 + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - 程序集“{0}”的 TypeProviderAssembly 特性具有无效值“{1}”。该值应为有效的程序集名称 + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - 将静态参数应用于提供的方法时发生错误 + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ 如果多事例联合类型是结构,则所有联合事例都必须具有唯一的名称。例如: “type A = B of b: int | C of c: int”。 - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - 应用于参数“{0}”的 CallerMemberNameAttribute 不会起作用。它已由 CallerFilePathAttribute 替代。 + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - 用于引入可能产生异常的代码块。与 with 或 finally 配合使用。 + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - 无法调用 byref 扩展方法 "{0}"。第一个参数要求该值是可变的或非只读的 byref 类型。 + 无法调用 byref 扩展方法 "{0}"。“'this”参数要求该值是可变的或非只读的 byref 类型。 @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - {0} 中未注册包管理器密钥“{1}”。当前已注册: {2}。若要详细了解扩展,请访问: https://aka.ms/dotnetdepmanager + 未在 {1} 中注册包管理器密钥“{0}”。当前已注册: {2}。可以通过将“--compilertool:<extensionsfolder>”传递到命令行来提供额外的路径。若要了解有关扩展的详细信息,请访问: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf index 5f66fcae4e..7c6c76ff2f 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf @@ -52,6 +52,11 @@ 此運算式是匿名記錄,請使用 {{|...|}} 而不是 {{...}}。 + + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + This construct is deprecated. Sequence expressions should be of the form 'seq {{ ... }}' + + Duplicate parameter. The parameter '{0}' has been used more that once in this method. 重複的參數。參數 '{0}' 在此方法中使用多次。 @@ -84,7 +89,7 @@ An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. - An indexed property's getter and setter must have the same type. Property '{0}' has getter of type '{1}' but setter of type '{2}'. + 索引屬性的 getter 和 setter 必須具有相同類型。屬性 '{0}' 的 getter 類型為 '{1}',但 setter 類型為 '{2}'。 @@ -122,14 +127,24 @@ 成員或函式 '{0}' 具有 'TailCallAttribute' 屬性,但未以尾遞迴方式使用。 + + A static abstract non-virtual interface member should only be called via type parameter (for example: 'T.{0}). + 靜態抽象非虛擬介面成員只能透過型別參數 (呼叫,例如 'T.{0})。 + + + + Classes cannot contain static abstract members. + 類別不能包含靜態抽象成員。 + + Object expressions cannot implement interfaces with static abstract members or declare static members. - Object expressions cannot implement interfaces with static abstract members or declare static members. + 物件運算式無法實作具有靜態抽象成員的介面或宣告靜態成員。 The TailCall attribute should only be applied to recursive functions. - The TailCall attribute should only be applied to recursive functions. + TailCall 屬性只應套用至遞迴函數。 @@ -147,6 +162,11 @@ 可用的多載:\n{0} + + '{0}' does not support the type '{1}', because the latter lacks the required (real or built-in) member '{2}' + '{0}' 不支援類型 '{1}',因為後者缺少必要的 (實際或內建) 成員 '{2}' + + A generic construct requires that a generic type parameter be known as a struct or reference type. Consider adding a type annotation. 泛型建構要求泛型型別參數必須指定為結構或參考型別。請考慮新增型別註解。 @@ -177,6 +197,11 @@ 已知的型別參數: {0} + + The constraints 'null' and 'not null' are inconsistent + The constraints 'null' and 'not null' are inconsistent + + Argument at index {0} doesn't match 位於索引 {0} 的引數不相符 @@ -187,6 +212,16 @@ 引數 '{0}' 不相符 + + The type '{0}' supports 'null' but a non-null type is expected + The type '{0}' supports 'null' but a non-null type is expected + + + + The type '{0}' uses 'null' as a representation value but a non-null type is expected + The type '{0}' uses 'null' as a representation value but a non-null type is expected + + The constraints 'unmanaged' and 'not struct' are inconsistent 條件約束 'unmanaged' 與 'not struct' 不一致 @@ -212,6 +247,11 @@ 無法載入組件屬性 '{0}' 參考的設計工具組件 '{1}' 或其不存在。回報的例外狀況: {2} - {3} + + {0} for F# {1} + {0} for F# {1} + + underscore dot shorthand for accessor only function 僅存取子函式的底線點速記 @@ -222,6 +262,16 @@ 其他類型導向轉換 + + Allow access modifiers to auto properties getters and setters + Allow access modifiers to auto properties getters and setters + + + + Allow object expressions without overrides + Allow object expressions without overrides + + applicative computation expressions 適用的計算運算式 @@ -242,6 +292,11 @@ 自動產生 'exception' 宣告的 'Message' 屬性 + + Boolean-returning and return-type-directed partial active patterns + 布爾值傳回和傳回類型導向的部分現用模式 + + Allow implicit Extension attribute on declaring types, modules 允許宣告類型、模組上的隱含擴充屬性 @@ -254,7 +309,7 @@ Raises warnings if the 'TailCall' attribute is used on non-recursive functions. - Raises warnings if the 'TailCall' attribute is used on non-recursive functions. + 如果 'TailCall' 屬性用於非遞迴函數,則引發警告。 @@ -272,16 +327,36 @@ 修正委派類型名稱的解析,請參閱 https://github.com/dotnet/fsharp/issues/10228 + + Deprecate places where 'seq' can be omitted + Deprecate places where 'seq' can be omitted + + discard pattern in use binding 捨棄使用繫結中的模式 + + Don't warn on uppercase identifiers in binding patterns + Don't warn on uppercase identifiers in binding patterns + + dotless float32 literal 無點號的 float32 常值 + + Support for computation expressions with empty bodies: builder {{ }} + Support for computation expressions with empty bodies: builder {{ }} + + + + Enforce AttributeTargets + 強制使用 AttributeTargets + + Raises errors for non-virtual members overrides 引發非虛擬成員覆寫的錯誤 @@ -362,6 +437,21 @@ 具有多個泛型具現化的介面 + + Optimizes interpolated strings in certain cases, by lowering to concatenation + 在特定情況下,藉由降低為串連來最佳化差補字串 + + + + Optimizes certain uses of the integral range (..) and range-step (.. ..) operators to fast while-loops. + 最佳化整數範圍 (..) 和 range 步驟 (.. ..) 運算子的特定用法,以加快 while 迴圈。 + + + + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + Lowers [for x in xs -> f x] and [|for x in xs -> f x|] to fast loops when xs is a list or an array, respectively. + + Allow lowercase DU when RequireQualifiedAccess attribute RequireQualifiedAccess 屬性時允許小寫 DU @@ -402,6 +492,11 @@ 可為 Null 的選擇性 Interop + + nullness checking + nullness checking + + open type declaration 開放式類型宣告 @@ -417,9 +512,24 @@ 套件管理 + + # directives with non-quoted string arguments + # 個具有非引號字串引數的指示詞 + + + + Unexpected identifier '{0}'. + 未預期的識別碼 '{0}'。 + + + + Unexpected integer literal '{0}'. + 未預期的整數常值 '{0}'。 + + prefer extension method over plain property - prefer extension method over plain property + 偏好延伸模組方法勝於純文字屬性 @@ -443,8 +553,8 @@ - whitespace relexation - 空白字元放寬 + whitespace relaxation + whitespace relaxation @@ -464,7 +574,7 @@ Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type - Share underlying fields in a [<Struct>] discriminated union as long as they have same name and type + 只要 [<Struct>] 具有相同名稱和類型,就以強制聯集共用基礎欄位 @@ -504,7 +614,7 @@ Union case test properties - Union case test properties + 聯集案例測試屬性 @@ -517,9 +627,14 @@ C# 與 F# 的非受控泛型條件約束之間的 Interop (發出額外的 modreq) + + Use type conversion cache during compilation + Use type conversion cache during compilation + + Indexed properties getter and setter must have the same type - Indexed properties getter and setter must have the same type + 索引屬性 getter 和 setter 必須具有相同的類型 @@ -647,6 +762,11 @@ 用於計算運算式中,以引進迴圈建構,其中條件是另一個計算運算式的結果。 + + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + This byte array literal contains {0} non-ASCII characters. All characters should be < 128y. + + a byte string may not be interpolated 位元組字串不能是插補字串 @@ -662,11 +782,26 @@ 不再支援 IF-FSHARP/IF-CAML 區域 + + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + This is not a valid byte character literal. The value must be less than or equal to '\127'B. + + + + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + '{0}' is not a valid character literal.\nNote: Currently the value is wrapped around byte range to '{1}'. In a future F# version this warning will be promoted to an error. + + This is not a valid identifier 這不是有效的識別項 + + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + This is not a valid byte character literal. The value must be less than or equal to '\127'B.\nNote: In a future F# version this warning will be promoted to an error. + + A '}}' character must be escaped (by doubling) in an interpolated string. 在插補字串中,必須將 '}}' 字元逸出 (重複一次)。 @@ -772,6 +907,11 @@ 將所有編譯檔案的推斷介面列印至相關聯的簽章檔案 + + Enable nullness declarations and checks + Enable nullness declarations and checks + + Clear the package manager results cache 清除封裝管理員結果快取 @@ -807,6 +947,11 @@ pdb 輸出檔案名與使用 --pdb:filename.pdb 的建置輸出檔案名不相符 + + Generate assembly with IL visibility that matches the source code visibility + 產生具有符合原始程式碼可見度的 IL 可見度組件 + + Produce a reference assembly, instead of a full assembly, as the primary output 產生參考組件,而非完整組件作為主要輸出 @@ -912,21 +1057,26 @@ 必須是運算式 - - Expecting record field - Expecting record field - - Expecting pattern 必須是模式 + + Expecting record field + Expecting record field + + Expecting type 必須是類型 + + Expecting union case field + Expecting union case field + + Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name) 不完整的字元文字 (範例: 'Q') 或限定類型調用 (範例: 'T.Name) @@ -957,9 +1107,14 @@ 此成員存取不明確。請在物件建立前後加上括弧,例如「(new SomeType(args)).MemberName」 + + Only simple patterns are allowed in primary constructors + 主要建構函式中只允許簡單模式 + + Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. - Incomplete declaration of a static construct. Use 'static let','static do','static member' or 'static val' for declaration. + 不完整的靜態建構宣告。使用 'static let'、'static do'、'static member' 或 'static val' 進行宣告。 @@ -988,8 +1143,8 @@ - A constrained generic construct occured in the resumable code specification - 可繼續的程式碼規格中出現了限制式泛型建構 + A constrained generic construct occurred in the resumable code specification + A constrained generic construct occurred in the resumable code specification @@ -1003,8 +1158,8 @@ - A 'let rec' occured in the resumable code specification - 可繼續的程式碼規格中發生 'let rec' + A 'let rec' occurred in the resumable code specification + A 'let rec' occurred in the resumable code specification @@ -1072,6 +1227,31 @@ (建議的名稱) + + Access modifiers cannot be applied to an SRTP constraint. + Access modifiers cannot be applied to an SRTP constraint. + + + + This active pattern expects {0} expression argument(s), e.g., '{1}{2}'. + 此現用模式需要 {0} 運算式引數,例如 '{1}{2}'。 + + + + This active pattern expects {0} expression argument(s) and a pattern argument, e.g., '{1}{2} pat'. + 此現用模式需要 {0} 運算式引數和模式引數,例如 '{1}{2} pat'。 + + + + This active pattern does not expect any arguments, i.e., it should be used like '{0}' instead of '{1} x'. + 這個現用模式並不需要任何引數,例如,應該使用像是 '{0}' 而不是 '{1} x'。 + + + + This active pattern expects exactly one pattern argument, e.g., '{0} pat'. + 此現用模式需要剛好一個模式引數,例如 '{0} pat'。 + + The meaning of _ is ambiguous here. It cannot be used for a discarded variable and a function shorthand in the same scope. 此處的 _ 意義不明確。它不能在同一個範圍中既作為已捨棄的變數又作為函式速記。 @@ -1159,7 +1339,17 @@ Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. - Shorthand lambda syntax is only supported for atomic expressions, such as method, property, field or indexer on the implied '_' argument. For example: 'let f = _.Length'. + 只有不可部分完成運算式才支援速記 Lambda 語法,例如隱含 '_' 引數上的方法、屬性、欄位或索引子。例如: 'let f = _.Length'。 + + + + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + Nullness warning: Downcasting from '{0}' into '{1}' can introduce unexpected null values. Cast to '{2}|null' instead or handle the null before downcasting. + + + + An empty body may only be used if the computation expression builder defines a 'Zero' method. + An empty body may only be used if the computation expression builder defines a 'Zero' method. @@ -1199,7 +1389,7 @@ This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. - This is a function definition that shadows a union case. If this is what you want, ignore or suppress this warning. If you want it to be a union case deconstruction, add parentheses. + 這是陰影等位案例的函式定義。如果這是您要的,請忽略或隱藏此警告。如果您希望它是等位案例解構,請新增括弧。 @@ -1278,8 +1468,8 @@ - The following required properties have to be initalized:{0} - 下列必要的屬性必須初始化:{0} + The following required properties have to be initialized:{0} + The following required properties have to be initialized:{0} @@ -1299,12 +1489,12 @@ No static abstract member was found that corresponds to this override - No static abstract member was found that corresponds to this override + 找不到對應到這個覆寫的靜態抽象成員 No static abstract property was found that corresponds to this override - No static abstract property was found that corresponds to this override + 找不到對應到這個覆寫的靜態抽象屬性 @@ -1327,6 +1517,16 @@ 值 '{0}' 並非函式,不支援索引標記法。 + + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + With nullness checking enabled, overrides of .ToString() method must return a non-nullable string. You can handle potential nulls via the built-in string function. + + + + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + The 'nullness checking' language feature is not enabled. This use of a nullness checking construct will be ignored. + + The syntax 'expr1[expr2]' is ambiguous when used as an argument. See https://aka.ms/fsharp-index-notation. If you intend indexing or slicing then you must use 'expr1.[expr2]' in argument position. If calling a function with multiple curried arguments, add a space between them, e.g. 'someFunction expr1 [expr2]'. 語法 'expr1[expr2]' 用作引數時不明確。請參閱 https://aka.ms/fsharp-index-notation。如果您要編製索引或切割,則必須在引數位置使用 'expr1.[expr2]'。如果要呼叫具有多個調用引數的函式,請在它們之間新增空格,例如 'someFunction expr1 [expr2]'。 @@ -1352,6 +1552,41 @@ 語法 '(expr1)[expr2]' 現已為編製索引保留,但用作引數時不明確。請參閱 https://aka.ms/fsharp-index-notation。如果要呼叫具有多個調用引數的函式,請在它們之間新增空格,例如 'someFunction (expr1) [expr2]'。 + + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + Multi-case partial active patterns are not supported. Consider using a single-case partial active pattern or a full active pattern. + + + + Value known to be without null passed to a function meant for nullables: {0} + Value known to be without null passed to a function meant for nullables: {0} + + + + You can remove this |Null|NonNull| pattern usage. + You can remove this |Null|NonNull| pattern usage. + + + + You can remove this |NonNullQuick| pattern usage. + You can remove this |NonNullQuick| pattern usage. + + + + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + You can create 'Some value' directly instead of 'ofObj', or consider not using an option for this value. + + + + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + You can create 'ValueSome value' directly instead of 'ofObj', or consider not using a voption for this value. + + + + You can remove this `nonNull` assertion. + You can remove this `nonNull` assertion. + + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods 只有在計算運算式產生器定義 '{0}' 方法或正確的 'MergeSource' 和 'Bind' 方法時,才可使用 'let! ... and! ...' 建構 @@ -1368,8 +1603,8 @@ - Invalid resumable code. A 'let rec' occured in the resumable code specification - 可繼續的程式碼無效。可繼續的程式碼規格中發生 'let rec' + Invalid resumable code. A 'let rec' occurred in the resumable code specification + Invalid resumable code. A 'let rec' occurred in the resumable code specification @@ -1399,7 +1634,7 @@ If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. - If a multicase union type is a struct, then all fields with the same name must be of the same type. This rule applies also to the generated 'Item' name in case of unnamed fields. + 如果多寫聯集類型是結構,則所有具有相同名稱的欄位都必須是相同的類型。此規則也適用於未命名欄位時產生的 'Item' 名稱。 @@ -1437,6 +1672,11 @@ 特徵不能指定選擇性、in、out、ParamArray、CallerInfo 或 Quote 引數 + + The type '{0}' does not support a nullness qualification. + The type '{0}' does not support a nullness qualification. + + Invalid interpolated string. {0} 插補字串無效。{0} @@ -1457,6 +1697,11 @@ 使用「靜態抽象方法宣告介面」是進階的功能。請參閱 https://aka.ms/fsharp-iwsams 以尋求指引。您可以使用 '#nowarn \"3535\"' 或 '--nowarn:3535' 來停用此警告。 + + The type '{0}' has too many methods. Found: '{1}', maximum: '{2}' + 類型 '{0}' 有太多方法。找到: '{1}',最大值: '{2}' + + Interface member '{0}' does not have a most specific implementation. 介面成員 '{0}' 沒有最具體的實作。 @@ -1619,7 +1864,7 @@ Parentheses can be removed. - Parentheses can be removed. + 可以移除括號。 @@ -2232,11 +2477,6 @@ 簽章與實作中類型 '{1}' 的 {0} 定義不相容,因為簽章宣告 {2},而實作則宣告 {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ: {2} versus {3} - 簽章與實作中類型 '{1}' 的 {0} 定義不相容,因為縮寫不同: {2} 與 {3} - - The {0} definitions for type '{1}' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. 簽章與實作中類型 '{1}' 的 {0} 定義不相容,因為簽章隱藏了某縮寫。其他 CLI 語言必須可看見該縮寫。請考慮使縮寫在簽章中可見。 @@ -4309,7 +4549,7 @@ Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq {{ ... }}' - 無效的記錄、循序項或計算運算式。循序項運算式應該是 'seq {{ ... }}' 形式。 + 無效的記錄、循序項或計算運算式。循序項運算式應該是 'seq {{ ... }}' 形式。 @@ -4738,8 +4978,8 @@ - This is not a valid name for an active pattern - 這不是現用模式的有效名稱 + '{0}' is not a valid method name. Use a 'let' binding instead. + '{0}' is not a valid method name. Use a 'let' binding instead. @@ -5099,7 +5339,7 @@ For F#7 and lower, static 'let','do' and 'member val' definitions may only be used in types with a primary constructor ('type X(args) = ...'). To enable them in all other types, use language version '8' or higher. - 對於 F#7 和更低版本,靜態值定義只能用於具有主要建構函式的類型 ('type X(args) = ...')。若要在所有其他類型中啟用,請使用語言版本 'preview'。 + 對於 F#7 和更低版本,靜態 'let'、'do' 和 'member val' 定義只能用於具有主要建構函式的類型 ('type X(args) = ...')。若要在所有其他類型中啟用,請使用語言版本 '8' 或更新版本。 @@ -5683,8 +5923,8 @@ - Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - 指定偵錯類型: full、portable、embedded、pdbonly。(如果未指定偵錯類型,即預設為 '{0}',並允許將偵錯工具附加到正在執行的程式,'portable' 為跨平台格式,'embedded' 為輸出檔案內嵌的跨平台格式)。 + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). + Specify debugging type: full, portable, embedded, pdbonly. ('{0}' is the default if no debugging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). @@ -6187,11 +6427,6 @@ 值 '{0}' 已標記為內嵌,但是未在最佳化環境中繫結 - - Local value {0} not found during optimization - 最佳化期間找不到區域數值 {0} - - A value marked as 'inline' has an unexpected value 標記為 'inline' 的值有未預期的值 @@ -6308,8 +6543,8 @@ - This byte array literal contains characters that do not encode as a single byte - 這個位元組陣列常值包含不會編碼成單一位元組的字元 + This byte array literal contains {0} characters that do not encode as a single byte + This byte array literal contains {0} characters that do not encode as a single byte @@ -6377,12 +6612,12 @@ 無效的浮點數 - + This number is outside the allowable range for decimal literals 這個數字已經超出十進位常值允許的範圍 - + This number is outside the allowable range for 32-bit floats 這個數字已經超出 32 位元浮點數允許的範圍 @@ -6392,11 +6627,6 @@ 這不是有效的數值常值。有效的數值常值包括 1, 0x1、0o1、0b1、1l (int/int32)、1u (uint/uint32)、1L (int64)、1UL (uint64)、1s (int16)、1us (uint16)、1y (int8/sbyte)、1uy (uint8/byte)、1.0 (float/double)、1.0f (float32/single)、1.0m (decimal)、1I (bigint)。 - - This is not a valid byte literal - 這不是有效的位元組常值 - - This is not a valid character literal 這不是有效的字元常值 @@ -6948,8 +7178,8 @@ - The resident compilation service was not used because a problem occured in communicating with the server. - 未使用常駐編譯服務,因為伺服器發生通訊問題。 + The resident compilation service was not used because a problem occurred in communicating with the server. + The resident compilation service was not used because a problem occurred in communicating with the server. @@ -7148,8 +7378,8 @@ - An error occured applying the static arguments to a provided type - 將靜態引數套用至提供的類型時發生錯誤 + An error occurred applying the static arguments to a provided type + An error occurred applying the static arguments to a provided type @@ -7213,8 +7443,8 @@ - Assembly '{0}' hase TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name - 組件 '{0}' 的 TypeProviderAssembly 屬性值 '{1}' 無效。此值必須是有效的屬性名稱 + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name + Assembly '{0}' has TypeProviderAssembly attribute with invalid value '{1}'. The value should be a valid assembly name @@ -7798,8 +8028,8 @@ - An error occured applying the static arguments to a provided method - 將靜態引數套用至所提供的方法時,發生錯誤 + An error occurred applying the static arguments to a provided method + An error occurred applying the static arguments to a provided method @@ -7927,9 +8157,9 @@ 如果多案例聯集類型是結構,則所有聯集案例都必須有唯一的名稱。例如: 'type A = B of b: int | C of c: int'。 - + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - 套用至參數 '{0}' 的 CallerMemberNameAttribute 將不會有作用。CallerFilePathAttribute 會加以覆寫。 + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. @@ -8243,8 +8473,8 @@ - Used to introduce a block of code that might generate an exception. Used together with with or finally. - 用於引入可能會產生例外狀況的程式碼區塊。這會與 with 或 finally 並用。 + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. + Used to introduce a block of code that might generate an exception. Used together with 'with' or 'finally'. @@ -8504,7 +8734,7 @@ Cannot call the byref extension method '{0}. 'this' parameter requires the value to be mutable or a non-readonly byref type. - 無法呼叫 byref 擴充方法 '{0}。第一個參數需要值可變動,或為非唯讀 byref 類型。 + 無法呼叫 byref 擴充方法 '{0}。'this' 參數需要值可變動,或為非唯讀 byref 類型。 @@ -8594,7 +8824,7 @@ Package manager key '{0}' was not registered in {1}. Currently registered: {2}. You can provide extra path(s) by passing '--compilertool:<extensionsfolder>' to the command line. To learn more about extensions, visit: https://aka.ms/dotnetdepmanager - 未在 {1} 中註冊套件管理員金鑰 '{0}'。目前已註冊: {2}。若要深入了解延伸模組,請瀏覽: https://aka.ms/dotnetdepmanager + 未在 {1} 中登錄封裝管理員金鑰 '{0}'。目前註冊: {2}。您可以將 '--compilertool:<extensionsfolder>' 傳遞至命令列,以提供額外路徑。如需深入了解延伸模組,請瀏覽: https://aka.ms/dotnetdepmanager diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.cs.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.cs.xlf index 318ea1464f..20b53f76f4 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.cs.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.cs.xlf @@ -7,6 +7,31 @@ Názvy argumentů v signatuře {0} a implementaci {1} si neodpovídají. Použije se název argumentu ze souboru signatury. To může způsobit problémy při ladění nebo profilování. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Definice {0} pro typ {1} v signatuře a implementaci nejsou kompatibilní, protože se liší zkratky:\n {2}\noproti\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Neshoda typů Očekává se řazená kolekce členů o délce {0} typu\n {1} \nale odevzdala se řazená kolekce členů o délce {2} typu\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + Očekává se nestatický člen. Static member is expected. - Static member is expected. + Očekává se statický člen. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - Identifikátory proměnných psané velkými písmeny se ve vzorech obecně nedoporučují. Můžou označovat chybějící otevřenou deklaraci nebo špatně napsaný název vzoru. + Identifikátory proměnných psané velkými písmeny se ve vzorech obecně nedoporučují. Můžou označovat chybějící otevřenou deklaraci nebo špatně napsaný název vzoru. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {0} {1} se nedá definovat, protože název {2} a {3} {4} v tomto typu nebo modulu jsou v konfliktu. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ Pole {0} a {1} jsou odlišného typu. + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Omezení hodnoty: Hodnota {0} má odvozený obecný typ\n {1}\nNicméně hodnoty nemohou mít proměnné obecného typu jako '_a v "let x: '_a". Můžete provést jednu z následujících akcí:\n- Definujte jej jako jednoduchý datový termín, například celočíselný literál, řetězcový literál nebo případ sjednocení, například let x = 1\n- Přidejte explicitní typovou anotaci, například let x : int\n- Použijte hodnotu jako negenerický typ v pozdějším kódu pro typovou inferenci, jako například do x\nebo pokud přesto chcete typové výsledky, můžete místo toho {2} definovat jako funkci, a to buď:\n- Přidejte jednotkový parametr, jako například let x()\n- Napište explicitní typové parametry, jako například let x<'a>.\nTato chyba je způsobena tím, že vazba let bez parametrů definuje hodnotu, nikoli funkci. Hodnoty nemůžou být generické, protože se předpokládá, že výsledkem čtení hodnoty bude všude totéž, ale generické typové parametry mohou tento předpoklad zrušit tím, že umožní získat výsledky závislé na typu. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Omezení hodnoty: Hodnota {0} má odvozený obecný typ funkce.\n {1}\n Hodnoty ale nemůžou mít proměnné obecného typu, například _a v let f: _a. Místo toho byste měli {2} definovat jako funkci některým z následujících postupů:\n- Přidejte explicitní parametr, který se použije místo částečné aplikace let f param\n- Přidejte jednotkový parametr jako let f()\n- Napište explicitní typové parametry jako let f<'a>\nebo pokud nemáte v úmyslu, aby byl generický:\n- Přidejte explicitní typovou anotaci jako let f : obj -> obj\n- Použijte argumenty negenerických typů na hodnotu funkce v pozdějším kódu pro typovou inferenci jako do f().\nTato chyba je způsobena tím, že vazba let bez parametrů definuje hodnotu, nikoli funkci. Hodnoty nemůžou být generické, protože se předpokládá, že výsledkem čtení hodnoty bude všude totéž, ale generické typové parametry mohou tento předpoklad zrušit tím, že umožní získat výsledky závislé na typu. + + '{0}' is bound twice in this pattern {0} má v tomto vzoru dvě vazby. @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Tento typ je abstract, protože se neimplementovali někteří abstraktní členové. Pokud je to záměr, pak k typu přidejte atribut [<AbstractClass>]. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Neabstraktní třídy nemohou obsahovat abstraktní členy. Poskytněte výchozí implementaci členů nebo přidejte k danému typu atribut [<AbstractClass>]. @@ -1532,31 +1572,6 @@ Následující pole vyžadují hodnoty: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Omezení hodnoty. Hodnota {0} je obecného typu\n {1}. \nBuď změňte argumenty pro {2} na explicitní, nebo (pokud hodnota nemá být obecná) přidejte poznámku typu. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Omezení hodnoty. Hodnota {0} je obecného typu\n {1}. \nZměňte {2} na funkci s explicitními argumenty nebo (pokud hodnota nemá být obecná) přidejte poznámku typu. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Omezení hodnoty. Tento člen se odvodil jako člen obecného typu\n {0}. \nKonstruktory a metody getter nebo setter vlastnosti nemůžou být obecnější než nadřazený typ. Přidejte poznámku typu, abyste přesně určili, které typy se mají zahrnout. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Omezení hodnoty. Hodnota {0} se odvodila jako hodnota obecného typu\n {1}. \nBuď změňte argumenty pro {2} na explicitní, nebo (pokud hodnota nemá být obecná) přidejte poznámku typu. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Omezení hodnoty. Hodnota {0} se odvodila jako hodnota obecného typu\n {1}. \nDefinujte {2} jako jednoduchý datový výraz, změňte ji na funkci s explicitními argumenty nebo (pokud hodnota nemá být obecná) přidejte poznámku typu. - - syntax error chyba syntaxe @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - Implementace rozhraní by obvykle měly být zadány pro počáteční deklaraci typu. Implementace rozhraní v rozšířeních mohou vést k přístupu ke statickým vazbám před jejich inicializací, ale pouze v případě, že je implementace rozhraní vyvolána během inicializace statických dat a následně umožní přístup ke statickým datům. Toto upozornění můžete odebrat pomocí #nowarn „69“, pokud jste ověřili, že tomu tak není. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + Implementace rozhraní by se měly normálně provádět při počáteční deklaraci typu. Implementace rozhraní v postupných krocích mohou vést k přístupu ke statickým vazbám před jejich inicializací, ale pouze v případě, že je implementace rozhraní vyvolána během inicializace statických dat, a následně může dojít k přístupu ke statickým datům. Toto upozornění můžete odebrat pomocí #nowarn "69", pokud jste zkontrolovali, že tomu tak není. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - Direktivy #I se můžou vyskytovat jenom v souborech skriptu F# (s příponou .fsx nebo .fsscript). Přesuňte tento kód do souboru skriptu nebo přidejte pro tento odkaz možnost kompilátoru -I anebo direktivu ohraničte pomocí notace #if INTERACTIVE/#endif. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + Direktivy #I se můžou používat jenom v souborech skriptu F# (s příponou .fsx nebo .fsscript). Přesuňte tento kód do souboru skriptu nebo přidejte pro tento odkaz možnost kompilátoru -I anebo direktivu ohraničte pomocí notace #if INTERACTIVE/#endif. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - Direktivy #r se můžou vyskytovat jenom v souborech skriptu F# (s příponou .fsx nebo .fsscript). Buď přesuňte tento kód do souboru skriptu, nebo nahraďte tento odkaz možností kompilátoru -r. Pokud se tato direktiva provádí jako uživatelský vstup, můžete ji ohraničit pomocí notace #if INTERACTIVE'/'#endif. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + Direktivy #r se můžou vyskytovat jenom v souborech skriptu F# (s příponou .fsx nebo .fsscript). Buď tento kód přesuňte do souboru skriptu, nebo nahraďte tento odkaz možností kompilátoru -r. Pokud se tato direktiva spouští jako uživatelský vstup, můžete ji oddělit #if INTERACTIVE / #endif. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.de.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.de.xlf index 430b308631..f58d3a4711 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.de.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.de.xlf @@ -7,6 +7,31 @@ Die Argumentnamen in Signatur "{0}" und Implementierung "{1}" stimmen nicht überein. Der Argumentname aus der Signaturdatei wird verwendet. Dadurch können Probleme beim Debuggen oder bei der Profilerstellung auftreten. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Die {0}-Definitionen für den Typ „{1}“ in der Signatur und in der Implementierung sind aufgrund unterschiedlicher Abkürzungen nicht kompatibel:\n {2}\nversus\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Typenkonflikt. Es wurde ein Tupel der Länge {0} des Typs\n {1} \nerwartet, aber ein Tupel der Länge {2} des Typs\n {3}{4}\n angegeben. @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + Ein nicht statischer Member wird erwartet. Static member is expected. - Static member is expected. + Ein statischer Member wird erwartet. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - Variablenbezeichner in Großbuchstaben sollten im Allgemeinen nicht in Mustern verwendet werden und können ein Hinweis auf eine fehlende open-Deklaration oder einen falsch geschriebenen Musternamen sein. + Variablenbezeichner in Großbuchstaben sollten im Allgemeinen nicht in Mustern verwendet werden und können ein Hinweis auf eine fehlende open-Deklaration oder einen falsch geschriebenen Musternamen sein. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {0} "{1}" kann nicht definiert werden, weil der Name "{2}" einen Konflikt mit {3} "{4}" in diesem Typ oder Modul verursacht. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ Die Felder "{0}" und "{1}" stammen aus unterschiedlichen Typen. + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Werteinschränkung: Der Wert "{0}" weist einen abgeleiteten generischen Typ auf.\n {1}\nWerte dürfen jedoch keine generischen Typvariablen wie "_a" in "let x: "_a" aufweisen. Sie können eine der folgenden Aktionen ausführen:\n– Definieren Sie ihn als einfachen Datenausdruck wie ein ganzzahliges Literal, ein Zeichenfolgenliteral oder einen Union-Fall wie "let x = 1"\n– Fügen Sie eine explizite Typanmerkung wie "let x : int" hinzu.\n– Verwenden Sie den Wert als nicht generischen Typ im späteren Code für Typrückschlüsse wie "do x"\noder wenn Sie weiterhin typabhängige Ergebnisse wünschen, können Sie "{2}" stattdessen als Funktion definieren, indem Sie einen der folgenden Schritte ausführen:\n– Fügen Sie einen Einheitenparameter wie "let x()" hinzu.\n– Schreiben Sie explizite Typparameter wie "let x<'a>".\nDieser Fehler liegt daran, dass eine let-Bindung ohne Parameter einen Wert definiert, keine Funktion. Werte können nicht generisch sein, da davon ausgegangen wird, dass das Lesen eines Werts überall zum selben Ergebnis führt, generische Typparameter diese Annahme jedoch möglicherweise ungültig machen, indem typabhängige Ergebnisse aktiviert werden. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Werteinschränkung: Der Wert "{0}" weist einen abgeleiteten generischen Funktionstyp auf.\n {1}\nWerte dürfen jedoch keine generischen Typvariablen wie "_a" in "let f: "_a" aufweisen. Sie sollten stattdessen "{2}" als Funktion definieren, indem Sie einen der folgenden Schritte ausführen:\n– Fügen Sie einen expliziten Parameter hinzu, der angewendet wird, anstatt eine partielle Anwendung "let f param" zu verwenden.\n– Fügen Sie einen Einheitenparameter wie "let f()" hinzu.\n– Schreiben Sie explizite Typparameter wie "let f<'a>",\n oder wenn Sie nicht beabsichtigen, dass er generisch ist, entweder:\n– Fügen Sie eine explizite Typanmerkung wie "let f : obj -> obj" hinzu.\n– Wenden Sie Argumente nicht generischer Typen auf den Funktionswert im späteren Code für Typrückschlüsse wie "do f()" an.\nDieser Fehler liegt daran, dass eine Let-Bindung ohne Parameter einen Wert definiert, keine Funktion. Werte können nicht generisch sein, da davon ausgegangen wird, dass das Lesen eines Werts überall zum selben Ergebnis führt, generische Typparameter diese Annahme jedoch möglicherweise ungültig machen, indem typabhängige Ergebnisse aktiviert werden. + + '{0}' is bound twice in this pattern {0} ist in diesem Muster doppelt gebunden. @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Der Typ entspricht „abstract“, da einige abstrakte Member nicht mit einer Implementierung versehen wurden. Wenn dies Ihre Absicht ist, fügen Sie das [<AbstractClass>]-Attribut zu Ihrem Typ hinzu. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Nicht abstrakte Klassen dürfen keine abstrakten Member enthalten. Stellen Sie entweder eine Standardmemberimplementierung bereit, oder fügen Sie Ihrem Typ das Attribut „[<AbstractClass>]“ hinzu. @@ -1532,31 +1572,6 @@ Für die folgenden Felder sind Werte erforderlich: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Werteinschränkung. Der Wert "{0}" hat den generischen Typ\n {1} \nLegen Sie die Argumente für "{2}" entweder als explizit fest, oder fügen Sie eine Typanmerkung hinzu, wenn der Typ nicht generisch sein soll. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Werteinschränkung. Der Wert "{0}" hat den generischen Typ\n {1} \nDefinieren Sie "{2}" entweder als Funktion mit expliziten Argumenten, oder fügen Sie eine Typanmerkung hinzu, wenn der Typ nicht generisch sein soll. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Werteinschränkung. Dieser Member wurde per Rückschluss abgeleitet als generischer Typ\n {0} \nKonstruktoren und Eigenschaftengetter/-setter dürfen nicht generischer sein als der einschließende Typ. Fügen Sie eine Typanmerkung hinzu, um die genauen Typen anzugeben. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Werteinschränkung. Der Wert "{0}" wurde per Rückschluss abgeleitet als generischer Typ\n {1} \nLegen Sie die Argumente für "{2}" entweder als explizit fest, oder fügen Sie eine Typanmerkung hinzu, wenn der Typ nicht generisch sein soll. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Werteinschränkung. Der Wert "{0}" wurde per Rückschluss abgeleitet als generischer Typ\n {1} \nDefinieren Sie "{2}" entweder als einfachen Ausdruck oder als Funktion mit expliziten Argumenten, oder fügen Sie eine Typanmerkung hinzu, wenn der Typ nicht generisch sein soll. - - syntax error Syntaxfehler @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - Die Implementierung von Schnittstellen sollte normalerweise in der ersten Deklaration eines Typs angegeben werden. Schnittstellenimplementierungen in Augmentationen können dazu führen, dass vor der Initialisierung auf statische Bindungen zugegriffen wird. Die gilt allerdings nur, wenn die Schnittstellenimplementierung während der Initialisierung der statischen Daten aufgerufen wird, und wiederum auf die statischen Daten zugreift. Sie können diese Warnung mit #nowarn "69" entfernen, wenn Sie überprüft haben, dass dies nicht der Fall ist. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + Schnittstellenimplementierungen sollten normalerweise in der ersten Deklaration eines Typs angegeben werden. Schnittstellenimplementierungen in Augmentationen können dazu führen, dass auf statische Bindungen zugegriffen wird, bevor sie initialisiert werden. Dies gilt jedoch nur, wenn die Schnittstellenimplementierung während der Initialisierung der statischen Daten aufgerufen wird und sie wiederum auf die statischen Daten zugreift. Sie können diese Warnung mithilfe von "#nowarn "69"" entfernen, wenn Sie überprüft haben, dass dies nicht der Fall ist. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. #I-Direktiven dürfen nur in F#-Skriptdateien (Dateierweiterungen .fsx oder .fsscript) verwendet werden. Verschieben Sie entweder diesen Code in eine Skriptdatei, fügen Sie die Compileroption "-I" für diesen Verweis hinzu, oder trennen Sie die Direktive mit "#if INTERACTIVE"/"#endif" ab. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - #r-Anweisungen dürfen nur in F#-Skriptdateien (Dateierweiterungen .fsx oder .fsscript) verwendet werden. Verschieben Sie entweder diesen Code in eine Skriptdatei, oder ersetzen Sie diesen Verweis durch die Compileroption "-r". Wenn diese Anweisung als Benutzereingabe ausgeführt wird, trennen Sie sie mit "#if INTERACTIVE"/"#endif" ab. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r-Direktiven dürfen nur in F#-Skriptdateien (Dateierweiterungen .fsx oder .fsscript) verwendet werden. Verschieben Sie entweder diesen Code in eine Skriptdatei, oder ersetzen Sie diesen Verweis durch die Compileroption "-r". Wenn diese Anweisung als Benutzereingabe ausgeführt wird, trennen Sie sie mit "#if INTERACTIVE"/"#endif" ab. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.es.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.es.xlf index 9a94fe0bfc..88a130d699 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.es.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.es.xlf @@ -7,6 +7,31 @@ Los nombres de argumento en la firma "{0}" y la implementación "{1}" no coinciden. Se utilizará el nombre del argumento desde el archivo de firma. Esto puede causar problemas durante la depuración o la generación de perfiles. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Las definiciones de {0} para el tipo "{1}" de la firma y la implementación no son compatibles porque las abreviaciones difieren:\n {2}\nversus\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Error de coincidencia de tipos. Se espera una tupla de longitud {0} de tipo\n {1} \nperero se ha proporcionado una tupla de longitud {2} de tipo\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + Se espera un miembro no estático. Static member is expected. - Static member is expected. + Se espera un miembro estático. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - En general, los identificadores de variables en mayúscula no deben usarse en patrones y pueden indicar una declaración abierta que falta o un nombre de patrón mal escrito. + En general, los identificadores de variables en mayúscula no deben usarse en patrones y pueden indicar una declaración abierta que falta o un nombre de patrón mal escrito. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - No se puede definir el {0} '{1}' porque el nombre '{2}' está en conflicto con el {3} '{4}' de este tipo o módulo. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ Los campos '{0}' y '{1}' son de tipos diferentes. + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restricción de valor: el valor '{0}' tiene un tipo genérico inferido\n {1}\nSin embargo, los valores no pueden tener variables de tipo genérico como '_a en "let x: '_a". Puede realizar una de las siguientes acciones:\n- Definirlo como un término de datos simple como un literal entero, un literal de cadena o un caso de unión como "let x = 1"\n- Agregar una anotación de tipo explícito como "let x : int"\n- Usar el valor como un tipo no genérico en código posterior para la inferencia de tipos como "do x"\no si aún desea resultados dependientes de tipos, puede definir '{2}' como una función en su lugar haciendo lo siguiente:\n- Agregar un parámetro de unidad como "let x()"\n- Escribir parámetros de tipo explícito como "let x<'a>".\nEste error se debe a que un enlace let sin parámetros define un valor, no una función. Los valores no pueden ser genéricos porque se supone que la lectura de un valor da como resultado lo mismo en todas partes, pero los parámetros de tipo genérico pueden invalidar esta suposición habilitando resultados dependientes de tipos. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restricción de valor: el valor '{0}' tiene un tipo de función genérica inferida\n {1}\nSin embargo, los valores no pueden tener variables de tipo genérico como '_a en "let f: '_a". Para definir '{2}' como una función, realice una de las siguientes acciones:\n- Agregue un parámetro explícito que se aplique en lugar de usar una aplicación parcial "let f param"\n- Agregue un parámetro de unidad como "let f()"\n- Escriba parámetros de tipo explícito como "let f<'a>"\no si no pretende que sea genérico, puede:\n- Agregar una anotación de tipo explícito como "let f : obj -> obj"\n- Aplicar argumentos de tipos no genéricos al valor de función en código posterior para la inferencia de tipos como "do f()".\nEste error se debe a que un enlace let sin parámetros define un valor, no una función. Los valores no pueden ser genéricos porque se supone que la lectura de un valor da como resultado lo mismo en todas partes, pero los parámetros de tipo genérico pueden invalidar esta suposición habilitando resultados dependientes de tipos. + + '{0}' is bound twice in this pattern '{0}' está enlazado dos veces en este patrón @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Este tipo es "abstract" ya que a algunos miembros abstractos no se les ha dado una implementación. Si esto es intencional, agregue el atributo "[<AbstractClass>]" + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Las clases no abstractas no pueden contener miembros abstractos. Proporcione una implementación de miembros predeterminados o agregue el atributo "[<AbstractClass>]" al tipo. @@ -1532,31 +1572,6 @@ Los campos siguientes requieren valores: {0}. - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Restricción de valor. El valor '{0}' tiene el tipo genérico\n {1} \nConvierta los argumentos de '{2}' en explícitos o, si su intención no es que sea genérico, agregue una anotación de tipo. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Restricción de valor. El valor '{0}' tiene el tipo genérico\n {1} \nConvierta '{2}' en una función con argumentos explícitos o, si su intención no es que sea genérico, agregue una anotación de tipo. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Restricción de valor. Se ha inferido que este miembro tiene el tipo genérico\n {0} \nLos constructores y los captadores y establecedores de propiedades no pueden ser más genéricos que el tipo envolvente. Agregue una anotación de tipo para indicar los tipos exactos implicados. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Restricción de valor. Se ha inferido que el valor '{0}' tiene el tipo genérico\n {1} \nConvierta los argumentos de '{2}' en explícitos o, si su intención no es que sea genérico, agregue una anotación de tipo. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Restricción de valor. Se ha inferido que el valor '{0}' tiene el tipo genérico\n {1} \nDefina '{2}' como un término de datos simple, conviértalo en una función con argumentos explícitos o, si su intención no es que sea genérico, agregue una anotación de tipo. - - syntax error error de sintaxis @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - Normalmente, las implementaciones de interfaz deben proporcionarse en la declaración inicial de un tipo. Las implementaciones de interfaz en aumentos pueden dar lugar al acceso a enlaces estáticos antes de inicializarse, aunque solo si la implementación de interfaz se invoca durante la inicialización de los datos estáticos y, a su vez, obtiene acceso a los datos estáticos. Puede quitar esta advertencia con #nowarn "69" si ha comprobado que este no es el caso. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + Normalmente, las implementaciones de interfaz deben proporcionarse en la declaración inicial de un tipo. Las implementaciones de interfaz en aumentos pueden dar lugar al acceso a enlaces estáticos antes de inicializarse, aunque solo si la implementación de interfaz se invoca durante la inicialización de los datos estáticos y, a su vez, obtiene acceso a los datos estáticos. Puede quitar esta advertencia con 'nowarn "69"' si ha comprobado que este no es el caso. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - Las directivas #I pueden existir solo en archivos de script de F# (extensiones .fsx o .fsscript). Mueva este código a un archivo de script, agregue una opción de compilador '-I' para esta referencia o delimite la directiva con '#if INTERACTIVE'/'#endif'. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + Las directivas #I solo pueden utilizarse en archivos de script de F# (extensiones .fsx o .fsscript). Mueva este código a un archivo de script, agregue una opción de compilador '-I' para esta referencia o delimite la directiva con '#if INTERACTIVE'/'#endif'. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - Las directivas #r pueden existir solo en archivos de script de F# (extensiones .fsx o .fsscript). Mueva este código a un archivo de script o sustituta esta referencia por la opción de compilador '-r'. Si esta directiva se ejecuta como entrada de usuario, puede delimitarla con '#if INTERACTIVE'/'#endif'. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + Las directivas #r solo pueden utilizarse en archivos de script de F# (extensiones .fsx o .fsscript). Mueva este código a un archivo de script o sustituta esta referencia por la opción de compilador '-r'. Si esta directiva se ejecuta como entrada de usuario, puede delimitarla con '#if INTERACTIVE'/'#endif'. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.fr.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.fr.xlf index 0d5bfd687a..7d7badde4e 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.fr.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.fr.xlf @@ -7,6 +7,31 @@ Les noms d'arguments dans la signature '{0}' et l'implémentation '{1}' ne correspondent pas. Le nom d'argument du fichier de signature va être utilisé. Cela peut entraîner des problèmes durant le débogage ou le profilage. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Les définitions {0} pour le type « {1} » dans la signature et l'implémentation ne sont pas compatibles, car les abréviations sont différentes :\n {2}\npar opposition à\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Incompatibilité de type. Tuple de longueur attendu {0} de type\n {1} \nmais tuple de longueur {2} de type\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + Un membre non statique est attendu. Static member is expected. - Static member is expected. + Un membre statique est attendu. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - Les identificateurs de variables en majuscules ne doivent généralement pas être utilisés dans les modèles. Ils peuvent indiquer une absence de déclaration open ou un nom de modèle mal orthographié. + Les identificateurs de variables en majuscules ne doivent généralement pas être utilisés dans les modèles. Ils peuvent indiquer une absence de déclaration open ou un nom de modèle mal orthographié. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - Impossible de définir le {0} '{1}', car le nom '{2}' est en conflit avec le {3} '{4}' dans ce type ou module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ Les champs '{0}' et '{1}' sont de types différents + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restriction de valeur : La valeur '{0}' a un type générique déduit\n {1}\nCependant, les valeurs ne peuvent pas avoir de variables de type générique comme '_a dans "let x: '_a". Vous pouvez effectuer l'une des opérations suivantes :\n- Le définir comme un terme de données simple comme un littéral entier, un littéral de chaîne ou un cas d'union comme "let x = 1"\n- Ajouter une annotation de type explicite comme "let x : int"\n- Utilisez la valeur comme type non générique dans le code ultérieur pour l'inférence de type comme "do x"\ni si vous souhaitez toujours des résultats dépendants du type, vous pouvez définir '{2}' comme fonction à la place en faisant soit :\n- Ajoutez un paramètre d'unité comme "let x()"\n- Écrivez des paramètres de type explicites comme "let x<'a>".\nCette erreur est due au fait qu'une liaison let sans paramètres définit une valeur, pas une fonction. Les valeurs ne peuvent pas être génériques car la lecture d'une valeur est supposée donner le même résultat partout, mais les paramètres de type génériques peuvent invalider cette hypothèse en permettant des résultats dépendants du type. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restriction de valeur : La valeur '{0}' a un type de fonction générique déduit\n {1}\nCependant, les valeurs ne peuvent pas avoir de variables de type générique comme '_a dans "let f: '_a". Vous devez plutôt définir '{2}' comme fonction en effectuant l'une des opérations suivantes :\n- Ajouter un paramètre explicite qui est appliqué au lieu d'utiliser une application partielle "let f param"\n- Ajouter un paramètre d'unité comme "let f() "\n- Écrivez des paramètres de type explicites comme "let f<'a>"\ni si vous ne souhaitez pas qu'ils soient génériques, soit :\n- Ajoutez une annotation de type explicite comme "let f : obj -> obj" \n- Appliquer des arguments de types non génériques à la valeur de la fonction dans le code ultérieur pour l'inférence de type comme "do f()".\nCette erreur est due au fait qu'une liaison let sans paramètres définit une valeur, pas une fonction. Les valeurs ne peuvent pas être génériques car la lecture d'une valeur est supposée donner le même résultat partout, mais les paramètres de type génériques peuvent invalider cette hypothèse en permettant des résultats dépendants du type. + + '{0}' is bound twice in this pattern '{0}' est lié à deux reprises dans ce modèle @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Ce type est 'abstract', car des membres abstraits n'ont pas reçu d'implémentation. Si cela est intentionnel, ajoutez l'attribut '[<AbstractClass>]' à votre type. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Les classes non abstraites ne peuvent pas contenir de membres abstraits. Fournissez une implémentation de membre par défaut ou ajoutez l’attribut « [<AbstractClass>] » à votre type. @@ -1532,31 +1572,6 @@ Les champs suivants requièrent des valeurs : {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Restriction de valeur. La valeur '{0}' a le type générique\n {1} \nRendez les arguments de '{2}' explicites ou, si votre but n'est pas d'utiliser un type générique, ajoutez une annotation de type. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Restriction de valeur. La valeur '{0}' a le type générique\n {1} \nChangez '{2}' en fonction avec des arguments explicites ou, si votre but n'est pas d'utiliser un type générique, ajoutez une annotation de type. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Restriction de valeur. Il a été déduit que ce membre avait un type générique\n {0} \nLes constructeurs, ainsi que les méthodes getter/setter d'une propriété ne peuvent pas être plus génériques que le type englobant. Ajoutez une annotation de type pour indiquer les types exacts impliqués. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Restriction de valeur. Il a été déduit que la valeur '{0}' avait le type générique\n {1} \nRendez les arguments de '{2}' explicites ou, si votre but n'est pas d'utiliser un type générique, ajoutez une annotation de type. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Restriction de valeur. Il a été déduit que la valeur '{0}' avait le type générique\n {1} \nDéfinissez '{2}' en tant que terme de données simple, faites-en une fonction avec des arguments explicites ou, si votre but n'est pas d'utiliser un type générique, ajoutez une annotation de type. - - syntax error erreur de syntaxe @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - Les implémentations d’interfaces doivent normalement être fournies lors de la déclaration initiale d’un type. Les implémentations d’interface dans les augmentations peuvent entraîner l’accès à des liaisons statiques avant leur initialisation, mais seulement si l’implémentation de l’interface est invoquée pendant l’initialisation des données statiques, et accède à son tour aux données statiques. Vous pouvez supprimer cet avertissement en utilisant #nowarn « 69 » si vous avez vérifié que ce n’est pas le cas. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + Les implémentations d’interfaces doivent normalement être fournies lors de la déclaration initiale d’un type. Les implémentations d’interface dans les augmentations peuvent entraîner l’accès à des liaisons statiques avant leur initialisation, mais seulement si l’implémentation de l’interface est invoquée pendant l’initialisation des données statiques, et accède à son tour aux données statiques. Vous pouvez supprimer cet avertissement à l’aide de '#nowarn "69"' si vous avez vérifié que ce n’est pas le cas. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - Les directives #I ne peuvent être présentes que dans les fichiers de script F# (extensions .fsx ou .fsscript). Déplacez ce code vers un fichier de script, ajoutez une option de compilateur '-I' pour cette référence ou délimitez la directive par '#if INTERACTIVE'/'#endif'. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I directives ne peuvent être utilisées que dans les fichiers de script F# (extensions .fsx ou .fsscript). Déplacez ce code vers un fichier de script, ajoutez une option de compilateur '-I' pour cette référence ou délimitez la directive par '#if INTERACTIVE'/'#endif'. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - Les directives #r ne peuvent être présentes que dans les fichiers de script F# (extensions .fsx ou .fsscript). Déplacez ce code vers un fichier de script ou remplacez cette référence par l'option de compilateur '-r'. Si cette directive est exécutée en tant qu'entrée d'utilisateur, vous pouvez la délimiter avec '#if INTERACTIVE'/'#endif'. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r directives ne peuvent être utilisées que dans les fichiers de script F# (extensions .fsx ou .fsscript). Déplacez ce code vers un fichier de script ou remplacez cette référence par l'option de compilateur '-r'. Si cette directive est exécutée en tant qu'entrée d'utilisateur, vous pouvez la délimiter avec '#if INTERACTIVE'/'#endif'. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.it.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.it.xlf index 465456a085..f43c8e7785 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.it.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.it.xlf @@ -7,6 +7,31 @@ I nomi degli argomenti nella firma '{0}' e nell'implementazione '{1}' non corrispondono. Verrà usato il nome dell'argomento del file di firma. Questa situazione potrebbe causare problemi durante il debug o la profilatura. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Le definizioni di {0} per il tipo '{1}' nella firma e nell'implementazione non sono compatibili perché le abbreviazioni sono diverse:\n {2}\n anziché \n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Tipo non corrispondente. È prevista una tupla di lunghezza {0} di tipo\n {1} \n, ma è stata specificata una tupla di lunghezza {2} di tipo\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + È previsto un membro non statico. Static member is expected. - Static member is expected. + È previsto un membro statico. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - In genere è consigliabile non usare identificatori di variabili scritti in maiuscolo nei criteri perché potrebbero indicare una dichiarazione OPEN mancante o un nome di criterio con ortografia errata. + In genere è consigliabile non usare identificatori di variabili scritti in maiuscolo nei criteri perché potrebbero indicare una dichiarazione OPEN mancante o un nome di criterio con ortografia errata. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - Non è possibile definire {0} '{1}' perché il nome '{2}' è in conflitto con {3} '{4}' in questo tipo o modulo + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ I campi '{0}' e '{1}' sono di tipi diversi + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restrizione del valore: il valore '{0}' ha un tipo generico dedotta\n {1}\nTuttavia, i valori non possono avere variabili di tipo generico come '_a in "let x: '_a". È possibile eseguire una delle operazioni seguenti:\n- Definirlo come termine di dati semplice come un valore letterale integer, un valore letterale stringa o un case di unione come "let x = 1"\n- Aggiungere un'annotazione di tipo esplicito come "let x : int"\n- Usare il valore come tipo non generico nel codice successivo per l'inferenza del tipo come "do x"\noppure se si vogliono ancora risultati dipendenti dal tipo, è possibile definire '{2}' come funzione eseguendo una delle operazioni seguenti:\n- Aggiungere un parametro di unità come "let x()"\n- Scrivere parametri di tipo esplicito come "let x<'a>".\nQuesto errore è dovuto al fatto che un'associazione let senza parametri definisce un valore, non una funzione. I valori non possono essere generici, perché si presuppone che la lettura di un valore restituisca lo stesso risultato ovunque, ma i parametri di tipo generico possono invalidare questa ipotesi, consentendo risultati dipendenti dal tipo. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restrizione del valore: il valore '{0}' ha un tipo di funzione generica dedotta\n {1}\nTuttavia, i valori non possono avere variabili di tipo generico come '_a in "let f: '_a". È consigliabile definire '{2}' come funzione eseguendo una delle operazioni seguenti:\n- aggiungere un parametro esplicito applicato invece di usare un'applicazione parziale "let f param"\n- Aggiungere un parametro di unità come "let f()"\n- Scrivere parametri di tipo esplicito come "let f<'a>"\no se non si vuole che sia generico, o:\n- Aggiungere un'annotazione di tipo esplicito come "let f : obj -> obj"\n- Applicare argomenti di tipi non generici al valore della funzione nel codice successivo per l'inferenza del tipo come "do f()".\nQuesto errore è dovuto al fatto che un'associazione let senza parametri definisce un valore, non una funzione. I valori non possono essere generici, perché si presuppone che la lettura di un valore restituisca lo stesso risultato ovunque, ma i parametri di tipo generico possono invalidare questa ipotesi, consentendo risultati dipendenti dal tipo. + + '{0}' is bound twice in this pattern '{0}' è associato due volte in questo criterio @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Questo tipo è 'abstract' perché non è stata specificata un'implementazione per alcuni membri astratti. Se questa scelta è intenzionale, aggiungere l'attributo '[<AbstractClass>]' al tipo. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Le classi non astratte non possono contenere membri astratti. Specificare un'implementazione di membro predefinita o aggiungere l'attributo '[<AbstractClass>]' al tipo. @@ -1532,31 +1572,6 @@ Immissione valori obbligatoria per i campi seguenti: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Limitazione valore. Il valore '{0}' ha il tipo generico\n {1} \nRendere gli argomenti di '{2}' espliciti oppure, se non si intende renderlo generico, aggiungere un'annotazione di tipo. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Limitazione valore. Il valore '{0}' ha il tipo generico\n {1} \nRendere '{2}' una funzione con argomenti espliciti oppure, se non si intende renderlo generico, aggiungere un'annotazione di tipo. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Restrizione relativa ai valori. È stato dedotto che il membro ha il tipo generico\n {0} \nI getter/setter di proprietà e i costruttori non possono essere più generici del tipo di inclusione. Aggiungere un'annotazione di tipo per indicare i tipi esatti previsti. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Limitazione valore. È stato dedotto che il valore '{0}' ha il tipo generico\n {1} \nRendere gli argomenti di '{2}' espliciti, oppure se non si intende renderlo generico, aggiungere un'annotazione di tipo. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Limitazione valore. È stato dedotto che il valore '{0}' ha il tipo generico\n {1} \nDefinire '{2}' come termine di dati semplice, renderlo una funzione con argomenti espliciti oppure, se non si intende renderlo generico, aggiungere un'annotazione di tipo. - - syntax error errore di sintassi @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - In genere, le implementazioni di interfaccia devono essere specificate nella dichiarazione iniziale di un tipo. Le implementazioni di interfaccia negli aumenti possono portare all'accesso ai binding statici prima dell'inizializzazione, anche se l'implementazione dell'interfaccia viene richiamata durante l'inizializzazione dei dati statici e a sua volta accede ai dati statici. È possibile rimuovere questo avviso utilizzando #nowarn "69" se è stato verificato che il caso specifico non lo richiede. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + In genere, le implementazioni di interfaccia devono essere specificate nella dichiarazione iniziale di un tipo. Le implementazioni di interfaccia negli aumenti possono portare all'accesso ai binding statici prima dell'inizializzazione, anche se l'implementazione dell'interfaccia viene richiamata durante l'inizializzazione dei dati statici e a sua volta accede ai dati statici. È possibile rimuovere questo avviso utilizzando '#nowarn "69"' se è stato verificato che il caso specifico non lo richiede. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - Le direttive #I possono trovarsi solo in file di script F# (estensioni fsx o fsscript). Spostare il codice in un file di script, aggiungere un'opzione di compilazione '-I' per questo riferimento oppure delimitare la direttiva con '#if INTERACTIVE'/'#endif'. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + Le direttive #I possono essere usate solo in file di script F# (estensioni fsx o fsscript). Spostare il codice in un file di script, aggiungere un'opzione di compilazione '-I' per questo riferimento oppure delimitare la direttiva con '#if INTERACTIVE'/'#endif'. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - Le direttive #r possono trovarsi solo in file di script F# (estensioni fsx o fsscript). Spostare il codice in un file di script oppure sostituire questo riferimento con l'opzione del compilatore '-r'. Se questa direttiva viene eseguita come input utente, è possibile delimitarla con '#if INTERACTIVE'/'#endif'. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r direttive #I possono essere usate solo in file di script F# (estensioni fsx o fsscript). Spostare il codice in un file di script oppure sostituire questo riferimento con l'opzione del compilatore '-r'. Se questa direttiva viene eseguita come input utente, è possibile delimitarla con '#if INTERACTIVE'/'#endif'. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.ja.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.ja.xlf index c895e7a6a1..6f0a3a978e 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.ja.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.ja.xlf @@ -7,6 +7,31 @@ シグネチャ '{0}' と実装 '{1}' の引数の名前が一致しません。シグネチャ ファイルの引数の名前が使用されます。デバッグまたはプロファイルするときに問題が生じる原因となる可能性があります。 + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + シグネチャおよび実装内の型 '{0}' の {1} 定義は、省略形が異なるため\n ({2}\nと \n {3})、互換性がありません + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n 型が一致しません。型の長さ {0} のタプルが必要です\n {1} \nただし、型の長さ {2} のタプルが指定された場合\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + 静的でないメンバーが必要です。 Static member is expected. - Static member is expected. + 静的メンバーが必要です。 + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - 通常、大文字の変数識別子はパターンに使用できません。また、欠落している open 宣言か、つづりが間違っているパターン名を示す可能性があります。 + 通常、大文字の変数識別子はパターンに使用できません。また、欠落している open 宣言か、つづりが間違っているパターン名を示す可能性があります。 @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 名前 '{2}' がこの型またはモジュールの {3} '{4}' と競合するため、{0} '{1}' を定義できません + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ フィールド '{0}' と '{1}' は異なる型です + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 値の制限: 値 '{0}' は推論されたジェネリック関数 \n {1}\n を持ちますが、 "let x: '_a" で '_a のようなジェネリック型変数を持つことはできません。次のいずれかを実行できます。①整数リテラル、文字列リテラル、または "let x = 1"\n- のような共用体ケースを簡易データ項目として定義する。②"let x : int"\n- のような明示的な型の注釈を追加する。③型依存型の結果が必要な場合は、"do x"\nor などの型の推定のためにジェネリック型以外として後のコードで使用して、:\n- のいずれかを実行する代わりに関数として '{2}' を定義できます。④"let x()"\n- のような単位パラメーターを追加する。⑤"let x<'a>".\n のような明示的な型パラメーターを記述する。このエラーは、\nパラメーターのない let バインディングが関数ではなく値を定義するため発生します。値を読み取るとどこでも同じ結果になると想定されるため、値をジェネリックにすることはできませんが、ジェネリック型パラメーターは型依存の結果を有効にすることで、この想定が無効になる可能性があります。 + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 値の制限: 値 '{0}' は推論されたジェネリック関数型 \n {1}\n を持ちますが、"let f: '_a" で '_a のようなジェネリック型変数を持つことはできません。次のいずれかを実行する代わりに、'{2}' を関数として定義する必要があります。①"let f param"\n- のような部分的な適用ではなく、\n適用される明示的なパラメーターを追加する。②"let f()"\n- のような単位パラメーターを追加する。③ジェネリック型であることを意図しない場合は、"let f<'a>"\nor のような明示的な型パラメーターを記述する。④"let f : obj -> obj"\n- のような明示的な型の注釈を追加する。⑤"do f()".\n のような型の推定のために、ジェネリック型でない引数を後のコードで関数値に適用する。このエラーは、\nパラメーターのない let バインディングが関数ではなく値を定義するため発生します。値を読み取るとどこでも同じ結果になると想定されるため、値をジェネリックにすることはできませんが、ジェネリック型パラメーターは型依存の結果を有効にすることで、この想定が無効になる可能性があります。 + + '{0}' is bound twice in this pattern このパターンで '{0}' が 2 回バインドされています @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - これは 'abstract' 型です。一部の抽象メンバーに実装がありません。意図的な場合には、型に '[<AbstractClass>]' 属性を追加してください。 + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + 非抽象クラスに抽象メンバーを含めることはできません。既定のメンバー実装を指定するか、'[<AbstractClass>]' 属性を型に追加してください。 @@ -1532,31 +1572,6 @@ 次のフィールドには値が必要です: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 値の制限。値 '{0}' は次のジェネリック型です。\n {1} \n明示的に引数を '{2}' にするか、ジェネリックにする意図がない場合は型の注釈を追加してください。 - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 値の制限。値 '{0}' は次のジェネリック型です。\n {1} \n明示的な引数を使用して '{2}' を関数にするか、ジェネリックにする意図がない場合は型の注釈を追加してください。 - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - 値の制限。このメンバーは次のジェネリック型を持つと推論されました。\n {0} \nコンストラクターとプロパティのゲッター/セッターは、それを囲む型よりも総称性を高くすることができません。関係する正確な型を示すために、型の注釈を追加してください。 - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 値の制限。値 '{0}' は次のジェネリック型を持つと推論されました。\n {1} \n明示的に引数を '{2}' にするか、ジェネリックにする意図がない場合は型の注釈を追加してください。 - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 値の制限。値 '{0}' は次のジェネリック型を持つと推論されました。\n {1} \n単純なデータ用語として '{2}' を定義するか、明示的な引数を使用して関数にするか、ジェネリックにする意図がない場合は型の注釈を追加してください。 - - syntax error 構文エラーです @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - インターフェイスの実装には、通常、最初に型を指定する必要があります。拡張のインターフェイス実装は、初期化前に静的バインディングにアクセスする可能性があります。ただし、静的データの初期化中にインターフェイスの実装が呼び出され、静的データにアクセスする場合のみです。この警告は、#nowarn "69" を使用して削除できます。この点をすでにチェックしている場合は該当しません。 + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + 通常、インターフェイスの実装は、型の最初の宣言で指定する必要があります。拡張でのインターフェイス実装は、初期化前の静的バインディングへのアクセスを引き起こすことがあります。ただし、静的データの初期化中にそのインターフェイスの実装が呼び出された後に、静的データにアクセスする場合のみです。この件が問題でないと確認できたら、この警告を '#nowarn "69"' を使用して削除できます。 @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - #I ディレクティブを使用できるのは F# スクリプト ファイル (拡張子は .fsx または .fsscript) のみです。このコードをスクリプト ファイルに移動するか、この参照に '-I' コンパイラー オプションを追加するか、ディレクティブを '#if INTERACTIVE'/'#endif' で区切ってください。 + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I ディレクティブを使用できるのは F# スクリプト ファイル (拡張子が .fsx または .fsscript) のみです。このコードをスクリプト ファイルに移動し、この参照に '-I' コンパイラー オプションを追加するか、ディレクティブを '#if INTERACTIVE'/'#endif' で区切ってください。 - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - #r ディレクティブは F# スクリプト ファイル (拡張子は .fsx または .fsscript) 内でのみ使用できます。このコードをスクリプト ファイルに移動するか、この参照を '-r' コンパイラ オプションに置き換えてください。このディレクティブがユーザー入力として実行されている場合は、'#if INTERACTIVE'/'#endif' でディレクティブを区切ることができます。 + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r ディレクティブを使用できるのは F# スクリプト ファイル (拡張子が .fsx または .fsscript) のみです。このコードをスクリプト ファイルに移動するか、この参照を '-r' コンパイラ オプションに置き換えてください。このディレクティブがユーザー入力として実行されている場合は、'#if INTERACTIVE'/'#endif' でディレクティブを区切ることができます。 diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.ko.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.ko.xlf index 82dbc42e07..43e0a0f173 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.ko.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.ko.xlf @@ -7,6 +7,31 @@ 시그니처 '{0}'과(와) 구현 '{1}'의 인수 이름이 일치하지 않습니다. 시그니처 파일의 인수 이름이 사용됩니다. 이로 인해 디버깅 또는 프로파일링 시 문제가 발생할 수 있습니다. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + 약어가 다르기 때문에 시그니처 및 구현의 '{1}' 형식에 대한 {0} 정의가 호환되지 않습니다.\n {2}\n 대 \n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n 유형 불일치. 형식이 \n {1}이고 길이가 {0}인 튜플이 필요합니다. \n그러나 형식이 \n {3}이고 길이가 {2}인 튜플이 제공되었습니다.{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + 비정적 멤버가 필요합니다. Static member is expected. - Static member is expected. + 정적 멤버가 필요합니다. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - 일반적으로 대문자 변수 식별자는 패턴에 사용하지 말아야 합니다. 이러한 식별자는 열려 있는 선언이 없거나 철자가 잘못된 패턴 이름을 나타낼 수 있습니다. + 일반적으로 대문자 변수 식별자는 패턴에 사용하지 말아야 합니다. 이러한 식별자는 열려 있는 선언이 없거나 철자가 잘못된 패턴 이름을 나타낼 수 있습니다. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 이름 '{2}'이(가) 이 형식 또는 모듈의 {3} '{4}'과(와) 충돌하므로 {0} '{1}'을(를) 정의할 수 없습니다. + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ {0}' 필드와 '{1}' 필드의 소스 형식이 서로 다릅니다. + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 값 제한: 값 '{0}'에 유추된 제네릭 형식이 있습니다.\n {1}\n하지만 값은 "let x: '_a"의 '_a와 같은 제네릭 형식 변수를 가질 수 없습니다. 다음 중 하나를 수행할 수 있습니다.\n- 정수 리터럴, 문자열 리터럴 또는 "let x = 1"과 같은 공용 구조체 대/소문자와 같은 간단한 데이터 용어로 정의합니다.\n- "let x : int"와 같은 명시적 형식 주석을 추가합니다.\n- "do x"와 같은 형식 유추를 위해 이후 코드에서 값을 제네릭이 아닌 형식으로 사용합니다.\n또는 여전히 형식 종속 결과를 원할 경우 다음 중 하나를 수행하여 '{2}'을(를) 함수로 정의할 수 있습니다.\n- "let x()"와 같은 단위 매개 변수를 추가합니다.\n- "let x<'a>"와 같은 명시적 형식 매개 변수를 작성합니다.\n이 오류는 매개 변수가 없는 let 바인딩이 함수가 아니라 값을 정의하기 때문입니다. 값을 읽으면 모든 위치에서 동일한 결과가 발생하는 것으로 가정되지만 제네릭 형식 매개 변수가 형식 종속 결과를 사용하여 이 가정을 무효화할 수 있기 때문에 값은 제네릭일 수 없습니다. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 값 제한: 값 '{0}'에 유추된 제네릭 함수 형식이 있습니다.\n {1}\n하지만 값은 "let f: '_a"의 '_a와 같은 제네릭 형식 변수를 가질 수 없습니다. 대신 다음 중 하나를 수행하여 '{2}'을(를) 함수로 정의해야 합니다.\n- 부분 애플리케이션 "let f param"을 사용하는 대신 적용되는 명시적 매개 변수를 추가합니다.\n- "let f()"와 같은 단위 매개 변수를 추가합니다.\n- "let f<'a>"와 같은 명시적 형식 매개 변수를 작성합니다.\n또는 제네렉이 되지 않게 하려는 경우.\n- "let f : obj -> obj"와 같은 명시적 형식 주석을 추가하거나\n- "do f()"와 같은 형식 유추를 위해 이후 코드의 함수 값에 제네릭이 아닌 형식의 인수를 적용합니다.\n이 오류는 매개 변수가 없는 let 바인딩이 함수가 아니라 값을 정의하기 때문입니다. 값을 읽으면 모든 위치에서 동일한 결과가 발생하는 것으로 가정되지만 제네릭 형식 매개 변수가 형식 종속 결과를 사용하여 이 가정을 무효화할 수 있기 때문에 값은 제네릭일 수 없습니다. + + '{0}' is bound twice in this pattern '{0}'은(는) 이 패턴에서 두 번 바인딩되었습니다. @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - 일부 추상 멤버에 구현이 지정되지 않았으므로 이 형식은 'abstract'입니다. 의도적으로 구현을 지정하지 않은 경우에는 형식에 '[<AbstractClass>]' 특성을 추가하세요. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + 비 추상 클래스는 추상 구성원을 포함할 수 없습니다. 기본 구성원 구현을 제공하거나 형식에 '[<AbstractClass>]' 특성을 추가하세요. @@ -1532,31 +1572,6 @@ 다음 필드에는 값이 필요합니다. {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 값 제한이 있습니다. 값 '{0}'에 제네릭 형식\n {1}이(가) 있습니다. \n'{2}'에 대한 인수를 명시적으로 만들거나, 제네릭 요소로 만들지 않으려는 경우 형식 주석을 추가하세요. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 값 제한이 있습니다. 값 '{0}'에 제네릭 형식\n {1}이(가) 있습니다. \n'{2}'을(를) 명시적 인수가 포함된 함수로 만들거나, 제네릭 요소로 만들지 않으려는 경우 형식 주석을 추가하세요. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - 값 제한이 있습니다. 이 멤버는 제네릭 형식\n {0}을(를) 가지는 것으로 유추되었습니다. \n생성자 및 속성 getter/setter는 바깥쪽 형식보다 일반적일 수 없습니다. 형식 주석을 추가하여 관련 형식을 정확히 나타내세요. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 값 제한이 있습니다. 값 '{0}'은(는) 제네릭 형식\n {1}을(를) 가지는 것으로 유추되었습니다. \n'{2}'에 대한 인수를 명시적으로 만들거나, 제네릭 요소로 만들지 않으려는 경우 형식 주석을 추가하세요. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 값 제한이 있습니다. 값 '{0}'은(는) 제네릭 형식\n {1}을(를) 가지는 것으로 유추되었습니다. \n'{2}'을(를) 단순 데이터 용어로 정의하거나, 명시적 인수가 포함된 함수로 만들거나, 제네릭 요소로 만들지 않으려는 경우 형식 주석을 추가하세요. - - syntax error 구문 오류입니다. @@ -1583,7 +1598,7 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. 인터페이스 구현은 일반적으로 유형의 초기 선언에 제공되어야 합니다. 확대의 인터페이스 구현은 초기화되기 전에 정적 바인딩에 액세스할 수 있지만 정적 데이터의 초기화 중에 인터페이스 구현이 호출되어 정적 데이터에 액세스하는 경우에만 가능합니다. 사실이 아님을 확인한 경우 #nowarn "69"를 사용하여 이 경고를 제거할 수 있습니다. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - #I 지시문은 F# 스크립트 파일(확장명 .fsx 또는 .fsscript)에서만 발생할 수 있습니다. 이 코드를 스크립트 파일로 이동하거나, 이 참조에 대한 '-I' 컴파일러 옵션을 추가하거나, 지시문을 '#if INTERACTIVE'/'#endif'로 구분하세요. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I 지시문은 F# 스크립트 파일(확장명 .fsx 또는 .fsscript)에서만 사용할 수 있습니다. 이 코드를 스크립트 파일로 이동하거나, 이 참조에 대한 '-I' 컴파일러 옵션을 추가하거나, 지시문을 '#if INTERACTIVE'/'#endif'로 구분하세요. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - #r 지시문은 F# 스크립트 파일(확장명 .fsx 또는 .fsscript)에서만 발생할 수 있습니다. 이 코드를 스크립트 파일로 이동하거나 이 참조를 '-r' 컴파일러 옵션으로 바꾸세요. 이 지시문이 사용자 입력으로 실행되는 경우 지시문을 '#if INTERACTIVE'/'#endif'로 구분할 수 있습니다. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r 지시문은 F# 스크립트 파일(확장명 .fsx 또는 .fsscript)에서만 사용할 수 있습니다. 이 코드를 스크립트 파일로 이동하거나 이 참조를 '-r' 컴파일러 옵션으로 바꾸세요. 이 지시문이 사용자 입력으로 실행되는 경우 지시문을 '#if INTERACTIVE'/'#endif'로 구분할 수 있습니다. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.pl.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.pl.xlf index e2bc31e3fb..3096fca8db 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.pl.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.pl.xlf @@ -7,6 +7,31 @@ Nazwy argumentów w podpisie „{0}” i implementacji „{1}” nie są zgodne. Używana będzie nazwa argumentu z pliku podpisu. Może to spowodować problemy podczas debugowania lub profilowania. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Definicje {0} dla typu „{1}” w sygnaturze i implementacji są niezgodne, ponieważ skróty są różne:\n {2}\nversus\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Niezgodność. Oczekiwano krotki o długości {0} typu\n {1} \nale otrzymano krotkę o długości {2} typu\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + Oczekiwano elementu członkowskiego innego niż statyczny. Static member is expected. - Static member is expected. + Oczekiwano statycznego elementu członkowskiego. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - Identyfikatory zmiennych pisane wielkimi literami nie powinny być na ogół używane we wzorcach i mogą oznaczać brak deklaracji otwierającej lub błąd pisowni w nazwie wzorca. + Identyfikatory zmiennych pisane wielkimi literami nie powinny być na ogół używane we wzorcach i mogą oznaczać brak deklaracji otwierającej lub błąd pisowni w nazwie wzorca. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - Nie można zdefiniować elementu {0} „{1}”, ponieważ nazwa „{2}” powoduje konflikt z elementem {3} „{4}” w tym typie lub module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ Pola „{0}” i „{1}” są polami różnego typu + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Ograniczenie wartości: wartość „{0}” ma wywnioskowany typ ogólny\n {1}\nWartości nie mogą mieć zmiennych typu ogólnego, takich jak „_a w „let x: „_a”. Możesz wykonać jedną z następujących czynności:\n- Zdefiniuj go jako prosty termin danych, taki jak literał liczby całkowitej, literał ciągu lub przypadek unii, taki jak „let x = 1”\n- Dodaj jawną adnotację typu, taką jak „let x : int”\n- Użyj wartości jako typu nie generycznego w późniejszym kodzie dla wnioskowania typu, takiego jak „do x”,\n jeśli nadal chcesz uzyskać wyniki zależne od typu, Można zdefiniować „{2}” jako funkcję, wykonując jedną z następujących czynności:\n- Dodaj parametr jednostkowy, taki jak „let x()”\n- Zapisz jawne parametry typu, takie jak „let x<'a>”.\nTen błąd jest spowodowany tym, że powiązanie let bez parametrów definiuje wartość, a nie funkcję. Wartości nie mogą być ogólne, ponieważ zakłada się, że odczytanie wartości skutkuje tym samym wszędzie, ale parametry typu ogólnego mogą unieważnić to założenie, umożliwiając uzyskanie wyników zależnych od typu. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Ograniczenie wartości: wartość „{0}” ma wywnioskowany typ funkcji ogólnej\n {1}\nJako wartości nie mogą mieć zmiennych typu ogólnego, takich jak „_a w „let f: '_a”. Zamiast tego należy zdefiniować „{2}” jako funkcję, wykonując jedną z następujących czynności:\n- Dodaj jawny parametr, który jest stosowany zamiast używania częściowej aplikacji „let f param”\n- Dodaj parametr jednostkowy, taki jak „let f()”\n- Zapisz jawne parametry typu, takie jak „let f<'a>”\nor, jeśli nie zamierzasz, aby był ogólny, either:\n- Dodaj jawną adnotację typu, taką jak „let f : obj -> obj”\n- Zastosuj argumenty typów nie generycznych do wartości funkcji w późniejszym kodzie dla wnioskowania typu, takiego jak „do f()”.\nTen błąd jest spowodowany tym, że powiązanie let bez parametrów definiuje wartość, a nie funkcję. Wartości nie mogą być ogólne, ponieważ zakłada się, że odczytanie wartości skutkuje tym samym wszędzie, ale parametry typu ogólnego mogą unieważnić to założenie, umożliwiając uzyskanie wyników zależnych od typu. + + '{0}' is bound twice in this pattern Zmienna „{0}” została powiązana dwa razy w tym wzorcu @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Ten typ ma wartość „abstract”, ponieważ niektóre abstrakcyjne składowe nie mają określonej implementacji. Jeśli jest to zamierzone działanie, dodaj atrybut „[<AbstractClass>]” do typu. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Klasy nieabstrakcyjne nie mogą zawierać abstrakcyjnych składowych. Podaj domyślną implementację składowej lub dodaj atrybut „[<AbstractClass>]” do typu. @@ -1532,31 +1572,6 @@ Następujące pola wymagają wartości: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Ograniczenie wartości. Wartość „{0}” jest wartością typu ogólnego\n {1} \nOkreśl argumenty elementu „{2}” jako jawne lub dodaj adnotację typu, jeśli nie chcesz, aby wartość była ogólna. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Ograniczenie wartości. Wartość „{0}” jest wartością typu ogólnego\n {1} \nUstaw element „{2}” jako funkcję z jawnymi argumentami lub dodaj adnotację typu, jeśli nie chcesz, aby wartość była ogólna. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Ograniczenie wartości. Wywnioskowano, że ten element członkowski jest elementem typu ogólnego\n {0} \nKonstruktory i metody pobierające/ustawiające właściwości nie mogą być bardziej ogólne niż typ otaczający. Dodaj adnotację typu, aby dokładnie wskazać uwzględnione typy. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Ograniczenie wartości. Wywnioskowano, że wartość „{0}” jest wartością typu ogólnego\n {1} \nOkreśl argumenty elementu „{2}” jako jawne lub dodaj adnotację typu, jeśli nie chcesz, aby wartość była ogólna. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Ograniczenie wartości. Wywnioskowano, że wartość „{0}” jest wartością typu ogólnego\n {1} \nZdefiniuj element „{2}” jako prosty termin danych, określ go jako funkcję z jawnymi argumentami lub dodaj adnotację typu, jeśli nie chcesz, aby wartość była ogólna. - - syntax error błąd składni @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - Implementacje interfejsu powinny być zwykle podane w początkowej deklaracji typu. Implementacje interfejsu w rozszerzeniach mogą prowadzić do uzyskania dostępu do powiązań statycznych przed ich zainicjowaniem, chociaż tylko wtedy, gdy implementacja interfejsu jest wywoływana podczas inicjowania danych statycznych i z kolei uzyskuje dostęp do danych statycznych. To ostrzeżenie można usunąć przy użyciu #nowarn "69" jeśli zaznaczono, że tak nie jest. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + Implementacje interfejsu powinny być zwykle podane w początkowej deklaracji typu. Implementacje interfejsu w rozszerzeniach mogą prowadzić do uzyskania dostępu do powiązań statycznych przed ich zainicjowaniem, chociaż tylko wtedy, gdy implementacja interfejsu jest wywoływana podczas inicjowania danych statycznych i z kolei uzyskuje dostęp do danych statycznych. To ostrzeżenie można usunąć przy użyciu #nowarn „69” jeśli zaznaczono, że tak nie jest. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - Dyrektywy #I mogą występować tylko w plikach skryptu języka F# (rozszerzenie fsx lub fsscript). Przenieś ten kod do pliku skryptu, dodaj opcję kompilatora „-I” dla tego odwołania lub rozdziel dyrektywę przy użyciu elementu „#if INTERACTIVE”/„#endif”. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + Dyrektywy #I mogą być używane tylko w plikach skryptów języka F# (rozszerzenia FSX lub FSSCRIPT). Przenieś ten kod do pliku skryptu, dodaj opcję kompilatora „-I” dla tego odwołania lub rozdziel dyrektywę przy użyciu elementu „#if INTERACTIVE'/'#endif”. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - Dyrektywy #r mogą występować tylko w plikach skryptu języka F# (rozszerzenie fsx lub fsscript). Przenieś ten kod do pliku skryptu lub zastąp to odwołanie za pomocą opcji kompilatora „-r”. Jeśli ta dyrektywa jest wykonywana jako dane wejściowe użytkownika, możesz ją ograniczyć przy użyciu elementu „#if INTERACTIVE”/„#endif”. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + Dyrektywy #r mogą być używane tylko w plikach skryptów języka F# (rozszerzenia FSX lub FSSCRIPT). Przenieś ten kod do pliku skryptu lub zastąp to odwołanie za pomocą opcji kompilatora „-r”. Jeśli ta dyrektywa jest wykonywana jako dane wejściowe użytkownika, możesz ją ograniczyć przy użyciu elementu „#if INTERACTIVE'/'#endif”. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.pt-BR.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.pt-BR.xlf index b4d1f7ba70..ea48f4c354 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.pt-BR.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.pt-BR.xlf @@ -7,6 +7,31 @@ Os nomes de argumento na assinatura '{0}' e na implementação '{1}' não coincidem. O nome do argumento do arquivo da assinatura será usado. Isso pode causar problemas durante a depuração ou a criação de perfil. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + As definições {0} para o tipo '{1}' na assinatura e na implementação não são compatíveis porque as abreviações são diferentes:\n {2}\nversus\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Tipo incompatível. Esperando uma tupla de comprimento {0} do tipo\n {1} \nmas recebeu uma tupla de comprimento {2} do tipo\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + O membro não estático é esperado. Static member is expected. - Static member is expected. + O membro estático é esperado. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - Identificadores de variáveis em maiúsculas geralmente não devem ser usados em padrões, podendo indicar uma declaração aberta ausente ou um nome de padrão escrito incorretamente. + Identificadores de variáveis em maiúsculas geralmente não devem ser usados em padrões, podendo indicar uma declaração aberta ausente ou um nome de padrão escrito incorretamente. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - O {0} '{1}' não pode ser definido porque o nome '{2}' conflita com {3} '{4}' neste tipo ou módulo + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ Os campos '{0}' e '{1}' são de tipos diferentes + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restrição de valor: o valor "{0}" tem um tipo genérico inferido\n {1}\nEntretanto, os valores não podem ter variáveis de tipo genérico como '_a em "let x: '_a". Você pode fazer o seguinte:\n- Defina-o como um termo de dados simples, como um literal inteiro, um literal de cadeia de caracteres ou um caso de união como "let x = 1"\n- Adicionar uma anotação de tipo explícita como "let x : int"\n- Use o valor como um tipo não genérico em código posterior para inferência de tipo como "do x"\ne se você ainda quiser resultados dependentes de tipo, você pode definir "{2}" como uma função fazendo:\n- Adicione um parâmetro de unidade como "let x()"\n- Escreva parâmetros de tipo explícitos como "let x<'a>".\nEsse erro ocorre porque uma ligação let sem parâmetros define um valor, não uma função. Os valores não podem ser genéricos porque se supõe que a leitura de um valor resulte no mesmo em todos os lugares, mas parâmetros de tipo genérico podem invalidar essa suposição habilitando resultados dependentes de tipo. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Restrição de valor: o valor "{0}" tem um tipo de função genérica inferido\n {1}\nEntretanto, os valores não podem ter variáveis de tipo genérico como '_a em "let f: '_a". Você deve definir "{2}" como uma função seguindo um destes procedimentos:\n- Adicione um parâmetro explícito que é aplicado em vez de usar uma aplicação parcial "let f param"\n- Adicione um parâmetro de unidade como "let f() "\n- Escreva parâmetros de tipo explícitos como "let f<'a>"\ne se você não pretende que seja genérico:\n- Adicione uma anotação de tipo explícita como "let f : obj -> obj" \n- Aplique argumentos de tipos não genéricos ao valor da função em código posterior para inferência de tipo como "do f()".\nEsse erro ocorre porque uma ligação let sem parâmetros define um valor, não uma função. Os valores não podem ser genéricos porque se supõe que a leitura de um valor resulte no mesmo em todos os lugares, mas parâmetros de tipo genérico podem invalidar essa suposição habilitando resultados dependentes de tipo. + + '{0}' is bound twice in this pattern '{0}' é associado duas vezes neste padrão @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Esse tipo é 'abstrato', pois alguns membros abstratos não receberam uma implementação. Se isso for intencional, adicione o atributo '[<AbstractClass>]' ao seu tipo. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Classes não abstratas não podem conter membros abstratos. Forneça uma implantação de membro padrão ou adicione o atributo '[<AbstractClass>]' ao seu tipo. @@ -1532,31 +1572,6 @@ Os campos a seguir requerem valores: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Restrição de valor. O valor '{0}' tem um tipo genérico\n {1} \nTorne os argumentos '{2}' explícitos ou, se sua intenção não for deixá-los genéricos, adicione uma anotação de tipo. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Restrição de valor. O valor '{0}' tem um tipo genérico\n {1} \nInsira '{2}' em uma função com argumentos explícitos ou, se você não desejar que ele seja genérico, adicione uma anotação de tipo. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Restrição de valor. Este membro foi inferido para ter um tipo genérico\n {0} \nConstrutores e getters/setters de propriedade não podem ser mais genéricos que o tipo de delimitador. Adicione uma anotação de tipo para indicar os tipos exatos envolvidos. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Restrição de valor. O valor '{0}' foi inferido para ter um tipo genérico\n {1} \nTorne os argumentos '{2}' explícitos ou, se sua intenção não for deixá-los genéricos, adicione uma anotação de tipo. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Restrição de valor. O valor '{0}' foi inferido para ter um tipo genérico\n {1} \nDefina '{2}' como um termo de dado simples e torne-o uma função com argumentos explícitos ou, se sua intenção for deixá-los genéricos, adicione uma anotação de tipo. - - syntax error erro de sintaxe @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - As implementações de interface normalmente devem ser fornecidas na declaração inicial de um tipo. As implementações de interface em aumentos podem levar ao acesso a associações estáticas antes de serem inicializadas, embora somente se a implementação de interface for chamada durante a inicialização dos dados estáticos e, por sua vez, o acesso aos dados estáticos. Você pode remover este aviso usando #nowarn "69" se tiver verificado que não é o caso. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + As implementações de interface normalmente devem ser fornecidas na declaração inicial de um tipo. As implementações de interface em aumentos podem levar ao acesso a associações estáticas antes de serem inicializadas, embora somente se a implementação de interface for chamada durante a inicialização dos dados estáticos e, por sua vez, o acesso aos dados estáticos. Você poderá remover este aviso usando #nowarn "69" se tiver verificado que este não é o caso. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - Diretivas #I só podem ocorrer em arquivos de script F# (extensões .fsx ou .fsscript). Mova este código para o arquivo de script e adicione uma opção de compilador '-I' para esta referência, ou então, delimite a diretiva com '#if INTERACTIVE'/'#endif'. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + Diretivas #I só podem ser usadas em arquivos de script F# (extensões .fsx ou .fsscript). Mova este código para o arquivo de script e adicione uma opção de compilador "-I" para esta referência, ou então, delimite a diretiva com "#if INTERACTIVE"/"#endif". - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - Diretivas #r só podem ocorrer em arquivos de script F# (extensões .fsx ou .fsscript). Mova este código para um arquivo de script ou substitua essa referência com a opção do compilador '-r'. Se essa diretiva estiver sendo executada como uma entrada do usuário, você poderá delimitá-lo com '#if INTERACTIVE'/'#endif'. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + Diretivas #r só podem ser usadas em arquivos de script F# (extensões .fsx ou .fsscript). Mova este código para um arquivo de script ou substitua essa referência com a opção do compilador "-r". Se essa diretiva estiver sendo executada como uma entrada do usuário, você poderá delimitá-lo com "#if INTERACTIVE"/"#endif". diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.ru.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.ru.xlf index 5149ef4d9f..7cb20b5e8d 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.ru.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.ru.xlf @@ -7,6 +7,31 @@ Имена аргументов в сигнатуре "{0}" и реализации "{1}" не совпадают. Будет использоваться имя аргумента из файла сигнатуры. Это может вызвать проблемы при отладке или профилировании. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Определения {0} для типа "{1}" в сигнатуре и реализации несовместимы, так как сокращения различаются:\n {2}\nв сравнении с\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Несоответствие типов. Ожидается кортеж длиной {0} типа\n {1}, \nно предоставлен кортеж длиной {2} типа\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + Ожидается нестатический элемент. Static member is expected. - Static member is expected. + Ожидается статический элемент. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - Идентификаторы переменных в верхнем регистре обычно не должны использоваться в шаблонах, и могут указывать на отсутствующую открытую декларацию или неправильно написанное имя шаблона. + Идентификаторы переменных в верхнем регистре обычно не должны использоваться в шаблонах, и могут указывать на отсутствующую открытую декларацию или неправильно написанное имя шаблона. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {0} "{1}" не удается определить, так как имя "{2}" конфликтует с {3} "{4}" в данном типе или модуле + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ Поля "{0}" и "{1}" принадлежат различным типам + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Ограничение на значение: значение '{0}' имеет предполагаемый универсальный тип\n {1}\nОднако значения не могут иметь переменные универсального типа, такие как '_a в "let x: '_a". Вы можете сделать одно из следующих действий:\n- Определите его как простой термин данных, например целочисленный литерал, строковый литерал или случай объединения, например "let x = 1".\n- Добавьте явную аннотацию типа, например "let x: int"\n- Используйте значение как необобщенный тип в более позднем коде для вывода типа, например "do x"\nили, если вам все еще нужны результаты, зависящие от типа, вы можете вместо этого определить '{2}' как функцию, выполнив одно из следующих действий:\n- Добавьте параметр модуля, например "let x()"\n- Запишите явные параметры типа, например "let x<'a>".\nЭта ошибка связана с тем, что привязка let без параметров определяет значение, а не функцию. Значения не могут быть универсальными, поскольку предполагается, что чтение значения везде приводит к одному и тому же результату, но параметры универсального типа могут сделать это предположение недействительным, включив результаты, зависящие от типа. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Ограничение значения: значение '{0}' имеет предполагаемый тип универсальной функции\n {1}\nОднако значения не могут иметь переменные универсального типа, такие как '_a в "let f: '_a". Вместо этого вам следует определить '{2}' как функцию, выполнив одно из следующих действий:\n- Добавьте явный параметр, который применяется вместо использования частичного приложения "let f param"\n- Добавьте параметр модуля, например "let f() "\n- Запишите явные параметры типа, например "let f<'a>"\nили, если вы не планируете, чтобы они были универсальными, либо:\n- Добавьте явную аннотацию типа, например "let f : obj -> obj" \n- Применить аргументы неуниверсальных типов к значению функции в более позднем коде для вывода типа, например «do f()».\nЭта ошибка связана с тем, что привязка let без параметров определяет значение, а не функцию. Значения не могут быть универсальными, поскольку предполагается, что чтение значения везде приводит к одному и тому же результату, но параметры универсального типа могут сделать это предположение недействительным, включив результаты, зависящие от типа. + + '{0}' is bound twice in this pattern {0} в данном шаблоне привязан дважды @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Этот тип является абстрактным ('abstract'), так как для нескольких абстрактных членов не указана реализация. Если это сделано намеренно, добавьте атрибут '[<AbstractClass>]' к своему типу. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Неабстрактные классы не могут содержать абстрактные элементы. Укажите реализацию элемента по умолчанию или добавьте атрибут "[<AbstractClass>]" в тип. @@ -1532,31 +1572,6 @@ Для следующих полей требуются значения: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Ограничение значения. Значение "{0}" имеет универсальный тип\n {1} \nЛибо сделайте аргументы для "{2}" явными либо (если универсальный тип не требуется) добавьте аннотацию типа. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Ограничение значения. Значение "{0}" имеет универсальный тип\n {1} \nЛибо сделайте "{2}" функцией с явными аргументами, либо (если универсальный тип не требуется) добавьте аннотацию типа. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Ограничение значения. Данный выведенный элемент должен иметь универсальный тип\n {0} \nМетоды получения или задания свойств и конструкторов не могут быть более универсальными, чем вмещающий тип. Добавьте аннотацию типа, чтобы точно обозначить затрагиваемые типы. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Ограничение значения. Выведенное значение "{0}" должно иметь универсальный тип\n {1} \nЛибо сделайте аргументы для "{2}" явными, либо (если универсальный тип не требуется) добавьте аннотацию типа. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Ограничение значения. Выведенное значение "{0}" должно иметь универсальный тип\n {1} \nЛибо определите "{2}" как простой член данных, либо сделайте его функцией с явными аргументами, либо (если универсальный тип не требуется) добавьте аннотацию типа. - - syntax error синтаксическая ошибка @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - Реализации интерфейса обычно следует указывать при первоначальном объявлении типа. Реализации интерфейса в приращениях могут привести к доступу к статическим привязкам до их инициализации, но только в том случае, если реализация интерфейса вызвана во время инициализации статических данных. Это, в свою очередь, приведет к доступу к статическим данным. Это предупреждение можно удалить с помощью #nowarn "69", если вы убедились, что это не так. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + Реализации интерфейса обычно следует указывать при начальном объявлении типа. Реализации интерфейса в расширениях могут привести к доступу к статическим привязкам до их инициализации, но только в том случае, если реализация интерфейса вызывается во время инициализации статических данных и, в свою очередь, осуществляет доступ к статическим данным. Вы можете удалить это предупреждение, используя "#nowarn "69"", если это не так. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - Директивы #I могут встречаться только в файлах скриптов F# (расширения .fsx или .fsscript). Нужно либо переместить данный код в файл скрипта, либо добавить для данной ссылки параметр компилятора "-I", либо ограничить директиву с помощью "#if INTERACTIVE"/"#endif". + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + Директивы #I можно использовать только в файлах сценариев F# (расширения .fsx или .fsscript). Нужно либо переместить данный код в файл скрипта, либо добавить для данной ссылки параметр компилятора "-I", либо ограничить директиву с помощью "#if INTERACTIVE"/"#endif". - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - Директивы #r могут встречаться только в файлах сценариев F# (файлы с расширениями .fsx или .fsscript). Переместите этот код в файл сценария или замените эту ссылку параметром компилятора "-r". Если эта директива выполняется в качестве пользовательских входных данных, вы можете заключить ее в блок "#if INTERACTIVE"/"#endif". + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + Директивы #r можно использовать только в файлах сценариев F# (расширения .fsx или .fsscript). Переместите этот код в файл сценария или замените эту ссылку параметром компилятора "-r". Если эта директива выполняется в качестве пользовательских входных данных, вы можете заключить ее в блок "#if INTERACTIVE"/"#endif". diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.tr.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.tr.xlf index dde4f9ee02..9c65fabe24 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.tr.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.tr.xlf @@ -7,6 +7,31 @@ {0}' imzası ve '{1}' uygulaması içindeki bağımsız değişken adları eşleşmiyor. İmza dosyasındaki bağımsız değişken adı kullanılacak. Bu, hata ayıklama veya profil oluşturma sırasında sorunlara neden olabilir. + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + Kısaltmalar \n {2}\nile\n {3} olarak farklı olduğundan imzadaki ve uygulamadaki '{1}' türü için {0} tanımları uyumlu değil + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n Tür uyuşmazlığı. {0} uzunluğunda türü\n {1} \nolan bir demet bekleniyordu ancak {2} uzunluğunda türü\n {3}{4}\nolan bir demet verildi @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + Statik olmayan üye bekleniyor. Static member is expected. - Static member is expected. + Statik üye bekleniyor. + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - Büyük harfli değişken tanımlayıcıları desenlerde genel olarak kullanılmamalıdır. Bunlar, eksik bir açık bildirimin veya yanlış yazılmış bir desen adının göstergesi olabilirler. + Büyük harfli değişken tanımlayıcıları desenlerde genel olarak kullanılmamalıdır. Bunlar, eksik bir açık bildirimin veya yanlış yazılmış bir desen adının göstergesi olabilirler. @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - {2}' adı bu türde veya modülde {3} '{4}' ile çakıştığı için {0} '{1}' tanımlanamıyor + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ {0}' ve '{1}' alanları farklı türlerde + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Değer kısıtlaması: '{0}' değeri, çıkarsanan bir genel türe sahip\n {1}\nAncak değerlerin "let f: '_a" içinde '_a gibi genel tür değişkenleri olamaz. Şunlardan birini yapabilirsiniz:\n- Tamsayı sabit değeri, dize sabit değeri veya birleşim durumu gibi basit bir veri terimi olarak tanımlayın, örneğin "let x = 1"\n- Açık bir tür ek açıklaması ekleyin, örneğin "let x : int" \n- Tür çıkarımı için değeri sonraki kodda genel olmayan bir tür olarak kullanın, örneğin "do x" \nveya yine de türe bağımlı sonuçlar istiyorsanız, şunlardan birini yaparak '{2}' öğesini işlev olarak tanımlayın:\n- Bir birim parametresi ekleyin, örneğin "let x()"\n- Açık tür parametreleri yazın, örneğin "let x<'a>".\nBu hatanın nedeni parametre içermeyen bir let bağlamasının bir işlevi değil bir değeri tanımlamasıdır. Bir değerin okunmasının her yerde aynı şekilde sonuçlanacağı varsayıldığından değerler genel olamaz, ancak genel tür parametreleri türe bağımlı sonuçları etkinleştirerek bu varsayımı geçersiz yapabilir. + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + Değer kısıtlaması: '{0}' değeri, çıkarsanan bir genel işlev türüne sahip\n {1}\nAncak değerlerin "let f: '_a" içinde '_a gibi genel tür değişkenleri olamaz. Aşağıdakilerden birini yaparak '{2}' öğesini işlev olarak tanımlamanız gerekir:\n- Kısmi bir uygulama kullanmak yerine uygulanan açık bir parametre ekleyin, örneğin "let f param"\n- Bir birim parametresi ekleyin, örneğin "let f()"\n- Açık tür parametreleri yazın, örneğin "let f<'a>"\nveya genel olmasını istemiyorsanız ya:\n- Bir açık tür ek açıklaması ekleyin, örneğin "let f : obj -> obj"\n- Tür çıkarımı için sonraki koddaki işlev değerine genel olmayan türlerin bağımsız değişkenlerini uygulayın, örneğin "do f()".\nBu hatanın nedeni parametre içermeyen bir let bağlamasının bir işlevi değil bir değeri tanımlamasıdır. Bir değerin okunmasının her yerde aynı şekilde sonuçlanacağı varsayıldığından değerler genel olamaz, ancak genel tür parametreleri türe bağımlı sonuçları etkinleştirerek bu varsayımı geçersiz yapabilir. + + '{0}' is bound twice in this pattern '{0}' bu desende iki kez bağlandı @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - Bazı soyut üyelere bir uygulama verilmediğinden bu bir 'abstract' türdür. Bu bilerek yapıldıysa türünüze '[<AbstractClass>]' özniteliğini ekleyin. + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + Soyut olmayan sınıflar soyut üyeler içeremez. Varsayılan bir üye uygulaması belirtin veya türünüze '[<AbstractClass>]' özniteliğini ekleyin. @@ -1532,31 +1572,6 @@ Aşağıdaki alanlar için değerler gerekiyor: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Değer kısıtlaması. '{0}' değerinin genel türü:\n {1} \nYa '{2}' bağımsız değişkenlerini açık yapın ya da genel olmasını istemiyorsanız bir tür ek açıklaması ekleyin. - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Değer kısıtlaması. '{0}' değerinin genel türü:\n {1} \nYa açık bağımsız değişkenlerle '{2}' için işlev dönüşümü yapın ya da genel olmasını istemiyorsanız bir tür ek açıklaması ekleyin. - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - Değer kısıtlaması. Bu üyenin şu genel türü olduğu çıkarıldı\n {0} \nOluşturucular ve özellik alıcıları/ayarlayıcıları kapsayan türden daha genel olamaz. Söz konusu türleri tam olarak belirtmek için bir tür ek açıklaması ekleyin. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - Değer kısıtlaması. '{0}' değerinin şu genel türü olduğu çıkarıldı:\n {1} \nYa '{2}' bağımsız değişkenlerini açık yapın ya da genel olmasını istemiyorsanız bir tür ek açıklaması ekleyin. - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - Değer kısıtlaması. '{0}' değerinin şu genel türü olduğu çıkarıldı:\n {1} \nYa '{2}' tanımını basit veri terimi olarak yaparak onu açık bağımsız değişkenlerle bir işlev yapın ya da genel olmasını istemiyorsanız bir tür ek açıklaması ekleyin. - - syntax error sözdizimi hatası @@ -1583,7 +1598,7 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. Arabirim uygulamaları normalde bir türün ilk bildiriminde verilmelidir. Genişletmelerdeki arabirim uygulamaları, başlatılmadan önce statik bağlamalara erişilmesine neden olabilirse de bu yalnızca arabirim uygulaması statik verilerin başlatılması sırasında çağrılmışsa ve buna bağlı olarak statik verilere erişiyorsa olur. Bunun söz konusu olmadığından eminseniz #nowarn "69" seçeneğini kullanarak bu uyarıyı kaldırabilirsiniz. @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - #I yönergeleri yalnızca F# betik dosyalarında (.fsx veya .fsscript uzantılı) görülebilir. Ya bu kodu bir betik dosyasına taşıyıp bu başvuru için bir '-I' derleyici seçeneği ekleyin ya da yönergeyi '#if INTERACTIVE'/'#endif' ile sınırlandırın. + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I yönergeleri yalnızca F# betik dosyalarında (.fsx veya .fsscript uzantılı) kullanılabilir. Ya bu kodu bir betik dosyasına taşıyıp bu başvuru için bir '-I' derleyici seçeneği ekleyin ya da yönergeyi '#if INTERACTIVE'/'#endif' ile sınırlandırın. - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - #r yönergeleri yalnızca F# betik dosyalarında (.fsx veya .fsscript uzantılı) görülebilir. Bu kodu bir betik dosyasına taşıyın veya bu başvuruyu '-r' derleyici seçeneği ile değiştirin. Yönerge kullanıcı girişi olarak yürütülüyorsa, yönergeyi '#if INTERACTIVE'/'#endif' ile sınırlandırabilirsiniz. + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #I yönergeleri yalnızca F# betik dosyalarında (.fsx veya .fsscript uzantılı) kullanılabilir. Bu kodu bir betik dosyasına taşıyın veya bu başvuruyu '-r' derleyici seçeneği ile değiştirin. Yönerge kullanıcı girişi olarak yürütülüyorsa, yönergeyi '#if INTERACTIVE'/'#endif' ile sınırlandırabilirsiniz. diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hans.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hans.xlf index 89e54bb26c..c895f08ec6 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hans.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hans.xlf @@ -7,6 +7,31 @@ 签名“{0}”和实现“{1}”中的参数名称不匹配。将使用签名文件中的参数名称。在进行调试或分析时这可能会导致问题。 + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + 签名和实现中类型“{1}”的 {0} 定义不兼容,因为缩写不同:\n {2}\nversus\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n 类型不匹配。应为长度为 {0} 的类型的元组\n {1} \n但提供了长度为 {2} 的类型的元组\n {3}{4}\n @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + 应为非静态成员。 Static member is expected. - Static member is expected. + 应为静态成员。 + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - 通常不得在模式中使用大写的变量标识符,存在它们可能表示缺少某个开放声明或某个模式名称拼写错误。 + 通常不得在模式中使用大写的变量标识符,存在它们可能表示缺少某个开放声明或某个模式名称拼写错误。 @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 无法定义 {0}“{1}”,因为名称“{2}”与此类型或模块中的 {3}“{4}”冲突 + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ 字段“{0}”和“{1}”来自不同的类型 + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 值限制: 值“{0}”具有推断的泛型类型\n {1}\n但是,值不能具有泛型类型变量,如“let x: '_a”中的 '_a。可以执行下列操作之一:\n- 将其定义为简单数据词,如整数文本、字符串文本或联合大小写(如“let x = 1”)\n- 添加显式类型批注(如“let x : int”)\n- 在后面的代码中将该值用作非泛型类型,以进行类型推理(如“do x”)\n如果仍需要依赖类型的结果,可以改为通过执行以下任一操作来定义“{2}”:\n- 添加单元参数(如“let x()”)\n- 编写显式类型参数,如“let x<'a>”。\n此错误是因为没有参数的 let 绑定定义了一个值,而不是函数。值不能是泛型的,因为会假定读取值会导致所有位置都相同,但泛型类型参数可能通过启用依赖类型的结果来使此假设失效。 + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 值限制: 值“{0}”具有推断的泛型函数类型\n {1}\n但是,值不能具有泛型类型变量,如“let f: '_a”中的 '_a。你应该将“{2}”定义为一个函数,而不是通过以下方式之一进行定义:\n- 添加一个显式参数,以替代使用部分应用“let f param”\n- 添加一个单位参数,如“let f()”\n- 编写显式类型参数,如“let f<'a>”\n如果不打算使其成为泛型的话,则可以选择:\n- 添加显式类型注释,如“let f : obj -> obj”\n- 在后续代码中对非泛型类型的参数应用于函数值以进行类型推断,例如“do f()”。\n此错误是因为没有参数的 let 绑定定义了一个值,而不是函数。值不能是泛型的,因为会假定读取值会导致所有位置都相同,但泛型类型参数可能通过启用依赖类型的结果来使此假设失效。 + + '{0}' is bound twice in this pattern “{0}”在此模式中绑定了两次 @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - 由于未向一些抽象成员提供实现,因此该类型为 "abstract"。如果是故意如此,请向你的类型添加 "[<AbstractClass>]" 属性。 + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + 非抽象类不能包含抽象成员。提供默认成员实现或将 “[<AbstractClass>]” 属性添加到类型。 @@ -1532,31 +1572,6 @@ 以下字段需要值: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 值限制。值“{0}”具有泛型类型\n {1} \n使“{2}”的参数成为显式参数,或添加类型批注(如果您不希望它是泛型的)。 - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 值限制。值“{0}”具有泛型类型\n {1} \n使“{2}”成为具有显式参数的函数,或添加类型批注(如果您不希望它是泛型的)。 - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - 值限制。已推理出此成员具有泛型类型\n {0} \n构造函数和属性 Getter/Setter 不能比封闭类型更通用。 添加类型批注以指示涉及到的确切类型。 - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 值限制。已推理出值“{0}”具有泛型类型\n {1} \n使“{2}”的参数成为显式参数,或添加类型批注(如果您不希望它是泛型的)。 - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 值限制。已推理出值“{0}”具有泛型类型\n {1} \n将“{2}”定义为简单的数据条目,使其成为具有显式参数的函数,或添加类型批注(如果您不希望它是泛型的)。 - - syntax error 语法错误 @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - 通常应在类型的初始声明中提供接口实现。扩充中的接口实现可能会导致在初始化静态绑定之前访问静态绑定,尽管只有在静态数据初始化期间调用了接口实现,并进而访问静态数据时才会发生这种情况。如果已经核实并非如此,则可以使用 #nowarn "69" 移除此警告。 + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + 通常应在类型的初始声明中提供接口实现。扩充中的接口实现可能会导致在初始化静态绑定之前访问静态绑定,尽管只有在静态数据初始化期间调用了接口实现,并进而访问静态数据时才会发生这种情况。如果已经核实并非如此,则可以使用 '#nowarn "69"' 移除此警告。 @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - #I 指令只能出现在 F# 脚本文件(扩展名为 .fsx 或 .fsscript)中。请将此代码添加到脚本文件中、添加此引用的“-I”编译器选项或使用“#if INTERACTIVE”/“#endif”分隔此指令。 + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I 指令只能用于 F# 脚本文件中(文件扩展名为 .fsx 或 .fsscript)。请将此代码添加到脚本文件中、添加此引用的 "-I" 编译器选项或使用 "#if INTERACTIVE"/"#endif" 分隔此指令。 - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - #r 指令只能出现在 F# 脚本文件(扩展名为 .fsx 或 .fsscript)中。请将此代码移动到脚本文件或使用 "-r" 编译器选项替换此引用。如果该指令作为用户输入执行,则可以使用 "#if INTERACTIVE'/'#endif" 分隔它。 + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r 指令只能用于 F# 脚本文件中(文件扩展名为 .fsx 或 .fsscript)。请将此代码移动到脚本文件或使用 "-r" 编译器选项替换此引用。如果该指令作为用户输入执行,则可以使用 "#if INTERACTIVE"/"#endif" 分隔它。 diff --git a/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hant.xlf b/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hant.xlf index 71c045b02f..d81a539866 100644 --- a/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hant.xlf +++ b/src/fcs-fable/src/Compiler/xlf/FSStrings.zh-Hant.xlf @@ -7,6 +7,31 @@ 特徵標記 '{0}' 和實作 '{1}' 中的引數名稱不相符。將會使用特徵標記檔案中的引數名稱。這可能會在偵錯或分析時造成問題。 + + The {0} definitions for type '{1}' in the signature and implementation are not compatible because the abbreviations differ:\n {2}\nversus\n {3} + 簽章與實作中類型 '{1}' 的 {0} 定義不相容,因為縮寫不同:\n {2}\n與\n {3} + + + + Nullness warning: {0}. + Nullness warning: {0}. + + + + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + Nullness warning: The types '{0}' and '{1}' do not have equivalent nullability. + + + + Nullness warning: The type '{0}' does not support 'null'. + Nullness warning: The type '{0}' does not support 'null'. + + + + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + Nullness warning: The types '{0}' and '{1}' do not have compatible nullability. + + Type mismatch. Expecting a tuple of length {0} of type\n {1} \nbut given a tuple of length {2} of type\n {3} {4}\n 類型不符。必須是類型為\n {1} \n 的元組長度 {0},但提供的是類型為\n {3}{4}\n 的元組長度 {2} @@ -24,12 +49,17 @@ Non-static member is expected. - Non-static member is expected. + 必須是非靜態成員。 Static member is expected. - Static member is expected. + 必須是靜態成員。 + + + + symbol '|' (directly before 'null') + symbol '|' (directly before 'null') @@ -124,7 +154,7 @@ Uppercase variable identifiers should not generally be used in patterns, and may indicate a missing open declaration or a misspelt pattern name. - 通常不應在樣式中使用大寫的變數識別碼。這可能表示缺少公開宣告或樣式名稱拼字錯誤。 + 通常不應在樣式中使用大寫的變數識別碼。這可能表示缺少公開宣告或樣式名稱拼字錯誤。 @@ -173,8 +203,8 @@ - The {0} '{1}' can not be defined because the name '{2}' clashes with the {3} '{4}' in this type or module - 無法定義 {0} '{1}',因為名稱 '{2}' 與這個類型或模組中的 {3} '{4}' 相衝突 + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module + The {0} '{1}' cannot be defined because the name '{2}' clashes with the {3} '{4}' in this type or module @@ -202,6 +232,16 @@ 欄位 '{0}' 和 '{1}' 來自不同類型 + + Value restriction: The value '{0}' has an inferred generic type\n {1}\nHowever, values cannot have generic type variables like '_a in "let x: '_a". You can do one of the following:\n- Define it as a simple data term like an integer literal, a string literal or a union case like "let x = 1"\n- Add an explicit type annotation like "let x : int"\n- Use the value as a non-generic type in later code for type inference like "do x"\nor if you still want type-dependent results, you can define '{2}' as a function instead by doing either:\n- Add a unit parameter like "let x()"\n- Write explicit type parameters like "let x<'a>".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 值限制: 值 '{0}' 具有推斷的函式類型\n {1}\n不過,值不能有泛型類型變數,例如 "let x: '_a" 中的 '_a。您可以執行下列其中一項操作:\n- 將其定義為簡單資料項,例如整數常值、字串常值或聯集,例如 "let x = 1"\n- 新增明確類型註釋,例如 "let x : int"\n- 在稍後的程式碼中使用該值作為非泛型類型,以用於類型推斷,例如 "do x"\n,或者如果您仍然想要類型相依結果,可以改為將 '{2}' 定義為函式,方法是執行以下兩個動作之一:\n- 新增單位參數,例如 "let x()"\n- 寫入明確類型參數,例如 "let x<'a>"。\n此錯誤是因為 let 繫結沒有定義值的參數,而不是函式。值不能是泛型值,因為讀取值會假設在相同位置產生,但泛型類型參數可能透過啟用類型相依結果,使此假設失效。 + + + + Value restriction: The value '{0}' has an inferred generic function type\n {1}\nHowever, values cannot have generic type variables like '_a in "let f: '_a". You should define '{2}' as a function instead by doing one of the following:\n- Add an explicit parameter that is applied instead of using a partial application "let f param"\n- Add a unit parameter like "let f()"\n- Write explicit type parameters like "let f<'a>"\nor if you do not intend for it to be generic, either:\n- Add an explicit type annotation like "let f : obj -> obj"\n- Apply arguments of non-generic types to the function value in later code for type inference like "do f()".\nThis error is because a let binding without parameters defines a value, not a function. Values cannot be generic because reading a value is assumed to result in the same everywhere but generic type parameters may invalidate this assumption by enabling type-dependent results. + 值限制: 值 '{0}' 具有推斷的泛型函式類型\n {1}\n不過,值不能有泛型類型變數,例如 "let f: '_a" 中的 '_a。您應該改為將 '{2}' 定義為函式,方法是執行以下動作之一:\n- 新增已套用的明確參數,而不是使用部分套用的 "let f param"\n- 新增單位參數,例如 "let f()"\n- 撰寫明確類型參數,例如 "let f<'a>"\n或者如果您不想讓它成為泛型,則執行以下兩個動作之一:\n- 新增明確的類型註釋,例如 "let f : obj -> obj"\n- 在稍後程式碼中將非泛型類型的引數套用至函式值,以用於類型推斷,例如 "do f()"。\n此錯誤是因為 let 繫結沒有定義值的參數,而不是函式。值不能是泛型值,因為讀取值會假設在相同位置產生,但泛型類型參數可能透過啟用類型相依結果,使此假設失效。 + + '{0}' is bound twice in this pattern '{0}' 在這個模式中繫結兩次 @@ -233,8 +273,8 @@ - This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[<AbstractClass>]' attribute to your type. - 因為未提供實作給某些抽象成員,所以此類型為 'abstract'。如果這是預期的情況,則請將 '[<AbstractClass>]' 屬性新增到您的類型。 + Non-abstract classes cannot contain abstract members. Either provide a default member implementation or add the '[<AbstractClass>]' attribute to your type. + 非抽象類別不能包含抽象成員。請提供預設成員實作,或將 '[<AbstractClass>]' 屬性新增至您的類型。 @@ -1532,31 +1572,6 @@ 下列欄位需要值: {0} - - Value restriction. The value '{0}' has generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 值限制。值 '{0}' 具有泛型類型\n {1} \n請將 '{2}' 的引數設為明確的,或者如果不想將它設為泛型,請加入類型註釋。 - - - - Value restriction. The value '{0}' has generic type\n {1} \nEither make '{2}' into a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 值限制。值 '{0}' 具有泛型類型\n {1} \n請將 '{2}' 設為具有明確引數的函式,或者如果不想將它設為泛型,請加入類型註釋。 - - - - Value restriction. This member has been inferred to have generic type\n {0} \nConstructors and property getters/setters cannot be more generic than the enclosing type. Add a type annotation to indicate the exact types involved. - 值限制。這個成員已被推斷為具有泛型類型\n {0} \n建構函式和屬性 getter/setter 不能比封入類型更為泛型。請加入類型註釋,以指示涉及的確切類型。 - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither make the arguments to '{2}' explicit or, if you do not intend for it to be generic, add a type annotation. - 值限制。值 '{0}' 已被推斷為具有泛型類型\n {1} \n請將 '{2}' 的引數設為明確的,或者如果不想將它設為泛型,請加入類型註釋。 - - - - Value restriction. The value '{0}' has been inferred to have generic type\n {1} \nEither define '{2}' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation. - 值限制。值 '{0}' 已被推斷為具有泛型類型\n {1} \n請將 '{2}' 定義為簡單資料項、將它設為具有明確引數的函式,或者如果不想將它設為泛型,請加入類型註釋。 - - syntax error 語法錯誤 @@ -1583,8 +1598,8 @@ - Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using #nowarn "69" if you have checked this is not the case. - 通常應該在類型的初始宣告上指定介面實作。擴增中的介面實作可能會在初始化之前存取靜態繫結,但只有在初始化靜態資料時叫用介面實作,並依序存取靜態資料。如果您未檢查過這種情況,可以使用 #nowarn 「69」 移除此警告。 + Interface implementations should normally be given on the initial declaration of a type. Interface implementations in augmentations may lead to accessing static bindings before they are initialized, though only if the interface implementation is invoked during initialization of the static data, and in turn access the static data. You may remove this warning using '#nowarn "69"' if you have checked this is not the case. + 通常應該在類型的初始宣告上指定介面實作。擴增中的介面實作可能會在初始化之前存取靜態繫結,但只有在初始化靜態資料時叫用介面實作,並依序存取靜態資料。如果您未檢查過這種情況,可以使用「#nowarn "69"」移除此警告。 @@ -1603,13 +1618,13 @@ - #I directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. - #I 指示詞只能出現在 F# 指令碼檔案 (副檔名 .fsx 或 .fsscript) 中。請將這個程式碼移到指令碼檔案、為這個參考加入 '-I' 編譯器選項,或用 '#if INTERACTIVE'/'#endif' 分隔這個指示詞。 + #I directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file, add a '-I' compiler option for this reference or delimit the directive with delimit it with '#if INTERACTIVE'/'#endif'. + #I 指示詞只能用於 F# 指令碼檔案 (副檔名 .fsx 或 .fsscript) 中。請將這個程式碼移到指令碼檔案、為這個參考加入 '-I' 編譯器選項,或用 '#if INTERACTIVE'/'#endif' 分隔這個指示詞。 - #r directives may only occur in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. - #r 指示詞只能出現在 F# 指令碼檔案 (副檔名為 .fsx 或 .fsscript) 中。請將此程式碼移至指令碼檔案,或以 '-r' 編譯器選項取代此參考。若此指示詞要以使用者輸入的方式執行,可以使用 '#if INTERACTIVE'/'#endif' 加以分隔。 + #r directives may only be used in F# script files (extensions .fsx or .fsscript). Either move this code to a script file or replace this reference with the '-r' compiler option. If this directive is being executed as user input, you may delimit it with '#if INTERACTIVE'/'#endif'. + #r 指示詞只能用於 F# 指令碼檔案 (副檔名為 .fsx 或 .fsscript) 中。請將此程式碼移至指令碼檔案,或以 '-r' 編譯器選項取代此參考。若此指示詞要以使用者輸入的方式執行,可以使用 '#if INTERACTIVE'/'#endif' 加以分隔。 diff --git a/src/fcs-fable/test/bench/fcs-fable-bench.fsproj b/src/fcs-fable/test/bench/fcs-fable-bench.fsproj index a7ab44e1ac..9dadb98e53 100644 --- a/src/fcs-fable/test/bench/fcs-fable-bench.fsproj +++ b/src/fcs-fable/test/bench/fcs-fable-bench.fsproj @@ -2,7 +2,7 @@ Exe - net8.0 + net9.0 $(DefineConstants);DOTNET_FILE_SYSTEM @@ -19,9 +19,9 @@ - + - + diff --git a/src/fcs-fable/test/fcs-fable-test.fsproj b/src/fcs-fable/test/fcs-fable-test.fsproj index ccaf13c1aa..d566a0aa63 100644 --- a/src/fcs-fable/test/fcs-fable-test.fsproj +++ b/src/fcs-fable/test/fcs-fable-test.fsproj @@ -2,7 +2,7 @@ Exe - net8.0 + net9.0 $(DefineConstants);DOTNET_FILE_SYSTEM @@ -18,9 +18,9 @@ - + - +