From 8a59755203e3e772ed9cc2ea531e9766b7eb6ddb Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Wed, 30 Jan 2019 21:11:09 -0500 Subject: [PATCH 1/2] integrate visualfsharp --- .gitignore | 12 +- .vsts-pr.yaml | 63 +- CoordinateXlif.targets | 3 + FSharp.Directory.Build.props | 6 + FSharp.Directory.Build.targets | 7 + FSharp.Profiles.props | 53 + FSharpBuild.Directory.Build.props | 82 + FSharpBuild.Directory.Build.targets | 42 + NuGet.Config | 14 +- PublishToBlob.proj | 19 +- RoslynPackageVersion.txt | 1 + benchmarks/Benchmarks.sln | 37 + .../CompilerServiceBenchmarks.fsproj | 21 + .../CompilerServiceBenchmarks/Program.fs | 60 + build/projects/Directory.Build.props | 3 + build/projects/Directory.Build.targets | 3 + build/projects/Signing.proj | 27 + build/targets/AssemblyVersions.props | 60 + build/targets/CommonPackages.targets | 7 + build/targets/ConvertPortablePdbs.targets | 38 + .../GenerateAssemblyAttributes.targets | 119 ++ .../GenerateInternalsVisibleTo.targets | 80 + build/targets/GitHash.props | 51 + build/targets/NGenOrCrossGen.targets | 36 + build/targets/PackageVersions.props | 144 ++ eng/common/CIBuild.cmd | 2 + eng/common/PublishBuildAssets.cmd | 3 + eng/common/PublishToPackageFeed.proj | 37 + eng/common/README.md | 28 + eng/common/build.ps1 | 133 ++ eng/common/build.sh | 213 +++ eng/common/cibuild.sh | 16 + eng/common/cross/android/arm/toolchain.cmake | 41 + .../cross/android/arm64/toolchain.cmake | 42 + eng/common/cross/arm/sources.list.bionic | 11 + eng/common/cross/arm/sources.list.jessie | 3 + eng/common/cross/arm/sources.list.trusty | 11 + eng/common/cross/arm/sources.list.vivid | 11 + eng/common/cross/arm/sources.list.wily | 11 + eng/common/cross/arm/sources.list.xenial | 11 + eng/common/cross/arm/sources.list.zesty | 11 + eng/common/cross/arm/trusty-lttng-2.4.patch | 71 + eng/common/cross/arm/trusty.patch | 97 ++ eng/common/cross/arm64/sources.list.bionic | 11 + eng/common/cross/arm64/sources.list.trusty | 11 + eng/common/cross/arm64/sources.list.vivid | 11 + eng/common/cross/arm64/sources.list.wily | 11 + eng/common/cross/arm64/sources.list.xenial | 11 + eng/common/cross/arm64/sources.list.zesty | 11 + eng/common/cross/armel/sources.list.jessie | 3 + eng/common/cross/armel/tizen-build-rootfs.sh | 44 + eng/common/cross/armel/tizen-fetch.sh | 171 ++ eng/common/cross/armel/tizen/tizen-dotnet.ks | 50 + eng/common/cross/armel/tizen/tizen.patch | 18 + eng/common/cross/build-android-rootfs.sh | 137 ++ eng/common/cross/build-rootfs.sh | 210 +++ eng/common/cross/toolchain.cmake | 138 ++ eng/common/cross/x86/sources.list.bionic | 11 + eng/common/cross/x86/sources.list.trusty | 11 + eng/common/cross/x86/sources.list.vivid | 11 + eng/common/cross/x86/sources.list.wily | 11 + eng/common/cross/x86/sources.list.xenial | 11 + eng/common/darc-init.ps1 | 32 + eng/common/darc-init.sh | 38 + eng/common/helixpublish.proj | 26 + eng/common/init-tools-native.cmd | 3 + eng/common/init-tools-native.ps1 | 128 ++ eng/common/init-tools-native.sh | 145 ++ eng/common/msbuild.ps1 | 27 + eng/common/msbuild.sh | 58 + eng/common/native/CommonLibrary.psm1 | 358 +++++ eng/common/native/common-library.sh | 168 ++ eng/common/native/install-cmake.sh | 117 ++ eng/common/native/install-tool.ps1 | 130 ++ eng/common/sdk-task.ps1 | 74 + eng/common/templates/job/job.yml | 205 +++ .../templates/job/publish-build-assets.yml | 63 + eng/common/templates/jobs/jobs.yml | 77 + eng/common/templates/phases/base.yml | 130 ++ .../templates/phases/publish-build-assets.yml | 46 + eng/common/templates/steps/build-reason.yml | 12 + eng/common/templates/steps/helix-publish.yml | 51 + eng/common/templates/steps/run-on-unix.yml | 7 + eng/common/templates/steps/run-on-windows.yml | 7 + .../steps/run-script-ifequalelse.yml | 33 + eng/common/templates/steps/send-to-helix.yml | 81 + eng/common/templates/steps/telemetry-end.yml | 63 + .../templates/steps/telemetry-start.yml | 154 ++ eng/common/tools.ps1 | 508 ++++++ eng/common/tools.sh | 319 ++++ fcs/.paket/Paket.Restore.targets | 179 ++- fcs/Directory.Build.props | 25 + fcs/Directory.Build.targets | 3 + ...FSharp.Compiler.Service.MSBuild.v12.fsproj | 13 +- ...arp.Compiler.Service.ProjectCracker.fsproj | 10 +- ...Compiler.Service.ProjectCrackerTool.fsproj | 7 +- fcs/FSharp.Compiler.Service.Tests/App.config | 4 + .../CSharp_Analysis/CSharp_Analysis.csproj | 1 + .../FSharp.Compiler.Service.Tests.fsproj | 10 +- .../FSharp.Compiler.Service.fsproj | 25 +- fcs/build.cmd | 3 + fcs/build.fsx | 24 +- fcs/docsrc/content/ja/symbols.fsx | 4 +- fcs/docsrc/content/ja/tokenizer.fsx | 2 +- fcs/docsrc/content/symbols.fsx | 4 +- fcs/docsrc/content/tokenizer.fsx | 2 +- fcs/fcs.props | 4 +- .../EditorService/EditorService.fsproj | 2 +- fcs/samples/FscExe/FscExe.fsproj | 2 +- fcs/samples/FsiExe/FsiExe.fsproj | 2 +- .../InteractiveService.fsproj | 2 +- fcs/samples/Tokenizer/Program.fs | 2 +- fcs/samples/Tokenizer/Tokenizer.fsproj | 2 +- fcs/samples/UntypedTree/UntypedTree.fsproj | 2 +- fsharp.proj | 170 ++ global.json | 9 + mono/cibuild.sh | 2 +- packages.config | 62 +- proto.proj | 36 + src/Directory.Build.props | 3 + src/Directory.Build.targets | 3 + src/absil/il.fs | 114 +- src/absil/il.fsi | 28 +- src/absil/illib.fs | 90 +- src/absil/ilmorph.fs | 10 +- src/absil/ilprint.fs | 53 +- src/absil/ilprint.fsi | 2 +- src/absil/ilread.fs | 11 +- src/absil/ilreflect.fs | 19 +- src/absil/ilwrite.fs | 9 +- src/buildtools/buildtools.proj | 32 + src/buildtools/buildtools.targets | 56 + src/buildtools/fslex/App.config | 14 + src/buildtools/fslex/Arg.fs | 133 ++ src/buildtools/fslex/Arg.fsi | 50 + src/buildtools/fslex/Lexing.fs | 423 +++++ src/buildtools/fslex/Lexing.fsi | 151 ++ src/buildtools/fslex/Parsing.fs | 514 ++++++ src/buildtools/fslex/Parsing.fsi | 130 ++ src/buildtools/fslex/fslex.fs | 224 +++ src/buildtools/fslex/fslex.fsproj | 22 + src/buildtools/fslex/fslexast.fs | 409 +++++ src/buildtools/fslex/fslexlex.fs | 735 +++++++++ src/buildtools/fslex/fslexpars.fs | 651 ++++++++ src/buildtools/fsyacc/App.config | 14 + src/buildtools/fsyacc/Arg.fs | 133 ++ src/buildtools/fsyacc/Arg.fsi | 50 + src/buildtools/fsyacc/Lexing.fs | 423 +++++ src/buildtools/fsyacc/Lexing.fsi | 151 ++ src/buildtools/fsyacc/Parsing.fs | 514 ++++++ src/buildtools/fsyacc/Parsing.fsi | 130 ++ src/buildtools/fsyacc/fsyacc.fs | 533 +++++++ src/buildtools/fsyacc/fsyacc.fsproj | 22 + src/buildtools/fsyacc/fsyaccast.fs | 1000 ++++++++++++ src/buildtools/fsyacc/fsyacclex.fs | 644 ++++++++ src/buildtools/fsyacc/fsyaccpars.fs | 562 +++++++ src/fsharp/AccessibilityLogic.fs | 9 +- src/fsharp/AttributeChecking.fs | 4 +- src/fsharp/CheckFormatStrings.fs | 18 +- src/fsharp/CompileOps.fs | 186 ++- src/fsharp/CompileOps.fsi | 10 +- src/fsharp/CompileOptions.fs | 9 +- src/fsharp/ConstraintSolver.fs | 642 ++++---- src/fsharp/DetupleArgs.fs | 10 +- src/fsharp/Directory.Build.props | 12 + src/fsharp/Directory.Build.targets | 4 + src/fsharp/Directory.Nuget.props | 27 + src/fsharp/Directory.Nuget.targets | 11 + src/fsharp/ErrorLogger.fs | 14 +- src/fsharp/ErrorResolutionHints.fs | 3 +- src/fsharp/ExtensionTyping.fs | 2 +- src/fsharp/FSComp.txt | 49 +- src/fsharp/FSStrings.resx | 6 + .../Directory.Build.props | 11 + .../Directory.Build.targets | 18 + ...icrosoft.FSharp.Compiler.Prerelease.csproj | 8 + .../Microsoft.FSharp.Compiler.csproj | 8 + .../Testing.FSharp.Compiler.csproj | 8 + src/fsharp/FindUnsolved.fs | 37 +- src/fsharp/IlxGen.fs | 564 ++++--- src/fsharp/IlxGen.fsi | 7 +- src/fsharp/InfoReader.fs | 32 +- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 4 +- src/fsharp/LexFilter.fs | 34 +- src/fsharp/LowerCallsAndSeqs.fs | 117 +- src/fsharp/MSBuildReferenceResolver.fs | 117 +- src/fsharp/MethodCalls.fs | 16 +- src/fsharp/NameResolution.fs | 851 +++++----- src/fsharp/NameResolution.fsi | 21 +- src/fsharp/NicePrint.fs | 23 +- src/fsharp/Optimizer.fs | 293 +++- src/fsharp/PatternMatchCompilation.fs | 128 +- src/fsharp/PatternMatchCompilation.fsi | 5 +- src/fsharp/PostInferenceChecks.fs | 234 ++- src/fsharp/PostInferenceChecks.fsi | 4 +- src/fsharp/PrettyNaming.fs | 74 +- src/fsharp/QuotationPickler.fs | 6 +- src/fsharp/QuotationTranslator.fs | 24 +- src/fsharp/SignatureConformance.fs | 44 +- .../SimulatedMSBuildReferenceResolver.fs | 4 +- src/fsharp/TastOps.fs | 422 +++-- src/fsharp/TastOps.fsi | 1191 ++++++++++---- src/fsharp/TastPickle.fs | 231 ++- src/fsharp/TastPickle.fsi | 2 +- src/fsharp/TcGlobals.fs | 2 +- src/fsharp/TypeChecker.fs | 1384 +++++++++-------- src/fsharp/TypeChecker.fsi | 4 +- src/fsharp/ast.fs | 130 +- src/fsharp/fsc.fs | 32 +- src/fsharp/fsc/fsc.fsproj | 43 + src/fsharp/fsi/fsi.fs | 6 +- src/fsharp/fsi/fsi.fsproj | 60 + src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf | 6 +- src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf | 2 +- src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj | 44 + src/fsharp/import.fs | 11 +- src/fsharp/infos.fs | 76 +- src/fsharp/layout.fs | 2 + src/fsharp/layout.fsi | 2 + src/fsharp/lex.fsl | 2 + src/fsharp/lib.fs | 3 +- src/fsharp/pars.fsy | 238 +-- src/fsharp/range.fs | 274 ++-- src/fsharp/range.fsi | 93 +- src/fsharp/service/IncrementalBuild.fs | 163 +- src/fsharp/service/IncrementalBuild.fsi | 5 +- src/fsharp/service/ServiceAssemblyContent.fs | 13 +- src/fsharp/service/ServiceDeclarationLists.fs | 33 +- .../service/ServiceInterfaceStubGenerator.fs | 8 +- src/fsharp/service/ServiceLexing.fs | 104 +- src/fsharp/service/ServiceLexing.fsi | 19 +- src/fsharp/service/ServiceNavigation.fs | 14 +- .../service/ServiceParamInfoLocations.fs | 4 +- src/fsharp/service/ServiceParseTreeWalk.fs | 54 +- src/fsharp/service/ServiceStructure.fs | 23 +- src/fsharp/service/ServiceStructure.fsi | 3 +- src/fsharp/service/ServiceUntypedParse.fs | 32 +- src/fsharp/service/ServiceXmlDocParser.fs | 3 +- src/fsharp/service/service.fs | 147 +- src/fsharp/service/service.fsi | 2 +- src/fsharp/symbols/Exprs.fs | 4 +- src/fsharp/symbols/SymbolHelpers.fs | 42 +- src/fsharp/symbols/SymbolPatterns.fs | 4 +- src/fsharp/symbols/Symbols.fs | 167 +- src/fsharp/symbols/Symbols.fsi | 29 +- src/fsharp/tast.fs | 231 ++- src/ilx/ilxsettings.fs | 4 +- src/scripts/fssrgen.fsx | 494 ------ src/scripts/fssrgen.targets | 57 - src/scripts/scriptlib.fsx | 22 +- src/scripts/subst.fsx | 25 - src/utils/CompilerLocationUtils.fs | 13 - src/utils/EditDistance.fs | 64 +- src/utils/prim-lexing.fs | 1 + src/utils/prim-lexing.fsi | 25 +- src/utils/prim-parsing.fs | 163 +- src/utils/prim-parsing.fsi | 66 +- src/utils/reshapedmsbuild.fs | 4 + src/utils/sformat.fs | 2 + src/utils/sformat.fsi | 2 + .../Directory.Build.props | 3 + .../Directory.Build.targets | 3 + .../FSharp.Compiler.UnitTests.fsproj | 28 + tests/FSharp.Compiler.UnitTests/ILHelpers.fs | 116 ++ .../Language/StringConcat.fs | 845 ++++++++++ tests/FSharp.Directory.Build.props | 3 + tests/FSharp.Directory.Build.targets | 11 + tests/projects/Directory.Build.props | 3 + tests/projects/Directory.Build.targets | 3 + .../Directory.Build.props | 3 + .../Directory.Build.targets | 3 + tests/projects/misc/Directory.Build.props | 3 + tests/projects/misc/Directory.Build.targets | 3 + .../ProjectWithBuildErrors.fsproj | 80 +- .../ProjectWithBuildErrors/packages.config | 4 - .../Library2/Library2.fsproj | 76 +- .../Library2/packages.config | 4 - .../SameFileBelongsToMultipleProjects.fsproj | 87 +- ...brary1AlwaysInMatchingConfiguration.fsproj | 75 +- .../fff.config | 4 - .../Library2AlwaysInDebugConfiguration.fsproj | 76 +- .../packages.config | 4 - .../TestProjectChanges.fsproj | 92 +- tests/scripts/update-baselines.fsx | 83 + tests/service/CSharpProjectAnalysis.fs | 4 +- tests/service/Common.fs | 22 +- tests/service/EditorTests.fs | 24 +- tests/service/FscTests.fs | 2 +- tests/service/InteractiveCheckerTests.fs | 6 +- tests/service/ProjectAnalysisTests.fs | 111 +- tests/service/ServiceUntypedParseTests.fs | 14 +- tests/service/StructureTests.fs | 182 ++- tests/service/Symbols.fs | 25 +- tests/service/TokenizerTests.fs | 4 +- tests/service/TreeVisitorTests.fs | 22 + .../CSharp_Analysis/CSharp_Analysis.csproj | 63 +- .../Properties/AssemblyInfo.cs | 28 - tests/service/data/Directory.Build.props | 3 + tests/service/data/Directory.Build.targets | 3 + tests/service/data/FSharp.Data.DesignTime.dll | Bin 1452544 -> 2305024 bytes tests/service/data/FSharp.Data.dll | Bin 714240 -> 971264 bytes tests/service/data/TestTP/TestTP.fsproj | 75 +- verify-translations.cmd | 2 +- 311 files changed, 21602 insertions(+), 4997 deletions(-) create mode 100644 CoordinateXlif.targets create mode 100644 FSharp.Directory.Build.props create mode 100644 FSharp.Directory.Build.targets create mode 100644 FSharp.Profiles.props create mode 100644 FSharpBuild.Directory.Build.props create mode 100644 FSharpBuild.Directory.Build.targets create mode 100644 RoslynPackageVersion.txt create mode 100644 benchmarks/Benchmarks.sln create mode 100644 benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj create mode 100644 benchmarks/CompilerServiceBenchmarks/Program.fs create mode 100644 build/projects/Directory.Build.props create mode 100644 build/projects/Directory.Build.targets create mode 100644 build/projects/Signing.proj create mode 100644 build/targets/AssemblyVersions.props create mode 100644 build/targets/CommonPackages.targets create mode 100644 build/targets/ConvertPortablePdbs.targets create mode 100644 build/targets/GenerateAssemblyAttributes.targets create mode 100644 build/targets/GenerateInternalsVisibleTo.targets create mode 100644 build/targets/GitHash.props create mode 100644 build/targets/NGenOrCrossGen.targets create mode 100644 build/targets/PackageVersions.props create mode 100644 eng/common/CIBuild.cmd create mode 100644 eng/common/PublishBuildAssets.cmd create mode 100644 eng/common/PublishToPackageFeed.proj create mode 100644 eng/common/README.md create mode 100644 eng/common/build.ps1 create mode 100755 eng/common/build.sh create mode 100755 eng/common/cibuild.sh create mode 100644 eng/common/cross/android/arm/toolchain.cmake create mode 100644 eng/common/cross/android/arm64/toolchain.cmake create mode 100644 eng/common/cross/arm/sources.list.bionic create mode 100644 eng/common/cross/arm/sources.list.jessie create mode 100644 eng/common/cross/arm/sources.list.trusty create mode 100644 eng/common/cross/arm/sources.list.vivid create mode 100644 eng/common/cross/arm/sources.list.wily create mode 100644 eng/common/cross/arm/sources.list.xenial create mode 100644 eng/common/cross/arm/sources.list.zesty create mode 100644 eng/common/cross/arm/trusty-lttng-2.4.patch create mode 100644 eng/common/cross/arm/trusty.patch create mode 100644 eng/common/cross/arm64/sources.list.bionic create mode 100644 eng/common/cross/arm64/sources.list.trusty create mode 100644 eng/common/cross/arm64/sources.list.vivid create mode 100644 eng/common/cross/arm64/sources.list.wily create mode 100644 eng/common/cross/arm64/sources.list.xenial create mode 100644 eng/common/cross/arm64/sources.list.zesty create mode 100644 eng/common/cross/armel/sources.list.jessie create mode 100755 eng/common/cross/armel/tizen-build-rootfs.sh create mode 100755 eng/common/cross/armel/tizen-fetch.sh create mode 100644 eng/common/cross/armel/tizen/tizen-dotnet.ks create mode 100644 eng/common/cross/armel/tizen/tizen.patch create mode 100755 eng/common/cross/build-android-rootfs.sh create mode 100755 eng/common/cross/build-rootfs.sh create mode 100644 eng/common/cross/toolchain.cmake create mode 100644 eng/common/cross/x86/sources.list.bionic create mode 100644 eng/common/cross/x86/sources.list.trusty create mode 100644 eng/common/cross/x86/sources.list.vivid create mode 100644 eng/common/cross/x86/sources.list.wily create mode 100644 eng/common/cross/x86/sources.list.xenial create mode 100644 eng/common/darc-init.ps1 create mode 100755 eng/common/darc-init.sh create mode 100644 eng/common/helixpublish.proj create mode 100644 eng/common/init-tools-native.cmd create mode 100644 eng/common/init-tools-native.ps1 create mode 100755 eng/common/init-tools-native.sh create mode 100644 eng/common/msbuild.ps1 create mode 100755 eng/common/msbuild.sh create mode 100644 eng/common/native/CommonLibrary.psm1 create mode 100755 eng/common/native/common-library.sh create mode 100755 eng/common/native/install-cmake.sh create mode 100644 eng/common/native/install-tool.ps1 create mode 100644 eng/common/sdk-task.ps1 create mode 100644 eng/common/templates/job/job.yml create mode 100644 eng/common/templates/job/publish-build-assets.yml create mode 100644 eng/common/templates/jobs/jobs.yml create mode 100644 eng/common/templates/phases/base.yml create mode 100644 eng/common/templates/phases/publish-build-assets.yml create mode 100644 eng/common/templates/steps/build-reason.yml create mode 100644 eng/common/templates/steps/helix-publish.yml create mode 100644 eng/common/templates/steps/run-on-unix.yml create mode 100644 eng/common/templates/steps/run-on-windows.yml create mode 100644 eng/common/templates/steps/run-script-ifequalelse.yml create mode 100644 eng/common/templates/steps/send-to-helix.yml create mode 100644 eng/common/templates/steps/telemetry-end.yml create mode 100644 eng/common/templates/steps/telemetry-start.yml create mode 100644 eng/common/tools.ps1 create mode 100755 eng/common/tools.sh create mode 100644 fcs/Directory.Build.props create mode 100644 fcs/Directory.Build.targets create mode 100644 fsharp.proj create mode 100644 global.json create mode 100644 proto.proj create mode 100644 src/Directory.Build.props create mode 100644 src/Directory.Build.targets create mode 100644 src/buildtools/buildtools.proj create mode 100644 src/buildtools/buildtools.targets create mode 100644 src/buildtools/fslex/App.config create mode 100644 src/buildtools/fslex/Arg.fs create mode 100644 src/buildtools/fslex/Arg.fsi create mode 100644 src/buildtools/fslex/Lexing.fs create mode 100644 src/buildtools/fslex/Lexing.fsi create mode 100644 src/buildtools/fslex/Parsing.fs create mode 100644 src/buildtools/fslex/Parsing.fsi create mode 100644 src/buildtools/fslex/fslex.fs create mode 100644 src/buildtools/fslex/fslex.fsproj create mode 100644 src/buildtools/fslex/fslexast.fs create mode 100644 src/buildtools/fslex/fslexlex.fs create mode 100644 src/buildtools/fslex/fslexpars.fs create mode 100644 src/buildtools/fsyacc/App.config create mode 100644 src/buildtools/fsyacc/Arg.fs create mode 100644 src/buildtools/fsyacc/Arg.fsi create mode 100644 src/buildtools/fsyacc/Lexing.fs create mode 100644 src/buildtools/fsyacc/Lexing.fsi create mode 100644 src/buildtools/fsyacc/Parsing.fs create mode 100644 src/buildtools/fsyacc/Parsing.fsi create mode 100644 src/buildtools/fsyacc/fsyacc.fs create mode 100644 src/buildtools/fsyacc/fsyacc.fsproj create mode 100644 src/buildtools/fsyacc/fsyaccast.fs create mode 100644 src/buildtools/fsyacc/fsyacclex.fs create mode 100644 src/buildtools/fsyacc/fsyaccpars.fs create mode 100644 src/fsharp/Directory.Build.props create mode 100644 src/fsharp/Directory.Build.targets create mode 100644 src/fsharp/Directory.Nuget.props create mode 100644 src/fsharp/Directory.Nuget.targets create mode 100644 src/fsharp/FSharp.Compiler.nuget/Directory.Build.props create mode 100644 src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets create mode 100644 src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj create mode 100644 src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj create mode 100644 src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj create mode 100644 src/fsharp/fsc/fsc.fsproj create mode 100644 src/fsharp/fsi/fsi.fsproj create mode 100644 src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj delete mode 100644 src/scripts/fssrgen.fsx delete mode 100644 src/scripts/fssrgen.targets delete mode 100644 src/scripts/subst.fsx create mode 100644 tests/FSharp.Compiler.UnitTests/Directory.Build.props create mode 100644 tests/FSharp.Compiler.UnitTests/Directory.Build.targets create mode 100644 tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj create mode 100644 tests/FSharp.Compiler.UnitTests/ILHelpers.fs create mode 100644 tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs create mode 100644 tests/FSharp.Directory.Build.props create mode 100644 tests/FSharp.Directory.Build.targets create mode 100644 tests/projects/Directory.Build.props create mode 100644 tests/projects/Directory.Build.targets create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets create mode 100644 tests/projects/misc/Directory.Build.props create mode 100644 tests/projects/misc/Directory.Build.targets delete mode 100644 tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config delete mode 100644 tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config delete mode 100644 tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config create mode 100644 tests/scripts/update-baselines.fsx create mode 100644 tests/service/TreeVisitorTests.fs create mode 100644 tests/service/data/Directory.Build.props create mode 100644 tests/service/data/Directory.Build.targets diff --git a/.gitignore b/.gitignore index 964cde2fc6..857182a3dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,9 @@ -# Downloaded packages and build tools. -/lkg -/packages -/Tools +# output location +artifacts/ + +packages/ /tests/scripts/current -/release -/debug -/Proto # Patches that may have been generated by scripts. # (These aren't generally useful to commit directly; if anything, they should be applied.) @@ -218,7 +215,6 @@ times /tests/fsharpqa/testenv/bin/System.ValueTuple.dll source_link.json .vs/ -/VSRelease/net40/bin System.ValueTuple.dll tests/fsharpqa/testenv/bin/System.ValueTuple.dll lib/netcore/fsc/bin/ diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml index 67f78e6df0..44c277a394 100644 --- a/.vsts-pr.yaml +++ b/.vsts-pr.yaml @@ -1,31 +1,34 @@ -phases: -- phase: Linux - queue: - name: Hosted Linux Preview - timeoutInMinutes: 90 - parallel: 2 +jobs: +- job: Linux + pool: + vmImage: ubuntu-16.04 + timeoutInMinutes: 90 + strategy: + maxParallel: 2 matrix: - release_default: - _command: ./mono/cibuild.sh - _args: release + dotnet_sdk: + _command: make + _args: Configuration=release + # disabled until it can be properly fixed release_fcs: _command: ./fcs/build.sh _args: Build steps: - - script: $(_command) $(_args) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.SourcesDirectory)/tests/TestResults' - ArtifactName: 'Linux $(_command) $(_args)' - publishLocation: Container - continueOnError: true - condition: failed() + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults' + ArtifactName: 'Linux $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() -- phase: Windows - queue: - name: Hosted VS2017 - timeoutInMinutes: 90 - parallel: 7 +- job: Windows + pool: + vmImage: vs2017-win2016 + timeoutInMinutes: 120 + strategy: + maxParallel: 7 matrix: ci_part1: _command: build.cmd @@ -49,11 +52,11 @@ phases: _command: fcs\build.cmd _args: TestAndNuget steps: - - script: $(_command) $(_args) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.SourcesDirectory)\tests\TestResults' - ArtifactName: 'Windows $(_command) $(_args)' - publishLocation: Container - continueOnError: true - condition: failed() + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)\artifacts\TestResults' + ArtifactName: 'Windows $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() diff --git a/CoordinateXlif.targets b/CoordinateXlif.targets new file mode 100644 index 0000000000..ea1ed17aaa --- /dev/null +++ b/CoordinateXlif.targets @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/FSharp.Directory.Build.props b/FSharp.Directory.Build.props new file mode 100644 index 0000000000..e9c2a5c5e9 --- /dev/null +++ b/FSharp.Directory.Build.props @@ -0,0 +1,6 @@ + + + + + + diff --git a/FSharp.Directory.Build.targets b/FSharp.Directory.Build.targets new file mode 100644 index 0000000000..84125426d5 --- /dev/null +++ b/FSharp.Directory.Build.targets @@ -0,0 +1,7 @@ + + + + + + + diff --git a/FSharp.Profiles.props b/FSharp.Profiles.props new file mode 100644 index 0000000000..2e2edb7370 --- /dev/null +++ b/FSharp.Profiles.props @@ -0,0 +1,53 @@ + + + + + + $(DefineConstants);CROSS_PLATFORM_COMPILER + $(DefineConstants);ENABLE_MONO_SUPPORT + $(DefineConstants);BE_SECURITY_TRANSPARENT + $(DefineConstants);FX_LCIDFROMCODEPAGE + + + + $(DefineConstants);NETSTANDARD + $(DefineConstants);NETSTANDARD1_6 + $(DefineConstants);FX_NO_APP_DOMAINS + $(DefineConstants);FX_NO_ARRAY_LONG_LENGTH + $(DefineConstants);FX_NO_BEGINEND_READWRITE + $(DefineConstants);FX_NO_BINARY_SERIALIZATION + $(DefineConstants);FX_NO_CONVERTER + $(DefineConstants);FX_NO_DEFAULT_DEPENDENCY_TYPE + $(DefineConstants);FX_NO_CORHOST_SIGNER + $(DefineConstants);FX_NO_EVENTWAITHANDLE_IDISPOSABLE + $(DefineConstants);FX_NO_EXIT_CONTEXT_FLAGS + $(DefineConstants);FX_NO_HEAPTERMINATION + $(DefineConstants);FX_NO_LINKEDRESOURCES + $(DefineConstants);FX_NO_LOADER_OPTIMIZATION + $(DefineConstants);FX_NO_PARAMETERIZED_THREAD_START + $(DefineConstants);FX_NO_PDB_READER + $(DefineConstants);FX_NO_PDB_WRITER + $(DefineConstants);FX_NO_REFLECTION_MODULE_HANDLES + $(DefineConstants);FX_NO_REFLECTION_ONLY + $(DefineConstants);FX_NO_RUNTIMEENVIRONMENT + $(DefineConstants);FX_NO_SECURITY_PERMISSIONS + $(DefineConstants);FX_NO_SERVERCODEPAGES + $(DefineConstants);FX_NO_SYMBOLSTORE + $(DefineConstants);FX_NO_SYSTEM_CONFIGURATION + $(DefineConstants);FX_NO_THREAD + $(DefineConstants);FX_NO_THREADABORT + $(DefineConstants);FX_NO_WAITONE_MILLISECONDS + $(DefineConstants);FX_NO_WEB_CLIENT + $(DefineConstants);FX_NO_WIN_REGISTRY + $(DefineConstants);FX_NO_WINFORMS + $(DefineConstants);FX_NO_INDENTED_TEXT_WRITER + $(DefineConstants);FX_REDUCED_EXCEPTIONS + $(DefineConstants);FX_REDUCED_CONSOLE + $(DefineConstants);FX_RESHAPED_REFEMIT + $(DefineConstants);FX_RESHAPED_GLOBALIZATION + $(DefineConstants);FX_RESHAPED_REFLECTION + $(DefineConstants);FX_RESHAPED_MSBUILD + $(OtherFlags) --simpleresolution + + + diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props new file mode 100644 index 0000000000..c5e4108181 --- /dev/null +++ b/FSharpBuild.Directory.Build.props @@ -0,0 +1,82 @@ + + + + + + + + + + Debug + $(MSBuildThisFileDirectory) + $(RepoRoot)src + $(RepoRoot)artifacts + $(ArtifactsDir)\toolset + $(ArtifactsDir)\bin + $(ArtifactsDir)\obj + $(ArtifactsDir)\packages + $(ArtifactsBinDir)\$(MSBuildProjectName) + $(ArtifactsObjDir)\$(MSBuildProjectName) + $(ArtifactsDir)\SymStore + $(ArtifactsBinDir)\fsc\Proto\net46 + $(ArtifactsBinDir)/fsc/Proto/netcoreapp2.1 + 4.4.0 + + + + + + $(NUGET_PACKAGES) + $(UserProfile)\.nuget\packages\ + $(HOME)/.nuget/packages/ + + $(NuGetPackageRoot)\ + $(NuGetPackageRoot)/ + + true + + + + + true + /usr/lib/mono/4.5-api + /usr/lib/mono/4.6-api + + + + + false + true + $(FSharpSourcesRoot)\fsharp\msft.pubkey + true + true + + + $(FSharpSourcesRoot)\fsharp\test.snk + false + STRONG_NAME_FSHARP_COMPILER_WITH_TEST_KEY;$(DefineConstants) + + + + + false + true + + + + + portable + fs + false + true + + + + + $(ProtoOutputPath)\Microsoft.FSharp.Targets + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets + $(ProtoOutputPath)\Microsoft.FSharp.Overrides.NetSdk.targets + + + diff --git a/FSharpBuild.Directory.Build.targets b/FSharpBuild.Directory.Build.targets new file mode 100644 index 0000000000..fa39d7498f --- /dev/null +++ b/FSharpBuild.Directory.Build.targets @@ -0,0 +1,42 @@ + + + + + + en;$(XlfLanguages) + + + + + $(AssetTargetFallback);net462 + + + + $(CompileDependsOn);CopyAndSubstituteTextFiles + + + + + <_ReplacementText>$([System.IO.File]::ReadAllText('%(CopyAndSubstituteText.FullPath)')) + <_ReplacementText Condition="'%(CopyAndSubstituteText.Pattern1)' != ''">$(_ReplacementText.Replace('%(CopyAndSubstituteText.Pattern1)', '%(CopyAndSubstituteText.Replacement1)')) + <_ReplacementText Condition="'%(CopyAndSubstituteText.Pattern2)' != ''">$(_ReplacementText.Replace('%(CopyAndSubstituteText.Pattern2)', '%(CopyAndSubstituteText.Replacement2)')) + + + + + + + + + + + + + + diff --git a/NuGet.Config b/NuGet.Config index f4c19635b0..8f21de1b15 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,13 +1,15 @@ - - - + + - + + - - \ No newline at end of file + + + + diff --git a/PublishToBlob.proj b/PublishToBlob.proj index 00bcee6335..21e8ec6eb6 100644 --- a/PublishToBlob.proj +++ b/PublishToBlob.proj @@ -10,26 +10,33 @@ Microsoft.DotNet.Build.Tasks.Feed - 2.1.0-prerelease-02419-02 + 2.2.0-beta.19066.1 - - + + + + $(MSBuildThisFileDirectory)artifacts\log\$(Configuration)\ + AnyCPU + $(Platform) + $(ArtifactsLogDir)AssetManifest\$(OS)-$(PlatformName).xml + + + AssetManifestPath="$(AssetManifestFilePath)" /> diff --git a/RoslynPackageVersion.txt b/RoslynPackageVersion.txt new file mode 100644 index 0000000000..593eafec19 --- /dev/null +++ b/RoslynPackageVersion.txt @@ -0,0 +1 @@ +2.9.0-beta8-63208-01 diff --git a/benchmarks/Benchmarks.sln b/benchmarks/Benchmarks.sln new file mode 100644 index 0000000000..5d339f7a99 --- /dev/null +++ b/benchmarks/Benchmarks.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.136 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "CompilerServiceBenchmarks", "CompilerServiceBenchmarks\CompilerServiceBenchmarks.fsproj", "{9A3C565C-B514-4AE0-8B01-CA80E8453EB0}" +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Core", "..\src\fsharp\FSharp.Core\FSharp.Core.fsproj", "{BB9EAE76-194A-49D8-9618-586CBE7031D9}" +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Private", "..\src\fsharp\FSharp.Compiler.Private\FSharp.Compiler.Private.fsproj", "{F57B02B1-CF26-4D93-9211-8CEB4F1572F0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Release|Any CPU.Build.0 = Release|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Release|Any CPU.Build.0 = Release|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {049A4D02-709F-418C-AD59-7FB0DBE956B1} + EndGlobalSection +EndGlobal diff --git a/benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj b/benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj new file mode 100644 index 0000000000..fcdd08995e --- /dev/null +++ b/benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj @@ -0,0 +1,21 @@ + + + + Exe + net472 + + + + + + + + + + + + + + + + diff --git a/benchmarks/CompilerServiceBenchmarks/Program.fs b/benchmarks/CompilerServiceBenchmarks/Program.fs new file mode 100644 index 0000000000..d5e4527577 --- /dev/null +++ b/benchmarks/CompilerServiceBenchmarks/Program.fs @@ -0,0 +1,60 @@ +open System +open System.IO +open BenchmarkDotNet.Attributes +open BenchmarkDotNet.Running +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.SourceCodeServices +open System.Text + +[] +type CompilerServiceParsing() = + + let mutable checkerOpt = None + + let mutable sourceOpt = None + + let parsingOptions = + { + SourceFiles = [|"TypeChecker.fs"|] + ConditionalCompilationDefines = [] + ErrorSeverityOptions = FSharpErrorSeverityOptions.Default + IsInteractive = false + LightSyntax = None + CompilingFsLib = false + IsExe = false + } + + [] + member __.Setup() = + match checkerOpt with + | None -> checkerOpt <- Some(FSharpChecker.Create()) + | _ -> () + + match sourceOpt with + | None -> + let source = File.ReadAllText("""..\..\..\..\..\src\fsharp\TypeChecker.fs""") + sourceOpt <- Some(source) + | _ -> () + + [] + member __.ParsingSetup() = + match checkerOpt with + | None -> failwith "no checker" + | Some(checker) -> + checker.InvalidateAll() + checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() + checker.ParseFile("dummy.fs", "dummy", parsingOptions) |> Async.RunSynchronously |> ignore + + [] + member __.Parsing() = + match checkerOpt, sourceOpt with + | None, _ -> failwith "no checker" + | _, None -> failwith "no source" + | Some(checker), Some(source) -> + let results = checker.ParseFile("TypeChecker.fs", source, parsingOptions) |> Async.RunSynchronously + if results.ParseHadErrors then failwithf "parse had errors: %A" results.Errors + +[] +let main argv = + let _ = BenchmarkRunner.Run() + 0 diff --git a/build/projects/Directory.Build.props b/build/projects/Directory.Build.props new file mode 100644 index 0000000000..bb8eac309b --- /dev/null +++ b/build/projects/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/build/projects/Directory.Build.targets b/build/projects/Directory.Build.targets new file mode 100644 index 0000000000..ccd47cc0a9 --- /dev/null +++ b/build/projects/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/build/projects/Signing.proj b/build/projects/Signing.proj new file mode 100644 index 0000000000..9e981e135e --- /dev/null +++ b/build/projects/Signing.proj @@ -0,0 +1,27 @@ + + + + + net46 + $(NuGetPackageRoot)RoslynTools.SignTool\$(RoslynToolsSignToolPackageVersion)\tools\SignTool.exe + -msbuildPath "$(MSBuildBinPath)\msbuild.exe" -nugetPackagesPath "$(NuGetPackageRoot.TrimEnd('\'))" -config "$(ConfigFile)" + -testSign $(SignToolArgs) + -test $(SignToolArgs) + + + + + + + + + + + + + + + + + diff --git a/build/targets/AssemblyVersions.props b/build/targets/AssemblyVersions.props new file mode 100644 index 0000000000..b17f940a93 --- /dev/null +++ b/build/targets/AssemblyVersions.props @@ -0,0 +1,60 @@ + + + + + $([System.DateTime]::Now.ToString(yyyyMMdd.0)) + + $(BUILD_BUILDNUMBER.Replace(".DRAFT", "")) + + + <_Build_Year>$(BUILD_BUILDNUMBER.Substring(0, 4)) + <_Build_Month>$(BUILD_BUILDNUMBER.Substring(4, 2)) + <_Build_Day>$(BUILD_BUILDNUMBER.Substring(6, 2)) + <_Build_Number>$(BUILD_BUILDNUMBER.Substring(9)) + $(_Build_Year).$(_Build_Month).$(_Build_Day).$(_Build_Number) + + 4.5 + $(FSCoreMajorVersion).5 + $(FSCoreMajorVersion).0.0 + + 10.2 + $(FSPackageMajorVersion).3 + $(FSPackageVersion).0 + + 15 + 9 + $(VSMajorVersion).0 + $(VSMajorVersion).$(VSMinorVersion).0.0 + + + $(BUILD_BUILDNUMBER.Split('.')[0].Substring(2)) + $(BUILD_BUILDNUMBER.Split('.')[1].PadLeft(2, '0')) + $(BuildTimeStamp_Date)$(BuildTimeStamp_Number) + $(VSAssemblyVersion.Split('.')[0]).$(VSAssemblyVersion.Split('.')[1]).$(BUILD_BUILDNUMBER) + 42.42.42.42 + $(BuildTimeStamp_Date)-$(BuildTimeStamp_Number) + + + + + + diff --git a/build/targets/CommonPackages.targets b/build/targets/CommonPackages.targets new file mode 100644 index 0000000000..fad7b97612 --- /dev/null +++ b/build/targets/CommonPackages.targets @@ -0,0 +1,7 @@ + + + + + + + diff --git a/build/targets/ConvertPortablePdbs.targets b/build/targets/ConvertPortablePdbs.targets new file mode 100644 index 0000000000..c43042a499 --- /dev/null +++ b/build/targets/ConvertPortablePdbs.targets @@ -0,0 +1,38 @@ + + + + + + + + + $(NuGetPackageRoot)Pdb2Pdb\$(Pdb2PdbPackageVersion)\tools\Pdb2Pdb.exe + "$(TargetPath)" /out "$(SymStoreDirectory)\$(TargetName).pdb" /srcsvrvar SRC_INDEX=public + + + + + + + + + $(TargetDir)\$(TargetName).pdb + + + + + + + diff --git a/build/targets/GenerateAssemblyAttributes.targets b/build/targets/GenerateAssemblyAttributes.targets new file mode 100644 index 0000000000..7b747c9dd9 --- /dev/null +++ b/build/targets/GenerateAssemblyAttributes.targets @@ -0,0 +1,119 @@ + + + + + false + + + + + $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyLevelAttributes$(DefaultLanguageSourceExtension) + + + $(NoWarn);2003 + + + + + + + + + + + + + + + + $(FSCoreVersion) + + + $(FSProductVersion) + + + $(VSAssemblyVersion) + + $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyVersion$(DefaultLanguageSourceExtension) + + + + <_UseWriteCodeFragmentHack Condition="'$(OS)' == 'Unix' and '$(Language)' == 'F#'">true + + + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyCompanyAttribute"> + <_Parameter1>Microsoft Corporation + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyCopyrightAttribute"> + <_Parameter1>© Microsoft Corporation. All Rights Reserved. + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyDescriptionAttribute"> + <_Parameter1>$(AssemblyName) + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyFileVersionAttribute"> + <_Parameter1>$(Build_FileVersion) + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyInformationalVersionAttribute"> + <_Parameter1>$(MicroBuildAssemblyVersion). Commit Hash: $(GitHeadSha). + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyProductAttribute"> + <_Parameter1>Microsoft® F# + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyTitleAttribute"> + <_Parameter1>$(AssemblyName) + + <_AssemblyVersionAttributes Include="System.Reflection.AssemblyVersionAttribute"> + <_Parameter1>$(MicroBuildAssemblyVersion) + + + + + + + + + + + + + + + + + <_LinesToWrite Include="// <auto-generated>" /> + <_LinesToWrite Include="namespace FSharp" /> + <_LinesToWrite Include="open System" /> + <_LinesToWrite Include="open System.Reflection" /> + <_LinesToWrite Include="[<assembly: %(_AssemblyVersionAttributes.Identity)("%(_AssemblyVersionAttributes._Parameter1)")>]" /> + <_LinesToWrite Include="do()" /> + + + + + + + + + + + diff --git a/build/targets/GenerateInternalsVisibleTo.targets b/build/targets/GenerateInternalsVisibleTo.targets new file mode 100644 index 0000000000..4950837d36 --- /dev/null +++ b/build/targets/GenerateInternalsVisibleTo.targets @@ -0,0 +1,80 @@ + + + + $(IntermediateOutputPath)$(MSBuildProjectName).InternalsVisibleTo$(DefaultLanguageSourceExtension) + + + + + false + + + + + + <_PublicKey>002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293 + + + <_PublicKey>002400000480000094000000060200000024000052534131000400000100010077d32e043d184cf8cebf177201ec6fad091581a3a639a0534f1c4ebb3ab847a6b6636990224a04cf4bd1aec51ecec44cf0c8922eb5bb2ee65ec3fb9baa87e141042c96ce414f98af33508c7e24dab5b068aa802f6693881537ee0efcb5d3f1c9aaf8215ac42e92ba9a5a02574d6890d07464cb2f338b043b1c4ffe98efe069ee + + + <_InternalsVisibleToAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute"> + <_Parameter1 Condition="'%(InternalsVisibleTo.Key)' != ''">%(InternalsVisibleTo.Identity), PublicKey=%(InternalsVisibleTo.Key) + <_Parameter1 Condition="'%(InternalsVisibleTo.Key)' == ''">%(InternalsVisibleTo.Identity), PublicKey=$(_PublicKey) + + + + + + + + + <_UseWriteCodeFragmentHack Condition="'$(OS)' == 'Unix' and '$(Language)' == 'F#'">true + + + + + + + + + + + + + <_LinesToWrite Include="// <auto-generated>" /> + <_LinesToWrite Include="namespace FSharp" /> + <_LinesToWrite Include="open System" /> + <_LinesToWrite Include="open System.Reflection" /> + <_LinesToWrite Include="[<assembly: %(_InternalsVisibleToAttribute.Identity)("%(_InternalsVisibleToAttribute._Parameter1)")>]" /> + <_LinesToWrite Include="do()" /> + + + + + + + + + diff --git a/build/targets/GitHash.props b/build/targets/GitHash.props new file mode 100644 index 0000000000..30f2d03b91 --- /dev/null +++ b/build/targets/GitHash.props @@ -0,0 +1,51 @@ + + + + + + + + + + $(MSBuildThisFileDirectory)..\..\ + + + + + + $(BUILD_SOURCEVERSION) + + + + + + $(GIT_COMMIT) + + + + + + <developer build> + + + + + + + <_DotGitDir>$(RepoRoot).git + <_HeadFileContent Condition="Exists('$(_DotGitDir)/HEAD')">$([System.IO.File]::ReadAllText('$(_DotGitDir)/HEAD').Trim()) + <_RefPath Condition="$(_HeadFileContent.StartsWith('ref: '))">$(_DotGitDir)/$(_HeadFileContent.Substring(5)) + $([System.IO.File]::ReadAllText('$(_RefPath)').Trim()) + $(_HeadFileContent) + + + + + diff --git a/build/targets/NGenOrCrossGen.targets b/build/targets/NGenOrCrossGen.targets new file mode 100644 index 0000000000..33dcaa3a63 --- /dev/null +++ b/build/targets/NGenOrCrossGen.targets @@ -0,0 +1,36 @@ + + + + + $(windir)\Microsoft.NET\Framework64\v4.0.30319\ngen.exe + $(windir)\Microsoft.NET\Framework\v4.0.30319\ngen.exe + + + + + + + + + + + + + + + + true + false + + + + diff --git a/build/targets/PackageVersions.props b/build/targets/PackageVersions.props new file mode 100644 index 0000000000..42a2305f6f --- /dev/null +++ b/build/targets/PackageVersions.props @@ -0,0 +1,144 @@ + + + + + + + $(RestoreSources); + https://www.myget.org/F/fsharp-daily/api/v3/index.json; + https://dotnet.myget.org/F/roslyn-master-nightly/api/v3/index.json; + https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; + https://dotnet.myget.org/F/dotnet-buildtools/api/v3/index.json; + https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json; + https://api.nuget.org/v3/index.json; + https://dotnet.myget.org/F/roslyn/api/v3/index.json; + https://dotnet.myget.org/F/symreader-converter/api/v3/index.json; + + + + $(PB_RestoreSource);$(RestoreSources) + $(MSBuildThisFileDirectory)..\..\artifacts\dependencyUptake\PackageVersions.props + + + $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\..\RoslynPackageVersion.txt').Trim()) + + + 1.5.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.5.0 + 4.3.0 + 4.3.0 + 4.3.0 + 1.6.0 + 4.3.0 + 1.5.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.4.0 + + + $(RoslynPackageVersion) + $(RoslynPackageVersion) + $(RoslynPackageVersion) + $(RoslynPackageVersion) + $(RoslynPackageVersion) + + + 15.8.166 + $(MicrosoftBuildOverallPackagesVersion) + $(MicrosoftBuildOverallPackagesVersion) + $(MicrosoftBuildOverallPackagesVersion) + $(MicrosoftBuildOverallPackagesVersion) + + + 8.0.1 + 14.0.25420 + 15.6.27740 + 15.0.26201-alpha + 1.1.4322 + 15.0.26201 + 15.0.26201 + 15.6.27740 + 15.6.27740 + 15.6.27740 + 8.0.50727 + 7.10.6071 + 15.0.26201 + 8.0.50727 + 2.3.6152103 + 14.3.25407 + 15.0.26201 + 15.0.26201 + 15.0.26201 + 10.0.30319 + 11.0.50727 + 15.0.25123-Dev15Preview + 7.10.6072 + 8.0.50727 + 9.0.30729 + 10.0.30319 + 11.0.61030 + 12.0.30110 + 15.6.27740 + 7.10.6071 + 8.0.50727 + 10.0.30319 + 12.0.30112 + 15.6.27740 + 15.6.27740 + 15.3.23 + 15.0.26201 + 15.3.15 + 9.0.30729 + 15.6.170 + 12.0.4 + 7.0.4 + 8.0.4 + 11.0.4 + 7.0.4 + + + 0.2.0 + 1.0.0 + 1.0.147 + 10.1.0 + 1.0.0 + + + 3.0.0-alpha3 + 1.0.30 + 1.1.0-beta1-63314-01 + 8.0.0-alpha + 2.7.0 + 2.0.3 + 15.8.0 + 1.0.0 + 4.3.0 + 9.0.1 + 3.10.1 + 3.10.0 + 3.10.1 + 1.0.0-beta2-dev3 + 5.22.2.1 + 0.2.0-beta-000081 + + + + + + + diff --git a/eng/common/CIBuild.cmd b/eng/common/CIBuild.cmd new file mode 100644 index 0000000000..56c2f25ac2 --- /dev/null +++ b/eng/common/CIBuild.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0Build.ps1""" -restore -build -test -sign -pack -publish -ci %*" \ No newline at end of file diff --git a/eng/common/PublishBuildAssets.cmd b/eng/common/PublishBuildAssets.cmd new file mode 100644 index 0000000000..3c6e4ff829 --- /dev/null +++ b/eng/common/PublishBuildAssets.cmd @@ -0,0 +1,3 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0sdk-task.ps1""" -msbuildEngine dotnet -restore -projects PublishBuildAssets.proj -ci %*" +exit /b %ErrorLevel% diff --git a/eng/common/PublishToPackageFeed.proj b/eng/common/PublishToPackageFeed.proj new file mode 100644 index 0000000000..7dc478d981 --- /dev/null +++ b/eng/common/PublishToPackageFeed.proj @@ -0,0 +1,37 @@ + + + + netcoreapp2.1 + + + + + + + + + + + + + + + + + + diff --git a/eng/common/README.md b/eng/common/README.md new file mode 100644 index 0000000000..ff49c37152 --- /dev/null +++ b/eng/common/README.md @@ -0,0 +1,28 @@ +# Don't touch this folder + + uuuuuuuuuuuuuuuuuuuu + u" uuuuuuuuuuuuuuuuuu "u + u" u$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + $ $$$" ... "$... ...$" ... "$$$ ... "$$$ $ + $ $$$u `"$$$$$$$ $$$ $$$$$ $$ $$$ $$$ $ + $ $$$$$$uu "$$$$ $$$ $$$$$ $$ """ u$$$ $ + $ $$$""$$$ $$$$ $$$u "$$$" u$$ $$$$$$$$ $ + $ $$$$....,$$$$$..$$$$$....,$$$$..$$$$$$$$ $ + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$" u" + "u """""""""""""""""" u" + """""""""""""""""""" + +!!! Changes made in this directory are subject to being overwritten by automation !!! + +The files in this directory are shared by all Arcade repos and managed by automation. If you need to make changes to these files, open an issue or submit a pull request to https://github.com/dotnet/arcade first. diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 new file mode 100644 index 0000000000..8279dc7133 --- /dev/null +++ b/eng/common/build.ps1 @@ -0,0 +1,133 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string][Alias('c')]$configuration = "Debug", + [string] $projects, + [string][Alias('v')]$verbosity = "minimal", + [string] $msbuildEngine = $null, + [bool] $warnAsError = $true, + [bool] $nodeReuse = $true, + [switch][Alias('r')]$restore, + [switch] $deployDeps, + [switch][Alias('b')]$build, + [switch] $rebuild, + [switch] $deploy, + [switch] $test, + [switch] $integrationTest, + [switch] $performanceTest, + [switch] $sign, + [switch] $pack, + [switch] $publish, + [switch][Alias('bl')]$binaryLog, + [switch] $ci, + [switch] $prepareMachine, + [switch] $help, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties +) + +. $PSScriptRoot\tools.ps1 + +function Print-Usage() { + Write-Host "Common settings:" + Write-Host " -configuration Build configuration: 'Debug' or 'Release' (short: -c)" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + Write-Host " -binaryLog Output binary log (short: -bl)" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Actions:" + Write-Host " -restore Restore dependencies (short: -r)" + Write-Host " -build Build solution (short: -b)" + Write-Host " -rebuild Rebuild solution" + Write-Host " -deploy Deploy built VSIXes" + Write-Host " -deployDeps Deploy dependencies (e.g. VSIXes for integration tests)" + Write-Host " -test Run all unit tests in the solution" + Write-Host " -pack Package build outputs into NuGet packages and Willow components" + Write-Host " -integrationTest Run all integration tests in the solution" + Write-Host " -performanceTest Run all performance tests in the solution" + Write-Host " -sign Sign build outputs" + Write-Host " -publish Publish artifacts (e.g. symbols)" + Write-Host "" + + Write-Host "Advanced settings:" + Write-Host " -projects Semi-colon delimited list of sln/proj's to build. Globbing is supported (*.sln)" + Write-Host " -ci Set when running on CI server" + Write-Host " -prepareMachine Prepare machine for CI run" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host "" + Write-Host "Command line arguments not listed above are passed thru to msbuild." + Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)." +} + +function InitializeCustomToolset { + if (-not $restore) { + return + } + + $script = Join-Path $EngRoot "restore-toolset.ps1" + + if (Test-Path $script) { + . $script + } +} + +function Build { + $toolsetBuildProj = InitializeToolset + InitializeCustomToolset + + $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "Build.binlog") } else { "" } + + if ($projects) { + # Re-assign properties to a new variable because PowerShell doesn't let us append properties directly for unclear reasons. + # Explicitly set the type as string[] because otherwise PowerShell would make this char[] if $properties is empty. + [string[]] $msbuildArgs = $properties + $msbuildArgs += "/p:Projects=$projects" + $properties = $msbuildArgs + } + + MSBuild $toolsetBuildProj ` + $bl ` + /p:Configuration=$configuration ` + /p:RepoRoot=$RepoRoot ` + /p:Restore=$restore ` + /p:DeployDeps=$deployDeps ` + /p:Build=$build ` + /p:Rebuild=$rebuild ` + /p:Deploy=$deploy ` + /p:Test=$test ` + /p:Pack=$pack ` + /p:IntegrationTest=$integrationTest ` + /p:PerformanceTest=$performanceTest ` + /p:Sign=$sign ` + /p:Publish=$publish ` + /p:ContinuousIntegrationBuild=$ci ` + @properties +} + +try { + if ($help -or (($properties -ne $null) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { + Print-Usage + exit 0 + } + + if ($ci) { + $binaryLog = $true + $nodeReuse = $false + } + + # Import custom tools configuration, if present in the repo. + # Note: Import in global scope so that the script set top-level variables without qualification. + $configureToolsetScript = Join-Path $EngRoot "configure-toolset.ps1" + if (Test-Path $configureToolsetScript) { + . $configureToolsetScript + } + + Build +} +catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} + +ExitWithExitCode 0 diff --git a/eng/common/build.sh b/eng/common/build.sh new file mode 100755 index 0000000000..4fe8b41ed7 --- /dev/null +++ b/eng/common/build.sh @@ -0,0 +1,213 @@ +#!/usr/bin/env bash + +# Stop script if unbound variable found (use ${var:-} if intentional) +set -u + +# Stop script if command returns non-zero exit code. +# Prevents hidden errors caused by missing error code propagation. +set -e + +usage() +{ + echo "Common settings:" + echo " --configuration Build configuration: 'Debug' or 'Release' (short: --c)" + echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + echo " --binaryLog Create MSBuild binary log (short: -bl)" + echo "" + echo "Actions:" + echo " --restore Restore dependencies (short: -r)" + echo " --build Build all projects (short: -b)" + echo " --rebuild Rebuild all projects" + echo " --test Run all unit tests (short: -t)" + echo " --sign Sign build outputs" + echo " --publish Publish artifacts (e.g. symbols)" + echo " --pack Package build outputs into NuGet packages and Willow components" + echo " --help Print help and exit (short: -h)" + echo "" + echo "Advanced settings:" + echo " --projects Project or solution file(s) to build" + echo " --ci Set when running on CI server" + echo " --prepareMachine Prepare machine for CI run, clean up processes after build" + echo " --nodeReuse Sets nodereuse msbuild parameter ('true' or 'false')" + echo " --warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" + echo "" + echo "Command line arguments starting with '/p:' are passed through to MSBuild." +} + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +restore=false +build=false +rebuild=false +test=false +pack=false +publish=false +integration_test=false +performance_test=false +sign=false +public=false +ci=false + +warn_as_error=true +node_reuse=true +binary_log=false + +projects='' +configuration='Debug' +prepare_machine=false +verbosity='minimal' +properties='' + +while [[ $# > 0 ]]; do + opt="$(echo "$1" | awk '{print tolower($0)}')" + case "$opt" in + --help|-h) + usage + exit 0 + ;; + --configuration|-c) + configuration=$2 + shift + ;; + --verbosity|-v) + verbosity=$2 + shift + ;; + --binarylog|-bl) + binary_log=true + ;; + --restore|-r) + restore=true + ;; + --build|-b) + build=true + ;; + --rebuild) + rebuild=true + ;; + --pack) + pack=true + ;; + --test|-t) + test=true + ;; + --integrationtest) + integration_test=true + ;; + --performancetest) + performance_test=true + ;; + --sign) + sign=true + ;; + --publish) + publish=true + ;; + --preparemachine) + prepare_machine=true + ;; + --projects) + projects=$2 + shift + ;; + --ci) + ci=true + ;; + --warnaserror) + warn_as_error=$2 + shift + ;; + --nodereuse) + node_reuse=$2 + shift + ;; + /p:*) + properties="$properties $1" + ;; + /m:*) + properties="$properties $1" + ;; + /bl:*) + properties="$properties $1" + ;; + *) + echo "Invalid argument: $1" + usage + exit 1 + ;; + esac + + shift +done + +if [[ "$ci" == true ]]; then + binary_log=true + node_reuse=false +fi + +. "$scriptroot/tools.sh" + +function InitializeCustomToolset { + local script="$eng_root/restore-toolset.sh" + + if [[ -a "$script" ]]; then + . "$script" + fi +} + +function Build { + InitializeToolset + InitializeCustomToolset + + if [[ ! -z "$projects" ]]; then + properties="$properties /p:Projects=$projects" + fi + + local bl="" + if [[ "$binary_log" == true ]]; then + bl="/bl:\"$log_dir/Build.binlog\"" + fi + + MSBuild $_InitializeToolset \ + $bl \ + /p:Configuration=$configuration \ + /p:RepoRoot="$repo_root" \ + /p:Restore=$restore \ + /p:Build=$build \ + /p:Rebuild=$rebuild \ + /p:Test=$test \ + /p:Pack=$pack \ + /p:IntegrationTest=$integration_test \ + /p:PerformanceTest=$performance_test \ + /p:Sign=$sign \ + /p:Publish=$publish \ + /p:ContinuousIntegrationBuild=$ci \ + $properties + + ExitWithExitCode 0 +} + +# Import custom tools configuration, if present in the repo. +configure_toolset_script="$eng_root/configure-toolset.sh" +if [[ -a "$configure_toolset_script" ]]; then + . "$configure_toolset_script" +fi + +# TODO: https://github.com/dotnet/arcade/issues/1468 +# Temporary workaround to avoid breaking change. +# Remove once repos are updated. +if [[ -n "${useInstalledDotNetCli:-}" ]]; then + use_installed_dotnet_cli="$useInstalledDotNetCli" +fi + +Build diff --git a/eng/common/cibuild.sh b/eng/common/cibuild.sh new file mode 100755 index 0000000000..1a02c0dec8 --- /dev/null +++ b/eng/common/cibuild.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where + # the symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. "$scriptroot/build.sh" --restore --build --test --pack --publish --ci $@ \ No newline at end of file diff --git a/eng/common/cross/android/arm/toolchain.cmake b/eng/common/cross/android/arm/toolchain.cmake new file mode 100644 index 0000000000..a7e1c73501 --- /dev/null +++ b/eng/common/cross/android/arm/toolchain.cmake @@ -0,0 +1,41 @@ +set(CROSS_NDK_TOOLCHAIN $ENV{ROOTFS_DIR}/../) +set(CROSS_ROOTFS ${CROSS_NDK_TOOLCHAIN}/sysroot) +set(CLR_CMAKE_PLATFORM_ANDROID "Android") + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR arm) + +## Specify the toolchain +set(TOOLCHAIN "arm-linux-androideabi") +set(CMAKE_PREFIX_PATH ${CROSS_NDK_TOOLCHAIN}) +set(TOOLCHAIN_PREFIX ${TOOLCHAIN}-) + +find_program(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) +find_program(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_LD ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) +find_program(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) + +add_compile_options(--sysroot=${CROSS_ROOTFS}) +add_compile_options(-fPIE) +add_compile_options(-mfloat-abi=soft) +include_directories(SYSTEM ${CROSS_NDK_TOOLCHAIN}/include/c++/4.9.x/) +include_directories(SYSTEM ${CROSS_NDK_TOOLCHAIN}/include/c++/4.9.x/arm-linux-androideabi/) + +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B ${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -fPIE -pie") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) + +set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/android/arm64/toolchain.cmake b/eng/common/cross/android/arm64/toolchain.cmake new file mode 100644 index 0000000000..29415899c1 --- /dev/null +++ b/eng/common/cross/android/arm64/toolchain.cmake @@ -0,0 +1,42 @@ +set(CROSS_NDK_TOOLCHAIN $ENV{ROOTFS_DIR}/../) +set(CROSS_ROOTFS ${CROSS_NDK_TOOLCHAIN}/sysroot) +set(CLR_CMAKE_PLATFORM_ANDROID "Android") + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +## Specify the toolchain +set(TOOLCHAIN "aarch64-linux-android") +set(CMAKE_PREFIX_PATH ${CROSS_NDK_TOOLCHAIN}) +set(TOOLCHAIN_PREFIX ${TOOLCHAIN}-) + +find_program(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) +find_program(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_LD ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) +find_program(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) + +add_compile_options(--sysroot=${CROSS_ROOTFS}) +add_compile_options(-fPIE) + +## Needed for Android or bionic specific conditionals +add_compile_options(-D__ANDROID__) +add_compile_options(-D__BIONIC__) + +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B ${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -fPIE -pie") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) + +set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/arm/sources.list.bionic b/eng/common/cross/arm/sources.list.bionic new file mode 100644 index 0000000000..2109557409 --- /dev/null +++ b/eng/common/cross/arm/sources.list.bionic @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse diff --git a/eng/common/cross/arm/sources.list.jessie b/eng/common/cross/arm/sources.list.jessie new file mode 100644 index 0000000000..4d142ac9b1 --- /dev/null +++ b/eng/common/cross/arm/sources.list.jessie @@ -0,0 +1,3 @@ +# Debian (sid) # UNSTABLE +deb http://ftp.debian.org/debian/ sid main contrib non-free +deb-src http://ftp.debian.org/debian/ sid main contrib non-free diff --git a/eng/common/cross/arm/sources.list.trusty b/eng/common/cross/arm/sources.list.trusty new file mode 100644 index 0000000000..07d8f88d82 --- /dev/null +++ b/eng/common/cross/arm/sources.list.trusty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.vivid b/eng/common/cross/arm/sources.list.vivid new file mode 100644 index 0000000000..0b1215e475 --- /dev/null +++ b/eng/common/cross/arm/sources.list.vivid @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.wily b/eng/common/cross/arm/sources.list.wily new file mode 100644 index 0000000000..e23d1e02a0 --- /dev/null +++ b/eng/common/cross/arm/sources.list.wily @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.xenial b/eng/common/cross/arm/sources.list.xenial new file mode 100644 index 0000000000..eacd86b7df --- /dev/null +++ b/eng/common/cross/arm/sources.list.xenial @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.zesty b/eng/common/cross/arm/sources.list.zesty new file mode 100644 index 0000000000..ea2c14a787 --- /dev/null +++ b/eng/common/cross/arm/sources.list.zesty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse diff --git a/eng/common/cross/arm/trusty-lttng-2.4.patch b/eng/common/cross/arm/trusty-lttng-2.4.patch new file mode 100644 index 0000000000..8e4dd7ae71 --- /dev/null +++ b/eng/common/cross/arm/trusty-lttng-2.4.patch @@ -0,0 +1,71 @@ +From e72c9d7ead60e3317bd6d1fade995c07021c947b Mon Sep 17 00:00:00 2001 +From: Mathieu Desnoyers +Date: Thu, 7 May 2015 13:25:04 -0400 +Subject: [PATCH] Fix: building probe providers with C++ compiler + +Robert Daniels wrote: +> > I'm attempting to use lttng userspace tracing with a C++ application +> > on an ARM platform. I'm using GCC 4.8.4 on Linux 3.14 with the 2.6 +> > release of lttng. I've compiled lttng-modules, lttng-ust, and +> > lttng-tools and have been able to get a simple test working with C +> > code. When I attempt to run the hello.cxx test on my target it will +> > segfault. +> +> +> I spent a little time digging into this issue and finally discovered the +> cause of my segfault with ARM C++ tracepoints. +> +> There is a struct called 'lttng_event' in ust-events.h which contains an +> empty union 'u'. This was the cause of my issue. Under C, this empty union +> compiles to a zero byte member while under C++ it compiles to a one byte +> member, and in my case was four-byte aligned which caused my C++ code to +> have the 'cds_list_head node' offset incorrectly by four bytes. This lead +> to an incorrect linked list structure which caused my issue. +> +> Since this union is empty, I simply removed it from the struct and everything +> worked correctly. +> +> I don't know the history or purpose behind this empty union so I'd like to +> know if this is a safe fix. If it is I can submit a patch with the union +> removed. + +That's a very nice catch! + +We do not support building tracepoint probe provider with +g++ yet, as stated in lttng-ust(3): + +"- Note for C++ support: although an application instrumented with + tracepoints can be compiled with g++, tracepoint probes should be + compiled with gcc (only tested with gcc so far)." + +However, if it works fine with this fix, then I'm tempted to take it, +especially because removing the empty union does not appear to affect +the layout of struct lttng_event as seen from liblttng-ust, which must +be compiled with a C compiler, and from probe providers compiled with +a C compiler. So all we are changing is the layout of a probe provider +compiled with a C++ compiler, which is anyway buggy at the moment, +because it is not compatible with the layout expected by liblttng-ust +compiled with a C compiler. + +Reported-by: Robert Daniels +Signed-off-by: Mathieu Desnoyers +--- + include/lttng/ust-events.h | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/usr/include/lttng/ust-events.h b/usr/include/lttng/ust-events.h +index 328a875..3d7a274 100644 +--- a/usr/include/lttng/ust-events.h ++++ b/usr/include/lttng/ust-events.h +@@ -407,8 +407,6 @@ struct lttng_event { + void *_deprecated1; + struct lttng_ctx *ctx; + enum lttng_ust_instrumentation instrumentation; +- union { +- } u; + struct cds_list_head node; /* Event list in session */ + struct cds_list_head _deprecated2; + void *_deprecated3; +-- +2.7.4 + diff --git a/eng/common/cross/arm/trusty.patch b/eng/common/cross/arm/trusty.patch new file mode 100644 index 0000000000..2f2972f8eb --- /dev/null +++ b/eng/common/cross/arm/trusty.patch @@ -0,0 +1,97 @@ +diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h +--- a/usr/include/urcu/uatomic/generic.h 2014-03-28 06:04:42.000000000 +0900 ++++ b/usr/include/urcu/uatomic/generic.h 2017-02-13 10:35:21.189927116 +0900 +@@ -65,17 +65,17 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- return __sync_val_compare_and_swap_1(addr, old, _new); ++ return __sync_val_compare_and_swap_1((uint8_t *) addr, old, _new); + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- return __sync_val_compare_and_swap_2(addr, old, _new); ++ return __sync_val_compare_and_swap_2((uint16_t *) addr, old, _new); + #endif + case 4: +- return __sync_val_compare_and_swap_4(addr, old, _new); ++ return __sync_val_compare_and_swap_4((uint32_t *) addr, old, _new); + #if (CAA_BITS_PER_LONG == 64) + case 8: +- return __sync_val_compare_and_swap_8(addr, old, _new); ++ return __sync_val_compare_and_swap_8((uint64_t *) addr, old, _new); + #endif + } + _uatomic_link_error(); +@@ -100,20 +100,20 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- __sync_and_and_fetch_1(addr, val); ++ __sync_and_and_fetch_1((uint8_t *) addr, val); + return; + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- __sync_and_and_fetch_2(addr, val); ++ __sync_and_and_fetch_2((uint16_t *) addr, val); + return; + #endif + case 4: +- __sync_and_and_fetch_4(addr, val); ++ __sync_and_and_fetch_4((uint32_t *) addr, val); + return; + #if (CAA_BITS_PER_LONG == 64) + case 8: +- __sync_and_and_fetch_8(addr, val); ++ __sync_and_and_fetch_8((uint64_t *) addr, val); + return; + #endif + } +@@ -139,20 +139,20 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- __sync_or_and_fetch_1(addr, val); ++ __sync_or_and_fetch_1((uint8_t *) addr, val); + return; + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- __sync_or_and_fetch_2(addr, val); ++ __sync_or_and_fetch_2((uint16_t *) addr, val); + return; + #endif + case 4: +- __sync_or_and_fetch_4(addr, val); ++ __sync_or_and_fetch_4((uint32_t *) addr, val); + return; + #if (CAA_BITS_PER_LONG == 64) + case 8: +- __sync_or_and_fetch_8(addr, val); ++ __sync_or_and_fetch_8((uint64_t *) addr, val); + return; + #endif + } +@@ -180,17 +180,17 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- return __sync_add_and_fetch_1(addr, val); ++ return __sync_add_and_fetch_1((uint8_t *) addr, val); + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- return __sync_add_and_fetch_2(addr, val); ++ return __sync_add_and_fetch_2((uint16_t *) addr, val); + #endif + case 4: +- return __sync_add_and_fetch_4(addr, val); ++ return __sync_add_and_fetch_4((uint32_t *) addr, val); + #if (CAA_BITS_PER_LONG == 64) + case 8: +- return __sync_add_and_fetch_8(addr, val); ++ return __sync_add_and_fetch_8((uint64_t *) addr, val); + #endif + } + _uatomic_link_error(); diff --git a/eng/common/cross/arm64/sources.list.bionic b/eng/common/cross/arm64/sources.list.bionic new file mode 100644 index 0000000000..2109557409 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.bionic @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse diff --git a/eng/common/cross/arm64/sources.list.trusty b/eng/common/cross/arm64/sources.list.trusty new file mode 100644 index 0000000000..07d8f88d82 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.trusty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.vivid b/eng/common/cross/arm64/sources.list.vivid new file mode 100644 index 0000000000..0b1215e475 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.vivid @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.wily b/eng/common/cross/arm64/sources.list.wily new file mode 100644 index 0000000000..e23d1e02a0 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.wily @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.xenial b/eng/common/cross/arm64/sources.list.xenial new file mode 100644 index 0000000000..eacd86b7df --- /dev/null +++ b/eng/common/cross/arm64/sources.list.xenial @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.zesty b/eng/common/cross/arm64/sources.list.zesty new file mode 100644 index 0000000000..ea2c14a787 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.zesty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse diff --git a/eng/common/cross/armel/sources.list.jessie b/eng/common/cross/armel/sources.list.jessie new file mode 100644 index 0000000000..3d9c3059d8 --- /dev/null +++ b/eng/common/cross/armel/sources.list.jessie @@ -0,0 +1,3 @@ +# Debian (jessie) # Stable +deb http://ftp.debian.org/debian/ jessie main contrib non-free +deb-src http://ftp.debian.org/debian/ jessie main contrib non-free diff --git a/eng/common/cross/armel/tizen-build-rootfs.sh b/eng/common/cross/armel/tizen-build-rootfs.sh new file mode 100755 index 0000000000..87c48e78fb --- /dev/null +++ b/eng/common/cross/armel/tizen-build-rootfs.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -e + +__ARM_SOFTFP_CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +__TIZEN_CROSSDIR="$__ARM_SOFTFP_CrossDir/tizen" + +if [[ -z "$ROOTFS_DIR" ]]; then + echo "ROOTFS_DIR is not defined." + exit 1; +fi + +# Clean-up (TODO-Cleanup: We may already delete $ROOTFS_DIR at ./cross/build-rootfs.sh.) +# hk0110 +if [ -d "$ROOTFS_DIR" ]; then + umount $ROOTFS_DIR/* + rm -rf $ROOTFS_DIR +fi + +TIZEN_TMP_DIR=$ROOTFS_DIR/tizen_tmp +mkdir -p $TIZEN_TMP_DIR + +# Download files +echo ">>Start downloading files" +VERBOSE=1 $__ARM_SOFTFP_CrossDir/tizen-fetch.sh $TIZEN_TMP_DIR +echo "<>Start constructing Tizen rootfs" +TIZEN_RPM_FILES=`ls $TIZEN_TMP_DIR/*.rpm` +cd $ROOTFS_DIR +for f in $TIZEN_RPM_FILES; do + rpm2cpio $f | cpio -idm --quiet +done +echo "<>Start configuring Tizen rootfs" +rm ./usr/lib/libunwind.so +ln -s libunwind.so.8 ./usr/lib/libunwind.so +ln -sfn asm-arm ./usr/include/asm +patch -p1 < $__TIZEN_CROSSDIR/tizen.patch +echo "</dev/null; then + VERBOSE=0 +fi + +Log() +{ + if [ $VERBOSE -ge $1 ]; then + echo ${@:2} + fi +} + +Inform() +{ + Log 1 -e "\x1B[0;34m$@\x1B[m" +} + +Debug() +{ + Log 2 -e "\x1B[0;32m$@\x1B[m" +} + +Error() +{ + >&2 Log 0 -e "\x1B[0;31m$@\x1B[m" +} + +Fetch() +{ + URL=$1 + FILE=$2 + PROGRESS=$3 + if [ $VERBOSE -ge 1 ] && [ $PROGRESS ]; then + CURL_OPT="--progress-bar" + else + CURL_OPT="--silent" + fi + curl $CURL_OPT $URL > $FILE +} + +hash curl 2> /dev/null || { Error "Require 'curl' Aborting."; exit 1; } +hash xmllint 2> /dev/null || { Error "Require 'xmllint' Aborting."; exit 1; } +hash sha256sum 2> /dev/null || { Error "Require 'sha256sum' Aborting."; exit 1; } + +TMPDIR=$1 +if [ ! -d $TMPDIR ]; then + TMPDIR=./tizen_tmp + Debug "Create temporary directory : $TMPDIR" + mkdir -p $TMPDIR +fi + +TIZEN_URL=http://download.tizen.org/releases/milestone/tizen +BUILD_XML=build.xml +REPOMD_XML=repomd.xml +PRIMARY_XML=primary.xml +TARGET_URL="http://__not_initialized" + +Xpath_get() +{ + XPATH_RESULT='' + XPATH=$1 + XML_FILE=$2 + RESULT=$(xmllint --xpath $XPATH $XML_FILE) + if [[ -z ${RESULT// } ]]; then + Error "Can not find target from $XML_FILE" + Debug "Xpath = $XPATH" + exit 1 + fi + XPATH_RESULT=$RESULT +} + +fetch_tizen_pkgs_init() +{ + TARGET=$1 + PROFILE=$2 + Debug "Initialize TARGET=$TARGET, PROFILE=$PROFILE" + + TMP_PKG_DIR=$TMPDIR/tizen_${PROFILE}_pkgs + if [ -d $TMP_PKG_DIR ]; then rm -rf $TMP_PKG_DIR; fi + mkdir -p $TMP_PKG_DIR + + PKG_URL=$TIZEN_URL/$PROFILE/latest + + BUILD_XML_URL=$PKG_URL/$BUILD_XML + TMP_BUILD=$TMP_PKG_DIR/$BUILD_XML + TMP_REPOMD=$TMP_PKG_DIR/$REPOMD_XML + TMP_PRIMARY=$TMP_PKG_DIR/$PRIMARY_XML + TMP_PRIMARYGZ=${TMP_PRIMARY}.gz + + Fetch $BUILD_XML_URL $TMP_BUILD + + Debug "fetch $BUILD_XML_URL to $TMP_BUILD" + + TARGET_XPATH="//build/buildtargets/buildtarget[@name=\"$TARGET\"]/repo[@type=\"binary\"]/text()" + Xpath_get $TARGET_XPATH $TMP_BUILD + TARGET_PATH=$XPATH_RESULT + TARGET_URL=$PKG_URL/$TARGET_PATH + + REPOMD_URL=$TARGET_URL/repodata/repomd.xml + PRIMARY_XPATH='string(//*[local-name()="data"][@type="primary"]/*[local-name()="location"]/@href)' + + Fetch $REPOMD_URL $TMP_REPOMD + + Debug "fetch $REPOMD_URL to $TMP_REPOMD" + + Xpath_get $PRIMARY_XPATH $TMP_REPOMD + PRIMARY_XML_PATH=$XPATH_RESULT + PRIMARY_URL=$TARGET_URL/$PRIMARY_XML_PATH + + Fetch $PRIMARY_URL $TMP_PRIMARYGZ + + Debug "fetch $PRIMARY_URL to $TMP_PRIMARYGZ" + + gunzip $TMP_PRIMARYGZ + + Debug "unzip $TMP_PRIMARYGZ to $TMP_PRIMARY" +} + +fetch_tizen_pkgs() +{ + ARCH=$1 + PACKAGE_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="location"]/@href)' + + PACKAGE_CHECKSUM_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="checksum"]/text())' + + for pkg in ${@:2} + do + Inform "Fetching... $pkg" + XPATH=${PACKAGE_XPATH_TPL/_PKG_/$pkg} + XPATH=${XPATH/_ARCH_/$ARCH} + Xpath_get $XPATH $TMP_PRIMARY + PKG_PATH=$XPATH_RESULT + + XPATH=${PACKAGE_CHECKSUM_XPATH_TPL/_PKG_/$pkg} + XPATH=${XPATH/_ARCH_/$ARCH} + Xpath_get $XPATH $TMP_PRIMARY + CHECKSUM=$XPATH_RESULT + + PKG_URL=$TARGET_URL/$PKG_PATH + PKG_FILE=$(basename $PKG_PATH) + PKG_PATH=$TMPDIR/$PKG_FILE + + Debug "Download $PKG_URL to $PKG_PATH" + Fetch $PKG_URL $PKG_PATH true + + echo "$CHECKSUM $PKG_PATH" | sha256sum -c - > /dev/null + if [ $? -ne 0 ]; then + Error "Fail to fetch $PKG_URL to $PKG_PATH" + Debug "Checksum = $CHECKSUM" + exit 1 + fi + done +} + +Inform "Initialize arm base" +fetch_tizen_pkgs_init standard base +Inform "fetch common packages" +fetch_tizen_pkgs armv7l gcc glibc glibc-devel libicu libicu-devel +fetch_tizen_pkgs noarch linux-glibc-devel +Inform "fetch coreclr packages" +fetch_tizen_pkgs armv7l lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel tizen-release lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu +Inform "fetch corefx packages" +fetch_tizen_pkgs armv7l libcom_err libcom_err-devel zlib zlib-devel libopenssl libopenssl-devel krb5 krb5-devel libcurl libcurl-devel + +Inform "Initialize standard unified" +fetch_tizen_pkgs_init standard unified +Inform "fetch corefx packages" +fetch_tizen_pkgs armv7l gssdp gssdp-devel + diff --git a/eng/common/cross/armel/tizen/tizen-dotnet.ks b/eng/common/cross/armel/tizen/tizen-dotnet.ks new file mode 100644 index 0000000000..506d455bd4 --- /dev/null +++ b/eng/common/cross/armel/tizen/tizen-dotnet.ks @@ -0,0 +1,50 @@ +lang en_US.UTF-8 +keyboard us +timezone --utc Asia/Seoul + +part / --fstype="ext4" --size=3500 --ondisk=mmcblk0 --label rootfs --fsoptions=defaults,noatime + +rootpw tizen +desktop --autologinuser=root +user --name root --groups audio,video --password 'tizen' + +repo --name=standard --baseurl=http://download.tizen.org/releases/milestone/tizen/unified/latest/repos/standard/packages/ --ssl_verify=no +repo --name=base --baseurl=http://download.tizen.org/releases/milestone/tizen/base/latest/repos/standard/packages/ --ssl_verify=no + +%packages +tar +gzip + +sed +grep +gawk +perl + +binutils +findutils +util-linux +lttng-ust +userspace-rcu +procps-ng +tzdata +ca-certificates + + +### Core FX +libicu +libunwind +iputils +zlib +krb5 +libcurl +libopenssl + +%end + +%post + +### Update /tmp privilege +chmod 777 /tmp +#################################### + +%end diff --git a/eng/common/cross/armel/tizen/tizen.patch b/eng/common/cross/armel/tizen/tizen.patch new file mode 100644 index 0000000000..d223427c97 --- /dev/null +++ b/eng/common/cross/armel/tizen/tizen.patch @@ -0,0 +1,18 @@ +diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so +--- a/usr/lib/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf32-littlearm) +-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) ) +diff -u -r a/usr/lib/libpthread.so b/usr/lib/libpthread.so +--- a/usr/lib/libpthread.so 2016-12-30 23:00:19.408951841 +0900 ++++ b/usr/lib/libpthread.so 2016-12-30 23:00:39.068951801 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf32-littlearm) +-GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a ) ++GROUP ( libpthread.so.0 libpthread_nonshared.a ) diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh new file mode 100755 index 0000000000..adceda877a --- /dev/null +++ b/eng/common/cross/build-android-rootfs.sh @@ -0,0 +1,137 @@ +#!/usr/bin/env bash +set -e +__NDK_Version=r14 + +usage() +{ + echo "Creates a toolchain and sysroot used for cross-compiling for Android." + echo. + echo "Usage: $0 [BuildArch] [ApiLevel]" + echo. + echo "BuildArch is the target architecture of Android. Currently only arm64 is supported." + echo "ApiLevel is the target Android API level. API levels usually match to Android releases. See https://source.android.com/source/build-numbers.html" + echo. + echo "By default, the toolchain and sysroot will be generated in cross/android-rootfs/toolchain/[BuildArch]. You can change this behavior" + echo "by setting the TOOLCHAIN_DIR environment variable" + echo. + echo "By default, the NDK will be downloaded into the cross/android-rootfs/android-ndk-$__NDK_Version directory. If you already have an NDK installation," + echo "you can set the NDK_DIR environment variable to have this script use that installation of the NDK." + echo "By default, this script will generate a file, android_platform, in the root of the ROOTFS_DIR directory that contains the RID for the supported and tested Android build: android.21-arm64. This file is to replace '/etc/os-release', which is not available for Android." + exit 1 +} + +__ApiLevel=21 # The minimum platform for arm64 is API level 21 +__BuildArch=arm64 +__AndroidArch=aarch64 +__AndroidToolchain=aarch64-linux-android + +for i in "$@" + do + lowerI="$(echo $i | awk '{print tolower($0)}')" + case $lowerI in + -?|-h|--help) + usage + exit 1 + ;; + arm64) + __BuildArch=arm64 + __AndroidArch=aarch64 + __AndroidToolchain=aarch64-linux-android + ;; + arm) + __BuildArch=arm + __AndroidArch=arm + __AndroidToolchain=arm-linux-androideabi + ;; + *[0-9]) + __ApiLevel=$i + ;; + *) + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i" + ;; + esac +done + +# Obtain the location of the bash script to figure out where the root of the repo is. +__CrossDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +__Android_Cross_Dir="$__CrossDir/android-rootfs" +__NDK_Dir="$__Android_Cross_Dir/android-ndk-$__NDK_Version" +__libunwind_Dir="$__Android_Cross_Dir/libunwind" +__lldb_Dir="$__Android_Cross_Dir/lldb" +__ToolchainDir="$__Android_Cross_Dir/toolchain/$__BuildArch" + +if [[ -n "$TOOLCHAIN_DIR" ]]; then + __ToolchainDir=$TOOLCHAIN_DIR +fi + +if [[ -n "$NDK_DIR" ]]; then + __NDK_Dir=$NDK_DIR +fi + +echo "Target API level: $__ApiLevel" +echo "Target architecture: $__BuildArch" +echo "NDK location: $__NDK_Dir" +echo "Target Toolchain location: $__ToolchainDir" + +# Download the NDK if required +if [ ! -d $__NDK_Dir ]; then + echo Downloading the NDK into $__NDK_Dir + mkdir -p $__NDK_Dir + wget -nv -nc --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip + unzip -q $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__Android_Cross_Dir +fi + +if [ ! -d $__lldb_Dir ]; then + mkdir -p $__lldb_Dir + echo Downloading LLDB into $__lldb_Dir + wget -nv -nc --show-progress https://dl.google.com/android/repository/lldb-2.3.3614996-linux-x86_64.zip -O $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip + unzip -q $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir +fi + +# Create the RootFS for both arm64 as well as aarch +rm -rf $__Android_Cross_Dir/toolchain + +echo Generating the $__BuildArch toolchain +$__NDK_Dir/build/tools/make_standalone_toolchain.py --arch $__BuildArch --api $__ApiLevel --install-dir $__ToolchainDir + +# Install the required packages into the toolchain +# TODO: Add logic to get latest pkg version instead of specific version number +rm -rf $__Android_Cross_Dir/deb/ +rm -rf $__Android_Cross_Dir/tmp + +mkdir -p $__Android_Cross_Dir/deb/ +mkdir -p $__Android_Cross_Dir/tmp/$arch/ +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu-dev_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb + +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob-dev_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support-dev_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma-dev_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind-dev_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb + +echo Unpacking Termux packages +dpkg -x $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ + +cp -R $__Android_Cross_Dir/tmp/$__AndroidArch/data/data/com.termux/files/usr/* $__ToolchainDir/sysroot/usr/ + +# Generate platform file for build.sh script to assign to __DistroRid +echo "Generating platform file..." + +echo "RID=android.21-arm64" > $__ToolchainDir/sysroot/android_platform +echo Now run: +echo CONFIG_DIR=\`realpath cross/android/$__BuildArch\` ROOTFS_DIR=\`realpath $__ToolchainDir/sysroot\` ./build.sh cross $__BuildArch skipgenerateversion skipnuget cmakeargs -DENABLE_LLDBPLUGIN=0 + diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh new file mode 100755 index 0000000000..805948ca83 --- /dev/null +++ b/eng/common/cross/build-rootfs.sh @@ -0,0 +1,210 @@ +#!/usr/bin/env bash + +usage() +{ + echo "Usage: $0 [BuildArch] [LinuxCodeName] [lldbx.y] [--skipunmount]" + echo "BuildArch can be: arm(default), armel, arm64, x86" + echo "LinuxCodeName - optional, Code name for Linux, can be: trusty(default), vivid, wily, xenial, zesty, bionic, alpine. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." + echo "lldbx.y - optional, LLDB version, can be: lldb3.6(default), lldb3.8, lldb3.9, lldb4.0, no-lldb. Ignored for alpine" + echo "--skipunmount - optional, will skip the unmount of rootfs folder." + exit 1 +} + +__LinuxCodeName=trusty +__CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +__InitialDir=$PWD +__BuildArch=arm +__UbuntuArch=armhf +__UbuntuRepo="http://ports.ubuntu.com/" +__LLDB_Package="lldb-3.6-dev" +__SkipUnmount=0 + +# base development support +__UbuntuPackages="build-essential" + +__AlpinePackages="alpine-base" +__AlpinePackages+=" build-base" +__AlpinePackages+=" linux-headers" +__AlpinePackages+=" lldb-dev" +__AlpinePackages+=" llvm-dev" + +# symlinks fixer +__UbuntuPackages+=" symlinks" + +# CoreCLR and CoreFX dependencies +__UbuntuPackages+=" libicu-dev" +__UbuntuPackages+=" liblttng-ust-dev" +__UbuntuPackages+=" libunwind8-dev" + +__AlpinePackages+=" gettext-dev" +__AlpinePackages+=" icu-dev" +__AlpinePackages+=" libunwind-dev" +__AlpinePackages+=" lttng-ust-dev" + +# CoreFX dependencies +__UbuntuPackages+=" libcurl4-openssl-dev" +__UbuntuPackages+=" libkrb5-dev" +__UbuntuPackages+=" libssl-dev" +__UbuntuPackages+=" zlib1g-dev" + +__AlpinePackages+=" curl-dev" +__AlpinePackages+=" krb5-dev" +__AlpinePackages+=" openssl-dev" +__AlpinePackages+=" zlib-dev" + +__UnprocessedBuildArgs= +for i in "$@" ; do + lowerI="$(echo $i | awk '{print tolower($0)}')" + case $lowerI in + -?|-h|--help) + usage + exit 1 + ;; + arm) + __BuildArch=arm + __UbuntuArch=armhf + __AlpineArch=armhf + __QEMUArch=arm + ;; + arm64) + __BuildArch=arm64 + __UbuntuArch=arm64 + __AlpineArch=aarch64 + __QEMUArch=aarch64 + ;; + armel) + __BuildArch=armel + __UbuntuArch=armel + __UbuntuRepo="http://ftp.debian.org/debian/" + __LinuxCodeName=jessie + ;; + x86) + __BuildArch=x86 + __UbuntuArch=i386 + __UbuntuRepo="http://archive.ubuntu.com/ubuntu/" + ;; + lldb3.6) + __LLDB_Package="lldb-3.6-dev" + ;; + lldb3.8) + __LLDB_Package="lldb-3.8-dev" + ;; + lldb3.9) + __LLDB_Package="liblldb-3.9-dev" + ;; + lldb4.0) + __LLDB_Package="liblldb-4.0-dev" + ;; + no-lldb) + unset __LLDB_Package + ;; + vivid) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=vivid + fi + ;; + wily) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=wily + fi + ;; + xenial) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=xenial + fi + ;; + zesty) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=zesty + fi + ;; + bionic) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=bionic + fi + ;; + jessie) + __LinuxCodeName=jessie + __UbuntuRepo="http://ftp.debian.org/debian/" + ;; + tizen) + if [ "$__BuildArch" != "armel" ]; then + echo "Tizen is available only for armel." + usage; + exit 1; + fi + __LinuxCodeName= + __UbuntuRepo= + __Tizen=tizen + ;; + alpine) + __LinuxCodeName=alpine + __UbuntuRepo= + ;; + --skipunmount) + __SkipUnmount=1 + ;; + *) + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i" + ;; + esac +done + +if [ "$__BuildArch" == "armel" ]; then + __LLDB_Package="lldb-3.5-dev" +fi +__UbuntuPackages+=" ${__LLDB_Package:-}" + +__RootfsDir="$__CrossDir/rootfs/$__BuildArch" + +if [[ -n "$ROOTFS_DIR" ]]; then + __RootfsDir=$ROOTFS_DIR +fi + +if [ -d "$__RootfsDir" ]; then + if [ $__SkipUnmount == 0 ]; then + umount $__RootfsDir/* + fi + rm -rf $__RootfsDir +fi + +if [[ "$__LinuxCodeName" == "alpine" ]]; then + __ApkToolsVersion=2.9.1 + __AlpineVersion=3.7 + __ApkToolsDir=$(mktemp -d) + wget https://github.com/alpinelinux/apk-tools/releases/download/v$__ApkToolsVersion/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -P $__ApkToolsDir + tar -xf $__ApkToolsDir/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -C $__ApkToolsDir + mkdir -p $__RootfsDir/usr/bin + cp -v /usr/bin/qemu-$__QEMUArch-static $__RootfsDir/usr/bin + $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \ + -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/main \ + -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/community \ + -X http://dl-cdn.alpinelinux.org/alpine/edge/testing \ + -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ + add $__AlpinePackages + rm -r $__ApkToolsDir +elif [[ -n $__LinuxCodeName ]]; then + qemu-debootstrap --arch $__UbuntuArch $__LinuxCodeName $__RootfsDir $__UbuntuRepo + cp $__CrossDir/$__BuildArch/sources.list.$__LinuxCodeName $__RootfsDir/etc/apt/sources.list + chroot $__RootfsDir apt-get update + chroot $__RootfsDir apt-get -f -y install + chroot $__RootfsDir apt-get -y install $__UbuntuPackages + chroot $__RootfsDir symlinks -cr /usr + + if [ $__SkipUnmount == 0 ]; then + umount $__RootfsDir/* + fi + + if [[ "$__BuildArch" == "arm" && "$__LinuxCodeName" == "trusty" ]]; then + pushd $__RootfsDir + patch -p1 < $__CrossDir/$__BuildArch/trusty.patch + patch -p1 < $__CrossDir/$__BuildArch/trusty-lttng-2.4.patch + popd + fi +elif [ "$__Tizen" == "tizen" ]; then + ROOTFS_DIR=$__RootfsDir $__CrossDir/$__BuildArch/tizen-build-rootfs.sh +else + echo "Unsupported target platform." + usage; + exit 1 +fi diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake new file mode 100644 index 0000000000..071d411241 --- /dev/null +++ b/eng/common/cross/toolchain.cmake @@ -0,0 +1,138 @@ +set(CROSS_ROOTFS $ENV{ROOTFS_DIR}) + +set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH}) +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) + +if(TARGET_ARCH_NAME STREQUAL "armel") + set(CMAKE_SYSTEM_PROCESSOR armv7l) + set(TOOLCHAIN "arm-linux-gnueabi") + if("$ENV{__DistroRid}" MATCHES "tizen.*") + set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/6.2.1") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "arm") + set(CMAKE_SYSTEM_PROCESSOR armv7l) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf) + set(TOOLCHAIN "armv6-alpine-linux-musleabihf") + else() + set(TOOLCHAIN "arm-linux-gnueabihf") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "arm64") + set(CMAKE_SYSTEM_PROCESSOR aarch64) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl) + set(TOOLCHAIN "aarch64-alpine-linux-musl") + else() + set(TOOLCHAIN "aarch64-linux-gnu") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x86") + set(CMAKE_SYSTEM_PROCESSOR i686) + set(TOOLCHAIN "i686-linux-gnu") +else() + message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, arm64 and x86 are supported!") +endif() + +# Specify include paths +if(TARGET_ARCH_NAME STREQUAL "armel") + if(DEFINED TIZEN_TOOLCHAIN) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi) + endif() +endif() + +# add_compile_param - adds only new options without duplicates. +# arg0 - list with result options, arg1 - list with new options. +# arg2 - optional argument, quick summary string for optional using CACHE FORCE mode. +macro(add_compile_param) + if(NOT ${ARGC} MATCHES "^(2|3)$") + message(FATAL_ERROR "Wrong using add_compile_param! Two or three parameters must be given! See add_compile_param description.") + endif() + foreach(OPTION ${ARGV1}) + if(NOT ${ARGV0} MATCHES "${OPTION}($| )") + set(${ARGV0} "${${ARGV0}} ${OPTION}") + if(${ARGC} EQUAL "3") # CACHE FORCE mode + set(${ARGV0} "${${ARGV0}}" CACHE STRING "${ARGV2}" FORCE) + endif() + endif() + endforeach() +endmacro() + +# Specify link flags +add_compile_param(CROSS_LINK_FLAGS "--sysroot=${CROSS_ROOTFS}") +add_compile_param(CROSS_LINK_FLAGS "--gcc-toolchain=${CROSS_ROOTFS}/usr") +add_compile_param(CROSS_LINK_FLAGS "--target=${TOOLCHAIN}") +add_compile_param(CROSS_LINK_FLAGS "-fuse-ld=gold") + +if(TARGET_ARCH_NAME STREQUAL "armel") + if(DEFINED TIZEN_TOOLCHAIN) # For Tizen only + add_compile_param(CROSS_LINK_FLAGS "-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/lib") + add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/usr/lib") + add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x86") + add_compile_param(CROSS_LINK_FLAGS "-m32") +endif() + +add_compile_param(CMAKE_EXE_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS") +add_compile_param(CMAKE_SHARED_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS") +add_compile_param(CMAKE_MODULE_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS") + +# Specify compile options +add_compile_options("--sysroot=${CROSS_ROOTFS}") +add_compile_options("--target=${TOOLCHAIN}") +add_compile_options("--gcc-toolchain=${CROSS_ROOTFS}/usr") + +if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64)$") + set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN}) + set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN}) + set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN}) +endif() + +if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$") + add_compile_options(-mthumb) + add_compile_options(-mfpu=vfpv3) + if(TARGET_ARCH_NAME STREQUAL "armel") + add_compile_options(-mfloat-abi=softfp) + if(DEFINED TIZEN_TOOLCHAIN) + add_compile_options(-Wno-deprecated-declarations) # compile-time option + add_compile_options(-D__extern_always_inline=inline) # compile-time option + endif() + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x86") + add_compile_options(-m32) + add_compile_options(-Wno-error=unused-command-line-argument) +endif() + +# Set LLDB include and library paths +if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$") + if(TARGET_ARCH_NAME STREQUAL "x86") + set(LLVM_CROSS_DIR "$ENV{LLVM_CROSS_HOME}") + else() # arm/armel case + set(LLVM_CROSS_DIR "$ENV{LLVM_ARM_HOME}") + endif() + if(LLVM_CROSS_DIR) + set(WITH_LLDB_LIBS "${LLVM_CROSS_DIR}/lib/" CACHE STRING "") + set(WITH_LLDB_INCLUDES "${LLVM_CROSS_DIR}/include" CACHE STRING "") + set(LLDB_H "${WITH_LLDB_INCLUDES}" CACHE STRING "") + set(LLDB "${LLVM_CROSS_DIR}/lib/liblldb.so" CACHE STRING "") + else() + if(TARGET_ARCH_NAME STREQUAL "x86") + set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/i386-linux-gnu" CACHE STRING "") + set(CHECK_LLVM_DIR "${CROSS_ROOTFS}/usr/lib/llvm-3.8/include") + if(EXISTS "${CHECK_LLVM_DIR}" AND IS_DIRECTORY "${CHECK_LLVM_DIR}") + set(WITH_LLDB_INCLUDES "${CHECK_LLVM_DIR}") + else() + set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include") + endif() + else() # arm/armel case + set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}" CACHE STRING "") + set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include" CACHE STRING "") + endif() + endif() +endif() + +set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/x86/sources.list.bionic b/eng/common/cross/x86/sources.list.bionic new file mode 100644 index 0000000000..a71ccadcff --- /dev/null +++ b/eng/common/cross/x86/sources.list.bionic @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ bionic main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.trusty b/eng/common/cross/x86/sources.list.trusty new file mode 100644 index 0000000000..9b3085436e --- /dev/null +++ b/eng/common/cross/x86/sources.list.trusty @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ trusty main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.vivid b/eng/common/cross/x86/sources.list.vivid new file mode 100644 index 0000000000..26d37b20fc --- /dev/null +++ b/eng/common/cross/x86/sources.list.vivid @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ vivid main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ vivid main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ vivid-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ vivid-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ vivid-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ vivid-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ vivid-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ vivid-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.wily b/eng/common/cross/x86/sources.list.wily new file mode 100644 index 0000000000..c4b0b442ab --- /dev/null +++ b/eng/common/cross/x86/sources.list.wily @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ wily main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ wily main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ wily-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ wily-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ wily-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ wily-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ wily-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ wily-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.xenial b/eng/common/cross/x86/sources.list.xenial new file mode 100644 index 0000000000..ad9c5a0144 --- /dev/null +++ b/eng/common/cross/x86/sources.list.xenial @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1 new file mode 100644 index 0000000000..96cad844ba --- /dev/null +++ b/eng/common/darc-init.ps1 @@ -0,0 +1,32 @@ +param ( + $darcVersion = $null +) + +$verbosity = "m" +. $PSScriptRoot\tools.ps1 + +function InstallDarcCli ($darcVersion) { + $darcCliPackageName = "microsoft.dotnet.darc" + + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + $toolList = Invoke-Expression "& `"$dotnet`" tool list -g" + + if ($toolList -like "*$darcCliPackageName*") { + Invoke-Expression "& `"$dotnet`" tool uninstall $darcCliPackageName -g" + } + + # Until we can anonymously query the BAR API for the latest arcade-services + # build applied to the PROD channel, this is hardcoded. + if (-not $darcVersion) { + $darcVersion = '1.1.0-beta.19057.9' + } + + $arcadeServicesSource = 'https://dotnetfeed.blob.core.windows.net/dotnet-arcade/index.json' + + Write-Host "Installing Darc CLI version $darcVersion..." + Write-Host "You may need to restart your command window if this is the first dotnet tool you have installed." + Invoke-Expression "& `"$dotnet`" tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g" +} + +InstallDarcCli $darcVersion diff --git a/eng/common/darc-init.sh b/eng/common/darc-init.sh new file mode 100755 index 0000000000..bad07c3ae6 --- /dev/null +++ b/eng/common/darc-init.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" +verbosity=m + +. "$scriptroot/tools.sh" + +function InstallDarcCli { + local darc_cli_package_name="microsoft.dotnet.darc" + + InitializeDotNetCli + local dotnet_root=$_InitializeDotNetCli + + local uninstall_command=`$dotnet_root/dotnet tool uninstall $darc_cli_package_name -g` + local tool_list=$($dotnet_root/dotnet tool list -g) + if [[ $tool_list = *$darc_cli_package_name* ]]; then + echo $($dotnet_root/dotnet tool uninstall $darc_cli_package_name -g) + fi + + ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk" + local toolset_version=$_ReadGlobalVersion + + echo "Installing Darc CLI version $toolset_version..." + echo "You may need to restart your command shell if this is the first dotnet tool you have installed." + echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $toolset_version -v $verbosity -g) +} + +InstallDarcCli diff --git a/eng/common/helixpublish.proj b/eng/common/helixpublish.proj new file mode 100644 index 0000000000..d7f185856e --- /dev/null +++ b/eng/common/helixpublish.proj @@ -0,0 +1,26 @@ + + + + msbuild + + + + + %(Identity) + + + + + + $(WorkItemDirectory) + $(WorkItemCommand) + $(WorkItemTimeout) + + + + + + + + + diff --git a/eng/common/init-tools-native.cmd b/eng/common/init-tools-native.cmd new file mode 100644 index 0000000000..438cd548c4 --- /dev/null +++ b/eng/common/init-tools-native.cmd @@ -0,0 +1,3 @@ +@echo off +powershell -NoProfile -NoLogo -ExecutionPolicy ByPass -command "& """%~dp0init-tools-native.ps1""" %*" +exit /b %ErrorLevel% \ No newline at end of file diff --git a/eng/common/init-tools-native.ps1 b/eng/common/init-tools-native.ps1 new file mode 100644 index 0000000000..e25c60fed4 --- /dev/null +++ b/eng/common/init-tools-native.ps1 @@ -0,0 +1,128 @@ +<# +.SYNOPSIS +Entry point script for installing native tools + +.DESCRIPTION +Reads $RepoRoot\global.json file to determine native assets to install +and executes installers for those tools + +.PARAMETER BaseUri +Base file directory or Url from which to acquire tool archives + +.PARAMETER InstallDirectory +Directory to install native toolset. This is a command-line override for the default +Install directory precedence order: +- InstallDirectory command-line override +- NETCOREENG_INSTALL_DIRECTORY environment variable +- (default) %USERPROFILE%/.netcoreeng/native + +.PARAMETER Clean +Switch specifying to not install anything, but cleanup native asset folders + +.PARAMETER Force +Clean and then install tools + +.PARAMETER DownloadRetries +Total number of retry attempts + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds + +.PARAMETER GlobalJsonFile +File path to global.json file + +.NOTES +#> +[CmdletBinding(PositionalBinding=$false)] +Param ( + [string] $BaseUri = "https://netcorenativeassets.blob.core.windows.net/resource-packages/external", + [string] $InstallDirectory, + [switch] $Clean = $False, + [switch] $Force = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30, + [string] $GlobalJsonFile = "$PSScriptRoot\..\..\global.json" +) + +Set-StrictMode -version 2.0 +$ErrorActionPreference="Stop" + +Import-Module -Name (Join-Path $PSScriptRoot "native\CommonLibrary.psm1") + +try { + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $EngCommonBaseDir = Join-Path $PSScriptRoot "native\" + $NativeBaseDir = $InstallDirectory + if (!$NativeBaseDir) { + $NativeBaseDir = CommonLibrary\Get-NativeInstallDirectory + } + $Env:CommonLibrary_NativeInstallDir = $NativeBaseDir + $InstallBin = Join-Path $NativeBaseDir "bin" + $InstallerPath = Join-Path $EngCommonBaseDir "install-tool.ps1" + + # Process tools list + Write-Host "Processing $GlobalJsonFile" + If (-Not (Test-Path $GlobalJsonFile)) { + Write-Host "Unable to find '$GlobalJsonFile'" + exit 0 + } + $NativeTools = Get-Content($GlobalJsonFile) -Raw | + ConvertFrom-Json | + Select-Object -Expand "native-tools" -ErrorAction SilentlyContinue + if ($NativeTools) { + $NativeTools.PSObject.Properties | ForEach-Object { + $ToolName = $_.Name + $ToolVersion = $_.Value + $LocalInstallerCommand = $InstallerPath + $LocalInstallerCommand += " -ToolName $ToolName" + $LocalInstallerCommand += " -InstallPath $InstallBin" + $LocalInstallerCommand += " -BaseUri $BaseUri" + $LocalInstallerCommand += " -CommonLibraryDirectory $EngCommonBaseDir" + $LocalInstallerCommand += " -Version $ToolVersion" + + if ($Verbose) { + $LocalInstallerCommand += " -Verbose" + } + if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') { + if($Force) { + $LocalInstallerCommand += " -Force" + } + } + if ($Clean) { + $LocalInstallerCommand += " -Clean" + } + + Write-Verbose "Installing $ToolName version $ToolVersion" + Write-Verbose "Executing '$LocalInstallerCommand'" + Invoke-Expression "$LocalInstallerCommand" + if ($LASTEXITCODE -Ne "0") { + Write-Error "Execution failed" + exit 1 + } + } + } + else { + Write-Host "No native tools defined in global.json" + exit 0 + } + + if ($Clean) { + exit 0 + } + if (Test-Path $InstallBin) { + Write-Host "Native tools are available from" (Convert-Path -Path $InstallBin) + Write-Host "##vso[task.prependpath]$(Convert-Path -Path $InstallBin)" + } + else { + Write-Error "Native tools install directory does not exist, installation failed" + exit 1 + } + exit 0 +} +catch { + Write-Host $_ + Write-Host $_.Exception + exit 1 +} diff --git a/eng/common/init-tools-native.sh b/eng/common/init-tools-native.sh new file mode 100755 index 0000000000..54b70f678b --- /dev/null +++ b/eng/common/init-tools-native.sh @@ -0,0 +1,145 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +base_uri='https://netcorenativeassets.blob.core.windows.net/resource-packages/external' +install_directory='' +clean=false +force=false +download_retries=5 +retry_wait_time_seconds=30 +global_json_file="${scriptroot}/../../global.json" +declare -A native_assets + +. $scriptroot/native/common-library.sh + +while (($# > 0)); do + lowerI="$(echo $1 | awk '{print tolower($0)}')" + case $lowerI in + --baseuri) + base_uri=$2 + shift 2 + ;; + --installdirectory) + install_directory=$2 + shift 2 + ;; + --clean) + clean=true + shift 1 + ;; + --force) + force=true + shift 1 + ;; + --downloadretries) + download_retries=$2 + shift 2 + ;; + --retrywaittimeseconds) + retry_wait_time_seconds=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --installdirectory Directory to install native toolset." + echo " This is a command-line override for the default" + echo " Install directory precedence order:" + echo " - InstallDirectory command-line override" + echo " - NETCOREENG_INSTALL_DIRECTORY environment variable" + echo " - (default) %USERPROFILE%/.netcoreeng/native" + echo "" + echo " --clean Switch specifying not to install anything, but cleanup native asset folders" + echo " --force Clean and then install tools" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --baseuri Base URI for where to download native tools from" + echo " --downloadretries Number of times a download should be attempted" + echo " --retrywaittimeseconds Wait time between download attempts" + echo "" + exit 0 + ;; + esac +done + +function ReadGlobalJsonNativeTools { + # Get the native-tools section from the global.json. + local native_tools_section=$(cat $global_json_file | awk '/"native-tools"/,/}/') + # Only extract the contents of the object. + local native_tools_list=$(echo $native_tools_section | awk -F"[{}]" '{print $2}') + native_tools_list=${native_tools_list//[\" ]/} + native_tools_list=${native_tools_list//,/$'\n'} + + local old_IFS=$IFS + while read -r line; do + # Lines are of the form: 'tool:version' + IFS=: + while read -r key value; do + native_assets[$key]=$value + done <<< "$line" + done <<< "$native_tools_list" + IFS=$old_IFS + + return 0; +} + +native_base_dir=$install_directory +if [[ -z $install_directory ]]; then + native_base_dir=$(GetNativeInstallDirectory) +fi + +install_bin="${native_base_dir}/bin" + +ReadGlobalJsonNativeTools + +if [[ ${#native_assets[@]} -eq 0 ]]; then + echo "No native tools defined in global.json" + exit 0; +else + native_installer_dir="$scriptroot/native" + for tool in "${!native_assets[@]}" + do + tool_version=${native_assets[$tool]} + installer_name="install-$tool.sh" + installer_command="$native_installer_dir/$installer_name" + installer_command+=" --baseuri $base_uri" + installer_command+=" --installpath $install_bin" + installer_command+=" --version $tool_version" + + if [[ $force = true ]]; then + installer_command+=" --force" + fi + + if [[ $clean = true ]]; then + installer_command+=" --clean" + fi + + echo "Installing $tool version $tool_version" + echo "Executing '$installer_command'" + $installer_command + + if [[ $? != 0 ]]; then + echo "Execution Failed" >&2 + exit 1 + fi + done +fi + +if [[ ! -z $clean ]]; then + exit 0 +fi + +if [[ -d $install_bin ]]; then + echo "Native tools are available from $install_bin" + if [[ !-z BUILD_BUILDNUMBER ]]; then + echo "##vso[task.prependpath]$install_bin" + fi +else + echo "Native tools install directory does not exist, installation failed" >&2 + exit 1 +fi + +exit 0 + diff --git a/eng/common/msbuild.ps1 b/eng/common/msbuild.ps1 new file mode 100644 index 0000000000..b37fd3d5e9 --- /dev/null +++ b/eng/common/msbuild.ps1 @@ -0,0 +1,27 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string] $verbosity = "minimal", + [bool] $warnAsError = $true, + [bool] $nodeReuse = $true, + [switch] $ci, + [switch] $prepareMachine, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$extraArgs +) + +. $PSScriptRoot\tools.ps1 + +try { + if ($ci) { + $nodeReuse = $false + } + + MSBuild @extraArgs +} +catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} + +ExitWithExitCode 0 \ No newline at end of file diff --git a/eng/common/msbuild.sh b/eng/common/msbuild.sh new file mode 100755 index 0000000000..8160cd5a59 --- /dev/null +++ b/eng/common/msbuild.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +verbosity='minimal' +warn_as_error=true +node_reuse=true +prepare_machine=false +extra_args='' + +while (($# > 0)); do + lowerI="$(echo $1 | awk '{print tolower($0)}')" + case $lowerI in + --verbosity) + verbosity=$2 + shift 2 + ;; + --warnaserror) + warn_as_error=$2 + shift 2 + ;; + --nodereuse) + node_reuse=$2 + shift 2 + ;; + --ci) + ci=true + shift 1 + ;; + --preparemachine) + prepare_machine=true + shift 1 + ;; + *) + extra_args="$extra_args $1" + shift 1 + ;; + esac +done + +. "$scriptroot/tools.sh" + +if [[ "$ci" == true ]]; then + node_reuse=false +fi + +MSBuild $extra_args +ExitWithExitCode 0 diff --git a/eng/common/native/CommonLibrary.psm1 b/eng/common/native/CommonLibrary.psm1 new file mode 100644 index 0000000000..f286ae0cde --- /dev/null +++ b/eng/common/native/CommonLibrary.psm1 @@ -0,0 +1,358 @@ +<# +.SYNOPSIS +Helper module to install an archive to a directory + +.DESCRIPTION +Helper module to download and extract an archive to a specified directory + +.PARAMETER Uri +Uri of artifact to download + +.PARAMETER InstallDirectory +Directory to extract artifact contents to + +.PARAMETER Force +Force download / extraction if file or contents already exist. Default = False + +.PARAMETER DownloadRetries +Total number of retry attempts. Default = 5 + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds. Default = 30 + +.NOTES +Returns False if download or extraction fail, True otherwise +#> +function DownloadAndExtract { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Uri, + [Parameter(Mandatory=$True)] + [string] $InstallDirectory, + [switch] $Force = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30 + ) + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $TempToolPath = CommonLibrary\Get-TempPathFilename -Path $Uri + + # Download native tool + $DownloadStatus = CommonLibrary\Get-File -Uri $Uri ` + -Path $TempToolPath ` + -DownloadRetries $DownloadRetries ` + -RetryWaitTimeInSeconds $RetryWaitTimeInSeconds ` + -Force:$Force ` + -Verbose:$Verbose + + if ($DownloadStatus -Eq $False) { + Write-Error "Download failed" + return $False + } + + # Extract native tool + $UnzipStatus = CommonLibrary\Expand-Zip -ZipPath $TempToolPath ` + -OutputDirectory $InstallDirectory ` + -Force:$Force ` + -Verbose:$Verbose + + if ($UnzipStatus -Eq $False) { + Write-Error "Unzip failed" + return $False + } + return $True +} + +<# +.SYNOPSIS +Download a file, retry on failure + +.DESCRIPTION +Download specified file and retry if attempt fails + +.PARAMETER Uri +Uri of file to download. If Uri is a local path, the file will be copied instead of downloaded + +.PARAMETER Path +Path to download or copy uri file to + +.PARAMETER Force +Overwrite existing file if present. Default = False + +.PARAMETER DownloadRetries +Total number of retry attempts. Default = 5 + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds Default = 30 + +#> +function Get-File { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Uri, + [Parameter(Mandatory=$True)] + [string] $Path, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30, + [switch] $Force = $False + ) + $Attempt = 0 + + if ($Force) { + if (Test-Path $Path) { + Remove-Item $Path -Force + } + } + if (Test-Path $Path) { + Write-Host "File '$Path' already exists, skipping download" + return $True + } + + $DownloadDirectory = Split-Path -ErrorAction Ignore -Path "$Path" -Parent + if (-Not (Test-Path $DownloadDirectory)) { + New-Item -path $DownloadDirectory -force -itemType "Directory" | Out-Null + } + + if (Test-Path -IsValid -Path $Uri) { + Write-Verbose "'$Uri' is a file path, copying file to '$Path'" + Copy-Item -Path $Uri -Destination $Path + return $? + } + else { + Write-Verbose "Downloading $Uri" + while($Attempt -Lt $DownloadRetries) + { + try { + Invoke-WebRequest -UseBasicParsing -Uri $Uri -OutFile $Path + Write-Verbose "Downloaded to '$Path'" + return $True + } + catch { + $Attempt++ + if ($Attempt -Lt $DownloadRetries) { + $AttemptsLeft = $DownloadRetries - $Attempt + Write-Warning "Download failed, $AttemptsLeft attempts remaining, will retry in $RetryWaitTimeInSeconds seconds" + Start-Sleep -Seconds $RetryWaitTimeInSeconds + } + else { + Write-Error $_ + Write-Error $_.Exception + } + } + } + } + + return $False +} + +<# +.SYNOPSIS +Generate a shim for a native tool + +.DESCRIPTION +Creates a wrapper script (shim) that passes arguments forward to native tool assembly + +.PARAMETER ShimName +The name of the shim + +.PARAMETER ShimDirectory +The directory where shims are stored + +.PARAMETER ToolFilePath +Path to file that shim forwards to + +.PARAMETER Force +Replace shim if already present. Default = False + +.NOTES +Returns $True if generating shim succeeds, $False otherwise +#> +function New-ScriptShim { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $ShimName, + [Parameter(Mandatory=$True)] + [string] $ShimDirectory, + [Parameter(Mandatory=$True)] + [string] $ToolFilePath, + [Parameter(Mandatory=$True)] + [string] $BaseUri, + [switch] $Force + ) + try { + Write-Verbose "Generating '$ShimName' shim" + + if (-Not (Test-Path $ToolFilePath)){ + Write-Error "Specified tool file path '$ToolFilePath' does not exist" + return $False + } + + # WinShimmer is a small .NET Framework program that creates .exe shims to bootstrapped programs + # Many of the checks for installed programs expect a .exe extension for Windows tools, rather + # than a .bat or .cmd file. + # Source: https://github.com/dotnet/arcade/tree/master/src/WinShimmer + if (-Not (Test-Path "$ShimDirectory\WinShimmer\winshimmer.exe")) { + $InstallStatus = DownloadAndExtract -Uri "$BaseUri/windows/winshimmer/WinShimmer.zip" ` + -InstallDirectory $ShimDirectory\WinShimmer ` + -Force:$Force ` + -DownloadRetries 2 ` + -RetryWaitTimeInSeconds 5 ` + -Verbose:$Verbose + } + + if ((Test-Path (Join-Path $ShimDirectory "$ShimName.exe"))) { + Write-Host "$ShimName.exe already exists; replacing..." + Remove-Item (Join-Path $ShimDirectory "$ShimName.exe") + } + + Invoke-Expression "$ShimDirectory\WinShimmer\winshimmer.exe $ShimName $ToolFilePath $ShimDirectory" + return $True + } + catch { + Write-Host $_ + Write-Host $_.Exception + return $False + } +} + +<# +.SYNOPSIS +Returns the machine architecture of the host machine + +.NOTES +Returns 'x64' on 64 bit machines + Returns 'x86' on 32 bit machines +#> +function Get-MachineArchitecture { + $ProcessorArchitecture = $Env:PROCESSOR_ARCHITECTURE + $ProcessorArchitectureW6432 = $Env:PROCESSOR_ARCHITEW6432 + if($ProcessorArchitecture -Eq "X86") + { + if(($ProcessorArchitectureW6432 -Eq "") -Or + ($ProcessorArchitectureW6432 -Eq "X86")) { + return "x86" + } + $ProcessorArchitecture = $ProcessorArchitectureW6432 + } + if (($ProcessorArchitecture -Eq "AMD64") -Or + ($ProcessorArchitecture -Eq "IA64") -Or + ($ProcessorArchitecture -Eq "ARM64")) { + return "x64" + } + return "x86" +} + +<# +.SYNOPSIS +Get the name of a temporary folder under the native install directory +#> +function Get-TempDirectory { + return Join-Path (Get-NativeInstallDirectory) "temp/" +} + +function Get-TempPathFilename { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Path + ) + $TempDir = CommonLibrary\Get-TempDirectory + $TempFilename = Split-Path $Path -leaf + $TempPath = Join-Path $TempDir $TempFilename + return $TempPath +} + +<# +.SYNOPSIS +Returns the base directory to use for native tool installation + +.NOTES +Returns the value of the NETCOREENG_INSTALL_DIRECTORY if that environment variable +is set, or otherwise returns an install directory under the %USERPROFILE% +#> +function Get-NativeInstallDirectory { + $InstallDir = $Env:NETCOREENG_INSTALL_DIRECTORY + if (!$InstallDir) { + $InstallDir = Join-Path $Env:USERPROFILE ".netcoreeng/native/" + } + return $InstallDir +} + +<# +.SYNOPSIS +Unzip an archive + +.DESCRIPTION +Powershell module to unzip an archive to a specified directory + +.PARAMETER ZipPath (Required) +Path to archive to unzip + +.PARAMETER OutputDirectory (Required) +Output directory for archive contents + +.PARAMETER Force +Overwrite output directory contents if they already exist + +.NOTES +- Returns True and does not perform an extraction if output directory already exists but Overwrite is not True. +- Returns True if unzip operation is successful +- Returns False if Overwrite is True and it is unable to remove contents of OutputDirectory +- Returns False if unable to extract zip archive +#> +function Expand-Zip { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $ZipPath, + [Parameter(Mandatory=$True)] + [string] $OutputDirectory, + [switch] $Force + ) + + Write-Verbose "Extracting '$ZipPath' to '$OutputDirectory'" + try { + if ((Test-Path $OutputDirectory) -And (-Not $Force)) { + Write-Host "Directory '$OutputDirectory' already exists, skipping extract" + return $True + } + if (Test-Path $OutputDirectory) { + Write-Verbose "'Force' is 'True', but '$OutputDirectory' exists, removing directory" + Remove-Item $OutputDirectory -Force -Recurse + if ($? -Eq $False) { + Write-Error "Unable to remove '$OutputDirectory'" + return $False + } + } + if (-Not (Test-Path $OutputDirectory)) { + New-Item -path $OutputDirectory -Force -itemType "Directory" | Out-Null + } + + Add-Type -assembly "system.io.compression.filesystem" + [io.compression.zipfile]::ExtractToDirectory("$ZipPath", "$OutputDirectory") + if ($? -Eq $False) { + Write-Error "Unable to extract '$ZipPath'" + return $False + } + } + catch { + Write-Host $_ + Write-Host $_.Exception + + return $False + } + return $True +} + +export-modulemember -function DownloadAndExtract +export-modulemember -function Expand-Zip +export-modulemember -function Get-File +export-modulemember -function Get-MachineArchitecture +export-modulemember -function Get-NativeInstallDirectory +export-modulemember -function Get-TempDirectory +export-modulemember -function Get-TempPathFilename +export-modulemember -function New-ScriptShim diff --git a/eng/common/native/common-library.sh b/eng/common/native/common-library.sh new file mode 100755 index 0000000000..271bddfac5 --- /dev/null +++ b/eng/common/native/common-library.sh @@ -0,0 +1,168 @@ +#!/usr/bin/env bash + +function GetNativeInstallDirectory { + local install_dir + + if [[ -z $NETCOREENG_INSTALL_DIRECTORY ]]; then + install_dir=$HOME/.netcoreeng/native/ + else + install_dir=$NETCOREENG_INSTALL_DIRECTORY + fi + + echo $install_dir + return 0 +} + +function GetTempDirectory { + + echo $(GetNativeInstallDirectory)temp/ + return 0 +} + +function ExpandZip { + local zip_path=$1 + local output_directory=$2 + local force=${3:-false} + + echo "Extracting $zip_path to $output_directory" + if [[ -d $output_directory ]] && [[ $force = false ]]; then + echo "Directory '$output_directory' already exists, skipping extract" + return 0 + fi + + if [[ -d $output_directory ]]; then + echo "'Force flag enabled, but '$output_directory' exists. Removing directory" + rm -rf $output_directory + if [[ $? != 0 ]]; then + echo Unable to remove '$output_directory'>&2 + return 1 + fi + fi + + echo "Creating directory: '$output_directory'" + mkdir -p $output_directory + + echo "Extracting archive" + tar -xf $zip_path -C $output_directory + if [[ $? != 0 ]]; then + echo "Unable to extract '$zip_path'" >&2 + return 1 + fi + + return 0 +} + +function GetCurrentOS { + local unameOut="$(uname -s)" + case $unameOut in + Linux*) echo "Linux";; + Darwin*) echo "MacOS";; + esac + return 0 +} + +function GetFile { + local uri=$1 + local path=$2 + local force=${3:-false} + local download_retries=${4:-5} + local retry_wait_time_seconds=${5:-30} + + if [[ -f $path ]]; then + if [[ $force = false ]]; then + echo "File '$path' already exists. Skipping download" + return 0 + else + rm -rf $path + fi + fi + + if [[ -f $uri ]]; then + echo "'$uri' is a file path, copying file to '$path'" + cp $uri $path + return $? + fi + + echo "Downloading $uri" + # Use curl if available, otherwise use wget + if command -v curl > /dev/null; then + curl "$uri" -sSL --retry $download_retries --retry-delay $retry_wait_time_seconds --create-dirs -o "$path" --fail + else + wget -q -O "$path" "$uri" --tries="$download_retries" + fi + + return $? +} + +function GetTempPathFileName { + local path=$1 + + local temp_dir=$(GetTempDirectory) + local temp_file_name=$(basename $path) + echo $temp_dir$temp_file_name + return 0 +} + +function DownloadAndExtract { + local uri=$1 + local installDir=$2 + local force=${3:-false} + local download_retries=${4:-5} + local retry_wait_time_seconds=${5:-30} + + local temp_tool_path=$(GetTempPathFileName $uri) + + echo "downloading to: $temp_tool_path" + + # Download file + GetFile "$uri" "$temp_tool_path" $force $download_retries $retry_wait_time_seconds + if [[ $? != 0 ]]; then + echo "Failed to download '$uri' to '$temp_tool_path'." >&2 + return 1 + fi + + # Extract File + echo "extracting from $temp_tool_path to $installDir" + ExpandZip "$temp_tool_path" "$installDir" $force $download_retries $retry_wait_time_seconds + if [[ $? != 0 ]]; then + echo "Failed to extract '$temp_tool_path' to '$installDir'." >&2 + return 1 + fi + + return 0 +} + +function NewScriptShim { + local shimpath=$1 + local tool_file_path=$2 + local force=${3:-false} + + echo "Generating '$shimpath' shim" + if [[ -f $shimpath ]]; then + if [[ $force = false ]]; then + echo "File '$shimpath' already exists." >&2 + return 1 + else + rm -rf $shimpath + fi + fi + + if [[ ! -f $tool_file_path ]]; then + echo "Specified tool file path:'$tool_file_path' does not exist" >&2 + return 1 + fi + + local shim_contents=$'#!/usr/bin/env bash\n' + shim_contents+="SHIMARGS="$'$1\n' + shim_contents+="$tool_file_path"$' $SHIMARGS\n' + + # Write shim file + echo "$shim_contents" > $shimpath + + chmod +x $shimpath + + echo "Finished generating shim '$shimpath'" + + return $? +} + diff --git a/eng/common/native/install-cmake.sh b/eng/common/native/install-cmake.sh new file mode 100755 index 0000000000..293af6017d --- /dev/null +++ b/eng/common/native/install-cmake.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. $scriptroot/common-library.sh + +base_uri= +install_path= +version= +clean=false +force=false +download_retries=5 +retry_wait_time_seconds=30 + +while (($# > 0)); do + lowerI="$(echo $1 | awk '{print tolower($0)}')" + case $lowerI in + --baseuri) + base_uri=$2 + shift 2 + ;; + --installpath) + install_path=$2 + shift 2 + ;; + --version) + version=$2 + shift 2 + ;; + --clean) + clean=true + shift 1 + ;; + --force) + force=true + shift 1 + ;; + --downloadretries) + download_retries=$2 + shift 2 + ;; + --retrywaittimeseconds) + retry_wait_time_seconds=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --baseuri Base file directory or Url wrom which to acquire tool archives" + echo " --installpath Base directory to install native tool to" + echo " --clean Don't install the tool, just clean up the current install of the tool" + echo " --force Force install of tools even if they previously exist" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --downloadretries Total number of retry attempts" + echo " --retrywaittimeseconds Wait time between retry attempts in seconds" + echo "" + exit 0 + ;; + esac +done + +tool_name="cmake" +tool_os=$(GetCurrentOS) +tool_folder=$(echo $tool_os | awk '{print tolower($0)}') +tool_arch="x86_64" +tool_name_moniker="$tool_name-$version-$tool_os-$tool_arch" +tool_install_directory="$install_path/$tool_name/$version" +tool_file_path="$tool_install_directory/$tool_name_moniker/bin/$tool_name" +shim_path="$install_path/$tool_name.sh" +uri="${base_uri}/$tool_folder/cmake/$tool_name_moniker.tar.gz" + +# Clean up tool and installers +if [[ $clean = true ]]; then + echo "Cleaning $tool_install_directory" + if [[ -d $tool_install_directory ]]; then + rm -rf $tool_install_directory + fi + + echo "Cleaning $shim_path" + if [[ -f $shim_path ]]; then + rm -rf $shim_path + fi + + tool_temp_path=$(GetTempPathFileName $uri) + echo "Cleaning $tool_temp_path" + if [[ -f $tool_temp_path ]]; then + rm -rf $tool_temp_path + fi + + exit 0 +fi + +# Install tool +if [[ -f $tool_file_path ]] && [[ $force = false ]]; then + echo "$tool_name ($version) already exists, skipping install" + exit 0 +fi + +DownloadAndExtract $uri $tool_install_directory $force $download_retries $retry_wait_time_seconds + +if [[ $? != 0 ]]; then + echo "Installation failed" >&2 + exit 1 +fi + +# Generate Shim +# Always rewrite shims so that we are referencing the expected version +NewScriptShim $shim_path $tool_file_path true + +if [[ $? != 0 ]]; then + echo "Shim generation failed" >&2 + exit 1 +fi + +exit 0 \ No newline at end of file diff --git a/eng/common/native/install-tool.ps1 b/eng/common/native/install-tool.ps1 new file mode 100644 index 0000000000..635ab3fd41 --- /dev/null +++ b/eng/common/native/install-tool.ps1 @@ -0,0 +1,130 @@ +<# +.SYNOPSIS +Install native tool + +.DESCRIPTION +Install cmake native tool from Azure blob storage + +.PARAMETER InstallPath +Base directory to install native tool to + +.PARAMETER BaseUri +Base file directory or Url from which to acquire tool archives + +.PARAMETER CommonLibraryDirectory +Path to folder containing common library modules + +.PARAMETER Force +Force install of tools even if they previously exist + +.PARAMETER Clean +Don't install the tool, just clean up the current install of the tool + +.PARAMETER DownloadRetries +Total number of retry attempts + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds + +.NOTES +Returns 0 if install succeeds, 1 otherwise +#> +[CmdletBinding(PositionalBinding=$false)] +Param ( + [Parameter(Mandatory=$True)] + [string] $ToolName, + [Parameter(Mandatory=$True)] + [string] $InstallPath, + [Parameter(Mandatory=$True)] + [string] $BaseUri, + [Parameter(Mandatory=$True)] + [string] $Version, + [string] $CommonLibraryDirectory = $PSScriptRoot, + [switch] $Force = $False, + [switch] $Clean = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30 +) + +# Import common library modules +Import-Module -Name (Join-Path $CommonLibraryDirectory "CommonLibrary.psm1") + +try { + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $Arch = CommonLibrary\Get-MachineArchitecture + $ToolOs = "win64" + if($Arch -Eq "x32") { + $ToolOs = "win32" + } + $ToolNameMoniker = "$ToolName-$Version-$ToolOs-$Arch" + $ToolInstallDirectory = Join-Path $InstallPath "$ToolName\$Version\" + $Uri = "$BaseUri/windows/$ToolName/$ToolNameMoniker.zip" + $ShimPath = Join-Path $InstallPath "$ToolName.exe" + + if ($Clean) { + Write-Host "Cleaning $ToolInstallDirectory" + if (Test-Path $ToolInstallDirectory) { + Remove-Item $ToolInstallDirectory -Force -Recurse + } + Write-Host "Cleaning $ShimPath" + if (Test-Path $ShimPath) { + Remove-Item $ShimPath -Force + } + $ToolTempPath = CommonLibrary\Get-TempPathFilename -Path $Uri + Write-Host "Cleaning $ToolTempPath" + if (Test-Path $ToolTempPath) { + Remove-Item $ToolTempPath -Force + } + exit 0 + } + + # Install tool + if ((Test-Path $ToolInstallDirectory) -And (-Not $Force)) { + Write-Verbose "$ToolName ($Version) already exists, skipping install" + } + else { + $InstallStatus = CommonLibrary\DownloadAndExtract -Uri $Uri ` + -InstallDirectory $ToolInstallDirectory ` + -Force:$Force ` + -DownloadRetries $DownloadRetries ` + -RetryWaitTimeInSeconds $RetryWaitTimeInSeconds ` + -Verbose:$Verbose + + if ($InstallStatus -Eq $False) { + Write-Error "Installation failed" + exit 1 + } + } + + $ToolFilePath = Get-ChildItem $ToolInstallDirectory -Recurse -Filter "$ToolName.exe" | % { $_.FullName } + if (@($ToolFilePath).Length -Gt 1) { + Write-Error "There are multiple copies of $ToolName in $($ToolInstallDirectory): `n$(@($ToolFilePath | out-string))" + exit 1 + } elseif (@($ToolFilePath).Length -Lt 1) { + Write-Error "$ToolName was not found in $ToolFilePath." + exit 1 + } + + # Generate shim + # Always rewrite shims so that we are referencing the expected version + $GenerateShimStatus = CommonLibrary\New-ScriptShim -ShimName $ToolName ` + -ShimDirectory $InstallPath ` + -ToolFilePath "$ToolFilePath" ` + -BaseUri $BaseUri ` + -Force:$Force ` + -Verbose:$Verbose + + if ($GenerateShimStatus -Eq $False) { + Write-Error "Generate shim failed" + return 1 + } + + exit 0 +} +catch { + Write-Host $_ + Write-Host $_.Exception + exit 1 +} diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 new file mode 100644 index 0000000000..9ba7530122 --- /dev/null +++ b/eng/common/sdk-task.ps1 @@ -0,0 +1,74 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string] $projects = "", + [string][Alias('v')]$verbosity = "minimal", + [string] $msbuildEngine = $null, + [bool] $warnAsError = $true, + [switch][Alias('bl')]$binaryLog, + [switch][Alias('r')]$restore, + [switch] $ci, + [switch] $prepareMachine, + [switch] $help, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties +) + +. $PSScriptRoot\tools.ps1 + +function Print-Usage() { + Write-Host "Common settings:" + Write-Host " -v[erbosity] Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" + Write-Host " -[bl|binaryLog] Output binary log (short: -bl)" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Advanced settings:" + Write-Host " -restore Restore dependencies (short: -r)" + Write-Host " -projects Semi-colon delimited list of sln/proj's from the Arcade sdk to build. Globbing is supported (*.sln)" + Write-Host " -ci Set when running on CI server" + Write-Host " -prepareMachine Prepare machine for CI run" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host "" + Write-Host "Command line arguments not listed above are passed thru to msbuild." + Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)." +} + +function Build { + $toolsetBuildProj = InitializeToolset + + $toolsetBuildProj = Join-Path (Split-Path $toolsetBuildProj -Parent) "SdkTasks\SdkTask.proj" + $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "SdkTask.binlog") } else { "" } + MSBuild $toolsetBuildProj ` + $bl ` + /p:Projects=$projects ` + /p:Restore=$restore ` + /p:RepoRoot=$RepoRoot ` + /p:ContinuousIntegrationBuild=$ci ` + @properties +} + +try { + if ($help -or (($null -ne $properties) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { + Print-Usage + exit 0 + } + + if ($projects -eq "") { + Write-Error "Missing required parameter '-projects '" + Print-Usage + ExitWithExitCode 1 + } + + if ($ci) { + $binaryLog = $true + } + + Build +} +catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} + +ExitWithExitCode 0 diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml new file mode 100644 index 0000000000..5e293db35d --- /dev/null +++ b/eng/common/templates/job/job.yml @@ -0,0 +1,205 @@ +parameters: +# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job + cancelTimeoutInMinutes: '' + + condition: '' + + continueOnError: false + + container: '' + + dependsOn: '' + + displayName: '' + + steps: [] + + pool: '' + + strategy: '' + + timeoutInMinutes: '' + + variables: [] + + workspace: '' + +# Job base template specific parameters + # Optional: Enable installing Microbuild plugin + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _TeamName - the name of your team + # _SignType - 'test' or 'real' + enableMicrobuild: false + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: Enable publishing to the build asset registry + enablePublishBuildAssets: false + + # Optional: Include PublishTestResults task + enablePublishTestResults: false + + # Optional: enable sending telemetry + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _HelixBuildConfig - differentiate between Debug, Release, other + # _HelixType - Example: build/product/ + # _HelixSource - Example: official/dotnet/arcade/$(Build.SourceBranch) + enableTelemetry: false + + # Optional: If specified, then automatically derive "_HelixSource" variable for telemetry + helixRepo: '' + + # Optional: Define the type for helix telemetry (must end in '/') + helixType: build/product/ + + # Required: name of the job + name: '' + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + +jobs: +- job: ${{ parameters.name }} + + ${{ if ne(parameters.cancelTimeoutInMinutes, '') }}: + cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }} + + ${{ if ne(parameters.condition, '') }}: + condition: ${{ parameters.condition }} + + ${{ if ne(parameters.container, '') }}: + container: ${{ parameters.container }} + + ${{ if ne(parameters.continueOnError, '') }}: + continueOnError: ${{ parameters.continueOnError }} + + ${{ if ne(parameters.dependsOn, '') }}: + dependsOn: ${{ parameters.dependsOn }} + + ${{ if ne(parameters.displayName, '') }}: + displayName: ${{ parameters.displayName }} + + ${{ if ne(parameters.pool, '') }}: + pool: ${{ parameters.pool }} + + ${{ if ne(parameters.strategy, '') }}: + strategy: ${{ parameters.strategy }} + + ${{ if ne(parameters.timeoutInMinutes, '') }}: + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + + variables: + - ${{ each variable in parameters.variables }}: + # handle name-value variable syntax + # example: + # - name: [key] + # value: [value] + - ${{ if ne(variable.name, '') }}: + - name: ${{ variable.name }} + value: ${{ variable.value }} + + # handle variable groups + - ${{ if ne(variable.group, '') }}: + - group: ${{ variable.group }} + + # handle key-value variable syntax. + # example: + # - [key]: [value] + - ${{ if and(eq(variable.name, ''), eq(variable.group, '')) }}: + - ${{ each pair in variable }}: + - name: ${{ pair.key }} + value: ${{ pair.value }} + + # Add additional variables + - ${{ if and(ne(parameters.helixRepo, ''), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }}: + - name: _HelixSource + value: official/${{ parameters.helixRepo }}/$(Build.SourceBranch) + - ${{ if and(ne(parameters.helixRepo, ''), or(ne(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest'))) }}: + - name: _HelixSource + value: pr/${{ parameters.helixRepo }}/$(Build.SourceBranch) + - name: _HelixType + value: ${{ parameters.helixType }} + - name: _HelixBuildConfig + value: $(_BuildConfig) + + ${{ if ne(parameters.workspace, '') }}: + workspace: ${{ parameters.workspace }} + + steps: + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-start.yml + parameters: + buildConfig: $(_HelixBuildConfig) + helixSource: $(_HelixSource) + helixType: $(_HelixType) + runAsPublic: ${{ parameters.runAsPublic }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildSigningPlugin@2 + displayName: Install MicroBuild plugin + inputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + env: + TeamName: $(_TeamName) + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + + - ${{ each step in parameters.steps }}: + - ${{ step }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildCleanup@1 + displayName: Execute Microbuild cleanup tasks + condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + env: + TeamName: $(_TeamName) + + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-end.yml + + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: + - task: PublishBuildArtifacts@1 + displayName: Publish Logs to VSTS + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' + PublishLocation: Container + ArtifactName: $(Agent.Os)_$(Agent.JobName) + continueOnError: true + condition: always() + + - ${{ if eq(parameters.enablePublishTestResults, 'true') }}: + - task: PublishTestResults@2 + displayName: Publish Test Results + inputs: + testResultsFormat: 'xUnit' + testResultsFiles: '*.xml' + searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' + continueOnError: true + condition: always() + + - ${{ if and(eq(parameters.enablePublishBuildAssets, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: CopyFiles@2 + displayName: Gather Asset Manifests + inputs: + SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/AssetManifest' + TargetFolder: '$(Build.StagingDirectory)/AssetManifests' + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) + - task: PublishBuildArtifacts@1 + displayName: Push Asset Manifests + inputs: + PathtoPublish: '$(Build.StagingDirectory)/AssetManifests' + PublishLocation: Container + ArtifactName: AssetManifests + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) \ No newline at end of file diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml new file mode 100644 index 0000000000..c094658fef --- /dev/null +++ b/eng/common/templates/job/publish-build-assets.yml @@ -0,0 +1,63 @@ +parameters: + configuration: 'Debug' + + # Optional: condition for the job to run + condition: '' + + # Optional: 'true' if future jobs should run even if this job fails + continueOnError: false + + # Optional: dependencies of the job + dependsOn: '' + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool + pool: {} + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + +jobs: +- job: Asset_Registry_Publish + + dependsOn: ${{ parameters.dependsOn }} + + displayName: Publish to Build Asset Registry + + pool: ${{ parameters.pool }} + + variables: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - name: _BuildConfig + value: ${{ parameters.configuration }} + - group: Publish-Build-Assets + + steps: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: DownloadBuildArtifacts@0 + displayName: Download artifact + inputs: + artifactName: AssetManifests + downloadPath: '$(Build.StagingDirectory)/Download' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - script: eng\common\publishbuildassets.cmd + /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:BuildAssetRegistryToken=$(MaestroAccessToken) + /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com + /p:Configuration=$(_BuildConfig) + displayName: Publish Build Assets + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: + - task: PublishBuildArtifacts@1 + displayName: Publish Logs to VSTS + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' + PublishLocation: Container + ArtifactName: $(Agent.Os)_PublishBuildAssets + continueOnError: true + condition: always() diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml new file mode 100644 index 0000000000..c7226b12ed --- /dev/null +++ b/eng/common/templates/jobs/jobs.yml @@ -0,0 +1,77 @@ +parameters: + # Optional: 'true' if failures in job.yml job should not fail the job + continueOnError: false + + # Optional: Enable installing Microbuild plugin + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _TeamName - the name of your team + # _SignType - 'test' or 'real' + enableMicrobuild: false + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: Enable publishing to the build asset registry + enablePublishBuildAssets: false + + # Optional: Include PublishTestResults task + enablePublishTestResults: false + + # Optional: enable sending telemetry + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _HelixBuildConfig - differentiate between Debug, Release, other + # _HelixType - Example: build/product/ + # _HelixSource - Example: official/dotnet/arcade/$(Build.SourceBranch) + enableTelemetry: false + + # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job + jobs: [] + + # Optional: If specified, then automatically derive "_HelixSource" variable for telemetry + helixRepo: '' + + # Optional: Define the type for helix telemetry (must end in '/') + helixType: build/product/ + + # Optional: Override automatically derived dependsOn value for "publish build assets" job + publishBuildAssetsDependsOn: '' + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + +jobs: +- ${{ each job in parameters.jobs }}: + - template: ../job/job.yml + parameters: + # pass along parameters + ${{ each parameter in parameters }}: + ${{ if ne(parameter.key, 'jobs') }}: + ${{ parameter.key }}: ${{ parameter.value }} + + # pass along job properties + ${{ each property in job }}: + ${{ if ne(property.key, 'job') }}: + ${{ property.key }}: ${{ property.value }} + + name: ${{ job.job }} + +- ${{ if and(eq(parameters.enablePublishBuildAssets, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - template: ../job/publish-build-assets.yml + parameters: + continueOnError: ${{ parameters.continueOnError }} + dependsOn: + - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.publishBuildAssetsDependsOn }}: + - ${{ job.job }} + - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.jobs }}: + - ${{ job.job }} + pool: + vmImage: vs2017-win2016 + runAsPublic: ${{ parameters.runAsPublic }} + enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} + diff --git a/eng/common/templates/phases/base.yml b/eng/common/templates/phases/base.yml new file mode 100644 index 0000000000..0123cf43b1 --- /dev/null +++ b/eng/common/templates/phases/base.yml @@ -0,0 +1,130 @@ +parameters: + # Optional: Clean sources before building + clean: true + + # Optional: Git fetch depth + fetchDepth: '' + + # Optional: name of the phase (not specifying phase name may cause name collisions) + name: '' + # Optional: display name of the phase + displayName: '' + + # Optional: condition for the job to run + condition: '' + + # Optional: dependencies of the phase + dependsOn: '' + + # Required: A defined YAML queue + queue: {} + + # Required: build steps + steps: [] + + # Optional: variables + variables: {} + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + + ## Telemetry variables + + # Optional: enable sending telemetry + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _HelixBuildConfig - differentiate between Debug, Release, other + # _HelixSource - Example: build/product + # _HelixType - Example: official/dotnet/arcade/$(Build.SourceBranch) + enableTelemetry: false + + # Optional: Enable installing Microbuild plugin + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _TeamName - the name of your team + # _SignType - 'test' or 'real' + enableMicrobuild: false + +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + +phases: +- phase: ${{ parameters.name }} + + ${{ if ne(parameters.displayName, '') }}: + displayName: ${{ parameters.displayName }} + + ${{ if ne(parameters.condition, '') }}: + condition: ${{ parameters.condition }} + + ${{ if ne(parameters.dependsOn, '') }}: + dependsOn: ${{ parameters.dependsOn }} + + queue: ${{ parameters.queue }} + + ${{ if ne(parameters.variables, '') }}: + variables: + ${{ insert }}: ${{ parameters.variables }} + + steps: + - checkout: self + clean: ${{ parameters.clean }} + ${{ if ne(parameters.fetchDepth, '') }}: + fetchDepth: ${{ parameters.fetchDepth }} + + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-start.yml + parameters: + buildConfig: $(_HelixBuildConfig) + helixSource: $(_HelixSource) + helixType: $(_HelixType) + runAsPublic: ${{ parameters.runAsPublic }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + # Internal only resource, and Microbuild signing shouldn't be applied to PRs. + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildSigningPlugin@2 + displayName: Install MicroBuild plugin + inputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + + env: + TeamName: $(_TeamName) + continueOnError: false + condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + + # Run provided build steps + - ${{ parameters.steps }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + # Internal only resources + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildCleanup@1 + displayName: Execute Microbuild cleanup tasks + condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + env: + TeamName: $(_TeamName) + + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-end.yml + parameters: + helixSource: $(_HelixSource) + helixType: $(_HelixType) + + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: CopyFiles@2 + displayName: Gather Asset Manifests + inputs: + SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/AssetManifest' + TargetFolder: '$(Build.StagingDirectory)/AssetManifests' + continueOnError: false + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) + - task: PublishBuildArtifacts@1 + displayName: Push Asset Manifests + inputs: + PathtoPublish: '$(Build.StagingDirectory)/AssetManifests' + PublishLocation: Container + ArtifactName: AssetManifests + continueOnError: false + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) diff --git a/eng/common/templates/phases/publish-build-assets.yml b/eng/common/templates/phases/publish-build-assets.yml new file mode 100644 index 0000000000..0df6203b50 --- /dev/null +++ b/eng/common/templates/phases/publish-build-assets.yml @@ -0,0 +1,46 @@ +parameters: + dependsOn: '' + queue: {} + configuration: 'Debug' + condition: succeeded() + continueOnError: false + runAsPublic: false +phases: + - phase: Asset_Registry_Publish + displayName: Publish to Build Asset Registry + dependsOn: ${{ parameters.dependsOn }} + queue: ${{ parameters.queue }} + variables: + _BuildConfig: ${{ parameters.configuration }} + steps: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: DownloadBuildArtifacts@0 + displayName: Download artifact + inputs: + artifactName: AssetManifests + downloadPath: '$(Build.StagingDirectory)/Download' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - task: AzureKeyVault@1 + inputs: + azureSubscription: 'DotNet-Engineering-Services_KeyVault' + KeyVaultName: EngKeyVault + SecretsFilter: 'MaestroAccessToken' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - script: eng\common\publishbuildassets.cmd + -configuration $(_BuildConfig) + /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:BuildAssetRegistryToken=$(MaestroAccessToken) + /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com + displayName: Publish Build Assets + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - task: PublishBuildArtifacts@1 + displayName: Publish Logs to VSTS + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' + PublishLocation: Container + ArtifactName: $(Agent.Os)_Asset_Registry_Publish + continueOnError: true + condition: always() diff --git a/eng/common/templates/steps/build-reason.yml b/eng/common/templates/steps/build-reason.yml new file mode 100644 index 0000000000..eba58109b5 --- /dev/null +++ b/eng/common/templates/steps/build-reason.yml @@ -0,0 +1,12 @@ +# build-reason.yml +# Description: runs steps if build.reason condition is valid. conditions is a string of valid build reasons +# to include steps (',' separated). +parameters: + conditions: '' + steps: [] + +steps: + - ${{ if and( not(startsWith(parameters.conditions, 'not')), contains(parameters.conditions, variables['build.reason'])) }}: + - ${{ parameters.steps }} + - ${{ if and( startsWith(parameters.conditions, 'not'), not(contains(parameters.conditions, variables['build.reason']))) }}: + - ${{ parameters.steps }} diff --git a/eng/common/templates/steps/helix-publish.yml b/eng/common/templates/steps/helix-publish.yml new file mode 100644 index 0000000000..470ab65da0 --- /dev/null +++ b/eng/common/templates/steps/helix-publish.yml @@ -0,0 +1,51 @@ +parameters: + HelixSource: 'pr/dotnet-github-anon-kaonashi-bot' + HelixType: ̓'tests/default' + HelixBuild: $(Build.BuildNumber) + HelixTargetQueues: '' + HelixAccessToken: '' + HelixPreCommands: '' + HelixPostCommands: '' + WorkItemDirectory: '' + WorkItemCommand: '' + CorrelationPayloadDirectory: '' + XUnitProjects: '' + XUnitTargetFramework: '' + XUnitRunnerVersion: '' + IncludeDotNetCli: false + DotNetCliPackageType: '' + DotNetCliVersion: '' + EnableXUnitReporter: false + WaitForWorkItemCompletion: true + condition: succeeded() + continueOnError: false + +steps: + - task: DotNetCoreCLI@2 + inputs: + command: custom + projects: eng/common/helixpublish.proj + custom: msbuild + arguments: '/bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog' + displayName: Send job to Helix + env: + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} diff --git a/eng/common/templates/steps/run-on-unix.yml b/eng/common/templates/steps/run-on-unix.yml new file mode 100644 index 0000000000..e1733814f6 --- /dev/null +++ b/eng/common/templates/steps/run-on-unix.yml @@ -0,0 +1,7 @@ +parameters: + agentOs: '' + steps: [] + +steps: +- ${{ if ne(parameters.agentOs, 'Windows_NT') }}: + - ${{ parameters.steps }} diff --git a/eng/common/templates/steps/run-on-windows.yml b/eng/common/templates/steps/run-on-windows.yml new file mode 100644 index 0000000000..73e7e9c275 --- /dev/null +++ b/eng/common/templates/steps/run-on-windows.yml @@ -0,0 +1,7 @@ +parameters: + agentOs: '' + steps: [] + +steps: +- ${{ if eq(parameters.agentOs, 'Windows_NT') }}: + - ${{ parameters.steps }} diff --git a/eng/common/templates/steps/run-script-ifequalelse.yml b/eng/common/templates/steps/run-script-ifequalelse.yml new file mode 100644 index 0000000000..3d1242f558 --- /dev/null +++ b/eng/common/templates/steps/run-script-ifequalelse.yml @@ -0,0 +1,33 @@ +parameters: + # if parameter1 equals parameter 2, run 'ifScript' command, else run 'elsescript' command + parameter1: '' + parameter2: '' + ifScript: '' + elseScript: '' + + # name of script step + name: Script + + # display name of script step + displayName: If-Equal-Else Script + + # environment + env: {} + + # conditional expression for step execution + condition: '' + +steps: +- ${{ if and(ne(parameters.ifScript, ''), eq(parameters.parameter1, parameters.parameter2)) }}: + - script: ${{ parameters.ifScript }} + name: ${{ parameters.name }} + displayName: ${{ parameters.displayName }} + env: ${{ parameters.env }} + condition: ${{ parameters.condition }} + +- ${{ if and(ne(parameters.elseScript, ''), ne(parameters.parameter1, parameters.parameter2)) }}: + - script: ${{ parameters.elseScript }} + name: ${{ parameters.name }} + displayName: ${{ parameters.displayName }} + env: ${{ parameters.env }} + condition: ${{ parameters.condition }} \ No newline at end of file diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml new file mode 100644 index 0000000000..a5835c0f47 --- /dev/null +++ b/eng/common/templates/steps/send-to-helix.yml @@ -0,0 +1,81 @@ +parameters: + HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/ + HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/' + HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number + HelixTargetQueues: '' # required -- semicolon delimited list of Helix queues to test on; see https://helix.dot.net/api/2018-03-14/info/queues for a list of queues + HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group + HelixPreCommands: '' # optional -- commands to run before Helix work item execution + HelixPostCommands: '' # optional -- commands to run after Helix work item execution + WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects + WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects + WorkItemTimeout: '' # optional -- a timeout in seconds for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects + CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload + XUnitProjects: '' # optional -- semicolon delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true + XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects + XUnitRuntimeTargetFramework: '' # optional -- framework to use for the xUnit console runner + XUnitRunnerVersion: '' # optional -- version of the xUnit nuget package you wish to use on Helix; required for XUnitProjects + IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion + DotNetCliPackageType: '' # optional -- either 'sdk' or 'runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control + WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." + IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set + Creator: '' # optional -- if the build is external, use this to specify who is sending the job + condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() + continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false + +steps: + - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' + displayName: Send job to Helix (Windows) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + WorkItemTimeout: ${{ parameters.WorkItemTimeout }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + Creator: ${{ parameters.Creator }} + condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog + displayName: Send job to Helix (Unix) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + WorkItemTimeout: ${{ parameters.WorkItemTimeout }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + Creator: ${{ parameters.Creator }} + condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} diff --git a/eng/common/templates/steps/telemetry-end.yml b/eng/common/templates/steps/telemetry-end.yml new file mode 100644 index 0000000000..9b61481e7e --- /dev/null +++ b/eng/common/templates/steps/telemetry-end.yml @@ -0,0 +1,63 @@ +steps: +- bash: | + if [ "$AGENT_JOBSTATUS" = "Succeeded" ] || [ "$AGENT_JOBSTATUS" = "PartiallySucceeded" ]; then + errorCount=0 + else + errorCount=1 + fi + warningCount=0 + + # create a temporary file for curl output + res=`mktemp` + + curlResult=` + curl --verbose --output $res --write-out "%{http_code}"\ + -H 'Content-Type: application/json' \ + -H "X-Helix-Job-Token: $Helix_JobToken" \ + -H 'Content-Length: 0' \ + -X POST -G "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$Helix_WorkItemId/finish" \ + --data-urlencode "errorCount=$errorCount" \ + --data-urlencode "warningCount=$warningCount"` + curlStatus=$? + + if [ $curlStatus -eq 0 ]; then + if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then + curlStatus=$curlResult + fi + fi + + if [ $curlStatus -ne 0 ]; then + echo "Failed to Send Build Finish information" + vstsLogOutput="vso[task.logissue type=error;sourcepath=templates/steps/telemetry-end.yml;code=1;]Failed to Send Build Finish information: $curlStatus" + echo "##$vstsLogOutput" + exit 1 + fi + displayName: Send Unix Build End Telemetry + env: + # defined via VSTS variables in start-job.sh + Helix_JobToken: $(Helix_JobToken) + Helix_WorkItemId: $(Helix_WorkItemId) + condition: and(always(), ne(variables['Agent.Os'], 'Windows_NT')) +- powershell: | + if (($env:Agent_JobStatus -eq 'Succeeded') -or ($env:Agent_JobStatus -eq 'PartiallySucceeded')) { + $ErrorCount = 0 + } else { + $ErrorCount = 1 + } + $WarningCount = 0 + + try { + Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$env:Helix_WorkItemId/finish?errorCount=$ErrorCount&warningCount=$WarningCount" -Method Post -ContentType "application/json" -Body "" ` + -Headers @{ 'X-Helix-Job-Token'=$env:Helix_JobToken } + } + catch { + Write-Error $_ + Write-Error $_.Exception + exit 1 + } + displayName: Send Windows Build End Telemetry + env: + # defined via VSTS variables in start-job.ps1 + Helix_JobToken: $(Helix_JobToken) + Helix_WorkItemId: $(Helix_WorkItemId) + condition: and(always(),eq(variables['Agent.Os'], 'Windows_NT')) diff --git a/eng/common/templates/steps/telemetry-start.yml b/eng/common/templates/steps/telemetry-start.yml new file mode 100644 index 0000000000..79c128c5de --- /dev/null +++ b/eng/common/templates/steps/telemetry-start.yml @@ -0,0 +1,154 @@ +parameters: + helixSource: 'undefined_defaulted_in_telemetry.yml' + helixType: 'undefined_defaulted_in_telemetry.yml' + buildConfig: '' + runAsPublic: false + +steps: +- ${{ if and(eq(parameters.runAsPublic, 'false'), not(eq(variables['System.TeamProject'], 'public'))) }}: + - task: AzureKeyVault@1 + inputs: + azureSubscription: 'HelixProd_KeyVault' + KeyVaultName: HelixProdKV + SecretsFilter: 'HelixApiAccessToken' + condition: always() +- bash: | + # create a temporary file + jobInfo=`mktemp` + + # write job info content to temporary file + cat > $jobInfo <' | Set-Content $proj + MSBuild $proj $bl /t:__WriteToolsetLocation /noconsolelogger /p:__ToolsetLocationOutputFile=$toolsetLocationFile + + $path = Get-Content $toolsetLocationFile -TotalCount 1 + if (!(Test-Path $path)) { + throw "Invalid toolset path: $path" + } + + return $global:_ToolsetBuildProj = $path +} + +function ExitWithExitCode([int] $exitCode) { + if ($ci -and $prepareMachine) { + Stop-Processes + } + exit $exitCode +} + +function Stop-Processes() { + Write-Host "Killing running build processes..." + foreach ($processName in $processesToStopOnExit) { + Get-Process -Name $processName -ErrorAction SilentlyContinue | Stop-Process + } +} + +# +# Executes msbuild (or 'dotnet msbuild') with arguments passed to the function. +# The arguments are automatically quoted. +# Terminates the script if the build fails. +# +function MSBuild() { + if ($ci) { + if (!$binaryLog) { + throw "Binary log must be enabled in CI build." + } + + if ($nodeReuse) { + throw "Node reuse must be disabled in CI build." + } + } + + $buildTool = InitializeBuildTool + + $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse" + + if ($warnAsError) { + $cmdArgs += " /warnaserror /p:TreatWarningsAsErrors=true" + } + + foreach ($arg in $args) { + if ($arg -ne $null -and $arg.Trim() -ne "") { + $cmdArgs += " `"$arg`"" + } + } + + $exitCode = Exec-Process $buildTool.Path $cmdArgs + + if ($exitCode -ne 0) { + Write-Host "Build failed." -ForegroundColor Red + + $buildLog = GetMSBuildBinaryLogCommandLineArgument $args + if ($buildLog -ne $null) { + Write-Host "See log: $buildLog" -ForegroundColor DarkGray + } + + ExitWithExitCode $exitCode + } +} + +function GetMSBuildBinaryLogCommandLineArgument($arguments) { + foreach ($argument in $arguments) { + if ($argument -ne $null) { + $arg = $argument.Trim() + if ($arg.StartsWith("/bl:", "OrdinalIgnoreCase")) { + return $arg.Substring("/bl:".Length) + } + + if ($arg.StartsWith("/binaryLogger:", "OrdinalIgnoreCase")) { + return $arg.Substring("/binaryLogger:".Length) + } + } + } + + return $null +} + +$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..") +$EngRoot = Resolve-Path (Join-Path $PSScriptRoot "..") +$ArtifactsDir = Join-Path $RepoRoot "artifacts" +$ToolsetDir = Join-Path $ArtifactsDir "toolset" +$ToolsDir = Join-Path $RepoRoot ".tools" +$LogDir = Join-Path (Join-Path $ArtifactsDir "log") $configuration +$TempDir = Join-Path (Join-Path $ArtifactsDir "tmp") $configuration +$GlobalJson = Get-Content -Raw -Path (Join-Path $RepoRoot "global.json") | ConvertFrom-Json + +Create-Directory $ToolsetDir +Create-Directory $TempDir +Create-Directory $LogDir + +if ($ci) { + $env:TEMP = $TempDir + $env:TMP = $TempDir +} diff --git a/eng/common/tools.sh b/eng/common/tools.sh new file mode 100755 index 0000000000..8a253bef51 --- /dev/null +++ b/eng/common/tools.sh @@ -0,0 +1,319 @@ +# Initialize variables if they aren't already defined. + +# CI mode - set to true on CI server for PR validation build or official build. +ci=${ci:-false} + +# Build configuration. Common values include 'Debug' and 'Release', but the repository may use other names. +configuration=${configuration:-'Debug'} + +# Set to true to output binary log from msbuild. Note that emitting binary log slows down the build. +# Binary log must be enabled on CI. +binary_log=${binary_log:-$ci} + +# Turns on machine preparation/clean up code that changes the machine state (e.g. kills build processes). +prepare_machine=${prepare_machine:-false} + +# True to restore toolsets and dependencies. +restore=${restore:-true} + +# Adjusts msbuild verbosity level. +verbosity=${verbosity:-'minimal'} + +# Set to true to reuse msbuild nodes. Recommended to not reuse on CI. +if [[ "$ci" == true ]]; then + node_reuse=${node_reuse:-false} +else + node_reuse=${node_reuse:-true} +fi + +# Configures warning treatment in msbuild. +warn_as_error=${warn_as_error:-true} + +# True to attempt using .NET Core already that meets requirements specified in global.json +# installed on the machine instead of downloading one. +use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} + +# True to use global NuGet cache instead of restoring packages to repository-local directory. +if [[ "$ci" == true ]]; then + use_global_nuget_cache=${use_global_nuget_cache:-false} +else + use_global_nuget_cache=${use_global_nuget_cache:-true} +fi + +# Resolve any symlinks in the given path. +function ResolvePath { + local path=$1 + + while [[ -h $path ]]; do + local dir="$( cd -P "$( dirname "$path" )" && pwd )" + path="$(readlink "$path")" + + # if $path was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $path != /* ]] && path="$dir/$path" + done + + # return value + _ResolvePath="$path" +} + +# ReadVersionFromJson [json key] +function ReadGlobalVersion { + local key=$1 + + local line=`grep -m 1 "$key" "$global_json_file"` + local pattern="\"$key\" *: *\"(.*)\"" + + if [[ ! $line =~ $pattern ]]; then + echo "Error: Cannot find \"$key\" in $global_json_file" >&2 + ExitWithExitCode 1 + fi + + # return value + _ReadGlobalVersion=${BASH_REMATCH[1]} +} + +function InitializeDotNetCli { + if [[ -n "${_InitializeDotNetCli:-}" ]]; then + return + fi + + local install=$1 + + # Don't resolve runtime, shared framework, or SDK from other locations to ensure build determinism + export DOTNET_MULTILEVEL_LOOKUP=0 + + # Disable first run since we want to control all package sources + export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + + # Disable telemetry on CI + if [[ $ci == true ]]; then + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + fi + + # LTTNG is the logging infrastructure used by Core CLR. Need this variable set + # so it doesn't output warnings to the console. + export LTTNG_HOME="$HOME" + + # Source Build uses DotNetCoreSdkDir variable + if [[ -n "${DotNetCoreSdkDir:-}" ]]; then + export DOTNET_INSTALL_DIR="$DotNetCoreSdkDir" + fi + + # Find the first path on $PATH that contains the dotnet.exe + if [[ "$use_installed_dotnet_cli" == true && -z "${DOTNET_INSTALL_DIR:-}" ]]; then + local dotnet_path=`command -v dotnet` + if [[ -n "$dotnet_path" ]]; then + ResolvePath "$dotnet_path" + export DOTNET_INSTALL_DIR=`dirname "$_ResolvePath"` + fi + fi + + ReadGlobalVersion "dotnet" + local dotnet_sdk_version=$_ReadGlobalVersion + local dotnet_root="" + + # Use dotnet installation specified in DOTNET_INSTALL_DIR if it contains the required SDK version, + # otherwise install the dotnet CLI and SDK to repo local .dotnet directory to avoid potential permission issues. + if [[ -n "${DOTNET_INSTALL_DIR:-}" && -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then + dotnet_root="$DOTNET_INSTALL_DIR" + else + dotnet_root="$repo_root/.dotnet" + export DOTNET_INSTALL_DIR="$dotnet_root" + + if [[ ! -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then + if [[ "$install" == true ]]; then + InstallDotNetSdk "$dotnet_root" "$dotnet_sdk_version" + else + echo "Unable to find dotnet with SDK version '$dotnet_sdk_version'" >&2 + ExitWithExitCode 1 + fi + fi + fi + + # Add dotnet to PATH. This prevents any bare invocation of dotnet in custom + # build steps from using anything other than what we've downloaded. + export PATH="$dotnet_root:$PATH" + + if [[ $ci == true ]]; then + # Make Sure that our bootstrapped dotnet cli is avaliable in future steps of the Azure Pipelines build + echo "##vso[task.prependpath]$dotnet_root" + echo "##vso[task.setvariable variable=DOTNET_MULTILEVEL_LOOKUP]0" + echo "##vso[task.setvariable variable=DOTNET_SKIP_FIRST_TIME_EXPERIENCE]1" + fi + + # return value + _InitializeDotNetCli="$dotnet_root" +} + +function InstallDotNetSdk { + local root=$1 + local version=$2 + + GetDotNetInstallScript "$root" + local install_script=$_GetDotNetInstallScript + + bash "$install_script" --version $version --install-dir "$root" || { + local exit_code=$? + echo "Failed to install dotnet SDK (exit code '$exit_code')." >&2 + ExitWithExitCode $exit_code + } +} + +function GetDotNetInstallScript { + local root=$1 + local install_script="$root/dotnet-install.sh" + local install_script_url="https://dot.net/v1/dotnet-install.sh" + + if [[ ! -a "$install_script" ]]; then + mkdir -p "$root" + + echo "Downloading '$install_script_url'" + + # Use curl if available, otherwise use wget + if command -v curl > /dev/null; then + curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" + else + wget -q -O "$install_script" "$install_script_url" + fi + fi + + # return value + _GetDotNetInstallScript="$install_script" +} + +function InitializeBuildTool { + if [[ -n "${_InitializeBuildTool:-}" ]]; then + return + fi + + InitializeDotNetCli $restore + + # return values + _InitializeBuildTool="$_InitializeDotNetCli/dotnet" + _InitializeBuildToolCommand="msbuild" +} + +function GetNuGetPackageCachePath { + if [[ -z ${NUGET_PACKAGES:-} ]]; then + if [[ "$use_global_nuget_cache" == true ]]; then + export NUGET_PACKAGES="$HOME/.nuget/packages" + else + export NUGET_PACKAGES="$repo_root/.packages" + fi + fi + + # return value + _GetNuGetPackageCachePath=$NUGET_PACKAGES +} + +function InitializeToolset { + if [[ -n "${_InitializeToolset:-}" ]]; then + return + fi + + GetNuGetPackageCachePath + + ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk" + + local toolset_version=$_ReadGlobalVersion + local toolset_location_file="$toolset_dir/$toolset_version.txt" + + if [[ -a "$toolset_location_file" ]]; then + local path=`cat "$toolset_location_file"` + if [[ -a "$path" ]]; then + # return value + _InitializeToolset="$path" + return + fi + fi + + if [[ "$restore" != true ]]; then + echo "Toolset version $toolsetVersion has not been restored." >&2 + ExitWithExitCode 2 + fi + + local toolset_restore_log="$log_dir/ToolsetRestore.binlog" + local proj="$toolset_dir/restore.proj" + + echo '' > "$proj" + MSBuild "$proj" /t:__WriteToolsetLocation /noconsolelogger /bl:"$toolset_restore_log" /p:__ToolsetLocationOutputFile="$toolset_location_file" + + local toolset_build_proj=`cat "$toolset_location_file"` + + if [[ ! -a "$toolset_build_proj" ]]; then + echo "Invalid toolset path: $toolset_build_proj" >&2 + ExitWithExitCode 3 + fi + + # return value + _InitializeToolset="$toolset_build_proj" +} + +function ExitWithExitCode { + if [[ "$ci" == true && "$prepare_machine" == true ]]; then + StopProcesses + fi + exit $1 +} + +function StopProcesses { + echo "Killing running build processes..." + pkill -9 "dotnet" || true + pkill -9 "vbcscompiler" || true + return 0 +} + +function MSBuild { + if [[ "$ci" == true ]]; then + if [[ "$binary_log" != true ]]; then + echo "Binary log must be enabled in CI build." >&2 + ExitWithExitCode 1 + fi + + if [[ "$node_reuse" == true ]]; then + echo "Node reuse must be disabled in CI build." >&2 + ExitWithExitCode 1 + fi + fi + + InitializeBuildTool + + local warnaserror_switch="" + if [[ $warn_as_error == true ]]; then + warnaserror_switch="/warnaserror" + fi + + "$_InitializeBuildTool" "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error "$@" || { + local exit_code=$? + echo "Build failed (exit code '$exit_code')." >&2 + ExitWithExitCode $exit_code + } +} + +ResolvePath "${BASH_SOURCE[0]}" +_script_dir=`dirname "$_ResolvePath"` + +eng_root=`cd -P "$_script_dir/.." && pwd` +repo_root=`cd -P "$_script_dir/../.." && pwd` +artifacts_dir="$repo_root/artifacts" +toolset_dir="$artifacts_dir/toolset" +log_dir="$artifacts_dir/log/$configuration" +temp_dir="$artifacts_dir/tmp/$configuration" + +global_json_file="$repo_root/global.json" + +# HOME may not be defined in some scenarios, but it is required by NuGet +if [[ -z $HOME ]]; then + export HOME="$repo_root/artifacts/.home/" + mkdir -p "$HOME" +fi + +mkdir -p "$toolset_dir" +mkdir -p "$temp_dir" +mkdir -p "$log_dir" + +if [[ $ci == true ]]; then + export TEMP="$temp_dir" + export TMP="$temp_dir" +fi diff --git a/fcs/.paket/Paket.Restore.targets b/fcs/.paket/Paket.Restore.targets index e7c1bc0c83..52f41c608a 100644 --- a/fcs/.paket/Paket.Restore.targets +++ b/fcs/.paket/Paket.Restore.targets @@ -11,23 +11,49 @@ $(MSBuildThisFileDirectory)..\ $(PaketRootPath)paket-files\paket.restore.cached $(PaketRootPath)paket.lock + classic + proj + assembly + native /Library/Frameworks/Mono.framework/Commands/mono mono - - $(PaketRootPath)paket.exe - $(PaketToolsPath)paket.exe - "$(PaketExePath)" - $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" - + + $(PaketRootPath)paket.bootstrapper.exe + $(PaketToolsPath)paket.bootstrapper.exe + $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ + + + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + $(PaketToolsPath)paket.exe + $(_PaketBootStrapperExeDir)paket.exe + paket.exe + + + $(PaketRootPath)paket + $(PaketToolsPath)paket + $(PaketToolsPath)paket + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + + + $(PaketBootStrapperExeDir)paket.exe + + + paket + + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) - dotnet "$(PaketExePath)" + dotnet "$(PaketExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + "$(PaketExePath)" - - "$(PaketExePath)" - $(PaketRootPath)paket.bootstrapper.exe - $(PaketToolsPath)paket.bootstrapper.exe "$(PaketBootStrapperExePath)" $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" @@ -36,30 +62,40 @@ true true + + + True - + + + + + true - $(NoWarn);NU1603 + $(NoWarn);NU1603;NU1604;NU1605;NU1608 - /usr/bin/shasum $(PaketRestoreCacheFile) | /usr/bin/awk '{ print $1 }' - /usr/bin/shasum $(PaketLockFilePath) | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketRestoreCacheFile)" | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketLockFilePath)" | /usr/bin/awk '{ print $1 }' - + - + + + + $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) @@ -69,11 +105,26 @@ true + + + true + + - + + + + + + + + $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached @@ -82,7 +133,9 @@ $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references $(MSBuildProjectDirectory)\paket.references - $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).paket.resolved + + false + true true references-file-or-cache-not-found @@ -101,32 +154,43 @@ - + true - target-framework '$(TargetFramework)' + target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) - + + - + + false + true + + - + - + + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) %(PaketReferencesFileLinesInfo.PackageVersion) - All + All + runtime + runtime + true + true @@ -158,19 +222,27 @@ false + $(MSBuildVersion) + 15.8.0 <_NuspecFilesNewLocation Include="$(BaseIntermediateOutputPath)$(Configuration)\*.nuspec"/> + + $(MSBuildProjectDirectory)/$(MSBuildProjectFile) true - false - true + false + true + false + true + false + true $(BaseIntermediateOutputPath)$(Configuration) $(BaseIntermediateOutputPath) @@ -183,11 +255,54 @@ - - + - + + - + + $(UserProfile)\.nuget\packages\ + $(HOME)/.nuget/packages/ + $(NuGetPackageRoot)\ + $(NuGetPackageRoot)/ + $(MSBuildThisFileDirectory)..\artifacts + $(ArtifactsDir)\bin + $(ArtifactsDir)\obj + $(ArtifactsBinDir)\fcs + $(ArtifactsObjDir)\fcs + + + + + $(ArtifactsBinDir)\FSharp.Build\Proto\net46 + + + + $(ProtoOutputPath)\Microsoft.FSharp.Targets + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets + $(ProtoOutputPath)\Microsoft.FSharp.Overrides.NetSdk.targets + + diff --git a/fcs/Directory.Build.targets b/fcs/Directory.Build.targets new file mode 100644 index 0000000000..bb5b23d29d --- /dev/null +++ b/fcs/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj index deb3f51b69..9d3e20e80c 100644 --- a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj +++ b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj @@ -7,7 +7,6 @@ net45 true - ..\..\$(Configuration.ToLower())\fcs $(DefineConstants);CROSS_PLATFORM_COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT @@ -29,7 +28,7 @@ - + $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Framework.dll @@ -51,18 +50,8 @@ $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Tasks.v12.0.dll false - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Portable.FSharp.Core.$(FSharpCoreFrozenPortablePackageVersion)\lib\profiles\net40\FSharp.Core.dll - false - - - FSharp.Compiler.Service - {2e4d67b4-522d-4cf7-97e4-ba940f0b18f3} - True - \ No newline at end of file diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj index ff23a6589c..5b8efa504d 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj @@ -1,13 +1,9 @@  - - $(MSBuildProjectDirectory)\..\..\src - net45 true - ..\..\$(Configuration.ToLower())\fcs Legacy project file cracker for the F# compiler service. @@ -25,13 +21,13 @@ - - + + - + \ No newline at end of file diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj index f6ff4d1bea..2e5ae3075f 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj @@ -14,7 +14,6 @@ $(OtherFlags) --staticlink:FSharp.Core true false - ..\..\$(Configuration.ToLower())\fcs @@ -25,11 +24,7 @@ - - $(FSharpSourcesRoot)\..\packages\Microsoft.Portable.FSharp.Core.$(FSharpCoreFrozenPortablePackageVersion)\lib\profiles\net40\FSharp.Core.dll - false - - + $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Framework.dll false diff --git a/fcs/FSharp.Compiler.Service.Tests/App.config b/fcs/FSharp.Compiler.Service.Tests/App.config index ddb73d1dd9..380c93a453 100644 --- a/fcs/FSharp.Compiler.Service.Tests/App.config +++ b/fcs/FSharp.Compiler.Service.Tests/App.config @@ -3,6 +3,10 @@ + + + + diff --git a/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj b/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj index 49585864e4..fc00709da4 100644 --- a/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj +++ b/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj @@ -3,6 +3,7 @@ net45;netstandard2.0 false + $(NoWarn);0067;1591 diff --git a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj index 7ea85c202a..010e69b95a 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -69,17 +69,23 @@ TokenizerTests.fs + + ServiceUntypedParseTests.fs + + + TreeVisitorTests.fs + Program.fs - + - + diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index a642413653..bfd4295003 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -1,23 +1,23 @@ - + $(MSBuildProjectDirectory)\..\..\src - + + net45;netstandard2.0 true $(DefineConstants);COMPILER_SERVICE_AS_DLL $(DefineConstants);COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT $(DefineConstants);NO_STRONG_NAMES - ..\..\$(Configuration.ToLower())\fcs $(TargetFramework)\ $(TargetFramework)\ $(OtherFlags) /warnon:1182 $(OtherFlags) --times - $(NoWarn);44;62;69;65;54;61;75;62;9;2003; - true + $(NoWarn);44;62;69;65;54;61;75;62;9;2003;NU5125 + true true true @@ -46,12 +46,12 @@ AssemblyInfo/AssemblyInfo.fs - + FSComp.txt - - + + FSIstrings.txt - + FSStrings.resx FSStrings.resources @@ -635,11 +635,12 @@ - + + @@ -655,7 +656,5 @@ $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - + \ No newline at end of file diff --git a/fcs/build.cmd b/fcs/build.cmd index 0289b3c480..16bbb2924b 100644 --- a/fcs/build.cmd +++ b/fcs/build.cmd @@ -18,6 +18,9 @@ if errorlevel 1 ( exit /b %errorlevel% ) +:: don't care if this fails +dotnet build-server shutdown >NUL 2>&1 + packages\FAKE\tools\FAKE.exe build.fsx %* if errorlevel 1 ( endlocal diff --git a/fcs/build.fsx b/fcs/build.fsx index a11ed814af..fc163b67f7 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -13,15 +13,15 @@ open Fake.ReleaseNotesHelper #if MONO // prevent incorrect output encoding (e.g. https://github.com/fsharp/FAKE/issues/1196) System.Console.OutputEncoding <- System.Text.Encoding.UTF8 -CleanDir (__SOURCE_DIRECTORY__ + "/../tests/TestResults") -File.WriteAllText(__SOURCE_DIRECTORY__ + "/../tests/TestResults/notestsyet.txt","No tests yet") +CleanDir (__SOURCE_DIRECTORY__ + "/../artifacts/TestResults") +File.WriteAllText(__SOURCE_DIRECTORY__ + "/../artifacts/TestResults/notestsyet.txt","No tests yet") let isMono = true #else let isMono = false #endif -let dotnetExePath = DotNetCli.InstallDotNetSDK "2.1.201" +let dotnetExePath = DotNetCli.InstallDotNetSDK "2.1.403" let runDotnet workingDir args = let result = @@ -51,7 +51,7 @@ let runCmdIn workDir (exe:string) = Printf.ksprintf (fun (args:string) -> // The rest of the code is standard F# build script // -------------------------------------------------------------------------------------- -let releaseDir = Path.Combine(__SOURCE_DIRECTORY__, "../release/fcs") +let releaseDir = Path.Combine(__SOURCE_DIRECTORY__, "../artifacts/bin/fcs") // Read release notes & version info from RELEASE_NOTES.md let release = LoadReleaseNotes (__SOURCE_DIRECTORY__ + "/RELEASE_NOTES.md") @@ -72,15 +72,8 @@ Target "Clean" (fun _ -> Target "Restore" (fun _ -> // We assume a paket restore has already been run + runDotnet __SOURCE_DIRECTORY__ "restore ../src/buildtools/buildtools.proj -v n" runDotnet __SOURCE_DIRECTORY__ "restore FSharp.Compiler.Service.sln -v n" - for p in [ "../packages.config" ] do - let rec executeProcess count = - let result = ExecProcess (fun info -> - info.FileName <- FullName @"./../.nuget/NuGet.exe" - info.WorkingDirectory <- FullName @"./.." - info.Arguments <- sprintf "restore %s -PackagesDirectory \"%s\" -ConfigFile \"%s\"" (FullName p) (FullName "./../packages") (FullName "./../NuGet.Config")) TimeSpan.MaxValue - if result <> 0 && count > 1 then executeProcess (count - 1) else result - (executeProcess 5) |> assertExitCodeZero ) Target "BuildVersion" (fun _ -> @@ -88,7 +81,8 @@ Target "BuildVersion" (fun _ -> ) Target "Build" (fun _ -> - runDotnet __SOURCE_DIRECTORY__ "build FSharp.Compiler.Service.sln -v n -c Release" + runDotnet __SOURCE_DIRECTORY__ "build ../src/buildtools/buildtools.proj -v n -c Proto" + runDotnet __SOURCE_DIRECTORY__ "build FSharp.Compiler.Service.sln -v n -c release" ) Target "Test" (fun _ -> @@ -97,11 +91,11 @@ Target "Test" (fun _ -> runDotnet __SOURCE_DIRECTORY__ "build ../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n" // Now run the tests - runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj -v n -c Release" + runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --no-restore --no-build -v n -c release" ) Target "NuGet" (fun _ -> - runDotnet __SOURCE_DIRECTORY__ "pack FSharp.Compiler.Service.sln -v n -c Release" + runDotnet __SOURCE_DIRECTORY__ "pack FSharp.Compiler.Service.sln -v n -c release" ) Target "GenerateDocsEn" (fun _ -> diff --git a/fcs/docsrc/content/ja/symbols.fsx b/fcs/docsrc/content/ja/symbols.fsx index 2e3f53bdba..d6abee1233 100644 --- a/fcs/docsrc/content/ja/symbols.fsx +++ b/fcs/docsrc/content/ja/symbols.fsx @@ -175,8 +175,8 @@ argTy1c.TypeDefinition.CompiledName // "Int32" *) let projectContext = checkFileResults.ProjectContext -for ass in projectContext.GetReferencedAssemblies() do - match ass.FileName with +for assembly in projectContext.GetReferencedAssemblies() do + match assembly.FileName with | None -> printfn "コンパイル時にファイルの存在しないアセンブリを参照しました" | Some s -> printfn "コンパイル時にアセンブリ '%s' を参照しました" s diff --git a/fcs/docsrc/content/ja/tokenizer.fsx b/fcs/docsrc/content/ja/tokenizer.fsx index 589061e0b0..cf5117bfbd 100644 --- a/fcs/docsrc/content/ja/tokenizer.fsx +++ b/fcs/docsrc/content/ja/tokenizer.fsx @@ -73,7 +73,7 @@ let rec tokenizeLine (tokenizer:FSharpLineTokenizer) state = 必要となるような新しい状態を返します。 初期値としては `0L` を指定します: *) -tokenizeLine tokenizer 0L +tokenizeLine tokenizer FSharpTokenizerLexState.Initial (** この結果は LET WHITESPACE IDENT EQUALS INT32 という トークン名のシーケンスになります。 diff --git a/fcs/docsrc/content/symbols.fsx b/fcs/docsrc/content/symbols.fsx index fb6275fd37..ac38053a1b 100644 --- a/fcs/docsrc/content/symbols.fsx +++ b/fcs/docsrc/content/symbols.fsx @@ -168,8 +168,8 @@ used in the compilation, called the `ProjectContext`: *) let projectContext = checkFileResults.ProjectContext -for ass in projectContext.GetReferencedAssemblies() do - match ass.FileName with +for assembly in projectContext.GetReferencedAssemblies() do + match assembly.FileName with | None -> printfn "compilation referenced an assembly without a file" | Some s -> printfn "compilation references assembly '%s'" s diff --git a/fcs/docsrc/content/tokenizer.fsx b/fcs/docsrc/content/tokenizer.fsx index 09d842ba8a..9ac3d6f34d 100644 --- a/fcs/docsrc/content/tokenizer.fsx +++ b/fcs/docsrc/content/tokenizer.fsx @@ -65,7 +65,7 @@ let rec tokenizeLine (tokenizer:FSharpLineTokenizer) state = The function returns the new state, which is needed if you need to tokenize multiple lines and an earlier line ends with a multi-line comment. As an initial state, we can use `0L`: *) -tokenizeLine tokenizer 0L +tokenizeLine tokenizer FSharpTokenizerLexState.Initial (** The result is a sequence of tokens with names LET, WHITESPACE, IDENT, EQUALS and INT32. There is a number of interesting properties on `FSharpTokenInfo` including: diff --git a/fcs/fcs.props b/fcs/fcs.props index b698937373..3f6246ff7d 100644 --- a/fcs/fcs.props +++ b/fcs/fcs.props @@ -8,7 +8,7 @@ false - $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools - fsi.exe + $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools + fsi.exe \ No newline at end of file diff --git a/fcs/samples/EditorService/EditorService.fsproj b/fcs/samples/EditorService/EditorService.fsproj index 05847e67f9..447906070f 100644 --- a/fcs/samples/EditorService/EditorService.fsproj +++ b/fcs/samples/EditorService/EditorService.fsproj @@ -12,7 +12,7 @@ - + diff --git a/fcs/samples/FscExe/FscExe.fsproj b/fcs/samples/FscExe/FscExe.fsproj index c482656827..b2b146913a 100644 --- a/fcs/samples/FscExe/FscExe.fsproj +++ b/fcs/samples/FscExe/FscExe.fsproj @@ -14,7 +14,7 @@ - + diff --git a/fcs/samples/FsiExe/FsiExe.fsproj b/fcs/samples/FsiExe/FsiExe.fsproj index 7377f2c291..aae2ba0318 100644 --- a/fcs/samples/FsiExe/FsiExe.fsproj +++ b/fcs/samples/FsiExe/FsiExe.fsproj @@ -16,7 +16,7 @@ - + diff --git a/fcs/samples/InteractiveService/InteractiveService.fsproj b/fcs/samples/InteractiveService/InteractiveService.fsproj index 7aa4249726..387439fcfd 100644 --- a/fcs/samples/InteractiveService/InteractiveService.fsproj +++ b/fcs/samples/InteractiveService/InteractiveService.fsproj @@ -12,7 +12,7 @@ - + diff --git a/fcs/samples/Tokenizer/Program.fs b/fcs/samples/Tokenizer/Program.fs index 402fcc3029..9cc79e699f 100644 --- a/fcs/samples/Tokenizer/Program.fs +++ b/fcs/samples/Tokenizer/Program.fs @@ -3,7 +3,7 @@ let sourceTok = FSharpSourceTokenizer([], Some "C:\\test.fsx") let tokenizeLines (lines:string[]) = - [ let state = ref 0L + [ let state = ref FSharpTokenizerLexState.Initial for n, line in lines |> Seq.zip [ 0 .. lines.Length ] do let tokenizer = sourceTok.CreateLineTokenizer(line) let rec parseLine() = seq { diff --git a/fcs/samples/Tokenizer/Tokenizer.fsproj b/fcs/samples/Tokenizer/Tokenizer.fsproj index 7aa4249726..387439fcfd 100644 --- a/fcs/samples/Tokenizer/Tokenizer.fsproj +++ b/fcs/samples/Tokenizer/Tokenizer.fsproj @@ -12,7 +12,7 @@ - + diff --git a/fcs/samples/UntypedTree/UntypedTree.fsproj b/fcs/samples/UntypedTree/UntypedTree.fsproj index 7aa4249726..387439fcfd 100644 --- a/fcs/samples/UntypedTree/UntypedTree.fsproj +++ b/fcs/samples/UntypedTree/UntypedTree.fsproj @@ -12,7 +12,7 @@ - + diff --git a/fsharp.proj b/fsharp.proj new file mode 100644 index 0000000000..92b37d547e --- /dev/null +++ b/fsharp.proj @@ -0,0 +1,170 @@ + + + + Debug + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + + + + true + false + false + false + false + + false + false + false + false + false + + + + + true + true + true + true + true + true + + true + true + true + true + true + true + true + + + + + true + true + + + + + + + + TargetFramework=netstandard1.6 + TargetFramework=net45 + + + TargetFramework=netstandard2.0 + TargetFramework=net46 + + + TargetFramework=netstandard1.6 + TargetFramework=net46 + + + TargetFramework=net46 + + + TargetFramework=netstandard1.6 + TargetFramework=net46 + + + TargetFramework=netcoreapp2.1 + TargetFramework=net46 + + + TargetFramework=netcoreapp2.1 + TargetFramework=net46 + + + TargetFramework=net46 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_RunningRestore>true + + + + + + + + + + + + + + + + + + + + + diff --git a/global.json b/global.json new file mode 100644 index 0000000000..ac6900880b --- /dev/null +++ b/global.json @@ -0,0 +1,9 @@ +{ + "tools": { + "dotnet": "2.1.500" + }, + "msbuild-sdks": { + "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19069.2", + "Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19069.2" + } +} diff --git a/mono/cibuild.sh b/mono/cibuild.sh index e91b33e783..9a5ea5af57 100755 --- a/mono/cibuild.sh +++ b/mono/cibuild.sh @@ -1,7 +1,7 @@ #!/bin/bash # note: expects to run from top directory -./mono/latest-mono-stable.sh +#./mono/latest-mono-stable.sh make Configuration=$@ #sudo make install Configuration=$@ #./mono/test-mono.sh \ No newline at end of file diff --git a/packages.config b/packages.config index 25a939155f..709d225851 100644 --- a/packages.config +++ b/packages.config @@ -1,62 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/proto.proj b/proto.proj new file mode 100644 index 0000000000..0974580af5 --- /dev/null +++ b/proto.proj @@ -0,0 +1,36 @@ + + + + Proto + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + + + + + TargetFramework=net46 + TargetFramework=netcoreapp2.1 + + + TargetFramework=net46 + TargetFramework=netcoreapp2.1 + + + + + + + + + + + + + + + + + + + + diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000000..bb8eac309b --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets new file mode 100644 index 0000000000..ccd47cc0a9 --- /dev/null +++ b/src/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/src/absil/il.fs b/src/absil/il.fs index c2314418fe..61c5a33a84 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -154,12 +154,11 @@ let unsplitTypeName (ns, n) = | [] -> String.concat "." ns + "." + n | _ -> n -let splitTypeNameRightAux nm = - if String.contains nm '.' then - let idx = String.rindex nm '.' - let s1, s2 = splitNameAt nm idx - Some s1, s2 - else None, nm +let splitTypeNameRightAux (nm:string) = + let idx = nm.LastIndexOf '.' + if idx = -1 then None, nm else + let s1, s2 = splitNameAt nm idx + Some s1, s2 let splitTypeNameRight nm = memoizeNamespaceRightTable.GetOrAdd(nm, splitTypeNameRightAux) @@ -310,8 +309,12 @@ module SHA1 = let (_h0, _h1, _h2, h3, h4) = sha1Hash { stream = s; pos = 0; eof = false } // the result of the SHA algorithm is stored in registers 3 and 4 Array.map byte [| b0 h4; b1 h4; b2 h4; b3 h4; b0 h3; b1 h3; b2 h3; b3 h3; |] + let sha1HashInt64 s = + let (_h0,_h1,_h2,h3,h4) = sha1Hash { stream = s; pos = 0; eof = false } // the result of the SHA algorithm is stored in registers 3 and 4 + (int64 h3 <<< 32) ||| int64 h4 let sha1HashBytes s = SHA1.sha1HashBytes s +let sha1HashInt64 s = SHA1.sha1HashInt64 s // -------------------------------------------------------------------- // @@ -947,11 +950,25 @@ type ILAttribElem = type ILAttributeNamedArg = (string * ILType * bool * ILAttribElem) -[] -type ILAttribute = - { Method: ILMethodSpec - Data: byte[] - Elements: ILAttribElem list } +[] +type ILAttribute = + | Encoded of method: ILMethodSpec * data: byte[] * elements: ILAttribElem list + | Decoded of method: ILMethodSpec * fixedArgs: ILAttribElem list * namedArgs: ILAttributeNamedArg list + + member x.Method = + match x with + | Encoded (method, _, _) + | Decoded (method, _, _) -> method + + member x.Elements = + match x with + | Encoded (_, _, elements) -> elements + | Decoded (_, fixedArgs, namedArgs) -> fixedArgs @ (namedArgs |> List.map (fun (_, _, _, e) -> e)) + + member x.WithMethod(method: ILMethodSpec) = + match x with + | Encoded (_, data, elements) -> Encoded (method, data, elements) + | Decoded (_, fixedArgs, namedArgs) -> Decoded (method, fixedArgs, namedArgs) /// For debugging [] @@ -2313,7 +2330,7 @@ let mkILNonGenericValueTy tref = mkILNamedTy AsValue tref [] let mkILNonGenericBoxedTy tref = mkILNamedTy AsObject tref [] -let mkSimpleAssRef n = +let mkSimpleAssemblyRef n = ILAssemblyRef.Create(n, None, None, false, None, None) let mkSimpleModRef n = @@ -3174,9 +3191,9 @@ let destTypeDefsWithGlobalFunctionsFirst ilg (tdefs: ILTypeDefs) = let top2 = if isNil top then [ mkILTypeDefForGlobalFunctions ilg (emptyILMethods, emptyILFields) ] else top top2@nontop -let mkILSimpleModule assname modname dll subsystemVersion useHighEntropyVA tdefs hashalg locale flags exportedTypes metadataVersion = +let mkILSimpleModule assemblyName modname dll subsystemVersion useHighEntropyVA tdefs hashalg locale flags exportedTypes metadataVersion = let manifest = - { Name=assname + { Name=assemblyName AuxModuleHashAlgorithm= match hashalg with | Some(alg) -> alg | _ -> 0x8004 // SHA1 SecurityDeclsStored=emptyILSecurityDeclsStored PublicKey= None @@ -3572,21 +3589,30 @@ let encodeCustomAttrNamedArg ilg (nm, ty, prop, elem) = yield! encodeCustomAttrString nm yield! encodeCustomAttrValue ilg ty elem |] -let mkILCustomAttribMethRef (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = +let encodeCustomAttrArgs (ilg: ILGlobals) (mspec:ILMethodSpec) (fixedArgs: list<_>) (namedArgs: list<_>) = let argtys = mspec.MethodRef.ArgTypes - let args = - [| yield! [| 0x01uy; 0x00uy; |] - for (argty, fixedArg) in Seq.zip argtys fixedArgs do - yield! encodeCustomAttrValue ilg argty fixedArg - yield! u16AsBytes (uint16 namedArgs.Length) - for namedArg in namedArgs do - yield! encodeCustomAttrNamedArg ilg namedArg |] - { Method = mspec - Data = args - Elements = fixedArgs @ (namedArgs |> List.map(fun (_, _, _, e) -> e)) } - -let mkILCustomAttribute ilg (tref, argtys, argvs, propvs) = - mkILCustomAttribMethRef ilg (mkILNonGenericCtorMethSpec (tref, argtys), argvs, propvs) + [| yield! [| 0x01uy; 0x00uy; |] + for (argty, fixedArg) in Seq.zip argtys fixedArgs do + yield! encodeCustomAttrValue ilg argty fixedArg + yield! u16AsBytes (uint16 namedArgs.Length) + for namedArg in namedArgs do + yield! encodeCustomAttrNamedArg ilg namedArg |] + +let encodeCustomAttr (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = + let args = encodeCustomAttrArgs ilg mspec fixedArgs namedArgs + ILAttribute.Encoded (mspec, args, fixedArgs @ (namedArgs |> List.map (fun (_, _, _, e) -> e))) + +let mkILCustomAttribMethRef (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = + encodeCustomAttr ilg (mspec, fixedArgs, namedArgs) + +let mkILCustomAttribute ilg (tref, argtys, argvs, propvs) = + encodeCustomAttr ilg (mkILNonGenericCtorMethSpec (tref, argtys), argvs, propvs) + +let getCustomAttrData (ilg: ILGlobals) cattr = + match cattr with + | ILAttribute.Encoded (_, data, _) -> data + | ILAttribute.Decoded (mspec, fixedArgs, namedArgs) -> + encodeCustomAttrArgs ilg mspec fixedArgs namedArgs let MscorlibScopeRef = ILScopeRef.Assembly (ILAssemblyRef.Create("mscorlib", None, Some ecmaPublicKey, true, None, None)) let EcmaMscorlibILGlobals = mkILGlobals MscorlibScopeRef @@ -3755,7 +3781,10 @@ type ILTypeSigParser(tstring : string) = ILAttribElem.Type(Some(ilty)) let decodeILAttribData (ilg: ILGlobals) (ca: ILAttribute) = - let bytes = ca.Data + match ca with + | ILAttribute.Decoded (_, fixedArgs, namedArgs) -> fixedArgs, namedArgs + | ILAttribute.Encoded (_, bytes, _) -> + let sigptr = 0 let bb0, sigptr = sigptr_get_byte bytes sigptr let bb1, sigptr = sigptr_get_byte bytes sigptr @@ -3892,13 +3921,13 @@ let emptyILRefs = ModuleReferences = [] } (* Now find references. *) -let refs_of_assref (s:ILReferencesAccumulator) x = s.refsA.Add x |> ignore +let refs_of_assemblyRef (s:ILReferencesAccumulator) x = s.refsA.Add x |> ignore let refs_of_modref (s:ILReferencesAccumulator) x = s.refsM.Add x |> ignore let refs_of_scoref s x = match x with | ILScopeRef.Local -> () - | ILScopeRef.Assembly assref -> refs_of_assref s assref + | ILScopeRef.Assembly assemblyRef -> refs_of_assemblyRef s assemblyRef | ILScopeRef.Module modref -> refs_of_modref s modref let refs_of_tref s (x:ILTypeRef) = refs_of_scoref s x.Scope @@ -3944,9 +3973,9 @@ and refs_of_token s x = | ILToken.ILMethod mr -> refs_of_mspec s mr | ILToken.ILField fr -> refs_of_fspec s fr -and refs_of_custom_attr s x = refs_of_mspec s x.Method +and refs_of_custom_attr s (cattr: ILAttribute) = refs_of_mspec s cattr.Method -and refs_of_custom_attrs s (cas : ILAttributes) = List.iter (refs_of_custom_attr s) cas.AsList +and refs_of_custom_attrs s (cas : ILAttributes) = Array.iter (refs_of_custom_attr s) cas.AsArray and refs_of_varargs s tyso = Option.iter (refs_of_tys s) tyso and refs_of_instr s x = match x with @@ -4070,7 +4099,7 @@ and refs_of_resource_where s x = | ILResourceLocation.LocalIn _ -> () | ILResourceLocation.LocalOut _ -> () | ILResourceLocation.File (mref, _) -> refs_of_modref s mref - | ILResourceLocation.Assembly aref -> refs_of_assref s aref + | ILResourceLocation.Assembly aref -> refs_of_assemblyRef s aref and refs_of_resource s x = refs_of_resource_where s x.Location @@ -4189,23 +4218,6 @@ let resolveILMethodRef td mref = resolveILMethodRefWithRescope id td mref let mkRefToILModule m = ILModuleRef.Create(m.Name, true, None) - -let ungenericizeTypeName n = - let sym = '`' - if - String.contains n sym && - (* check what comes after the symbol is a number *) - (let m = String.rindex n sym - let res = ref (m < n.Length - 1) - for i = m + 1 to n.Length - 1 do - res := !res && n.[i] >= '0' && n.[i] <= '9' - !res) - then - let pos = String.rindex n sym - String.sub n 0 pos - else n - - type ILEventRef = { erA: ILTypeRef; erB: string } static member Create(a, b) = {erA=a;erB=b} diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 6ed4d42aa3..668459088f 100755 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -752,12 +752,22 @@ type ILAttribElem = /// Named args: values and flags indicating if they are fields or properties. type ILAttributeNamedArg = string * ILType * bool * ILAttribElem -/// Custom attributes. See 'decodeILAttribData' for a helper to parse the byte[] -/// to ILAttribElem's as best as possible. +/// Custom attribute. type ILAttribute = - { Method: ILMethodSpec - Data: byte[] - Elements: ILAttribElem list} + /// Attribute with args encoded to a binary blob according to ECMA-335 II.21 and II.23.3. + /// 'decodeILAttribData' is used to parse the byte[] blob to ILAttribElem's as best as possible. + | Encoded of method: ILMethodSpec * data: byte[] * elements: ILAttribElem list + + /// Attribute with args in decoded form. + | Decoded of method: ILMethodSpec * fixedArgs: ILAttribElem list * namedArgs: ILAttributeNamedArg list + + /// Attribute instance constructor. + member Method: ILMethodSpec + + /// Decoded arguments. May be empty in encoded attribute form. + member Elements: ILAttribElem list + + member WithMethod: method: ILMethodSpec -> ILAttribute [] type ILAttributes = @@ -1540,9 +1550,6 @@ val typeNameForGlobalFunctions: string val isTypeNameForGlobalFunctions: string -> bool -val ungenericizeTypeName: string -> string (* e.g. List`1 --> List *) - - // ==================================================================== // PART 2 // @@ -1598,7 +1605,7 @@ val decodeILAttribData: ILAttributeNamedArg list (* named args: values and flags indicating if they are fields or properties *) /// Generate simple references to assemblies and modules. -val mkSimpleAssRef: string -> ILAssemblyRef +val mkSimpleAssemblyRef: string -> ILAssemblyRef val mkSimpleModRef: string -> ILModuleRef @@ -1682,6 +1689,8 @@ val mkILCustomAttribute: ILAttributeNamedArg list (* named args: values and flags indicating if they are fields or properties *) -> ILAttribute +val getCustomAttrData: ILGlobals -> ILAttribute -> byte[] + val mkPermissionSet: ILGlobals -> ILSecurityAction * (ILTypeRef * (string * ILType * ILAttribElem) list) list -> ILSecurityDecl /// Making code. @@ -1946,6 +1955,7 @@ val isILTypedReferenceTy: ILType -> bool val isILDoubleTy: ILType -> bool val isILSingleTy: ILType -> bool +val sha1HashInt64 : byte[] -> int64 /// Get a public key token from a public key. val sha1HashBytes: byte[] -> byte[] (* SHA1 hash *) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index b2fd979a55..4426160638 100755 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -41,6 +41,10 @@ let inline isNonNull x = not (isNull x) let inline nonNull msg x = if isNull x then failwith ("null: " + msg) else x let inline (===) x y = LanguagePrimitives.PhysicalEquality x y +/// Per the docs the threshold for the Large Object Heap is 85000 bytes: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/large-object-heap#how-an-object-ends-up-on-the-large-object-heap-and-how-gc-handles-them +/// We set the limit to slightly under that to allow for some 'slop' +let LOH_SIZE_THRESHOLD_BYTES = 84_900 + //--------------------------------------------------------------------- // Library: ReportTime //--------------------------------------------------------------------- @@ -91,7 +95,7 @@ module Order = let toFunction (pxOrder: IComparer<'U>) x y = pxOrder.Compare(x,y) //------------------------------------------------------------------------- -// Library: arrays,lists,options +// Library: arrays,lists,options,resizearrays //------------------------------------------------------------------------- module Array = @@ -432,18 +436,57 @@ module List = let existsSquared f xss = xss |> List.exists (fun xs -> xs |> List.exists (fun x -> f x)) let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i,j,x))) -[] -type ValueOption<'T> = - | ValueSome of 'T - | ValueNone - member x.IsSome = match x with ValueSome _ -> true | ValueNone -> false - member x.IsNone = match x with ValueSome _ -> false | ValueNone -> true - member x.Value = match x with ValueSome r -> r | ValueNone -> failwith "ValueOption.Value: value is None" +module ResizeArray = -[] -module ValueOption = + /// Split a ResizeArray into an array of smaller chunks. + /// This requires `items/chunkSize` Array copies of length `chunkSize` if `items/chunkSize % 0 = 0`, + /// otherwise `items/chunkSize + 1` Array copies. + let chunkBySize chunkSize f (items: ResizeArray<'t>) = + // we could use Seq.chunkBySize here, but that would involve many enumerator.MoveNext() calls that we can sidestep with a bit of math + let itemCount = items.Count + if itemCount = 0 + then [||] + else + let chunksCount = + match itemCount / chunkSize with + | n when itemCount % chunkSize = 0 -> n + | n -> n + 1 // any remainder means we need an additional chunk to store it + + [| for index in 0..chunksCount-1 do + let startIndex = index * chunkSize + let takeCount = min (itemCount - startIndex) chunkSize + + let holder = Array.zeroCreate takeCount + // we take a bounds-check hit here on each access. + // other alternatives here include + // * iterating across an IEnumerator (incurs MoveNext penalty) + // * doing a block copy using `List.CopyTo(index, array, index, count)` (requires more copies to do the mapping) + // none are significantly better. + for i in 0 .. takeCount - 1 do + holder.[i] <- f items.[i] + yield holder |] + + /// Split a large ResizeArray into a series of array chunks that are each under the Large Object Heap limit. + /// This is done to help prevent a stop-the-world collection of the single large array, instead allowing for a greater + /// probability of smaller collections. Stop-the-world is still possible, just less likely. + let mapToSmallArrayChunks f (inp: ResizeArray<'t>) = + let itemSizeBytes = sizeof<'t> + // rounding down here is good because it ensures we don't go over + let maxArrayItemCount = LOH_SIZE_THRESHOLD_BYTES / itemSizeBytes + + /// chunk the provided input into arrays that are smaller than the LOH limit + /// in order to prevent long-term storage of those values + chunkBySize maxArrayItemCount f inp + + +/// Because FSharp.Compiler.Service is a library that will target FSharp.Core 4.5.2 for the forseeable future, +/// we need to stick these functions in this module rather than using the module functions for ValueOption +/// that come after FSharp.Core 4.5.2. +module ValueOptionInternal = let inline ofOption x = match x with Some x -> ValueSome x | None -> ValueNone let inline bind f x = match x with ValueSome x -> f x | ValueNone -> ValueNone + let inline isSome x = match x with ValueSome _ -> true | ValueNone -> false + let inline isNone x = match x with ValueSome _ -> false | ValueNone -> true type String with member inline x.StartsWithOrdinal(value) = @@ -452,25 +495,14 @@ type String with member inline x.EndsWithOrdinal(value) = x.EndsWith(value, StringComparison.Ordinal) -module String = - let indexNotFound() = raise (new KeyNotFoundException("An index for the character was not found in the string")) - +module String = let make (n: int) (c: char) : string = new String(c, n) let get (str:string) i = str.[i] let sub (s:string) (start:int) (len:int) = s.Substring(start,len) - let index (s:string) (c:char) = - let r = s.IndexOf(c) - if r = -1 then indexNotFound() else r - - let rindex (s:string) (c:char) = - let r = s.LastIndexOf(c) - if r = -1 then indexNotFound() else r - - let contains (s:string) (c:char) = - s.IndexOf(c,0,String.length s) <> -1 + let contains (s:string) (c:char) = s.IndexOf(c) <> -1 let order = LanguagePrimitives.FastGenericComparer @@ -1134,7 +1166,7 @@ module NameMap = [] module NameMultiMap = let existsInRange f (m: NameMultiMap<'T>) = NameMap.exists (fun _ l -> List.exists f l) m - let find v (m: NameMultiMap<'T>) = match Map.tryFind v m with None -> [] | Some r -> r + let find v (m: NameMultiMap<'T>) = match m.TryGetValue v with true, r -> r | _ -> [] let add v x (m: NameMultiMap<'T>) = NameMap.add v (x :: find v m) m let range (m: NameMultiMap<'T>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] let rangeReversingEachBucket (m: NameMultiMap<'T>) = Map.foldBack (fun _ x sofar -> List.rev x @ sofar) m [] @@ -1148,7 +1180,7 @@ module NameMultiMap = [] module MultiMap = let existsInRange f (m: MultiMap<_,_>) = Map.exists (fun _ l -> List.exists f l) m - let find v (m: MultiMap<_,_>) = match Map.tryFind v m with None -> [] | Some r -> r + let find v (m: MultiMap<_,_>) = match m.TryGetValue v with true, r -> r | _ -> [] let add v x (m: MultiMap<_,_>) = Map.add v (x :: find v m) m let range (m: MultiMap<_,_>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] let empty : MultiMap<_,_> = Map.empty @@ -1159,11 +1191,6 @@ type LayeredMap<'Key,'Value when 'Key : comparison> = Map<'Key,'Value> type Map<'Key,'Value when 'Key : comparison> with static member Empty : Map<'Key,'Value> = Map.empty - member m.TryGetValue (key,res:byref<'Value>) = - match m.TryFind key with - | None -> false - | Some r -> res <- r; true - member x.Values = [ for (KeyValue(_,v)) in x -> v ] member x.AddAndMarkAsCollapsible (kvs: _[]) = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) member x.LinearTryModifyThenLaterFlatten (key, f: 'Value option -> 'Value) = x.Add (key, f (x.TryFind key)) @@ -1173,12 +1200,13 @@ type Map<'Key,'Value when 'Key : comparison> with [] type LayeredMultiMap<'Key,'Value when 'Key : equality and 'Key : comparison>(contents : LayeredMap<'Key,'Value list>) = member x.Add (k,v) = LayeredMultiMap(contents.Add(k,v :: x.[k])) - member x.Item with get k = match contents.TryFind k with None -> [] | Some l -> l + member x.Item with get k = match contents.TryGetValue k with true, l -> l | _ -> [] member x.AddAndMarkAsCollapsible (kvs: _[]) = let x = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) x.MarkAsCollapsible() member x.MarkAsCollapsible() = LayeredMultiMap(contents.MarkAsCollapsible()) member x.TryFind k = contents.TryFind k + member x.TryGetValue k = contents.TryGetValue k member x.Values = contents.Values |> List.concat static member Empty : LayeredMultiMap<'Key,'Value> = LayeredMultiMap LayeredMap.Empty diff --git a/src/absil/ilmorph.fs b/src/absil/ilmorph.fs index c6d009cd4d..d5398099e0 100755 --- a/src/absil/ilmorph.fs +++ b/src/absil/ilmorph.fs @@ -136,7 +136,7 @@ let rec celem_ty2ty f celem = let cnamedarg_ty2ty f ((nm, ty, isProp, elem) : ILAttributeNamedArg) = (nm, f ty, isProp, celem_ty2ty f elem) -let cattr_ty2ty ilg f c = +let cattr_ty2ty ilg f (c: ILAttribute) = let meth = mspec_ty2ty (f, (fun _ -> f)) c.Method // dev11 M3 defensive coding: if anything goes wrong with attribute decoding or encoding, then back out. if morphCustomAttributeData then @@ -144,11 +144,11 @@ let cattr_ty2ty ilg f c = let elems,namedArgs = IL.decodeILAttribData ilg c let elems = elems |> List.map (celem_ty2ty f) let namedArgs = namedArgs |> List.map (cnamedarg_ty2ty f) - IL.mkILCustomAttribMethRef ilg (meth, elems, namedArgs) - with _ -> - { c with Method = meth } + mkILCustomAttribMethRef ilg (meth, elems, namedArgs) + with _ -> + c.WithMethod(meth) else - { c with Method = meth } + c.WithMethod(meth) let cattrs_ty2ty ilg f (cs: ILAttributes) = diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index f11524bc8d..58c13ba148 100755 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -30,13 +30,14 @@ let tyvar_generator = // Carry an environment because the way we print method variables // depends on the gparams of the current scope. type ppenv = - { ppenvClassFormals: int; + { ilGlobals: ILGlobals + ppenvClassFormals: int; ppenvMethodFormals: int } let ppenv_enter_method mgparams env = {env with ppenvMethodFormals=mgparams} let ppenv_enter_tdef gparams env = {env with ppenvClassFormals=List.length gparams; ppenvMethodFormals=0} -let mk_ppenv = { ppenvClassFormals=0; ppenvMethodFormals=0 } +let mk_ppenv ilg = { ilGlobals = ilg; ppenvClassFormals = 0; ppenvMethodFormals = 0 } let debug_ppenv = mk_ppenv let ppenv_enter_modul env = { env with ppenvClassFormals=0; ppenvMethodFormals=0 } @@ -97,6 +98,13 @@ let output_seq sep f os (a:seq<_>) = output_string os sep; f os e.Current +let output_array sep f os (a:_ []) = + if not (Array.isEmpty a) then + for i in 0..a.Length-2 do + f os a.[i] + output_string os sep + f os (a.[a.Length - 1]) + let output_parens f os a = output_string os "("; f os a; output_string os ")" let output_angled f os a = output_string os "<"; f os a; output_string os ">" let output_bracks f os a = output_string os "["; f os a; output_string os "]" @@ -436,12 +444,12 @@ let output_option f os = function None -> () | Some x -> f os x let goutput_alternative_ref env os (alt: IlxUnionAlternative) = output_id os alt.Name; - alt.FieldDefs |> Array.toList |> output_parens (output_seq "," (fun os fdef -> goutput_typ env os fdef.Type)) os + alt.FieldDefs |> output_parens (output_array "," (fun os fdef -> goutput_typ env os fdef.Type)) os let goutput_curef env os (IlxUnionRef(_,tref,alts,_,_)) = output_string os " .classunion import "; goutput_tref env os tref; - output_parens (output_seq "," (goutput_alternative_ref env)) os (Array.toList alts) + output_parens (output_array "," (goutput_alternative_ref env)) os alts let goutput_cuspec env os (IlxUnionSpec(IlxUnionRef(_,tref,_,_,_),i)) = output_string os "class /* classunion */ "; @@ -469,13 +477,14 @@ let output_basic_type os x = let output_custom_attr_data os data = output_string os " = "; output_parens output_bytes os data -let goutput_custom_attr env os attr = +let goutput_custom_attr env os (attr: ILAttribute) = output_string os " .custom " goutput_mspec env os attr.Method - output_custom_attr_data os attr.Data + let data = getCustomAttrData env.ilGlobals attr + output_custom_attr_data os data let goutput_custom_attrs env os (attrs : ILAttributes) = - List.iter (fun attr -> goutput_custom_attr env os attr; output_string os "\n" ) attrs.AsList + Array.iter (fun attr -> goutput_custom_attr env os attr; output_string os "\n" ) attrs.AsArray let goutput_fdef _tref env os (fd: ILFieldDef) = output_string os " .field " @@ -702,7 +711,7 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(typ,shape)); output_string os ".ctor"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32)) + output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_stelem_any (shape,dt) -> if shape = ILArrayShape.SingleDimensional then output_string os "stelem.any "; goutput_typ env os dt @@ -711,7 +720,9 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(dt,shape)); output_string os "Set"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) @ [dt]) + let arr = Array.create (rank + 1) EcmaMscorlibILGlobals.typ_Int32 + arr.[rank] <- dt + output_parens (output_array "," (goutput_typ env)) os arr | I_ldelem_any (shape,tok) -> if shape = ILArrayShape.SingleDimensional then output_string os "ldelem.any "; goutput_typ env os tok @@ -722,7 +733,7 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(tok,shape)); output_string os "Get"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32)) + output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_ldelema (ro,_,shape,tok) -> if ro = ReadonlyAddress then output_string os "readonly. "; if shape = ILArrayShape.SingleDimensional then @@ -734,7 +745,7 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(tok,shape)); output_string os "Address"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32)) + output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_box tok -> output_string os "box "; goutput_typ env os tok | I_unbox tok -> output_string os "unbox "; goutput_typ env os tok @@ -888,7 +899,7 @@ let splitTypeLayout = function let goutput_fdefs tref env os (fdefs: ILFieldDefs) = List.iter (fun f -> (goutput_fdef tref env) os f; output_string os "\n" ) fdefs.AsList let goutput_mdefs env os (mdefs: ILMethodDefs) = - List.iter (fun f -> (goutput_mdef env) os f; output_string os "\n" ) mdefs.AsList + Array.iter (fun f -> (goutput_mdef env) os f; output_string os "\n" ) mdefs.AsArray let goutput_pdefs env os (pdefs: ILPropertyDefs) = List.iter (fun f -> (goutput_pdef env) os f; output_string os "\n" ) pdefs.AsList @@ -975,7 +986,7 @@ let output_publickeyinfo os = function | PublicKey k -> output_publickey os k | PublicKeyToken k -> output_publickeytoken os k -let output_assref os (aref:ILAssemblyRef) = +let output_assemblyRef os (aref:ILAssemblyRef) = output_string os " .assembly extern "; output_sqstring os aref.Name; if aref.Retargetable then output_string os " retargetable "; @@ -1029,9 +1040,9 @@ let goutput_manifest env os m = output_string os " } \n" -let output_module_fragment_aux _refs os modul = +let output_module_fragment_aux _refs os (ilg: ILGlobals) modul = try - let env = mk_ppenv + let env = mk_ppenv ilg let env = ppenv_enter_modul env goutput_tdefs false ([]) env os modul.TypeDefs; goutput_tdefs true ([]) env os modul.TypeDefs; @@ -1039,13 +1050,13 @@ let output_module_fragment_aux _refs os modul = output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush(); reraise() -let output_module_fragment os modul = +let output_module_fragment os (ilg: ILGlobals) modul = let refs = computeILRefs modul - output_module_fragment_aux refs os modul; + output_module_fragment_aux refs os ilg modul refs let output_module_refs os refs = - List.iter (fun x -> output_assref os x; output_string os "\n") refs.AssemblyReferences; + List.iter (fun x -> output_assemblyRef os x; output_string os "\n") refs.AssemblyReferences; List.iter (fun x -> output_modref os x; output_string os "\n") refs.ModuleReferences let goutput_module_manifest env os modul = @@ -1059,14 +1070,14 @@ let goutput_module_manifest env os modul = output_string os "\n"; (output_option (goutput_manifest env)) os modul.Manifest -let output_module os modul = +let output_module os (ilg: ILGlobals) modul = try let refs = computeILRefs modul - let env = mk_ppenv + let env = mk_ppenv ilg let env = ppenv_enter_modul env output_module_refs os refs; goutput_module_manifest env os modul; - output_module_fragment_aux refs os modul; + output_module_fragment_aux refs os ilg modul; with e -> output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush(); raise e diff --git a/src/absil/ilprint.fsi b/src/absil/ilprint.fsi index 55e768ab68..5f7ebe4f11 100755 --- a/src/absil/ilprint.fsi +++ b/src/absil/ilprint.fsi @@ -9,6 +9,6 @@ open Microsoft.FSharp.Compiler.AbstractIL.Internal open System.IO #if DEBUG -val public output_module : TextWriter -> ILModuleDef -> unit +val public output_module: TextWriter -> ilg: ILGlobals -> ILModuleDef -> unit #endif diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index 5d94041dae..c2c10e9479 100755 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -2101,7 +2101,7 @@ and sigptrGetTy (ctxt: ILMetadataReader) numtypars bytes sigptr = let dim i = (if i < numLoBounded then Some (List.item i lobounds) else None), (if i < numSized then Some (List.item i sizes) else None) - ILArrayShape (Array.toList (Array.init rank dim)) + ILArrayShape (List.init rank dim) mkILArrTy (ty, shape), sigptr elif b0 = et_VOID then ILType.Void, sigptr @@ -2567,12 +2567,13 @@ and seekReadCustomAttr ctxt (TaggedIndex(cat, idx), b) = and seekReadCustomAttrUncached ctxtH (CustomAttrIdx (cat, idx, valIdx)) = let ctxt = getHole ctxtH - { Method=seekReadCustomAttrType ctxt (TaggedIndex(cat, idx)) - Data= + let method = seekReadCustomAttrType ctxt (TaggedIndex(cat, idx)) + let data = match readBlobHeapOption ctxt valIdx with | Some bytes -> bytes - | None -> Bytes.ofInt32Array [| |] - Elements = [] } + | None -> Bytes.ofInt32Array [| |] + let elements = [] + ILAttribute.Encoded (method, data, elements) and securityDeclsReader ctxtH tag = mkILSecurityDeclsReader diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index c07408e8ab..5e15cbbd37 100755 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -289,6 +289,7 @@ module Zmap = let equalTypes (s:Type) (t:Type) = s.Equals(t) let equalTypeLists ss tt = List.lengthsEqAndForall2 equalTypes ss tt +let equalTypeArrays ss tt = Array.lengthsEqAndForall2 equalTypes ss tt let getGenericArgumentsOfType (typT : Type) = if typT.IsGenericType then typT.GetGenericArguments() else [| |] @@ -763,7 +764,9 @@ let queryableTypeGetMethodBySearch cenv emEnv parentT (mref:ILMethodRef) = res match List.tryFind select methInfos with - | None -> failwith "convMethodRef: could not bind to method" + | None -> + let methNames = methInfos |> List.map (fun m -> m.Name) |> List.distinct + failwithf "convMethodRef: could not bind to method '%A' of type '%s'" (System.String.Join(", ", methNames)) parentT.AssemblyQualifiedName | Some methInfo -> methInfo (* return MethodInfo for (generic) type's (generic) method *) let queryableTypeGetMethod cenv emEnv parentT (mref:ILMethodRef) = @@ -1412,16 +1415,16 @@ let emitMethodBody cenv modB emEnv ilG _name (mbody: ILLazyMethodBody) = | MethodBody.Native -> failwith "emitMethodBody: native" | MethodBody.NotAvailable -> failwith "emitMethodBody: metadata only" -let convCustomAttr cenv emEnv cattr = +let convCustomAttr cenv emEnv (cattr: ILAttribute) = let methInfo = match convConstructorSpec cenv emEnv cattr.Method with | null -> failwithf "convCustomAttr: %+A" cattr.Method | res -> res - let data = cattr.Data + let data = getCustomAttrData cenv.ilg cattr (methInfo, data) let emitCustomAttr cenv emEnv add cattr = add (convCustomAttr cenv emEnv cattr) -let emitCustomAttrs cenv emEnv add (cattrs : ILAttributes) = List.iter (emitCustomAttr cenv emEnv add) cattrs.AsList +let emitCustomAttrs cenv emEnv add (cattrs : ILAttributes) = Array.iter (emitCustomAttr cenv emEnv add) cattrs.AsArray //---------------------------------------------------------------------------- // buildGenParams @@ -1595,9 +1598,7 @@ let rec buildMethodPass3 cenv tref modB (typB:TypeBuilder) emEnv (mdef : ILMetho (getGenericArgumentsOfType (typB.AsType())) (getGenericArgumentsOfMethod methB)) - match mdef.Return.CustomAttrs.AsList with - | [] -> () - | _ -> + if not (Array.isEmpty mdef.Return.CustomAttrs.AsArray) then let retB = methB.DefineParameterAndLog(0, System.Reflection.ParameterAttributes.Retval, null) emitCustomAttrs cenv emEnv (wrapCustomAttr retB.SetCustomAttribute) mdef.Return.CustomAttrs @@ -1823,7 +1824,7 @@ let rec buildTypeDefPass2 cenv nesting emEnv (tdef : ILTypeDef) = // add interface impls tdef.Implements |> convTypes cenv emEnv |> List.iter (fun implT -> typB.AddInterfaceImplementationAndLog(implT)); // add methods, properties - let emEnv = List.fold (buildMethodPass2 cenv tref typB) emEnv tdef.Methods.AsList + let emEnv = Array.fold (buildMethodPass2 cenv tref typB) emEnv tdef.Methods.AsArray let emEnv = List.fold (buildFieldPass2 cenv tref typB) emEnv tdef.Fields.AsList let emEnv = List.fold (buildPropertyPass2 cenv tref typB) emEnv tdef.Properties.AsList let emEnv = envPopTyvars emEnv @@ -1940,7 +1941,7 @@ let createTypeRef (visited : Dictionary<_, _>, created : Dictionary<_, _>) emEnv traverseType CollectTypes.All cx if verbose2 then dprintf "buildTypeDefPass4: Doing method constraints of %s\n" tdef.Name - for md in tdef.Methods.AsList do + for md in tdef.Methods.AsArray do for gp in md.GenericParams do for cx in gp.Constraints do traverseType CollectTypes.All cx diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index d28348bf86..12541d5089 100755 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -1382,8 +1382,9 @@ and GetMethodRefAsCustomAttribType cenv (mref:ILMethodRef) = let rec GetCustomAttrDataAsBlobIdx cenv (data:byte[]) = if data.Length = 0 then 0 else GetBytesAsBlobIdx cenv data -and GetCustomAttrRow cenv hca attr = +and GetCustomAttrRow cenv hca (attr: ILAttribute) = let cat = GetMethodRefAsCustomAttribType cenv attr.Method.MethodRef + let data = getCustomAttrData cenv.ilg attr for element in attr.Elements do match element with | ILAttribElem.Type (Some ty) when ty.IsNominal -> GetTypeRefAsTypeRefIdx cenv ty.TypeRef |> ignore @@ -1393,14 +1394,14 @@ and GetCustomAttrRow cenv hca attr = UnsharedRow [| HasCustomAttribute (fst hca, snd hca); CustomAttributeType (fst cat, snd cat); - Blob (GetCustomAttrDataAsBlobIdx cenv attr.Data) + Blob (GetCustomAttrDataAsBlobIdx cenv data) |] and GenCustomAttrPass3Or4 cenv hca attr = AddUnsharedRow cenv TableNames.CustomAttribute (GetCustomAttrRow cenv hca attr) |> ignore and GenCustomAttrsPass3Or4 cenv hca (attrs: ILAttributes) = - attrs.AsList |> List.iter (GenCustomAttrPass3Or4 cenv hca) + attrs.AsArray |> Array.iter (GenCustomAttrPass3Or4 cenv hca) // -------------------------------------------------------------------- // ILSecurityDecl --> DeclSecurity rows @@ -2462,7 +2463,7 @@ let GenReturnAsParamRow (returnv : ILReturn) = StringE 0 |] let GenReturnPass3 cenv (returnv: ILReturn) = - if Option.isSome returnv.Marshal || not (isNil returnv.CustomAttrs.AsList) then + if Option.isSome returnv.Marshal || not (Array.isEmpty returnv.CustomAttrs.AsArray) then let pidx = AddUnsharedRow cenv TableNames.Param (GenReturnAsParamRow returnv) GenCustomAttrsPass3Or4 cenv (hca_ParamDef, pidx) returnv.CustomAttrs match returnv.Marshal with diff --git a/src/buildtools/buildtools.proj b/src/buildtools/buildtools.proj new file mode 100644 index 0000000000..593f086dd0 --- /dev/null +++ b/src/buildtools/buildtools.proj @@ -0,0 +1,32 @@ + + + + Debug + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/buildtools/buildtools.targets b/src/buildtools/buildtools.targets new file mode 100644 index 0000000000..9b00e18cf7 --- /dev/null +++ b/src/buildtools/buildtools.targets @@ -0,0 +1,56 @@ + + + + dotnet + dotnet.exe + + $(DotNetExe) + + + + + + + $(ArtifactsBinDir)\fslex\Proto\netcoreapp2.0\fslex.dll + + + + + + + + + + + + + + + + + + + $(ArtifactsBinDir)\fsyacc\Proto\netcoreapp2.0\fsyacc.dll + + + + + + + + + + + + + + + diff --git a/src/buildtools/fslex/App.config b/src/buildtools/fslex/App.config new file mode 100644 index 0000000000..e1b09eda9f --- /dev/null +++ b/src/buildtools/fslex/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/buildtools/fslex/Arg.fs b/src/buildtools/fslex/Arg.fs new file mode 100644 index 0000000000..a1f63bd963 --- /dev/null +++ b/src/buildtools/fslex/Arg.fs @@ -0,0 +1,133 @@ +// (c) Microsoft Corporation 2005-2009. + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities +#else +namespace Microsoft.FSharp.Text +#endif + + +type ArgType = + | ClearArg of bool ref + | FloatArg of (float -> unit) + | IntArg of (int -> unit) + | RestArg of (string -> unit) + | SetArg of bool ref + | StringArg of (string -> unit) + | UnitArg of (unit -> unit) + static member Clear r = ClearArg r + static member Float r = FloatArg r + static member Int r = IntArg r + static member Rest r = RestArg r + static member Set r = SetArg r + static member String r = StringArg r + static member Unit r = UnitArg r + + +type ArgInfo (name,action,help) = + member x.Name = name + member x.ArgType = action + member x.HelpText = help + +exception Bad of string +exception HelpText of string + +[] +type ArgParser() = + static let getUsage specs u = + let sbuf = new System.Text.StringBuilder 100 + let pstring (s:string) = sbuf.Append s |> ignore + let pendline s = pstring s; pstring "\n" + pendline u; + List.iter (fun (arg:ArgInfo) -> + match arg.Name, arg.ArgType, arg.HelpText with + | (s, (UnitArg _ | SetArg _ | ClearArg _), helpText) -> pstring "\t"; pstring s; pstring ": "; pendline helpText + | (s, StringArg _, helpText) -> pstring "\t"; pstring s; pstring " : "; pendline helpText + | (s, IntArg _, helpText) -> pstring "\t"; pstring s; pstring " : "; pendline helpText + | (s, FloatArg _, helpText) -> pstring "\t"; pstring s; pstring " : "; pendline helpText + | (s, RestArg _, helpText) -> pstring "\t"; pstring s; pstring " ...: "; pendline helpText) + specs; + pstring "\t"; pstring "--help"; pstring ": "; pendline "display this list of options"; + pstring "\t"; pstring "-help"; pstring ": "; pendline "display this list of options"; + sbuf.ToString() + + + static member ParsePartial(cursor,argv,argSpecs:seq,?other,?usageText) = + let other = defaultArg other (fun _ -> ()) + let usageText = defaultArg usageText "" + let nargs = Array.length argv + incr cursor; + let argSpecs = argSpecs |> Seq.toList + let specs = argSpecs |> List.map (fun (arg:ArgInfo) -> arg.Name, arg.ArgType) + while !cursor < nargs do + let arg = argv.[!cursor] + let rec findMatchingArg args = + match args with + | ((s, action) :: _) when s = arg -> + let getSecondArg () = + if !cursor + 1 >= nargs then + raise(Bad("option "+s+" needs an argument.\n"+getUsage argSpecs usageText)); + argv.[!cursor+1] + + match action with + | UnitArg f -> + f (); + incr cursor + | SetArg f -> + f := true; + incr cursor + | ClearArg f -> + f := false; + incr cursor + | StringArg f-> + let arg2 = getSecondArg() + f arg2; + cursor := !cursor + 2 + | IntArg f -> + let arg2 = getSecondArg () + let arg2 = try int32 arg2 with _ -> raise(Bad(getUsage argSpecs usageText)) in + f arg2; + cursor := !cursor + 2; + | FloatArg f -> + let arg2 = getSecondArg() + let arg2 = try float arg2 with _ -> raise(Bad(getUsage argSpecs usageText)) in + f arg2; + cursor := !cursor + 2; + | RestArg f -> + incr cursor; + while !cursor < nargs do + f (argv.[!cursor]); + incr cursor; + + | (_ :: more) -> findMatchingArg more + | [] -> + if arg = "-help" || arg = "--help" || arg = "/help" || arg = "/help" || arg = "/?" then + raise (HelpText (getUsage argSpecs usageText)) + // Note: for '/abc/def' does not count as an argument + // Note: '/abc' does + elif arg.Length>0 && (arg.[0] = '-' || (arg.[0] = '/' && not (arg.Length > 1 && arg.[1..].Contains ("/")))) then + raise (Bad ("unrecognized argument: "+ arg + "\n" + getUsage argSpecs usageText)) + else + other arg; + incr cursor + findMatchingArg specs + + static member Usage (specs,?usage) = + let usage = defaultArg usage "" + System.Console.Error.WriteLine (getUsage (Seq.toList specs) usage) + + #if FX_NO_COMMAND_LINE_ARGS + #else + static member Parse (specs,?other,?usageText) = + let current = ref 0 + let argv = System.Environment.GetCommandLineArgs() + try ArgParser.ParsePartial (current, argv, specs, ?other=other, ?usageText=usageText) + with + | Bad h + | HelpText h -> + System.Console.Error.WriteLine h; + System.Console.Error.Flush(); + System.Environment.Exit(1); + | e -> + reraise() + #endif diff --git a/src/buildtools/fslex/Arg.fsi b/src/buildtools/fslex/Arg.fsi new file mode 100644 index 0000000000..367f69f959 --- /dev/null +++ b/src/buildtools/fslex/Arg.fsi @@ -0,0 +1,50 @@ +// (c) Microsoft Corporation 2005-2009. + +/// A simple command-line argument processor. +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities +#else +namespace Microsoft.FSharp.Text +#endif + +/// The spec value describes the action of the argument, +/// and whether it expects a following parameter. +[] +type ArgType = + static member Clear : bool ref -> ArgType + static member Float : (float -> unit) -> ArgType + static member Int : (int -> unit) -> ArgType + static member Rest : (string -> unit) -> ArgType + static member Set : bool ref -> ArgType + static member String : (string -> unit) -> ArgType + static member Unit : (unit -> unit) -> ArgType + +type ArgInfo = + new : name:string * action:ArgType * help:string -> ArgInfo + /// Return the name of the argument + member Name : string + /// Return the argument type and action of the argument + member ArgType : ArgType + /// Return the usage help associated with the argument + member HelpText : string + +[] +type ArgParser = + #if FX_NO_COMMAND_LINE_ARGS + #else + + /// Parse some of the arguments given by 'argv', starting at the given position + [] + static member ParsePartial: cursor: int ref * argv: string[] * arguments:seq * ?otherArgs: (string -> unit) * ?usageText:string -> unit + + /// Parse the arguments given by System.Environment.GetEnvironmentVariables() + /// according to the argument processing specifications "specs". + /// Args begin with "-". Non-arguments are passed to "f" in + /// order. "use" is printed as part of the usage line if an error occurs. + + static member Parse: arguments:seq * ?otherArgs: (string -> unit) * ?usageText:string -> unit + #endif + + /// Prints the help for each argument. + static member Usage : arguments:seq * ?usage:string -> unit + diff --git a/src/buildtools/fslex/Lexing.fs b/src/buildtools/fslex/Lexing.fs new file mode 100644 index 0000000000..8337717d6f --- /dev/null +++ b/src/buildtools/fslex/Lexing.fs @@ -0,0 +1,423 @@ +// (c) Microsoft Corporation 2005-2009. + +#nowarn "47" // recursive initialization of LexBuffer + + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities.Text.Lexing + +#else +namespace Microsoft.FSharp.Text.Lexing +#endif + + open System.Collections.Generic + + // REVIEW: This type showed up on a parsing-intensive performance measurement. Consider whether it can be a struct-record later when we have this feature. -jomo +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal Position = +#else + type Position = +#endif + { pos_fname : string; + pos_lnum : int; +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum : int; +#endif + pos_bol : int; + pos_cnum : int; } + member x.FileName = x.pos_fname + member x.Line = x.pos_lnum +#if INTERNALIZED_FSLEXYACC_RUNTIME + member x.OriginalLine = x.pos_orig_lnum +#endif + member x.Char = x.pos_cnum + member x.AbsoluteOffset = x.pos_cnum + member x.StartOfLine = x.pos_bol + member x.StartOfLineAbsoluteOffset = x.pos_bol + member x.Column = x.pos_cnum - x.pos_bol + member pos.NextLine = + { pos with +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum = pos.OriginalLine + 1; +#endif + pos_lnum = pos.Line+1; + pos_bol = pos.AbsoluteOffset } + member pos.EndOfToken(n) = {pos with pos_cnum=pos.pos_cnum + n } + member pos.AsNewLinePos() = pos.NextLine + member pos.ShiftColumnBy(by) = {pos with pos_cnum = pos.pos_cnum + by} + static member Empty = + { pos_fname=""; + pos_lnum= 0; +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum = 0; +#endif + pos_bol= 0; + pos_cnum=0 } + static member FirstLine(filename) = + { pos_fname=filename; +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum = 1; +#endif + pos_lnum= 1; + pos_bol= 0; + pos_cnum=0 } + +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal LexBufferFiller<'char> = +#else + type LexBufferFiller<'char> = +#endif + { fillSync : (LexBuffer<'char> -> unit) option + fillAsync : (LexBuffer<'char> -> Async) option } + + and [] +#if INTERNALIZED_FSLEXYACC_RUNTIME + internal LexBuffer<'char>(filler: LexBufferFiller<'char>) as this = +#else + LexBuffer<'char>(filler: LexBufferFiller<'char>) as this = +#endif + let context = new Dictionary(1) in + let extendBufferSync = (fun () -> match filler.fillSync with Some refill -> refill this | None -> invalidOp "attempt to read synchronously from an asynchronous lex buffer") + let extendBufferAsync = (fun () -> match filler.fillAsync with Some refill -> refill this | None -> invalidOp "attempt to read asynchronously from a synchronous lex buffer") + let mutable buffer=[||]; + /// number of valid charactes beyond bufferScanStart + let mutable bufferMaxScanLength=0; + /// count into the buffer when scanning + let mutable bufferScanStart=0; + /// number of characters scanned so far + let mutable bufferScanLength=0; + /// length of the scan at the last accepting state + let mutable lexemeLength=0; + /// action related to the last accepting state + let mutable bufferAcceptAction=0; + let mutable eof = false; + let mutable startPos = Position.Empty ; + let mutable endPos = Position.Empty + + // Throw away all the input besides the lexeme + + let discardInput () = + let keep = Array.sub buffer bufferScanStart bufferScanLength + let nkeep = keep.Length + Array.blit keep 0 buffer 0 nkeep; + bufferScanStart <- 0; + bufferMaxScanLength <- nkeep + + + member lexbuf.EndOfScan () : int = + // Printf.eprintf "endOfScan, lexBuffer.lexemeLength = %d\n" lexBuffer.lexemeLength; + if bufferAcceptAction < 0 then + failwith "unrecognized input" + + // Printf.printf "endOfScan %d state %d on unconsumed input '%c' (%d)\n" a s (Char.chr inp) inp; + // Printf.eprintf "accept, lexeme = %s\n" (lexeme lexBuffer); + lexbuf.StartPos <- endPos; + lexbuf.EndPos <- endPos.EndOfToken(lexbuf.LexemeLength); + bufferAcceptAction + + member lexbuf.StartPos + with get() = startPos + and set(b) = startPos <- b + + member lexbuf.EndPos + with get() = endPos + and set(b) = endPos <- b + + member lexbuf.Lexeme = Array.sub buffer bufferScanStart lexemeLength + member lexbuf.LexemeChar(n) = buffer.[n+bufferScanStart] + + member lexbuf.BufferLocalStore = (context :> IDictionary<_,_>) + member lexbuf.LexemeLength with get() : int = lexemeLength and set v = lexemeLength <- v + member internal lexbuf.Buffer with get() : 'char[] = buffer and set v = buffer <- v + member internal lexbuf.BufferMaxScanLength with get() = bufferMaxScanLength and set v = bufferMaxScanLength <- v + member internal lexbuf.BufferScanLength with get() = bufferScanLength and set v = bufferScanLength <- v + member internal lexbuf.BufferScanStart with get() : int = bufferScanStart and set v = bufferScanStart <- v + member internal lexbuf.BufferAcceptAction with get() = bufferAcceptAction and set v = bufferAcceptAction <- v + member internal lexbuf.RefillBuffer = extendBufferSync + member internal lexbuf.AsyncRefillBuffer = extendBufferAsync + + static member LexemeString(lexbuf:LexBuffer) = + new System.String(lexbuf.Buffer,lexbuf.BufferScanStart,lexbuf.LexemeLength) + + member lexbuf.IsPastEndOfStream + with get() = eof + and set(b) = eof <- b + + member lexbuf.DiscardInput() = discardInput () + + member x.BufferScanPos = bufferScanStart + bufferScanLength + + member lexbuf.EnsureBufferSize n = + if lexbuf.BufferScanPos + n >= buffer.Length then + let repl = Array.zeroCreate (lexbuf.BufferScanPos + n) + Array.blit buffer bufferScanStart repl bufferScanStart bufferScanLength; + buffer <- repl + + static member FromReadFunctions (syncRead : ('char[] * int * int -> int) option, asyncRead : ('char[] * int * int -> Async) option) : LexBuffer<'char> = + let extension= Array.zeroCreate 4096 + let fillers = + { fillSync = + match syncRead with + | None -> None + | Some read -> + Some (fun lexBuffer -> + let n = read(extension,0,extension.Length) + lexBuffer.EnsureBufferSize n; + Array.blit extension 0 lexBuffer.Buffer lexBuffer.BufferScanPos n; + lexBuffer.BufferMaxScanLength <- lexBuffer.BufferScanLength + n); + fillAsync = + match asyncRead with + | None -> None + | Some read -> + Some (fun lexBuffer -> + async { + let! n = read(extension,0,extension.Length) + lexBuffer.EnsureBufferSize n; + Array.blit extension 0 lexBuffer.Buffer lexBuffer.BufferScanPos n; + lexBuffer.BufferMaxScanLength <- lexBuffer.BufferScanLength + n }) } + new LexBuffer<_>(fillers) + + // A full type signature is required on this method because it is used at more specific types within its own scope + static member FromFunction (f : 'char[] * int * int -> int) : LexBuffer<'char> = LexBuffer<_>.FromReadFunctions(Some(f),None) + static member FromAsyncFunction (f : 'char[] * int * int -> Async) : LexBuffer<'char> = LexBuffer<_>.FromReadFunctions(None,Some(f)) + + static member FromCharFunction f : LexBuffer = + LexBuffer.FromFunction(fun (buff,start,len) -> + let buff2 = Array.zeroCreate len + let n = f buff2 len + Array.blit buff2 0 buff start len + n) + static member FromByteFunction f : LexBuffer = + LexBuffer.FromFunction(fun (buff,start,len) -> + let buff2 = Array.zeroCreate len + let n = f buff2 len + Array.blit buff2 0 buff start len + n) + + // A full type signature is required on this method because it is used at more specific types within its own scope + static member FromArray (s: 'char[]) : LexBuffer<'char> = + let lexBuffer = + new LexBuffer<_> + { fillSync = Some (fun _ -> ()); + fillAsync = Some (fun _ -> async { return () }) } + let buffer = Array.copy s + lexBuffer.Buffer <- buffer; + lexBuffer.BufferMaxScanLength <- buffer.Length; + lexBuffer + + static member FromBytes (arr) = LexBuffer.FromArray(arr) + static member FromChars (arr) = LexBuffer.FromArray(arr) + static member FromString (s:string) = LexBuffer.FromChars (s.ToCharArray()) + + static member FromTextReader (tr:System.IO.TextReader) : LexBuffer = + LexBuffer.FromFunction(tr.Read) + + static member FromBinaryReader (br:System.IO.BinaryReader) : LexBuffer = + LexBuffer.FromFunction(br.Read) + + static member FromStream (stream:System.IO.Stream) : LexBuffer = + LexBuffer.FromReadFunctions(Some(stream.Read),Some(fun (buf,offset,len) -> stream.AsyncRead(buf,offset=offset,count=len))) + + module GenericImplFragments = + let startInterpret(lexBuffer:LexBuffer<_>)= + lexBuffer.BufferScanStart <- lexBuffer.BufferScanStart + lexBuffer.LexemeLength; + lexBuffer.BufferMaxScanLength <- lexBuffer.BufferMaxScanLength - lexBuffer.LexemeLength; + lexBuffer.BufferScanLength <- 0; + lexBuffer.LexemeLength <- 0; + lexBuffer.BufferAcceptAction <- -1; + + let afterRefill (trans: uint16[] array,sentinel,lexBuffer:LexBuffer<_>,scanUntilSentinel,endOfScan,state,eofPos) = + // end of file occurs if we couldn't extend the buffer + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + let snew = int trans.[state].[eofPos] // == EOF + if snew = sentinel then + endOfScan() + else + if lexBuffer.IsPastEndOfStream then failwith "End of file on lexing stream"; + lexBuffer.IsPastEndOfStream <- true; + // Printf.printf "state %d --> %d on eof\n" state snew; + scanUntilSentinel(lexBuffer,snew) + else + scanUntilSentinel(lexBuffer, state) + + let onAccept (lexBuffer:LexBuffer<_>,a) = + lexBuffer.LexemeLength <- lexBuffer.BufferScanLength; + lexBuffer.BufferAcceptAction <- a; + + open GenericImplFragments + + [] +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal AsciiTables(trans: uint16[] array, accept: uint16[]) = +#else + type AsciiTables(trans: uint16[] array, accept: uint16[]) = +#endif + let rec scanUntilSentinel(lexBuffer, state) = + let sentinel = 255 * 256 + 255 + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept (lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + lexBuffer.RefillBuffer (); + // end of file occurs if we couldn't extend the buffer + afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,lexBuffer.EndOfScan,state,256 (* == EOF *) ) + else + // read a character - end the scan if there are no further transitions + let inp = int(lexBuffer.Buffer.[lexBuffer.BufferScanPos]) + let snew = int trans.[state].[inp] + if snew = sentinel then + lexBuffer.EndOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + // Printf.printf "state %d --> %d on '%c' (%d)\n" state snew (Char.chr inp) inp; + scanUntilSentinel(lexBuffer, snew) + + /// Interpret tables for an ascii lexer generated by fslex. + member tables.Interpret(initialState,lexBuffer : LexBuffer) = + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + /// Interpret tables for an ascii lexer generated by fslex. + member tables.AsyncInterpret(initialState,lexBuffer : LexBuffer) = + + let rec scanUntilSentinel(lexBuffer,state) : Async = + async { + let sentinel = 255 * 256 + 255 + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept (lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + do! lexBuffer.AsyncRefillBuffer (); + // end of file occurs if we couldn't extend the buffer + return! afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,endOfScan,state,256 (* == EOF *) ) + else + // read a character - end the scan if there are no further transitions + let inp = int(lexBuffer.Buffer.[lexBuffer.BufferScanPos]) + let snew = int trans.[state].[inp] + if snew = sentinel then + return! endOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + return! scanUntilSentinel(lexBuffer,snew) + } + and endOfScan() = + async { return lexBuffer.EndOfScan() } + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + + static member Create(trans,accept) = new AsciiTables(trans,accept) + + [] +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal UnicodeTables(trans: uint16[] array, accept: uint16[]) = +#else + type UnicodeTables(trans: uint16[] array, accept: uint16[]) = +#endif + let sentinel = 255 * 256 + 255 + let numUnicodeCategories = 30 + let numLowUnicodeChars = 128 + let numSpecificUnicodeChars = (trans.[0].Length - 1 - numLowUnicodeChars - numUnicodeCategories)/2 + let lookupUnicodeCharacters (state,inp) = + let inpAsInt = int inp + // Is it a fast ASCII character? + if inpAsInt < numLowUnicodeChars then + int trans.[state].[inpAsInt] + else + // Search for a specific unicode character + let baseForSpecificUnicodeChars = numLowUnicodeChars + let rec loop i = + if i >= numSpecificUnicodeChars then + // OK, if we failed then read the 'others' entry in the alphabet, + // which covers all Unicode characters not covered in other + // ways + let baseForUnicodeCategories = numLowUnicodeChars+numSpecificUnicodeChars*2 + let unicodeCategory = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(inp) + //System.Console.WriteLine("inp = {0}, unicodeCategory = {1}", [| box inp; box unicodeCategory |]); + int trans.[state].[baseForUnicodeCategories + int32 unicodeCategory] + else + // This is the specific unicode character + let c = char (int trans.[state].[baseForSpecificUnicodeChars+i*2]) + //System.Console.WriteLine("c = {0}, inp = {1}, i = {2}", [| box c; box inp; box i |]); + // OK, have we found the entry for a specific unicode character? + if c = inp + then int trans.[state].[baseForSpecificUnicodeChars+i*2+1] + else loop(i+1) + + loop 0 + let eofPos = numLowUnicodeChars + 2*numSpecificUnicodeChars + numUnicodeCategories + + let rec scanUntilSentinel(lexBuffer,state) = + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept(lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + lexBuffer.RefillBuffer (); + // end of file occurs if we couldn't extend the buffer + afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,lexBuffer.EndOfScan,state,eofPos) + else + // read a character - end the scan if there are no further transitions + let inp = lexBuffer.Buffer.[lexBuffer.BufferScanPos] + + // Find the new state + let snew = lookupUnicodeCharacters (state,inp) + + if snew = sentinel then + lexBuffer.EndOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + // Printf.printf "state %d --> %d on '%c' (%d)\n" s snew (char inp) inp; + scanUntilSentinel(lexBuffer,snew) + + // Each row for the Unicode table has format + // 128 entries for ASCII characters + // A variable number of 2*UInt16 entries for SpecificUnicodeChars + // 30 entries, one for each UnicodeCategory + // 1 entry for EOF + + member tables.Interpret(initialState,lexBuffer : LexBuffer) = + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + member tables.AsyncInterpret(initialState,lexBuffer : LexBuffer) = + + let rec scanUntilSentinel(lexBuffer, state) = + async { + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept(lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + lexBuffer.RefillBuffer (); + // end of file occurs if we couldn't extend the buffer + return! afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,endOfScan,state,eofPos) + else + // read a character - end the scan if there are no further transitions + let inp = lexBuffer.Buffer.[lexBuffer.BufferScanPos] + + // Find the new state + let snew = lookupUnicodeCharacters (state,inp) + + if snew = sentinel then + return! endOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + return! scanUntilSentinel(lexBuffer, snew) + } + and endOfScan() = + async { return lexBuffer.EndOfScan() } + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + static member Create(trans,accept) = new UnicodeTables(trans,accept) diff --git a/src/buildtools/fslex/Lexing.fsi b/src/buildtools/fslex/Lexing.fsi new file mode 100644 index 0000000000..e31ad411aa --- /dev/null +++ b/src/buildtools/fslex/Lexing.fsi @@ -0,0 +1,151 @@ +//========================================================================== +// LexBuffers are for use with automatically generated lexical analyzers, +// in particular those produced by 'fslex'. +// +// (c) Microsoft Corporation 2005-2008. +//=========================================================================== + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities.Text.Lexing +#else +namespace Microsoft.FSharp.Text.Lexing +#endif + +open System.Collections.Generic + +/// Position information stored for lexing tokens +// +// Note: this is an OCaml compat record type. +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Position = +#else +type Position = +#endif + { /// The file name for the position + pos_fname: string; + /// The line number for the position + pos_lnum: int; +#if INTERNALIZED_FSLEXYACC_RUNTIME + /// The line number for the position in the original source file + pos_orig_lnum : int; +#endif + /// The absolute offset of the beginning of the line + pos_bol: int; + /// The absolute offset of the column for the position + pos_cnum: int; } + /// The file name associated with the input stream. + member FileName : string + /// The line number in the input stream, assuming fresh positions have been updated + /// using AsNewLinePos() and by modifying the EndPos property of the LexBuffer. + member Line : int +#if INTERNALIZED_FSLEXYACC_RUNTIME + /// The line number for the position in the input stream, assuming fresh positions have been updated + /// using AsNewLinePos() + member OriginalLine : int +#endif + [] + member Char : int + /// The character number in the input stream + member AbsoluteOffset : int + /// Return absolute offset of the start of the line marked by the position + member StartOfLineAbsoluteOffset : int + /// Return the column number marked by the position, i.e. the difference between the AbsoluteOffset and the StartOfLineAbsoluteOffset + member Column : int + // Given a position just beyond the end of a line, return a position at the start of the next line + member NextLine : Position + + /// Given a position at the start of a token of length n, return a position just beyond the end of the token + member EndOfToken: n:int -> Position + /// Gives a position shifted by specified number of characters + member ShiftColumnBy: by:int -> Position + + [] + member AsNewLinePos : unit -> Position + + /// Get an arbitrary position, with the empty string as filename, and + static member Empty : Position + + /// Get a position corresponding to the first line (line number 1) in a given file + static member FirstLine : filename:string -> Position + +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal LexBuffer<'char> = +#else +/// Input buffers consumed by lexers generated by fslex.exe +type LexBuffer<'char> = +#endif + /// The start position for the lexeme + member StartPos: Position with get,set + /// The end position for the lexeme + member EndPos: Position with get,set + /// The matched string + member Lexeme: 'char array + + /// Fast helper to turn the matched characters into a string, avoiding an intermediate array + static member LexemeString : LexBuffer -> string + + /// The length of the matched string + member LexemeLength: int + /// Fetch a particular character in the matched string + member LexemeChar: int -> 'char + + /// Dynamically typed, non-lexically scoped parameter table + member BufferLocalStore : IDictionary + + /// True if the refill of the buffer ever failed , or if explicitly set to true. + member IsPastEndOfStream: bool with get,set + /// Remove all input, though don't discard the current lexeme + member DiscardInput: unit -> unit + + /// Create a lex buffer suitable for byte lexing that reads characters from the given array + static member FromBytes: byte[] -> LexBuffer + /// Create a lex buffer suitable for Unicode lexing that reads characters from the given array + static member FromChars: char[] -> LexBuffer + /// Create a lex buffer suitable for Unicode lexing that reads characters from the given string + static member FromString: string -> LexBuffer + /// Create a lex buffer that reads character or byte inputs by using the given function + static member FromFunction: ('char[] * int * int -> int) -> LexBuffer<'char> + /// Create a lex buffer that asynchronously reads character or byte inputs by using the given function + static member FromAsyncFunction: ('char[] * int * int -> Async) -> LexBuffer<'char> + + + [.FromFunction instead")>] + static member FromCharFunction: (char[] -> int -> int) -> LexBuffer + [.FromFunction instead")>] + static member FromByteFunction: (byte[] -> int -> int) -> LexBuffer + + /// Create a lex buffer suitable for use with a Unicode lexer that reads character inputs from the given text reader + static member FromTextReader: System.IO.TextReader -> LexBuffer + /// Create a lex buffer suitable for use with ASCII byte lexing that reads byte inputs from the given binary reader + static member FromBinaryReader: System.IO.BinaryReader -> LexBuffer + + +/// The type of tables for an ascii lexer generated by fslex. +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal AsciiTables = +#else +type AsciiTables = +#endif + static member Create : uint16[] array * uint16[] -> AsciiTables + /// Interpret tables for an ascii lexer generated by fslex. + member Interpret: initialState:int * LexBuffer -> int + /// Interpret tables for an ascii lexer generated by fslex, processing input asynchronously + member AsyncInterpret: initialState:int * LexBuffer -> Async + + +/// The type of tables for an unicode lexer generated by fslex. +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal UnicodeTables = +#else +type UnicodeTables = +#endif + static member Create : uint16[] array * uint16[] -> UnicodeTables + /// Interpret tables for a unicode lexer generated by fslex. + member Interpret: initialState:int * LexBuffer -> int + + /// Interpret tables for a unicode lexer generated by fslex, processing input asynchronously + member AsyncInterpret: initialState:int * LexBuffer -> Async + diff --git a/src/buildtools/fslex/Parsing.fs b/src/buildtools/fslex/Parsing.fs new file mode 100644 index 0000000000..01dccfb610 --- /dev/null +++ b/src/buildtools/fslex/Parsing.fs @@ -0,0 +1,514 @@ +// (c) Microsoft Corporation 2005-2009. + +#if INTERNALIZED_FSLEXYACC_RUNTIME + +namespace Internal.Utilities.Text.Parsing +open Internal.Utilities +open Internal.Utilities.Text.Lexing + +#else +namespace Microsoft.FSharp.Text.Parsing +open Microsoft.FSharp.Text.Lexing +#endif + + + +open System +open System.Collections.Generic + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal IParseState = +#else +type IParseState = +#endif + abstract InputRange: int -> Position * Position + abstract InputEndPosition: int -> Position + abstract InputStartPosition: int -> Position + abstract ResultRange: Position * Position + abstract GetInput: int -> obj + abstract ParserLocalStore : IDictionary + abstract RaiseError<'b> : unit -> 'b + +//------------------------------------------------------------------------- +// This context is passed to the error reporter when a syntax error occurs + +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal ParseErrorContext<'tok> +#else +type ParseErrorContext<'tok> +#endif + (//lexbuf: LexBuffer<_>, + stateStack:int list, + parseState: IParseState, + reduceTokens: int list, + currentToken: 'tok option, + reducibleProductions: int list list, + shiftableTokens: int list , + message : string) = + //member x.LexBuffer = lexbuf + member x.StateStack = stateStack + member x.ReduceTokens = reduceTokens + member x.CurrentToken = currentToken + member x.ParseState = parseState + member x.ReducibleProductions = reducibleProductions + member x.ShiftTokens = shiftableTokens + member x.Message = message + + +//------------------------------------------------------------------------- +// This is the data structure emitted as code by FSYACC. + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Tables<'tok> = +#else +type Tables<'tok> = +#endif + { reductions: (IParseState -> obj) array; + endOfInputTag: int; + tagOfToken: 'tok -> int; + dataOfToken: 'tok -> obj; + actionTableElements: uint16[]; + actionTableRowOffsets: uint16[]; + reductionSymbolCounts: uint16[]; + immediateActions: uint16[]; + gotos: uint16[]; + sparseGotoTableRowOffsets: uint16[]; + stateToProdIdxsTableElements: uint16[]; + stateToProdIdxsTableRowOffsets: uint16[]; + productionToNonTerminalTable: uint16[]; + /// For fsyacc.exe, this entry is filled in by context from the generated parser file. If no 'parse_error' function + /// is defined by the user then ParseHelpers.parse_error is used by default (ParseHelpers is opened + /// at the top of the generated parser file) + parseError: ParseErrorContext<'tok> -> unit; + numTerminals: int; + tagOfErrorTerminal: int } + +//------------------------------------------------------------------------- +// An implementation of stacks. + +// This type is in System.dll so for the moment we can't use it in FSharp.Core.dll +//type Stack<'a> = System.Collections.Generic.Stack<'a> + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type Stack<'a>(n) = +#else +type internal Stack<'a>(n) = +#endif + let mutable contents = Array.zeroCreate<'a>(n) + let mutable count = 0 + + member buf.Ensure newSize = + let oldSize = Array.length contents + if newSize > oldSize then + let old = contents + contents <- Array.zeroCreate (max newSize (oldSize * 2)); + Array.blit old 0 contents 0 count; + + member buf.Count = count + member buf.Pop() = count <- count - 1 + member buf.Peep() = contents.[count - 1] + member buf.Top(n) = [ for x in contents.[max 0 (count-n)..count - 1] -> x ] |> List.rev + member buf.Push(x) = + buf.Ensure(count + 1); + contents.[count] <- x; + count <- count + 1 + + member buf.IsEmpty = (count = 0) +#if __DEBUG + member buf.PrintStack() = + for i = 0 to (count - 1) do +#if FX_NO_CONSOLE + () +#else + System.Console.Write("{0}{1}",(contents.[i]),if i=count-1 then ":" else "-") +#endif +#endif +exception RecoverableParseError +exception Accept of obj + +#if __DEBUG +module Flags = + let mutable debug = false +#endif + +#if INTERNALIZED_FSLEXYACC_RUNTIME +module internal Implementation = +#else +module Implementation = +#endif + + // Definitions shared with fsyacc + let anyMarker = 0xffff + let shiftFlag = 0x0000 + let reduceFlag = 0x4000 + let errorFlag = 0x8000 + let acceptFlag = 0xc000 + let actionMask = 0xc000 + + let actionValue action = action &&& (~~~ actionMask) + let actionKind action = action &&& actionMask + + //------------------------------------------------------------------------- + // Read the tables written by FSYACC. + + type AssocTable(elemTab:uint16[], offsetTab:uint16[]) = + let cache = new Dictionary<_,_>(2000) + + member t.readAssoc (minElemNum,maxElemNum,defaultValueOfAssoc,keyToFind) = + // do a binary chop on the table + let elemNumber : int = (minElemNum+maxElemNum)/2 + if elemNumber = maxElemNum + then defaultValueOfAssoc + else + let x = int elemTab.[elemNumber*2] + if keyToFind = x then + int elemTab.[elemNumber*2+1] + elif keyToFind < x then t.readAssoc (minElemNum ,elemNumber,defaultValueOfAssoc,keyToFind) + else t.readAssoc (elemNumber+1,maxElemNum,defaultValueOfAssoc,keyToFind) + + member t.Read(rowNumber ,keyToFind) = + + // First check the sparse lookaside table + // Performance note: without this lookaside table the binary chop in readAssoc + // takes up around 10% of of parsing time + // for parsing intensive samples such as the bootstrapped F# compiler. + // + // Note: using a .NET Dictionary for this int -> int table looks like it could be sub-optimal. + // Some other better sparse lookup table may be better. + let mutable res = 0 + let cacheKey = (rowNumber <<< 16) ||| keyToFind + let ok = cache.TryGetValue(cacheKey, &res) + if ok then res + else + let headOfTable = int offsetTab.[rowNumber] + let firstElemNumber = headOfTable + 1 + let numberOfElementsInAssoc = int elemTab.[headOfTable*2] + let defaultValueOfAssoc = int elemTab.[headOfTable*2+1] + let res = t.readAssoc (firstElemNumber,(firstElemNumber+numberOfElementsInAssoc),defaultValueOfAssoc,keyToFind) + cache.[cacheKey] <- res + res + + // Read all entries in the association table + // Used during error recovery to find all valid entries in the table + member x.ReadAll(n) = + let headOfTable = int offsetTab.[n] + let firstElemNumber = headOfTable + 1 + let numberOfElementsInAssoc = int32 elemTab.[headOfTable*2] + let defaultValueOfAssoc = int elemTab.[headOfTable*2+1] + [ for i in firstElemNumber .. (firstElemNumber+numberOfElementsInAssoc-1) -> + (int elemTab.[i*2], int elemTab.[i*2+1]) ], defaultValueOfAssoc + + type IdxToIdxListTable(elemTab:uint16[], offsetTab:uint16[]) = + + // Read all entries in a row of the table + member x.ReadAll(n) = + let headOfTable = int offsetTab.[n] + let firstElemNumber = headOfTable + 1 + let numberOfElements = int32 elemTab.[headOfTable] + [ for i in firstElemNumber .. (firstElemNumber+numberOfElements-1) -> int elemTab.[i] ] + + //------------------------------------------------------------------------- + // interpret the tables emitted by FSYACC. + + [] + [] + type ValueInfo = + val value: obj + val startPos: Position + val endPos: Position + new(value,startPos,endPos) = { value=value; startPos=startPos;endPos=endPos } + + let interpret (tables: Tables<'tok>) lexer (lexbuf : LexBuffer<_>) initialState = + let localStore = new Dictionary() in + localStore.["LexBuffer"] <- lexbuf; +#if __DEBUG + if Flags.debug then System.Console.WriteLine("\nParser: interpret tables"); +#endif + let stateStack : Stack = new Stack<_>(100) + stateStack.Push(initialState); + let valueStack = new Stack(100) + let mutable haveLookahead = false + let mutable lookaheadToken = Unchecked.defaultof<'tok> + let mutable lookaheadEndPos = Unchecked.defaultof + let mutable lookaheadStartPos = Unchecked.defaultof + let mutable finished = false + // After an error occurs, we suppress errors until we've shifted three tokens in a row. + let mutable errorSuppressionCountDown = 0 + + // When we hit the end-of-file we don't fail straight away but rather keep permitting shift + // and reduce against the last token in the token stream 20 times or until we've accepted + // or exhausted the stack. This allows error recovery rules of the form + // input : realInput EOF | realInput error EOF | error EOF + // where consuming one EOF to trigger an error doesn't result in overall parse failure + // catastrophe and the loss of intermediate results. + // + let mutable inEofCountDown = false + let mutable eofCountDown = 20 // Number of EOFs to supply at the end for error recovery + // The 100 here means a maximum of 100 elements for each rule + let ruleStartPoss = (Array.zeroCreate 100 : Position array) + let ruleEndPoss = (Array.zeroCreate 100 : Position array) + let ruleValues = (Array.zeroCreate 100 : obj array) + let lhsPos = (Array.zeroCreate 2 : Position array) + let reductions = tables.reductions + let actionTable = new AssocTable(tables.actionTableElements, tables.actionTableRowOffsets) + let gotoTable = new AssocTable(tables.gotos, tables.sparseGotoTableRowOffsets) + let stateToProdIdxsTable = new IdxToIdxListTable(tables.stateToProdIdxsTableElements, tables.stateToProdIdxsTableRowOffsets) + + let parseState = + { new IParseState with + member p.InputRange(n) = ruleStartPoss.[n-1], ruleEndPoss.[n-1]; + member p.InputStartPosition(n) = ruleStartPoss.[n-1] + member p.InputEndPosition(n) = ruleEndPoss.[n-1]; + member p.GetInput(n) = ruleValues.[n-1]; + member p.ResultRange = (lhsPos.[0], lhsPos.[1]); + member p.ParserLocalStore = (localStore :> IDictionary<_,_>); + member p.RaiseError() = raise RecoverableParseError (* NOTE: this binding tests the fairly complex logic associated with an object expression implementing a generic abstract method *) + } + +#if __DEBUG + let report haveLookahead lookaheadToken = + if haveLookahead then sprintf "%A" lookaheadToken + else "[TBC]" +#endif + + // Pop the stack until we can shift the 'error' token. If 'tokenOpt' is given + // then keep popping until we can shift both the 'error' token and the token in 'tokenOpt'. + // This is used at end-of-file to make sure we can shift both the 'error' token and the 'EOF' token. + let rec popStackUntilErrorShifted(tokenOpt) = + // Keep popping the stack until the "error" terminal is shifted +#if __DEBUG + if Flags.debug then System.Console.WriteLine("popStackUntilErrorShifted"); +#endif + if stateStack.IsEmpty then +#if __DEBUG + if Flags.debug then + System.Console.WriteLine("state stack empty during error recovery - generating parse error"); +#endif + failwith "parse error"; + + let currState = stateStack.Peep() +#if __DEBUG + if Flags.debug then + System.Console.WriteLine("In state {0} during error recovery", currState); +#endif + + let action = actionTable.Read(currState, tables.tagOfErrorTerminal) + + if actionKind action = shiftFlag && + (match tokenOpt with + | None -> true + | Some(token) -> + let nextState = actionValue action + actionKind (actionTable.Read(nextState, tables.tagOfToken(token))) = shiftFlag) then + +#if __DEBUG + if Flags.debug then System.Console.WriteLine("shifting error, continuing with error recovery"); +#endif + let nextState = actionValue action + // The "error" non terminal needs position information, though it tends to be unreliable. + // Use the StartPos/EndPos from the lex buffer + valueStack.Push(ValueInfo(box (), lexbuf.StartPos, lexbuf.EndPos)); + stateStack.Push(nextState) + else + if valueStack.IsEmpty then + failwith "parse error"; +#if __DEBUG + if Flags.debug then + System.Console.WriteLine("popping stack during error recovery"); +#endif + valueStack.Pop(); + stateStack.Pop(); + popStackUntilErrorShifted(tokenOpt) + + while not finished do + if stateStack.IsEmpty then + finished <- true + else + let state = stateStack.Peep() +#if __DEBUG + if Flags.debug then (Console.Write("{0} value(state), state ",valueStack.Count); stateStack.PrintStack()) +#endif + let action = + let immediateAction = int tables.immediateActions.[state] + if not (immediateAction = anyMarker) then + // Action has been pre-determined, no need to lookahead + // Expecting it to be a Reduce action on a non-fakeStartNonTerminal ? + immediateAction + else + // Lookahead required to determine action + if not haveLookahead then + if lexbuf.IsPastEndOfStream then + // When the input runs out, keep supplying the last token for eofCountDown times + if eofCountDown>0 then + haveLookahead <- true + eofCountDown <- eofCountDown - 1 + inEofCountDown <- true + else + haveLookahead <- false + else + lookaheadToken <- lexer lexbuf + lookaheadStartPos <- lexbuf.StartPos + lookaheadEndPos <- lexbuf.EndPos + haveLookahead <- true; + + let tag = + if haveLookahead then tables.tagOfToken lookaheadToken + else tables.endOfInputTag + + // Printf.printf "state %d\n" state + actionTable.Read(state,tag) + + let kind = actionKind action + if kind = shiftFlag then ( + if errorSuppressionCountDown > 0 then + errorSuppressionCountDown <- errorSuppressionCountDown - 1; +#if __DEBUG + if Flags.debug then Console.WriteLine("shifting, reduced errorRecoverylevel to {0}\n", errorSuppressionCountDown); +#endif + let nextState = actionValue action + if not haveLookahead then failwith "shift on end of input!"; + let data = tables.dataOfToken lookaheadToken + valueStack.Push(ValueInfo(data, lookaheadStartPos, lookaheadEndPos)); + stateStack.Push(nextState); +#if __DEBUG + if Flags.debug then Console.WriteLine("shift/consume input {0}, shift to state {1}", report haveLookahead lookaheadToken, nextState); +#endif + haveLookahead <- false + + ) elif kind = reduceFlag then + let prod = actionValue action + let reduction = reductions.[prod] + let n = int tables.reductionSymbolCounts.[prod] + // pop the symbols, populate the values and populate the locations +#if __DEBUG + if Flags.debug then Console.Write("reduce popping {0} values/states, lookahead {1}", n, report haveLookahead lookaheadToken); +#endif + + lhsPos.[0] <- Position.Empty; + lhsPos.[1] <- Position.Empty; + for i = 0 to n - 1 do + if valueStack.IsEmpty then failwith "empty symbol stack"; + let topVal = valueStack.Peep() + valueStack.Pop(); + stateStack.Pop(); + ruleValues.[(n-i)-1] <- topVal.value; + ruleStartPoss.[(n-i)-1] <- topVal.startPos; + ruleEndPoss.[(n-i)-1] <- topVal.endPos; + if lhsPos.[1] = Position.Empty then lhsPos.[1] <- topVal.endPos; + if not (topVal.startPos = Position.Empty) then lhsPos.[0] <- topVal.startPos + done; + + try + // Printf.printf "reduce %d\n" prod; + let redResult = reduction parseState + valueStack.Push(ValueInfo(redResult, lhsPos.[0], lhsPos.[1])); + let currState = stateStack.Peep() + let newGotoState = gotoTable.Read(int tables.productionToNonTerminalTable.[prod], currState) + stateStack.Push(newGotoState) +#if __DEBUG + if Flags.debug then Console.WriteLine(" goto state {0}", newGotoState) +#endif + with + | Accept res -> + finished <- true; + valueStack.Push(ValueInfo(res, lhsPos.[0], lhsPos.[1])) + | RecoverableParseError -> +#if __DEBUG + if Flags.debug then Console.WriteLine("RecoverableParseErrorException...\n"); +#endif + popStackUntilErrorShifted(None); + // User code raised a Parse_error. Don't report errors again until three tokens have been shifted + errorSuppressionCountDown <- 3 + elif kind = errorFlag then ( +#if __DEBUG + if Flags.debug then Console.Write("ErrorFlag... "); +#endif + // Silently discard inputs and don't report errors + // until three tokens in a row have been shifted +#if __DEBUG + if Flags.debug then printfn "error on token '%A' " (if haveLookahead then Some(lookaheadToken) else None); +#endif + if errorSuppressionCountDown > 0 then + // If we're in the end-of-file count down then we're very keen to 'Accept'. + // We can only do this by repeatedly popping the stack until we can shift both an 'error' token + // and an EOF token. + if inEofCountDown && eofCountDown < 10 then +#if __DEBUG + if Flags.debug then printfn "poppin stack, lokking to shift both 'error' and that token, during end-of-file error recovery" ; +#endif + popStackUntilErrorShifted(if haveLookahead then Some(lookaheadToken) else None); + + // If we don't haveLookahead then the end-of-file count down is over and we have no further options. + if not haveLookahead then + failwith "parse error: unexpected end of file" + +#if __DEBUG + if Flags.debug then printfn "discarding token '%A' during error suppression" (if haveLookahead then Some(lookaheadToken) else None); +#endif + // Discard the token + haveLookahead <- false + // Try again to shift three tokens + errorSuppressionCountDown <- 3 + else ( + + let currentToken = if haveLookahead then Some(lookaheadToken) else None + let actions,defaultAction = actionTable.ReadAll(state) + let explicit = Set.ofList [ for (tag,_action) in actions -> tag ] + + let shiftableTokens = + [ for (tag,action) in actions do + if (actionKind action) = shiftFlag then + yield tag + if actionKind defaultAction = shiftFlag then + for tag in 0 .. tables.numTerminals-1 do + if not (explicit.Contains(tag)) then + yield tag ] in + + let stateStack = stateStack.Top(12) in + let reducibleProductions = + [ for state in stateStack do + yield stateToProdIdxsTable.ReadAll(state) ] + + let reduceTokens = + [ for (tag,action) in actions do + if actionKind(action) = reduceFlag then + yield tag + if actionKind(defaultAction) = reduceFlag then + for tag in 0 .. tables.numTerminals-1 do + if not (explicit.Contains(tag)) then + yield tag ] in + //let activeRules = stateStack |> List.iter (fun state -> + let errorContext = new ParseErrorContext<'tok>(stateStack,parseState, reduceTokens,currentToken,reducibleProductions, shiftableTokens, "syntax error") + tables.parseError(errorContext); + popStackUntilErrorShifted(None); + errorSuppressionCountDown <- 3; +#if __DEBUG + if Flags.debug then System.Console.WriteLine("generated syntax error and shifted error token, haveLookahead = {0}\n", haveLookahead); +#endif + ) + ) elif kind = acceptFlag then + finished <- true +#if __DEBUG + else + if Flags.debug then System.Console.WriteLine("ALARM!!! drop through case in parser"); +#endif + done; + // OK, we're done - read off the overall generated value + valueStack.Peep().value + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Tables<'tok> with +#else +type Tables<'tok> with +#endif + member tables.Interpret (lexer,lexbuf,initialState) = + Implementation.interpret tables lexer lexbuf initialState + +#if INTERNALIZED_FSLEXYACC_RUNTIME +module internal ParseHelpers = +#else +module ParseHelpers = +#endif + let parse_error (_s:string) = () + let parse_error_rich = (None : (ParseErrorContext<_> -> unit) option) diff --git a/src/buildtools/fslex/Parsing.fsi b/src/buildtools/fslex/Parsing.fsi new file mode 100644 index 0000000000..2fef45975a --- /dev/null +++ b/src/buildtools/fslex/Parsing.fsi @@ -0,0 +1,130 @@ +//========================================================================== +// (c) Microsoft Corporation 2005-2009. +//========================================================================= + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities.Text.Parsing +open Internal.Utilities +open Internal.Utilities.Text.Lexing +#else +namespace Microsoft.FSharp.Text.Parsing +open Microsoft.FSharp.Text.Lexing +#endif + +open System.Collections.Generic + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal IParseState = +#else +/// The information accessible via the parseState value within parser actions. +type IParseState = +#endif + /// Get the start and end position for the terminal or non-terminal at a given index matched by the production + abstract InputRange: index:int -> Position * Position + /// Get the end position for the terminal or non-terminal at a given index matched by the production + abstract InputEndPosition: int -> Position + /// Get the start position for the terminal or non-terminal at a given index matched by the production + abstract InputStartPosition: int -> Position + /// Get the full range of positions matched by the production + abstract ResultRange: Position * Position + /// Get the value produced by the terminal or non-terminal at the given position + abstract GetInput : int -> obj + /// Get the store of local values associated with this parser + // Dynamically typed, non-lexically scoped local store + abstract ParserLocalStore : IDictionary + /// Raise an error in this parse context + abstract RaiseError<'b> : unit -> 'b + + +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal ParseErrorContext<'tok> = +#else +/// The context provided when a parse error occurs +type ParseErrorContext<'tok> = +#endif + /// The stack of state indexes active at the parse error + member StateStack : int list + /// The state active at the parse error + member ParseState : IParseState + /// The tokens that would cause a reduction at the parse error + member ReduceTokens: int list + /// The stack of productions that would be reduced at the parse error + member ReducibleProductions : int list list + /// The token that caused the parse error + member CurrentToken : 'tok option + /// The token that would cause a shift at the parse error + member ShiftTokens : int list + /// The message associated with the parse error + member Message : string + +/// Tables generated by fsyacc +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Tables<'tok> = +#else +/// The type of the tables contained in a file produced by the fsyacc.exe parser generator. +type Tables<'tok> = +#endif + { /// The reduction table + reductions: (IParseState -> obj) array ; + /// The token number indicating the end of input + endOfInputTag: int; + /// A function to compute the tag of a token + tagOfToken: 'tok -> int; + /// A function to compute the data carried by a token + dataOfToken: 'tok -> obj; + /// The sparse action table elements + actionTableElements: uint16[]; + /// The sparse action table row offsets + actionTableRowOffsets: uint16[]; + /// The number of symbols for each reduction + reductionSymbolCounts: uint16[]; + /// The immediate action table + immediateActions: uint16[]; + /// The sparse goto table + gotos: uint16[]; + /// The sparse goto table row offsets + sparseGotoTableRowOffsets: uint16[]; + /// The sparse table for the productions active for each state + stateToProdIdxsTableElements: uint16[]; + /// The sparse table offsets for the productions active for each state + stateToProdIdxsTableRowOffsets: uint16[]; + /// This table is logically part of the Goto table + productionToNonTerminalTable: uint16[]; + /// This function is used to hold the user specified "parse_error" or "parse_error_rich" functions + parseError: ParseErrorContext<'tok> -> unit; + /// The total number of terminals + numTerminals: int; + /// The tag of the error terminal + tagOfErrorTerminal: int } + + /// Interpret the parser table taking input from the given lexer, using the given lex buffer, and the given start state. + /// Returns an object indicating the final synthesized value for the parse. + member Interpret : lexer:(LexBuffer<'char> -> 'tok) * lexbuf:LexBuffer<'char> * startState:int -> obj + +#if INTERNALIZED_FSLEXYACC_RUNTIME +exception internal Accept of obj +exception internal RecoverableParseError +#else +/// Indicates an accept action has occured +exception Accept of obj +/// Indicates a parse error has occured and parse recovery is in progress +exception RecoverableParseError +#endif + +#if __DEBUG +module internal Flags = + val mutable debug : bool +#endif + +#if INTERNALIZED_FSLEXYACC_RUNTIME +module internal ParseHelpers = +#else +/// Helpers used by generated parsers. +module ParseHelpers = +#endif + /// The default implementation of the parse_error_rich function + val parse_error_rich: (ParseErrorContext<'tok> -> unit) option + /// The default implementation of the parse_error function + val parse_error: string -> unit + diff --git a/src/buildtools/fslex/fslex.fs b/src/buildtools/fslex/fslex.fs new file mode 100644 index 0000000000..d2f1af826b --- /dev/null +++ b/src/buildtools/fslex/fslex.fs @@ -0,0 +1,224 @@ +// (c) Microsoft Corporation 2005-2009. + +module internal FsLexYacc.FsLex.Driver + +open FsLexYacc.FsLex +open FsLexYacc.FsLex.AST +open FsLexYacc.FsLex.Parser +open Printf +open Internal.Utilities +open Internal.Utilities.Text.Lexing +open System +open System.Collections.Generic +open System.IO + +//------------------------------------------------------------------ +// This code is duplicated from Microsoft.FSharp.Compiler.UnicodeLexing + +type Lexbuf = LexBuffer + +/// Standard utility to create a Unicode LexBuffer +/// +/// One small annoyance is that LexBuffers and not IDisposable. This means +/// we can't just return the LexBuffer object, since the file it wraps wouldn't +/// get closed when we're finished with the LexBuffer. Hence we return the stream, +/// the reader and the LexBuffer. The caller should dispose the first two when done. +let UnicodeFileAsLexbuf (filename,codePage : int option) : FileStream * StreamReader * Lexbuf = + // Use the .NET functionality to auto-detect the unicode encoding + // It also presents the bytes read to the lexer in UTF8 decoded form + let stream = new FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.Read) + let reader = + match codePage with + | None -> new StreamReader(stream,true) + | Some n -> new StreamReader(stream,System.Text.Encoding.GetEncoding(n)) + let lexbuf = LexBuffer.FromFunction(reader.Read) + lexbuf.EndPos <- Position.FirstLine(filename); + stream, reader, lexbuf + +//------------------------------------------------------------------ +// This is the program proper + +let input = ref None +let out = ref None +let inputCodePage = ref None +let light = ref None + +let mutable lexlib = "Microsoft.FSharp.Text.Lexing" + +let usage = + [ ArgInfo ("-o", ArgType.String (fun s -> out := Some s), "Name the output file."); + ArgInfo ("--codepage", ArgType.Int (fun i -> inputCodePage := Some i), "Assume input lexer specification file is encoded with the given codepage."); + ArgInfo ("--light", ArgType.Unit (fun () -> light := Some true), "(ignored)"); + ArgInfo ("--light-off", ArgType.Unit (fun () -> light := Some false), "Add #light \"off\" to the top of the generated file"); + ArgInfo ("--lexlib", ArgType.String (fun s -> lexlib <- s), "Specify the namespace for the implementation of the lexer table interpreter (default Microsoft.FSharp.Text.Lexing)"); + ArgInfo ("--unicode", ArgType.Set unicode, "Produce a lexer for use with 16-bit unicode characters."); + ] + +let _ = ArgParser.Parse(usage, (fun x -> match !input with Some _ -> failwith "more than one input given" | None -> input := Some x), "fslex ") + +let outputInt (os: TextWriter) (n:int) = os.Write(string n) + +let outputCodedUInt16 (os: #TextWriter) (n:int) = + os.Write n; + os.Write "us; "; + +let sentinel = 255 * 256 + 255 + +let lineCount = ref 0 +let cfprintfn (os: #TextWriter) fmt = Printf.kfprintf (fun () -> incr lineCount; os.WriteLine()) os fmt + +[] +let main(args: string[]) = + try + let filename = (match !input with Some x -> x | None -> failwith "no input given") + let domain = if !unicode then "Unicode" else "Ascii" + let spec = + let stream,reader,lexbuf = UnicodeFileAsLexbuf(filename, !inputCodePage) + use stream = stream + use reader = reader + try + Parser.spec Lexer.token lexbuf + with e -> + eprintf "%s(%d,%d): error: %s" filename lexbuf.StartPos.Line lexbuf.StartPos.Column + (match e with + | Failure s -> s + | _ -> e.Message); + exit 1 + printfn "compiling to dfas (can take a while...)"; + let perRuleData, dfaNodes = AST.Compile spec + let dfaNodes = dfaNodes |> List.sortBy (fun n -> n.Id) + + printfn "%d states" dfaNodes.Length; + printfn "writing output"; + + let output = + match !out with + | Some x -> x + | _ -> + Path.Combine (Path.GetDirectoryName filename,Path.GetFileNameWithoutExtension(filename)) + ".fs" + use os = System.IO.File.CreateText output + + if (!light = Some(false)) || (!light = None && (Path.HasExtension(output) && Path.GetExtension(output) = ".ml")) then + cfprintfn os "#light \"off\""; + + let printLinesIfCodeDefined (code,pos:Position) = + if pos <> Position.Empty // If bottom code is unspecified, then position is empty. + then + cfprintfn os "# %d \"%s\"" pos.Line pos.FileName; + cfprintfn os "%s" code; + + printLinesIfCodeDefined spec.TopCode + let code = fst spec.TopCode + lineCount := !lineCount + code.Replace("\r","").Split([| '\n' |]).Length; + cfprintfn os "# %d \"%s\"" !lineCount output; + + cfprintfn os "let trans : uint16[] array = "; + cfprintfn os " [| "; + if !unicode then + let specificUnicodeChars = GetSpecificUnicodeChars() + // This emits a (numLowUnicodeChars+NumUnicodeCategories+(2*#specificUnicodeChars)+1) * #states array of encoded UInt16 values + + // Each row for the Unicode table has format + // 128 entries for ASCII characters + // A variable number of 2*UInt16 entries for SpecificUnicodeChars + // 30 entries, one for each UnicodeCategory + // 1 entry for EOF + // + // Each entry is an encoded UInt16 value indicating the next state to transition to for this input. + // + // For the SpecificUnicodeChars the entries are char/next-state pairs. + for state in dfaNodes do + cfprintfn os " (* State %d *)" state.Id; + fprintf os " [| "; + let trans = + let dict = new Dictionary<_,_>() + state.Transitions |> List.iter dict.Add + dict + let emit n = + if trans.ContainsKey(n) then + outputCodedUInt16 os trans.[n].Id + else + outputCodedUInt16 os sentinel + for i = 0 to numLowUnicodeChars-1 do + let c = char i + emit (EncodeChar c); + for c in specificUnicodeChars do + outputCodedUInt16 os (int c); + emit (EncodeChar c); + for i = 0 to NumUnicodeCategories-1 do + emit (EncodeUnicodeCategoryIndex i); + emit Eof; + cfprintfn os "|];" + done; + + else + // Each row for the ASCII table has format + // 256 entries for ASCII characters + // 1 entry for EOF + // + // Each entry is an encoded UInt16 value indicating the next state to transition to for this input. + + // This emits a (256+1) * #states array of encoded UInt16 values + for state in dfaNodes do + cfprintfn os " (* State %d *)" state.Id; + fprintf os " [|"; + let trans = + let dict = new Dictionary<_,_>() + state.Transitions |> List.iter dict.Add + dict + let emit n = + if trans.ContainsKey(n) then + outputCodedUInt16 os trans.[n].Id + else + outputCodedUInt16 os sentinel + for i = 0 to 255 do + let c = char i + emit (EncodeChar c); + emit Eof; + cfprintfn os "|];" + done; + + cfprintfn os " |] "; + + fprintf os "let actions : uint16[] = [|"; + for state in dfaNodes do + if state.Accepted.Length > 0 then + outputCodedUInt16 os (snd state.Accepted.Head) + else + outputCodedUInt16 os sentinel + done; + cfprintfn os "|]"; + cfprintfn os "let _fslex_tables = %s.%sTables.Create(trans,actions)" lexlib domain; + + cfprintfn os "let rec _fslex_dummy () = _fslex_dummy() "; + + // These actions push the additional start state and come first, because they are then typically inlined into later + // rules. This means more tailcalls are taken as direct branches, increasing efficiency and + // improving stack usage on platforms that do not take tailcalls. + for ((startNode, actions),(ident,args,_)) in List.zip perRuleData spec.Rules do + cfprintfn os "(* Rule %s *)" ident; + cfprintfn os "and %s %s (lexbuf : %s.LexBuffer<_>) = _fslex_%s %s %d lexbuf" ident (String.Join(" ",Array.ofList args)) lexlib ident (String.Join(" ",Array.ofList args)) startNode.Id; + for ((startNode, actions),(ident,args,_)) in List.zip perRuleData spec.Rules do + cfprintfn os "(* Rule %s *)" ident; + cfprintfn os "and _fslex_%s %s _fslex_state lexbuf =" ident (String.Join(" ",Array.ofList args)); + cfprintfn os " match _fslex_tables.Interpret(_fslex_state,lexbuf) with" ; + actions |> Seq.iteri (fun i (code,pos) -> + cfprintfn os " | %d -> ( " i; + cfprintfn os "# %d \"%s\"" pos.Line pos.FileName; + let lines = code.Split([| '\r'; '\n' |], StringSplitOptions.RemoveEmptyEntries) + for line in lines do + cfprintfn os " %s" line; + cfprintfn os "# %d \"%s\"" !lineCount output; + cfprintfn os " )") + cfprintfn os " | _ -> failwith \"%s\"" ident + + + cfprintfn os ""; + + printLinesIfCodeDefined spec.BottomCode + cfprintfn os "# 3000000 \"%s\"" output; + 0 + + with e -> + eprintf "FSLEX: error FSL000: %s" (match e with Failure s -> s | e -> e.ToString()); + exit 1 diff --git a/src/buildtools/fslex/fslex.fsproj b/src/buildtools/fslex/fslex.fsproj new file mode 100644 index 0000000000..9e21a860d8 --- /dev/null +++ b/src/buildtools/fslex/fslex.fsproj @@ -0,0 +1,22 @@ + + + + Exe + netcoreapp2.0 + INTERNALIZED_FSLEXYACC_RUNTIME;$(DefineConstant) + + + + + + + + + + + + + + + + diff --git a/src/buildtools/fslex/fslexast.fs b/src/buildtools/fslex/fslexast.fs new file mode 100644 index 0000000000..db9727cb97 --- /dev/null +++ b/src/buildtools/fslex/fslexast.fs @@ -0,0 +1,409 @@ +(* (c) Microsoft Corporation 2005-2008. *) + +module internal FsLexYacc.FsLex.AST + +open System.Collections.Generic +open Microsoft.FSharp.Text +open Microsoft.FSharp.Collections +open Internal.Utilities +open Internal.Utilities.Text.Lexing + +let (|KeyValue|) (kvp:KeyValuePair<_,_>) = kvp.Key,kvp.Value + +type Ident = string +type Code = string * Position + +type Alphabet = uint32 + +let Eof : Alphabet = 0xFFFFFFFEu +let Epsilon : Alphabet = 0xFFFFFFFFu + + +let unicode = ref false + +let unicodeCategories = + dict + [| "Pe", System.Globalization.UnicodeCategory.ClosePunctuation; // (Pe) + "Pc", System.Globalization.UnicodeCategory.ConnectorPunctuation; // (Pc) + "Cc", System.Globalization.UnicodeCategory.Control; // (Cc) + "Sc", System.Globalization.UnicodeCategory.CurrencySymbol; // (Sc) + "Pd", System.Globalization.UnicodeCategory.DashPunctuation; // (Pd) + "Nd", System.Globalization.UnicodeCategory.DecimalDigitNumber; // (Nd) + "Me", System.Globalization.UnicodeCategory.EnclosingMark; // (Me) + "Pf", System.Globalization.UnicodeCategory.FinalQuotePunctuation; // (Pf) + "Cf", enum 15; //System.Globalization.UnicodeCategory.Format; // (Cf) + "Pi", System.Globalization.UnicodeCategory.InitialQuotePunctuation; // (Pi) + "Nl", System.Globalization.UnicodeCategory.LetterNumber; // (Nl) + "Zl", System.Globalization.UnicodeCategory.LineSeparator; // (Zl) + "Ll", System.Globalization.UnicodeCategory.LowercaseLetter; // (Ll) + "Sm", System.Globalization.UnicodeCategory.MathSymbol; // (Sm) + "Lm", System.Globalization.UnicodeCategory.ModifierLetter; // (Lm) + "Sk", System.Globalization.UnicodeCategory.ModifierSymbol; // (Sk) + "Mn", System.Globalization.UnicodeCategory.NonSpacingMark; // (Mn) + "Ps", System.Globalization.UnicodeCategory.OpenPunctuation; // (Ps) + "Lo", System.Globalization.UnicodeCategory.OtherLetter; // (Lo) + "Cn", System.Globalization.UnicodeCategory.OtherNotAssigned; // (Cn) + "No", System.Globalization.UnicodeCategory.OtherNumber; // (No) + "Po", System.Globalization.UnicodeCategory.OtherPunctuation; // (Po) + "So", System.Globalization.UnicodeCategory.OtherSymbol; // (So) + "Zp", System.Globalization.UnicodeCategory.ParagraphSeparator; // (Zp) + "Co", System.Globalization.UnicodeCategory.PrivateUse; // (Co) + "Zs", System.Globalization.UnicodeCategory.SpaceSeparator; // (Zs) + "Mc", System.Globalization.UnicodeCategory.SpacingCombiningMark; // (Mc) + "Cs", System.Globalization.UnicodeCategory.Surrogate; // (Cs) + "Lt", System.Globalization.UnicodeCategory.TitlecaseLetter; // (Lt) + "Lu", System.Globalization.UnicodeCategory.UppercaseLetter; // (Lu) + |] + +let NumUnicodeCategories = unicodeCategories.Count +let _ = assert (NumUnicodeCategories = 30) // see table interpreter +let encodedUnicodeCategoryBase = 0xFFFFFF00u +let EncodeUnicodeCategoryIndex(idx:int) = encodedUnicodeCategoryBase + uint32 idx +let EncodeUnicodeCategory(s:string) = + if not (!unicode) then + failwith "unicode category classes may only be used if --unicode is specified"; + if unicodeCategories.ContainsKey(s) then + EncodeUnicodeCategoryIndex (int32 unicodeCategories.[s]) + else + failwithf "invalid Unicode category: '%s'" s + +let IsUnicodeCategory(x:Alphabet) = (encodedUnicodeCategoryBase <= x) && (x < encodedUnicodeCategoryBase + uint32 NumUnicodeCategories) +let UnicodeCategoryIndex(x:Alphabet) = (x - encodedUnicodeCategoryBase) + +let numLowUnicodeChars = 128 +let _ = assert (numLowUnicodeChars = 128) // see table interpreter +let specificUnicodeChars = new Dictionary<_,_>() +let specificUnicodeCharsDecode = new Dictionary<_,_>() +let EncodeChar(c:char) = + let x = System.Convert.ToUInt32 c + if !unicode then + if x < uint32 numLowUnicodeChars then x + else + if not(specificUnicodeChars.ContainsKey(c)) then + let idx = uint32 numLowUnicodeChars + uint32 specificUnicodeChars.Count + specificUnicodeChars.[c] <- idx + specificUnicodeCharsDecode.[idx] <- c + specificUnicodeChars.[c] + else + if x >= 256u then failwithf "the Unicode character '%c' may not be used unless --unicode is specified" c; + x +let DecodeChar(x:Alphabet) = + if !unicode then + if x < uint32 numLowUnicodeChars then System.Convert.ToChar x + else specificUnicodeCharsDecode.[x] + else + if x >= 256u then failwithf "the Unicode character '%x' may not be used unless --unicode is specified" x; + System.Convert.ToChar x + + + +let NumSpecificUnicodeChars() = specificUnicodeChars.Count +let GetSpecificUnicodeChars() = + specificUnicodeChars + |> Seq.sortBy (fun (KeyValue(k,v)) -> v) + |> Seq.map (fun (KeyValue(k,v)) -> k) + +let GetSingleCharAlphabet() = + if !unicode + then Set.ofList [ for c in 0..numLowUnicodeChars-1 do yield (char c) + for c in GetSpecificUnicodeChars() do yield c ] + else Set.ofList [ for x in 0..255 -> (char x) ] + +let GetAlphabet() = + if !unicode + then Set.ofList [ for c in GetSingleCharAlphabet() do yield EncodeChar c + for uc in 0 .. NumUnicodeCategories-1 do yield EncodeUnicodeCategoryIndex uc ] + else Set.ofList [ for c in GetSingleCharAlphabet() do yield EncodeChar c ] + + +//let DecodeAlphabet (x:Alphabet) = System.Convert.ToChar(x) + +(* +for i in 0 .. 65535 do + let c = char i + if System.Char.GetUnicodeCategory c = System.Globalization.UnicodeCategory.PrivateUse then + printfn "i = %x" i +*) + +type Spec = + { TopCode: Code; + Macros: (Ident * Regexp) list; + Rules: (Ident * Ident list * Clause list) list; + BottomCode: Code } +and Clause = Regexp * Code +and Regexp = + | Alt of Regexp list + | Seq of Regexp list + | Inp of Input + | Star of Regexp + | Macro of Ident +and Input = + | Alphabet of Alphabet + | UnicodeCategory of string + | Any + | NotCharSet of Set + +type NodeId = int + +type NfaNode = + { Id: NodeId; + Name: string; + Transitions: Dictionary; + Accepted: (int * int) list } + +type DfaNode = + { Id: int; + Name: string; + mutable Transitions: (Alphabet * DfaNode) list; + Accepted: (int * int) list } + +type MultiMap<'a,'b> = Dictionary<'a,'b list> +let LookupMultiMap (trDict:MultiMap<_,_>) a = + if trDict.ContainsKey(a) then trDict.[a] else [] + +let AddToMultiMap (trDict:MultiMap<_,_>) a b = + let prev = LookupMultiMap trDict a + trDict.[a] <- b::prev + +type NfaNodeMap() = + let map = new Dictionary(100) + member x.Item with get(nid) = map.[nid] + member x.Count = map.Count + + member x.NewNfaNode(trs,ac) = + let nodeId = map.Count+1 // ID zero is reserved + let trDict = new Dictionary<_,_>(List.length trs) + for (a,b) in trs do + AddToMultiMap trDict a b + + let node : NfaNode = {Id=nodeId; Name=string nodeId; Transitions=trDict; Accepted=ac} + map.[nodeId] <-node; + node + +let LexerStateToNfa (macros: Map) (clauses: Clause list) = + + /// Table allocating node ids + let nfaNodeMap = new NfaNodeMap() + + /// Compile a regular expression into the NFA + let rec CompileRegexp re dest = + match re with + | Alt res -> + let trs = res |> List.map (fun re -> (Epsilon,CompileRegexp re dest)) + nfaNodeMap.NewNfaNode(trs,[]) + | Seq res -> + List.foldBack (CompileRegexp) res dest + | Inp (Alphabet c) -> + nfaNodeMap.NewNfaNode([(c, dest)],[]) + + | Star re -> + let nfaNode = nfaNodeMap.NewNfaNode([(Epsilon, dest)],[]) + let sre = CompileRegexp re nfaNode + AddToMultiMap nfaNode.Transitions Epsilon sre + nfaNodeMap.NewNfaNode([(Epsilon,sre); (Epsilon,dest)],[]) + | Macro m -> + if not (macros.ContainsKey(m)) then failwith ("The macro "+m+" is not defined"); + CompileRegexp (macros.[m]) dest + + // These cases unwind the difficult cases in the syntax that rely on knowing the + // entire alphabet. + // + // Note we've delayed the expension of these until we've worked out all the 'special' Unicode characters + // mentioned in the entire lexer spec, i.e. we wait until GetAlphabet returns a reliable and stable answer. + | Inp (UnicodeCategory uc) -> + let re = Alt([ yield Inp(Alphabet(EncodeUnicodeCategory uc)) + // Also include any specific characters in this category + for c in GetSingleCharAlphabet() do + if System.Char.GetUnicodeCategory(c) = unicodeCategories.[uc] then + yield Inp(Alphabet(EncodeChar(c))) ]) + CompileRegexp re dest + + | Inp Any -> + let re = Alt([ for n in GetAlphabet() do yield Inp(Alphabet(n)) ]) + CompileRegexp re dest + + | Inp (NotCharSet chars) -> + let re = Alt [ // Include any characters from those in the alphabet besides those that are not immediately excluded + for c in GetSingleCharAlphabet() do + let ec = EncodeChar c + if not (chars.Contains(ec)) then + yield Inp(Alphabet(ec)) + + // Include all unicode categories + // That is, negations _only_ exclude precisely the given set of characters. You can't + // exclude whole classes of characters as yet + if !unicode then + let ucs = chars |> Set.map(DecodeChar >> System.Char.GetUnicodeCategory) + for KeyValue(nm,uc) in unicodeCategories do + //if ucs.Contains(uc) then + // do printfn "warning: the unicode category '\\%s' ('%s') is automatically excluded by this character set negation. Consider adding this to the negation." nm (uc.ToString()) + // yield! [] + //else + yield Inp(Alphabet(EncodeUnicodeCategory nm)) + ] + CompileRegexp re dest + + let actions = new System.Collections.Generic.List<_>() + + /// Compile an acceptance of a regular expression into the NFA + let sTrans macros nodeId (regexp,code) = + let actionId = actions.Count + actions.Add(code) + let sAccept = nfaNodeMap.NewNfaNode([],[(nodeId,actionId)]) + CompileRegexp regexp sAccept + + let trs = clauses |> List.mapi (fun n x -> (Epsilon,sTrans macros n x)) + let nfaStartNode = nfaNodeMap.NewNfaNode(trs,[]) + nfaStartNode,(actions |> Seq.readonly), nfaNodeMap + +// TODO: consider a better representation here. +type internal NfaNodeIdSetBuilder = HashSet + +type internal NfaNodeIdSet(nodes: NfaNodeIdSetBuilder) = + // BEWARE: the next line is performance critical + let s = nodes |> Seq.toArray |> (fun arr -> Array.sortInPlaceWith compare arr; arr) // 19 + + // These are all surprisingly slower: + //let s = nodes |> Seq.toArray |> Array.sort + //let s = nodes |> Seq.toArray |> Array.sortWith compare // 76 + //let s = nodes |> Seq.toArray |> (fun arr -> Array.sortInPlace arr; arr) // 76 + + member x.Representation = s + member x.Elements = s + member x.Fold f z = Array.fold f z s + interface System.IComparable with + member x.CompareTo(y:obj) = + let y = (y :?> NfaNodeIdSet) + let xr = x.Representation + let yr = y.Representation + let c = compare xr.Length yr.Length + if c <> 0 then c else + let n = yr.Length + let rec go i = + if i >= n then 0 else + let c = compare xr.[i] yr.[i] + if c <> 0 then c else + go (i+1) + go 0 + + override x.Equals(y:obj) = + match y with + | :? NfaNodeIdSet as y -> + let xr = x.Representation + let yr = y.Representation + let n = yr.Length + xr.Length = n && + (let rec go i = (i < n) && xr.[i] = yr.[i] && go (i+1) + go 0) + | _ -> false + + override x.GetHashCode() = hash s + + member x.IsEmpty = (s.Length = 0) + member x.Iterate f = s |> Array.iter f + +type NodeSetSet = Set + +let newDfaNodeId = + let i = ref 0 + fun () -> let res = !i in incr i; res + +let NfaToDfa (nfaNodeMap:NfaNodeMap) nfaStartNode = + let numNfaNodes = nfaNodeMap.Count + let rec EClosure1 (acc:NfaNodeIdSetBuilder) (n:NfaNode) = + if not (acc.Contains(n.Id)) then + acc.Add(n.Id) |> ignore; + if n.Transitions.ContainsKey(Epsilon) then + match n.Transitions.[Epsilon] with + | [] -> () // this Clause is an optimization - the list is normally empty + | tr -> + //printfn "n.Id = %A, #Epsilon = %d" n.Id tr.Length + tr |> List.iter (EClosure1 acc) + + let EClosure (moves:list) = + let acc = new NfaNodeIdSetBuilder(HashIdentity.Structural) + for i in moves do + EClosure1 acc nfaNodeMap.[i]; + new NfaNodeIdSet(acc) + + // Compute all the immediate one-step moves for a set of NFA states, as a dictionary + // mapping inputs to destination lists + let ComputeMoves (nset:NfaNodeIdSet) = + let moves = new MultiMap<_,_>() + nset.Iterate(fun nodeId -> + for (KeyValue(inp,dests)) in nfaNodeMap.[nodeId].Transitions do + if inp <> Epsilon then + match dests with + | [] -> () // this Clause is an optimization - the list is normally empty + | tr -> tr |> List.iter(fun dest -> AddToMultiMap moves inp dest.Id)) + moves + + let acc = new NfaNodeIdSetBuilder(HashIdentity.Structural) + EClosure1 acc nfaStartNode; + let nfaSet0 = new NfaNodeIdSet(acc) + + let dfaNodes = ref (Map.empty) + + let GetDfaNode nfaSet = + if (!dfaNodes).ContainsKey(nfaSet) then + (!dfaNodes).[nfaSet] + else + let dfaNode = + { Id= newDfaNodeId(); + Name = nfaSet.Fold (fun s nid -> nfaNodeMap.[nid].Name+"-"+s) ""; + Transitions=[]; + Accepted= nfaSet.Elements + |> Seq.map (fun nid -> nfaNodeMap.[nid].Accepted) + |> List.concat } + //Printf.printfn "id = %d" dfaNode.Id; + + dfaNodes := (!dfaNodes).Add(nfaSet,dfaNode); + dfaNode + + let workList = ref [nfaSet0] + let doneSet = ref Set.empty + + //let count = ref 0 + let rec Loop () = + match !workList with + | [] -> () + | nfaSet ::t -> + workList := t; + if (!doneSet).Contains(nfaSet) then + Loop () + else + let moves = ComputeMoves nfaSet + for (KeyValue(inp,movesForInput)) in moves do + assert (inp <> Epsilon); + let moveSet = EClosure movesForInput; + if not moveSet.IsEmpty then + //incr count + let dfaNode = GetDfaNode nfaSet + dfaNode.Transitions <- (inp, GetDfaNode moveSet) :: dfaNode.Transitions; + (* Printf.printf "%d (%s) : %s --> %d (%s)\n" dfaNode.Id dfaNode.Name (match inp with EncodeChar c -> String.make 1 c | LEof -> "eof") moveSetDfaNode.Id moveSetDfaNode.Name;*) + workList := moveSet :: !workList; + + doneSet := (!doneSet).Add(nfaSet); + + + Loop() + Loop(); + //Printf.printfn "count = %d" !count; + let ruleStartNode = GetDfaNode nfaSet0 + let ruleNodes = + (!dfaNodes) + |> Seq.map (fun kvp -> kvp.Value) + |> Seq.toList + |> List.sortBy (fun s -> s.Id) + ruleStartNode,ruleNodes + +let Compile spec = + List.foldBack + (fun (name,args,clauses) (perRuleData,dfaNodes) -> + let nfa, actions, nfaNodeMap = LexerStateToNfa (Map.ofList spec.Macros) clauses + let ruleStartNode, ruleNodes = NfaToDfa nfaNodeMap nfa + //Printf.printfn "name = %s, ruleStartNode = %O" name ruleStartNode.Id; + (ruleStartNode,actions) :: perRuleData, ruleNodes @ dfaNodes) + spec.Rules + ([],[]) + diff --git a/src/buildtools/fslex/fslexlex.fs b/src/buildtools/fslex/fslexlex.fs new file mode 100644 index 0000000000..b29bd10f84 --- /dev/null +++ b/src/buildtools/fslex/fslexlex.fs @@ -0,0 +1,735 @@ +# 1 "fslexlex.fsl" + +(* (c) Microsoft Corporation 2005-2008. *) + +module internal FsLexYacc.FsLex.Lexer + +open FsLexYacc.FsLex.AST +open FsLexYacc.FsLex.Parser +open Internal.Utilities +open Internal.Utilities.Text.Lexing +open System.Text + +let escape c = + match c with + | '\\' -> '\\' + | '\'' -> '\'' + | 'n' -> '\n' + | 't' -> '\t' + | 'b' -> '\b' + | 'r' -> '\r' + | c -> c + +let lexeme (lexbuf : LexBuffer) = new System.String(lexbuf.Lexeme) +let newline (lexbuf:LexBuffer<_>) = lexbuf.EndPos <- lexbuf.EndPos.NextLine + +let unexpected_char lexbuf = + failwith ("Unexpected character '"+(lexeme lexbuf)+"'") + +let digit d = + if d >= '0' && d <= '9' then int32 d - int32 '0' + else failwith "digit" + +let hexdigit d = + if d >= '0' && d <= '9' then digit d + else if d >= 'a' && d <= 'f' then int32 d - int32 'a' + 10 + else if d >= 'A' && d <= 'F' then int32 d - int32 'A' + 10 + else failwithf "bad hexdigit: %c" d + +let trigraph c1 c2 c3 = + char (digit c1 * 100 + digit c2 * 10 + digit c3) + +let hexgraph c1 c2 = + char (hexdigit c1 * 16 + hexdigit c2) + +let unicodegraph_short (s:string) = + if s.Length <> 4 then failwith "unicodegraph"; + char(hexdigit s.[0] * 4096 + hexdigit s.[1] * 256 + hexdigit s.[2] * 16 + hexdigit s.[3]) + +let unicodegraph_long (s:string) = + if s.Length <> 8 then failwith "unicodegraph_long"; + let high = hexdigit s.[0] * 4096 + hexdigit s.[1] * 256 + hexdigit s.[2] * 16 + hexdigit s.[3] in + let low = hexdigit s.[4] * 4096 + hexdigit s.[5] * 256 + hexdigit s.[6] * 16 + hexdigit s.[7] in + if high = 0 then None, char low + else + (* A surrogate pair - see http://www.unicode.org/unicode/uni2book/ch03.pdf, section 3.7 *) + Some (char(0xD800 + ((high * 0x10000 + low - 0x10000) / 0x400))), + char(0xDF30 + ((high * 0x10000 + low - 0x10000) % 0x400)) + + +# 60 "fslexlex.fs" +let trans : uint16[] array = + [| + (* State 0 *) + [| 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 4us; 8us; 8us; 5us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 2us; 8us; 8us; 8us; 8us; 1us; 3us; 9us; 6us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 7us; |]; + (* State 1 *) + [| 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 15us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 14us; 65535us; |]; + (* State 2 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 3 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 13us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 4 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 5 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 12us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 6 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 11us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 7 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 8 *) + [| 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 65535us; 10us; 10us; 65535us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 65535us; 10us; 10us; 10us; 10us; 65535us; 65535us; 65535us; 65535us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 65535us; |]; + (* State 9 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 10 *) + [| 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 65535us; 10us; 10us; 65535us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 65535us; 10us; 10us; 10us; 10us; 65535us; 65535us; 65535us; 65535us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 10us; 65535us; |]; + (* State 11 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 12 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 13 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 14 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 16us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 15 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 14us; 65535us; 65535us; 65535us; 65535us; 14us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 14us; 65535us; 65535us; 65535us; 65535us; 65535us; 14us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 14us; 65535us; 65535us; 65535us; 14us; 65535us; 14us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 16 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 17 *) + [| 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 22us; 20us; 24us; 24us; 21us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 22us; 24us; 19us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 24us; 18us; 24us; 24us; 24us; 24us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 22us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 24us; 23us; |]; + (* State 18 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 27us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 27us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 19 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 20 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 21 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 26us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 22 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 23 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 24 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 25 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 25us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 26 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 27 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 28 *) + [| 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 35us; 33us; 38us; 38us; 34us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 35us; 38us; 32us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 36us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 38us; 31us; 38us; 38us; 38us; 38us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 30us; 38us; 29us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 38us; 37us; |]; + (* State 29 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 30 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 31 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 43us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 43us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 32 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 33 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 34 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 42us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 35 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 36 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 39us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 37 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 38 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 39 *) + [| 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 65535us; 40us; 40us; 65535us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 65535us; |]; + (* State 40 *) + [| 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 65535us; 40us; 40us; 65535us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 40us; 65535us; |]; + (* State 41 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 42 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 43 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 44 *) + [| 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 49us; 47us; 51us; 51us; 48us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 49us; 51us; 46us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 51us; 45us; 51us; 51us; 51us; 51us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 49us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 50us; |]; + (* State 45 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 54us; 65535us; 65535us; 55us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 56us; 65535us; 65535us; 65535us; 65535us; 56us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 56us; 65535us; 65535us; 65535us; 65535us; 65535us; 56us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 56us; 65535us; 65535us; 65535us; 56us; 65535us; 56us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 46 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 47 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 48 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 53us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 49 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 50 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 51 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 52 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 53 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 54 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 55 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 54us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 56 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 57 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 58 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 59us; 59us; 59us; 59us; 59us; 59us; 59us; 59us; 59us; 59us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 59 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 60 *) + [| 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 69us; 70us; 87us; 87us; 71us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 69us; 87us; 68us; 87us; 87us; 87us; 87us; 66us; 81us; 82us; 76us; 75us; 87us; 85us; 74us; 86us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 78us; 87us; 77us; 87us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 79us; 87us; 80us; 84us; 83us; 87us; 65us; 72us; 72us; 72us; 63us; 72us; 72us; 72us; 72us; 72us; 72us; 64us; 72us; 72us; 72us; 62us; 72us; 61us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 72us; 67us; 73us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 87us; 88us; |]; + (* State 61 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 136us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 62 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 132us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 63 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 130us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 64 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 128us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 65 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 126us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 66 *) + [| 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 96us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 95us; 65535us; |]; + (* State 67 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 68 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 69 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 94us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 94us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 70 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 71 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 93us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 72 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 73 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 74 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 75 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 76 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 77 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 78 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 79 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 80 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 81 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 91us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 82 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 83 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 84 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 85 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 86 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 89us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 87 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 88 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 89 *) + [| 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 65535us; 90us; 90us; 65535us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 65535us; |]; + (* State 90 *) + [| 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 65535us; 90us; 90us; 65535us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 90us; 65535us; |]; + (* State 91 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 92 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 93 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 94 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 94us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 94us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 95 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 125us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 96 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 95us; 65535us; 65535us; 65535us; 65535us; 95us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 97us; 97us; 97us; 97us; 97us; 97us; 97us; 97us; 97us; 97us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 101us; 100us; 101us; 101us; 101us; 101us; 101us; 65535us; 95us; 65535us; 65535us; 65535us; 65535us; 65535us; 95us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 95us; 65535us; 65535us; 65535us; 95us; 65535us; 95us; 99us; 65535us; 65535us; 98us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 97 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 122us; 122us; 122us; 122us; 122us; 122us; 122us; 122us; 122us; 122us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 98 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 119us; 119us; 119us; 119us; 119us; 119us; 119us; 119us; 119us; 119us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 119us; 119us; 119us; 119us; 119us; 119us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 119us; 119us; 119us; 119us; 119us; 119us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 99 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 114us; 114us; 114us; 114us; 114us; 114us; 114us; 114us; 114us; 114us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 114us; 114us; 114us; 114us; 114us; 114us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 114us; 114us; 114us; 114us; 114us; 114us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 100 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 104us; 104us; 104us; 104us; 104us; 104us; 104us; 104us; 104us; 104us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 104us; 104us; 104us; 104us; 104us; 104us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 105us; 105us; 105us; 105us; 105us; 105us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 101 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 102us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 102 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 103us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 103 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 104 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 106us; 106us; 106us; 106us; 106us; 106us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 106us; 106us; 106us; 106us; 106us; 106us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 105 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 103us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 106us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 106us; 106us; 106us; 106us; 106us; 106us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 106us; 106us; 106us; 106us; 106us; 106us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 106 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 107us; 107us; 107us; 107us; 107us; 107us; 107us; 107us; 107us; 107us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 107us; 107us; 107us; 107us; 107us; 107us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 107us; 107us; 107us; 107us; 107us; 107us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 107 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 108us; 108us; 108us; 108us; 108us; 108us; 108us; 108us; 108us; 108us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 108us; 108us; 108us; 108us; 108us; 108us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 108us; 108us; 108us; 108us; 108us; 108us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 108 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 109us; 109us; 109us; 109us; 109us; 109us; 109us; 109us; 109us; 109us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 109us; 109us; 109us; 109us; 109us; 109us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 109us; 109us; 109us; 109us; 109us; 109us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 109 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 110us; 110us; 110us; 110us; 110us; 110us; 110us; 110us; 110us; 110us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 110us; 110us; 110us; 110us; 110us; 110us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 110us; 110us; 110us; 110us; 110us; 110us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 110 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 111us; 111us; 111us; 111us; 111us; 111us; 111us; 111us; 111us; 111us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 111us; 111us; 111us; 111us; 111us; 111us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 111us; 111us; 111us; 111us; 111us; 111us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 111 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 112us; 112us; 112us; 112us; 112us; 112us; 112us; 112us; 112us; 112us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 112us; 112us; 112us; 112us; 112us; 112us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 112us; 112us; 112us; 112us; 112us; 112us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 112 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 113us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 113 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 114 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 115us; 115us; 115us; 115us; 115us; 115us; 115us; 115us; 115us; 115us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 115us; 115us; 115us; 115us; 115us; 115us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 115us; 115us; 115us; 115us; 115us; 115us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 115 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 116us; 116us; 116us; 116us; 116us; 116us; 116us; 116us; 116us; 116us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 116us; 116us; 116us; 116us; 116us; 116us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 116us; 116us; 116us; 116us; 116us; 116us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 116 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 117us; 117us; 117us; 117us; 117us; 117us; 117us; 117us; 117us; 117us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 117us; 117us; 117us; 117us; 117us; 117us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 117us; 117us; 117us; 117us; 117us; 117us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 117 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 118us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 118 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 119 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 120us; 120us; 120us; 120us; 120us; 120us; 120us; 120us; 120us; 120us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 120us; 120us; 120us; 120us; 120us; 120us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 120us; 120us; 120us; 120us; 120us; 120us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 120 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 121us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 121 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 122 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 123us; 123us; 123us; 123us; 123us; 123us; 123us; 123us; 123us; 123us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 123 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 124us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 124 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 125 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 126 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 127us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 127 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 128 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 129us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 129 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 130 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 131us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 131 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 132 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 133us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 133 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 134us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 134 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 135us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 135 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 136 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 137us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 137 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 138us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 138 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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; 7us; 1us; 7us; 3us; 7us; 7us; 5us; 6us; 7us; 6us; 4us; 3us; 2us; 65535us; 65535us; 0us; 65535us; 5us; 1us; 2us; 5us; 3us; 4us; 5us; 3us; 2us; 0us; 65535us; 0us; 1us; 8us; 3us; 4us; 8us; 5us; 8us; 7us; 8us; 6us; 6us; 5us; 4us; 2us; 65535us; 7us; 3us; 4us; 7us; 5us; 6us; 7us; 5us; 4us; 0us; 65535us; 1us; 65535us; 65535us; 2us; 65535us; 15us; 15us; 15us; 15us; 15us; 31us; 11us; 12us; 13us; 14us; 31us; 15us; 16us; 17us; 18us; 19us; 20us; 21us; 22us; 23us; 24us; 25us; 26us; 27us; 28us; 31us; 31us; 32us; 30us; 30us; 29us; 15us; 14us; 13us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 10us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 9us; 65535us; 65535us; 65535us; 65535us; 8us; 65535us; 65535us; 7us; 65535us; 65535us; 6us; 5us; 15us; 4us; 15us; 3us; 15us; 2us; 15us; 15us; 15us; 1us; 15us; 15us; 0us; |] +let _fslex_tables = Internal.Utilities.Text.Lexing.UnicodeTables.Create(trans,actions) +let rec _fslex_dummy () = _fslex_dummy() +(* Rule token *) +and token (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_token 60 lexbuf +(* Rule string *) +and string p buff (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_string p buff 44 lexbuf +(* Rule code *) +and code p buff (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_code p buff 28 lexbuf +(* Rule codestring *) +and codestring buff (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_codestring buff 17 lexbuf +(* Rule comment *) +and comment p (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_comment p 0 lexbuf +(* Rule token *) +and _fslex_token _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 76 "fslexlex.fsl" + RULE +# 361 "fslexlex.fs" + ) + | 1 -> ( +# 77 "fslexlex.fsl" + PARSE +# 366 "fslexlex.fs" + ) + | 2 -> ( +# 78 "fslexlex.fsl" + EOF +# 371 "fslexlex.fs" + ) + | 3 -> ( +# 79 "fslexlex.fsl" + LET +# 376 "fslexlex.fs" + ) + | 4 -> ( +# 80 "fslexlex.fsl" + AND +# 381 "fslexlex.fs" + ) + | 5 -> ( +# 82 "fslexlex.fsl" + let s = lexeme lexbuf in + CHAR (if s.[1] = '\\' then escape s.[2] else s.[1]) +# 387 "fslexlex.fs" + ) + | 6 -> ( +# 86 "fslexlex.fsl" + let s = lexeme lexbuf in + CHAR (trigraph s.[2] s.[3] s.[4]) +# 393 "fslexlex.fs" + ) + | 7 -> ( +# 90 "fslexlex.fsl" + let s = lexeme lexbuf in + CHAR (hexgraph s.[3] s.[4]) +# 399 "fslexlex.fs" + ) + | 8 -> ( +# 94 "fslexlex.fsl" + let s = lexeme lexbuf in + CHAR (unicodegraph_short s.[3..6]) +# 405 "fslexlex.fs" + ) + | 9 -> ( +# 98 "fslexlex.fsl" + let s = lexeme lexbuf in + match (unicodegraph_long s.[3..10]) with + | None, c -> CHAR(c) + | Some _ , _ -> failwith "Unicode characters needing surrogate pairs are not yet supported by this tool" +# 413 "fslexlex.fs" + ) + | 10 -> ( +# 104 "fslexlex.fsl" + let s = (lexeme lexbuf).[2..3] in + UNICODE_CATEGORY (s) +# 419 "fslexlex.fs" + ) + | 11 -> ( +# 107 "fslexlex.fsl" + let p = lexbuf.StartPos in + let buff = (new StringBuilder 100) in + // adjust the first line to get even indentation for all lines w.r.t. the left hand margin + buff.Append (String.replicate (lexbuf.StartPos.Column+1) " ") |> ignore; + code p buff lexbuf +# 428 "fslexlex.fs" + ) + | 12 -> ( +# 113 "fslexlex.fsl" + string lexbuf.StartPos (new StringBuilder 100) lexbuf +# 433 "fslexlex.fs" + ) + | 13 -> ( +# 115 "fslexlex.fsl" + token lexbuf +# 438 "fslexlex.fs" + ) + | 14 -> ( +# 116 "fslexlex.fsl" + newline lexbuf; token lexbuf +# 443 "fslexlex.fs" + ) + | 15 -> ( +# 117 "fslexlex.fsl" + IDENT (lexeme lexbuf) +# 448 "fslexlex.fs" + ) + | 16 -> ( +# 118 "fslexlex.fsl" + BAR +# 453 "fslexlex.fs" + ) + | 17 -> ( +# 119 "fslexlex.fsl" + DOT +# 458 "fslexlex.fs" + ) + | 18 -> ( +# 120 "fslexlex.fsl" + PLUS +# 463 "fslexlex.fs" + ) + | 19 -> ( +# 121 "fslexlex.fsl" + STAR +# 468 "fslexlex.fs" + ) + | 20 -> ( +# 122 "fslexlex.fsl" + QMARK +# 473 "fslexlex.fs" + ) + | 21 -> ( +# 123 "fslexlex.fsl" + EQUALS +# 478 "fslexlex.fs" + ) + | 22 -> ( +# 124 "fslexlex.fsl" + LBRACK +# 483 "fslexlex.fs" + ) + | 23 -> ( +# 125 "fslexlex.fsl" + RBRACK +# 488 "fslexlex.fs" + ) + | 24 -> ( +# 126 "fslexlex.fsl" + LPAREN +# 493 "fslexlex.fs" + ) + | 25 -> ( +# 127 "fslexlex.fsl" + RPAREN +# 498 "fslexlex.fs" + ) + | 26 -> ( +# 128 "fslexlex.fsl" + UNDERSCORE +# 503 "fslexlex.fs" + ) + | 27 -> ( +# 129 "fslexlex.fsl" + HAT +# 508 "fslexlex.fs" + ) + | 28 -> ( +# 130 "fslexlex.fsl" + DASH +# 513 "fslexlex.fs" + ) + | 29 -> ( +# 131 "fslexlex.fsl" + ignore(comment lexbuf.StartPos lexbuf); token lexbuf +# 518 "fslexlex.fs" + ) + | 30 -> ( +# 132 "fslexlex.fsl" + token lexbuf +# 523 "fslexlex.fs" + ) + | 31 -> ( +# 133 "fslexlex.fsl" + unexpected_char lexbuf +# 528 "fslexlex.fs" + ) + | 32 -> ( +# 134 "fslexlex.fsl" + EOF +# 533 "fslexlex.fs" + ) + | _ -> failwith "token" +(* Rule string *) +and _fslex_string p buff _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 136 "fslexlex.fsl" + newline lexbuf; string p buff lexbuf +# 542 "fslexlex.fs" + ) + | 1 -> ( +# 138 "fslexlex.fsl" + let _ = buff.Append (escape (lexeme lexbuf).[1]) in + string p buff lexbuf +# 548 "fslexlex.fs" + ) + | 2 -> ( +# 141 "fslexlex.fsl" + let s = lexeme lexbuf in + let _ = buff.Append (trigraph s.[1] s.[2] s.[3]) in + string p buff lexbuf +# 555 "fslexlex.fs" + ) + | 3 -> ( +# 144 "fslexlex.fsl" + STRING (buff.ToString()) +# 560 "fslexlex.fs" + ) + | 4 -> ( +# 145 "fslexlex.fsl" + newline lexbuf; + let _ = buff.Append System.Environment.NewLine in + string p buff lexbuf +# 567 "fslexlex.fs" + ) + | 5 -> ( +# 149 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + string p buff lexbuf +# 573 "fslexlex.fs" + ) + | 6 -> ( +# 151 "fslexlex.fsl" + failwith (Printf.sprintf "end of file in string started at (%d,%d)" p.pos_lnum (p.pos_cnum - p.pos_bol)) +# 578 "fslexlex.fs" + ) + | 7 -> ( +# 152 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf).[0] in + string p buff lexbuf +# 584 "fslexlex.fs" + ) + | _ -> failwith "string" +(* Rule code *) +and _fslex_code p buff _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 155 "fslexlex.fsl" + CODE (buff.ToString(), p) +# 593 "fslexlex.fs" + ) + | 1 -> ( +# 156 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + ignore(code p buff lexbuf); + let _ = buff.Append "}" in + code p buff lexbuf +# 601 "fslexlex.fs" + ) + | 2 -> ( +# 161 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + code p buff lexbuf +# 607 "fslexlex.fs" + ) + | 3 -> ( +# 163 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + ignore(codestring buff lexbuf); + code p buff lexbuf +# 614 "fslexlex.fs" + ) + | 4 -> ( +# 166 "fslexlex.fsl" + newline lexbuf; + let _ = buff.Append System.Environment.NewLine in + code p buff lexbuf +# 621 "fslexlex.fs" + ) + | 5 -> ( +# 170 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + code p buff lexbuf +# 627 "fslexlex.fs" + ) + | 6 -> ( +# 173 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + code p buff lexbuf +# 633 "fslexlex.fs" + ) + | 7 -> ( +# 175 "fslexlex.fsl" + EOF +# 638 "fslexlex.fs" + ) + | 8 -> ( +# 176 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf).[0] in + code p buff lexbuf +# 644 "fslexlex.fs" + ) + | _ -> failwith "code" +(* Rule codestring *) +and _fslex_codestring buff _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 181 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + codestring buff lexbuf +# 654 "fslexlex.fs" + ) + | 1 -> ( +# 183 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + buff.ToString() +# 660 "fslexlex.fs" + ) + | 2 -> ( +# 185 "fslexlex.fsl" + newline lexbuf; + let _ = buff.Append System.Environment.NewLine in + codestring buff lexbuf +# 667 "fslexlex.fs" + ) + | 3 -> ( +# 189 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf) in + codestring buff lexbuf +# 673 "fslexlex.fs" + ) + | 4 -> ( +# 191 "fslexlex.fsl" + failwith "unterminated string in code" +# 678 "fslexlex.fs" + ) + | 5 -> ( +# 192 "fslexlex.fsl" + let _ = buff.Append (lexeme lexbuf).[0] in + codestring buff lexbuf +# 684 "fslexlex.fs" + ) + | _ -> failwith "codestring" +(* Rule comment *) +and _fslex_comment p _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 196 "fslexlex.fsl" + comment p lexbuf +# 693 "fslexlex.fs" + ) + | 1 -> ( +# 197 "fslexlex.fsl" + ignore(try string lexbuf.StartPos (new StringBuilder 100) lexbuf + with Failure s -> failwith (s + "\n" + Printf.sprintf "error while processing string nested in comment started at (%d,%d)" p.pos_lnum (p.pos_cnum - p.pos_bol))); + comment p lexbuf +# 700 "fslexlex.fs" + ) + | 2 -> ( +# 200 "fslexlex.fsl" + ignore(try comment p lexbuf with Failure s -> failwith (s + "\n" + Printf.sprintf "error while processing nested comment started at (%d,%d)" p.pos_lnum (p.pos_cnum - p.pos_bol))); + comment p lexbuf +# 706 "fslexlex.fs" + ) + | 3 -> ( +# 202 "fslexlex.fsl" + newline lexbuf; comment p lexbuf +# 711 "fslexlex.fs" + ) + | 4 -> ( +# 203 "fslexlex.fsl" + () +# 716 "fslexlex.fs" + ) + | 5 -> ( +# 204 "fslexlex.fsl" + failwith (Printf.sprintf "end of file in comment started at (%d,%d)" p.pos_lnum (p.pos_cnum - p.pos_bol)) +# 721 "fslexlex.fs" + ) + | 6 -> ( +# 205 "fslexlex.fsl" + comment p lexbuf +# 726 "fslexlex.fs" + ) + | 7 -> ( +# 206 "fslexlex.fsl" + comment p lexbuf +# 731 "fslexlex.fs" + ) + | _ -> failwith "comment" + +# 3000000 "fslexlex.fs" diff --git a/src/buildtools/fslex/fslexpars.fs b/src/buildtools/fslex/fslexpars.fs new file mode 100644 index 0000000000..87268dcb7f --- /dev/null +++ b/src/buildtools/fslex/fslexpars.fs @@ -0,0 +1,651 @@ +// Implementation file for parser generated by fsyacc +module internal FsLexYacc.FsLex.Parser +#nowarn "64";; // turn off warnings that type variables used in production annotations are instantiated to concrete type +open Internal.Utilities.Text.Lexing +open Internal.Utilities.Text.Parsing.ParseHelpers +# 1 "fslexpars.fsy" + +(* (c) Microsoft Corporation 2005-2008. *) + +open FsLexYacc.FsLex +open FsLexYacc.FsLex.AST + + +# 14 "fslexpars.fs" +// This type is the type of tokens accepted by the parser +type token = + | EOF + | BAR + | DOT + | PLUS + | STAR + | QMARK + | EQUALS + | UNDERSCORE + | LBRACK + | RBRACK + | HAT + | DASH + | RULE + | PARSE + | LET + | AND + | LPAREN + | RPAREN + | UNICODE_CATEGORY of (string) + | CHAR of (char) + | CODE of (AST.Code) + | STRING of (string) + | IDENT of (string) +// This type is used to give symbolic names to token indexes, useful for error messages +type tokenId = + | TOKEN_EOF + | TOKEN_BAR + | TOKEN_DOT + | TOKEN_PLUS + | TOKEN_STAR + | TOKEN_QMARK + | TOKEN_EQUALS + | TOKEN_UNDERSCORE + | TOKEN_LBRACK + | TOKEN_RBRACK + | TOKEN_HAT + | TOKEN_DASH + | TOKEN_RULE + | TOKEN_PARSE + | TOKEN_LET + | TOKEN_AND + | TOKEN_LPAREN + | TOKEN_RPAREN + | TOKEN_UNICODE_CATEGORY + | TOKEN_CHAR + | TOKEN_CODE + | TOKEN_STRING + | TOKEN_IDENT + | TOKEN_end_of_input + | TOKEN_error +// This type is used to give symbolic names to token indexes, useful for error messages +type nonTerminalId = + | NONTERM__startspec + | NONTERM_spec + | NONTERM_codeopt + | NONTERM_Macros + | NONTERM_macro + | NONTERM_Rules + | NONTERM_rule + | NONTERM_args + | NONTERM_optbar + | NONTERM_clauses + | NONTERM_clause + | NONTERM_regexp + | NONTERM_charset + +// This function maps tokens to integer indexes +let tagOfToken (t:token) = + match t with + | EOF -> 0 + | BAR -> 1 + | DOT -> 2 + | PLUS -> 3 + | STAR -> 4 + | QMARK -> 5 + | EQUALS -> 6 + | UNDERSCORE -> 7 + | LBRACK -> 8 + | RBRACK -> 9 + | HAT -> 10 + | DASH -> 11 + | RULE -> 12 + | PARSE -> 13 + | LET -> 14 + | AND -> 15 + | LPAREN -> 16 + | RPAREN -> 17 + | UNICODE_CATEGORY _ -> 18 + | CHAR _ -> 19 + | CODE _ -> 20 + | STRING _ -> 21 + | IDENT _ -> 22 + +// This function maps integer indexes to symbolic token ids +let tokenTagToTokenId (tokenIdx:int) = + match tokenIdx with + | 0 -> TOKEN_EOF + | 1 -> TOKEN_BAR + | 2 -> TOKEN_DOT + | 3 -> TOKEN_PLUS + | 4 -> TOKEN_STAR + | 5 -> TOKEN_QMARK + | 6 -> TOKEN_EQUALS + | 7 -> TOKEN_UNDERSCORE + | 8 -> TOKEN_LBRACK + | 9 -> TOKEN_RBRACK + | 10 -> TOKEN_HAT + | 11 -> TOKEN_DASH + | 12 -> TOKEN_RULE + | 13 -> TOKEN_PARSE + | 14 -> TOKEN_LET + | 15 -> TOKEN_AND + | 16 -> TOKEN_LPAREN + | 17 -> TOKEN_RPAREN + | 18 -> TOKEN_UNICODE_CATEGORY + | 19 -> TOKEN_CHAR + | 20 -> TOKEN_CODE + | 21 -> TOKEN_STRING + | 22 -> TOKEN_IDENT + | 25 -> TOKEN_end_of_input + | 23 -> 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 +let prodIdxToNonTerminal (prodIdx:int) = + match prodIdx with + | 0 -> NONTERM__startspec + | 1 -> NONTERM_spec + | 2 -> NONTERM_codeopt + | 3 -> NONTERM_codeopt + | 4 -> NONTERM_Macros + | 5 -> NONTERM_Macros + | 6 -> NONTERM_macro + | 7 -> NONTERM_Rules + | 8 -> NONTERM_Rules + | 9 -> NONTERM_rule + | 10 -> NONTERM_args + | 11 -> NONTERM_args + | 12 -> NONTERM_optbar + | 13 -> NONTERM_optbar + | 14 -> NONTERM_clauses + | 15 -> NONTERM_clauses + | 16 -> NONTERM_clause + | 17 -> NONTERM_regexp + | 18 -> NONTERM_regexp + | 19 -> NONTERM_regexp + | 20 -> NONTERM_regexp + | 21 -> NONTERM_regexp + | 22 -> NONTERM_regexp + | 23 -> NONTERM_regexp + | 24 -> NONTERM_regexp + | 25 -> NONTERM_regexp + | 26 -> NONTERM_regexp + | 27 -> NONTERM_regexp + | 28 -> NONTERM_regexp + | 29 -> NONTERM_regexp + | 30 -> NONTERM_regexp + | 31 -> NONTERM_charset + | 32 -> NONTERM_charset + | 33 -> NONTERM_charset + | _ -> failwith "prodIdxToNonTerminal: bad production index" + +let _fsyacc_endOfInputTag = 25 +let _fsyacc_tagOfErrorTerminal = 23 + +// This function gets the name of a token as a string +let token_to_string (t:token) = + match t with + | EOF -> "EOF" + | BAR -> "BAR" + | DOT -> "DOT" + | PLUS -> "PLUS" + | STAR -> "STAR" + | QMARK -> "QMARK" + | EQUALS -> "EQUALS" + | UNDERSCORE -> "UNDERSCORE" + | LBRACK -> "LBRACK" + | RBRACK -> "RBRACK" + | HAT -> "HAT" + | DASH -> "DASH" + | RULE -> "RULE" + | PARSE -> "PARSE" + | LET -> "LET" + | AND -> "AND" + | LPAREN -> "LPAREN" + | RPAREN -> "RPAREN" + | UNICODE_CATEGORY _ -> "UNICODE_CATEGORY" + | CHAR _ -> "CHAR" + | CODE _ -> "CODE" + | STRING _ -> "STRING" + | IDENT _ -> "IDENT" + +// This function gets the data carried by a token as an object +let _fsyacc_dataOfToken (t:token) = + match t with + | EOF -> (null : System.Object) + | BAR -> (null : System.Object) + | DOT -> (null : System.Object) + | PLUS -> (null : System.Object) + | STAR -> (null : System.Object) + | QMARK -> (null : System.Object) + | EQUALS -> (null : System.Object) + | UNDERSCORE -> (null : System.Object) + | LBRACK -> (null : System.Object) + | RBRACK -> (null : System.Object) + | HAT -> (null : System.Object) + | DASH -> (null : System.Object) + | RULE -> (null : System.Object) + | PARSE -> (null : System.Object) + | LET -> (null : System.Object) + | AND -> (null : System.Object) + | LPAREN -> (null : System.Object) + | RPAREN -> (null : System.Object) + | UNICODE_CATEGORY _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | CHAR _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | CODE _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | STRING _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | IDENT _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x +let _fsyacc_gotos = [| 0us; 65535us; 1us; 65535us; 0us; 1us; 2us; 65535us; 0us; 2us; 5us; 6us; 2us; 65535us; 2us; 3us; 8us; 9us; 2us; 65535us; 2us; 8us; 8us; 8us; 2us; 65535us; 4us; 5us; 15us; 16us; 2us; 65535us; 4us; 14us; 15us; 14us; 2us; 65535us; 17us; 18us; 23us; 24us; 1us; 65535us; 20us; 21us; 2us; 65535us; 21us; 22us; 27us; 28us; 2us; 65535us; 21us; 26us; 27us; 26us; 10us; 65535us; 12us; 13us; 13us; 37us; 21us; 29us; 27us; 29us; 29us; 37us; 37us; 37us; 38us; 37us; 39us; 37us; 43us; 38us; 44us; 39us; 5us; 65535us; 46us; 47us; 47us; 55us; 49us; 50us; 50us; 55us; 55us; 55us; |] +let _fsyacc_sparseGotoTableRowOffsets = [|0us; 1us; 3us; 6us; 9us; 12us; 15us; 18us; 21us; 23us; 26us; 29us; 40us; |] +let _fsyacc_stateToProdIdxsTableElements = [| 1us; 0us; 1us; 0us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 2us; 1us; 5us; 1us; 5us; 1us; 6us; 1us; 6us; 1us; 6us; 6us; 6us; 23us; 24us; 25us; 26us; 27us; 2us; 7us; 8us; 1us; 7us; 1us; 7us; 1us; 9us; 1us; 9us; 1us; 9us; 1us; 9us; 1us; 9us; 1us; 9us; 1us; 11us; 1us; 11us; 1us; 13us; 2us; 14us; 15us; 1us; 14us; 1us; 14us; 6us; 16us; 23us; 24us; 25us; 26us; 27us; 1us; 16us; 1us; 17us; 1us; 18us; 1us; 19us; 1us; 20us; 1us; 21us; 1us; 22us; 6us; 23us; 23us; 24us; 25us; 26us; 27us; 6us; 23us; 24us; 25us; 26us; 27us; 27us; 6us; 23us; 24us; 25us; 26us; 27us; 28us; 1us; 24us; 1us; 25us; 1us; 26us; 1us; 27us; 1us; 28us; 1us; 28us; 2us; 29us; 30us; 2us; 29us; 33us; 1us; 29us; 1us; 30us; 2us; 30us; 33us; 1us; 30us; 2us; 31us; 32us; 1us; 32us; 1us; 32us; 2us; 33us; 33us; |] +let _fsyacc_stateToProdIdxsTableRowOffsets = [|0us; 2us; 4us; 6us; 8us; 10us; 12us; 14us; 16us; 18us; 20us; 22us; 24us; 26us; 33us; 36us; 38us; 40us; 42us; 44us; 46us; 48us; 50us; 52us; 54us; 56us; 58us; 61us; 63us; 65us; 72us; 74us; 76us; 78us; 80us; 82us; 84us; 86us; 93us; 100us; 107us; 109us; 111us; 113us; 115us; 117us; 119us; 122us; 125us; 127us; 129us; 132us; 134us; 137us; 139us; 141us; |] +let _fsyacc_action_rows = 56 +let _fsyacc_actionTableElements = [|1us; 16387us; 20us; 7us; 0us; 49152us; 1us; 16388us; 14us; 10us; 1us; 32768us; 12us; 4us; 1us; 32768us; 22us; 17us; 1us; 16387us; 20us; 7us; 0us; 16385us; 0us; 16386us; 1us; 16388us; 14us; 10us; 0us; 16389us; 1us; 32768us; 22us; 11us; 1us; 32768us; 6us; 12us; 8us; 32768us; 0us; 33us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 12us; 16390us; 0us; 33us; 1us; 43us; 3us; 40us; 4us; 41us; 5us; 42us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 1us; 16392us; 15us; 15us; 1us; 32768us; 22us; 17us; 0us; 16391us; 1us; 16394us; 22us; 23us; 1us; 32768us; 6us; 19us; 1us; 32768us; 13us; 20us; 1us; 16396us; 1us; 25us; 8us; 32768us; 0us; 33us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 0us; 16393us; 1us; 16394us; 22us; 23us; 0us; 16395us; 0us; 16397us; 1us; 16399us; 1us; 27us; 8us; 32768us; 0us; 33us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 0us; 16398us; 13us; 32768us; 0us; 33us; 1us; 43us; 3us; 40us; 4us; 41us; 5us; 42us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 20us; 30us; 21us; 35us; 22us; 36us; 0us; 16400us; 0us; 16401us; 0us; 16402us; 0us; 16403us; 0us; 16404us; 0us; 16405us; 0us; 16406us; 11us; 16407us; 0us; 33us; 3us; 40us; 4us; 41us; 5us; 42us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 11us; 16411us; 0us; 33us; 3us; 40us; 4us; 41us; 5us; 42us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 13us; 32768us; 0us; 33us; 1us; 43us; 3us; 40us; 4us; 41us; 5us; 42us; 7us; 34us; 8us; 46us; 16us; 44us; 17us; 45us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 0us; 16408us; 0us; 16409us; 0us; 16410us; 8us; 32768us; 0us; 33us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 8us; 32768us; 0us; 33us; 7us; 34us; 8us; 46us; 16us; 44us; 18us; 32us; 19us; 31us; 21us; 35us; 22us; 36us; 0us; 16412us; 2us; 32768us; 10us; 49us; 19us; 52us; 2us; 32768us; 9us; 48us; 19us; 52us; 0us; 16413us; 1us; 32768us; 19us; 52us; 2us; 32768us; 9us; 51us; 19us; 52us; 0us; 16414us; 1us; 16415us; 11us; 53us; 1us; 32768us; 19us; 54us; 0us; 16416us; 1us; 16417us; 19us; 52us; |] +let _fsyacc_actionTableRowOffsets = [|0us; 2us; 3us; 5us; 7us; 9us; 11us; 12us; 13us; 15us; 16us; 18us; 20us; 29us; 42us; 44us; 46us; 47us; 49us; 51us; 53us; 55us; 64us; 65us; 67us; 68us; 69us; 71us; 80us; 81us; 95us; 96us; 97us; 98us; 99us; 100us; 101us; 102us; 114us; 126us; 140us; 141us; 142us; 143us; 152us; 161us; 162us; 165us; 168us; 169us; 171us; 174us; 175us; 177us; 179us; 180us; |] +let _fsyacc_reductionSymbolCounts = [|1us; 5us; 1us; 0us; 0us; 2us; 4us; 3us; 1us; 6us; 0us; 2us; 0us; 1us; 3us; 1us; 2us; 1us; 1us; 1us; 1us; 1us; 1us; 2us; 2us; 2us; 2us; 3us; 3us; 3us; 4us; 1us; 3us; 2us; |] +let _fsyacc_productionToNonTerminalTable = [|0us; 1us; 2us; 2us; 3us; 3us; 4us; 5us; 5us; 6us; 7us; 7us; 8us; 8us; 9us; 9us; 10us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 11us; 12us; 12us; 12us; |] +let _fsyacc_immediateActions = [|65535us; 49152us; 65535us; 65535us; 65535us; 65535us; 16385us; 16386us; 65535us; 16389us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 16391us; 65535us; 65535us; 65535us; 65535us; 65535us; 16393us; 65535us; 16395us; 16397us; 65535us; 65535us; 16398us; 65535us; 16400us; 16401us; 16402us; 16403us; 16404us; 16405us; 16406us; 65535us; 65535us; 65535us; 16408us; 16409us; 16410us; 65535us; 65535us; 16412us; 65535us; 65535us; 16413us; 65535us; 65535us; 16414us; 65535us; 65535us; 16416us; 65535us; |] +let _fsyacc_reductions () = [| +# 246 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : AST.Spec)) in + Microsoft.FSharp.Core.Operators.box + ( + ( + raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) + ) + : '_startspec)); +# 255 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'codeopt)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'Macros)) in + let _4 = (let data = parseState.GetInput(4) in (Microsoft.FSharp.Core.Operators.unbox data : 'Rules)) in + let _5 = (let data = parseState.GetInput(5) in (Microsoft.FSharp.Core.Operators.unbox data : 'codeopt)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 24 "fslexpars.fsy" + { TopCode=_1;Macros=_2;Rules=_4;BottomCode=_5 } + ) +# 24 "fslexpars.fsy" + : AST.Spec)); +# 269 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : AST.Code)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 25 "fslexpars.fsy" + _1 + ) +# 25 "fslexpars.fsy" + : 'codeopt)); +# 280 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 25 "fslexpars.fsy" + "", (parseState.ResultRange |> fst) + ) +# 25 "fslexpars.fsy" + : 'codeopt)); +# 290 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 26 "fslexpars.fsy" + [] + ) +# 26 "fslexpars.fsy" + : 'Macros)); +# 300 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'macro)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'Macros)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 26 "fslexpars.fsy" + _1 :: _2 + ) +# 26 "fslexpars.fsy" + : 'Macros)); +# 312 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + let _4 = (let data = parseState.GetInput(4) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 27 "fslexpars.fsy" + (_2, _4) + ) +# 27 "fslexpars.fsy" + : 'macro)); +# 324 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'rule)) in + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : 'Rules)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 28 "fslexpars.fsy" + _1 :: _3 + ) +# 28 "fslexpars.fsy" + : 'Rules)); +# 336 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'rule)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 28 "fslexpars.fsy" + [_1] + ) +# 28 "fslexpars.fsy" + : 'Rules)); +# 347 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'args)) in + let _5 = (let data = parseState.GetInput(5) in (Microsoft.FSharp.Core.Operators.unbox data : 'optbar)) in + let _6 = (let data = parseState.GetInput(6) in (Microsoft.FSharp.Core.Operators.unbox data : 'clauses)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 29 "fslexpars.fsy" + (_1,_2,_6) + ) +# 29 "fslexpars.fsy" + : 'rule)); +# 361 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 30 "fslexpars.fsy" + [] + ) +# 30 "fslexpars.fsy" + : 'args)); +# 371 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'args)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 30 "fslexpars.fsy" + _1 :: _2 + ) +# 30 "fslexpars.fsy" + : 'args)); +# 383 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 31 "fslexpars.fsy" + + ) +# 31 "fslexpars.fsy" + : 'optbar)); +# 393 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 31 "fslexpars.fsy" + + ) +# 31 "fslexpars.fsy" + : 'optbar)); +# 403 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'clause)) in + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : 'clauses)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 32 "fslexpars.fsy" + _1 :: _3 + ) +# 32 "fslexpars.fsy" + : 'clauses)); +# 415 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'clause)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 32 "fslexpars.fsy" + [_1] + ) +# 32 "fslexpars.fsy" + : 'clauses)); +# 426 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : AST.Code)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 33 "fslexpars.fsy" + _1, _2 + ) +# 33 "fslexpars.fsy" + : 'clause)); +# 438 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : char)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 35 "fslexpars.fsy" + Inp(Alphabet(EncodeChar _1)) + ) +# 35 "fslexpars.fsy" + : 'regexp)); +# 449 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 36 "fslexpars.fsy" + Inp(UnicodeCategory _1) + ) +# 36 "fslexpars.fsy" + : 'regexp)); +# 460 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 37 "fslexpars.fsy" + Inp(Alphabet(Eof)) + ) +# 37 "fslexpars.fsy" + : 'regexp)); +# 470 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 38 "fslexpars.fsy" + Inp Any + ) +# 38 "fslexpars.fsy" + : 'regexp)); +# 480 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 39 "fslexpars.fsy" + Seq([ for n in 0 .. _1.Length - 1 -> Inp(Alphabet(EncodeChar _1.[n]))]) + ) +# 39 "fslexpars.fsy" + : 'regexp)); +# 491 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 40 "fslexpars.fsy" + Macro(_1) + ) +# 40 "fslexpars.fsy" + : 'regexp)); +# 502 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 41 "fslexpars.fsy" + Seq[_1;_2] + ) +# 41 "fslexpars.fsy" + : 'regexp)); +# 514 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 42 "fslexpars.fsy" + Seq[_1;Star _1] + ) +# 42 "fslexpars.fsy" + : 'regexp)); +# 525 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 43 "fslexpars.fsy" + Star _1 + ) +# 43 "fslexpars.fsy" + : 'regexp)); +# 536 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 44 "fslexpars.fsy" + Alt[Seq[];_1] + ) +# 44 "fslexpars.fsy" + : 'regexp)); +# 547 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 45 "fslexpars.fsy" + Alt[_1;_3] + ) +# 45 "fslexpars.fsy" + : 'regexp)); +# 559 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'regexp)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 46 "fslexpars.fsy" + _2 + ) +# 46 "fslexpars.fsy" + : 'regexp)); +# 570 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'charset)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 47 "fslexpars.fsy" + Alt [ for c in _2 -> Inp(Alphabet(c)) ] + ) +# 47 "fslexpars.fsy" + : 'regexp)); +# 581 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : 'charset)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 48 "fslexpars.fsy" + Inp(NotCharSet(_3)) + ) +# 48 "fslexpars.fsy" + : 'regexp)); +# 592 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : char)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 51 "fslexpars.fsy" + Set.singleton(EncodeChar _1) + ) +# 51 "fslexpars.fsy" + : 'charset)); +# 603 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : char)) in + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : char)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 52 "fslexpars.fsy" + Set.ofSeq [ for c in _1 .. _3 -> EncodeChar c ] + ) +# 52 "fslexpars.fsy" + : 'charset)); +# 615 "fslexpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'charset)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'charset)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 53 "fslexpars.fsy" + Set.union _1 _2 + ) +# 53 "fslexpars.fsy" + : 'charset)); +|] +# 628 "fslexpars.fs" +let tables () : Internal.Utilities.Text.Parsing.Tables<_> = + { reductions= _fsyacc_reductions (); + endOfInputTag = _fsyacc_endOfInputTag; + tagOfToken = tagOfToken; + dataOfToken = _fsyacc_dataOfToken; + actionTableElements = _fsyacc_actionTableElements; + actionTableRowOffsets = _fsyacc_actionTableRowOffsets; + stateToProdIdxsTableElements = _fsyacc_stateToProdIdxsTableElements; + stateToProdIdxsTableRowOffsets = _fsyacc_stateToProdIdxsTableRowOffsets; + reductionSymbolCounts = _fsyacc_reductionSymbolCounts; + immediateActions = _fsyacc_immediateActions; + gotos = _fsyacc_gotos; + sparseGotoTableRowOffsets = _fsyacc_sparseGotoTableRowOffsets; + tagOfErrorTerminal = _fsyacc_tagOfErrorTerminal; + parseError = (fun (ctxt:Internal.Utilities.Text.Parsing.ParseErrorContext<_>) -> + match parse_error_rich with + | Some f -> f ctxt + | None -> parse_error ctxt.Message); + numTerminals = 26; + productionToNonTerminalTable = _fsyacc_productionToNonTerminalTable } +let engine lexer lexbuf startState = (tables ()).Interpret(lexer, lexbuf, startState) +let spec lexer lexbuf : AST.Spec = + Microsoft.FSharp.Core.Operators.unbox ((tables ()).Interpret(lexer, lexbuf, 0)) diff --git a/src/buildtools/fsyacc/App.config b/src/buildtools/fsyacc/App.config new file mode 100644 index 0000000000..e1b09eda9f --- /dev/null +++ b/src/buildtools/fsyacc/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/buildtools/fsyacc/Arg.fs b/src/buildtools/fsyacc/Arg.fs new file mode 100644 index 0000000000..a1f63bd963 --- /dev/null +++ b/src/buildtools/fsyacc/Arg.fs @@ -0,0 +1,133 @@ +// (c) Microsoft Corporation 2005-2009. + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities +#else +namespace Microsoft.FSharp.Text +#endif + + +type ArgType = + | ClearArg of bool ref + | FloatArg of (float -> unit) + | IntArg of (int -> unit) + | RestArg of (string -> unit) + | SetArg of bool ref + | StringArg of (string -> unit) + | UnitArg of (unit -> unit) + static member Clear r = ClearArg r + static member Float r = FloatArg r + static member Int r = IntArg r + static member Rest r = RestArg r + static member Set r = SetArg r + static member String r = StringArg r + static member Unit r = UnitArg r + + +type ArgInfo (name,action,help) = + member x.Name = name + member x.ArgType = action + member x.HelpText = help + +exception Bad of string +exception HelpText of string + +[] +type ArgParser() = + static let getUsage specs u = + let sbuf = new System.Text.StringBuilder 100 + let pstring (s:string) = sbuf.Append s |> ignore + let pendline s = pstring s; pstring "\n" + pendline u; + List.iter (fun (arg:ArgInfo) -> + match arg.Name, arg.ArgType, arg.HelpText with + | (s, (UnitArg _ | SetArg _ | ClearArg _), helpText) -> pstring "\t"; pstring s; pstring ": "; pendline helpText + | (s, StringArg _, helpText) -> pstring "\t"; pstring s; pstring " : "; pendline helpText + | (s, IntArg _, helpText) -> pstring "\t"; pstring s; pstring " : "; pendline helpText + | (s, FloatArg _, helpText) -> pstring "\t"; pstring s; pstring " : "; pendline helpText + | (s, RestArg _, helpText) -> pstring "\t"; pstring s; pstring " ...: "; pendline helpText) + specs; + pstring "\t"; pstring "--help"; pstring ": "; pendline "display this list of options"; + pstring "\t"; pstring "-help"; pstring ": "; pendline "display this list of options"; + sbuf.ToString() + + + static member ParsePartial(cursor,argv,argSpecs:seq,?other,?usageText) = + let other = defaultArg other (fun _ -> ()) + let usageText = defaultArg usageText "" + let nargs = Array.length argv + incr cursor; + let argSpecs = argSpecs |> Seq.toList + let specs = argSpecs |> List.map (fun (arg:ArgInfo) -> arg.Name, arg.ArgType) + while !cursor < nargs do + let arg = argv.[!cursor] + let rec findMatchingArg args = + match args with + | ((s, action) :: _) when s = arg -> + let getSecondArg () = + if !cursor + 1 >= nargs then + raise(Bad("option "+s+" needs an argument.\n"+getUsage argSpecs usageText)); + argv.[!cursor+1] + + match action with + | UnitArg f -> + f (); + incr cursor + | SetArg f -> + f := true; + incr cursor + | ClearArg f -> + f := false; + incr cursor + | StringArg f-> + let arg2 = getSecondArg() + f arg2; + cursor := !cursor + 2 + | IntArg f -> + let arg2 = getSecondArg () + let arg2 = try int32 arg2 with _ -> raise(Bad(getUsage argSpecs usageText)) in + f arg2; + cursor := !cursor + 2; + | FloatArg f -> + let arg2 = getSecondArg() + let arg2 = try float arg2 with _ -> raise(Bad(getUsage argSpecs usageText)) in + f arg2; + cursor := !cursor + 2; + | RestArg f -> + incr cursor; + while !cursor < nargs do + f (argv.[!cursor]); + incr cursor; + + | (_ :: more) -> findMatchingArg more + | [] -> + if arg = "-help" || arg = "--help" || arg = "/help" || arg = "/help" || arg = "/?" then + raise (HelpText (getUsage argSpecs usageText)) + // Note: for '/abc/def' does not count as an argument + // Note: '/abc' does + elif arg.Length>0 && (arg.[0] = '-' || (arg.[0] = '/' && not (arg.Length > 1 && arg.[1..].Contains ("/")))) then + raise (Bad ("unrecognized argument: "+ arg + "\n" + getUsage argSpecs usageText)) + else + other arg; + incr cursor + findMatchingArg specs + + static member Usage (specs,?usage) = + let usage = defaultArg usage "" + System.Console.Error.WriteLine (getUsage (Seq.toList specs) usage) + + #if FX_NO_COMMAND_LINE_ARGS + #else + static member Parse (specs,?other,?usageText) = + let current = ref 0 + let argv = System.Environment.GetCommandLineArgs() + try ArgParser.ParsePartial (current, argv, specs, ?other=other, ?usageText=usageText) + with + | Bad h + | HelpText h -> + System.Console.Error.WriteLine h; + System.Console.Error.Flush(); + System.Environment.Exit(1); + | e -> + reraise() + #endif diff --git a/src/buildtools/fsyacc/Arg.fsi b/src/buildtools/fsyacc/Arg.fsi new file mode 100644 index 0000000000..367f69f959 --- /dev/null +++ b/src/buildtools/fsyacc/Arg.fsi @@ -0,0 +1,50 @@ +// (c) Microsoft Corporation 2005-2009. + +/// A simple command-line argument processor. +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities +#else +namespace Microsoft.FSharp.Text +#endif + +/// The spec value describes the action of the argument, +/// and whether it expects a following parameter. +[] +type ArgType = + static member Clear : bool ref -> ArgType + static member Float : (float -> unit) -> ArgType + static member Int : (int -> unit) -> ArgType + static member Rest : (string -> unit) -> ArgType + static member Set : bool ref -> ArgType + static member String : (string -> unit) -> ArgType + static member Unit : (unit -> unit) -> ArgType + +type ArgInfo = + new : name:string * action:ArgType * help:string -> ArgInfo + /// Return the name of the argument + member Name : string + /// Return the argument type and action of the argument + member ArgType : ArgType + /// Return the usage help associated with the argument + member HelpText : string + +[] +type ArgParser = + #if FX_NO_COMMAND_LINE_ARGS + #else + + /// Parse some of the arguments given by 'argv', starting at the given position + [] + static member ParsePartial: cursor: int ref * argv: string[] * arguments:seq * ?otherArgs: (string -> unit) * ?usageText:string -> unit + + /// Parse the arguments given by System.Environment.GetEnvironmentVariables() + /// according to the argument processing specifications "specs". + /// Args begin with "-". Non-arguments are passed to "f" in + /// order. "use" is printed as part of the usage line if an error occurs. + + static member Parse: arguments:seq * ?otherArgs: (string -> unit) * ?usageText:string -> unit + #endif + + /// Prints the help for each argument. + static member Usage : arguments:seq * ?usage:string -> unit + diff --git a/src/buildtools/fsyacc/Lexing.fs b/src/buildtools/fsyacc/Lexing.fs new file mode 100644 index 0000000000..8337717d6f --- /dev/null +++ b/src/buildtools/fsyacc/Lexing.fs @@ -0,0 +1,423 @@ +// (c) Microsoft Corporation 2005-2009. + +#nowarn "47" // recursive initialization of LexBuffer + + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities.Text.Lexing + +#else +namespace Microsoft.FSharp.Text.Lexing +#endif + + open System.Collections.Generic + + // REVIEW: This type showed up on a parsing-intensive performance measurement. Consider whether it can be a struct-record later when we have this feature. -jomo +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal Position = +#else + type Position = +#endif + { pos_fname : string; + pos_lnum : int; +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum : int; +#endif + pos_bol : int; + pos_cnum : int; } + member x.FileName = x.pos_fname + member x.Line = x.pos_lnum +#if INTERNALIZED_FSLEXYACC_RUNTIME + member x.OriginalLine = x.pos_orig_lnum +#endif + member x.Char = x.pos_cnum + member x.AbsoluteOffset = x.pos_cnum + member x.StartOfLine = x.pos_bol + member x.StartOfLineAbsoluteOffset = x.pos_bol + member x.Column = x.pos_cnum - x.pos_bol + member pos.NextLine = + { pos with +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum = pos.OriginalLine + 1; +#endif + pos_lnum = pos.Line+1; + pos_bol = pos.AbsoluteOffset } + member pos.EndOfToken(n) = {pos with pos_cnum=pos.pos_cnum + n } + member pos.AsNewLinePos() = pos.NextLine + member pos.ShiftColumnBy(by) = {pos with pos_cnum = pos.pos_cnum + by} + static member Empty = + { pos_fname=""; + pos_lnum= 0; +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum = 0; +#endif + pos_bol= 0; + pos_cnum=0 } + static member FirstLine(filename) = + { pos_fname=filename; +#if INTERNALIZED_FSLEXYACC_RUNTIME + pos_orig_lnum = 1; +#endif + pos_lnum= 1; + pos_bol= 0; + pos_cnum=0 } + +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal LexBufferFiller<'char> = +#else + type LexBufferFiller<'char> = +#endif + { fillSync : (LexBuffer<'char> -> unit) option + fillAsync : (LexBuffer<'char> -> Async) option } + + and [] +#if INTERNALIZED_FSLEXYACC_RUNTIME + internal LexBuffer<'char>(filler: LexBufferFiller<'char>) as this = +#else + LexBuffer<'char>(filler: LexBufferFiller<'char>) as this = +#endif + let context = new Dictionary(1) in + let extendBufferSync = (fun () -> match filler.fillSync with Some refill -> refill this | None -> invalidOp "attempt to read synchronously from an asynchronous lex buffer") + let extendBufferAsync = (fun () -> match filler.fillAsync with Some refill -> refill this | None -> invalidOp "attempt to read asynchronously from a synchronous lex buffer") + let mutable buffer=[||]; + /// number of valid charactes beyond bufferScanStart + let mutable bufferMaxScanLength=0; + /// count into the buffer when scanning + let mutable bufferScanStart=0; + /// number of characters scanned so far + let mutable bufferScanLength=0; + /// length of the scan at the last accepting state + let mutable lexemeLength=0; + /// action related to the last accepting state + let mutable bufferAcceptAction=0; + let mutable eof = false; + let mutable startPos = Position.Empty ; + let mutable endPos = Position.Empty + + // Throw away all the input besides the lexeme + + let discardInput () = + let keep = Array.sub buffer bufferScanStart bufferScanLength + let nkeep = keep.Length + Array.blit keep 0 buffer 0 nkeep; + bufferScanStart <- 0; + bufferMaxScanLength <- nkeep + + + member lexbuf.EndOfScan () : int = + // Printf.eprintf "endOfScan, lexBuffer.lexemeLength = %d\n" lexBuffer.lexemeLength; + if bufferAcceptAction < 0 then + failwith "unrecognized input" + + // Printf.printf "endOfScan %d state %d on unconsumed input '%c' (%d)\n" a s (Char.chr inp) inp; + // Printf.eprintf "accept, lexeme = %s\n" (lexeme lexBuffer); + lexbuf.StartPos <- endPos; + lexbuf.EndPos <- endPos.EndOfToken(lexbuf.LexemeLength); + bufferAcceptAction + + member lexbuf.StartPos + with get() = startPos + and set(b) = startPos <- b + + member lexbuf.EndPos + with get() = endPos + and set(b) = endPos <- b + + member lexbuf.Lexeme = Array.sub buffer bufferScanStart lexemeLength + member lexbuf.LexemeChar(n) = buffer.[n+bufferScanStart] + + member lexbuf.BufferLocalStore = (context :> IDictionary<_,_>) + member lexbuf.LexemeLength with get() : int = lexemeLength and set v = lexemeLength <- v + member internal lexbuf.Buffer with get() : 'char[] = buffer and set v = buffer <- v + member internal lexbuf.BufferMaxScanLength with get() = bufferMaxScanLength and set v = bufferMaxScanLength <- v + member internal lexbuf.BufferScanLength with get() = bufferScanLength and set v = bufferScanLength <- v + member internal lexbuf.BufferScanStart with get() : int = bufferScanStart and set v = bufferScanStart <- v + member internal lexbuf.BufferAcceptAction with get() = bufferAcceptAction and set v = bufferAcceptAction <- v + member internal lexbuf.RefillBuffer = extendBufferSync + member internal lexbuf.AsyncRefillBuffer = extendBufferAsync + + static member LexemeString(lexbuf:LexBuffer) = + new System.String(lexbuf.Buffer,lexbuf.BufferScanStart,lexbuf.LexemeLength) + + member lexbuf.IsPastEndOfStream + with get() = eof + and set(b) = eof <- b + + member lexbuf.DiscardInput() = discardInput () + + member x.BufferScanPos = bufferScanStart + bufferScanLength + + member lexbuf.EnsureBufferSize n = + if lexbuf.BufferScanPos + n >= buffer.Length then + let repl = Array.zeroCreate (lexbuf.BufferScanPos + n) + Array.blit buffer bufferScanStart repl bufferScanStart bufferScanLength; + buffer <- repl + + static member FromReadFunctions (syncRead : ('char[] * int * int -> int) option, asyncRead : ('char[] * int * int -> Async) option) : LexBuffer<'char> = + let extension= Array.zeroCreate 4096 + let fillers = + { fillSync = + match syncRead with + | None -> None + | Some read -> + Some (fun lexBuffer -> + let n = read(extension,0,extension.Length) + lexBuffer.EnsureBufferSize n; + Array.blit extension 0 lexBuffer.Buffer lexBuffer.BufferScanPos n; + lexBuffer.BufferMaxScanLength <- lexBuffer.BufferScanLength + n); + fillAsync = + match asyncRead with + | None -> None + | Some read -> + Some (fun lexBuffer -> + async { + let! n = read(extension,0,extension.Length) + lexBuffer.EnsureBufferSize n; + Array.blit extension 0 lexBuffer.Buffer lexBuffer.BufferScanPos n; + lexBuffer.BufferMaxScanLength <- lexBuffer.BufferScanLength + n }) } + new LexBuffer<_>(fillers) + + // A full type signature is required on this method because it is used at more specific types within its own scope + static member FromFunction (f : 'char[] * int * int -> int) : LexBuffer<'char> = LexBuffer<_>.FromReadFunctions(Some(f),None) + static member FromAsyncFunction (f : 'char[] * int * int -> Async) : LexBuffer<'char> = LexBuffer<_>.FromReadFunctions(None,Some(f)) + + static member FromCharFunction f : LexBuffer = + LexBuffer.FromFunction(fun (buff,start,len) -> + let buff2 = Array.zeroCreate len + let n = f buff2 len + Array.blit buff2 0 buff start len + n) + static member FromByteFunction f : LexBuffer = + LexBuffer.FromFunction(fun (buff,start,len) -> + let buff2 = Array.zeroCreate len + let n = f buff2 len + Array.blit buff2 0 buff start len + n) + + // A full type signature is required on this method because it is used at more specific types within its own scope + static member FromArray (s: 'char[]) : LexBuffer<'char> = + let lexBuffer = + new LexBuffer<_> + { fillSync = Some (fun _ -> ()); + fillAsync = Some (fun _ -> async { return () }) } + let buffer = Array.copy s + lexBuffer.Buffer <- buffer; + lexBuffer.BufferMaxScanLength <- buffer.Length; + lexBuffer + + static member FromBytes (arr) = LexBuffer.FromArray(arr) + static member FromChars (arr) = LexBuffer.FromArray(arr) + static member FromString (s:string) = LexBuffer.FromChars (s.ToCharArray()) + + static member FromTextReader (tr:System.IO.TextReader) : LexBuffer = + LexBuffer.FromFunction(tr.Read) + + static member FromBinaryReader (br:System.IO.BinaryReader) : LexBuffer = + LexBuffer.FromFunction(br.Read) + + static member FromStream (stream:System.IO.Stream) : LexBuffer = + LexBuffer.FromReadFunctions(Some(stream.Read),Some(fun (buf,offset,len) -> stream.AsyncRead(buf,offset=offset,count=len))) + + module GenericImplFragments = + let startInterpret(lexBuffer:LexBuffer<_>)= + lexBuffer.BufferScanStart <- lexBuffer.BufferScanStart + lexBuffer.LexemeLength; + lexBuffer.BufferMaxScanLength <- lexBuffer.BufferMaxScanLength - lexBuffer.LexemeLength; + lexBuffer.BufferScanLength <- 0; + lexBuffer.LexemeLength <- 0; + lexBuffer.BufferAcceptAction <- -1; + + let afterRefill (trans: uint16[] array,sentinel,lexBuffer:LexBuffer<_>,scanUntilSentinel,endOfScan,state,eofPos) = + // end of file occurs if we couldn't extend the buffer + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + let snew = int trans.[state].[eofPos] // == EOF + if snew = sentinel then + endOfScan() + else + if lexBuffer.IsPastEndOfStream then failwith "End of file on lexing stream"; + lexBuffer.IsPastEndOfStream <- true; + // Printf.printf "state %d --> %d on eof\n" state snew; + scanUntilSentinel(lexBuffer,snew) + else + scanUntilSentinel(lexBuffer, state) + + let onAccept (lexBuffer:LexBuffer<_>,a) = + lexBuffer.LexemeLength <- lexBuffer.BufferScanLength; + lexBuffer.BufferAcceptAction <- a; + + open GenericImplFragments + + [] +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal AsciiTables(trans: uint16[] array, accept: uint16[]) = +#else + type AsciiTables(trans: uint16[] array, accept: uint16[]) = +#endif + let rec scanUntilSentinel(lexBuffer, state) = + let sentinel = 255 * 256 + 255 + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept (lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + lexBuffer.RefillBuffer (); + // end of file occurs if we couldn't extend the buffer + afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,lexBuffer.EndOfScan,state,256 (* == EOF *) ) + else + // read a character - end the scan if there are no further transitions + let inp = int(lexBuffer.Buffer.[lexBuffer.BufferScanPos]) + let snew = int trans.[state].[inp] + if snew = sentinel then + lexBuffer.EndOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + // Printf.printf "state %d --> %d on '%c' (%d)\n" state snew (Char.chr inp) inp; + scanUntilSentinel(lexBuffer, snew) + + /// Interpret tables for an ascii lexer generated by fslex. + member tables.Interpret(initialState,lexBuffer : LexBuffer) = + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + /// Interpret tables for an ascii lexer generated by fslex. + member tables.AsyncInterpret(initialState,lexBuffer : LexBuffer) = + + let rec scanUntilSentinel(lexBuffer,state) : Async = + async { + let sentinel = 255 * 256 + 255 + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept (lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + do! lexBuffer.AsyncRefillBuffer (); + // end of file occurs if we couldn't extend the buffer + return! afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,endOfScan,state,256 (* == EOF *) ) + else + // read a character - end the scan if there are no further transitions + let inp = int(lexBuffer.Buffer.[lexBuffer.BufferScanPos]) + let snew = int trans.[state].[inp] + if snew = sentinel then + return! endOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + return! scanUntilSentinel(lexBuffer,snew) + } + and endOfScan() = + async { return lexBuffer.EndOfScan() } + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + + static member Create(trans,accept) = new AsciiTables(trans,accept) + + [] +#if INTERNALIZED_FSLEXYACC_RUNTIME + type internal UnicodeTables(trans: uint16[] array, accept: uint16[]) = +#else + type UnicodeTables(trans: uint16[] array, accept: uint16[]) = +#endif + let sentinel = 255 * 256 + 255 + let numUnicodeCategories = 30 + let numLowUnicodeChars = 128 + let numSpecificUnicodeChars = (trans.[0].Length - 1 - numLowUnicodeChars - numUnicodeCategories)/2 + let lookupUnicodeCharacters (state,inp) = + let inpAsInt = int inp + // Is it a fast ASCII character? + if inpAsInt < numLowUnicodeChars then + int trans.[state].[inpAsInt] + else + // Search for a specific unicode character + let baseForSpecificUnicodeChars = numLowUnicodeChars + let rec loop i = + if i >= numSpecificUnicodeChars then + // OK, if we failed then read the 'others' entry in the alphabet, + // which covers all Unicode characters not covered in other + // ways + let baseForUnicodeCategories = numLowUnicodeChars+numSpecificUnicodeChars*2 + let unicodeCategory = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(inp) + //System.Console.WriteLine("inp = {0}, unicodeCategory = {1}", [| box inp; box unicodeCategory |]); + int trans.[state].[baseForUnicodeCategories + int32 unicodeCategory] + else + // This is the specific unicode character + let c = char (int trans.[state].[baseForSpecificUnicodeChars+i*2]) + //System.Console.WriteLine("c = {0}, inp = {1}, i = {2}", [| box c; box inp; box i |]); + // OK, have we found the entry for a specific unicode character? + if c = inp + then int trans.[state].[baseForSpecificUnicodeChars+i*2+1] + else loop(i+1) + + loop 0 + let eofPos = numLowUnicodeChars + 2*numSpecificUnicodeChars + numUnicodeCategories + + let rec scanUntilSentinel(lexBuffer,state) = + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept(lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + lexBuffer.RefillBuffer (); + // end of file occurs if we couldn't extend the buffer + afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,lexBuffer.EndOfScan,state,eofPos) + else + // read a character - end the scan if there are no further transitions + let inp = lexBuffer.Buffer.[lexBuffer.BufferScanPos] + + // Find the new state + let snew = lookupUnicodeCharacters (state,inp) + + if snew = sentinel then + lexBuffer.EndOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + // Printf.printf "state %d --> %d on '%c' (%d)\n" s snew (char inp) inp; + scanUntilSentinel(lexBuffer,snew) + + // Each row for the Unicode table has format + // 128 entries for ASCII characters + // A variable number of 2*UInt16 entries for SpecificUnicodeChars + // 30 entries, one for each UnicodeCategory + // 1 entry for EOF + + member tables.Interpret(initialState,lexBuffer : LexBuffer) = + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + member tables.AsyncInterpret(initialState,lexBuffer : LexBuffer) = + + let rec scanUntilSentinel(lexBuffer, state) = + async { + // Return an endOfScan after consuming the input + let a = int accept.[state] + if a <> sentinel then + onAccept(lexBuffer,a) + + if lexBuffer.BufferScanLength = lexBuffer.BufferMaxScanLength then + lexBuffer.DiscardInput(); + lexBuffer.RefillBuffer (); + // end of file occurs if we couldn't extend the buffer + return! afterRefill (trans,sentinel,lexBuffer,scanUntilSentinel,endOfScan,state,eofPos) + else + // read a character - end the scan if there are no further transitions + let inp = lexBuffer.Buffer.[lexBuffer.BufferScanPos] + + // Find the new state + let snew = lookupUnicodeCharacters (state,inp) + + if snew = sentinel then + return! endOfScan() + else + lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; + return! scanUntilSentinel(lexBuffer, snew) + } + and endOfScan() = + async { return lexBuffer.EndOfScan() } + startInterpret(lexBuffer) + scanUntilSentinel(lexBuffer, initialState) + + static member Create(trans,accept) = new UnicodeTables(trans,accept) diff --git a/src/buildtools/fsyacc/Lexing.fsi b/src/buildtools/fsyacc/Lexing.fsi new file mode 100644 index 0000000000..e31ad411aa --- /dev/null +++ b/src/buildtools/fsyacc/Lexing.fsi @@ -0,0 +1,151 @@ +//========================================================================== +// LexBuffers are for use with automatically generated lexical analyzers, +// in particular those produced by 'fslex'. +// +// (c) Microsoft Corporation 2005-2008. +//=========================================================================== + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities.Text.Lexing +#else +namespace Microsoft.FSharp.Text.Lexing +#endif + +open System.Collections.Generic + +/// Position information stored for lexing tokens +// +// Note: this is an OCaml compat record type. +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Position = +#else +type Position = +#endif + { /// The file name for the position + pos_fname: string; + /// The line number for the position + pos_lnum: int; +#if INTERNALIZED_FSLEXYACC_RUNTIME + /// The line number for the position in the original source file + pos_orig_lnum : int; +#endif + /// The absolute offset of the beginning of the line + pos_bol: int; + /// The absolute offset of the column for the position + pos_cnum: int; } + /// The file name associated with the input stream. + member FileName : string + /// The line number in the input stream, assuming fresh positions have been updated + /// using AsNewLinePos() and by modifying the EndPos property of the LexBuffer. + member Line : int +#if INTERNALIZED_FSLEXYACC_RUNTIME + /// The line number for the position in the input stream, assuming fresh positions have been updated + /// using AsNewLinePos() + member OriginalLine : int +#endif + [] + member Char : int + /// The character number in the input stream + member AbsoluteOffset : int + /// Return absolute offset of the start of the line marked by the position + member StartOfLineAbsoluteOffset : int + /// Return the column number marked by the position, i.e. the difference between the AbsoluteOffset and the StartOfLineAbsoluteOffset + member Column : int + // Given a position just beyond the end of a line, return a position at the start of the next line + member NextLine : Position + + /// Given a position at the start of a token of length n, return a position just beyond the end of the token + member EndOfToken: n:int -> Position + /// Gives a position shifted by specified number of characters + member ShiftColumnBy: by:int -> Position + + [] + member AsNewLinePos : unit -> Position + + /// Get an arbitrary position, with the empty string as filename, and + static member Empty : Position + + /// Get a position corresponding to the first line (line number 1) in a given file + static member FirstLine : filename:string -> Position + +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal LexBuffer<'char> = +#else +/// Input buffers consumed by lexers generated by fslex.exe +type LexBuffer<'char> = +#endif + /// The start position for the lexeme + member StartPos: Position with get,set + /// The end position for the lexeme + member EndPos: Position with get,set + /// The matched string + member Lexeme: 'char array + + /// Fast helper to turn the matched characters into a string, avoiding an intermediate array + static member LexemeString : LexBuffer -> string + + /// The length of the matched string + member LexemeLength: int + /// Fetch a particular character in the matched string + member LexemeChar: int -> 'char + + /// Dynamically typed, non-lexically scoped parameter table + member BufferLocalStore : IDictionary + + /// True if the refill of the buffer ever failed , or if explicitly set to true. + member IsPastEndOfStream: bool with get,set + /// Remove all input, though don't discard the current lexeme + member DiscardInput: unit -> unit + + /// Create a lex buffer suitable for byte lexing that reads characters from the given array + static member FromBytes: byte[] -> LexBuffer + /// Create a lex buffer suitable for Unicode lexing that reads characters from the given array + static member FromChars: char[] -> LexBuffer + /// Create a lex buffer suitable for Unicode lexing that reads characters from the given string + static member FromString: string -> LexBuffer + /// Create a lex buffer that reads character or byte inputs by using the given function + static member FromFunction: ('char[] * int * int -> int) -> LexBuffer<'char> + /// Create a lex buffer that asynchronously reads character or byte inputs by using the given function + static member FromAsyncFunction: ('char[] * int * int -> Async) -> LexBuffer<'char> + + + [.FromFunction instead")>] + static member FromCharFunction: (char[] -> int -> int) -> LexBuffer + [.FromFunction instead")>] + static member FromByteFunction: (byte[] -> int -> int) -> LexBuffer + + /// Create a lex buffer suitable for use with a Unicode lexer that reads character inputs from the given text reader + static member FromTextReader: System.IO.TextReader -> LexBuffer + /// Create a lex buffer suitable for use with ASCII byte lexing that reads byte inputs from the given binary reader + static member FromBinaryReader: System.IO.BinaryReader -> LexBuffer + + +/// The type of tables for an ascii lexer generated by fslex. +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal AsciiTables = +#else +type AsciiTables = +#endif + static member Create : uint16[] array * uint16[] -> AsciiTables + /// Interpret tables for an ascii lexer generated by fslex. + member Interpret: initialState:int * LexBuffer -> int + /// Interpret tables for an ascii lexer generated by fslex, processing input asynchronously + member AsyncInterpret: initialState:int * LexBuffer -> Async + + +/// The type of tables for an unicode lexer generated by fslex. +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal UnicodeTables = +#else +type UnicodeTables = +#endif + static member Create : uint16[] array * uint16[] -> UnicodeTables + /// Interpret tables for a unicode lexer generated by fslex. + member Interpret: initialState:int * LexBuffer -> int + + /// Interpret tables for a unicode lexer generated by fslex, processing input asynchronously + member AsyncInterpret: initialState:int * LexBuffer -> Async + diff --git a/src/buildtools/fsyacc/Parsing.fs b/src/buildtools/fsyacc/Parsing.fs new file mode 100644 index 0000000000..01dccfb610 --- /dev/null +++ b/src/buildtools/fsyacc/Parsing.fs @@ -0,0 +1,514 @@ +// (c) Microsoft Corporation 2005-2009. + +#if INTERNALIZED_FSLEXYACC_RUNTIME + +namespace Internal.Utilities.Text.Parsing +open Internal.Utilities +open Internal.Utilities.Text.Lexing + +#else +namespace Microsoft.FSharp.Text.Parsing +open Microsoft.FSharp.Text.Lexing +#endif + + + +open System +open System.Collections.Generic + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal IParseState = +#else +type IParseState = +#endif + abstract InputRange: int -> Position * Position + abstract InputEndPosition: int -> Position + abstract InputStartPosition: int -> Position + abstract ResultRange: Position * Position + abstract GetInput: int -> obj + abstract ParserLocalStore : IDictionary + abstract RaiseError<'b> : unit -> 'b + +//------------------------------------------------------------------------- +// This context is passed to the error reporter when a syntax error occurs + +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal ParseErrorContext<'tok> +#else +type ParseErrorContext<'tok> +#endif + (//lexbuf: LexBuffer<_>, + stateStack:int list, + parseState: IParseState, + reduceTokens: int list, + currentToken: 'tok option, + reducibleProductions: int list list, + shiftableTokens: int list , + message : string) = + //member x.LexBuffer = lexbuf + member x.StateStack = stateStack + member x.ReduceTokens = reduceTokens + member x.CurrentToken = currentToken + member x.ParseState = parseState + member x.ReducibleProductions = reducibleProductions + member x.ShiftTokens = shiftableTokens + member x.Message = message + + +//------------------------------------------------------------------------- +// This is the data structure emitted as code by FSYACC. + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Tables<'tok> = +#else +type Tables<'tok> = +#endif + { reductions: (IParseState -> obj) array; + endOfInputTag: int; + tagOfToken: 'tok -> int; + dataOfToken: 'tok -> obj; + actionTableElements: uint16[]; + actionTableRowOffsets: uint16[]; + reductionSymbolCounts: uint16[]; + immediateActions: uint16[]; + gotos: uint16[]; + sparseGotoTableRowOffsets: uint16[]; + stateToProdIdxsTableElements: uint16[]; + stateToProdIdxsTableRowOffsets: uint16[]; + productionToNonTerminalTable: uint16[]; + /// For fsyacc.exe, this entry is filled in by context from the generated parser file. If no 'parse_error' function + /// is defined by the user then ParseHelpers.parse_error is used by default (ParseHelpers is opened + /// at the top of the generated parser file) + parseError: ParseErrorContext<'tok> -> unit; + numTerminals: int; + tagOfErrorTerminal: int } + +//------------------------------------------------------------------------- +// An implementation of stacks. + +// This type is in System.dll so for the moment we can't use it in FSharp.Core.dll +//type Stack<'a> = System.Collections.Generic.Stack<'a> + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type Stack<'a>(n) = +#else +type internal Stack<'a>(n) = +#endif + let mutable contents = Array.zeroCreate<'a>(n) + let mutable count = 0 + + member buf.Ensure newSize = + let oldSize = Array.length contents + if newSize > oldSize then + let old = contents + contents <- Array.zeroCreate (max newSize (oldSize * 2)); + Array.blit old 0 contents 0 count; + + member buf.Count = count + member buf.Pop() = count <- count - 1 + member buf.Peep() = contents.[count - 1] + member buf.Top(n) = [ for x in contents.[max 0 (count-n)..count - 1] -> x ] |> List.rev + member buf.Push(x) = + buf.Ensure(count + 1); + contents.[count] <- x; + count <- count + 1 + + member buf.IsEmpty = (count = 0) +#if __DEBUG + member buf.PrintStack() = + for i = 0 to (count - 1) do +#if FX_NO_CONSOLE + () +#else + System.Console.Write("{0}{1}",(contents.[i]),if i=count-1 then ":" else "-") +#endif +#endif +exception RecoverableParseError +exception Accept of obj + +#if __DEBUG +module Flags = + let mutable debug = false +#endif + +#if INTERNALIZED_FSLEXYACC_RUNTIME +module internal Implementation = +#else +module Implementation = +#endif + + // Definitions shared with fsyacc + let anyMarker = 0xffff + let shiftFlag = 0x0000 + let reduceFlag = 0x4000 + let errorFlag = 0x8000 + let acceptFlag = 0xc000 + let actionMask = 0xc000 + + let actionValue action = action &&& (~~~ actionMask) + let actionKind action = action &&& actionMask + + //------------------------------------------------------------------------- + // Read the tables written by FSYACC. + + type AssocTable(elemTab:uint16[], offsetTab:uint16[]) = + let cache = new Dictionary<_,_>(2000) + + member t.readAssoc (minElemNum,maxElemNum,defaultValueOfAssoc,keyToFind) = + // do a binary chop on the table + let elemNumber : int = (minElemNum+maxElemNum)/2 + if elemNumber = maxElemNum + then defaultValueOfAssoc + else + let x = int elemTab.[elemNumber*2] + if keyToFind = x then + int elemTab.[elemNumber*2+1] + elif keyToFind < x then t.readAssoc (minElemNum ,elemNumber,defaultValueOfAssoc,keyToFind) + else t.readAssoc (elemNumber+1,maxElemNum,defaultValueOfAssoc,keyToFind) + + member t.Read(rowNumber ,keyToFind) = + + // First check the sparse lookaside table + // Performance note: without this lookaside table the binary chop in readAssoc + // takes up around 10% of of parsing time + // for parsing intensive samples such as the bootstrapped F# compiler. + // + // Note: using a .NET Dictionary for this int -> int table looks like it could be sub-optimal. + // Some other better sparse lookup table may be better. + let mutable res = 0 + let cacheKey = (rowNumber <<< 16) ||| keyToFind + let ok = cache.TryGetValue(cacheKey, &res) + if ok then res + else + let headOfTable = int offsetTab.[rowNumber] + let firstElemNumber = headOfTable + 1 + let numberOfElementsInAssoc = int elemTab.[headOfTable*2] + let defaultValueOfAssoc = int elemTab.[headOfTable*2+1] + let res = t.readAssoc (firstElemNumber,(firstElemNumber+numberOfElementsInAssoc),defaultValueOfAssoc,keyToFind) + cache.[cacheKey] <- res + res + + // Read all entries in the association table + // Used during error recovery to find all valid entries in the table + member x.ReadAll(n) = + let headOfTable = int offsetTab.[n] + let firstElemNumber = headOfTable + 1 + let numberOfElementsInAssoc = int32 elemTab.[headOfTable*2] + let defaultValueOfAssoc = int elemTab.[headOfTable*2+1] + [ for i in firstElemNumber .. (firstElemNumber+numberOfElementsInAssoc-1) -> + (int elemTab.[i*2], int elemTab.[i*2+1]) ], defaultValueOfAssoc + + type IdxToIdxListTable(elemTab:uint16[], offsetTab:uint16[]) = + + // Read all entries in a row of the table + member x.ReadAll(n) = + let headOfTable = int offsetTab.[n] + let firstElemNumber = headOfTable + 1 + let numberOfElements = int32 elemTab.[headOfTable] + [ for i in firstElemNumber .. (firstElemNumber+numberOfElements-1) -> int elemTab.[i] ] + + //------------------------------------------------------------------------- + // interpret the tables emitted by FSYACC. + + [] + [] + type ValueInfo = + val value: obj + val startPos: Position + val endPos: Position + new(value,startPos,endPos) = { value=value; startPos=startPos;endPos=endPos } + + let interpret (tables: Tables<'tok>) lexer (lexbuf : LexBuffer<_>) initialState = + let localStore = new Dictionary() in + localStore.["LexBuffer"] <- lexbuf; +#if __DEBUG + if Flags.debug then System.Console.WriteLine("\nParser: interpret tables"); +#endif + let stateStack : Stack = new Stack<_>(100) + stateStack.Push(initialState); + let valueStack = new Stack(100) + let mutable haveLookahead = false + let mutable lookaheadToken = Unchecked.defaultof<'tok> + let mutable lookaheadEndPos = Unchecked.defaultof + let mutable lookaheadStartPos = Unchecked.defaultof + let mutable finished = false + // After an error occurs, we suppress errors until we've shifted three tokens in a row. + let mutable errorSuppressionCountDown = 0 + + // When we hit the end-of-file we don't fail straight away but rather keep permitting shift + // and reduce against the last token in the token stream 20 times or until we've accepted + // or exhausted the stack. This allows error recovery rules of the form + // input : realInput EOF | realInput error EOF | error EOF + // where consuming one EOF to trigger an error doesn't result in overall parse failure + // catastrophe and the loss of intermediate results. + // + let mutable inEofCountDown = false + let mutable eofCountDown = 20 // Number of EOFs to supply at the end for error recovery + // The 100 here means a maximum of 100 elements for each rule + let ruleStartPoss = (Array.zeroCreate 100 : Position array) + let ruleEndPoss = (Array.zeroCreate 100 : Position array) + let ruleValues = (Array.zeroCreate 100 : obj array) + let lhsPos = (Array.zeroCreate 2 : Position array) + let reductions = tables.reductions + let actionTable = new AssocTable(tables.actionTableElements, tables.actionTableRowOffsets) + let gotoTable = new AssocTable(tables.gotos, tables.sparseGotoTableRowOffsets) + let stateToProdIdxsTable = new IdxToIdxListTable(tables.stateToProdIdxsTableElements, tables.stateToProdIdxsTableRowOffsets) + + let parseState = + { new IParseState with + member p.InputRange(n) = ruleStartPoss.[n-1], ruleEndPoss.[n-1]; + member p.InputStartPosition(n) = ruleStartPoss.[n-1] + member p.InputEndPosition(n) = ruleEndPoss.[n-1]; + member p.GetInput(n) = ruleValues.[n-1]; + member p.ResultRange = (lhsPos.[0], lhsPos.[1]); + member p.ParserLocalStore = (localStore :> IDictionary<_,_>); + member p.RaiseError() = raise RecoverableParseError (* NOTE: this binding tests the fairly complex logic associated with an object expression implementing a generic abstract method *) + } + +#if __DEBUG + let report haveLookahead lookaheadToken = + if haveLookahead then sprintf "%A" lookaheadToken + else "[TBC]" +#endif + + // Pop the stack until we can shift the 'error' token. If 'tokenOpt' is given + // then keep popping until we can shift both the 'error' token and the token in 'tokenOpt'. + // This is used at end-of-file to make sure we can shift both the 'error' token and the 'EOF' token. + let rec popStackUntilErrorShifted(tokenOpt) = + // Keep popping the stack until the "error" terminal is shifted +#if __DEBUG + if Flags.debug then System.Console.WriteLine("popStackUntilErrorShifted"); +#endif + if stateStack.IsEmpty then +#if __DEBUG + if Flags.debug then + System.Console.WriteLine("state stack empty during error recovery - generating parse error"); +#endif + failwith "parse error"; + + let currState = stateStack.Peep() +#if __DEBUG + if Flags.debug then + System.Console.WriteLine("In state {0} during error recovery", currState); +#endif + + let action = actionTable.Read(currState, tables.tagOfErrorTerminal) + + if actionKind action = shiftFlag && + (match tokenOpt with + | None -> true + | Some(token) -> + let nextState = actionValue action + actionKind (actionTable.Read(nextState, tables.tagOfToken(token))) = shiftFlag) then + +#if __DEBUG + if Flags.debug then System.Console.WriteLine("shifting error, continuing with error recovery"); +#endif + let nextState = actionValue action + // The "error" non terminal needs position information, though it tends to be unreliable. + // Use the StartPos/EndPos from the lex buffer + valueStack.Push(ValueInfo(box (), lexbuf.StartPos, lexbuf.EndPos)); + stateStack.Push(nextState) + else + if valueStack.IsEmpty then + failwith "parse error"; +#if __DEBUG + if Flags.debug then + System.Console.WriteLine("popping stack during error recovery"); +#endif + valueStack.Pop(); + stateStack.Pop(); + popStackUntilErrorShifted(tokenOpt) + + while not finished do + if stateStack.IsEmpty then + finished <- true + else + let state = stateStack.Peep() +#if __DEBUG + if Flags.debug then (Console.Write("{0} value(state), state ",valueStack.Count); stateStack.PrintStack()) +#endif + let action = + let immediateAction = int tables.immediateActions.[state] + if not (immediateAction = anyMarker) then + // Action has been pre-determined, no need to lookahead + // Expecting it to be a Reduce action on a non-fakeStartNonTerminal ? + immediateAction + else + // Lookahead required to determine action + if not haveLookahead then + if lexbuf.IsPastEndOfStream then + // When the input runs out, keep supplying the last token for eofCountDown times + if eofCountDown>0 then + haveLookahead <- true + eofCountDown <- eofCountDown - 1 + inEofCountDown <- true + else + haveLookahead <- false + else + lookaheadToken <- lexer lexbuf + lookaheadStartPos <- lexbuf.StartPos + lookaheadEndPos <- lexbuf.EndPos + haveLookahead <- true; + + let tag = + if haveLookahead then tables.tagOfToken lookaheadToken + else tables.endOfInputTag + + // Printf.printf "state %d\n" state + actionTable.Read(state,tag) + + let kind = actionKind action + if kind = shiftFlag then ( + if errorSuppressionCountDown > 0 then + errorSuppressionCountDown <- errorSuppressionCountDown - 1; +#if __DEBUG + if Flags.debug then Console.WriteLine("shifting, reduced errorRecoverylevel to {0}\n", errorSuppressionCountDown); +#endif + let nextState = actionValue action + if not haveLookahead then failwith "shift on end of input!"; + let data = tables.dataOfToken lookaheadToken + valueStack.Push(ValueInfo(data, lookaheadStartPos, lookaheadEndPos)); + stateStack.Push(nextState); +#if __DEBUG + if Flags.debug then Console.WriteLine("shift/consume input {0}, shift to state {1}", report haveLookahead lookaheadToken, nextState); +#endif + haveLookahead <- false + + ) elif kind = reduceFlag then + let prod = actionValue action + let reduction = reductions.[prod] + let n = int tables.reductionSymbolCounts.[prod] + // pop the symbols, populate the values and populate the locations +#if __DEBUG + if Flags.debug then Console.Write("reduce popping {0} values/states, lookahead {1}", n, report haveLookahead lookaheadToken); +#endif + + lhsPos.[0] <- Position.Empty; + lhsPos.[1] <- Position.Empty; + for i = 0 to n - 1 do + if valueStack.IsEmpty then failwith "empty symbol stack"; + let topVal = valueStack.Peep() + valueStack.Pop(); + stateStack.Pop(); + ruleValues.[(n-i)-1] <- topVal.value; + ruleStartPoss.[(n-i)-1] <- topVal.startPos; + ruleEndPoss.[(n-i)-1] <- topVal.endPos; + if lhsPos.[1] = Position.Empty then lhsPos.[1] <- topVal.endPos; + if not (topVal.startPos = Position.Empty) then lhsPos.[0] <- topVal.startPos + done; + + try + // Printf.printf "reduce %d\n" prod; + let redResult = reduction parseState + valueStack.Push(ValueInfo(redResult, lhsPos.[0], lhsPos.[1])); + let currState = stateStack.Peep() + let newGotoState = gotoTable.Read(int tables.productionToNonTerminalTable.[prod], currState) + stateStack.Push(newGotoState) +#if __DEBUG + if Flags.debug then Console.WriteLine(" goto state {0}", newGotoState) +#endif + with + | Accept res -> + finished <- true; + valueStack.Push(ValueInfo(res, lhsPos.[0], lhsPos.[1])) + | RecoverableParseError -> +#if __DEBUG + if Flags.debug then Console.WriteLine("RecoverableParseErrorException...\n"); +#endif + popStackUntilErrorShifted(None); + // User code raised a Parse_error. Don't report errors again until three tokens have been shifted + errorSuppressionCountDown <- 3 + elif kind = errorFlag then ( +#if __DEBUG + if Flags.debug then Console.Write("ErrorFlag... "); +#endif + // Silently discard inputs and don't report errors + // until three tokens in a row have been shifted +#if __DEBUG + if Flags.debug then printfn "error on token '%A' " (if haveLookahead then Some(lookaheadToken) else None); +#endif + if errorSuppressionCountDown > 0 then + // If we're in the end-of-file count down then we're very keen to 'Accept'. + // We can only do this by repeatedly popping the stack until we can shift both an 'error' token + // and an EOF token. + if inEofCountDown && eofCountDown < 10 then +#if __DEBUG + if Flags.debug then printfn "poppin stack, lokking to shift both 'error' and that token, during end-of-file error recovery" ; +#endif + popStackUntilErrorShifted(if haveLookahead then Some(lookaheadToken) else None); + + // If we don't haveLookahead then the end-of-file count down is over and we have no further options. + if not haveLookahead then + failwith "parse error: unexpected end of file" + +#if __DEBUG + if Flags.debug then printfn "discarding token '%A' during error suppression" (if haveLookahead then Some(lookaheadToken) else None); +#endif + // Discard the token + haveLookahead <- false + // Try again to shift three tokens + errorSuppressionCountDown <- 3 + else ( + + let currentToken = if haveLookahead then Some(lookaheadToken) else None + let actions,defaultAction = actionTable.ReadAll(state) + let explicit = Set.ofList [ for (tag,_action) in actions -> tag ] + + let shiftableTokens = + [ for (tag,action) in actions do + if (actionKind action) = shiftFlag then + yield tag + if actionKind defaultAction = shiftFlag then + for tag in 0 .. tables.numTerminals-1 do + if not (explicit.Contains(tag)) then + yield tag ] in + + let stateStack = stateStack.Top(12) in + let reducibleProductions = + [ for state in stateStack do + yield stateToProdIdxsTable.ReadAll(state) ] + + let reduceTokens = + [ for (tag,action) in actions do + if actionKind(action) = reduceFlag then + yield tag + if actionKind(defaultAction) = reduceFlag then + for tag in 0 .. tables.numTerminals-1 do + if not (explicit.Contains(tag)) then + yield tag ] in + //let activeRules = stateStack |> List.iter (fun state -> + let errorContext = new ParseErrorContext<'tok>(stateStack,parseState, reduceTokens,currentToken,reducibleProductions, shiftableTokens, "syntax error") + tables.parseError(errorContext); + popStackUntilErrorShifted(None); + errorSuppressionCountDown <- 3; +#if __DEBUG + if Flags.debug then System.Console.WriteLine("generated syntax error and shifted error token, haveLookahead = {0}\n", haveLookahead); +#endif + ) + ) elif kind = acceptFlag then + finished <- true +#if __DEBUG + else + if Flags.debug then System.Console.WriteLine("ALARM!!! drop through case in parser"); +#endif + done; + // OK, we're done - read off the overall generated value + valueStack.Peep().value + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Tables<'tok> with +#else +type Tables<'tok> with +#endif + member tables.Interpret (lexer,lexbuf,initialState) = + Implementation.interpret tables lexer lexbuf initialState + +#if INTERNALIZED_FSLEXYACC_RUNTIME +module internal ParseHelpers = +#else +module ParseHelpers = +#endif + let parse_error (_s:string) = () + let parse_error_rich = (None : (ParseErrorContext<_> -> unit) option) diff --git a/src/buildtools/fsyacc/Parsing.fsi b/src/buildtools/fsyacc/Parsing.fsi new file mode 100644 index 0000000000..2fef45975a --- /dev/null +++ b/src/buildtools/fsyacc/Parsing.fsi @@ -0,0 +1,130 @@ +//========================================================================== +// (c) Microsoft Corporation 2005-2009. +//========================================================================= + +#if INTERNALIZED_FSLEXYACC_RUNTIME +namespace Internal.Utilities.Text.Parsing +open Internal.Utilities +open Internal.Utilities.Text.Lexing +#else +namespace Microsoft.FSharp.Text.Parsing +open Microsoft.FSharp.Text.Lexing +#endif + +open System.Collections.Generic + +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal IParseState = +#else +/// The information accessible via the parseState value within parser actions. +type IParseState = +#endif + /// Get the start and end position for the terminal or non-terminal at a given index matched by the production + abstract InputRange: index:int -> Position * Position + /// Get the end position for the terminal or non-terminal at a given index matched by the production + abstract InputEndPosition: int -> Position + /// Get the start position for the terminal or non-terminal at a given index matched by the production + abstract InputStartPosition: int -> Position + /// Get the full range of positions matched by the production + abstract ResultRange: Position * Position + /// Get the value produced by the terminal or non-terminal at the given position + abstract GetInput : int -> obj + /// Get the store of local values associated with this parser + // Dynamically typed, non-lexically scoped local store + abstract ParserLocalStore : IDictionary + /// Raise an error in this parse context + abstract RaiseError<'b> : unit -> 'b + + +[] +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal ParseErrorContext<'tok> = +#else +/// The context provided when a parse error occurs +type ParseErrorContext<'tok> = +#endif + /// The stack of state indexes active at the parse error + member StateStack : int list + /// The state active at the parse error + member ParseState : IParseState + /// The tokens that would cause a reduction at the parse error + member ReduceTokens: int list + /// The stack of productions that would be reduced at the parse error + member ReducibleProductions : int list list + /// The token that caused the parse error + member CurrentToken : 'tok option + /// The token that would cause a shift at the parse error + member ShiftTokens : int list + /// The message associated with the parse error + member Message : string + +/// Tables generated by fsyacc +#if INTERNALIZED_FSLEXYACC_RUNTIME +type internal Tables<'tok> = +#else +/// The type of the tables contained in a file produced by the fsyacc.exe parser generator. +type Tables<'tok> = +#endif + { /// The reduction table + reductions: (IParseState -> obj) array ; + /// The token number indicating the end of input + endOfInputTag: int; + /// A function to compute the tag of a token + tagOfToken: 'tok -> int; + /// A function to compute the data carried by a token + dataOfToken: 'tok -> obj; + /// The sparse action table elements + actionTableElements: uint16[]; + /// The sparse action table row offsets + actionTableRowOffsets: uint16[]; + /// The number of symbols for each reduction + reductionSymbolCounts: uint16[]; + /// The immediate action table + immediateActions: uint16[]; + /// The sparse goto table + gotos: uint16[]; + /// The sparse goto table row offsets + sparseGotoTableRowOffsets: uint16[]; + /// The sparse table for the productions active for each state + stateToProdIdxsTableElements: uint16[]; + /// The sparse table offsets for the productions active for each state + stateToProdIdxsTableRowOffsets: uint16[]; + /// This table is logically part of the Goto table + productionToNonTerminalTable: uint16[]; + /// This function is used to hold the user specified "parse_error" or "parse_error_rich" functions + parseError: ParseErrorContext<'tok> -> unit; + /// The total number of terminals + numTerminals: int; + /// The tag of the error terminal + tagOfErrorTerminal: int } + + /// Interpret the parser table taking input from the given lexer, using the given lex buffer, and the given start state. + /// Returns an object indicating the final synthesized value for the parse. + member Interpret : lexer:(LexBuffer<'char> -> 'tok) * lexbuf:LexBuffer<'char> * startState:int -> obj + +#if INTERNALIZED_FSLEXYACC_RUNTIME +exception internal Accept of obj +exception internal RecoverableParseError +#else +/// Indicates an accept action has occured +exception Accept of obj +/// Indicates a parse error has occured and parse recovery is in progress +exception RecoverableParseError +#endif + +#if __DEBUG +module internal Flags = + val mutable debug : bool +#endif + +#if INTERNALIZED_FSLEXYACC_RUNTIME +module internal ParseHelpers = +#else +/// Helpers used by generated parsers. +module ParseHelpers = +#endif + /// The default implementation of the parse_error_rich function + val parse_error_rich: (ParseErrorContext<'tok> -> unit) option + /// The default implementation of the parse_error function + val parse_error: string -> unit + diff --git a/src/buildtools/fsyacc/fsyacc.fs b/src/buildtools/fsyacc/fsyacc.fs new file mode 100644 index 0000000000..185ff33232 --- /dev/null +++ b/src/buildtools/fsyacc/fsyacc.fs @@ -0,0 +1,533 @@ +(* (c) Microsoft Corporation 2005-2008. *) + +module internal FsLexYacc.FsYacc.Driver + +open System.IO +open System.Collections.Generic +open Printf +open Internal.Utilities +open Internal.Utilities.Text.Lexing + +open FsLexYacc.FsYacc +open FsLexYacc.FsYacc.AST + +//------------------------------------------------------------------ +// This code is duplicated from Microsoft.FSharp.Compiler.UnicodeLexing + +type Lexbuf = LexBuffer + +/// Standard utility to create a Unicode LexBuffer +/// +/// One small annoyance is that LexBuffers and not IDisposable. This means +/// we can't just return the LexBuffer object, since the file it wraps wouldn't +/// get closed when we're finished with the LexBuffer. Hence we return the stream, +/// the reader and the LexBuffer. The caller should dispose the first two when done. +let UnicodeFileAsLexbuf (filename,codePage : int option) : FileStream * StreamReader * Lexbuf = + // Use the .NET functionality to auto-detect the unicode encoding + // It also uses Lexing.from_text_reader to present the bytes read to the lexer in UTF8 decoded form + let stream = new FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.Read) + let reader = + match codePage with + | None -> new StreamReader(stream,true) + | Some n -> new StreamReader(stream,System.Text.Encoding.GetEncoding(n)) + let lexbuf = LexBuffer.FromFunction(reader.Read) + lexbuf.EndPos <- Position.FirstLine(filename); + stream, reader, lexbuf + +//------------------------------------------------------------------ +// This is the program proper + +let input = ref None +let modname= ref None +let internal_module = ref false +let opens= ref [] +let out = ref None +let tokenize = ref false +let compat = ref false +let log = ref false +let light = ref None +let inputCodePage = ref None +let mutable lexlib = "Microsoft.FSharp.Text.Lexing" +let mutable parslib = "Microsoft.FSharp.Text.Parsing" + +let usage = + [ ArgInfo("-o", ArgType.String (fun s -> out := Some s), "Name the output file."); + ArgInfo("-v", ArgType.Unit (fun () -> log := true), "Produce a listing file."); + ArgInfo("--module", ArgType.String (fun s -> modname := Some s), "Define the F# module name to host the generated parser."); + ArgInfo("--internal", ArgType.Unit (fun () -> internal_module := true), "Generate an internal module"); + ArgInfo("--open", ArgType.String (fun s -> opens := !opens @ [s]), "Add the given module to the list of those to open in both the generated signature and implementation."); + ArgInfo("--light", ArgType.Unit (fun () -> light := Some true), "(ignored)"); + ArgInfo("--light-off", ArgType.Unit (fun () -> light := Some false), "Add #light \"off\" to the top of the generated file"); + ArgInfo("--ml-compatibility", ArgType.Set compat, "Support the use of the global state from the 'Parsing' module in FSharp.PowerPack.dll."); + ArgInfo("--tokens", ArgType.Set tokenize, "Simply tokenize the specification file itself."); + ArgInfo("--lexlib", ArgType.String (fun s -> lexlib <- s), "Specify the namespace for the implementation of the lexer (default: Microsoft.FSharp.Text.Lexing)"); + ArgInfo("--parslib", ArgType.String (fun s -> parslib <- s), "Specify the namespace for the implementation of the parser table interpreter (default: Microsoft.FSharp.Text.Parsing)"); + ArgInfo("--codepage", ArgType.Int (fun i -> inputCodePage := Some i), "Assume input lexer specification file is encoded with the given codepage."); ] + +let _ = ArgParser.Parse(usage,(fun x -> match !input with Some _ -> failwith "more than one input given" | None -> input := Some x),"fsyacc ") + +let output_int (os: #TextWriter) (n:int) = os.Write(string n) + +let outputCodedUInt16 (os: #TextWriter) (n:int) = + os.Write n; + os.Write "us; "; + +let shiftFlag = 0x0000 +let reduceFlag = 0x4000 +let errorFlag = 0x8000 +let acceptFlag = 0xc000 +let actionMask = 0xc000 + +let anyMarker = 0xffff + +let actionCoding action = + match action with + | Accept -> acceptFlag + | Shift n -> shiftFlag ||| n + | Reduce n -> reduceFlag ||| n + | Error -> errorFlag + +let main() = + let filename = (match !input with Some x -> x | None -> failwith "no input given") in + let spec = + let stream,reader,lexbuf = UnicodeFileAsLexbuf(filename, !inputCodePage) + use stream = stream + use reader = reader + + try + if !tokenize then begin + while true do + printf "tokenize - getting one token"; + let t = Lexer.token lexbuf in + (*F# printf "tokenize - got %s" (Parser.token_to_string t); F#*) + if t = Parser.EOF then exit 0; + done; + end; + + Parser.spec Lexer.token lexbuf + with e -> + eprintf "%s(%d,%d): error: %s" filename lexbuf.StartPos.Line lexbuf.StartPos.Column e.Message; + exit 1 in + + let has_extension (s:string) = + (s.Length >= 1 && s.[s.Length - 1] = '.') + || Path.HasExtension(s) + + let chop_extension (s:string) = + if not (has_extension s) then invalidArg "s" "the file name does not have an extension" + Path.Combine (Path.GetDirectoryName s,Path.GetFileNameWithoutExtension(s)) + + let checkSuffix (x:string) (y:string) = x.EndsWith(y) + + let output = match !out with Some x -> x | _ -> chop_extension filename + (if checkSuffix filename ".mly" then ".ml" else ".fs") in + let outputi = match !out with Some x -> chop_extension x + (if checkSuffix x ".ml" then ".mli" else ".fsi") | _ -> chop_extension filename + (if checkSuffix filename ".mly" then ".mli" else ".fsi") in + let outputo = + if !log then Some (match !out with Some x -> chop_extension x + ".fsyacc.output" | _ -> chop_extension filename + ".fsyacc.output") + else None + + use os = (File.CreateText output :> TextWriter) + use osi = (File.CreateText outputi :> TextWriter) + + let lineCountOutput = ref 0 + let lineCountSignature = ref 0 + let cos = (os,lineCountOutput) + let cosi = (osi,lineCountSignature) + let cprintf (os:TextWriter,lineCount) fmt = Printf.fprintf os fmt + let cprintfn (os:TextWriter,lineCount) fmt = Printf.kfprintf (fun () -> incr lineCount; os.WriteLine()) os fmt + + let logf = + match outputo with + | None -> (fun f -> ()) + | Some filename -> + let oso = (File.CreateText filename :> TextWriter) + (fun f -> f oso) + + logf (fun oso -> fprintfn oso " Output file describing compiled parser placed in %s and %s" output outputi); + + printfn " building tables"; + let spec1 = ProcessParserSpecAst spec + let (prods,states, startStates,actionTable,immediateActionTable,gotoTable,endOfInputTerminalIdx,errorTerminalIdx,nonTerminals) = + CompilerLalrParserSpec logf spec1 + + let (code,pos) = spec.Header + printfn " %d states" states.Length; + printfn " %d nonterminals" gotoTable.[0].Length; + printfn " %d terminals" actionTable.[0].Length; + printfn " %d productions" prods.Length; + printfn " #rows in action table: %d" actionTable.Length; +(* + printfn "#unique rows in action table: %d" (List.length (Array.foldBack (fun row acc -> insert (Array.to_list row) acc) actionTable [])); + printfn "maximum #different actions per state: %d" (Array.foldBack (fun row acc ->max (List.length (List.foldBack insert (Array.to_list row) [])) acc) actionTable 0); + printfn "average #different actions per state: %d" ((Array.foldBack (fun row acc -> (List.length (List.foldBack insert (Array.to_list row) [])) + acc) actionTable 0) / (Array.length states)); +*) + + cprintfn cos "// Implementation file for parser generated by fsyacc"; + cprintfn cosi "// Signature file for parser generated by fsyacc"; + + if (!light = Some(false)) || (!light = None && checkSuffix output ".ml") then + cprintfn cos "#light \"off\""; + cprintfn cosi "#light \"off\""; + + match !modname with + | None -> () + | Some s -> + match !internal_module with + | true -> + cprintfn cos "module internal %s" s; + cprintfn cosi "module internal %s" s; + | false -> + cprintfn cos "module %s" s; + cprintfn cosi "module %s" s; + + cprintfn cos "#nowarn \"64\";; // turn off warnings that type variables used in production annotations are instantiated to concrete type"; + + for s in !opens do + cprintfn cos "open %s" s; + cprintfn cosi "open %s" s; + + cprintfn cos "open %s" lexlib; + cprintfn cos "open %s.ParseHelpers" parslib; + if !compat then + cprintfn cos "open Microsoft.FSharp.Compatibility.OCaml.Parsing"; + + cprintfn cos "# %d \"%s\"" pos.pos_lnum pos.pos_fname; + cprintfn cos "%s" code; + lineCountOutput := !lineCountOutput + code.Replace("\r","").Split([| '\n' |]).Length; + + cprintfn cos "# %d \"%s\"" !lineCountOutput output; + // Print the datatype for the tokens + cprintfn cos "// This type is the type of tokens accepted by the parser"; + for out in [cos;cosi] do + cprintfn out "type token = "; + for id,typ in spec.Tokens do + match typ with + | None -> cprintfn out " | %s" id + | Some ty -> cprintfn out " | %s of (%s)" id ty; + + // Print the datatype for the token names + cprintfn cos "// This type is used to give symbolic names to token indexes, useful for error messages"; + for out in [cos;cosi] do + cprintfn out "type tokenId = "; + for id,typ in spec.Tokens do + cprintfn out " | TOKEN_%s" id; + cprintfn out " | TOKEN_end_of_input"; + cprintfn out " | TOKEN_error"; + + cprintfn cos "// This type is used to give symbolic names to token indexes, useful for error messages"; + for out in [cos;cosi] do + cprintfn out "type nonTerminalId = "; + for nt in nonTerminals do + cprintfn out " | NONTERM_%s" nt; + + cprintfn cos ""; + cprintfn cos "// This function maps tokens to integer indexes"; + cprintfn cos "let tagOfToken (t:token) = "; + cprintfn cos " match t with"; + spec.Tokens |> List.iteri (fun i (id,typ) -> + cprintfn cos " | %s %s -> %d " id (match typ with Some _ -> "_" | None -> "") i); + cprintfn cosi "/// This function maps tokens to integer indexes"; + cprintfn cosi "val tagOfToken: token -> int"; + + cprintfn cos ""; + cprintfn cos "// This function maps integer indexes to symbolic token ids"; + cprintfn cos "let tokenTagToTokenId (tokenIdx:int) = "; + cprintfn cos " match tokenIdx with"; + spec.Tokens |> List.iteri (fun i (id,typ) -> + cprintfn cos " | %d -> TOKEN_%s " i id) + cprintfn cos " | %d -> TOKEN_end_of_input" endOfInputTerminalIdx; + cprintfn cos " | %d -> TOKEN_error" errorTerminalIdx; + cprintfn cos " | _ -> failwith \"tokenTagToTokenId: bad token\"" + + cprintfn cosi ""; + cprintfn cosi "/// This function maps integer indexes to symbolic token ids"; + cprintfn cosi "val tokenTagToTokenId: int -> tokenId"; + + cprintfn cos ""; + cprintfn cos "/// This function maps production indexes returned in syntax errors to strings representing the non terminal that would be produced by that production"; + cprintfn cos "let prodIdxToNonTerminal (prodIdx:int) = "; + cprintfn cos " match prodIdx with"; + prods |> Array.iteri (fun i (nt,ntIdx,syms,code) -> + cprintfn cos " | %d -> NONTERM_%s " i nt); + cprintfn cos " | _ -> failwith \"prodIdxToNonTerminal: bad production index\"" + + cprintfn cosi ""; + cprintfn cosi "/// This function maps production indexes returned in syntax errors to strings representing the non terminal that would be produced by that production"; + cprintfn cosi "val prodIdxToNonTerminal: int -> nonTerminalId"; + + cprintfn cos ""; + cprintfn cos "let _fsyacc_endOfInputTag = %d " endOfInputTerminalIdx; + cprintfn cos "let _fsyacc_tagOfErrorTerminal = %d" errorTerminalIdx; + cprintfn cos ""; + cprintfn cos "// This function gets the name of a token as a string"; + cprintfn cos "let token_to_string (t:token) = "; + cprintfn cos " match t with "; + spec.Tokens |> List.iteri (fun i (id,typ) -> + cprintfn cos " | %s %s -> \"%s\" " id (match typ with Some _ -> "_" | None -> "") id); + + cprintfn cosi ""; + cprintfn cosi "/// This function gets the name of a token as a string"; + cprintfn cosi "val token_to_string: token -> string"; + + cprintfn cos ""; + cprintfn cos "// This function gets the data carried by a token as an object"; + cprintfn cos "let _fsyacc_dataOfToken (t:token) = "; + cprintfn cos " match t with "; + + for (id,typ) in spec.Tokens do + cprintfn cos " | %s %s -> %s " + id + (match typ with Some _ -> "_fsyacc_x" | None -> "") + (match typ with Some _ -> "Microsoft.FSharp.Core.Operators.box _fsyacc_x" | None -> "(null : System.Object)") + + let tychar = "'cty" + + for (key,_) in spec.Types |> Seq.countBy fst |> Seq.filter (fun (_,n) -> n > 1) do + failwithf "%s is given multiple %%type declarations" key; + + for (key,_) in spec.Tokens |> Seq.countBy fst |> Seq.filter (fun (_,n) -> n > 1) do + failwithf "%s is given %%token declarations" key + + let types = Map.ofList spec.Types + let tokens = Map.ofList spec.Tokens + + let nStates = states.Length + begin + cprintf cos "let _fsyacc_gotos = [| " ; + let numGotoNonTerminals = gotoTable.[0].Length + let gotoIndexes = Array.create numGotoNonTerminals 0 + let gotoTableCurrIndex = ref 0 in + for j = 0 to numGotoNonTerminals-1 do + gotoIndexes.[j] <- !gotoTableCurrIndex; + + (* Count the number of entries in the association table. *) + let count = ref 0 in + for i = 0 to nStates - 1 do + let goto = gotoTable.[i].[j] + match goto with + | None -> () + | Some _ -> incr count + + (* Write the head of the table (i.e. the number of entries and the default value) *) + gotoTableCurrIndex := !gotoTableCurrIndex + 1; + outputCodedUInt16 os !count; + outputCodedUInt16 os anyMarker; + + (* Write the pairs of entries in incremental order by key *) + (* This lets us implement the lookup by a binary chop. *) + for i = 0 to nStates - 1 do + let goto = gotoTable.[i].[j] + match goto with + | None -> () + | Some n -> + gotoTableCurrIndex := !gotoTableCurrIndex + 1; + outputCodedUInt16 os i; + outputCodedUInt16 os n; + cprintfn cos "|]" ; + (* Output offsets into gotos table where the gotos for a particular nonterminal begin *) + cprintf cos "let _fsyacc_sparseGotoTableRowOffsets = [|" ; + for j = 0 to numGotoNonTerminals-1 do + outputCodedUInt16 os gotoIndexes.[j]; + cprintfn cos "|]" ; + end; + + begin + cprintf cos "let _fsyacc_stateToProdIdxsTableElements = [| " ; + let indexes = Array.create states.Length 0 + let currIndex = ref 0 + for j = 0 to states.Length - 1 do + let state = states.[j] + indexes.[j] <- !currIndex; + + (* Write the head of the table (i.e. the number of entries) *) + outputCodedUInt16 os state.Length; + currIndex := !currIndex + state.Length + 1; + + (* Write the pairs of entries in incremental order by key *) + (* This lets us implement the lookup by a binary chop. *) + for prodIdx in state do + outputCodedUInt16 os prodIdx; + cprintfn cos "|]" ; + (* Output offsets into gotos table where the gotos for a particular nonterminal begin *) + cprintf cos "let _fsyacc_stateToProdIdxsTableRowOffsets = [|" ; + for idx in indexes do + outputCodedUInt16 os idx; + cprintfn cos "|]" ; + end; + + begin + let numActionRows = (Array.length actionTable) + let maxActionColumns = Array.length actionTable.[0] + cprintfn cos "let _fsyacc_action_rows = %d" numActionRows; + cprintf cos "let _fsyacc_actionTableElements = [|" ; + let actionIndexes = Array.create numActionRows 0 + + let actionTableCurrIndex = ref 0 + for i = 0 to nStates-1 do + actionIndexes.[i] <- !actionTableCurrIndex; + let actions = actionTable.[i] + let terminalsByAction = new Dictionary<_,int list>(10) + let countPerAction = new Dictionary<_,_>(10) + for terminal = 0 to actions.Length - 1 do + let action = snd actions.[terminal] + if terminalsByAction.ContainsKey action then + terminalsByAction.[action] <- terminal :: terminalsByAction.[action] ; + else + terminalsByAction.[action] <- [terminal]; + if countPerAction.ContainsKey action then + countPerAction.[action] <- countPerAction.[action]+1 + else + countPerAction.[action] <- 1 + + let mostCommonAction = + let mostCommon = ref Error + let max = ref 0 + for (KeyValue(x,y)) in countPerAction do + if y > !max then (mostCommon := x; max := y) + !mostCommon + + (* Count the number of entries in the association table. *) + let count = ref 0 + for (KeyValue(action,terminals)) in terminalsByAction do + for terminals in terminals do + if action <> mostCommonAction then + incr count; + + (* Write the head of the table (i.e. the number of entries and the default value) *) + actionTableCurrIndex := !actionTableCurrIndex + 1; + outputCodedUInt16 os !count; + outputCodedUInt16 os (actionCoding mostCommonAction); + + (* Write the pairs of entries in incremental order by key *) + (* This lets us implement the lookup by a binary chop. *) + for terminal = 0 to Array.length actions-1 do + let action = snd actions.[terminal] in + if action <> mostCommonAction then ( + actionTableCurrIndex := !actionTableCurrIndex + 1; + outputCodedUInt16 os terminal; + outputCodedUInt16 os (actionCoding action); + ); + cprintfn cos "|]" ; + (* Output offsets into actions table where the actions for a particular nonterminal begin *) + cprintf cos "let _fsyacc_actionTableRowOffsets = [|" ; + for j = 0 to numActionRows-1 do + cprintf cos "%a" outputCodedUInt16 actionIndexes.[j]; + cprintfn cos "|]" ; + + end; + begin + cprintf cos "let _fsyacc_reductionSymbolCounts = [|" ; + for nt,ntIdx,syms,code in prods do + cprintf cos "%a" outputCodedUInt16 (List.length syms); + cprintfn cos "|]" ; + end; + begin + cprintf cos "let _fsyacc_productionToNonTerminalTable = [|" ; + for nt,ntIdx,syms,code in prods do + cprintf cos "%a" outputCodedUInt16 ntIdx; + cprintfn cos "|]" ; + end; + begin + cprintf cos "let _fsyacc_immediateActions = [|" ; + for prodIdx in immediateActionTable do + match prodIdx with + | None -> cprintf cos "%a" outputCodedUInt16 anyMarker (* NONE REP *) + | Some act -> cprintf cos "%a" outputCodedUInt16 (actionCoding act) + cprintfn cos "|]" ; + end; + + let getType nt = if types.ContainsKey nt then types.[nt] else "'"+nt + begin + cprintf cos "let _fsyacc_reductions () =" ; + cprintfn cos " [| " ; + for nt,ntIdx,syms,code in prods do + cprintfn cos "# %d \"%s\"" !lineCountOutput output; + cprintfn cos " (fun (parseState : %s.IParseState) ->" parslib + if !compat then + cprintfn cos " Parsing.set_parse_state parseState;" + syms |> List.iteri (fun i sym -> + let tyopt = + match sym with + | Terminal t -> + if tokens.ContainsKey t then + tokens.[t] + else None + | NonTerminal nt -> Some (getType nt) + match tyopt with + | Some ty -> cprintfn cos " let _%d = (let data = parseState.GetInput(%d) in (Microsoft.FSharp.Core.Operators.unbox data : %s)) in" (i+1) (i+1) ty + | None -> ()) + cprintfn cos " Microsoft.FSharp.Core.Operators.box" + cprintfn cos " ("; + cprintfn cos " ("; + match code with + | Some (_,pos) -> cprintfn cos "# %d \"%s\"" pos.pos_lnum pos.pos_fname + | None -> () + match code with + | Some (code,_) -> + let dollar = ref false in + let c = code |> String.collect (fun c -> + if not !dollar && c = '$' then (dollar := true; "") + elif !dollar && c >= '0' && c <= '9' then (dollar := false; "_"+new System.String(c,1)) + elif !dollar then (dollar := false; "$"+new System.String(c,1)) + else new System.String(c,1)) + let lines = c.Split([| '\r'; '\n' |], System.StringSplitOptions.RemoveEmptyEntries); + for line in lines do + cprintfn cos " %s" line; + if !dollar then os.Write '$' + | None -> + cprintfn cos " raise (%s.Accept(Microsoft.FSharp.Core.Operators.box _1))" parslib + cprintfn cos " )"; + // Place the line count back for the type constraint + match code with + | Some (_,pos) -> cprintfn cos "# %d \"%s\"" pos.pos_lnum pos.pos_fname + | None -> () + cprintfn cos " : %s));" (if types.ContainsKey nt then types.[nt] else "'"+nt); + done; + cprintfn cos "|]" ; + end; + cprintfn cos "# %d \"%s\"" !lineCountOutput output; + cprintfn cos "let tables () : %s.Tables<_> = " parslib + cprintfn cos " { reductions= _fsyacc_reductions ();" + cprintfn cos " endOfInputTag = _fsyacc_endOfInputTag;" + cprintfn cos " tagOfToken = tagOfToken;" + cprintfn cos " dataOfToken = _fsyacc_dataOfToken; " + cprintfn cos " actionTableElements = _fsyacc_actionTableElements;" + cprintfn cos " actionTableRowOffsets = _fsyacc_actionTableRowOffsets;" + cprintfn cos " stateToProdIdxsTableElements = _fsyacc_stateToProdIdxsTableElements;" + cprintfn cos " stateToProdIdxsTableRowOffsets = _fsyacc_stateToProdIdxsTableRowOffsets;" + cprintfn cos " reductionSymbolCounts = _fsyacc_reductionSymbolCounts;" + cprintfn cos " immediateActions = _fsyacc_immediateActions;" + cprintfn cos " gotos = _fsyacc_gotos;" + cprintfn cos " sparseGotoTableRowOffsets = _fsyacc_sparseGotoTableRowOffsets;" + cprintfn cos " tagOfErrorTerminal = _fsyacc_tagOfErrorTerminal;" + cprintfn cos " parseError = (fun (ctxt:%s.ParseErrorContext<_>) -> " parslib + cprintfn cos " match parse_error_rich with " + cprintfn cos " | Some f -> f ctxt" + cprintfn cos " | None -> parse_error ctxt.Message);" + + cprintfn cos " numTerminals = %d;" (Array.length actionTable.[0]); + cprintfn cos " productionToNonTerminalTable = _fsyacc_productionToNonTerminalTable }" + cprintfn cos "let engine lexer lexbuf startState = (tables ()).Interpret(lexer, lexbuf, startState)" + + for (id,startState) in List.zip spec.StartSymbols startStates do + if not (types.ContainsKey id) then + failwith ("a %type declaration is required for for start token "+id); + let ty = types.[id] in + cprintfn cos "let %s lexer lexbuf : %s =" id ty; + cprintfn cos " Microsoft.FSharp.Core.Operators.unbox ((tables ()).Interpret(lexer, lexbuf, %d))" startState + + for id in spec.StartSymbols do + if not (types.ContainsKey id) then + failwith ("a %type declaration is required for start token "+id); + let ty = types.[id] in + cprintfn cosi "val %s : (%s.LexBuffer<%s> -> token) -> %s.LexBuffer<%s> -> (%s) " id lexlib tychar lexlib tychar ty; + + logf (fun oso -> oso.Close()) + +[] +let result(args: string[]) = + try + main() + 0 + with e -> + eprintf "FSYACC: error FSY000: %s" (match e with Failure s -> s | e -> e.Message); + 1 diff --git a/src/buildtools/fsyacc/fsyacc.fsproj b/src/buildtools/fsyacc/fsyacc.fsproj new file mode 100644 index 0000000000..286c7a4eb1 --- /dev/null +++ b/src/buildtools/fsyacc/fsyacc.fsproj @@ -0,0 +1,22 @@ + + + + Exe + netcoreapp2.0 + INTERNALIZED_FSLEXYACC_RUNTIME;$(DefineConstant) + + + + + + + + + + + + + + + + diff --git a/src/buildtools/fsyacc/fsyaccast.fs b/src/buildtools/fsyacc/fsyaccast.fs new file mode 100644 index 0000000000..f4edc39972 --- /dev/null +++ b/src/buildtools/fsyacc/fsyaccast.fs @@ -0,0 +1,1000 @@ +// (c) Microsoft Corporation 2005-2007. + +module internal FsLexYacc.FsYacc.AST + +#nowarn "62" // This construct is for ML compatibility. + + +open System +open System.Collections.Generic +open Printf +open Microsoft.FSharp.Collections +open Internal.Utilities +open Internal.Utilities.Text.Lexing + +/// An active pattern that should be in the F# standard library +let (|KeyValue|) (kvp:KeyValuePair<_,_>) = kvp.Key,kvp.Value + + +type Identifier = string +type Code = string * Position + +type ParserSpec= + { Header : Code; + Tokens : (Identifier * string option) list; + Types : (Identifier * string) list; + Associativities: (Identifier * Associativity) list list; + StartSymbols : Identifier list; + Rules : (Identifier * Rule list) list } + +and Rule = Rule of Identifier list * Identifier option * Code option +and Associativity = LeftAssoc | RightAssoc | NonAssoc + +type Terminal = string +type NonTerminal = string +type Symbol = Terminal of Terminal | NonTerminal of NonTerminal +type Symbols = Symbol list + + +//--------------------------------------------------------------------- +// Output Raw Parser Spec AST + +let StringOfSym sym = match sym with Terminal s -> "'" + s + "'" | NonTerminal s -> s + +let OutputSym os sym = fprintf os "%s" (StringOfSym sym) + +let OutputSyms os syms = + fprintf os "%s" (String.Join(" ",Array.map StringOfSym syms)) + +let OutputTerminalSet os (tset:string seq) = + fprintf os "%s" (String.Join(";", tset |> Seq.toArray)) + +let OutputAssoc os p = + match p with + | LeftAssoc -> fprintf os "left" + | RightAssoc -> fprintf os "right" + | NonAssoc -> fprintf os "nonassoc" + + +//--------------------------------------------------------------------- +// PreProcess Raw Parser Spec AST + +type PrecedenceInfo = + | ExplicitPrec of Associativity * int + | NoPrecedence + +type Production = Production of NonTerminal * PrecedenceInfo * Symbols * Code option + +type ProcessedParserSpec = + { Terminals: (Terminal * PrecedenceInfo) list; + NonTerminals: NonTerminal list; + Productions: Production list; + StartSymbols: NonTerminal list } + + +let ProcessParserSpecAst (spec: ParserSpec) = + let explicitPrecInfo = + spec.Associativities + |> List.mapi (fun n precSpecs -> precSpecs |> List.map (fun (precSym, assoc) -> precSym,ExplicitPrec (assoc, 10000 - n))) + |> List.concat + + for (key,_) in explicitPrecInfo |> Seq.countBy fst |> Seq.filter (fun (_,n) -> n > 1) do + failwithf "%s is given two associativities" key + + let explicitPrecInfo = + explicitPrecInfo |> Map.ofList + + let implicitSymPrecInfo = NoPrecedence + let terminals = List.map fst spec.Tokens @ ["error"]in + let terminalSet = Set.ofList terminals + let IsTerminal z = terminalSet.Contains(z) + let prec_of_terminal sym implicitPrecInfo = + if explicitPrecInfo.ContainsKey(sym) then explicitPrecInfo.[sym] + else match implicitPrecInfo with Some x -> x | None -> implicitSymPrecInfo + + let mkSym s = if IsTerminal s then Terminal s else NonTerminal s + let prods = + spec.Rules |> List.mapi (fun i (nonterm,rules) -> + rules |> List.mapi (fun j (Rule(syms,precsym,code)) -> + let precInfo = + let precsym = List.foldBack (fun x acc -> match acc with Some _ -> acc | None -> match x with z when IsTerminal z -> Some z | _ -> acc) syms precsym + let implicitPrecInfo = NoPrecedence + match precsym with + | None -> implicitPrecInfo + | Some sym -> if explicitPrecInfo.ContainsKey(sym) then explicitPrecInfo.[sym] else implicitPrecInfo + Production(nonterm, precInfo, List.map mkSym syms, code))) + |> List.concat + let nonTerminals = List.map fst spec.Rules + let nonTerminalSet = Set.ofList nonTerminals + let checkNonTerminal nt = + if nt <> "error" && not (nonTerminalSet.Contains(nt)) then + failwith (sprintf "NonTerminal '%s' has no productions" nt) + + for (Production(nt,_,syms,_)) in prods do + for sym in syms do + match sym with + | NonTerminal nt -> + checkNonTerminal nt + | Terminal t -> + if not (IsTerminal t) then failwith (sprintf "token %s is not declared" t) + + if spec.StartSymbols= [] then (failwith "at least one %start declaration is required"); + + for (nt,_) in spec.Types do + checkNonTerminal nt; + + let terminals = terminals |> List.map (fun t -> (t,prec_of_terminal t None)) + + { Terminals=terminals; + NonTerminals=nonTerminals; + Productions=prods; + StartSymbols=spec.StartSymbols } + + +//------------------------------------------------- +// Process LALR(1) grammars to tables + +type ProductionIndex = int +type ProdictionDotIndex = int + +/// Represent (ProductionIndex,ProdictionDotIndex) as one integer +type Item0 = uint32 + +let mkItem0 (prodIdx,dotIdx) : Item0 = (uint32 prodIdx <<< 16) ||| uint32 dotIdx +let prodIdx_of_item0 (item0:Item0) = int32 (item0 >>> 16) +let dotIdx_of_item0 (item0:Item0) = int32 (item0 &&& 0xFFFFu) + +/// Part of the output of CompilerLalrParserSpec +type Action = + | Shift of int + | Reduce of ProductionIndex + | Accept + | Error + +let outputPrecInfo os p = + match p with + | ExplicitPrec (assoc,n) -> fprintf os "explicit %a %d" OutputAssoc assoc n + | NoPrecedence -> fprintf os "noprec" + + +/// LR(0) kernels +type Kernel = Set + +/// Indexes of LR(0) kernels in the KernelTable +type KernelIdx = int + +/// Indexes in the TerminalTable and NonTerminalTable +type TerminalIndex = int +type NonTerminalIndex = int + +/// Representation of Symbols. +/// Ideally would be declared as +/// type SymbolIndex = PTerminal of TerminalIndex | PNonTerminal of NonTerminalIndex +/// but for performance reasons we embed as a simple integer (saves ~10%) +/// +/// We use an active pattern to reverse the embedding. +type SymbolIndex = int +let PTerminal(i:TerminalIndex) : SymbolIndex = -i-1 +let PNonTerminal(i:NonTerminalIndex) : SymbolIndex = i +let (|PTerminal|PNonTerminal|) x = if x < 0 then PTerminal (-(x+1)) else PNonTerminal x + +type SymbolIndexes = SymbolIndex list + +/// Indexes in the LookaheadTable, SpontaneousTable, PropagateTable +/// Embed in a single integer, since these are faster +/// keys for the dictionary hash tables +/// +/// Logically: +/// +/// type KernelItemIndex = KernelItemIdx of KernelIdx * Item0 +type KernelItemIndex = int64 +let KernelItemIdx (i1,i2) = ((int64 i1) <<< 32) ||| int64 i2 + + +/// Indexes into the memoizing table for the Goto computations +/// Embed in a single integer, since these are faster +/// keys for the dictionary hash tables +/// +/// Logically: +/// +/// type GotoItemIndex = GotoItemIdx of KernelIdx * SymbolIndex +type GotoItemIndex = uint64 +let GotoItemIdx (i1:KernelIdx,i2:SymbolIndex) = (uint64 (uint32 i1) <<< 32) ||| uint64 (uint32 i2) +let (|GotoItemIdx|) (i64:uint64) = int32 ((i64 >>> 32) &&& 0xFFFFFFFFUL), int32 (i64 &&& 0xFFFFFFFFUL) + +/// Create a work list and loop until it is exhausted, calling a worker function for +/// each element. Pass a function to queue additional work on the work list +/// to the worker function +let ProcessWorkList start f = + let work = ref (start : 'a list) + let queueWork = (fun x -> work := x :: !work) + let rec loop() = + match !work with + | [] -> () + | x::t -> + work := t; + f queueWork x; + loop() + loop() + +/// A standard utility to compute a least fixed point of a set under a generative computation +let LeastFixedPoint f set = + let acc = ref set + ProcessWorkList (Set.toList set) (fun queueWork item -> + f(item) |> List.iter (fun i2 -> if not (Set.contains i2 !acc) then (acc := Set.add i2 !acc; queueWork i2)) ) + !acc + +/// A general standard memoization utility. Be sure to apply to only one (function) argument to build the +/// residue function! +let Memoize f = + let t = new Dictionary<_,_>(1000) + fun x -> + let ok,v = t.TryGetValue(x) + if ok then v else let res = f x in t.[x] <- res; res + +/// A standard utility to create a dictionary from a list of pairs +let CreateDictionary xs = + let dict = new Dictionary<_,_>() + for x,y in xs do dict.Add(x,y) + dict + +/// Allocate indexes for each non-terminal +type NonTerminalTable(nonTerminals:NonTerminal list) = + let nonterminalsWithIdxs = List.mapi (fun (i:NonTerminalIndex) n -> (i,n)) nonTerminals + let nonterminalIdxs = List.map fst nonterminalsWithIdxs + let a = Array.ofList nonTerminals + let b = CreateDictionary [ for i,x in nonterminalsWithIdxs -> x,i ]; + member table.OfIndex(i) = a.[i] + member table.ToIndex(i) = b.[i] + member table.Indexes = nonterminalIdxs + +/// Allocate indexes for each terminal +type TerminalTable(terminals:(Terminal * PrecedenceInfo) list) = + let terminalsWithIdxs = List.mapi (fun i (t,_) -> (i,t)) terminals + let terminalIdxs = List.map fst terminalsWithIdxs + let a = Array.ofList (List.map fst terminals) + let b = Array.ofList (List.map snd terminals) + let c = CreateDictionary [ for i,x in terminalsWithIdxs -> x,i ] + + member table.OfIndex(i) = a.[i] + member table.PrecInfoOfIndex(i) = b.[i] + member table.ToIndex(i) = c.[i] + member table.Indexes = terminalIdxs + +/// Allocate indexes for each production +type ProductionTable(ntTab:NonTerminalTable, termTab:TerminalTable, nonTerminals:string list, prods: Production list) = + let prodsWithIdxs = List.mapi (fun i n -> (i,n)) prods + let a = + prodsWithIdxs + |> List.map(fun (_,Production(_,_,syms,_)) -> + syms + |> Array.ofList + |> Array.map (function + | Terminal t -> PTerminal (termTab.ToIndex t) + | NonTerminal nt -> PNonTerminal (ntTab.ToIndex nt )) ) + |> Array.ofList + let b = Array.ofList (List.map (fun (_,Production(nt,_,_,_)) -> ntTab.ToIndex nt) prodsWithIdxs) + let c = Array.ofList (List.map (fun (_,Production(_,prec,_,_)) -> prec) prodsWithIdxs) + let productions = + nonTerminals + |> List.map(fun nt -> (ntTab.ToIndex nt, List.choose (fun (i,Production(nt2,prec,syms,_)) -> if nt2=nt then Some i else None) prodsWithIdxs)) + |> CreateDictionary + + member prodTab.Symbols(i) = a.[i] + member prodTab.NonTerminal(i) = b.[i] + member prodTab.Precedence(i) = c.[i] + member prodTab.Symbol i n = + let syms = prodTab.Symbols i + if n >= syms.Length then None else Some (syms.[n]) + member prodTab.Productions = productions + +/// A mutable table maping kernels to sets of lookahead tokens +type LookaheadTable() = + let t = new Dictionary>() + member table.Add(x,y) = + let prev = if t.ContainsKey(x) then t.[x] else Set.empty + t.[x] <- prev.Add(y) + member table.Contains(x,y) = t.ContainsKey(x) && t.[x].Contains(y) + member table.GetLookaheads(idx:KernelItemIndex) = + let ok,v = t.TryGetValue(idx) + if ok then v else Set.empty + member table.Count = t |> Seq.fold(fun acc (KeyValue(_,v)) -> v.Count+acc) 0 + +/// A mutable table giving an index to each LR(0) kernel. Kernels are referred to only by index. +type KernelTable(kernels) = + // Give an index to each LR(0) kernel, and from now on refer to them only by index + // Also develop "kernelItemIdx" to refer to individual items within a kernel + let kernelsAndIdxs = List.mapi (fun i x -> (i,x)) kernels + let kernelIdxs = List.map fst kernelsAndIdxs + let toIdxMap = Map.ofList [ for i,x in kernelsAndIdxs -> x,i ] + let ofIdxMap = Array.ofList kernels + member t.Indexes = kernelIdxs + member t.Index(kernel) = toIdxMap.[kernel] + member t.Kernel(i) = ofIdxMap.[i] + +/// Hold the results of cpmuting the LALR(1) closure of an LR(0) kernel +type Closure1Table() = + let t = new Dictionary>() + member table.Add(a,b) = + if not (t.ContainsKey(a)) then t.[a] <- new HashSet<_>(HashIdentity.Structural) + t.[a].Add(b) + member table.Count = t.Count + member table.IEnumerable = (t :> seq<_>) + member table.Contains(a,b) = t.ContainsKey(a) && t.[a].Contains(b) + +/// A mutable table giving a lookahead set Set for each kernel. The terminals represent the +/// "spontaneous" items for the kernel. TODO: document this more w.r.t. the Dragon book. +type SpontaneousTable() = + let t = new Dictionary>() + member table.Add(a,b) = + if not (t.ContainsKey(a)) then t.[a] <- new HashSet<_>(HashIdentity.Structural) + t.[a].Add(b) + member table.Count = t.Count + member table.IEnumerable = (t :> seq<_>) + +/// A mutable table giving a Set for each kernel. The kernels represent the +/// "propagate" items for the kernel. TODO: document this more w.r.t. the Dragon book. +type PropagateTable() = + let t = new Dictionary>() + member table.Add(a,b) = + if not (t.ContainsKey(a)) then t.[a] <- new HashSet(HashIdentity.Structural) + t.[a].Add(b) + member table.Item + with get(a) = + let ok,v = t.TryGetValue(a) + if ok then v :> seq<_> else Seq.empty + member table.Count = t.Count + + +/// Compile a pre-processed LALR parser spec to tables following the Dragon book algorithm +let CompilerLalrParserSpec logf (spec : ProcessedParserSpec) = + let stopWatch = new System.Diagnostics.Stopwatch() + let reportTime() = printfn " time: %A" stopWatch.Elapsed; stopWatch.Reset(); stopWatch.Start() + stopWatch.Start() + + // Augment the grammar + let fakeStartNonTerminals = spec.StartSymbols |> List.map(fun nt -> "_start" + nt) + let nonTerminals = fakeStartNonTerminals@spec.NonTerminals + let endOfInputTerminal = "$$" + let dummyLookahead = "#" + let dummyPrec = NoPrecedence + let terminals = spec.Terminals @ [(dummyLookahead,dummyPrec); (endOfInputTerminal,dummyPrec)] + let prods = List.map2 (fun a b -> Production(a, dummyPrec,[NonTerminal b],None)) fakeStartNonTerminals spec.StartSymbols @ spec.Productions + let startNonTerminalIdx_to_prodIdx (i:int) = i + + // Build indexed tables + let ntTab = NonTerminalTable(nonTerminals) + let termTab = TerminalTable(terminals) + let prodTab = ProductionTable(ntTab,termTab,nonTerminals,prods) + let dummyLookaheadIdx = termTab.ToIndex dummyLookahead + let endOfInputTerminalIdx = termTab.ToIndex endOfInputTerminal + + let errorTerminalIdx = termTab.ToIndex "error" + + // Compute the FIRST function + printf "computing first function..."; stdout.Flush(); + + let computedFirstTable = + let seed = + Map.ofList + [ for term in termTab.Indexes do yield (PTerminal(term),Set.singleton (Some term)) + for nonTerm in ntTab.Indexes do + yield + (PNonTerminal nonTerm, + List.foldBack + (fun prodIdx acc -> match prodTab.Symbol prodIdx 0 with None -> Set.add None acc | Some _ -> acc) + prodTab.Productions.[nonTerm] + Set.empty) ] + + let add changed ss (x,y) = + let s = Map.find x ss + if Set.contains y s then ss + else (changed := true; Map.add x (Set.add y s) ss) + + let oneRound (ss:Map<_,_>) = + let changed = ref false + let frontier = + let res = ref [] + for nonTermX in ntTab.Indexes do + for prodIdx in prodTab.Productions.[nonTermX] do + let rhs = Array.toList (prodTab.Symbols prodIdx) + let rec place l = + match l with + | (yi::t) -> + res := + List.choose + (function None -> None | Some a -> Some (PNonTerminal nonTermX,Some a)) + (Set.toList ss.[yi]) + @ !res; + if ss.[yi].Contains(None) then place t; + | [] -> + res := (PNonTerminal nonTermX,None) :: !res + place rhs + !res + let ss' = List.fold (add changed) ss frontier + !changed, ss' + + let rec loop ss = + let changed, ss' = oneRound ss + if changed then loop ss' else ss' + loop seed + + + /// Compute the first set of the given sequence of non-terminals. If any of the non-terminals + /// have an empty token in the first set then we have to iterate through those. + let ComputeFirstSetOfTokenList = + Memoize (fun (str,term) -> + let acc = new System.Collections.Generic.List<_>() + let rec add l = + match l with + | [] -> acc.Add(term) + | sym::moreSyms -> + let firstSetOfSym = computedFirstTable.[sym] + firstSetOfSym |> Set.iter (function None -> () | Some v -> acc.Add(v)) + if firstSetOfSym.Contains(None) then add moreSyms + add str; + Set.ofSeq acc) + + // (int,int) representation of LR(0) items + let prodIdx_to_item0 idx = mkItem0(idx,0) + let prec_of_item0 item0 = prodTab.Precedence (prodIdx_of_item0 item0) + let ntIdx_of_item0 item0 = prodTab.NonTerminal (prodIdx_of_item0 item0) + + let lsyms_of_item0 item0 = + let prodIdx = prodIdx_of_item0 item0 + let dotIdx = dotIdx_of_item0 item0 + let syms = prodTab.Symbols prodIdx + if dotIdx <= 0 then [||] else syms.[..dotIdx-1] + + let rsyms_of_item0 item0 = + let prodIdx = prodIdx_of_item0 item0 + let dotIdx = dotIdx_of_item0 item0 + let syms = prodTab.Symbols prodIdx + syms.[dotIdx..] + + let rsym_of_item0 item0 = + let prodIdx = prodIdx_of_item0 item0 + let dotIdx = dotIdx_of_item0 item0 + prodTab.Symbol prodIdx dotIdx + + let advance_of_item0 item0 = + let prodIdx = prodIdx_of_item0 item0 + let dotIdx = dotIdx_of_item0 item0 + mkItem0(prodIdx,dotIdx+1) + let fakeStartNonTerminalsSet = Set.ofList (fakeStartNonTerminals |> List.map ntTab.ToIndex) + + let IsStartItem item0 = fakeStartNonTerminalsSet.Contains(ntIdx_of_item0 item0) + let IsKernelItem item0 = (IsStartItem item0 || dotIdx_of_item0 item0 <> 0) + + let StringOfSym sym = match sym with PTerminal s -> "'" + termTab.OfIndex s + "'" | PNonTerminal s -> ntTab.OfIndex s + + let OutputSym os sym = fprintf os "%s" (StringOfSym sym) + + let OutputSyms os syms = + fprintf os "%s" (String.Join(" ",Array.map StringOfSym syms)) + + // Print items and other stuff + let OutputItem0 os item0 = + fprintf os " %s -> %a . %a" (ntTab.OfIndex (ntIdx_of_item0 item0)) (* outputPrecInfo precInfo *) OutputSyms (lsyms_of_item0 item0) OutputSyms (rsyms_of_item0 item0) + + let OutputItem0Set os s = + Set.iter (fun item -> fprintfn os "%a" OutputItem0 item) s + + let OutputFirstSet os m = + Set.iter (function None -> fprintf os "" | Some x -> fprintfn os " term %s" x) m + + let OutputFirstMap os m = + Map.iter (fun x y -> fprintf os "first '%a' = " OutputSym x; fprintfn os "%a" OutputFirstSet y) m + + let OutputAction os m = + match m with + | Shift n -> fprintf os " shift %d" n + | Reduce prodIdx -> fprintf os " reduce %s --> %a" (ntTab.OfIndex (prodTab.NonTerminal prodIdx)) OutputSyms (prodTab.Symbols prodIdx) + | Error -> fprintf os " error" + | Accept -> fprintf os " accept" + + let OutputActions os m = + Array.iteri (fun i (prec,action) -> let term = termTab.OfIndex i in fprintfn os " action '%s' (%a): %a" term outputPrecInfo prec OutputAction action) m + + let OutputActionTable os m = + Array.iteri (fun i n -> fprintfn os "state %d:" i; fprintfn os "%a" OutputActions n) m + + let OutputImmediateActions os m = + match m with + | None -> fprintf os "" + | Some a -> OutputAction os a + + let OutputGotos os m = + Array.iteri (fun ntIdx s -> let nonterm = ntTab.OfIndex ntIdx in match s with Some st -> fprintfn os " goto %s: %d" nonterm st | None -> ()) m + + let OutputCombined os m = + Array.iteri (fun i (a,b,c,d) -> + fprintf os "state %d:" i + fprintf os " items:" + fprintf os "%a" OutputItem0Set a + fprintf os " actions:" + fprintf os "%a" OutputActions b + fprintf os " immediate action: " + fprintf os "%a" OutputImmediateActions c + fprintf os " gotos:" + fprintf os "%a" OutputGotos d) m + + let OutputLalrTables os (prods,states, startStates,actionTable,immediateActionTable,gotoTable,endOfInputTerminalIdx,errorTerminalIdx) = + let combined = Array.ofList (List.map2 (fun x (y,(z,w)) -> x,y,z,w) (Array.toList states) (List.zip (Array.toList actionTable) (List.zip (Array.toList immediateActionTable) (Array.toList gotoTable)))) + fprintfn os "------------------------"; + fprintfn os "states = "; + fprintfn os "%a" OutputCombined combined; + fprintfn os "startStates = %s" (String.Join(";",Array.ofList (List.map string startStates))); + fprintfn os "------------------------" + + + // Closure of LR(0) nonTerminals, items etc + let ComputeClosure0NonTerminal = + Memoize (fun nt -> + let seed = (List.foldBack (prodIdx_to_item0 >> Set.add) prodTab.Productions.[nt] Set.empty) + LeastFixedPoint + (fun item0 -> + match rsym_of_item0 item0 with + | None -> [] + | Some(PNonTerminal ntB) -> List.map prodIdx_to_item0 prodTab.Productions.[ntB] + | Some(PTerminal _) -> []) + seed) + + // Close a symbol under epsilon moves + let ComputeClosure0Symbol rsym acc = + match rsym with + | Some (PNonTerminal nt) -> Set.union (ComputeClosure0NonTerminal nt) acc + | _ -> acc + + // Close a set under epsilon moves + let ComputeClosure0 iset = + Set.fold (fun acc x -> ComputeClosure0Symbol (rsym_of_item0 x) acc) iset iset + + // Right symbols after closing under epsilon moves + let RelevantSymbolsOfKernel kernel = + let kernelClosure0 = ComputeClosure0 kernel + Set.fold (fun acc x -> Option.fold (fun acc x -> Set.add x acc) acc (rsym_of_item0 x)) Set.empty kernelClosure0 + + // Goto set of a kernel of LR(0) nonTerminals, items etc + // Input is kernel, output is kernel + let ComputeGotosOfKernel iset sym = + let isetClosure = ComputeClosure0 iset + let acc = new System.Collections.Generic.List<_>(10) + isetClosure |> Set.iter (fun item0 -> + match rsym_of_item0 item0 with + | Some sym2 when sym = sym2 -> acc.Add(advance_of_item0 item0) + | _ -> ()) + Set.ofSeq acc + + // Build the full set of LR(0) kernels + reportTime(); printf "building kernels..."; stdout.Flush(); + let startItems = List.mapi (fun i _ -> prodIdx_to_item0 (startNonTerminalIdx_to_prodIdx i)) fakeStartNonTerminals + let startKernels = List.map Set.singleton startItems + let kernels = + + /// We use a set-of-sets here. F# sets support structural comparison but at the time of writing + /// did not structural hashing. + let acc = ref Set.empty + ProcessWorkList startKernels (fun addToWorkList kernel -> + if not ((!acc).Contains(kernel)) then + acc := (!acc).Add(kernel); + for csym in RelevantSymbolsOfKernel kernel do + let gotoKernel = ComputeGotosOfKernel kernel csym + assert (gotoKernel.Count > 0) + addToWorkList gotoKernel ) + + !acc |> Seq.toList |> List.map (Set.filter IsKernelItem) + + reportTime(); printf "building kernel table..."; stdout.Flush(); + // Give an index to each LR(0) kernel, and from now on refer to them only by index + let kernelTab = new KernelTable(kernels) + let startKernelIdxs = List.map kernelTab.Index startKernels + let startKernelItemIdxs = List.map2 (fun a b -> KernelItemIdx(a,b)) startKernelIdxs startItems + + let outputKernelItemIdx os (kernelIdx,item0) = + fprintf os "kernel %d, item %a" kernelIdx OutputItem0 item0 + + /// A cached version of the "goto" computation on LR(0) kernels + let gotoKernel = + Memoize (fun (GotoItemIdx(kernelIdx,sym)) -> + let gset = ComputeGotosOfKernel (kernelTab.Kernel kernelIdx) sym + if gset.IsEmpty then None else Some (kernelTab.Index gset)) + + /// Iterate (iset,sym) pairs such that (gotoKernel kernelIdx sym) is not empty + let IterateGotosOfKernel kernelIdx f = + for sym in RelevantSymbolsOfKernel (kernelTab.Kernel kernelIdx) do + match gotoKernel (GotoItemIdx(kernelIdx,sym)) with + | None -> () + | Some k -> f sym k + + + // This is used to compute the closure of an LALR(1) kernel + // + // For each item [A --> X.BY, a] in I + // For each production B -> g in G' + // For each terminal b in FIRST(Ya) + // such that [B --> .g, b] is not in I do + // add [B --> .g, b] to I + + let ComputeClosure1 iset = + let acc = new Closure1Table() + ProcessWorkList iset (fun addToWorkList (item0,pretokens:Set) -> + pretokens |> Set.iter (fun pretoken -> + if not (acc.Contains(item0,pretoken)) then + acc.Add(item0,pretoken) |> ignore + let rsyms = rsyms_of_item0 item0 + if rsyms.Length > 0 then + match rsyms.[0] with + | (PNonTerminal ntB) -> + let firstSet = ComputeFirstSetOfTokenList (Array.toList rsyms.[1..],pretoken) + for prodIdx in prodTab.Productions.[ntB] do + addToWorkList (prodIdx_to_item0 prodIdx,firstSet) + | PTerminal _ -> ())) + acc + + // Compute the "spontaneous" and "propagate" maps for each LR(0) kernelItem + // + // Input: The kernal K of a set of LR(0) items I and a grammar symbol X + // + // Output: The lookaheads generated spontaneously by items in I for kernel items + // in goto(I,X) and the items I from which lookaheads are propagated to kernel + // items in goto(I,X) + // + // Method + // 1. Construct LR(0) kernel items (done - above) + // 2. + // TODO: this is very, very slow. + // + // PLAN TO OPTIMIZE THIS; + // - Clarify and comment what's going on here + // - verify if we really have to do these enormouos closure computations + // - assess if it's possible to use the symbol we're looking for to help trim the jset + + reportTime(); printf "computing lookahead relations..."; stdout.Flush(); + + + let spontaneous, propagate = + let closure1OfItem0WithDummy = + Memoize (fun item0 -> ComputeClosure1 [(item0,Set.ofList [dummyLookaheadIdx])]) + + let spontaneous = new SpontaneousTable() + let propagate = new PropagateTable() + let count = ref 0 + + for kernelIdx in kernelTab.Indexes do + printf "."; stdout.Flush(); + //printf "kernelIdx = %d\n" kernelIdx; stdout.Flush(); + let kernel = kernelTab.Kernel(kernelIdx) + for item0 in kernel do + let item0Idx = KernelItemIdx(kernelIdx,item0) + let jset = closure1OfItem0WithDummy item0 + //printf "#jset = %d\n" jset.Count; stdout.Flush(); + for (KeyValue(closureItem0, lookaheadTokens)) in jset.IEnumerable do + incr count + match rsym_of_item0 closureItem0 with + | None -> () + | Some rsym -> + match gotoKernel (GotoItemIdx(kernelIdx,rsym)) with + | None -> () + | Some gotoKernelIdx -> + let gotoItem = advance_of_item0 closureItem0 + let gotoItemIdx = KernelItemIdx(gotoKernelIdx,gotoItem) + for lookaheadToken in lookaheadTokens do + if lookaheadToken = dummyLookaheadIdx + then propagate.Add(item0Idx, gotoItemIdx) |> ignore + else spontaneous.Add(gotoItemIdx, lookaheadToken) |> ignore + + + //printfn "#kernelIdxs = %d, count = %d" kernelTab.Indexes.Length !count + spontaneous, + propagate + + //printfn "#spontaneous = %d, #propagate = %d" spontaneous.Count propagate.Count; stdout.Flush(); + + //exit 0; + // Repeatedly use the "spontaneous" and "propagate" maps to build the full set + // of lookaheads for each LR(0) kernelItem. + reportTime(); printf "building lookahead table..."; stdout.Flush(); + let lookaheadTable = + + // Seed the table with the startKernelItems and the spontaneous info + let initialWork = + [ for idx in startKernelItemIdxs do + yield (idx,endOfInputTerminalIdx) + for (KeyValue(kernelItemIdx,lookaheads)) in spontaneous.IEnumerable do + for lookahead in lookaheads do + yield (kernelItemIdx,lookahead) ] + + let acc = new LookaheadTable() + // Compute the closure + ProcessWorkList + initialWork + (fun queueWork (kernelItemIdx,lookahead) -> + acc.Add(kernelItemIdx,lookahead) + for gotoKernelIdx in propagate.[kernelItemIdx] do + if not (acc.Contains(gotoKernelIdx,lookahead)) then + queueWork(gotoKernelIdx,lookahead)) + acc + + //printf "built lookahead table, #lookaheads = %d\n" lookaheadTable.Count; stdout.Flush(); + + reportTime(); printf "building action table..."; stdout.Flush(); + let shiftReduceConflicts = ref 0 + let reduceReduceConflicts = ref 0 + let actionTable, immediateActionTable = + + // Now build the action tables. First a utility to merge the given action + // into the table, taking into account precedences etc. and reporting errors. + let addResolvingPrecedence (arr: _[]) kernelIdx termIdx (precNew, actionNew) = + // printf "DEBUG: state %d: adding action for %s, precNew = %a, actionNew = %a\n" kernelIdx (termTab.OfIndex termIdx) outputPrec precNew OutputAction actionNew; + // We add in order of precedence - however the precedences may be the same, and we give warnings when rpecedence resolution is based on implicit file orderings + + let (precSoFar, actionSoFar) as itemSoFar = arr.[termIdx] + + // printf "DEBUG: state %d: adding action for %s, precNew = %a, precSoFar = %a, actionSoFar = %a\n" kernelIdx (termTab.OfIndex termIdx) outputPrec precNew outputPrec precSoFar OutputAction actionSoFar; + // if compare_prec precSoFar precNew = -1 then failwith "addResolvingPrecedence"; + + let itemNew = (precNew, actionNew) + let winner = + let reportConflict x1 x2 reason = + let reportAction (p, a) = + let an, astr = + match a with + | Shift x -> "shift", sprintf "shift(%d)" x + | Reduce x -> + let nt = prodTab.NonTerminal x + "reduce", prodTab.Symbols x + |> Array.map StringOfSym + |> String.concat " " + |> sprintf "reduce(%s:%s)" (ntTab.OfIndex nt) + | _ -> "", "" + let pstr = + match p with + | ExplicitPrec (assoc,n) -> + let astr = + match assoc with + | LeftAssoc -> "left" + | RightAssoc -> "right" + | NonAssoc -> "nonassoc" + sprintf "[explicit %s %d]" astr n + | NoPrecedence -> + "noprec" + an, "{" + pstr + " " + astr + "}" + let a1n, astr1 = reportAction x1 + let a2n, astr2 = reportAction x2 + printfn " %s/%s error at state %d on terminal %s between %s and %s - assuming the former because %s" a1n a2n kernelIdx (termTab.OfIndex termIdx) astr1 astr2 reason + match itemSoFar,itemNew with + | (_,Shift s1),(_, Shift s2) -> + if actionSoFar <> actionNew then + reportConflict itemSoFar itemNew "internal error" + itemSoFar + + | (((precShift,Shift sIdx) as shiftItem), + ((precReduce,Reduce prodIdx) as reduceItem)) + | (((precReduce,Reduce prodIdx) as reduceItem), + ((precShift,Shift sIdx) as shiftItem)) -> + match precReduce, precShift with + | (ExplicitPrec (_,p1), ExplicitPrec(assocNew,p2)) -> + if p1 < p2 then shiftItem + elif p1 > p2 then reduceItem + else + match assocNew with + | LeftAssoc -> reduceItem + | RightAssoc -> shiftItem + | NonAssoc -> + reportConflict shiftItem reduceItem "we prefer shift on equal precedences" + incr shiftReduceConflicts; + shiftItem + | _ -> + reportConflict shiftItem reduceItem "we prefer shift when unable to compare precedences" + incr shiftReduceConflicts; + shiftItem + | ((_,Reduce prodIdx1),(_, Reduce prodIdx2)) -> + "we prefer the rule earlier in the file" + |> if prodIdx1 < prodIdx2 then reportConflict itemSoFar itemNew else reportConflict itemNew itemSoFar + incr reduceReduceConflicts; + if prodIdx1 < prodIdx2 then itemSoFar else itemNew + | _ -> itemNew + arr.[termIdx] <- winner + + + // This build the action table for one state. + let ComputeActions kernelIdx = + let kernel = kernelTab.Kernel kernelIdx + let arr = Array.create terminals.Length (NoPrecedence,Error) + + //printf "building lookahead table LR(1) items for kernelIdx %d\n" kernelIdx; stdout.Flush(); + + // Compute the LR(1) items based on lookaheads + let items = + [ for item0 in kernel do + let kernelItemIdx = KernelItemIdx(kernelIdx,item0) + let lookaheads = lookaheadTable.GetLookaheads(kernelItemIdx) + yield (item0,lookaheads) ] + |> ComputeClosure1 + + for (KeyValue(item0,lookaheads)) in items.IEnumerable do + + let nonTermA = ntIdx_of_item0 item0 + match rsym_of_item0 item0 with + | Some (PTerminal termIdx) -> + let action = + match gotoKernel (GotoItemIdx(kernelIdx,PTerminal termIdx)) with + | None -> failwith "action on terminal should have found a non-empty goto state" + | Some gkernelItemIdx -> Shift gkernelItemIdx + let prec = termTab.PrecInfoOfIndex termIdx + addResolvingPrecedence arr kernelIdx termIdx (prec, action) + | None -> + for lookahead in lookaheads do + if not (IsStartItem(item0)) then + let prodIdx = prodIdx_of_item0 item0 + let prec = prec_of_item0 item0 + let action = (prec, Reduce prodIdx) + addResolvingPrecedence arr kernelIdx lookahead action + elif lookahead = endOfInputTerminalIdx then + let prec = prec_of_item0 item0 + let action = (prec,Accept) + addResolvingPrecedence arr kernelIdx lookahead action + else () + | _ -> () + + // If there is a single item A -> B C . and no Shift or Accept actions (i.e. only Error or Reduce, so the choice of terminal + // cannot affect what we do) then we emit an immediate reduce action for the rule corresponding to that item + // Also do the same for Accept rules. + let closure = (ComputeClosure0 kernel) + + let immediateAction = + match Set.toList closure with + | [item0] -> + match (rsym_of_item0 item0) with + | None when (let reduceOrErrorAction = function Error | Reduce _ -> true | Shift _ | Accept -> false + termTab.Indexes |> List.forall(fun terminalIdx -> reduceOrErrorAction (snd(arr.[terminalIdx])))) + -> Some (Reduce (prodIdx_of_item0 item0)) + + | None when (let acceptOrErrorAction = function Error | Accept -> true | Shift _ | Reduce _ -> false + List.forall (fun terminalIdx -> acceptOrErrorAction (snd(arr.[terminalIdx]))) termTab.Indexes) + -> Some Accept + + | _ -> None + | _ -> None + + // A -> B C . rules give rise to reductions in favour of errors + for item0 in ComputeClosure0 kernel do + let prec = prec_of_item0 item0 + match rsym_of_item0 item0 with + | None -> + for terminalIdx in termTab.Indexes do + if snd(arr.[terminalIdx]) = Error then + let prodIdx = prodIdx_of_item0 item0 + let action = (prec, (if IsStartItem(item0) then Accept else Reduce prodIdx)) + addResolvingPrecedence arr kernelIdx terminalIdx action + | _ -> () + + arr,immediateAction + + let actionInfo = List.map ComputeActions kernelTab.Indexes + Array.ofList (List.map fst actionInfo), + Array.ofList (List.map snd actionInfo) + + // The goto table is much simpler - it is based on LR(0) kernels alone. + + reportTime(); printf " building goto table..."; stdout.Flush(); + let gotoTable = + let gotos kernelIdx = Array.ofList (List.map (fun nt -> gotoKernel (GotoItemIdx(kernelIdx,PNonTerminal nt))) ntTab.Indexes) + Array.ofList (List.map gotos kernelTab.Indexes) + + reportTime(); printfn " returning tables."; stdout.Flush(); + if !shiftReduceConflicts > 0 then printfn " %d shift/reduce conflicts" !shiftReduceConflicts; stdout.Flush(); + if !reduceReduceConflicts > 0 then printfn " %d reduce/reduce conflicts" !reduceReduceConflicts; stdout.Flush(); + if !shiftReduceConflicts > 0 || !reduceReduceConflicts > 0 then printfn " consider setting precedences explicitly using %%left %%right and %%nonassoc on terminals and/or setting explicit precedence on rules using %%prec" + + /// The final results + let states = kernels |> Array.ofList + let prods = Array.ofList (List.map (fun (Production(nt,prec,syms,code)) -> (nt, ntTab.ToIndex nt, syms,code)) prods) + + logf (fun logStream -> + printfn "writing tables to log"; stdout.Flush(); + OutputLalrTables logStream (prods, states, startKernelIdxs, actionTable, immediateActionTable, gotoTable, (termTab.ToIndex endOfInputTerminal), errorTerminalIdx)); + + let states = states |> Array.map (Set.toList >> List.map prodIdx_of_item0) + (prods, states, startKernelIdxs, + actionTable, immediateActionTable, gotoTable, + (termTab.ToIndex endOfInputTerminal), + errorTerminalIdx, nonTerminals) + + +(* Some examples for testing *) + +(* + +let example1 = + let e = "E" + let t = "Terminal" + let plus = "+" + let mul = "*" + let f = "F" + let lparen = "(" + let rparen = ")" + let id = "id" + + let terminals = [plus; mul; lparen; rparen; id] + let nonTerminals = [e; t; f] + + let p2 = e, (NonAssoc, ExplicitPrec 1), [NonTerminal e; Terminal plus; NonTerminal t], None + let p3 = e, (NonAssoc, ExplicitPrec 2), [NonTerminal t], None in + let p4 = t, (NonAssoc, ExplicitPrec 3), [NonTerminal t; Terminal mul; NonTerminal f], None + let p5 = t, (NonAssoc, ExplicitPrec 4), [NonTerminal f], None + let p6 = f, (NonAssoc, ExplicitPrec 5), [Terminal lparen; NonTerminal e; Terminal rparen], None + let p7 = f, (NonAssoc, ExplicitPrec 6), [Terminal id], None + + let prods = [p2;p3;p4;p5;p6;p7] + Spec(terminals,nonTerminals,prods, [e]) + +let example2 = + let prods = [ "S", (NonAssoc, ExplicitPrec 1), [NonTerminal "C";NonTerminal "C"], None; + "C", (NonAssoc, ExplicitPrec 2), [Terminal "c";NonTerminal "C"], None ; + "C", (NonAssoc, ExplicitPrec 3), [Terminal "d"] , None ]in + Spec(["c";"d"],["S";"C"],prods, ["S"]) + +let example3 = + let terminals = ["+"; "*"; "("; ")"; "id"] + let nonTerminals = ["E"; "Terminal"; "E'"; "F"; "Terminal'"] + let prods = [ "E", (NonAssoc, ExplicitPrec 1), [ NonTerminal "Terminal"; NonTerminal "E'" ], None; + "E'", (NonAssoc, ExplicitPrec 2), [ Terminal "+"; NonTerminal "Terminal"; NonTerminal "E'"], None; + "E'", (NonAssoc, ExplicitPrec 3), [ ], None; + "Terminal", (NonAssoc, ExplicitPrec 4), [ NonTerminal "F"; NonTerminal "Terminal'" ], None; + "Terminal'", (NonAssoc, ExplicitPrec 5), [ Terminal "*"; NonTerminal "F"; NonTerminal "Terminal'"], None; + "Terminal'", (NonAssoc, ExplicitPrec 6), [ ], None; + "F", (NonAssoc, ExplicitPrec 7), [ Terminal "("; NonTerminal "E"; Terminal ")"], None; + "F", (NonAssoc, ExplicitPrec 8), [ Terminal "id"], None ] + Spec(terminals,nonTerminals,prods, ["E"]) + +let example4 = + let terminals = ["+"; "*"; "("; ")"; "id"] + let nonTerminals = ["E"] + let prods = [ "E", (NonAssoc, ExplicitPrec 1), [ NonTerminal "E"; Terminal "+"; NonTerminal "E" ], None; + "E", (NonAssoc, ExplicitPrec 2), [ NonTerminal "E"; Terminal "*"; NonTerminal "E" ], None; + "E", (NonAssoc, ExplicitPrec 3), [ Terminal "("; NonTerminal "E"; Terminal ")"], None; + "E", (NonAssoc, ExplicitPrec 8), [ Terminal "id"], None ] + Spec(terminals,nonTerminals,prods, ["E"]) + +let example5 = + let terminals = ["+"; "*"; "("; ")"; "id"] + let nonTerminals = ["E"] + let prods = [ "E", (NonAssoc, ExplicitPrec 1), [ NonTerminal "E"; Terminal "+"; NonTerminal "E" ], None; + "E", (NonAssoc, ExplicitPrec 2), [ NonTerminal "E"; Terminal "*"; NonTerminal "E" ], None; + "E", (NonAssoc, ExplicitPrec 3), [ Terminal "("; NonTerminal "E"; Terminal ")"], None; + "E", (NonAssoc, ExplicitPrec 8), [ Terminal "id"], None ] + Spec(terminals,nonTerminals,prods, ["E"]) + +let example6 = + let terminals = ["+"; "*"; "("; ")"; "id"; "-"] + let nonTerminals = ["E"] + let prods = [ "E", (RightAssoc, ExplicitPrec 1), [ NonTerminal "E"; Terminal "-"; NonTerminal "E" ], None; + "E", (LeftAssoc, ExplicitPrec 1), [ NonTerminal "E"; Terminal "+"; NonTerminal "E" ], None; + "E", (LeftAssoc, ExplicitPrec 2), [ NonTerminal "E"; Terminal "*"; NonTerminal "E" ], None; + "E", (NonAssoc, ExplicitPrec 3), [ Terminal "("; NonTerminal "E"; Terminal ")"], None; + "E", (NonAssoc, ExplicitPrec 8), [ Terminal "id"], None ] + Spec(terminals,nonTerminals,prods, ["E"]) + + +let example7 = + let prods = [ "S", (NonAssoc, ExplicitPrec 1), [NonTerminal "L";Terminal "="; NonTerminal "R"], None; + "S", (NonAssoc, ExplicitPrec 2), [NonTerminal "R"], None ; + "L", (NonAssoc, ExplicitPrec 3), [Terminal "*"; NonTerminal "R"], None; + "L", (NonAssoc, ExplicitPrec 3), [Terminal "id"], None; + "R", (NonAssoc, ExplicitPrec 3), [NonTerminal "L"], None; ] + Spec(["*";"=";"id"],["S";"L";"R"],prods, ["S"]) + + + +let test ex = CompilerLalrParserSpec stdout ex + +(* let _ = test example2*) +(* let _ = exit 1*) +(* let _ = test example3 +let _ = test example1 +let _ = test example4 +let _ = test example5 +let _ = test example6 *) +*) diff --git a/src/buildtools/fsyacc/fsyacclex.fs b/src/buildtools/fsyacc/fsyacclex.fs new file mode 100644 index 0000000000..a035f6fe01 --- /dev/null +++ b/src/buildtools/fsyacc/fsyacclex.fs @@ -0,0 +1,644 @@ +# 1 "fsyacclex.fsl" + +(* (c) Microsoft Corporation 2005-2008. *) + +module internal FsLexYacc.FsYacc.Lexer + +open FsLexYacc.FsYacc.AST +open FsLexYacc.FsYacc.Parser +open System.Text +open Internal.Utilities.Text.Lexing + +let lexeme (lexbuf : LexBuffer) = new System.String(lexbuf.Lexeme) +let newline (lexbuf:LexBuffer<_>) = lexbuf.EndPos <- lexbuf.EndPos.NextLine + +let unexpected_char lexbuf = + failwith ("Unexpected character '"+(lexeme lexbuf)+"'") + +let typeDepth = ref 0 +let startPos = ref Position.Empty +let mutable str_buf = new System.Text.StringBuilder() + +let appendBuf (str:string) = str_buf.Append str |> ignore +let clearBuf () = str_buf <- new System.Text.StringBuilder() + + +# 26 "fsyacclex.fs" +let trans : uint16[] array = + [| + (* State 0 *) + [| 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 2us; 6us; 6us; 3us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 7us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 4us; 6us; 6us; 6us; 6us; 1us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 6us; 5us; |]; + (* State 1 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 11us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 2 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 3 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 10us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 4 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 9us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 5 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 6 *) + [| 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; |]; + (* State 7 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 8 *) + [| 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 65535us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 8us; 65535us; |]; + (* State 9 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 10 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 11 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 12 *) + [| 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 17us; 15us; 19us; 19us; 16us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 17us; 19us; 14us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 19us; 13us; 19us; 19us; 19us; 19us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 17us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 19us; 18us; |]; + (* State 13 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 22us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 22us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 14 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 15 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 16 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 21us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 17 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 18 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 19 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 20 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 20us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 21 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 22 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 23 *) + [| 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 30us; 26us; 33us; 33us; 27us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 30us; 33us; 29us; 33us; 33us; 33us; 33us; 28us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 31us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 33us; 33us; 33us; 33us; 33us; 33us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 30us; 25us; 33us; 24us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 33us; 32us; |]; + (* State 24 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 25 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 26 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 27 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 41us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 28 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 37us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 38us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 29 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 30 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 31 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 34us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 32 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 33 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 34 *) + [| 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 65535us; 35us; 35us; 65535us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 65535us; |]; + (* State 35 *) + [| 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 65535us; 35us; 35us; 65535us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 35us; 65535us; |]; + (* State 36 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 36us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 37 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 40us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 38 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 39us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 39 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 40us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 40 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 41 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 42 *) + [| 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 46us; 44us; 51us; 51us; 45us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 46us; 51us; 49us; 51us; 51us; 43us; 51us; 48us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 47us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 51us; 51us; 51us; 51us; 51us; 51us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 46us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 51us; 50us; |]; + (* State 43 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 60us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 44 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 45 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 59us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 46 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 47 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 56us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 48 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 52us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 53us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 49 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 50 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 51 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 52 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 55us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 53 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 54us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 54 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 55us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 55 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 56 *) + [| 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 65535us; 57us; 57us; 65535us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 65535us; |]; + (* State 57 *) + [| 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 65535us; 57us; 57us; 65535us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 57us; 65535us; |]; + (* State 58 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 58us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 59 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 60 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 61 *) + [| 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 62us; 64us; 63us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 64us; 65535us; |]; + (* State 62 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 63 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 64 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 65 *) + [| 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 72us; 73us; 79us; 79us; 74us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 72us; 79us; 79us; 79us; 79us; 66us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 77us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 78us; 70us; 68us; 79us; 69us; 79us; 79us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 79us; 79us; 79us; 79us; 79us; 79us; 75us; 75us; 75us; 75us; 67us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 75us; 71us; 76us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 79us; 80us; |]; + (* State 66 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 92us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 96us; 65535us; 98us; 65535us; 95us; 65535us; 97us; 94us; 93us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 91us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 67 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 87us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 68 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 69 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 70 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 71 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 72 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 86us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 86us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 73 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 74 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 85us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 75 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 76 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 77 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 81us; 65535us; 65535us; 65535us; 65535us; 82us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 78 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 79 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 80 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 81 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 82 *) + [| 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 65535us; 83us; 83us; 65535us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 65535us; |]; + (* State 83 *) + [| 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 65535us; 83us; 83us; 65535us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 83us; 65535us; |]; + (* State 84 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 85 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 86 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 86us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 86us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 87 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 88us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 88 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 89us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 89 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 90us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 90 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 84us; 65535us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 84us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 91 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 92 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 93 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 120us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 121us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 94 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 116us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 95 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 113us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 96 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 110us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 97 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 106us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 98 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 99us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 99 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 100us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 100 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 101us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 101 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 102us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 102 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 103us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 103 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 104us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 104 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 105us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 105 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 106 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 107us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 107 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 108us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 108 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 109us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 109 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 110 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 111us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 111 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 112us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 112 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 113 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 114us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 114 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 115us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 115 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 116 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 117us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 117 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 118us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 118 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 119us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 119 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 120 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 126us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 121 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 122us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 122 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 123us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 123 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 125us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 125us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 124us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 124 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 125 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 125us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 125us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 124us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 126 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 127us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 127 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 128us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 128 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 130us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 130us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 129us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 129 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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 130 *) + [| 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 130us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 130us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 129us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 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; 5us; 1us; 5us; 5us; 3us; 4us; 5us; 4us; 2us; 1us; 0us; 65535us; 5us; 1us; 2us; 5us; 3us; 4us; 5us; 3us; 2us; 0us; 65535us; 0us; 1us; 2us; 8us; 8us; 4us; 5us; 8us; 7us; 8us; 6us; 6us; 5us; 65535us; 65535us; 65535us; 3us; 2us; 65535us; 7us; 1us; 7us; 2us; 7us; 7us; 5us; 6us; 7us; 65535us; 65535us; 65535us; 4us; 3us; 3us; 2us; 1us; 0us; 65535us; 0us; 1us; 2us; 65535us; 22us; 17us; 11us; 12us; 13us; 14us; 15us; 16us; 22us; 17us; 18us; 22us; 21us; 22us; 23us; 19us; 20us; 20us; 17us; 16us; 15us; 17us; 17us; 17us; 10us; 0us; 1us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 65535us; 9us; 65535us; 65535us; 65535us; 8us; 65535us; 65535us; 7us; 65535us; 65535us; 5us; 65535us; 65535us; 65535us; 4us; 65535us; 65535us; 65535us; 65535us; 6us; 65535us; 65535us; 65535us; 3us; 2us; 65535us; |] +let _fslex_tables = Internal.Utilities.Text.Lexing.UnicodeTables.Create(trans,actions) +let rec _fslex_dummy () = _fslex_dummy() +(* Rule token *) +and token (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_token 65 lexbuf +(* Rule fs_type *) +and fs_type (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_fs_type 61 lexbuf +(* Rule header *) +and header p buff (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_header p buff 42 lexbuf +(* Rule code *) +and code p buff (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_code p buff 23 lexbuf +(* Rule codestring *) +and codestring buff (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_codestring buff 12 lexbuf +(* Rule comment *) +and comment (lexbuf : Internal.Utilities.Text.Lexing.LexBuffer<_>) = _fslex_comment 0 lexbuf +(* Rule token *) +and _fslex_token _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 35 "fsyacclex.fsl" + let p = lexbuf.StartPos in header p (new StringBuilder 100) lexbuf +# 313 "fsyacclex.fs" + ) + | 1 -> ( +# 36 "fsyacclex.fsl" + PERCENT_PERCENT +# 318 "fsyacclex.fs" + ) + | 2 -> ( +# 37 "fsyacclex.fsl" + typeDepth := 1; startPos := lexbuf.StartPos; clearBuf(); TOKEN (fs_type lexbuf) +# 323 "fsyacclex.fs" + ) + | 3 -> ( +# 38 "fsyacclex.fsl" + TOKEN (None) +# 328 "fsyacclex.fs" + ) + | 4 -> ( +# 39 "fsyacclex.fsl" + START +# 333 "fsyacclex.fs" + ) + | 5 -> ( +# 40 "fsyacclex.fsl" + PREC +# 338 "fsyacclex.fs" + ) + | 6 -> ( +# 41 "fsyacclex.fsl" + typeDepth := 1; startPos := lexbuf.StartPos; clearBuf(); TYPE (match fs_type lexbuf with Some x -> x | None -> failwith "gettype") +# 343 "fsyacclex.fs" + ) + | 7 -> ( +# 42 "fsyacclex.fsl" + LEFT +# 348 "fsyacclex.fs" + ) + | 8 -> ( +# 43 "fsyacclex.fsl" + RIGHT +# 353 "fsyacclex.fs" + ) + | 9 -> ( +# 44 "fsyacclex.fsl" + NONASSOC +# 358 "fsyacclex.fs" + ) + | 10 -> ( +# 45 "fsyacclex.fsl" + ERROR +# 363 "fsyacclex.fs" + ) + | 11 -> ( +# 46 "fsyacclex.fsl" + LESS +# 368 "fsyacclex.fs" + ) + | 12 -> ( +# 47 "fsyacclex.fsl" + GREATER +# 373 "fsyacclex.fs" + ) + | 13 -> ( +# 48 "fsyacclex.fsl" + SEMI +# 378 "fsyacclex.fs" + ) + | 14 -> ( +# 49 "fsyacclex.fsl" + let p = lexbuf.StartPos in + let buff = (new StringBuilder 100) in + // adjust the first line to get even indentation for all lines w.r.t. the left hand margin + buff.Append (String.replicate (lexbuf.StartPos.Column+1) " ") |> ignore; + code p buff lexbuf +# 387 "fsyacclex.fs" + ) + | 15 -> ( +# 54 "fsyacclex.fsl" + token lexbuf +# 392 "fsyacclex.fs" + ) + | 16 -> ( +# 55 "fsyacclex.fsl" + newline lexbuf; token lexbuf +# 397 "fsyacclex.fs" + ) + | 17 -> ( +# 56 "fsyacclex.fsl" + IDENT (lexeme lexbuf) +# 402 "fsyacclex.fs" + ) + | 18 -> ( +# 57 "fsyacclex.fsl" + BAR +# 407 "fsyacclex.fs" + ) + | 19 -> ( +# 58 "fsyacclex.fsl" + ignore(comment lexbuf); token lexbuf +# 412 "fsyacclex.fs" + ) + | 20 -> ( +# 59 "fsyacclex.fsl" + token lexbuf +# 417 "fsyacclex.fs" + ) + | 21 -> ( +# 60 "fsyacclex.fsl" + COLON +# 422 "fsyacclex.fs" + ) + | 22 -> ( +# 61 "fsyacclex.fsl" + unexpected_char lexbuf +# 427 "fsyacclex.fs" + ) + | 23 -> ( +# 62 "fsyacclex.fsl" + EOF +# 432 "fsyacclex.fs" + ) + | _ -> failwith "token" +(* Rule fs_type *) +and _fslex_fs_type _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 65 "fsyacclex.fsl" + incr typeDepth; appendBuf(lexeme lexbuf); fs_type lexbuf +# 441 "fsyacclex.fs" + ) + | 1 -> ( +# 67 "fsyacclex.fsl" + decr typeDepth; + if !typeDepth = 0 + then Some(string str_buf) + else appendBuf(lexeme lexbuf); fs_type lexbuf +# 449 "fsyacclex.fs" + ) + | 2 -> ( +# 71 "fsyacclex.fsl" + appendBuf(lexeme lexbuf); fs_type lexbuf +# 454 "fsyacclex.fs" + ) + | _ -> failwith "fs_type" +(* Rule header *) +and _fslex_header p buff _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 74 "fsyacclex.fsl" + HEADER (buff.ToString(), p) +# 463 "fsyacclex.fs" + ) + | 1 -> ( +# 75 "fsyacclex.fsl" + newline lexbuf; + ignore <| buff.Append System.Environment.NewLine; + header p buff lexbuf +# 470 "fsyacclex.fs" + ) + | 2 -> ( +# 79 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + header p buff lexbuf +# 476 "fsyacclex.fs" + ) + | 3 -> ( +# 82 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + header p buff lexbuf +# 482 "fsyacclex.fs" + ) + | 4 -> ( +# 85 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + header p buff lexbuf +# 488 "fsyacclex.fs" + ) + | 5 -> ( +# 88 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + ignore(codestring buff lexbuf); + header p buff lexbuf +# 495 "fsyacclex.fs" + ) + | 6 -> ( +# 91 "fsyacclex.fsl" + EOF +# 500 "fsyacclex.fs" + ) + | 7 -> ( +# 92 "fsyacclex.fsl" + ignore <| buff.Append(lexeme lexbuf).[0]; + header p buff lexbuf +# 506 "fsyacclex.fs" + ) + | _ -> failwith "header" +(* Rule code *) +and _fslex_code p buff _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 95 "fsyacclex.fsl" + CODE (buff.ToString(), p) +# 515 "fsyacclex.fs" + ) + | 1 -> ( +# 96 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + ignore(code p buff lexbuf); + ignore <| buff.Append "}"; + code p buff lexbuf +# 523 "fsyacclex.fs" + ) + | 2 -> ( +# 100 "fsyacclex.fsl" + newline lexbuf; + ignore <| buff.Append System.Environment.NewLine; + code p buff lexbuf +# 530 "fsyacclex.fs" + ) + | 3 -> ( +# 104 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + code p buff lexbuf +# 536 "fsyacclex.fs" + ) + | 4 -> ( +# 106 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + ignore(codestring buff lexbuf); + code p buff lexbuf +# 543 "fsyacclex.fs" + ) + | 5 -> ( +# 110 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + code p buff lexbuf +# 549 "fsyacclex.fs" + ) + | 6 -> ( +# 113 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + code p buff lexbuf +# 555 "fsyacclex.fs" + ) + | 7 -> ( +# 115 "fsyacclex.fsl" + EOF +# 560 "fsyacclex.fs" + ) + | 8 -> ( +# 116 "fsyacclex.fsl" + ignore <| buff.Append(lexeme lexbuf).[0]; + code p buff lexbuf +# 566 "fsyacclex.fs" + ) + | _ -> failwith "code" +(* Rule codestring *) +and _fslex_codestring buff _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 122 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + codestring buff lexbuf +# 576 "fsyacclex.fs" + ) + | 1 -> ( +# 124 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + buff.ToString() +# 582 "fsyacclex.fs" + ) + | 2 -> ( +# 126 "fsyacclex.fsl" + newline lexbuf; + ignore <| buff.Append System.Environment.NewLine; + codestring buff lexbuf +# 589 "fsyacclex.fs" + ) + | 3 -> ( +# 130 "fsyacclex.fsl" + ignore <| buff.Append (lexeme lexbuf); + codestring buff lexbuf +# 595 "fsyacclex.fs" + ) + | 4 -> ( +# 132 "fsyacclex.fsl" + failwith "unterminated string in code" +# 600 "fsyacclex.fs" + ) + | 5 -> ( +# 133 "fsyacclex.fsl" + ignore <| buff.Append(lexeme lexbuf).[0]; + codestring buff lexbuf +# 606 "fsyacclex.fs" + ) + | _ -> failwith "codestring" +(* Rule comment *) +and _fslex_comment _fslex_state lexbuf = + match _fslex_tables.Interpret(_fslex_state,lexbuf) with + | 0 -> ( +# 138 "fsyacclex.fsl" + ignore(comment lexbuf); comment lexbuf +# 615 "fsyacclex.fs" + ) + | 1 -> ( +# 139 "fsyacclex.fsl" + newline lexbuf; comment lexbuf +# 620 "fsyacclex.fs" + ) + | 2 -> ( +# 140 "fsyacclex.fsl" + () +# 625 "fsyacclex.fs" + ) + | 3 -> ( +# 141 "fsyacclex.fsl" + failwith "end of file in comment" +# 630 "fsyacclex.fs" + ) + | 4 -> ( +# 142 "fsyacclex.fsl" + comment lexbuf +# 635 "fsyacclex.fs" + ) + | 5 -> ( +# 143 "fsyacclex.fsl" + comment lexbuf +# 640 "fsyacclex.fs" + ) + | _ -> failwith "comment" + +# 3000000 "fsyacclex.fs" diff --git a/src/buildtools/fsyacc/fsyaccpars.fs b/src/buildtools/fsyacc/fsyaccpars.fs new file mode 100644 index 0000000000..c6d614f269 --- /dev/null +++ b/src/buildtools/fsyacc/fsyaccpars.fs @@ -0,0 +1,562 @@ +// Implementation file for parser generated by fsyacc +module internal FsLexYacc.FsYacc.Parser +#nowarn "64";; // turn off warnings that type variables used in production annotations are instantiated to concrete type +open Internal.Utilities.Text.Lexing +open Internal.Utilities.Text.Parsing.ParseHelpers +# 1 "fsyaccpars.fsy" + +(* (c) Microsoft Corporation 2005-2008. *) + +// FsLexYacc.FsYacc.Parser + +open FsLexYacc.FsYacc +open FsLexYacc.FsYacc.AST + +#nowarn "62" // This construct is for ML compatibility + + +# 18 "fsyaccpars.fs" +// This type is the type of tokens accepted by the parser +type token = + | TOKEN of (string option) + | TYPE of (string) + | BAR + | PERCENT_PERCENT + | START + | LEFT + | RIGHT + | NONASSOC + | LESS + | GREATER + | COLON + | PREC + | SEMI + | EOF + | ERROR + | HEADER of (AST.Code) + | CODE of (AST.Code) + | IDENT of (string) +// This type is used to give symbolic names to token indexes, useful for error messages +type tokenId = + | TOKEN_TOKEN + | TOKEN_TYPE + | TOKEN_BAR + | TOKEN_PERCENT_PERCENT + | TOKEN_START + | TOKEN_LEFT + | TOKEN_RIGHT + | TOKEN_NONASSOC + | TOKEN_LESS + | TOKEN_GREATER + | TOKEN_COLON + | TOKEN_PREC + | TOKEN_SEMI + | TOKEN_EOF + | TOKEN_ERROR + | TOKEN_HEADER + | TOKEN_CODE + | TOKEN_IDENT + | TOKEN_end_of_input + | TOKEN_error +// This type is used to give symbolic names to token indexes, useful for error messages +type nonTerminalId = + | NONTERM__startspec + | NONTERM_spec + | NONTERM_headeropt + | NONTERM_decls + | NONTERM_decl + | NONTERM_idents + | NONTERM_rules + | NONTERM_rule + | NONTERM_optbar + | NONTERM_optsemi + | NONTERM_clauses + | NONTERM_clause + | NONTERM_syms + | NONTERM_optprec + +// This function maps tokens to integer indexes +let tagOfToken (t:token) = + match t with + | TOKEN _ -> 0 + | TYPE _ -> 1 + | BAR -> 2 + | PERCENT_PERCENT -> 3 + | START -> 4 + | LEFT -> 5 + | RIGHT -> 6 + | NONASSOC -> 7 + | LESS -> 8 + | GREATER -> 9 + | COLON -> 10 + | PREC -> 11 + | SEMI -> 12 + | EOF -> 13 + | ERROR -> 14 + | HEADER _ -> 15 + | CODE _ -> 16 + | IDENT _ -> 17 + +// This function maps integer indexes to symbolic token ids +let tokenTagToTokenId (tokenIdx:int) = + match tokenIdx with + | 0 -> TOKEN_TOKEN + | 1 -> TOKEN_TYPE + | 2 -> TOKEN_BAR + | 3 -> TOKEN_PERCENT_PERCENT + | 4 -> TOKEN_START + | 5 -> TOKEN_LEFT + | 6 -> TOKEN_RIGHT + | 7 -> TOKEN_NONASSOC + | 8 -> TOKEN_LESS + | 9 -> TOKEN_GREATER + | 10 -> TOKEN_COLON + | 11 -> TOKEN_PREC + | 12 -> TOKEN_SEMI + | 13 -> TOKEN_EOF + | 14 -> TOKEN_ERROR + | 15 -> TOKEN_HEADER + | 16 -> TOKEN_CODE + | 17 -> TOKEN_IDENT + | 20 -> TOKEN_end_of_input + | 18 -> 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 +let prodIdxToNonTerminal (prodIdx:int) = + match prodIdx with + | 0 -> NONTERM__startspec + | 1 -> NONTERM_spec + | 2 -> NONTERM_headeropt + | 3 -> NONTERM_headeropt + | 4 -> NONTERM_decls + | 5 -> NONTERM_decls + | 6 -> NONTERM_decl + | 7 -> NONTERM_decl + | 8 -> NONTERM_decl + | 9 -> NONTERM_decl + | 10 -> NONTERM_decl + | 11 -> NONTERM_decl + | 12 -> NONTERM_idents + | 13 -> NONTERM_idents + | 14 -> NONTERM_rules + | 15 -> NONTERM_rules + | 16 -> NONTERM_rule + | 17 -> NONTERM_optbar + | 18 -> NONTERM_optbar + | 19 -> NONTERM_optsemi + | 20 -> NONTERM_optsemi + | 21 -> NONTERM_clauses + | 22 -> NONTERM_clauses + | 23 -> NONTERM_clause + | 24 -> NONTERM_syms + | 25 -> NONTERM_syms + | 26 -> NONTERM_syms + | 27 -> NONTERM_optprec + | 28 -> NONTERM_optprec + | _ -> failwith "prodIdxToNonTerminal: bad production index" + +let _fsyacc_endOfInputTag = 20 +let _fsyacc_tagOfErrorTerminal = 18 + +// This function gets the name of a token as a string +let token_to_string (t:token) = + match t with + | TOKEN _ -> "TOKEN" + | TYPE _ -> "TYPE" + | BAR -> "BAR" + | PERCENT_PERCENT -> "PERCENT_PERCENT" + | START -> "START" + | LEFT -> "LEFT" + | RIGHT -> "RIGHT" + | NONASSOC -> "NONASSOC" + | LESS -> "LESS" + | GREATER -> "GREATER" + | COLON -> "COLON" + | PREC -> "PREC" + | SEMI -> "SEMI" + | EOF -> "EOF" + | ERROR -> "ERROR" + | HEADER _ -> "HEADER" + | CODE _ -> "CODE" + | IDENT _ -> "IDENT" + +// This function gets the data carried by a token as an object +let _fsyacc_dataOfToken (t:token) = + match t with + | TOKEN _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | TYPE _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | BAR -> (null : System.Object) + | PERCENT_PERCENT -> (null : System.Object) + | START -> (null : System.Object) + | LEFT -> (null : System.Object) + | RIGHT -> (null : System.Object) + | NONASSOC -> (null : System.Object) + | LESS -> (null : System.Object) + | GREATER -> (null : System.Object) + | COLON -> (null : System.Object) + | PREC -> (null : System.Object) + | SEMI -> (null : System.Object) + | EOF -> (null : System.Object) + | ERROR -> (null : System.Object) + | HEADER _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | CODE _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x + | IDENT _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x +let _fsyacc_gotos = [| 0us; 65535us; 1us; 65535us; 0us; 1us; 1us; 65535us; 0us; 2us; 2us; 65535us; 2us; 3us; 7us; 8us; 2us; 65535us; 2us; 7us; 7us; 7us; 7us; 65535us; 9us; 10us; 11us; 12us; 13us; 14us; 15us; 16us; 17us; 18us; 19us; 20us; 21us; 22us; 2us; 65535us; 4us; 5us; 23us; 24us; 2us; 65535us; 4us; 23us; 23us; 23us; 1us; 65535us; 26us; 27us; 1us; 65535us; 28us; 29us; 2us; 65535us; 27us; 28us; 33us; 34us; 2us; 65535us; 27us; 32us; 33us; 32us; 4us; 65535us; 27us; 35us; 33us; 35us; 38us; 39us; 40us; 41us; 1us; 65535us; 35us; 36us; |] +let _fsyacc_sparseGotoTableRowOffsets = [|0us; 1us; 3us; 5us; 8us; 11us; 19us; 22us; 25us; 27us; 29us; 32us; 35us; 40us; |] +let _fsyacc_stateToProdIdxsTableElements = [| 1us; 0us; 1us; 0us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 1us; 2us; 1us; 5us; 1us; 5us; 1us; 6us; 1us; 6us; 1us; 7us; 1us; 7us; 1us; 8us; 1us; 8us; 1us; 9us; 1us; 9us; 1us; 10us; 1us; 10us; 1us; 11us; 1us; 11us; 1us; 12us; 1us; 12us; 2us; 14us; 15us; 1us; 14us; 1us; 16us; 1us; 16us; 1us; 16us; 1us; 16us; 1us; 16us; 1us; 18us; 1us; 20us; 2us; 21us; 22us; 1us; 21us; 1us; 21us; 1us; 23us; 1us; 23us; 1us; 23us; 1us; 24us; 1us; 24us; 1us; 25us; 1us; 25us; 1us; 28us; 1us; 28us; |] +let _fsyacc_stateToProdIdxsTableRowOffsets = [|0us; 2us; 4us; 6us; 8us; 10us; 12us; 14us; 16us; 18us; 20us; 22us; 24us; 26us; 28us; 30us; 32us; 34us; 36us; 38us; 40us; 42us; 44us; 46us; 49us; 51us; 53us; 55us; 57us; 59us; 61us; 63us; 65us; 68us; 70us; 72us; 74us; 76us; 78us; 80us; 82us; 84us; 86us; 88us; |] +let _fsyacc_action_rows = 44 +let _fsyacc_actionTableElements = [|1us; 16387us; 15us; 6us; 0us; 49152us; 6us; 16388us; 0us; 9us; 1us; 11us; 4us; 13us; 5us; 15us; 6us; 17us; 7us; 19us; 1us; 32768us; 3us; 4us; 1us; 32768us; 17us; 25us; 0us; 16385us; 0us; 16386us; 6us; 16388us; 0us; 9us; 1us; 11us; 4us; 13us; 5us; 15us; 6us; 17us; 7us; 19us; 0us; 16389us; 1us; 16397us; 17us; 21us; 0us; 16390us; 1us; 16397us; 17us; 21us; 0us; 16391us; 1us; 16397us; 17us; 21us; 0us; 16392us; 1us; 16397us; 17us; 21us; 0us; 16393us; 1us; 16397us; 17us; 21us; 0us; 16394us; 1us; 16397us; 17us; 21us; 0us; 16395us; 1us; 16397us; 17us; 21us; 0us; 16396us; 1us; 16399us; 17us; 25us; 0us; 16398us; 1us; 32768us; 10us; 26us; 1us; 16401us; 2us; 30us; 2us; 16410us; 14us; 40us; 17us; 38us; 1us; 16403us; 12us; 31us; 0us; 16400us; 0us; 16402us; 0us; 16404us; 1us; 16406us; 2us; 33us; 2us; 16410us; 14us; 40us; 17us; 38us; 0us; 16405us; 1us; 16411us; 11us; 42us; 1us; 32768us; 16us; 37us; 0us; 16407us; 2us; 16410us; 14us; 40us; 17us; 38us; 0us; 16408us; 2us; 16410us; 14us; 40us; 17us; 38us; 0us; 16409us; 1us; 32768us; 17us; 43us; 0us; 16412us; |] +let _fsyacc_actionTableRowOffsets = [|0us; 2us; 3us; 10us; 12us; 14us; 15us; 16us; 23us; 24us; 26us; 27us; 29us; 30us; 32us; 33us; 35us; 36us; 38us; 39us; 41us; 42us; 44us; 45us; 47us; 48us; 50us; 52us; 55us; 57us; 58us; 59us; 60us; 62us; 65us; 66us; 68us; 70us; 71us; 74us; 75us; 78us; 79us; 81us; |] +let _fsyacc_reductionSymbolCounts = [|1us; 4us; 1us; 0us; 0us; 2us; 2us; 2us; 2us; 2us; 2us; 2us; 2us; 0us; 2us; 1us; 5us; 0us; 1us; 0us; 1us; 3us; 1us; 3us; 2us; 2us; 0us; 0us; 2us; |] +let _fsyacc_productionToNonTerminalTable = [|0us; 1us; 2us; 2us; 3us; 3us; 4us; 4us; 4us; 4us; 4us; 4us; 5us; 5us; 6us; 6us; 7us; 8us; 8us; 9us; 9us; 10us; 10us; 11us; 12us; 12us; 12us; 13us; 13us; |] +let _fsyacc_immediateActions = [|65535us; 49152us; 65535us; 65535us; 65535us; 16385us; 16386us; 65535us; 16389us; 65535us; 16390us; 65535us; 16391us; 65535us; 16392us; 65535us; 16393us; 65535us; 16394us; 65535us; 16395us; 65535us; 16396us; 65535us; 16398us; 65535us; 65535us; 65535us; 65535us; 16400us; 16402us; 16404us; 65535us; 65535us; 16405us; 65535us; 65535us; 16407us; 65535us; 16408us; 65535us; 16409us; 65535us; 16412us; |] +let _fsyacc_reductions () = [| +# 216 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : AST.ParserSpec)) in + Microsoft.FSharp.Core.Operators.box + ( + ( + raise (Internal.Utilities.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) + ) + : '_startspec)); +# 225 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'headeropt)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'decls)) in + let _4 = (let data = parseState.GetInput(4) in (Microsoft.FSharp.Core.Operators.unbox data : 'rules)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 25 "fsyaccpars.fsy" + List.foldBack (fun f x -> f x) _2 { Header=_1;Tokens=[];Types=[];Associativities=[];StartSymbols=[];Rules=_4 } + ) +# 25 "fsyaccpars.fsy" + : AST.ParserSpec)); +# 238 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : AST.Code)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 29 "fsyaccpars.fsy" + _1 + ) +# 29 "fsyaccpars.fsy" + : 'headeropt)); +# 249 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 31 "fsyaccpars.fsy" + "", (parseState.ResultRange |> fst) + ) +# 31 "fsyaccpars.fsy" + : 'headeropt)); +# 259 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 34 "fsyaccpars.fsy" + [] + ) +# 34 "fsyaccpars.fsy" + : 'decls)); +# 269 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'decl)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'decls)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 35 "fsyaccpars.fsy" + _1 :: _2 + ) +# 35 "fsyaccpars.fsy" + : 'decls)); +# 281 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string option)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'idents)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 38 "fsyaccpars.fsy" + (fun x -> {x with Tokens = x.Tokens @ (List.map (fun x -> (x,_1)) _2)}) + ) +# 38 "fsyaccpars.fsy" + : 'decl)); +# 293 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'idents)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 39 "fsyaccpars.fsy" + (fun x -> {x with Types = x.Types @ (List.map (fun x -> (x,_1)) _2)} ) + ) +# 39 "fsyaccpars.fsy" + : 'decl)); +# 305 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'idents)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 40 "fsyaccpars.fsy" + (fun x -> {x with StartSymbols = x.StartSymbols @ _2} ) + ) +# 40 "fsyaccpars.fsy" + : 'decl)); +# 316 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'idents)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 41 "fsyaccpars.fsy" + (fun x -> {x with Associativities = x.Associativities @ [(List.map (fun x -> (x,LeftAssoc)) _2)]} ) + ) +# 41 "fsyaccpars.fsy" + : 'decl)); +# 327 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'idents)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 42 "fsyaccpars.fsy" + (fun x -> {x with Associativities = x.Associativities @ [(List.map (fun x -> (x,RightAssoc)) _2)]} ) + ) +# 42 "fsyaccpars.fsy" + : 'decl)); +# 338 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'idents)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 43 "fsyaccpars.fsy" + (fun x -> {x with Associativities = x.Associativities @ [(List.map (fun x -> (x,NonAssoc)) _2)]} ) + ) +# 43 "fsyaccpars.fsy" + : 'decl)); +# 349 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'idents)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 45 "fsyaccpars.fsy" + _1 :: _2 + ) +# 45 "fsyaccpars.fsy" + : 'idents)); +# 361 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 45 "fsyaccpars.fsy" + [] + ) +# 45 "fsyaccpars.fsy" + : 'idents)); +# 371 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'rule)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'rules)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 46 "fsyaccpars.fsy" + _1 :: _2 + ) +# 46 "fsyaccpars.fsy" + : 'rules)); +# 383 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'rule)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 46 "fsyaccpars.fsy" + [_1] + ) +# 46 "fsyaccpars.fsy" + : 'rules)); +# 394 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : 'optbar)) in + let _4 = (let data = parseState.GetInput(4) in (Microsoft.FSharp.Core.Operators.unbox data : 'clauses)) in + let _5 = (let data = parseState.GetInput(5) in (Microsoft.FSharp.Core.Operators.unbox data : 'optsemi)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 47 "fsyaccpars.fsy" + (_1,_4) + ) +# 47 "fsyaccpars.fsy" + : 'rule)); +# 408 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 48 "fsyaccpars.fsy" + + ) +# 48 "fsyaccpars.fsy" + : 'optbar)); +# 418 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 48 "fsyaccpars.fsy" + + ) +# 48 "fsyaccpars.fsy" + : 'optbar)); +# 428 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 49 "fsyaccpars.fsy" + + ) +# 49 "fsyaccpars.fsy" + : 'optsemi)); +# 438 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 49 "fsyaccpars.fsy" + + ) +# 49 "fsyaccpars.fsy" + : 'optsemi)); +# 448 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'clause)) in + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : 'clauses)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 50 "fsyaccpars.fsy" + _1 :: _3 + ) +# 50 "fsyaccpars.fsy" + : 'clauses)); +# 460 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'clause)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 50 "fsyaccpars.fsy" + [_1] + ) +# 50 "fsyaccpars.fsy" + : 'clauses)); +# 471 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : 'syms)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'optprec)) in + let _3 = (let data = parseState.GetInput(3) in (Microsoft.FSharp.Core.Operators.unbox data : AST.Code)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 51 "fsyaccpars.fsy" + Rule(_1,_2,Some _3) + ) +# 51 "fsyaccpars.fsy" + : 'clause)); +# 484 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _1 = (let data = parseState.GetInput(1) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'syms)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 52 "fsyaccpars.fsy" + _1 :: _2 + ) +# 52 "fsyaccpars.fsy" + : 'syms)); +# 496 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : 'syms)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 52 "fsyaccpars.fsy" + "error" :: _2 + ) +# 52 "fsyaccpars.fsy" + : 'syms)); +# 507 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 52 "fsyaccpars.fsy" + [] + ) +# 52 "fsyaccpars.fsy" + : 'syms)); +# 517 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 53 "fsyaccpars.fsy" + None + ) +# 53 "fsyaccpars.fsy" + : 'optprec)); +# 527 "fsyaccpars.fs" + (fun (parseState : Internal.Utilities.Text.Parsing.IParseState) -> + let _2 = (let data = parseState.GetInput(2) in (Microsoft.FSharp.Core.Operators.unbox data : string)) in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 53 "fsyaccpars.fsy" + Some _2 + ) +# 53 "fsyaccpars.fsy" + : 'optprec)); +|] +# 539 "fsyaccpars.fs" +let tables () : Internal.Utilities.Text.Parsing.Tables<_> = + { reductions= _fsyacc_reductions (); + endOfInputTag = _fsyacc_endOfInputTag; + tagOfToken = tagOfToken; + dataOfToken = _fsyacc_dataOfToken; + actionTableElements = _fsyacc_actionTableElements; + actionTableRowOffsets = _fsyacc_actionTableRowOffsets; + stateToProdIdxsTableElements = _fsyacc_stateToProdIdxsTableElements; + stateToProdIdxsTableRowOffsets = _fsyacc_stateToProdIdxsTableRowOffsets; + reductionSymbolCounts = _fsyacc_reductionSymbolCounts; + immediateActions = _fsyacc_immediateActions; + gotos = _fsyacc_gotos; + sparseGotoTableRowOffsets = _fsyacc_sparseGotoTableRowOffsets; + tagOfErrorTerminal = _fsyacc_tagOfErrorTerminal; + parseError = (fun (ctxt:Internal.Utilities.Text.Parsing.ParseErrorContext<_>) -> + match parse_error_rich with + | Some f -> f ctxt + | None -> parse_error ctxt.Message); + numTerminals = 21; + productionToNonTerminalTable = _fsyacc_productionToNonTerminalTable } +let engine lexer lexbuf startState = (tables ()).Interpret(lexer, lexbuf, startState) +let spec lexer lexbuf : AST.ParserSpec = + Microsoft.FSharp.Core.Operators.unbox ((tables ()).Interpret(lexer, lexbuf, 0)) diff --git a/src/fsharp/AccessibilityLogic.fs b/src/fsharp/AccessibilityLogic.fs index 7e2e2ef5d9..dcd8d5d801 100644 --- a/src/fsharp/AccessibilityLogic.fs +++ b/src/fsharp/AccessibilityLogic.fs @@ -194,9 +194,10 @@ let CheckTyconReprAccessible amap m ad tcref = /// Indicates if a type is accessible (both definition and instantiation) let rec IsTypeAccessible g amap m ad ty = - not (isAppTy g ty) || - let tcref, tinst = destAppTy g ty - IsEntityAccessible amap m ad tcref && IsTypeInstAccessible g amap m ad tinst + match tryAppTy g ty with + | ValueNone -> true + | ValueSome(tcref, tinst) -> + IsEntityAccessible amap m ad tcref && IsTypeInstAccessible g amap m ad tinst and IsTypeInstAccessible g amap m ad tinst = match tinst with @@ -210,7 +211,7 @@ let IsProvidedMemberAccessible (amap:Import.ImportMap) m ad ty access = if not isTyAccessible then false else not (isAppTy g ty) || - let tcrefOfViewedItem, _ = destAppTy g ty + let tcrefOfViewedItem = tcrefOfAppTy g ty IsILMemberAccessible g amap m tcrefOfViewedItem ad access /// Compute the accessibility of a provided member diff --git a/src/fsharp/AttributeChecking.fs b/src/fsharp/AttributeChecking.fs index 3be4a3a070..a28598d970 100644 --- a/src/fsharp/AttributeChecking.fs +++ b/src/fsharp/AttributeChecking.fs @@ -449,8 +449,8 @@ let MethInfoIsUnseen g m ty minfo = // We are only interested in filtering out the method on System.Object, so it is sufficient // just to look at the attributes on IL methods. if tcref.IsILTycon then - tcref.ILTyconRawMetadata.CustomAttrs.AsList - |> List.exists (fun attr -> attr.Method.DeclaringType.TypeSpec.Name = typeof.FullName) + tcref.ILTyconRawMetadata.CustomAttrs.AsArray + |> Array.exists (fun attr -> attr.Method.DeclaringType.TypeSpec.Name = typeof.FullName) else false #else diff --git a/src/fsharp/CheckFormatStrings.fs b/src/fsharp/CheckFormatStrings.fs index 4d532904a1..9d7fd72d7a 100755 --- a/src/fsharp/CheckFormatStrings.fs +++ b/src/fsharp/CheckFormatStrings.fs @@ -54,15 +54,15 @@ let parseFormatStringInternal (m:range) (g: TcGlobals) (context: FormatStringChe let (offset, fmt) = match context with | Some context -> - let length = context.NormalizedSource.Length - if m.EndLine < context.LineEndPositions.Length then - let startIndex = context.LineEndPositions.[m.StartLine-1] + m.StartColumn - let endIndex = context.LineEndPositions.[m.EndLine-1] + m.EndColumn - 1 - if startIndex < length-3 && context.NormalizedSource.[startIndex..startIndex+2] = "\"\"\"" then - (3, context.NormalizedSource.[startIndex+3..endIndex-3]) - elif startIndex < length-2 && context.NormalizedSource.[startIndex..startIndex+1] = "@\"" then - (2, context.NormalizedSource.[startIndex+2..endIndex-1]) - else (1, context.NormalizedSource.[startIndex+1..endIndex-1]) + let length = context.Source.Length + if m.EndLine < context.LineStartPositions.Length then + let startIndex = context.LineStartPositions.[m.StartLine-1] + m.StartColumn + let endIndex = context.LineStartPositions.[m.EndLine-1] + m.EndColumn - 1 + if startIndex < length-3 && context.Source.[startIndex..startIndex+2] = "\"\"\"" then + (3, context.Source.[startIndex+3..endIndex-3]) + elif startIndex < length-2 && context.Source.[startIndex..startIndex+1] = "@\"" then + (2, context.Source.[startIndex+2..endIndex-1]) + else (1, context.Source.[startIndex+1..endIndex-1]) else (1, fmt) | None -> (1, fmt) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index d54373c554..830a08bf2f 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -960,12 +960,12 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = | Parser.TOKEN_RPAREN | Parser.TOKEN_RPAREN_COMING_SOON | Parser.TOKEN_RPAREN_IS_HERE -> getErrorString("Parser.TOKEN.RPAREN") | Parser.TOKEN_LQUOTE -> getErrorString("Parser.TOKEN.LQUOTE") | Parser.TOKEN_LBRACK -> getErrorString("Parser.TOKEN.LBRACK") + | Parser.TOKEN_LBRACE_BAR -> getErrorString("Parser.TOKEN.LBRACE.BAR") | Parser.TOKEN_LBRACK_BAR -> getErrorString("Parser.TOKEN.LBRACK.BAR") | Parser.TOKEN_LBRACK_LESS -> getErrorString("Parser.TOKEN.LBRACK.LESS") | Parser.TOKEN_LBRACE -> getErrorString("Parser.TOKEN.LBRACE") - | Parser.TOKEN_LBRACE_LESS-> getErrorString("Parser.TOKEN.LBRACE.LESS") | Parser.TOKEN_BAR_RBRACK -> getErrorString("Parser.TOKEN.BAR.RBRACK") - | Parser.TOKEN_GREATER_RBRACE -> getErrorString("Parser.TOKEN.GREATER.RBRACE") + | Parser.TOKEN_BAR_RBRACE -> getErrorString("Parser.TOKEN.BAR.RBRACE") | Parser.TOKEN_GREATER_RBRACK -> getErrorString("Parser.TOKEN.GREATER.RBRACK") | Parser.TOKEN_RQUOTE_DOT _ | Parser.TOKEN_RQUOTE -> getErrorString("Parser.TOKEN.RQUOTE") @@ -1096,7 +1096,7 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = (* Merge a bunch of expression non terminals *) let (|NONTERM_Category_Expr|_|) = function | Parser.NONTERM_argExpr|Parser.NONTERM_minusExpr|Parser.NONTERM_parenExpr|Parser.NONTERM_atomicExpr - | Parser.NONTERM_appExpr|Parser.NONTERM_tupleExpr|Parser.NONTERM_declExpr|Parser.NONTERM_braceExpr + | Parser.NONTERM_appExpr|Parser.NONTERM_tupleExpr|Parser.NONTERM_declExpr|Parser.NONTERM_braceExpr|Parser.NONTERM_braceBarExpr | Parser.NONTERM_typedSeqExprBlock | Parser.NONTERM_interactiveExpr -> Some() | _ -> None @@ -1825,6 +1825,7 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = yield "System.Data" yield "System.Drawing" yield "System.Core" + // These are the Portable-profile and .NET Standard 1.6 dependencies of FSharp.Core.dll. These are needed // when an F# sript references an F# profile 7, 78, 259 or .NET Standard 1.6 component which in turn refers // to FSharp.Core for profile 7, 78, 259 or .NET Standard. @@ -1850,17 +1851,24 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = yield "System.Windows.Forms" yield "System.Numerics" else - yield Path.Combine(Path.GetDirectoryName(typeof.Assembly.Location), "mscorlib.dll"); // mscorlib - yield typeof.Assembly.Location; // System.Console - yield typeof.Assembly.Location; // System.Runtime - yield typeof.Assembly.Location; // System.ObjectModel - yield typeof.Assembly.Location; // System.IO - yield typeof.Assembly.Location; // System.Linq - //yield typeof.Assembly.Location; // System.Xml.Linq - yield typeof.Assembly.Location; // System.Net.Requests - yield typeof.Assembly.Location; // System.Runtime.Numerics - yield typeof.Assembly.Location; // System.Threading.Tasks - yield typeof.Assembly.Location; // FSharp.Core + yield Path.Combine(Path.GetDirectoryName(typeof.Assembly.Location), "mscorlib.dll") // mscorlib + yield typeof.Assembly.Location // System.Console + yield typeof.Assembly.Location // System.Collections + yield typeof.Assembly.Location // System.Data.SqlClient + yield typeof.Assembly.Location // System.ObjectModel + yield typeof.Assembly.Location // System.IO.FileSystem + yield typeof.Assembly.Location // System.IO + yield typeof.Assembly.Location // System.Linq + yield typeof.Assembly.Location // System.Xml + yield typeof.Assembly.Location // System.Xml.Linq + yield typeof.Assembly.Location // System.Net.Requests + yield typeof.Assembly.Location // System.Runtime.Numerics + yield typeof.Assembly.Location // System.Net.Security + yield typeof.Assembly.Location // System.Security.Claims + yield typeof.Assembly.Location // System.Text.RegularExpressions.Regex + yield typeof.Assembly.Location // System.Threading.Tasks + yield typeof.Assembly.Location // System.Threading + yield typeof.Assembly.Location // FSharp.Core ] @@ -2348,6 +2356,8 @@ type TcConfigBuilder = mutable tryGetMetadataSnapshot : ILReaderTryGetMetadataSnapshot mutable internalTestSpanStackReferring : bool + + mutable noConditionalErasure : bool } static member Initial = @@ -2485,6 +2495,7 @@ type TcConfigBuilder = shadowCopyReferences = false tryGetMetadataSnapshot = (fun _ -> None) internalTestSpanStackReferring = false + noConditionalErasure = false } static member CreateNew(legacyReferenceResolver, defaultFSharpBinariesDir, reduceMemoryUsage, implicitIncludeDir, @@ -2609,13 +2620,13 @@ type TcConfigBuilder = member tcConfigB.RemoveReferencedAssemblyByPath (m, path) = tcConfigB.referencedDLLs <- tcConfigB.referencedDLLs |> List.filter (fun ar-> ar.Range <> m || ar.Text <> path) - static member SplitCommandLineResourceInfo ri = - if String.contains ri ',' then - let p = String.index ri ',' + static member SplitCommandLineResourceInfo (ri:string) = + let p = ri.IndexOf ',' + if p <> -1 then let file = String.sub ri 0 p let rest = String.sub ri (p+1) (String.length ri - p - 1) - if String.contains rest ',' then - let p = String.index rest ',' + let p = rest.IndexOf ',' + if p <> -1 then let name = String.sub rest 0 p+".resources" let pubpri = String.sub rest (p+1) (rest.Length - p - 1) if pubpri = "public" then file, name, ILResourceAccess.Public @@ -2674,9 +2685,9 @@ type AssemblyResolution = member this.GetILAssemblyRef(ctok, reduceMemoryUsage, tryGetMetadataSnapshot) = cancellable { match !this.ilAssemblyRef with - | Some(assref) -> return assref + | Some(assemblyRef) -> return assemblyRef | None -> - let! assRefOpt = + let! assemblyRefOpt = cancellable { match this.ProjectReference with | Some r -> @@ -2689,8 +2700,8 @@ type AssemblyResolution = | _ -> return None | None -> return None } - let assRef = - match assRefOpt with + let assemblyRef = + match assemblyRefOpt with | Some aref -> aref | None -> let readerSettings : ILReaderOptions = @@ -2701,8 +2712,8 @@ type AssemblyResolution = tryGetMetadataSnapshot = tryGetMetadataSnapshot } use reader = OpenILModuleReader this.resolvedPath readerSettings mkRefToILAssembly reader.ILModuleDef.ManifestOfAssembly - this.ilAssemblyRef := Some(assRef) - return assRef + this.ilAssemblyRef := Some(assemblyRef) + return assemblyRef } //---------------------------------------------------------------------------- @@ -2946,6 +2957,8 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = member x.shadowCopyReferences = data.shadowCopyReferences member x.tryGetMetadataSnapshot = data.tryGetMetadataSnapshot member x.internalTestSpanStackReferring = data.internalTestSpanStackReferring + member x.noConditionalErasure = data.noConditionalErasure + static member Create(builder, validate) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter TcConfig(builder, validate) @@ -3376,14 +3389,14 @@ let ComputeQualifiedNameOfFileFromUniquePath (m, p: string list) = QualifiedName let QualFileNameOfSpecs filename specs = match specs with - | [SynModuleOrNamespaceSig(modname, _, true, _, _, _, _, m)] -> QualFileNameOfModuleName m filename modname - | [SynModuleOrNamespaceSig(_, _, false, _, _, _, _, m)] -> QualFileNameOfFilename m filename + | [SynModuleOrNamespaceSig(modname, _, kind, _, _, _, _, m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname + | [SynModuleOrNamespaceSig(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename | _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename let QualFileNameOfImpls filename specs = match specs with - | [SynModuleOrNamespace(modname, _, true, _, _, _, _, m)] -> QualFileNameOfModuleName m filename modname - | [SynModuleOrNamespace(_, _, false, _, _, _, _, m)] -> QualFileNameOfFilename m filename + | [SynModuleOrNamespace(modname, _, kind, _, _, _, _, m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname + | [SynModuleOrNamespace(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename | _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename let PrepandPathToQualFileName x (QualifiedNameOfFile(q)) = ComputeQualifiedNameOfFileFromUniquePath (q.idRange, pathOfLid x@[q.idText]) @@ -3412,13 +3425,14 @@ let ComputeAnonModuleName check defaultNamespace filename (m: range) = let PostParseModuleImpl (_i, defaultNamespace, isLastCompiland, filename, impl) = match impl with - | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, isRec, isModule, decls, xmlDoc, attribs, access, m)) -> + | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m)) -> let lid = match lid with - | [id] when isModule && id.idText = MangledGlobalName -> error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) + | [id] when kind.IsModule && id.idText = MangledGlobalName -> + error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespace(lid, isRec, isModule, decls, xmlDoc, attribs, access, m) + SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m) | ParsedImplFileFragment.AnonModule (defs, m)-> let isLast, isExe = isLastCompiland @@ -3429,24 +3443,26 @@ let PostParseModuleImpl (_i, defaultNamespace, isLastCompiland, filename, impl) | _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(), trimRangeToLine m)) let modname = ComputeAnonModuleName (not (isNil defs)) defaultNamespace filename (trimRangeToLine m) - SynModuleOrNamespace(modname, false, true, defs, PreXmlDoc.Empty, [], None, m) + SynModuleOrNamespace(modname, false, AnonModule, defs, PreXmlDoc.Empty, [], None, m) - | ParsedImplFileFragment.NamespaceFragment (lid, a, b, c, d, e, m)-> - let lid = + | ParsedImplFileFragment.NamespaceFragment (lid, a, kind, c, d, e, m)-> + let lid, kind = match lid with - | id :: rest when id.idText = MangledGlobalName -> rest - | _ -> lid - SynModuleOrNamespace(lid, a, b, c, d, e, None, m) + | id :: rest when id.idText = MangledGlobalName -> + rest, if List.isEmpty rest then GlobalNamespace else kind + | _ -> lid, kind + SynModuleOrNamespace(lid, a, kind, c, d, e, None, m) let PostParseModuleSpec (_i, defaultNamespace, isLastCompiland, filename, intf) = match intf with - | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, isRec, isModule, decls, xmlDoc, attribs, access, m)) -> + | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, isRec, kind, decls, xmlDoc, attribs, access, m)) -> let lid = match lid with - | [id] when isModule && id.idText = MangledGlobalName -> error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) + | [id] when kind.IsModule && id.idText = MangledGlobalName -> + error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespaceSig(lid, isRec, isModule, decls, xmlDoc, attribs, access, m) + SynModuleOrNamespaceSig(lid, isRec, NamedModule, decls, xmlDoc, attribs, access, m) | ParsedSigFileFragment.AnonModule (defs, m) -> let isLast, isExe = isLastCompiland @@ -3457,14 +3473,15 @@ let PostParseModuleSpec (_i, defaultNamespace, isLastCompiland, filename, intf) | _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(), m)) let modname = ComputeAnonModuleName (not (isNil defs)) defaultNamespace filename (trimRangeToLine m) - SynModuleOrNamespaceSig(modname, false, true, defs, PreXmlDoc.Empty, [], None, m) + SynModuleOrNamespaceSig(modname, false, AnonModule, defs, PreXmlDoc.Empty, [], None, m) - | ParsedSigFileFragment.NamespaceFragment (lid, a, b, c, d, e, m)-> - let lid = + | ParsedSigFileFragment.NamespaceFragment (lid, a, kind, c, d, e, m)-> + let lid, kind = match lid with - | id :: rest when id.idText = MangledGlobalName -> rest - | _ -> lid - SynModuleOrNamespaceSig(lid, a, b, c, d, e, None, m) + | id :: rest when id.idText = MangledGlobalName -> + rest, if List.isEmpty rest then GlobalNamespace else kind + | _ -> lid, kind + SynModuleOrNamespaceSig(lid, a, kind, c, d, e, None, m) @@ -3508,34 +3525,37 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig ParsedInput.SigFile(ParsedSigFileInput(filename, qualName, scopedPragmas, hashDirectives, specs)) +type ModuleNamesDict = Map> + /// Checks if a module name is already given and deduplicates the name if needed. -let DeduplicateModuleName (moduleNamesDict:IDictionary>) (paths: Set) path (qualifiedNameOfFile: QualifiedNameOfFile) = - let count = if paths.Contains path then paths.Count else paths.Count + 1 - moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.add path paths - let id = qualifiedNameOfFile.Id - if count = 1 then qualifiedNameOfFile else QualifiedNameOfFile(Ident(id.idText + "___" + count.ToString(), id.idRange)) +let DeduplicateModuleName (moduleNamesDict:ModuleNamesDict) fileName (qualNameOfFile: QualifiedNameOfFile) = + let path = Path.GetDirectoryName fileName + let path = if FileSystem.IsPathRootedShim path then try FileSystem.GetFullPathShim path with _ -> path else path + match moduleNamesDict.TryGetValue qualNameOfFile.Text with + | true, paths -> + if paths.ContainsKey path then + paths.[path], moduleNamesDict + else + let count = paths.Count + 1 + let id = qualNameOfFile.Id + let qualNameOfFileT = if count = 1 then qualNameOfFile else QualifiedNameOfFile(Ident(id.idText + "___" + count.ToString(), id.idRange)) + let moduleNamesDictT = moduleNamesDict.Add(qualNameOfFile.Text, paths.Add(path, qualNameOfFileT)) + qualNameOfFileT, moduleNamesDictT + | _ -> + let moduleNamesDictT = moduleNamesDict.Add(qualNameOfFile.Text, Map.empty.Add(path, qualNameOfFile)) + qualNameOfFile, moduleNamesDictT /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -let DeduplicateParsedInputModuleName (moduleNamesDict:IDictionary>) input = +let DeduplicateParsedInputModuleName (moduleNamesDict: ModuleNamesDict) input = match input with - | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) -> - let path = Path.GetDirectoryName fileName - match moduleNamesDict.TryGetValue qualifiedNameOfFile.Text with - | true, paths -> - let qualifiedNameOfFile = DeduplicateModuleName moduleNamesDict paths path qualifiedNameOfFile - ParsedInput.ImplFile(ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) - | _ -> - moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path - input - | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules)) -> - let path = Path.GetDirectoryName fileName - match moduleNamesDict.TryGetValue qualifiedNameOfFile.Text with - | true, paths -> - let qualifiedNameOfFile = DeduplicateModuleName moduleNamesDict paths path qualifiedNameOfFile - ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules)) - | _ -> - moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path - input + | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) -> + let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile + let inputT = ParsedInput.ImplFile(ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) + inputT, moduleNamesDictT + | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules)) -> + let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile + let inputT = ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules)) + inputT, moduleNamesDictT let ParseInput (lexer, errorLogger:ErrorLogger, lexbuf:UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) = // The assert below is almost ok, but it fires in two cases: @@ -3655,10 +3675,10 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, member tcResolutions.TryFindByOriginalReference(assemblyReference:AssemblyReference) = originalReferenceToResolution.TryFind assemblyReference.Text /// This doesn't need to be cancellable, it is only used by F# Interactive - member tcResolution.TryFindByExactILAssemblyRef (ctok, assref) = + member tcResolution.TryFindByExactILAssemblyRef (ctok, assemblyRef) = results |> List.tryFind (fun ar-> let r = ar.GetILAssemblyRef(ctok, tcConfig.reduceMemoryUsage, tcConfig.tryGetMetadataSnapshot) |> Cancellable.runWithoutCancellation - r = assref) + r = assemblyRef) /// This doesn't need to be cancellable, it is only used by F# Interactive member tcResolution.TryFindBySimpleAssemblyName (ctok, simpleAssemName) = @@ -4026,11 +4046,11 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti | ResolvedImportedAssembly(importedAssembly) -> ResolvedCcu(importedAssembly.FSharpViewOfMetadata) | UnresolvedImportedAssembly(assemblyName) -> UnresolvedCcu(assemblyName) - member tcImports.FindCcuFromAssemblyRef(ctok, m, assref:ILAssemblyRef) = + member tcImports.FindCcuFromAssemblyRef(ctok, m, assemblyRef:ILAssemblyRef) = CheckDisposed() - match tcImports.FindCcuInfo(ctok, m, assref.Name, lookupOnly=false) with + match tcImports.FindCcuInfo(ctok, m, assemblyRef.Name, lookupOnly=false) with | ResolvedImportedAssembly(importedAssembly) -> ResolvedCcu(importedAssembly.FSharpViewOfMetadata) - | UnresolvedImportedAssembly _ -> UnresolvedCcu(assref.QualifiedName) + | UnresolvedImportedAssembly _ -> UnresolvedCcu(assemblyRef.QualifiedName) #if !NO_EXTENSIONTYPING @@ -4641,8 +4661,8 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti resolutions.TryFindBySimpleAssemblyName (ctok, simpleAssemName) |> Option.map (fun r -> r.resolvedPath) /// This doesn't need to be cancellable, it is only used by F# Interactive - member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assref:ILAssemblyRef) : string option = - resolutions.TryFindByExactILAssemblyRef (ctok, assref) |> Option.map (fun r -> r.resolvedPath) + member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assemblyRef:ILAssemblyRef) : string option = + resolutions.TryFindByExactILAssemblyRef (ctok, assemblyRef) |> Option.map (fun r -> r.resolvedPath) member tcImports.TryResolveAssemblyReference(ctok, assemblyReference:AssemblyReference, mode:ResolveAssemblyReferenceMode) : OperationResult = let tcConfig = tcConfigP.Get(ctok) @@ -5432,9 +5452,12 @@ let TypeCheckOneInputEventually (checkForErrors, tcConfig:TcConfig, tcImports:Tc if Zset.contains qualNameOfFile tcState.tcsRootImpls then errorR(Error(FSComp.SR.buildImplementationAlreadyGivenDetail(qualNameOfFile.Text), m)) + let conditionalDefines = + if tcConfig.noConditionalErasure then None else Some (tcConfig.conditionalCompilationDefines) + // Typecheck the signature file let! (tcEnv, sigFileType, createsGeneratedProvidedTypes) = - TypeCheckOneSigFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, tcConfig.conditionalCompilationDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcState.tcsTcSigEnv file + TypeCheckOneSigFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, conditionalDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcState.tcsTcSigEnv file let rootSigs = Zmap.add qualNameOfFile sigFileType tcState.tcsRootSigs @@ -5469,9 +5492,12 @@ let TypeCheckOneInputEventually (checkForErrors, tcConfig:TcConfig, tcImports:Tc let tcImplEnv = tcState.tcsTcImplEnv + let conditionalDefines = + if tcConfig.noConditionalErasure then None else Some (tcConfig.conditionalCompilationDefines) + // Typecheck the implementation file let! topAttrs, implFile, _implFileHiddenType, tcEnvAtEnd, createsGeneratedProvidedTypes = - TypeCheckOneImplFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, tcConfig.conditionalCompilationDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcImplEnv rootSigOpt file + TypeCheckOneImplFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, conditionalDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcImplEnv rootSigOpt file let hadSig = rootSigOpt.IsSome let implFileSigType = SigTypeOfImplFile implFile diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index eb371fa592..9ee74ee993 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -59,12 +59,13 @@ val ComputeQualifiedNameOfFileFromUniquePath: range * string list -> Ast.Qualifi val PrependPathToInput: Ast.Ident list -> Ast.ParsedInput -> Ast.ParsedInput -/// Checks if a module name is already given and deduplicates the name if needed. -val DeduplicateModuleName: IDictionary> -> Set -> string -> Ast.QualifiedNameOfFile -> Ast.QualifiedNameOfFile +/// State used to de-deuplicate module names along a list of file names +type ModuleNamesDict = Map> /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -val DeduplicateParsedInputModuleName: IDictionary> -> Ast.ParsedInput -> Ast.ParsedInput +val DeduplicateParsedInputModuleName: ModuleNamesDict -> Ast.ParsedInput -> Ast.ParsedInput * ModuleNamesDict +/// Parse a single input (A signature file or implementation file) val ParseInput: (UnicodeLexing.Lexbuf -> Parser.token) * ErrorLogger * UnicodeLexing.Lexbuf * string option * string * isLastCompiland:(bool * bool) -> Ast.ParsedInput //---------------------------------------------------------------------------- @@ -366,6 +367,9 @@ type TcConfigBuilder = /// if true - 'let mutable x = Span.Empty', the value 'x' is a stack referring span. Used for internal testing purposes only until we get true stack spans. mutable internalTestSpanStackReferring : bool + + /// Prevent erasure of conditional attributes and methods so tooling is able analyse them. + mutable noConditionalErasure: bool } static member Initial: TcConfigBuilder diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index 6ae18644de..344c0e1412 100755 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -848,8 +848,8 @@ let testFlag tcConfigB = | str -> warning(Error(FSComp.SR.optsUnknownArgumentToTheTestSwitch(str),rangeCmdArgs))), None, None) -// not shown in fsc.exe help, no warning on use, motivation is for use from VS -let vsSpecificFlags (tcConfigB: TcConfigBuilder) = +// Not shown in fsc.exe help, no warning on use, motivation is for use from tooling. +let editorSpecificFlags (tcConfigB: TcConfigBuilder) = [ CompilerOption("vserrors", tagNone, OptionUnit (fun () -> tcConfigB.errorStyle <- ErrorStyle.VSErrors), 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) @@ -857,7 +857,8 @@ let vsSpecificFlags (tcConfigB: TcConfigBuilder) = CompilerOption("sqmsessionguid", tagNone, OptionString ignore, None, None) CompilerOption("gccerrors", tagNone, OptionUnit (fun () -> tcConfigB.errorStyle <- ErrorStyle.GccErrors), None, None) CompilerOption("exename", tagNone, OptionString (fun s -> tcConfigB.exename <- Some(s)), None, None) - CompilerOption("maxerrors", tagInt, OptionInt (fun n -> tcConfigB.maxErrors <- n), None, None) ] + CompilerOption("maxerrors", tagInt, OptionInt (fun n -> tcConfigB.maxErrors <- n), None, None) + CompilerOption("noconditionalerasure", tagNone, OptionUnit (fun () -> tcConfigB.noConditionalErasure <- true), None, None) ] let internalFlags (tcConfigB:TcConfigBuilder) = [ @@ -896,7 +897,7 @@ let internalFlags (tcConfigB:TcConfigBuilder) = CompilerOption("alwayscallvirt",tagNone,OptionSwitch(callVirtSwitch tcConfigB),Some(InternalCommandLineOption("alwayscallvirt",rangeCmdArgs)), None) CompilerOption("nodebugdata",tagNone, OptionUnit (fun () -> tcConfigB.noDebugData<-true),Some(InternalCommandLineOption("--nodebugdata",rangeCmdArgs)), None) testFlag tcConfigB ] @ - vsSpecificFlags tcConfigB @ + editorSpecificFlags tcConfigB @ [ CompilerOption("jit", tagNone, OptionSwitch (jitoptimizeSwitch tcConfigB), Some(InternalCommandLineOption("jit", rangeCmdArgs)), None) CompilerOption("localoptimize", tagNone, OptionSwitch(localoptimizeSwitch tcConfigB),Some(InternalCommandLineOption("localoptimize", rangeCmdArgs)), None) CompilerOption("splitting", tagNone, OptionSwitch(splittingSwitch tcConfigB),Some(InternalCommandLineOption("splitting", rangeCmdArgs)), None) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 4997c4ba59..230474a2e8 100755 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -227,6 +227,7 @@ let rec occursCheck g un ty = match stripTyEqns g ty with | TType_ucase(_, l) | TType_app (_, l) + | TType_anon(_, l) | TType_tuple (_, l) -> List.exists (occursCheck g un) l | TType_fun (d, r) -> occursCheck g un d || occursCheck g un r | TType_var r -> typarEq un r @@ -301,6 +302,7 @@ type TraitConstraintSolution = | TTraitBuiltIn | TTraitSolved of MethInfo * TypeInst | TTraitSolvedRecdProp of RecdFieldInfo * bool + | TTraitSolvedAnonRecdProp of AnonRecdTypeInfo * TypeInst * int let BakedInTraitConstraintNames = [ "op_Division" ; "op_Multiply"; "op_Addition" @@ -471,11 +473,14 @@ and SolveTypStaticReq (csenv:ConstraintSolverEnv) trace req ty = match stripTyparEqns ty with | TType_measure ms -> let vs = ListMeasureVarOccsWithNonZeroExponents ms - IterateD (fun ((tpr:Typar), _) -> SolveTypStaticReqTypar csenv trace req tpr) vs + trackErrors { + for (tpr, _) in vs do + return! SolveTypStaticReqTypar csenv trace req tpr + } | _ -> match tryAnyParTy csenv.g ty with - | Some tpr -> SolveTypStaticReqTypar csenv trace req tpr - | None -> CompleteD + | ValueSome tpr -> SolveTypStaticReqTypar csenv trace req tpr + | ValueNone -> CompleteD let TransactDynamicReq (trace:OptionalTrace) (tpr:Typar) req = let orig = tpr.DynamicReq @@ -487,7 +492,7 @@ let SolveTypDynamicReq (csenv:ConstraintSolverEnv) trace req ty = | TyparDynamicReq.No -> CompleteD | TyparDynamicReq.Yes -> match tryAnyParTy csenv.g ty with - | Some tpr when tpr.DynamicReq <> TyparDynamicReq.Yes -> + | ValueSome tpr when tpr.DynamicReq <> TyparDynamicReq.Yes -> TransactDynamicReq trace tpr TyparDynamicReq.Yes | _ -> CompleteD @@ -499,25 +504,27 @@ let TransactIsCompatFlex (trace:OptionalTrace) (tpr:Typar) req = let SolveTypIsCompatFlex (csenv:ConstraintSolverEnv) trace req ty = if req then match tryAnyParTy csenv.g ty with - | Some tpr when not tpr.IsCompatFlex -> TransactIsCompatFlex trace tpr req + | ValueSome tpr when not tpr.IsCompatFlex -> TransactIsCompatFlex trace tpr req | _ -> CompleteD else CompleteD -let SubstMeasureWarnIfRigid (csenv:ConstraintSolverEnv) trace (v:Typar) ms = +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 - SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) ++ (fun () -> + let tpnmOpt = if v.IsCompilerGenerated then None else Some v.Name + do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) SubstMeasure v ms - WarnD(NonRigidTypar(csenv.DisplayEnv, tpnmOpt, v.Range, TType_measure (Measure.Var v), TType_measure ms, csenv.m))) + 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' - SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) ++ (fun () -> + do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) SubstMeasure v ms if v.Rigidity = TyparRigidity.Anon && measureEquiv csenv.g ms Measure.One then - WarnD(Error(FSComp.SR.csCodeLessGeneric(), v.Range)) - else CompleteD) + return! WarnD(Error(FSComp.SR.csCodeLessGeneric(), v.Range)) + else + () + } /// Imperatively unify the unit-of-measure expression ms against 1. /// There are three cases @@ -576,6 +583,7 @@ let rec SimplifyMeasuresInType g resultFirst ((generalizable, generalized) as pa match stripTyparEqns ty with | TType_ucase(_, l) | TType_app (_, l) + | TType_anon (_,l) | TType_tuple (_, l) -> SimplifyMeasuresInTypes g param l | TType_fun (d, r) -> if resultFirst then SimplifyMeasuresInTypes g param [r;d] else SimplifyMeasuresInTypes g param [d;r] @@ -613,6 +621,7 @@ let rec GetMeasureVarGcdInType v ty = match stripTyparEqns ty with | TType_ucase(_, l) | TType_app (_, l) + | TType_anon (_,l) | TType_tuple (_, l) -> GetMeasureVarGcdInTypes v l | TType_fun (d, r) -> GcdRational (GetMeasureVarGcdInType v d) (GetMeasureVarGcdInType v r) @@ -687,8 +696,8 @@ let CheckWarnIfRigid (csenv:ConstraintSolverEnv) ty1 (r:Typar) ty = if not r.Rigidity.WarnIfUnified then CompleteD else let needsWarning = match tryAnyParTy g ty with - | None -> true - | Some tp2 -> + | ValueNone -> true + | ValueSome tp2 -> not tp2.IsCompilerGenerated && (r.IsCompilerGenerated || // exclude this warning for two identically named user-specified type parameters, e.g. from different mutually recursive functions or types @@ -703,21 +712,17 @@ 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 SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:OptionalTrace) ty1 ty = +let rec SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:OptionalTrace) ty1 ty = trackErrors { let m = csenv.m - - DepthCheck ndeep m ++ (fun () -> + do! DepthCheck ndeep m match ty1 with | TType_var r | TType_measure (Measure.Var r) -> // The types may still be equivalent due to abbreviations, which we are trying not to eliminate - if typeEquiv csenv.g ty1 ty then CompleteD else - + 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/Microsoft/visualfsharp/issues/1170 - if occursCheck csenv.g r ty then ErrorD (ConstraintSolverInfiniteTypes(csenv.eContextInfo, csenv.DisplayEnv, ty1, ty, m, m2)) else - + if occursCheck csenv.g r ty then return! ErrorD (ConstraintSolverInfiniteTypes(csenv.eContextInfo, csenv.DisplayEnv, ty1, ty, m, m2)) else // Note: warn _and_ continue! - CheckWarnIfRigid csenv ty1 r ty ++ (fun () -> - + 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 @@ -726,40 +731,39 @@ let rec SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:Optiona (* dprintf "setting typar %d to type %s at %a\n" r.Stamp ((DebugPrint.showType ty)) outputRange m; *) // Only solve constraints if this is not an error var - if r.IsFromError then CompleteD else - + 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 - RepeatWhileD ndeep (fun ndeep -> SolveRelevantMemberConstraintsForTypar csenv ndeep false trace r) - else - CompleteD) ++ (fun _ -> - + if csenv.SolverState.ExtraCxs.ContainsKey r.Stamp then + do! RepeatWhileD ndeep (fun ndeep -> SolveRelevantMemberConstraintsForTypar csenv ndeep false trace r) // Re-solve the other constraints associated with this type variable - solveTypMeetsTyparConstraints csenv ndeep m2 trace ty r)) + return! solveTypMeetsTyparConstraints csenv ndeep m2 trace ty r - | _ -> failwith "SolveTyparEqualsType") + | _ -> failwith "SolveTyparEqualsType" + } /// Apply the constraints on 'typar' to the type 'ty' -and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = +and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = trackErrors { let g = csenv.g // Propagate compat flex requirements from 'tp' to 'ty' - SolveTypIsCompatFlex csenv trace r.IsCompatFlex ty ++ (fun () -> + do! SolveTypIsCompatFlex csenv trace r.IsCompatFlex ty // Propagate dynamic requirements from 'tp' to 'ty' - SolveTypDynamicReq csenv trace r.DynamicReq ty ++ (fun () -> + do! SolveTypDynamicReq csenv trace r.DynamicReq ty // Propagate static requirements from 'tp' to 'ty' - SolveTypStaticReq csenv trace r.StaticReq ty ++ (fun () -> + do! SolveTypStaticReq csenv trace r.StaticReq ty // Solve constraints on 'tp' w.r.t. 'ty' - r.Constraints |> IterateD (function + 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 - | None -> CompleteD - | Some destTypar -> + | ValueNone -> CompleteD + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.DefaultsTo(priority, dty, m)) | TyparConstraint.SupportsNull m2 -> SolveTypeSupportsNull csenv ndeep m2 trace ty @@ -774,10 +778,18 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) 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 false ndeep m2 trace traitInfo ++ (fun _ -> CompleteD) - )))) + SolveMemberConstraint csenv false false ndeep m2 trace traitInfo |> OperationResult.ignore + } +and SolveAnonInfoEqualsAnonInfo (csenv:ConstraintSolverEnv) m2 (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = + if evalTupInfoIsStruct anonInfo1.TupInfo <> evalTupInfoIsStruct anonInfo2.TupInfo then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m,m2)) else + (match anonInfo1.Assembly, anonInfo2.Assembly with + | ccu1, ccu2 -> if not (ccuEq ccu1 ccu2) then ErrorD (ConstraintSolverError(FSComp.SR.tcAnonRecdCcuMismatch(ccu1.AssemblyName, ccu2.AssemblyName), csenv.m,m2)) else ResultD () + ) ++ (fun () -> + if not (anonInfo1.SortedNames = anonInfo2.SortedNames) then ErrorD (ConstraintSolverError(FSComp.SR.tcAnonRecdFieldNameMismatch(sprintf "%A" (Array.toList anonInfo1.SortedNames), sprintf "%A" (Array.toList anonInfo2.SortedNames)), csenv.m,m2)) else + ResultD ()) + /// Add the constraint "ty1 = ty2" to the constraint problem. /// Propagate all effects of adding this constraint, e.g. to solve type variables and SolveTypeEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) (cxsln:(TraitConstraintInfo * TraitConstraintSln) option) ty1 ty2 = @@ -818,6 +830,9 @@ and SolveTypeEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTra | 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) -> + SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 ++ (fun () -> + SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2) | TType_fun (d1, r1) , TType_fun (d2, r2) -> SolveFunTypeEqn csenv ndeep m2 trace None d1 d2 r1 r2 | TType_measure ms1 , TType_measure ms2 -> UnifyMeasures csenv trace ms1 ms2 | TType_forall(tps1, rty1), TType_forall(tps2, rty2) -> @@ -854,9 +869,10 @@ and SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln origl1 origl2 = ErrorD(ConstraintSolverTupleDiffLengths(csenv.DisplayEnv, origl1, origl2, csenv.m, m2)) loop origl1 origl2 -and SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 = - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln d1 d2 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln r1 r2) +and SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 = trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln d1 d2 + return! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln r1 r2 + } // ty1: expected // ty2: actual @@ -890,6 +906,9 @@ and SolveTypeSubsumesType (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalT | 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) -> + SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 ++ (fun () -> + SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2) (* nb. can unify since no variance *) | TType_fun (d1, r1) , TType_fun (d2, r2) -> SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 (* nb. can unify since no variance *) | TType_measure ms1, TType_measure ms2 -> UnifyMeasures csenv trace ms1 ms2 @@ -902,13 +921,14 @@ and SolveTypeSubsumesType (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalT // 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 ] -> - SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 ++ (fun () -> + | [ 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) ) -> CompleteD - | _ -> SolveTypeEqualsType csenv ndeep m2 trace cxsln tag1 tag2) + (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_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> @@ -988,16 +1008,16 @@ and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty /// We pretend int and other types support a number of operators. In the actual IL for mscorlib they /// don't, however the type-directed static optimization rules in the library code that makes use of this /// will deal with the problem. -and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace (TTrait(tys, nm, memFlags, argtys, rty, sln)): OperationResult = +and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace (TTrait(tys, nm, memFlags, argtys, rty, sln)): OperationResult = trackErrors { // Do not re-solve if already solved - if sln.Value.IsSome then ResultD true else + 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 - DepthCheck ndeep m ++ (fun () -> + do! DepthCheck ndeep m // Remove duplicates from the set of types in the support let tys = ListSet.setify (typeAEquiv g aenv) tys @@ -1008,19 +1028,19 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p // Assert the object type if the constraint is for an instance member if memFlags.IsInstance then match tys, argtys with - | [ty], (h :: _) -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace h ty - | _ -> ErrorD (ConstraintSolverError(FSComp.SR.csExpectedArguments(), m, m2)) - else CompleteD - ++ (fun () -> - + | [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) - tys |> IterateD (SolveTypStaticReq csenv trace HeadTypeStaticReq)) ++ (fun () -> + for e in tys do + do! SolveTypStaticReq csenv trace HeadTypeStaticReq e let argtys = if memFlags.IsInstance then List.tail argtys else argtys let minfos = GetRelevantMethodsForTrait csenv permitWeakResolution nm traitInfo - match minfos, tys, memFlags.IsInstance, nm, argtys with + let! res = + trackErrors { + match minfos, tys, memFlags.IsInstance, nm, argtys with | _, _, false, ("op_Division" | "op_Multiply"), [argty1;argty2] when // This simulates the existence of @@ -1063,153 +1083,155 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p checkRuleAppliesInPreferenceToMethods argty2 argty1) -> match GetMeasureOfType g argty1 with - | Some (tcref, ms1) -> + | Some (tcref, ms1) -> let ms2 = freshMeasure () - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 (mkAppTy tcref [TType_measure ms2]) ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 (mkAppTy tcref [TType_measure ms2]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (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) -> + | Some (tcref, ms2) -> let ms1 = freshMeasure () - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure ms1]) ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) ++ (fun () -> - ResultD TTraitBuiltIn)) - | _ -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure ms1]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (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 rty 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 ) && ( (IsNumericOrIntegralEnumType g argty1 || (nm = "op_Addition" && (isCharTy g argty1 || isStringTy g argty1))) && (permitWeakResolution || not (isTyparTy g argty2)) - || (IsNumericOrIntegralEnumType g argty2 || (nm = "op_Addition" && (isCharTy g argty2 || isStringTy g argty2))) && (permitWeakResolution || not (isTyparTy g argty1)))) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn)) + || (IsNumericOrIntegralEnumType g argty2 || (nm = "op_Addition" && (isCharTy g argty2 || isStringTy g argty2))) && (permitWeakResolution || not (isTyparTy g argty1)))) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty 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 && (permitWeakResolution || not (isTyparTy g argty2))) - || (IsRelationalType g argty2 && (permitWeakResolution || not (isTyparTy g argty1))))) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.bool_ty ++ (fun () -> - ResultD TTraitBuiltIn)) + || (IsRelationalType g argty2 && (permitWeakResolution || not (isTyparTy g argty1))))) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty 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 -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty ++ (fun () -> - ResultD TTraitBuiltIn) + when IsNumericType g ty -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty + return TTraitBuiltIn | [], [ty], false, "get_One", [] - when IsNumericType g ty || isCharTy g ty -> - SolveDimensionlessNumericType csenv ndeep m2 trace ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty ++ (fun () -> - ResultD TTraitBuiltIn)) + when IsNumericType g ty || isCharTy g ty -> + do! SolveDimensionlessNumericType csenv ndeep m2 trace ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty + return TTraitBuiltIn | [], _, false, ("DivideByInt"), [argty1;argty2] - when isFpTy g argty1 || isDecimalTy g argty1 -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn)) + when isFpTy g argty1 || isDecimalTy g argty1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty 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 -> + when isStringTy g ty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 g.int_ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.char_ty ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.char_ty + return TTraitBuiltIn | [], [ty], true, ("get_Item"), argtys - when isArrayTy g ty -> + when isArrayTy g ty -> - (if rankOfArrayTy g ty <> argtys.Length then ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), argtys.Length), m, m2)) else CompleteD) ++ (fun () -> - (argtys |> IterateD (fun argty -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty g.int_ty)) ++ (fun () -> + 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 - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ety ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ety + return TTraitBuiltIn | [], [ty], true, ("set_Item"), argtys - when isArrayTy g ty -> + when isArrayTy g ty -> - (if rankOfArrayTy g ty <> argtys.Length - 1 then ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argtys.Length - 1)), m, m2)) else CompleteD) ++ (fun () -> + if rankOfArrayTy g ty <> argtys.Length - 1 then do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argtys.Length - 1)), m, m2)) let argtys, ety = List.frontAndBack argtys - (argtys |> IterateD (fun argty -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty g.int_ty)) ++ (fun () -> + for argty in argtys do + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty g.int_ty let etys = destArrayTy g ty - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ety etys ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ety etys + return TTraitBuiltIn | [], _, false, ("op_BitwiseAnd" | "op_BitwiseOr" | "op_ExclusiveOr"), [argty1;argty2] when (isIntegerOrIntegerEnumTy g argty1 || (isEnumTy g argty1)) && (permitWeakResolution || not (isTyparTy g argty2)) - || (isIntegerOrIntegerEnumTy g argty2 || (isEnumTy g argty2)) && (permitWeakResolution || not (isTyparTy g argty1)) -> + || (isIntegerOrIntegerEnumTy g argty2 || (isEnumTy g argty2)) && (permitWeakResolution || not (isTyparTy g argty1)) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty1 ++ (fun () -> - ResultD TTraitBuiltIn))); + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty1 + return TTraitBuiltIn | [], _, false, ("op_LeftShift" | "op_RightShift"), [argty1;argty2] - when isIntegerOrIntegerEnumTy g argty1 -> + when isIntegerOrIntegerEnumTy g argty1 -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty1 ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty1 + return TTraitBuiltIn | _, _, false, ("op_UnaryPlus"), [argty] - when IsNumericOrIntegralEnumType g argty -> + when IsNumericOrIntegralEnumType g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return TTraitBuiltIn | _, _, false, ("op_UnaryNegation"), [argty] - when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> + when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return TTraitBuiltIn | _, _, true, ("get_Sign"), [] - when (let argty = tys.Head in isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty) -> + when (let argty = tys.Head in isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.int32_ty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.int32_ty + return TTraitBuiltIn | _, _, false, ("op_LogicalNot" | "op_OnesComplement"), [argty] - when isIntegerOrIntegerEnumTy g argty -> + when isIntegerOrIntegerEnumTy g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty + return TTraitBuiltIn | _, _, false, ("Abs"), [argty] - when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> + when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return TTraitBuiltIn | _, _, false, "Sqrt", [argty1] when isFpTy g argty1 -> match GetMeasureOfType g argty1 with - | Some (tcref, _) -> + | Some (tcref, _) -> let ms1 = freshMeasure () - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure ms1]) ++ (fun () -> - ResultD TTraitBuiltIn)) - | None -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure ms1]) + return TTraitBuiltIn + | None -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty 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 -> + when isFpTy g argty -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return TTraitBuiltIn | _, _, false, ("op_Explicit"), [argty] when (// The input type. @@ -1221,7 +1243,7 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p // Exclusion: No conversion from char to decimal not (isCharTy g argty && isDecimalTy g rty)) -> - ResultD TTraitBuiltIn + return TTraitBuiltIn | _, _, false, ("op_Explicit"), [argty] @@ -1230,23 +1252,23 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p // The output type (isDecimalTy g rty)) -> - ResultD TTraitBuiltIn + return TTraitBuiltIn | [], _, false, "Pow", [argty1; argty2] - when isFpTy g argty1 -> + when isFpTy g argty1 -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + return TTraitBuiltIn | _, _, false, ("Atan2"), [argty1; argty2] - when isFpTy g argty1 -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> + when isFpTy g argty1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 match GetMeasureOfType g argty1 with - | None -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 - | Some (tcref, _) -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure Measure.One])) ++ (fun () -> - ResultD TTraitBuiltIn) + | None -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + | Some (tcref, _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure Measure.One]) + return TTraitBuiltIn | _ -> // OK, this is not solved by a built-in constraint. @@ -1275,16 +1297,31 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p else None + let anonRecdPropSearch = + let isGetProp = nm.StartsWith "get_" + if isGetProp && memFlags.IsInstance then + let propName = nm.[4..] + let props = + tys |> 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 with - | [], None when not (tys |> List.exists (isAnyParTy g)) -> + match minfos, recdPropSearch, anonRecdPropSearch with + | [], None, None when not (tys |> List.exists (isAnyParTy g)) -> if tys |> List.exists (isFunTy g) then - ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(DecompileOpName nm), m, m2)) + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(DecompileOpName nm), m, m2)) elif tys |> List.exists (isAnyTupleTy g) then - ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(DecompileOpName nm), m, m2)) + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(DecompileOpName nm), m, m2)) else match nm, argtys with - | "op_Explicit", [argty] -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion((NicePrint.prettyStringOfTy denv argty), (NicePrint.prettyStringOfTy denv rty)), m, m2)) + | "op_Explicit", [argty] -> return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion((NicePrint.prettyStringOfTy denv argty), (NicePrint.prettyStringOfTy denv rty)), m, m2)) | _ -> let tyString = match tys with @@ -1301,10 +1338,9 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p | _ -> if tys.Length = 1 then FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) else FSComp.SR.csTypesDoNotSupportOperator(tyString, opName) - ErrorD(ConstraintSolverError(err, m, m2)) + return! ErrorD(ConstraintSolverError(err, m, m2)) | _ -> - let dummyExpr = mkUnit g m let calledMethGroup = minfos @@ -1319,42 +1355,49 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p let methOverloadResult, errors = trace.CollectThenUndoOrCommit (fun (a, _) -> Option.isSome a) (fun trace -> ResolveOverloading csenv (WithTrace trace) nm ndeep (Some traitInfo) (0, 0) AccessibleFromEverywhere calledMethGroup false (Some rty)) - match recdPropSearch, methOverloadResult with - | Some (rfinfo, isSetProp), None -> + 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 rty 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 - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty rty2 ++ (fun () -> - ResultD (TTraitSolvedRecdProp(rfinfo, isSetProp))) - | None, Some (calledMeth:CalledMeth<_>) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty rty2 + return TTraitSolvedRecdProp(rfinfo, isSetProp) + + | None, None, Some (calledMeth:CalledMeth<_>) -> // OK, the constraint is solved. let minfo = calledMeth.Method - errors ++ (fun () -> - let isInstance = minfo.IsInstance - if isInstance <> memFlags.IsInstance then + 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), (DecompileOpName nm), nm), m, m2 )) else ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (DecompileOpName nm), nm), m, m2 )) - else - CheckMethInfoAttributes g m None minfo ++ (fun () -> - ResultD (TTraitSolved (minfo, calledMeth.CalledTyArgs)))) + else + do! CheckMethInfoAttributes g m None minfo + return TTraitSolved (minfo, calledMeth.CalledTyArgs) - | _ -> + | _ -> let support = GetSupportOfMemberConstraint csenv traitInfo let frees = GetFreeTyparsOfMemberConstraint csenv traitInfo - // If there's nothing left to learn then raise the errors - (if (permitWeakResolution && isNil support) || isNil frees then errors - // Otherwise re-record the trait waiting for canonicalization - else AddMemberConstraint csenv ndeep m2 trace traitInfo support frees) ++ (fun () -> + if (permitWeakResolution && isNil support) || isNil frees then do! errors + // Otherwise re-record the trait waiting for canonicalization + else do! AddMemberConstraint csenv ndeep m2 trace traitInfo support frees + return! match errors with | ErrorResult (_, UnresolvedOverloading _) when not ignoreUnresolvedOverload && (not (nm = "op_Explicit" || nm = "op_Implicit")) -> ErrorD LocallyAbortOperationThatFailsToResolveOverload - | _ -> ResultD TTraitUnsolved) - ) - ++ - (fun res -> RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res)) - + | _ -> ResultD TTraitUnsolved + } + return! RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res + } /// Record the solution to a member constraint in the mutable reference cell attached to /// each member constraint. @@ -1372,8 +1415,13 @@ and RecordMemberConstraintSolution css m trace traitInfo res = TransactMemberConstraintSolution traitInfo trace BuiltInSln; ResultD true - | TTraitSolvedRecdProp (rfinfo, isSetProp) -> - let sln = MemberConstraintSolutionOfRecdFieldInfo rfinfo isSetProp + | TTraitSolvedRecdProp (rfinfo, isSet) -> + let sln = FSRecdFieldSln(rfinfo.TypeInst,rfinfo.RecdFieldRef,isSet) + TransactMemberConstraintSolution traitInfo trace sln; + ResultD true + + | TTraitSolvedAnonRecdProp (anonInfo, tinst, i) -> + let sln = FSAnonRecdFieldSln(anonInfo, tinst, i) TransactMemberConstraintSolution traitInfo trace sln; ResultD true @@ -1418,9 +1466,6 @@ and MemberConstraintSolutionOfMethInfo css m minfo minst = #endif -and MemberConstraintSolutionOfRecdFieldInfo rfinfo isSet = - FSRecdFieldSln(rfinfo.TypeInst, rfinfo.RecdFieldRef, isSet) - /// Write into the reference cell stored in the TAST and add to the undo trace if necessary and TransactMemberConstraintSolution traitInfo (trace:OptionalTrace) sln = let prev = traitInfo.Solution @@ -1446,7 +1491,14 @@ and GetRelevantMethodsForTrait (csenv:ConstraintSolverEnv) permitWeakResolution /// to a generic instantiation for an operator based on the right hand type. let minfos = List.reduce (ListSet.unionFavourLeft MethInfo.MethInfosUseIdenticalDefinitions) minfos + + /// Check that the available members aren't hiding a member from the parent (depth 1 only) + let relevantMinfos = minfos |> List.filter(fun minfo -> not minfo.IsDispatchSlot && not minfo.IsVirtual && minfo.IsInstance) minfos + |> List.filter(fun minfo1 -> + not(minfo1.IsDispatchSlot && + relevantMinfos + |> List.exists (fun minfo2 -> MethInfosEquivByNameAndSig EraseAll true csenv.g csenv.amap m minfo2 minfo1))) else [] // The trait name "op_Explicit" also covers "op_Implicit", so look for that one too. @@ -1458,7 +1510,7 @@ and GetRelevantMethodsForTrait (csenv:ConstraintSolverEnv) permitWeakResolution /// The nominal support of the member constraint and GetSupportOfMemberConstraint (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = - tys |> List.choose (tryAnyParTy csenv.g) + tys |> List.choose (tryAnyParTyOption csenv.g) /// All the typars relevant to the member constraint *) and GetFreeTyparsOfMemberConstraint (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, argtys, rty, _)) = @@ -1475,9 +1527,9 @@ and SolveRelevantMemberConstraints (csenv:ConstraintSolverEnv) ndeep permitWeakR /// Normalize the typar let ty = mkTyparTy tp match tryAnyParTy csenv.g ty with - | Some tp -> + | ValueSome tp -> SolveRelevantMemberConstraintsForTypar csenv ndeep permitWeakResolution trace tp - | None -> + | ValueNone -> ResultD false)) and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep permitWeakResolution (trace:OptionalTrace) tp = @@ -1518,7 +1570,10 @@ and AddMemberConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace traitInfo sup // Associate the constraint with each type variable in the support, so if the type variable // gets generalized then this constraint is attached at the binding site. - support |> IterateD (fun tp -> AddConstraint csenv ndeep m2 trace tp (TyparConstraint.MayResolveMember(traitInfo, m2))) + trackErrors { + for tp in support do + do! AddConstraint csenv ndeep m2 trace tp (TyparConstraint.MayResolveMember(traitInfo, m2)) + } /// Record a constraint on an inference type variable. @@ -1548,9 +1603,11 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = let rty1 = GetFSharpViewOfReturnType g rty1 let rty2 = GetFSharpViewOfReturnType g rty2 - Iterate2D (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace) argtys1 argtys2 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty1 rty2 ++ (fun () -> - CompleteD)) + trackErrors { + do! Iterate2D (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace) argtys1 argtys2 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty1 rty2 + () + } | (TyparConstraint.CoercesTo(ty1, _), TyparConstraint.CoercesTo(ty2, _)) -> @@ -1564,19 +1621,22 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = List.rev !res let parents1 = collect ty1 let parents2 = collect ty2 - parents1 |> IterateD (fun ty1Parent -> - parents2 |> IterateD (fun ty2Parent -> - if not (HaveSameHeadType g ty1Parent ty2Parent) then CompleteD else - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1Parent ty2Parent)) + trackErrors { + for ty1Parent in parents1 do + for ty2Parent in parents2 do + do! if not (HaveSameHeadType g ty1Parent ty2Parent) then CompleteD else + SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1Parent ty2Parent + } | (TyparConstraint.IsEnum (u1, _), TyparConstraint.IsEnum (u2, m2)) -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace u1 u2 | (TyparConstraint.IsDelegate (aty1, bty1, _), - TyparConstraint.IsDelegate (aty2, bty2, m2)) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace aty1 aty2 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bty1 bty2) + TyparConstraint.IsDelegate (aty2, bty2, m2)) -> trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace aty1 aty2 + return! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bty1 bty2 + } | TyparConstraint.SupportsComparison _, TyparConstraint.IsDelegate _ | TyparConstraint.IsDelegate _ , TyparConstraint.SupportsComparison _ @@ -1635,36 +1695,34 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = let existingConstraints = tp.Constraints let allCxs = newConstraint :: List.rev existingConstraints - begin + trackErrors { let rec enforceMutualConsistency i cxs = match cxs with | [] -> CompleteD - | cx :: rest -> IterateIdxD (fun j cx2 -> if i = j then CompleteD else consistent cx cx2) allCxs ++ (fun () -> enforceMutualConsistency (i+1) rest) - - enforceMutualConsistency 0 allCxs - end ++ (fun () -> + | cx :: rest -> + trackErrors { + do! IterateIdxD (fun j cx2 -> if i = j then CompleteD else consistent cx cx2) allCxs + return! enforceMutualConsistency (i+1) rest + } + do! enforceMutualConsistency 0 allCxs - let impliedByExistingConstraints = existingConstraints |> List.exists (fun tpc2 -> implies tpc2 newConstraint) + let impliedByExistingConstraints = existingConstraints |> List.exists (fun tpc2 -> implies tpc2 newConstraint) - if impliedByExistingConstraints then - CompleteD - // "Default" constraints propagate softly and can be omitted from explicit declarations of type parameters - elif (match tp.Rigidity, newConstraint with - | (TyparRigidity.Rigid | TyparRigidity.WillBeRigid), TyparConstraint.DefaultsTo _ -> true - | _ -> false) then - CompleteD - elif tp.Rigidity = TyparRigidity.Rigid then - ErrorD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) - else - (// It is important that we give a warning if a constraint is missing from a + if impliedByExistingConstraints then () + // "Default" constraints propagate softly and can be omitted from explicit declarations of type parameters + elif (match tp.Rigidity, newConstraint with + | (TyparRigidity.Rigid | TyparRigidity.WillBeRigid), TyparConstraint.DefaultsTo _ -> true + | _ -> false) then + () + elif tp.Rigidity = TyparRigidity.Rigid then + return! ErrorD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) + else + // It is important that we give a warning if a constraint is missing from a // will-be-made-rigid type variable. This is because the existence of these warnings // is relevant to the overload resolution rules (see 'candidateWarnCount' in the overload resolution // implementation). See also FSharp 1.0 bug 5461 - (if tp.Rigidity.WarnIfMissingConstraint then - WarnD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) - else - CompleteD) ++ (fun () -> - + if tp.Rigidity.WarnIfMissingConstraint then + do! WarnD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) let newConstraints = // Eliminate any constraints where one constraint implies another // Keep constraints in the left-to-right form according to the order they are asserted. @@ -1676,23 +1734,23 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = eliminateRedundant rest (if List.exists (fun cx2 -> implies cx2 cx) acc then acc else (cx::acc)) eliminateRedundant allCxs [] - // Write the constraint into the type variable // Record a entry in the undo trace if one is provided let orig = tp.Constraints trace.Exec (fun () -> tp.SetConstraints newConstraints) (fun () -> tp.SetConstraints orig) + () + } - CompleteD))) and SolveTypeSupportsNull (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SupportsNull m) - | None -> + | ValueNone -> if TypeSatisfiesNullConstraint g m ty then CompleteD else match ty with | NullableTy g _ -> @@ -1706,12 +1764,12 @@ and SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let amap = csenv.amap let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SupportsComparison m) - | None -> + | ValueNone -> // Check it isn't ruled out by the user match tryDestAppTy g ty with - | Some tcref when HasFSharpAttribute g g.attrib_NoComparisonAttribute tcref.Attribs -> + | ValueSome tcref when HasFSharpAttribute g g.attrib_NoComparisonAttribute tcref.Attribs -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportComparison1(NicePrint.minimalStringOfType denv ty), m, m2)) | _ -> match ty with @@ -1750,11 +1808,11 @@ and SolveTypeSupportsEquality (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SupportsEquality m) - | None -> + | _ -> match tryDestAppTy g ty with - | Some tcref when HasFSharpAttribute g g.attrib_NoEqualityAttribute tcref.Attribs -> + | ValueSome tcref when HasFSharpAttribute g g.attrib_NoEqualityAttribute tcref.Attribs -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportEquality1(NicePrint.minimalStringOfType denv ty), m, m2)) | _ -> match ty with @@ -1787,9 +1845,9 @@ and SolveTypeIsEnum (csenv:ConstraintSolverEnv) ndeep m2 trace ty underlying = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> return! AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsEnum(underlying, m)) - | None -> + | _ -> if isEnumTy g ty then do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace underlying (underlyingTypeOfEnumTy g ty) return! CompleteD @@ -1803,9 +1861,9 @@ and SolveTypeIsDelegate (csenv:ConstraintSolverEnv) ndeep m2 trace ty aty bty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> return! AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsDelegate(aty, bty, m)) - | None -> + | _ -> if isDelegateTy g ty then match TryDestStandardDelegateType csenv.InfoReader m AccessibleFromSomewhere ty with | Some (tupledArgTy, rty) -> @@ -1823,9 +1881,9 @@ and SolveTypeIsNonNullableValueType (csenv:ConstraintSolverEnv) ndeep m2 trace t let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> return! AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsNonNullableStruct m) - | None -> + | _ -> let underlyingTy = stripTyEqnsAndMeasureEqns g ty if isStructTy g underlyingTy then if tyconRefEq g g.system_Nullable_tcref (tcrefOfAppTy g underlyingTy) then @@ -1839,9 +1897,9 @@ and SolveTypeIsUnmanaged (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsUnmanaged m) - | None -> + | _ -> if isUnmanagedTy g ty then CompleteD else @@ -1853,9 +1911,9 @@ and SolveTypeChoice (csenv:ConstraintSolverEnv) ndeep m2 trace ty tys = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SimpleChoice(tys, m)) - | None -> + | _ -> if List.exists (typeEquivAux Erasure.EraseMeasures g ty) tys then CompleteD else ErrorD (ConstraintSolverError(FSComp.SR.csTypeNotCompatibleBecauseOfPrintf((NicePrint.minimalStringOfType denv ty), (String.concat "," (List.map (NicePrint.prettyStringOfTy denv) tys))), m, m2)) @@ -1865,9 +1923,9 @@ and SolveTypeIsReferenceType (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsReferenceType m) - | None -> + | _ -> if isRefTy g ty then CompleteD else ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresReferenceSemantics(NicePrint.minimalStringOfType denv ty), m, m)) @@ -1878,9 +1936,9 @@ and SolveTypeRequiresDefaultConstructor (csenv:ConstraintSolverEnv) ndeep m2 tra let denv = csenv.DisplayEnv let ty = stripTyEqnsAndMeasureEqns g origTy match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.RequiresDefaultConstructor m) - | None -> + | _ -> if isStructTy g ty && TypeHasDefaultValue g m ty then CompleteD else @@ -1888,13 +1946,13 @@ and SolveTypeRequiresDefaultConstructor (csenv:ConstraintSolverEnv) ndeep m2 tra |> List.exists (fun x -> x.IsNullary && IsMethInfoAccessible amap m AccessibleFromEverywhere x) then match tryDestAppTy g ty with - | Some tcref when HasFSharpAttribute g g.attrib_AbstractClassAttribute tcref.Attribs -> + | ValueSome tcref when HasFSharpAttribute g g.attrib_AbstractClassAttribute tcref.Attribs -> ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresNonAbstract(NicePrint.minimalStringOfType denv origTy), m, m2)) | _ -> CompleteD else match tryDestAppTy g ty with - | Some tcref when + | ValueSome tcref when tcref.PreEstablishedHasDefaultConstructor || // F# 3.1 feature: records with CLIMutable attribute should satisfy 'default constructor' constraint (tcref.IsRecordTycon && HasFSharpAttribute g g.attrib_CLIMutableAttribute tcref.Attribs) -> @@ -2029,17 +2087,16 @@ and ArgsMustSubsumeOrConvert cxsln isConstraint (calledArg: CalledArg) - (callerArg: CallerArg<'T>) = + (callerArg: CallerArg<'T>) = trackErrors { let g = csenv.g let m = callerArg.Range let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg - SolveTypeSubsumesTypeWithReport csenv ndeep m trace cxsln calledArgTy callerArg.Type ++ (fun () -> - + do! SolveTypeSubsumesTypeWithReport csenv ndeep m trace cxsln calledArgTy callerArg.Type if calledArg.IsParamArray && isArray1DTy g calledArgTy && not (isArray1DTy g callerArg.Type) then - ErrorD(Error(FSComp.SR.csMethodExpectsParams(), m)) - else - CompleteD) + return! ErrorD(Error(FSComp.SR.csMethodExpectsParams(), m)) + else () + } and MustUnify csenv ndeep trace cxsln ty1 ty2 = SolveTypeEqualsTypeWithReport csenv ndeep csenv.m trace cxsln ty1 ty2 @@ -2324,7 +2381,7 @@ and ResolveOverloading // Func<_> is always considered better than any other delegate type match tryDestAppTy csenv.g ty1 with - | Some tcref1 when + | ValueSome tcref1 when tcref1.DisplayName = "Func" && (match tcref1.PublicPath with Some p -> p.EnclosingPath = [| "System" |] | _ -> false) && isDelegateTy g ty1 && @@ -2462,11 +2519,12 @@ and ResolveOverloading match calledMethOpt with | Some calledMeth -> calledMethOpt, - errors ++ (fun () -> + trackErrors { + do! errors let cxsln = Option.map (fun traitInfo -> (traitInfo, MemberConstraintSolutionOfMethInfo csenv.SolverState m calledMeth.Method calledMeth.CalledTyArgs)) cx match calledMethTrace with | NoTrace -> - + return! // No trace available for CanMemberSigsMatchUpToCheck with ArgsMustSubsumeOrConvert CanMemberSigsMatchUpToCheck csenv @@ -2484,14 +2542,15 @@ and ResolveOverloading // Unify return type match reqdRetTyOpt with - | None -> CompleteD - | Some _ when calledMeth.Method.IsConstructor -> CompleteD + | None -> () + | Some _ when calledMeth.Method.IsConstructor -> () | Some reqdRetTy -> let actualRetTy = calledMeth.CalledReturnTypeAfterOutArgTupling if isByrefTy g reqdRetTy then - ErrorD(Error(FSComp.SR.tcByrefReturnImplicitlyDereferenced(), m)) + return! ErrorD(Error(FSComp.SR.tcByrefReturnImplicitlyDereferenced(), m)) else - MustUnify csenv ndeep trace cxsln reqdRetTy actualRetTy) + return! MustUnify csenv ndeep trace cxsln reqdRetTy actualRetTy + } | None -> None, errors @@ -2511,7 +2570,8 @@ let UnifyUniqueOverloading let candidates = calledMethGroup |> List.filter (fun cmeth -> cmeth.IsCandidate(m, ad)) let ndeep = 0 match calledMethGroup, candidates with - | _, [calledMeth] -> + | _, [calledMeth] -> trackErrors { + do! // Only one candidate found - we thus know the types we expect of arguments CanMemberSigsMatchUpToCheck csenv @@ -2522,13 +2582,15 @@ let UnifyUniqueOverloading (ArgsMustSubsumeOrConvert csenv ndeep NoTrace None false) // UnifyUniqueOverloading is not called in case of trait call - pass isConstraint=false (Some reqdRetTy) calledMeth - ++ (fun () -> ResultD true) + return true + } | [], _ -> ErrorD (Error (FSComp.SR.csMethodNotFound(methodName), m)) - | _, [] -> - ReportNoCandidatesErrorSynExpr csenv callerArgCounts methodName ad calledMethGroup - ++ (fun () -> ResultD false) + | _, [] -> trackErrors { + do! ReportNoCandidatesErrorSynExpr csenv callerArgCounts methodName ad calledMethGroup + return false + } | _ -> ResultD false @@ -2591,7 +2653,12 @@ let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 = |> RaiseOperationResult let AddCxMethodConstraint denv css m trace traitInfo = - TryD (fun () -> SolveMemberConstraint (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) true false 0 m trace traitInfo ++ (fun _ -> CompleteD)) + TryD (fun () -> + trackErrors { + do! + SolveMemberConstraint (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) true false 0 m trace traitInfo + |> OperationResult.ignore + }) (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) |> RaiseOperationResult @@ -2640,7 +2707,7 @@ let AddCxTypeIsDelegate denv css m trace ty aty bty = (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) |> RaiseOperationResult -let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:TraitConstraintInfo) argExprs = +let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:TraitConstraintInfo) argExprs = trackErrors { let css = { g = g amap = amap @@ -2649,15 +2716,15 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai InfoReader = new InfoReader(g, amap) } let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) - SolveMemberConstraint csenv true true 0 m NoTrace traitInfo ++ (fun _res -> - let sln = + let! _res = SolveMemberConstraint csenv true true 0 m NoTrace traitInfo + let sln = match traitInfo.Solution with - | None -> Choice4Of4() + | None -> Choice5Of5() | Some sln -> match sln with | ILMethSln(origTy, extOpt, mref, minst) -> let metadataTy = convertToTypeWithMetadataIfPossible g origTy - let tcref, _tinst = destAppTy g metadataTy + let tcref = tcrefOfAppTy g metadataTy let mdef = IL.resolveILMethodRef tcref.ILTyconRawMetadata mref let ilMethInfo = match extOpt with @@ -2665,17 +2732,20 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai | Some ilActualTypeRef -> let actualTyconRef = Import.ImportILTypeRef amap m ilActualTypeRef MethInfo.CreateILExtensionMeth(amap, m, origTy, actualTyconRef, None, mdef) - Choice1Of4 (ilMethInfo, minst) + Choice1Of5 (ilMethInfo, minst) | FSMethSln(ty, vref, minst) -> - Choice1Of4 (FSMeth(g, ty, vref, None), minst) + Choice1Of5 (FSMeth(g, ty, vref, None), minst) | FSRecdFieldSln(tinst, rfref, isSetProp) -> - Choice2Of4 (tinst, rfref, isSetProp) + Choice2Of5 (tinst, rfref, isSetProp) + | FSAnonRecdFieldSln(anonInfo, tinst, i) -> + Choice3Of5 (anonInfo, tinst, i) | BuiltInSln -> - Choice4Of4 () + Choice5Of5 () | ClosedExprSln expr -> - Choice3Of4 expr + Choice4Of5 expr + return! match sln with - | Choice1Of4(minfo, methArgTys) -> + | Choice1Of5(minfo, methArgTys) -> let argExprs = // FIX for #421894 - typechecker assumes that coercion can be applied for the trait calls arguments but codegen doesn't emit coercion operations // result - generation of non-verifyable code @@ -2706,7 +2776,7 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai else ResultD (Some (MakeMethInfoCall amap m minfo methArgTys argExprs )) - | Choice2Of4 (tinst, rfref, isSet) -> + | Choice2Of5 (tinst, rfref, isSet) -> let res = match isSet, rfref.RecdField.IsStatic, argExprs.Length with | true, true, 1 -> @@ -2729,8 +2799,19 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai Some (mkRecdFieldGet g (argExprs.[0], rfref, tinst, m)) | _ -> None ResultD res - | Choice3Of4 expr -> ResultD (Some (MakeApplicationAndBetaReduce g (expr, tyOfExpr g expr, [], argExprs, m))) - | Choice4Of4 () -> ResultD None) + | Choice3Of5 (anonInfo, tinst, i) -> + let res = + let tupInfo = anonInfo.TupInfo + if evalTupInfoIsStruct tupInfo && isByrefTy g (tyOfExpr g argExprs.[0]) then + Some (mkAnonRecdFieldGetViaExprAddr (anonInfo, argExprs.[0], tinst, i, m)) + else + Some (mkAnonRecdFieldGet g (anonInfo, argExprs.[0], tinst, i, m)) + ResultD res + + | Choice4Of5 expr -> ResultD (Some (MakeApplicationAndBetaReduce g (expr, tyOfExpr g expr, [], argExprs, m))) + + | Choice5Of5 () -> ResultD None + } let ChooseTyparSolutionAndSolve css denv tp = @@ -2769,6 +2850,7 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy = let minst = FreshenMethInfo m minfo match minfo.GetObjArgTypes(amap, m, minst) with | [reqdObjTy] -> + let reqdObjTy = if isByrefTy g reqdObjTy then destByrefTy g reqdObjTy else reqdObjTy // This is to support byref extension methods. TryD (fun () -> SolveTypeSubsumesType csenv 0 m NoTrace None reqdObjTy availObjTy ++ (fun () -> ResultD true)) (fun _err -> ResultD false) |> CommitOperationResult diff --git a/src/fsharp/DetupleArgs.fs b/src/fsharp/DetupleArgs.fs index bf56deeeb7..9a7f99e63a 100755 --- a/src/fsharp/DetupleArgs.fs +++ b/src/fsharp/DetupleArgs.fs @@ -850,11 +850,11 @@ let postTransformExpr (penv:penv) expr = | _ -> None -let passImplFile penv ass = - ass |> RewriteImplFile {PreIntercept =None - PreInterceptBinding=None - PostTransform= postTransformExpr penv - IsUnderQuotations=false } +let passImplFile penv assembly = + assembly |> RewriteImplFile {PreIntercept =None + PreInterceptBinding=None + PostTransform= postTransformExpr penv + IsUnderQuotations=false } //------------------------------------------------------------------------- diff --git a/src/fsharp/Directory.Build.props b/src/fsharp/Directory.Build.props new file mode 100644 index 0000000000..151415117e --- /dev/null +++ b/src/fsharp/Directory.Build.props @@ -0,0 +1,12 @@ + + + + + + true + true + false + $(ArtifactsPackagesDir)\$(Configuration) + + + diff --git a/src/fsharp/Directory.Build.targets b/src/fsharp/Directory.Build.targets new file mode 100644 index 0000000000..068f4dc3c5 --- /dev/null +++ b/src/fsharp/Directory.Build.targets @@ -0,0 +1,4 @@ + + + + diff --git a/src/fsharp/Directory.Nuget.props b/src/fsharp/Directory.Nuget.props new file mode 100644 index 0000000000..6521936cfe --- /dev/null +++ b/src/fsharp/Directory.Nuget.props @@ -0,0 +1,27 @@ + + + + https://github.com/Microsoft/visualfsharp/blob/master/License.txt + https://github.com/Microsoft/visualfsharp + Microsoft and F# Software Foundation + Microsoft and F# Software Foundation + Visual F# Compiler FSharp functional programming + (C) Microsoft Corporation. All rights reserved. + + $(GitHeadSha) + [developer build] + + + licenseUrl=$(PackageLicenceUrl); + authors=$(PackageAuthors); + owners=$(PackageOwners); + projectUrl=$(PackageProjectUrl); + copyright=$(PackageCopyright); + tags=$(PackageTags); + githeadsha=$(NormalizedGitHeadSha); + configuration=$(Configuration); + artifactsbindir=$(ArtifactsBinDir); + + + + diff --git a/src/fsharp/Directory.Nuget.targets b/src/fsharp/Directory.Nuget.targets new file mode 100644 index 0000000000..e30b155faa --- /dev/null +++ b/src/fsharp/Directory.Nuget.targets @@ -0,0 +1,11 @@ + + + + + $(NuspecProperties); + packageId=$(PackageId); + version=$(PackageVersion); + + + + diff --git a/src/fsharp/ErrorLogger.fs b/src/fsharp/ErrorLogger.fs index d29874bb0d..41be3768ed 100755 --- a/src/fsharp/ErrorLogger.fs +++ b/src/fsharp/ErrorLogger.fs @@ -596,15 +596,27 @@ let rec Iterate2D f xs ys = | h1 :: t1, h2::t2 -> f h1 h2 ++ (fun () -> Iterate2D f t1 t2) | _ -> failwith "Iterate2D" +/// Keep the warnings, propagate the error to the exception continuation. let TryD f g = match f() with - | ErrorResult(warns, err) -> (OkResult(warns, ())) ++ (fun () -> g err) + | ErrorResult(warns, err) -> + trackErrors { + do! OkResult(warns, ()) + return! g err + } | res -> res let rec RepeatWhileD ndeep body = body ndeep ++ (fun x -> if x then RepeatWhileD (ndeep+1) body else CompleteD) let AtLeastOneD f l = MapD f l ++ (fun res -> ResultD (List.exists id res)) +[] +module OperationResult = + let inline ignore (res: OperationResult<'a>) = + match res with + | OkResult(warnings, _) -> OkResult(warnings, ()) + | ErrorResult(warnings, err) -> ErrorResult(warnings, err) + // Code below is for --flaterrors flag that is only used by the IDE let stringThatIsAProxyForANewlineInFlatErrors = new System.String [|char 29 |] diff --git a/src/fsharp/ErrorResolutionHints.fs b/src/fsharp/ErrorResolutionHints.fs index e674adb6f4..20bcb13fd2 100644 --- a/src/fsharp/ErrorResolutionHints.fs +++ b/src/fsharp/ErrorResolutionHints.fs @@ -43,6 +43,7 @@ let FilterPredictions (idText:string) (suggestionF:ErrorLogger.Suggestions) = name |> Seq.forall (fun c -> c <> ' ') if allSuggestions.Contains idText then [] else // some other parsing error occurred + let dotIdText = "." + idText allSuggestions |> Seq.choose (fun suggestion -> // Because beginning a name with _ is used both to indicate an unused @@ -53,7 +54,7 @@ let FilterPredictions (idText:string) (suggestionF:ErrorLogger.Suggestions) = let suggestion:string = demangle suggestion let suggestedText = suggestion.ToUpperInvariant() let similarity = EditDistance.JaroWinklerDistance uppercaseText suggestedText - if similarity >= highConfidenceThreshold || suggestion.EndsWithOrdinal("." + idText) then + if similarity >= highConfidenceThreshold || suggestion.EndsWithOrdinal(dotIdText) then Some(similarity, suggestion) elif similarity < minThresholdForSuggestions && suggestedText.Length > minStringLengthForThreshold then None diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index 2f3eb3aafb..0d86ca58a0 100755 --- a/src/fsharp/ExtensionTyping.fs +++ b/src/fsharp/ExtensionTyping.fs @@ -428,7 +428,7 @@ module internal ExtensionTyping = member __.GetGenericArguments() = x.GetGenericArguments() |> ProvidedType.CreateArray ctxt member __.ApplyStaticArguments(provider: ITypeProvider, fullTypePathAfterArguments, staticArgs: obj[]) = provider.ApplyStaticArguments(x, fullTypePathAfterArguments, staticArgs) |> ProvidedType.Create ctxt - member __.IsVoid = (typeof.Equals(x)) + member __.IsVoid = (typeof.Equals(x) || (x.Namespace = "System" && x.Name = "Void")) member __.IsGenericParameter = x.IsGenericParameter member __.IsValueType = x.IsValueType member __.IsByRef = x.IsByRef diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 8293a709e5..cb5747f3c5 100755 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -440,6 +440,7 @@ parsParenFormIsForML,"In F# code you may use 'expr.[expr]'. A type annotation ma 602,parsUnmatched,"Unmatched '%s'" 603,parsUnmatchedBracketBar,"Unmatched '[|'" 604,parsUnmatchedBrace,"Unmatched '{{'" +605,parsUnmatchedBraceBar,"Unmatched '{{|'" 609,parsFieldBinding,"Field bindings must have the form 'id = expr;'" 610,parsMemberIllegalInObjectImplementation,"This member is not permitted in an object implementation" 611,parsMissingFunctionBody,"Missing function body" @@ -922,6 +923,7 @@ typeInfoProperty,"property" typeInfoExtension,"extension" typeInfoCustomOperation,"custom operation" typeInfoArgument,"argument" +typeInfoAnonRecdField,"anonymous record field" typeInfoPatternVariable,"patvar" typeInfoNamespace,"namespace" typeInfoModule,"module" @@ -1040,8 +1042,8 @@ lexHashBangMustBeFirstInFile,"#! may only appear as the first line at the start 1186,parsInvalidProperty,"Invalid property getter or setter" 1187,parsIndexerPropertyRequiresAtLeastOneArgument,"An indexer property must be given at least one argument" 1188,tastInvalidAddressOfMutableAcrossAssemblyBoundary,"This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation" -1189,parsNonAdjacentTypars,"Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\"" -1190,parsNonAdjacentTyargs,"Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\"" +1189,parsNonAdjacentTypars,"Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name." +1190,parsNonAdjacentTyargs,"Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name." parsNonAtomicType,"The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C'" # 1191,tastUndefinedTyconItemField,"The type %s did not contain the field '%s'" # 1192,tastUndefinedTyconItemUnionCase,"The type %s did not contain the union case '%s'" @@ -1293,7 +1295,10 @@ descriptionUnavailable,"(description unavailable...)" 3171,tcGeneratedTypesShouldBeInternalOrPrivate,"The provided types generated by this use of a type provider may not be used from other F# assemblies and should be marked internal or private. Consider using 'type internal TypeName = ...' or 'type private TypeName = ...'." 3172,chkGetterAndSetterHaveSamePropertyType,"A property's getter and setter must have the same type. Property '%s' has getter of type '%s' but setter of type '%s'." 3173,tcRuntimeSuppliedMethodCannotBeUsedInUserCode,"Array method '%s' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module." -3174,tcUnionCaseConstructorDoesNotHaveFieldWithGivenName,"Union case/exception '%s' does not have field named '%s'." +3174,tcUnionCaseConstructorDoesNotHaveFieldWithGivenName,"The union case '%s' does not have a field named '%s'." +3174,tcExceptionConstructorDoesNotHaveFieldWithGivenName,"The exception '%s' does not have a field named '%s'." +3174,tcActivePatternsDoNotHaveFields,"Active patterns do not have fields. This syntax is invalid." +3174,tcConstructorDoesNotHaveFieldWithGivenName,"The constructor does not have a field named '%s'." 3175,tcUnionCaseFieldCannotBeUsedMoreThanOnce,"Union case/exception field '%s' cannot be used more than once." 3176,tcFieldNameIsUsedModeThanOnce,"Named field '%s' is used more than once." 3176,tcFieldNameConflictsWithGeneratedNameForAnonymousField,"Named field '%s' conflicts with autogenerated name for anonymous field." @@ -1338,6 +1343,8 @@ tcGlobalsSystemTypeNotFound,"The system type '%s' was required but no referenced 3213,typrelMemberHasMultiplePossibleDispatchSlots,"The member '%s' matches multiple overloads of the same method.\nPlease restrict it to one of the following:%s." 3214,methodIsNotStatic,"Method or object constructor '%s' is not static" 3215,parsUnexpectedSymbolEqualsInsteadOfIn,"Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead?" +tcAnonRecdCcuMismatch,"Two anonymous record types are from different assemblies '%s' and '%s'" +tcAnonRecdFieldNameMismatch,"Two anonymous record types have mismatched sets of field names '%s' and '%s'" keywordDescriptionAbstract,"Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation." keyworkDescriptionAnd,"Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters." keywordDescriptionAs,"Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match." @@ -1370,7 +1377,7 @@ keywordDescriptionInterface,"Used to declare and implement interfaces." keywordDescriptionInternal,"Used to specify that a member is visible inside an assembly but not outside it." keywordDescriptionLazy,"Used to specify a computation that is to be performed only when a result is needed." keywordDescriptionLet,"Used to associate, or bind, a name to a value or function." -keywordDescriptionLetBang,"Used in asynchronous workflows to bind a name to the result of an asynchronous computation, or, in other computation expressions, used to bind a name to a result, which is of the computation type." +keywordDescriptionLetBang,"Used in computation expressions to bind a name to the result of another computation expression." keywordDescriptionMatch,"Used to branch by comparing a value to a pattern." keywordDescriptionMatchBang,"Used in computation expressions to pattern match directly over the result of another computation expression." keywordDescriptionMember,"Used to declare a property or method in an object type." @@ -1387,8 +1394,8 @@ keywordDescriptionOverride,"Used to implement a version of an abstract or virtua keywordDescriptionPrivate,"Restricts access to a member to code in the same type or module." keywordDescriptionPublic,"Allows access to a member from outside the type." keywordDescriptionRec,"Used to indicate that a function is recursive." -keywordDescriptionReturn,"Used to indicate a value to provide as the result of a computation expression." -keywordDescriptionReturnBang,"Used to indicate a computation expression that, when evaluated, provides the result of the containing computation expression." +keywordDescriptionReturn,"Used to provide a value for the result of the containing computation expression." +keywordDescriptionReturnBang,"Used to provide a value for the result of the containing computation expression, where that value itself comes from the result another computation expression." keywordDescriptionSelect,"Used in query expressions to specify what fields or columns to extract. Note that this is a contextual keyword, which means that it is not actually a reserved word and it only acts like a keyword in appropriate context." keywordDescriptionStatic,"Used to indicate a method or property that can be called without an instance of a type, or a value member that is shared among all instances of a type." keywordDescriptionStruct,"Used to declare a structure type. Also used in generic parameter constraints. Used for OCaml compatibility in module definitions." @@ -1397,8 +1404,8 @@ 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." keywordDescriptionType,"Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation." keywordDescriptionUpcast,"Used to convert to a type that is higher in the inheritance chain." -keywordDescriptionUse,"Used instead of let for values that require Dispose to be called to free resources." -keywordDescriptionUseBang,"Used instead of let! in asynchronous workflows and other computation expressions for values that require Dispose to be called to free resources." +keywordDescriptionUse,"Used instead of let for values that implement IDisposable"" +keywordDescriptionUseBang,"Used instead of let! in computation expressions for computation expression results that implement IDisposable." keywordDescriptionVal,"Used in a signature to indicate a value, or in a type to declare a member, in limited situations." keywordDescriptionVoid,"Indicates the .NET void type. Used when interoperating with other .NET languages." keywordDescriptionWhen,"Used for Boolean conditions (when guards) on pattern matches and to introduce a constraint clause for a generic type parameter." @@ -1431,12 +1438,20 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3226,tcByrefReturnImplicitlyDereferenced,"A byref pointer returned by a function or method is implicitly dereferenced as of F# 4.5. To acquire the return value as a pointer, use the address-of operator, e.g. '&f(x)' or '&obj.Method(arg1, arg2)'." 3227,tcByRefLikeNotStruct,"A type annotated with IsByRefLike must also be a struct. Consider adding the [] attribute to the type." 3228,chkNoByrefAddressOfValueFromExpression,"The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope." -3229,chkNoReturnOfLimitedSpan,"The Span or IsByRefLike expression cannot be returned from this function or method, because it is composed using elements that may escape their scope." -3230,chkNoWriteToLimitedSpan,"This value can't be assigned because the target '%s' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope." -3231,tastValueMustBeLocal,"A value defined in a module must be mutable in order to take its address, e.g. 'let mutable x = ...'" -3232,tcIsReadOnlyNotStruct,"A type annotated with IsReadOnly must also be a struct. Consider adding the [] attribute to the type." -3234,chkStructsMayNotReturnAddressesOfContents,"Struct members cannot return the address of fields of the struct by reference" -3235,chkNoByrefLikeFunctionCall,"The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope." -3236,chkNoSpanLikeVariable,"The Span or IsByRefLike variable '%s' cannot be used at this point. This is to ensure the address of the local value does not escape its scope." -3237,chkNoSpanLikeValueFromExpression,"A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope." -3238,tastCantTakeAddressOfExpression,"Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address." +3229,chkNoWriteToLimitedSpan,"This value can't be assigned because the target '%s' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope." +3230,tastValueMustBeLocal,"A value defined in a module must be mutable in order to take its address, e.g. 'let mutable x = ...'" +3231,tcIsReadOnlyNotStruct,"A type annotated with IsReadOnly must also be a struct. Consider adding the [] attribute to the type." +3232,chkStructsMayNotReturnAddressesOfContents,"Struct members cannot return the address of fields of the struct by reference" +3233,chkNoByrefLikeFunctionCall,"The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope." +3234,chkNoSpanLikeVariable,"The Span or IsByRefLike variable '%s' cannot be used at this point. This is to ensure the address of the local value does not escape its scope." +3235,chkNoSpanLikeValueFromExpression,"A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope." +3236,tastCantTakeAddressOfExpression,"Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address." +3237,tcCannotCallExtensionMethodInrefToByref,"Cannot call the byref extension method '%s. The first parameter requires the value to be mutable or a non-readonly byref type." +3238,tcByrefsMayNotHaveTypeExtensions,"Byref types are not allowed to have optional type extensions." +3239,tcCannotPartiallyApplyExtensionMethodForByref,"Cannot partially apply the extension method '%s' because the first parameter is a byref type." +3242,tcTypeDoesNotInheritAttribute,"This type does not inherit Attribute, it will not work correctly with other .NET languages." +3243,parsInvalidAnonRecdExpr,"Invalid anonymous record expression" +3244,parsInvalidAnonRecdType,"Invalid anonymous record type" +3245,tcCopyAndUpdateNeedsRecordType,"The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record" +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." diff --git a/src/fsharp/FSStrings.resx b/src/fsharp/FSStrings.resx index 5a99d5e9e7..05cd75cc66 100755 --- a/src/fsharp/FSStrings.resx +++ b/src/fsharp/FSStrings.resx @@ -396,6 +396,9 @@ symbol '[' + + symbol '{|' + symbol '[|' @@ -411,6 +414,9 @@ symbol '|]' + + symbol '|}' + symbol '>}' diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props new file mode 100644 index 0000000000..8093275dba --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props @@ -0,0 +1,11 @@ + + + + + + + netcoreapp2.1 + Microsoft.FSharp.Compiler.nuspec + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets new file mode 100644 index 0000000000..2721c93a90 --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets @@ -0,0 +1,18 @@ + + + + -rtm-$(NuGetPackageVersionSuffix) + $(FSPackageVersion)$(PreReleaseSuffix) + + + + + + + + + + + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj new file mode 100644 index 0000000000..692e5aba1b --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj @@ -0,0 +1,8 @@ + + + + Microsoft.FSharp.Compiler + true + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj new file mode 100644 index 0000000000..abb19e418f --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj @@ -0,0 +1,8 @@ + + + + Microsoft.FSharp.Compiler + false + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj new file mode 100644 index 0000000000..aaee9c7394 --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj @@ -0,0 +1,8 @@ + + + + Testing.FSharp.Compiler + true + + + diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index e78e41212d..9c38f26a2a 100755 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -//------------------------------------------------------------------------- -// Find unsolved, uninstantiated type variables -//------------------------------------------------------------------------- +/// Find unsolved, uninstantiated type variables module internal Microsoft.FSharp.Compiler.FindUnsolved open Microsoft.FSharp.Compiler @@ -16,24 +14,24 @@ open Microsoft.FSharp.Compiler.TypeRelations type env = Nix +/// The environment and collector type cenv = { g: TcGlobals amap: Import.ImportMap denv: DisplayEnv mutable unsolved: Typars } +/// Walk types, collecting type variables let accTy cenv _env ty = - (freeInType CollectTyparsNoCaching (tryNormalizeMeasureInType cenv.g ty)).FreeTypars |> Zset.iter (fun tp -> - if (tp.Rigidity <> TyparRigidity.Rigid) then - cenv.unsolved <- tp :: cenv.unsolved) + let normalizedTy = tryNormalizeMeasureInType cenv.g ty + (freeInType CollectTyparsNoCaching normalizedTy).FreeTypars |> Zset.iter (fun tp -> + if (tp.Rigidity <> TyparRigidity.Rigid) then + cenv.unsolved <- tp :: cenv.unsolved) let accTypeInst cenv env tyargs = - tyargs |> List.iter (accTy cenv env) + tyargs |> List.iter (accTy cenv env) -//-------------------------------------------------------------------------- -// walk exprs etc -//-------------------------------------------------------------------------- - +/// Walk expressions, collecting type variables let rec accExpr (cenv:cenv) (env:env) expr = let expr = stripExpr expr match expr with @@ -62,7 +60,6 @@ let rec accExpr (cenv:cenv) (env:env) expr = accTypeInst cenv env tyargs accExpr cenv env f accExprs cenv env argsl - // REVIEW: fold the next two cases together | Expr.Lambda(_,_ctorThisValOpt,_baseValOpt,argvs,_body,m,rty) -> let topValInfo = ValReprInfo ([],[argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)],ValReprInfo.unnamedRetVal) let ty = mkMultiLambdaTy m argvs rty @@ -136,6 +133,7 @@ and accLambdas cenv env topValInfo e ety = accExpr cenv env e and accExprs cenv env exprs = exprs |> List.iter (accExpr cenv env) + and accTargets cenv env m ty targets = Array.iter (accTarget cenv env m ty) targets and accTarget cenv env _m _ty (TTarget(_vs,e,_)) = accExpr cenv env e @@ -192,10 +190,6 @@ and accBind cenv env (bind:Binding) = and accBinds cenv env xs = xs |> List.iter (accBind cenv env) -//-------------------------------------------------------------------------- -// check tycons -//-------------------------------------------------------------------------- - let accTyconRecdField cenv env _tycon (rfield:RecdField) = accAttribs cenv env rfield.PropertyAttribs accAttribs cenv env rfield.FieldAttribs @@ -205,17 +199,12 @@ let accTycon cenv env (tycon:Tycon) = abstractSlotValsOfTycons [tycon] |> List.iter (accVal cenv env) tycon.AllFieldsArray |> Array.iter (accTyconRecdField cenv env tycon) if tycon.IsUnionTycon then (* This covers finite unions. *) - tycon.UnionCasesAsList |> List.iter (fun uc -> + tycon.UnionCasesArray |> Array.iter (fun uc -> accAttribs cenv env uc.Attribs - uc.RecdFields |> List.iter (accTyconRecdField cenv env tycon)) - + uc.RecdFieldsArray |> Array.iter (accTyconRecdField cenv env tycon)) let accTycons cenv env tycons = List.iter (accTycon cenv env) tycons -//-------------------------------------------------------------------------- -// check modules -//-------------------------------------------------------------------------- - let rec accModuleOrNamespaceExpr cenv env x = match x with | ModuleOrNamespaceExprWithSig(_mty, def, _m) -> accModuleOrNamespaceDef cenv env def @@ -231,7 +220,9 @@ and accModuleOrNamespaceDef cenv env x = | TMDefDo(e,_m) -> accExpr cenv env e | TMAbstract(def) -> accModuleOrNamespaceExpr cenv env def | TMDefs(defs) -> accModuleOrNamespaceDefs cenv env defs + and accModuleOrNamespaceBinds cenv env xs = List.iter (accModuleOrNamespaceBind cenv env) xs + and accModuleOrNamespaceBind cenv env x = match x with | ModuleOrNamespaceBinding.Binding bind -> accBind cenv env bind diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 496f4531e5..d027afabeb 100755 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -400,13 +400,15 @@ and GenTyAppAux amap m tyenv repr tinst = let ty = IL.instILType ilTypeInst ty ty | CompiledTypeRepr.ILAsmNamed (tref, boxity, ilTypeOpt) -> - match ilTypeOpt with - | None -> - let ilTypeInst = GenTypeArgsAux amap m tyenv tinst - mkILTy boxity (mkILTySpec (tref,ilTypeInst)) - | Some ilType -> - ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node + GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst +and GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst = + match ilTypeOpt with + | None -> + let ilTypeInst = GenTypeArgsAux amap m tyenv tinst + mkILTy boxity (mkILTySpec (tref,ilTypeInst)) + | Some ilType -> + ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = let g = amap.g @@ -439,6 +441,10 @@ and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = | TType_tuple (tupInfo, args) -> GenTypeAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) | TType_fun (dty, returnTy) -> EraseClosures.mkILFuncTy g.ilxPubCloEnv (GenTypeArgAux amap m tyenv dty) (GenTypeArgAux amap m tyenv returnTy) + | TType_anon (anonInfo, tinst) -> + let tref = anonInfo.ILTypeRef + let boxity = if evalAnonInfoIsStruct anonInfo then ILBoxity.AsValue else ILBoxity.AsObject + GenILTyAppAux amap m tyenv (tref, boxity, None) tinst | TType_ucase (ucref, args) -> let cuspec,idx = GenUnionCaseSpec amap m tyenv ucref args @@ -471,8 +477,8 @@ and GenUnionRef (amap: ImportMap) m (tcref: TyconRef) = let tycon = tcref.Deref assert(not tycon.IsTypeAbbrev) match tycon.UnionTypeInfo with - | None -> failwith "GenUnionRef m" - | Some funion -> + | ValueNone -> failwith "GenUnionRef m" + | ValueSome funion -> cached funion.CompiledRepresentation (fun () -> let tyenvinner = TypeReprEnv.ForTycon tycon match tcref.CompiledRepresentation with @@ -541,14 +547,7 @@ and GenParamTypes amap m tyenv isSlotSig tys = tys |> List.map (GenParamType amap m tyenv isSlotSig) and GenTypeArgs amap m tyenv tyargs = GenTypeArgsAux amap m tyenv tyargs - -let GenericParamHasConstraint (gp: ILGenericParameterDef) = - gp.Constraints.Length <> 0 || - gp.Variance <> NonVariant || - gp.HasReferenceTypeConstraint || - gp.HasNotNullableValueTypeConstraint || - gp.HasDefaultConstructorConstraint - +and GenTypePermitVoidAux amap m tyenv ty = GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty // Static fields generally go in a private InitializationCodeAndBackingFields section. This is to ensure all static // fields are initialized only in their class constructors (we generate one primary @@ -580,8 +579,7 @@ let GenRecdFieldRef m cenv tyenv (rfref:RecdFieldRef) tyargs = GenType cenv.amap m tyenvinner rfref.RecdField.FormalType) let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] - - + //-------------------------------------------------------------------------- // Closure summaries //-------------------------------------------------------------------------- @@ -642,7 +640,7 @@ type ValStorage = | Arg of int /// Indicates that the value is stored in local of the method being generated. NamedLocalIlxClosureInfo is normally empty. /// It is non-empty for 'local type functions', see comments on definition of NamedLocalIlxClosureInfo. - | Local of int * NamedLocalIlxClosureInfo ref option + | Local of idx: int * realloc: bool * NamedLocalIlxClosureInfo ref option and OptionalShadowLocal = | NoShadowLocal @@ -739,8 +737,8 @@ let AddStorageForVal (g: TcGlobals) (v,s) eenv = // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can // still be resolved. match tryRescopeVal g.fslibCcu Remap.Empty v with - | None -> eenv - | Some vref -> + | ValueNone -> eenv + | ValueSome vref -> match vref.TryDeref with | ValueNone -> //let msg = sprintf "could not dereference external value reference to something in FSharp.Core.dll during code generation, v.MangledName = '%s', v.Range = %s" v.MangledName (stringOfRange v.Range) @@ -766,7 +764,7 @@ let StorageForVal m v eenv = try eenv.valsInScope.[v] with :? KeyNotFoundException -> assert false - errorR(Error(FSComp.SR.ilUndefinedValue(showL(vspecAtBindL v)),m)) + errorR(Error(FSComp.SR.ilUndefinedValue(showL(valAtBindL v)),m)) notlazy (Arg 668(* random value for post-hoc diagnostic analysis on generated tree *) ) v.Force() @@ -860,7 +858,6 @@ let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, else generate() - let IsValCompiledAsMethod g (v:Val) = match v.ValReprInfo with | None -> false @@ -1029,7 +1026,7 @@ and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = let cloc = CompLocForFragment fragName ccu let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) - (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname,_,mexpr,_,_)) -> + (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> let cloc = { cloc with clocTopImplQualifiedName = qname.Text } if isIncrementalFragment then match mexpr with @@ -1166,7 +1163,7 @@ and TypeDefsBuilder() = || not tdef.Fields.AsList.IsEmpty || not tdef.Events.AsList.IsEmpty || not tdef.Properties.AsList.IsEmpty - || not tdef.Methods.AsList.IsEmpty then + || not (Array.isEmpty tdef.Methods.AsArray) then yield tdef ] member b.FindTypeDefBuilder(nm) = @@ -1183,14 +1180,20 @@ and TypeDefsBuilder() = let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) +type AnonTypeGenerationTable() = + let dict = Dictionary(HashIdentity.Structural) + member __.Table = dict + /// Assembly generation buffers -type AssemblyBuilder(cenv:cenv) as mgbuf = +type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = // The Abstract IL table of types let gtdefs= new TypeDefsBuilder() // The definitions of top level values, as quotations. - let mutable reflectedDefinitions : System.Collections.Generic.Dictionary = System.Collections.Generic.Dictionary(HashIdentity.Reference) + let mutable reflectedDefinitions : Dictionary = Dictionary(HashIdentity.Reference) + let mutable extraBindingsToGenerate = [] + // A memoization table for generating value types for big constant arrays - let vtgenerator= + let rawDataValueTypeGenerator = new MemoizationTable<(CompileLocation * int) , ILTypeSpec> ((fun (cloc,size) -> let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes @@ -1202,6 +1205,129 @@ type AssemblyBuilder(cenv:cenv) as mgbuf = vtspec), keyComparer=HashIdentity.Structural) + let generateAnonType genToStringMethod (isStruct, ilTypeRef, nms) = + + let flds = [ for (i,nm) in Array.indexed nms -> (nm, nm + "@", ILType.TypeVar (uint16 i)) ] + // Note that this alternative below would give the same names as C#, but the generated + // comparison/equality doesn't know about these names. + //let flds = [ for (i,nm) in Array.indexed nms -> (nm, "<" + nm + ">" + "i__Field", ILType.TypeVar (uint16 i)) ] + + let ilGenericParams = + [ for nm in nms -> + { Name = sprintf "<%s>j__TPar" nm + Constraints = [] + Variance=NonVariant + CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs + HasReferenceTypeConstraint=false + HasNotNullableValueTypeConstraint=false + HasDefaultConstructorConstraint= false + MetadataIndex = NoMetadataIdx } ] + + let ilTy = mkILFormalNamedTy (if isStruct then ILBoxity.AsValue else ILBoxity.AsObject) ilTypeRef ilGenericParams + + // Generate the IL fields + let ilFieldDefs = + mkILFields + [ for (_, fldName, fldTy) in flds -> + let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) + fdef.With(customAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ]) ] + + // Generate property definitions for the fields compiled as properties + let ilProperties = + mkILProperties + [ for (i,(propName, _fldName, fldTy)) in List.indexed flds -> + ILPropertyDef(name=propName, + attributes=PropertyAttributes.None, + setMethod=None, + getMethod=Some(mkILMethRef(ilTypeRef,ILCallingConv.Instance,"get_" + propName,0,[],fldTy )), + callingConv=ILCallingConv.Instance.ThisConv, + propertyType=fldTy, + init= None, + args=[], + customAttrs=mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ]) ] + + let ilMethods = + [ for (propName, fldName, fldTy) in flds -> + mkLdfldMethodDef ("get_" + propName,ILMemberAccess.Public,false,ilTy,fldName,fldTy) + yield! genToStringMethod ilTy ] + + let ilBaseTy = (if isStruct then cenv.g.iltyp_ValueType else cenv.g.ilg.typ_Object) + + let ilCtorDef = mkILSimpleStorageCtorWithParamNames(None, (if isStruct then None else Some ilBaseTy.TypeSpec), ilTy, [], flds, ILMemberAccess.Public) + let ilCtorRef = mkRefToILMethod(ilTypeRef, ilCtorDef) + let ilMethodRefs = [| for mdef in ilMethods -> mkRefToILMethod(ilTypeRef, mdef) |] + + if ilTypeRef.Scope.IsLocalRef then + + // Create a tycon that looks exactly like a record definition, to help drive the generation of equality/comparison code + let m = range0 + let tps = + [ for nm in nms -> + let stp = Typar(mkSynId m ("T"+nm),TyparStaticReq.NoStaticReq,true) + NewTypar (TyparKind.Type, TyparRigidity.WarnIfNotRigid,stp,false,TyparDynamicReq.Yes,[],true,true) ] + + let tycon = + let lmtyp = MaybeLazy.Strict (NewEmptyModuleOrNamespaceType ModuleOrType) + let cpath = CompPath(ilTypeRef.Scope,[]) + NewTycon(Some cpath, ilTypeRef.Name, m, taccessPublic, taccessPublic, TyparKind.Type, LazyWithContext.NotLazy tps, XmlDoc.Empty, false, false, false, lmtyp) + + if isStruct then + tycon.SetIsStructRecordOrUnion(true) + + tycon.entity_tycon_repr <- + TRecdRepr (MakeRecdFieldsTable + [ for (tp, (propName, _fldName, _fldTy)) in (List.zip tps flds) -> + NewRecdField false None (mkSynId m propName) false (mkTyparTy tp) true false [] [] XmlDoc.Empty taccessPublic false ]) + + let tcref = mkLocalTyconRef tycon + let _,typ = generalizeTyconRef tcref + let tcaug = tcref.TypeContents + + tcaug.tcaug_interfaces <- + [ (cenv.g.mk_IStructuralComparable_ty,true,m) + (cenv.g.mk_IComparable_ty,true,m) + (mkAppTy cenv.g.system_GenericIComparable_tcref [typ],true,m) + (cenv.g.mk_IStructuralEquatable_ty,true,m) + (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ],true,m) ] + + let vspec1,vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref + let evspec1,evspec2,evspec3 = AugmentWithHashCompare.MakeValsForEqualityWithComparerAugmentation cenv.g tcref + let cvspec1,cvspec2 = AugmentWithHashCompare.MakeValsForCompareAugmentation cenv.g tcref + let cvspec3 = AugmentWithHashCompare.MakeValsForCompareWithComparerAugmentation cenv.g tcref + + tcaug.SetCompare (mkLocalValRef cvspec1, mkLocalValRef cvspec2) + tcaug.SetCompareWith (mkLocalValRef cvspec3) + tcaug.SetEquals (mkLocalValRef vspec1, mkLocalValRef vspec2) + tcaug.SetHashAndEqualsWith (mkLocalValRef evspec1, mkLocalValRef evspec2, mkLocalValRef evspec3) + + // Build the ILTypeDef. We don't rely on the normal record generation process because we want very specific field names + + let ilTypeDefAttribs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute; mkCompilationMappingAttr cenv.g (int SourceConstructFlags.RecordType) ] + + let ilInterfaceTys = [ for (ity,_,_) in tcaug.tcaug_interfaces -> GenType cenv.amap m (TypeReprEnv.ForTypars tps) ity ] + + let ilTypeDef = + mkILGenericClass (ilTypeRef.Name, ILTypeDefAccess.Public, ilGenericParams, ilBaseTy, ilInterfaceTys, + mkILMethods (ilCtorDef :: ilMethods), ilFieldDefs, emptyILTypeDefs, + ilProperties, mkILEvents [], ilTypeDefAttribs, + ILTypeInit.BeforeField) + + let ilTypeDef = ilTypeDef.WithSealed(true).WithSerializable(true) + + mgbuf.AddTypeDef(ilTypeRef, ilTypeDef, false, true, None) + + let extraBindings = + [ yield! AugmentWithHashCompare.MakeBindingsForCompareAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForCompareWithComparerAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForEqualityWithComparerAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForEqualsAugmentation cenv.g tycon ] + + let optimizedExtraBindings = extraBindings |> List.map (fun (TBind(a,b,c)) -> TBind(a,cenv.optimizeDuringCodeGen b,c)) + + extraBindingsToGenerate <- optimizedExtraBindings @ extraBindingsToGenerate + + (ilCtorRef,ilMethodRefs,ilTy) + let mutable explicitEntryPointInfo : ILTypeRef option = None /// static init fields on script modules. @@ -1221,14 +1347,32 @@ type AssemblyBuilder(cenv:cenv) as mgbuf = scriptInitFspecs |> List.iter IntializeCompiledScript | None -> () - - member mgbuf.GenerateRawDataValueType(cloc,size) = // Byte array literals require a ValueType of size the required number of bytes. // With fsi.exe, S.R.Emit TypeBuilder CreateType has restrictions when a ValueType VT is nested inside a type T, and T has a field of type VT. // To avoid this situation, these ValueTypes are generated under the private implementation rather than in the current cloc. [was bug 1532]. let cloc = CompLocForPrivateImplementationDetails cloc - vtgenerator.Apply((cloc,size)) + rawDataValueTypeGenerator.Apply((cloc,size)) + + member mgbuf.GenerateAnonType(genToStringMethod, anonInfo:AnonRecdTypeInfo) = + let isStruct = evalAnonInfoIsStruct anonInfo + let key = anonInfo.Stamp + match anonTypeTable.Table.TryGetValue key with + | true, res -> res + | _ -> + let info = generateAnonType genToStringMethod (isStruct,anonInfo.ILTypeRef,anonInfo.SortedNames) + anonTypeTable.Table.[key] <- info + info + + member mgbuf.LookupAnonType(anonInfo:AnonRecdTypeInfo) = + match anonTypeTable.Table.TryGetValue anonInfo.Stamp with + | true, res -> res + | _ -> failwithf "the anonymous record %A has not been generated in the pre-phase of generating this module" anonInfo.ILTypeRef + + member mgbuf.GrabExtraBindingsToGenerate() = + let result = extraBindingsToGenerate + extraBindingsToGenerate <- [] + result member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) @@ -1281,7 +1425,6 @@ type AssemblyBuilder(cenv:cenv) as mgbuf = member mgbuf.cenv = cenv member mgbuf.GetExplicitEntryPointInfo() = explicitEntryPointInfo - /// Record the types of the things on the evaluation stack. /// Used for the few times we have to flush the IL evaluation stack and to compute maxStack. @@ -1303,8 +1446,7 @@ let FeeFeeInstr (cenv:cenv) doc = type CodeGenBuffer(m:range, mgbuf: AssemblyBuilder, methodName, - alreadyUsedArgs:int, - alreadyUsedLocals:int) = + alreadyUsedArgs:int) = let locals = new ResizeArray<((string * (Mark * Mark)) list * ILType * bool)>(10) let codebuf = new ResizeArray(200) @@ -1466,16 +1608,13 @@ type CodeGenBuffer(m:range, j member cgbuf.ReallocLocal(cond,ranges,ty,isFixed) = - let j = - match ResizeArray.tryFindIndexi cond locals with - | Some j -> - let (prevRanges,_,isFixed) = locals.[j] - locals.[j] <- ((ranges@prevRanges),ty,isFixed) - j - | None -> - cgbuf.AllocLocal(ranges,ty,isFixed) - let j = j + alreadyUsedLocals - j + match ResizeArray.tryFindIndexi cond locals with + | Some j -> + let (prevRanges,_,isFixed) = locals.[j] + locals.[j] <- ((ranges@prevRanges),ty,isFixed) + j, true + | None -> + cgbuf.AllocLocal(ranges,ty,isFixed), false member cgbuf.Close() = @@ -1581,8 +1720,8 @@ let discardAndReturnVoid = DiscardThen ReturnVoid // the bodies of methods in a couple of places //------------------------------------------------------------------------- -let CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,alreadyUsedLocals,codeGenFunction,m) = - let cgbuf = new CodeGenBuffer(m,mgbuf,methodName,alreadyUsedArgs,alreadyUsedLocals) +let CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,codeGenFunction,m) = + let cgbuf = new CodeGenBuffer(m,mgbuf,methodName,alreadyUsedArgs) let start = CG.GenerateMark cgbuf "mstart" let innerVals = entryPointInfo |> List.map (fun (v,kind) -> (v,(kind,start))) @@ -1625,10 +1764,10 @@ let CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,alrea localDebugSpecs, hasSequencePoints) -let CodeGenMethod cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,alreadyUsedLocals,codeGenFunction,m) = +let CodeGenMethod cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,codeGenFunction,m) = let locals,maxStack,lab2pc,instrs,exns,localDebugSpecs,hasSequencePoints = - CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,alreadyUsedLocals,codeGenFunction,m) + CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,codeGenFunction,m) let code = IL.buildILCode methodName lab2pc instrs exns localDebugSpecs @@ -1899,13 +2038,17 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = | Expr.Val(v,_,m) -> GenGetVal cenv cgbuf eenv (v,m) sequel | Expr.Op(op,tyargs,args,m) -> - begin match op,args,tyargs with + match op,args,tyargs with | TOp.ExnConstr(c),_,_ -> GenAllocExn cenv cgbuf eenv (c,args,m) sequel | TOp.UnionCase(c),_,_ -> GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel | TOp.Recd(isCtor,tycon),_,_ -> GenAllocRecd cenv cgbuf eenv isCtor (tycon,tyargs,args,m) sequel + | TOp.AnonRecd(anonInfo),_,_ -> + GenAllocAnonRecd cenv cgbuf eenv (anonInfo,tyargs,args,m) sequel + | TOp.AnonRecdGet (anonInfo,n),[e],_ -> + GenGetAnonRecdField cenv cgbuf eenv (anonInfo,e,tyargs,n,m) sequel | TOp.TupleFieldGet (tupInfo,n),[e],_ -> GenGetTupleField cenv cgbuf eenv (tupInfo,e,tyargs,n,m) sequel | TOp.ExnFieldGet(ecref,n),[e],_ -> @@ -1985,7 +2128,6 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = cgbuf.SetMarkToHere (Mark label) GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel | _ -> error(InternalError("Unexpected operator node expression",expr.Range)) - end | Expr.StaticOptimization(constraints,e2,e3,m) -> GenStaticOptimization cenv cgbuf eenv (constraints,e2,e3,m) sequel | Expr.Obj(_,ty,_,_,[meth],[],m) when isDelegateTy cenv.g ty -> @@ -2000,9 +2142,9 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = and GenExprs cenv cgbuf eenv es = List.iter (fun e -> GenExpr cenv cgbuf eenv SPSuppress e Continue) es -and CodeGenMethodForExpr cenv mgbuf (spReq,entryPointInfo,methodName,eenv,alreadyUsedArgs,alreadyUsedLocals,expr0,sequel0) = +and CodeGenMethodForExpr cenv mgbuf (spReq,entryPointInfo,methodName,eenv,alreadyUsedArgs,expr0,sequel0) = let _,code = - CodeGenMethod cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,alreadyUsedLocals, + CodeGenMethod cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs, (fun cgbuf eenv -> GenExpr cenv cgbuf eenv spReq expr0 sequel0), expr0.Range) code @@ -2230,6 +2372,24 @@ and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = (mkILCtorMethSpecForTy (ty,relevantFields |> List.map (fun f -> GenType cenv.amap m tyenvinner f.FormalType) ))) GenSequel cenv eenv.cloc cgbuf sequel +and GenAllocAnonRecd cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, tyargs, args, m) sequel = + let anonCtor, _anonMethods, anonType = cgbuf.mgbuf.LookupAnonType(anonInfo) + let boxity = anonType.Boxity + GenExprs cenv cgbuf eenv args + let ilTypeArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs + let anonTypeWithInst = mkILTy boxity (mkILTySpec(anonType.TypeSpec.TypeRef,ilTypeArgs)) + CG.EmitInstr cgbuf (pop args.Length) (Push [anonTypeWithInst]) (mkNormalNewobj (mkILMethSpec(anonCtor,boxity,ilTypeArgs,[]))) + GenSequel cenv eenv.cloc cgbuf sequel + +and GenGetAnonRecdField cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, e, tyargs, n, m) sequel = + let _anonCtor, anonMethods, anonType = cgbuf.mgbuf.LookupAnonType(anonInfo) + let boxity = anonType.Boxity + let ilTypeArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs + let anonMethod = anonMethods.[n] + let anonFieldType = ilTypeArgs.[n] + GenExpr cenv cgbuf eenv SPSuppress e Continue + CG.EmitInstr cgbuf (pop 1) (Push [anonFieldType]) (mkNormalCall (mkILMethSpec(anonMethod,boxity,ilTypeArgs,[]))) + GenSequel cenv eenv.cloc cgbuf sequel and GenNewArraySimple cenv cgbuf eenv (elems,elemTy,m) sequel = let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy @@ -2685,7 +2845,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = // Only save arguments that have effects if Optimizer.ExprHasEffect cenv.g laterArg then let ilTy = laterArg |> tyOfExpr cenv.g |> GenType cenv.amap m eenv.tyenv - let loc,eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("arg",m), ilTy, false) scopeMarks + let loc, _realloc, eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("arg",m), ilTy, false) scopeMarks GenExpr cenv cgbuf eenv SPSuppress laterArg Continue EmitSetLocal cgbuf loc Choice1Of2 (ilTy,loc),eenv @@ -2841,7 +3001,7 @@ and GenTry cenv cgbuf eenv scopeMarks (e1,m,resty,spTry) = let afterHandler = CG.GenerateDelayMark cgbuf "afterHandler" let eenvinner = {eenvinner with withinSEH = true} let ilResultTy = GenType cenv.amap m eenvinner.tyenv resty - let whereToSave,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres",m),ilResultTy, false) (startTryMark,endTryMark) + let whereToSave, _realloc, eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres",m),ilResultTy, false) (startTryMark,endTryMark) // Generate the body of the try. In the normal case (SequencePointAtTry) we generate a sequence point // both on the 'try' keyword and on the start of the expression in the 'try'. For inlined code and @@ -3001,7 +3161,7 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = let finishIdx,eenvinner = if isFSharpStyle then - let v,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("endLoop",m), cenv.g.ilg.typ_Int32, false) (start,finish) + let v, _realloc, eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("endLoop",m), cenv.g.ilg.typ_Int32, false) (start,finish) v, eenvinner else -1,eenvinner @@ -3394,7 +3554,7 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = let ilTy = GenTypeOfVal cenv eenv vspec let storage = StorageForValRef m v eenv match storage with - | Local (idx,None) -> + | Local (idx, _, None) -> CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ I_ldloca (uint16 idx) ] | Arg idx -> CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 idx) ] @@ -3404,7 +3564,7 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = EmitGetStaticFieldAddr cgbuf ilTy fspec | Env (_,_,ilField,_) -> CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ mkLdarg0; mkNormalLdflda ilField ] - | Local (_,Some _) | StaticProperty _ | Method _ | Env _ | Null -> + | Local (_, _, Some _) | StaticProperty _ | Method _ | Env _ | Null -> errorR(Error(FSComp.SR.ilAddressOfValueHereIsInvalid(v.DisplayName),m)) CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 669 (* random value for post-hoc diagnostic analysis on generated tree *) ) ] ; @@ -3429,32 +3589,33 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) AI_ldnull else match tryDestAppTy cenv.g ty with - | Some tcref when (tyconRefEq cenv.g cenv.g.system_SByte_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Int16_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Int32_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Bool_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Byte_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Char_tcref tcref || - tyconRefEq cenv.g cenv.g.system_UInt16_tcref tcref || - tyconRefEq cenv.g cenv.g.system_UInt32_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_SByte_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Int16_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Int32_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Bool_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Byte_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Char_tcref tcref || + tyconRefEq cenv.g cenv.g.system_UInt16_tcref tcref || + tyconRefEq cenv.g cenv.g.system_UInt32_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) iLdcZero - | Some tcref when (tyconRefEq cenv.g cenv.g.system_Int64_tcref tcref || - tyconRefEq cenv.g cenv.g.system_UInt64_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Int64_tcref tcref || + tyconRefEq cenv.g cenv.g.system_UInt64_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcInt64 0L) - | Some tcref when (tyconRefEq cenv.g cenv.g.system_Single_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Single_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcSingle 0.0f) - | Some tcref when (tyconRefEq cenv.g cenv.g.system_Double_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Double_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcDouble 0.0) | _ -> let ilTy = GenType cenv.amap m eenv.tyenv ty LocalScope "ilzero" cgbuf (fun scopeMarks -> - let locIdx, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default",m), ilTy, false) scopeMarks + let locIdx, realloc, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default",m), ilTy, false) scopeMarks // "initobj" (Generated by EmitInitLocal) doesn't work on byref types // But ilzero(&ty) only gets generated in the built-in get-address function so // we can just rely on zeroinit of all IL locals. - match ilTy with - | ILType.Byref _ -> () - | _ -> EmitInitLocal cgbuf ilTy locIdx + if realloc then + match ilTy with + | ILType.Byref _ -> () + | _ -> EmitInitLocal cgbuf ilTy locIdx EmitGetLocal cgbuf ilTy locIdx ) @@ -3599,7 +3760,7 @@ and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = // Args are stored starting at #1 let eenvForMeth = AddStorageForLocalVals cenv.g (methodParams |> List.mapi (fun i v -> (v,Arg i))) eenvUnderTypars - let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],nameOfOverridenMethod,eenvForMeth,0,0,methodBodyExpr,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) + let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],nameOfOverridenMethod,eenvForMeth,0,methodBodyExpr,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) let nameOfOverridingMethod,methodImplGenerator = GenMethodImpl cenv eenvinner (useMethodImpl,slotsig) methodBodyExpr.Range @@ -3635,8 +3796,7 @@ and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overri let ilTyForOverriding = mkILBoxedTy ilCloTypeRef ilCloGenericActuals let eenvinner = bindBaseOrThisVarOpt cenv eenvinner baseValOpt - let ilCtorBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],cloName,eenvinner,1,0,basecall,discardAndReturnVoid) - + let ilCtorBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],cloName,eenvinner,1,basecall,discardAndReturnVoid) let genMethodAndOptionalMethodImpl tmethod useMethodImpl = [ for ((useMethodImpl,methodImplGeneratorFunction,methTyparsOfOverridingMethod),mdef) in GenObjectMethod cenv eenvinner cgbuf useMethodImpl tmethod do @@ -3673,7 +3833,7 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V // pretend that the state variables are bound let eenvouter = - eenvouter |> AddStorageForLocalVals cenv.g (stateVars |> List.map (fun v -> v.Deref,Local(0,None))) + eenvouter |> AddStorageForLocalVals cenv.g (stateVars |> List.map (fun v -> v.Deref, Local(0, false, None))) // Get the free variables. Make a lambda to pretend that the 'nextEnumeratorValRef' is bound (it is an argument to GenerateNext) let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilCloTypeRef:ILTypeRef,ilCloFreeVars,eenvinner) = @@ -3697,15 +3857,9 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V let getFreshMethod = let _,mbody = - CodeGenMethod cenv cgbuf.mgbuf ([],"GetFreshEnumerator",eenvinner,1,0, + CodeGenMethod cenv cgbuf.mgbuf ([],"GetFreshEnumerator",eenvinner,1, (fun cgbuf eenv -> for fv in cloFreeVars do -(* TODO: Emit CompareExchange - if (System.Threading.Interlocked.CompareExchange(&__state, 1, 0) = 0) then - (x :> IEnumerator<'T>) - else - ... -*) /// State variables always get zero-initialized if stateVarsSet.Contains fv then GenDefaultValue cenv cgbuf eenv (fv.Type,m) @@ -3720,22 +3874,22 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V let closeMethod = // Note: We suppress the first sequence point in the body of this method since it is the initial state machine jump let spReq = SPSuppress - mkILNonGenericVirtualMethod("Close",ILMemberAccess.Public, [], mkILReturn ILType.Void, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"Close",eenvinner,1,0,closeExpr,discardAndReturnVoid))) + mkILNonGenericVirtualMethod("Close",ILMemberAccess.Public, [], mkILReturn ILType.Void, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"Close",eenvinner,1,closeExpr,discardAndReturnVoid))) let checkCloseMethod = // Note: We suppress the first sequence point in the body of this method since it is the initial state machine jump let spReq = SPSuppress - mkILNonGenericVirtualMethod("get_CheckClose",ILMemberAccess.Public, [], mkILReturn cenv.g.ilg.typ_Bool, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"get_CheckClose",eenvinner,1,0,checkCloseExpr,Return))) + mkILNonGenericVirtualMethod("get_CheckClose",ILMemberAccess.Public, [], mkILReturn cenv.g.ilg.typ_Bool, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"get_CheckClose",eenvinner,1,checkCloseExpr,Return))) let generateNextMethod = // Note: We suppress the first sequence point in the body of this method since it is the initial state machine jump let spReq = SPSuppress // the 'next enumerator' byref arg is at arg position 1 let eenvinner = eenvinner |> AddStorageForLocalVals cenv.g [ (nextEnumeratorValRef.Deref, Arg 1) ] - mkILNonGenericVirtualMethod("GenerateNext",ILMemberAccess.Public, [mkILParamNamed("next",ILType.Byref ilCloEnumerableTy)], mkILReturn cenv.g.ilg.typ_Int32, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"GenerateNext",eenvinner,2,0,generateNextExpr,Return))) + mkILNonGenericVirtualMethod("GenerateNext",ILMemberAccess.Public, [mkILParamNamed("next",ILType.Byref ilCloEnumerableTy)], mkILReturn cenv.g.ilg.typ_Int32, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"GenerateNext",eenvinner,2,generateNextExpr,Return))) let lastGeneratedMethod = - mkILNonGenericVirtualMethod("get_LastGenerated",ILMemberAccess.Public, [], mkILReturn ilCloSeqElemTy, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (SPSuppress,[],"get_LastGenerated",eenvinner,1,0,exprForValRef m currvref,Return))) + mkILNonGenericVirtualMethod("get_LastGenerated",ILMemberAccess.Public, [], mkILReturn ilCloSeqElemTy, MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (SPSuppress,[],"get_LastGenerated",eenvinner,1,exprForValRef m currvref,Return))) |> AddNonUserCompilerGeneratedAttribs cenv.g let ilCtorBody = @@ -3802,13 +3956,14 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr | Expr.Lambda (_,_,_,_,_,m,_) | Expr.TyLambda(_,_,_,m,_) -> - let cloinfo,body,eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr + let cloinfo,body,eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr let entryPointInfo = match selfv with | Some v -> [(v, BranchCallClosure (cloinfo.cloArityInfo))] | _ -> [] - let ilCloBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,entryPointInfo,cloinfo.cloName,eenvinner,1,0,body,Return) + + let ilCloBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,entryPointInfo,cloinfo.cloName,eenvinner,1,body,Return) let ilCloTypeRef = cloinfo.cloSpec.TypeRef let cloTypeDefs = if isLocalTypeFunc then @@ -3869,7 +4024,7 @@ and GenTypeOfVal cenv eenv (v:Val) = and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = match StorageForVal m fv eenvouter with // Local type functions - | Local(_,Some _) | Env(_,_,_,Some _) -> cenv.g.ilg.typ_Object + | Local(_, _, Some _) | Env(_,_,_,Some _) -> cenv.g.ilg.typ_Object #if DEBUG // Check for things that should never make it into the free variable set. Only do this in debug for performance reasons | (StaticField _ | StaticProperty _ | Method _ | Null) -> error(InternalError("GenFreevar: compiler error: unexpected unrealized value",fv.Range)) @@ -3957,7 +4112,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = (cloFreeVars,ilCloFreeVars) ||> List.mapi2 (fun i v fv -> let localCloInfo = match StorageForVal m v eenvouter with - | Local(_,localCloInfo) + | Local(_, _, localCloInfo) | Env(_,_,_,localCloInfo) -> localCloInfo | _ -> None let ilField = mkILFieldSpecInTy (ilCloTyInner,fv.fvName,fv.fvType) @@ -3971,7 +4126,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,cloFreeTyvars,cloFreeVars,ilCloTypeRef,Array.ofList ilCloFreeVars,eenvinner) -and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = +and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let returnTy = match expr with | Expr.Lambda (_,_,_,_,_,_,returnTy) | Expr.TyLambda(_,_,_,_,returnTy) -> returnTy @@ -4171,7 +4326,7 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega let ilDelegeeParams,ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs let envForDelegeeMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v,Arg (i+numthis))) tmvs) envForDelegeeUnderTypars - let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],delegeeMethName,envForDelegeeMeth,1,0,body,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) + let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],delegeeMethName,envForDelegeeMeth,1,body,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) let delegeeInvokeMeth = mkILNonGenericInstanceMethod (delegeeMethName,ILMemberAccess.Assembly, @@ -4625,7 +4780,7 @@ and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec:IlxClosureSpec,e,ilField:ILFieldS GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStfld (mkILFieldSpec(ilField.FieldRef,ilxCloSpec.ILType)) ] -and GenLetRecBindings cenv cgbuf eenv (allBinds: Bindings,m) = +and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings,m) = // Fix up recursion for non-toplevel recursive bindings let bindsPossiblyRequiringFixup = allBinds |> List.filter (fun b -> @@ -4772,7 +4927,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta cgbuf.mgbuf.AddOrMergePropertyDef(ilGetterMethSpec.MethodRef.DeclaringTypeRef, ilPropDef,m) let ilMethodDef = - let ilMethodBody = MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPSuppress, [], ilGetterMethSpec.Name, eenv, 0, 0, rhsExpr, Return)) + let ilMethodBody = MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPSuppress, [], ilGetterMethSpec.Name, eenv, 0, rhsExpr, Return)) (mkILStaticMethod ([], ilGetterMethSpec.Name, access, [], mkILReturn ilTy, ilMethodBody)).WithSpecialName |> AddNonUserCompilerGeneratedAttribs cenv.g @@ -4865,9 +5020,15 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta GenSetStorage m cgbuf storage | _ -> - GenBindingRhs cenv cgbuf eenv SPSuppress vspec rhsExpr - CommitStartScope cgbuf startScopeMarkOpt - GenStoreVal cgbuf eenv vspec.Range vspec + let storage = StorageForVal m vspec eenv + match storage, rhsExpr with + // locals are zero-init, no need to initialize them + | Local (_, realloc, _), Expr.Const(Const.Zero,_,_) when not realloc -> + CommitStartScope cgbuf startScopeMarkOpt + | _ -> + GenBindingRhs cenv cgbuf eenv SPSuppress vspec rhsExpr + CommitStartScope cgbuf startScopeMarkOpt + GenStoreVal cgbuf eenv vspec.Range vspec //------------------------------------------------------------------------- // Generate method bindings @@ -5115,28 +5276,35 @@ and ComputeFlagFixupsForMemberBinding cenv (v:Val,memberInfo:ValMemberInfo) = else memberInfo.ImplementedSlotSigs |> List.map (fun slotsig -> let oty = slotsig.ImplementedType - let otcref,_ = destAppTy cenv.g oty + let otcref = tcrefOfAppTy cenv.g oty let tcref = v.MemberApparentEntity - let useMethodImpl = - // REVIEW: it would be good to get rid of this special casing of Compare and GetHashCode during code generation - let isCompare = - (Option.isSome tcref.GeneratedCompareToValues && typeEquiv cenv.g oty cenv.g.mk_IComparable_ty) || - (Option.isSome tcref.GeneratedCompareToValues && tyconRefEq cenv.g cenv.g.system_GenericIComparable_tcref otcref) - - let isGenericEquals = - (Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && tyconRefEq cenv.g cenv.g.system_GenericIEquatable_tcref otcref) - - let isStructural = - (Option.isSome tcref.GeneratedCompareToWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralComparable_ty) || - (Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralEquatable_ty) - isInterfaceTy cenv.g oty && not isCompare && not isStructural && not isGenericEquals + let useMethodImpl = + // REVIEW: it would be good to get rid of this special casing of Compare and GetHashCode during code generation + isInterfaceTy cenv.g oty && + (let isCompare = + Option.isSome tcref.GeneratedCompareToValues && + (typeEquiv cenv.g oty cenv.g.mk_IComparable_ty || + tyconRefEq cenv.g cenv.g.system_GenericIComparable_tcref otcref) + + not isCompare) && + (let isGenericEquals = + Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && tyconRefEq cenv.g cenv.g.system_GenericIEquatable_tcref otcref + + not isGenericEquals) && + (let isStructural = + (Option.isSome tcref.GeneratedCompareToWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralComparable_ty) || + (Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralEquatable_ty) + + not isStructural) let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl,slotsig) - (if useMethodImpl then fixupMethodImplFlags >> renameMethodDef nameOfOverridingMethod - else fixupVirtualSlotFlags >> renameMethodDef nameOfOverridingMethod)) + if useMethodImpl then + fixupMethodImplFlags >> renameMethodDef nameOfOverridingMethod + else + fixupVirtualSlotFlags >> renameMethodDef nameOfOverridingMethod) and ComputeMethodImplAttribs cenv (_v:Val) attrs = let implflags = @@ -5231,7 +5399,7 @@ and GenMethodForBinding // This is the main code generation for most methods false, - MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,tailCallInfo, mspec.Name, eenvForMeth, 0, 0, bodyExpr, sequel)), + MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,tailCallInfo, mspec.Name, eenvForMeth, 0, bodyExpr, sequel)), false // Do not generate DllImport attributes into the code - they are implicit from the P/Invoke @@ -5253,7 +5421,7 @@ and GenMethodForBinding let securityAttributes,attrs = attrs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap cenv.casApplied a m) - let permissionSets = CreatePermissionSets cenv.g cenv.amap eenv securityAttributes + let permissionSets = CreatePermissionSets cenv eenv securityAttributes let secDecls = if List.isEmpty securityAttributes then emptyILSecurityDecls else mkILSecurityDecls permissionSets @@ -5487,16 +5655,24 @@ and EmitGetStaticField cgbuf ty fspec = CG.EmitInstr cgbuf (pop 0) (Push [ty]) ( and GenSetStorage m cgbuf storage = match storage with - | Local (idx,_) -> EmitSetLocal cgbuf idx + | Local (idx, _, _) -> + EmitSetLocal cgbuf idx + | StaticField (_, _, hasLiteralAttr, ilContainerTy, _, _, _, ilSetterMethRef, _) -> if hasLiteralAttr then errorR(Error(FSComp.SR.ilLiteralFieldsCannotBeSet(),m)) CG.EmitInstr cgbuf (pop 1) Push0 (I_call(Normalcall,mkILMethSpecForMethRefInTy(ilSetterMethRef,ilContainerTy,[]),None)) + | StaticProperty (ilGetterMethSpec,_) -> error(Error(FSComp.SR.ilStaticMethodIsNotLambda(ilGetterMethSpec.Name),m)) + | Method (_,_,mspec,m,_,_,_) -> error(Error(FSComp.SR.ilStaticMethodIsNotLambda(mspec.Name),m)) - | Null -> CG.EmitInstr cgbuf (pop 1) Push0 AI_pop - | Arg _ -> error(Error(FSComp.SR.ilMutableVariablesCannotEscapeMethod(),m)) + + | Null -> + CG.EmitInstr cgbuf (pop 1) Push0 AI_pop + + | Arg _ -> + error(Error(FSComp.SR.ilMutableVariablesCannotEscapeMethod(),m)) | Env (_,_,ilField,_) -> // Note: ldarg0 has already been emitted in GenSetVal @@ -5516,7 +5692,7 @@ and CommitGetStorageSequel cenv cgbuf eenv m ty localCloInfo storeSequel = and GenGetStorageAndSequel cenv cgbuf eenv m (ty,ilTy) storage storeSequel = match storage with - | Local (idx,localCloInfo) -> + | Local (idx, _, localCloInfo) -> EmitGetLocal cgbuf ilTy idx CommitGetStorageSequel cenv cgbuf eenv m ty localCloInfo storeSequel @@ -5585,11 +5761,12 @@ and AllocLocal cenv cgbuf eenv compgen (v,ty,isFixed) (scopeMarks: Mark * Mark) // The debug range for the local let ranges = if compgen then [] else [(v,scopeMarks)] // Get an index for the local - let j = - if cenv.opts.localOptimizationsAreOn - then cgbuf.ReallocLocal((fun i (_,ty',isFixed') -> not isFixed' && not isFixed && not (IntMap.mem i eenv.liveLocals) && (ty = ty')),ranges,ty,isFixed) - else cgbuf.AllocLocal(ranges,ty,isFixed) - j, { eenv with liveLocals = IntMap.add j () eenv.liveLocals } + let j, realloc = + if cenv.opts.localOptimizationsAreOn then + cgbuf.ReallocLocal((fun i (_,ty',isFixed') -> not isFixed' && not isFixed && not (IntMap.mem i eenv.liveLocals) && (ty = ty')),ranges,ty,isFixed) + else + cgbuf.AllocLocal(ranges,ty,isFixed), false + j, realloc, { eenv with liveLocals = IntMap.add j () eenv.liveLocals } and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = let repr,eenv = @@ -5604,12 +5781,12 @@ and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = let cloinfo,_,_ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) cloinfo - let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks - Local (idx,Some(ref (NamedLocalIlxClosureInfoGenerator cloinfoGenerate))),eenv + let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks + Local (idx, realloc, Some(ref (NamedLocalIlxClosureInfoGenerator cloinfoGenerate))),eenv else (* normal local *) - let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, GenTypeOfVal cenv eenv v, v.IsFixed) scopeMarks - Local (idx,None),eenv + let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, GenTypeOfVal cenv eenv v, v.IsFixed) scopeMarks + Local (idx,realloc, None),eenv let eenv = AddStorageForVal cenv.g (v,notlazy repr) eenv Some repr, eenv @@ -5626,7 +5803,7 @@ and AllocStorageForBinds cenv cgbuf scopeMarks eenv binds = match reprOpt with | Some repr -> match repr with - | Local(_,Some g) + | Local(_, _, Some g) | Env(_,_,_,Some g) -> match !g with | NamedLocalIlxClosureInfoGenerator f -> g := NamedLocalIlxClosureInfoGenerated (f eenv) @@ -5677,7 +5854,10 @@ and AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v eenv = /// - and because IL requires empty stack following a forward br (jump). and EmitSaveStack cenv cgbuf eenv m scopeMarks = let savedStack = (cgbuf.GetCurrentStack()) - let savedStackLocals,eenvinner = List.mapFold (fun eenv ty -> AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("spill",m), ty, false) scopeMarks) eenv savedStack + let savedStackLocals,eenvinner = + (eenv, savedStack) ||> List.mapFold (fun eenv ty -> + let idx, _realloc, eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("spill",m), ty, false) scopeMarks + idx, eenv) List.iter (EmitSetLocal cgbuf) savedStackLocals cgbuf.AssertEmptyStack() (savedStack,savedStackLocals),eenvinner (* need to return, it marks locals "live" *) @@ -5802,18 +5982,18 @@ and GenCompilationArgumentCountsAttr cenv (v:Val) = () ] // Create a permission set for a list of security attributes -and CreatePermissionSets g amap eenv (securityAttributes : Attrib list) = +and CreatePermissionSets cenv eenv (securityAttributes : Attrib list) = [for ((Attrib(tcref,_,actions,_,_,_,_)) as attr) in securityAttributes do let action = match actions with | [AttribInt32Arg act] -> act | _ -> failwith "internal error: unrecognized security action" let secaction = (List.assoc action (Lazy.force ILSecurityActionRevMap)) let tref = tcref.CompiledRepresentationForNamedType - let ilattr = GenAttr amap g eenv attr + let ilattr = GenAttr cenv.amap cenv.g eenv attr let _, ilNamedArgs = - match TryDecodeILAttribute g tref (mkILCustomAttrs [ilattr]) with + match TryDecodeILAttribute cenv.g tref (mkILCustomAttrs [ilattr]) with | Some(ae,na) -> ae, na | _ -> [],[] let setArgs = ilNamedArgs |> List.map (fun (n,ilt,_,ilae) -> (n,ilt,ilae)) - yield IL.mkPermissionSet g.ilg (secaction, [(tref, setArgs)])] + yield IL.mkPermissionSet cenv.g.ilg (secaction, [(tref, setArgs)])] //-------------------------------------------------------------------------- // Generate the set of modules for an assembly, and the declarations in each module @@ -5919,7 +6099,14 @@ and GenModuleBinding cenv (cgbuf:CodeGenBuffer) (qname:QualifiedNameOfFile) lazy /// Generate the namespace fragments in a single file -and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplicitEntryPoint, isScript), optimizeDuringCodeGen) = +and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes), optimizeDuringCodeGen) = + + let m = qname.Range + + // Generate all the anonymous record types mentioned anywhere in this module + for anonInfo in anonRecdTypes.Values do + mgbuf.GenerateAnonType((fun ilThisTy -> GenToStringMethod cenv eenv ilThisTy m), anonInfo) |> ignore + let eenv = {eenv with cloc = { eenv.cloc with clocTopImplQualifiedName = qname.Text } } cenv.optimizeDuringCodeGen <- optimizeDuringCodeGen @@ -5949,7 +6136,6 @@ and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplic let lazyInitInfo = new ResizeArray ILInstr list -> ILInstr list -> unit>() // codegen .cctor/main for outer module - let m = qname.Range let clocCcu = CompLocForCcu cenv.viewCcu // This method name is only used internally in ilxgen.fs to aid debugging @@ -5965,7 +6151,7 @@ and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplic // topInstrs is ILInstr[] and contains the abstract IL for this file's top-level actions. topCode is the ILMethodBody for that same code. let topInstrs,topCode = CodeGenMethod cenv mgbuf - ([],methodName,eenv,0,0, + ([],methodName,eenv,0, (fun cgbuf eenv -> GenModuleExpr cenv cgbuf qname lazyInitInfo eenv mexpr CG.EmitInstr cgbuf (pop 0) Push0 I_ret),m) @@ -5975,8 +6161,6 @@ and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplic // Library file (mainInfoOpt = None) : optional .cctor if topCode has initialization effect // Final file, explicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = Some) : main + optional .cctor if topCode has initialization effect // Final file, implicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = None) : main + initialize + optional .cctor calling initialize - - let doesSomething = CheckCodeDoesSomething topCode.Code // Make a FEEFEE instruction to mark hidden code regions @@ -6155,12 +6339,11 @@ and GenAbstractBinding cenv eenv tref (vref:ValRef) = else [],[],[] -and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = - let genToString ilThisTy = - [ - match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, - eenv.valsInScope.TryFind cenv.g.new_format_vref.Deref) with - | Some(Lazy(Method(_,_,sprintfMethSpec,_,_,_,_))), Some(Lazy(Method(_,_,newFormatMethSpec,_,_,_,_))) -> +/// Generate a ToString method that calls 'sprintf "%A"' +and GenToStringMethod cenv eenv ilThisTy m = + [ match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, + eenv.valsInScope.TryFind cenv.g.new_format_vref.Deref) with + | Some(Lazy(Method(_,_,sprintfMethSpec,_,_,_,_))), Some(Lazy(Method(_,_,newFormatMethSpec,_,_,_,_))) -> // The type returned by the 'sprintf' call let funcTy = EraseClosures.mkILFuncTy cenv.g.ilxPubCloEnv ilThisTy cenv.g.ilg.typ_String // Give the instantiation of the printf format object, i.e. a Format`5 object compatible with StringFormat @@ -6194,9 +6377,9 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = None)) let mdef = mdef.With(customAttrs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute ]) yield mdef - | None,_ -> () - | _,None -> () - | _ -> ()] + | _ -> () ] + +and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let tcref = mkLocalTyconRef tycon if tycon.IsTypeAbbrev then () else match tycon.TypeReprInfo with @@ -6308,7 +6491,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let generateDebugProxies = (not (tyconRefEq cenv.g tcref cenv.g.unit_tcr_canon) && not (HasFSharpAttribute cenv.g cenv.g.attrib_DebuggerTypeProxyAttribute tycon.Attribs)) - let permissionSets = CreatePermissionSets cenv.g cenv.amap eenv securityAttrs + let permissionSets = CreatePermissionSets cenv eenv securityAttrs let secDecls = if List.isEmpty securityAttrs then emptyILSecurityDecls else mkILSecurityDecls permissionSets let ilDebugDisplayAttributes = @@ -6344,7 +6527,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = (match ilTypeDefKind with ILTypeDefKind.ValueType -> true | _ -> false) && // All structs are sequential by default // Structs with no instance fields get size 1, pack 0 - tycon.AllFieldsAsList |> List.forall (fun f -> f.IsStatic) + tycon.AllFieldsArray |> Array.forall (fun f -> f.IsStatic) isEmptyStruct && cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty @@ -6352,7 +6535,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let isCLIMutable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_CLIMutableAttribute tycon.Attribs = Some true) let fieldSummaries = - [ for fspec in tycon.AllFieldsAsList do + [ for fspec in tycon.AllFieldsArray do let useGenuineField = useGenuineField tycon fspec @@ -6561,7 +6744,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = yield mkILSimpleStorageCtor(None, Some cenv.g.ilg.typ_Object.TypeSpec, ilThisTy, [], [], reprAccess) if not (tycon.HasMember cenv.g "ToString" []) then - yield! genToString ilThisTy + yield! GenToStringMethod cenv eenv ilThisTy m | TFSharpObjectRepr r when tycon.IsFSharpDelegateTycon -> // Build all the methods that go with a delegate type @@ -6576,12 +6759,11 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | [[tsp]] when isUnitTy cenv.g tsp.Type -> [] (* suppress unit arg *) | paraml -> paraml GenActualSlotsig m cenv eenvinner (TSlotSig(nm,ty,ctps,mtps,paraml,returnTy)) [] [] - for ilMethodDef in mkILDelegateMethods reprAccess cenv.g.ilg (cenv.g.iltyp_AsyncCallback, cenv.g.iltyp_IAsyncResult) (p,r) do - yield ilMethodDef + yield! mkILDelegateMethods reprAccess cenv.g.ilg (cenv.g.iltyp_AsyncCallback, cenv.g.iltyp_IAsyncResult) (p,r) | _ -> () | TUnionRepr _ when not (tycon.HasMember cenv.g "ToString" []) -> - yield! genToString ilThisTy + yield! GenToStringMethod cenv eenv ilThisTy m | _ -> () ] let ilMethods = methodDefs @ augmentOverrideMethodDefs @ abstractMethodDefs @@ -6670,7 +6852,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // All structs are sequential by default // Structs with no instance fields get size 1, pack 0 - if tycon.AllFieldsAsList |> List.exists (fun f -> not f.IsStatic) || + if tycon.AllFieldsArray |> Array.exists (fun f -> not f.IsStatic) || // Reflection emit doesn't let us emit 'pack' and 'size' for generic structs. // In that case we generate a dummy field instead (cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty) @@ -6907,7 +7089,26 @@ let CodegenAssembly cenv eenv mgbuf fileImpls = if not (isNil fileImpls) then let a,b = List.frontAndBack fileImpls let eenv = List.fold (GenTopImpl cenv mgbuf None) eenv a - let _eenv = GenTopImpl cenv mgbuf cenv.opts.mainMethodInfo eenv b + let eenv = GenTopImpl cenv mgbuf cenv.opts.mainMethodInfo eenv b + + // Some constructs generate residue types and bindings. Generate these now. They don't result in any + // top-level initialization code. + begin + let extraBindings = mgbuf.GrabExtraBindingsToGenerate() + //printfn "#extraBindings = %d" extraBindings.Length + if extraBindings.Length > 0 then + let mexpr = TMDefs [ for b in extraBindings -> TMDefLet(b,range0) ] + let _emptyTopInstrs,_emptyTopCode = + CodeGenMethod cenv mgbuf ([],"unused",eenv,0, (fun cgbuf eenv -> + let lazyInitInfo = ResizeArray() + let qname = QualifiedNameOfFile(mkSynId range0 "unused") + LocalScope "module" cgbuf (fun scopeMarks -> + let eenv = AddBindingsForModuleDef (fun cloc v -> AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v) eenv.cloc eenv mexpr + GenModuleDef cenv cgbuf qname lazyInitInfo eenv mexpr)),range0) + //printfn "#_emptyTopInstrs = %d" _emptyTopInstrs.Length + () + end + mgbuf.AddInitializeScriptsInOrderToEntryPoint() //------------------------------------------------------------------------- @@ -6932,15 +7133,17 @@ type IlxGenResults = { ilTypeDefs: ILTypeDef list ilAssemAttrs : ILAttribute list ilNetModuleAttrs: ILAttribute list + topAssemblyAttrs : Attribs + permissionSets : ILSecurityDecl list quotationResourceInfo: (ILTypeRef list * byte[]) list } -let GenerateCode (cenv, eenv, TypedAssemblyAfterOptimization fileImpls, assemAttribs, moduleAttribs) = +let GenerateCode (cenv, anonTypeTable, eenv, TypedAssemblyAfterOptimization fileImpls, assemAttribs, moduleAttribs) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.IlxGen // Generate the implementations into the mgbuf - let mgbuf= new AssemblyBuilder(cenv) + let mgbuf = new AssemblyBuilder(cenv, anonTypeTable) let eenv = { eenv with cloc = CompLocForFragment cenv.opts.fragName cenv.viewCcu } // Generate the PrivateImplementationDetails type @@ -6953,6 +7156,7 @@ let GenerateCode (cenv, eenv, TypedAssemblyAfterOptimization fileImpls, assemAtt let tdefs,reflectedDefinitions = mgbuf.Close() + // Generate the quotations let quotationResourceInfo = match reflectedDefinitions with @@ -6989,9 +7193,16 @@ let GenerateCode (cenv, eenv, TypedAssemblyAfterOptimization fileImpls, assemAtt let ilNetModuleAttrs = GenAttrs cenv eenv moduleAttribs + let casApplied = new Dictionary() + let securityAttrs, topAssemblyAttrs = assemAttribs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap casApplied a rangeStartup) + // remove any security attributes from the top-level assembly attribute list + let permissionSets = CreatePermissionSets cenv eenv securityAttrs + { ilTypeDefs= tdefs ilAssemAttrs = ilAssemAttrs ilNetModuleAttrs = ilNetModuleAttrs + topAssemblyAttrs = topAssemblyAttrs + permissionSets = permissionSets quotationResourceInfo = quotationResourceInfo } @@ -7091,37 +7302,13 @@ let ClearGeneratedValue (ctxt: ExecutionContext) (_g:TcGlobals) eenv (v:Val) = #endif () -(* -let LookupGeneratedInfo (ctxt: ExecutionContext) (g:TcGlobals) eenv (v:Val) = - try - match StorageForVal v.Range v eenv with - | StaticField (fspec, _, hasLiteralAttr, ilContainerTy, _, _, ilGetterMethRef, _, _) -> - let staticTy = ctxt.LookupTypeRef ilContainerTy.TypeRef - if hasLiteralAttr then - Some (staticTy.GetField(fspec.Name) :> MemberInfo) - else - Some (staticTy.GetMethod(ilGetterMethRef.Name,[||]) :> MemberInfo) - | Null -> None - | Local _ -> None - | Method _ -> None - | Arg _ -> None - | Env _ -> None - with - e -> -#if DEBUG - printf "ilxGen.lookupGenertedInfo for v=%s caught exception:\n%A\n\n" v.LogicalName e -#endif - None - - -*) - /// The published API from the ILX code generator type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : ConstraintSolver.TcValF, ccu: Tast.CcuThunk) = // The incremental state held by the ILX code generator let mutable ilxGenEnv = GetEmptyIlxGenEnv tcGlobals.ilg ccu + let anonTypeTable = AnonTypeGenerationTable() let intraAssemblyInfo = { StaticFieldInfo = new Dictionary<_,_>(HashIdentity.Structural) } let casApplied = new Dictionary() @@ -7146,7 +7333,7 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : Constra intraAssemblyInfo = intraAssemblyInfo opts = codeGenOpts optimizeDuringCodeGen = (fun x -> x) } - GenerateCode (cenv, ilxGenEnv, typedAssembly, assemAttribs, moduleAttribs) + GenerateCode (cenv, anonTypeTable, ilxGenEnv, typedAssembly, assemAttribs, moduleAttribs) /// Invert the compilation of the given value and clear the storage of the value member __.ClearGeneratedValue (ctxt, v) = ClearGeneratedValue ctxt tcGlobals ilxGenEnv v @@ -7154,5 +7341,4 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : Constra /// Invert the compilation of the given value and return its current dynamic value and its compiled System.Type member __.LookupGeneratedValue (ctxt, v) = LookupGeneratedValue amap ctxt ilxGenEnv v - /// Create the CAS permission sets for an assembly fragment - member __.CreatePermissionSets attribs = CreatePermissionSets tcGlobals amap ilxGenEnv attribs + diff --git a/src/fsharp/IlxGen.fsi b/src/fsharp/IlxGen.fsi index 25c727eca8..6d50da1bfd 100755 --- a/src/fsharp/IlxGen.fsi +++ b/src/fsharp/IlxGen.fsi @@ -62,6 +62,10 @@ type public IlxGenResults = ilAssemAttrs : ILAttribute list /// The generated IL/ILX .NET module attributes ilNetModuleAttrs : ILAttribute list + /// The attributes for the assembly in F# form + topAssemblyAttrs : Attribs + /// The security attributes to attach to the assembly + permissionSets : ILSecurityDecl list /// The generated IL/ILX resources associated with F# quotations quotationResourceInfo : (ILTypeRef list * byte[]) list } @@ -88,9 +92,6 @@ type public IlxAssemblyGenerator = /// Generate ILX code for an assembly fragment member GenerateCode : IlxGenOptions * TypedAssemblyAfterOptimization * Attribs * Attribs -> IlxGenResults - /// Create the CAS permission sets for an assembly fragment - member CreatePermissionSets : Attrib list -> ILSecurityDecl list - /// Invert the compilation of the given value and clear the storage of the value member ClearGeneratedValue : ExecutionContext * Val -> unit diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 3b9963bad9..e04485887e 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -81,8 +81,8 @@ let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m origTy m |> List.filter (fun minfo -> not minfo.IsInstance) else match tryDestAppTy g metadataTy with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> SelectImmediateMemberVals g optFilter (TrySelectMemberVal g optFilter origTy None) tcref let minfos = minfos |> List.filter (IsMethInfoAccessible amap m ad) minfos @@ -169,8 +169,8 @@ let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy m GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy betterMetadataTy else match tryDestAppTy g metadataTy with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> let propCollector = new PropertyCollector(g, amap, m, origTy, optFilter, ad) SelectImmediateMemberVals g None (fun membInfo vref -> propCollector.Collect(membInfo, vref); None) tcref |> ignore propCollector.Close() @@ -188,11 +188,11 @@ let IsIndexerType g amap ty = isArray1DTy g ty || isListTy g ty || match tryDestAppTy g ty with - | Some tcref -> + | ValueSome tcref -> let _, entityTy = generalizeTyconRef tcref let props = GetImmediateIntrinsicPropInfosOfType (None, AccessibleFromSomeFSharpCode) g amap range0 entityTy props |> List.exists (fun x -> x.PropertyName = "Item") - | None -> false + | ValueNone -> false /// Sets of methods up the hierarchy, ignoring duplicates by name and sig. @@ -268,8 +268,8 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// Get the F#-declared record fields or class 'val' fields of a type let GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter, _ad) _m ty = match tryDestAppTy g ty with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> // Note;secret fields are not allowed in lookups here, as we're only looking // up user-visible fields in name resolution. match optFilter with @@ -417,17 +417,17 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// Try and find a record or class field for a type. member x.TryFindRecdOrClassFieldInfoOfType (nm,m,ty) = match recdOrClassFieldInfoCache.Apply((Some nm,AccessibleFromSomewhere),m,ty) with - | [] -> None - | [single] -> Some single + | [] -> ValueNone + | [single] -> ValueSome single | flds -> // multiple fields with the same name can come from different classes, // so filter them by the given type name match tryDestAppTy g ty with - | None -> None - | Some tcref -> + | ValueNone -> ValueNone + | ValueSome tcref -> match flds |> List.filter (fun rfinfo -> tyconRefEq g tcref rfinfo.TyconRef) with - | [] -> None - | [single] -> Some single + | [] -> ValueNone + | [single] -> ValueSome single | _ -> failwith "unexpected multiple fields with same name" // Because it should have been already reported as duplicate fields /// Try and find an item with the given name in a type. @@ -469,8 +469,8 @@ let rec GetIntrinsicConstructorInfosOfTypeAux (infoReader:InfoReader) m origTy m GetIntrinsicConstructorInfosOfTypeAux infoReader m origTy betterMetadataTy else match tryDestAppTy g metadataTy with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> tcref.MembersOfFSharpTyconByName |> NameMultiMap.find ".ctor" |> List.choose(fun vref -> diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index da5c49f4bb..c783c1efe1 100755 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -1280,9 +1280,9 @@ module Pass4_RewriteAssembly = let rhs,z = TransModuleDef penv z rhs ModuleOrNamespaceBinding.Module(nm,rhs),z - let TransImplFile penv z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)) = + let TransImplFile penv z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = let moduleExpr,z = TransModuleExpr penv z moduleExpr - (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)),z + (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)),z //------------------------------------------------------------------------- // pass5: copyExpr diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index f8b7f951c2..c67aa06cb4 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -342,7 +342,7 @@ let rec isSeqBlockElementContinuator token = // ... // ), <------- NOTE RPAREN HERE // Shortcut.CtrlO) - | END | AND | WITH | THEN | RPAREN | RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ -> true + | END | AND | WITH | THEN | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ -> true // The following arise during reprocessing of the inserted tokens when we hit a DONE | ORIGHT_BLOCK_END | OBLOCKEND | ODECLEND -> true @@ -370,7 +370,7 @@ let isAtomicExprEndToken token = | UINT8 _ | UINT16 _ | UINT32 _ | UINT64 _ | UNATIVEINT _ | DECIMAL _ | BIGNUM _ | STRING _ | BYTEARRAY _ | CHAR _ | IEEE32 _ | IEEE64 _ - | RPAREN | RBRACK | RBRACE | BAR_RBRACK | END + | RPAREN | RBRACK | RBRACE | BAR_RBRACE | BAR_RBRACK | END | NULL | FALSE | TRUE | UNDERSCORE -> true | _ -> false @@ -381,6 +381,7 @@ let parenTokensBalance t1 t2 = match t1,t2 with | (LPAREN,RPAREN) | (LBRACE,RBRACE) + | (LBRACE_BAR,BAR_RBRACE) | (LBRACK,RBRACK) | (INTERFACE,END) | (CLASS,END) @@ -676,7 +677,6 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _,(CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACK | LBRACK_BAR),_) :: CtxtVanilla _ :: CtxtSeqBlock _ :: rest) -> unindentationLimit false rest - // MAJOR PERMITTED UNDENTATION This is allowing: // if x then y else // let x = 3 + 4 @@ -752,8 +752,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // 'if ... else [' limited by 'if' // 'if ... else [|' limited by 'if' | _,(CtxtParen ((SIG | STRUCT | BEGIN),_) :: CtxtSeqBlock _ :: (CtxtModuleBody (_,false) as limitCtxt) :: _) - | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) - | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) + | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) + | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR | LBRACK_LESS) ,_) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) // 'f ... (' in seqblock limited by 'f' // 'f ... {' in seqblock limited by 'f' NOTE: this is covered by the more generous case above @@ -770,7 +770,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // REVIEW: document these | _,(CtxtSeqBlock _ :: CtxtParen((BEGIN | LPAREN | LBRACK | LBRACK_BAR),_) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) - | (CtxtSeqBlock _),(CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACK | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) + | (CtxtSeqBlock _),(CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol + 1) // Permitted inner-construct (e.g. "then" block and "else" block in overall @@ -917,10 +917,15 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // fx // fx // f x>x + // f<{| C : int |}>x // fx // fx | DEFAULT | COLON | COLON_GREATER | STRUCT | NULL | DELEGATE | AND | WHEN | DOT_DOT + | NEW + | LBRACE_BAR + | SEMICOLON + | BAR_RBRACE | INFIX_AT_HAT_OP "^" | INFIX_AT_HAT_OP "^-" | INFIX_STAR_DIV_MOD_OP "/" @@ -995,7 +1000,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // WITH balances except in the following contexts.... Phew - an overused keyword! | WITH , ( ((CtxtMatch _ | CtxtException _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtTry _ | CtxtTypeDefns _ | CtxtMemberBody _) :: _) // This is the nasty record/object-expression case - | (CtxtSeqBlock _ :: CtxtParen(LBRACE,_) :: _) ) + | (CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACE_BAR),_) :: _) ) | FINALLY , (CtxtTry _ :: _) -> true @@ -1166,6 +1171,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | RPAREN | GREATER true | RBRACE + | BAR_RBRACE | RBRACK | BAR_RBRACK | WITH @@ -1204,7 +1210,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, while not offsideStack.IsEmpty && (not(nextOuterMostInterestingContextIsNamespaceOrModule(offsideStack))) && (match offsideStack.Head with // open-parens of sorts - | CtxtParen((LPAREN|LBRACK|LBRACE|LBRACK_BAR),_) -> true + | CtxtParen((LPAREN|LBRACK|LBRACE|LBRACE_BAR|LBRACK_BAR),_) -> true // seq blocks | CtxtSeqBlock _ -> true // vanillas @@ -1297,9 +1303,9 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, hwTokenFetch(useBlockRule) // Balancing rule. Encountering a ')' or '}' balances with a '(' or '{', even if not offside - | ((END | RPAREN | RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1,_) :: _) + | ((END | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1,_) :: _) when parenTokensBalance t1 t2 -> - if debug then dprintf "RPAREN/RBRACE/RBRACK/BAR_RBRACK/RQUOTE/END at %a terminates CtxtParen()\n" outputPos tokenStartPos + if debug then dprintf "RPAREN/RBRACE/BAR_RBRACE/RBRACK/BAR_RBRACK/RQUOTE/END at %a terminates CtxtParen()\n" outputPos tokenStartPos popCtxt() // Queue a dummy token at this position to check if any closing rules apply delayToken(tokenTup.UseLocation(ODUMMY(token))) @@ -1792,7 +1798,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // '{ id1 = 1 // M.id2 = ... ' ~~~> CtxtSeqBlock | EQUALS, ((CtxtWithAsLet _) :: _) // This detects 'with = '. - | EQUALS, ((CtxtVanilla (_,true)) :: (CtxtSeqBlock _) :: (CtxtWithAsLet _ | CtxtParen(LBRACE,_)) :: _) -> + | EQUALS, ((CtxtVanilla (_,true)) :: (CtxtSeqBlock _) :: (CtxtWithAsLet _ | CtxtParen((LBRACE | LBRACE_BAR),_)) :: _) -> if debug then dprintf "CtxtLetDecl/CtxtWithAsLet: EQUALS, pushing CtxtSeqBlock\n" // We don't insert begin/end block tokens for single-line bindings since we can't properly distinguish single-line *) // record update expressions such as "{ t with gbuckets=Array.copy t.gbuckets; gcount=t.gcount }" *) @@ -1816,7 +1822,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, returnToken tokenLexbufState token // '(' tokens are balanced with ')' tokens and also introduce a CtxtSeqBlock - | (BEGIN | LPAREN | SIG | LBRACE | LBRACK | LBRACK_BAR | LQUOTE _ | LESS true), _ -> + | (BEGIN | LPAREN | SIG | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR | LQUOTE _ | LESS true), _ -> if debug then dprintf "LPAREN etc., pushes CtxtParen, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtParen (token,tokenStartPos)) pushCtxtSeqBlock(false,NoAddBlockEnd) @@ -1842,7 +1848,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // comprehension/match | (CtxtWhile _ | CtxtFor _ | CtxtWhen _ | CtxtMatchClauses _ | CtxtFun _) :: _ -> true // comprehension - | (CtxtSeqBlock _ :: CtxtParen ((LBRACK | LBRACE | LBRACK_BAR), _) :: _) -> true + | (CtxtSeqBlock _ :: CtxtParen ((LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR), _) :: _) -> true // comprehension | (CtxtSeqBlock _ :: (CtxtDo _ | CtxtWhile _ | CtxtFor _ | CtxtWhen _ | CtxtMatchClauses _ | CtxtTry _ | CtxtThen _ | CtxtElse _) :: _) -> true | _ -> false) -> @@ -1893,7 +1899,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, returnToken tokenLexbufState token | WITH, (((CtxtException _ | CtxtTypeDefns _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtMemberBody _) as limCtxt) :: _) - | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen(LBRACE,_) :: _) -> + | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen((LBRACE | LBRACE_BAR),_) :: _) -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match lookaheadTokenTup.Token with diff --git a/src/fsharp/LowerCallsAndSeqs.fs b/src/fsharp/LowerCallsAndSeqs.fs index 6fc9b6065e..15904bfabd 100755 --- a/src/fsharp/LowerCallsAndSeqs.fs +++ b/src/fsharp/LowerCallsAndSeqs.fs @@ -52,11 +52,11 @@ let InterceptExpr g cont expr = /// known arity to lambda expressions and beta-var-reduces to bind /// any known arguments. The results are later optimized by the peephole /// optimizer in opt.fs -let LowerImplFile g ass = +let LowerImplFile g assembly = RewriteImplFile { PreIntercept = Some(InterceptExpr g) PreInterceptBinding=None PostTransform= (fun _ -> None) - IsUnderQuotations=false } ass + IsUnderQuotations=false } assembly //---------------------------------------------------------------------------- @@ -84,13 +84,18 @@ type LoweredSeqFirstPhaseResult = { /// The code to run in the second phase, to rebuild the expressions, once all code labels and their mapping to program counters have been determined /// 'nextVar' is the argument variable for the GenerateNext method that represents the byref argument that holds the "goto" destination for a tailcalling sequence expression phase2 : ((* pc: *) ValRef * (* current: *) ValRef * (* nextVar: *) ValRef * Map -> Expr * Expr * Expr) + /// The labels allocated for one portion of the sequence expression labels : int list + /// any actual work done in Close significantClose : bool /// The state variables allocated for one portion of the sequence expression (i.e. the local let-bound variables which become state variables) - stateVars: ValRef list } + stateVars: ValRef list + + /// The vars captured by the non-synchronous path + capturedVars: FreeVars } let isVarFreeInExpr v e = Zset.contains v (freeInExpr CollectTyparsAndLocals e).FreeLocals @@ -174,6 +179,17 @@ let LowerSeqExpr g amap overallExpr = | Expr.App(Expr.Val (vref,_,_),_f0ty,[elemTy],[e],_m) when valRefEq g vref g.seq_vref -> Some (e,elemTy) | _ -> None + let RepresentBindingAsLocal (bind: Binding) res2 m = + // printfn "found letrec state variable %s" bind.Var.DisplayName + { res2 with + phase2 = (fun ctxt -> + let generate2,dispose2,checkDispose2 = res2.phase2 ctxt + let generate = mkLetBind m bind generate2 + let dispose = dispose2 + let checkDispose = checkDispose2 + generate,dispose,checkDispose) + stateVars = res2.stateVars } + let RepresentBindingAsStateMachineLocal (bind: Binding) res2 m = // printfn "found letrec state variable %s" bind.Var.DisplayName let (TBind(v,e,sp)) = bind @@ -243,17 +259,28 @@ let LowerSeqExpr g amap overallExpr = labels=[label] stateVars=[] significantClose = false + capturedVars = emptyFreeVars } - | SeqDelay(e,_elemTy) -> + | SeqDelay(delayedExpr,_elemTy) -> // printfn "found Seq.delay" - Lower isWholeExpr isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e // note, using 'isWholeExpr' here prevents 'seq { yield! e }' and 'seq { 0 .. 1000 }' from being compiled + // note, using 'isWholeExpr' here prevents 'seq { yield! e }' and 'seq { 0 .. 1000 }' from being compiled + Lower isWholeExpr isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel delayedExpr | SeqAppend(e1,e2,m) -> // printfn "found Seq.append" - match Lower false false noDisposeContinuationLabel currentDisposeContinuationLabel e1, - Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e2 with + let res1 = Lower false false noDisposeContinuationLabel currentDisposeContinuationLabel e1 + let res2 = Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e2 + match res1, res2 with | Some res1, Some res2 -> + + let capturedVars = + if res1.labels.IsEmpty then + res2.capturedVars + else + // All of 'e2' is needed after resuming at any of the labels + unionFreeVars res1.capturedVars (freeInExpr CollectLocals e2) + Some { phase2 = (fun ctxt -> let generate1,dispose1,checkDispose1 = res1.phase2 ctxt let generate2,dispose2,checkDispose2 = res2.phase2 ctxt @@ -265,29 +292,43 @@ let LowerSeqExpr g amap overallExpr = generate,dispose,checkDispose) labels= res1.labels @ res2.labels stateVars = res1.stateVars @ res2.stateVars - significantClose = res1.significantClose || res2.significantClose } + significantClose = res1.significantClose || res2.significantClose + capturedVars = capturedVars } | _ -> None - | SeqWhile(e1,e2,m) -> + | SeqWhile(guardExpr,bodyExpr,m) -> // printfn "found Seq.while" - match Lower false false noDisposeContinuationLabel currentDisposeContinuationLabel e2 with + let resBody = Lower false false noDisposeContinuationLabel currentDisposeContinuationLabel bodyExpr + match resBody with | Some res2 -> + let capturedVars = + if res2.labels.IsEmpty then + res2.capturedVars // the whole loopis synchronous, no labels + else + freeInExpr CollectLocals expr // everything is needed on subsequent iterations + Some { phase2 = (fun ctxt -> let generate2,dispose2,checkDispose2 = res2.phase2 ctxt - let generate = mkWhile g (SequencePointAtWhileLoop e1.Range,NoSpecialWhileLoopMarker,e1,generate2,m) + let generate = mkWhile g (SequencePointAtWhileLoop guardExpr.Range,NoSpecialWhileLoopMarker,guardExpr,generate2,m) let dispose = dispose2 let checkDispose = checkDispose2 generate,dispose,checkDispose) labels = res2.labels stateVars = res2.stateVars - significantClose = res2.significantClose } + significantClose = res2.significantClose + capturedVars = capturedVars } | _ -> None | SeqUsing(resource,v,body,elemTy,m) -> // printfn "found Seq.using" - Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel (mkLet (SequencePointAtBinding body.Range) m v resource (mkCallSeqFinally g m elemTy body (mkUnitDelayLambda g m (mkCallDispose g m v.Type (exprForVal m v))))) + let reduction = + mkLet (SequencePointAtBinding body.Range) m v resource + (mkCallSeqFinally g m elemTy body + (mkUnitDelayLambda g m + (mkCallDispose g m v.Type (exprForVal m v)))) + Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel reduction | SeqFor(inp,v,body,genElemTy,m) -> // printfn "found Seq.for" @@ -298,18 +339,21 @@ let LowerSeqExpr g amap overallExpr = // while enum.MoveNext() do // let v = enum.Current // body ]] - Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel - (mkCallSeqUsing g m inpEnumTy genElemTy (callNonOverloadedMethod g amap m "GetEnumerator" (mkSeqTy g inpElemTy) [inp]) - (mkLambdaNoType g m enumv + let reduction = + mkCallSeqUsing g m inpEnumTy genElemTy (callNonOverloadedMethod g amap m "GetEnumerator" (mkSeqTy g inpElemTy) [inp]) + (mkLambdaNoType g m enumv (mkCallSeqGenerated g m genElemTy (mkUnitDelayLambda g m (callNonOverloadedMethod g amap m "MoveNext" inpEnumTy [enume])) (mkInvisibleLet m v (callNonOverloadedMethod g amap m "get_Current" inpEnumTy [enume]) - (mkCoerceIfNeeded g (mkSeqTy g genElemTy) (tyOfExpr g body) body))))) + (mkCoerceIfNeeded g (mkSeqTy g genElemTy) (tyOfExpr g body) body)))) + Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel reduction | SeqTryFinally(e1,compensation,m) -> // printfn "found Seq.try/finally" let innerDisposeContinuationLabel = IL.generateCodeLabel() - match Lower false false noDisposeContinuationLabel innerDisposeContinuationLabel e1 with + let resBody = Lower false false noDisposeContinuationLabel innerDisposeContinuationLabel e1 + match resBody with | Some res1 -> + let capturedVars = unionFreeVars res1.capturedVars (freeInExpr CollectLocals compensation) Some { phase2 = (fun ((pcv,_currv,_,pcMap) as ctxt) -> let generate1,dispose1,checkDispose1 = res1.phase2 ctxt let generate = @@ -348,7 +392,8 @@ let LowerSeqExpr g amap overallExpr = generate,dispose,checkDispose) labels = innerDisposeContinuationLabel :: res1.labels stateVars = res1.stateVars - significantClose = true } + significantClose = true + capturedVars = capturedVars } | _ -> None @@ -361,7 +406,8 @@ let LowerSeqExpr g amap overallExpr = generate,dispose,checkDispose) labels = [] stateVars = [] - significantClose = false } + significantClose = false + capturedVars = emptyFreeVars } | Expr.Sequential(x1,x2,NormalSeq,ty,m) -> match Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel x2 with @@ -376,13 +422,18 @@ let LowerSeqExpr g amap overallExpr = generate,dispose,checkDispose) } | None -> None - | Expr.Let(bind,e2,m,_) + | Expr.Let(bind,bodyExpr,m,_) // Restriction: compilation of sequence expressions containing non-toplevel constrained generic functions is not supported when bind.Var.IsCompiledAsTopLevel || not (IsGenericValWithGenericContraints g bind.Var) -> - match Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e2 with + + let resBody = Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel bodyExpr + match resBody with | Some res2 -> if bind.Var.IsCompiledAsTopLevel then Some (RepresentBindingsAsLifted (mkLetBind m bind) res2) + elif not (res2.capturedVars.FreeLocals.Contains(bind.Var)) then + // printfn "found state variable %s" bind.Var.DisplayName + Some (RepresentBindingAsLocal bind res2 m) else // printfn "found state variable %s" bind.Var.DisplayName Some (RepresentBindingAsStateMachineLocal bind res2 m) @@ -421,12 +472,18 @@ let LowerSeqExpr g amap overallExpr = *) | Expr.Match (spBind,exprm,pt,targets,m,ty) when targets |> Array.forall (fun (TTarget(vs,_e,_spTarget)) -> isNil vs) -> // lower all the targets. abandon if any fail to lower - let tgl = targets |> Array.map (fun (TTarget(_vs,e,_spTarget)) -> Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e) |> Array.toList + let tglArray = targets |> Array.map (fun (TTarget(_vs,targetExpr,_spTarget)) -> Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel targetExpr) // LIMITATION: non-trivial pattern matches involving or-patterns or active patterns where bindings can't be // transferred to the r.h.s. are not yet compiled. - if tgl |> List.forall Option.isSome then - let tgl = List.map Option.get tgl + if tglArray |> Array.forall Option.isSome then + let tglArray = Array.map Option.get tglArray + let tgl = Array.toList tglArray let labs = tgl |> List.collect (fun res -> res.labels) + let (capturedVars, _) = + ((emptyFreeVars, false), Array.zip targets tglArray) + ||> Array.fold (fun (fvs, seenLabel) ((TTarget(_vs,e,_spTarget)), res) -> + if seenLabel then unionFreeVars fvs (freeInExpr CollectLocals e), true + else res.capturedVars, not res.labels.IsEmpty) let stateVars = tgl |> List.collect (fun res -> res.stateVars) let significantClose = tgl |> List.exists (fun res -> res.significantClose) Some { phase2 = (fun ctxt -> @@ -443,7 +500,8 @@ let LowerSeqExpr g amap overallExpr = generate,dispose,checkDispose) labels=labs stateVars = stateVars - significantClose = significantClose } + significantClose = significantClose + capturedVars = capturedVars } else None @@ -454,12 +512,12 @@ let LowerSeqExpr g amap overallExpr = // Note, however, this leads to a loss of tailcalls: the case not // handled correctly yet is sequence expressions that use yield! in the last position // This can give rise to infinite iterator chains when implemented by the naive expansion to - // for x in e yield e. For example consider this: + // �for x in e yield e�. For example consider this: // // let rec rwalk x = { yield x // yield! rwalk (x + rand()) } // - // This is the moral equivalent of a tailcall optimization. These also dont compile well + // This is the moral equivalent of a tailcall optimization. These also don�t compile well // in the C# compilation model | arbitrarySeqExpr -> @@ -502,7 +560,8 @@ let LowerSeqExpr g amap overallExpr = generate,dispose,checkDispose) labels=[label] stateVars=[] - significantClose = false } + significantClose = false + capturedVars = emptyFreeVars } else let v,ve = mkCompGenLocal m "v" inpElemTy Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel (mkCallSeqCollect g m inpElemTy inpElemTy (mkLambdaNoType g m v (mkCallSeqSingleton g m inpElemTy ve)) arbitrarySeqExpr) diff --git a/src/fsharp/MSBuildReferenceResolver.fs b/src/fsharp/MSBuildReferenceResolver.fs index 804c6b7408..c2a9d2133b 100644 --- a/src/fsharp/MSBuildReferenceResolver.fs +++ b/src/fsharp/MSBuildReferenceResolver.fs @@ -41,62 +41,52 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver // ATTENTION!: the following code needs to be updated every time we are switching to the new MSBuild version because new .NET framework version was released // 1. List of frameworks // 2. DeriveTargetFrameworkDirectoriesFor45Plus - // 3. HighestInstalledNetFrameworkVersion + // 3. HighestInstalledRefAssembliesOrDotNETFramework // 4. GetPathToDotNetFrameworkImlpementationAssemblies [] - let private Net10 = "v1.0" + let private Net45 = "v4.5" [] - let private Net11 = "v1.1" + let private Net451 = "v4.5.1" [] - let private Net20 = "v2.0" + let private Net452 = "v4.5.2" // not available in Dev15 MSBuild version [] - let private Net30 = "v3.0" + let private Net46 = "v4.6" [] - let private Net35 = "v3.5" + let private Net461 = "v4.6.1" [] - let private Net40 = "v4.0" + let private Net462 = "v4.6.2" [] - let private Net45 = "v4.5" + let private Net47 = "v4.7" [] - let private Net451 = "v4.5.1" - - /// The list of supported .NET Framework version numbers, using the monikers of the Reference Assemblies folder. - let SupportedNetFrameworkVersions = set [ Net20; Net30; Net35; Net40; Net45; Net451; (*SL only*) "v5.0" ] - - //[] - //let private Net452 = "v4.5.2" // not available in Dev15 MSBuild version + let private Net471 = "v4.7.1" -#if MSBUILD_AT_LEAST_14 [] - let private Net46 = "v4.6" + let private Net472 = "v4.7.2" - [] - let private Net461 = "v4.6.1" -#endif + let SupportedDesktopFrameworkVersions = [ Net472; Net471; Net47; Net462; Net461; Net46; Net452; Net451; Net45 ] - /// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework. + /// 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(v) = let v = match v with - | Net11 -> Some TargetDotNetFrameworkVersion.Version11 - | Net20 -> Some TargetDotNetFrameworkVersion.Version20 - | Net30 -> Some TargetDotNetFrameworkVersion.Version30 - | Net35 -> Some TargetDotNetFrameworkVersion.Version35 - | Net40 -> Some TargetDotNetFrameworkVersion.Version40 | Net45 -> Some TargetDotNetFrameworkVersion.Version45 | Net451 -> Some TargetDotNetFrameworkVersion.Version451 -#if MSBUILD_AT_LEAST_14 - //| Net452 -> Some TargetDotNetFrameworkVersion.Version452 // not available in Dev15 MSBuild version +#if MSBUILD_AT_LEAST_15 + | Net452 -> Some TargetDotNetFrameworkVersion.Version452 | Net46 -> Some TargetDotNetFrameworkVersion.Version46 | Net461 -> Some TargetDotNetFrameworkVersion.Version461 + | Net462 -> Some TargetDotNetFrameworkVersion.Version462 + | Net47 -> Some TargetDotNetFrameworkVersion.Version47 + | Net471 -> Some TargetDotNetFrameworkVersion.Version471 + | Net472 -> Some TargetDotNetFrameworkVersion.Version472 #endif | _ -> assert false; None match v with @@ -106,7 +96,6 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver | x -> [x] | _ -> [] - let GetPathToDotNetFrameworkReferenceAssemblies(version) = #if NETSTANDARD1_6 || NETSTANDARD2_0 ignore version @@ -118,41 +107,59 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver | x -> [x] #endif - /// Use MSBuild to determine the version of the highest installed framework. - let HighestInstalledNetFrameworkVersion() = - try -#if MSBUILD_AT_LEAST_14 - if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461)) <> null then Net461 - elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version46)) <> null then Net46 - // 4.5.2 enumeration is not available in Dev15 MSBuild version - //elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version452)) <> null then Net452 - elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 + /// Use MSBuild to determine the version of the highest installed set of reference assemblies, failing that grab the highest installed framework version + let HighestInstalledRefAssembliesOrDotNETFramework () = + let getHighestInstalledDotNETFramework () = + try +// The Mono build still uses an ancient version of msbuild from around Dev 14 +#if MSBUILD_AT_LEAST_15 + if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version472)) <> null then Net472 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version471)) <> null then Net471 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version47)) <> null then Net47 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version462)) <> null then Net462 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461)) <> null then Net461 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461)) <> null then Net461 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version46)) <> null then Net46 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version452)) <> null then Net452 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 #else - if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 + if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 +#endif + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version45)) <> null then Net45 + else Net45 // version is 4.5 assumed since this code is running. + with _ -> Net45 + +#if !FX_RESHAPED_REFLECTION + // 1. First look to see if we can find the highest installed set of dotnet reference assemblies, if yes then select that framework + // 2. Otherwise ask msbuild for the highestinstalled framework + let checkFrameworkForReferenceAssemblies (dotNetVersion:string) = + if not (String.IsNullOrEmpty(dotNetVersion)) then + try + let v = if dotNetVersion.StartsWith("v") then dotNetVersion.Substring(1) else dotNetVersion + let frameworkName = new System.Runtime.Versioning.FrameworkName(".NETFramework", new Version(v)) + match ToolLocationHelper.GetPathToReferenceAssemblies(frameworkName) |> Seq.tryHead with + | Some p -> if Directory.Exists(p) then true else false + | None -> false + with _ -> false + else false + match SupportedDesktopFrameworkVersions |> Seq.tryFind(fun v -> checkFrameworkForReferenceAssemblies v) with + | Some v -> v + | None -> getHighestInstalledDotNETFramework() +#else + getHighestInstalledDotNETFramework() #endif - elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version45)) <> null then Net45 - else Net45 // version is 4.5 assumed since this code is running. - with _ -> Net45 - /// Derive the target framework directories. + /// Derive the target framework directories. let DeriveTargetFrameworkDirectories (targetFrameworkVersion:string, logMessage) = let targetFrameworkVersion = if not(targetFrameworkVersion.StartsWith("v",StringComparison.Ordinal)) then "v"+targetFrameworkVersion else targetFrameworkVersion - let result = - if targetFrameworkVersion.StartsWith(Net10, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v1.0.3705"]) - elif targetFrameworkVersion.StartsWith(Net11, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v1.1.4322"]) - elif targetFrameworkVersion.StartsWith(Net20, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v2.0.50727"]) - elif targetFrameworkVersion.StartsWith(Net30, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{ReferenceAssemblies}\v3.0"; @"{WindowsFramework}\v3.0"; @"{WindowsFramework}\v2.0.50727"]) - elif targetFrameworkVersion.StartsWith(Net35, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{ReferenceAssemblies}\v3.5"; @"{WindowsFramework}\v3.5"; @"{ReferenceAssemblies}\v3.0"; @"{WindowsFramework}\v3.0"; @"{WindowsFramework}\v2.0.50727"]) - else GetPathToDotNetFrameworkReferenceAssemblies(targetFrameworkVersion) - - let result = result |> Array.ofList - logMessage (sprintf "Derived target framework directories for version %s are: %s" targetFrameworkVersion (String.Join(",", result))) + let result = GetPathToDotNetFrameworkReferenceAssemblies(targetFrameworkVersion) |> Array.ofList + logMessage (sprintf "Derived target framework directories for version %s are: %s" targetFrameworkVersion (String.Join(",", result))) result - + /// Describes the location where the reference was found, used only for debug and tooltip output type ResolvedFrom = | AssemblyFolders @@ -364,7 +371,7 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver let Resolver = { new ReferenceResolver.Resolver with - member __.HighestInstalledNetFrameworkVersion() = HighestInstalledNetFrameworkVersion() + member __.HighestInstalledNetFrameworkVersion() = HighestInstalledRefAssembliesOrDotNETFramework() member __.DotNetFrameworkReferenceAssembliesRootDirectory = DotNetFrameworkReferenceAssembliesRootDirectory /// Perform the resolution on rooted and unrooted paths, and then combine the results. diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index d51bbe953c..de5271eb67 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -346,9 +346,9 @@ type CalledMeth<'T> Choice1Of2(AssignedItemSetter(id, AssignedILFieldSetter(finfo), e)) | _ -> match infoReader.TryFindRecdOrClassFieldInfoOfType(nm, m, returnedObjTy) with - | Some rfinfo -> + | ValueSome rfinfo -> Choice1Of2(AssignedItemSetter(id, AssignedRecdFieldSetter(rfinfo), e)) - | None -> + | _ -> Choice2Of2(arg)) let names = namedCallerArgs |> List.map (fun (CallerNamedArg(nm, _)) -> nm.idText) @@ -585,7 +585,7 @@ let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = let hasCallInfo = ccallInfo.IsSome let mustTakeAddress = hasCallInfo || minfo.ObjArgNeedsAddress(amap, m) let objArgTy = tyOfExpr g objArgExpr - let wrap, objArgExpr', _readonly, _writeonly = mkExprAddrOfExpr g mustTakeAddress hasCallInfo isMutable objArgExpr None m + let wrap, objArgExpr', isReadOnly, _isWriteOnly = mkExprAddrOfExpr g mustTakeAddress hasCallInfo isMutable objArgExpr None m // Extension members and calls to class constraints may need a coercion for their object argument let objArgExpr' = @@ -595,6 +595,16 @@ let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = else objArgExpr' + // Check to see if the extension member uses the extending type as a byref. + // If so, make sure we don't allow readonly/immutable values to be passed byref from an extension member. + // An inref will work though. + if isReadOnly && mustTakeAddress && minfo.IsExtensionMember then + minfo.TryObjArgByrefType(amap, m, minfo.FormalMethodInst) + |> Option.iter (fun ty -> + if not (isInByrefTy g ty) then + errorR(Error(FSComp.SR.tcCannotCallExtensionMethodInrefToByref(minfo.DisplayName), m))) + + wrap, [objArgExpr'] | _ -> diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index cf4d50c4a2..9434740d31 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -155,6 +155,9 @@ type Item = /// Represents the resolution of a name to an F# record field. | RecdField of RecdFieldInfo + /// Represents the resolution of a name to a field of an anonymous record type. + | AnonRecdField of AnonRecdTypeInfo * TTypes * int * range + // The following are never in the items table but are valid results of binding // an identifier in different circumstances. @@ -226,6 +229,7 @@ type Item = | Item.UnionCase(uinfo,_) -> DecompileOpName uinfo.UnionCase.DisplayName | Item.ExnCase tcref -> tcref.LogicalName | Item.RecdField rfinfo -> DecompileOpName rfinfo.RecdField.Name + | Item.AnonRecdField (anonInfo, _tys, i, _m) -> anonInfo.SortedNames.[i] | Item.NewDef id -> id.idText | Item.ILField finfo -> finfo.FieldName | Item.Event einfo -> einfo.EventName @@ -430,8 +434,7 @@ let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.Import // Method must be static, have 'Extension' attribute, must not be curried, must have at least one argument if not minfo.IsInstance && not minfo.IsExtensionMember && - minfo.NumArgs.Length = 1 && - minfo.NumArgs.Head >= 1 && + (match minfo.NumArgs with [x] when x >= 1 -> true | _ -> false) && MethInfoHasAttribute g m g.attrib_ExtensionAttribute minfo then let ilExtMem = ILExtMem (tcrefOfStaticClass, minfo, pri) @@ -693,9 +696,6 @@ let private AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition (g:TcGlobals) eIndexedExtensionMembers = eIndexedExtensionMembers eUnindexedExtensionMembers = eUnindexedExtensionMembers } -let TryFindPatternByName name {ePatItems = patternMap} = - NameMap.tryFind name patternMap - /// Add a set of type definitions to the name resolution environment let AddTyconRefsToNameEnv bulkAddMode ownDefinition g amap m root nenv tcrefs = if isNil tcrefs then nenv else @@ -985,10 +985,8 @@ type TypeNameResolutionStaticArgsInfo = // Get the first possible mangled name of the type, assuming the args are generic args member x.MangledNameForType nm = - if IsMangledGenericName nm || x.NumStaticArgs = 0 then nm - else nm+"`"+string x.NumStaticArgs - - + if x.NumStaticArgs = 0 || TryDemangleGenericNameAndPos nm <> ValueNone then nm + else nm + "`" + string x.NumStaticArgs [] /// Represents information which guides name resolution of types. @@ -1011,17 +1009,21 @@ type TypeNameResolutionInfo = /// be used to qualify access if needed let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticArgsInfo) (mty:ModuleOrNamespaceType) = let attempt1 = mty.TypesByMangledName.TryFind (staticResInfo.MangledNameForType nm) - match attempt1 with - | Some _ as r -> r + match attempt1 with | None -> mty.TypesByMangledName.TryFind nm + | _ -> attempt1 /// Unqualified lookups of type names where the number of generic arguments is known /// from context, e.g. List. Rebindings due to 'open' may have rebound identifiers. let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = - let key = if IsMangledGenericName nm then DecodeGenericTypeName nm else NameArityPair(nm,numTyArgs) - match nenv.TyconsByDemangledNameAndArity(fq).TryFind(key) with - | Some res -> Some res + let key = + match TryDemangleGenericNameAndPos nm with + | ValueSome pos -> DecodeGenericTypeName pos nm + | _ -> NameArityPair(nm,numTyArgs) + + match nenv.TyconsByDemangledNameAndArity(fq).TryFind key with | None -> nenv.TyconsByAccessNames(fq).TryFind nm |> Option.map List.head + | res -> res /// Implements unqualified lookups of type names where the number of generic arguments is NOT known /// from context. @@ -1040,16 +1042,18 @@ let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = // In theory the full names such as ``RecordType`1`` can // also be used to qualify access if needed, though this is almost never needed. -let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap) (byAccessNames: LayeredMultiMap) = - if IsMangledGenericName nm then - match byDemangledNameAndArity.TryFind (DecodeGenericTypeName nm) with - | Some res -> [res] - | None -> - match byAccessNames.TryFind nm with - | Some res -> res - | None -> [] - else - byAccessNames.[nm] +let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap) (byAccessNames: LayeredMultiMap) = + match TryDemangleGenericNameAndPos nm with + | ValueSome pos -> + let demangled = DecodeGenericTypeName pos nm + match byDemangledNameAndArity.TryGetValue demangled with + | true, res -> [res] + | _ -> + match byAccessNames.TryGetValue nm with + | true, res -> res + | _ -> [] + | _ -> + byAccessNames.[nm] /// Qualified lookup of type names in the environment let LookupTypeNameInEnvNoArity fq nm (nenv: NameResolutionEnv) = @@ -1096,7 +1100,7 @@ let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceR let tycon = Construct.NewProvidedTycon(resolutionEnvironment, st, importProvidedType, isSuppressRelocate, m) modref.ModuleOrNamespaceType.AddProvidedTypeEntity(tycon) let tcref = modref.NestedTyconRef tycon - System.Diagnostics.Debug.Assert modref.TryDeref.IsSome + System.Diagnostics.Debug.Assert(ValueOptionInternal.isSome modref.TryDeref) tcref @@ -1208,7 +1212,7 @@ let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, chec //------------------------------------------------------------------------- /// Represents the kind of the occurrence when reporting a name in name resolution -[] +[] type ItemOccurence = /// This is a binding / declaration of the item | Binding @@ -1247,8 +1251,8 @@ type OpenDeclaration = IsOwnNamespace = isOwnNamespace } type FormatStringCheckContext = - { NormalizedSource: string - LineEndPositions: int[] } + { Source: string + LineStartPositions: int[] } /// An abstract type for reporting the results of name resolution and type checking. type ITypecheckResultsSink = @@ -1411,6 +1415,8 @@ let ItemsAreEffectivelyEqual g orig other = | (Item.ArgName (id,_, _), ValUse vref) | (ValUse vref, Item.ArgName (id, _, _)) -> ((id.idRange = vref.DefinitionRange || id.idRange = vref.SigRange) && id.idText = vref.DisplayName) + | Item.AnonRecdField(anon1, _, i1, _), Item.AnonRecdField(anon2, _, i2, _) -> Tastops.anonInfoEquiv anon1 anon2 && i1 = i2 + | ILFieldUse f1, ILFieldUse f2 -> ILFieldInfo.ILFieldInfosUseIdenticalDefinitions f1 f2 @@ -1490,17 +1496,24 @@ type TcSymbolUseData = /// This is a memory-critical data structure - allocations of this data structure and its immediate contents /// is one of the highest memory long-lived data structures in typical uses of IDEs. Not many of these objects /// are allocated (one per file), but they are large because the allUsesOfAllSymbols array is large. -type TcSymbolUses(g, capturedNameResolutions : ResizeArray, formatSpecifierLocations: (range * int)[]) = - +type TcSymbolUses(g, capturedNameResolutions : ResizeArray, formatSpecifierLocations: (range * int)[]) = + // Make sure we only capture the information we really need to report symbol uses - let allUsesOfSymbols = [| for cnr in capturedNameResolutions -> { Item=cnr.Item; ItemOccurence=cnr.ItemOccurence; DisplayEnv=cnr.DisplayEnv; Range=cnr.Range } |] + let allUsesOfSymbols = + capturedNameResolutions + |> ResizeArray.mapToSmallArrayChunks (fun cnr -> { Item=cnr.Item; ItemOccurence=cnr.ItemOccurence; DisplayEnv=cnr.DisplayEnv; Range=cnr.Range }) + let capturedNameResolutions = () do ignore capturedNameResolutions // don't capture this! member this.GetUsesOfSymbol(item) = - [| for symbolUse in allUsesOfSymbols do - if protectAssemblyExploration false (fun () -> ItemsAreEffectivelyEqual g item symbolUse.Item) then - yield symbolUse |] + // This member returns what is potentially a very large array, which may approach the size constraints of the Large Object Heap. + // This is unlikely in practice, though, because we filter down the set of all symbol uses to those specifically for the given `item`. + // Consequently we have a much lesser chance of ending up with an array large enough to be promoted to the LOH. + [| for symbolUseChunk in allUsesOfSymbols do + for symbolUse in symbolUseChunk do + if protectAssemblyExploration false (fun () -> ItemsAreEffectivelyEqual g item symbolUse.Item) then + yield symbolUse |] member this.AllUsesOfSymbols = allUsesOfSymbols @@ -1532,14 +1545,18 @@ type TcResultsSinkImpl(g, ?source: string) = let formatStringCheckContext = lazy source |> Option.map (fun source -> - let source = source.Replace("\r\n", "\n").Replace("\r", "\n") let positions = - source.Split('\n') - |> Seq.map (fun s -> String.length s + 1) - |> Seq.scan (+) 0 - |> Seq.toArray - { NormalizedSource = source - LineEndPositions = positions }) + [| + yield 0 + for i in 1..source.Length do + let c = source.[i-1] + if c = '\r' && i < source.Length && source.[i] = '\n' then () + elif c = '\r' then yield i + elif c = '\n' then yield i + yield source.Length + |] + { Source = source + LineStartPositions = positions }) member this.GetResolutions() = TcResolutions(capturedEnvs, capturedExprTypings, capturedNameResolutions, capturedMethodGroupResolutions) @@ -1693,6 +1710,7 @@ let CheckAllTyparsInferrable amap m item = | Item.UnionCase _ | Item.ExnCase _ | Item.RecdField _ + | Item.AnonRecdField _ | Item.NewDef _ | Item.ILField _ | Item.Event _ @@ -1846,15 +1864,15 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu let occurence = if isOpenDecl then ItemOccurence.Open else ItemOccurence.Use CallNameResolutionSink sink (m, nenv, item, item, emptyTyparInst, occurence, nenv.DisplayEnv, ad) - match moduleOrNamespaces.TryFind id.idText with - | Some modrefs -> + match moduleOrNamespaces.TryGetValue id.idText with + | true, modrefs -> /// Look through the sub-namespaces and/or modules let rec look depth (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) (lid:Ident list) = match lid with | [] -> success (depth,modref,mty) | id :: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind id.idText with - | Some mspec -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, mspec -> let subref = modref.NestedTyconRef mspec if IsEntityAccessible amap m ad subref then notifyNameResolution subref id.idRange @@ -1870,7 +1888,7 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu look 1 modref modref.ModuleOrNamespaceType rest else raze (namespaceNotFound.Force())) - | None -> raze (namespaceNotFound.Force()) + | _ -> raze (namespaceNotFound.Force()) let ResolveLongIndentAsModuleOrNamespaceThen sink atMostOne amap m fullyQualified (nenv:NameResolutionEnv) ad id rest isOpenDecl f = @@ -2046,13 +2064,22 @@ type LookupKind = /// Try to find a union case of a type, with the given name let TryFindUnionCaseOfType g ty nm = - if isAppTy g ty then - let tcref,tinst = destAppTy g ty + match tryAppTy g ty with + | ValueSome(tcref,tinst) -> match tcref.GetUnionCaseByName nm with + | None -> ValueNone + | Some ucase -> ValueSome(UnionCaseInfo(tinst,tcref.MakeNestedUnionCaseRef ucase)) + | _ -> + ValueNone + +/// Try to find a union case of a type, with the given name +let TryFindAnonRecdFieldOfType g typ nm = + match tryDestAnonRecdTy g typ with + | ValueSome (anonInfo, tys) -> + match anonInfo.SortedIds |> Array.tryFindIndex (fun x -> x.idText = nm) with + | Some i -> Some (Item.AnonRecdField(anonInfo, tys, i, anonInfo.SortedIds.[i].idRange)) | None -> None - | Some ucase -> Some(UnionCaseInfo(tinst,tcref.MakeNestedUnionCaseRef ucase)) - else - None + | ValueNone -> None let CoreDisplayName(pinfo:PropInfo) = match pinfo with @@ -2104,14 +2131,22 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo let unionCaseSearch = match lookupKind with | LookupKind.Expr | LookupKind.Pattern -> TryFindUnionCaseOfType g ty nm - | _ -> None + | _ -> ValueNone // Lookup: datatype constructors take precedence match unionCaseSearch with - | Some ucase -> + | ValueSome ucase -> OneResult (success(resInfo,Item.UnionCase(ucase,false),rest)) - | None -> - let isLookUpExpr = lookupKind = LookupKind.Expr + | ValueNone -> + let anonRecdSearch = + match lookupKind with + | LookupKind.Expr -> TryFindAnonRecdFieldOfType g ty nm + | _ -> None + match anonRecdSearch with + | Some item -> + OneResult (success(resInfo, item, rest)) + | None -> + let isLookUpExpr = (lookupKind = LookupKind.Expr) match TryFindIntrinsicNamedItemOfType ncenv.InfoReader (nm,ad) findFlag m ty with | Some (PropertyItem psets) when isLookUpExpr -> let pinfos = psets |> ExcludeHiddenOfPropInfos g ncenv.amap m @@ -2124,6 +2159,7 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo match DecodeFSharpEvent (pinfos@extensionPropInfos) ad g ncenv m with | Some x -> success [resInfo, x, rest] | None -> raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id,NoSuggestions)) + | Some(MethodItem msets) when isLookUpExpr -> let minfos = msets |> ExcludeHiddenOfMethInfos g ncenv.amap m @@ -2136,8 +2172,10 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo | Some (EventItem (einfo :: _)) when isLookUpExpr -> success [resInfo,Item.Event einfo,rest] + | Some (RecdFieldItem (rfinfo)) when (match lookupKind with LookupKind.Expr | LookupKind.RecdField | LookupKind.Pattern -> true | _ -> false) -> success [resInfo,Item.RecdField(rfinfo),rest] + | _ -> let pinfos = ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (optFilter, ad) m ty @@ -2199,7 +2237,7 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo match lookupKind with | LookupKind.Expr | LookupKind.Pattern -> if isAppTy g ty then - let tcref,_ = destAppTy g ty + let tcref = tcrefOfAppTy g ty tcref.UnionCasesArray |> Array.map (fun uc -> uc.DisplayName) else @@ -2257,12 +2295,12 @@ let (|AccessibleEntityRef|_|) amap m ad (modref: ModuleOrNamespaceRef) mspec = 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 let m = unionRanges m id.idRange - match mty.AllValsByLogicalName.TryFind(id.idText) with - | Some vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> + match mty.AllValsByLogicalName.TryGetValue id.idText with + | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> success(resInfo,Item.Value (mkNestedValRef modref vspec),rest) | _-> - match mty.ExceptionDefinitionsByDemangledName.TryFind(id.idText) with - | Some excon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef excon) -> + match mty.ExceptionDefinitionsByDemangledName.TryGetValue id.idText with + | true, excon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef excon) -> success (resInfo,Item.ExnCase (modref.NestedTyconRef excon),rest) | _ -> // Something in a discriminated union without RequireQualifiedAccess attribute? @@ -2308,8 +2346,8 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN let moduleSearch() = match rest with | id2::rest2 -> - match mty.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let resInfo = resInfo.AddEntity(id.idRange,submodref) OneResult (ResolveExprLongIdentInModuleOrNamespace ncenv nenv typeNameResInfo ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2) @@ -2394,10 +2432,10 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified let typeError = ref None // Single identifier. Lookup the unqualified names in the environment let envSearch = - match nenv.eUnqualifiedItems.TryFind(id.idText) with + match nenv.eUnqualifiedItems.TryGetValue id.idText with // The name is a type name and it has not been clobbered by some other name - | Some (Item.UnqualifiedType tcrefs) -> + | true, Item.UnqualifiedType tcrefs -> // Do not use type names from the environment if an explicit type instantiation is // given and the number of type parameters do not match @@ -2414,9 +2452,9 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified Some(item,rest) | Exception e -> typeError := Some e; None - | Some res -> + | true, res -> Some (FreshenUnqualifiedItem ncenv m res, []) - | None -> + | _ -> None match envSearch with @@ -2498,8 +2536,8 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified match fullyQualified with | FullyQualified -> false | _ -> - match nenv.eUnqualifiedItems.TryFind(nm) with - | Some(Item.Value _) -> true + match nenv.eUnqualifiedItems.TryGetValue nm with + | true, Item.Value _ -> true | _ -> false if ValIsInEnv id.idText then @@ -2530,10 +2568,10 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified | FullyQualified -> NoResultsOrUsefulErrors | OpenQualified -> - match nenv.eUnqualifiedItems.TryFind id.idText with - | Some (Item.UnqualifiedType _) - | None -> NoResultsOrUsefulErrors - | Some res -> OneSuccess (resInfo,FreshenUnqualifiedItem ncenv m res,rest) + match nenv.eUnqualifiedItems.TryGetValue id.idText with + | true, Item.UnqualifiedType _ + | false, _ -> NoResultsOrUsefulErrors + | true, res -> OneSuccess (resInfo,FreshenUnqualifiedItem ncenv m res,rest) moduleSearch ad () +++ tyconSearch ad +++ envSearch @@ -2597,17 +2635,17 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num let ucinfo = FreshenUnionCaseRef ncenv m ucref success (resInfo,Item.UnionCase(ucinfo,showDeprecated),rest) | _ -> - match mty.ExceptionDefinitionsByDemangledName.TryFind(id.idText) with - | Some exnc when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef exnc) -> + match mty.ExceptionDefinitionsByDemangledName.TryGetValue id.idText with + | true, exnc when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef exnc) -> success (resInfo,Item.ExnCase (modref.NestedTyconRef exnc),rest) | _ -> // An active pattern constructor in a module - match (ActivePatternElemsOfModuleOrNamespace modref).TryFind(id.idText) with - | Some ( APElemRef(_,vref,_) as apref) when IsValAccessible ad vref -> + match (ActivePatternElemsOfModuleOrNamespace modref).TryGetValue id.idText with + | true, (APElemRef(_,vref,_) as apref) when IsValAccessible ad vref -> success (resInfo,Item.ActivePatternCase apref,rest) | _ -> - match mty.AllValsByLogicalName.TryFind(id.idText) with - | Some vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> + match mty.AllValsByLogicalName.TryGetValue id.idText with + | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> success(resInfo,Item.Value (mkNestedValRef modref vspec),rest) | _ -> let tcrefs = lazy ( @@ -2637,8 +2675,8 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num let moduleSearch() = match rest with | id2::rest2 -> - match mty.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let resInfo = resInfo.AddEntity(id.idRange,submodref) OneResult (ResolvePatternLongIdentInModuleOrNamespace ncenv nenv numTyArgsOpt ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2) | _ -> @@ -2685,8 +2723,8 @@ let rec ResolvePatternLongIdentPrim sink (ncenv:NameResolver) fullyQualified war // Single identifiers in patterns - bind to constructors and active patterns // For the special case of // let C = x - match nenv.ePatItems.TryFind(id.idText) with - | Some res when not newDef -> FreshenUnqualifiedItem ncenv m res + match nenv.ePatItems.TryGetValue id.idText with + | true, res when not newDef -> FreshenUnqualifiedItem ncenv m res | _ -> // Single identifiers in patterns - variable bindings if not newDef && @@ -2832,8 +2870,8 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv:NameRes | id2::rest2 -> let m = unionRanges m id.idRange let modulSearch = - match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + 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, item, emptyTyparInst, ItemOccurence.Use, nenv.DisplayEnv, ad) let resInfo = resInfo.AddEntity(id.idRange,submodref) @@ -2998,8 +3036,8 @@ let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:Re let modulSearch() = match rest with | id2::rest2 -> - match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let resInfo = resInfo.AddEntity(id.idRange,submodref) ResolveFieldInModuleOrNamespace ncenv nenv ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2 |> OneResult @@ -3033,9 +3071,9 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel else let possibleRecords = [for fld in givenFields do - match Map.tryFind fld nenv.eFieldLabels with - | None -> () - | Some recordTypes -> yield! (recordTypes |> List.map (fun r -> r.TyconRef.DisplayName, fld)) ] + match nenv.eFieldLabels.TryGetValue fld with + | true, recordTypes -> yield! (recordTypes |> List.map (fun r -> r.TyconRef.DisplayName, fld)) + | _ -> () ] |> List.groupBy fst |> List.map (fun (r,fields) -> r, fields |> List.map snd) |> List.filter (fun (_,fields) -> givenFields.IsSubsetOf fields) @@ -3093,8 +3131,8 @@ let ResolveFieldPrim sink (ncenv:NameResolver) nenv ad ty (mp,id:Ident) allField if isAppTy g ty then match ncenv.InfoReader.TryFindRecdOrClassFieldInfoOfType(id.idText,m,ty) with - | Some (RecdFieldInfo(_,rfref)) -> [ResolutionInfo.Empty, FieldResolution(rfref,false)] - | None -> + | ValueSome (RecdFieldInfo(_,rfref)) -> [ResolutionInfo.Empty, FieldResolution(rfref,false)] + | _ -> if isRecdTy g ty then // record label doesn't belong to record type -> suggest other labels of same record let suggestLabels() = SuggestOtherLabelsOfSameRecordType g nenv ty id allFields @@ -3173,8 +3211,8 @@ let private ResolveExprDotLongIdent (ncenv:NameResolver) m ad nenv ty (id:Ident) if isAppTy ncenv.g ty then NoResultsOrUsefulErrors else - match nenv.eFieldLabels |> Map.tryFind id.idText with - | Some(rfref :: _) -> + match nenv.eFieldLabels.TryGetValue id.idText with + | true, rfref :: _ -> // NOTE (instantiationGenerator cleanup): we need to freshen here because we don't know the type. // But perhaps the caller should freshen?? let item = FreshenRecdFieldRef ncenv m rfref @@ -3403,27 +3441,25 @@ let ItemOfTy g x = let nm = if isAppTy g x then (tcrefOfAppTy g x).DisplayName else "?" Item.Types (nm,[x]) -// Filter out 'PrivateImplementationDetail' classes -let IsInterestingModuleName nm = - String.length nm >= 1 && - String.sub nm 0 1 <> "<" +// Filter out 'PrivateImplementationDetail' classes +let IsInterestingModuleName nm = not (System.String.IsNullOrEmpty nm) && nm.[0] <> '<' let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f plid (modref:ModuleOrNamespaceRef) = let mty = modref.ModuleOrNamespaceType match plid with | [] -> f modref | id:: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind(id) with - | Some mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest (modref.NestedTyconRef mty) - | None -> [] + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest (modref.NestedTyconRef mty) + | _ -> [] let PartialResolveLongIndentAsModuleOrNamespaceThen (nenv:NameResolutionEnv) plid f = - match plid with + match plid with | id:: rest -> - match Map.tryFind id nenv.eModulesAndNamespaces with - | Some modrefs -> + match nenv.eModulesAndNamespaces.TryGetValue id with + | true, modrefs -> List.collect (PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest) modrefs - | None -> + | _ -> [] | [] -> [] @@ -3452,12 +3488,14 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) |> List.filter (fun rfref -> rfref.IsStatic = statics && IsFieldInfoAccessible ad rfref) - let ucinfos = - if completionTargets.ResolveAll && statics && isAppTy g ty then - let tc,tinst = destAppTy g ty - tc.UnionCasesAsRefList - |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) - |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + let ucinfos = + if completionTargets.ResolveAll && statics then + match tryAppTy g ty with + | ValueSome (tc,tinst) -> + tc.UnionCasesAsRefList + |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) + |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + | _ -> [] else [] let einfos = @@ -3509,13 +3547,11 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso yield einfo.RemoveMethod.DisplayName ] else [] - let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) - let pinfos = pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - let minfoFilter (minfo:MethInfo) = + let minfoFilter (suppressedMethNames:Zset<_>) (minfo:MethInfo) = let isApplicableMeth = match completionTargets with | ResolveCompletionTargets.All x -> x @@ -3576,39 +3612,55 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso // REVIEW: add a name filter here in the common cases? let minfos = if completionTargets.ResolveAll then - let minfos = - AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty - |> List.filter minfoFilter + let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty + if isNil minfos then + [] + else + let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) - let minfos = - let addersAndRemovers = - pinfoItems - |> List.collect (function Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> [addValRef.LogicalName;removeValRef.LogicalName] | _ -> []) - |> set + let minfos = + minfos + |> List.filter (minfoFilter suppressedMethNames) - if addersAndRemovers.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) + if isNil minfos then + [] + else + let minfos = + let addersAndRemovers = + let hashSet = HashSet() + for item in pinfoItems do + match item with + | Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> + hashSet.Add addValRef.LogicalName |> ignore + hashSet.Add removeValRef.LogicalName |> ignore + | _ -> () + hashSet + + if addersAndRemovers.Count = 0 then minfos + else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) #if !NO_EXTENSIONTYPING - // Filter out the ones with mangled names from applying static parameters - let minfos = - let methsWithStaticParams = - minfos - |> List.filter (fun minfo -> - match minfo.ProvidedStaticParameterInfo with - | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 - | _ -> false) - |> List.map (fun minfo -> minfo.DisplayName) - - if methsWithStaticParams.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> - let nm = minfo.LogicalName - not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) + // Filter out the ones with mangled names from applying static parameters + let minfos = + let methsWithStaticParams = + minfos + |> List.filter (fun minfo -> + match minfo.ProvidedStaticParameterInfo with + | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 + | _ -> false) + |> List.map (fun minfo -> minfo.DisplayName) + + if methsWithStaticParams.IsEmpty then minfos + else minfos |> List.filter (fun minfo -> + let nm = minfo.LogicalName + not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) #endif - minfos + minfos + + else + [] - else [] // Partition methods into overload sets let rec partitionl (l:MethInfo list) acc = match l with @@ -3617,10 +3669,20 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso let nm = h.LogicalName partitionl t (NameMultiMap.add nm h acc) + let anonFields = + if statics then [] + else + match tryDestAnonRecdTy g ty with + | ValueSome (anonInfo, tys) -> + [ for (i,id) in Array.indexed anonInfo.SortedIds do + yield Item.AnonRecdField(anonInfo, tys, i, id.idRange) ] + | _ -> [] + // Build the results ucinfos @ List.map Item.RecdField rfinfos @ pinfoItems @ + anonFields @ List.map Item.ILField finfos @ List.map Item.Event einfos @ List.map (ItemOfTy g) nestedTypes @ @@ -3635,29 +3697,33 @@ let rec ResolvePartialLongIdentInType (ncenv: NameResolver) nenv isApplicableMet | id :: rest -> let rfinfos = - ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) - |> List.filter (fun fref -> IsRecdFieldAccessible ncenv.amap m ad fref.RecdFieldRef) - |> List.filter (fun fref -> fref.RecdField.IsStatic = statics) + ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) + |> List.filter (fun fref -> fref.Name = id && IsRecdFieldAccessible ncenv.amap m ad fref.RecdFieldRef && fref.RecdField.IsStatic = statics) let nestedTypes = ty |> GetNestedTypesOfType (ad, ncenv, Some id, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) // e.g. .. - (rfinfos |> List.filter (fun x -> x.Name = id) - |> List.collect (fun x -> x.FieldType |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ + (rfinfos |> List.collect (fun x -> x.FieldType |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ // e.g. .. let FullTypeOfPinfo(pinfo:PropInfo) = - let rty = pinfo.GetPropertyType(amap,m) - let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty - rty + let rty = pinfo.GetPropertyType(amap,m) + let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty + rty + (ty |> AllPropInfosOfTypeInScope ncenv.InfoReader nenv (Some id,ad) IgnoreOverrides m - |> List.filter (fun x -> x.IsStatic = statics) - |> List.filter (IsPropInfoAccessible g amap m ad) + |> List.filter (fun pinfo -> pinfo.IsStatic = statics && IsPropInfoAccessible g amap m ad pinfo) |> List.collect (fun pinfo -> (FullTypeOfPinfo pinfo) |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ + (if statics then [] + else + match TryFindAnonRecdFieldOfType g ty id with + | Some (Item.AnonRecdField(_anonInfo, tys, i, _)) -> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest tys.[i] + | _ -> []) @ + // e.g. .. (ncenv.InfoReader.GetEventInfosOfType(Some id,ad,m,ty) |> List.collect (PropTypOfEventInfo ncenv.InfoReader m ad >> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ @@ -3689,9 +3755,10 @@ let InfosForTyconConstructors (ncenv:NameResolver) m ad (tcref:TyconRef) = | Item.CtorGroup(nm,ctorInfos) -> let ctors = ctorInfos - |> List.filter (IsMethInfoAccessible amap m ad) - |> List.filter (MethInfoIsUnseen g m ty >> not) - match ctors with + |> List.filter (fun minfo -> + IsMethInfoAccessible amap m ad minfo && + not (MethInfoIsUnseen g m ty minfo)) + match ctors with | [] -> [] | _ -> [Item.MakeCtorGroup(nm,ctors)] | item -> @@ -3699,9 +3766,23 @@ let InfosForTyconConstructors (ncenv:NameResolver) m ad (tcref:TyconRef) = | Exception _ -> [] /// import.fs creates somewhat fake modules for nested members of types (so that -/// types never contain other types) -let notFakeContainerModule tyconNames nm = - not (Set.contains nm tyconNames) +/// types never contain other types) +let inline notFakeContainerModule (tyconNames:HashSet<_>) nm = + not (tyconNames.Contains nm) + +let getFakeContainerModulesFromTycons (tycons:#seq) = + let hashSet = HashSet() + for tycon in tycons do + if tycon.IsILTycon then + hashSet.Add tycon.DisplayName |> ignore + hashSet + +let getFakeContainerModulesFromTyconRefs (tyconRefs:#seq) = + let hashSet = HashSet() + for tyconRef in tyconRefs do + if tyconRef.IsILTycon then + hashSet.Add tyconRef.DisplayName |> ignore + hashSet /// Check is a namespace or module contains something accessible let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad (modref:ModuleOrNamespaceRef) = @@ -3745,21 +3826,34 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is match plid with | [] -> let tycons = - mty.TypeDefinitions - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tycon -> not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tycon))) - - let ilTyconNames = - mty.TypesByAccessNames.Values - |> List.choose (fun (tycon:Tycon) -> if tycon.IsILTycon then Some tycon.DisplayName else None) - |> Set.ofList + mty.TypeDefinitions |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) + + let accessibleSubModules = + let moduleOrNamespaces = + mty.ModulesAndNamespacesByDemangledName + |> NameMap.range + + if isNil moduleOrNamespaces then [] else + + let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values + + moduleOrNamespaces + |> List.filter (fun x -> + let demangledName = x.DemangledModuleOrNamespaceName + notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) + |> List.map modref.NestedTyconRef + |> List.filter (fun tyref -> + not (IsTyconUnseen ad g ncenv.amap m tyref) && + EntityRefContainsSomethingAccessible ncenv m ad tyref) + |> List.map ItemForModuleOrNamespaceRef // Collect up the accessible values in the module, excluding the members (mty.AllValsAndMembers |> Seq.toList |> List.choose (TryMkValRefInModRef modref) // if the assembly load set is incomplete and we get a None value here, then ignore the value - |> List.filter (fun v -> not v.IsMember) - |> List.filter (IsValUnseen ad g m >> not) + |> List.filter (fun vref -> not vref.IsMember && not (IsValUnseen ad g m vref)) |> List.map Item.Value) // Collect up the accessible discriminated union cases in the module @@ -3781,16 +3875,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) |> List.map Item.ExnCase) - // Collect up the accessible sub-modules - @ (mty.ModulesAndNamespacesByDemangledName - |> NameMap.range - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) - |> List.map modref.NestedTyconRef - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) - |> List.map ItemForModuleOrNamespaceRef) + @ accessibleSubModules // Get all the types and .NET constructor groups accessible from here @ (tycons @@ -3801,11 +3886,13 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is | id :: rest -> - (match mty.ModulesAndNamespacesByDemangledName.TryFind(id) with - | Some mspec - when not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m (modref.NestedTyconRef mspec) allowObsolete) -> - let allowObsolete = rest <> [] && allowObsolete - ResolvePartialLongIdentInModuleOrNamespace ncenv nenv isApplicableMeth m ad (modref.NestedTyconRef mspec) rest allowObsolete + (match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mspec -> + let nested = modref.NestedTyconRef mspec + if IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested allowObsolete then [] else + let allowObsolete = allowObsolete && not (isNil rest) + ResolvePartialLongIdentInModuleOrNamespace ncenv nenv isApplicableMeth m ad nested rest allowObsolete + | _ -> []) @ (LookupTypeNameInEntityNoArity m id modref.ModuleOrNamespaceType @@ -3823,30 +3910,27 @@ let TryToResolveLongIdentAsType (ncenv: NameResolver) (nenv: NameResolutionEnv) match List.tryLast plid with | Some id -> // Look for values called 'id' that accept the dot-notation - let ty, isItemVal = - (match nenv.eUnqualifiedItems |> Map.tryFind id with + let ty = + match nenv.eUnqualifiedItems.TryGetValue id with // v.lookup : member of a value - | Some v -> - match v with - | Item.Value x -> - let ty = x.Type - let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty - Some ty, true - | _ -> None, false - | None -> None, false) - - if isItemVal then ty - else - (ty, LookupTypeNameInEnvNoArity OpenQualified id nenv) - ||> List.fold (fun resTy tcref -> - // type.lookup : lookup a static something in a type + | true, v -> + match v with + | Item.Value x -> + let ty = x.Type + let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty + Some ty + | _ -> None + | _ -> None + + match ty with + | Some _ -> ty + | _ -> + // type.lookup : lookup a static something in a type + LookupTypeNameInEnvNoArity OpenQualified id nenv + |> List.tryHead + |> Option.map (fun tcref -> let tcref = ResolveNestedTypeThroughAbbreviation ncenv tcref m - let ty = FreshenTycon ncenv m tcref - let resTy = - match resTy with - | Some _ -> resTy - | None -> Some ty - resTy) + FreshenTycon ncenv m tcref) | _ -> None /// allowObsolete - specifies whether we should return obsolete types & modules @@ -3861,10 +3945,6 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE | [] -> - let ilTyconNames = - nenv.TyconsByAccessNames(fullyQualified).Values - |> List.choose (fun tyconRef -> if tyconRef.IsILTycon then Some tyconRef.DisplayName else None) - |> Set.ofList /// Include all the entries in the eUnqualifiedItems table. let unqualifiedItems = @@ -3886,21 +3966,28 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE |> NameMap.range |> List.filter (function Item.ActivePatternCase _v -> true | _ -> false) - let moduleAndNamespaceItems = - nenv.ModulesAndNamespaces(fullyQualified) - |> NameMultiMap.range - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + let moduleAndNamespaceItems = + let moduleOrNamespaceRefs = + nenv.ModulesAndNamespaces fullyQualified + |> NameMultiMap.range + + if isNil moduleOrNamespaceRefs then [] else + let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(fullyQualified).Values) + + moduleOrNamespaceRefs + |> List.filter (fun modref -> + let demangledName = modref.DemangledModuleOrNamespaceName + IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName && + EntityRefContainsSomethingAccessible ncenv m ad modref && + not (IsTyconUnseen ad g ncenv.amap m modref)) |> List.map ItemForModuleOrNamespaceRef let tycons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tcref -> not tcref.IsExceptionDecl) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + not tcref.IsExceptionDecl && + not (IsTyconUnseen ad g ncenv.amap m tcref)) |> List.map (ItemOfTyconRef ncenv m) // Get all the constructors accessible from here @@ -3923,16 +4010,16 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE []) // Look for values called 'id' that accept the dot-notation let values, isItemVal = - (match nenv.eUnqualifiedItems |> Map.tryFind id with + (match nenv.eUnqualifiedItems.TryGetValue id with // v.lookup : member of a value - | Some v -> + | true, v -> match v with | Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty (ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest ty), true | _ -> [], false - | None -> [], false) + | _ -> [], false) let staticSometingInType = [ if not isItemVal then @@ -3958,43 +4045,52 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe // get record type constructors let tycons = mty.TypeDefinitions - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tycon -> tycon.IsRecordTycon) - |> List.filter (fun tycon -> not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tycon))) - - let ilTyconNames = - mty.TypesByAccessNames.Values - |> List.choose (fun (tycon:Tycon) -> if tycon.IsILTycon then Some tycon.DisplayName else None) - |> Set.ofList + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + tcref.IsRecordTycon && + not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) + + + let accessibleSubModules = + let moduleOrNamespaces = + mty.ModulesAndNamespacesByDemangledName + |> NameMap.range + + if isNil moduleOrNamespaces then [] else + + let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values - // Collect up the accessible sub-modules - (mty.ModulesAndNamespacesByDemangledName - |> NameMap.range - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) - |> List.map modref.NestedTyconRef - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) - |> List.map ItemForModuleOrNamespaceRef) + moduleOrNamespaces + |> List.filter (fun x -> + let demangledName = x.DemangledModuleOrNamespaceName + notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) + |> List.map modref.NestedTyconRef + |> List.filter (fun tcref -> + not (IsTyconUnseen ad g ncenv.amap m tcref) && + EntityRefContainsSomethingAccessible ncenv m ad tcref) + |> List.map ItemForModuleOrNamespaceRef + + accessibleSubModules // Collect all accessible record types @ (tycons |> List.map (modref.NestedTyconRef >> ItemOfTyconRef ncenv m) ) @ [ // accessible record fields for tycon in tycons do - if IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) then - let ttype = FreshenTycon ncenv m (modref.NestedTyconRef tycon) + let nested = modref.NestedTyconRef tycon + if IsEntityAccessible ncenv.amap m ad nested then + let ttype = FreshenTycon ncenv m nested yield! ncenv.InfoReader.GetRecordOrClassFieldsOfType(None, ad, m, ttype) |> List.map Item.RecdField ] | id :: rest -> - (match mty.ModulesAndNamespacesByDemangledName.TryFind(id) with - | Some mspec - when not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m (modref.NestedTyconRef mspec) allowObsolete) -> - let allowObsolete = rest <> [] && allowObsolete - ResolvePartialLongIdentInModuleOrNamespaceForRecordFields ncenv nenv m ad (modref.NestedTyconRef mspec) rest allowObsolete + (match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mspec -> + let nested = modref.NestedTyconRef mspec + if IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested allowObsolete then [] else + let allowObsolete = allowObsolete && not (isNil rest) + ResolvePartialLongIdentInModuleOrNamespaceForRecordFields ncenv nenv m ad nested rest allowObsolete | _ -> []) @ ( match rest with @@ -4026,26 +4122,31 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: | [] -> // empty plid - return namespaces\modules\record types\accessible fields - let iltyconNames = - nenv.TyconsByAccessNames(fullyQualified).Values - |> List.choose (fun tyconRef -> if tyconRef.IsILTycon then Some tyconRef.DisplayName else None) - |> Set.ofList + let mods = - nenv.ModulesAndNamespaces(fullyQualified) - |> NameMultiMap.range - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - IsInterestingModuleName demangledName && notFakeContainerModule iltyconNames demangledName) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + let moduleOrNamespaceRefs = + nenv.ModulesAndNamespaces fullyQualified + |> NameMultiMap.range + + if isNil moduleOrNamespaceRefs then [] else + + let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(fullyQualified).Values) + + moduleOrNamespaceRefs + |> List.filter (fun modref -> + let demangledName = modref.DemangledModuleOrNamespaceName + IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName && + EntityRefContainsSomethingAccessible ncenv m ad modref && + not (IsTyconUnseen ad g ncenv.amap m modref)) |> List.map ItemForModuleOrNamespaceRef let recdTyCons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tcref -> tcref.IsRecordTycon) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + tcref.IsRecordTycon && + not (IsTyconUnseen ad g ncenv.amap m tcref)) |> List.map (ItemOfTyconRef ncenv m) let recdFields = @@ -4092,12 +4193,14 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( |> List.filter (fun rfref -> rfref.IsStatic = statics && IsFieldInfoAccessible ad rfref) |> List.map Item.RecdField | Item.UnionCase _ -> - if statics && isAppTy g ty then - let tc, tinst = destAppTy g ty - yield! - tc.UnionCasesAsRefList - |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) - |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + if statics then + match tryAppTy g ty with + | ValueSome(tc, tinst) -> + yield! + tc.UnionCasesAsRefList + |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) + |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + | _ -> () | Item.Event _ -> yield! ncenv.InfoReader.GetEventInfosOfType(None,ad,m,ty) @@ -4117,6 +4220,13 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( if statics then yield! ty |> GetNestedTypesOfType (ad, ncenv, None, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) |> List.map (ItemOfTy g) | _ -> + if not statics then + match tryDestAnonRecdTy g ty with + | ValueSome (anonInfo, tys) -> + for (i,id) in Array.indexed anonInfo.SortedIds do + yield Item.AnonRecdField(anonInfo, tys, i, id.idRange) + | _ -> () + let pinfosIncludingUnseen = AllPropInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty |> List.filter (fun x -> @@ -4148,13 +4258,12 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( yield einfo.AddMethod.DisplayName yield einfo.RemoveMethod.DisplayName ] - let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) let pinfos = pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - let minfoFilter (minfo: MethInfo) = + let minfoFilter (suppressedMethNames:Zset<_>) (minfo: MethInfo) = // Only show the Finalize, MemberwiseClose etc. methods on System.Object for values whose static type really is // System.Object. Few of these are typically used from F#. // @@ -4205,37 +4314,49 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( | Item.MethodGroup _ -> // REVIEW: add a name filter here in the common cases? let minfos = - let minfos = - AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty - |> List.filter minfoFilter - + let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty + if isNil minfos then [] else + + let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) let minfos = - let addersAndRemovers = - pinfoItems - |> List.collect (function Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> [addValRef.LogicalName;removeValRef.LogicalName] | _ -> []) - |> set + minfos + |> List.filter (minfoFilter suppressedMethNames) - if addersAndRemovers.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) + if isNil minfos then + [] + else + let minfos = + let addersAndRemovers = + let hashSet = HashSet() + for item in pinfoItems do + match item with + | Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> + hashSet.Add addValRef.LogicalName |> ignore + hashSet.Add removeValRef.LogicalName |> ignore + | _ -> () + hashSet + + if addersAndRemovers.Count = 0 then minfos + else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) #if !NO_EXTENSIONTYPING - // Filter out the ones with mangled names from applying static parameters - let minfos = - let methsWithStaticParams = - minfos - |> List.filter (fun minfo -> - match minfo.ProvidedStaticParameterInfo with - | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 - | _ -> false) - |> List.map (fun minfo -> minfo.DisplayName) + // Filter out the ones with mangled names from applying static parameters + let minfos = + let methsWithStaticParams = + minfos + |> List.filter (fun minfo -> + match minfo.ProvidedStaticParameterInfo with + | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 + | _ -> false) + |> List.map (fun minfo -> minfo.DisplayName) - if methsWithStaticParams.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> - let nm = minfo.LogicalName - not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) + if methsWithStaticParams.IsEmpty then minfos + else minfos |> List.filter (fun minfo -> + let nm = minfo.LogicalName + not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) #endif - minfos + minfos // Partition methods into overload sets let rec partitionl (l:MethInfo list) acc = @@ -4259,16 +4380,14 @@ let rec ResolvePartialLongIdentInTypeForItem (ncenv: NameResolver) nenv m ad sta | id :: rest -> let rfinfos = - ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) - |> List.filter (fun fref -> IsRecdFieldAccessible ncenv.amap m ad fref.RecdFieldRef) - |> List.filter (fun fref -> fref.RecdField.IsStatic = statics) + ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) + |> List.filter (fun fref -> fref.Name = id && IsRecdFieldAccessible ncenv.amap m ad fref.RecdFieldRef && fref.RecdField.IsStatic = statics) let nestedTypes = ty |> GetNestedTypesOfType (ad, ncenv, Some id, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) // e.g. .. for rfinfo in rfinfos do - if rfinfo.Name = id then - yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item rfinfo.FieldType + yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item rfinfo.FieldType // e.g. .. let fullTypeOfPinfo (pinfo: PropInfo) = @@ -4279,12 +4398,17 @@ let rec ResolvePartialLongIdentInTypeForItem (ncenv: NameResolver) nenv m ad sta let pinfos = ty |> AllPropInfosOfTypeInScope ncenv.InfoReader nenv (Some id,ad) IgnoreOverrides m - |> List.filter (fun x -> x.IsStatic = statics) - |> List.filter (IsPropInfoAccessible g amap m ad) + |> List.filter (fun pinfo -> pinfo.IsStatic = statics && IsPropInfoAccessible g amap m ad pinfo) for pinfo in pinfos do yield! (fullTypeOfPinfo pinfo) |> ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item + match TryFindAnonRecdFieldOfType g ty id with + | Some (Item.AnonRecdField(_anonInfo, tys, i, _)) -> + let tyinfo = tys.[i] + yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item tyinfo + | _ -> () + // e.g. .. for einfo in ncenv.InfoReader.GetEventInfosOfType(Some id, ad, m, ty) do let tyinfo = PropTypOfEventInfo ncenv.InfoReader m ad einfo @@ -4314,8 +4438,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) mty.AllValsAndMembers |> Seq.toList |> List.choose (TryMkValRefInModRef modref) // if the assembly load set is incomplete and we get a None value here, then ignore the value - |> List.filter (fun v -> not v.IsMember) - |> List.filter (IsValUnseen ad g m >> not) + |> List.filter (fun vref -> not vref.IsMember && not (IsValUnseen ad g m vref)) |> List.map Item.Value | Item.UnionCase _ -> // Collect up the accessible discriminated union cases in the module @@ -4339,38 +4462,45 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) |> List.map Item.ExnCase | _ -> - let ilTyconNames = - mty.TypesByAccessNames.Values - |> List.choose (fun (tycon:Tycon) -> if tycon.IsILTycon then Some tycon.DisplayName else None) - |> Set.ofList - // Collect up the accessible sub-modules. We must yield them even though `item` is not a module or namespace, // otherwise we would not resolve long idents which have modules and namespaces in the middle (i.e. all long idents) - yield! + + let moduleOrNamespaces = mty.ModulesAndNamespacesByDemangledName - |> NameMap.range - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) - |> List.map modref.NestedTyconRef - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) - |> List.map ItemForModuleOrNamespaceRef + |> NameMap.range + + if not (isNil moduleOrNamespaces) then + let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values + + yield! + moduleOrNamespaces + |> List.filter (fun x -> + let demangledName = x.DemangledModuleOrNamespaceName + notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) + |> List.map modref.NestedTyconRef + |> List.filter (fun tcref -> + not (IsTyconUnseen ad g ncenv.amap m tcref) && + EntityRefContainsSomethingAccessible ncenv m ad tcref) + |> List.map ItemForModuleOrNamespaceRef + let tycons = mty.TypeDefinitions - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tycon -> not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tycon))) - - // Get all the types and .NET constructor groups accessible from here - yield! tycons |> List.map (modref.NestedTyconRef >> ItemOfTyconRef ncenv m) - yield! tycons |> List.collect (modref.NestedTyconRef >> InfosForTyconConstructors ncenv m ad) + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) + + // Get all the types and .NET constructor groups accessible from here + let nestedTycons = tycons |> List.map modref.NestedTyconRef + yield! nestedTycons |> List.map (ItemOfTyconRef ncenv m) + yield! nestedTycons |> List.collect (InfosForTyconConstructors ncenv m ad) | id :: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind(id) with - | Some mspec - when not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m (modref.NestedTyconRef mspec) true) -> - yield! ResolvePartialLongIdentInModuleOrNamespaceForItem ncenv nenv m ad (modref.NestedTyconRef mspec) rest item + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mspec -> + let nested = modref.NestedTyconRef mspec + if not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested true) then + yield! ResolvePartialLongIdentInModuleOrNamespaceForItem ncenv nenv m ad nested rest item | _ -> () for tycon in LookupTypeNameInEntityNoArity m id modref.ModuleOrNamespaceType do @@ -4384,20 +4514,20 @@ let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f pli match plid with | [] -> f modref | id :: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind id with - | Some mty -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest (modref.NestedTyconRef mty) - | None -> Seq.empty + | _ -> Seq.empty let PartialResolveLongIndentAsModuleOrNamespaceThenLazy (nenv:NameResolutionEnv) plid f = seq { match plid with | id :: rest -> - match Map.tryFind id nenv.eModulesAndNamespaces with - | Some modrefs -> + match nenv.eModulesAndNamespaces.TryGetValue id with + | true, modrefs -> for modref in modrefs do yield! PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest modref - | None -> () + | _ -> () | [] -> () } @@ -4422,17 +4552,19 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a match item with | Item.ModuleOrNamespaces _ -> - let ilTyconNames = - nenv.TyconsByAccessNames(OpenQualified).Values - |> List.choose (fun tyconRef -> if tyconRef.IsILTycon then Some tyconRef.DisplayName else None) - |> Set.ofList + let moduleOrNamespaceRefs = + nenv.ModulesAndNamespaces OpenQualified + |> NameMultiMap.range - for ns in NameMultiMap.range (nenv.ModulesAndNamespaces(OpenQualified)) do - let demangledName = ns.DemangledModuleOrNamespaceName - if IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName - && EntityRefContainsSomethingAccessible ncenv m ad ns - && not (IsTyconUnseen ad g ncenv.amap m ns) - then yield ItemForModuleOrNamespaceRef ns + if not (isNil moduleOrNamespaceRefs) then + let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(OpenQualified).Values) + + for ns in moduleOrNamespaceRefs do + let demangledName = ns.DemangledModuleOrNamespaceName + if IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName + && EntityRefContainsSomethingAccessible ncenv m ad ns + && not (IsTyconUnseen ad g ncenv.amap m ns) + then yield ItemForModuleOrNamespaceRef ns | Item.Types _ -> for tcref in nenv.TyconsByDemangledNameAndArity(OpenQualified).Values do @@ -4468,8 +4600,8 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a else Seq.empty) // Look for values called 'id' that accept the dot-notation - match Map.tryFind id nenv.eUnqualifiedItems with - | Some (Item.Value x) -> + match nenv.eUnqualifiedItems.TryGetValue id with + | true, Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item ty @@ -4482,20 +4614,25 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a } let IsItemResolvable (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (item: Item) : bool = - protectAssemblyExploration false <| fun () -> - GetCompletionForItem ncenv nenv m ad plid item |> Seq.exists (ItemsAreEffectivelyEqual ncenv.g item) + protectAssemblyExploration false (fun () -> + GetCompletionForItem ncenv nenv m ad plid item + |> Seq.exists (ItemsAreEffectivelyEqual ncenv.g item) + ) let GetVisibleNamespacesAndModulesAtPoint (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad = - protectAssemblyExploration [] <| fun () -> - let ilTyconNames = - nenv.TyconsByAccessNames(FullyQualifiedFlag.OpenQualified).Values - |> List.choose (fun tyconRef -> if tyconRef.IsILTycon then Some tyconRef.DisplayName else None) - |> Set.ofList - - nenv.ModulesAndNamespaces(FullyQualifiedFlag.OpenQualified) - |> NameMultiMap.range - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName - && EntityRefContainsSomethingAccessible ncenv m ad x - && not (IsTyconUnseen ad ncenv.g ncenv.amap m x)) + protectAssemblyExploration [] (fun () -> + let items = + nenv.ModulesAndNamespaces FullyQualifiedFlag.OpenQualified + |> NameMultiMap.range + + if isNil items then [] else + + let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(FullyQualifiedFlag.OpenQualified).Values) + + items + |> List.filter (fun x -> + let demangledName = x.DemangledModuleOrNamespaceName + IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName + && EntityRefContainsSomethingAccessible ncenv m ad x + && not (IsTyconUnseen ad ncenv.g ncenv.amap m x)) + ) diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 8a1ae97f00..a302e22ef1 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -64,6 +64,9 @@ type Item = /// Represents the resolution of a name to an F# record field. | RecdField of RecdFieldInfo + /// Represents the resolution of a name to a field of an anonymous record type. + | AnonRecdField of AnonRecdTypeInfo * TTypes * int * range + // The following are never in the items table but are valid results of binding // an identifier in different circumstances. @@ -166,8 +169,8 @@ type FullyQualifiedFlag = [] type BulkAdd = Yes | No -/// Lookup patterns in name resolution environment -val internal TryFindPatternByName : string -> NameResolutionEnv -> Item option +/// Find a field in anonymous record type +val internal TryFindAnonRecdFieldOfType : TcGlobals -> TType -> string -> Item option /// Add extra items to the environment for Visual Studio, e.g. static members val internal AddFakeNamedValRefToNameEnv : string -> NameResolutionEnv -> ValRef -> NameResolutionEnv @@ -237,7 +240,7 @@ type TypeNameResolutionInfo = static member ResolveToTypeRefs : TypeNameResolutionStaticArgsInfo -> TypeNameResolutionInfo /// Represents the kind of the occurrence when reporting a name in name resolution -[] +[] type internal ItemOccurence = | Binding | Use @@ -316,7 +319,7 @@ type internal TcSymbolUses = member GetUsesOfSymbol : Item -> TcSymbolUseData[] /// All the uses of all items within the file - member AllUsesOfSymbols : TcSymbolUseData[] + member AllUsesOfSymbols : TcSymbolUseData[][] /// Get the locations of all the printf format specifiers in the file member GetFormatSpecifierLocationsAndArity : unit -> (range * int)[] @@ -341,12 +344,12 @@ type internal OpenDeclaration = /// Create a new instance of OpenDeclaration. static member Create : longId: Ident list * modules: ModuleOrNamespaceRef list * appliedScope: range * isOwnNamespace: bool -> OpenDeclaration -/// Line-end normalized source text and an array of line end positions, used for format string parsing +/// Source text and an array of line end positions, used for format string parsing type FormatStringCheckContext = - { /// Line-end normalized source text - NormalizedSource: string - /// Array of line end positions - LineEndPositions: int[] } + { /// Source text + Source: string + /// Array of line start positions + LineStartPositions: int[] } /// An abstract type for reporting the results of name resolution and type checking type ITypecheckResultsSink = diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index ca5fd8c674..142ccbae07 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -33,6 +33,7 @@ module internal PrintUtilities = let squareAngleL x = LeftL.leftBracketAngle ^^ x ^^ RightL.rightBracketAngle let angleL x = sepL Literals.leftAngle ^^ x ^^ rightL Literals.rightAngle let braceL x = leftL Literals.leftBrace ^^ x ^^ rightL Literals.rightBrace + let braceBarL x = leftL Literals.leftBraceBar ^^ x ^^ rightL Literals.rightBraceBar let comment str = wordL (tagText (sprintf "(* %s *)" str)) @@ -102,7 +103,7 @@ module private PrintIL = open Microsoft.FSharp.Compiler.AbstractIL.IL let fullySplitILTypeRef (tref:ILTypeRef) = - (List.collect IL.splitNamespace (tref.Enclosing @ [IL.ungenericizeTypeName tref.Name])) + (List.collect IL.splitNamespace (tref.Enclosing @ [PrettyNaming.DemangleGenericTypeName tref.Name])) let layoutILTypeRefName denv path = let path = @@ -193,7 +194,7 @@ module private PrintIL = let args = signatur.ArgTypes |> List.map (layoutILType denv ilTyparSubst) let res = match cons with - | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (ungenericizeTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) + | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (PrettyNaming.DemangleGenericTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) | None -> signatur.ReturnType |> layoutILType denv ilTyparSubst match args with | [] -> WordL.structUnit ^^ WordL.arrow ^^ res @@ -226,7 +227,7 @@ module private PrintIL = // return type be passed along as the `cons` parameter.) let res = match cons with - | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (ungenericizeTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) + | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (PrettyNaming.DemangleGenericTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) | None -> retType |> layoutILType denv ilTyparSubst match parameters with | [] -> WordL.structUnit ^^ WordL.arrow ^^ res @@ -934,6 +935,14 @@ module private PrintTypes = | TType_ucase (UCRef(tc,_),args) -> layoutTypeAppWithInfoAndPrec denv env (layoutTyconRef denv tc) prec tc.IsPrefixDisplay args + // Layout a tuple type + | TType_anon (anonInfo,tys) -> + let core = sepListL (wordL (tagPunctuation ";")) (List.map2 (fun nm ty -> wordL (tagField nm) ^^ wordL (tagPunctuation ":") ^^ layoutTypeWithInfoAndPrec denv env prec ty) (Array.toList anonInfo.SortedNames) tys) + if evalAnonInfoIsStruct anonInfo then + WordL.keywordStruct --- braceBarL core + else + braceBarL core + // Layout a tuple type | TType_tuple (tupInfo,t) -> if evalTupInfoIsStruct tupInfo then @@ -991,7 +1000,7 @@ module private PrintTypes = let isParamArray = HasFSharpAttribute denv.g denv.g.attrib_ParamArrayAttribute argInfo.Attribs match argInfo.Name, isOptionalArg, isParamArray, tryDestOptionTy denv.g ty with // Layout an optional argument - | Some(id), true, _, Some ty -> + | Some(id), true, _, ValueSome ty -> leftL (tagPunctuation "?") ^^ sepL (tagParameter id.idText) ^^ SepL.colon ^^ layoutTypeWithInfoAndPrec denv env 2 ty // Layout an unnamed argument | None, _,_, _ -> @@ -1056,7 +1065,7 @@ module private PrintTypes = let prettyLayoutOfCurriedMemberSig denv typarInst argInfos retTy parentTyparTys = let (prettyTyparInst, parentTyparTys,argInfos,retTy),cxs = PrettyTypes.PrettifyInstAndCurriedSig denv.g (typarInst, parentTyparTys, argInfos, retTy) // Filter out the parent typars, which don't get shown in the member signature - let cxs = cxs |> List.filter (fun (tp,_) -> not (parentTyparTys |> List.exists (fun ty -> match tryDestTyparTy denv.g ty with Some destTypar -> typarEq tp destTypar | None -> false))) + let cxs = cxs |> List.filter (fun (tp,_) -> not (parentTyparTys |> List.exists (fun ty -> match tryDestTyparTy denv.g ty with ValueSome destTypar -> typarEq tp destTypar | _ -> false))) prettyTyparInst, prettyLayoutOfTopTypeInfoAux denv argInfos retTy cxs // Layout: type spec - class, datatype, record, abbrev @@ -1247,7 +1256,7 @@ module InfoMemberPrinting = // Layout an optional argument | _, Some nm, true, ptyOpt -> // detect parameter type, if ptyOpt is None - this is .NET style optional argument - let pty = defaultArg ptyOpt pty + let pty = match ptyOpt with ValueSome x -> x | _ -> pty SepL.questionMark ^^ wordL (tagParameter nm.idText) ^^ RightL.colon ^^ @@ -1513,7 +1522,7 @@ module private TastDefinitionPrinting = /// Another re-implementation of type printing, this time based off provided info objects. let layoutProvidedTycon (denv:DisplayEnv) (infoReader:InfoReader) ad m start lhsL ty = let g = denv.g - let tcref,_ = destAppTy g ty + let tcref = tcrefOfAppTy g ty if isEnumTy g ty then let fieldLs = diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index da19114bcc..5e34582267 100755 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -157,17 +157,20 @@ let braceL x = leftL (tagText "{") ^^ x ^^ rightL (tagText "}") let seqL xL xs = Seq.fold (fun z x -> z @@ xL x) emptyL xs let namemapL xL xmap = NameMap.foldBack (fun nm x z -> xL nm x @@ z) xmap emptyL -let rec exprValueInfoL g = function - | ConstValue (x, ty) -> NicePrint.layoutConst g ty x - | UnknownValue -> wordL (tagText "?") - | SizeValue (_, vinfo) -> exprValueInfoL g vinfo - | ValValue (vr, vinfo) -> bracketL ((valRefL vr ^^ wordL (tagText "alias")) --- exprValueInfoL g vinfo) - | TupleValue vinfos -> bracketL (exprValueInfosL g vinfos) - | RecdValue (_, vinfos) -> braceL (exprValueInfosL g vinfos) - | UnionCaseValue (ucr, vinfos) -> unionCaseRefL ucr ^^ bracketL (exprValueInfosL g vinfos) - | CurriedLambdaValue(_lambdaId, _arities, _bsize, expr', _ety) -> wordL (tagText "lam") ++ exprL expr' (* (sprintf "lam(size=%d)" bsize) *) - | ConstExprValue (_size, x) -> exprL x +let rec exprValueInfoL g exprVal = + match exprVal with + | ConstValue (x, ty) -> NicePrint.layoutConst g ty x + | UnknownValue -> wordL (tagText "?") + | SizeValue (_, vinfo) -> exprValueInfoL g vinfo + | ValValue (vr, vinfo) -> bracketL ((valRefL vr ^^ wordL (tagText "alias")) --- exprValueInfoL g vinfo) + | TupleValue vinfos -> bracketL (exprValueInfosL g vinfos) + | RecdValue (_, vinfos) -> braceL (exprValueInfosL g vinfos) + | UnionCaseValue (ucr, vinfos) -> unionCaseRefL ucr ^^ bracketL (exprValueInfosL g vinfos) + | CurriedLambdaValue(_lambdaId, _arities, _bsize, expr', _ety) -> wordL (tagText "lam") ++ exprL expr' (* (sprintf "lam(size=%d)" bsize) *) + | ConstExprValue (_size, x) -> exprL x + and exprValueInfosL g vinfos = commaListL (List.map (exprValueInfoL g) (Array.toList vinfos)) + and moduleInfoL g (x:LazyModuleInfo) = let x = x.Force() braceL ((wordL (tagText "Modules: ") @@ (x.ModuleOrNamespaceInfos |> namemapL (fun nm x -> wordL (tagText nm) ^^ moduleInfoL g x) ) ) @@ -455,8 +458,8 @@ let BindExternalLocalVal cenv (v:Val) vval env = // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can // still be resolved. match tryRescopeVal cenv.g.fslibCcu Remap.Empty v with - | Some vref -> BindValueForFslib vref.nlr v vval env - | None -> env + | ValueSome vref -> BindValueForFslib vref.nlr v vval env + | _ -> env else env env @@ -973,11 +976,11 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = // Under those checks, the further hidden* checks may be subsumed (meaning, not required anymore). let hiddenTycon, hiddenTyconRepr, hiddenVal, hiddenRecdField, hiddenUnionCase = - Zset.memberOf mhi.mhiTycons, - Zset.memberOf mhi.mhiTyconReprs, - Zset.memberOf mhi.mhiVals, - Zset.memberOf mhi.mhiRecdFields, - Zset.memberOf mhi.mhiUnionCases + Zset.memberOf mhi.HiddenTycons, + Zset.memberOf mhi.HiddenTyconReprs, + Zset.memberOf mhi.HiddenVals, + Zset.memberOf mhi.HiddenRecdFields, + Zset.memberOf mhi.HiddenUnionCases let rec abstractExprInfo ivalue = match ivalue with @@ -1186,9 +1189,9 @@ let IsTyFuncValRefExpr = function | _ -> false /// Type applications of existing functions are always simple constants, with the exception of F# 'type functions' -/// REVIEW: we could also include any under-applied application here. let rec IsSmallConstExpr x = match x with + | Expr.Op (TOp.LValueOp (LAddrOf _, _), [], [], _) -> true // &x is always a constant | Expr.Val (v, _, _m) -> not v.IsMutable | Expr.App(fe, _, _tyargs, args, _) -> isNil args && not (IsTyFuncValRefExpr fe) && IsSmallConstExpr fe | _ -> false @@ -1202,11 +1205,29 @@ let ValueOfExpr expr = // Dead binding elimination //------------------------------------------------------------------------- +// Allow discard of "let v = *byref" if "v" is unused anywhere. The read effect +// can be discarded because it is always assumed that reading byref pointers (without using +// the value of the read) doesn't raise exceptions or cause other "interesting" side effects. +// +// This allows discarding the implicit deref when matching on struct unions, e.g. +// +// [] +// type SingleRec = +// | SingleUnion of int +// member x.Next = let (SingleUnion i) = x in SingleUnion (i+1) +// +// See https://github.com/Microsoft/visualfsharp/issues/5136 +let IsDiscardableEffectExpr expr = + match expr with + | Expr.Op (TOp.LValueOp (LByrefGet _, _), [], [], _) -> true + | _ -> false + +/// Checks is a value binding is non-discardable let ValueIsUsedOrHasEffect cenv fvs (b:Binding, binfo) = let v = b.Var not (cenv.settings.EliminateUnusedBindings()) || Option.isSome v.MemberInfo || - binfo.HasEffect || + (binfo.HasEffect && not (IsDiscardableEffectExpr b.Expr)) || v.IsFixed || Zset.contains v (fvs()) @@ -1259,6 +1280,7 @@ and BindingHasEffect g bind = bind.Expr |> ExprHasEffect g and OpHasEffect g m op = match op with | TOp.Tuple _ -> false + | TOp.AnonRecd _ -> false | TOp.Recd (ctor, tcref) -> match ctor with | RecdExprIsObjInit -> true @@ -1273,10 +1295,11 @@ and OpHasEffect g m op = | TOp.TupleFieldGet(_) -> false | TOp.ExnFieldGet(ecref, n) -> isExnFieldMutable ecref n | TOp.RefAddrGet _ -> false - | TOp.ValFieldGet rfref -> rfref.RecdField.IsMutable || (TryFindTyconRefBoolAttribute g Range.range0 g.attrib_AllowNullLiteralAttribute rfref.TyconRef = Some true) + | TOp.AnonRecdGet _ -> true // conservative + | TOp.ValFieldGet rfref -> rfref.RecdField.IsMutable || (TryFindTyconRefBoolAttribute g Range.range0 g.attrib_AllowNullLiteralAttribute rfref.TyconRef = Some(true)) | TOp.ValFieldGetAddr (rfref, _readonly) -> rfref.RecdField.IsMutable | TOp.UnionCaseFieldGetAddr _ -> false // union case fields are immutable - | TOp.LValueOp (LAddrOf _, lv) -> lv.IsMutable + | TOp.LValueOp (LAddrOf _, _) -> false // addresses of values are always constants | TOp.UnionCaseFieldSet _ | TOp.ExnFieldSet _ | TOp.Coerce @@ -1382,6 +1405,84 @@ let rec (|KnownValApp|_|) expr = | Expr.App(KnownValApp(vref, typeArgs1, otherArgs1), _, typeArgs2, otherArgs2, _) -> Some(vref, typeArgs1@typeArgs2, otherArgs1@otherArgs2) | _ -> None +/// 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) + | _ -> + None + +/// Check target that have a constant bool value +let (|ConstantBoolTarget|_|) target = + match target with + | TTarget([], Expr.Const (Const.Bool b,_,_),_) -> Some b + | _ -> None + +/// 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 +let rec CountBoolLogicTree ((targets: DecisionTreeTarget[], costOuterCaseTree, costOuterDefaultTree, testBool) as data) tree = + match tree with + | TDSwitch (_expr, [case], Some defaultTree, _range) -> + let tc1,ec1 = CountBoolLogicTree data case.CaseTree + let tc2, ec2 = CountBoolLogicTree data defaultTree + tc1 + tc2, ec1 + ec2 + | TDSuccess([], idx) -> + match targets.[idx] with + | ConstantBoolTarget result -> (if result = testBool then costOuterCaseTree else costOuterDefaultTree), 0 + | TTarget([], _exp, _) -> costOuterCaseTree + costOuterDefaultTree, 10 + | _ -> 100, 100 + | _ -> 100, 100 + +/// Rewrite a decision tree for which CountBoolLogicTree returned a low number (see below). Produce a new decision +/// tree where at each ConstantBoolSuccessTree tip we replace with either outerCaseTree or outerDefaultTree +/// depending on whether the target result was true/false +let rec RewriteBoolLogicTree ((targets: DecisionTreeTarget[], outerCaseTree, outerDefaultTree, testBool) as data) tree = + match tree with + | TDSwitch (expr, cases, defaultTree, range) -> + let cases2 = cases |> List.map (RewriteBoolLogicCase data) + let defaultTree2 = defaultTree |> Option.map (RewriteBoolLogicTree data) + TDSwitch (expr, cases2, defaultTree2, range) + | TDSuccess([], idx) -> + match targets.[idx] with + | ConstantBoolTarget result -> if result = testBool then outerCaseTree else outerDefaultTree + | TTarget([], exp, _) -> mkBoolSwitch exp.Range exp (if testBool then outerCaseTree else outerDefaultTree) (if testBool then outerDefaultTree else outerCaseTree) + | _ -> failwith "CountBoolLogicTree should exclude this case" + | _ -> failwith "CountBoolLogicTree should exclude this case" + +and RewriteBoolLogicCase data (TCase(test, tree)) = + TCase(test, RewriteBoolLogicTree data tree) + +/// Repeatedly combine switch-over-match decision trees, see https://github.com/Microsoft/visualfsharp/issues/635. +/// The outer decision tree is doing a swithc over a boolean result, the inner match is producing only +/// constant boolean results in its targets. +let rec CombineBoolLogic expr = + + // try to find nested boolean switch + match expr with + | Expr.Match(outerSP, outerMatchRange, + TDBoolSwitch(Expr.Match(_innerSP, _innerMatchRange, innerTree, innerTargets, _innerDefaultRange, _innerMatchTy), + outerTestBool, outerCaseTree, outerDefaultTree, _outerSwitchRange ), + outerTargets, outerDefaultRange, outerMatchTy) -> + + let costOuterCaseTree = match outerCaseTree with TDSuccess _ -> 0 | _ -> 1 + let costOuterDefaultTree = match outerDefaultTree with TDSuccess _ -> 0 | _ -> 1 + let tc, ec = CountBoolLogicTree (innerTargets, costOuterCaseTree, costOuterDefaultTree, outerTestBool) innerTree + // At most one expression, no overall duplication of TSwitch nodes + if tc <= costOuterCaseTree + costOuterDefaultTree && ec <= 10 then + let newExpr = + Expr.Match(outerSP, outerMatchRange, + RewriteBoolLogicTree (innerTargets, outerCaseTree, outerDefaultTree, outerTestBool) innerTree, + outerTargets, outerDefaultRange, outerMatchTy) + + CombineBoolLogic newExpr + else + expr + | _ -> + expr + + //------------------------------------------------------------------------- // ExpandStructuralBinding // @@ -1663,7 +1764,15 @@ let TryDetectQueryQuoteAndRun cenv (expr:Expr) = //printfn "Not eliminating because no Run found" None - +let IsSystemStringConcatOverload (methRef: ILMethodRef) = + methRef.Name = "Concat" && methRef.DeclaringTypeRef.FullName = "System.String" && + methRef.ReturnType.BasicQualifiedName = "System.String" && + methRef.ArgTypes |> List.forall(fun ilty -> ilty.BasicQualifiedName = "System.String") + +let IsSystemStringConcatArray (methRef: ILMethodRef) = + methRef.Name = "Concat" && methRef.DeclaringTypeRef.FullName = "System.String" && + methRef.ReturnType.BasicQualifiedName = "System.String" && + methRef.ArgTypes.Length = 1 && methRef.ArgTypes.Head.BasicQualifiedName = "System.String[]" //------------------------------------------------------------------------- // The traversal @@ -1723,7 +1832,6 @@ let rec OptimizeExpr cenv (env:IncrementalOptimizationEnv) expr = assert ("unexpected reclink" = "") failwith "Unexpected reclink" - //------------------------------------------------------------------------- // Optimize/analyze an object expression //------------------------------------------------------------------------- @@ -1773,12 +1881,57 @@ and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) = Info=UnknownValue} //------------------------------------------------------------------------- -// Optimize/analyze an application of an intrinsic operator to arguments +// Make and optimize String.Concat calls //------------------------------------------------------------------------- +and MakeOptimizedSystemStringConcatCall cenv env m args = + let rec optimizeArg e accArgs = + match e, accArgs with + | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ], _), _ when IsSystemStringConcatArray methRef -> + optimizeArgs args accArgs + + | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, args, _), _ when IsSystemStringConcatOverload methRef -> + optimizeArgs args accArgs + + // Optimize string constants, e.g. "1" + "2" will turn into "12" + | Expr.Const(Const.String str1, _, _), Expr.Const(Const.String str2, _, _) :: accArgs -> + mkString cenv.g m (str1 + str2) :: accArgs + + | arg, _ -> arg :: accArgs + + and optimizeArgs args accArgs = + (args, accArgs) + ||> List.foldBack (fun arg accArgs -> optimizeArg arg accArgs) + + let args = optimizeArgs args [] + + let e = + match args with + | [ arg ] -> + arg + | [ arg1; arg2 ] -> + mkStaticCall_String_Concat2 cenv.g m arg1 arg2 + | [ arg1; arg2; arg3 ] -> + mkStaticCall_String_Concat3 cenv.g m arg1 arg2 arg3 + | [ arg1; arg2; arg3; arg4 ] -> + mkStaticCall_String_Concat4 cenv.g m arg1 arg2 arg3 arg4 + | args -> + let arg = mkArray (cenv.g.string_ty, args, m) + mkStaticCall_String_Concat_Array cenv.g m arg + + match e with + | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _) as op, tyargs, args, m) when IsSystemStringConcatOverload methRef || IsSystemStringConcatArray methRef -> + OptimizeExprOpReductions cenv env (op, tyargs, args, m) + | _ -> + OptimizeExpr cenv env e + +//------------------------------------------------------------------------- +// Optimize/analyze an application of an intrinsic operator to arguments +//------------------------------------------------------------------------- + and OptimizeExprOp cenv env (op, tyargs, args, m) = - (* Special cases *) + // Special cases match op, tyargs, args with | TOp.Coerce, [toty;fromty], [e] -> let e', einfo = OptimizeExpr cenv env e @@ -1790,26 +1943,38 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = HasEffect = true MightMakeCriticalTailcall=false Info=UnknownValue } - (* Handle addresses *) + + // Handle address-of | TOp.LValueOp ((LAddrOf _ as lop), lv), _, _ -> - let e, _ = OptimizeExpr cenv env (exprForValRef m lv) - let op' = - match e with + let newVal, _ = OptimizeExpr cenv env (exprForValRef m lv) + let newOp = + match newVal with // Do not optimize if it's a top level static binding. | Expr.Val (v, _, _) when not v.IsCompiledAsTopLevel -> TOp.LValueOp (lop, v) | _ -> op - Expr.Op (op', tyargs, args, m), + let newExpr = Expr.Op (newOp, tyargs, args, m) + newExpr, { TotalSize = 1 FunctionSize = 1 - HasEffect = OpHasEffect cenv.g m op' + HasEffect = OpHasEffect cenv.g m newOp MightMakeCriticalTailcall = false - Info = UnknownValue } - (* Handle these as special cases since mutables are allowed inside their bodies *) - | TOp.While (spWhile, marker), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)] -> OptimizeWhileLoop cenv { env with inLoop=true } (spWhile, marker, e1, e2, m) - | TOp.For(spStart, dir), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [v], e3, _, _)] -> OptimizeFastIntegerForLoop cenv { env with inLoop=true } (spStart, v, e1, dir, e2, e3, m) - | TOp.TryFinally(spTry, spFinally), [resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)] -> OptimizeTryFinally cenv env (spTry, spFinally, e1, e2, m, resty) - | TOp.TryCatch(spTry, spWith), [resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [vf], ef, _, _); Expr.Lambda(_, _, _, [vh], eh, _, _)] -> OptimizeTryCatch cenv env (e1, vf, ef, vh, eh, m, resty, spTry, spWith) - | TOp.TraitCall(traitInfo), [], args -> OptimizeTraitCall cenv env (traitInfo, args, m) + Info = ValueOfExpr newExpr } + + // Handle these as special cases since mutables are allowed inside their bodies + | TOp.While (spWhile, marker), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)] -> + OptimizeWhileLoop cenv { env with inLoop=true } (spWhile, marker, e1, e2, m) + + | TOp.For(spStart, dir), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [v], e3, _, _)] -> + OptimizeFastIntegerForLoop cenv { env with inLoop=true } (spStart, v, e1, dir, e2, e3, m) + + | TOp.TryFinally(spTry, spFinally), [resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)] -> + OptimizeTryFinally cenv env (spTry, spFinally, e1, e2, m, resty) + + | TOp.TryCatch(spTry, spWith), [resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [vf], ef, _, _); Expr.Lambda(_, _, _, [vh], eh, _, _)] -> + OptimizeTryCatch cenv env (e1, vf, ef, vh, eh, m, resty, spTry, spWith) + + | TOp.TraitCall(traitInfo), [], args -> + OptimizeTraitCall cenv env (traitInfo, args, m) // This code hooks arr.Length. The idea is to ensure loops end up in the "same shape"as the forms of loops that the .NET JIT // guarantees to optimize. @@ -1827,8 +1992,17 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = // if the types match up. | TOp.ILAsm([], [ty]), _, [a] when typeEquiv cenv.g (tyOfExpr cenv.g a) ty -> OptimizeExpr cenv env a + // Optimize calls when concatenating strings, e.g. "1" + "2" + "3" + "4" .. etc. + | TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ] when IsSystemStringConcatArray methRef -> + MakeOptimizedSystemStringConcatCall cenv env m args + | TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, args when IsSystemStringConcatOverload methRef -> + MakeOptimizedSystemStringConcatCall cenv env m args + | _ -> - (* Reductions *) + // Reductions + OptimizeExprOpReductions cenv env (op, tyargs, args, m) + +and OptimizeExprOpReductions cenv env (op, tyargs, args, m) = let args', arginfos = OptimizeExprsThenConsiderSplits cenv env args let knownValue = match op, arginfos with @@ -1843,7 +2017,6 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos UnknownValue - and OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu = // The generic case - we may collect information, but the construction/projection doesn't disappear let argsTSize = AddTotalSizes arginfos @@ -1858,7 +2031,12 @@ and OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu = | TOp.Tuple tupInfo -> let isStruct = evalTupInfoIsStruct tupInfo if isStruct then 0, valu - else 1, MakeValueInfoForTuple (Array.ofList argValues) + else 1,MakeValueInfoForTuple (Array.ofList argValues) + | TOp.AnonRecd anonInfo -> + let isStruct = evalAnonInfoIsStruct anonInfo + if isStruct then 0, valu + else 1, valu + | TOp.AnonRecdGet _ | TOp.ValFieldGet _ | TOp.TupleFieldGet _ | TOp.UnionCaseFieldGet _ @@ -2210,8 +2388,11 @@ and TryOptimizeValInfo cenv env m vinfo = //------------------------------------------------------------------------- and AddValEqualityInfo g m (v:ValRef) info = - if v.IsMutable then - /// the env assumes known-values do not change + // ValValue is information that v = v2, where v2 does not change + // So we can't record this information for mutable values. An exception can be made + // for "outArg" values arising from method calls since they are only temporarily mutable + // when their address is passed to the method call. + if v.IsMutable && not (v.IsCompilerGenerated && v.DisplayName.StartsWith(PrettyNaming.outArgCompilerGeneratedName)) then info else {info with Info= MakeValueInfoForValue g m v info.Info} @@ -2253,11 +2434,13 @@ and OptimizeVal cenv env expr (v:ValRef, m) = //------------------------------------------------------------------------- and StripToNominalTyconRef cenv ty = - if isAppTy cenv.g ty then destAppTy cenv.g ty - elif isRefTupleTy cenv.g ty then - let tyargs = destRefTupleTy cenv.g ty - mkCompiledTupleTyconRef cenv.g false (List.length tyargs), tyargs - else failwith "StripToNominalTyconRef: unreachable" + match tryAppTy cenv.g ty with + | ValueSome x -> x + | _ -> + if isRefTupleTy cenv.g ty then + let tyargs = destRefTupleTy cenv.g ty + mkCompiledTupleTyconRef cenv.g false (List.length tyargs), tyargs + else failwith "StripToNominalTyconRef: unreachable" and CanDevirtualizeApplication cenv v vref ty args = valRefEq cenv.g v vref @@ -2559,7 +2742,7 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) // Inlining: beta reducing let expr' = MakeApplicationAndBetaReduce cenv.g (f2', f2ty, [tyargs], args', m) // Inlining: reoptimizing - Some (OptimizeExpr cenv {env with dontInline= Zset.add lambdaId env.dontInline} expr') + Some(OptimizeExpr cenv {env with dontInline= Zset.add lambdaId env.dontInline} expr') | _ -> None @@ -2811,7 +2994,9 @@ and OptimizeMatch cenv env (spMatch, exprm, dtree, targets, m, ty) = // REVIEW: consider collecting, merging and using information flowing through each line of the decision tree to each target let dtree', dinfo = OptimizeDecisionTree cenv env m dtree let targets', tinfos = OptimizeDecisionTreeTargets cenv env m targets - RebuildOptimizedMatch (spMatch, exprm, m, ty, dtree', targets', dinfo, tinfos) + let newExpr, newInfo = RebuildOptimizedMatch (spMatch, exprm, m, ty, dtree', targets', dinfo, tinfos) + let newExpr2 = if not (cenv.settings.localOpt()) then newExpr else CombineBoolLogic newExpr + newExpr2, newInfo and CombineMatchInfos dinfo tinfo = { TotalSize = dinfo.TotalSize + tinfo.TotalSize @@ -2977,7 +3162,7 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | None -> false | Some mbrTyconRef -> // Check we can deref system_MarshalByRefObject_tcref. When compiling against the Silverlight mscorlib we can't - if mbrTyconRef.TryDeref.IsSome then + if ValueOptionInternal.isSome mbrTyconRef.TryDeref then // Check if this is a subtype of MarshalByRefObject assert (cenv.g.system_MarshalByRefObject_ty.IsSome) ExistsSameHeadTypeInHierarchy cenv.g cenv.amap vref.Range (generalizedTyconRef tcref) cenv.g.system_MarshalByRefObject_ty.Value @@ -3044,7 +3229,7 @@ and OptimizeModuleExpr cenv env x = not (ValueIsUsedOrHasEffect cenv (fun () -> fvs.FreeLocals) (bind, binfo)) && // Check the thing is hidden by the signature (if any) - hidden.mhiVals.Contains bind.Var && + hidden.HiddenVals.Contains bind.Var && // Check the thing is not compiled as a static field or property, since reflected definitions and other reflective stuff might need it not (IsCompiledAsStaticProperty cenv.g bind.Var)) @@ -3154,7 +3339,7 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = let defs, minfos = List.unzip defs (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) -and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qname, pragmas, mexpr, hasExplicitEntryPoint, isScript)) = +and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = let env, mexpr', minfo = match mexpr with // FSI: FSI compiles everything as if you're typing incrementally into one module @@ -3173,7 +3358,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qn let hidden = ComputeHidingInfoAtAssemblyBoundary mexpr.Type hidden let minfo = AbstractLazyModulInfoByHiding true hidden minfo - env, TImplFile(qname, pragmas, mexpr', hasExplicitEntryPoint, isScript), minfo, hidden + env, TImplFile(qname, pragmas, mexpr', hasExplicitEntryPoint, isScript, anonRecdTypes), minfo, hidden //------------------------------------------------------------------------- // Entry point diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index 3ffbc94b04..625b23a70d 100755 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -257,7 +257,7 @@ let RefuteDiscrimSet g m path discrims = | None -> raise CannotRefute | Some c -> match tryDestAppTy g ty with - | Some tcref when tcref.IsEnumTycon -> + | ValueSome tcref when tcref.IsEnumTycon -> // We must distinguish between F#-defined enums and other .NET enums, as they are represented differently in the TAST let enumValues = if tcref.IsILEnumTycon then @@ -418,8 +418,8 @@ let getDiscrimOfPattern (g: TcGlobals) tpinst t = Some(DecisionTreeTest.UnionCase (c,instTypes tpinst tyargs')) | TPat_array (args,ty,_m) -> Some(DecisionTreeTest.ArrayLength (args.Length,ty)) - | TPat_query ((pexp,resTys,apatVrefOpt,idx,apinfo),_,_m) -> - Some(DecisionTreeTest.ActivePatternCase (pexp, instTypes tpinst resTys, apatVrefOpt, idx, apinfo)) + | TPat_query ((activePatExpr,resTys,apatVrefOpt,idx,apinfo),_,_m) -> + Some(DecisionTreeTest.ActivePatternCase (activePatExpr, instTypes tpinst resTys, apatVrefOpt, idx, apinfo)) | _ -> None let constOfDiscrim discrim = @@ -579,8 +579,8 @@ let rec BuildSwitch inpExprOpt g expr edges dflt m = let testexpr = match discrim with | DecisionTreeTest.ArrayLength(n,_) -> - let _v,vexp,bind = mkCompGenLocalAndInvisbleBind g "testExpr" m testexpr - mkLetBind m bind (mkLazyAnd g m (mkNonNullTest g m vexp) (mkILAsmCeq g m (mkLdlen g m vexp) (mkInt g m n))) + let _v,vExpr,bind = mkCompGenLocalAndInvisbleBind g "testExpr" m testexpr + mkLetBind m bind (mkLazyAnd g m (mkNonNullTest g m vExpr) (mkILAsmCeq g m (mkLdlen g m vExpr) (mkInt g m n))) | DecisionTreeTest.Const (Const.String _ as c) -> mkCallEqualsOperator g m g.string_ty testexpr (Expr.Const(c,m,g.string_ty)) | DecisionTreeTest.Const (Const.Decimal _ as c) -> @@ -716,7 +716,7 @@ let CompilePatternBasic warnOnUnused warnOnIncomplete actionOnFailure - (topv,topgtvs) + (origInputVal, origInputValTypars, _origInputExprOpt: Expr option) (clausesL: TypedMatchClause list) inputTy resultTy = @@ -764,7 +764,7 @@ let CompilePatternBasic // We throw instead of rethrow on unmatched try-catch in a computation expression. But why? // Because this isn't a real .NET exception filter/handler but just a function we're passing // to a computation expression builder to simulate one. - mkThrow matchm resultTy (exprForVal matchm topv) + mkThrow matchm resultTy (exprForVal matchm origInputVal) | ThrowIncompleteMatchException -> mkThrow matchm resultTy @@ -809,9 +809,9 @@ let CompilePatternBasic // Build versions of these functions which apply a dummy instantiation to the overall type arguments let GetSubExprOfInput,getDiscrimOfPattern = - let tyargs = List.map (fun _ -> g.unit_ty) topgtvs - let unit_tpinst = mkTyparInst topgtvs tyargs - GetSubExprOfInput g (topgtvs,tyargs,unit_tpinst), + let tyargs = List.map (fun _ -> g.unit_ty) origInputValTypars + let unit_tpinst = mkTyparInst origInputValTypars tyargs + GetSubExprOfInput g (origInputValTypars,tyargs,unit_tpinst), getDiscrimOfPattern g unit_tpinst // The main recursive loop of the pattern match compiler @@ -850,7 +850,7 @@ let CompilePatternBasic // OK, build the whole tree and whack on the binding if any let finalDecisionTree = - let inpExprToSwitch = (match inpExprOpt with Some vexp -> vexp | None -> GetSubExprOfInput subexpr) + let inpExprToSwitch = (match inpExprOpt with Some vExpr -> vExpr | None -> GetSubExprOfInput subexpr) let tree = BuildSwitch inpExprOpt g inpExprToSwitch simulSetOfCases defaultTreeOpt matchm match bindOpt with | None -> tree @@ -907,6 +907,11 @@ let CompilePatternBasic else None,true) + and IsCopyableInputExpr origInputExpr = + match origInputExpr with + | Expr.Op (TOp.LValueOp (LByrefGet, v), [], [], _) when not v.IsMutable -> true + | _ -> false + and ChoosePreBinder simulSetOfEdgeDiscrims subexpr = match simulSetOfEdgeDiscrims with // Very simple 'isinst' tests: put the result of 'isinst' in a local variable @@ -922,27 +927,32 @@ let CompilePatternBasic | EdgeDiscrim(_i',(DecisionTreeTest.IsInst (_srcty,tgty)),m) :: _rest (* check we can use a simple 'isinst' instruction *) - when canUseTypeTestFast g tgty && isNil topgtvs -> + when canUseTypeTestFast g tgty && isNil origInputValTypars -> - let v,vexp = mkCompGenLocal m "typeTestResult" tgty - if topv.IsMemberOrModuleBinding then - AdjustValToTopVal v topv.DeclaringEntity ValReprInfo.emptyValData - let argexp = GetSubExprOfInput subexpr - let appexp = mkIsInst tgty argexp matchm - Some(vexp),Some(mkInvisibleBind v appexp) + let v,vExpr = mkCompGenLocal m "typeTestResult" tgty + if origInputVal.IsMemberOrModuleBinding then + AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData + let argExpr = GetSubExprOfInput subexpr + let appExpr = mkIsInst tgty argExpr matchm + Some vExpr, Some(mkInvisibleBind v appExpr) - // Any match on a struct union must take the address of its input + // Any match on a struct union must take the address of its input. + // We can shortcut the addrof when the original input is a deref of a byref value. | EdgeDiscrim(_i',(DecisionTreeTest.UnionCase (ucref, _)),_) :: _rest - when isNil topgtvs && ucref.Tycon.IsStructRecordOrUnionTycon -> - - let argexp = GetSubExprOfInput subexpr - let vOpt, addrexp, _readonly, _writeonly = mkExprAddrOfExprAux g true false NeverMutates argexp None matchm + when isNil origInputValTypars && ucref.Tycon.IsStructRecordOrUnionTycon -> + + let argExpr = GetSubExprOfInput subexpr + let argExpr = + match argExpr, _origInputExprOpt with + | Expr.Val(v1, _, _), Some origInputExpr when valEq origInputVal v1.Deref && IsCopyableInputExpr origInputExpr -> origInputExpr + | _ -> argExpr + let vOpt, addrExp, _readonly, _writeonly = mkExprAddrOfExprAux g true false NeverMutates argExpr None matchm match vOpt with - | None -> Some addrexp, None + | None -> Some addrExp, None | Some (v,e) -> - if topv.IsMemberOrModuleBinding then - AdjustValToTopVal v topv.DeclaringEntity ValReprInfo.emptyValData - Some addrexp, Some (mkInvisibleBind v e) + if origInputVal.IsMemberOrModuleBinding then + AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData + Some addrExp, Some (mkInvisibleBind v e) @@ -952,29 +962,29 @@ let CompilePatternBasic | [EdgeDiscrim(_, ListConsDiscrim g tinst, m)] | [EdgeDiscrim(_, ListEmptyDiscrim g tinst, m)] (* check we can use a simple 'isinst' instruction *) - when isNil topgtvs -> + when isNil origInputValTypars -> let ucaseTy = (mkProvenUnionCaseTy g.cons_ucref tinst) - let v,vexp = mkCompGenLocal m "unionTestResult" ucaseTy - if topv.IsMemberOrModuleBinding then - AdjustValToTopVal v topv.DeclaringEntity ValReprInfo.emptyValData - let argexp = GetSubExprOfInput subexpr - let appexp = mkIsInst ucaseTy argexp matchm - Some vexp,Some (mkInvisibleBind v appexp) + let v,vExpr = mkCompGenLocal m "unionTestResult" ucaseTy + if origInputVal.IsMemberOrModuleBinding then + AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData + let argExpr = GetSubExprOfInput subexpr + let appExpr = mkIsInst ucaseTy argExpr matchm + Some vExpr,Some (mkInvisibleBind v appExpr) #endif // Active pattern matches: create a variable to hold the results of executing the active pattern. - | (EdgeDiscrim(_,(DecisionTreeTest.ActivePatternCase(pexp,resTys,_,_,apinfo)),m) :: _) -> + | (EdgeDiscrim(_,(DecisionTreeTest.ActivePatternCase(activePatExpr,resTys,_,_,apinfo)),m) :: _) -> - if not (isNil topgtvs) then error(InternalError("Unexpected generalized type variables when compiling an active pattern",m)) - let rty = apinfo.ResultType g m resTys - let v,vexp = mkCompGenLocal m ("activePatternResult" + string (newUnique())) rty - if topv.IsMemberOrModuleBinding then - AdjustValToTopVal v topv.DeclaringEntity ValReprInfo.emptyValData - let argexp = GetSubExprOfInput subexpr - let appexp = mkApps g ((pexp,tyOfExpr g pexp), [], [argexp],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 + let v,vExpr = mkCompGenLocal m ("activePatternResult" + string (newUnique())) resTy + if origInputVal.IsMemberOrModuleBinding then + AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData + let argExpr = GetSubExprOfInput subexpr + let appExpr = mkApps g ((activePatExpr, tyOfExpr g activePatExpr), [], [argExpr],m) - Some(vexp),Some(mkInvisibleBind v appexp) + Some(vExpr),Some(mkInvisibleBind v appExpr) | _ -> None,None @@ -1003,16 +1013,16 @@ let CompilePatternBasic #if OPTIMIZE_LIST_MATCHING isNone inpExprOpt && #endif - (isNil topgtvs && - not topv.IsMemberOrModuleBinding && + (isNil origInputValTypars && + not origInputVal.IsMemberOrModuleBinding && not ucref.Tycon.IsStructRecordOrUnionTycon && ucref.UnionCase.RecdFields.Length >= 1 && ucref.Tycon.UnionCasesArray.Length > 1) -> - let v,vexp = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy ucref tinst) - let argexp = GetSubExprOfInput subexpr - let appexp = mkUnionCaseProof (argexp, ucref,tinst,m) - Some vexp,Some(mkInvisibleBind v appexp) + let v,vExpr = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy ucref tinst) + let argExpr = GetSubExprOfInput subexpr + let appExpr = mkUnionCaseProof (argExpr, ucref,tinst,m) + Some vExpr,Some(mkInvisibleBind v appExpr) | _ -> None,None @@ -1134,7 +1144,7 @@ let CompilePatternBasic | None -> let exprIn = match inpExprOpt with - | Some addrexp -> addrexp + | Some addrExp -> addrExp | None -> accessf tpinst exprIn mkUnionCaseFieldGetUnprovenViaExprAddr (exprIn,ucref1,instTypes tpinst tyargs,j,exprm) @@ -1180,7 +1190,7 @@ let CompilePatternBasic // Otherwise call the helper mkCallUnboxFast g exprm (instType tpinst tgtTy1) (accessf tpinst exprIn) - let (v,exprIn) = BindSubExprOfInput g amap topgtvs pbind exprm (SubExpr(accessf',ve)) + let (v,exprIn) = BindSubExprOfInput g amap origInputValTypars pbind exprm (SubExpr(accessf',ve)) [Frontier (i, active', valMap.Add v exprIn )] | None -> [Frontier (i, active', valMap)] @@ -1220,7 +1230,7 @@ let CompilePatternBasic | TPat_wild _ -> BindProjectionPatterns [] s | TPat_as(p',pbind,m) -> - let (v,subExpr') = BindSubExprOfInput g amap topgtvs pbind m subExpr + let (v,subExpr') = BindSubExprOfInput g amap origInputValTypars pbind m subExpr BindProjectionPattern (Active(path,subExpr,p')) (accActive,accValMap.Add v subExpr' ) | TPat_tuple(tupInfo,ps,tyargs,_m) -> let accessf' j tpinst subExpr' = mkTupleFieldGet g (tupInfo,accessf tpinst subExpr',instTypes tpinst tyargs,j,exprm) @@ -1263,7 +1273,7 @@ let CompilePatternBasic let frontiers = ((clausesL |> List.mapi (fun i c -> - let initialSubExpr = SubExpr((fun _tpinst x -> x),(exprForVal topv.Range topv,topv)) + let initialSubExpr = SubExpr((fun _tpinst x -> x),(exprForVal origInputVal.Range origInputVal,origInputVal)) let investigations = BindProjectionPattern (Active(PathEmpty(inputTy),initialSubExpr,c.Pattern)) ([],ValMap<_>.Empty) mkFrontiers investigations i) |> List.concat) @@ -1289,7 +1299,7 @@ let CompilePatternBasic let isPartialOrWhenClause (c:TypedMatchClause) = isPatternPartial c.Pattern || c.GuardExpr.IsSome -let rec CompilePattern g denv amap exprm matchm warnOnUnused actionOnFailure (topv,topgtvs) (clausesL: TypedMatchClause list) inputTy resultTy = +let rec CompilePattern g denv amap exprm matchm warnOnUnused actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) (clausesL: TypedMatchClause list) inputTy resultTy = match clausesL with | _ when List.exists isPartialOrWhenClause clausesL -> // Partial clauses cause major code explosion if treated naively @@ -1299,13 +1309,13 @@ let rec CompilePattern g denv amap exprm matchm warnOnUnused actionOnFailure (t let warnOnUnused = false in (* we can't turn this on since we're pretending all partial's fail in order to control the complexity of this. *) let warnOnIncomplete = true let clausesPretendAllPartialFail = List.collect (fun (TClause(p,whenOpt,tg,m)) -> [TClause(erasePartialPatterns p,whenOpt,tg,m)]) clausesL - let _ = CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (topv,topgtvs) clausesPretendAllPartialFail inputTy resultTy + let _ = CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) clausesPretendAllPartialFail inputTy resultTy let warnOnIncomplete = false let rec atMostOnePartialAtATime clauses = match List.takeUntil isPartialOrWhenClause clauses with | l,[] -> - CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (topv,topgtvs) l inputTy resultTy + CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) l inputTy resultTy | l,(h :: t) -> // Add the partial clause doGroupWithAtMostOnePartial (l @ [h]) t @@ -1327,12 +1337,10 @@ let rec CompilePattern g denv amap exprm matchm warnOnUnused actionOnFailure (t // Make the clause that represents the remaining cases of the pattern match let clauseForRestOfMatch = TClause(TPat_wild matchm,None,TTarget(List.empty,expr,spTarget),matchm) - CompilePatternBasic - g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (topv,topgtvs) - (group @ [clauseForRestOfMatch]) inputTy resultTy + CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) (group @ [clauseForRestOfMatch]) inputTy resultTy atMostOnePartialAtATime clausesL | _ -> - CompilePatternBasic g denv amap exprm matchm warnOnUnused true actionOnFailure (topv,topgtvs) (clausesL: TypedMatchClause list) inputTy resultTy + CompilePatternBasic g denv amap exprm matchm warnOnUnused true actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) clausesL inputTy resultTy diff --git a/src/fsharp/PatternMatchCompilation.fsi b/src/fsharp/PatternMatchCompilation.fsi index 348f37ae94..d4fbba2588 100755 --- a/src/fsharp/PatternMatchCompilation.fsi +++ b/src/fsharp/PatternMatchCompilation.fsi @@ -57,8 +57,9 @@ val internal CompilePattern : // warn on unused? bool -> ActionOnFailure -> - // the value being matched against, perhaps polymorphic - Val * Typars -> + // the value being matched against, perhaps polymorphic. Optionally includes the + // input expression, only for the case of immediate matching on a byref pointer + Val * Typars * Expr option -> // input type-checked syntax of pattern matching TypedMatchClause list -> // input type diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 761d5395e8..acc3c0c03a 100755 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -106,7 +106,10 @@ type env = external : bool /// Current return scope of the expr. - returnScope : int } + returnScope : int + + /// Are we in an app expression (Expr.App)? + isInAppExpr: bool } let BindTypar env (tp:Typar) = { env with @@ -198,6 +201,7 @@ type cenv = { boundVals: Dictionary // really a hash set limitVals: Dictionary mutable potentialUnboundUsesOfVals: StampMap + mutable anonRecdTypes: StampMap g: TcGlobals amap: Import.ImportMap /// For reading metadata @@ -301,7 +305,7 @@ let BindVals cenv env vs = List.iter (BindVal cenv env) vs // approx walk of type //-------------------------------------------------------------------------- -let rec CheckTypeDeep ((visitTy,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutionOpt, visitTyarOpt) as f) g env isInner ty = +let rec CheckTypeDeep (cenv: cenv) ((visitTy,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutionOpt, visitTyparOpt) as f) g env isInner 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 @@ -326,40 +330,54 @@ let rec CheckTypeDeep ((visitTy,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutio match ty with | TType_forall (tps,body) -> let env = BindTypars g env tps - CheckTypeDeep f g env isInner body - tps |> List.iter (fun tp -> tp.Constraints |> List.iter (CheckTypeConstraintDeep f g env)) + CheckTypeDeep cenv f g env isInner 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 | None -> () - CheckTypesDeep f g env tinst + + // 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 + else + CheckTypesDeep cenv f g env tinst + match visitAppTyOpt with | Some visitAppTy -> visitAppTy (tcref, tinst) | None -> () - - | TType_ucase (_,tinst) -> CheckTypesDeep f g env tinst - | TType_tuple (_,tys) -> CheckTypesDeep f g env tys - | TType_fun (s,t) -> CheckTypeDeep f g env true s; CheckTypeDeep f g env true t + | TType_anon (anonInfo,tys) -> + if not (cenv.anonRecdTypes.ContainsKey anonInfo.Stamp) then + cenv.anonRecdTypes <- cenv.anonRecdTypes.Add(anonInfo.Stamp, anonInfo) + CheckTypesDeep cenv f g env tys + + | TType_ucase (_,tinst) -> CheckTypesDeep cenv f g env tinst + | TType_tuple (_,tys) -> CheckTypesDeep cenv f g env tys + | TType_fun (s,t) -> CheckTypeDeep cenv f g env true s; CheckTypeDeep cenv f g env true t | TType_var tp -> if not tp.IsSolved then - match visitTyarOpt with + match visitTyparOpt with | None -> () | Some visitTyar -> visitTyar (env,tp) -and CheckTypesDeep f g env tys = - tys |> List.iter (CheckTypeDeep f g env true) +and CheckTypesDeep cenv f g env tys = + tys |> List.iter (CheckTypeDeep cenv f g env true) -and CheckTypeConstraintDeep f g env x = +and CheckTypesDeepNoInner cenv f g env tys = + tys |> List.iter (CheckTypeDeep cenv f g env false) + +and CheckTypeConstraintDeep cenv f g env x = match x with - | TyparConstraint.CoercesTo(ty,_) -> CheckTypeDeep f g env true ty - | TyparConstraint.MayResolveMember(traitInfo,_) -> CheckTraitInfoDeep f g env traitInfo - | TyparConstraint.DefaultsTo(_,ty,_) -> CheckTypeDeep f g env true ty - | TyparConstraint.SimpleChoice(tys,_) -> CheckTypesDeep f g env tys - | TyparConstraint.IsEnum(uty,_) -> CheckTypeDeep f g env true uty - | TyparConstraint.IsDelegate(aty,bty,_) -> CheckTypeDeep f g env true aty; CheckTypeDeep f g env true bty + | TyparConstraint.CoercesTo(ty,_) -> CheckTypeDeep cenv f g env true ty + | TyparConstraint.MayResolveMember(traitInfo,_) -> CheckTraitInfoDeep cenv f g env traitInfo + | TyparConstraint.DefaultsTo(_,ty,_) -> CheckTypeDeep cenv f g env true ty + | TyparConstraint.SimpleChoice(tys,_) -> CheckTypesDeep cenv f g env tys + | TyparConstraint.IsEnum(uty,_) -> CheckTypeDeep cenv f g env true uty + | TyparConstraint.IsDelegate(aty,bty,_) -> CheckTypeDeep cenv f g env true aty; CheckTypeDeep cenv f g env true bty | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ @@ -368,21 +386,21 @@ and CheckTypeConstraintDeep f g env x = | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> () -and CheckTraitInfoDeep ((_,_,_,visitTraitSolutionOpt,_) as f) g env (TTrait(tys,_,_,argtys,rty,soln)) = - CheckTypesDeep f g env tys - CheckTypesDeep f g env argtys - Option.iter (CheckTypeDeep f g env true ) rty +and CheckTraitInfoDeep cenv ((_,_,_,visitTraitSolutionOpt,_) as f) g env (TTrait(tys,_,_,argtys,rty,soln)) = + CheckTypesDeep cenv f g env tys + CheckTypesDeep cenv f g env argtys + Option.iter (CheckTypeDeep cenv f g env true ) rty match visitTraitSolutionOpt, !soln with | Some visitTraitSolution, Some sln -> visitTraitSolution sln | _ -> () /// Check for byref-like types let CheckForByrefLikeType cenv env m ty check = - CheckTypeDeep (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 _deep tcref -> if isByrefLikeTyconRef cenv.g m tcref then check()), None, None, None) cenv.g env false ty /// Check for byref types let CheckForByrefType cenv env ty check = - CheckTypeDeep (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 _deep tcref -> if isByrefTyconRef cenv.g tcref then check()), None, None, None) cenv.g env false ty /// check captures under lambdas /// @@ -440,28 +458,28 @@ let AccessInternalsVisibleToAsInternal thisCompPath internalsVisibleToPaths acce let CheckTypeForAccess (cenv:cenv) env objName valAcc m ty = if cenv.reportErrors then - let visitTye ty = + let visitType ty = // We deliberately only check the fully stripped type for accessibility, // because references to private type abbreviations are permitted match tryDestAppTy cenv.g ty with - | None -> () - | Some tcref -> + | ValueNone -> () + | ValueSome tcref -> let thisCompPath = compPathOfCcu cenv.viewCcu let tyconAcc = tcref.Accessibility |> AccessInternalsVisibleToAsInternal thisCompPath cenv.internalsVisibleToPaths if isLessAccessible tyconAcc valAcc then errorR(Error(FSComp.SR.chkTypeLessAccessibleThanType(tcref.DisplayName, (objName())), m)) - CheckTypeDeep (visitTye, None, None, None, None) cenv.g env false ty + CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env false ty let WarnOnWrongTypeForAccess (cenv:cenv) env objName valAcc m ty = if cenv.reportErrors then - let visitTye ty = + let visitType ty = // We deliberately only check the fully stripped type for accessibility, // because references to private type abbreviations are permitted match tryDestAppTy cenv.g ty with - | None -> () - | Some tcref -> + | ValueNone -> () + | ValueSome tcref -> let thisCompPath = compPathOfCcu cenv.viewCcu let tyconAcc = tcref.Accessibility |> AccessInternalsVisibleToAsInternal thisCompPath cenv.internalsVisibleToPaths if isLessAccessible tyconAcc valAcc then @@ -469,13 +487,16 @@ let WarnOnWrongTypeForAccess (cenv:cenv) env objName valAcc m ty = let warningText = errorText + System.Environment.NewLine + FSComp.SR.tcTypeAbbreviationsCheckedAtCompileTime() warning(AttributeChecking.ObsoleteWarning(warningText, m)) - CheckTypeDeep (visitTye, None, None, None, None) cenv.g env false ty + CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env false ty /// Indicates whether a byref or byref-like type is permitted at a particular location [] type PermitByRefType = /// Don't permit any byref or byref-like types - | None + | None + + /// Don't permit any byref or byref-like types on inner types. + | NoInnerByRefLike /// Permit only a Span or IsByRefLike type | SpanLike @@ -552,7 +573,7 @@ let rec mkArgsForAppliedExpr isBaseCall argsl x = | _ -> [] /// Check types occurring in the TAST. -let CheckType permitByRefLike (cenv:cenv) env m ty = +let CheckTypeAux permitByRefLike (cenv:cenv) env m ty onInnerByrefError = if cenv.reportErrors then let visitTyar (env,tp) = if not (env.boundTypars.ContainsKey tp) then @@ -561,13 +582,17 @@ let CheckType permitByRefLike (cenv:cenv) env m ty = else errorR (Error(FSComp.SR.checkNotSufficientlyGenericBecauseOfScope(tp.DisplayName),m)) - let visitTyconRef _isInner tcref = + let visitTyconRef isInner tcref = + + 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.SpanLike when isByrefTyconRef cenv.g tcref -> - errorR(Error(FSComp.SR.chkErrorUseOfByref(), m)) + | PermitByRefType.NoInnerByRefLike when isInnerByRefLike -> + onInnerByrefError () + | PermitByRefType.SpanLike when isByrefTyconRef cenv.g tcref || isInnerByRefLike -> + onInnerByrefError () | _ -> () if tyconRefEq cenv.g cenv.g.system_Void_tcref tcref then @@ -576,13 +601,13 @@ let CheckType permitByRefLike (cenv:cenv) env m ty = // check if T contains byref types in case of byref let visitAppTy (tcref,tinst) = if isByrefLikeTyconRef cenv.g m tcref then - let visitTye ty0 = + let visitType ty0 = match tryDestAppTy cenv.g ty0 with - | None -> () - | Some tcref2 -> + | ValueNone -> () + | ValueSome tcref2 -> if isByrefTyconRef cenv.g tcref2 then errorR(Error(FSComp.SR.chkNoByrefsOfByrefs(NicePrint.minimalStringOfType cenv.denv ty), m)) - CheckTypesDeep (visitTye, None, None, None, None) cenv.g env tinst + CheckTypesDeep cenv (visitType, None, None, None, None) cenv.g env tinst let visitTraitSolution info = match info with @@ -593,8 +618,10 @@ let CheckType permitByRefLike (cenv:cenv) env m ty = cenv.potentialUnboundUsesOfVals <- cenv.potentialUnboundUsesOfVals.Add(vref.Stamp,m) | _ -> () - CheckTypeDeep (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTyar) cenv.g env false ty + CheckTypeDeep cenv (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTyar) cenv.g env false ty +let CheckType permitByRefLike cenv env m ty = + CheckTypeAux permitByRefLike cenv env m ty (fun () -> errorR(Error(FSComp.SR.chkErrorUseOfByref(), m))) /// Check types occurring in TAST (like CheckType) and additionally reject any byrefs. /// The additional byref checks are to catch "byref instantiations" - one place were byref are not permitted. @@ -606,12 +633,18 @@ let CheckTypePermitSpanLike (cenv:cenv) env m ty = CheckType PermitByRefType.Spa /// Check types occurring in TAST but allow all byrefs. Only used on internally-generated types let CheckTypePermitAllByrefs (cenv:cenv) env m ty = CheckType PermitByRefType.All cenv env m ty +/// Check types ocurring in TAST but disallow inner types to be byref or byref-like types. +let CheckTypeNoInnerByrefs cenv env m ty = CheckType PermitByRefType.NoInnerByRefLike cenv env m ty + let CheckTypeInstNoByrefs cenv env m tyargs = tyargs |> List.iter (CheckTypeNoByrefs cenv env m) let CheckTypeInstPermitAllByrefs cenv env m tyargs = tyargs |> List.iter (CheckTypePermitAllByrefs cenv env m) +let CheckTypeInstNoInnerByrefs cenv env m tyargs = + tyargs |> List.iter (CheckTypeNoInnerByrefs cenv env m) + /// Applied functions get wrapped in coerce nodes for subsumption coercions let (|OptionalCoerce|) = function | Expr.Op(TOp.Coerce _, _, [Expr.App(f, _, _, [], _)], _) -> f @@ -663,7 +696,10 @@ and CheckValRef (cenv:cenv) (env:env) v m (context: PermitByRefExpr) = if context.Disallow && isByrefLikeTy cenv.g m v.Type then errorR(Error(FSComp.SR.chkNoByrefAtThisPoint(v.DisplayName), m)) - CheckTypePermitAllByrefs cenv env m v.Type // the byref checks are done at the actual binding of the value + if env.isInAppExpr then + CheckTypePermitAllByrefs cenv env m v.Type // we do checks for byrefs elsewhere + else + CheckTypeNoInnerByrefs cenv env m v.Type /// Check a use of a value and CheckValUse (cenv: cenv) (env: env) (vref: ValRef, vFlags, m) (context: PermitByRefExpr) = @@ -857,6 +893,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = match expr with | Expr.Sequential (e1,e2,dir,_,_) -> CheckExprNoByrefs cenv env e1 + match dir with | NormalSeq -> CheckExpr cenv env e2 context // carry context into _;RHS (normal sequencing only) @@ -879,7 +916,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = CheckExpr cenv env body context | Expr.Const (_,m,ty) -> - CheckTypePermitAllByrefs cenv env m ty + CheckTypeNoInnerByrefs cenv env m ty NoLimit | Expr.Val (vref,vFlags,m) -> @@ -930,9 +967,13 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = errorR(Error(FSComp.SR.tcCannotCallAbstractBaseMember(v.DisplayName),m)) NoLimit else + let env = { env with isInAppExpr = true } + let returnTy = tyOfExpr g expr + CheckValRef cenv env v m PermitByRefExpr.No CheckValRef cenv env baseVal m PermitByRefExpr.No CheckTypeInstNoByrefs cenv env m tyargs + CheckTypeNoInnerByrefs cenv env m returnTy CheckExprs cenv env rest (mkArgsForAppliedExpr true rest f) // Allow base calls to IL methods @@ -941,7 +982,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = // Disallow calls to abstract base methods on IL types. match tryDestAppTy g baseVal.Type with - | Some tcref when tcref.IsILTycon -> + | 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 @@ -973,12 +1014,20 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = // Allow '%expr' in quotations | Expr.App(Expr.Val(vref,_,_),_,tinst,[arg],m) when isSpliceOperator g vref && env.quote -> - CheckTypeInstPermitAllByrefs cenv env m tinst // it's the splice operator, a byref instantiation is allowed + CheckTypeInstNoInnerByrefs cenv env m tinst // it's the splice operator, a byref instantiation is allowed CheckExprNoByrefs cenv env arg NoLimit // Check an application | Expr.App(f,_fty,tyargs,argsl,m) -> + let returnTy = tyOfExpr g expr + + // This is to handle recursive cases. Don't check 'returnTy' again if we are still inside a app expression. + if not env.isInAppExpr then + CheckTypeNoInnerByrefs cenv env m returnTy + + let env = { env with isInAppExpr = true } + CheckTypeInstNoByrefs cenv env m tyargs CheckExprNoByrefs cenv env f @@ -987,7 +1036,6 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = | Expr.Val(vref, _, _) when vref.IsInstanceMember && not argsl.IsEmpty -> true | _ -> false - let returnTy = tyOfExpr g expr let contexts = mkArgsForAppliedExpr false argsl f if hasReceiver then CheckCallWithReceiver cenv env m returnTy argsl contexts context @@ -1010,7 +1058,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = NoLimit | Expr.Match(_,_,dtree,targets,m,ty) -> - CheckTypePermitAllByrefs cenv env m ty // computed byrefs allowed at each branch + CheckTypeNoInnerByrefs cenv env m ty // computed byrefs allowed at each branch CheckDecisionTree cenv env dtree CheckDecisionTreeTargets cenv env targets context @@ -1065,7 +1113,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExprsNoByRefLike cenv env [e1;e2] | TOp.TryFinally _,[_],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],e2,_,_)] -> - CheckTypeInstPermitAllByrefs cenv env m tyargs // result of a try/finally can be a byref + CheckTypeInstNoInnerByrefs cenv env m tyargs // result of a try/finally can be a byref ctorLimitedZoneCheck() let limit = CheckExpr cenv env e1 context // result of a try/finally can be a byref if in a position where the overall expression is can be a byref CheckExprNoByrefs cenv env e2 @@ -1076,7 +1124,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExprsNoByRefLike cenv env [e1;e2;e3] | TOp.TryCatch _,[_],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],_e2,_,_); Expr.Lambda(_,_,_,[_],e3,_,_)] -> - CheckTypeInstPermitAllByrefs cenv env m tyargs // result of a try/catch can be a byref + CheckTypeInstNoInnerByrefs cenv env m tyargs // result of a try/catch can be a byref ctorLimitedZoneCheck() let limit1 = CheckExpr cenv env e1 context // result of a try/catch can be a byref if in a position where the overall expression is can be a byref // [(* e2; -- don't check filter body - duplicates logic in 'catch' body *) e3] @@ -1087,7 +1135,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckTypeInstNoByrefs cenv env m tyargs CheckTypeInstNoByrefs cenv env m enclTypeArgs CheckTypeInstNoByrefs cenv env m methTypeArgs - CheckTypeInstPermitAllByrefs cenv env m tys // permit byref returns + CheckTypeInstNoInnerByrefs cenv env m tys // permit byref returns let hasReceiver = (methRef.CallingConv.IsInstance || methRef.CallingConv.IsInstanceExplicit) && @@ -1176,6 +1224,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = errorR(Error(FSComp.SR.chkNoWriteToLimitedSpan(vref.DisplayName), m)) NoLimit + | TOp.AnonRecdGet _,_,[arg1] | TOp.TupleFieldGet _,_,[arg1] -> CheckTypeInstNoByrefs cenv env m tyargs CheckExprsPermitByRefLike cenv env [arg1] (* Compiled pattern matches on immutable value structs come through here. *) @@ -1263,7 +1312,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExpr cenv env obj context | TOp.ILAsm (instrs,tys),_,_ -> - CheckTypeInstPermitAllByrefs cenv env m tys + CheckTypeInstNoInnerByrefs cenv env m tys CheckTypeInstNoByrefs cenv env m tyargs match instrs,args with // Write a .NET instance field @@ -1323,7 +1372,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckTypeInstNoByrefs cenv env m tyargs CheckExprsNoByRefLike cenv env args -and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValInfo alwaysCheckNoReraise e m ety context = +and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValInfo alwaysCheckNoReraise e mOrig ety context = let g = cenv.g // The topValInfo here says we are _guaranteeing_ to compile a function value // as a .NET method with precisely the corresponding argument counts. @@ -1353,7 +1402,28 @@ and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValIn // any byRef arguments are considered used, as they may be 'out's restArgs |> List.iter (fun arg -> if isByrefTy g arg.Type then arg.SetHasBeenReferenced()) - syntacticArgs |> List.iter (CheckValSpec cenv env) + let permitByRefType = + if isTop then + PermitByRefType.NoInnerByRefLike + else + PermitByRefType.None + + // Check argument types + syntacticArgs + |> List.iter (fun arg -> + CheckValSpecAux permitByRefType cenv env arg (fun () -> + if arg.IsCompilerGenerated then + errorR(Error(FSComp.SR.chkErrorUseOfByref(), arg.Range)) + else + errorR(Error(FSComp.SR.chkInvalidFunctionParameterType(arg.DisplayName, NicePrint.minimalStringOfType cenv.denv arg.Type), arg.Range)) + ) + ) + + // Check return type + CheckTypeAux permitByRefType cenv env mOrig bodyty (fun () -> + errorR(Error(FSComp.SR.chkInvalidFunctionReturnType(NicePrint.minimalStringOfType cenv.denv bodyty), mOrig)) + ) + syntacticArgs |> List.iter (BindVal cenv env) // Trigger a test hook @@ -1393,8 +1463,10 @@ and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValIn // This path is for expression bindings that are not actually lambdas | _ -> + let m = mOrig // Permit byrefs for let x = ... - CheckTypePermitAllByrefs cenv env m ety + CheckTypeNoInnerByrefs cenv env m ety + let limit = if not inlined && (isByrefLikeTy g m ety || isNativePtrTy g ety) then // allow byref to occur as RHS of byref binding. @@ -1441,7 +1513,7 @@ and CheckDecisionTreeTargets cenv env targets context = and CheckDecisionTreeTarget cenv env context (TTarget(vs,e,_)) = BindVals cenv env vs - vs |> List.iter (CheckValSpec cenv env) + vs |> List.iter (CheckValSpec PermitByRefType.All cenv env) CheckExpr cenv env e context and CheckDecisionTree cenv env x = @@ -1461,11 +1533,11 @@ and CheckDecisionTreeSwitch cenv env (e,cases,dflt,m) = and CheckDecisionTreeTest cenv env m discrim = match discrim with - | DecisionTreeTest.UnionCase (_,tinst) -> CheckTypeInstPermitAllByrefs cenv env m tinst - | DecisionTreeTest.ArrayLength (_,ty) -> CheckTypePermitAllByrefs cenv env m ty + | DecisionTreeTest.UnionCase (_,tinst) -> CheckTypeInstNoInnerByrefs cenv env m tinst + | DecisionTreeTest.ArrayLength (_,ty) -> CheckTypeNoInnerByrefs cenv env m ty | DecisionTreeTest.Const _ -> () | DecisionTreeTest.IsNull -> () - | DecisionTreeTest.IsInst (srcTy,tgtTy) -> CheckTypePermitAllByrefs cenv env m srcTy; CheckTypePermitAllByrefs cenv env m tgtTy + | DecisionTreeTest.IsInst (srcTy,tgtTy) -> CheckTypeNoInnerByrefs cenv env m srcTy; CheckTypeNoInnerByrefs cenv env m tgtTy | DecisionTreeTest.ActivePatternCase (exp,_,_,_,_) -> CheckExprNoByrefs cenv env exp and CheckAttrib cenv env (Attrib(_,_,args,props,_,_,_)) = @@ -1549,10 +1621,13 @@ and CheckValInfo cenv env (ValReprInfo(_,args,ret)) = and CheckArgInfo cenv env (argInfo : ArgReprInfo) = CheckAttribs cenv env argInfo.Attribs -and CheckValSpec cenv env (v:Val) = +and CheckValSpecAux permitByRefLike cenv env (v:Val) onInnerByrefError = v.Attribs |> CheckAttribs cenv env v.ValReprInfo |> Option.iter (CheckValInfo cenv env) - v.Type |> CheckTypePermitAllByrefs cenv env v.Range + CheckTypeAux permitByRefLike cenv env v.Range v.Type onInnerByrefError + +and CheckValSpec permitByRefLike cenv env v = + CheckValSpecAux permitByRefLike cenv env v (fun () -> errorR(Error(FSComp.SR.chkErrorUseOfByref(), v.Range))) and AdjustAccess isHidden (cpath: unit -> CompilationPath) access = if isHidden then @@ -1583,7 +1658,6 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi let nm = v.DisplayName errorR(Error(FSComp.SR.chkMemberUsedInInvalidWay(nm, nm, stringOfRange m), v.Range)) - // Byrefs allowed for x in 'let x = ...' v.Type |> CheckTypePermitAllByrefs cenv env v.Range v.Attribs |> CheckAttribs cenv env v.ValReprInfo |> Option.iter (CheckValInfo cenv env) @@ -1603,7 +1677,9 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi CheckForByrefLikeType cenv env v.Range v.Type (fun () -> errorR(Error(FSComp.SR.chkNoByrefAsTopValue(),v.Range))) | _ -> () - if Option.isSome v.PublicPath then + match v.PublicPath with + | None -> () + | _ -> if // Don't support implicit [] on generated members, except the implicit members // for 'let' bound functions in classes. @@ -1776,8 +1852,6 @@ let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = MethInfosEquivByNameAndSig EraseAll true g cenv.amap v.Range minfo1 minfo2 then errorR(Duplicate(kind,v.DisplayName,v.Range))) - - // Properties get 'get_X', only if there are no args // Properties get 'get_X' match v.ValReprInfo with @@ -2055,8 +2129,8 @@ let CheckEntityDefn cenv env (tycon:Entity) = let env = BindTypars g env tps for argtys in argtysl do for (argty, _) in argtys do - CheckTypePermitAllByrefs cenv env m argty - CheckTypePermitAllByrefs cenv env m rty + CheckTypeNoInnerByrefs cenv env vref.Range argty + CheckTypeNoInnerByrefs cenv env vref.Range rty | None -> () @@ -2066,20 +2140,20 @@ let CheckEntityDefn cenv env (tycon:Entity) = superOfTycon g tycon |> CheckTypeNoByrefs cenv env m if tycon.IsUnionTycon then - tycon.UnionCasesAsList |> List.iter (fun uc -> + tycon.UnionCasesArray |> Array.iter (fun uc -> CheckAttribs cenv env uc.Attribs - uc.RecdFields |> List.iter (CheckRecdField true cenv env tycon)) + uc.RecdFieldsArray |> Array.iter (CheckRecdField true cenv env tycon)) // Access checks let access = AdjustAccess (IsHiddenTycon env.sigToImplRemapInfo tycon) (fun () -> tycon.CompilationPath) tycon.Accessibility - let visitTye ty = CheckTypeForAccess cenv env (fun () -> tycon.DisplayNameWithStaticParametersAndUnderscoreTypars) access tycon.Range ty + let visitType ty = CheckTypeForAccess cenv env (fun () -> tycon.DisplayNameWithStaticParametersAndUnderscoreTypars) access tycon.Range ty - abstractSlotValsOfTycons [tycon] |> List.iter (typeOfVal >> visitTye) + abstractSlotValsOfTycons [tycon] |> List.iter (typeOfVal >> visitType) - superOfTycon g tycon |> visitTye + superOfTycon g tycon |> visitType // We do not have to check access of interface implementations. See FSharp 1.0 5042 - //implements_of_tycon g tycon |> List.iter visitTye + //implements_of_tycon g tycon |> List.iter visitType if tycon.IsFSharpDelegateTycon then match tycon.TypeReprInfo with | TFSharpObjectRepr r -> @@ -2087,8 +2161,8 @@ let CheckEntityDefn cenv env (tycon:Entity) = | TTyconDelegate ss -> //ss.ClassTypars //ss.MethodTypars - ss.FormalReturnType |> Option.iter visitTye - ss.FormalParams |> List.iterSquared (fun (TSlotParam(_,ty,_,_,_,_)) -> visitTye ty) + ss.FormalReturnType |> Option.iter visitType + ss.FormalParams |> List.iterSquared (fun (TSlotParam(_,ty,_,_,_,_)) -> visitType ty) | _ -> () | _ -> () @@ -2098,7 +2172,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = |> List.filter (isInterfaceTy g) if tycon.IsFSharpInterfaceTycon then - List.iter visitTye interfaces // Check inherited interface is as accessible + List.iter visitType interfaces // Check inherited interface is as accessible if not (isRecdOrStructTyconRefAssumedImmutable g tcref) && isRecdOrStructTyconRefReadOnly g m tcref then errorR(Error(FSComp.SR.readOnlyAttributeOnStructWithMutableField(),m)) @@ -2185,6 +2259,7 @@ let CheckTopImpl (g,amap,reportErrors,infoReader,internalsVisibleToPaths,viewCcu boundVals= new Dictionary<_,_>(100, HashIdentity.Structural) limitVals= new Dictionary<_,_>(100, HashIdentity.Structural) potentialUnboundUsesOfVals=Map.empty + anonRecdTypes = StampMap.Empty usesQuotations=false infoReader=infoReader internalsVisibleToPaths=internalsVisibleToPaths @@ -2215,10 +2290,11 @@ let CheckTopImpl (g,amap,reportErrors,infoReader,internalsVisibleToPaths,viewCcu boundTypars= TyparMap.Empty reflect=false external=false - returnScope = 0 } + returnScope = 0 + isInAppExpr = false } CheckModuleExpr cenv env mexpr CheckAttribs cenv env extraAttribs if cenv.usesQuotations && QuotationTranslator.QuotationGenerationScope.ComputeQuotationFormat(g) = QuotationTranslator.QuotationSerializationFormat.FSharp_20_Plus then viewCcu.UsesFSharp20PlusQuotations <- true - cenv.entryPointGiven + cenv.entryPointGiven, cenv.anonRecdTypes diff --git a/src/fsharp/PostInferenceChecks.fsi b/src/fsharp/PostInferenceChecks.fsi index 970c143155..62ad52d449 100644 --- a/src/fsharp/PostInferenceChecks.fsi +++ b/src/fsharp/PostInferenceChecks.fsi @@ -11,4 +11,6 @@ open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.TcGlobals val testFlagMemberBody : bool ref -val CheckTopImpl : TcGlobals * ImportMap * bool * InfoReader * CompilationPath list * CcuThunk * DisplayEnv * ModuleOrNamespaceExprWithSig * Attribs * (bool * bool) * isInternalTestSpanStackReferring: bool -> bool + +/// Perform the checks on the TAST for a file after type inference is complete. +val CheckTopImpl : TcGlobals * ImportMap * bool * InfoReader * CompilationPath list * CcuThunk * DisplayEnv * ModuleOrNamespaceExprWithSig * Attribs * (bool * bool) * isInternalTestSpanStackReferring: bool -> bool * StampMap diff --git a/src/fsharp/PrettyNaming.fs b/src/fsharp/PrettyNaming.fs index fe0bb57745..923be2ccea 100755 --- a/src/fsharp/PrettyNaming.fs +++ b/src/fsharp/PrettyNaming.fs @@ -484,30 +484,36 @@ module public Microsoft.FSharp.Compiler.PrettyNaming let [] private mangledGenericTypeNameSym = '`' - let IsMangledGenericName (n:string) = - n.IndexOf mangledGenericTypeNameSym <> -1 && + let TryDemangleGenericNameAndPos (n:string) = (* check what comes after the symbol is a number *) - let m = n.LastIndexOf mangledGenericTypeNameSym - let mutable res = m < n.Length - 1 - for i = m + 1 to n.Length - 1 do - res <- res && n.[i] >= '0' && n.[i] <= '9' - res + let pos = n.LastIndexOf mangledGenericTypeNameSym + if pos = -1 then ValueNone else + let mutable res = pos < n.Length - 1 + let mutable i = pos + 1 + while res && i < n.Length do + let char = n.[i] + if not (char >= '0' && char <= '9') then + res <- false + i <- i + 1 + if res then + ValueSome pos + else + ValueNone type NameArityPair = NameArityPair of string * int - let DecodeGenericTypeName n = - if IsMangledGenericName n then - let pos = n.LastIndexOf mangledGenericTypeNameSym - let res = n.Substring(0,pos) - let num = n.Substring(pos+1,n.Length - pos - 1) - NameArityPair(res, int32 num) - else NameArityPair(n,0) + let DecodeGenericTypeName pos (mangledName:string) = + let res = mangledName.Substring(0,pos) + let num = mangledName.Substring(pos+1,mangledName.Length - pos - 1) + NameArityPair(res, int32 num) + + let DemangleGenericTypeNameWithPos pos (mangledName:string) = + mangledName.Substring(0,pos) - let DemangleGenericTypeName n = - if IsMangledGenericName n then - let pos = n.LastIndexOf mangledGenericTypeNameSym - n.Substring(0,pos) - else n + let DemangleGenericTypeName (mangledName:string) = + match TryDemangleGenericNameAndPos mangledName with + | ValueSome pos -> DemangleGenericTypeNameWithPos pos mangledName + | _ -> mangledName let private chopStringTo (s:string) (c:char) = match s.IndexOf c with @@ -544,21 +550,31 @@ module public Microsoft.FSharp.Compiler.PrettyNaming /// Return a string array delimited by the given separator. /// Note that a quoted string is not going to be mangled into pieces. + let inline private isNotQuotedQuotation (text: string) n = n > 0 && text.[n-1] <> '\\' let private splitAroundQuotation (text:string) (separator:char) = let length = text.Length - let isNotQuotedQuotation n = n > 0 && text.[n-1] <> '\\' - let rec split (i, cur, group, insideQuotation) = - if i>=length then List.rev (cur::group) else + let result = ResizeArray() + let mutable insideQuotation = false + let mutable start = 0 + for i = 0 to length - 1 do match text.[i], insideQuotation with // split when seeing a separator - | c, false when c = separator -> split (i+1, "", cur::group, false) + | c, false when c = separator -> + result.Add(text.Substring(start, i - start)) + insideQuotation <- false + start <- i + 1 + | _, _ when i = length - 1 -> + result.Add(text.Substring(start, i - start + 1)) // keep reading if a separator is inside quotation - | c, true when c = separator -> split (i+1, cur+(Char.ToString c), group, true) - // open or close quotation - | '\"', _ when isNotQuotedQuotation i -> split (i+1, cur+"\"", group, not insideQuotation) + | c, true when c = separator -> + insideQuotation <- true + // open or close quotation + | '\"', _ when isNotQuotedQuotation text i -> + insideQuotation <- not insideQuotation // keep reading - | c, _ -> split (i+1, cur+(Char.ToString c), group, insideQuotation) - split (0, "", [], false) |> Array.ofList + | _ -> () + + result.ToArray() /// Return a string array delimited by the given separator up to the maximum number. /// Note that a quoted string is not going to be mangled into pieces. @@ -684,3 +700,5 @@ module public Microsoft.FSharp.Compiler.PrettyNaming | Some v when v = actualArgValue -> None | _ -> Some (defaultArgName, actualArgValue)) mangleProvidedTypeName (nm, nonDefaultArgs) + + let outArgCompilerGeneratedName = "outArg" \ No newline at end of file diff --git a/src/fsharp/QuotationPickler.fs b/src/fsharp/QuotationPickler.fs index ea9ba92077..79c2ac2796 100755 --- a/src/fsharp/QuotationPickler.fs +++ b/src/fsharp/QuotationPickler.fs @@ -304,12 +304,12 @@ module SimplePickle = open SimplePickle -let p_assref x st = p_string x st +let p_assemblyref x st = p_string x st let p_NamedType x st = match x with - | Idx n -> p_tup2 p_string p_assref (string n, "") st - | Named (nm,ass) -> p_tup2 p_string p_assref (nm, ass) st + | Idx n -> p_tup2 p_string p_assemblyref (string n, "") st + | Named (nm,a) -> p_tup2 p_string p_assemblyref (nm, a) st let p_tycon x st = match x with diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 9c7bc53e33..b0f1e7ce4c 100755 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -66,7 +66,7 @@ type QuotationGenerationScope = static member ComputeQuotationFormat g = let deserializeExValRef = ValRefForIntrinsic g.deserialize_quoted_FSharp_40_plus_info - if deserializeExValRef.TryDeref.IsSome then + if ValueOptionInternal.isSome deserializeExValRef.TryDeref then QuotationSerializationFormat.FSharp_40_Plus else QuotationSerializationFormat.FSharp_20_Plus @@ -424,6 +424,20 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. let argsR = ConvExprs cenv env args QP.mkRecdMk(rgtypR,tyargsR,argsR) + | TOp.AnonRecd anonInfo, _, _ -> + let tref = anonInfo.ILTypeRef + let rgtypR = ConvILTypeRef cenv tref + let tyargsR = ConvTypes cenv env m tyargs + let argsR = ConvExprs cenv env args + QP.mkRecdMk(rgtypR,tyargsR,argsR) + + | TOp.AnonRecdGet (anonInfo, n), _, _ -> + let tref = anonInfo.ILTypeRef + let rgtypR = ConvILTypeRef cenv tref + let tyargsR = ConvTypes cenv env m tyargs + let argsR = ConvExprs cenv env args + QP.mkRecdGet((rgtypR,anonInfo.SortedNames.[n]),tyargsR,argsR) + | TOp.UnionCaseFieldGet (ucref,n),tyargs,[e] -> ConvUnionFieldGet cenv env m ucref n tyargs e @@ -807,6 +821,10 @@ and ConvType cenv env m ty = | TType_fun(a,b) -> QP.mkFunTy(ConvType cenv env m a,ConvType cenv env m b) | TType_tuple(tupInfo,l) -> ConvType cenv env m (mkCompiledTupleTy cenv.g (evalTupInfoIsStruct tupInfo) l) + | TType_anon(anonInfo,tinst) -> + let tref = anonInfo.ILTypeRef + let tinstR = ConvTypes cenv env m tinst + QP.mkILNamedTy(ConvILTypeRefUnadjusted cenv m tref, tinstR) | TType_var(tp) -> QP.mkVarTy(ConvTyparRef cenv env m tp) | TType_forall(_spec,_ty) -> wfail(Error(FSComp.SR.crefNoInnerGenericsInQuotations(),m)) | _ -> wfail(Error (FSComp.SR.crefQuotationsCantContainThisType(),m)) @@ -960,12 +978,12 @@ and ConvILTypeRef cenv (tr:ILTypeRef) = QP.Idx idx | QuotationSerializationFormat.FSharp_20_Plus -> - let assref = + let assemblyRef = match tr.Scope with | ILScopeRef.Local -> "." | _ -> tr.Scope.QualifiedName - QP.Named(tr.BasicQualifiedName, assref) + QP.Named(tr.BasicQualifiedName, assemblyRef) and ConvVoidType cenv m = QP.mkILNamedTy(ConvTyconRef cenv cenv.g.system_Void_tcref m, []) diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index 8b0981451e..ac0c23e970 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -37,8 +37,8 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = // Used when checking attributes. let sigToImplRemap = let remap = Remap.Empty - let remap = (remapInfo.mrpiEntities,remap) ||> List.foldBack (fun (implTcref ,signTcref) acc -> addTyconRefRemap signTcref implTcref acc) - let remap = (remapInfo.mrpiVals ,remap) ||> List.foldBack (fun (implValRef,signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) + let remap = (remapInfo.RepackagedEntities,remap) ||> List.foldBack (fun (implTcref ,signTcref) acc -> addTyconRefRemap signTcref implTcref acc) + let remap = (remapInfo.RepackagedVals ,remap) ||> List.foldBack (fun (implValRef,signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) remap // For all attributable elements (types, modules, exceptions, record fields, unions, parameters, generic type parameters) @@ -177,46 +177,62 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = |> ListSet.setify (typeEquiv g) |> List.filter (isInterfaceTy g) let aintfs = flatten aintfs - let aintfsUser = flatten aintfsUser let fintfs = flatten fintfs let unimpl = ListSet.subtract (fun fity aity -> typeAEquiv g aenv aity fity) fintfs aintfs - (unimpl |> List.forall (fun ity -> errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName, NicePrint.minimalStringOfType denv ity),m)); false)) && + (unimpl + |> List.forall (fun ity -> + let errorMessage = FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName, NicePrint.minimalStringOfType denv ity) + errorR (Error(errorMessage,m)); false)) && + + let aintfsUser = flatten aintfsUser + let hidden = ListSet.subtract (typeAEquiv g aenv) aintfsUser fintfs - let warningOrError = if implTycon.IsFSharpInterfaceTycon then error else warning - hidden |> List.iter (fun ity -> warningOrError (InterfaceNotRevealed(denv,ity,implTycon.Range))) + let continueChecks,warningOrError = if implTycon.IsFSharpInterfaceTycon then false,errorR else true,warning + (hidden |> List.forall (fun ity -> warningOrError (InterfaceNotRevealed(denv,ity,implTycon.Range)); continueChecks)) && let aNull = IsUnionTypeWithNullAsTrueValue g implTycon let fNull = IsUnionTypeWithNullAsTrueValue g sigTycon if aNull && not fNull then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false elif fNull && not aNull then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else let aNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) let fNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) if aNull2 && not fNull2 then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false elif fNull2 && not aNull2 then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else let aSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef implTycon)) let fSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef sigTycon)) - if aSealed && not fSealed then + if aSealed && not fSealed then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSealed(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) - if not aSealed && fSealed then + false + elif not aSealed && fSealed then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else let aPartial = isAbstractTycon implTycon let fPartial = isAbstractTycon sigTycon if aPartial && not fPartial then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) - - if not aPartial && fPartial then + false + elif not aPartial && fPartial then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) - - if not (typeAEquiv g aenv (superOfTycon g implTycon) (superOfTycon g sigTycon)) then + false + elif not (typeAEquiv g aenv (superOfTycon g implTycon) (superOfTycon g sigTycon)) then errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else checkTypars m aenv implTypars sigTypars && checkTypeRepr m aenv implTycon sigTycon.TypeReprInfo && diff --git a/src/fsharp/SimulatedMSBuildReferenceResolver.fs b/src/fsharp/SimulatedMSBuildReferenceResolver.fs index 1668cdc09d..6fd5fc5312 100644 --- a/src/fsharp/SimulatedMSBuildReferenceResolver.fs +++ b/src/fsharp/SimulatedMSBuildReferenceResolver.fs @@ -186,8 +186,8 @@ let internal GetBestAvailableResolver() = let tryMSBuild v = // Detect if MSBuild is on the machine, if so use the resolver from there let mb = try Assembly.Load(sprintf "Microsoft.Build.Framework, Version=%s.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" v) |> Option.ofObj with _ -> None - let ass = mb |> Option.bind (fun _ -> try Assembly.Load(sprintf "FSharp.Compiler.Service.MSBuild.v%s" v) |> Option.ofObj with _ -> None) - let ty = ass |> Option.bind (fun ass -> ass.GetType("Microsoft.FSharp.Compiler.MSBuildReferenceResolver") |> Option.ofObj) + let assembly = mb |> Option.bind (fun _ -> try Assembly.Load(sprintf "FSharp.Compiler.Service.MSBuild.v%s" v) |> Option.ofObj with _ -> None) + let ty = assembly |> Option.bind (fun a -> a.GetType("Microsoft.FSharp.Compiler.MSBuildReferenceResolver") |> Option.ofObj) let obj = ty |> Option.bind (fun ty -> ty.InvokeMember("get_Resolver",BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.InvokeMethod ||| BindingFlags.NonPublic, null, null, [| |]) |> Option.ofObj) let resolver = obj |> Option.bind (fun obj -> match obj with :? Resolver as r -> Some r | _ -> None) resolver diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index db888dd8f9..23242b1aff 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -181,6 +181,12 @@ let rec remapTypeAux (tyenv : Remap) (ty:TType) = | Some tcr' -> TType_ucase (UCRef(tcr', n), remapTypesAux tyenv tinst) | None -> TType_ucase (UCRef(tcr, n), remapTypesAux tyenv tinst) + | TType_anon (anonInfo, l) as ty -> + let tupInfo' = remapTupInfoAux tyenv anonInfo.TupInfo + let l' = remapTypesAux tyenv l + if anonInfo.TupInfo === tupInfo' && l === l' then ty else + TType_anon (AnonRecdTypeInfo.Create(anonInfo.Assembly, tupInfo', anonInfo.SortedIds), l') + | TType_tuple (tupInfo, l) as ty -> let tupInfo' = remapTupInfoAux tyenv tupInfo let l' = remapTypesAux tyenv l @@ -229,7 +235,7 @@ and remapTupInfoAux _tyenv unt = and remapTypesAux tyenv types = List.mapq (remapTypeAux tyenv) types and remapTyparConstraintsAux tyenv cs = - cs |> List.choose (fun x -> + cs |> List.choose (fun x -> match x with | TyparConstraint.CoercesTo(ty, m) -> Some(TyparConstraint.CoercesTo (remapTypeAux tyenv ty, m)) @@ -263,6 +269,8 @@ and remapTraitAux tyenv (TTrait(tys, nm, mf, argtys, rty, slnCell)) = FSMethSln(remapTypeAux tyenv ty, remapValRef tyenv vref, remapTypesAux tyenv minst) | FSRecdFieldSln(tinst, rfref, isSet) -> FSRecdFieldSln(remapTypesAux tyenv tinst, remapRecdFieldRef tyenv.tyconRefRemap rfref, isSet) + | FSAnonRecdFieldSln(anonInfo, tinst, n) -> + FSAnonRecdFieldSln(anonInfo, remapTypesAux tyenv tinst, n) | BuiltInSln -> BuiltInSln | ClosedExprSln e -> @@ -667,7 +675,7 @@ let mkOuterCompiledTupleTy g isStruct tupElemTys = let marker = TType_app (mkCompiledTupleTyconRef g isStruct 1, [tyB]) TType_app (tcref, tysA@[marker]) | _ -> - TType_app (tcref, tysA@[TType_tuple (TupInfo.Const isStruct, tysB)]) + TType_app (tcref, tysA@[TType_tuple (mkTupInfo isStruct, tysB)]) //--------------------------------------------------------------------------- // Remove inference equations and abbreviations from types @@ -733,6 +741,9 @@ let evalTupInfoIsStruct aexpr = match aexpr with | TupInfo.Const b -> b +let evalAnonInfoIsStruct (anonInfo: AnonRecdTypeInfo) = + evalTupInfoIsStruct anonInfo.TupInfo + /// This erases outermost occurrences of inference equations, type abbreviations, non-generated provided types /// and measureable types (float<_>). /// It also optionally erases all "compilation representations", i.e. function and @@ -783,6 +794,8 @@ let isForallTy g ty = ty |> stripTyEqns g |> (function TType_forall _ -> tru let isAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple _ -> true | _ -> false) let isRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> not (evalTupInfoIsStruct tupInfo) | _ -> false) let isStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> evalTupInfoIsStruct tupInfo | _ -> false) +let isAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon _ -> true | _ -> false) +let isStructAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, _) -> evalAnonInfoIsStruct anonInfo | _ -> false) let isUnionTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsUnionTycon | _ -> false) let isReprHiddenTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsHiddenReprTycon | _ -> false) let isFSharpObjModelTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsFSharpObjectModelTycon | _ -> false) @@ -799,38 +812,48 @@ let isProvenUnionCaseTy ty = match ty with TType_ucase _ -> true | _ -> false let mkAppTy tcref tyargs = TType_app(tcref, tyargs) let mkProvenUnionCaseTy ucref tyargs = TType_ucase(ucref, tyargs) let isAppTy g ty = ty |> stripTyEqns g |> (function TType_app _ -> true | _ -> false) +let tryAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> ValueSome (tcref, tinst) | _ -> ValueNone) let destAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> tcref, tinst | _ -> failwith "destAppTy") let tcrefOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref | _ -> failwith "tcrefOfAppTy") let argsOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(_, tinst) -> tinst | _ -> []) -let tryDestTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | _ -> None) -let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> Some(tyv, tau) | _ -> None) -let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> Some tcref | _ -> None) -let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) +let tryDestTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> ValueSome v | _ -> ValueNone) +let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> ValueSome(tyv, tau) | _ -> ValueNone) +let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> ValueSome tcref | _ -> ValueNone) +let tryDestAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, tys) -> ValueSome (anonInfo, tys) | _ -> ValueNone) + +let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> ValueSome v | TType_measure unt when isUnitParMeasure g unt -> ValueSome(destUnitParMeasure g unt) | _ -> ValueNone) +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 (|RefTupleTy|_|) g ty = ty |> stripTyEqns g |> (function TType_tuple(tupInfo, tys) when not (evalTupInfoIsStruct tupInfo) -> Some tys | _ -> None) let (|FunTy|_|) g ty = ty |> stripTyEqns g |> (function TType_fun(dty, rty) -> Some (dty, rty) | _ -> None) let tryNiceEntityRefOfTy ty = let ty = stripTyparEqnsAux false ty - match ty with + match ty with + | TType_app (tcref, _) -> ValueSome tcref + | TType_measure (Measure.Con tcref) -> ValueSome tcref + | _ -> ValueNone + +let tryNiceEntityRefOfTyOption ty = + let ty = stripTyparEqnsAux false ty + match ty with | TType_app (tcref, _) -> Some tcref | TType_measure (Measure.Con tcref) -> Some tcref | _ -> None - -let (|NullableTy|_|) g ty = - match ty with - | AppTy g (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> Some tyarg +let (|NullableTy|_|) g ty = + match tryAppTy g ty with + | ValueSome (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> Some tyarg | _ -> None let (|StripNullableTy|) g ty = - match ty with - | AppTy g (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> tyarg + match tryAppTy g ty with + | ValueSome (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> tyarg | _ -> ty let mkInstForAppTy g ty = - match ty with - | AppTy g (tcref, tinst) -> mkTyconRefInst tcref tinst + match tryAppTy g ty with + | ValueSome (tcref, tinst) -> mkTyconRefInst tcref tinst | _ -> [] let domainOfFunTy g ty = fst (destFunTy g ty) @@ -957,6 +980,9 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = typesAEquivAux erasureFlag g aenv b1 b2 | TType_tuple (s1, l1), TType_tuple (s2, l2) -> structnessAEquiv s1 s2 && typesAEquivAux erasureFlag g aenv l1 l2 + | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> + anonInfoEquiv anonInfo1 anonInfo2 && + typesAEquivAux erasureFlag g aenv l1 l2 | TType_fun (dtys1, rty1), TType_fun (dtys2, rty2) -> typeAEquivAux erasureFlag g aenv dtys1 dtys2 && typeAEquivAux erasureFlag g aenv rty1 rty2 | TType_measure m1, TType_measure m2 -> @@ -965,6 +991,12 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = | _ -> true | _ -> false + +and anonInfoEquiv (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = + ccuEq anonInfo1.Assembly anonInfo2.Assembly && + structnessAEquiv anonInfo1.TupInfo anonInfo2.TupInfo && + anonInfo1.SortedNames = anonInfo2.SortedNames + and structnessAEquiv un1 un2 = match un1, un2 with | TupInfo.Const b1, TupInfo.Const b2 -> (b1 = b2) @@ -1011,7 +1043,7 @@ let rec getErasedTypes g ty = getErasedTypes g rty | TType_var tp -> if tp.IsErased then [ty] else [] - | TType_app (_, b) | TType_ucase(_, b) | TType_tuple (_, b) -> + | TType_app (_, b) | TType_ucase(_, b) | TType_anon (_, b) | TType_tuple (_, b) -> List.foldBack (fun ty tys -> getErasedTypes g ty @ tys) b [] | TType_fun (dty, rty) -> getErasedTypes g dty @ getErasedTypes g rty @@ -1227,8 +1259,8 @@ let NormalizeDeclaredTyparsForEquiRecursiveInference g tps = tps |> List.map (fun tp -> let ty = mkTyparTy tp match tryAnyParTy g ty with - | Some anyParTy -> anyParTy - | None -> tp) + | ValueSome anyParTy -> anyParTy + | ValueNone -> tp) type TypeScheme = TypeScheme of Typars * TType @@ -1270,6 +1302,7 @@ let mkAsmExpr(code, tinst, args, rettys, m) = Expr.Op (TOp.ILAsm let mkUnionCaseExpr(uc, tinst, args, m) = Expr.Op (TOp.UnionCase uc, tinst, args, m) let mkExnExpr(uc, args, m) = Expr.Op (TOp.ExnConstr uc, [], args, m) let mkTupleFieldGetViaExprAddr(tupInfo, e, tinst, i, m) = Expr.Op (TOp.TupleFieldGet(tupInfo, i), tinst, [e], m) +let mkAnonRecdFieldGetViaExprAddr(anonInfo, e, tinst, i, m) = Expr.Op (TOp.AnonRecdGet(anonInfo, i), tinst, [e], m) let mkRecdFieldGetViaExprAddr(e, fref, tinst, m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [e], m) let mkRecdFieldGetAddrViaExprAddr(readonly, e, fref, tinst, m) = Expr.Op (TOp.ValFieldGetAddr(fref, readonly), tinst, [e], m) @@ -1391,14 +1424,13 @@ type TyconRefMultiMap<'T>(contents: TyconRefMap<'T list>) = //-------------------------------------------------------------------------- /// Try to create a EntityRef suitable for accessing the given Entity from another assembly -let tryRescopeEntity viewedCcu (entity:Entity) : EntityRef option = +let tryRescopeEntity viewedCcu (entity:Entity) : ValueOption = match entity.PublicPath with - | Some pubpath -> Some (ERefNonLocal (rescopePubPath viewedCcu pubpath)) - | None -> None - + | Some pubpath -> ValueSome (ERefNonLocal (rescopePubPath viewedCcu pubpath)) + | None -> ValueNone /// Try to create a ValRef suitable for accessing the given Val from another assembly -let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValRef option = +let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValueOption = match vspec.PublicPath with | Some (ValPubPath(p, fullLinkageKey)) -> // The type information in the val linkage doesn't need to keep any information to trait solutions. @@ -1413,9 +1445,8 @@ let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValRef option = mkNonLocalValRef (rescopePubPathToParent viewedCcu p) fullLinkageKey else mkNonLocalValRef (rescopePubPath viewedCcu p) fullLinkageKey - Some vref - | None -> None - + ValueSome vref + | _ -> ValueNone //--------------------------------------------------------------------------- // Type information about records, constructors etc. @@ -1569,13 +1600,13 @@ let rankOfArrayTyconRef (g:TcGlobals) tcr = //------------------------------------------------------------------------- let destArrayTy (g:TcGlobals) ty = - match ty with - | AppTy g (tcref, [ty]) when isArrayTyconRef g tcref -> ty + match tryAppTy g ty with + | ValueSome (tcref, [ty]) when isArrayTyconRef g tcref -> ty | _ -> failwith "destArrayTy" let destListTy (g:TcGlobals) ty = - match ty with - | AppTy g (tcref, [ty]) when tyconRefEq g tcref g.list_tcr_canon -> ty + match tryAppTy g ty with + | ValueSome (tcref, [ty]) when tyconRefEq g tcref g.list_tcr_canon -> ty | _ -> failwith "destListTy" let tyconRefEqOpt g tcOpt tc = @@ -1667,24 +1698,24 @@ let rankOfArrayTy g ty = rankOfArrayTyconRef g (tcrefOfAppTy g ty) let isFSharpObjModelRefTy g ty = isFSharpObjModelTy g ty && - let tcr, _ = destAppTy g ty + let tcr = tcrefOfAppTy g ty match tcr.FSharpObjectModelTypeInfo.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> true | TTyconStruct | TTyconEnum -> false let isFSharpClassTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpClassTycon + | ValueSome tcref -> tcref.Deref.IsFSharpClassTycon | _ -> false let isFSharpStructTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpStructOrEnumTycon + | ValueSome tcref -> tcref.Deref.IsFSharpStructOrEnumTycon | _ -> false let isFSharpInterfaceTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpInterfaceTycon + | ValueSome tcref -> tcref.Deref.IsFSharpInterfaceTycon | _ -> false let isDelegateTy g ty = @@ -1695,7 +1726,7 @@ let isDelegateTy g ty = | ILTypeMetadata (TILObjectReprData(_, _, td)) -> td.IsDelegate | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpDelegateTycon + | ValueSome tcref -> tcref.Deref.IsFSharpDelegateTycon | _ -> false let isInterfaceTy g ty = @@ -1716,20 +1747,21 @@ let isClassTy g ty = let isStructOrEnumTyconTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsStructOrEnumTycon + | ValueSome tcref -> tcref.Deref.IsStructOrEnumTycon | _ -> false let isStructRecordOrUnionTyconTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsStructRecordOrUnionTycon + | ValueSome tcref -> tcref.Deref.IsStructRecordOrUnionTycon | _ -> false let isStructTy g ty = match tryDestAppTy g ty with - | Some tcref -> + | ValueSome tcref -> let tycon = tcref.Deref tycon.IsStructRecordOrUnionTycon || tycon.IsStructOrEnumTycon - | _ -> false + | _ -> + isStructAnonRecdTy g ty || isStructTupleTy g ty let isRefTy g ty = not (isStructOrEnumTyconTy g ty) && @@ -1756,7 +1788,7 @@ let isRefTy g ty = let rec isUnmanagedTy g ty = let ty = stripTyEqnsAndMeasureEqns g ty match tryDestAppTy g ty with - | Some tcref -> + | ValueSome tcref -> let isEq tcref2 = tyconRefEq g tcref tcref2 if isEq g.nativeptr_tcr || isEq g.nativeint_tcr || isEq g.sbyte_tcr || isEq g.byte_tcr || @@ -1778,7 +1810,7 @@ let rec isUnmanagedTy g ty = | [] -> tycon.AllInstanceFieldsAsList |> List.forall (fun r -> isUnmanagedTy g r.rfield_type) | _ -> false // generic structs are never else false - | None -> + | ValueNone -> false let isInterfaceTycon x = @@ -1788,8 +1820,8 @@ let isInterfaceTyconRef (tcref: TyconRef) = isInterfaceTycon tcref.Deref let isEnumTy g ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tcref.IsEnumTycon + | ValueNone -> false + | ValueSome tcref -> tcref.IsEnumTycon let actualReturnTyOfSlotSig parentTyInst methTyInst (TSlotSig(_, _, parentFormalTypars, methFormalTypars, _, formalRetTy)) = let methTyInst = mkTyparInst methFormalTypars methTyInst @@ -2011,6 +2043,8 @@ and accFreeInTraitSln opts sln acc = accFreeInType opts ty (accFreeValRefInTraitSln opts vref (accFreeInTypes opts minst acc)) + | FSAnonRecdFieldSln(_anonInfo, tinst, _n) -> + accFreeInTypes opts tinst acc | FSRecdFieldSln(tinst, _rfref, _isSet) -> accFreeInTypes opts tinst acc | BuiltInSln -> acc @@ -2037,6 +2071,7 @@ and accFreeTyparRef opts (tp:Typar) acc = and accFreeInType opts ty acc = match stripTyparEqns ty with | TType_tuple (tupInfo, l) -> accFreeInTypes opts l (accFreeInTupInfo opts tupInfo acc) + | TType_anon (anonInfo, l) -> accFreeInTypes opts l (accFreeInTupInfo opts anonInfo.TupInfo acc) | TType_app (tc, tinst) -> let acc = accFreeTycon opts tc acc match tinst with @@ -2126,6 +2161,9 @@ and accFreeTyparRefLeftToRight g cxFlag thruFlag acc (tp:Typar) = and accFreeInTypeLeftToRight g cxFlag thruFlag acc ty = if verbose then dprintf "--> accFreeInTypeLeftToRight \n" match (if thruFlag then stripTyEqns g ty else stripTyparEqns ty) with + | TType_anon (anonInfo, l) -> + let acc = accFreeInTupInfoLeftToRight g cxFlag thruFlag acc anonInfo.TupInfo + accFreeInTypesLeftToRight g cxFlag thruFlag acc l | TType_tuple (tupInfo, l) -> let acc = accFreeInTupInfoLeftToRight g cxFlag thruFlag acc tupInfo accFreeInTypesLeftToRight g cxFlag thruFlag acc l @@ -2453,7 +2491,7 @@ module PrettyTypes = // Badly formed code may instantiate rigid declared typars to types. // Hence we double check here that the thing is really a type variable - let safeDestAnyParTy orig g ty = match tryAnyParTy g ty with None -> orig | Some x -> x + let safeDestAnyParTy orig g ty = match tryAnyParTy g ty with ValueNone -> orig | ValueSome x -> x let tee f x = f x x let foldUnurriedArgInfos f z (x: UncurriedArgInfos) = List.fold (fold1Of2 f) z x @@ -2518,8 +2556,9 @@ module SimplifyTypes = let z = f z ty match ty with | TType_forall (_, body) -> foldTypeButNotConstraints f z body - | TType_app (_, tinst) -> List.fold (foldTypeButNotConstraints f) z tinst - | TType_ucase (_, tinst) -> List.fold (foldTypeButNotConstraints f) z tinst + | TType_app (_, tys) + | TType_ucase (_, tys) + | TType_anon (_, tys) | TType_tuple (_, tys) -> List.fold (foldTypeButNotConstraints f) z tys | TType_fun (s, t) -> foldTypeButNotConstraints f (foldTypeButNotConstraints f z s) t | TType_var _ -> z @@ -2650,30 +2689,30 @@ let layoutOfPath p = let fullNameOfParentOfPubPath pp = match pp with - | PubPath([| _ |]) -> None - | pp -> Some(textOfPath pp.EnclosingPath) + | PubPath([| _ |]) -> ValueNone + | pp -> ValueSome(textOfPath pp.EnclosingPath) let fullNameOfParentOfPubPathAsLayout pp = match pp with - | PubPath([| _ |]) -> None - | pp -> Some(layoutOfPath (Array.toList pp.EnclosingPath)) + | PubPath([| _ |]) -> ValueNone + | pp -> ValueSome(layoutOfPath (Array.toList pp.EnclosingPath)) let fullNameOfPubPath (PubPath(p)) = textOfPath p let fullNameOfPubPathAsLayout (PubPath(p)) = layoutOfPath (Array.toList p) let fullNameOfParentOfNonLocalEntityRef (nlr: NonLocalEntityRef) = - if nlr.Path.Length < 2 then None - else Some (textOfPath nlr.EnclosingMangledPath) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules + if nlr.Path.Length < 2 then ValueNone + else ValueSome (textOfPath nlr.EnclosingMangledPath) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules let fullNameOfParentOfNonLocalEntityRefAsLayout (nlr: NonLocalEntityRef) = - if nlr.Path.Length < 2 then None - else Some (layoutOfPath (List.ofArray nlr.EnclosingMangledPath)) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules + if nlr.Path.Length < 2 then ValueNone + else ValueSome (layoutOfPath (List.ofArray nlr.EnclosingMangledPath)) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules let fullNameOfParentOfEntityRef eref = match eref with | ERefLocal x -> match x.PublicPath with - | None -> None + | None -> ValueNone | Some ppath -> fullNameOfParentOfPubPath ppath | ERefNonLocal nlr -> fullNameOfParentOfNonLocalEntityRef nlr @@ -2681,14 +2720,14 @@ let fullNameOfParentOfEntityRefAsLayout eref = match eref with | ERefLocal x -> match x.PublicPath with - | None -> None + | None -> ValueNone | Some ppath -> fullNameOfParentOfPubPathAsLayout ppath | ERefNonLocal nlr -> fullNameOfParentOfNonLocalEntityRefAsLayout nlr let fullNameOfEntityRef nmF xref = - match fullNameOfParentOfEntityRef xref with - | None -> nmF xref - | Some pathText -> pathText +.+ nmF xref + match fullNameOfParentOfEntityRef xref with + | ValueNone -> nmF xref + | ValueSome pathText -> pathText +.+ nmF xref let tagEntityRefName (xref: EntityRef) name = if xref.IsNamespace then tagNamespace name @@ -2710,26 +2749,26 @@ let fullNameOfEntityRefAsLayout nmF (xref: EntityRef) = |> mkNav xref.DefinitionRange |> wordL match fullNameOfParentOfEntityRefAsLayout xref with - | None -> navigableText - | Some pathText -> pathText ^^ SepL.dot ^^ navigableText + | ValueNone -> navigableText + | ValueSome pathText -> pathText ^^ SepL.dot ^^ navigableText let fullNameOfParentOfValRef vref = match vref with | VRefLocal x -> match x.PublicPath with - | None -> None - | Some (ValPubPath(pp, _)) -> Some(fullNameOfPubPath pp) + | None -> ValueNone + | Some (ValPubPath(pp, _)) -> ValueSome(fullNameOfPubPath pp) | VRefNonLocal nlr -> - Some (fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) + ValueSome (fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) let fullNameOfParentOfValRefAsLayout vref = match vref with | VRefLocal x -> match x.PublicPath with - | None -> None - | Some (ValPubPath(pp, _)) -> Some(fullNameOfPubPathAsLayout pp) + | None -> ValueNone + | Some (ValPubPath(pp, _)) -> ValueSome(fullNameOfPubPathAsLayout pp) | VRefNonLocal nlr -> - Some (fullNameOfEntityRefAsLayout (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) + ValueSome (fullNameOfEntityRefAsLayout (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) let fullDisplayTextOfParentOfModRef r = fullNameOfParentOfEntityRef r @@ -2742,12 +2781,12 @@ let fullDisplayTextOfExnRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:Ty let fullDisplayTextOfUnionCaseRef (ucref:UnionCaseRef) = fullDisplayTextOfTyconRef ucref.TyconRef +.+ ucref.CaseName let fullDisplayTextOfRecdFieldRef (rfref:RecdFieldRef) = fullDisplayTextOfTyconRef rfref.TyconRef +.+ rfref.FieldName -let fullDisplayTextOfValRef (vref:ValRef) = +let fullDisplayTextOfValRef (vref:ValRef) = match fullNameOfParentOfValRef vref with - | None -> vref.DisplayName - | Some pathText -> pathText +.+ vref.DisplayName + | ValueNone -> vref.DisplayName + | ValueSome pathText -> pathText +.+ vref.DisplayName -let fullDisplayTextOfValRefAsLayout (vref:ValRef) = +let fullDisplayTextOfValRefAsLayout (vref:ValRef) = let n = match vref.MemberInfo with | None -> @@ -2762,8 +2801,8 @@ let fullDisplayTextOfValRefAsLayout (vref:ValRef) = | MemberKind.Constructor -> tagMethod vref.DisplayName | MemberKind.Member -> tagMember vref.DisplayName match fullNameOfParentOfValRefAsLayout vref with - | None -> wordL n - | Some pathText -> + | ValueNone -> wordL n + | ValueSome pathText -> pathText ^^ SepL.dot ^^ wordL n //pathText +.+ vref.DisplayName @@ -2988,8 +3027,8 @@ let destNativePtrTy g ty = let isRefCellTy g ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tyconRefEq g g.refcell_tcr_canon tcref + | ValueNone -> false + | ValueSome tcref -> tyconRefEq g g.refcell_tcr_canon tcref let destRefCellTy g ty = match ty |> stripTyEqns g with @@ -3013,23 +3052,23 @@ let mkListTy (g:TcGlobals) ty = TType_app (g.list_tcr_nice, [ty]) let isOptionTy (g:TcGlobals) ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tyconRefEq g g.option_tcr_canon tcref + | ValueNone -> false + | ValueSome tcref -> tyconRefEq g g.option_tcr_canon tcref let tryDestOptionTy g ty = match argsOfAppTy g ty with - | [ty1] when isOptionTy g ty -> Some ty1 - | _ -> None + | [ty1] when isOptionTy g ty -> ValueSome ty1 + | _ -> ValueNone let destOptionTy g ty = match tryDestOptionTy g ty with - | Some ty -> ty - | None -> failwith "destOptionTy: not an option type" + | ValueSome ty -> ty + | ValueNone -> failwith "destOptionTy: not an option type" let isLinqExpressionTy g ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tyconRefEq g g.system_LinqExpression_tcref tcref + | ValueNone -> false + | ValueSome tcref -> tyconRefEq g g.system_LinqExpression_tcref tcref let tryDestLinqExpressionTy g ty = match argsOfAppTy g ty with @@ -3142,6 +3181,7 @@ module DebugPrint = begin let squareAngleL x = LeftL.leftBracketAngle ^^ x ^^ RightL.rightBracketAngle let angleL x = sepL Literals.leftAngle ^^ x ^^ rightL Literals.rightAngle let braceL x = leftL Literals.leftBrace ^^ x ^^ rightL Literals.rightBrace + let braceBarL x = leftL Literals.leftBraceBar ^^ x ^^ rightL Literals.rightBraceBar let boolL = function true -> WordL.keywordTrue | false -> WordL.keywordFalse let intL (n:int) = wordL (tagNumericLiteral (string n )) @@ -3203,6 +3243,7 @@ module DebugPrint = begin let prefix = tcref.IsPrefixDisplay let tcL = layoutTyconRef tcref auxTyparsL env tcL prefix tinst + | TType_anon (anonInfo, tys) -> braceBarL (sepListL (wordL (tagText ";")) (List.map2 (fun nm ty -> wordL (tagField nm) --- auxTypeAtomL env ty) (Array.toList anonInfo.SortedNames) tys)) | TType_tuple (_tupInfo, tys) -> sepListL (wordL (tagText "*")) (List.map (auxTypeAtomL env) tys) |> wrap | TType_fun (f, x) -> ((auxTypeAtomL env f ^^ wordL (tagText "->")) --- auxTypeL env x) |> wrap | TType_var typar -> auxTyparWrapL env isAtomic typar @@ -3401,7 +3442,7 @@ module DebugPrint = begin let rec MemberL (v:Val) (membInfo:ValMemberInfo) = (aboveListL [ wordL(tagText "compiled_name! = ") ^^ wordL (tagText v.CompiledName) ; wordL(tagText "membInfo-slotsig! = ") ^^ listL slotSigL membInfo.ImplementedSlotSigs ]) - and vspecAtBindL v = + and valAtBindL v = let vL = valL v in let mutL = (if v.IsMutable then wordL(tagText "mutable") ++ vL else vL) mutL --- (aboveListL (List.concat [[wordL(tagText ":") ^^ typeL v.Type]; @@ -3471,7 +3512,7 @@ module DebugPrint = begin then emptyL else let iimplsLs = iimpls |> List.map (fun (ty, _, _) -> wordL(tagText "interface") --- typeL ty) - let adhocLs = adhoc |> List.map (fun vref -> vspecAtBindL vref.Deref) + let adhocLs = adhoc |> List.map (fun vref -> valAtBindL vref.Deref) (wordL(tagText "with") @@-- aboveListL (iimplsLs @ adhocLs)) @@ wordL(tagText "end") let layoutUnionCaseArgTypes argtys = sepListL (wordL(tagText "*")) (List.map typeL argtys) @@ -3518,7 +3559,7 @@ module DebugPrint = begin let vsprs = tycon.MembersOfFSharpTyconSorted |> List.filter (fun v -> v.IsDispatchSlot) - |> List.map (fun vref -> vspecAtBindL vref.Deref) + |> List.map (fun vref -> valAtBindL vref.Deref) let vals = tycon.TrueFieldsAsList |> List.map (fun f -> (if f.IsStatic then wordL(tagText "static") else emptyL) ^^ wordL(tagText "val") ^^ layoutRecdField f) let alldecls = inherits @ vsprs @ vals let emptyMeasure = match tycon.TypeOrMeasureKind with TyparKind.Measure -> isNil alldecls | _ -> false @@ -3549,7 +3590,7 @@ module DebugPrint = begin //-------------------------------------------------------------------------- and bindingL (TBind(v, repr, _)) = - vspecAtBindL v --- (wordL(tagText "=") ^^ exprL repr) + valAtBindL v --- (wordL(tagText "=") ^^ exprL repr) and exprL expr = exprWrapL false expr and atomL expr = exprWrapL true expr // true means bracket if needed to be atomic expr @@ -3587,11 +3628,11 @@ module DebugPrint = begin | ThenDoSeq -> "; (*ThenDo*)" ((exprL x0 ^^ rightL (tagText flag)) @@ exprL x1) |> wrap | Expr.Lambda(_, _, baseValOpt, argvs, body, _, _) -> - let formalsL = spaceListL (List.map vspecAtBindL argvs) in + let formalsL = spaceListL (List.map valAtBindL argvs) in let bindingL = match baseValOpt with | None -> wordL(tagText "lam") ^^ formalsL ^^ rightL(tagText ".") - | Some basev -> wordL(tagText "lam") ^^ (leftL(tagText "base=") ^^ vspecAtBindL basev) --- formalsL ^^ rightL(tagText ".") in + | Some basev -> wordL(tagText "lam") ^^ (leftL(tagText "base=") ^^ valAtBindL basev) --- formalsL ^^ rightL(tagText ".") in (bindingL ++ exprL body) |> wrap | Expr.TyLambda(_, argtyvs, body, _, _) -> ((wordL(tagText "LAM") ^^ spaceListL (List.map typarL argtyvs) ^^ rightL(tagText ".")) ++ exprL body) |> wrap @@ -3686,7 +3727,7 @@ module DebugPrint = begin | Expr.Obj (_lambdaId, ty, basev, ccall, overrides, iimpls, _) -> wordL(tagText "OBJ:") ^^ aboveListL [typeL ty; exprL ccall; - optionL vspecAtBindL basev; + optionL valAtBindL basev; aboveListL (List.map overrideL overrides); aboveListL (List.map iimplL iimpls)] @@ -3708,8 +3749,8 @@ module DebugPrint = begin let z = z --- sepL(tagText "`") --- (spaceListL (List.map atomL args)) z - and implFileL (TImplFile(_, _, e, _, _)) = - aboveListL [(wordL(tagText "top implementation ")) @@-- mexprL e] + and implFileL (TImplFile(_, _, mexpr, _, _, _)) = + aboveListL [(wordL(tagText "top implementation ")) @@-- mexprL mexpr] and mexprL x = match x with @@ -3771,7 +3812,7 @@ module DebugPrint = begin and tmethodL (TObjExprMethod(TSlotSig(nm, _, _, _, _, _), _, tps, vs, e, _)) = (wordL(tagText "TObjExprMethod") --- (wordL (tagText nm)) ^^ wordL(tagText "=")) -- (wordL(tagText "METH-LAM") --- angleBracketListL (List.map typarL tps) ^^ rightL(tagText ".")) --- - (wordL(tagText "meth-lam") --- tupleL (List.map (List.map vspecAtBindL >> tupleL) vs) ^^ rightL(tagText ".")) --- + (wordL(tagText "meth-lam") --- tupleL (List.map (List.map valAtBindL >> tupleL) vs) ^^ rightL(tagText ".")) --- (atomL e) and overrideL tmeth = wordL(tagText "with") ^^ tmethodL tmeth and iimplL (ty, tmeths) = wordL(tagText "impl") ^^ aboveListL (typeL ty :: List.map tmethodL tmeths) @@ -3800,7 +3841,7 @@ let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = TMDefRec (false, [], [ModuleOrNamespaceBinding.Module(mspec, mexpr)], id.idRange) // cleanup: make this a property -let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _)) = mexpr.Type +let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _, _)) = mexpr.Type //-------------------------------------------------------------------------- @@ -3809,33 +3850,33 @@ let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _)) = mexpr.Type //-------------------------------------------------------------------------- type SignatureRepackageInfo = - { mrpiVals : (ValRef * ValRef) list; - mrpiEntities: (TyconRef * TyconRef) list } + { RepackagedVals : (ValRef * ValRef) list; + RepackagedEntities: (TyconRef * TyconRef) list } - member remapInfo.ImplToSigMapping = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.mrpiEntities } - static member Empty = { mrpiVals = []; mrpiEntities= [] } + member remapInfo.ImplToSigMapping = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } + static member Empty = { RepackagedVals = []; RepackagedEntities= [] } type SignatureHidingInfo = - { mhiTycons : Zset; - mhiTyconReprs : Zset; - mhiVals : Zset; - mhiRecdFields : Zset; - mhiUnionCases : Zset } + { HiddenTycons : Zset; + HiddenTyconReprs : Zset; + HiddenVals : Zset; + HiddenRecdFields : Zset; + HiddenUnionCases : Zset } static member Empty = - { mhiTycons = Zset.empty tyconOrder; - mhiTyconReprs = Zset.empty tyconOrder; - mhiVals = Zset.empty valOrder; - mhiRecdFields = Zset.empty recdFieldRefOrder; - mhiUnionCases = Zset.empty unionCaseRefOrder } + { HiddenTycons = Zset.empty tyconOrder; + HiddenTyconReprs = Zset.empty tyconOrder; + HiddenVals = Zset.empty valOrder; + HiddenRecdFields = Zset.empty recdFieldRefOrder; + HiddenUnionCases = Zset.empty unionCaseRefOrder } let addValRemap v v' tmenv = { tmenv with valRemap= tmenv.valRemap.Add v (mkLocalValRef v') } let mkRepackageRemapping mrpi = - { valRemap = ValMap.OfList (mrpi.mrpiVals |> List.map (fun (vref, x) -> vref.Deref, x)); + { valRemap = ValMap.OfList (mrpi.RepackagedVals |> List.map (fun (vref, x) -> vref.Deref, x)); tpinst = emptyTyparInst; - tyconRefRemap = TyconRefMap.OfList mrpi.mrpiEntities + tyconRefRemap = TyconRefMap.OfList mrpi.RepackagedEntities removeTraitSolutions = false } //-------------------------------------------------------------------------- @@ -3847,18 +3888,18 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = match sigtyconOpt with | None -> // The type constructor is not present in the signature. Hence it is hidden. - let mhi = { mhi with mhiTycons = Zset.add entity mhi.mhiTycons } + let mhi = { mhi with HiddenTycons = Zset.add entity mhi.HiddenTycons } (mrpi, mhi) | Some sigtycon -> // The type constructor is in the signature. Hence record the repackage entry let sigtcref = mkLocalTyconRef sigtycon let tcref = mkLocalTyconRef entity - let mrpi = { mrpi with mrpiEntities = ((tcref, sigtcref) :: mrpi.mrpiEntities) } + let mrpi = { mrpi with RepackagedEntities = ((tcref, sigtcref) :: mrpi.RepackagedEntities) } // OK, now look for hidden things let mhi = if (match entity.TypeReprInfo with TNoRepr -> false | _ -> true) && (match sigtycon.TypeReprInfo with TNoRepr -> true | _ -> false) then // The type representation is absent in the signature, hence it is hidden - { mhi with mhiTyconReprs = Zset.add entity mhi.mhiTyconReprs } + { mhi with HiddenTyconReprs = Zset.add entity mhi.HiddenTyconReprs } else // The type representation is present in the signature. // Find the fields that have been hidden or which were non-public anyway. @@ -3871,7 +3912,7 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = | _ -> // The field is not in the signature. Hence it is regarded as hidden. let rfref = tcref.MakeNestedRecdFieldRef rfield - { mhi with mhiRecdFields = Zset.add rfref mhi.mhiRecdFields }) + { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields }) entity.AllFieldsArray |> List.foldBack (fun (ucase:UnionCase) mhi -> match sigtycon.GetUnionCaseByName ucase.DisplayName with @@ -3881,7 +3922,7 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = | _ -> // The constructor is not in the signature. Hence it is regarded as hidden. let ucref = tcref.MakeNestedUnionCaseRef ucase - { mhi with mhiUnionCases = Zset.add ucref mhi.mhiUnionCases }) + { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases }) (entity.UnionCasesAsList) (mrpi, mhi) @@ -3890,13 +3931,13 @@ let accSubEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) match sigtyconOpt with | None -> // The type constructor is not present in the signature. Hence it is hidden. - let mhi = { mhi with mhiTycons = Zset.add entity mhi.mhiTycons } + let mhi = { mhi with HiddenTycons = Zset.add entity mhi.HiddenTycons } (mrpi, mhi) | Some sigtycon -> // The type constructor is in the signature. Hence record the repackage entry let sigtcref = mkLocalTyconRef sigtycon let tcref = mkLocalTyconRef entity - let mrpi = { mrpi with mrpiEntities = ((tcref, sigtcref) :: mrpi.mrpiEntities) } + let mrpi = { mrpi with RepackagedEntities = ((tcref, sigtcref) :: mrpi.RepackagedEntities) } (mrpi, mhi) let valLinkageAEquiv g aenv (v1:Val) (v2:Val) = @@ -3914,11 +3955,11 @@ let accValRemap g aenv (msigty:ModuleOrNamespaceType) (implVal:Val) (mrpi, mhi) match sigValOpt with | None -> if verbose then dprintf "accValRemap, hide = %s#%d\n" implVal.LogicalName implVal.Stamp - let mhi = { mhi with mhiVals = Zset.add implVal mhi.mhiVals } + let mhi = { mhi with HiddenVals = Zset.add implVal mhi.HiddenVals } (mrpi, mhi) | Some (sigVal:Val) -> // The value is in the signature. Add the repackage entry. - let mrpi = { mrpi with mrpiVals = (vref, mkLocalValRef sigVal) :: mrpi.mrpiVals } + let mrpi = { mrpi with RepackagedVals = (vref, mkLocalValRef sigVal) :: mrpi.RepackagedVals } (mrpi, mhi) let getCorrespondingSigTy nm (msigty:ModuleOrNamespaceType) = @@ -4012,9 +4053,9 @@ let ComputeRemappingFromImplementationToSignature g mdef msigty = let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = if not (canAccessFromEverywhere tycon.Accessibility) then // The type constructor is not public, hence hidden at the assembly boundary. - { mhi with mhiTycons = Zset.add tycon mhi.mhiTycons } + { mhi with HiddenTycons = Zset.add tycon mhi.HiddenTycons } elif not (canAccessFromEverywhere tycon.TypeReprAccessibility) then - { mhi with mhiTyconReprs = Zset.add tycon mhi.mhiTyconReprs } + { mhi with HiddenTyconReprs = Zset.add tycon mhi.HiddenTyconReprs } else mhi |> Array.foldBack @@ -4022,7 +4063,7 @@ let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = if not (canAccessFromEverywhere rfield.Accessibility) then let tcref = mkLocalTyconRef tycon let rfref = tcref.MakeNestedRecdFieldRef rfield - { mhi with mhiRecdFields = Zset.add rfref mhi.mhiRecdFields } + { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields } else mhi) tycon.AllFieldsArray |> List.foldBack @@ -4030,7 +4071,7 @@ let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = if not (canAccessFromEverywhere ucase.Accessibility) then let tcref = mkLocalTyconRef tycon let ucref = tcref.MakeNestedUnionCaseRef ucase - { mhi with mhiUnionCases = Zset.add ucref mhi.mhiUnionCases } + { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases } else mhi) (tycon.UnionCasesAsList) @@ -4045,7 +4086,7 @@ let accValHidingInfoAtAssemblyBoundary (vspec:Val) mhi = // anything that's not a module or member binding gets assembly visibility not vspec.IsMemberOrModuleBinding then // The value is not public, hence hidden at the assembly boundary. - { mhi with mhiVals = Zset.add vspec mhi.mhiVals } + { mhi with HiddenVals = Zset.add vspec mhi.HiddenVals } else mhi @@ -4080,10 +4121,10 @@ let IsHidden setF accessF remapF debugF = if verbose then dprintf "IsHidden, #mrmi = %d, %s = %b\n" mrmi.Length (showL (debugF x)) res; res -let IsHiddenTycon mrmi x = IsHidden (fun mhi -> mhi.mhiTycons) (fun tc -> tc.Accessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x -let IsHiddenTyconRepr mrmi x = IsHidden (fun mhi -> mhi.mhiTyconReprs) (fun v -> v.TypeReprAccessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x -let IsHiddenVal mrmi x = IsHidden (fun mhi -> mhi.mhiVals) (fun v -> v.Accessibility) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) DebugPrint.valL mrmi x -let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.mhiRecdFields) (fun rfref -> rfref.RecdField.Accessibility) (fun rpi x -> remapRecdFieldRef rpi.tyconRefRemap x) DebugPrint.recdFieldRefL mrmi x +let IsHiddenTycon mrmi x = IsHidden (fun mhi -> mhi.HiddenTycons) (fun tc -> tc.Accessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x +let IsHiddenTyconRepr mrmi x = IsHidden (fun mhi -> mhi.HiddenTyconReprs) (fun v -> v.TypeReprAccessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x +let IsHiddenVal mrmi x = IsHidden (fun mhi -> mhi.HiddenVals) (fun v -> v.Accessibility) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) DebugPrint.valL mrmi x +let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.HiddenRecdFields) (fun rfref -> rfref.RecdField.Accessibility) (fun rpi x -> remapRecdFieldRef rpi.tyconRefRemap x) DebugPrint.recdFieldRefL mrmi x //-------------------------------------------------------------------------- @@ -4404,7 +4445,9 @@ and accFreeInOp opts op acc = | TOp.Goto _ | TOp.Label _ | TOp.Return | TOp.TupleFieldGet _ -> acc - | TOp.Tuple tupInfo -> accFreeTyvars opts accFreeInTupInfo tupInfo acc + | TOp.Tuple tupInfo -> accFreeTyvars opts accFreeInTupInfo tupInfo acc + | TOp.AnonRecd anonInfo + | TOp.AnonRecdGet (anonInfo, _) -> accFreeTyvars opts accFreeInTupInfo anonInfo.TupInfo acc | TOp.UnionCaseTagGet tr -> accUsedRecdOrUnionTyconRepr opts tr.Deref acc @@ -4659,8 +4702,8 @@ let decideStaticOptimizationConstraint g c = | TTyconIsStruct a -> let a = normalizeEnumTy g (stripTyEqnsAndMeasureEqns g a) match tryDestAppTy g a with - | Some tcref1 -> if tcref1.IsStructOrEnumTycon then StaticOptimizationAnswer.Yes else StaticOptimizationAnswer.No - | None -> StaticOptimizationAnswer.Unknown + | ValueSome tcref1 -> if tcref1.IsStructOrEnumTycon then StaticOptimizationAnswer.Yes else StaticOptimizationAnswer.No + | ValueNone -> StaticOptimizationAnswer.Unknown let rec DecideStaticOptimizations g cs = match cs with @@ -5369,8 +5412,8 @@ let ComputeFieldName tycon f = // Helpers for building code contained in the initial environment //------------------------------------------------------------------------- -let isQuotedExprTy g ty = match ty with AppTy g (tcref, _) -> tyconRefEq g tcref g.expr_tcr | _ -> false -let destQuotedExprTy g ty = match ty with AppTy g (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" +let isQuotedExprTy g ty = match tryAppTy g ty with ValueSome (tcref, _) -> tyconRefEq g tcref g.expr_tcr | _ -> false +let destQuotedExprTy g ty = match tryAppTy g ty with ValueSome (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" let mkQuotedExprTy (g:TcGlobals) ty = TType_app(g.expr_tcr, [ty]) let mkRawQuotedExprTy (g:TcGlobals) = TType_app(g.raw_expr_tcr, []) @@ -5381,6 +5424,9 @@ let mkAnyTupledTy (g:TcGlobals) tupInfo tys = | [h] -> h | _ -> TType_tuple(tupInfo, tys) +let mkAnyAnonRecdTy (_g:TcGlobals) anonInfo tys = + TType_anon(anonInfo, tys) + let mkRefTupledTy g tys = mkAnyTupledTy g tupInfoRef tys let mkRefTupledVarsTy g vs = mkRefTupledTy g (typesOfVals vs) @@ -5419,8 +5465,10 @@ let rec tyOfExpr g e = | TOp.ExnConstr _ -> g.exn_ty | TOp.Bytes _ -> mkByteArrayTy g | TOp.UInt16s _ -> mkArrayType g g.uint16_ty + | TOp.AnonRecdGet(_, i) -> List.item i tinst | TOp.TupleFieldGet(_, i) -> List.item i tinst | TOp.Tuple tupInfo -> mkAnyTupledTy g tupInfo tinst + | TOp.AnonRecd anonInfo -> mkAnyAnonRecdTy g anonInfo tinst | (TOp.For _ | TOp.While _) -> g.unit_ty | TOp.Array -> (match tinst with [ty] -> mkArrayType g ty | _ -> failwith "bad TOp.Array node") | (TOp.TryCatch _ | TOp.TryFinally _) -> (match tinst with [ty] -> ty | _ -> failwith "bad TOp_try node") @@ -5680,8 +5728,8 @@ let isRecdOrStructTyconRefReadOnly (g: TcGlobals) m (tcref: TyconRef) = let isRecdOrStructTyReadOnly (g: TcGlobals) m ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> isRecdOrStructTyconRefReadOnly g m tcref + | ValueNone -> false + | ValueSome tcref -> isRecdOrStructTyconRefReadOnly g m tcref let CanTakeAddressOf g m ty mut = @@ -5863,16 +5911,23 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress let ty = tyOfExpr g expr if isStructTy g ty then match mut with - | NeverMutates -> () - | AddressOfOp -> - // we get an inref - errorR(Error(FSComp.SR.tastCantTakeAddressOfExpression(), m)) + | NeverMutates + | AddressOfOp -> () | DefinitelyMutates -> // Give a nice error message for mutating something we can't take the address of errorR(Error(FSComp.SR.tastInvalidMutationOfConstant(), m)) | PossiblyMutates -> // Warn on defensive copy of something we can't take the address of warning(DefensiveCopyWarning(FSComp.SR.tastValueHasBeenCopied(), m)) + + match mut with + | NeverMutates + | DefinitelyMutates + | PossiblyMutates -> () + | AddressOfOp -> + // we get an inref + errorR(Error(FSComp.SR.tastCantTakeAddressOfExpression(), m)) + // Take a defensive copy let tmp, _ = match mut with @@ -5894,6 +5949,10 @@ let mkTupleFieldGet g (tupInfo, e, tinst, i, m) = let wrap, e', _readonly, _writeonly = mkExprAddrOfExpr g (evalTupInfoIsStruct tupInfo) false NeverMutates e None m wrap (mkTupleFieldGetViaExprAddr(tupInfo, e', tinst, i, m)) +let mkAnonRecdFieldGet g (anonInfo:AnonRecdTypeInfo, e, tinst, i, m) = + let wrap, e', _readonly, _writeonly = mkExprAddrOfExpr g (evalAnonInfoIsStruct anonInfo) false NeverMutates e None m + wrap (mkAnonRecdFieldGetViaExprAddr(anonInfo, e', tinst, i, m)) + let mkRecdFieldGet g (e, fref:RecdFieldRef, tinst, m) = assert (not (isByrefTy g (tyOfExpr g e))) let wrap, e', _readonly, _writeonly = mkExprAddrOfExpr g fref.Tycon.IsStructOrEnumTycon false NeverMutates e None m @@ -6167,7 +6226,7 @@ let mkMinusOne g m = mkInt g m (-1) let destInt32 = function Expr.Const(Const.Int32 n, _, _) -> Some n | _ -> None -let isIDelegateEventType g ty = isAppTy g ty && tyconRefEq g g.fslib_IDelegateEvent_tcr (tcrefOfAppTy g ty) +let isIDelegateEventType g ty = match tryDestAppTy g ty with ValueSome tcref -> tyconRefEq g g.fslib_IDelegateEvent_tcr tcref | _ -> false let destIDelegateEventType g ty = if isIDelegateEventType g ty then match argsOfAppTy g ty with @@ -6205,6 +6264,9 @@ let mkRefTupled g m es tys = mkAnyTupled g m tupInfoRef es tys let mkRefTupledNoTypes g m args = mkRefTupled g m args (List.map (tyOfExpr g) args) let mkRefTupledVars g m vs = mkRefTupled g m (List.map (exprForVal m) vs) (typesOfVals vs) +let mkAnonRecd (_g:TcGlobals) m anonInfo es tys = Expr.Op (TOp.AnonRecd (anonInfo),tys,es,m) + + //-------------------------------------------------------------------------- // Permute expressions //-------------------------------------------------------------------------- @@ -6260,11 +6322,6 @@ let permuteExprList (sigma:int[]) (exprs: Expr list) (ty: TType list) (names:str let reorderedExprs = permute sigma (Array.ofList newExprs) binds, Array.toList reorderedExprs -//------------------------------------------------------------------------- -// Build record expressions... -//------------------------------------------------------------------------- - - /// Evaluate the expressions in the original order, but build a record with the results in field order /// Note some fields may be static. If this were not the case we could just use /// let sigma = Array.map #Index () @@ -6316,6 +6373,18 @@ let mkIsInst ty e m = mkAsmExpr ([ isinst ], [ty], [e], [ ty ], m) let mspec_Type_GetTypeFromHandle (g: TcGlobals) = IL.mkILNonGenericStaticMethSpecInTy(g.ilg.typ_Type, "GetTypeFromHandle", [g.iltyp_RuntimeTypeHandle], g.ilg.typ_Type) let mspec_String_Length (g: TcGlobals) = mkILNonGenericInstanceMethSpecInTy (g.ilg.typ_String, "get_Length", [], g.ilg.typ_Int32) +let mspec_String_Concat2 (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ g.ilg.typ_String; g.ilg.typ_String ], g.ilg.typ_String) + +let mspec_String_Concat3 (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ g.ilg.typ_String; g.ilg.typ_String; g.ilg.typ_String ], g.ilg.typ_String) + +let mspec_String_Concat4 (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ g.ilg.typ_String; g.ilg.typ_String; g.ilg.typ_String; g.ilg.typ_String ], g.ilg.typ_String) + +let mspec_String_Concat_Array (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ mkILArr1DTy g.ilg.typ_String ], g.ilg.typ_String) + let fspec_Missing_Value (g: TcGlobals) = IL.mkILFieldSpecInTy(g.iltyp_Missing, "Value", g.iltyp_Missing) let mkInitializeArrayMethSpec (g: TcGlobals) = @@ -6537,6 +6606,21 @@ let mkGetStringLength g m e = /// ILCall(useCallvirt, isProtected, valu, newobj, valUseFlags, isProp, noTailCall, mref, actualTypeInst, actualMethInst, retTy) Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, true, false, mspec.MethodRef, [], [], [g.int32_ty]), [], [e], m) +let mkStaticCall_String_Concat2 g m arg1 arg2 = + let mspec = mspec_String_Concat2 g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg1; arg2], m) + +let mkStaticCall_String_Concat3 g m arg1 arg2 arg3 = + let mspec = mspec_String_Concat3 g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg1; arg2; arg3], m) + +let mkStaticCall_String_Concat4 g m arg1 arg2 arg3 arg4 = + let mspec = mspec_String_Concat4 g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg1; arg2; arg3; arg4], m) + +let mkStaticCall_String_Concat_Array g m arg = + let mspec = mspec_String_Concat_Array g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg], m) // Quotations can't contain any IL. // As a result, we aim to get rid of all IL generation in the typechecker and pattern match @@ -7295,6 +7379,7 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = match stripped with | TType_forall _ -> "Microsoft.FSharp.Core.FSharpTypeFunc" + | _ when isArrayTy g ty -> let tcref, tinst = destAppTy g ty let arraySuffix = @@ -7310,6 +7395,7 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = | 4 -> "[0:, 0:, 0:, 0:]" | _ -> failwith "impossible: rankOfArrayTyconRef: unsupported array rank" typeEnc g (gtpsType, gtpsMethod) (List.head tinst) + arraySuffix + | TType_ucase (UCRef(tcref, _), tinst) | TType_app (tcref, tinst) -> if tyconRefEq g g.byref_tcr tcref then @@ -7327,15 +7413,22 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = textOfPath (List.map DemangleGenericTypeName path) | _ -> assert(false); failwith "impossible" tyName + tyargsEnc g (gtpsType, gtpsMethod) tinst + + | TType_anon (anonInfo, tinst) -> + sprintf "%s%s" anonInfo.ILTypeRef.FullName (tyargsEnc g (gtpsType, gtpsMethod) tinst) + | TType_tuple (tupInfo, tys) -> if evalTupInfoIsStruct tupInfo then sprintf "System.ValueTuple%s"(tyargsEnc g (gtpsType, gtpsMethod) tys) else sprintf "System.Tuple%s"(tyargsEnc g (gtpsType, gtpsMethod) tys) + | TType_fun (f, x) -> "Microsoft.FSharp.Core.FSharpFunc" + tyargsEnc g (gtpsType, gtpsMethod) [f;x] + | TType_var typar -> typarEnc g (gtpsType, gtpsMethod) typar + | TType_measure _ -> "?" and tyargsEnc g (gtpsType, gtpsMethod) args = @@ -7460,16 +7553,16 @@ let TypeNullNever g ty = 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 (isAppTy g ty && TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute (tcrefOfAppTy g ty) = Some(false)) + not (match tryDestAppTy g ty with ValueSome tcref -> TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref = Some false | _ -> false) elif TypeNullNever g ty then false else // Putting AllowNullLiteralAttribute(true) on an F# type means 'null' can be used with that type - isAppTy g ty && TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute (tcrefOfAppTy g ty) = Some(true) + match tryDestAppTy g ty with ValueSome tcref -> TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref = Some true | _ -> false let TypeNullIsTrueValue g ty = (match tryDestAppTy g ty with - | Some tcref -> IsUnionTypeWithNullAsTrueValue g tcref.Deref + | ValueSome tcref -> IsUnionTypeWithNullAsTrueValue g tcref.Deref | _ -> false) || (isUnitTy g ty) let TypeNullNotLiked g m ty = @@ -7496,6 +7589,10 @@ let rec TypeHasDefaultValue g m ty = flds |> List.forall (actualTyOfRecdField (mkTyconRefInst tcref tinst) >> TypeHasDefaultValue g m) elif isStructTupleTy g ty then destStructTupleTy g ty |> List.forall (TypeHasDefaultValue g m) + elif isStructAnonRecdTy g ty then + match tryDestAnonRecdTy g ty with + | ValueNone -> true + | ValueSome (_, ptys) -> ptys |> List.forall (TypeHasDefaultValue g m) else // All struct types defined in other .NET languages have a DefaultValue regardless of their // instantiation @@ -7508,9 +7605,13 @@ let (|SpecialComparableHeadType|_|) g ty = if isAnyTupleTy g ty then let _tupInfo, elemTys = destAnyTupleTy g ty Some elemTys + elif isAnonRecdTy g ty then + match tryDestAnonRecdTy g ty with + | ValueNone -> Some [] + | ValueSome (_anonInfo, elemTys) -> Some elemTys else - match ty with - | AppTy g (tcref, tinst) -> + 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 @@ -7619,17 +7720,16 @@ let isSealedTy g ty = | ProvidedTypeMetadata st -> st.IsSealed #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> td.IsSealed - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> if (isFSharpInterfaceTy g ty || isFSharpClassTy g ty) then - let tcref, _ = destAppTy g ty - (TryFindFSharpBoolAttribute g g.attrib_SealedAttribute tcref.Attribs = Some(true)) + let tcref = tcrefOfAppTy g ty + TryFindFSharpBoolAttribute g g.attrib_SealedAttribute tcref.Attribs = Some true else // All other F# types, array, byref, tuple types are sealed true let isComInteropTy g ty = - let tcr, _ = destAppTy g ty + let tcr = tcrefOfAppTy g ty match g.attrib_ComImportAttribute with | None -> false | Some attr -> TryFindFSharpBoolAttribute g attr tcr.Attribs = Some(true) @@ -7935,9 +8035,9 @@ let MakeExportRemapping viewedCcu (mspec:ModuleOrNamespace) = let accEntityRemap (entity:Entity) acc = match tryRescopeEntity viewedCcu entity with - | Some eref -> + | ValueSome eref -> addTyconRefRemap (mkLocalTyconRef entity) eref acc - | None -> + | _ -> if entity.IsNamespace then acc else @@ -7946,9 +8046,9 @@ let MakeExportRemapping viewedCcu (mspec:ModuleOrNamespace) = let accValRemap (vspec:Val) acc = // The acc contains the entity remappings match tryRescopeVal viewedCcu acc vspec with - | Some vref -> + | ValueSome vref -> {acc with valRemap=acc.valRemap.Add vspec vref } - | None -> + | _ -> error(InternalError("Unexpected value without a pubpath when remapping assembly data", vspec.Range)) let mty = mspec.ModuleOrNamespaceType @@ -8275,12 +8375,12 @@ let rec mkCompiledTuple g isStruct (argtys, args, m) = ty8, arg8 | _ -> let ty8enc = TType_app((if isStruct then g.struct_tuple1_tcr else g.ref_tuple1_tcr), [ty8]) - let v8enc = Expr.Op (TOp.Tuple (TupInfo.Const isStruct), [ty8], [arg8], m) + let v8enc = Expr.Op (TOp.Tuple (mkTupInfo isStruct), [ty8], [arg8], m) ty8enc, v8enc | _ -> let a, b, c, d = mkCompiledTuple g isStruct (argtysB, argsB, m) let ty8plus = TType_app(a, b) - let v8plus = Expr.Op (TOp.Tuple(TupInfo.Const isStruct), b, c, d) + let v8plus = Expr.Op (TOp.Tuple(mkTupInfo isStruct), b, c, d) ty8plus, v8plus let argtysAB = argtysA @ [ty8] (mkCompiledTupleTyconRef g isStruct (List.length argtysAB), argtysAB, argsA @ [v8], m) diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index d2a532c37a..badacfda0e 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -3,7 +3,6 @@ /// Defines derived expression manipulation and construction functions. module internal Microsoft.FSharp.Compiler.Tastops -open System.Text open System.Collections.Generic open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL @@ -13,15 +12,9 @@ open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Rational open Microsoft.FSharp.Compiler.Ast -open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Layout -open Microsoft.FSharp.Compiler.Lib - -#if !NO_EXTENSIONTYPING -open Microsoft.FSharp.Compiler.ExtensionTyping -#endif //------------------------------------------------------------------------- // Type equivalence @@ -41,10 +34,6 @@ val measureEquiv : TcGlobals -> Measure -> Measure -> bool /// Reduce a type to its more anonical form subject to an erasure flag, inference equations and abbreviations val stripTyEqnsWrtErasure: Erasure -> TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Build common types -//------------------------------------------------------------------------- - /// Build a function type val mkFunTy : TType -> TType -> TType @@ -76,137 +65,232 @@ val stripExpr : Expr -> Expr /// Get the values for a set of bindings val valsOfBinds : Bindings -> Vals -val (|ExprValWithPossibleTypeInst|_|) : Expr -> (ValRef * ValUseFlag * TType list * range) option -//------------------------------------------------------------------------- -// Build decision trees imperatively -//------------------------------------------------------------------------- +/// 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 +/// Build decision trees imperatively type MatchBuilder = + + /// Create a new builder new : SequencePointInfoForBinding * range -> MatchBuilder + + /// Add a new destination target member AddTarget : DecisionTreeTarget -> int + + /// Add a new destination target that is an expression result member AddResultTarget : Expr * SequencePointInfoForTarget -> DecisionTree + + /// Finish the targets member CloseTargets : unit -> DecisionTreeTarget list - member Close : DecisionTree * range * TType -> Expr -//------------------------------------------------------------------------- -// Make some special decision graphs -//------------------------------------------------------------------------- + /// Build the overall expression + member Close : DecisionTree * range * TType -> Expr +/// Add an if-then-else boolean conditional node into a decision tree val mkBoolSwitch : range -> Expr -> DecisionTree -> DecisionTree -> DecisionTree + +/// Build a conditional expression val primMkCond : SequencePointInfoForBinding -> SequencePointInfoForTarget -> SequencePointInfoForTarget -> range -> TType -> Expr -> Expr -> Expr -> Expr + +/// Build a conditional expression val mkCond : SequencePointInfoForBinding -> SequencePointInfoForTarget -> range -> TType -> Expr -> Expr -> Expr -> Expr + +/// Build a conditional expression that checks for non-nullness val mkNonNullCond : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -val mkIfThen : TcGlobals -> range -> Expr -> Expr -> Expr -//------------------------------------------------------------------------- -// Generate new locals -//------------------------------------------------------------------------- +/// Build an if-then statement +val mkIfThen : TcGlobals -> range -> Expr -> Expr -> Expr +/// Build an expression corresponding to the use of a value /// Note: try to use exprForValRef or the expression returned from mkLocal instead of this. val exprForVal : range -> Val -> Expr + +/// Build an expression corresponding to the use of a reference to a value val exprForValRef : range -> ValRef -> Expr -/// Return the local and an expression to reference it +/// Make a new local value and build an expression to reference it val mkLocal : range -> string -> TType -> Val * Expr + +/// Make a new compiler-generated local value and build an expression to reference it val mkCompGenLocal : range -> string -> TType -> Val * Expr + +/// Make a new mutable compiler-generated local value and build an expression to reference it val mkMutableCompGenLocal : range -> string -> TType -> Val * Expr -val mkCompGenLocalAndInvisbleBind : TcGlobals -> string -> range -> Expr -> Val * Expr * Binding -//------------------------------------------------------------------------- -// Make lambdas -//------------------------------------------------------------------------- +/// Make a new mutable compiler-generated local value, 'let' bind it to an expression +/// 'invisibly' (no sequence point etc.), and build an expression to reference it +val mkCompGenLocalAndInvisbleBind : TcGlobals -> string -> range -> Expr -> Val * Expr * Binding +/// Build a lambda expression taking multiple values val mkMultiLambda : range -> Val list -> Expr * TType -> Expr + +/// Rebuild a lambda during an expression tree traversal val rebuildLambda : range -> Val option -> Val option -> Val list -> Expr * TType -> Expr + +/// Build a lambda expression taking a single value val mkLambda : range -> Val -> Expr * TType -> Expr + +/// Build a generic lambda expression (type abstraction) val mkTypeLambda : range -> Typars -> Expr * TType -> Expr + +/// Build an object expression val mkObjExpr : TType * Val option * Expr * ObjExprMethod list * (TType * ObjExprMethod list) list * Range.range -> Expr + +/// Build an type-chose expression, indicating that a local free choice of a type variable val mkTypeChoose : range -> Typars -> Expr -> Expr + +/// Build an iterated (curried) lambda expression val mkLambdas : range -> Typars -> Val list -> Expr * TType -> Expr + +/// Build an iterated (tupled+curried) lambda expression val mkMultiLambdasCore : range -> Val list list -> Expr * TType -> Expr * TType + +/// Build an iterated generic (type abstraction + tupled+curried) lambda expression val mkMultiLambdas : range -> Typars -> Val list list -> Expr * TType -> Expr + +/// Build a lambda expression that corresponds to the implementation of a member val mkMemberLambdas : range -> Typars -> Val option -> Val option -> Val list list -> Expr * TType -> Expr +/// Build a 'while' loop expression val mkWhile : TcGlobals -> SequencePointInfoForWhileLoop * SpecialWhileLoopMarker * Expr * Expr * range -> Expr + +/// Build a 'for' loop expression val mkFor : TcGlobals -> SequencePointInfoForForLoop * Val * Expr * ForLoopStyle * Expr * Expr * range -> Expr + +/// Build a 'try/with' expression val mkTryWith : TcGlobals -> Expr * (* filter val *) Val * (* filter expr *) Expr * (* handler val *) Val * (* handler expr *) Expr * range * TType * SequencePointInfoForTry * SequencePointInfoForWith -> Expr -val mkTryFinally: TcGlobals -> Expr * Expr * range * TType * SequencePointInfoForTry * SequencePointInfoForFinally -> Expr -//------------------------------------------------------------------------- -// Make let/letrec -//------------------------------------------------------------------------- - +/// Build a 'try/finally' expression +val mkTryFinally: TcGlobals -> Expr * Expr * range * TType * SequencePointInfoForTry * SequencePointInfoForFinally -> Expr -// Generate a user-level let-bindings +/// Build a user-level value binding val mkBind : SequencePointInfoForBinding -> Val -> Expr -> Binding + +/// Build a user-level let-binding val mkLetBind : range -> Binding -> Expr -> Expr + +/// Build a user-level value sequence of let bindings val mkLetsBind : range -> Binding list -> Expr -> Expr + +/// Build a user-level value sequence of let bindings val mkLetsFromBindings : range -> Bindings -> Expr -> Expr + +/// Build a user-level let expression val mkLet : SequencePointInfoForBinding -> range -> Val -> Expr -> Expr -> Expr + +/// Make a binding that binds a function value to a lambda taking multiple arguments val mkMultiLambdaBind : Val -> SequencePointInfoForBinding -> range -> Typars -> Val list list -> Expr * TType -> Binding // Compiler generated bindings may involve a user variable. // Compiler generated bindings may give rise to a sequence point if they are part of // an SPAlways expression. Compiler generated bindings can arise from for example, inlining. val mkCompGenBind : Val -> Expr -> Binding + +/// Make a set of bindings that bind compiler generated values to corresponding expressions. +/// Compiler-generated bindings do not give rise to a sequence point in debugging. val mkCompGenBinds : Val list -> Exprs -> Bindings + +/// Make a let-expression that locally binds a compiler-generated value to an expression. +/// Compiler-generated bindings do not give rise to a sequence point in debugging. val mkCompGenLet : range -> Val -> Expr -> Expr -> Expr + +/// Make a 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 mkCompGenLetIn: range -> string -> TType -> Expr -> (Val * Expr -> Expr) -> Expr -// Invisible bindings are never given a sequence point and should never have side effects +/// 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 + +/// Make a binding that 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 mkInvisibleBind : Val -> Expr -> Binding + +/// Make a set of bindings that bind values to expressions in an "invisible" way. +/// Invisible bindings are not given a sequence point and should not have side effects. val mkInvisibleBinds : Vals -> Exprs -> Bindings + +/// Make a let-rec expression that locally binds values to expressions where self-reference back to the values is possible. val mkLetRecBinds : range -> Bindings -> Expr -> Expr -//------------------------------------------------------------------------- -// Generalization/inference helpers -//------------------------------------------------------------------------- - /// TypeScheme (generalizedTypars, tauTy) /// /// generalizedTypars -- the truly generalized type parameters /// tauTy -- the body of the generalized type. A 'tau' type is one with its type parameters stripped off. type TypeScheme = TypeScheme of Typars * TType +/// Make the right-hand side of a generalized binding, incorporating the generalized generic parameters from the type +/// scheme into the right-hand side as type generalizations. val mkGenericBindRhs : TcGlobals -> range -> Typars -> TypeScheme -> Expr -> Expr -val isBeingGeneralized : Typar -> TypeScheme -> bool -//------------------------------------------------------------------------- -// Make lazy and/or -//------------------------------------------------------------------------- +/// Test if the type parameter is one of those being generalized by a type scheme. +val isBeingGeneralized : Typar -> TypeScheme -> bool +/// Make the expression corresponding to 'expr1 && expr2' val mkLazyAnd : TcGlobals -> range -> Expr -> Expr -> Expr + +/// Make the expression corresponding to 'expr1 || expr2' val mkLazyOr : TcGlobals -> range -> Expr -> Expr -> Expr + +/// Make a byref type val mkByrefTy : TcGlobals -> TType -> TType + +/// Make a byref type with a in/out kind inference parameter val mkByrefTyWithInference : TcGlobals -> TType -> TType -> TType + +/// Make a in-byref type with a in kind parameter val mkInByrefTy : TcGlobals -> TType -> TType -val mkOutByrefTy : TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Make construction operations -//------------------------------------------------------------------------- +/// Make an out-byref type with an out kind parameter +val mkOutByrefTy : TcGlobals -> TType -> TType +/// Make an expression that constructs a union case, e.g. 'Some(expr)' val mkUnionCaseExpr : UnionCaseRef * TypeInst * Exprs * range -> Expr + +/// Make an expression that constructs an exception value val mkExnExpr : TyconRef * Exprs * range -> Expr + +/// Make an expression that is IL assembly code val mkAsmExpr : ILInstr list * TypeInst * Exprs * TTypes * range -> Expr + +/// Make an expression that coerces one expression to another type val mkCoerceExpr : Expr * TType * range * TType -> Expr -val mkReraise : range -> TType -> Expr -val mkReraiseLibCall : TcGlobals -> TType -> range -> Expr +/// Make an expression that re-raises an exception +val mkReraise : range -> TType -> Expr -//------------------------------------------------------------------------- -// Make projection operations -//------------------------------------------------------------------------- +/// Make an expression that re-raises an exception via a library call +val mkReraiseLibCall : TcGlobals -> TType -> range -> Expr +/// Make an expression that gets an item from a tuple val mkTupleFieldGet : TcGlobals -> TupInfo * Expr * TypeInst * int * range -> Expr + +/// Make an expression that gets an item from an anonymous record +val mkAnonRecdFieldGet : TcGlobals -> AnonRecdTypeInfo * Expr * TypeInst * int * range -> Expr + +/// Make an expression that gets an item from an anonymous record (via the address of the value if it is a struct) +val mkAnonRecdFieldGetViaExprAddr : AnonRecdTypeInfo * Expr * TypeInst * int * range -> Expr + +/// Make an expression that gets an instance field from a record or class (via the address of the value if it is a struct) val mkRecdFieldGetViaExprAddr : Expr * RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that gets the address of an instance field from a record or class (via the address of the value if it is a struct) val mkRecdFieldGetAddrViaExprAddr : readonly: bool * Expr * RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that gets a static field from a record or class val mkStaticRecdFieldGet : RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that sets a static field in a record or class val mkStaticRecdFieldSet : RecdFieldRef * TypeInst * Expr * range -> Expr + +/// Make an expression that gets the address of a static field in a record or class val mkStaticRecdFieldGetAddr : readonly: bool * RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that sets an instance the field of a record or class (via the address of the value if it is a struct) val mkRecdFieldSetViaExprAddr : Expr * RecdFieldRef * TypeInst * Expr * range -> Expr + +/// Make an expression that gets the tag of a union value (via the address of the value if it is a struct) val mkUnionCaseTagGetViaExprAddr : Expr * TyconRef * TypeInst * range -> Expr /// Make a 'TOp.UnionCaseProof' expression, which proves a union value is over a particular case (used only for ref-unions, not struct-unions) @@ -235,9 +319,13 @@ val mkUnionCaseFieldSet : Expr * UnionCaseRef * TypeInst * int * E /// Like mkUnionCaseFieldGetUnprovenViaExprAddr, but for struct-unions, the input should be a copy of the expression. val mkUnionCaseFieldGetUnproven : TcGlobals -> Expr * UnionCaseRef * TypeInst * int * range -> Expr +/// Make an expression that gets an instance field from an F# exception value val mkExnCaseFieldGet : Expr * TyconRef * int * range -> Expr + +/// Make an expression that sets an instance field in an F# exception value val mkExnCaseFieldSet : Expr * TyconRef * int * Expr * range -> Expr +/// Make an expression that gets the address of an element in an array val mkArrayElemAddress : TcGlobals -> readonly: bool * ILReadonly * bool * ILArrayShape * TType * Expr list * range -> Expr //------------------------------------------------------------------------- @@ -270,47 +358,59 @@ val mkGetTupleItemN : TcGlobals -> range -> int -> ILType -> bool -> Expr -> TTy /// but TupInfo may later be used carry variables that infer structness. val evalTupInfoIsStruct : TupInfo -> bool +/// Evaluate the AnonRecdTypeInfo to work out if it is a struct or a ref. +val evalAnonInfoIsStruct : AnonRecdTypeInfo -> bool + /// If it is a tuple type, ensure it's outermost type is a .NET tuple type, otherwise leave unchanged val convertToTypeWithMetadataIfPossible : TcGlobals -> TType -> TType - -//------------------------------------------------------------------------- -// Take the address of an expression, or force it into a mutable local. Any allocated -// mutable local may need to be kept alive over a larger expression, hence we return -// a wrapping function that wraps "let mutable loc = Expr in ..." around a larger -// expression. -//------------------------------------------------------------------------- - +/// An exception representing a warning for a defensive copy of an immutable struct exception DefensiveCopyWarning of string * range + type Mutates = AddressOfOp | DefinitelyMutates | PossiblyMutates | NeverMutates + +/// Helper to take the address of an expression val mkExprAddrOfExprAux : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Val * Expr) option * Expr * bool * bool -val mkExprAddrOfExpr : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Expr -> Expr) * Expr * bool * bool -//------------------------------------------------------------------------- -// Tables keyed on values and/or type parameters -//------------------------------------------------------------------------- +/// Take the address of an expression, or force it into a mutable local. Any allocated +/// mutable local may need to be kept alive over a larger expression, hence we return +/// a wrapping function that wraps "let mutable loc = Expr in ..." around a larger +/// expression. +val mkExprAddrOfExpr : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Expr -> Expr) * Expr * bool * bool /// Maps Val to T, based on stamps [] type ValMap<'T> = + member Contents : StampMap<'T> + member Item : Val -> 'T with get + member TryFind : Val -> 'T option + member ContainsVal : Val -> bool + member Add : Val -> 'T -> ValMap<'T> + member Remove : Val -> ValMap<'T> + member IsEmpty : bool + static member Empty : ValMap<'T> + static member OfList : (Val * 'T) list -> ValMap<'T> /// Mutable data structure mapping Val's to T based on stamp keys [] type ValHash<'T> = + member Values : seq<'T> + member TryFind : Val -> 'T option + member Add : Val * 'T -> unit - static member Create : unit -> ValHash<'T> + static member Create : unit -> ValHash<'T> /// Maps Val's to list of T based on stamp keys [] @@ -328,97 +428,126 @@ type ValMultiMap<'T> = static member Empty : ValMultiMap<'T> +/// Maps type parameters to entries based on stamp keys [] -/// Maps Typar to T based on stamp keys type TyparMap<'T> = + /// Get the entry for the given type parameter member Item : Typar -> 'T with get + /// Determine is the map contains an entry for the given type parameter member ContainsKey : Typar -> bool + /// Try to find the entry for the given type parameter member TryFind : Typar -> 'T option + /// Make a new map, containing a new entry for the given type parameter member Add : Typar * 'T -> TyparMap<'T> + /// The empty map static member Empty : TyparMap<'T> -[] /// Maps TyconRef to T based on stamp keys +[] type TyconRefMap<'T> = + /// Get the entry for the given type definition member Item : TyconRef -> 'T with get + /// Try to find the entry for the given type definition member TryFind : TyconRef -> 'T option + /// Determine is the map contains an entry for the given type definition member ContainsKey : TyconRef -> bool + /// Make a new map, containing a new entry for the given type definition member Add : TyconRef -> 'T -> TyconRefMap<'T> + /// Remove the entry for the given type definition, if any member Remove : TyconRef -> TyconRefMap<'T> + /// Determine if the map is empty member IsEmpty : bool + /// The empty map static member Empty : TyconRefMap<'T> + /// Make a new map, containing entries for the given type definitions static member OfList : (TyconRef * 'T) list -> TyconRefMap<'T> /// Maps TyconRef to list of T based on stamp keys [] type TyconRefMultiMap<'T> = + /// Fetch the entries for the given type definition member Find : TyconRef -> 'T list + /// Make a new map, containing a new entry for the given type definition member Add : TyconRef * 'T -> TyconRefMultiMap<'T> + /// The empty map static member Empty : TyconRefMultiMap<'T> + /// Make a new map, containing a entries for the given type definitions static member OfList : (TyconRef * 'T) list -> TyconRefMultiMap<'T> -//------------------------------------------------------------------------- -// Orderings on Tycon, Val, RecdFieldRef, Typar -//------------------------------------------------------------------------- +/// An ordering for value definitions, based on stamp +val valOrder: IComparer -val valOrder : IComparer -val tyconOrder : IComparer -val recdFieldRefOrder : IComparer -val typarOrder : IComparer +/// An ordering for type definitions, based on stamp +val tyconOrder: IComparer -//------------------------------------------------------------------------- -// Equality on Tycon and Val -//------------------------------------------------------------------------- +/// An ordering for record fields, based on stamp +val recdFieldRefOrder: IComparer +/// An ordering for type parameters, based on stamp +val typarOrder: IComparer + +/// Equality for type definition references val tyconRefEq : TcGlobals -> TyconRef -> TyconRef -> bool + +/// Equality for value references val valRefEq : TcGlobals -> ValRef -> ValRef -> bool //------------------------------------------------------------------------- // Operations on types: substitution //------------------------------------------------------------------------- +/// Represents an instantiation where types replace type parameters type TyparInst = (Typar * TType) list +/// Represents an instantiation where type definition references replace other type definition references type TyconRefRemap = TyconRefMap + +/// Represents an instantiation where value references replace other value references type ValRemap = ValMap +/// Represents a combination of substitutions/instantiations where things replace other things during remapping [] type Remap = - { tpinst : TyparInst; - valRemap: ValRemap; - tyconRefRemap : TyconRefRemap; + { tpinst : TyparInst + valRemap: ValRemap + tyconRefRemap : TyconRefRemap removeTraitSolutions: bool } static member Empty : Remap val addTyconRefRemap : TyconRef -> TyconRef -> Remap -> Remap -val addValRemap : Val -> Val -> Remap -> Remap +val addValRemap : Val -> Val -> Remap -> Remap val mkTyparInst : Typars -> TTypes -> TyparInst + val mkTyconRefInst : TyconRef -> TypeInst -> TyparInst + val emptyTyparInst : TyparInst val instType : TyparInst -> TType -> TType + val instTypes : TyparInst -> TypeInst -> TypeInst + val instTyparConstraints : TyparInst -> TyparConstraint list -> TyparConstraint list + val instTrait : TyparInst -> TraitConstraintInfo -> TraitConstraintInfo //------------------------------------------------------------------------- @@ -426,8 +555,11 @@ val instTrait : TyparInst -> TraitConstraintInfo -> TraitConstraint //------------------------------------------------------------------------- val generalizeTypars : Typars -> TypeInst + val generalizeTyconRef : TyconRef -> TTypes * TType + val generalizedTyconRef : TyconRef -> TType + val mkTyparToTyparRenaming : Typars -> Typars -> TyparInst * TTypes //------------------------------------------------------------------------- @@ -435,12 +567,16 @@ val mkTyparToTyparRenaming : Typars -> Typars -> TyparInst * TTypes //------------------------------------------------------------------------- val reduceTyconRefAbbrev : TyconRef -> TypeInst -> TType + val reduceTyconRefMeasureableOrProvided : TcGlobals -> TyconRef -> TypeInst -> TType + val reduceTyconRefAbbrevMeasureable : TyconRef -> Measure /// set bool to 'true' to allow shortcutting of type parameter equation chains during stripping val stripTyEqnsA : TcGlobals -> bool -> TType -> TType + val stripTyEqns : TcGlobals -> TType -> TType + val stripTyEqnsAndMeasureEqns : TcGlobals -> TType -> TType val tryNormalizeMeasureInType : TcGlobals -> TType -> TType @@ -451,7 +587,9 @@ val tryNormalizeMeasureInType : TcGlobals -> TType -> TType /// See through F# exception abbreviations val stripExnEqns : TyconRef -> Tycon + val recdFieldsOfExnDefRef : TyconRef -> RecdField list + val recdFieldTysOfExnDefRef : TyconRef -> TType list //------------------------------------------------------------------------- @@ -460,57 +598,102 @@ val recdFieldTysOfExnDefRef : TyconRef -> TType list //------------------------------------------------------------------------- val destForallTy : TcGlobals -> TType -> Typars * TType + val destFunTy : TcGlobals -> TType -> TType * TType + val destAnyTupleTy : TcGlobals -> TType -> TupInfo * TTypes + val destRefTupleTy : TcGlobals -> TType -> TTypes + val destStructTupleTy : TcGlobals -> TType -> TTypes + val destTyparTy : TcGlobals -> TType -> Typar + val destAnyParTy : TcGlobals -> TType -> Typar + val destMeasureTy : TcGlobals -> TType -> Measure + val tryDestForallTy : TcGlobals -> TType -> Typars * TType val isFunTy : TcGlobals -> TType -> bool + val isForallTy : TcGlobals -> TType -> bool + val isAnyTupleTy : TcGlobals -> TType -> bool + val isRefTupleTy : TcGlobals -> TType -> bool + val isStructTupleTy : TcGlobals -> TType -> bool + +val isStructAnonRecdTy : TcGlobals -> TType -> bool + +val isAnonRecdTy : TcGlobals -> TType -> bool + val isUnionTy : TcGlobals -> TType -> bool + val isReprHiddenTy : TcGlobals -> TType -> bool + val isFSharpObjModelTy : TcGlobals -> TType -> bool + val isRecdTy : TcGlobals -> TType -> bool + val isFSharpStructOrEnumTy : TcGlobals -> TType -> bool + val isFSharpEnumTy : TcGlobals -> TType -> bool + val isTyparTy : TcGlobals -> TType -> bool + val isAnyParTy : TcGlobals -> TType -> bool -val tryAnyParTy : TcGlobals -> TType -> Typar option + +val tryAnyParTy : TcGlobals -> TType -> ValueOption + +val tryAnyParTyOption : TcGlobals -> TType -> Typar option + val isMeasureTy : TcGlobals -> TType -> bool val mkAppTy : TyconRef -> TypeInst -> TType val mkProvenUnionCaseTy : UnionCaseRef -> TypeInst -> TType + val isProvenUnionCaseTy : TType -> bool val isAppTy : TcGlobals -> TType -> bool + +val tryAppTy : TcGlobals -> TType -> ValueOption + val destAppTy : TcGlobals -> TType -> TyconRef * TypeInst + val tcrefOfAppTy : TcGlobals -> TType -> TyconRef -val tryDestAppTy : TcGlobals -> TType -> TyconRef option -val tryDestTyparTy : TcGlobals -> TType -> Typar option -val tryDestFunTy : TcGlobals -> TType -> (TType * TType) option + +val tryDestAppTy : TcGlobals -> TType -> ValueOption + +val tryDestTyparTy : TcGlobals -> TType -> ValueOption + +val tryDestFunTy : TcGlobals -> TType -> ValueOption<(TType * TType)> + +val tryDestAnonRecdTy : TcGlobals -> TType -> ValueOption + val argsOfAppTy : TcGlobals -> TType -> TypeInst + val mkInstForAppTy : TcGlobals -> TType -> TyparInst /// Try to get a TyconRef for a type without erasing type abbreviations -val tryNiceEntityRefOfTy : TType -> TyconRef option +val tryNiceEntityRefOfTy : TType -> ValueOption +val tryNiceEntityRefOfTyOption : TType -> TyconRef option val domainOfFunTy : TcGlobals -> TType -> TType + val rangeOfFunTy : TcGlobals -> TType -> TType + val stripFunTy : TcGlobals -> TType -> TType list * TType + val stripFunTyN : TcGlobals -> int -> TType -> TType list * TType val applyForallTy : TcGlobals -> TType -> TypeInst -> TType val tryDestAnyTupleTy : TcGlobals -> TType -> TupInfo * TType list + val tryDestRefTupleTy : TcGlobals -> TType -> TType list //------------------------------------------------------------------------- @@ -525,7 +708,9 @@ val actualTysOfUnionCaseFields : TyparInst -> UnionCaseRef -> TType list val actualTysOfInstanceRecdFields : TyparInst -> TyconRef -> TType list val actualTyOfRecdField : TyparInst -> RecdField -> TType + val actualTyOfRecdFieldRef : RecdFieldRef -> TypeInst -> TType + val actualTyOfRecdFieldForTycon : Tycon -> TypeInst -> RecdField -> TType //------------------------------------------------------------------------- @@ -535,14 +720,21 @@ val actualTyOfRecdFieldForTycon : Tycon -> TypeInst -> RecdField -> TType //------------------------------------------------------------------------- type UncurriedArgInfos = (TType * ArgReprInfo) list + type CurriedArgInfos = UncurriedArgInfos list val destTopForallTy : TcGlobals -> ValReprInfo -> TType -> Typars * TType + val GetTopTauTypeInFSharpForm : TcGlobals -> ArgReprInfo list list -> TType -> range -> CurriedArgInfos * TType + val GetTopValTypeInFSharpForm : TcGlobals -> ValReprInfo -> TType -> range -> Typars * CurriedArgInfos * TType * ArgReprInfo + val IsCompiledAsStaticProperty : TcGlobals -> Val -> bool + val IsCompiledAsStaticPropertyWithField : TcGlobals -> Val -> bool + val GetTopValTypeInCompiledForm : TcGlobals -> ValReprInfo -> TType -> range -> Typars * CurriedArgInfos * TType option * ArgReprInfo + val GetFSharpViewOfReturnType : TcGlobals -> TType option -> TType val NormalizeDeclaredTyparsForEquiRecursiveInference : TcGlobals -> Typars -> Typars @@ -558,40 +750,58 @@ val applyTys : TcGlobals -> TType -> TType list * 'T list -> TType //------------------------------------------------------------------------- val emptyFreeTypars : FreeTypars + val unionFreeTypars : FreeTypars -> FreeTypars -> FreeTypars val emptyFreeTycons : FreeTycons + val unionFreeTycons : FreeTycons -> FreeTycons -> FreeTycons val emptyFreeTyvars : FreeTyvars + val isEmptyFreeTyvars : FreeTyvars -> bool + val unionFreeTyvars : FreeTyvars -> FreeTyvars -> FreeTyvars val emptyFreeLocals : FreeLocals + val unionFreeLocals : FreeLocals -> FreeLocals -> FreeLocals type FreeVarOptions val CollectLocalsNoCaching : FreeVarOptions + val CollectTyparsNoCaching : FreeVarOptions + val CollectTyparsAndLocalsNoCaching : FreeVarOptions + val CollectTyparsAndLocals : FreeVarOptions + val CollectLocals : FreeVarOptions + val CollectTypars : FreeVarOptions + val CollectAllNoCaching : FreeVarOptions + val CollectAll : FreeVarOptions val accFreeInTypes : FreeVarOptions -> TType list -> FreeTyvars -> FreeTyvars + val accFreeInType : FreeVarOptions -> TType -> FreeTyvars -> FreeTyvars + val accFreeInTypars : FreeVarOptions -> Typars -> FreeTyvars -> FreeTyvars val freeInType : FreeVarOptions -> TType -> FreeTyvars + val freeInTypes : FreeVarOptions -> TType list -> FreeTyvars + val freeInVal : FreeVarOptions -> Val -> FreeTyvars // This one puts free variables in canonical left-to-right order. val freeInTypeLeftToRight : TcGlobals -> bool -> TType -> Typars + val freeInTypesLeftToRight : TcGlobals -> bool -> TType list -> Typars + val freeInTypesLeftToRightSkippingConstraints : TcGlobals -> TType list -> Typars val freeInModuleTy: ModuleOrNamespaceType -> FreeTyvars @@ -604,26 +814,41 @@ val isDimensionless : TcGlobals -> TType -> bool [] type TypeEquivEnv = - { EquivTypars: TyparMap; + { EquivTypars: TyparMap EquivTycons: TyconRefRemap } static member Empty : TypeEquivEnv + member BindEquivTypars : Typars -> Typars -> TypeEquivEnv + static member FromTyparInst : TyparInst -> TypeEquivEnv + static member FromEquivTypars : Typars -> Typars -> TypeEquivEnv val traitsAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TraitConstraintInfo -> TraitConstraintInfo -> bool + val traitsAEquiv : TcGlobals -> TypeEquivEnv -> TraitConstraintInfo -> TraitConstraintInfo -> bool + val typarConstraintsAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TyparConstraint -> TyparConstraint -> bool + val typarConstraintsAEquiv : TcGlobals -> TypeEquivEnv -> TyparConstraint -> TyparConstraint -> bool + val typarsAEquiv : TcGlobals -> TypeEquivEnv -> Typars -> Typars -> bool + val typeAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TType -> TType -> bool + val typeAEquiv : TcGlobals -> TypeEquivEnv -> TType -> TType -> bool + val returnTypesAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TType option -> TType option -> bool + val returnTypesAEquiv : TcGlobals -> TypeEquivEnv -> TType option -> TType option -> bool + val tcrefAEquiv : TcGlobals -> TypeEquivEnv -> TyconRef -> TyconRef -> bool + val valLinkageAEquiv : TcGlobals -> TypeEquivEnv -> Val -> Val -> bool +val anonInfoEquiv : AnonRecdTypeInfo -> AnonRecdTypeInfo -> bool + //------------------------------------------------------------------------- // Erasure of types wrt units-of-measure and type providers //------------------------------------------------------------------------- @@ -639,11 +864,17 @@ val getErasedTypes : TcGlobals -> TType -> TType list //------------------------------------------------------------------------- val MeasurePower : Measure -> int -> Measure + val ListMeasureVarOccsWithNonZeroExponents : Measure -> (Typar * Rational) list + val ListMeasureConOccsWithNonZeroExponents : TcGlobals -> bool -> Measure -> (TyconRef * Rational) list + val ProdMeasures : Measure list -> Measure + val MeasureVarExponent : Typar -> Measure -> Rational + val MeasureExprConExponent : TcGlobals -> bool -> TyconRef -> Measure -> Rational + val normalizeMeasure : TcGlobals -> Measure -> Measure @@ -652,19 +883,26 @@ val normalizeMeasure : TcGlobals -> Measure -> Measure //------------------------------------------------------------------------- val GetTypeOfMemberInFSharpForm : TcGlobals -> ValRef -> Typars * CurriedArgInfos * TType * ArgReprInfo + val GetTypeOfMemberInMemberForm : TcGlobals -> ValRef -> Typars * CurriedArgInfos * TType option * ArgReprInfo + val GetTypeOfIntrinsicMemberInCompiledForm : TcGlobals -> ValRef -> Typars * CurriedArgInfos * TType option * ArgReprInfo + val GetMemberTypeInMemberForm : TcGlobals -> MemberFlags -> ValReprInfo -> TType -> range -> Typars * CurriedArgInfos * TType option * ArgReprInfo /// Returns (parentTypars,memberParentTypars,memberMethodTypars,memberToParentInst,tinst) val PartitionValTyparsForApparentEnclosingType : TcGlobals -> Val -> (Typars * Typars * Typars * TyparInst * TType list) option + /// Returns (parentTypars,memberParentTypars,memberMethodTypars,memberToParentInst,tinst) val PartitionValTypars : TcGlobals -> Val -> (Typars * Typars * Typars * TyparInst * TType list) option + /// Returns (parentTypars,memberParentTypars,memberMethodTypars,memberToParentInst,tinst) val PartitionValRefTypars : TcGlobals -> ValRef -> (Typars * Typars * Typars * TyparInst * TType list) option val ReturnTypeOfPropertyVal : TcGlobals -> Val -> TType + val ArgInfosOfPropertyVal : TcGlobals -> Val -> UncurriedArgInfos + val ArgInfosOfMember: TcGlobals -> ValRef -> CurriedArgInfos val GetMemberCallInfo : TcGlobals -> ValRef * ValUseFlag -> int * bool * bool * bool * bool * bool * bool * bool @@ -675,68 +913,95 @@ val GetMemberCallInfo : TcGlobals -> ValRef * ValUseFlag -> int * bool * bool * type TyparConstraintsWithTypars = (Typar * TyparConstraint) list - module PrettyTypes = + val NeedsPrettyTyparName : Typar -> bool + val NewPrettyTypars : TyparInst -> Typars -> string list -> Typars * TyparInst + val PrettyTyparNames : (Typar -> bool) -> string list -> Typars -> string list + val PrettifyType : TcGlobals -> TType -> TType * TyparConstraintsWithTypars + val PrettifyInstAndTyparsAndType : TcGlobals -> TyparInst * Typars * TType -> (TyparInst * Typars * TType) * TyparConstraintsWithTypars + val PrettifyTypePair : TcGlobals -> TType * TType -> (TType * TType) * TyparConstraintsWithTypars + val PrettifyTypes : TcGlobals -> TTypes -> TTypes * TyparConstraintsWithTypars + val PrettifyInst : TcGlobals -> TyparInst -> TyparInst * TyparConstraintsWithTypars + val PrettifyInstAndType : TcGlobals -> TyparInst * TType -> (TyparInst * TType) * TyparConstraintsWithTypars + val PrettifyInstAndTypes : TcGlobals -> TyparInst * TTypes -> (TyparInst * TTypes) * TyparConstraintsWithTypars + val PrettifyInstAndSig : TcGlobals -> TyparInst * TTypes * TType -> (TyparInst * TTypes * TType) * TyparConstraintsWithTypars + val PrettifyCurriedTypes : TcGlobals -> TType list list -> TType list list * TyparConstraintsWithTypars + val PrettifyCurriedSigTypes : TcGlobals -> TType list list * TType -> (TType list list * TType) * TyparConstraintsWithTypars + val PrettifyInstAndUncurriedSig : TcGlobals -> TyparInst * UncurriedArgInfos * TType -> (TyparInst * UncurriedArgInfos * TType) * TyparConstraintsWithTypars + val PrettifyInstAndCurriedSig : TcGlobals -> TyparInst * TTypes * CurriedArgInfos * TType -> (TyparInst * TTypes * CurriedArgInfos * TType) * TyparConstraintsWithTypars [] type DisplayEnv = - { includeStaticParametersInTypeNames : bool; - openTopPathsSorted: Lazy; - openTopPathsRaw: string list list; - shortTypeNames: bool; - suppressNestedTypes: bool; - maxMembers : int option; - showObsoleteMembers: bool; - showHiddenMembers: bool; - showTyparBinding: bool; - showImperativeTyparAnnotations: bool; - suppressInlineKeyword:bool; - suppressMutableKeyword:bool; - showMemberContainers: bool; - shortConstraints:bool; - useColonForReturnType:bool; - showAttributes: bool; - showOverrides:bool; - showConstraintTyparAnnotations:bool; - abbreviateAdditionalConstraints: bool; + { includeStaticParametersInTypeNames : bool + openTopPathsSorted: Lazy + openTopPathsRaw: string list list + shortTypeNames: bool + suppressNestedTypes: bool + maxMembers : int option + showObsoleteMembers: bool + showHiddenMembers: bool + showTyparBinding: bool + showImperativeTyparAnnotations: bool + suppressInlineKeyword:bool + suppressMutableKeyword:bool + showMemberContainers: bool + shortConstraints:bool + useColonForReturnType:bool + showAttributes: bool + showOverrides:bool + showConstraintTyparAnnotations:bool + abbreviateAdditionalConstraints: bool showTyparDefaultConstraints: bool g: TcGlobals contextAccessibility: Accessibility generatedValueLayout:(Val -> layout option) } + member SetOpenPaths: string list list -> DisplayEnv + static member Empty: TcGlobals -> DisplayEnv member AddAccessibility : Accessibility -> DisplayEnv + member AddOpenPath : string list -> DisplayEnv + member AddOpenModuleOrNamespace : ModuleOrNamespaceRef -> DisplayEnv val tagEntityRefName: xref: EntityRef -> name: string -> StructuredFormat.TaggedText /// Return the full text for an item as we want it displayed to the user as a fully qualified entity val fullDisplayTextOfModRef : ModuleOrNamespaceRef -> string -val fullDisplayTextOfParentOfModRef : ModuleOrNamespaceRef -> string option + +val fullDisplayTextOfParentOfModRef : ModuleOrNamespaceRef -> ValueOption + val fullDisplayTextOfValRef : ValRef -> string + val fullDisplayTextOfValRefAsLayout : ValRef -> StructuredFormat.Layout + val fullDisplayTextOfTyconRef : TyconRef -> string + val fullDisplayTextOfTyconRefAsLayout : TyconRef -> StructuredFormat.Layout + val fullDisplayTextOfExnRef : TyconRef -> string + val fullDisplayTextOfExnRefAsLayout : TyconRef -> StructuredFormat.Layout + val fullDisplayTextOfUnionCaseRef : UnionCaseRef -> string + val fullDisplayTextOfRecdFieldRef : RecdFieldRef -> string val ticksAndArgCountTextOfTyconRef : TyconRef -> string @@ -747,22 +1012,23 @@ val qualifiedMangledNameOfTyconRef : TyconRef -> string -> string val trimPathByDisplayEnv : DisplayEnv -> string list -> string val prefixOfStaticReq : TyparStaticReq -> string + val prefixOfRigidTypar : Typar -> string /// Utilities used in simplifying types for visual presentation module SimplifyTypes = + type TypeSimplificationInfo = - { singletons : Typar Zset; - inplaceConstraints : Zmap; - postfixConstraints : TyparConstraintsWithTypars; } + { singletons : Typar Zset + inplaceConstraints : Zmap + postfixConstraints : TyparConstraintsWithTypars } + val typeSimplificationInfo0 : TypeSimplificationInfo - val CollectInfo : bool -> TType list -> TyparConstraintsWithTypars -> TypeSimplificationInfo -//------------------------------------------------------------------------- -// -//------------------------------------------------------------------------- + val CollectInfo : bool -> TType list -> TyparConstraintsWithTypars -> TypeSimplificationInfo val superOfTycon : TcGlobals -> Tycon -> TType + val abstractSlotValsOfTycons : Tycon list -> Val list //------------------------------------------------------------------------- @@ -770,11 +1036,15 @@ val abstractSlotValsOfTycons : Tycon list -> Val list //------------------------------------------------------------------------- val emptyFreeVars : FreeVars + val unionFreeVars : FreeVars -> FreeVars -> FreeVars val accFreeInTargets : FreeVarOptions -> DecisionTreeTarget array -> FreeVars -> FreeVars + val accFreeInExprs : FreeVarOptions -> Exprs -> FreeVars -> FreeVars + val accFreeInSwitchCases : FreeVarOptions -> DecisionTreeCase list -> DecisionTree option -> FreeVars -> FreeVars + val accFreeInDecisionTree : FreeVarOptions -> DecisionTree -> FreeVars -> FreeVars /// Get the free variables in a module definition. @@ -786,277 +1056,382 @@ val freeInExpr : FreeVarOptions -> Expr -> FreeVars /// Get the free variables in the right hand side of a binding. val freeInBindingRhs : FreeVarOptions -> Binding -> FreeVars +/// Check if a set of free type variables are all public val freeTyvarsAllPublic : FreeTyvars -> bool -val freeVarsAllPublic : FreeVars -> bool -//------------------------------------------------------------------------- -// Mark/range/position information from expressions -//------------------------------------------------------------------------- +/// Check if a set of free variables are all public +val freeVarsAllPublic : FreeVars -> bool +/// Get the mark/range/position information from an expression type Expr with member Range : range -//------------------------------------------------------------------------- -// type-of operations on the expression tree -//------------------------------------------------------------------------- - +/// Compute the type of an expression from the expression itself val tyOfExpr : TcGlobals -> Expr -> TType -//------------------------------------------------------------------------- -// Top expressions to implement top types -//------------------------------------------------------------------------- - +/// A flag to govern whether arity inference should be type-directed or syntax-directed when +/// inferring an arity from a lambda expression. [] -type AllowTypeDirectedDetupling = Yes | No +type AllowTypeDirectedDetupling = + | Yes + | No +/// Given a (curried) lambda expression, pull off its arguments val stripTopLambda : Expr * TType -> Typars * Val list list * Expr * TType + +/// Given a lambda expression, extract the ValReprInfo for its arguments and other details val InferArityOfExpr : TcGlobals -> AllowTypeDirectedDetupling -> TType -> Attribs list list -> Attribs -> Expr -> ValReprInfo + +/// Given a lambda binding, extract the ValReprInfo for its arguments and other details val InferArityOfExprBinding : TcGlobals -> AllowTypeDirectedDetupling -> Val -> Expr -> ValReprInfo -//------------------------------------------------------------------------- -// Copy expressions and types -//------------------------------------------------------------------------- - +/// Mutate a value to indicate it should be considered a local rather than a module-bound definition // REVIEW: this mutation should not be needed val setValHasNoArity : Val -> Val +/// Indicate what should happen to value definitions when copying expressions type ValCopyFlag = | CloneAll | CloneAllAndMarkExprValsAsCompilerGenerated - // OnlyCloneExprVals is a nasty setting to reuse the cloning logic in a mode where all - // Tycon and "module/member" Val objects keep their identity, but the Val objects for all Expr bindings - // are cloned. This is used to 'fixup' the TAST created by tlr.fs - // - // This is a fragile mode of use. It's not really clear why TLR needs to create a "bad" expression tree that - // reuses Val objects as multiple value bindings, and its been the cause of several subtle bugs. + + /// OnlyCloneExprVals is a nasty setting to reuse the cloning logic in a mode where all + /// Tycon and "module/member" Val objects keep their identity, but the Val objects for all Expr bindings + /// are cloned. This is used to 'fixup' the TAST created by tlr.fs + /// + /// This is a fragile mode of use. It's not really clear why TLR needs to create a "bad" expression tree that + /// reuses Val objects as multiple value bindings, and its been the cause of several subtle bugs. | OnlyCloneExprVals +/// Remap a reference to a type definition using the given remapping substitution val remapTyconRef : TyconRefRemap -> TyconRef -> TyconRef + +/// Remap a reference to a union case using the given remapping substitution val remapUnionCaseRef : TyconRefRemap -> UnionCaseRef -> UnionCaseRef + +/// Remap a reference to a record field using the given remapping substitution val remapRecdFieldRef : TyconRefRemap -> RecdFieldRef -> RecdFieldRef + +/// Remap a reference to a value using the given remapping substitution val remapValRef : Remap -> ValRef -> ValRef + +/// Remap an expression using the given remapping substitution val remapExpr : TcGlobals -> ValCopyFlag -> Remap -> Expr -> Expr + +/// Remap an attribute using the given remapping substitution val remapAttrib : TcGlobals -> Remap -> Attrib -> Attrib + +/// Remap a (possible generic) type using the given remapping substitution val remapPossibleForallTy : TcGlobals -> Remap -> TType -> TType + +/// Copy an entire module or namespace type using the given copying flags val copyModuleOrNamespaceType : TcGlobals -> ValCopyFlag -> ModuleOrNamespaceType -> ModuleOrNamespaceType + +/// Copy an entire expression using the given copying flags val copyExpr : TcGlobals -> ValCopyFlag -> Expr -> Expr + +/// Copy an entire implementation file using the given copying flags val copyImplFile : TcGlobals -> ValCopyFlag -> TypedImplFile -> TypedImplFile + +/// Copy a method slot signature, including new generic type parameters if the slot signature represents a generic method val copySlotSig : SlotSig -> SlotSig + +/// Instantiate the generic type parameters in a method slot signature, building a new one val instSlotSig : TyparInst -> SlotSig -> SlotSig -val instExpr : TcGlobals -> TyparInst -> Expr -> Expr -//------------------------------------------------------------------------- -// Build the remapping that corresponds to a module meeting its signature -// and also report the set of tycons, tycon representations and values hidden in the process. -//------------------------------------------------------------------------- +/// Instantiate the generic type parameters in an expression, building a new one +val instExpr : TcGlobals -> TyparInst -> Expr -> Expr +/// The remapping that corresponds to a module meeting its signature +/// and also report the set of tycons, tycon representations and values hidden in the process. type SignatureRepackageInfo = - { mrpiVals: (ValRef * ValRef) list; - mrpiEntities: (TyconRef * TyconRef) list } + { /// The list of corresponding values + RepackagedVals: (ValRef * ValRef) list + /// The list of corresponding modules, namespacea and type definitions + RepackagedEntities: (TyconRef * TyconRef) list } + + /// The empty table static member Empty : SignatureRepackageInfo +/// A set of tables summarizing the items hidden by a signature type SignatureHidingInfo = - { mhiTycons : Zset; - mhiTyconReprs : Zset; - mhiVals : Zset; - mhiRecdFields : Zset; - mhiUnionCases : Zset } + { HiddenTycons: Zset + HiddenTyconReprs: Zset + HiddenVals: Zset + HiddenRecdFields: Zset + HiddenUnionCases: Zset } + + /// The empty table representing no hiding static member Empty : SignatureHidingInfo -val ComputeRemappingFromInferredSignatureToExplicitSignature : TcGlobals -> ModuleOrNamespaceType -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo +/// Compute the remapping information implied by a signature being inferred for a particular implementation val ComputeRemappingFromImplementationToSignature : TcGlobals -> ModuleOrNamespaceExpr -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo + +/// Compute the remapping information implied by an explicit signature being given for an inferred signature +val ComputeRemappingFromInferredSignatureToExplicitSignature : TcGlobals -> ModuleOrNamespaceType -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo + +/// Compute the hiding information that corresponds to the hiding applied at an assembly boundary val ComputeHidingInfoAtAssemblyBoundary : ModuleOrNamespaceType -> SignatureHidingInfo -> SignatureHidingInfo + val mkRepackageRemapping : SignatureRepackageInfo -> Remap +/// Wrap one module or namespace implementation in a 'namespace N' outer wrapper val wrapModuleOrNamespaceExprInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceExpr -> ModuleOrNamespaceExpr + +/// Wrap one module or namespace definition in a 'namespace N' outer wrapper val wrapModuleOrNamespaceTypeInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceType -> ModuleOrNamespaceType * ModuleOrNamespace + +/// Wrap one module or namespace definition in a 'module M = ..' outer wrapper val wrapModuleOrNamespaceType : Ident -> CompilationPath -> ModuleOrNamespaceType -> ModuleOrNamespace +/// Given an implementation, fetch its recorded signature val SigTypeOfImplFile : TypedImplFile -> ModuleOrNamespaceType -//------------------------------------------------------------------------- -// Given a list of top-most signatures that together constrain the public compilation units -// of an assembly, compute a remapping that converts local references to non-local references. -// This remapping must be applied to all pickled expressions and types -// exported from the assembly. -//------------------------------------------------------------------------- - +/// Given a namespace, module or type definition, try to produce a reference to that entity. +val tryRescopeEntity : CcuThunk -> Entity -> ValueOption -val tryRescopeEntity : CcuThunk -> Entity -> EntityRef option -val tryRescopeVal : CcuThunk -> Remap -> Val -> ValRef option +/// Given a value definition, try to produce a reference to that value. Fails for local values. +val tryRescopeVal : CcuThunk -> Remap -> Val -> ValueOption +/// Make the substitution (remapping) table for viewing a module or namespace 'from the outside' +/// +/// Given the top-most signatures constrains the public compilation units +/// of an assembly, compute a remapping that converts local references to non-local references. +/// This remapping must be applied to all pickled expressions and types +/// exported from the assembly. val MakeExportRemapping : CcuThunk -> ModuleOrNamespace -> Remap + +/// Make a remapping table for viewing a module or namespace 'from the outside' val ApplyExportRemappingToEntity : TcGlobals -> Remap -> ModuleOrNamespace -> ModuleOrNamespace -/// Query SignatureRepackageInfo +/// Determine if a type definition is hidden by a signature val IsHiddenTycon : (Remap * SignatureHidingInfo) list -> Tycon -> bool + +/// Determine if the representation of a type definition is hidden by a signature val IsHiddenTyconRepr : (Remap * SignatureHidingInfo) list -> Tycon -> bool + +/// Determine if a member, function or value is hidden by a signature val IsHiddenVal : (Remap * SignatureHidingInfo) list -> Val -> bool -val IsHiddenRecdField : (Remap * SignatureHidingInfo) list -> RecdFieldRef -> bool -//------------------------------------------------------------------------- -// Adjust marks in expressions -//------------------------------------------------------------------------- +/// Determine if a record field is hidden by a signature +val IsHiddenRecdField : (Remap * SignatureHidingInfo) list -> RecdFieldRef -> bool +/// Adjust marks in expressions, replacing all marks by thegiven mark. +/// Used when inlining. val remarkExpr : range -> Expr -> Expr - -//------------------------------------------------------------------------- -// Make applications -//------------------------------------------------------------------------- +/// Build the application of a (possibly generic, possibly curried) function value to a set of type and expression arguments val primMkApp : (Expr * TType) -> TypeInst -> Exprs -> range -> Expr + +/// Build the application of a (possibly generic, possibly curried) function value to a set of type and expression arguments. +/// Reduce the application via let-bindings if the function value is a lambda expression. val mkApps : TcGlobals -> (Expr * TType) * TType list list * Exprs * range -> Expr + +/// Build the application of a generic construct to a set of type arguments. +/// Reduce the application via substitution if the function value is a typed lambda expression. val mkTyAppExpr : range -> Expr * TType -> TType list -> Expr +/// Build an expression to mutate a local /// localv <- e val mkValSet : range -> ValRef -> Expr -> Expr + +/// Build an expression to mutate the contents of a local pointer /// *localv_ptr = e val mkAddrSet : range -> ValRef -> Expr -> Expr + +/// Build an expression to dereference a local pointer /// *localv_ptr val mkAddrGet : range -> ValRef -> Expr + +/// Build an expression to take the address of a local /// &localv val mkValAddr : range -> readonly: bool -> ValRef -> Expr -//------------------------------------------------------------------------- -// Note these take the address of the record expression if it is a struct, and -// apply a type instantiation if it is a first-class polymorphic record field. -//------------------------------------------------------------------------- - +/// Build an exression representing the read of an instance class or record field. +/// First take the address of the record expression if it is a struct. val mkRecdFieldGet : TcGlobals -> Expr * RecdFieldRef * TypeInst * range -> Expr -//------------------------------------------------------------------------- -// Get the targets used in a decision graph (for reporting warnings) -//------------------------------------------------------------------------- - +/// Accumulate the targets actually used in a decision graph (for reporting warnings) val accTargetsOfDecisionTree : DecisionTree -> int list -> int list -//------------------------------------------------------------------------- -// Optimizations on decision graphs -//------------------------------------------------------------------------- - +/// Make a 'match' expression applying some peep-hole optimizations along the way, e.g to +/// pre-decide the branch taken at compile-time. val mkAndSimplifyMatch : SequencePointInfoForBinding -> range -> range -> TType -> DecisionTree -> DecisionTreeTarget list -> Expr +/// Make a 'match' expression without applying any peep-hole optimizations. val primMkMatch : SequencePointInfoForBinding * range * DecisionTree * DecisionTreeTarget array * range * TType -> Expr -//------------------------------------------------------------------------- -// Work out what things on the r.h.s. of a let rec need to be fixed up -//------------------------------------------------------------------------- - +/// Work out what things on the right-han-side of a 'let rec' recursive binding need to be fixed up val IterateRecursiveFixups : TcGlobals -> Val option -> (Val option -> Expr -> (Expr -> Expr) -> Expr -> unit) -> Expr * (Expr -> Expr) -> Expr -> unit -//------------------------------------------------------------------------- -// From lambdas taking multiple variables to lambdas taking a single variable -// of tuple type. -//------------------------------------------------------------------------- - +/// Given a lambda expression taking multiple variables, build a corresponding lambda taking a tuple val MultiLambdaToTupledLambda : TcGlobals -> Val list -> Expr -> Val * Expr -val AdjustArityOfLambdaBody : TcGlobals -> int -> Val list -> Expr -> Val list * Expr -//------------------------------------------------------------------------- -// Make applications, doing beta reduction by introducing let-bindings -//------------------------------------------------------------------------- +/// Given a lambda expression, adjust it to have be one or two lambda expressions (fun a -> (fun b -> ...)) +/// where the first has the given arity. +val AdjustArityOfLambdaBody : TcGlobals -> int -> Val list -> Expr -> Val list * Expr +/// Make an application expression, doing beta reduction by introducing let-bindings val MakeApplicationAndBetaReduce : TcGlobals -> Expr * TType * TypeInst list * Exprs * range -> Expr +/// COmbine two static-resolution requirements on a type parameter val JoinTyparStaticReq : TyparStaticReq -> TyparStaticReq -> TyparStaticReq -//------------------------------------------------------------------------- -// More layout - this is for debugging -//------------------------------------------------------------------------- +/// Layout for internal compiler debugging purposes module DebugPrint = + /// A global flag indicating whether debug output should include ranges val layoutRanges : bool ref + + /// Convert a type to a string for debugging purposes val showType : TType -> string + + /// Convert an expression to a string for debugging purposes val showExpr : Expr -> string + /// Debug layout for a reference to a value val valRefL : ValRef -> layout + + /// Debug layout for a reference to a union case val unionCaseRefL : UnionCaseRef -> layout - val vspecAtBindL : Val -> layout + + /// Debug layout for an value definition at its binding site + val valAtBindL : Val -> layout + + /// Debug layout for an integer val intL : int -> layout + + /// Debug layout for a value definition val valL : Val -> layout + + /// Debug layout for a type parameter definition val typarDeclL : Typar -> layout + + /// Debug layout for a trait constraint val traitL : TraitConstraintInfo -> layout + + /// Debug layout for a type parameter val typarL : Typar -> layout + + /// Debug layout for a set of type parameters val typarsL : Typars -> layout + + /// Debug layout for a type val typeL : TType -> layout + + /// Debug layout for a method slot signature val slotSigL : SlotSig -> layout + + /// Debug layout for the type signature of a module or namespace definition val entityTypeL : ModuleOrNamespaceType -> layout + + /// Debug layout for a module or namespace definition val entityL : ModuleOrNamespace -> layout + + /// Debug layout for the type of a value val typeOfValL : Val -> layout + + /// Debug layout for a binding of an expression to a value val bindingL : Binding -> layout + + /// Debug layout for an expression val exprL : Expr -> layout + + /// Debug layout for a type definition val tyconL : Tycon -> layout + + /// Debug layout for a decision tree val decisionTreeL : DecisionTree -> layout + + /// Debug layout for an implementation file val implFileL : TypedImplFile -> layout + + /// Debug layout for a list of implementation files val implFilesL : TypedImplFile list -> layout - val recdFieldRefL : RecdFieldRef -> layout -//------------------------------------------------------------------------- -// Fold on expressions -//------------------------------------------------------------------------- + /// Debug layout for class and record fields + val recdFieldRefL : RecdFieldRef -> layout +/// A set of function parameters (visitor) for folding over expressions type ExprFolder<'State> = - { exprIntercept : ('State -> Expr -> 'State) -> 'State -> Expr -> 'State option; - valBindingSiteIntercept : 'State -> bool * Val -> 'State; - nonRecBindingsIntercept : 'State -> Binding -> 'State; - recBindingsIntercept : 'State -> Bindings -> 'State; - dtreeIntercept : 'State -> DecisionTree -> 'State; - targetIntercept : ('State -> Expr -> 'State) -> 'State -> DecisionTreeTarget -> 'State option; - tmethodIntercept : ('State -> Expr -> 'State) -> 'State -> ObjExprMethod -> 'State option;} + { exprIntercept : ('State -> Expr -> 'State) -> 'State -> Expr -> 'State option + valBindingSiteIntercept : 'State -> bool * Val -> 'State + nonRecBindingsIntercept : 'State -> Binding -> 'State + recBindingsIntercept : 'State -> Bindings -> 'State + dtreeIntercept : 'State -> DecisionTree -> 'State + targetIntercept : ('State -> Expr -> 'State) -> 'State -> DecisionTreeTarget -> 'State option + tmethodIntercept : ('State -> Expr -> 'State) -> 'State -> ObjExprMethod -> 'State option} + +/// The empty set of actions for folding over expressions val ExprFolder0 : ExprFolder<'State> + +/// Fold over all the expressions in an implementation file val FoldImplFile: ExprFolder<'State> -> ('State -> TypedImplFile -> 'State) + +/// Fold over all the expressions in an expression val FoldExpr : ExprFolder<'State> -> ('State -> Expr -> 'State) #if DEBUG +/// Extract some statistics from an expression val ExprStats : Expr -> string #endif -//------------------------------------------------------------------------- -// Make some common types -//------------------------------------------------------------------------- - +/// Build a nativeptr type val mkNativePtrTy : TcGlobals -> TType -> TType + +/// Build a 'voidptr' type val mkVoidPtrTy : TcGlobals -> TType + +/// Build a single-dimensional array type val mkArrayType : TcGlobals -> TType -> TType + +/// Determine is a type is an option type val isOptionTy : TcGlobals -> TType -> bool + +/// Take apart an option type val destOptionTy : TcGlobals -> TType -> TType -val tryDestOptionTy : TcGlobals -> TType -> TType option +/// Try to take apart an option type +val tryDestOptionTy : TcGlobals -> TType -> ValueOption + +/// Determine if a type is a System.Linq.Expression type val isLinqExpressionTy : TcGlobals -> TType -> bool -val destLinqExpressionTy : TcGlobals -> TType -> TType -val tryDestLinqExpressionTy : TcGlobals -> TType -> TType option -(* -val isQuoteExprTy : TcGlobals -> TType -> bool -val destQuoteExprTy : TcGlobals -> TType -> TType -val tryDestQuoteExprTy : TcGlobals -> TType -> TType option -*) +/// Take apart a System.Linq.Expression type +val destLinqExpressionTy : TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Primitives associated with compiling the IEvent idiom to .NET events -//------------------------------------------------------------------------- +/// Try to take apart a System.Linq.Expression type +val tryDestLinqExpressionTy : TcGlobals -> TType -> TType option +/// Determine if a type is an IDelegateEvent type val isIDelegateEventType : TcGlobals -> TType -> bool + +/// Take apart an IDelegateEvent type val destIDelegateEventType : TcGlobals -> TType -> TType + +/// Build an IEvent type val mkIEventType : TcGlobals -> TType -> TType -> TType + +/// Build an IObservable type val mkIObservableType : TcGlobals -> TType -> TType -val mkIObserverType : TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Primitives associated with printf format string parsing -//------------------------------------------------------------------------- +/// Build an IObserver type +val mkIObserverType : TcGlobals -> TType -> TType +/// Build an Lazy type val mkLazyTy : TcGlobals -> TType -> TType + +/// Build an PrintFormat type val mkPrintfFormatTy : TcGlobals -> TType -> TType -> TType -> TType -> TType -> TType //------------------------------------------------------------------------- // Classify types //------------------------------------------------------------------------- +/// Represents metadata extracted from a nominal type type TypeDefMetadata = | ILTypeMetadata of TILObjectReprData | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata @@ -1064,43 +1439,94 @@ type TypeDefMetadata = | ProvidedTypeMetadata of TProvidedTypeInfo #endif +/// Extract metadata from a type definition val metadataOfTycon : Tycon -> TypeDefMetadata + +/// Extract metadata from a type val metadataOfTy : TcGlobals -> TType -> TypeDefMetadata -val isStringTy : TcGlobals -> TType -> bool -val isListTy : TcGlobals -> TType -> bool -val isILAppTy : TcGlobals -> TType -> bool -val isArrayTy : TcGlobals -> TType -> bool -val isArray1DTy : TcGlobals -> TType -> bool -val destArrayTy : TcGlobals -> TType -> TType -val destListTy : TcGlobals -> TType -> TType +/// Determine if a type is the System.String type +val isStringTy : TcGlobals -> TType -> bool + +/// Determine if a type is an F# list type +val isListTy : TcGlobals -> TType -> bool + +/// Determine if a type is a nominal .NET type +val isILAppTy : TcGlobals -> TType -> bool + +/// Determine if a type is any kind of array type +val isArrayTy : TcGlobals -> TType -> bool + +/// Determine if a type is a single-dimensional array type +val isArray1DTy : TcGlobals -> TType -> bool + +/// Get the element type of an array type +val destArrayTy : TcGlobals -> TType -> TType + +/// Get the element type of an F# list type +val destListTy : TcGlobals -> TType -> TType + +/// Build an array type of the given rank +val mkArrayTy : TcGlobals -> int -> TType -> range -> TType -val mkArrayTy : TcGlobals -> int -> TType -> range -> TType -val isArrayTyconRef : TcGlobals -> TyconRef -> bool +/// Check if a type definition is one of the artifical type definitions used for array types of different ranks +val isArrayTyconRef : TcGlobals -> TyconRef -> bool + +/// Determine the rank of one of the artifical type definitions used for array types val rankOfArrayTyconRef : TcGlobals -> TyconRef -> int -val isUnitTy : TcGlobals -> TType -> bool -val isObjTy : TcGlobals -> TType -> bool -val isVoidTy : TcGlobals -> TType -> bool +/// 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.Void type +val isVoidTy : TcGlobals -> TType -> bool /// Get the element type of an array type -val destArrayTy : TcGlobals -> TType -> TType +val destArrayTy : TcGlobals -> TType -> TType + /// Get the rank of an array type val rankOfArrayTy : TcGlobals -> TType -> int -val isInterfaceTyconRef : TyconRef -> bool +/// Determine if a reference to a type definition is an interface type +val isInterfaceTyconRef : TyconRef -> bool + +/// Determine if a type is a delegate type +val isDelegateTy : TcGlobals -> TType -> bool + +/// Determine if a type is an interface type +val isInterfaceTy : TcGlobals -> TType -> bool + +/// Determine if a type is a FSharpRef type +val isRefTy : TcGlobals -> TType -> bool -val isDelegateTy : TcGlobals -> TType -> bool -val isInterfaceTy : TcGlobals -> TType -> bool -val isRefTy : TcGlobals -> TType -> bool -val isSealedTy : TcGlobals -> TType -> bool -val isComInteropTy : TcGlobals -> TType -> bool -val underlyingTypeOfEnumTy : TcGlobals -> TType -> TType -val normalizeEnumTy : TcGlobals -> TType -> TType +/// Determine if a type is a sealed type +val isSealedTy : TcGlobals -> TType -> bool + +/// Determine if a type is a ComInterop type +val isComInteropTy : TcGlobals -> TType -> bool + +/// Determine the underlying type of an enum type (normally int32) +val underlyingTypeOfEnumTy : TcGlobals -> TType -> TType + +/// If the input type is an enum type, then convert to its underlying type, otherwise return the input type +val normalizeEnumTy : TcGlobals -> TType -> TType + +/// Determine if a type is a struct type val isStructTy : TcGlobals -> TType -> bool + +/// Determine if a type is an unmanaged type val isUnmanagedTy : TcGlobals -> TType -> bool + +/// Determine if a type is a class type val isClassTy : TcGlobals -> TType -> bool + +/// Determine if a type is an enum type val isEnumTy : TcGlobals -> TType -> bool + +/// Determine if a type is a struct, record or union type val isStructRecordOrUnionTyconTy : TcGlobals -> TType -> bool /// For "type Class as self", 'self' is fixed up after initialization. To support this, @@ -1108,9 +1534,16 @@ val isStructRecordOrUnionTyconTy : TcGlobals -> TType -> bool /// returns the underlying type. 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 + +/// An active pattern to match System.Nullable types val (|NullableTy|_|) : TcGlobals -> TType -> TType option + +/// 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 //------------------------------------------------------------------------- @@ -1118,35 +1551,53 @@ val (|ByrefTy|_|) : TcGlobals -> TType -> TType option //------------------------------------------------------------------------- val IsUnionTypeWithNullAsTrueValue: TcGlobals -> Tycon -> bool + val TyconHasUseNullAsTrueValueAttribute : TcGlobals -> Tycon -> bool + val CanHaveUseNullAsTrueValueAttribute : TcGlobals -> Tycon -> bool + val MemberIsCompiledAsInstance : TcGlobals -> TyconRef -> bool -> ValMemberInfo -> Attribs -> bool + val ValSpecIsCompiledAsInstance : TcGlobals -> Val -> bool + val ValRefIsCompiledAsInstanceMember : TcGlobals -> ValRef -> bool + val ModuleNameIsMangled : TcGlobals -> Attribs -> bool val CompileAsEvent : TcGlobals -> Attribs -> bool val TypeNullIsExtraValue : TcGlobals -> range -> TType -> bool + val TypeNullIsTrueValue : TcGlobals -> TType -> bool + val TypeNullNotLiked : TcGlobals -> range -> TType -> bool + val TypeNullNever : TcGlobals -> TType -> bool val TypeSatisfiesNullConstraint : TcGlobals -> range -> TType -> bool + val TypeHasDefaultValue : TcGlobals -> range -> TType -> bool val isAbstractTycon : Tycon -> bool val isUnionCaseRefDefinitelyMutable : UnionCaseRef -> bool + val isRecdOrUnionOrStructTyconRefDefinitelyMutable : TyconRef -> bool + val isExnDefinitelyMutable : TyconRef -> bool + val isUnionCaseFieldMutable : TcGlobals -> UnionCaseRef -> int -> bool + val isExnFieldMutable : TyconRef -> int -> bool + val isRecdOrStructTyconRefReadOnly: TcGlobals -> range -> TyconRef -> bool + val isRecdOrStructTyconRefAssumedImmutable: TcGlobals -> TyconRef -> bool + val isRecdOrStructTyReadOnly: TcGlobals -> range -> TType -> bool val useGenuineField : Tycon -> RecdField -> bool + val ComputeFieldName : Tycon -> RecdField -> string //------------------------------------------------------------------------- @@ -1154,6 +1605,7 @@ val ComputeFieldName : Tycon -> RecdField -> string //------------------------------------------------------------------------- val slotSigHasVoidReturnTy : SlotSig -> bool + val actualReturnTyOfSlotSig : TypeInst -> TypeInst -> SlotSig -> TType option val returnTyOfMethod : TcGlobals -> ObjExprMethod -> TType option @@ -1163,25 +1615,37 @@ val returnTyOfMethod : TcGlobals -> ObjExprMethod -> TType option //------------------------------------------------------------------------- val mkRefCell : TcGlobals -> range -> TType -> Expr -> Expr + val mkRefCellGet : TcGlobals -> range -> TType -> Expr -> Expr + val mkRefCellSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkLazyDelayed : TcGlobals -> range -> TType -> Expr -> Expr -val mkLazyForce : TcGlobals -> range -> TType -> Expr -> Expr +val mkLazyForce : TcGlobals -> range -> TType -> Expr -> Expr val mkRefCellContentsRef : TcGlobals -> RecdFieldRef + val isRefCellTy : TcGlobals -> TType -> bool + val destRefCellTy : TcGlobals -> TType -> TType + val mkRefCellTy : TcGlobals -> TType -> TType val mkSeqTy : TcGlobals -> TType -> TType + val mkIEnumeratorTy : TcGlobals -> TType -> TType + val mkListTy : TcGlobals -> TType -> TType + val mkOptionTy : TcGlobals -> TType -> TType + val mkNoneCase : TcGlobals -> UnionCaseRef + val mkSomeCase : TcGlobals -> UnionCaseRef val mkNil : TcGlobals -> range -> TType -> Expr + val mkCons : TcGlobals -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- @@ -1189,17 +1653,29 @@ val mkCons : TcGlobals -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- val mkSequential : SequencePointInfoForSeq -> range -> Expr -> Expr -> Expr + val mkCompGenSequential : range -> Expr -> Expr -> Expr + val mkSequentials : SequencePointInfoForSeq -> TcGlobals -> range -> Exprs -> Expr + val mkRecordExpr : TcGlobals -> RecordConstructionInfo * TyconRef * TypeInst * RecdFieldRef list * Exprs * range -> Expr + val mkUnbox : TType -> Expr -> range -> Expr + val mkBox : TType -> Expr -> range -> Expr + val mkIsInst : TType -> Expr -> range -> Expr + val mkNull : range -> TType -> Expr + val mkNullTest : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr + val mkNonNullTest : TcGlobals -> range -> Expr -> Expr + val mkIsInstConditional : TcGlobals -> range -> TType -> Expr -> Val -> Expr -> Expr -> Expr + val mkThrow : range -> TType -> Expr -> Expr + val mkGetArg0 : range -> TType -> Expr val mkDefault : range * TType -> Expr @@ -1207,18 +1683,31 @@ val mkDefault : range * TType -> Expr val isThrow : Expr -> bool val mkString : TcGlobals -> range -> string -> Expr + val mkBool : TcGlobals -> range -> bool -> Expr + val mkByte : TcGlobals -> range -> byte -> Expr + val mkUInt16 : TcGlobals -> range -> uint16 -> Expr + val mkTrue : TcGlobals -> range -> Expr + val mkFalse : TcGlobals -> range -> Expr + val mkUnit : TcGlobals -> range -> Expr + val mkInt32 : TcGlobals -> range -> int32 -> Expr + val mkInt : TcGlobals -> range -> int -> Expr + val mkZero : TcGlobals -> range -> Expr + val mkOne : TcGlobals -> range -> Expr + val mkTwo : TcGlobals -> range -> Expr + val mkMinusOne : TcGlobals -> range -> Expr + val destInt32 : Expr -> int32 option //------------------------------------------------------------------------- @@ -1226,8 +1715,11 @@ val destInt32 : Expr -> int32 option //------------------------------------------------------------------------- val isQuotedExprTy : TcGlobals -> TType -> bool + val destQuotedExprTy : TcGlobals -> TType -> TType + val mkQuotedExprTy : TcGlobals -> TType -> TType + val mkRawQuotedExprTy : TcGlobals -> TType //------------------------------------------------------------------------- @@ -1235,9 +1727,13 @@ val mkRawQuotedExprTy : TcGlobals -> TType //------------------------------------------------------------------------- val mspec_Type_GetTypeFromHandle : TcGlobals -> ILMethodSpec + val fspec_Missing_Value : TcGlobals -> ILFieldSpec + val mkInitializeArrayMethSpec: TcGlobals -> ILMethodSpec + val mkByteArrayTy : TcGlobals -> TType + val mkInvalidCastExnNewobj: TcGlobals -> ILInstr @@ -1248,122 +1744,207 @@ val mkInvalidCastExnNewobj: TcGlobals -> ILInstr val mkCallNewFormat : TcGlobals -> range -> TType -> TType -> TType -> TType -> TType -> Expr -> Expr val mkCallUnbox : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallGetGenericComparer : TcGlobals -> range -> Expr + val mkCallGetGenericEREqualityComparer : TcGlobals -> range -> Expr + val mkCallGetGenericPEREqualityComparer : TcGlobals -> range -> Expr val mkCallUnboxFast : TcGlobals -> range -> TType -> Expr -> Expr + val canUseUnboxFast : TcGlobals -> range -> TType -> bool val mkCallDispose : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeq : TcGlobals -> range -> TType -> Expr -> Expr val mkCallTypeTest : TcGlobals -> range -> TType -> Expr -> Expr + val canUseTypeTestFast : TcGlobals -> TType -> bool val mkCallTypeOf : TcGlobals -> range -> TType -> Expr + val mkCallTypeDefOf : TcGlobals -> range -> TType -> Expr val mkCallCreateInstance : TcGlobals -> range -> TType -> Expr + val mkCallCreateEvent : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallArrayLength : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallArrayGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallArray2DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallArray3DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArray4DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArraySet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallArray2DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArray3DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArray4DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr val mkCallHash : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallBox : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallIsNull : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallIsNotNull : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallRaise : TcGlobals -> range -> TType -> Expr -> Expr val mkCallGenericComparisonWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallGenericEqualityEROuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallGenericEqualityWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallGenericHashWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr val mkCallEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallNotEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallLessThanOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallLessThanOrEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallGreaterThanOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallGreaterThanOrEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr val mkCallAdditionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSubtractionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallMultiplyOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallDivisionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallModulusOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallBitwiseAndOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallBitwiseOrOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallBitwiseXorOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallShiftLeftOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallShiftRightOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr val mkCallUnaryNegOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallUnaryNotOperator : TcGlobals -> range -> TType -> Expr -> Expr val mkCallAdditionChecked : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSubtractionChecked : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallMultiplyChecked : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallUnaryNegChecked : TcGlobals -> range -> TType -> Expr -> Expr val mkCallToByteChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToSByteChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt16Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt16Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt32Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt32Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt64Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt64Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntPtrChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUIntPtrChecked : TcGlobals -> range -> TType -> Expr -> Expr val mkCallToByteOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToSByteOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToSingleOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToDoubleOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr val mkCallToCharOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToEnumOperator : TcGlobals -> range -> TType -> Expr -> Expr val mkCallDeserializeQuotationFSharp20Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallDeserializeQuotationFSharp40Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallCastQuotation : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallLiftValueWithName : TcGlobals -> range -> TType -> string -> Expr -> Expr + val mkCallLiftValueWithDefn : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqCollect : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr + val mkCallSeqUsing : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr + val mkCallSeqDelay : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqAppend : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSeqFinally : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSeqGenerated : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSeqOfFunctions : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallSeqToArray : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqToList : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqMap : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr + val mkCallSeqSingleton : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqEmpty : TcGlobals -> range -> TType -> Expr + val mkILAsmCeq : TcGlobals -> range -> Expr -> Expr -> Expr + val mkILAsmClt : TcGlobals -> range -> Expr -> Expr -> Expr val mkCallFailInit : TcGlobals -> range -> Expr + val mkCallFailStaticInit : TcGlobals -> range -> Expr + val mkCallCheckThis : TcGlobals -> range -> TType -> Expr -> Expr val mkCase : DecisionTreeTest * DecisionTree -> DecisionTreeCase @@ -1371,18 +1952,30 @@ val mkCase : DecisionTreeTest * DecisionTree -> DecisionTreeCase val mkCallQuoteToLinqLambdaExpression : TcGlobals -> range -> TType -> Expr -> Expr val mkCallGetQuerySourceAsEnumerable : TcGlobals -> range -> TType -> TType -> Expr -> Expr + val mkCallNewQuerySource : TcGlobals -> range -> TType -> TType -> Expr -> Expr val mkArray : TType * Exprs * range -> Expr +val mkStaticCall_String_Concat2 : TcGlobals -> range -> Expr -> Expr -> Expr + +val mkStaticCall_String_Concat3 : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr + +val mkStaticCall_String_Concat4 : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr + +val mkStaticCall_String_Concat_Array : TcGlobals -> range -> Expr -> Expr + //------------------------------------------------------------------------- // operations primarily associated with the optimization to fix // up loops to generate .NET code that does not include array bound checks //------------------------------------------------------------------------- val mkDecr : TcGlobals -> range -> Expr -> Expr + val mkIncr : TcGlobals -> range -> Expr -> Expr + val mkLdlen : TcGlobals -> range -> Expr -> Expr + val mkLdelem : TcGlobals -> range -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- @@ -1390,18 +1983,29 @@ val mkLdelem : TcGlobals -> range -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- val TryDecodeILAttribute : TcGlobals -> ILTypeRef -> ILAttributes -> (ILAttribElem list * ILAttributeNamedArg list) option + val TryFindILAttribute : BuiltinAttribInfo -> ILAttributes -> bool + val TryFindILAttributeOpt : BuiltinAttribInfo option -> ILAttributes -> bool val IsMatchingFSharpAttribute : TcGlobals -> BuiltinAttribInfo -> Attrib -> bool + val IsMatchingFSharpAttributeOpt : TcGlobals -> BuiltinAttribInfo option -> Attrib -> bool + val HasFSharpAttribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> bool + val HasFSharpAttributeOpt : TcGlobals -> BuiltinAttribInfo option -> Attribs -> bool + val TryFindFSharpAttribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> Attrib option + val TryFindFSharpAttributeOpt : TcGlobals -> BuiltinAttribInfo option -> Attribs -> Attrib option + val TryFindFSharpBoolAttribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> bool option + val TryFindFSharpBoolAttributeAssumeFalse : TcGlobals -> BuiltinAttribInfo -> Attribs -> bool option + val TryFindFSharpStringAttribute : 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. @@ -1422,19 +2026,29 @@ val TryFindAttributeUsageAttribute : TcGlobals -> range -> TyconRef -> bool opti /// returns Some(assemblyName) for success val TryDecodeTypeProviderAssemblyAttr : ILGlobals -> ILAttribute -> string option #endif + val IsSignatureDataVersionAttr : ILAttribute -> bool + val TryFindAutoOpenAttr : IL.ILGlobals -> ILAttribute -> string option + val TryFindInternalsVisibleToAttr : IL.ILGlobals -> ILAttribute -> string option -val IsMatchingSignatureDataVersionAttr : IL.ILGlobals -> ILVersionInfo -> ILAttribute -> bool +val IsMatchingSignatureDataVersionAttr : IL.ILGlobals -> ILVersionInfo -> ILAttribute -> bool val mkCompilationMappingAttr : TcGlobals -> int -> ILAttribute val mkCompilationMappingAttrWithSeqNum : TcGlobals -> int -> int -> ILAttribute + + val mkCompilationMappingAttrWithVariantNumAndSeqNum : TcGlobals -> int -> int -> int -> ILAttribute + val mkCompilationMappingAttrForQuotationResource : TcGlobals -> string * ILTypeRef list -> ILAttribute + val mkCompilationArgumentCountsAttr : TcGlobals -> int list -> ILAttribute + val mkCompilationSourceNameAttr : TcGlobals -> string -> ILAttribute + val mkSignatureDataVersionAttr : TcGlobals -> ILVersionInfo -> ILAttribute + val mkCompilerGeneratedAttr : TcGlobals -> int -> ILAttribute //------------------------------------------------------------------------- @@ -1442,16 +2056,23 @@ val mkCompilerGeneratedAttr : TcGlobals -> int -> ILAtt //------------------------------------------------------------------------- val isInByrefTy : TcGlobals -> TType -> bool + val isOutByrefTy : TcGlobals -> TType -> bool + val isByrefTy : TcGlobals -> TType -> bool val isNativePtrTy : TcGlobals -> TType -> bool + val destByrefTy : TcGlobals -> TType -> TType + val destNativePtrTy : TcGlobals -> TType -> TType val isByrefTyconRef : TcGlobals -> TyconRef -> bool + val isByrefLikeTyconRef : TcGlobals -> range -> TyconRef -> bool + val isSpanLikeTyconRef : TcGlobals -> range -> TyconRef -> bool + val isByrefLikeTy : TcGlobals -> range -> TType -> bool /// Check if the type is a byref-like but not a byref. @@ -1462,26 +2083,37 @@ val isSpanLikeTy : TcGlobals -> range -> TType -> bool //------------------------------------------------------------------------- val isRefTupleExpr : Expr -> bool + val tryDestRefTupleExpr : Expr -> Exprs val mkAnyTupledTy : TcGlobals -> TupInfo -> TType list -> TType val mkAnyTupled : TcGlobals -> range -> TupInfo -> Exprs -> TType list -> Expr + val mkRefTupled : TcGlobals -> range -> Exprs -> TType list -> Expr + val mkRefTupledNoTypes : TcGlobals -> range -> Exprs -> Expr + val mkRefTupledTy : TcGlobals -> TType list -> TType + val mkRefTupledVarsTy : TcGlobals -> Val list -> TType + val mkRefTupledVars : TcGlobals -> range -> Val list -> Expr + val mkMethodTy : TcGlobals -> TType list list -> TType -> TType -//------------------------------------------------------------------------- -// -//------------------------------------------------------------------------- +val mkAnyAnonRecdTy : TcGlobals -> AnonRecdTypeInfo -> TType list -> TType + +val mkAnonRecd : TcGlobals -> range -> AnonRecdTypeInfo -> Exprs -> TType list -> Expr val AdjustValForExpectedArity : TcGlobals -> range -> ValRef -> ValUseFlag -> ValReprInfo -> Expr * TType + val AdjustValToTopVal : Val -> ParentRef -> ValReprInfo -> unit + val LinearizeTopMatch : TcGlobals -> ParentRef -> Expr -> Expr + val AdjustPossibleSubsumptionExpr : TcGlobals -> Expr -> Exprs -> (Expr * Exprs) option + val NormalizeAndAdjustPossibleSubsumptionExprs : TcGlobals -> Expr -> Expr //------------------------------------------------------------------------- @@ -1491,28 +2123,35 @@ val NormalizeAndAdjustPossibleSubsumptionExprs : TcGlobals -> Expr -> Expr val buildAccessPath : CompilationPath option -> string val XmlDocArgsEnc : TcGlobals -> Typars * Typars -> TType list -> string + val XmlDocSigOfVal : TcGlobals -> string -> Val -> string + val XmlDocSigOfUnionCase : (string list -> string) + val XmlDocSigOfField : (string list -> string) + val XmlDocSigOfProperty : (string list -> string) + val XmlDocSigOfTycon : (string list -> string) + val XmlDocSigOfSubModul : (string list -> string) + val XmlDocSigOfEntity : EntityRef -> string //--------------------------------------------------------------------------- // Resolve static optimizations //------------------------------------------------------------------------- + type StaticOptimizationAnswer = | Yes = 1y | No = -1y | Unknown = 0y + val DecideStaticOptimizations : TcGlobals -> StaticOptimization list -> StaticOptimizationAnswer -val mkStaticOptimizationExpr : TcGlobals -> StaticOptimization list * Expr * Expr * range -> Expr -//--------------------------------------------------------------------------- -// Build for loops -//------------------------------------------------------------------------- +val mkStaticOptimizationExpr : TcGlobals -> StaticOptimization list * Expr * Expr * range -> Expr +/// Build for loops val mkFastForLoop : TcGlobals -> SequencePointInfoForForLoop * range * Val * Expr * bool * Expr * Expr -> Expr //--------------------------------------------------------------------------- @@ -1523,12 +2162,15 @@ type ActivePatternElemRef with member Name : string val TryGetActivePatternInfo : ValRef -> PrettyNaming.ActivePatternInfo option + val mkChoiceCaseRef : TcGlobals -> range -> int -> int -> UnionCaseRef type PrettyNaming.ActivePatternInfo with + member Names : string list member ResultType : TcGlobals -> range -> TType list -> TType + member OverallType : TcGlobals -> range -> TType -> TType list -> TType val doesActivePatternHaveFreeTypars : TcGlobals -> ValRef -> bool @@ -1539,61 +2181,84 @@ val doesActivePatternHaveFreeTypars : TcGlobals -> ValRef -> bool [] type ExprRewritingEnv = - {PreIntercept: ((Expr -> Expr) -> Expr -> Expr option) option; - PostTransform: Expr -> Expr option; - PreInterceptBinding: ((Expr -> Expr) -> Binding -> Binding option) option; - IsUnderQuotations: bool } + { PreIntercept: ((Expr -> Expr) -> Expr -> Expr option) option + PostTransform: Expr -> Expr option + PreInterceptBinding: ((Expr -> Expr) -> Binding -> Binding option) option + IsUnderQuotations: bool } val RewriteExpr : ExprRewritingEnv -> Expr -> Expr + val RewriteImplFile : ExprRewritingEnv -> TypedImplFile -> TypedImplFile val IsGenericValWithGenericContraints: TcGlobals -> Val -> bool type Entity with + member HasInterface : TcGlobals -> TType -> bool + member HasOverride : TcGlobals -> string -> TType list -> bool + member HasMember : TcGlobals -> string -> TType list -> bool type EntityRef with + member HasInterface : TcGlobals -> TType -> bool + member HasOverride : TcGlobals -> string -> TType list -> bool + member HasMember : TcGlobals -> string -> TType list -> bool val (|AttribBitwiseOrExpr|_|) : TcGlobals -> Expr -> (Expr * Expr) option + val (|EnumExpr|_|) : TcGlobals -> Expr -> Expr option + val (|TypeOfExpr|_|) : TcGlobals -> Expr -> TType option + val (|TypeDefOfExpr|_|) : TcGlobals -> Expr -> TType option val EvalLiteralExprOrAttribArg: TcGlobals -> Expr -> Expr + val EvaledAttribExprEquality : TcGlobals -> Expr -> Expr -> bool + val IsSimpleSyntacticConstantExpr: TcGlobals -> Expr -> bool val (|ConstToILFieldInit|_|): Const -> ILFieldInit option val (|ExtractAttribNamedArg|_|) : string -> AttribNamedArg list -> AttribExpr option + val (|AttribInt32Arg|_|) : AttribExpr -> int32 option + val (|AttribInt16Arg|_|) : AttribExpr -> int16 option + val (|AttribBoolArg|_|) : AttribExpr -> bool option + val (|AttribStringArg|_|) : AttribExpr -> string option + val (|Int32Expr|_|) : Expr -> int32 option /// 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 (|SpecialEquatableHeadType|_|) : TcGlobals -> TType -> TType list option + val (|SpecialNotEquatableHeadType|_|) : TcGlobals -> TType -> unit option type OptimizeForExpressionOptions = OptimizeIntRangesOnly | OptimizeAllForExpressions + val DetectAndOptimizeForExpression : TcGlobals -> OptimizeForExpressionOptions -> Expr -> Expr val TryEliminateDesugaredConstants : TcGlobals -> range -> Const -> Expr option val MemberIsExplicitImpl : TcGlobals -> ValMemberInfo -> bool + val ValIsExplicitImpl : TcGlobals -> Val -> bool + val ValRefIsExplicitImpl : TcGlobals -> ValRef -> bool val (|LinearMatchExpr|_|) : Expr -> (SequencePointInfoForBinding * range * DecisionTree * DecisionTreeTarget * Expr * SequencePointInfoForTarget * range * TType) option + val rebuildLinearMatchExpr : (SequencePointInfoForBinding * range * DecisionTree * DecisionTreeTarget * Expr * SequencePointInfoForTarget * range * TType) -> Expr val mkCoerceIfNeeded : TcGlobals -> tgtTy: TType -> srcTy: TType -> Expr -> Expr diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 3f184165ad..14998cc882 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -36,16 +36,16 @@ type PickledDataWithReferences<'rawData> = { /// The data that uses a collection of CcuThunks internally RawData: 'rawData /// The assumptions that need to be fixed up - FixupThunks: list } + FixupThunks: CcuThunk [] } member x.Fixup loader = - x.FixupThunks |> List.iter (fun reqd -> reqd.Fixup(loader reqd.AssemblyName)) + x.FixupThunks |> Array.iter (fun reqd -> reqd.Fixup(loader reqd.AssemblyName)) x.RawData /// Like Fixup but loader may return None, in which case there is no fixup. member x.OptionalFixup loader = x.FixupThunks - |> List.iter(fun reqd-> + |> Array.iter(fun reqd-> match loader reqd.AssemblyName with | Some(loaded) -> reqd.Fixup(loaded) | None -> reqd.FixupOrphaned() ) @@ -113,9 +113,10 @@ type WriterState = { os: ByteBuffer oscope: CcuThunk occus: Table - otycons: NodeOutTable + oentities: NodeOutTable otypars: NodeOutTable ovals: NodeOutTable + oanoninfos: NodeOutTable ostrings: Table opubpaths: Table onlerefs: Table @@ -144,9 +145,10 @@ type ReaderState = { is: ByteStream iilscope: ILScopeRef iccus: InputTable - itycons: NodeInTable + ientities: NodeInTable itypars: NodeInTable ivals: NodeInTable + ianoninfos: NodeInTable istrings: InputTable ipubpaths: InputTable inlerefs: InputTable @@ -317,10 +319,13 @@ let u_used_space1 f st = let inline u_tup2 p1 p2 (st:ReaderState) = let a = p1 st in let b = p2 st in (a,b) + let inline u_tup3 p1 p2 p3 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in (a,b,c) + let inline u_tup4 p1 p2 p3 p4 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in (a,b,c,d) + let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = let a = p1 st let b = p2 st @@ -328,32 +333,41 @@ let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = let d = p4 st let e = p5 st (a,b,c,d,e) + let inline u_tup6 p1 p2 p3 p4 p5 p6 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in (a,b,c,d,e,f) + let inline u_tup7 p1 p2 p3 p4 p5 p6 p7 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in (a,b,c,d,e,f,x7) + let inline u_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in (a,b,c,d,e,f,x7,x8) + let inline u_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in (a,b,c,d,e,f,x7,x8,x9) + let inline u_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in (a,b,c,d,e,f,x7,x8,x9,x10) + let inline u_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in (a,b,c,d,e,f,x7,x8,x9,x10,x11) + let inline u_tup12 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12) + let inline u_tup13 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12,x13) + let inline u_tup14 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in @@ -391,7 +405,7 @@ let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (s // ctxt is for debugging let p_osgn_ref (_ctxt:string) (outMap : NodeOutTable<_,_>) x st = let idx = outMap.Table.FindOrAdd (outMap.NodeStamp x) - //if ((idx = 0) && outMap.Name = "otycons") then + //if ((idx = 0) && outMap.Name = "oentities") then // System.Diagnostics.Debug.Assert(false, sprintf "idx %d#%d in table %s has name '%s', was defined at '%s' and is referenced from context %s\n" idx (outMap.NodeStamp x) outMap.Name (outMap.NodeName x) (stringOfRange (outMap.GetRange x)) _ctxt) p_int idx st @@ -447,9 +461,21 @@ let p_array_ext extraf f (x: 'T[]) st = | Some f -> f st p_array_core f x st - -let p_list f x st = p_array f (Array.ofList x) st -let p_list_ext extraf f x st = p_array_ext extraf f (Array.ofList x) st +let p_list_core f (xs: 'T list) st = + for x in xs do + f x 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 n = List.length x + let n = if Option.isSome extraf then n ||| 0x80000000 else n + p_int n st + match extraf with + | None -> () + | Some f -> f st + p_list_core f x st let p_List f (x: 'T list) st = p_list f x st @@ -479,7 +505,7 @@ let private p_lazy_impl p v st = let fixupPos7 = st.os.Position prim_p_int32 0 st let idx1 = st.os.Position - let otyconsIdx1 = st.otycons.Size + let otyconsIdx1 = st.oentities.Size let otyparsIdx1 = st.otypars.Size let ovalsIdx1 = st.ovals.Size // Run the pickler @@ -488,7 +514,7 @@ let private p_lazy_impl p v st = let idx2 = st.os.Position st.os.FixupInt32 fixupPos1 (idx2-idx1) // Determine and fixup the ranges of OSGN nodes defined within the lazy portion - let otyconsIdx2 = st.otycons.Size + let otyconsIdx2 = st.oentities.Size let otyparsIdx2 = st.otypars.Size let ovalsIdx2 = st.ovals.Size st.os.FixupInt32 fixupPos2 otyconsIdx1 @@ -534,8 +560,22 @@ let u_array_ext extraf f st = let arr = u_array_core f (n &&& 0x7FFFFFFF) st extraItem, arr -let u_list f st = Array.toList (u_array f st) -let u_list_ext extra f st = let v, res = u_array_ext extra f st in v, Array.toList res +let u_list_core f n st = + [ for _ in 1..n do + yield f st ] + +let u_list f st = + let n = u_int st + u_list_core f n st +let u_list_ext extra f st = + let n = u_int st + let extraItem = + if n &&& 0x80000000 = 0x80000000 then + Some (extra st) + else + None + let list = u_list_core f (n &&& 0x7FFFFFFF) st + extraItem, list #if FLAT_LIST_AS_LIST #else @@ -558,7 +598,10 @@ let u_array_revi f st = res // 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 = Array.toList (u_array_revi f st) +let u_list_revi f st = + let n = u_int st + [ for i = 0 to n-1 do + yield f st (n-1-i) ] let u_wrap (f: 'U -> 'T) (u : 'U unpickler) : 'T unpickler = (fun st -> f (u st)) @@ -599,7 +642,7 @@ let u_lazy u st = 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.itycons.Get(i)) res done + 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 @@ -692,21 +735,23 @@ let p_nleref x st = p_int (encode_nleref st.occus st.ostrings st.onlerefs st.osc let decode_simpletyp st _ccuTab _stringTab nlerefTab a = TType_app(ERefNonLocal (lookup_nleref st nlerefTab a),[]) let lookup_simpletyp st simpleTyTab x = lookup_uniq st simpleTyTab x let u_encoded_simpletyp st = u_int st +let u_encoded_anoninfo 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) let p_encoded_simpletyp x st = p_int x st +let p_encoded_anoninfo x st = p_int x st let p_simpletyp x st = p_int (encode_simpletyp st.occus st.ostrings st.onlerefs st.osimpletys st.oscope x) st -type sizes = int * int * int let pickleObjWithDanglingCcus inMem file g scope p x = - let ccuNameTab,(sizes: sizes),stringTab,pubpathTab,nlerefTab,simpleTyTab,phase1bytes = + let ccuNameTab,(ntycons, ntypars, nvals, nanoninfos),stringTab,pubpathTab,nlerefTab,simpleTyTab,phase1bytes = let st1 = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus" - otycons=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") + oentities=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") otypars=NodeOutTable<_,_>.Create((fun (tp:Typar) -> tp.Stamp),(fun tp -> tp.DisplayName),(fun tp -> tp.Range),(fun osgn -> osgn),"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.Stamp),(fun _ -> range0),id,"oanoninfos") ostrings=Table<_>.Create "ostrings" onlerefs=Table<_>.Create "onlerefs" opubpaths=Table<_>.Create "opubpaths" @@ -716,19 +761,21 @@ let pickleObjWithDanglingCcus inMem file g scope p x = oInMem=inMem } p x st1 let sizes = - st1.otycons.Size, + st1.oentities.Size, st1.otypars.Size, - st1.ovals.Size + st1.ovals.Size, + st1.oanoninfos.Size st1.occus, sizes, st1.ostrings, st1.opubpaths,st1.onlerefs, st1.osimpletys, st1.os.Close() - let phase2data = (ccuNameTab.AsArray,sizes,stringTab.AsArray,pubpathTab.AsArray,nlerefTab.AsArray,simpleTyTab.AsArray,phase1bytes) + let phase2bytes = let st2 = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus (fake)" - otycons=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") + oentities=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") otypars=NodeOutTable<_,_>.Create((fun (tp:Typar) -> tp.Stamp),(fun tp -> tp.DisplayName),(fun tp -> tp.Range),(fun osgn -> osgn),"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.Stamp),(fun _ -> range0),id,"oanoninfos") ostrings=Table<_>.Create "ostrings (fake)" opubpaths=Table<_>.Create "opubpaths (fake)" onlerefs=Table<_>.Create "onlerefs (fake)" @@ -736,15 +783,21 @@ let pickleObjWithDanglingCcus inMem file g scope p x = oglobals=g ofile=file oInMem=inMem } - p_tup7 - (p_array p_encoded_ccuref) - (p_tup3 p_int p_int p_int) - (p_array p_encoded_string) - (p_array p_encoded_pubpath) - (p_array p_encoded_nleref) - (p_array p_encoded_simpletyp) - p_bytes - phase2data st2 + p_array p_encoded_ccuref ccuNameTab.AsArray st2 + // Add a 4th integer indicated by a negative 1st integer + let z1 = if nanoninfos > 0 then -ntycons-1 else ntycons + p_int z1 st2 + p_tup2 p_int p_int (ntypars, nvals) st2 + if nanoninfos > 0 then + p_int nanoninfos st2 + p_tup5 + (p_array p_encoded_string) + (p_array p_encoded_pubpath) + (p_array p_encoded_nleref) + (p_array p_encoded_simpletyp) + p_bytes + (stringTab.AsArray,pubpathTab.AsArray,nlerefTab.AsArray,simpleTyTab.AsArray,phase1bytes) + st2 st2.os.Close() phase2bytes @@ -760,59 +813,62 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p { is = ByteStream.FromBytes (phase2bytes,0,phase2bytes.Length) iilscope= ilscope iccus= new_itbl "iccus (fake)" [| |] - itycons= NodeInTable<_,_>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",0) + ientities= NodeInTable<_,_>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",0) itypars= NodeInTable<_,_>.Create (Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itypars",0) ivals = NodeInTable<_,_>.Create (Val.NewUnlinked , (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ivals",0) + ianoninfos=NodeInTable<_,_>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ianoninfos",0); istrings = new_itbl "istrings (fake)" [| |] inlerefs = new_itbl "inlerefs (fake)" [| |] ipubpaths = new_itbl "ipubpaths (fake)" [| |] isimpletys = new_itbl "isimpletys (fake)" [| |] ifile=file iILModule = iILModule } - let phase2data = - u_tup7 - (u_array u_encoded_ccuref) - (u_tup3 u_int u_int u_int) - (u_array u_encoded_string) - (u_array u_encoded_pubpath) - (u_array u_encoded_nleref) - (u_array u_encoded_simpletyp) - u_bytes st2 - let ccuNameTab,sizes,stringTab,pubpathTab,nlerefTab,simpleTyTab,phase1bytes = phase2data + let ccuNameTab = u_array u_encoded_ccuref st2 + let z1 = u_int st2 + let ntycons = if z1 < 0 then -z1-1 else z1 + let ntypars, nvals = u_tup2 u_int u_int st2 + let nanoninfos = if z1 < 0 then u_int st2 else 0 + let stringTab,pubpathTab,nlerefTab,simpleTyTab,phase1bytes = + u_tup5 + (u_array u_encoded_string) + (u_array u_encoded_pubpath) + (u_array u_encoded_nleref) + (u_array u_encoded_simpletyp) + u_bytes + st2 let ccuTab = new_itbl "iccus" (Array.map (CcuThunk.CreateDelayed) ccuNameTab) let stringTab = new_itbl "istrings" (Array.map decode_string stringTab) let pubpathTab = new_itbl "ipubpaths" (Array.map (decode_pubpath st2 stringTab) pubpathTab) let nlerefTab = new_itbl "inlerefs" (Array.map (decode_nleref st2 ccuTab stringTab) nlerefTab) - let simpleTyTab = new_itbl "isimpletys" (Array.map (decode_simpletyp st2 ccuTab stringTab nlerefTab) simpleTyTab) - let ((ntycons,ntypars,nvals) : sizes) = sizes + let simpletypTab = new_itbl "simpleTyTab" (Array.map (decode_simpletyp st2 ccuTab stringTab nlerefTab) simpleTyTab) let data = let st1 = { is = ByteStream.FromBytes (phase1bytes,0,phase1bytes.Length) iccus= ccuTab iilscope= ilscope - itycons= NodeInTable<_,_>.Create(Tycon.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",ntycons) + ientities= NodeInTable<_,_>.Create(Tycon.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",ntycons) itypars= NodeInTable<_,_>.Create(Typar.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itypars",ntypars) ivals= NodeInTable<_,_>.Create(Val.NewUnlinked ,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ivals",nvals) + ianoninfos=NodeInTable<_,_>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ianoninfos",nanoninfos); istrings = stringTab ipubpaths = pubpathTab inlerefs = nlerefTab - isimpletys = simpleTyTab + isimpletys = simpletypTab ifile=file iILModule = iILModule } let res = u st1 -#if LAZY_UNPICKLE -#else - check ilscope st1.itycons +#if !LAZY_UNPICKLE + check ilscope st1.ientities check ilscope st1.ivals check ilscope st1.itypars #endif res - {RawData=data; FixupThunks=Array.toList ccuTab.itbl_rows } + {RawData=data; FixupThunks=ccuTab.itbl_rows } //========================================================================= -// PART II *) +// PART II //========================================================================= //--------------------------------------------------------------------------- @@ -823,7 +879,9 @@ let p_ILPublicKey x st = match x with | PublicKey b -> p_byte 0 st; p_bytes b st | PublicKeyToken b -> p_byte 1 st; p_bytes b st + let p_ILVersion x st = p_tup4 p_uint16 p_uint16 p_uint16 p_uint16 x st + let p_ILModuleRef (x:ILModuleRef) st = p_tup3 p_string p_bool (p_option p_bytes) (x.Name,x.HasMetadata,x.Hash) st @@ -947,8 +1005,11 @@ let rec u_ILType st = | 7 -> u_uint16 st |> mkILTyvarTy | 8 -> u_tup3 u_bool u_ILTypeRef u_ILType st |> ILType.Modified | _ -> ufailwith st "u_ILType" + and u_ILTypes st = u_list u_ILType st + and u_ILCallSig = u_wrap (fun (a,b,c) -> {CallingConv=a; ArgTypes=b; ReturnType=c}) (u_tup3 u_ILCallConv u_ILTypes u_ILType) + and u_ILTypeSpec st = let a,b = u_tup2 u_ILTypeRef u_ILTypes st in ILTypeSpec.Create(a,b) @@ -1244,7 +1305,7 @@ let p_local_item_ref ctxt tab st = p_osgn_ref ctxt tab st let p_tcref ctxt (x:EntityRef) st = match x with - | ERefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.otycons x st + | ERefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.oentities x st | ERefNonLocal x -> p_byte 1 st; p_nleref x st let p_ucref (UCRef(a,b)) st = p_tup2 (p_tcref "ucref") p_string (a,b) st @@ -1256,7 +1317,7 @@ let u_local_item_ref tab st = u_osgn_ref tab st let u_tcref st = let tag = u_byte st match tag with - | 0 -> u_local_item_ref st.itycons st |> ERefLocal + | 0 -> u_local_item_ref st.ientities st |> ERefLocal | 1 -> u_nleref st |> ERefNonLocal | _ -> ufailwith st "u_item_ref" @@ -1374,6 +1435,12 @@ let u_MemberFlags st = let fill_u_Expr_hole,u_expr_fwd = u_hole() let fill_p_Expr_hole,p_expr_fwd = p_hole() +let p_anonInfo_data (anonInfo: AnonRecdTypeInfo) st = + p_tup3 p_ccuref p_bool (p_array p_ident) (anonInfo.Assembly, evalTupInfoIsStruct anonInfo.TupInfo, anonInfo.SortedIds) st + +let p_anonInfo x st = + p_osgn_decl st.oanoninfos p_anonInfo_data x st + let p_trait_sln sln st = match sln with | ILMethSln(a,b,c,d) -> @@ -1386,10 +1453,20 @@ let p_trait_sln sln st = p_byte 3 st; p_expr_fwd expr st | FSRecdFieldSln(a,b,c) -> p_byte 4 st; p_tup3 p_tys p_rfref p_bool (a,b,c) st + | FSAnonRecdFieldSln(a, b, c) -> + p_byte 5 st; p_tup3 p_anonInfo p_tys p_int (a,b,c) 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) st +let u_anonInfo_data st = + let (ccu, info, nms) = u_tup3 u_ccuref u_bool (u_array u_ident) st + AnonRecdTypeInfo.Create (ccu, mkTupInfo info, nms) + +let u_anonInfo st = + u_osgn_decl st.ianoninfos u_anonInfo_data st + // We have to store trait solutions since they can occur in optimization data let u_trait_sln st = let tag = u_byte st @@ -1407,6 +1484,9 @@ let u_trait_sln st = | 4 -> let (a,b,c) = u_tup3 u_tys u_rfref u_bool st FSRecdFieldSln(a,b,c) + | 5 -> + let (a,b,c) = u_tup3 u_anonInfo u_tys u_int st + FSAnonRecdFieldSln(a, b, c) | _ -> ufailwith st "u_trait_sln" let u_trait st = @@ -1417,7 +1497,9 @@ let u_trait st = let p_rational q st = p_int32 (GetNumerator q) st; p_int32 (GetDenominator q) st let p_measure_con tcref st = p_byte 0 st; p_tcref "measure" tcref st + let p_measure_var v st = p_byte 3 st; p_tpref v st + let p_measure_one = p_byte 4 // Pickle a unit-of-measure variable or constructor @@ -1527,7 +1609,6 @@ let p_tyar_spec_data (x:Typar) st = p_int64 p_tyar_constraints p_xmldoc - (x.typar_id,x.Attribs,int64 x.typar_flags.PickledBits,x.Constraints,x.XmlDoc) st let p_tyar_spec (x:Typar) st = @@ -1585,7 +1666,12 @@ let _ = fill_p_ty2 (fun isStructThisArgPos ty st -> // Note, the "this" argument may be found in the body of a generic forall type, so propagate the isStructThisArgPos value p_ty2 isStructThisArgPos r st | TType_measure unt -> p_byte 6 st; p_measure_expr unt st - | TType_ucase (uc,tinst) -> p_byte 7 st; p_tup2 p_ucref p_tys (uc,tinst) st) + | TType_ucase (uc,tinst) -> p_byte 7 st; p_tup2 p_ucref p_tys (uc,tinst) st + // p_byte 8 taken by TType_tuple above + | TType_anon (anonInfo, l) -> + p_byte 9 st + p_anonInfo anonInfo st + p_tys l st) let _ = fill_u_ty (fun st -> let tag = u_byte st @@ -1599,7 +1685,8 @@ let _ = fill_u_ty (fun st -> | 6 -> let unt = u_measure_expr st in TType_measure unt | 7 -> let uc = u_ucref st in let tinst = u_tys st in TType_ucase (uc,tinst) | 8 -> let l = u_tys st in TType_tuple (tupInfoStruct, l) - | _ -> ufailwith st "u_ty") + | 9 -> let anonInfo = u_anonInfo st in let l = u_tys st in TType_anon (anonInfo, l) + | _ -> ufailwith st "u_typ") let fill_p_binds,p_binds = p_hole() @@ -1675,7 +1762,7 @@ and 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. match x with | TRecdRepr fs -> p_byte 1 st; p_byte 0 st; p_rfield_table fs st; false - | TUnionRepr x -> p_byte 1 st; p_byte 1 st; p_list p_unioncase_spec (Array.toList x.CasesTable.CasesByIndex) st; false + | TUnionRepr x -> p_byte 1 st; p_byte 1 st; p_array p_unioncase_spec (x.CasesTable.CasesByIndex) st; false | TAsmRepr ilty -> p_byte 1 st; p_byte 2 st; p_ILType ilty st; false | TFSharpObjectRepr r -> p_byte 1 st; p_byte 3 st; p_tycon_objmodel_data r st; false | TMeasureableRepr ty -> p_byte 1 st; p_byte 4 st; p_ty ty st; false @@ -1717,7 +1804,7 @@ and p_exnc_repr x st = | TExnFresh x -> p_byte 2 st; p_rfield_table x st | TExnNone -> p_byte 3 st -and p_exnc_spec x st = p_tycon_spec x st +and p_exnc_spec x st = p_entity_spec x st and p_access (TAccess n) st = p_list p_cpath n st @@ -1735,7 +1822,7 @@ and p_recdfield_spec x st = p_access x.rfield_access st and p_rfield_table x st = - p_list p_recdfield_spec (Array.toList x.FieldsByIndex) st + p_array p_recdfield_spec (x.FieldsByIndex) st and p_entity_spec_data (x:Entity) st = p_tyar_specs (x.entity_typars.Force(x.entity_range)) st @@ -1789,7 +1876,7 @@ and p_tcaug p st = p.tcaug_abstract, space) st -and p_tycon_spec x st = p_osgn_decl st.otycons p_entity_spec_data x st +and p_entity_spec x st = p_osgn_decl st.oentities p_entity_spec_data x st and p_parentref x st = match x with @@ -1873,7 +1960,7 @@ and p_modul_typ (x: ModuleOrNamespaceType) st = p_tup3 p_istype (p_qlist p_Val) - (p_qlist p_tycon_spec) + (p_qlist p_entity_spec) (x.ModuleOrNamespaceKind,x.AllValsAndMembers,x.AllEntities) st @@ -1958,7 +2045,7 @@ and u_exnc_repr st = | 3 -> TExnNone | _ -> ufailwith st "u_exnc_repr" -and u_exnc_spec st = u_tycon_spec st +and u_exnc_spec st = u_entity_spec st and u_access st = match u_list u_cpath st with @@ -2065,8 +2152,8 @@ and u_tcaug st = tcaug_closed=true tcaug_abstract=g} -and u_tycon_spec st = - u_osgn_decl st.itycons u_entity_spec_data st +and u_entity_spec st = + u_osgn_decl st.ientities u_entity_spec_data st and u_parentref st = let tag = u_byte st @@ -2184,7 +2271,7 @@ and u_modul_typ st = u_tup3 u_istype (u_qlist u_Val) - (u_qlist u_tycon_spec) st + (u_qlist u_entity_spec) st ModuleOrNamespaceType(x1,x3,x5) @@ -2340,6 +2427,10 @@ and p_op x st = | TOp.UnionCaseFieldGetAddr (a,b, _) -> p_byte 28 st; p_tup2 p_ucref p_int (a,b) st // Note tag byte 29 is taken for struct tuples, see above // Note tag byte 30 is taken for struct tuples, see above + (* 29: TOp.Tuple when evalTupInfoIsStruct tupInfo = true *) + (* 30: TOp.TupleFieldGet when evalTupInfoIsStruct tupInfo = true *) + | TOp.AnonRecd info -> p_byte 31 st; p_anonInfo info st + | TOp.AnonRecdGet (info, n) -> p_byte 32 st; p_anonInfo info st; p_int n st | TOp.Goto _ | TOp.Label _ | TOp.Return -> failwith "unexpected backend construct in pickled TAST" and u_op st = @@ -2406,6 +2497,11 @@ and u_op st = | 29 -> TOp.Tuple tupInfoStruct | 30 -> let a = u_int st TOp.TupleFieldGet (tupInfoStruct, a) + | 31 -> let info = u_anonInfo st + TOp.AnonRecd (info) + | 32 -> let info = u_anonInfo st + let n = u_int st + TOp.AnonRecdGet (info, n) | _ -> ufailwith st "u_op" and p_expr expr st = @@ -2559,11 +2655,12 @@ let _ = fill_u_Vals (u_list u_Val) // Pickle/unpickle F# interface data //--------------------------------------------------------------------------- -let pickleModuleOrNamespace mspec st = p_tycon_spec mspec st +let pickleModuleOrNamespace mspec st = p_entity_spec mspec st + let pickleCcuInfo (minfo: PickledCcuInfo) st = p_tup4 pickleModuleOrNamespace p_string p_bool (p_space 3) (minfo.mspec, minfo.compileTimeWorkingDir, minfo.usesQuotations,()) st -let unpickleModuleOrNamespace st = u_tycon_spec st +let unpickleModuleOrNamespace st = u_entity_spec st let unpickleCcuInfo st = let a,b,c,_space = u_tup4 unpickleModuleOrNamespace u_string u_bool (u_space 3) st diff --git a/src/fsharp/TastPickle.fsi b/src/fsharp/TastPickle.fsi index 4bf6aca3ef..97eab4b30b 100644 --- a/src/fsharp/TastPickle.fsi +++ b/src/fsharp/TastPickle.fsi @@ -18,7 +18,7 @@ type PickledDataWithReferences<'RawData> = { /// The data that uses a collection of CcuThunks internally RawData: 'RawData /// The assumptions that need to be fixed up - FixupThunks: list } + FixupThunks: CcuThunk [] } member Fixup : (CcuReference -> CcuThunk) -> 'RawData /// Like Fixup but loader may return None, in which case there is no fixup. diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index d6fb7cd3c7..85f12f8b3f 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -255,7 +255,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let path, typeName = splitILTypeName nm let scoref = match tryFindSysTypeCcu path typeName with - | None -> ILScopeRef.Assembly (mkSimpleAssRef (dummyAssemblyNameCarryingUsefulErrorInformation path typeName)) + | None -> ILScopeRef.Assembly (mkSimpleAssemblyRef (dummyAssemblyNameCarryingUsefulErrorInformation path typeName)) | Some ccu -> ccu.ILScopeRef mkILTyRef (scoref, nm) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index badd093e4d..a20b3743ca 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -504,8 +504,8 @@ type cenv = /// Used to resolve names nameResolver: NameResolver - /// The set of active conditional defines - conditionalDefines: string list + /// The set of active conditional defines. The value is None when conditional erasure is disabled in tooling. + conditionalDefines: string list option isInternalTestSpanStackReferring: bool } @@ -707,38 +707,72 @@ let UnifyRefTupleType contextInfo cenv denv m ty ps = AddCxTypeEqualsType contextInfo denv cenv.css m ty (TType_tuple (tupInfoRef, ptys)) ptys -/// Optimized unification routine that avoids creating new inference -/// variables unnecessarily -let UnifyStructTupleType contextInfo cenv denv m ty ps = - let ptys = - if isStructTupleTy cenv.g ty then - let ptys = destStructTupleTy cenv.g ty - if List.length ps = List.length ptys then ptys - else NewInferenceTypes ps - else NewInferenceTypes ps - AddCxTypeEqualsType contextInfo denv cenv.css m ty (TType_tuple (tupInfoStruct, ptys)) +/// Allow the inference of structness from the known type, e.g. +/// let (x : struct (int * int)) = (3,4) +let UnifyTupleTypeAndInferCharacteristics contextInfo cenv denv m knownTy isExplicitStruct ps = + let tupInfo, ptys = + if isAnyTupleTy cenv.g knownTy then + let tupInfo, ptys = destAnyTupleTy cenv.g knownTy + let tupInfo = (if isExplicitStruct then tupInfoStruct else tupInfo) + let ptys = + if List.length ps = List.length ptys then ptys + else NewInferenceTypes ps + tupInfo, ptys + else + mkTupInfo isExplicitStruct, NewInferenceTypes ps + + let contextInfo = + match contextInfo with + | ContextInfo.RecordFields -> ContextInfo.TupleInRecordFields + | _ -> contextInfo + + let ty2 = TType_tuple (tupInfo, ptys) + AddCxTypeEqualsType contextInfo denv cenv.css m knownTy ty2 + tupInfo, ptys + +// Allow inference of assembly-affinity and structness from the known type - even from another assembly. This is a rule of +// the language design and allows effective cross-assembly use of anonymous types in some limited circumstances. +let UnifyAnonRecdTypeAndInferCharacteristics contextInfo cenv denv m ty isExplicitStruct unsortedNames = + let anonInfo, ptys = + match tryDestAnonRecdTy cenv.g ty with + | ValueSome (anonInfo, ptys) -> + // Note: use the assembly of the known type, not the current assembly + // Note: use the structness of the known type, unless explicit + // Note: use the names of our type, since they are always explicit + let tupInfo = (if isExplicitStruct then tupInfoStruct else anonInfo.TupInfo) + let anonInfo = AnonRecdTypeInfo.Create(anonInfo.Assembly, tupInfo, unsortedNames) + let ptys = + if List.length ptys = Array.length unsortedNames then ptys + else NewInferenceTypes (Array.toList anonInfo.SortedNames) + anonInfo, ptys + | ValueNone -> + // Note: no known anonymous record type - use our assembly + let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, mkTupInfo isExplicitStruct, unsortedNames) + anonInfo, NewInferenceTypes (Array.toList anonInfo.SortedNames) + let ty2 = TType_anon (anonInfo, ptys) + AddCxTypeEqualsType contextInfo denv cenv.css m ty ty2 + anonInfo, ptys - ptys /// Optimized unification routine that avoids creating new inference /// variables unnecessarily let UnifyFunctionTypeUndoIfFailed cenv denv m ty = match tryDestFunTy cenv.g ty with - | None -> + | ValueNone -> let domainTy = NewInferenceType () let resultTy = NewInferenceType () if AddCxTypeEqualsTypeUndoIfFailed denv cenv.css m ty (domainTy --> resultTy) then - Some(domainTy, resultTy) + ValueSome(domainTy, resultTy) else - None + ValueNone | r -> r /// Optimized unification routine that avoids creating new inference /// variables unnecessarily let UnifyFunctionType extraInfo cenv denv mFunExpr ty = match UnifyFunctionTypeUndoIfFailed cenv denv mFunExpr ty with - | Some res -> res - | None -> + | ValueSome res -> res + | ValueNone -> match extraInfo with | Some argm -> error (NotAFunction(denv, ty, mFunExpr, argm)) | None -> error (FunctionExpected(denv, ty, mFunExpr)) @@ -1507,7 +1541,7 @@ let MakeAndPublishBaseVal cenv env baseIdOpt ty = let InstanceMembersNeedSafeInitCheck cenv m thisTy = ExistsInEntireHierarchyOfType - (fun ty -> not (isStructTy cenv.g ty) && (match tryDestAppTy cenv.g ty with Some tcref when tcref.HasSelfReferentialConstructor -> true | _ -> false)) + (fun ty -> not (isStructTy cenv.g ty) && (match tryDestAppTy cenv.g ty with ValueSome tcref when tcref.HasSelfReferentialConstructor -> true | _ -> false)) cenv.g cenv.amap m @@ -1901,7 +1935,7 @@ let FreshenAbstractSlot g amap m synTyparDecls absMethInfo = isNil synTypars - let (CompiledSig (argtys, retTy, fmtps, _)) = CompiledSigOfMeth g amap m absMethInfo + let (CompiledSig (argTys, retTy, fmtps, _)) = CompiledSigOfMeth g amap m absMethInfo // If the virtual method is a generic method then copy its type parameters let typarsFromAbsSlot, typarInstFromAbsSlot, _ = @@ -1911,7 +1945,7 @@ let FreshenAbstractSlot g amap m synTyparDecls absMethInfo = ConstraintSolver.FreshenAndFixupTypars m rigid ttps ttinst fmtps // Work out the required type of the member - let argTysFromAbsSlot = argtys |> List.mapSquared (instType typarInstFromAbsSlot) + let argTysFromAbsSlot = argTys |> List.mapSquared (instType typarInstFromAbsSlot) let retTyFromAbsSlot = retTy |> GetFSharpViewOfReturnType g |> instType typarInstFromAbsSlot typarsFromAbsSlotAreRigid, typarsFromAbsSlot, argTysFromAbsSlot, retTyFromAbsSlot @@ -1923,6 +1957,7 @@ let FreshenAbstractSlot g amap m synTyparDecls absMethInfo = let BuildFieldMap cenv env isPartial ty flds m = let ad = env.eAccessRights if isNil flds then invalidArg "flds" "BuildFieldMap" + let fldCount = flds.Length let frefSets = let allFields = flds |> List.map (fun ((_, ident), _) -> ident) @@ -1942,7 +1977,7 @@ let BuildFieldMap cenv env isPartial ty flds m = warning (Error(FSComp.SR.tcFieldsDoNotDetermineUniqueRecordType(), m)) // try finding a record type with the same number of fields as the ones that are given. - match tcrefs |> List.tryFind (fun tc -> tc.TrueFieldsAsList.Length = flds.Length) with + match tcrefs |> List.tryFind (fun tc -> tc.TrueFieldsAsList.Length = fldCount) with | Some tcref -> tcref | _ -> // OK, there isn't a unique, good type dictated by the intersection for the field refs. @@ -2011,20 +2046,20 @@ let ApplyUnionCaseOrExnTypesForPat m cenv env overallTy c = ApplyUnionCaseOrExn ((fun (a, b) mArgs args -> TPat_unioncase(a, b, args, unionRanges m mArgs)), (fun a mArgs args -> TPat_exnconstr(a, args, unionRanges m mArgs))) m cenv env overallTy c -let UnionCaseOrExnCheck (env: TcEnv) nargtys nargs m = - if nargs <> nargtys then error (UnionCaseWrongArguments(env.DisplayEnv, nargtys, nargs, m)) +let UnionCaseOrExnCheck (env: TcEnv) numArgTys numArgs m = + if numArgs <> numArgTys then error (UnionCaseWrongArguments(env.DisplayEnv, numArgTys, numArgs, m)) let TcUnionCaseOrExnField cenv (env: TcEnv) ty1 m c n funcs = let ad = env.eAccessRights - let mkf, argtys, _argNames = + let mkf, argTys, _argNames = match ResolvePatternLongIdent cenv.tcSink cenv.nameResolver AllIdsOK false m ad env.eNameResEnv TypeNameResolutionInfo.Default c with | (Item.UnionCase _ | Item.ExnCase _) as item -> ApplyUnionCaseOrExn funcs m cenv env ty1 item | _ -> error(Error(FSComp.SR.tcUnknownUnion(), m)) - let argstysLength = List.length argtys + let argstysLength = List.length argTys if n >= argstysLength then error (UnionCaseWrongNumberOfArgs(env.DisplayEnv, argstysLength, n, m)) - let ty2 = List.item n argtys + let ty2 = List.item n argTys mkf, ty2 //------------------------------------------------------------------------- @@ -2204,11 +2239,11 @@ module GeneralizationHelpers = let lhsConstraintTypars = allUntupledArgTys |> List.collect (fun ty -> match tryDestTyparTy cenv.g ty with - | Some tp -> + | ValueSome tp -> match relevantUniqueSubtypeConstraint tp with | Some cxty -> freeInTypeLeftToRight cenv.g false cxty | None -> [] - | None -> []) + | _ -> []) let IsCondensationTypar (tp:Typar) = // A condensation typar may not a user-generated type variable nor has it been unified with any user type variable @@ -2220,7 +2255,7 @@ module GeneralizationHelpers = // A condensation typar can't be used in the constraints of any candidate condensation typars not (ListSet.contains typarEq tp lhsConstraintTypars) && // A condensation typar must occur precisely once in tyIJ, and must not occur free in any other tyIJ - (match allUntupledArgTysWithFreeVars |> List.partition (fun (ty, _) -> match tryDestTyparTy cenv.g ty with Some destTypar -> typarEq destTypar tp | _ -> false) with + (match allUntupledArgTysWithFreeVars |> List.partition (fun (ty, _) -> match tryDestTyparTy cenv.g ty with ValueSome destTypar -> typarEq destTypar tp | _ -> false) with | [_], rest -> not (rest |> List.exists (fun (_, fvs) -> ListSet.contains typarEq tp fvs)) | _ -> false) @@ -2923,54 +2958,54 @@ let MakeApplicableExprWithFlex cenv (env: TcEnv) expr = /// Checks, warnings and constraint assertions for downcasts -let TcRuntimeTypeTest isCast isOperator cenv denv m tgty srcTy = - if TypeDefinitelySubsumesTypeNoCoercion 0 cenv.g cenv.amap m tgty srcTy then +let TcRuntimeTypeTest isCast isOperator cenv denv m tgtTy srcTy = + if TypeDefinitelySubsumesTypeNoCoercion 0 cenv.g cenv.amap m tgtTy srcTy then warning(TypeTestUnnecessary(m)) if isTyparTy cenv.g srcTy && not (destTyparTy cenv.g srcTy).IsCompatFlex then - error(IndeterminateRuntimeCoercion(denv, srcTy, tgty, m)) + error(IndeterminateRuntimeCoercion(denv, srcTy, tgtTy, m)) if isSealedTy cenv.g srcTy then error(RuntimeCoercionSourceSealed(denv, srcTy, m)) - if isSealedTy cenv.g tgty || isTyparTy cenv.g tgty || not (isInterfaceTy cenv.g srcTy) then + if isSealedTy cenv.g tgtTy || isTyparTy cenv.g tgtTy || not (isInterfaceTy cenv.g srcTy) then if isCast then - AddCxTypeMustSubsumeType (ContextInfo.RuntimeTypeTest isOperator) denv cenv.css m NoTrace srcTy tgty + AddCxTypeMustSubsumeType (ContextInfo.RuntimeTypeTest isOperator) denv cenv.css m NoTrace srcTy tgtTy else - AddCxTypeMustSubsumeType ContextInfo.NoContext denv cenv.css m NoTrace srcTy tgty + AddCxTypeMustSubsumeType ContextInfo.NoContext denv cenv.css m NoTrace srcTy tgtTy - if isErasedType cenv.g tgty then + if isErasedType cenv.g tgtTy then if isCast then - warning(Error(FSComp.SR.tcTypeCastErased(NicePrint.minimalStringOfType denv tgty, NicePrint.minimalStringOfType denv (stripTyEqnsWrtErasure EraseAll cenv.g tgty)), m)) + warning(Error(FSComp.SR.tcTypeCastErased(NicePrint.minimalStringOfType denv tgtTy, NicePrint.minimalStringOfType denv (stripTyEqnsWrtErasure EraseAll cenv.g tgtTy)), m)) else - error(Error(FSComp.SR.tcTypeTestErased(NicePrint.minimalStringOfType denv tgty, NicePrint.minimalStringOfType denv (stripTyEqnsWrtErasure EraseAll cenv.g tgty)), m)) + error(Error(FSComp.SR.tcTypeTestErased(NicePrint.minimalStringOfType denv tgtTy, NicePrint.minimalStringOfType denv (stripTyEqnsWrtErasure EraseAll cenv.g tgtTy)), m)) else - getErasedTypes cenv.g tgty |> + getErasedTypes cenv.g tgtTy |> List.iter (fun ety -> if isMeasureTy cenv.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 cenv.g ety)), m))) /// Checks, warnings and constraint assertions for upcasts -let TcStaticUpcast cenv denv m tgty srcTy = - if isTyparTy cenv.g tgty then - if not (destTyparTy cenv.g tgty).IsCompatFlex then - error(IndeterminateStaticCoercion(denv, srcTy, tgty, m)) +let TcStaticUpcast cenv denv m tgtTy srcTy = + if isTyparTy cenv.g tgtTy then + if not (destTyparTy cenv.g tgtTy).IsCompatFlex then + error(IndeterminateStaticCoercion(denv, srcTy, tgtTy, m)) //else warning(UpcastUnnecessary(m)) - if isSealedTy cenv.g tgty && not (isTyparTy cenv.g tgty) then - warning(CoercionTargetSealed(denv, tgty, m)) + if isSealedTy cenv.g tgtTy && not (isTyparTy cenv.g tgtTy) then + warning(CoercionTargetSealed(denv, tgtTy, m)) - if typeEquiv cenv.g srcTy tgty then + if typeEquiv cenv.g srcTy tgtTy then warning(UpcastUnnecessary(m)) - AddCxTypeMustSubsumeType ContextInfo.NoContext denv cenv.css m NoTrace tgty srcTy + AddCxTypeMustSubsumeType ContextInfo.NoContext denv cenv.css m NoTrace tgtTy srcTy let BuildPossiblyConditionalMethodCall cenv env isMutable m isProp minfo valUseFlags minst objArgs args = let conditionalCallDefineOpt = TryFindMethInfoStringAttribute cenv.g m cenv.g.attrib_ConditionalAttribute minfo - match conditionalCallDefineOpt with - | Some d when not (List.contains d cenv.conditionalDefines) -> + match conditionalCallDefineOpt, cenv.conditionalDefines with + | Some d, Some defines when not (List.contains d defines) -> // Methods marked with 'Conditional' must return 'unit' UnifyTypes cenv env m cenv.g.unit_ty (minfo.GetFSharpReturnTy(cenv.amap, m, minst)) @@ -3087,13 +3122,12 @@ let BuildILStaticFieldSet m (finfo:ILFieldInfo) argExpr = mkAsmExpr ([ mkNormalStsfld fspec ], tinst, [argExpr], [], m) let BuildRecdFieldSet g m objExpr (rfinfo:RecdFieldInfo) argExpr = - let tgty = rfinfo.DeclaringType - let valu = isStructTy g tgty - let objExpr = if valu then objExpr else mkCoerceExpr(objExpr, tgty, m, tyOfExpr g objExpr) + let tgtTy = rfinfo.DeclaringType + let valu = isStructTy g tgtTy + let objExpr = if valu then objExpr else mkCoerceExpr(objExpr, tgtTy, m, tyOfExpr g objExpr) let wrap, objExpr, _readonly, _writeonly = mkExprAddrOfExpr g valu false DefinitelyMutates objExpr None m wrap (mkRecdFieldSetViaExprAddr (objExpr, rfinfo.RecdFieldRef, rfinfo.TypeInst, argExpr, m) ) - //------------------------------------------------------------------------- // Helpers dealing with named and optional args at callsites //------------------------------------------------------------------------- @@ -3156,7 +3190,7 @@ let GetMethodArgs arg = let args = match arg with | SynExpr.Const (SynConst.Unit, _) -> [] - | SynExprParen(SynExpr.Tuple (args, _, _), _, _, _) | SynExpr.Tuple (args, _, _) -> args + | SynExprParen(SynExpr.Tuple (false, args, _, _), _, _, _) | SynExpr.Tuple (false, args, _, _) -> args | SynExprParen(arg, _, _, _) | arg -> [arg] let unnamedCallerArgs, namedCallerArgs = args |> List.takeUntil IsNamedArg @@ -3178,24 +3212,22 @@ let GetMethodArgs arg = // Helpers dealing with pattern match compilation //------------------------------------------------------------------------- -let CompilePatternForMatch cenv (env: TcEnv) mExpr matchm warnOnUnused actionOnFailure (v, generalizedTypars) clauses inputTy resultTy = - let dtree, targets = CompilePattern cenv.g env.DisplayEnv cenv.amap mExpr matchm warnOnUnused actionOnFailure (v, generalizedTypars) clauses inputTy resultTy +let CompilePatternForMatch cenv (env: TcEnv) mExpr matchm warnOnUnused actionOnFailure (inputVal, generalizedTypars, inputExprOpt) clauses inputTy resultTy = + let dtree, targets = CompilePattern cenv.g env.DisplayEnv cenv.amap mExpr matchm warnOnUnused actionOnFailure (inputVal, generalizedTypars, inputExprOpt) clauses inputTy resultTy mkAndSimplifyMatch NoSequencePointAtInvisibleBinding mExpr matchm resultTy dtree targets /// Compile a pattern -let CompilePatternForMatchClauses cenv env mExpr matchm warnOnUnused actionOnFailure inputTy resultTy tclauses = +let CompilePatternForMatchClauses cenv env mExpr matchm 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 - | [TClause(TPat_as (pat1, PBind (v, TypeScheme(generalizedTypars, _)), _), None, TTarget(vs, e, spTarget), m2)] -> - let expr = CompilePatternForMatch cenv env mExpr matchm warnOnUnused actionOnFailure (v, generalizedTypars) [TClause(pat1, None, TTarget(ListSet.remove valEq v vs, e, spTarget), m2)] inputTy resultTy - v, expr + | [TClause(TPat_as (pat1, PBind (asVal, TypeScheme(generalizedTypars, _)), _), None, TTarget(vs, e, spTarget), m2)] -> + let expr = CompilePatternForMatch cenv env mExpr matchm warnOnUnused actionOnFailure (asVal, generalizedTypars, None) [TClause(pat1, None, TTarget(ListSet.remove valEq asVal vs, e, spTarget), m2)] inputTy resultTy + asVal, expr | _ -> - let idv, _ = Tastops.mkCompGenLocal mExpr "matchValue" inputTy - let expr = CompilePatternForMatch cenv env mExpr matchm warnOnUnused actionOnFailure (idv, []) tclauses inputTy resultTy - idv, expr - - + let matchValueTmp, _ = Tastops.mkCompGenLocal mExpr "matchValue" inputTy + let expr = CompilePatternForMatch cenv env mExpr matchm warnOnUnused actionOnFailure (matchValueTmp, [], inputExprOpt) tclauses inputTy resultTy + matchValueTmp, expr //------------------------------------------------------------------------- // Helpers dealing with sequence expressions @@ -3427,11 +3459,10 @@ let mkSeqFinally cenv env m genTy e1 e2 = let mkSeqExprMatchClauses (pat', vspecs) innerExpr = [TClause(pat', None, TTarget(vspecs, innerExpr, SequencePointAtTarget), pat'.Range) ] -let compileSeqExprMatchClauses cenv env inputExprMark (pat':Pattern, vspecs) innerExpr bindPatTy genInnerTy = - let patMark = pat'.Range - let tclauses = mkSeqExprMatchClauses (pat', vspecs) innerExpr - CompilePatternForMatchClauses cenv env inputExprMark patMark false ThrowIncompleteMatchException bindPatTy genInnerTy tclauses - +let compileSeqExprMatchClauses 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 let elimFastIntegerForLoop (spBind, id, start, dir, finish, innerExpr, m) = let pseudoEnumExpr = @@ -3442,10 +3473,10 @@ let elimFastIntegerForLoop (spBind, id, start, dir, finish, innerExpr, m) = let (|ExprAsPat|_|) (f:SynExpr) = match f with | SingleIdent v1 | SynExprParen(SingleIdent v1, _, _, _) -> Some (mkSynPatVar None v1) - | SynExprParen(SynExpr.Tuple (elems, _, _), _, _, _) -> + | SynExprParen(SynExpr.Tuple (false, elems, _, _), _, _, _) -> let elems = elems |> List.map (|SingleIdent|_|) if elems |> List.forall (fun x -> x.IsSome) then - Some (SynPat.Tuple((elems |> List.map (fun x -> mkSynPatVar None x.Value)), f.Range)) + Some (SynPat.Tuple(false, (elems |> List.map (fun x -> mkSynPatVar None x.Value)), f.Range)) else None | _ -> None @@ -3461,7 +3492,7 @@ let (|SimpleSemicolonSequence|_|) acceptDeprecated c = | SynExpr.Sequential (_, _, e1, e2, _) -> YieldFree e1 && YieldFree e2 | SynExpr.IfThenElse (_, e2, e3opt, _, _, _, _) -> YieldFree e2 && Option.forall YieldFree e3opt | SynExpr.TryWith (e1, _, clauses, _, _, _, _) -> YieldFree e1 && clauses |> List.forall (fun (Clause(_, _, e, _, _)) -> YieldFree e) - | (SynExpr.Match (_, _, clauses, _, _) | SynExpr.MatchBang (_, _, clauses, _, _)) -> + | (SynExpr.Match (_, _, clauses, _) | SynExpr.MatchBang (_, _, clauses, _)) -> clauses |> List.forall (fun (Clause(_, _, e, _, _)) -> YieldFree e) | SynExpr.For (_, _, _, _, _, body, _) | SynExpr.TryFinally (body, _, _, _, _) @@ -4274,8 +4305,8 @@ let rec TcTyparConstraint ridx cenv newOk checkCxs occ (env: TcEnv) tpenv c = | WhereTyparSupportsMember(tps, memSpfn, m) -> let traitInfo, tpenv = TcPseudoMemberSpec cenv newOk env tps tpenv memSpfn m match traitInfo with - | TTrait(objtys, ".ctor", memberFlags, argtys, returnTy, _) when memberFlags.MemberKind = MemberKind.Constructor -> - match objtys, argtys with + | TTrait(objtys, ".ctor", memberFlags, argTys, returnTy, _) when memberFlags.MemberKind = MemberKind.Constructor -> + match objtys, argTys with | [ty], [] when typeEquiv cenv.g ty (GetFSharpViewOfReturnType cenv.g returnTy) -> AddCxTypeMustSupportDefaultCtor env.DisplayEnv cenv.css m NoTrace ty tpenv @@ -4303,14 +4334,14 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv memSpfn m = let topValInfo = TranslatePartialArity memberConstraintTypars partialValReprInfo let _, curriedArgInfos, returnTy, _ = GetTopValTypeInCompiledForm cenv.g topValInfo memberConstraintTy m //if curriedArgInfos.Length > 1 then error(Error(FSComp.SR.tcInvalidConstraint(), m)) - let argtys = List.concat curriedArgInfos - let argtys = List.map fst argtys + let argTys = List.concat curriedArgInfos + let argTys = List.map fst argTys let logicalCompiledName = ComputeLogicalName id memberFlags let item = Item.ArgName (id, memberConstraintTy, None) CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) - TTrait(tys, logicalCompiledName, memberFlags, argtys, returnTy, ref None), tpenv + TTrait(tys, logicalCompiledName, memberFlags, argTys, returnTy, ref None), tpenv | _ -> error(Error(FSComp.SR.tcInvalidConstraint(), m)) | _ -> error(Error(FSComp.SR.tcInvalidConstraint(), m)) @@ -4401,15 +4432,15 @@ and TcValSpec cenv env declKind newOk containerInfo memFlagsOpt thisTyOpt tpenv let ty' = if SynInfo.HasOptionalArgs valSynInfo then - let argtysl, returnTy = GetTopTauTypeInFSharpForm cenv.g argsData ty' m - let argtysl = - (List.zip (List.mapSquared fst argtysl) valSynInfo.ArgInfos) - |> List.map (fun (argtys, argInfos) -> - (List.zip argtys argInfos) + let curriedArgTys, returnTy = GetTopTauTypeInFSharpForm cenv.g argsData ty' m + let curriedArgTys = + (List.zip (List.mapSquared fst curriedArgTys) valSynInfo.ArgInfos) + |> List.map (fun (argTys, argInfos) -> + (List.zip argTys argInfos) |> List.map (fun (argty, argInfo) -> if SynInfo.IsOptionalArg argInfo then mkOptionTy cenv.g argty else argty)) - mkIteratedFunTy (List.map (mkRefTupledTy cenv.g) argtysl) returnTy + mkIteratedFunTy (List.map (mkRefTupledTy cenv.g) curriedArgTys) returnTy else ty' let memberInfoOpt = @@ -4474,9 +4505,9 @@ and TcTyparOrMeasurePar optKind cenv (env:TcEnv) newOk tpenv (Typar(id, _, _) as // CallNameResolutionSink cenv.tcSink (tp.Range.StartRange, env.NameEnv, item, item, ItemOccurence.UseInType, env.DisplayEnv, env.eAccessRights) res, tpenv let key = id.idText - match env.eNameResEnv.eTypars.TryFind key with - | Some res -> checkRes res - | None -> + match env.eNameResEnv.eTypars.TryGetValue key with + | true, res -> checkRes res + | _ -> match TryFindUnscopedTypar key tpenv with | Some res -> checkRes res | None -> @@ -4584,21 +4615,34 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv:SyntacticUnscoped match ltyp with | AppTy cenv.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 checkCxs occ env tpenv m tcref tinst args + TcTypeApp cenv newOk checkCxs occ env tpenv m tcref tinst args | _ -> error(Error(FSComp.SR.tcTypeHasNoNestedTypes(), m)) - | SynType.Tuple(args, m) -> - let isMeasure = match optKind with Some TyparKind.Measure -> true | None -> List.exists (fun (isquot, _) -> isquot) args | _ -> false - if isMeasure then - let ms, tpenv = TcMeasuresAsTuple cenv newOk checkCxs occ env tpenv args m - TType_measure ms, tpenv + | SynType.Tuple(isStruct, args, m) -> + let tupInfo = mkTupInfo isStruct + if isStruct then + let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m + TType_tuple(tupInfo,args'),tpenv else - let args', tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m - TType_tuple(tupInfoRef, args'), tpenv - - | SynType.StructTuple(args, m) -> - let args', tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m - TType_tuple(tupInfoStruct, args'), tpenv + let isMeasure = match optKind with Some TyparKind.Measure -> true | None -> List.exists (fun (isquot,_) -> isquot) args | _ -> false + if isMeasure then + let ms,tpenv = TcMeasuresAsTuple cenv newOk checkCxs occ env tpenv args m + TType_measure ms,tpenv + else + let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m + TType_tuple(tupInfo,args'),tpenv + + | SynType.AnonRecd(isStruct, args,m) -> + let tupInfo = mkTupInfo isStruct + let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv (args |> List.map snd |> List.map (fun x -> (false,x))) m + let unsortedIds = args |> List.map fst |> List.toArray + let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, tupInfo, unsortedIds) + // Sort into canonical order + let sortedArgTys, sortedCheckedArgTys = List.zip args args' |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) |> List.map snd |> List.unzip + sortedArgTys |> List.iteri (fun i (x,_) -> + let item = Item.AnonRecdField(anonInfo, sortedCheckedArgTys, i, x.idRange) + CallNameResolutionSink cenv.tcSink (x.idRange,env.NameEnv,item,item,emptyTyparInst,ItemOccurence.UseInType,env.DisplayEnv,env.eAccessRights)) + TType_anon(anonInfo, sortedCheckedArgTys),tpenv | SynType.Fun(domainTy, resultTy, _) -> let domainTy', tpenv = TcTypeAndRecover cenv newOk checkCxs occ env tpenv domainTy @@ -5105,17 +5149,17 @@ and TcPatBindingName cenv env id ty isMemberThis vis1 topValData (inlineFlag, de let names = Map.add id.idText (PrelimValScheme1(id, declaredTypars, ty, topValData, None, isMutable, inlineFlag, baseOrThis, argAttribs, vis, compgen)) names let takenNames = Set.add id.idText takenNames (fun (TcPatPhase2Input (values, isLeftMost)) -> - let (vspec, typeScheme) = - match values.TryFind id.idText with - | Some value -> - let name = id.idText + let (vspec, typeScheme) = + let name = id.idText + match values.TryGetValue name with + | true, value -> if not (String.IsNullOrEmpty name) && Char.IsLower(name.[0]) then - match TryFindPatternByName name env.eNameResEnv with - | Some (Item.Value vref) when vref.LiteralValue.IsSome -> - warning(Error(FSComp.SR.checkLowercaseLiteralBindingInPattern(id.idText), id.idRange)) - | Some _ | None -> () + match env.eNameResEnv.ePatItems.TryGetValue name with + | true, Item.Value vref when vref.LiteralValue.IsSome -> + warning(Error(FSComp.SR.checkLowercaseLiteralBindingInPattern name, id.idRange)) + | _ -> () value - | None -> error(Error(FSComp.SR.tcNameNotBoundInPattern(id.idText), id.idRange)) + | _ -> error(Error(FSComp.SR.tcNameNotBoundInPattern name, id.idRange)) // isLeftMost indicates we are processing the left-most path through a disjunctive or pattern. // For those binding locations, CallNameResolutionSink is called in MakeAndPublishValue, like all other bindings @@ -5166,14 +5210,14 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | SynPat.IsInst(cty, m) | SynPat.Named (SynPat.IsInst(cty, m), _, _, _, _) -> let srcTy = ty - let tgty, tpenv = TcTypeAndRecover cenv NewTyparsOKButWarnIfNotRigid CheckCxs ItemOccurence.UseInType env tpenv cty - TcRuntimeTypeTest (*isCast*)false (*isOperator*)true cenv env.DisplayEnv m tgty srcTy + let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOKButWarnIfNotRigid CheckCxs ItemOccurence.UseInType env tpenv cty + TcRuntimeTypeTest (*isCast*)false (*isOperator*)true cenv env.DisplayEnv m tgtTy srcTy match pat with | SynPat.IsInst(_, m) -> - (fun _ -> TPat_isinst (srcTy, tgty, None, m)), (tpenv, names, takenNames) + (fun _ -> TPat_isinst (srcTy, tgtTy, None, m)), (tpenv, names, takenNames) | SynPat.Named (SynPat.IsInst _, id, isMemberThis, vis, m) -> - let bindf, names, takenNames = TcPatBindingName cenv env id tgty isMemberThis vis None vFlags (names, takenNames) - (fun values -> TPat_isinst (srcTy, tgty, Some(bindf values), m)), + let bindf, names, takenNames = TcPatBindingName cenv env id tgtTy isMemberThis vis None vFlags (names, takenNames) + (fun values -> TPat_isinst (srcTy, tgtTy, Some(bindf values), m)), (tpenv, names, takenNames) | _ -> failwith "TcPat" @@ -5202,10 +5246,10 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p // matching error (UnionPatternsBindDifferentNames m) names1 |> Map.iter (fun _ (PrelimValScheme1(id1, _, ty1, _, _, _, _, _, _, _, _)) -> - match Map.tryFind id1.idText names2 with - | None -> () - | Some (PrelimValScheme1(_, _, ty2, _, _, _, _, _, _, _, _)) -> - UnifyTypes cenv env m ty1 ty2) + match names2.TryGetValue id1.idText with + | true, PrelimValScheme1(_, _, ty2, _, _, _, _, _, _, _, _) -> + UnifyTypes cenv env m ty1 ty2 + | _ -> ()) (fun values -> TPat_disjs ([pat1' values;pat2' values.RightPath], m)), (tpenv, names1, takenNames1) | SynPat.Ands (pats, m) -> @@ -5220,11 +5264,11 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | _ -> AllIdsOK let checkNoArgsForLiteral() = - let nargs = + let numArgs = match args with | SynConstructorArgs.Pats args -> args.Length | SynConstructorArgs.NamePatPairs (pairs, _) -> pairs.Length - if nargs <> 0 then error(Error(FSComp.SR.tcLiteralDoesNotTakeArguments(), m)) + if numArgs <> 0 then error(Error(FSComp.SR.tcLiteralDoesNotTakeArguments(), m)) match ResolvePatternLongIdent cenv.tcSink cenv.nameResolver warnOnUpperForId false m ad env.eNameResEnv TypeNameResolutionInfo.Default longId with | Item.NewDef id -> @@ -5273,10 +5317,10 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p SynExpr.DiscardAfterMissingQualificationAfterDot(e, unionRanges e.Range (List.last dotms)) else SynExpr.LongIdent(false, lidwd, None, m) List.fold (fun f x -> mkSynApp1 f (convSynPatToSynExpr x) m) e args - | SynPat.Tuple (args, m) -> SynExpr.Tuple(List.map convSynPatToSynExpr args, [], m) + | SynPat.Tuple (isStruct, args, m) -> SynExpr.Tuple(isStruct, List.map convSynPatToSynExpr args, [], m) | SynPat.Paren (p, _) -> convSynPatToSynExpr p - | SynPat.ArrayOrList (isArray, args, m) -> SynExpr.ArrayOrList(isArray, List.map convSynPatToSynExpr args, m) - | SynPat.QuoteExpr (e, _) -> e + | SynPat.ArrayOrList (isArray, args, m) -> SynExpr.ArrayOrList(isArray,List.map convSynPatToSynExpr args, m) + | SynPat.QuoteExpr (e,_) -> e | SynPat.Null m -> SynExpr.Null(m) | _ -> error(Error(FSComp.SR.tcInvalidArgForParameterizedPattern(), x.Range)) let activePatArgsAsSynExprs = List.map convSynPatToSynExpr activePatArgsAsSynPats @@ -5303,8 +5347,8 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | (Item.UnionCase _ | Item.ExnCase _) as item -> // DATA MATCH CONSTRUCTORS - let mkf, argtys, argNames = ApplyUnionCaseOrExnTypesForPat m cenv env ty item - let nargtys = argtys.Length + let mkf, argTys, argNames = ApplyUnionCaseOrExnTypesForPat m cenv env ty item + let numArgTys = argTys.Length let args = match args with @@ -5315,16 +5359,18 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p // | Case(value = v) // will become // | Case(_, v) - let result = Array.zeroCreate nargtys + let result = Array.zeroCreate numArgTys for (id, pat) in pairs do match argNames |> List.tryFindIndex (fun id2 -> id.idText = id2.idText) with | None -> - let caseName = - match item with - | Item.UnionCase(uci, _) -> uci.Name - | Item.ExnCase tcref -> tcref.DisplayName - | _ -> failwith "impossible" - error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(caseName, id.idText), id.idRange)) + match item with + | Item.UnionCase(uci, _) -> + error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(uci.Name, id.idText), id.idRange)) + | Item.ExnCase tcref -> + error(Error(FSComp.SR.tcExceptionConstructorDoesNotHaveFieldWithGivenName(tcref.DisplayName, id.idText), id.idRange)) + | _ -> + error(Error(FSComp.SR.tcConstructorDoesNotHaveFieldWithGivenName(id.idText), id.idRange)) + | Some idx -> match box result.[idx] with | null -> @@ -5333,33 +5379,33 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | Item.UnionCase(uci, _) -> Some(ArgumentContainer.UnionCase(uci)) | Item.ExnCase tref -> Some(ArgumentContainer.Type(tref)) | _ -> None - let argItem = Item.ArgName (argNames.[idx], argtys.[idx], argContainerOpt) + let argItem = Item.ArgName (argNames.[idx], argTys.[idx], argContainerOpt) CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, argItem, argItem, emptyTyparInst, ItemOccurence.Pattern, env.DisplayEnv, ad) | _ -> error(Error(FSComp.SR.tcUnionCaseFieldCannotBeUsedMoreThanOnce(id.idText), id.idRange)) - for i = 0 to nargtys - 1 do + for i = 0 to numArgTys - 1 do if isNull (box result.[i]) then result.[i] <- SynPat.Wild(m.MakeSynthetic()) let args = List.ofArray result if result.Length = 1 then args - else [ SynPat.Tuple(args, m) ] + else [ SynPat.Tuple(false, args, m) ] let args = match args with | []-> [] // note: the next will always be parenthesized - | [SynPatErrorSkip(SynPat.Tuple (args, _)) | SynPatErrorSkip(SynPat.Paren(SynPatErrorSkip(SynPat.Tuple (args, _)), _))] when nargtys > 1 -> args + | [SynPatErrorSkip(SynPat.Tuple (false, args, _)) | SynPatErrorSkip(SynPat.Paren(SynPatErrorSkip(SynPat.Tuple (false, args, _)), _))] when numArgTys > 1 -> args // note: we allow both 'C _' and 'C (_)' regardless of number of argument of the pattern - | [SynPatErrorSkip(SynPat.Wild _ as e) | SynPatErrorSkip(SynPat.Paren(SynPatErrorSkip(SynPat.Wild _ as e), _))] -> Array.toList (Array.create nargtys e) + | [SynPatErrorSkip(SynPat.Wild _ as e) | SynPatErrorSkip(SynPat.Paren(SynPatErrorSkip(SynPat.Wild _ as e), _))] -> Array.toList (Array.create numArgTys e) | [arg] -> [arg] - | _ when nargtys = 0 -> error(Error(FSComp.SR.tcUnionCaseDoesNotTakeArguments(), m)) - | _ when nargtys = 1 -> error(Error(FSComp.SR.tcUnionCaseRequiresOneArgument(), m)) - | _ -> error(Error(FSComp.SR.tcUnionCaseExpectsTupledArguments(nargtys), m)) - UnionCaseOrExnCheck env nargtys args.Length m + | _ when numArgTys = 0 -> error(Error(FSComp.SR.tcUnionCaseDoesNotTakeArguments(), m)) + | _ when numArgTys = 1 -> error(Error(FSComp.SR.tcUnionCaseRequiresOneArgument(), m)) + | _ -> error(Error(FSComp.SR.tcUnionCaseExpectsTupledArguments(numArgTys), m)) + UnionCaseOrExnCheck env numArgTys args.Length m - let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argtys args + let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argTys args (fun values -> // Report information about the case occurrence to IDE CallNameResolutionSink cenv.tcSink (rangeOfLid longId, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Pattern, env.DisplayEnv, env.eAccessRights) @@ -5413,17 +5459,10 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | SynPat.QuoteExpr(_, m) -> error (Error(FSComp.SR.tcInvalidPattern(), m)) - | SynPat.Tuple (args, m) -> - let argtys = NewInferenceTypes args - UnifyTypes cenv env m ty (TType_tuple (tupInfoRef, argtys)) - let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argtys args - (fun values -> TPat_tuple(tupInfoRef, List.map (fun f -> f values) args', argtys, m)), acc - - | SynPat.StructTuple (args, m) -> - let argtys = NewInferenceTypes args - UnifyTypes cenv env m ty (TType_tuple (tupInfoStruct, argtys)) - let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argtys args - (fun values -> TPat_tuple(tupInfoStruct, List.map (fun f -> f values) args', argtys, m)), acc + | SynPat.Tuple (isExplicitStruct, args, m) -> + let tupInfo, argTys = UnifyTupleTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv m ty isExplicitStruct args + let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argTys args + (fun values -> TPat_tuple(tupInfo, List.map (fun f -> f values) args', argTys, m)), acc | SynPat.Paren (p, _) -> TcPat warnOnUpper cenv env None vFlags (tpenv, names, takenNames) ty p @@ -5446,9 +5485,9 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p let ftys = fields |> List.map (fun fsp -> actualTyOfRecdField inst fsp, fsp) let fldsmap', acc = ((tpenv, names, takenNames), ftys) ||> List.mapFold (fun s (ty, fsp) -> - match Map.tryFind fsp.rfield_id.idText fldsmap with - | Some v -> TcPat warnOnUpper cenv env None vFlags s ty v - | None -> (fun _ -> TPat_wild m), s) + match fldsmap.TryGetValue fsp.rfield_id.idText with + | true, v -> TcPat warnOnUpper cenv env None vFlags s ty v + | _ -> (fun _ -> TPat_wild m), s) (fun values -> TPat_recd (tcref, tinst, List.map (fun f -> f values) fldsmap', m)), acc @@ -5467,9 +5506,9 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | SynPat.FromParseError (pat, _) -> suppressErrorReporting (fun () -> TcPatAndRecover warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) (NewErrorType()) pat) -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) +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) and solveTypAsError cenv denv m ty = @@ -5651,15 +5690,15 @@ and TcExprThen cenv overallTy env tpenv synExpr delayed = let expr, exprty, tpenv = TcExprUndelayedNoType cenv env tpenv synExpr PropagateThenTcDelayed cenv overallTy env tpenv synExpr.Range (MakeApplicableExprNoFlex cenv expr) exprty ExprAtomicFlag.NonAtomic delayed -and TcExprs cenv env m tpenv flexes argtys args = - if List.length args <> List.length argtys then error(Error(FSComp.SR.tcExpressionCountMisMatch((List.length argtys), (List.length args)), m)) - (tpenv, List.zip3 flexes argtys args) ||> List.mapFold (fun tpenv (flex, ty, e) -> +and TcExprs cenv env m tpenv flexes argTys args = + if List.length args <> List.length argTys then error(Error(FSComp.SR.tcExpressionCountMisMatch((List.length argTys), (List.length args)), m)) + (tpenv, List.zip3 flexes argTys args) ||> List.mapFold (fun tpenv (flex, ty, e) -> TcExprFlex cenv flex false ty env tpenv e) and CheckSuperInit cenv objTy m = // Check the type is not abstract match tryDestAppTy cenv.g objTy with - | Some tcref when isAbstractTycon tcref.Deref -> + | ValueSome tcref when isAbstractTycon tcref.Deref -> errorR(Error(FSComp.SR.tcAbstractTypeCannotBeInstantiated(), m)) | _ -> () @@ -5667,13 +5706,13 @@ and CheckSuperInit cenv objTy m = // TcExprUndelayed //------------------------------------------------------------------------- -and TcExprUndelayedNoType cenv env tpenv expr : Expr * TType * _ = - let exprty = NewInferenceType () - let expr', tpenv = TcExprUndelayed cenv exprty env tpenv expr - expr', exprty, tpenv +and TcExprUndelayedNoType cenv env tpenv synExpr : Expr * TType * _ = + let overallTy = NewInferenceType () + let expr, tpenv = TcExprUndelayed cenv overallTy env tpenv synExpr + expr, overallTy, tpenv -and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = - match expr with +and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = + match synExpr with | SynExpr.Paren (expr2, _, _, mWholeExprIncludingParentheses) -> // We invoke CallExprHasTypeSink for every construct which is atomic in the syntax, i.e. where a '.' immediately following the // construct is a dot-lookup for the result of the construct. @@ -5682,24 +5721,26 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = TcExpr cenv overallTy env tpenv expr2 | SynExpr.DotIndexedGet _ | SynExpr.DotIndexedSet _ - | SynExpr.TypeApp _ | SynExpr.Ident _ | SynExpr.LongIdent _ | SynExpr.App _ | SynExpr.DotGet _ -> error(Error(FSComp.SR.tcExprUndelayed(), expr.Range)) + | SynExpr.TypeApp _ | SynExpr.Ident _ | SynExpr.LongIdent _ | SynExpr.App _ | SynExpr.DotGet _ -> error(Error(FSComp.SR.tcExprUndelayed(), synExpr.Range)) | SynExpr.Const (SynConst.String (s, m), _) -> CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) TcConstStringExpr cenv overallTy env m tpenv s - | SynExpr.Const (c, m) -> + | SynExpr.Const (synConst, m) -> CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) - TcConstExpr cenv overallTy env m tpenv c + TcConstExpr cenv overallTy env m tpenv synConst - | SynExpr.Lambda _ -> TcIteratedLambdas cenv true env overallTy Set.empty tpenv expr + | SynExpr.Lambda _ -> + TcIteratedLambdas cenv true env overallTy Set.empty tpenv synExpr - | SynExpr.Match (spMatch, x, matches, isExnMatch, _m) -> + | SynExpr.Match (spMatch, synInputExpr, synClauses, _m) -> - let x', inputTy, tpenv = TcExprOfUnknownType cenv env tpenv x - let mExpr = x'.Range - let v, e, tpenv = TcAndPatternCompileMatchClauses mExpr mExpr (if isExnMatch then Throw else ThrowIncompleteMatchException) cenv inputTy overallTy env tpenv matches - (mkLet spMatch mExpr v x' e, tpenv) + let inputExpr, inputTy, tpenv = TcExprOfUnknownType cenv env tpenv synInputExpr + let mInputExpr = inputExpr.Range + let matchVal, matchExpr, tpenv = TcAndPatternCompileMatchClauses mInputExpr mInputExpr ThrowIncompleteMatchException cenv (Some inputExpr) inputTy overallTy env tpenv synClauses + let overallExpr = mkLet spMatch mInputExpr matchVal inputExpr matchExpr + overallExpr, tpenv // (function[spMatch] pat1 -> expr1 ... | patN -> exprN) // @@ -5711,12 +5752,12 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = // is // Lambda (_arg2, Let (x, _arg2, x)) - | SynExpr.MatchLambda (isExnMatch, argm, clauses, spMatch, m) -> // (spMatch, x, matches, isExnMatch, m) -> + | SynExpr.MatchLambda (isExnMatch, mArg, clauses, spMatch, m) -> let domainTy, resultTy = UnifyFunctionType None cenv env.DisplayEnv m overallTy - let idv1, idve1 = mkCompGenLocal argm (cenv.synArgNameGenerator.New()) domainTy + let idv1, idve1 = mkCompGenLocal mArg (cenv.synArgNameGenerator.New()) domainTy let envinner = ExitFamilyRegion env - let idv2, matchExpr, tpenv = TcAndPatternCompileMatchClauses m argm (if isExnMatch then Throw else ThrowIncompleteMatchException) cenv domainTy resultTy envinner tpenv clauses + let idv2, matchExpr, tpenv = TcAndPatternCompileMatchClauses m mArg (if isExnMatch then Throw else ThrowIncompleteMatchException) cenv None domainTy resultTy envinner tpenv clauses let overallExpr = mkMultiLambda m [idv1] ((mkLet spMatch m idv2 idve1 matchExpr), resultTy) overallExpr, tpenv @@ -5727,81 +5768,80 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = error(Error(FSComp.SR.tcFixedNotAllowed(), m)) // e : ty - | SynExpr.Typed (e, cty, m) -> - let tgty, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv cty - UnifyTypes cenv env m overallTy tgty - let e', tpenv = TcExpr cenv overallTy env tpenv e - e', tpenv + | SynExpr.Typed (synBodyExpr, synType, m) -> + let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synType + UnifyTypes cenv env m overallTy tgtTy + let expr, tpenv = TcExpr cenv overallTy env tpenv synBodyExpr + expr, tpenv // e :? ty - | SynExpr.TypeTest (e, tgty, m) -> - let e', srcTy, tpenv = TcExprOfUnknownType cenv env tpenv e + | SynExpr.TypeTest (synInnerExpr, tgtTy, m) -> + let innerExpr, srcTy, tpenv = TcExprOfUnknownType cenv env tpenv synInnerExpr UnifyTypes cenv env m overallTy cenv.g.bool_ty - let tgty, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgty - TcRuntimeTypeTest (*isCast*)false (*isOperator*)true cenv env.DisplayEnv m tgty srcTy - let e' = mkCallTypeTest cenv.g m tgty e' - e', tpenv + let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgtTy + TcRuntimeTypeTest (*isCast*)false (*isOperator*)true cenv env.DisplayEnv m tgtTy srcTy + let expr = mkCallTypeTest cenv.g m tgtTy innerExpr + expr, tpenv // SynExpr.AddressOf is noted in the syntax ast in order to recognize it as concrete type information // during type checking, in particular prior to resolving overloads. This helps distinguish // its use at method calls from the use of the conflicting 'ref' mechanism for passing byref parameters - | SynExpr.AddressOf(byref, e, opm, m) -> - TcExpr cenv overallTy env tpenv (mkSynPrefixPrim opm m (if byref then "~&" else "~&&") e) + | SynExpr.AddressOf(byref, synInnerExpr, opm, m) -> + TcExpr cenv overallTy env tpenv (mkSynPrefixPrim opm m (if byref then "~&" else "~&&") synInnerExpr) - | SynExpr.Upcast (e, _, m) | SynExpr.InferredUpcast (e, m) -> - let e', srcTy, tpenv = TcExprOfUnknownType cenv env tpenv e - let tgty, tpenv = - match expr with - | SynExpr.Upcast (_, tgty, m) -> - let tgty, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgty - UnifyTypes cenv env m tgty overallTy - tgty, tpenv + | SynExpr.Upcast (synInnerExpr, _, m) | SynExpr.InferredUpcast (synInnerExpr, m) -> + let innerExpr, srcTy, tpenv = TcExprOfUnknownType cenv env tpenv synInnerExpr + let tgtTy, tpenv = + match synExpr with + | SynExpr.Upcast (_, tgtTy, m) -> + let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgtTy + UnifyTypes cenv env m tgtTy overallTy + tgtTy, tpenv | SynExpr.InferredUpcast _ -> overallTy, tpenv | _ -> failwith "upcast" - TcStaticUpcast cenv env.DisplayEnv m tgty srcTy - mkCoerceExpr(e', tgty, m, srcTy), tpenv - - | SynExpr.Downcast(e, _, m) | SynExpr.InferredDowncast (e, m) -> - let e', srcTy, tpenv = TcExprOfUnknownType cenv env tpenv e - let tgty, tpenv, isOperator = - match expr with - | SynExpr.Downcast (_, tgty, m) -> - let tgty, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgty - UnifyTypes cenv env m tgty overallTy - tgty, tpenv, true + TcStaticUpcast cenv env.DisplayEnv m tgtTy srcTy + let expr = mkCoerceExpr(innerExpr, tgtTy, m, srcTy) + expr, tpenv + + | SynExpr.Downcast(synInnerExpr, _, m) | SynExpr.InferredDowncast (synInnerExpr, m) -> + let innerExpr, srcTy, tpenv = TcExprOfUnknownType cenv env tpenv synInnerExpr + let tgtTy, tpenv, isOperator = + match synExpr with + | SynExpr.Downcast (_, tgtTy, m) -> + let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgtTy + UnifyTypes cenv env m tgtTy overallTy + tgtTy, tpenv, true | SynExpr.InferredDowncast _ -> overallTy, tpenv, false | _ -> failwith "downcast" - TcRuntimeTypeTest (*isCast*)true isOperator cenv env.DisplayEnv m tgty srcTy + TcRuntimeTypeTest (*isCast*)true isOperator cenv env.DisplayEnv m tgtTy srcTy - // TcRuntimeTypeTest ensures tgty is a nominal type. Hence we can insert a check here + // TcRuntimeTypeTest ensures tgtTy is a nominal type. Hence we can insert a check here // based on the nullness semantics of the nominal type. - let e' = mkCallUnbox cenv.g m tgty e' - e', tpenv + let expr = mkCallUnbox cenv.g m tgtTy innerExpr + expr, tpenv | SynExpr.Null m -> AddCxTypeMustSupportNull env.DisplayEnv cenv.css m NoTrace overallTy mkNull m overallTy, tpenv - | SynExpr.Lazy (e, m) -> - let ety = NewInferenceType () - UnifyTypes cenv env m overallTy (mkLazyTy cenv.g ety) - let e', tpenv = TcExpr cenv ety env tpenv e - mkLazyDelayed cenv.g m ety (mkUnitDelayLambda cenv.g m e'), tpenv + | SynExpr.Lazy (synInnerExpr, m) -> + let innerTy = NewInferenceType () + UnifyTypes cenv env m overallTy (mkLazyTy cenv.g innerTy) + let innerExpr, tpenv = TcExpr cenv innerTy env tpenv synInnerExpr + let expr = mkLazyDelayed cenv.g m innerTy (mkUnitDelayLambda cenv.g m innerExpr) + expr, tpenv - | SynExpr.Tuple (args, _, m) -> - let argtys = UnifyRefTupleType env.eContextInfo cenv env.DisplayEnv m overallTy args + | SynExpr.Tuple (isExplicitStruct, args, _, m) -> + let tupInfo, argTys = UnifyTupleTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv m overallTy isExplicitStruct args // No subsumption at tuple construction - let flexes = argtys |> List.map (fun _ -> false) - let args', tpenv = TcExprs cenv env m tpenv flexes argtys args - mkRefTupled cenv.g m args' argtys, tpenv + let flexes = argTys |> List.map (fun _ -> false) + let args', tpenv = TcExprs cenv env m tpenv flexes argTys args + let expr = mkAnyTupled cenv.g m tupInfo args' argTys + expr, tpenv - | SynExpr.StructTuple (args, _, m) -> - let argtys = UnifyStructTupleType env.eContextInfo cenv env.DisplayEnv m overallTy args - // No subsumption at tuple construction - let flexes = argtys |> List.map (fun _ -> false) - let args', tpenv = TcExprs cenv env m tpenv flexes argtys args - mkAnyTupled cenv.g m tupInfoStruct args' argtys, tpenv + | SynExpr.AnonRecd (isStruct, optOrigExpr, unsortedArgs, mWholeExpr) -> + TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs, mWholeExpr) | SynExpr.ArrayOrList (isArray, args, m) -> CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) @@ -5839,16 +5879,16 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = CallExprHasTypeSink cenv.tcSink (mWholeExpr, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr) - | SynExpr.While (spWhile, e1, e2, m) -> + | SynExpr.While (spWhile, synGuardExpr, synBodyExpr, m) -> UnifyTypes cenv env m overallTy cenv.g.unit_ty - let e1', tpenv = TcExpr cenv (cenv.g.bool_ty) env tpenv e1 - let e2', tpenv = TcStmt cenv env tpenv e2 - mkWhile cenv.g (spWhile, NoSpecialWhileLoopMarker, e1', e2', m), tpenv + let guardExpr, tpenv = TcExpr cenv cenv.g.bool_ty env tpenv synGuardExpr + let bodyExpr, tpenv = TcStmt cenv env tpenv synBodyExpr + mkWhile cenv.g (spWhile, NoSpecialWhileLoopMarker, guardExpr, bodyExpr, m), tpenv | SynExpr.For (spBind, id, start, dir, finish, body, m) -> UnifyTypes cenv env m overallTy cenv.g.unit_ty - let startExpr , tpenv = TcExpr cenv (cenv.g.int_ty) env tpenv start - let finishExpr, tpenv = TcExpr cenv (cenv.g.int_ty) env tpenv finish + let startExpr , tpenv = TcExpr cenv cenv.g.int_ty env tpenv start + let finishExpr, tpenv = TcExpr cenv cenv.g.int_ty env tpenv finish let idv, _ = mkLocal id.idRange id.idText cenv.g.int_ty let envinner = AddLocalVal cenv.tcSink m idv env @@ -5939,22 +5979,22 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = expr, tpenv | SynExpr.LetOrUse _ -> - TcLinearExprs (TcExprThatCanBeCtorBody cenv) cenv env overallTy tpenv false expr (fun x -> x) + TcLinearExprs (TcExprThatCanBeCtorBody cenv) cenv env overallTy tpenv false synExpr (fun x -> x) - | SynExpr.TryWith (e1, _mTryToWith, clauses, mWithToLast, mTryToLast, spTry, spWith) -> - let e1', tpenv = TcExpr cenv overallTy env tpenv e1 + | SynExpr.TryWith (synBodyExpr, _mTryToWith, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) -> + let bodyExpr, tpenv = TcExpr cenv overallTy env tpenv synBodyExpr // Compile the pattern twice, once as a List.filter with all succeeding targets returning "1", and once as a proper catch block. - let filterClauses = clauses |> List.map (function (Clause(pat, optWhenExpr, _, m, _)) -> Clause(pat, optWhenExpr, (SynExpr.Const(SynConst.Int32 1, m)), m, SuppressSequencePointAtTarget)) + let filterClauses = synWithClauses |> List.map (function (Clause(pat, optWhenExpr, _, m, _)) -> Clause(pat, optWhenExpr, (SynExpr.Const(SynConst.Int32 1, m)), m, SuppressSequencePointAtTarget)) let checkedFilterClauses, tpenv = TcMatchClauses cenv cenv.g.exn_ty cenv.g.int_ty env tpenv filterClauses - let checkedHandlerClauses, tpenv = TcMatchClauses cenv cenv.g.exn_ty overallTy env tpenv clauses - let v1, filter_expr = CompilePatternForMatchClauses cenv env mWithToLast mWithToLast true FailFilter cenv.g.exn_ty cenv.g.int_ty checkedFilterClauses - let v2, handler_expr = CompilePatternForMatchClauses cenv env mWithToLast mWithToLast true Rethrow cenv.g.exn_ty overallTy checkedHandlerClauses - mkTryWith cenv.g (e1', v1, filter_expr, v2, handler_expr, mTryToLast, overallTy, spTry, spWith), tpenv + let checkedHandlerClauses, tpenv = TcMatchClauses cenv cenv.g.exn_ty overallTy env tpenv synWithClauses + let v1, filterExpr = CompilePatternForMatchClauses cenv env mWithToLast mWithToLast true FailFilter None cenv.g.exn_ty cenv.g.int_ty checkedFilterClauses + let v2, handlerExpr = CompilePatternForMatchClauses cenv env mWithToLast mWithToLast true Rethrow None cenv.g.exn_ty overallTy checkedHandlerClauses + mkTryWith cenv.g (bodyExpr, v1, filterExpr, v2, handlerExpr, mTryToLast, overallTy, spTry, spWith), tpenv - | SynExpr.TryFinally (e1, e2, mTryToLast, spTry, spFinally) -> - let e1', tpenv = TcExpr cenv overallTy env tpenv e1 - let e2', tpenv = TcStmt cenv env tpenv e2 - mkTryFinally cenv.g (e1', e2', mTryToLast, overallTy, spTry, spFinally), tpenv + | SynExpr.TryFinally (synBodyExpr, synFinallyExpr, mTryToLast, spTry, spFinally) -> + let bodyExpr, tpenv = TcExpr cenv overallTy env tpenv synBodyExpr + let finallyExpr, tpenv = TcStmt cenv env tpenv synFinallyExpr + mkTryFinally cenv.g (bodyExpr, finallyExpr, mTryToLast, overallTy, spTry, spFinally), tpenv | SynExpr.JoinIn(e1, mInToken, e2, mAll) -> errorR(Error(FSComp.SR.parsUnfinishedExpression("in"), mInToken)) @@ -5976,47 +6016,47 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = let _, tpenv = suppressErrorReporting (fun () -> TcExpr cenv overallTy env tpenv e1) mkDefault(m, overallTy), tpenv - | SynExpr.Sequential (sp, dir, e1, e2, m) -> + | SynExpr.Sequential (sp, dir, synExpr1, synExpr2, m) -> if dir then - TcLinearExprs (TcExprThatCanBeCtorBody cenv) cenv env overallTy tpenv false expr (fun x -> x) + TcLinearExprs (TcExprThatCanBeCtorBody cenv) cenv env overallTy tpenv false synExpr (fun x -> x) else // Constructors using "new (...) = then " - let e1', tpenv = TcExprThatCanBeCtorBody cenv overallTy env tpenv e1 + let expr1, tpenv = TcExprThatCanBeCtorBody cenv overallTy env tpenv synExpr1 if (GetCtorShapeCounter env) <> 1 then errorR(Error(FSComp.SR.tcExpressionFormRequiresObjectConstructor(), m)) - let e2', tpenv = TcStmtThatCantBeCtorBody cenv env tpenv e2 - Expr.Sequential(e1', e2', ThenDoSeq, sp, m), tpenv + let expr2, tpenv = TcStmtThatCantBeCtorBody cenv env tpenv synExpr2 + Expr.Sequential(expr1, expr2, ThenDoSeq, sp, m), tpenv - | SynExpr.Do (e1, m) -> - UnifyTypes cenv env m overallTy cenv.g.unit_ty - TcStmtThatCantBeCtorBody cenv env tpenv e1 + | SynExpr.Do (synInnerExpr, m) -> + UnifyTypes cenv env m overallTy cenv.g.unit_ty + TcStmtThatCantBeCtorBody cenv env tpenv synInnerExpr - | SynExpr.IfThenElse (e1, e2, e3opt, spIfToThen, isRecovery, mIfToThen, m) -> - let e1', tpenv = TcExprThatCantBeCtorBody cenv cenv.g.bool_ty env tpenv e1 - let e2', tpenv = + | SynExpr.IfThenElse (synBoolExpr, synThenExpr, synElseExprOpt, spIfToThen, isRecovery, mIfToThen, m) -> + let boolExpr, tpenv = TcExprThatCantBeCtorBody cenv cenv.g.bool_ty env tpenv synBoolExpr + let thenExpr, tpenv = let env = match env.eContextInfo with - | ContextInfo.ElseBranchResult _ -> { env with eContextInfo = ContextInfo.ElseBranchResult e2.Range } + | ContextInfo.ElseBranchResult _ -> { env with eContextInfo = ContextInfo.ElseBranchResult synThenExpr.Range } | _ -> - match e3opt with - | None -> { env with eContextInfo = ContextInfo.OmittedElseBranch e2.Range } - | _ -> { env with eContextInfo = ContextInfo.IfExpression e2.Range } + match synElseExprOpt with + | None -> { env with eContextInfo = ContextInfo.OmittedElseBranch synThenExpr.Range } + | _ -> { env with eContextInfo = ContextInfo.IfExpression synThenExpr.Range } - if not isRecovery && Option.isNone e3opt then + if not isRecovery && Option.isNone synElseExprOpt then UnifyTypes cenv env m cenv.g.unit_ty overallTy - TcExprThatCanBeCtorBody cenv overallTy env tpenv e2 + TcExprThatCanBeCtorBody cenv overallTy env tpenv synThenExpr - let e3', sp2, tpenv = - match e3opt with + let elseExpr, spElse, tpenv = + match synElseExprOpt with | None -> mkUnit cenv.g mIfToThen, SuppressSequencePointAtTarget, tpenv // the fake 'unit' value gets exactly the same range as spIfToThen - | Some e3 -> - let env = { env with eContextInfo = ContextInfo.ElseBranchResult e3.Range } - let e3', tpenv = TcExprThatCanBeCtorBody cenv overallTy env tpenv e3 - e3', SequencePointAtTarget, tpenv + | Some synElseExpr -> + let env = { env with eContextInfo = ContextInfo.ElseBranchResult synElseExpr.Range } + let elseExpr, tpenv = TcExprThatCanBeCtorBody cenv overallTy env tpenv synElseExpr + elseExpr, SequencePointAtTarget, tpenv - primMkCond spIfToThen SequencePointAtTarget sp2 m overallTy e1' e2' e3', tpenv + primMkCond spIfToThen SequencePointAtTarget spElse m overallTy boolExpr thenExpr elseExpr, tpenv // This is for internal use in the libraries only | SynExpr.LibraryOnlyStaticOptimization (constraints, e2, e3, m) -> @@ -6068,7 +6108,7 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = | SynExpr.TraitCall(tps, memSpfn, arg, m) -> let synTypes = tps |> List.map (fun tp -> SynType.Var(tp, m)) - let (TTrait(_, logicalCompiledName, _, argtys, returnTy, _) as traitInfo), tpenv = TcPseudoMemberSpec cenv NewTyparsOK env synTypes tpenv memSpfn m + let (TTrait(_, logicalCompiledName, _, argTys, returnTy, _) as traitInfo), tpenv = TcPseudoMemberSpec cenv NewTyparsOK env synTypes tpenv memSpfn m if BakedInTraitConstraintNames.Contains logicalCompiledName then warning(BakedInMemberConstraintName(logicalCompiledName, m)) @@ -6076,8 +6116,8 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = let args, namedCallerArgs = GetMethodArgs arg if not (isNil namedCallerArgs) then errorR(Error(FSComp.SR.tcNamedArgumentsCannotBeUsedInMemberTraits(), m)) // Subsumption at trait calls if arguments have nominal type prior to unification of any arguments or return type - let flexes = argtys |> List.map (isTyparTy cenv.g >> not) - let args', tpenv = TcExprs cenv env m tpenv flexes argtys args + let flexes = argTys |> List.map (isTyparTy cenv.g >> not) + let args', tpenv = TcExprs cenv env m tpenv flexes argTys args AddCxMethodConstraint env.DisplayEnv cenv.css m NoTrace traitInfo UnifyTypes cenv env m overallTy returnTy Expr.Op(TOp.TraitCall(traitInfo), [], args', m), tpenv @@ -6104,11 +6144,11 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = mkf n e2', tpenv | SynExpr.LibraryOnlyILAssembly (s, tyargs, args, rtys, m) -> - let argtys = NewInferenceTypes args + let argTys = NewInferenceTypes args let tyargs', tpenv = TcTypes cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tyargs // No subsumption at uses of IL assembly code - let flexes = argtys |> List.map (fun _ -> false) - let args', tpenv = TcExprs cenv env m tpenv flexes argtys args + let flexes = argTys |> List.map (fun _ -> false) + let args', tpenv = TcExprs cenv env m tpenv flexes argTys args let rtys', tpenv = TcTypes cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv rtys let returnTy = match rtys' with @@ -6125,17 +6165,21 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = | SynExpr.YieldOrReturn ((isTrueYield, _), _, m) | SynExpr.YieldOrReturnFrom ((isTrueYield, _), _, m) when isTrueYield -> error(Error(FSComp.SR.tcConstructRequiresListArrayOrSequence(), m)) + | SynExpr.YieldOrReturn ((_, isTrueReturn), _, m) | SynExpr.YieldOrReturnFrom ((_, isTrueReturn), _, m) when isTrueReturn -> error(Error(FSComp.SR.tcConstructRequiresComputationExpressions(), m)) + | SynExpr.YieldOrReturn (_, _, m) | SynExpr.YieldOrReturnFrom (_, _, m) | SynExpr.ImplicitZero m -> error(Error(FSComp.SR.tcConstructRequiresSequenceOrComputations(), m)) + | SynExpr.DoBang (_, m) | SynExpr.LetOrUseBang (_, _, _, _, _, _, m) -> error(Error(FSComp.SR.tcConstructRequiresComputationExpression(), m)) - | SynExpr.MatchBang (_, _, _, _, m) -> + + | SynExpr.MatchBang (_, _, _, m) -> error(Error(FSComp.SR.tcConstructRequiresComputationExpression(), m)) /// Check lambdas as a group, to catch duplicate names in patterns @@ -6177,9 +6221,9 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg match acc with | None -> match tryDestAppTy cenv.g ty with - | Some tcref -> + | ValueSome tcref -> TryFindTyconRefStringAttribute cenv.g mWholeExpr cenv.g.attrib_DefaultMemberAttribute tcref - | None -> + | _ -> match AllPropInfosOfTypeInScope cenv.infoReader env.NameEnv (Some "Item", ad) IgnoreOverrides mWholeExpr ty with | [] -> None | _ -> Some "Item" @@ -6203,7 +6247,7 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg match indexArgs with | [] -> failwith "unexpected empty index list" | [SynIndexerArg.One h] -> SynExpr.Paren(h, range0, None, idxRange) - | _ -> SynExpr.Paren(SynExpr.Tuple(GetIndexArgs indexArgs @ Option.toList vopt, [], idxRange), range0, None, idxRange) + | _ -> SynExpr.Paren(SynExpr.Tuple(false, GetIndexArgs indexArgs @ Option.toList vopt, [], idxRange), range0, None, idxRange) let attemptArrayString = if isArray || isString then @@ -6212,13 +6256,13 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg let sliceOpPath = ["Microsoft";"FSharp";"Core";"Operators";"OperatorIntrinsics"] let info = match isString, isArray, wholeExpr with - | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_] as idxs, _, _))], _, _) -> Some (indexOpPath, "GetArray2D", idxs) - | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_] as idxs, _, _))], _, _) -> Some (indexOpPath, "GetArray3D", idxs) - | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_;_] as idxs, _, _))], _, _) -> Some (indexOpPath, "GetArray4D", idxs) + | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray2D", idxs) + | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray3D", idxs) + | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray4D", idxs) | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One idx], _, _) -> Some (indexOpPath, "GetArray", [idx]) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_] as idxs, _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray2D", (idxs @ [e3])) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_] as idxs, _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray3D", (idxs @ [e3])) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_;_] as idxs, _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray4D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray2D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray3D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray4D", (idxs @ [e3])) | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One _], e3, _, _, _) -> Some (indexOpPath, "SetArray", (GetIndexArgs indexArgs @ [e3])) | true, false, SynExpr.DotIndexedGet(_, [SynIndexerArg.Two _], _, _) -> Some (sliceOpPath, "GetStringSlice", GetIndexArgs indexArgs) | true, false, SynExpr.DotIndexedGet(_, [SynIndexerArg.One _], _, _) -> Some (indexOpPath, "GetString", GetIndexArgs indexArgs) @@ -6335,12 +6379,8 @@ and TcCtorCall isNaked cenv env tpenv overallTy objTy mObjTyOpt item superInit a error(Error(FSComp.SR.tcSyntaxCanOnlyBeUsedToCreateObjectTypes(if superInit then "inherit" else "new"), mWholeCall)) -//------------------------------------------------------------------------- -// TcRecordConstruction -//------------------------------------------------------------------------- - // Check a record construction expression -and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = +and TcRecordConstruction cenv overallTy env tpenv optOrigExprInfo objTy fldsList m = let tcref, tinst = destAppTy cenv.g objTy let tycon = tcref.Deref UnifyTypes cenv env m overallTy objTy @@ -6371,18 +6411,17 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = // Add rebindings for unbound field when an "old value" is available // Effect order: mutable fields may get modified by other bindings... - let oldFldsList, wrap = - match optOrigExpr with - | None -> [], id - | Some (_, _, oldve) -> - let wrap, oldveaddr, _readonly, _writeonly = mkExprAddrOfExpr cenv.g tycon.IsStructOrEnumTycon false NeverMutates oldve None m + let oldFldsList = + match optOrigExprInfo with + | None -> [] + | Some (_, _, oldvaddre) -> let fieldNameUnbound nom = List.forall (fun (name, _) -> name <> nom) fldsList let flds = fspecs |> List.choose (fun rfld -> if fieldNameUnbound rfld.Name && not rfld.IsZeroInit - then Some(rfld.Name, mkRecdFieldGetViaExprAddr (oldveaddr, tcref.MakeNestedRecdFieldRef rfld, tinst, m)) + then Some(rfld.Name, mkRecdFieldGetViaExprAddr (oldvaddre, tcref.MakeNestedRecdFieldRef rfld, tinst, m)) else None) - flds, wrap + flds let fldsList = fldsList @ oldFldsList @@ -6398,7 +6437,7 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = let ns1 = NameSet.ofList (List.map fst fldsList) let ns2 = NameSet.ofList (List.map (fun x -> x.rfield_id.idText) fspecs) - if Option.isNone optOrigExpr && not (Zset.subset ns2 ns1) then + if optOrigExprInfo.IsNone && not (Zset.subset ns2 ns1) then error (MissingFields(Zset.elements (Zset.diff ns2 ns1), m)) if not (Zset.subset ns1 ns2) then @@ -6415,18 +6454,19 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = let args = List.map snd fldsList - let expr = wrap (mkRecordExpr cenv.g (GetRecdInfo env, tcref, tinst, rfrefs, args, m)) + let expr = mkRecordExpr cenv.g (GetRecdInfo env, tcref, tinst, rfrefs, args, m) let expr = - match optOrigExpr with + match optOrigExprInfo with | None -> // '{ recd fields }'. // expr - | Some (old, oldv, _) -> + | Some (old, oldvaddr, _) -> // '{ recd with fields }'. // Assign the first object to a tmp and then construct - mkCompGenLet m oldv old expr + let wrap, oldaddr, _readonly, _writeonly = mkExprAddrOfExpr cenv.g tycon.IsStructOrEnumTycon false NeverMutates old None m + wrap (mkCompGenLet m oldvaddr oldaddr expr) expr, tpenv @@ -6661,8 +6701,8 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synObjTy match tryDestAppTy cenv.g objTy with - | None -> error(Error(FSComp.SR.tcNewMustBeUsedWithNamedType(), mNewExpr)) - | Some tcref -> + | ValueNone -> error(Error(FSComp.SR.tcNewMustBeUsedWithNamedType(), mNewExpr)) + | ValueSome tcref -> let isRecordTy = isRecdTy cenv.g objTy if not isRecordTy && not (isInterfaceTy cenv.g objTy) && isSealedTy cenv.g objTy then errorR(Error(FSComp.SR.tcCannotCreateExtensionOfSealedType(), mNewExpr)) @@ -6678,9 +6718,9 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, if // record construction ? isRecordTy || // object construction? - (isFSharpObjModelTy cenv.g objTy && not (isInterfaceTy cenv.g objTy) && Option.isNone argopt) then + (isFSharpObjModelTy cenv.g objTy && not (isInterfaceTy cenv.g objTy) && argopt.IsNone) then - if Option.isSome argopt then error(Error(FSComp.SR.tcNoArgumentsForRecordValue(), mWholeExpr)) + if argopt.IsSome then error(Error(FSComp.SR.tcNoArgumentsForRecordValue(), mWholeExpr)) if not (isNil extraImpls) then error(Error(FSComp.SR.tcNoInterfaceImplementationForConstructionExpression(), mNewExpr)) if isFSharpObjModelTy cenv.g objTy && GetCtorShapeCounter env <> 1 then error(Error(FSComp.SR.tcObjectConstructionCanOnlyBeUsedInClassTypes(), mNewExpr)) @@ -6887,17 +6927,12 @@ and TcAssertExpr cenv overallTy env (m:range) tpenv x = TcExpr cenv overallTy env tpenv callDiagnosticsExpr - -//------------------------------------------------------------------------- -// TcRecdExpr -//------------------------------------------------------------------------- - and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr) = let requiresCtor = (GetCtorShapeCounter env = 1) // Get special expression forms for constructors let haveCtor = Option.isSome inherits - let optOrigExpr, tpenv = + let optOrigExprInfo, tpenv = match optOrigExpr with | None -> None, tpenv | Some (origExpr, _) -> @@ -6905,10 +6940,10 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr | Some (_, _, mInherits, _, _) -> error(Error(FSComp.SR.tcInvalidRecordConstruction(), mInherits)) | None -> let olde, tpenv = TcExpr cenv overallTy env tpenv origExpr - let oldv, oldve = mkCompGenLocal mWholeExpr "inputRecord" overallTy - Some (olde, oldv, oldve), tpenv + let oldvaddr, oldvaddre = mkCompGenLocal mWholeExpr "inputRecord" (if isStructTy cenv.g overallTy then mkByrefTy cenv.g overallTy else overallTy) + Some (olde, oldvaddr, oldvaddre), tpenv - let hasOrigExpr = Option.isSome optOrigExpr + let hasOrigExpr = optOrigExprInfo.IsSome let fldsList = let flds = @@ -6968,7 +7003,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr errorR(InternalError("Unexpected failure in getting super type", mWholeExpr)) None, tpenv - let expr, tpenv = TcRecordConstruction cenv overallTy env tpenv optOrigExpr overallTy fldsList mWholeExpr + let expr, tpenv = TcRecordConstruction cenv overallTy env tpenv optOrigExprInfo overallTy fldsList mWholeExpr let expr = match superTy with @@ -6978,9 +7013,104 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr expr, tpenv -//------------------------------------------------------------------------- -// TcForEachExpr -//------------------------------------------------------------------------- +// Check '{| .... |}' +and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs, mWholeExpr) = + + match optOrigExpr with + | None -> + let unsortedIds = unsortedArgs |> List.map fst |> List.toArray + let anonInfo, sortedArgTys = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedIds + + // Sort into canonical order + let sortedIndexedArgs = unsortedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) + let sigma = List.map fst sortedIndexedArgs |> List.toArray + let sortedArgs = List.map snd sortedIndexedArgs + sortedArgs |> List.iteri (fun j (x, _) -> + let item = Item.AnonRecdField(anonInfo, sortedArgTys, j, x.idRange) + CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)) + let unsortedArgTys = sortedArgTys |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.map snd + let flexes = unsortedArgTys |> List.map (fun _ -> true) + let unsortedCheckedArgs, tpenv = TcExprs cenv env mWholeExpr tpenv flexes unsortedArgTys (List.map snd unsortedArgs) + let sortedCheckedArgs = unsortedCheckedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) |> List.map snd + + mkAnonRecd cenv.g mWholeExpr anonInfo sortedCheckedArgs sortedArgTys, tpenv + + | Some (origExpr, _) -> + // The fairly complex case '{| origExpr with X = 1; Y = 2 |}' + // The origExpr may be either a record or anonymous record. + // The origExpr may be either a struct or not. + // All the properties of origExpr are copied across except where they are overridden. + // The result is a field-sorted anonymous record. + // + // Unlike in the case of record type copy-and-update we do _not_ assume that the origExpr has the same type as the overall expression. + // Unlike in the case of record type copy-and-update {| a with X = 1 |} does not force a.X to exist or have had type 'int' + + let origExprTy = NewInferenceType() + let origExprChecked, tpenv = TcExpr cenv origExprTy env tpenv origExpr + let oldv, oldve = mkCompGenLocal mWholeExpr "inputRecord" origExprTy + let mOrigExpr = origExpr.Range + + if not (isAppTy cenv.g origExprTy || isAnonRecdTy cenv.g origExprTy) then + error (Error (FSComp.SR.tcCopyAndUpdateNeedsRecordType(), mOrigExpr)) + + let origExprIsStruct = + match tryDestAnonRecdTy cenv.g origExprTy with + | ValueSome (anonInfo, _) -> evalTupInfoIsStruct anonInfo.TupInfo + | ValueNone -> + let tcref, _ = destAppTy cenv.g origExprTy + tcref.IsStructOrEnumTycon + + let wrap, oldveaddr, _readonly, _writeonly = mkExprAddrOfExpr cenv.g origExprIsStruct false NeverMutates oldve None mOrigExpr + + // Put all the expressions in unsorted order. The new bindings come first. The origin of each is tracked using + /// - Choice1Of2 for a new binding + /// - Choice2Of2 for a binding coming from the original expression + let unsortedIdAndExprsAll = + [| for (id, e) in unsortedArgs do + yield (id, Choice1Of2 e) + match tryDestAnonRecdTy cenv.g origExprTy with + | ValueSome (anonInfo, tinst) -> + for (i, id) in Array.indexed anonInfo.SortedIds do + yield id, Choice2Of2 (mkAnonRecdFieldGetViaExprAddr (anonInfo, oldveaddr, tinst, i, mOrigExpr)) + | ValueNone -> + if isRecdTy cenv.g origExprTy then + let tcref, tinst = destAppTy cenv.g origExprTy + let fspecs = tcref.Deref.TrueInstanceFieldsAsList + for fspec in fspecs do + yield fspec.Id, Choice2Of2 (mkRecdFieldGetViaExprAddr (oldveaddr , tcref.MakeNestedRecdFieldRef fspec, tinst, mOrigExpr)) + else + error (Error (FSComp.SR.tcCopyAndUpdateNeedsRecordType(), mOrigExpr)) |] + |> Array.distinctBy (fst >> textOfId) + + let unsortedIdsAll = Array.map fst unsortedIdAndExprsAll + let anonInfo, sortedArgTysAll = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedIdsAll + let sortedIndexedArgsAll = unsortedIdAndExprsAll |> Array.indexed |> Array.sortBy (snd >> fst >> textOfId) + let sigma = Array.map fst sortedIndexedArgsAll // map from sorted indexes to unsorted indexes + let sortedArgsAll = Array.map snd sortedIndexedArgsAll + sortedArgsAll |> Array.iteri (fun j (x, expr) -> + match expr with + | Choice1Of2 _ -> + let item = Item.AnonRecdField(anonInfo, sortedArgTysAll, j, x.idRange) + CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) + | Choice2Of2 _ -> ()) + + let unsortedArgTysNew = sortedArgTysAll |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.take unsortedArgs.Length |> List.map snd + let flexes = unsortedArgTysNew |> List.map (fun _ -> true) + + let unsortedCheckedArgsNew, tpenv = TcExprs cenv env mWholeExpr tpenv flexes unsortedArgTysNew (List.map snd unsortedArgs) + let sortedArgTysAllArray = Array.ofList sortedArgTysAll + let unsortedCheckedArgsNewArray = unsortedCheckedArgsNew |> List.toArray + let sortedCheckedArgsAll = + sortedArgsAll |> Array.mapi (fun j (_, expr) -> + match expr with + | Choice1Of2 _ -> unsortedCheckedArgsNewArray.[sigma.[j]] + | Choice2Of2 subExpr -> UnifyTypes cenv env mOrigExpr (tyOfExpr cenv.g subExpr) sortedArgTysAllArray.[j]; subExpr) + + let expr = mkAnonRecd cenv.g mWholeExpr anonInfo (List.ofArray sortedCheckedArgsAll) sortedArgTysAll + let expr = wrap expr + let expr = mkCompGenLet mOrigExpr oldv origExprChecked expr + expr, tpenv + and TcForEachExpr cenv overallTy env tpenv (pat, enumSynExpr, bodySynExpr, mWholeExpr, spForLoop) = UnifyTypes cenv env mWholeExpr overallTy cenv.g.unit_ty @@ -7041,7 +7171,7 @@ and TcForEachExpr cenv overallTy env tpenv (pat, enumSynExpr, bodySynExpr, mWhol let bodyExpr = let valsDefinedByMatching = ListSet.remove valEq elemVar vspecs CompilePatternForMatch - cenv env enumSynExpr.Range pat.Range false IgnoreWithWarning (elemVar, []) + cenv env enumSynExpr.Range pat.Range false IgnoreWithWarning (elemVar, [], None) [TClause(pat, None, TTarget(valsDefinedByMatching, bodyExpr, SequencePointAtTarget), mForLoopStart)] enumElemTy overallTy @@ -7144,7 +7274,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv 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(args, [], 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, LongIdentWithDots([mkSynId m nm], []), m)) args m @@ -7510,7 +7640,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match patvs with | [] -> SynExpr.Const(SynConst.Unit, m) | [v] -> SynExpr.Ident v.Id - | vs -> SynExpr.Tuple((vs |> List.map (fun v -> SynExpr.Ident v.Id)), [], m) + | vs -> SynExpr.Tuple(false, (vs |> List.map (fun v -> SynExpr.Ident v.Id)), [], m) let mkSimplePatForVarSpace m (patvs: Val list) = let spats = @@ -7524,7 +7654,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match patvs with | [] -> SynPat.Const (SynConst.Unit, m) | [v] -> mkSynPatVar None v.Id - | vs -> SynPat.Tuple((vs |> List.map (fun x -> mkSynPatVar None x.Id)), m) + | vs -> SynPat.Tuple(false, (vs |> List.map (fun x -> mkSynPatVar None x.Id)), m) let (|OptionalSequential|) e = match e with @@ -7541,7 +7671,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let estimatedRangeOfIntendedLeftAndRightArguments = unionRanges (List.last args).Range arg2.Range errorR(Error(FSComp.SR.tcUnrecognizedQueryBinaryOperator(), estimatedRangeOfIntendedLeftAndRightArguments)) true - | SynExpr.Tuple( (StripApps(SingleIdent nm2, args) :: _), _, m) when + | SynExpr.Tuple(false, (StripApps(SingleIdent nm2, args) :: _), _, m) when expectedArgCountForCustomOperator nm2 > 0 && not (List.isEmpty args) -> let estimatedRangeOfIntendedLeftAndRightArguments = unionRanges (List.last args).Range m.EndRange @@ -7928,7 +8058,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let m1 = match innerComp1 with | SynExpr.IfThenElse (_, _, _, _, _, mIfToThen, _m) -> mIfToThen - | SynExpr.Match (SequencePointAtBinding mMatch, _, _, _, _) -> mMatch + | SynExpr.Match (SequencePointAtBinding mMatch, _, _, _) -> mMatch | SynExpr.TryWith (_, _, _, _, _, SequencePointAtTry mTry, _) -> mTry | SynExpr.TryFinally (_, _, _, SequencePointAtTry mTry, _) -> mTry | SynExpr.For (SequencePointAtForLoop mBind, _, _, _, _, _, _) -> mBind @@ -8041,14 +8171,14 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv | SynExpr.LetOrUseBang(_spBind, true, _isFromSource, pat, _rhsExpr, _innerComp, _) -> error(Error(FSComp.SR.tcInvalidUseBangBinding(), pat.Range)) - | SynExpr.Match (spMatch, expr, clauses, false, m) -> + | SynExpr.Match (spMatch, expr, clauses, m) -> let mMatch = match spMatch with SequencePointAtBinding mMatch -> mMatch | _ -> m if isQuery then error(Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery(), mMatch)) let clauses = clauses |> List.map (fun (Clause(pat, cond, innerComp, patm, sp)) -> Clause(pat, cond, transNoQueryOps innerComp, patm, sp)) - Some(translatedCtxt (SynExpr.Match(spMatch, expr, clauses, false, m))) + Some(translatedCtxt (SynExpr.Match(spMatch, expr, clauses, m))) // 'match! expr with pats ...' --> build.Bind(e1, (function pats ...)) - | SynExpr.MatchBang (spMatch, expr, clauses, false, m) -> + | SynExpr.MatchBang (spMatch, expr, clauses, m) -> let mMatch = match spMatch with SequencePointAtBinding mMatch -> mMatch | _ -> m if isQuery then error(Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery(), mMatch)) if isNil (TryFindIntrinsicOrExtensionMethInfo cenv env mMatch ad "Bind" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("Bind"), mMatch)) @@ -8164,180 +8294,180 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv /// Also "ienumerable extraction" is performed on arguments to "for". and TcSequenceExpression cenv env tpenv comp overallTy m = - let genEnumElemTy = NewInferenceType () - UnifyTypes cenv env m overallTy (mkSeqTy cenv.g genEnumElemTy) + let genEnumElemTy = NewInferenceType () + UnifyTypes cenv env m overallTy (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) + // 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) - let mkDelayedExpr (coreExpr:Expr) = - let m = coreExpr.Range - let overallTy = tyOfExpr cenv.g coreExpr - mkSeqDelay cenv env m overallTy coreExpr + let mkDelayedExpr (coreExpr:Expr) = + let m = coreExpr.Range + let overallTy = tyOfExpr cenv.g coreExpr + mkSeqDelay cenv env m overallTy coreExpr - let rec tryTcSequenceExprBody env genOuterTy tpenv comp = - match comp with - | SynExpr.ForEach (_spBind, SeqExprOnly _seqExprOnly, _isFromSource, pat, pseudoEnumExpr, innerComp, m) -> - // 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, arb_ty, tpenv = TcExprOfUnknownType cenv env tpenv pseudoEnumExpr - let enumExpr, enumElemTy = ConvertArbitraryExprToEnumerable cenv arb_ty env pseudoEnumExpr - let pat', _, vspecs, envinner, tpenv = TcMatchPattern cenv enumElemTy env tpenv (pat, None) - let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp + let rec tryTcSequenceExprBody env genOuterTy tpenv comp = + match comp with + | SynExpr.ForEach (_spBind, SeqExprOnly _seqExprOnly, _isFromSource, pat, pseudoEnumExpr, innerComp, m) -> + // 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, arb_ty, tpenv = TcExprOfUnknownType cenv env tpenv pseudoEnumExpr + let enumExpr, enumElemTy = ConvertArbitraryExprToEnumerable cenv arb_ty env pseudoEnumExpr + let pat', _, vspecs, envinner, tpenv = TcMatchPattern cenv enumElemTy env tpenv (pat, None) + let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp - match pat', vspecs, innerExpr with - // peephole optimization: "for x in e1 -> e2" == "e1 |> List.map (fun x -> e2)" *) - | (TPat_as (TPat_wild _, PBind (v, _), _), - vs, - Expr.App(Expr.Val(vf, _, _), _, [genEnumElemTy], [yexpr], _)) - when vs.Length = 1 && valRefEq cenv.g vf cenv.g.seq_singleton_vref -> + match pat', vspecs, innerExpr with + // peephole optimization: "for x in e1 -> e2" == "e1 |> List.map (fun x -> e2)" *) + | (TPat_as (TPat_wild _, PBind (v, _), _), + vs, + Expr.App(Expr.Val(vf, _, _), _, [genEnumElemTy], [yexpr], _)) + when vs.Length = 1 && valRefEq cenv.g vf cenv.g.seq_singleton_vref -> - let enumExprMark = enumExpr.Range - let lam = mkLambda enumExprMark v (yexpr, genEnumElemTy) + let enumExprMark = enumExpr.Range + let lam = mkLambda enumExprMark v (yexpr, genEnumElemTy) - // SEQUENCE POINTS: need to build a let here consuming spBind - let enumExpr = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g enumElemTy) (tyOfExpr cenv.g enumExpr) enumExpr - Some(mkCallSeqMap cenv.g m enumElemTy genEnumElemTy lam enumExpr, tpenv) + // SEQUENCE POINTS: need to build a let here consuming spBind + let enumExpr = mkCoerceIfNeeded cenv.g (mkSeqTy cenv.g enumElemTy) (tyOfExpr cenv.g enumExpr) enumExpr + Some(mkCallSeqMap cenv.g m enumElemTy genEnumElemTy lam enumExpr, tpenv) - | _ -> - let enumExprMark = enumExpr.Range + | _ -> + let enumExprMark = enumExpr.Range - // SEQUENCE POINTS: need to build a let here consuming spBind + // SEQUENCE POINTS: need to build a let here consuming spBind - let matchv, matchExpr = compileSeqExprMatchClauses cenv env enumExprMark (pat', vspecs) innerExpr enumElemTy genOuterTy - let lam = mkLambda enumExprMark matchv (matchExpr, tyOfExpr cenv.g matchExpr) - Some(mkSeqCollect cenv env m enumElemTy genOuterTy lam enumExpr , tpenv) + let matchv, matchExpr = compileSeqExprMatchClauses cenv env enumExprMark (pat', vspecs) innerExpr None enumElemTy genOuterTy + let lam = mkLambda enumExprMark matchv (matchExpr, tyOfExpr cenv.g matchExpr) + Some(mkSeqCollect cenv env m enumElemTy genOuterTy lam enumExpr , tpenv) - | SynExpr.For (spBind, id, start, dir, finish, innerComp, m) -> - Some(tcSequenceExprBody env genOuterTy tpenv (elimFastIntegerForLoop (spBind, id, start, dir, finish, innerComp, m))) + | SynExpr.For (spBind, id, start, dir, finish, innerComp, m) -> + Some(tcSequenceExprBody env genOuterTy tpenv (elimFastIntegerForLoop (spBind, id, start, dir, finish, innerComp, m))) - | SynExpr.While (_spWhile, guardExpr, innerComp, _m) -> - let guardExpr, tpenv = TcExpr cenv cenv.g.bool_ty env tpenv guardExpr - let innerExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp + | SynExpr.While (_spWhile, guardExpr, innerComp, _m) -> + let guardExpr, tpenv = TcExpr cenv cenv.g.bool_ty env tpenv guardExpr + let innerExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp - let guardExprMark = guardExpr.Range - let guardExpr = mkUnitDelayLambda cenv.g guardExprMark guardExpr - let innerExpr = mkDelayedExpr innerExpr - Some(mkSeqFromFunctions cenv env guardExprMark genOuterTy guardExpr innerExpr, tpenv) - - | SynExpr.TryFinally (innerComp, unwindExpr, _mTryToLast, _spTry, _spFinally) -> - let innerExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp - let unwindExpr, tpenv = TcExpr cenv cenv.g.unit_ty env tpenv unwindExpr + let guardExprMark = guardExpr.Range + let guardExpr = mkUnitDelayLambda cenv.g guardExprMark guardExpr + let innerExpr = mkDelayedExpr innerExpr + Some(mkSeqFromFunctions cenv env guardExprMark genOuterTy guardExpr innerExpr, tpenv) + + | SynExpr.TryFinally (innerComp, unwindExpr, _mTryToLast, _spTry, _spFinally) -> + let innerExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp + let unwindExpr, tpenv = TcExpr cenv cenv.g.unit_ty env tpenv unwindExpr - let unwindExprMark = unwindExpr.Range - let unwindExpr = mkUnitDelayLambda cenv.g unwindExprMark unwindExpr - let innerExpr = mkDelayedExpr innerExpr - let innerExprMark = innerExpr.Range + let unwindExprMark = unwindExpr.Range + let unwindExpr = mkUnitDelayLambda cenv.g unwindExprMark unwindExpr + let innerExpr = mkDelayedExpr innerExpr + let innerExprMark = innerExpr.Range - Some(mkSeqFinally cenv env innerExprMark genOuterTy innerExpr unwindExpr, tpenv) - | SynExpr.Paren (_, _, _, m) -> - error(Error(FSComp.SR.tcConstructIsAmbiguousInSequenceExpression(), m)) + Some(mkSeqFinally cenv env innerExprMark genOuterTy innerExpr unwindExpr, tpenv) + | SynExpr.Paren (_, _, _, m) -> + error(Error(FSComp.SR.tcConstructIsAmbiguousInSequenceExpression(), m)) - | SynExpr.ImplicitZero m -> - Some(mkSeqEmpty cenv env m genOuterTy, tpenv ) + | SynExpr.ImplicitZero m -> + Some(mkSeqEmpty cenv env m genOuterTy, tpenv ) - | SynExpr.DoBang(_rhsExpr, m) -> - error(Error(FSComp.SR.tcDoBangIllegalInSequenceExpression(), m)) + | SynExpr.DoBang(_rhsExpr, m) -> + error(Error(FSComp.SR.tcDoBangIllegalInSequenceExpression(), m)) - | SynExpr.Sequential(sp, true, innerComp1, innerComp2, m) -> - // "expr; cexpr" is treated as sequential execution - // "cexpr; cexpr" is treated as append - match tryTcSequenceExprBody env genOuterTy tpenv innerComp1 with - | None -> - let innerExpr1, tpenv = TcStmtThatCantBeCtorBody cenv env tpenv innerComp1 - let innerExpr2, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp2 - - Some(Expr.Sequential(innerExpr1, innerExpr2, NormalSeq, sp, m), tpenv) - - | Some (innerExpr1, tpenv) -> - let innerExpr2, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp2 - let innerExpr2 = mkDelayedExpr innerExpr2 - Some(mkSeqAppend cenv env innerComp1.Range genOuterTy innerExpr1 innerExpr2, tpenv) - - | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, _isRecovery, mIfToThen, mIfToEndOfElseBranch) -> - let guardExpr', tpenv = TcExpr cenv cenv.g.bool_ty env tpenv guardExpr - let thenExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv thenComp - let elseComp = (match elseCompOpt with Some c -> c | None -> SynExpr.ImplicitZero mIfToThen) - let elseExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv elseComp - Some(mkCond spIfToThen SequencePointAtTarget mIfToEndOfElseBranch genOuterTy guardExpr' thenExpr elseExpr, tpenv) - - // 'let x = expr in expr' - | SynExpr.LetOrUse (_, false (* not a 'use' binding *), _, _, _) -> - TcLinearExprs - (fun ty envinner tpenv e -> tcSequenceExprBody envinner ty tpenv e) - cenv env overallTy - tpenv - true - comp - (fun x -> x) |> Some - - // 'use x = expr in expr' - | SynExpr.LetOrUse (_isRec, true, [Binding (_vis, NormalBinding, _, _, _, _, _, pat, _, rhsExpr, _, _spBind)], innerComp, wholeExprMark) -> - - let bindPatTy = NewInferenceType () - let inputExprTy = NewInferenceType () - let pat', _, vspecs, envinner, tpenv = TcMatchPattern cenv bindPatTy env tpenv (pat, None) - UnifyTypes cenv env m inputExprTy bindPatTy - let inputExpr, tpenv = TcExpr cenv inputExprTy env tpenv rhsExpr - let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp - let inputExprMark = inputExpr.Range - let matchv, matchExpr = compileSeqExprMatchClauses cenv env inputExprMark (pat', vspecs) innerExpr bindPatTy genOuterTy - let consumeExpr = mkLambda wholeExprMark matchv (matchExpr, genOuterTy) - //SEQPOINT NEEDED - we must consume spBind on this path - Some(mkSeqUsing cenv env wholeExprMark bindPatTy genOuterTy inputExpr consumeExpr, tpenv) - - | SynExpr.LetOrUseBang(_, _, _, _, _, _, m) -> - error(Error(FSComp.SR.tcUseForInSequenceExpression(), m)) - - | SynExpr.Match (spMatch, expr, clauses, false, _) -> - let inputExpr, matchty, tpenv = TcExprOfUnknownType cenv env tpenv expr - let tclauses, tpenv = - List.mapFold - (fun tpenv (Clause(pat, cond, innerComp, _, sp)) -> - let pat', cond', vspecs, envinner, tpenv = TcMatchPattern cenv matchty env tpenv (pat, cond) - let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp - TClause(pat', cond', TTarget(vspecs, innerExpr, sp), pat'.Range), tpenv) - tpenv - clauses - let inputExprTy = tyOfExpr cenv.g inputExpr - let inputExprMark = inputExpr.Range - let matchv, matchExpr = CompilePatternForMatchClauses cenv env inputExprMark inputExprMark true ThrowIncompleteMatchException inputExprTy genOuterTy tclauses - Some(mkLet spMatch inputExprMark matchv inputExpr matchExpr, tpenv) - - | SynExpr.TryWith (_, mTryToWith, _, _, _, _, _) -> - error(Error(FSComp.SR.tcTryIllegalInSequenceExpression(), mTryToWith)) - - | SynExpr.YieldOrReturnFrom((isYield, _), yieldExpr, m) -> - let resultExpr, genExprTy, tpenv = TcExprOfUnknownType cenv env tpenv yieldExpr - - if not isYield then errorR(Error(FSComp.SR.tcUseYieldBangForMultipleResults(), m)) - - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace genOuterTy genExprTy - Some(mkCoerceExpr(resultExpr, genOuterTy, m, genExprTy), tpenv) - - | SynExpr.YieldOrReturn((isYield, _), yieldExpr, m) -> - let genResultTy = NewInferenceType () - 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 yieldExpr - Some(mkCallSeqSingleton cenv.g m genResultTy resultExpr, tpenv ) + | SynExpr.Sequential(sp, true, innerComp1, innerComp2, m) -> + // "expr; cexpr" is treated as sequential execution + // "cexpr; cexpr" is treated as append + match tryTcSequenceExprBody env genOuterTy tpenv innerComp1 with + | None -> + let innerExpr1, tpenv = TcStmtThatCantBeCtorBody cenv env tpenv innerComp1 + let innerExpr2, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp2 + + Some(Expr.Sequential(innerExpr1, innerExpr2, NormalSeq, sp, m), tpenv) + + | Some (innerExpr1, tpenv) -> + let innerExpr2, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp2 + let innerExpr2 = mkDelayedExpr innerExpr2 + Some(mkSeqAppend cenv env innerComp1.Range genOuterTy innerExpr1 innerExpr2, tpenv) + + | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, _isRecovery, mIfToThen, mIfToEndOfElseBranch) -> + let guardExpr', tpenv = TcExpr cenv cenv.g.bool_ty env tpenv guardExpr + let thenExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv thenComp + let elseComp = (match elseCompOpt with Some c -> c | None -> SynExpr.ImplicitZero mIfToThen) + let elseExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv elseComp + Some(mkCond spIfToThen SequencePointAtTarget mIfToEndOfElseBranch genOuterTy guardExpr' thenExpr elseExpr, tpenv) + + // 'let x = expr in expr' + | SynExpr.LetOrUse (_, false (* not a 'use' binding *), _, _, _) -> + TcLinearExprs + (fun ty envinner tpenv e -> tcSequenceExprBody envinner ty tpenv e) + cenv env overallTy + tpenv + true + comp + (fun x -> x) |> Some - | _ -> None + // 'use x = expr in expr' + | SynExpr.LetOrUse (_isRec, true, [Binding (_vis, NormalBinding, _, _, _, _, _, pat, _, rhsExpr, _, _spBind)], innerComp, wholeExprMark) -> + + let bindPatTy = NewInferenceType () + let inputExprTy = NewInferenceType () + let pat', _, vspecs, envinner, tpenv = TcMatchPattern cenv bindPatTy env tpenv (pat, None) + UnifyTypes cenv env m inputExprTy bindPatTy + let inputExpr, tpenv = TcExpr cenv inputExprTy env tpenv rhsExpr + let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp + let inputExprMark = inputExpr.Range + let matchv, matchExpr = compileSeqExprMatchClauses cenv env inputExprMark (pat', vspecs) innerExpr (Some inputExpr) bindPatTy genOuterTy + let consumeExpr = mkLambda wholeExprMark matchv (matchExpr, genOuterTy) + //SEQPOINT NEEDED - we must consume spBind on this path + Some(mkSeqUsing cenv env wholeExprMark bindPatTy genOuterTy inputExpr consumeExpr, tpenv) + + | SynExpr.LetOrUseBang(_, _, _, _, _, _, m) -> + error(Error(FSComp.SR.tcUseForInSequenceExpression(), m)) + + | SynExpr.Match (spMatch, expr, clauses, _) -> + let inputExpr, matchty, tpenv = TcExprOfUnknownType cenv env tpenv expr + let tclauses, tpenv = + List.mapFold + (fun tpenv (Clause(pat, cond, innerComp, _, sp)) -> + let pat', cond', vspecs, envinner, tpenv = TcMatchPattern cenv matchty env tpenv (pat, cond) + let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp + TClause(pat', cond', TTarget(vspecs, innerExpr, sp), pat'.Range), tpenv) + tpenv + clauses + 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 (_, mTryToWith, _, _, _, _, _) -> + error(Error(FSComp.SR.tcTryIllegalInSequenceExpression(), mTryToWith)) + + | SynExpr.YieldOrReturnFrom((isYield, _), yieldExpr, m) -> + let resultExpr, genExprTy, tpenv = TcExprOfUnknownType cenv env tpenv yieldExpr + + if not isYield then errorR(Error(FSComp.SR.tcUseYieldBangForMultipleResults(), m)) + + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace genOuterTy genExprTy + Some(mkCoerceExpr(resultExpr, genOuterTy, m, genExprTy), tpenv) + + | SynExpr.YieldOrReturn((isYield, _), yieldExpr, m) -> + let genResultTy = NewInferenceType () + 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 yieldExpr + Some(mkCallSeqSingleton cenv.g m genResultTy resultExpr, tpenv ) + + | _ -> None - and tcSequenceExprBody env genOuterTy tpenv comp = - match tryTcSequenceExprBody env genOuterTy tpenv comp with - | Some e -> e - | None -> - // seq { ...; expr } is treated as 'seq { ... ; expr; yield! Seq.empty }' - // Note this means seq { ...; () } is treated as 'seq { ... ; (); yield! Seq.empty }' - let m = comp.Range - let env = { env with eContextInfo = ContextInfo.SequenceExpression genOuterTy } - let expr, tpenv = TcStmtThatCantBeCtorBody cenv env tpenv comp - Expr.Sequential(expr, mkSeqEmpty cenv env m genOuterTy, NormalSeq, SuppressSequencePointOnStmtOfSequential, m), tpenv + and tcSequenceExprBody env genOuterTy tpenv comp = + match tryTcSequenceExprBody env genOuterTy tpenv comp with + | Some e -> e + | None -> + // seq { ...; expr } is treated as 'seq { ... ; expr; yield! Seq.empty }' + // Note this means seq { ...; () } is treated as 'seq { ... ; (); yield! Seq.empty }' + let m = comp.Range + let env = { env with eContextInfo = ContextInfo.SequenceExpression genOuterTy } + let expr, tpenv = TcStmtThatCantBeCtorBody cenv env tpenv comp + Expr.Sequential(expr, mkSeqEmpty cenv env m genOuterTy, NormalSeq, SuppressSequencePointOnStmtOfSequential, m), tpenv - let coreExpr, tpenv = tcSequenceExprBody env overallTy tpenv comp - let delayedExpr = mkDelayedExpr coreExpr - delayedExpr, tpenv + let coreExpr, tpenv = tcSequenceExprBody env overallTy tpenv comp + let delayedExpr = mkDelayedExpr coreExpr + delayedExpr, tpenv /// When checking sequence of function applications, /// type applications and dot-notation projections, first extract known @@ -8381,7 +8511,7 @@ and Propagate cenv overallTy env tpenv (expr: ApplicableExpr) exprty delayed = | DelayedApp (_, arg, mExprAndArg) :: delayedList' -> let denv = env.DisplayEnv match UnifyFunctionTypeUndoIfFailed cenv denv mExpr exprty with - | Some (_, resultTy) -> + | ValueSome (_, resultTy) -> // We add tag parameter to the return type for "&x" and 'NativePtr.toByRef' // See RFC FS-1053.md @@ -8394,7 +8524,7 @@ and Propagate cenv overallTy env tpenv (expr: ApplicableExpr) exprty delayed = propagate isAddrOf delayedList' mExprAndArg resultTy - | None -> + | _ -> let mArg = arg.Range match arg with | SynExpr.CompExpr _ -> () @@ -8433,7 +8563,7 @@ and TcDelayed cenv overallTy env tpenv mExpr expr exprty (atomicFlag:ExprAtomicF match delayed with | [] | DelayedDot :: _ -> - UnifyTypesAndRecover cenv env mExpr overallTy exprty + UnifyTypes cenv env mExpr overallTy exprty expr.Expr, tpenv // expr.M(args) where x.M is a .NET method or index property // expr.M(args) where x.M is a .NET method or index property @@ -8482,7 +8612,7 @@ and TcFunctionApplicationThen cenv overallTy env tpenv mExprAndArg expr exprty ( // 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 match UnifyFunctionTypeUndoIfFailed cenv denv mFunExpr exprty with - | Some (domainTy, resultTy) -> + | ValueSome (domainTy, resultTy) -> // Notice the special case 'seq { ... }'. In this case 'seq' is actually a function in the F# library. // Set a flag in the syntax tree to say we noticed a leading 'seq' @@ -8499,7 +8629,7 @@ and TcFunctionApplicationThen cenv overallTy env tpenv mExprAndArg expr exprty ( let arg, tpenv = TcExpr cenv domainTy env tpenv synArg let exprAndArg, resultTy = buildApp cenv expr resultTy arg mExprAndArg TcDelayed cenv overallTy env tpenv mExprAndArg exprAndArg resultTy atomicFlag delayed - | None -> + | _ -> // OK, 'expr' doesn't have function type, but perhaps 'expr' is a computation expression builder, and 'arg' is '{ ... }' match synArg with | SynExpr.CompExpr (false, _isNotNakedRefCell, comp, _m) -> @@ -8546,7 +8676,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | (Item.UnionCase _ | Item.ExnCase _ | Item.ActivePatternResult _) as item -> // ucaseAppTy is the type of the union constructor applied to its (optional) argument let ucaseAppTy = NewInferenceType () - let mkConstrApp, argtys, argNames = + let mkConstrApp, argTys, argNames = match item with | Item.ActivePatternResult(apinfo, _, n, _) -> let aparity = apinfo.Names.Length @@ -8561,16 +8691,16 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del ApplyUnionCaseOrExnTypes mItem cenv env ucaseAppTy (Item.UnionCase(ucinfo, false)) | _ -> ApplyUnionCaseOrExnTypes mItem cenv env ucaseAppTy item - let nargtys = List.length argtys + let numArgTys = List.length argTys // Subsumption at data constructions if argument type is nominal prior to equations for any arguments or return types - let flexes = argtys |> List.map (isTyparTy cenv.g >> not) + let flexes = argTys |> List.map (isTyparTy cenv.g >> not) let (|FittedArgs|_|) arg = match arg with - | SynExprParen(SynExpr.Tuple(args, _, _), _, _, _) - | SynExpr.Tuple(args, _, _) when nargtys > 1 -> Some args + | SynExprParen(SynExpr.Tuple(false, args, _, _), _, _, _) + | SynExpr.Tuple(false, args, _, _) when numArgTys > 1 -> Some args | SynExprParen(arg, _, _, _) - | arg when nargtys = 1 -> Some [arg] + | arg when numArgTys = 1 -> Some [arg] | _ -> None match delayed with @@ -8580,8 +8710,8 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del if isNil otherDelayed then UnifyTypes cenv env mExprAndArg overallTy ucaseAppTy - let nargs = List.length args - UnionCaseOrExnCheck env nargtys nargs mExprAndArg + let numArgs = List.length args + UnionCaseOrExnCheck env numArgTys numArgs mExprAndArg // if we manage to get here - number of formal arguments = number of actual arguments // apply named parameters @@ -8592,7 +8722,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | [] -> args | _ -> - let fittedArgs = Array.zeroCreate nargtys + let fittedArgs = Array.zeroCreate numArgTys // first: put all positional arguments let mutable currentIndex = 0 @@ -8615,7 +8745,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | Item.UnionCase(uci, _) -> Some(ArgumentContainer.UnionCase(uci)) | Item.ExnCase tref -> Some(ArgumentContainer.Type(tref)) | _ -> None - let argItem = Item.ArgName (argNames.[i], argtys.[i], argContainerOpt) + let argItem = Item.ArgName (argNames.[i], argTys.[i], argContainerOpt) CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, argItem, argItem, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, ad) else error(Error(FSComp.SR.tcUnionCaseFieldCannotBeUsedMoreThanOnce(id.idText), id.idRange)) currentIndex <- SEEN_NAMED_ARGUMENT @@ -8628,8 +8758,8 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del // then we'll favor old behavior and treat current argument as positional. let isSpecialCaseForBackwardCompatibility = (currentIndex <> SEEN_NAMED_ARGUMENT) && - (currentIndex < nargtys) && - match stripTyEqns cenv.g argtys.[currentIndex] with + (currentIndex < numArgTys) && + match stripTyEqns cenv.g argTys.[currentIndex] with | TType_app(tcref, _) -> tyconRefEq cenv.g cenv.g.bool_tcr tcref || tyconRefEq cenv.g cenv.g.system_Bool_tcref tcref | TType_var(_) -> true | _ -> false @@ -8638,18 +8768,21 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del assert (isNull(box fittedArgs.[currentIndex])) fittedArgs.[currentIndex] <- List.item currentIndex args // grab original argument, not item from the list of named parameters currentIndex <- currentIndex + 1 - else - let caseName = - match item with - | Item.UnionCase(uci, _) -> uci.Name - | Item.ExnCase tcref -> tcref.DisplayName - | _ -> failwith "impossible" - error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(caseName, id.idText), id.idRange)) + else + match item with + | Item.UnionCase(uci, _) -> + error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(uci.Name, id.idText), id.idRange)) + | Item.ExnCase tcref -> + error(Error(FSComp.SR.tcExceptionConstructorDoesNotHaveFieldWithGivenName(tcref.DisplayName, id.idText), id.idRange)) + | Item.ActivePatternResult(_,_,_,_) -> + error(Error(FSComp.SR.tcActivePatternsDoNotHaveFields(), id.idRange)) + | _ -> + error(Error(FSComp.SR.tcConstructorDoesNotHaveFieldWithGivenName(id.idText), id.idRange)) assert (Seq.forall (box >> ((<>) null) ) fittedArgs) List.ofArray fittedArgs - let args', tpenv = TcExprs cenv env mExprAndArg tpenv flexes argtys args + let args', tpenv = TcExprs cenv env mExprAndArg tpenv flexes argTys args PropagateThenTcDelayed cenv overallTy env tpenv mExprAndArg (MakeApplicableExprNoFlex cenv (mkConstrApp mExprAndArg args')) ucaseAppTy atomicFlag otherDelayed | DelayedTypeApp (_x, mTypeArgs, _mExprAndTypeArgs) :: _delayed' -> @@ -8660,25 +8793,25 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del // (or else we would be building an invalid expression) // Unit-taking active pattern result can be applied to no args - let nargs, mkExpr = + let numArgs, mkExpr = // This is where the constructor is an active pattern result applied to no argument // Unit-taking active pattern result can be applied to no args - if (nargtys = 1 && match item with Item.ActivePatternResult _ -> true | _ -> false) then - UnifyTypes cenv env mItem (List.head argtys) cenv.g.unit_ty + if (numArgTys = 1 && match item with Item.ActivePatternResult _ -> true | _ -> false) then + UnifyTypes cenv env mItem (List.head argTys) cenv.g.unit_ty 1, (fun () -> mkConstrApp mItem [mkUnit cenv.g mItem]) // This is where the constructor expects no arguments and is applied to no argument - elif nargtys = 0 then + elif numArgTys = 0 then 0, (fun () -> mkConstrApp mItem []) else // This is where the constructor expects arguments but is not applied to arguments, hence build a lambda - nargtys, + numArgTys, (fun () -> - let vs, args = argtys |> List.mapi (fun i ty -> mkCompGenLocal mItem ("arg" + string i) ty) |> List.unzip + let vs, args = argTys |> List.mapi (fun i ty -> mkCompGenLocal mItem ("arg" + string i) ty) |> List.unzip let constrApp = mkConstrApp mItem args let lam = mkMultiLambda mItem vs (constrApp, tyOfExpr cenv.g constrApp) lam) - UnionCaseOrExnCheck env nargtys nargs mItem + UnionCaseOrExnCheck env numArgTys numArgs mItem let expr = mkExpr() let exprTy = tyOfExpr cenv.g expr PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprNoFlex cenv expr) exprTy ExprAtomicFlag.Atomic delayed @@ -8859,14 +8992,14 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | SynExpr.Const _ | SynExpr.LongIdent _ -> true - | SynExpr.Tuple(synExprs, _, _) - | SynExpr.StructTuple(synExprs, _, _) + | SynExpr.Tuple(_, synExprs, _, _) | SynExpr.ArrayOrList(_, synExprs, _) -> synExprs |> List.forall isSimpleArgument | SynExpr.Record(_, copyOpt, fields, _) -> copyOpt |> Option.forall (fst >> isSimpleArgument) && fields |> List.forall (p23 >> Option.forall isSimpleArgument) | SynExpr.App (_, _, synExpr, synExpr2, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 | SynExpr.IfThenElse(synExpr, synExpr2, synExprOpt, _, _, _, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt | SynExpr.DotIndexedGet(synExpr, _, _, _) -> isSimpleArgument synExpr | SynExpr.ObjExpr _ + | SynExpr.AnonRecd _ | SynExpr.While _ | SynExpr.For _ | SynExpr.ForEach _ @@ -9212,10 +9345,10 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela | Item.RecdField rfinfo -> // Get or set instance F# field or literal RecdFieldInstanceChecks cenv.g cenv.amap ad mItem rfinfo - let tgty = rfinfo.DeclaringType - let valu = isStructTy cenv.g tgty - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css mItem NoTrace tgty objExprTy - let objExpr = if valu then objExpr else mkCoerceExpr(objExpr, tgty, mExprAndItem, objExprTy) + let tgtTy = rfinfo.DeclaringType + let valu = isStructTy cenv.g tgtTy + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css mItem NoTrace tgtTy objExprTy + let objExpr = if valu then objExpr else mkCoerceExpr(objExpr, tgtTy, mExprAndItem, objExprTy) let fieldTy = rfinfo.FieldType match delayed with | DelayedSet(e2, mStmt) :: otherDelayed -> @@ -9233,6 +9366,18 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela let objExpr' = mkRecdFieldGet cenv.g (objExpr, rfinfo.RecdFieldRef, rfinfo.TypeInst, mExprAndItem) PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env objExpr') fieldTy ExprAtomicFlag.Atomic delayed + | Item.AnonRecdField (anonInfo, tinst, n, _) -> + let tgty = TType_anon (anonInfo, tinst) + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css mItem NoTrace tgty objExprTy + let fieldTy = List.item n tinst + match delayed with + | DelayedSet _ :: _otherDelayed -> + error(Error(FSComp.SR.tcInvalidAssignment(),mItem)) + | _ -> + // Instance F# Anonymous Record + let objExpr' = mkAnonRecdFieldGet cenv.g (anonInfo,objExpr,tinst,n,mExprAndItem) + PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env objExpr') fieldTy ExprAtomicFlag.Atomic delayed + | Item.ILField finfo -> // Get or set instance IL field ILFieldInstanceChecks cenv.g cenv.amap ad mItem finfo @@ -9793,10 +9938,11 @@ and TcMethodApplication let objArgPreBinder, objArgs = match objArgs, lambdaVars with | [objArg], Some _ -> + if finalCalledMethInfo.IsExtensionMember && finalCalledMethInfo.ObjArgNeedsAddress(cenv.amap, mMethExpr) then + error(Error(FSComp.SR.tcCannotPartiallyApplyExtensionMethodForByref(finalCalledMethInfo.DisplayName), mMethExpr)) let objArgTy = tyOfExpr cenv.g objArg let v, ve = mkCompGenLocal mMethExpr "objectArg" objArgTy (fun body -> mkCompGenLet mMethExpr v objArg body), [ve] - | _ -> emptyPreBinder, objArgs @@ -9914,7 +10060,7 @@ and TcMethodApplication | CallerLineNumber, _ when typeEquiv cenv.g currCalledArgTy cenv.g.int_ty -> emptyPreBinder, Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) | CallerFilePath, _ when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> - emptyPreBinder, Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, currCalledArgTy) + emptyPreBinder, Expr.Const(Const.String(FileSystem.GetFullPathShim(mMethExpr.FileName)), mMethExpr, currCalledArgTy) | CallerMemberName, Some(callerName) when (typeEquiv cenv.g currCalledArgTy cenv.g.string_ty) -> emptyPreBinder, Expr.Const(Const.String(callerName), mMethExpr, currCalledArgTy) | _ -> @@ -9953,7 +10099,7 @@ and TcMethodApplication let lineExpr = Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, calledNonOptTy) emptyPreBinder, mkUnionCaseExpr(mkSomeCase cenv.g, [calledNonOptTy], [lineExpr], mMethExpr) | CallerFilePath, _ when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> - let filePathExpr = Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, calledNonOptTy) + let filePathExpr = Expr.Const(Const.String(FileSystem.GetFullPathShim(mMethExpr.FileName)), mMethExpr, calledNonOptTy) emptyPreBinder, mkUnionCaseExpr(mkSomeCase cenv.g, [calledNonOptTy], [filePathExpr], mMethExpr) | CallerMemberName, Some(callerName) when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> let memberNameExpr = Expr.Const(Const.String(callerName), mMethExpr, calledNonOptTy) @@ -10004,7 +10150,7 @@ and TcMethodApplication finalUnnamedCalledOutArgs |> List.map (fun calledArg -> let calledArgTy = calledArg.CalledArgumentType let outArgTy = destByrefTy cenv.g calledArgTy - let outv, outArgExpr = mkMutableCompGenLocal mMethExpr "outArg" outArgTy // mutable! + let outv, outArgExpr = mkMutableCompGenLocal mMethExpr PrettyNaming.outArgCompilerGeneratedName outArgTy // mutable! let expr = mkDefault(mMethExpr, outArgTy) let callerArg = CallerArg(calledArgTy, mMethExpr, false, mkValAddr mMethExpr false (mkLocalValRef outv)) let outArg = { NamedArgIdOpt=None;CalledArg=calledArg;CallerArg=callerArg } @@ -10206,10 +10352,10 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfo if allRowsGiveSameArgumentType then // Force the caller to be a function type. match UnifyFunctionTypeUndoIfFailed cenv env.DisplayEnv mArg callerLambdaTy with - | Some (callerLambdaDomainTy, callerLambdaRangeTy) -> + | ValueSome (callerLambdaDomainTy, callerLambdaRangeTy) -> if AddCxTypeEqualsTypeUndoIfFailed env.DisplayEnv cenv.css mArg calledLambdaArgTy callerLambdaDomainTy then loop callerLambdaRangeTy (lambdaVarNum + 1) - | None -> () + | _ -> () loop argTy 0 let e', tpenv = TcExpr cenv argTy env tpenv argExpr @@ -10298,10 +10444,10 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = cont (bodyChecker overallTy env tpenv expr) /// Typecheck and compile pattern-matching constructs -and TcAndPatternCompileMatchClauses mExpr matchm actionOnFailure cenv inputTy resultTy env tpenv clauses = - let tclauses, tpenv = TcMatchClauses cenv inputTy resultTy env tpenv clauses - let v, expr = CompilePatternForMatchClauses cenv env mExpr matchm true actionOnFailure inputTy resultTy tclauses - v, expr, tpenv +and TcAndPatternCompileMatchClauses mExpr matchm actionOnFailure cenv inputExprOpt inputTy resultTy env tpenv synClauses = + let clauses, tpenv = TcMatchClauses cenv inputTy resultTy env tpenv synClauses + let matchVal, expr = CompilePatternForMatchClauses cenv env mExpr matchm true actionOnFailure inputExprOpt inputTy resultTy clauses + matchVal, expr, tpenv and TcMatchPattern cenv inputTy env tpenv (pat:SynPat, optWhenExpr) = let m = pat.Range @@ -10682,11 +10828,10 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let conditionalCallDefineOpt = TryFindTyconRefStringAttribute cenv.g mAttr cenv.g.attrib_ConditionalAttribute tcref - match conditionalCallDefineOpt with - | Some d when not (List.contains d cenv.conditionalDefines) -> + match conditionalCallDefineOpt, cenv.conditionalDefines with + | Some d, Some defines when not (List.contains d defines) -> [], false | _ -> - // REVIEW: take notice of inherited? let validOn, _inherited = let validOnDefault = 0x7fff @@ -10747,6 +10892,7 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = | Exception _ when canFail -> [ ], true | res -> let item = ForceRaise res + if not (ExistsHeadTypeInEntireHierarchy cenv.g cenv.amap mAttr ty cenv.g.tcref_System_Attribute) then warning(Error(FSComp.SR.tcTypeDoesNotInheritAttribute(), mAttr)) let attrib = match item with | Item.CtorGroup(methodName, minfos) -> @@ -10845,16 +10991,16 @@ and TcAttributes cenv env attrTgt synAttribs = // TcLetBinding //------------------------------------------------------------------------ -and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds, bindsm, scopem) = +and TcLetBinding cenv isUse env containerInfo declKind tpenv (synBinds, synBindsRange, scopem) = // Typecheck all the bindings... - let binds', tpenv = List.mapFold (fun tpenv b -> TcNonRecursiveBinding declKind cenv env tpenv (NewInferenceType ()) b) tpenv binds + let checkedBinds, tpenv = List.mapFold (fun tpenv b -> TcNonRecursiveBinding declKind cenv env tpenv (NewInferenceType ()) b) tpenv synBinds let (ContainerInfo(altActualParent, _)) = containerInfo // Canonicalize constraints prior to generalization let denv = env.DisplayEnv - GeneralizationHelpers.CanonicalizePartialInferenceProblem (cenv, denv, bindsm) - (binds' |> List.collect (fun tbinfo -> + GeneralizationHelpers.CanonicalizePartialInferenceProblem (cenv, denv, synBindsRange) + (checkedBinds |> List.collect (fun tbinfo -> let (CheckedBindingInfo(_, _, _, _, flex, _, _, _, tauTy, _, _, _, _, _)) = tbinfo let (ExplicitTyparInfo(_, declaredTypars, _)) = flex let maxInferredTypars = (freeInTypeLeftToRight cenv.g false tauTy) @@ -10863,7 +11009,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds, bindsm, sco let lazyFreeInEnv = lazy (GeneralizationHelpers.ComputeUngeneralizableTypars env) // Generalize the bindings... - (((fun x -> x), env, tpenv), binds') ||> List.fold (fun (mkf_sofar, env, tpenv) tbinfo -> + (((fun x -> x), env, tpenv), checkedBinds) ||> List.fold (fun (buildExpr, env, tpenv) tbinfo -> let (CheckedBindingInfo(inlineFlag, attrs, doc, tcPatPhase2, flex, nameToPrelimValSchemeMap, rhsExpr, _, tauTy, m, spBind, _, konst, isFixed)) = tbinfo let enclosingDeclaredTypars = [] let (ExplicitTyparInfo(_, declaredTypars, canInferTypars)) = flex @@ -10889,54 +11035,62 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds, bindsm, sco let tpenv = HideUnscopedTypars generalizedTypars tpenv let valSchemes = NameMap.map (UseCombinedArity cenv.g declKind rhsExpr) prelimValSchemes2 let values = MakeAndPublishVals cenv env (altActualParent, false, declKind, ValNotInRecScope, valSchemes, attrs, doc, konst) - let pat' = tcPatPhase2 (TcPatPhase2Input (values, true)) + let checkedPat = tcPatPhase2 (TcPatPhase2Input (values, true)) let prelimRecValues = NameMap.map fst values // Now bind the r.h.s. to the l.h.s. let rhsExpr = mkTypeLambda m generalizedTypars (rhsExpr, tauTy) - match pat' with + match checkedPat with // Don't introduce temporary or 'let' for 'match against wild' or 'match against unit' | (TPat_wild _ | TPat_const (Const.Unit, _)) when not isUse && not isFixed && isNil generalizedTypars -> - let mk_seq_bind (tm, tmty) = (mkSequential SequencePointsAtSeq m rhsExpr tm, tmty) - (mk_seq_bind << mkf_sofar, env, tpenv) + let mkSequentialBind (tm, tmty) = (mkSequential SequencePointsAtSeq m rhsExpr tm, tmty) + (buildExpr >> mkSequentialBind , env, tpenv) | _ -> // nice: don't introduce awful temporary for r.h.s. in the 99% case where we know what we're binding it to - let tmp, pat'' = - match pat' with - // nice: don't introduce awful temporary for r.h.s. in the 99% case where we know what we're binding it to - | TPat_as (pat1, PBind(v, TypeScheme(generalizedTypars', _)), _) - when List.lengthsEqAndForall2 typarRefEq generalizedTypars generalizedTypars' -> + let patternInputTmp, checkedPat2 = + match checkedPat with + // nice: don't introduce awful temporary for r.h.s. in the 99% case where we know what we're binding it to + | TPat_as (pat, PBind(v, TypeScheme(generalizedTypars', _)), _) + when List.lengthsEqAndForall2 typarRefEq generalizedTypars generalizedTypars' -> - v, pat1 + v, pat + //Op (LValueOp (LByrefGet,x),[],[],C:\GitHub\dsyme\visualfsharp\a.fs (15,42--15,43) IsSynthetic=false) - | _ when inlineFlag.MustInline -> error(Error(FSComp.SR.tcInvalidInlineSpecification(), m)) + | _ when inlineFlag.MustInline -> + error(Error(FSComp.SR.tcInvalidInlineSpecification(), m)) - | _ -> - let tmp, _ = mkCompGenLocal m "patternInput" (generalizedTypars +-> tauTy) - if isUse || isFixed then - errorR(Error(FSComp.SR.tcInvalidUseBinding(), m)) + | _ -> + + let tmp, _ = mkCompGenLocal m "patternInput" (generalizedTypars +-> tauTy) + + if isUse || isFixed then + errorR(Error(FSComp.SR.tcInvalidUseBinding(), m)) - // This assignment forces representation as module value, to maintain the invariant from the - // type checker that anything related to binding module-level values is marked with an - // val_repr_info, val_declaring_entity and is_topbind - if (DeclKind.MustHaveArity declKind) then - AdjustValToTopVal tmp altActualParent (InferArityOfExprBinding cenv.g AllowTypeDirectedDetupling.Yes tmp rhsExpr) - tmp, pat' + // If the overall declaration is declaring statics or a module value, then force the patternInputTmp to also + // have representation as module value. + if (DeclKind.MustHaveArity declKind) then + AdjustValToTopVal tmp altActualParent (InferArityOfExprBinding cenv.g AllowTypeDirectedDetupling.Yes tmp rhsExpr) + + tmp, checkedPat + // Add the bind "let patternInputTmp = rhsExpr" to the bodyExpr we get from mkPatBind let mkRhsBind (bodyExpr, bodyExprTy) = - let letExpr = mkLet spBind m tmp rhsExpr bodyExpr + let letExpr = mkLet spBind m patternInputTmp rhsExpr bodyExpr letExpr, bodyExprTy let allValsDefinedByPattern = NameMap.range prelimRecValues + + // Add the compilation of the pattern to the bodyExpr we get from mkCleanup let mkPatBind (bodyExpr, bodyExprTy) = - let valsDefinedByMatching = ListSet.remove valEq tmp allValsDefinedByPattern - let matchx = CompilePatternForMatch cenv env m m true ThrowIncompleteMatchException (tmp, generalizedTypars) [TClause(pat'', None, TTarget(valsDefinedByMatching, bodyExpr, SuppressSequencePointAtTarget), m)] tauTy bodyExprTy + let valsDefinedByMatching = ListSet.remove valEq patternInputTmp allValsDefinedByPattern + let matchx = CompilePatternForMatch cenv env m m true ThrowIncompleteMatchException (patternInputTmp, generalizedTypars, Some rhsExpr) [TClause(checkedPat2, None, TTarget(valsDefinedByMatching, bodyExpr, SuppressSequencePointAtTarget), m)] tauTy bodyExprTy let matchx = if (DeclKind.ConvertToLinearBindings declKind) then LinearizeTopMatch cenv.g altActualParent matchx else matchx matchx, bodyExprTy + // Add the dispose of any "use x = ..." to bodyExpr let mkCleanup (bodyExpr, bodyExprTy) = if isUse && not isFixed then (allValsDefinedByPattern, (bodyExpr, bodyExprTy)) ||> List.foldBack (fun v (bodyExpr, bodyExprTy) -> @@ -10945,10 +11099,10 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds, bindsm, sco mkTryFinally cenv.g (bodyExpr, cleanupE, m, bodyExprTy, SequencePointInBodyOfTry, NoSequencePointAtFinally), bodyExprTy) else (bodyExpr, bodyExprTy) - - ((mkf_sofar >> mkCleanup >> mkPatBind >> mkRhsBind), - AddLocalValMap cenv.tcSink scopem prelimRecValues env, - tpenv)) + + let envInner = AddLocalValMap cenv.tcSink scopem prelimRecValues env + + ((buildExpr >> mkCleanup >> mkPatBind >> mkRhsBind), envInner, tpenv)) /// Return binds corresponding to the linearised let-bindings. /// This reveals the bound items, e.g. when the lets occur in incremental object defns. @@ -11584,10 +11738,10 @@ and TcIncrementalLetRecGeneralization cenv scopem // pathological situations let freeInUncheckedRecBinds = lazy ((emptyFreeTyvars, cenv.recUses.Contents) ||> Map.fold (fun acc vStamp _ -> - match Map.tryFind vStamp uncheckedRecBindsTable with - | Some fwdBind -> - accFreeInType CollectAllNoCaching fwdBind.RecBindingInfo.Val.Type acc - | None -> + match uncheckedRecBindsTable.TryGetValue vStamp with + | true, fwdBind -> + accFreeInType CollectAllNoCaching fwdBind.RecBindingInfo.Val.Type acc + | _ -> acc)) let rec loop (preGeneralizationRecBinds: PreGeneralizationRecursiveBinding list, @@ -12145,13 +12299,13 @@ module TcRecdUnionAndEnumDeclarations = begin rfields, thisTy | UnionCaseFullType (ty, arity) -> let ty', _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType env tpenv ty - let argtysl, recordTy = GetTopTauTypeInFSharpForm cenv.g (arity |> TranslateTopValSynInfo m (TcAttributes cenv env) |> TranslatePartialArity []).ArgInfos ty' m - if argtysl.Length > 1 then + let curriedArgTys, recordTy = GetTopTauTypeInFSharpForm cenv.g (arity |> TranslateTopValSynInfo m (TcAttributes cenv env) |> TranslatePartialArity []).ArgInfos ty' m + if curriedArgTys.Length > 1 then errorR(Error(FSComp.SR.tcIllegalFormForExplicitTypeDeclaration(), m)) - let argtys = argtysl |> List.concat - let nFields = argtys.Length + let argTys = curriedArgTys |> List.concat + let nFields = argTys.Length let rfields = - argtys |> List.mapi (fun i (argty, argInfo) -> + argTys |> List.mapi (fun i (argty, argInfo) -> let id = (match argInfo.Name with Some id -> id | None -> mkSynId m (mkName nFields i)) MakeRecdFieldSpec cenv env parent (false, None, argty, [], [], id, argInfo.Name.IsNone, false, false, XmlDoc.Empty, None, m)) if not (typeEquiv cenv.g recordTy thisTy) then @@ -14049,7 +14203,7 @@ module AddAugmentationDeclarations = let tcaugHasNominalInterface g (tcaug: TyconAugmentation) tcref = tcaug.tcaug_interfaces |> List.exists (fun (x, _, _) -> match tryDestAppTy g x with - | Some tcref2 when tyconRefEq g tcref2 tcref -> true + | ValueSome tcref2 when tyconRefEq g tcref2 tcref -> true | _ -> false) let AddGenericCompareDeclarations cenv (env: TcEnv) (scSet:Set) (tycon:Tycon) = @@ -14197,7 +14351,7 @@ module TyconConstraintInference = // Is the field type a type parameter? match tryDestTyparTy cenv.g ty with - | Some tp -> + | ValueSome tp -> // Look for an explicit 'comparison' constraint if tp.Constraints |> List.exists (function TyparConstraint.SupportsComparison _ -> true | _ -> false) then true @@ -14210,7 +14364,7 @@ module TyconConstraintInference = else false - | None -> + | _ -> match ty with // Look for array, UIntPtr and IntPtr types | SpecialComparableHeadType g tinst -> @@ -14322,7 +14476,7 @@ module TyconConstraintInference = // and type parameters. let rec checkIfFieldTypeSupportsEquality (tycon:Tycon) (ty: TType) = match tryDestTyparTy cenv.g ty with - | Some tp -> + | ValueSome tp -> // Look for an explicit 'equality' constraint if tp.Constraints |> List.exists (function TyparConstraint.SupportsEquality _ -> true | _ -> false) then true @@ -14334,7 +14488,7 @@ module TyconConstraintInference = true else false - | None -> + | _ -> match ty with | SpecialEquatableHeadType g tinst -> tinst |> List.forall (checkIfFieldTypeSupportsEquality tycon) @@ -14639,11 +14793,11 @@ module EstablishTypeDefinitionCores = yield (ty', m) | UnionCaseFullType (ty, arity) -> let ty', _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType env tpenv ty - let argtysl, _ = GetTopTauTypeInFSharpForm cenv.g (arity |> TranslateTopValSynInfo m (TcAttributes cenv env) |> TranslatePartialArity []).ArgInfos ty' m - if argtysl.Length > 1 then + let curriedArgTys, _ = GetTopTauTypeInFSharpForm cenv.g (arity |> TranslateTopValSynInfo m (TcAttributes cenv env) |> TranslatePartialArity []).ArgInfos ty' m + if curriedArgTys.Length > 1 then errorR(Error(FSComp.SR.tcIllegalFormForExplicitTypeDeclaration(), m)) - for argtys in argtysl do - for (argty, _) in argtys do + for argTys in curriedArgTys do + for (argty, _) in argTys do yield (argty , m) | SynTypeDefnSimpleRepr.General (_, _, _, fields, _, _, implicitCtorSynPats, _) when tycon.IsFSharpStructOrEnumTycon -> // for structs @@ -14679,11 +14833,11 @@ module EstablishTypeDefinitionCores = let AdjustModuleName modKind nm = (match modKind with FSharpModuleWithSuffix -> nm+FSharpModuleSuffix | _ -> nm) - let TypeNamesInMutRecDecls (compDecls: MutRecShapes) = + let TypeNamesInMutRecDecls cenv env (compDecls: MutRecShapes) = [ for d in compDecls do match d with - | MutRecShape.Tycon (MutRecDefnsPhase1DataForTycon(ComponentInfo(_, _, _, ids, _, _, _, _), _, _, _, _, isAtOriginalTyconDefn), _) -> - if isAtOriginalTyconDefn then + | MutRecShape.Tycon (MutRecDefnsPhase1DataForTycon(ComponentInfo(_, typars, _, ids, _, _, _, _), _, _, _, _, isAtOriginalTyconDefn), _) -> + if isAtOriginalTyconDefn && (TcTyparDecls cenv env typars |> List.forall (fun p -> p.Kind = TyparKind.Measure)) then yield (List.last ids).idText | _ -> () ] |> set @@ -14730,7 +14884,7 @@ module EstablishTypeDefinitionCores = let envForDecls, mtypeAcc = MakeInnerEnv envInitial id modKind let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType modKind)) let innerParent = Parent (mkLocalModRef mspec) - let innerTypeNames = TypeNamesInMutRecDecls decls + let innerTypeNames = TypeNamesInMutRecDecls cenv envForDecls decls MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent, innerTypeNames, envForDecls) /// Establish 'type C < T1... TN > = ...' including @@ -15611,6 +15765,7 @@ module EstablishTypeDefinitionCores = let rec accInAbbrevType ty acc = match stripTyparEqns ty with + | TType_anon (_,l) | TType_tuple (_, l) -> accInAbbrevTypes l acc | TType_ucase (UCRef(tc, _), tinst) | TType_app (tc, tinst) -> @@ -15709,9 +15864,9 @@ module EstablishTypeDefinitionCores = else acc // note: all edges added are (tycon, _) let insertEdgeToType ty acc = match tryDestAppTy cenv.g ty with - | Some tcref -> + | ValueSome tcref -> insertEdgeToTycon tcref.Deref acc - | None -> + | _ -> acc // collect edges from an a struct field (which is struct-contained in tycon) @@ -15733,9 +15888,9 @@ module EstablishTypeDefinitionCores = (structTycon === tycon2) && (structTyInst, tinst2) ||> List.lengthsEqAndForall2 (fun ty1 ty2 -> match tryDestTyparTy cenv.g ty1 with - | Some destTypar1 -> + | ValueSome destTypar1 -> match tryDestTyparTy cenv.g ty2 with - | Some destTypar2 -> typarEq destTypar1 destTypar2 + | ValueSome destTypar2 -> typarEq destTypar1 destTypar2 | _ -> false | _ -> false) if specialCaseStaticField then @@ -15760,7 +15915,7 @@ module EstablishTypeDefinitionCores = let fspecs = if structTycon.IsUnionTycon then [ for uc in structTycon.UnionCasesArray do - for c in uc.FieldTable.AllFieldsAsList do + for c in uc.FieldTable.FieldsByIndex do yield c] else structTycon.AllFieldsAsList @@ -16010,12 +16165,12 @@ module TcDeclarations = else let isInSameModuleOrNamespace = - match envForDecls.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with - | Some tycon -> (tyconOrder.Compare(tcref.Deref, tycon) = 0) - | None -> + match envForDecls.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryGetValue tcref.LogicalName with + | true, tycon -> tyconOrder.Compare(tcref.Deref, tycon) = 0 + | _ -> //false // There is a special case we allow when compiling FSharp.Core.dll which permits interface implementations across namespace fragments - (cenv.g.compilingFslib && tcref.LogicalName.StartsWithOrdinal("Tuple`")) + cenv.g.compilingFslib && tcref.LogicalName.StartsWithOrdinal("Tuple`") let nReqTypars = reqTypars.Length @@ -16304,9 +16459,14 @@ module TcDeclarations = let tyDeclRange = synTyconInfo.Range let (ComponentInfo(_, typars, cs, longPath, _, _, _, _)) = synTyconInfo let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls false tyDeclRange typars cs longPath - let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) + let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) + + if (declKind = ExtrinsicExtensionBinding) && isByrefTyconRef cenv.g tcref then + error(Error(FSComp.SR.tcByrefsMayNotHaveTypeExtensions(), tyDeclRange)) + if not (isNil members) && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclRange)) + MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, tyDeclRange, newslotsOK, fixupFinalAttrs)) // By now we've established the full contents of type definitions apart from their @@ -16552,7 +16712,7 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS return env - | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId, isRec, isModule, defs, xml, attribs, vis, m)) -> + | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId, isRec, kind, defs, xml, attribs, vis, m)) -> do for id in longId do CheckNamespaceModuleOrTypeName cenv.g id @@ -16564,7 +16724,7 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS // namespace [rec] A.B // module M = ... let enclosingNamespacePath, defs = - if isModule then + if kind.IsModule then let nsp, modName = List.frontAndBack longId let modDecl = [SynModuleSigDecl.NestedModule(ComponentInfo(attribs, [], [], [modName], xml, false, vis, m), false, defs, m)] nsp, modDecl @@ -16861,7 +17021,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem return ((fun modDefs -> modDefn :: modDefs), topAttrsNew), env, envAtEnd - | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId, isRec, isModule, defs, xml, attribs, vis, m)) -> + | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId, isRec, kind, defs, xml, attribs, vis, m)) -> if !progress then dprintn ("Typecheck implementation " + textOfLid longId) let endm = m.EndRange @@ -16876,7 +17036,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem // namespace [rec] A.B // module M = ... let enclosingNamespacePath, defs = - if isModule then + if kind.IsModule then let nsp, modName = List.frontAndBack longId let modDecl = [SynModuleDecl.NestedModule(ComponentInfo(attribs, [], [], [modName], xml, false, vis, m), false, defs, true, m)] nsp, modDecl @@ -17227,7 +17387,7 @@ let CheckModuleSignature g cenv m denvAtEnd rootSigOpt implFileTypePriorToSig im // Compute the remapping from implementation to signature let remapInfo , _ = ComputeRemappingFromInferredSignatureToExplicitSignature cenv.g implFileTypePriorToSig sigFileType - let aenv = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.mrpiEntities } + let aenv = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } if not (SignatureConformance.Checker(cenv.g, cenv.amap, denv, remapInfo, true).CheckSignature aenv (mkLocalModRef implFileSpecPriorToSig) sigFileType) then ( // We can just raise 'ReportedError' since CheckModuleOrNamespace raises its own error @@ -17309,14 +17469,14 @@ let TypeCheckOneImplFile // We ALWAYS run the PostTypeCheckSemanticChecks phase, though we if we have already encountered some // errors we turn off error reporting. This is because it performs various fixups over the TAST, e.g. // assigning nice names for inference variables. - let hasExplicitEntryPoint = + let hasExplicitEntryPoint, anonRecdTypes = conditionallySuppressErrorReporting (checkForErrors()) (fun () -> try let reportErrors = not (checkForErrors()) PostTypeCheckSemanticChecks.CheckTopImpl (g, cenv.amap, reportErrors, cenv.infoReader, env.eInternalsVisibleCompPaths, cenv.topCcu, envAtEnd.DisplayEnv, implFileExprAfterSig, extraAttribs, isLastCompiland, isInternalTestSpanStackReferring) with e -> errorRecovery e m - false) + false, StampMap.Empty) // Warn on version attributes. topAttrs.assemblyAttrs |> List.iter (function @@ -17332,7 +17492,7 @@ let TypeCheckOneImplFile | _ -> () | _ -> ()) - let implFile = TImplFile(qualNameOfFile, scopedPragmas, implFileExprAfterSig, hasExplicitEntryPoint, isScript) + let implFile = TImplFile(qualNameOfFile, scopedPragmas, implFileExprAfterSig, hasExplicitEntryPoint, isScript, anonRecdTypes) return (topAttrs, implFile, implFileTypePriorToSig, envAtEnd, cenv.createsGeneratedProvidedTypes) } diff --git a/src/fsharp/TypeChecker.fsi b/src/fsharp/TypeChecker.fsi index 3f84e1992f..aae0954499 100644 --- a/src/fsharp/TypeChecker.fsi +++ b/src/fsharp/TypeChecker.fsi @@ -39,14 +39,14 @@ val EmptyTopAttrs : TopAttribs val CombineTopAttrs : TopAttribs -> TopAttribs -> TopAttribs val TypeCheckOneImplFile : - TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines * NameResolution.TcResultsSink * bool + TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines option * NameResolution.TcResultsSink * bool -> TcEnv -> Tast.ModuleOrNamespaceType option -> ParsedImplFileInput -> Eventually val TypeCheckOneSigFile : - TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines * NameResolution.TcResultsSink * bool + TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines option * NameResolution.TcResultsSink * bool -> TcEnv -> ParsedSigFileInput -> Eventually diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 1f0941eea4..22b960d18c 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -162,22 +162,26 @@ type LongIdentWithDots = /// more freedom about typechecking these expressions. /// LongIdent can be empty list - it is used to denote that name of some AST element is absent (i.e. empty type name in inherit) | LongIdentWithDots of id:LongIdent * dotms:range list - with member this.Range = - match this with - | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" - | LongIdentWithDots([id],[]) -> id.idRange - | LongIdentWithDots([id],[m]) -> unionRanges id.idRange m - | LongIdentWithDots(h::t,[]) -> unionRanges h.idRange (List.last t).idRange - | LongIdentWithDots(h::t,dotms) -> unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last dotms) - member this.Lid = match this with LongIdentWithDots(lid,_) -> lid - member this.ThereIsAnExtraDotAtTheEnd = match this with LongIdentWithDots(lid,dots) -> lid.Length = dots.Length - member this.RangeSansAnyExtraDot = - match this with - | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" - | LongIdentWithDots([id],_) -> id.idRange - | LongIdentWithDots(h::t,dotms) -> - let nonExtraDots = if dotms.Length = t.Length then dotms else List.truncate t.Length dotms - unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last nonExtraDots) + + member this.Range = + match this with + | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" + | LongIdentWithDots([id],[]) -> id.idRange + | LongIdentWithDots([id],[m]) -> unionRanges id.idRange m + | LongIdentWithDots(h::t,[]) -> unionRanges h.idRange (List.last t).idRange + | LongIdentWithDots(h::t,dotms) -> unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last dotms) + + member this.Lid = match this with LongIdentWithDots(lid,_) -> lid + + member this.ThereIsAnExtraDotAtTheEnd = match this with LongIdentWithDots(lid,dots) -> lid.Length = dots.Length + + member this.RangeSansAnyExtraDot = + match this with + | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" + | LongIdentWithDots([id],_) -> id.idRange + | LongIdentWithDots(h::t,dotms) -> + let nonExtraDots = if dotms.Length = t.Length then dotms else List.truncate t.Length dotms + unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last nonExtraDots) //------------------------------------------------------------------------ // AST: the grammar of implicitly scoped type parameters @@ -428,44 +432,56 @@ and | LongIdentApp of typeName:SynType * longDotId:LongIdentWithDots * LESSRange:range option * typeArgs:SynType list * commaRanges:range list * GREATERrange:range option * range:range /// F# syntax : type * ... * type - // the bool is true if / rather than * follows the type - | Tuple of typeNames:(bool*SynType) list * range:range - /// F# syntax : struct (type * ... * type) // the bool is true if / rather than * follows the type - | StructTuple of typeNames:(bool*SynType) list * range:range + | Tuple of isStruct:bool * typeNames:(bool*SynType) list * range:range + + /// F# syntax : {| id: type; ...; id: type |} + /// F# syntax : struct {| id: type; ...; id: type |} + | AnonRecd of isStruct:bool * typeNames:(Ident * SynType) list * range:range /// F# syntax : type[] | Array of int * elementType:SynType * range:range + /// F# syntax : type -> type | Fun of argType:SynType * returnType:SynType * range:range + /// F# syntax : 'Var | Var of genericName:SynTypar * range:range + /// F# syntax : _ | Anon of range:range + /// F# syntax : typ with constraints | WithGlobalConstraints of typeName:SynType * constraints:SynTypeConstraint list * range:range + /// F# syntax : #type | HashConstraint of SynType * range:range + /// F# syntax : for units of measure e.g. m / s | MeasureDivide of dividendType:SynType * divisorType:SynType * range:range + /// F# syntax : for units of measure e.g. m^3, kg^1/2 | MeasurePower of measureType:SynType * SynRationalConst * range:range + /// F# syntax : 1, "abc" etc, used in parameters to type providers /// For the dimensionless units i.e. 1 , and static parameters to provided types | StaticConstant of constant:SynConst * 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 expr:SynType * SynType * range:range + /// Get the syntactic range of source code covered by this construct. member x.Range = match x with | SynType.App (range=m) | SynType.LongIdentApp (range=m) | SynType.Tuple (range=m) - | SynType.StructTuple (range=m) | SynType.Array (range=m) + | SynType.AnonRecd (range=m) | SynType.Fun (range=m) | SynType.Var (range=m) | SynType.Anon (range=m) @@ -504,10 +520,11 @@ and | Typed of expr:SynExpr * typeName:SynType * range:range /// F# syntax: e1, ..., eN - | Tuple of exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them + | Tuple of isStruct: bool * exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them - /// F# syntax: struct (e1, ..., eN) - | StructTuple of exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them + /// F# syntax: {| id1=e1; ...; idN=eN |} + /// F# syntax: struct {| id1=e1; ...; idN=eN |} + | AnonRecd of isStruct: bool * copyInfo:(SynExpr * BlockSeparator) option * recordFields:(Ident * SynExpr) list * range:range /// F# syntax: [ e1; ...; en ], [| e1; ...; en |] | ArrayOrList of isList:bool * exprs:SynExpr list * range:range @@ -557,7 +574,7 @@ and | MatchLambda of isExnMatch:bool * range * SynMatchClause list * matchSeqPoint:SequencePointInfoForBinding * range:range /// F# syntax: match expr with pat1 -> expr | ... | patN -> exprN - | Match of matchSeqPoint:SequencePointInfoForBinding * expr:SynExpr * clauses:SynMatchClause list * isExnMatch:bool * range:range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) + | Match of matchSeqPoint:SequencePointInfoForBinding * expr:SynExpr * clauses:SynMatchClause list * range:range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) /// F# syntax: do expr | Do of expr:SynExpr * range:range @@ -696,7 +713,7 @@ and | LetOrUseBang of bindSeqPoint:SequencePointInfoForBinding * isUse:bool * isFromSource:bool * SynPat * SynExpr * SynExpr * range:range /// F# syntax: match! expr with pat1 -> expr | ... | patN -> exprN - | MatchBang of matchSeqPoint:SequencePointInfoForBinding * expr:SynExpr * clauses:SynMatchClause list * isExnMatch:bool * range:range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) + | MatchBang of matchSeqPoint:SequencePointInfoForBinding * expr:SynExpr * clauses:SynMatchClause list * range:range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) /// F# syntax: do! expr /// Computation expressions only @@ -734,7 +751,7 @@ and | SynExpr.Const (range=m) | SynExpr.Typed (range=m) | SynExpr.Tuple (range=m) - | SynExpr.StructTuple (range=m) + | SynExpr.AnonRecd (range=m) | SynExpr.ArrayOrList (range=m) | SynExpr.Record (range=m) | SynExpr.New (range=m) @@ -799,8 +816,8 @@ and | SynExpr.Const (range=m) | SynExpr.Typed (range=m) | SynExpr.Tuple (range=m) - | SynExpr.StructTuple (range=m) | SynExpr.ArrayOrList (range=m) + | SynExpr.AnonRecd (range=m) | SynExpr.Record (range=m) | SynExpr.New (range=m) | SynExpr.ObjExpr (range=m) @@ -855,6 +872,7 @@ and | SynExpr.DiscardAfterMissingQualificationAfterDot (expr,_) -> expr.Range | SynExpr.Fixed (_,m) -> m | SynExpr.Ident id -> id.idRange + /// Attempt to get the range of the first token or initial portion only - this is extremely ad-hoc, just a cheap way to improve a certain 'query custom operation' error range member e.RangeOfFirstPortion = match e with @@ -863,8 +881,8 @@ and | SynExpr.Const (range=m) | SynExpr.Typed (range=m) | SynExpr.Tuple (range=m) - | SynExpr.StructTuple (range=m) | SynExpr.ArrayOrList (range=m) + | SynExpr.AnonRecd (range=m) | SynExpr.Record (range=m) | SynExpr.New (range=m) | SynExpr.ObjExpr (range=m) @@ -993,8 +1011,7 @@ and | Or of SynPat * SynPat * range:range | Ands of SynPat list * range:range | LongIdent of longDotId:LongIdentWithDots * (* holds additional ident for tooling *) Ident option * SynValTyparDecls option (* usually None: temporary used to parse "f<'a> x = x"*) * SynConstructorArgs * accessibility:SynAccess option * range:range - | Tuple of SynPat list * range:range - | StructTuple of SynPat list * range:range + | Tuple of isStruct: bool * SynPat list * range:range | Paren of SynPat * range:range | ArrayOrList of bool * SynPat list * range:range | Record of ((LongIdent * Ident) * SynPat) list * range:range @@ -1025,7 +1042,6 @@ and | SynPat.LongIdent (range=m) | SynPat.ArrayOrList (range=m) | SynPat.Tuple (range=m) - | SynPat.StructTuple (range=m) | SynPat.Typed (range=m) | SynPat.Attrib (range=m) | SynPat.Record (range=m) @@ -1393,7 +1409,7 @@ and SynModuleDecl = | ModuleAbbrev of ident:Ident * longId:LongIdent * range:range | NestedModule of SynComponentInfo * isRecursive:bool * SynModuleDecls * bool * range:range - | Let of bool * SynBinding list * range:range + | Let of isRecursive:bool * SynBinding list * range:range | DoExpr of SequencePointInfoForBinding * SynExpr * range:range | Types of SynTypeDefn list * range:range | Exception of SynExceptionDefn * range:range @@ -1446,11 +1462,23 @@ and and SynModuleSigDecls = SynModuleSigDecl list -/// SynModuleOrNamespace(lid,isRec,isModule,decls,xmlDoc,attribs,SynAccess,m) +and + [] + SynModuleOrNamespaceKind = + | NamedModule + | AnonModule + | DeclaredNamespace + | GlobalNamespace + + member x.IsModule = + match x with + | NamedModule | AnonModule -> true + | _ -> false + and [] SynModuleOrNamespace = - | SynModuleOrNamespace of longId:LongIdent * isRecursive:bool * isModule:bool * decls:SynModuleDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range + | SynModuleOrNamespace of longId:LongIdent * isRecursive:bool * kind:SynModuleOrNamespaceKind * decls:SynModuleDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range member this.Range = match this with | SynModuleOrNamespace (range=m) -> m @@ -1458,7 +1486,7 @@ and and [] SynModuleOrNamespaceSig = - | SynModuleOrNamespaceSig of longId:LongIdent * isRecursive:bool * isModule:bool * SynModuleSigDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range + | SynModuleOrNamespaceSig of longId:LongIdent * isRecursive:bool * kind:SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range and [] ParsedHashDirective = @@ -1468,13 +1496,13 @@ and [] type ParsedImplFileFragment = | AnonModule of SynModuleDecls * range:range | NamedModule of SynModuleOrNamespace - | NamespaceFragment of longId:LongIdent * bool * bool * SynModuleDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range + | NamespaceFragment of longId:LongIdent * bool * SynModuleOrNamespaceKind * SynModuleDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range [] type ParsedSigFileFragment = | AnonModule of SynModuleSigDecls * range:range | NamedModule of SynModuleOrNamespaceSig - | NamespaceFragment of longId:LongIdent * bool * bool * SynModuleSigDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range + | NamespaceFragment of longId:LongIdent * bool * SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range [] type ParsedFsiInteraction = @@ -1702,7 +1730,7 @@ let rec SimplePatOfPat (synArgNameGenerator: SynArgNameGenerator) p = SynSimplePat.Id (id,altNameRefCell,isCompGen,false,false,id.idRange), Some (fun e -> let clause = Clause(p,None,e,m,SuppressSequencePointAtTarget) - SynExpr.Match(NoSequencePointAtInvisibleBinding,item,[clause],false,clause.Range)) + SynExpr.Match(NoSequencePointAtInvisibleBinding,item,[clause],clause.Range)) let appFunOpt funOpt x = match funOpt with None -> x | Some f -> f x let composeFunOpt funOpt1 funOpt2 = match funOpt2 with None -> funOpt1 | Some f -> Some (fun x -> appFunOpt funOpt1 (f x)) @@ -1714,8 +1742,8 @@ let rec SimplePatsOfPat synArgNameGenerator p = SynSimplePats.Typed(p2,ty,m), laterf // | SynPat.Paren (p,m) -> SimplePatsOfPat synArgNameGenerator p - | SynPat.Tuple (ps,m) - | SynPat.Paren(SynPat.Tuple (ps,m),_) -> + | SynPat.Tuple (false,ps,m) + | SynPat.Paren(SynPat.Tuple (false,ps,m),_) -> let ps2,laterf = List.foldBack (fun (p',rhsf) (ps',rhsf') -> @@ -1847,14 +1875,14 @@ let mkSynDotBrackSeqSliceGet m mDot arr (argslist:list) = | SynIndexerArg.One x -> yield x | _ -> () ] if notsliced.Length = argslist.Length then - SynExpr.DotIndexedGet(arr,[SynIndexerArg.One (SynExpr.Tuple(notsliced,[],unionRanges (List.head notsliced).Range (List.last notsliced).Range))],mDot,m) + SynExpr.DotIndexedGet(arr,[SynIndexerArg.One (SynExpr.Tuple(false,notsliced,[],unionRanges (List.head notsliced).Range (List.last notsliced).Range))],mDot,m) else SynExpr.DotIndexedGet(arr,argslist,mDot,m) let mkSynDotParenGet lhsm dotm a b = match b with - | SynExpr.Tuple ([_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) - | SynExpr.Tuple ([_;_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) + | SynExpr.Tuple (false,[_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) + | SynExpr.Tuple (false,[_;_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) | _ -> mkSynInfix dotm a parenGet b let mkSynUnit m = SynExpr.Const(SynConst.Unit,m) @@ -2382,11 +2410,15 @@ let rec synExprContainsError inpExpr = walkExpr e1 || walkExpr e2 | SynExpr.ArrayOrList (_,es,_) - | SynExpr.Tuple (es,_,_) - | SynExpr.StructTuple (es,_,_) -> + | SynExpr.Tuple (_,es,_,_) -> walkExprs es - | SynExpr.Record (_,_,fs,_) -> + | SynExpr.AnonRecd (_,origExpr,flds,_) -> + (match origExpr with Some (e,_) -> walkExpr e | None -> false) || + walkExprs (List.map snd flds) + + | SynExpr.Record (_,origExpr,fs,_) -> + (match origExpr with Some (e,_) -> walkExpr e | None -> false) || let flds = fs |> List.choose (fun (_, v, _) -> v) walkExprs (flds) @@ -2401,7 +2433,7 @@ let rec synExprContainsError inpExpr = walkMatchClauses cl | SynExpr.Lambda (_,_,_,e,_) -> walkExpr e - | SynExpr.Match (_,e,cl,_,_) -> + | SynExpr.Match (_,e,cl,_) -> walkExpr e || walkMatchClauses cl | SynExpr.LetOrUse (_,_,bs,e,_) -> walkBinds bs || walkExpr e @@ -2423,7 +2455,7 @@ let rec synExprContainsError inpExpr = | SynExpr.DotNamedIndexedPropertySet (e1,_,e2,e3,_) -> walkExpr e1 || walkExpr e2 || walkExpr e3 - | SynExpr.MatchBang (_,e,cl,_,_) -> + | SynExpr.MatchBang (_,e,cl,_) -> walkExpr e || walkMatchClauses cl | SynExpr.LetOrUseBang (_,_,_,_,e1,e2,_) -> walkExpr e1 || walkExpr e2 diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index e418b1bb9b..f3117e16e8 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -296,7 +296,7 @@ module InterfaceFileWriter = fprintfn os "#light" fprintfn os "" - for (TImplFile(_, _, mexpr, _, _)) in declaredImpls do + for (TImplFile(_, _, mexpr, _, _, _)) in declaredImpls do let denv = BuildInitialDisplayEnvForSigFileGeneration tcGlobals writeViaBufferWithEnvironmentNewLines os (fun os s -> Printf.bprintf os "%s\n\n" s) (NicePrint.layoutInferredSigOfModuleExpr true denv infoReader AccessibleFromSomewhere range0 mexpr |> Layout.squashTo 80 |> Layout.showL) @@ -329,9 +329,9 @@ module XmlDocWriter = if (hasDoc tc.XmlDoc) then tc.XmlDocSig <- XmlDocSigOfTycon [ptext; tc.CompiledName] for vref in tc.MembersOfFSharpTyconSorted do doValSig ptext vref.Deref - for uc in tc.UnionCasesAsList do + for uc in tc.UnionCasesArray do if (hasDoc uc.XmlDoc) then uc.XmlDocSig <- XmlDocSigOfUnionCase [ptext; tc.CompiledName; uc.Id.idText] - for rf in tc.AllFieldsAsList do + for rf in tc.AllFieldsArray do if (hasDoc rf.XmlDoc) then rf.XmlDocSig <- if tc.IsRecordTycon && (not rf.IsStatic) then @@ -380,9 +380,9 @@ module XmlDocWriter = addMember tc.XmlDocSig tc.XmlDoc for vref in tc.MembersOfFSharpTyconSorted do doVal vref.Deref - for uc in tc.UnionCasesAsList do + for uc in tc.UnionCasesArray do doUnionCase uc - for rf in tc.AllFieldsAsList do + for rf in tc.AllFieldsArray do doField rf let modulMember (m:ModuleOrNamespace) = addMember m.XmlDocSig m.XmlDoc @@ -1773,11 +1773,9 @@ let main0(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, reduceMemor errorRecoveryNoRange e exiter.Exit 1 - let inputs = - // Deduplicate module names - let moduleNamesDict = ConcurrentDictionary>() - inputs - |> List.map (fun (input,x) -> DeduplicateParsedInputModuleName moduleNamesDict input,x) + let inputs, _ = + (Map.empty, inputs) + ||> List.mapFold (fun state (input,x) -> let inputT, stateT = DeduplicateParsedInputModuleName state input in (inputT,x), stateT) if tcConfig.parseOnly then exiter.Exit 0 if not tcConfig.continueAfterParseFailure then @@ -1831,7 +1829,7 @@ let main1(Args (ctok, tcGlobals, tcImports: TcImports, frameworkTcImports, gener // it as the updated global error logger and never remove it let oldLogger = errorLogger let errorLogger = - let scopedPragmas = [ for (TImplFile(_, pragmas, _, _, _)) in typedImplFiles do yield! pragmas ] + let scopedPragmas = [ for (TImplFile(_, pragmas, _, _, _, _)) in typedImplFiles do yield! pragmas ] GetErrorLoggerFilteringByScopedPragmas(true, scopedPragmas, oldLogger) let _unwindEL_3 = PushErrorLoggerPhaseUntilUnwind(fun _ -> errorLogger) @@ -1999,13 +1997,10 @@ let main2b (tcImportsCapture,dynamicAssemblyCreator) (Args (ctok, tcConfig: TcCo let ilxGenerator = CreateIlxAssemblyGenerator (tcConfig, tcImports, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), generatedCcu) let codegenResults = GenerateIlxCode ((if Option.isSome dynamicAssemblyCreator then IlReflectBackend else IlWriteBackend), Option.isSome dynamicAssemblyCreator, false, tcConfig, topAttrs, optimizedImpls, generatedCcu.AssemblyName, ilxGenerator) - let casApplied = new Dictionary() - let securityAttrs, topAssemblyAttrs = topAttrs.assemblyAttrs |> List.partition (fun a -> IsSecurityAttribute tcGlobals (tcImports.GetImportMap()) casApplied a rangeStartup) - - // remove any security attributes from the top-level assembly attribute list + let topAssemblyAttrs = codegenResults.topAssemblyAttrs let topAttrs = {topAttrs with assemblyAttrs=topAssemblyAttrs} - let permissionSets = ilxGenerator.CreatePermissionSets securityAttrs - let secDecls = if List.isEmpty securityAttrs then emptyILSecurityDecls else mkILSecurityDecls permissionSets + let permissionSets = codegenResults.permissionSets + let secDecls = mkILSecurityDecls permissionSets let ilxMainModule = MainModuleBuilder.CreateMainModule (ctok, tcConfig, tcGlobals, tcImports, pdbfile, assemblyName, outfile, topAttrs, idata, optDataResources, codegenResults, assemVerFromAttrib, metadataVersion, secDecls) @@ -2039,7 +2034,7 @@ let main4 dynamicAssemblyCreator (Args (ctok, tcConfig, tcImports: TcImports, t DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok - let pdbfile = pdbfile |> Option.map (tcConfig.MakePathAbsolute >> Path.GetFullPath) + let pdbfile = pdbfile |> Option.map (tcConfig.MakePathAbsolute >> FileSystem.GetFullPathShim) let normalizeAssemblyRefs (aref:ILAssemblyRef) = match tcImports.TryFindDllInfo (ctok, Range.rangeStartup, aref.Name, lookupOnly=false) with @@ -2114,3 +2109,4 @@ let mainCompile (ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, redu //System.Runtime.GCSettings.LatencyMode <- System.Runtime.GCLatencyMode.Batch typecheckAndCompile(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, reduceMemoryUsage, defaultCopyFSharpCore, exiter, errorLoggerProvider, tcImportsCapture, dynamicAssemblyCreator) + diff --git a/src/fsharp/fsc/fsc.fsproj b/src/fsharp/fsc/fsc.fsproj new file mode 100644 index 0000000000..40f56a0627 --- /dev/null +++ b/src/fsharp/fsc/fsc.fsproj @@ -0,0 +1,43 @@ + + + + + + Exe + net46;netcoreapp2.1 + .exe + fsc + $(NoWarn);45;55;62;75;1204 + true + $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 + true + true + true + + + + + fscmain.fs + + + + default.win32manifest + PreserveNewest + + + + + + + + + + + + + + + + + + diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index eb926991dc..8190be4078 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1060,7 +1060,7 @@ type internal FsiDynamicCompiler #if DEBUG if fsiOptions.ShowILCode then fsiConsoleOutput.uprintnfn "--------------------"; - ILAsciiWriter.output_module outWriter mainmod3; + ILAsciiWriter.output_module outWriter ilGlobals mainmod3; fsiConsoleOutput.uprintnfn "--------------------" #else ignore(fsiOptions) @@ -1116,7 +1116,7 @@ type internal FsiDynamicCompiler // 'Open' the path for the fragment we just compiled for any future printing. let denv = denv.AddOpenPath (pathOfLid prefixPath) - for (TImplFile(_qname,_,mexpr,_,_)) in declaredImpls do + for (TImplFile(_qname,_,mexpr,_,_,_)) in declaredImpls do let responseL = NicePrint.layoutInferredSigOfModuleExpr false denv infoReader AccessibleFromSomewhere rangeStdin mexpr if not (Layout.isEmptyL responseL) then let opts = valuePrinter.GetFsiPrintOptions() @@ -1154,7 +1154,7 @@ type internal FsiDynamicCompiler let i = nextFragmentId() let prefix = mkFragmentPath i let prefixPath = pathOfLid prefix - let impl = SynModuleOrNamespace(prefix,(*isRec*)false, (* isModule: *) true,defs,PreXmlDoc.Empty,[],None,rangeStdin) + let impl = SynModuleOrNamespace(prefix,(*isRec*)false, NamedModule,defs,PreXmlDoc.Empty,[],None,rangeStdin) let input = ParsedInput.ImplFile(ParsedImplFileInput(filename,true, ComputeQualifiedNameOfFileFromUniquePath (rangeStdin,prefixPath),[],[],[impl],(true (* isLastCompiland *), false (* isExe *)) )) let istate,tcEnvAtEndOfLastInput,declaredImpls = ProcessInputs (ctok, errorLogger, istate, [input], showTypes, true, isInteractiveItExpr, prefix) let tcState = istate.tcState diff --git a/src/fsharp/fsi/fsi.fsproj b/src/fsharp/fsi/fsi.fsproj new file mode 100644 index 0000000000..5dbcac7557 --- /dev/null +++ b/src/fsharp/fsi/fsi.fsproj @@ -0,0 +1,60 @@ + + + + + + Exe + net46;netcoreapp2.1 + .exe + fsi + $(NoWarn);45;55;62;75;1204 + true + $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 + fsi.res + true + true + true + + + + $(DefineConstants);FSI_SHADOW_COPY_REFERENCES;FSI_SERVER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf index d4667e04c0..9841900326 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf index f87d3361f2..93303b279f 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf index 6af67db255..6b25550fed 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf index 917a17f435..b69c71103d 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -1,4 +1,4 @@ - + @@ -134,7 +134,7 @@ \n\nException raised during pretty printing.\nPlease report this so it can be fixed.\nTrace: {0}\n - \n\nException déclenchée durant l'impression en mode Pretty.\nSignalez ce problème afin qu'il soit corrigé.\nTrace : {0}\n + \n\nException déclenchée durant l'impression automatique.\nSignalez ce problème afin qu'il soit corrigé.\nTrace : {0}\n @@ -184,7 +184,7 @@ Loading - Chargement en cours + Chargement diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf index d7f05d6aa9..51a94aabb2 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf index 69a5d3b535..5d0b2017d6 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf index 82960cad8f..f6b3de9b34 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf index d35388b4cb..70a3636f04 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf index 6e40ee07dd..de3a08eed1 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf index 6497500a1f..35bd3478f9 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj new file mode 100644 index 0000000000..200bd6d40a --- /dev/null +++ b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj @@ -0,0 +1,44 @@ + + + + + + Exe + net46 + AnyCPU + .exe + fsiAnyCpu + $(NoWarn);45;55;62;75;1204 + true + $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 + ..\fsi\fsi.res + true + true + + + + $(DefineConstants);FSI_SHADOW_COPY_REFERENCES;FSI_SERVER + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index 098720fb0a..e06ee756da 100755 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -62,13 +62,13 @@ let CanImportILScopeRef (env:ImportMap) m scoref = match scoref with | ILScopeRef.Local -> true | ILScopeRef.Module _ -> true - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly 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() - match env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assref) with + match env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assemblyRef) with | UnresolvedCcu _ -> false | ResolvedCcu _ -> true @@ -84,7 +84,7 @@ let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = 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 assref -> env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assref) // NOTE: only assemblyLoader callsite + | ILScopeRef.Assembly assemblyRef -> env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assemblyRef) // NOTE: only assemblyLoader callsite // 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. @@ -109,8 +109,8 @@ let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = () #endif match tryRescopeEntity ccu tycon with - | None -> error (Error(FSComp.SR.impImportedAssemblyUsesNotPublicType(String.concat "." (Array.toList path@[typeName])),m)) - | Some tcref -> tcref + | 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 @@ -168,7 +168,6 @@ let rec ImportILType (env:ImportMap) m tinst ty = let inst = tspec.GenericArgs |> List.map (ImportILType env m tinst) ImportTyconRefApp env tcref inst - | ILType.Modified(_,tref,ILType.Byref ty) when tref.Name = "System.Runtime.InteropServices.InAttribute" -> mkInByrefTy env.g (ImportILType env m tinst ty) | 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) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 7e23785723..6ee5a6b53c 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -67,15 +67,14 @@ let GetSuperTypeOfType g amap m ty = | Some super -> Some(Import.ImportProvidedType amap m super) #endif | ILTypeMetadata (TILObjectReprData(scoref,_,tdef)) -> - let _,tinst = destAppTy g ty + let tinst = argsOfAppTy g ty match tdef.Extends with | None -> None | Some ilty -> Some (ImportILType scoref amap m tinst ilty) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - - if isFSharpObjModelTy g ty || isExnDeclTy g ty then - let tcref,_tinst = destAppTy g ty + if isFSharpObjModelTy g ty || isExnDeclTy g ty then + let tcref = tcrefOfAppTy g ty Some (instType (mkInstForAppTy g ty) (superOfTycon g tcref.Deref)) elif isArrayTy g ty then Some g.system_Array_ty @@ -88,6 +87,8 @@ let GetSuperTypeOfType g amap m ty = Some(g.system_Enum_ty) else Some (g.system_Value_ty) + elif isAnonRecdTy g ty then + Some g.obj_ty elif isRecdTy g ty || isUnionTy g ty then Some g.obj_ty else @@ -105,8 +106,8 @@ type SkipUnrefInterfaces = Yes | No /// traverse the type hierarchy to collect further interfaces. let rec GetImmediateInterfacesOfType skipUnref g amap m ty = let itys = - if isAppTy g ty then - let tcref,tinst = destAppTy g ty + match tryAppTy g ty with + | ValueSome(tcref,tinst) -> if tcref.IsMeasureableReprTycon then [ match tcref.TypeReprInfo with | TMeasureableRepr reprTy -> @@ -142,8 +143,7 @@ let rec GetImmediateInterfacesOfType skipUnref g amap m ty = | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> tcref.ImmediateInterfaceTypesOfFSharpTycon |> List.map (instType (mkInstForAppTy g ty)) - else - [] + | _ -> [] // .NET array types are considered to implement IList let itys = @@ -187,7 +187,7 @@ let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref (loop ndeep g.obj_ty state) else match tryDestTyparTy g ty with - | Some tp -> + | ValueSome tp -> let state = loop (ndeep+1) g.obj_ty state List.foldBack (fun x vacc -> @@ -208,7 +208,7 @@ let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref loop (ndeep + 1) cty vacc) tp.Constraints state - | None -> + | _ -> let state = if followInterfaces then List.foldBack @@ -284,13 +284,26 @@ let ExistsHeadTypeInEntireHierarchy g amap m typeToSearchFrom tcrefToLookFor = let ImportILTypeFromMetadata amap m scoref tinst minst ilty = ImportILType scoref amap m (tinst@minst) ilty - -/// Get the return type of an IL method, taking into account instantiations for type and method generic parameters, and +/// 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 cattrs = + let ty = ImportILType scoref amap m (tinst@minst) ilty + // If the type is a byref and one of attributes from a return or parameter has IsReadOnly, then it's a inref. + if isByrefTy amap.g ty && TryFindILAttribute amap.g.attrib_IsReadOnlyAttribute cattrs then + mkInByrefTy amap.g (destByrefTy amap.g ty) + else + ty + +/// Get the parameter type of an IL method. +let ImportParameterTypeFromMetadata amap m ilty cattrs scoref tinst mist = + ImportILTypeFromMetadataWithAttributes amap m scoref tinst mist ilty cattrs + +/// 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 ty scoref tinst minst = - match ty with +let ImportReturnTypeFromMetadata amap m ilty cattrs scoref tinst minst = + match ilty with | ILType.Void -> None - | retTy -> Some (ImportILTypeFromMetadata amap m scoref tinst minst retTy) + | retTy -> Some(ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst retTy cattrs) + /// Copy constraints. If the constraint comes from a type parameter associated /// with a type constructor then we are simply renaming type variables. If it comes @@ -806,19 +819,19 @@ type ILMethInfo = /// Get the argument types of the 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 -> ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) + x.ParamMetadata |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs 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 -> ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) + x.RawMetadata.Parameters |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs 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. /// /// Any type parameters of the enclosing type are instantiated in the type returned. member x.GetParamNamesAndTypes(amap,m,minst) = - x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) ) + x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) ) /// Get a reference to the method (dropping all generic instantiations), as an Abstract IL ILMethodRef. member x.ILMethodRef = @@ -838,7 +851,8 @@ type ILMethInfo = // 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 - [ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst x.RawMetadata.Parameters.Head.Type] + let p = x.RawMetadata.Parameters.Head + [ ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst ] else if x.IsInstance then [ x.ApparentEnclosingType ] else @@ -846,7 +860,7 @@ type ILMethInfo = /// Get the compiled return type of the method, where 'void' is None. member x.GetCompiledReturnTy (amap, m, minst) = - ImportReturnTypeFromMetaData amap m x.RawMetadata.Return.Type x.MetadataScope x.DeclaringTypeInst minst + ImportReturnTypeFromMetadata amap m x.RawMetadata.Return.Type x.RawMetadata.Return.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst /// Get the F# view of the return type of the method, where 'void' is 'unit'. member x.GetFSharpReturnTy (amap, m, minst) = @@ -1436,7 +1450,7 @@ type MethInfo = // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later match tryDestOptionTy g ty with - | Some optTy when typeEquiv g g.int32_ty optTy -> CallerFilePath + | ValueSome optTy when typeEquiv g g.int32_ty optTy -> CallerFilePath | _ -> CallerLineNumber (isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo)) @@ -1503,7 +1517,7 @@ type MethInfo = match x with | ILMeth(_,ilminfo,_) -> let ftinfo = ILTypeInfo.FromType g (TType_app(tcref,formalEnclosingTyparTys)) - let formalRetTy = ImportReturnTypeFromMetaData amap m ilminfo.RawMetadata.Return.Type ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys + let formalRetTy = ImportReturnTypeFromMetadata amap m ilminfo.RawMetadata.Return.Type ilminfo.RawMetadata.Return.CustomAttrs ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys let formalParams = [ [ for p in ilminfo.RawMetadata.Parameters do let paramType = ImportILTypeFromMetadata amap m ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys p.Type @@ -1581,6 +1595,14 @@ type MethInfo = | _ -> x.DeclaringTyconRef.Typars(m) + /// Tries to get the object arg type if it's a byref type. + member x.TryObjArgByrefType(amap, m, minst) = + x.GetObjArgTypes(amap, m, minst) + |> List.tryHead + |> Option.bind (fun ty -> + if isByrefTy x.TcGlobals ty then Some(ty) + else None) + //------------------------------------------------------------------------- // ILFieldInfo @@ -2456,6 +2478,10 @@ type EventInfo = //------------------------------------------------------------------------- // Helpers associated with getting and comparing method signatures +/// Strips inref and outref to be a byref. +let stripByrefTy g ty = + if isByrefTy g ty then mkByrefTy g (destByrefTy g ty) + else ty /// Represents the information about the compiled form of a method signature. Used when analyzing implementation /// relations between members and abstract slots. @@ -2479,7 +2505,8 @@ let CompiledSigOfMeth g amap m (minfo:MethInfo) = CompiledSig(vargtys,vrty,formalMethTypars,fmtpinst) -/// Used to hide/filter members from super classes based on signature +/// Used to hide/filter members from super classes based on signature +/// Inref and outref parameter types will be treated as a byref type for equivalency. let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:MethInfo) (minfo2:MethInfo) = (minfo.LogicalName = minfo2.LogicalName) && (minfo.GenericArity = minfo2.GenericArity) && @@ -2490,7 +2517,8 @@ let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:Me let fminst2 = generalizeTypars formalMethTypars2 let argtys = minfo.GetParamTypes(amap, m, fminst) let argtys2 = minfo2.GetParamTypes(amap, m, fminst2) - (argtys,argtys2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2))) + (argtys,argtys2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun ty1 ty2 -> + typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2) (stripByrefTy g ty1) (stripByrefTy g ty2))) /// Used to hide/filter members from super classes based on signature let PropInfosEquivByNameAndPartialSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = diff --git a/src/fsharp/layout.fs b/src/fsharp/layout.fs index 0a59e85582..2ee543d9b1 100755 --- a/src/fsharp/layout.fs +++ b/src/fsharp/layout.fs @@ -109,6 +109,8 @@ module TaggedTextOps = let rightBracket = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.rightBracket let leftBrace = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.leftBrace let rightBrace = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.rightBrace + let leftBraceBar = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.leftBraceBar + let rightBraceBar = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.rightBraceBar let equals = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.equals let arrow = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.arrow let questionMark = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.questionMark diff --git a/src/fsharp/layout.fsi b/src/fsharp/layout.fsi index e2d1bcc7a3..a9ced6d9f2 100755 --- a/src/fsharp/layout.fsi +++ b/src/fsharp/layout.fsi @@ -104,6 +104,8 @@ module TaggedTextOps = val rightBracket : TaggedText val leftBrace: TaggedText val rightBrace : TaggedText + val leftBraceBar: TaggedText + val rightBraceBar : TaggedText val leftAngle: TaggedText val rightAngle: TaggedText val equals : TaggedText diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index f3842f908e..62fea65c29 100755 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -562,11 +562,13 @@ rule token args skip = parse | "=" { EQUALS } | "[" { LBRACK } | "[|" { LBRACK_BAR } + | "{|" { LBRACE_BAR } | "<" { LESS false } | ">" { GREATER false } | "[<" { LBRACK_LESS } | "]" { RBRACK } | "|]" { BAR_RBRACK } + | "|}" { BAR_RBRACE } | ">]" { GREATER_RBRACK } | "{" { LBRACE } | "|" { BAR } diff --git a/src/fsharp/lib.fs b/src/fsharp/lib.fs index 3d5e854aff..18404ba377 100755 --- a/src/fsharp/lib.fs +++ b/src/fsharp/lib.fs @@ -226,9 +226,8 @@ module ListSet = | (h::t) -> if contains f h l1 then h::intersect f l1 t else intersect f l1 t | [] -> [] - (* NOTE: quadratic! *) // Note: if duplicates appear, keep the ones toward the _front_ of the list - let setify f l = List.foldBack (insert f) (List.rev l) [] |> List.rev + let setify f l = List.fold (fun acc x -> insert f x acc) [] l |> List.rev let hasDuplicates f l = match l with diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 4d3cf24720..25c8ce10a8 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -197,8 +197,8 @@ let rangeOfLongIdent(lid:LongIdent) = %token OPEN OR REC THEN TO TRUE TRY TYPE VAL INLINE INTERFACE INSTANCE CONST %token WHEN WHILE WITH HASH AMP AMP_AMP QUOTE LPAREN RPAREN RPAREN_COMING_SOON RPAREN_IS_HERE STAR COMMA RARROW GREATER_BAR_RBRACK LPAREN_STAR_RPAREN %token QMARK QMARK_QMARK DOT COLON COLON_COLON COLON_GREATER COLON_QMARK_GREATER COLON_QMARK COLON_EQUALS SEMICOLON -%token SEMICOLON_SEMICOLON LARROW EQUALS LBRACK LBRACK_BAR LBRACK_LESS LBRACE -%token LBRACE_LESS BAR_RBRACK GREATER_RBRACE UNDERSCORE +%token SEMICOLON_SEMICOLON LARROW EQUALS LBRACK LBRACK_BAR LBRACE_BAR LBRACK_LESS LBRACE +%token BAR_RBRACK BAR_RBRACE UNDERSCORE %token BAR RBRACK RBRACE RBRACE_COMING_SOON RBRACE_IS_HERE MINUS DOLLAR %token GREATER_RBRACK STRUCT SIG %token STATIC MEMBER CLASS ABSTRACT OVERRIDE DEFAULT CONSTRUCTOR INHERIT @@ -675,14 +675,14 @@ fileModuleSpec: (fun (isRec2,path,_) -> if not (isNil path) then errorR(Error(FSComp.SR.parsNamespaceOrModuleNotBoth(),m2)) let lid = path@path2 - ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, (isRec || isRec2), true, $4, xml,$1,vis,m))) } + ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, (isRec || isRec2), NamedModule, $4, xml,$1,vis,m))) } | moduleSpfnsPossiblyEmptyBlock { let m = (rhs parseState 1) (fun (isRec, path, xml) -> match path with | [] -> ParsedSigFileFragment.AnonModule($1, m) - | _ -> ParsedSigFileFragment.NamespaceFragment(path, isRec, false, $1, xml,[],m)) } + | _ -> ParsedSigFileFragment.NamespaceFragment(path, isRec, DeclaredNamespace, $1, xml,[],m)) } moduleSpfnsPossiblyEmptyBlock: @@ -1097,14 +1097,14 @@ fileModuleImpl: (fun (isRec, path, _) -> if not (isNil path) then errorR(Error(FSComp.SR.parsNamespaceOrModuleNotBoth(),m2)) let lid = path@path2 - ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, (isRec || isRec2), true, $4, xml,$1,vis,m))) } + ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, (isRec || isRec2), NamedModule, $4, xml,$1,vis,m))) } | moduleDefnsOrExprPossiblyEmptyOrBlock { let m = (rhs parseState 1) (fun (isRec, path, xml) -> match path with | [] -> ParsedImplFileFragment.AnonModule($1,m) - | _ -> ParsedImplFileFragment.NamespaceFragment(path, isRec, false, $1, xml,[],m)) } + | _ -> ParsedImplFileFragment.NamespaceFragment(path, isRec, DeclaredNamespace, $1, xml,[],m)) } /* A collection/block of definitions or expressions making up a module or namespace, possibly empty */ @@ -1782,10 +1782,10 @@ memberCore: let args = if id.idText = "set" then match args with - | [SynPat.Paren(SynPat.Tuple (indexPats,_),indexPatRange);valuePat] when id.idText = "set" -> - [SynPat.Tuple(indexPats@[valuePat],unionRanges indexPatRange valuePat.Range)] + | [SynPat.Paren(SynPat.Tuple (false,indexPats,_),indexPatRange);valuePat] when id.idText = "set" -> + [SynPat.Tuple(false,indexPats@[valuePat],unionRanges indexPatRange valuePat.Range)] | [indexPat;valuePat] -> - [SynPat.Tuple(args,unionRanges indexPat.Range valuePat.Range)] + [SynPat.Tuple(false,args,unionRanges indexPat.Range valuePat.Range)] | [valuePat] -> [valuePat] | _ -> @@ -1945,11 +1945,11 @@ opt_classDefn: /* An 'inherits' definition in an object type definition */ inheritsDefn: - | INHERIT appTypeNonAtomicDeprecated optBaseSpec + | INHERIT atomTypeNonAtomicDeprecated optBaseSpec { let mDecl = unionRanges (rhs parseState 1) (($2): SynType).Range SynMemberDefn.Inherit($2,$3,mDecl) } - | INHERIT appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType optBaseSpec + | INHERIT atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType optBaseSpec { let mDecl = unionRanges (rhs parseState 1) $4.Range SynMemberDefn.ImplicitInherit($2,$4,$5,mDecl) } @@ -2081,6 +2081,24 @@ braceFieldDeclList: | LBRACE error rbrace { [] } +anonRecdType: + | STRUCT braceBarFieldDeclListCore + { $2,true } + | braceBarFieldDeclListCore + { $1,false } + +/* The core of a record type definition */ +braceBarFieldDeclListCore: + | LBRACE_BAR recdFieldDeclList bar_rbrace + { $2 } + + | LBRACE_BAR recdFieldDeclList recover + { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) + $2 } + + | LBRACE_BAR error bar_rbrace + { [] } + inlineAssemblyTyconRepr: | HASH stringOrKeywordString HASH { libraryOnlyError (lhs parseState) @@ -2210,8 +2228,8 @@ typeConstraint: | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm)) } typarAlts: - | typarAlts OR appType { $3::$1 } - | appType { [$1] } + | typarAlts OR appType { $3::$1 } + | appType { [$1] } /* The core of a union type definition */ unionTypeRepr: @@ -2359,7 +2377,7 @@ openDecl: /*-------------------------------------------------------------------------*/ -/* F# Definitions and Expressions */ +/* F# Definitions, Types, Patterns and Expressions */ /* A 'let ...' or 'do ...' statement in the non-#light syntax */ defnBindings: @@ -2472,7 +2490,7 @@ cPrototype: SynExpr.Const(SynConst.String("extern was not given a DllImport attribute",rhs parseState 8),rhs parseState 8), mRhs) (fun attrs vis -> - let bindingId = SynPat.LongIdent (LongIdentWithDots([nm],[]), None, Some noInferredTypars, SynConstructorArgs.Pats [SynPat.Tuple(args,argsm)], vis, nmm) + let bindingId = SynPat.LongIdent (LongIdentWithDots([nm],[]), None, Some noInferredTypars, SynConstructorArgs.Pats [SynPat.Tuple(false,args,argsm)], vis, nmm) let binding = mkSynBinding (xmlDoc, bindingId) (vis, false, false, mBindLhs, NoSequencePointAtInvisibleBinding, Some rty ,rhsExpr, mRhs, [], attrs, None) @@ -2754,9 +2772,9 @@ headBindingPattern: | headBindingPattern BAR headBindingPattern { SynPat.Or($1,$3,rhs2 parseState 1 3) } | headBindingPattern COLON_COLON headBindingPattern - { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [SynPat.Tuple ([$1;$3],rhs2 parseState 1 3)],None,lhs parseState) } + { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [SynPat.Tuple (false,[$1;$3],rhs2 parseState 1 3)],None,lhs parseState) } | tuplePatternElements %prec pat_tuple - { SynPat.Tuple(List.rev $1, lhs parseState) } + { SynPat.Tuple(false,List.rev $1, lhs parseState) } | conjPatternElements %prec pat_conj { SynPat.Ands(List.rev $1, lhs parseState) } | constrPattern @@ -2790,7 +2808,7 @@ constrPattern: { let vis,lid = $1 in SynPat.LongIdent (lid,None,$2, $4,vis,lhs parseState) } | atomicPatternLongIdent opt_explicitValTyparDecls2 HIGH_PRECEDENCE_BRACK_APP atomicPatsOrNamePatPairs { let vis,lid = $1 in SynPat.LongIdent (lid,None,$2, $4,vis,lhs parseState) } - | COLON_QMARK atomType %prec pat_isinst + | COLON_QMARK atomTypeOrAnonRecdType %prec pat_isinst { SynPat.IsInst($2,lhs parseState) } | atomicPattern { $1 } @@ -2815,8 +2833,8 @@ atomicPattern: | quoteExpr { SynPat.QuoteExpr($1,lhs parseState) } | CHAR DOT_DOT CHAR { SynPat.DeprecatedCharRange ($1,$3,rhs2 parseState 1 3) } - | LBRACE recordPatternElements rbrace - { $2 } + | LBRACE recordPatternElementsAux rbrace + { let rs,m = $2 in SynPat.Record (rs,m) } | LBRACK listPatternElements RBRACK { SynPat.ArrayOrList(false,$2,lhs parseState) } | LBRACK_BAR listPatternElements BAR_RBRACK @@ -2850,10 +2868,10 @@ atomicPattern: { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) SynPat.Wild (lhs parseState)} | STRUCT LPAREN tupleParenPatternElements rparen - { SynPat.StructTuple(List.rev $3,lhs parseState) } + { SynPat.Tuple(true, List.rev $3,lhs parseState) } | STRUCT LPAREN tupleParenPatternElements recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()); - SynPat.StructTuple(List.rev $3,lhs parseState) } + SynPat.Tuple(true, List.rev $3,lhs parseState) } | STRUCT LPAREN error rparen { (* silent recovery *) SynPat.Wild (lhs parseState) } | STRUCT LPAREN recover @@ -2899,7 +2917,7 @@ parenPattern: | parenPattern BAR parenPattern { SynPat.Or($1,$3,rhs2 parseState 1 3) } | tupleParenPatternElements - { SynPat.Tuple(List.rev $1,lhs parseState) } + { SynPat.Tuple(false,List.rev $1,lhs parseState) } | conjParenPatternElements { SynPat.Ands(List.rev $1,rhs2 parseState 1 3) } | parenPattern COLON typeWithTypeConstraints %prec paren_pat_colon @@ -2909,7 +2927,7 @@ parenPattern: { let lhsm = lhs parseState SynPat.Attrib($2,$1,lhsm) } | parenPattern COLON_COLON parenPattern - { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [ SynPat.Tuple ([$1;$3],rhs2 parseState 1 3) ],None,lhs parseState) } + { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [ SynPat.Tuple (false,[$1;$3],rhs2 parseState 1 3) ],None,lhs parseState) } | constrPattern { $1 } tupleParenPatternElements: @@ -2924,9 +2942,6 @@ conjParenPatternElements: | parenPattern AMP parenPattern { $3 :: $1 :: [] } -recordPatternElements: - | recordPatternElementsAux { let rs,m = $1 in SynPat.Record (rs,m) } - recordPatternElementsAux: /* Fix 1190 */ | recordPatternElement opt_seps { [$1],lhs parseState } @@ -3044,7 +3059,7 @@ declExpr: { let mMatch = (rhs parseState 1) let mWith,(clauses,mLast) = $3 let spBind = SequencePointAtBinding(unionRanges mMatch mWith) - SynExpr.Match(spBind, $2,clauses,false,unionRanges mMatch mLast) } + SynExpr.Match(spBind, $2,clauses,unionRanges mMatch mLast) } | MATCH typedSeqExpr recover %prec expr_match { if not $3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileMatch()) @@ -3055,7 +3070,7 @@ declExpr: { let mMatch = (rhs parseState 1) let mWith,(clauses,mLast) = $3 let spBind = SequencePointAtBinding(unionRanges mMatch mWith) - SynExpr.MatchBang(spBind, $2,clauses,false,unionRanges mMatch mLast) } + SynExpr.MatchBang(spBind, $2,clauses,unionRanges mMatch mLast) } | MATCH_BANG typedSeqExpr recover %prec expr_match { if not $3 then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedEndOfFileMatch()) @@ -3340,7 +3355,7 @@ declExpr: | declExpr COLON_EQUALS declExpr { mkSynInfix (rhs parseState 2) $1 ":=" $3 } | minusExpr LARROW declExprBlock { mkSynAssign $1 $3 } /* | minusExpr LARROW recover { mkSynAssign $1 (arbExpr("assignRhs",rhs parseState 2)) } */ - | tupleExpr %prec expr_tuple { let exprs,commas = $1 in SynExpr.Tuple(List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ) } + | tupleExpr %prec expr_tuple { let exprs,commas = $1 in SynExpr.Tuple(false, List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ) } | declExpr JOIN_IN declExpr { SynExpr.JoinIn($1,rhs parseState 2,$3,unionRanges $1.Range $3.Range) } | declExpr BAR_BAR declExpr { mkSynInfix (rhs parseState 2) $1 "||" $3 } | declExpr INFIX_BAR_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -3357,7 +3372,7 @@ declExpr: | declExpr GREATER declExpr { mkSynInfix (rhs parseState 2) $1 ">" $3 } | declExpr INFIX_AT_HAT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr PERCENT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } - | declExpr COLON_COLON declExpr { SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple ([$1;$3],[rhs parseState 2],unionRanges $1.Range $3.Range),unionRanges $1.Range $3.Range) } + | declExpr COLON_COLON declExpr { SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple (false,[$1;$3],[rhs parseState 2],unionRanges $1.Range $3.Range),unionRanges $1.Range $3.Range) } | declExpr PLUS_MINUS_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr MINUS declExpr { mkSynInfix (rhs parseState 2) $1 "-" $3 } | declExpr STAR declExpr { mkSynInfix (rhs parseState 2) $1 "*" $3 } @@ -3393,7 +3408,7 @@ declExpr: | declExpr PERCENT_OP OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr("declExprInfix",(rhs parseState 3).StartRange))) } | declExpr COLON_COLON OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("::")) - SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple ([$1;(arbExpr("declExprInfix",(rhs parseState 3).StartRange))],[rhs parseState 2],unionRanges $1.Range (rhs parseState 3).StartRange),unionRanges $1.Range (rhs parseState 3).StartRange) } + SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple (false,[$1;(arbExpr("declExprInfix",(rhs parseState 3).StartRange))],[rhs parseState 2],unionRanges $1.Range (rhs parseState 3).StartRange),unionRanges $1.Range (rhs parseState 3).StartRange) } | declExpr PLUS_MINUS_OP OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr("declExprInfix",(rhs parseState 3).StartRange))) } | declExpr MINUS OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("-")) @@ -3558,10 +3573,10 @@ minusExpr: | AMP_AMP minusExpr { SynExpr.AddressOf(false,$2,rhs parseState 1, unionRanges (rhs parseState 1) $2.Range) } - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType { SynExpr.New(false,$2,$4,unionRanges (rhs parseState 1) $4.Range) } - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP error + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP error { SynExpr.New(false,$2,arbExpr("minusExpr",(rhs parseState 4)),unionRanges (rhs parseState 1) ($2).Range) } | NEW error @@ -3656,11 +3671,11 @@ atomicExpr: exprFromParseError (SynExpr.ArrayOrList(false,[ ], rhs parseState 1)),false } | STRUCT LPAREN tupleExpr rparen - { let exprs,commas = $3 in SynExpr.StructTuple(List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } + { let exprs,commas = $3 in SynExpr.Tuple(true, List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } | STRUCT LPAREN tupleExpr recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedBracket()); - let exprs,commas = $3 in SynExpr.StructTuple(List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } + let exprs,commas = $3 in SynExpr.Tuple(true, List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } | atomicExprAfterType { $1,false } @@ -3748,6 +3763,8 @@ atomicExprAfterType: { $1 } | braceExpr { $1 } + | braceBarExpr + { $1 } | NULL { SynExpr.Null(lhs parseState) } | FALSE @@ -3974,6 +3991,10 @@ forLoopRange: | parenPattern EQUALS rangeSequenceExpr { raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedSymbolEqualsInsteadOfIn()) } +forLoopDirection: + | TO { true } + | DOWNTO { false } + inlineAssemblyExpr: | HASH stringOrKeywordString opt_inlineAssemblyTypeArg opt_curriedArgExprs opt_inlineAssemblyReturnTypes HASH { libraryOnlyWarning (lhs parseState) @@ -4009,7 +4030,7 @@ opt_inlineAssemblyReturnTypes: { [] } recdExpr: - | INHERIT appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP opt_atomicExprAfterType recdExprBindings opt_seps_recd + | INHERIT atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP opt_atomicExprAfterType recdExprBindings opt_seps_recd { let arg = match $4 with None -> mkSynUnit (lhs parseState) | Some e -> e let l = List.rev $5 let dummyField = mkRecdField (LongIdentWithDots([], [])) // dummy identifier, it will be discarded @@ -4017,14 +4038,17 @@ recdExpr: let (_, _, inheritsSep) = List.head l let bindings = List.tail l (Some ($2,arg,rhs2 parseState 2 4, inheritsSep, rhs parseState 1), None, bindings) } + | recdExprCore + { let a,b = $1 in (None, a, b) } +recdExprCore: | appExpr EQUALS declExprBlock recdExprBindings opt_seps_recd { match $1 with | LongOrSingleIdent(false, (LongIdentWithDots(_,_) as f),None,m) -> let f = mkRecdField f let l = List.rev $4 let l = rebindRanges (f, Some $3) l $5 - (None, None, l) + (None, l) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsFieldBinding()) } /* @@ -4036,7 +4060,7 @@ recdExpr: reportParseErrorAt m (FSComp.SR.parsUnderscoreInvalidFieldName()) reportParseErrorAt m (FSComp.SR.parsFieldBinding()) let f = mkUnderscoreRecdField m - (None, None, [ f, None, None ]) } + (None, [ (f, None, None) ]) } | UNDERSCORE EQUALS { let m = rhs parseState 1 @@ -4045,29 +4069,28 @@ recdExpr: reportParseErrorAt (rhs2 parseState 1 2) (FSComp.SR.parsFieldBinding()) - (None, None, [f, None, None]) } + (None, [ (f, None, None) ]) } | UNDERSCORE EQUALS declExprBlock recdExprBindings opt_seps_recd { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnderscoreInvalidFieldName()) let f = mkUnderscoreRecdField (rhs parseState 1) - let l = List.rev $4 let l = rebindRanges (f, Some $3) l $5 - (None, None, l) } + (None, l) } /* handles case like {x with} */ | appExpr WITH recdBinding recdExprBindings opt_seps_recd { let l = List.rev $4 let l = rebindRanges $3 l $5 - (None,Some ($1, (rhs parseState 2, None)), l) } + (Some ($1, (rhs parseState 2, None)), l) } | appExpr OWITH opt_seps_recd OEND - { (None,Some ($1, (rhs parseState 2, None)), []) } + { (Some ($1, (rhs parseState 2, None)), []) } | appExpr OWITH recdBinding recdExprBindings opt_seps_recd OEND { let l = List.rev $4 let l = rebindRanges $3 l $5 - (None,Some ($1, (rhs parseState 2, None)), l) } + (Some ($1, (rhs parseState 2, None)), l) } opt_seps_recd: | seps_recd { Some $1 } @@ -4079,6 +4102,7 @@ seps_recd: | SEMICOLON OBLOCKSEP { (rhs2 parseState 1 2), Some (rhs parseState 1).End } | OBLOCKSEP SEMICOLON { (rhs2 parseState 1 2), Some (rhs parseState 2).End } + /* identifier can start from the underscore */ @@ -4131,19 +4155,19 @@ objExpr: let fullRange = match $3 with [] -> (rhs parseState 1) | _ -> (rhs2 parseState 1 3) fullRange, (fun m -> let (a,b) = $1 in SynExpr.ObjExpr(a,b,[],$3, mNewExpr, m)) } - | NEW appTypeNonAtomicDeprecated + | NEW atomTypeNonAtomicDeprecated { let mNewExpr = rhs parseState 1 (rhs2 parseState 1 2), (fun m -> let (a,b) = $2,None in SynExpr.ObjExpr(a,b,[],[], mNewExpr, m)) } objExprBaseCall: - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType baseSpec + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType baseSpec { ($2, Some($4,Some($5))) } - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType { ($2, Some($4,None)) } - | NEW appTypeNonAtomicDeprecated + | NEW atomTypeNonAtomicDeprecated { $2,None } @@ -4187,9 +4211,47 @@ objExprInterface: | interfaceMember appType opt_objExprBindings opt_declEnd opt_OBLOCKSEP { InterfaceImpl($2, $3, lhs parseState) } -forLoopDirection: - | TO { true } - | DOWNTO { false } +braceBarExpr: + | STRUCT braceBarExprCore + { $2 true } + | braceBarExprCore + { $1 false } + +braceBarExprCore: + | LBRACE_BAR recdExprCore bar_rbrace + { let orig, flds = $2 + let flds = + flds |> List.choose (function + | ((LongIdentWithDots([id],_),_),Some e,_) -> Some (id,e) + | ((LongIdentWithDots([id],_),_),None,_) -> Some (id, arbExpr("anonField",id.idRange)) + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) + let m = rhs2 parseState 1 3 + (fun isStruct -> SynExpr.AnonRecd(isStruct,orig,flds,m)) } + + | LBRACE_BAR recdExprCore recover + { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) + let orig, flds = $2 + let flds = + flds |> List.choose (function + | ((LongIdentWithDots([id],_),_),Some e,_) -> Some (id,e) + | ((LongIdentWithDots([id],_),_),None,_) -> Some (id, arbExpr("anonField",id.idRange)) + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) + let m = rhs2 parseState 1 2 + (fun isStruct -> SynExpr.AnonRecd(isStruct,orig,flds,m)) } + + | LBRACE_BAR error bar_rbrace + { // silent recovery + let m = rhs2 parseState 1 3 + (fun _ -> arbExpr("braceBarExpr",m)) } + + | LBRACE_BAR recover + { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) + let m = rhs2 parseState 1 1 + (fun isStruct -> SynExpr.AnonRecd(isStruct,None,[],m)) } + + | LBRACE_BAR bar_rbrace + { let m = rhs2 parseState 1 2 + (fun isStruct -> SynExpr.AnonRecd(isStruct,None,[],m)) } anonLambdaExpr: | FUN atomicPatterns RARROW typedSeqExprBlock @@ -4273,7 +4335,7 @@ topType: topTupleType: | topAppType STAR topTupleTypeElements - { let ty,mdata = $1 in let tys,mdatas = List.unzip $3 in (SynType.Tuple(List.map (fun ty -> (false,ty)) (ty ::tys), lhs parseState)),(mdata :: mdatas) } + { let ty,mdata = $1 in let tys,mdatas = List.unzip $3 in (SynType.Tuple(false,List.map (fun ty -> (false,ty)) (ty ::tys), lhs parseState)),(mdata :: mdatas) } | topAppType { let ty,mdata = $1 in ty,[mdata] } @@ -4323,15 +4385,15 @@ typEOF: tupleType: | appType STAR tupleOrQuotTypeElements - { SynType.Tuple((false,$1) :: $3,lhs parseState) } + { SynType.Tuple(false,(false,$1) :: $3,lhs parseState) } | INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements { if $1 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator()); - SynType.Tuple((true, SynType.StaticConstant (SynConst.Int32 1, lhs parseState)):: $2, lhs parseState) } + SynType.Tuple(false,(true, SynType.StaticConstant (SynConst.Int32 1, lhs parseState)):: $2, lhs parseState) } | appType INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements { if $2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator()); - SynType.Tuple((true,$1) :: $3, lhs parseState) } + SynType.Tuple(false,(true,$1) :: $3, lhs parseState) } | appType %prec prec_tuptyp_prefix { $1 } @@ -4347,13 +4409,6 @@ tupleOrQuotTypeElements: | appType %prec prec_tuptyptail_prefix { [(false,$1)] } -tupleTypeElements: - | appType STAR tupleTypeElements - { $1 :: $3 } - - | appType %prec prec_tuptyptail_prefix - { [$1] } - appTypeCon: | path %prec prec_atomtyp_path { SynType.LongIdent($1) } @@ -4427,57 +4482,37 @@ typeArgListElements: { [], [] } powerType: - | atomType + | atomTypeOrAnonRecdType { $1 } - | atomType INFIX_AT_HAT_OP atomicRationalConstant + | atomTypeOrAnonRecdType INFIX_AT_HAT_OP atomicRationalConstant { if $2 <> "^" && $2 <> "^-" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedInfixOperator()); if $2 = "^-" then SynType.MeasurePower($1, SynRationalConst.Negate($3), lhs parseState) else SynType.MeasurePower($1, $3, lhs parseState) } -/* Like appType but gives a deprecation error when a non-atomic type is used */ -appTypeNonAtomicDeprecated: - | appType arrayTypeSuffix - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - SynType.Array($2,$1,lhs parseState) } - - | appType HIGH_PRECEDENCE_BRACK_APP arrayTypeSuffix /* only HPA for "name[]" allowed here */ - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - SynType.Array($3,$1,lhs parseState) } - - | appType appTypeConPower - { let mWhole = unionRanges (rhs parseState 1) $2.Range // note: use "rhs parseState 1" to deal with parens in "(int) list" - deprecatedWithError (FSComp.SR.parsNonAtomicType()) mWhole; - SynType.App($2, None, [$1], [], None, true, mWhole) } +/* Like appType but gives a deprecation error when a non-atomic type is used */ +/* Also, doesn't start with '{|' */ +atomTypeNonAtomicDeprecated: | LPAREN appTypePrefixArguments rparen appTypeConPower { let args, commas = $2 mlCompatWarning (FSComp.SR.parsMultiArgumentGenericTypeFormDeprecated()) (unionRanges (rhs parseState 1) $4.Range); SynType.App($4, None, args, commas, None, true, unionRanges (rhs parseState 1) $4.Range) } - | powerTypeNonAtomicDeprecated + | atomType { $1 } - | typar COLON_GREATER typ - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - let tp,typ = $1,$3 - let m = lhs parseState - SynType.WithGlobalConstraints(SynType.Var (tp, rhs parseState 1), [WhereTyparSubtypeOfType(tp,typ,m)],m) } - - | UNDERSCORE COLON_GREATER typ %prec COLON_GREATER - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - SynType.HashConstraint($3, lhs parseState) } - -/* Like powerType but gives a deprecation warning if a non-atomic type is used */ -powerTypeNonAtomicDeprecated: +atomTypeOrAnonRecdType: | atomType - { $1 } + { $1 } + | anonRecdType + { let flds,isStruct = $1 + let flds2 = + flds |> List.choose (function + | (Field([],false,Some id,ty,false,_xmldoc,None,_m)) -> Some (id,ty) + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) + SynType.AnonRecd (isStruct,flds2, rhs parseState 1) } - | atomType INFIX_AT_HAT_OP atomicRationalConstant - { if $2 <> "^" && $2 <> "^-" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedInfixOperator()); - deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - if $2 = "^-" then SynType.MeasurePower($1, SynRationalConst.Negate($3), lhs parseState) - else SynType.MeasurePower($1, $3, lhs parseState) } /* Any tokens in this grammar must be added to the lex filter rule 'peekAdjacentTypars' */ @@ -4500,11 +4535,11 @@ atomType: $2 } | STRUCT LPAREN appType STAR tupleOrQuotTypeElements rparen - { SynType.StructTuple((false,$3) :: $5,lhs parseState) } + { SynType.Tuple(true, (false,$3) :: $5,lhs parseState) } | STRUCT LPAREN appType STAR tupleOrQuotTypeElements recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) - SynType.StructTuple((false,$3) :: $5,lhs parseState) } + SynType.Tuple(true, (false,$3) :: $5,lhs parseState) } | STRUCT LPAREN appType STAR recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) @@ -4976,6 +5011,9 @@ rbrace: | RBRACE_IS_HERE { } | RBRACE { } +bar_rbrace: + | BAR_RBRACE { } + rparen: | RPAREN_COMING_SOON rparen { } | RPAREN_IS_HERE { } diff --git a/src/fsharp/range.fs b/src/fsharp/range.fs index 8649b70086..4e97edc2b3 100755 --- a/src/fsharp/range.fs +++ b/src/fsharp/range.fs @@ -5,99 +5,119 @@ module Microsoft.FSharp.Compiler.Range open System open System.IO -open System.Collections.Generic +open System.Collections.Concurrent open Microsoft.FSharp.Core.Printf -open Internal.Utilities -open Microsoft.FSharp.Compiler.AbstractIL -open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Lib.Bits type FileIndex = int32 [] -let columnBitCount = 9 +let columnBitCount = 20 + [] -let lineBitCount = 16 +let lineBitCount = 31 let posBitCount = lineBitCount + columnBitCount -let _ = assert (posBitCount <= 32) -let posColumnMask = mask32 0 columnBitCount -let lineColumnMask = mask32 columnBitCount lineBitCount -let inline (lsr) (x:int) (y:int) = int32 (uint32 x >>> y) + +let posColumnMask = mask64 0 columnBitCount + +let lineColumnMask = mask64 columnBitCount lineBitCount [] [] -type pos(code:int32) = +type pos(code:int64) = + new (l, c) = let l = max 0 l let c = max 0 c - let p = ( c &&& posColumnMask) - ||| ((l <<< columnBitCount) &&& lineColumnMask) + let p = (int64 c &&& posColumnMask) + ||| ((int64 l <<< columnBitCount) &&& lineColumnMask) pos p - member p.Line = (code lsr columnBitCount) - member p.Column = (code &&& posColumnMask) + member p.Line = int32 (uint64 code >>> columnBitCount) + + member p.Column = int32 (code &&& posColumnMask) member r.Encoding = code + static member EncodingSize = posBitCount - static member Decode (code:int32) : pos = pos code + + static member Decode (code:int64) : pos = pos code + override p.Equals(obj) = match obj with :? pos as p2 -> code = p2.Encoding | _ -> false + override p.GetHashCode() = hash code + override p.ToString() = sprintf "(%d,%d)" p.Line p.Column [] -let fileIndexBitCount = 14 +let fileIndexBitCount = 24 + [] -let startLineBitCount = lineBitCount +let startColumnBitCount = columnBitCount // 20 + [] -let startColumnBitCount = columnBitCount +let endColumnBitCount = columnBitCount // 20 + [] -let heightBitCount = 15 // If necessary, could probably deduct one or two bits here without ill effect. +let startLineBitCount = lineBitCount // 31 + [] -let endColumnBitCount = columnBitCount +let heightBitCount = 27 + [] let isSyntheticBitCount = 1 -#if DEBUG -let _ = assert (fileIndexBitCount + startLineBitCount + startColumnBitCount + heightBitCount + endColumnBitCount + isSyntheticBitCount = 64) -#endif - + [] let fileIndexShift = 0 + [] -let startLineShift = 14 -[] -let startColumnShift = 30 +let startColumnShift = 24 + [] -let heightShift = 39 +let endColumnShift = 44 + [] -let endColumnShift = 54 +let startLineShift = 0 + [] -let isSyntheticShift = 63 +let heightShift = 31 +[] +let isSyntheticShift = 58 [] -let fileIndexMask = 0b0000000000000000000000000000000000000000000000000011111111111111L +let fileIndexMask = 0b0000000000000000000000000000000000000000111111111111111111111111L + [] -let startLineMask = 0b0000000000000000000000000000000000111111111111111100000000000000L +let startColumnMask = 0b0000000000000000000011111111111111111111000000000000000000000000L + [] -let startColumnMask = 0b0000000000000000000000000111111111000000000000000000000000000000L +let endColumnMask = 0b1111111111111111111100000000000000000000000000000000000000000000L + [] -let heightMask = 0b0000000000111111111111111000000000000000000000000000000000000000L +let startLineMask = 0b0000000000000000000000000000000001111111111111111111111111111111L + [] -let endColumnMask = 0b0111111111000000000000000000000000000000000000000000000000000000L +let heightMask = 0b0000001111111111111111111111111110000000000000000000000000000000L + [] -let isSyntheticMask = 0b1000000000000000000000000000000000000000000000000000000000000000L +let isSyntheticMask = 0b0000010000000000000000000000000000000000000000000000000000000000L #if DEBUG -let _ = assert (startLineShift = fileIndexShift + fileIndexBitCount) -let _ = assert (startColumnShift = startLineShift + startLineBitCount) -let _ = assert (heightShift = startColumnShift + startColumnBitCount) -let _ = assert (endColumnShift = heightShift + heightBitCount) -let _ = assert (isSyntheticShift = endColumnShift + endColumnBitCount) -let _ = assert (fileIndexMask = mask64 0 fileIndexBitCount) +let _ = assert (posBitCount <= 64) +let _ = assert (fileIndexBitCount + startColumnBitCount + endColumnBitCount <= 64) +let _ = assert (startLineBitCount + heightBitCount + isSyntheticBitCount <= 64) + +let _ = assert (startColumnShift = fileIndexShift + fileIndexBitCount) +let _ = assert (endColumnShift = startColumnShift + startColumnBitCount) + +let _ = assert (heightShift = startLineShift + startLineBitCount) +let _ = assert (isSyntheticShift = heightShift + heightBitCount) + +let _ = assert (fileIndexMask = mask64 fileIndexShift fileIndexBitCount) let _ = assert (startLineMask = mask64 startLineShift startLineBitCount) let _ = assert (startColumnMask = mask64 startColumnShift startColumnBitCount) let _ = assert (heightMask = mask64 heightShift heightBitCount) @@ -105,28 +125,64 @@ let _ = assert (endColumnMask = mask64 endColumnShift endColumnBitCount) let _ = assert (isSyntheticMask = mask64 isSyntheticShift isSyntheticBitCount) #endif -// This is just a standard unique-index table +/// Removes relative parts from any full paths +let normalizeFilePath (filePath: string) = + try + if FileSystem.IsPathRootedShim filePath then + FileSystem.GetFullPathShim filePath + else + filePath + with _ -> filePath + +/// A unique-index table for file names. type FileIndexTable() = let indexToFileTable = new ResizeArray<_>(11) - let fileToIndexTable = new Dictionary(11) - member t.FileToIndex f = - let mutable res = 0 - let ok = fileToIndexTable.TryGetValue(f, &res) - if ok then res - else + let fileToIndexTable = new ConcurrentDictionary() + + // Note: we should likely adjust this code to always normalize. However some testing (and possibly some + // product behaviour) appears to be sensitive to error messages reporting un-normalized file names. + // Currently all names going through 'mkRange' get normalized, while this going through just 'fileIndexOfFile' + // do not. Also any file names which are not put into ranges at all are non-normalized. + // + // TO move forward we should eventually introduce a new type NormalizedFileName that tracks this invariant. + member t.FileToIndex normalize filePath = + match fileToIndexTable.TryGetValue(filePath) with + | true, idx -> idx + | _ -> + + // Try again looking for a normalized entry. + let normalizedFilePath = if normalize then normalizeFilePath filePath else filePath + match fileToIndexTable.TryGetValue(normalizedFilePath) with + | true, idx -> + // Record the non-normalized entry if necessary + if filePath <> normalizedFilePath then + lock fileToIndexTable (fun () -> + fileToIndexTable.[filePath] <- idx) + + // Return the index + idx + + | _ -> lock fileToIndexTable (fun () -> - let mutable res = 0 in - let ok = fileToIndexTable.TryGetValue(f, &res) in - if ok then res - else - let n = indexToFileTable.Count in - indexToFileTable.Add(f) - fileToIndexTable.[f] <- n - n) + // Get the new index + let idx = indexToFileTable.Count + + // Record the normalized entry + indexToFileTable.Add normalizedFilePath + fileToIndexTable.[normalizedFilePath] <- idx + + // Record the non-normalized entry if necessary + if filePath <> normalizedFilePath then + fileToIndexTable.[filePath] <- idx + + // Return the index + idx) member t.IndexToFile n = - (if n < 0 then failwithf "fileOfFileIndex: negative argument: n = %d\n" n) - (if n >= indexToFileTable.Count then failwithf "fileOfFileIndex: invalid argument: n = %d\n" n) + if n < 0 then + failwithf "fileOfFileIndex: negative argument: n = %d\n" n + if n >= indexToFileTable.Count then + failwithf "fileOfFileIndex: invalid argument: n = %d\n" n indexToFileTable.[n] let maxFileIndex = pown32 fileIndexBitCount @@ -136,8 +192,11 @@ let maxFileIndex = pown32 fileIndexBitCount let fileIndexTable = new FileIndexTable() // If we exceed the maximum number of files we'll start to report incorrect file names -let fileIndexOfFile f = fileIndexTable.FileToIndex(f) % maxFileIndex -let fileOfFileIndex n = fileIndexTable.IndexToFile(n) +let fileIndexOfFileAux normalize f = fileIndexTable.FileToIndex normalize f % maxFileIndex + +let fileIndexOfFile filePath = fileIndexOfFileAux false filePath + +let fileOfFileIndex idx = fileIndexTable.IndexToFile idx let mkPos l c = pos (l, c) @@ -147,28 +206,47 @@ let mkPos l c = pos (l, c) #else [] #endif -type range(code:int64) = - static member Zero = range(0L) +type range(code1:int64, code2: int64) = + static member Zero = range(0L, 0L) new (fidx, bl, bc, el, ec) = - range( int64 fidx - ||| (int64 bl <<< startLineShift) - ||| (int64 bc <<< startColumnShift) - ||| (int64 (el-bl) <<< heightShift) - ||| (int64 ec <<< endColumnShift) ) + let code1 = ((int64 fidx) &&& fileIndexMask) + ||| ((int64 bc <<< startColumnShift) &&& startColumnMask) + ||| ((int64 ec <<< endColumnShift) &&& endColumnMask) + let code2 = + ((int64 bl <<< startLineShift) &&& startLineMask) + ||| ((int64 (el-bl) <<< heightShift) &&& heightMask) + range(code1, code2) new (fidx, b:pos, e:pos) = range(fidx, b.Line, b.Column, e.Line, e.Column) - member r.StartLine = int32((code &&& startLineMask) >>> startLineShift) - member r.StartColumn = int32((code &&& startColumnMask) >>> startColumnShift) - member r.EndLine = int32((code &&& heightMask) >>> heightShift) + r.StartLine - member r.EndColumn = int32((code &&& endColumnMask) >>> endColumnShift) - member r.IsSynthetic = int32((code &&& isSyntheticMask) >>> isSyntheticShift) <> 0 + member r.StartLine = int32((code2 &&& startLineMask) >>> startLineShift) + + member r.StartColumn = int32((code1 &&& startColumnMask) >>> startColumnShift) + + member r.EndLine = int32((code2 &&& heightMask) >>> heightShift) + r.StartLine + + member r.EndColumn = int32((code1 &&& endColumnMask) >>> endColumnShift) + + member r.IsSynthetic = int32((code2 &&& isSyntheticMask) >>> isSyntheticShift) <> 0 + member r.Start = pos (r.StartLine, r.StartColumn) + member r.End = pos (r.EndLine, r.EndColumn) - member r.FileIndex = int32(code &&& fileIndexMask) + + member r.FileIndex = int32(code1 &&& fileIndexMask) + member m.StartRange = range (m.FileIndex, m.Start, m.Start) + member m.EndRange = range (m.FileIndex, m.End, m.End) + member r.FileName = fileOfFileIndex r.FileIndex + + member r.MakeSynthetic() = range(code1, code2 ||| isSyntheticMask) + + member r.Code1 = code1 + + member r.Code2 = code2 + #if DEBUG member r.DebugCode = try @@ -182,37 +260,37 @@ type range(code:int64) = with e -> e.ToString() #endif - member r.MakeSynthetic() = range(code ||| isSyntheticMask) - override r.ToString() = sprintf "%s (%d,%d--%d,%d) IsSynthetic=%b" r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic + member r.ToShortString() = sprintf "(%d,%d--%d,%d)" r.StartLine r.StartColumn r.EndLine r.EndColumn - member r.Code = code - override r.Equals(obj) = match obj with :? range as r2 -> code = r2.Code | _ -> false - override r.GetHashCode() = hash code -let mkRange f b e = - // remove relative parts from full path - let normalizedFilePath = if Path.IsPathRooted f then try Path.GetFullPath f with _ -> f else f - range (fileIndexOfFile normalizedFilePath, b, e) + override r.Equals(obj) = match obj with :? range as r2 -> code1 = r2.Code1 && code2 = r2.Code2 | _ -> false + + override r.GetHashCode() = hash code1 + hash code2 + + override r.ToString() = sprintf "%s (%d,%d--%d,%d) IsSynthetic=%b" r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic -let mkFileIndexRange fi b e = range (fi, b, e) +let mkRange filePath startPos endPos = range (fileIndexOfFileAux true filePath, startPos, endPos) + +let mkFileIndexRange fileIndex startPos endPos = range (fileIndex, startPos, endPos) -(* end representation, start derived ops *) - let posOrder = Order.orderOn (fun (p:pos) -> p.Line, p.Column) (Pair.order (Int32.order, Int32.order)) -(* rangeOrder: not a total order, but enough to sort on ranges *) + +/// rangeOrder: not a total order, but enough to sort on ranges let rangeOrder = Order.orderOn (fun (r:range) -> r.FileName, r.Start) (Pair.order (String.order, posOrder)) let outputPos (os:TextWriter) (m:pos) = fprintf os "(%d,%d)" m.Line m.Column + let outputRange (os:TextWriter) (m:range) = fprintf os "%s%a-%a" m.FileName outputPos m.Start outputPos m.End -let boutputPos os (m:pos) = bprintf os "(%d,%d)" m.Line m.Column -let boutputRange os (m:range) = bprintf os "%s%a-%a" m.FileName boutputPos m.Start boutputPos m.End let posGt (p1:pos) (p2:pos) = (p1.Line > p2.Line || (p1.Line = p2.Line && p1.Column > p2.Column)) + let posEq (p1:pos) (p2:pos) = (p1.Line = p2.Line && p1.Column = p2.Column) + let posGeq p1 p2 = posEq p1 p2 || posGt p1 p2 + let posLt p1 p2 = posGt p2 p1 -// This is deliberately written in an allocation-free way, i.e. m1.Start, m1.End etc. are not called +/// This is deliberately written in an allocation-free way, i.e. m1.Start, m1.End etc. are not called let unionRanges (m1:range) (m2:range) = if m1.FileIndex <> m2.FileIndex then m2 else let b = @@ -236,9 +314,13 @@ let rangeBeforePos (m1:range) p = posGeq p m1.End let rangeN filename line = mkRange filename (mkPos line 0) (mkPos line 0) + let pos0 = mkPos 1 0 + let range0 = rangeN "unknown" 1 + let rangeStartup = rangeN "startup" 1 + let rangeCmdArgs = rangeN "commandLineArgs" 0 let trimRangeToLine (r:range) = @@ -252,6 +334,7 @@ let trimRangeToLine (r:range) = (* For Diagnostics *) let stringOfPos (pos:pos) = sprintf "(%d,%d)" pos.Line pos.Column + let stringOfRange (r:range) = sprintf "%s%s-%s" r.FileName (stringOfPos r.Start) (stringOfPos r.End) #if CHECK_LINE0_TYPES // turn on to check that we correctly transform zero-based line counts to one-based line counts @@ -266,17 +349,22 @@ type Pos01 = Line0 * int type Range01 = Pos01 * Pos01 module Line = + // Visual Studio uses line counts starting at 0, F# uses them starting at 1 let fromZ (line:Line0) = int line+1 + let toZ (line:int) : Line0 = LanguagePrimitives.Int32WithMeasure(line - 1) module Pos = + let fromZ (line:Line0) idx = mkPos (Line.fromZ line) idx - let toZ (p:pos) = (Line.toZ p.Line, p.Column) + let toZ (p:pos) = (Line.toZ p.Line, p.Column) module Range = + let toZ (m:range) = Pos.toZ m.Start, Pos.toZ m.End + let toFileZ (m:range) = m.FileName, toZ m diff --git a/src/fsharp/range.fsi b/src/fsharp/range.fsi index c3805f4659..d4ef8be800 100755 --- a/src/fsharp/range.fsi +++ b/src/fsharp/range.fsi @@ -10,44 +10,86 @@ open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler -(* we keep a global tables of filenames that we can reference by integers *) +/// An index into a global tables of filenames type FileIndex = int32 -val fileIndexOfFile : string -> FileIndex + +/// Convert a file path to an index +val fileIndexOfFile : filePath: string -> FileIndex + +/// Convert an index into a file path val fileOfFileIndex : FileIndex -> string +/// Represents a position in a file [] type pos = + + /// The line number for the position member Line : int + + /// The column number for the position member Column : int - member Encoding : int32 - static member Decode : int32 -> pos + /// The encoding of the position as a 64-bit integer + member Encoding : int64 + + /// Decode a position fro a 64-bit integer + static member Decode : int64 -> pos + /// The maximum number of bits needed to store an encoded position - static member EncodingSize : int32 + static member EncodingSize : int /// Create a position for the given line and column val mkPos : line:int -> column:int -> pos +/// Ordering on positions val posOrder : IComparer +/// Represents a range within a known file [] type range = + + /// The start line of the range member StartLine : int + + /// The start column of the range member StartColumn : int + + /// The line number for the end position of the range member EndLine : int + + /// The column number for the end position of the range member EndColumn : int + + /// The start position of the range member Start : pos + + /// The end position of the range member End : pos + + /// The empty range that is located at the start position of the range member StartRange: range + + /// The empty range that is located at the end position of the range member EndRange: range + + /// The file index for the range member FileIndex : int + + /// The file name for the file of the range member FileName : string + /// Synthetic marks ranges which are produced by intermediate compilation phases. This /// bit signifies that the range covers something that should not be visible to language /// service operations like dot-completion. member IsSynthetic : bool + + /// Convert a range to be synthetic member MakeSynthetic : unit -> range + + /// Convert a range to string member ToShortString : unit -> string + + /// The range where all values are zero static member Zero : range /// This view of range marks uses file indexes explicitly @@ -56,34 +98,61 @@ val mkFileIndexRange : FileIndex -> pos -> pos -> range /// This view hides the use of file indexes and just uses filenames val mkRange : string -> pos -> pos -> range +/// Reduce a range so it only covers a line val trimRangeToLine : range -> range /// not a total order, but enough to sort on ranges val rangeOrder : IComparer +/// Output a position val outputPos : System.IO.TextWriter -> pos -> unit + +/// Output a range val outputRange : System.IO.TextWriter -> range -> unit -val boutputPos : StringBuilder -> pos -> unit -val boutputRange : StringBuilder -> range -> unit +/// Compare positions for less-than val posLt : pos -> pos -> bool + +/// Compare positions for greater-than val posGt : pos -> pos -> bool + +/// Compare positions for equality val posEq : pos -> pos -> bool + +/// Compare positions for greater-than-or-equal-to val posGeq : pos -> pos -> bool +/// Union two ranges, taking their first occurring start position and last occurring end position val unionRanges : range -> range -> range + +/// Test to see if one range contains another range val rangeContainsRange : range -> range -> bool + +/// Test to see if a range contains a position val rangeContainsPos : range -> pos -> bool + +/// Test to see if a range occurs fully before a position val rangeBeforePos : range -> pos -> bool +/// Make a dummy range for a file val rangeN : string -> int -> range + +/// The zero position val pos0 : pos + +/// The zero range val range0 : range + +/// A range associated with a dummy file called "startup" val rangeStartup : range + +/// A range associated with a dummy file for the command line arguments val rangeCmdArgs : range -(* For diagnostics *) +/// Convert a position to a string val stringOfPos : pos -> string + +/// Convert a range to a string val stringOfRange : range -> string /// Represents a line number when using zero-based line counting (used by Visual Studio) @@ -98,22 +167,30 @@ type Line0 = int /// Represents a position using zero-based line counting (used by Visual Studio) type Pos01 = Line0 * int + /// Represents a range using zero-based line counting (used by Visual Studio) type Range01 = Pos01 * Pos01 module Line = + /// Convert a line number from zero-based line counting (used by Visual Studio) to one-based line counting (used internally in the F# compiler and in F# error messages) val fromZ : Line0 -> int + /// Convert a line number from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toZ : int -> Line0 module Pos = + /// Convert a position from zero-based line counting (used by Visual Studio) to one-based line counting (used internally in the F# compiler and in F# error messages) val fromZ : line:Line0 -> column:int -> pos + /// Convert a position from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toZ : pos -> Pos01 module Range = + /// Convert a range from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toZ : range -> Range01 + + /// Convert a range from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toFileZ : range -> string * Range01 diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index 7065d72a6f..f5d0141b32 100755 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -55,15 +55,16 @@ module internal IncrementalBuild = /// Get the Id for the given ScalarBuildRule. member x.Id = match x with - | ScalarInput(id, _) ->id - | ScalarDemultiplex(id, _, _, _) ->id - | ScalarMap(id, _, _, _) ->id + | ScalarInput(id, _) -> id + | ScalarDemultiplex(id, _, _, _) -> id + | ScalarMap(id, _, _, _) -> id + /// Get the Name for the givenScalarExpr. member x.Name = match x with - | ScalarInput(_, n) ->n - | ScalarDemultiplex(_, n, _, _) ->n - | ScalarMap(_, n, _, _) ->n + | ScalarInput(_, n) -> n + | ScalarDemultiplex(_, n, _, _) -> n + | ScalarMap(_, n, _, _) -> n /// A build rule with a vector of outputs and VectorBuildRule = @@ -1034,6 +1035,7 @@ type TypeCheckAccumulator = /// Accumulated 'open' declarations, last file first tcOpenDeclarationsRev: OpenDeclaration[] list + topAttribs:TopAttribs option /// Result of checking most recent file, if any @@ -1043,6 +1045,9 @@ type TypeCheckAccumulator = tcDependencyFiles: string list + /// Disambiguation table for module names + tcModuleNamesDict: ModuleNamesDict + /// Accumulated errors, last file first tcErrorsRev:(PhasedDiagnostic * FSharpErrorSeverity)[] list } @@ -1125,10 +1130,17 @@ type PartialCheckResults = /// Kept in a stack so that each incremental update shares storage with previous files TcOpenDeclarationsRev: OpenDeclaration[] list + /// Disambiguation table for module names + ModuleNamesDict: ModuleNamesDict + TcDependencyFiles: string list + TopAttribs: TopAttribs option + TimeStamp: DateTime + LatestImplementationFile: TypedImplFile option + LastestCcuSigForFile: ModuleOrNamespaceType option } member x.TcErrors = Array.concat (List.rev x.TcErrorsRev) @@ -1146,6 +1158,7 @@ type PartialCheckResults = TcOpenDeclarationsRev = tcAcc.tcOpenDeclarationsRev TcDependencyFiles = tcAcc.tcDependencyFiles TopAttribs = tcAcc.topAttribs + ModuleNamesDict = tcAcc.tcModuleNamesDict TimeStamp = timestamp LatestImplementationFile = tcAcc.latestImplFile LastestCcuSigForFile = tcAcc.latestCcuSigForFile } @@ -1175,7 +1188,9 @@ type RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState: yield (ccuName, (fun () -> r.GetBytes())) ] let autoOpenAttrs = topAttrs.assemblyAttrs |> List.choose (List.singleton >> TryFindFSharpStringAttribute tcGlobals tcGlobals.attrib_AutoOpenAttribute) + let ivtAttrs = topAttrs.assemblyAttrs |> List.choose (List.singleton >> TryFindFSharpStringAttribute tcGlobals tcGlobals.attrib_InternalsVisibleToAttribute) + interface IRawFSharpAssemblyData with member __.GetAutoOpenAttributes(_ilg) = autoOpenAttrs member __.GetInternalsVisibleToAttributes(_ilg) = ivtAttrs @@ -1246,6 +1261,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput let assertNotDisposed() = if disposed then System.Diagnostics.Debug.Assert(false, "IncrementalBuild object has already been disposed!") + let mutable referenceCount = 0 //---------------------------------------------------- @@ -1258,14 +1274,9 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput assertNotDisposed() cache.GetFileTimeStamp filename - // Deduplicate module names - let moduleNamesDict = ConcurrentDictionary>() - /// This is a build task function that gets placed into the build rules as the computation for a VectorMap /// - /// Parse the given files and return the given inputs. This function is expected to be - /// able to be called with a subset of sourceFiles and return the corresponding subset of - /// parsed inputs. + /// Parse the given file and return the given input. let ParseTask ctok (sourceRange:range, filename:string, isLastCompiland) = assertNotDisposed() DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok @@ -1278,12 +1289,12 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput IncrementalBuilderEventTesting.MRU.Add(IncrementalBuilderEventTesting.IBEParsed filename) let input = ParseOneInputFile(tcConfig, lexResourceManager, [], filename , isLastCompiland, errorLogger, (*retryLocked*)true) fileParsed.Trigger (filename) - let result = Option.map (DeduplicateParsedInputModuleName moduleNamesDict) input - result, sourceRange, filename, errorLogger.GetErrors () + input, sourceRange, filename, errorLogger.GetErrors () with exn -> - System.Diagnostics.Debug.Assert(false, sprintf "unexpected failure in IncrementalFSharpBuild.Parse\nerror = %s" (exn.ToString())) - failwith "last chance failure" + let msg = sprintf "unexpected failure in IncrementalFSharpBuild.Parse\nerror = %s" (exn.ToString()) + System.Diagnostics.Debug.Assert(false, msg) + failwith msg /// This is a build task function that gets placed into the build rules as the computation for a Vector.Stamp @@ -1356,7 +1367,8 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput latestImplFile=None latestCcuSigForFile=None tcDependencyFiles=basicDependencies - tcErrorsRev = [ initialErrors ] } + tcErrorsRev = [ initialErrors ] + tcModuleNamesDict = Map.empty } return tcAcc } /// This is a build task function that gets placed into the build rules as the computation for a Vector.ScanLeft @@ -1377,6 +1389,8 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput let sink = TcResultsSinkImpl(tcAcc.tcGlobals) let hadParseErrors = not (Array.isEmpty parseErrors) + let input, moduleNamesDict = DeduplicateParsedInputModuleName tcAcc.tcModuleNamesDict input + let! (tcEnvAtEndOfFile, topAttribs, implFile, ccuSigForFile), tcState = TypeCheckOneInputEventually ((fun () -> hadParseErrors || errorLogger.ErrorCount > 0), @@ -1405,6 +1419,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput tcSymbolUsesRev=tcSymbolUses :: tcAcc.tcSymbolUsesRev tcOpenDeclarationsRev = sink.GetOpenDeclarations() :: tcAcc.tcOpenDeclarationsRev tcErrorsRev = newErrors :: tcAcc.tcErrorsRev + tcModuleNamesDict = moduleNamesDict tcDependencyFiles = filename :: tcAcc.tcDependencyFiles } } @@ -1447,55 +1462,55 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput TypeCheckMultipleInputsFinish (results, finalAcc.tcState) let ilAssemRef, tcAssemblyDataOpt, tcAssemblyExprOpt = - try - // TypeCheckClosedInputSetFinish fills in tcState.Ccu but in incremental scenarios we don't want this, - // so we make this temporary here - let oldContents = tcState.Ccu.Deref.Contents - try - let tcState, tcAssemblyExpr = TypeCheckClosedInputSetFinish (mimpls, tcState) - - // 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 = Driver.ValidateKeySigningAttributes (tcConfig, tcGlobals, topAttrs) - match Driver.GetStrongNameSigner signingInfo with - | None -> None - | Some s -> Some (PublicKey.KeyAsToken(s.PublicKey)) - with e -> - errorRecoveryNoRange e - 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 tcAssemblyDataOpt = + try + // TypeCheckClosedInputSetFinish fills in tcState.Ccu but in incremental scenarios we don't want this, + // so we make this temporary here + let oldContents = tcState.Ccu.Deref.Contents try - // Assemblies containing type provider components can not 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, _, _, _, _, _, _)) -> tcref.CompiledRepresentationForNamedType.BasicQualifiedName = typeof.FullName) - if tcState.CreatesGeneratedProvidedTypes || hasTypeProviderAssemblyAttrib then - None - else - Some (RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState, outfile, topAttrs, assemblyName, ilAssemRef) :> IRawFSharpAssemblyData) - - with e -> - errorRecoveryNoRange e - None - ilAssemRef, tcAssemblyDataOpt, Some tcAssemblyExpr - finally - tcState.Ccu.Deref.Contents <- oldContents - with e -> - errorRecoveryNoRange e - mkSimpleAssRef assemblyName, None, None + let tcState, tcAssemblyExpr = TypeCheckClosedInputSetFinish (mimpls, tcState) + + // 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 = Driver.ValidateKeySigningAttributes (tcConfig, tcGlobals, topAttrs) + match Driver.GetStrongNameSigner signingInfo with + | None -> None + | Some s -> Some (PublicKey.KeyAsToken(s.PublicKey)) + with e -> + errorRecoveryNoRange e + 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 tcAssemblyDataOpt = + try + // Assemblies containing type provider components can not 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, _, _, _, _, _, _)) -> tcref.CompiledRepresentationForNamedType.BasicQualifiedName = typeof.FullName) + if tcState.CreatesGeneratedProvidedTypes || hasTypeProviderAssemblyAttrib then + None + else + Some (RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState, outfile, topAttrs, assemblyName, ilAssemRef) :> IRawFSharpAssemblyData) + + with e -> + errorRecoveryNoRange e + None + ilAssemRef, tcAssemblyDataOpt, Some tcAssemblyExpr + finally + tcState.Ccu.Deref.Contents <- oldContents + with e -> + errorRecoveryNoRange e + mkSimpleAssemblyRef assemblyName, None, None let finalAccWithErrors = { finalAcc with @@ -1560,9 +1575,9 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput member this.IncrementUsageCount() = assertNotDisposed() System.Threading.Interlocked.Increment(&referenceCount) |> ignore - { new System.IDisposable with member x.Dispose() = this.DecrementUsageCount() } + { new System.IDisposable with member __.Dispose() = this.DecrementUsageCount() } - member this.DecrementUsageCount() = + member __.DecrementUsageCount() = assertNotDisposed() let currentValue = System.Threading.Interlocked.Decrement(&referenceCount) if currentValue = 0 then @@ -1572,11 +1587,17 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput member __.IsAlive = referenceCount > 0 member __.TcConfig = tcConfig + member __.FileParsed = fileParsed.Publish + member __.BeforeFileChecked = beforeFileChecked.Publish + member __.FileChecked = fileChecked.Publish + member __.ProjectChecked = projectChecked.Publish + member __.ImportedCcusInvalidated = importsInvalidated.Publish + member __.AllDependenciesDeprecated = allDependencies #if !NO_EXTENSIONTYPING @@ -1621,7 +1642,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput | (*first file*) 0 -> IncrementalBuild.IsReady cache (Target(initialTcAccNode, None)) partialBuild | _ -> IncrementalBuild.IsReady cache (Target(tcStatesNode, Some (slotOfFile-1))) partialBuild - member builder.GetCheckResultsBeforeSlotInProject (ctok: CompilationThreadToken, slotOfFile) = + member __.GetCheckResultsBeforeSlotInProject (ctok: CompilationThreadToken, slotOfFile) = cancellable { let cache = TimeStampCache(defaultTimeStamp) let! result = @@ -1651,9 +1672,6 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput member builder.GetCheckResultsAfterLastFileInProject (ctok: CompilationThreadToken) = builder.GetCheckResultsBeforeSlotInProject(ctok, builder.GetSlotsCount()) - member builder.DeduplicateParsedInputModuleNameInProject (input) = - DeduplicateParsedInputModuleName moduleNamesDict input - member __.GetCheckResultsAndImplementationsForProject(ctok: CompilationThreadToken) = cancellable { let cache = TimeStampCache(defaultTimeStamp) @@ -1860,10 +1878,11 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput return builderOpt, diagnostics } + static member KeepBuilderAlive (builderOpt: IncrementalBuilder option) = match builderOpt with | Some builder -> builder.IncrementUsageCount() | None -> { new System.IDisposable with member __.Dispose() = () } - member builder.IsBeingKeptAliveApartFromCacheEntry = (referenceCount >= 2) + member __.IsBeingKeptAliveApartFromCacheEntry = (referenceCount >= 2) diff --git a/src/fsharp/service/IncrementalBuild.fsi b/src/fsharp/service/IncrementalBuild.fsi index b6b64a7ffd..29c7a03a45 100755 --- a/src/fsharp/service/IncrementalBuild.fsi +++ b/src/fsharp/service/IncrementalBuild.fsi @@ -55,6 +55,9 @@ type internal PartialCheckResults = /// Represents open declarations TcOpenDeclarationsRev: OpenDeclaration[] list + /// Disambiguation table for module names + ModuleNamesDict: ModuleNamesDict + TcDependencyFiles: string list /// Represents the collected attributes to apply to the module of assuembly generates @@ -151,8 +154,6 @@ type internal IncrementalBuilder = // TODO: make this an Eventually (which can be scheduled) or an Async (which can be cancelled) member GetCheckResultsAndImplementationsForProject : CompilationThreadToken -> Cancellable - member DeduplicateParsedInputModuleNameInProject: Ast.ParsedInput -> Ast.ParsedInput - /// Get the logical time stamp that is associated with the output of the project if it were gully built immediately member GetLogicalTimeStampForProject: TimeStampCache * CompilationThreadToken -> DateTime diff --git a/src/fsharp/service/ServiceAssemblyContent.fs b/src/fsharp/service/ServiceAssemblyContent.fs index a61f8f2b2f..663ed82a94 100644 --- a/src/fsharp/service/ServiceAssemblyContent.fs +++ b/src/fsharp/service/ServiceAssemblyContent.fs @@ -555,7 +555,7 @@ module ParsedInput = | SynTypeConstraint.WhereTyparSupportsMember (ts, sign, _) -> List.iter walkType ts; walkMemberSig sign and walkPat = function - | SynPat.Tuple (pats, _) + | SynPat.Tuple (_,pats, _) | SynPat.ArrayOrList (_, pats, _) | SynPat.Ands (pats, _) -> List.iter walkPat pats | SynPat.Named (pat, ident, _, _, _) -> @@ -603,7 +603,7 @@ module ParsedInput = | SynType.LongIdent ident -> addLongIdentWithDots ident | SynType.App (ty, _, types, _, _, _, _) -> walkType ty; List.iter walkType types | SynType.LongIdentApp (_, _, _, types, _, _, _) -> List.iter walkType types - | SynType.Tuple (ts, _) -> ts |> List.iter (fun (_, t) -> walkType t) + | SynType.Tuple (_, ts, _) -> ts |> List.iter (fun (_, t) -> walkType t) | SynType.WithGlobalConstraints (t, typeConstraints, _) -> walkType t; List.iter walkTypeConstraint typeConstraints | _ -> () @@ -641,7 +641,7 @@ module ParsedInput = | SynExpr.TypeTest (e, t, _) | SynExpr.Upcast (e, t, _) | SynExpr.Downcast (e, t, _) -> walkExpr e; walkType t - | SynExpr.Tuple (es, _, _) + | SynExpr.Tuple (_, es, _, _) | Sequentials es | SynExpr.ArrayOrList (_, es, _) -> List.iter walkExpr es | SynExpr.App (_, _, e1, e2, _) @@ -668,7 +668,7 @@ module ParsedInput = List.iter walkExpr [e1; e2] | SynExpr.MatchLambda (_, _, synMatchClauseList, _, _) -> List.iter walkClause synMatchClauseList - | SynExpr.Match (_, e, synMatchClauseList, _, _) -> + | SynExpr.Match (_, e, synMatchClauseList, _) -> walkExpr e List.iter walkClause synMatchClauseList | SynExpr.TypeApp (e, _, tys, _, _, _, _) -> @@ -914,8 +914,9 @@ module ParsedInput = let rec walkImplFileInput (ParsedImplFileInput(modules = moduleOrNamespaceList)) = List.iter (walkSynModuleOrNamespace []) moduleOrNamespaceList - and walkSynModuleOrNamespace (parent: LongIdent) (SynModuleOrNamespace(ident, _, isModule, decls, _, _, _, range)) = + and walkSynModuleOrNamespace (parent: LongIdent) (SynModuleOrNamespace(ident, _, kind, decls, _, _, _, range)) = if range.EndLine >= currentLine then + let isModule = kind.IsModule match isModule, parent, ident with | false, _, _ -> ns := Some (longIdentToIdents ident) // top level module with "inlined" namespace like Ns1.Ns2.TopModule @@ -1035,4 +1036,4 @@ module ParsedInput = | _ -> // we failed to find insertion point because ast is empty for some reason, return top left point in this case { ScopeKind = ScopeKind.TopModule - Pos = mkPos 1 0 } \ No newline at end of file + Pos = mkPos 1 0 } diff --git a/src/fsharp/service/ServiceDeclarationLists.fs b/src/fsharp/service/ServiceDeclarationLists.fs index 85d7249f61..22b851a5b8 100644 --- a/src/fsharp/service/ServiceDeclarationLists.fs +++ b/src/fsharp/service/ServiceDeclarationLists.fs @@ -28,7 +28,7 @@ open Microsoft.FSharp.Compiler.InfoReader module EnvMisc3 = /// dataTipSpinWaitTime limits how long we block the UI thread while a tooltip pops up next to a selected item in an IntelliSense completion list. /// This time appears to be somewhat amortized by the time it takes the VS completion UI to actually bring up the tooltip after selecting an item in the first place. - let dataTipSpinWaitTime = GetEnvInteger "FCS_ToolTipSpinWaitTime" 300 + let dataTipSpinWaitTime = GetEnvInteger "FCS_ToolTipSpinWaitTime" 5000 [] @@ -109,7 +109,7 @@ module internal DescriptionListsImpl = | Some id, true, ptyOpt -> let nm = id.idText // detect parameter type, if ptyOpt is None - this is .NET style optional argument - let pty = defaultArg ptyOpt pty + let pty = match ptyOpt with ValueSome x -> x | _ -> pty (nm, isOptArg, SepL.questionMark ^^ (wordL (TaggedTextOps.tagParameter nm))), pty // Layout an unnamed argument | None, _,_ -> @@ -204,13 +204,13 @@ module internal DescriptionListsImpl = let getPrettyParamsOfTypes() = let tau = vref.TauType match tryDestFunTy denv.g tau with - | Some(arg,rtau) -> + | ValueSome(arg,rtau) -> let args = tryDestRefTupleTy denv.g arg let _prettyTyparInst, prettyParams, prettyRetTyL, _prettyConstraintsL = PrettyParamsOfTypes g denv item.TyparInst args rtau // FUTURE: prettyTyparInst is the pretty version of the known instantiations of type parameters in the output. It could be returned // for display as part of the method group prettyParams, prettyRetTyL - | None -> + | _ -> let _prettyTyparInst, prettyTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] tau [], prettyTyL @@ -241,8 +241,8 @@ module internal DescriptionListsImpl = // Adjust the return type so it only strips the first argument let curriedRetTy = match tryDestFunTy denv.g vref.TauType with - | Some(_,rtau) -> rtau - | None -> lastRetTy + | ValueSome(_,rtau) -> rtau + | _ -> lastRetTy let _prettyTyparInst, prettyFirstCurriedParams, prettyCurriedRetTyL, prettyConstraintsL = PrettyParamsOfParamDatas g denv item.TyparInst firstCurriedParamDatas curriedRetTy @@ -283,6 +283,10 @@ module internal DescriptionListsImpl = let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] rfinfo.FieldType [], prettyRetTyL + | Item.AnonRecdField(_anonInfo,tys,i, _) -> + let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] tys.[i] + [], prettyRetTyL + | Item.ILField finfo -> let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] (finfo.FieldType(amap,m)) [], prettyRetTyL @@ -381,14 +385,14 @@ module internal DescriptionListsImpl = /// Find the glyph for the given type representation. let typeToGlyph ty = - if isAppTy denv.g ty then - let tcref = tcrefOfAppTy denv.g ty - tcref.TypeReprInfo |> reprToGlyph - elif isStructTupleTy denv.g ty then FSharpGlyph.Struct - elif isRefTupleTy denv.g ty then FSharpGlyph.Class - elif isFunction denv.g ty then FSharpGlyph.Delegate - elif isTyparTy denv.g ty then FSharpGlyph.Struct - else FSharpGlyph.Typedef + match tryDestAppTy denv.g ty with + | ValueSome tcref -> tcref.TypeReprInfo |> reprToGlyph + | _ -> + if isStructTupleTy denv.g ty then FSharpGlyph.Struct + elif isRefTupleTy denv.g ty then FSharpGlyph.Class + elif isFunction denv.g ty then FSharpGlyph.Delegate + elif isTyparTy denv.g ty then FSharpGlyph.Struct + else FSharpGlyph.Typedef // This may explore assemblies that are not in the reference set, // e.g. for type abbreviations to types not in the reference set. @@ -403,6 +407,7 @@ module internal DescriptionListsImpl = | Item.UnionCase _ | Item.ActivePatternCase _ -> FSharpGlyph.EnumMember | Item.ExnCase _ -> FSharpGlyph.Exception + | Item.AnonRecdField _ -> FSharpGlyph.Field | Item.RecdField _ -> FSharpGlyph.Field | Item.ILField _ -> FSharpGlyph.Field | Item.Event _ -> FSharpGlyph.Event diff --git a/src/fsharp/service/ServiceInterfaceStubGenerator.fs b/src/fsharp/service/ServiceInterfaceStubGenerator.fs index 5d093079f9..90a8ae4d7b 100644 --- a/src/fsharp/service/ServiceInterfaceStubGenerator.fs +++ b/src/fsharp/service/ServiceInterfaceStubGenerator.fs @@ -151,8 +151,8 @@ type internal InterfaceData = None | SynType.Anon _ -> Some "_" - | SynType.Tuple(ts, _) -> - Some (ts |> Seq.choose (snd >> (|TypeIdent|_|)) |> String.concat " * ") + | SynType.AnonRecd (_, ts, _) -> + Some (ts |> Seq.choose (snd >> (|TypeIdent|_|)) |> String.concat "; ") | SynType.Array(dimension, TypeIdent typeName, _) -> Some (sprintf "%s [%s]" typeName (new String(',', dimension-1))) | SynType.MeasurePower(TypeIdent typeName, RationalConst power, _) -> @@ -761,7 +761,7 @@ module internal InterfaceStubGenerator = | SynExpr.Typed(synExpr, _synType, _range) -> walkExpr synExpr - | SynExpr.Tuple(synExprList, _, _range) + | SynExpr.Tuple(_, synExprList, _, _range) | SynExpr.ArrayOrList(_, synExprList, _range) -> List.tryPick walkExpr synExprList @@ -802,7 +802,7 @@ module internal InterfaceStubGenerator = | SynExpr.MatchLambda(_isExnMatch, _argm, synMatchClauseList, _spBind, _wholem) -> synMatchClauseList |> List.tryPick (fun (Clause(_, _, e, _, _)) -> walkExpr e) - | SynExpr.Match(_sequencePointInfoForBinding, synExpr, synMatchClauseList, _, _range) -> + | SynExpr.Match(_sequencePointInfoForBinding, synExpr, synMatchClauseList, _range) -> walkExpr synExpr |> Option.orElse (synMatchClauseList |> List.tryPick (fun (Clause(_, _, e, _, _)) -> walkExpr e)) diff --git a/src/fsharp/service/ServiceLexing.fs b/src/fsharp/service/ServiceLexing.fs index 343fc20317..5eda7cb31d 100755 --- a/src/fsharp/service/ServiceLexing.fs +++ b/src/fsharp/service/ServiceLexing.fs @@ -242,16 +242,16 @@ module internal TokenClassifications = | RPAREN | RPAREN_COMING_SOON | RPAREN_IS_HERE -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.ParamEnd ||| FSharpTokenTriggerClass.MatchBraces) - | LBRACK_LESS | LBRACE_LESS + | LBRACK_LESS -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None ) - | LQUOTE _ | LBRACK | LBRACE | LBRACK_BAR + | LQUOTE _ | LBRACK | LBRACE | LBRACK_BAR | LBRACE_BAR -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.MatchBraces ) - | GREATER_RBRACE | GREATER_RBRACK | GREATER_BAR_RBRACK + | GREATER_RBRACK | GREATER_BAR_RBRACK -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None ) - | RQUOTE _ | RBRACK | RBRACE | RBRACE_COMING_SOON | RBRACE_IS_HERE | BAR_RBRACK + | RQUOTE _ | RBRACK | RBRACE | RBRACE_COMING_SOON | RBRACE_IS_HERE | BAR_RBRACK | BAR_RBRACE -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.MatchBraces ) | PUBLIC | PRIVATE | INTERNAL | BASE | GLOBAL @@ -307,7 +307,14 @@ module internal TestExpose = //---------------------------------------------------------------------------- // Lexer states encoded to/from integers //-------------------------------------------------------------------------- -type FSharpTokenizerLexState = int64 +[] +type FSharpTokenizerLexState = + { PosBits: int64 + OtherBits: int64 } + static member Initial = { PosBits = 0L; OtherBits = 0L } + member this.Equals (other: FSharpTokenizerLexState) = (this.PosBits = other.PosBits) && (this.OtherBits = other.OtherBits) + override this.Equals (obj: obj) = match obj with :? FSharpTokenizerLexState as other -> this.Equals(other) | _ -> false + override this.GetHashCode () = hash this.PosBits + hash this.OtherBits type FSharpTokenizerColorState = | Token = 1 @@ -323,7 +330,6 @@ type FSharpTokenizerColorState = | EndLineThenToken = 12 | TripleQuoteString = 13 | TripleQuoteStringInComment = 14 - | InitialState = 0 @@ -348,38 +354,38 @@ module internal LexerStateEncoding = // Note that this will discard all lexcont state, including the ifdefStack. let revertToDefaultLexCont = LexCont.Token [] - let resize32 (i:int32) : FSharpTokenizerLexState = int64 i - let lexstateNumBits = 4 - let ncommentsNumBits = 2 - let startPosNumBits = pos.EncodingSize + let ncommentsNumBits = 4 let hardwhiteNumBits = 1 - let ifdefstackCountNumBits = 4 - let ifdefstackNumBits = 16 // 0 means if, 1 means else + let ifdefstackCountNumBits = 8 + let ifdefstackNumBits = 24 // 0 means if, 1 means else let _ = assert (lexstateNumBits + ncommentsNumBits - + startPosNumBits + hardwhiteNumBits + ifdefstackCountNumBits + ifdefstackNumBits <= 64) let lexstateStart = 0 let ncommentsStart = lexstateNumBits - let startPosStart = lexstateNumBits+ncommentsNumBits - let hardwhitePosStart = lexstateNumBits+ncommentsNumBits+startPosNumBits - let ifdefstackCountStart = lexstateNumBits+ncommentsNumBits+startPosNumBits+hardwhiteNumBits - let ifdefstackStart = lexstateNumBits+ncommentsNumBits+startPosNumBits+hardwhiteNumBits+ifdefstackCountNumBits + let hardwhitePosStart = lexstateNumBits+ncommentsNumBits + let ifdefstackCountStart = lexstateNumBits+ncommentsNumBits+hardwhiteNumBits + let ifdefstackStart = lexstateNumBits+ncommentsNumBits+hardwhiteNumBits+ifdefstackCountNumBits let lexstateMask = Bits.mask64 lexstateStart lexstateNumBits let ncommentsMask = Bits.mask64 ncommentsStart ncommentsNumBits - let startPosMask = Bits.mask64 startPosStart startPosNumBits let hardwhitePosMask = Bits.mask64 hardwhitePosStart hardwhiteNumBits let ifdefstackCountMask = Bits.mask64 ifdefstackCountStart ifdefstackCountNumBits let ifdefstackMask = Bits.mask64 ifdefstackStart ifdefstackNumBits let bitOfBool b = if b then 1 else 0 let boolOfBit n = (n = 1L) - + + let inline colorStateOfLexState (state: FSharpTokenizerLexState) = + enum (int32 ((state.OtherBits &&& lexstateMask) >>> lexstateStart)) + + let inline lexStateOfColorState (state: FSharpTokenizerColorState) = + (int64 state <<< lexstateStart) &&& lexstateMask + let encodeLexCont (colorState:FSharpTokenizerColorState) ncomments (b:pos) ifdefStack light = let mutable ifdefStackCount = 0 let mutable ifdefStackBits = 0 @@ -390,43 +396,46 @@ module internal LexerStateEncoding = ifdefStackBits <- (ifdefStackBits ||| (1 <<< ifdefStackCount)) ifdefStackCount <- ifdefStackCount + 1 - let lexstate = int64 colorState - ((lexstate <<< lexstateStart) &&& lexstateMask) - ||| ((ncomments <<< ncommentsStart) &&& ncommentsMask) - ||| ((resize32 b.Encoding <<< startPosStart) &&& startPosMask) - ||| ((resize32 (bitOfBool light) <<< hardwhitePosStart) &&& hardwhitePosMask) - ||| ((resize32 ifdefStackCount <<< ifdefstackCountStart) &&& ifdefstackCountMask) - ||| ((resize32 ifdefStackBits <<< ifdefstackStart) &&& ifdefstackMask) + let bits = + lexStateOfColorState colorState + ||| ((ncomments <<< ncommentsStart) &&& ncommentsMask) + ||| ((int64 (bitOfBool light) <<< hardwhitePosStart) &&& hardwhitePosMask) + ||| ((int64 ifdefStackCount <<< ifdefstackCountStart) &&& ifdefstackCountMask) + ||| ((int64 ifdefStackBits <<< ifdefstackStart) &&& ifdefstackMask) + { PosBits = b.Encoding + OtherBits = bits } + let decodeLexCont (state:FSharpTokenizerLexState) = let mutable ifDefs = [] - let ifdefStackCount = (int32) ((state &&& ifdefstackCountMask) >>> ifdefstackCountStart) + let bits = state.OtherBits + let ifdefStackCount = (int32) ((bits &&& ifdefstackCountMask) >>> ifdefstackCountStart) if ifdefStackCount>0 then - let ifdefStack = (int32) ((state &&& ifdefstackMask) >>> ifdefstackStart) + let ifdefStack = (int32) ((bits &&& ifdefstackMask) >>> ifdefstackStart) for i in 1..ifdefStackCount do let bit = ifdefStackCount-i let mask = 1 <<< bit let ifDef = (if ifdefStack &&& mask = 0 then IfDefIf else IfDefElse) ifDefs<-(ifDef,range0)::ifDefs - enum (int32 ((state &&& lexstateMask) >>> lexstateStart)), - (int32) ((state &&& ncommentsMask) >>> ncommentsStart), - pos.Decode (int32 ((state &&& startPosMask) >>> startPosStart)), + colorStateOfLexState state, + int32 ((bits &&& ncommentsMask) >>> ncommentsStart), + pos.Decode state.PosBits, ifDefs, - boolOfBit ((state &&& hardwhitePosMask) >>> hardwhitePosStart) + boolOfBit ((bits &&& hardwhitePosMask) >>> hardwhitePosStart) let encodeLexInt lightSyntaxStatus (lexcont:LexerWhitespaceContinuation) = let tag,n1,p1,ifd = match lexcont with | LexCont.Token ifd -> FSharpTokenizerColorState.Token, 0L, pos0, ifd - | LexCont.IfDefSkip (ifd,n,m) -> FSharpTokenizerColorState.IfDefSkip, resize32 n, m.Start, ifd - | LexCont.EndLine(LexerEndlineContinuation.Skip(ifd,n,m)) -> FSharpTokenizerColorState.EndLineThenSkip, resize32 n, m.Start, ifd + | LexCont.IfDefSkip (ifd,n,m) -> FSharpTokenizerColorState.IfDefSkip, int64 n, m.Start, ifd + | LexCont.EndLine(LexerEndlineContinuation.Skip(ifd,n,m)) -> FSharpTokenizerColorState.EndLineThenSkip, int64 n, m.Start, ifd | LexCont.EndLine(LexerEndlineContinuation.Token(ifd)) -> FSharpTokenizerColorState.EndLineThenToken, 0L, pos0, ifd | LexCont.String (ifd,m) -> FSharpTokenizerColorState.String, 0L, m.Start, ifd - | LexCont.Comment (ifd,n,m) -> FSharpTokenizerColorState.Comment, resize32 n, m.Start, ifd - | LexCont.SingleLineComment (ifd,n,m) -> FSharpTokenizerColorState.SingleLineComment, resize32 n, m.Start, ifd - | LexCont.StringInComment (ifd,n,m) -> FSharpTokenizerColorState.StringInComment, resize32 n, m.Start, ifd - | LexCont.VerbatimStringInComment (ifd,n,m) -> FSharpTokenizerColorState.VerbatimStringInComment, resize32 n, m.Start, ifd - | LexCont.TripleQuoteStringInComment (ifd,n,m) -> FSharpTokenizerColorState.TripleQuoteStringInComment,resize32 n, m.Start, ifd + | LexCont.Comment (ifd,n,m) -> FSharpTokenizerColorState.Comment, int64 n, m.Start, ifd + | LexCont.SingleLineComment (ifd,n,m) -> FSharpTokenizerColorState.SingleLineComment, int64 n, m.Start, ifd + | LexCont.StringInComment (ifd,n,m) -> FSharpTokenizerColorState.StringInComment, int64 n, m.Start, ifd + | LexCont.VerbatimStringInComment (ifd,n,m) -> FSharpTokenizerColorState.VerbatimStringInComment, int64 n, m.Start, ifd + | LexCont.TripleQuoteStringInComment (ifd,n,m) -> FSharpTokenizerColorState.TripleQuoteStringInComment,int64 n, m.Start, ifd | LexCont.MLOnly (ifd,m) -> FSharpTokenizerColorState.CamlOnly, 0L, m.Start, ifd | LexCont.VerbatimString (ifd,m) -> FSharpTokenizerColorState.VerbatimString, 0L, m.Start, ifd | LexCont.TripleQuoteString (ifd,m) -> FSharpTokenizerColorState.TripleQuoteString, 0L, m.Start, ifd @@ -571,7 +580,7 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, | None -> lexbuf.EndPos <- Internal.Utilities.Text.Lexing.Position.Empty | Some(value) -> resetLexbufPos value lexbuf - member x.ScanToken(lexintInitial) : Option * FSharpTokenizerLexState = + member x.ScanToken(lexintInitial) : FSharpTokenInfo option * FSharpTokenizerLexState = use unwindBP = PushThreadBuildPhaseUntilUnwind BuildPhase.Parse use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> DiscardErrorsLogger) @@ -740,19 +749,14 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, tokenDataOption, lexintFinal - static member ColorStateOfLexState (lexState: FSharpTokenizerLexState) = - let tag,_ncomments,_position,_ifdefStack,_lightSyntaxStatusInital = LexerStateEncoding.decodeLexCont lexState - tag + static member ColorStateOfLexState(lexState: FSharpTokenizerLexState) = + LexerStateEncoding.colorStateOfLexState lexState - static member LexStateOfColorState (colorState: FSharpTokenizerColorState) = - let ncomments = 0L - let position = pos0 - let ifdefStack = [] - let light = true - LexerStateEncoding.encodeLexCont colorState ncomments position ifdefStack light + static member LexStateOfColorState(colorState: FSharpTokenizerColorState) = + { PosBits = 0L; OtherBits = LexerStateEncoding.lexStateOfColorState colorState } [] -type FSharpSourceTokenizer(defineConstants : string list, filename : Option) = +type FSharpSourceTokenizer(defineConstants : string list, filename : string option) = let lexResourceManager = new Lexhelp.LexResourceManager() let lexArgsLightOn = mkLexargs(filename,defineConstants,LightSyntaxStatus(true,false),lexResourceManager, ref [],DiscardErrorsLogger) diff --git a/src/fsharp/service/ServiceLexing.fsi b/src/fsharp/service/ServiceLexing.fsi index 1501f45415..d354e452e1 100755 --- a/src/fsharp/service/ServiceLexing.fsi +++ b/src/fsharp/service/ServiceLexing.fsi @@ -8,7 +8,12 @@ type Position = int * int type Range = Position * Position /// Represents encoded information for the end-of-line continuation of lexing -type FSharpTokenizerLexState = int64 +[] +type FSharpTokenizerLexState = + { PosBits: int64 + OtherBits: int64 } + static member Initial : FSharpTokenizerLexState + member Equals : FSharpTokenizerLexState -> bool /// Represents stable information for the state of the laxing engine at the end of a line type FSharpTokenizerColorState = @@ -27,7 +32,6 @@ type FSharpTokenizerColorState = | TripleQuoteStringInComment = 14 | InitialState = 0 - /// Gives an indicattion of the color class to assign to the token an IDE type FSharpTokenColorKind = | Default = 0 @@ -193,21 +197,28 @@ module FSharpTokenTag = type FSharpTokenInfo = { /// Left column of the token. LeftColumn:int + /// Right column of the token. RightColumn:int + ColorClass:FSharpTokenColorKind + /// Gives an indication of the class to assign to the token an IDE CharClass:FSharpTokenCharKind + /// Actions taken when the token is typed FSharpTokenTriggerClass:FSharpTokenTriggerClass + /// The tag is an integer identifier for the token Tag:int + /// Provides additional information about the token TokenName:string; + /// The full length consumed by this match, including delayed tokens (which can be ignored in naive lexers) FullMatchedLength: int } -/// Object to tokenize a line of F# source code, starting with the given lexState. The lexState should be 0 for +/// Object to tokenize a line of F# source code, starting with the given lexState. The lexState should be FSharpTokenizerLexState.Initial for /// the first line of text. Returns an array of ranges of the text and two enumerations categorizing the /// tokens and characters covered by that range, i.e. FSharpTokenColorKind and FSharpTokenCharKind. The enumerations /// are somewhat adhoc but useful enough to give good colorization options to the user in an IDE. @@ -221,7 +232,6 @@ type FSharpLineTokenizer = static member ColorStateOfLexState : FSharpTokenizerLexState -> FSharpTokenizerColorState static member LexStateOfColorState : FSharpTokenizerColorState -> FSharpTokenizerLexState - /// Tokenizer for a source file. Holds some expensive-to-compute resources at the scope of the file. [] type FSharpSourceTokenizer = @@ -229,7 +239,6 @@ type FSharpSourceTokenizer = member CreateLineTokenizer : lineText:string -> FSharpLineTokenizer member CreateBufferTokenizer : bufferFiller:(char[] * int * int -> int) -> FSharpLineTokenizer - module internal TestExpose = val TokenInfo : Parser.token -> (FSharpTokenColorKind * FSharpTokenCharKind * FSharpTokenTriggerClass) diff --git a/src/fsharp/service/ServiceNavigation.fs b/src/fsharp/service/ServiceNavigation.fs index 24d83f532b..e0e1feb1b3 100755 --- a/src/fsharp/service/ServiceNavigation.fs +++ b/src/fsharp/service/ServiceNavigation.fs @@ -270,7 +270,7 @@ module NavigationImpl = let items = // Show base name for this module only if it's not the root one let singleTopLevel = (modules.Length = 1) - modules |> List.collect (fun (SynModuleOrNamespace(id, _isRec, isModule, decls, _, _, access, m)) -> + modules |> List.collect (fun (SynModuleOrNamespace(id, _isRec, kind, decls, _, _, access, m)) -> let baseName = if (not singleTopLevel) then textOfLid id else "" // Find let bindings (for the right dropdown) let nested = processNestedDeclarations(decls) @@ -283,7 +283,7 @@ module NavigationImpl = | _ -> let decl = FSharpNavigationDeclarationItem.Create - (textOfLid id, (if isModule then ModuleFileDecl else NamespaceDecl), + (textOfLid id, (if kind.IsModule then ModuleFileDecl else NamespaceDecl), FSharpGlyph.Module, m, unionRangesChecked (rangeOfDecls nested) (moduleRange (rangeOfLid id) other), singleTopLevel, FSharpEnclosingEntityKind.Module, false, access), (addItemName(textOfLid id)), nested @@ -410,7 +410,7 @@ module NavigationImpl = let items = // Show base name for this module only if it's not the root one let singleTopLevel = (modules.Length = 1) - modules |> List.collect (fun (SynModuleOrNamespaceSig(id, _isRec, isModule, decls, _, _, access, m)) -> + modules |> List.collect (fun (SynModuleOrNamespaceSig(id, _isRec, kind, decls, _, _, access, m)) -> let baseName = if (not singleTopLevel) then textOfLid id else "" // Find let bindings (for the right dropdown) let nested = processNestedSigDeclarations(decls) @@ -420,7 +420,7 @@ module NavigationImpl = // Create explicitly - it can be 'single top level' thing that is hidden let decl = FSharpNavigationDeclarationItem.Create - (textOfLid id, (if isModule then ModuleFileDecl else NamespaceDecl), + (textOfLid id, (if kind.IsModule then ModuleFileDecl else NamespaceDecl), FSharpGlyph.Module, m, unionRangesChecked (rangeOfDecls nested) (moduleRange (rangeOfLid id) other), singleTopLevel, FSharpEnclosingEntityKind.Module, false, access), (addItemName(textOfLid id)), nested @@ -574,7 +574,8 @@ module NavigateTo = for item in moduleOrNamespaceList do walkSynModuleOrNamespaceSig item { Type = ContainerType.File; Name = fileName } - and walkSynModuleOrNamespaceSig (SynModuleOrNamespaceSig(lid, _, isModule, decls, _, _, _, _)) container = + and walkSynModuleOrNamespaceSig (SynModuleOrNamespaceSig(lid, _, kind, decls, _, _, _, _)) container = + let isModule = kind.IsModule if isModule then addModule lid true container let container = @@ -631,7 +632,8 @@ module NavigateTo = for item in moduleOrNamespaceList do walkSynModuleOrNamespace item container - and walkSynModuleOrNamespace(SynModuleOrNamespace(lid, _, isModule, decls, _, _, _, _)) container = + and walkSynModuleOrNamespace(SynModuleOrNamespace(lid, _, kind, decls, _, _, _, _)) container = + let isModule = kind.IsModule if isModule then addModule lid false container let container = diff --git a/src/fsharp/service/ServiceParamInfoLocations.fs b/src/fsharp/service/ServiceParamInfoLocations.fs index 23681498fb..e0e9affd2d 100755 --- a/src/fsharp/service/ServiceParamInfoLocations.fs +++ b/src/fsharp/service/ServiceParamInfoLocations.fs @@ -96,7 +96,7 @@ module internal NoteworthyParamInfoLocationsImpl = // see bug 345385. let rec searchSynArgExpr traverseSynExpr pos expr = match expr with - | SynExprParen((SynExpr.Tuple(synExprList, commaRanges, _tupleRange) as synExpr), _lpRange, rpRangeOpt, parenRange) -> // tuple argument + | SynExprParen((SynExpr.Tuple(false, synExprList, commaRanges, _tupleRange) as synExpr), _lpRange, rpRangeOpt, parenRange) -> // tuple argument let inner = traverseSynExpr synExpr match inner with | None -> @@ -108,7 +108,7 @@ module internal NoteworthyParamInfoLocationsImpl = NotFound, None | _ -> NotFound, None - | SynExprParen(SynExprParen(SynExpr.Tuple(_, _, _), _, _, _) as synExpr, _, rpRangeOpt, parenRange) -> // f((x, y)) is special, single tuple arg + | SynExprParen(SynExprParen(SynExpr.Tuple(false, _, _, _), _, _, _) as synExpr, _, rpRangeOpt, parenRange) -> // f((x, y)) is special, single tuple arg handleSingleArg traverseSynExpr (pos, synExpr, parenRange, rpRangeOpt) // dig into multiple parens diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index 7f94652a18..14e08c9b2d 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -49,48 +49,63 @@ module public AstTraversal = /// traverseSynExpr(subExpr) to recurse deeper on some particular sub-expression based on your own logic /// path helps to track AST nodes that were passed during traversal abstract VisitExpr : TraversePath * (SynExpr -> 'T option) * (SynExpr -> 'T option) * SynExpr -> 'T option + /// VisitTypeAbbrev(ty,m), defaults to ignoring this leaf of the AST abstract VisitTypeAbbrev : SynType * range -> 'T option default this.VisitTypeAbbrev(_ty,_m) = None + /// VisitImplicitInherit(defaultTraverse,ty,expr,m), defaults to just visiting expr abstract VisitImplicitInherit : (SynExpr -> 'T option) * SynType * SynExpr * range -> 'T option default this.VisitImplicitInherit(defaultTraverse, _ty, expr, _m) = defaultTraverse expr + /// VisitModuleDecl allows overriding module declaration behavior abstract VisitModuleDecl : (SynModuleDecl -> 'T option) * SynModuleDecl -> 'T option default this.VisitModuleDecl(defaultTraverse, decl) = defaultTraverse decl + /// VisitBinding allows overriding binding behavior (note: by default it would defaultTraverse expression) abstract VisitBinding : (SynBinding -> 'T option) * SynBinding -> 'T option default this.VisitBinding(defaultTraverse, binding) = defaultTraverse binding + /// VisitMatchClause allows overriding clause behavior (note: by default it would defaultTraverse expression) abstract VisitMatchClause : (SynMatchClause -> 'T option) * SynMatchClause -> 'T option default this.VisitMatchClause(defaultTraverse, mc) = defaultTraverse mc + /// VisitInheritSynMemberDefn allows overriding inherit behavior (by default do nothing) abstract VisitInheritSynMemberDefn : SynComponentInfo * SynTypeDefnKind * SynType * SynMemberDefns * range -> 'T option default this.VisitInheritSynMemberDefn(_componentInfo, _typeDefnKind, _synType, _members, _range) = None + /// VisitInterfaceSynMemberDefnType allows overriding behavior for visiting interface member in types (by default - do nothing) abstract VisitInterfaceSynMemberDefnType : SynType -> 'T option default this.VisitInterfaceSynMemberDefnType(_synType) = None + /// VisitRecordField allows overriding behavior when visiting l.h.s. of constructed record instances abstract VisitRecordField : TraversePath * SynExpr option * LongIdentWithDots option -> 'T option default this.VisitRecordField (_path, _copyOpt, _recordField) = None + /// VisitHashDirective allows overriding behavior when visiting hash directives in FSX scripts, like #r, #load and #I. abstract VisitHashDirective : range -> 'T option default this.VisitHashDirective (_) = None + /// VisitModuleOrNamespace allows overriding behavior when visiting module or namespaces abstract VisitModuleOrNamespace : SynModuleOrNamespace -> 'T option default this.VisitModuleOrNamespace (_) = None + /// VisitComponentInfo allows overriding behavior when visiting type component infos abstract VisitComponentInfo : SynComponentInfo -> 'T option default this.VisitComponentInfo (_) = None + /// VisitLetOrUse allows overriding behavior when visiting module or local let or use bindings abstract VisitLetOrUse : TraversePath * (SynBinding -> 'T option) * SynBinding list * range -> 'T option default this.VisitLetOrUse (_, _, _, _) = None + /// VisitType allows overriding behavior when visiting simple pats abstract VisitSimplePats : SynSimplePat list -> 'T option default this.VisitSimplePats (_) = None + /// VisitPat allows overriding behavior when visiting patterns abstract VisitPat : (SynPat -> 'T option) * SynPat -> 'T option default this.VisitPat (defaultTraverse, pat) = defaultTraverse pat + /// VisitType allows overriding behavior when visiting type hints (x: ..., etc.) abstract VisitType : (SynType -> 'T option) * SynType -> 'T option default this.VisitType (defaultTraverse, ty) = defaultTraverse ty @@ -191,9 +206,25 @@ module public AstTraversal = |> pick expr | SynExpr.Const(_synConst, _range) -> None | SynExpr.Typed(synExpr, synType, _range) -> [ traverseSynExpr synExpr; traverseSynType synType ] |> List.tryPick id - | SynExpr.Tuple(synExprList, _, _range) - | SynExpr.StructTuple(synExprList, _, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr + | SynExpr.Tuple(_, synExprList, _, _range) | SynExpr.ArrayOrList(_, synExprList, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr + + | SynExpr.AnonRecd(_isStruct, copyOpt, synExprList, _range) -> + [ match copyOpt with + | Some(expr, (withRange, _)) -> + yield dive expr expr.Range traverseSynExpr + yield dive () withRange (fun () -> + if posGeq pos withRange.End then + // special case: caret is after WITH + // { x with $ } + visitor.VisitRecordField (path, Some expr, None) + else + None + ) + | _ -> () + for (_,x) in synExprList do + yield dive x x.Range traverseSynExpr + ] |> pick expr | SynExpr.Record(inheritOpt,copyOpt,fields, _range) -> [ let diveIntoSeparator offsideColumn scPosOpt copyOpt = @@ -346,7 +377,7 @@ module public AstTraversal = synMatchClauseList |> List.map (fun x -> dive x x.Range (traverseSynMatchClause path)) |> pick expr - | SynExpr.Match(_sequencePointInfoForBinding, synExpr, synMatchClauseList, _, _range) -> + | SynExpr.Match(_sequencePointInfoForBinding, synExpr, synMatchClauseList, _range) -> [yield dive synExpr synExpr.Range traverseSynExpr yield! synMatchClauseList |> List.map (fun x -> dive x x.RangeOfGuardAndRhs (traverseSynMatchClause path))] |> pick expr @@ -425,9 +456,12 @@ module public AstTraversal = dive synExpr2 synExpr2.Range traverseSynExpr dive synExpr3 synExpr3.Range traverseSynExpr] |> pick expr - | SynExpr.TypeTest(synExpr, _synType, _range) -> traverseSynExpr synExpr - | SynExpr.Upcast(synExpr, _synType, _range) -> traverseSynExpr synExpr - | SynExpr.Downcast(synExpr, _synType, _range) -> traverseSynExpr synExpr + | SynExpr.TypeTest(synExpr, synType, _range) + | SynExpr.Upcast(synExpr, synType, _range) + | SynExpr.Downcast(synExpr, synType, _range) -> + [dive synExpr synExpr.Range traverseSynExpr + dive synType synType.Range traverseSynType] + |> pick expr | SynExpr.InferredUpcast(synExpr, _range) -> traverseSynExpr synExpr | SynExpr.InferredDowncast(synExpr, _range) -> traverseSynExpr synExpr | SynExpr.Null(_range) -> None @@ -441,7 +475,7 @@ module public AstTraversal = dive synExpr synExpr.Range traverseSynExpr dive synExpr2 synExpr2.Range traverseSynExpr] |> pick expr - | SynExpr.MatchBang(_sequencePointInfoForBinding, synExpr, synMatchClauseList, _, _range) -> + | SynExpr.MatchBang(_sequencePointInfoForBinding, synExpr, synMatchClauseList, _range) -> [yield dive synExpr synExpr.Range traverseSynExpr yield! synMatchClauseList |> List.map (fun x -> dive x x.RangeOfGuardAndRhs (traverseSynMatchClause path))] |> pick expr @@ -462,8 +496,7 @@ module public AstTraversal = | SynPat.Paren (p, _) -> traversePat p | SynPat.Or (p1, p2, _) -> [ p1; p2] |> List.tryPick traversePat | SynPat.Ands (ps, _) - | SynPat.Tuple (ps, _) - | SynPat.StructTuple (ps, _) + | SynPat.Tuple (_, ps, _) | SynPat.ArrayOrList (_, ps, _) -> ps |> List.tryPick traversePat | SynPat.Attrib (p, _, _) -> traversePat p | SynPat.LongIdent(_, _, _, args, _, _) -> @@ -492,8 +525,7 @@ module public AstTraversal = | SynType.Array (_, ty, _) -> traverseSynType ty | SynType.StaticConstantNamed (ty1, ty2, _) | SynType.MeasureDivide (ty1, ty2, _) -> [ty1; ty2] |> List.tryPick traverseSynType - | SynType.Tuple (tys, _) - | SynType.StructTuple (tys, _) -> tys |> List.map snd |> List.tryPick traverseSynType + | SynType.Tuple (_, tys, _) -> tys |> List.map snd |> List.tryPick traverseSynType | SynType.StaticConstantExpr (expr, _) -> traverseSynExpr [] expr | SynType.Anon _ -> None | _ -> None diff --git a/src/fsharp/service/ServiceStructure.fs b/src/fsharp/service/ServiceStructure.fs index c86358c8f5..a89afd44c5 100644 --- a/src/fsharp/service/ServiceStructure.fs +++ b/src/fsharp/service/ServiceStructure.fs @@ -2,7 +2,6 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices -open System.Collections.Generic open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler @@ -103,6 +102,7 @@ module Structure = | For | While | Match + | MatchBang | MatchLambda | MatchClause | Lambda @@ -151,6 +151,7 @@ module Structure = | For -> "For" | While -> "While" | Match -> "Match" + | MatchBang -> "MatchBang" | MatchLambda -> "MatchLambda" | MatchClause -> "MatchClause" | Lambda -> "Lambda" @@ -259,7 +260,8 @@ module Structure = | SynExpr.LetOrUse (_,_,bindings, body, _) -> parseBindings bindings parseExpr body - | SynExpr.Match (seqPointAtBinding,_expr,clauses,_,r) -> + | SynExpr.Match (seqPointAtBinding,_expr,clauses,r) + | SynExpr.MatchBang (seqPointAtBinding, _expr, clauses, r) -> match seqPointAtBinding with | SequencePointAtBinding sr -> let collapse = Range.endToEnd sr r @@ -376,8 +378,7 @@ module Structure = // subtract columns so the @@> or @> is not collapsed rcheck Scope.Quote Collapse.Same r (Range.modBoth (if isRaw then 3 else 2) (if isRaw then 3 else 2) r) parseExpr e - | SynExpr.Tuple (es,_,r) - | SynExpr.StructTuple(es,_,r) -> + | SynExpr.Tuple (_, es, _, r) -> rcheck Scope.Tuple Collapse.Same r r List.iter parseExpr es | SynExpr.Paren (e,_,_,_) -> @@ -609,14 +610,14 @@ module Structure = parseAttributes attrs | _ -> () - let parseModuleOrNamespace isScript (SynModuleOrNamespace (longId,_,isModule,decls,_,attribs,_,r)) = + let parseModuleOrNamespace (SynModuleOrNamespace (longId,_,kind,decls,_,attribs,_,r)) = parseAttributes attribs let idRange = longIdentRange longId let fullrange = Range.startToEnd idRange r let collapse = Range.endToEnd idRange r // do not return range for top level implicit module in scripts - if isModule && not isScript then + if kind = NamedModule then rcheck Scope.Module Collapse.Below fullrange collapse collectHashDirectives decls @@ -832,14 +833,14 @@ module Structure = List.iter parseModuleSigDeclaration decls | _ -> () - let parseModuleOrNamespaceSigs (SynModuleOrNamespaceSig(longId,_,isModule,decls,_,attribs,_,r)) = + let parseModuleOrNamespaceSigs (SynModuleOrNamespaceSig(longId,_,kind,decls,_,attribs,_,r)) = parseAttributes attribs let rangeEnd = lastModuleSigDeclRangeElse r decls let idrange = longIdentRange longId let fullrange = Range.startToEnd idrange rangeEnd let collapse = Range.endToEnd idrange rangeEnd - if isModule then + if kind.IsModule then rcheck Scope.Module Collapse.Below fullrange collapse collectSigHashDirectives decls @@ -847,11 +848,11 @@ module Structure = List.iter parseModuleSigDeclaration decls match parsedInput with - | ParsedInput.ImplFile (ParsedImplFileInput (modules = modules; isScript = isScript)) -> - modules |> List.iter (parseModuleOrNamespace isScript) + | ParsedInput.ImplFile (ParsedImplFileInput (modules = modules)) -> + modules |> List.iter parseModuleOrNamespace getCommentRanges sourceLines | ParsedInput.SigFile (ParsedSigFileInput (modules = moduleSigs)) -> List.iter parseModuleOrNamespaceSigs moduleSigs getCommentRanges sourceLines - acc :> seq<_> \ No newline at end of file + acc :> seq<_> diff --git a/src/fsharp/service/ServiceStructure.fsi b/src/fsharp/service/ServiceStructure.fsi index 96d5796e9b..a7a054a411 100644 --- a/src/fsharp/service/ServiceStructure.fsi +++ b/src/fsharp/service/ServiceStructure.fsi @@ -3,8 +3,6 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.FSharp.Compiler.Ast -open System.Collections.Generic -open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Range module public Structure = @@ -42,6 +40,7 @@ module public Structure = | For | While | Match + | MatchBang | MatchLambda | MatchClause | Lambda diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index 18cb8023de..62c8892331 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -219,15 +219,20 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op yield! walkExpr false e2 | SynExpr.ArrayOrList (_,es,_) - | SynExpr.Tuple (es,_,_) - | SynExpr.StructTuple (es,_,_) -> + | SynExpr.Tuple (_,es,_,_) -> yield! walkExprs es | SynExpr.Record (_,copyExprOpt,fs,_) -> match copyExprOpt with | Some (e,_) -> yield! walkExpr true e | None -> () - yield! walkExprs (List.map (fun (_, v, _) -> v) fs |> List.choose id) + yield! walkExprs (fs |> List.choose p23) + + | SynExpr.AnonRecd (_isStruct, copyExprOpt, fs, _) -> + match copyExprOpt with + | Some (e,_) -> yield! walkExpr true e + | None -> () + yield! walkExprs (fs |> List.map snd) | SynExpr.ObjExpr (_,args,bs,is,_,_) -> match args with @@ -265,7 +270,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op | SynExpr.Lambda (_,_,_,e,_) -> yield! walkExpr true e - | SynExpr.Match (spBind,e,cl,_,_) -> + | SynExpr.Match (spBind,e,cl,_) -> yield! walkBindSeqPt spBind yield! walkExpr false e for (Clause(_,whenExpr,e,_,_)) in cl do @@ -317,7 +322,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op yield! walkExpr true e1 yield! walkExpr true e2 - | SynExpr.MatchBang (spBind,e,cl,_,_) -> + | SynExpr.MatchBang (spBind,e,cl,_) -> yield! walkBindSeqPt spBind yield! walkExpr false e for (Clause(_,whenExpr,e,_,_)) in cl do @@ -758,7 +763,7 @@ module UntypedParseImpl = List.tryPick walkTyparDecl typars |> Option.orElse (List.tryPick walkTypeConstraint constraints))) |> Option.orElse (List.tryPick walkPat pats) - | SynPat.Tuple(pats, _) -> List.tryPick walkPat pats + | SynPat.Tuple(_,pats, _) -> List.tryPick walkPat pats | SynPat.Paren(pat, _) -> walkPat pat | SynPat.ArrayOrList(_, pats, _) -> List.tryPick walkPat pats | SynPat.IsInst(t, _) -> walkType t @@ -791,7 +796,7 @@ module UntypedParseImpl = | SynType.App(ty, _, types, _, _, _, _) -> walkType ty |> Option.orElse (List.tryPick walkType types) | SynType.LongIdentApp(_, _, _, types, _, _, _) -> List.tryPick walkType types - | SynType.Tuple(ts, _) -> ts |> List.tryPick (fun (_, t) -> walkType t) + | SynType.Tuple(_,ts, _) -> ts |> List.tryPick (fun (_, t) -> walkType t) | SynType.Array(_, t, _) -> walkType t | SynType.Fun(t1, t2, _) -> walkType t1 |> Option.orElse (walkType t2) | SynType.WithGlobalConstraints(t, _, _) -> walkType t @@ -819,7 +824,7 @@ module UntypedParseImpl = | SynExpr.Paren (e, _, _, _) -> walkExprWithKind parentKind e | SynExpr.Quote(_, _, e, _, _) -> walkExprWithKind parentKind e | SynExpr.Typed(e, _, _) -> walkExprWithKind parentKind e - | SynExpr.Tuple(es, _, _) -> List.tryPick (walkExprWithKind parentKind) es + | SynExpr.Tuple(_, es, _, _) -> List.tryPick (walkExprWithKind parentKind) es | SynExpr.ArrayOrList(_, es, _) -> List.tryPick (walkExprWithKind parentKind) es | SynExpr.Record(_, _, fields, r) -> ifPosInRange r (fun _ -> @@ -837,7 +842,7 @@ module UntypedParseImpl = | SynExpr.Lambda(_, _, _, e, _) -> walkExprWithKind parentKind e | SynExpr.MatchLambda(_, _, synMatchClauseList, _, _) -> List.tryPick walkClause synMatchClauseList - | SynExpr.Match(_, e, synMatchClauseList, _, _) -> + | SynExpr.Match(_, e, synMatchClauseList, _) -> walkExprWithKind parentKind e |> Option.orElse (List.tryPick walkClause synMatchClauseList) | SynExpr.Do(e, _) -> walkExprWithKind parentKind e | SynExpr.Assert(e, _) -> walkExprWithKind parentKind e @@ -869,7 +874,8 @@ module UntypedParseImpl = | SynExpr.JoinIn(e1, _, e2, _) -> List.tryPick (walkExprWithKind parentKind) [e1; e2] | SynExpr.YieldOrReturn(_, e, _) -> walkExprWithKind parentKind e | SynExpr.YieldOrReturnFrom(_, e, _) -> walkExprWithKind parentKind e - | (SynExpr.Match(_, e, synMatchClauseList, _, _) | SynExpr.MatchBang(_, e, synMatchClauseList, _, _)) -> + | SynExpr.Match(_, e, synMatchClauseList, _) + | SynExpr.MatchBang(_, e, synMatchClauseList, _) -> walkExprWithKind parentKind e |> Option.orElse (List.tryPick walkClause synMatchClauseList) | SynExpr.LetOrUseBang(_, _, _, _, e1, e2, _) -> List.tryPick (walkExprWithKind parentKind) [e1; e2] | SynExpr.DoBang(e, _) -> walkExprWithKind parentKind e @@ -1092,7 +1098,7 @@ module UntypedParseImpl = let findSetters argList = match argList with - | SynExpr.Paren(SynExpr.Tuple(parameters, _, _), _, _, _) -> + | SynExpr.Paren(SynExpr.Tuple(false, parameters, _, _), _, _, _) -> let setters = HashSet() for p in parameters do match p with @@ -1153,7 +1159,7 @@ module UntypedParseImpl = match path with | TS.Expr(SynExpr.Paren _)::TS.Expr(NewObjectOrMethodCall(args))::_ -> if Option.isSome precedingArgument then None else Some args - | TS.Expr(SynExpr.Tuple (elements, commas, _))::TS.Expr(SynExpr.Paren _)::TS.Expr(NewObjectOrMethodCall(args))::_ -> + | TS.Expr(SynExpr.Tuple (false, elements, commas, _))::TS.Expr(SynExpr.Paren _)::TS.Expr(NewObjectOrMethodCall(args))::_ -> match precedingArgument with | None -> Some args | Some e -> @@ -1258,7 +1264,7 @@ module UntypedParseImpl = match pat with | SynPat.Paren(pat, _) -> match pat with - | SynPat.Tuple(pats, _) -> + | SynPat.Tuple(_, pats, _) -> pats |> List.tryPick visitParam | _ -> visitParam pat | SynPat.Wild(range) when rangeContainsPos range pos -> diff --git a/src/fsharp/service/ServiceXmlDocParser.fs b/src/fsharp/service/ServiceXmlDocParser.fs index 92535f0cec..0cfd5ec6b7 100644 --- a/src/fsharp/service/ServiceXmlDocParser.fs +++ b/src/fsharp/service/ServiceXmlDocParser.fs @@ -22,8 +22,7 @@ module XmlDocParsing = | SynPat.Attrib(pat,_attrs,_range) -> digNamesFrom pat | SynPat.LongIdent(_lid,_idOpt,_typDeclsOpt,ConstructorPats pats,_access,_range) -> pats |> List.collect digNamesFrom - | SynPat.Tuple(pats,_range) - | SynPat.StructTuple(pats,_range) -> pats |> List.collect digNamesFrom + | SynPat.Tuple(_,pats,_range) -> pats |> List.collect digNamesFrom | SynPat.Paren(pat,_range) -> digNamesFrom pat | SynPat.OptionalVal (id, _) -> [id.idText] | SynPat.Or _ // no one uses ors in fun decls diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index 5ecc71684c..7fbc49c1f3 100755 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -568,7 +568,7 @@ type TypeCheckInfo p <- p - 1 if p >= 0 then Some p else None - let CompletionItem (ty: TyconRef option) (assemblySymbol: AssemblySymbol option) (item: ItemWithInst) = + let CompletionItem (ty: ValueOption) (assemblySymbol: ValueOption) (item: ItemWithInst) = let kind = match item.Item with | Item.MethodGroup (_, minfo :: _, _) -> CompletionItemKind.Method minfo.IsExtensionMember @@ -584,10 +584,10 @@ type TypeCheckInfo MinorPriority = 0 Kind = kind IsOwnMember = false - Type = ty - Unresolved = assemblySymbol |> Option.map (fun x -> x.UnresolvedSymbol) } + Type = match ty with ValueSome x -> Some x | _ -> None + Unresolved = match assemblySymbol with ValueSome x -> Some x.UnresolvedSymbol | _ -> None } - let DefaultCompletionItem item = CompletionItem None None item + let DefaultCompletionItem item = CompletionItem ValueNone ValueNone item let getItem (x: ItemWithInst) = x.Item let GetDeclaredItems (parseResultsOpt: FSharpParseFileResults option, lineStr: string, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, @@ -635,29 +635,27 @@ type TypeCheckInfo let pos = mkPos line loc let (nenv, ad), m = GetBestEnvForPos pos - let getType() = - let tref = - match NameResolution.TryToResolveLongIdentAsType ncenv nenv m plid with - | Some x -> Some x - | None -> - match lastDotPos |> Option.orElseWith (fun _ -> FindFirstNonWhitespacePosition lineStr (colAtEndOfNamesAndResidue - 1)) with - | Some p when lineStr.[p] = '.' -> - match FindFirstNonWhitespacePosition lineStr (p - 1) with - | Some colAtEndOfNames -> - let colAtEndOfNames = colAtEndOfNames + 1 // convert 0-based to 1-based - let tyconRef = TryGetTypeFromNameResolution(line, colAtEndOfNames, residueOpt, resolveOverloads) - tyconRef - | None -> None - | _ -> None - - tref |> Option.bind (tryDestAppTy g) + let getType() = + match NameResolution.TryToResolveLongIdentAsType ncenv nenv m plid with + | Some x -> tryDestAppTy g x + | None -> + match lastDotPos |> Option.orElseWith (fun _ -> FindFirstNonWhitespacePosition lineStr (colAtEndOfNamesAndResidue - 1)) with + | Some p when lineStr.[p] = '.' -> + match FindFirstNonWhitespacePosition lineStr (p - 1) with + | Some colAtEndOfNames -> + let colAtEndOfNames = colAtEndOfNames + 1 // convert 0-based to 1-based + match TryGetTypeFromNameResolution(line, colAtEndOfNames, residueOpt, resolveOverloads) with + | Some x -> tryDestAppTy g x + | _ -> ValueNone + | None -> ValueNone + | _ -> ValueNone match nameResItems with | NameResResult.TypecheckStaleAndTextChanged -> None // second-chance intellisense will try again | NameResResult.Cancel(denv,m) -> Some([], denv, m) | NameResResult.Members(FilterRelevantItems getItem exactMatchResidueOpt (items, denv, m)) -> // lookup based on name resolution results successful - Some (items |> List.map (CompletionItem (getType()) None), denv, m) + Some (items |> List.map (CompletionItem (getType()) ValueNone), denv, m) | _ -> match origLongIdentOpt with | None -> None @@ -690,9 +688,9 @@ type TypeCheckInfo // These come through as an empty plid and residue "". Otherwise we try an environment lookup // and then return to the qualItems. This is because the expression typings are a little inaccurate, primarily because // it appears we're getting some typings recorded for non-atomic expressions like "f x" - when (match plid with [] -> true | _ -> false) -> + when isNil plid -> // lookup based on expression typings successful - Some (items |> List.map (CompletionItem (tryDestAppTy g ty) None), denv, m) + Some (items |> List.map (CompletionItem (tryDestAppTy g ty) ValueNone), denv, m) | GetPreciseCompletionListFromExprTypingsResult.NoneBecauseThereWereTypeErrors, _ -> // There was an error, e.g. we have "." and there is an error determining the type of // In this case, we don't want any of the fallback logic, rather, we want to produce zero results. @@ -700,7 +698,7 @@ type TypeCheckInfo | GetPreciseCompletionListFromExprTypingsResult.NoneBecauseTypecheckIsStaleAndTextChanged, _ -> // we want to report no result and let second-chance intellisense kick in None - | _, true when (match plid with [] -> true | _ -> false) -> + | _, true when isNil plid -> // If the user just pressed '.' after an _expression_ (not a plid), it is never right to show environment-lookup top-level completions. // The user might by typing quickly, and the LS didn't have an expression type right before the dot yet. // Second-chance intellisense will bring up the correct list in a moment. @@ -715,19 +713,19 @@ type TypeCheckInfo // First, use unfiltered name resolution items, if they're not empty | NameResResult.Members(items, denv, m), _, _ when not (isNil items) -> // lookup based on name resolution results successful - Some(items |> List.map (CompletionItem (getType()) None), denv, m) + ValueSome(items |> List.map (CompletionItem (getType()) ValueNone), denv, m) // If we have nonempty items from environment that were resolved from a type, then use them... // (that's better than the next case - here we'd return 'int' as a type) | _, FilterRelevantItems getItem exactMatchResidueOpt (items, denv, m), _ when not (isNil items) -> // lookup based on name and environment successful - Some(items |> List.map (CompletionItem (getType()) None), denv, m) + ValueSome(items |> List.map (CompletionItem (getType()) ValueNone), denv, m) // Try again with the qualItems | _, _, GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems getItem exactMatchResidueOpt (items, denv, m), ty) -> - Some(items |> List.map (CompletionItem (tryDestAppTy g ty) None), denv, m) + ValueSome(items |> List.map (CompletionItem (tryDestAppTy g ty) ValueNone), denv, m) - | _ -> None + | _ -> ValueNone let globalResult = match origLongIdentOpt with @@ -745,16 +743,16 @@ type TypeCheckInfo match globalItems, denv, m with | FilterRelevantItems getItem exactMatchResidueOpt (globalItemsFiltered, denv, m) when not (isNil globalItemsFiltered) -> globalItemsFiltered - |> List.map(fun globalItem -> CompletionItem (getType()) (Some globalItem) (ItemWithNoInst globalItem.Symbol.Item)) - |> fun r -> Some(r, denv, m) - | _ -> None - | _ -> None // do not return unresolved items after dot + |> List.map(fun globalItem -> CompletionItem (getType()) (ValueSome globalItem) (ItemWithNoInst globalItem.Symbol.Item)) + |> fun r -> ValueSome(r, denv, m) + | _ -> ValueNone + | _ -> ValueNone // do not return unresolved items after dot match envResult, globalResult with - | Some (items, denv, m), Some (gItems,_,_) -> Some (items @ gItems, denv, m) - | Some x, None -> Some x - | None, Some y -> Some y - | None, None -> None + | ValueSome (items, denv, m), ValueSome (gItems,_,_) -> Some (items @ gItems, denv, m) + | ValueSome x, ValueNone -> Some x + | ValueNone, ValueSome y -> Some y + | ValueNone, ValueNone -> None let toCompletionItems (items: ItemWithInst list, denv: DisplayEnv, m: range ) = @@ -1161,22 +1159,22 @@ type TypeCheckInfo match item.Item with | Item.CtorGroup (_, (ILMeth (_,ilinfo,_)) :: _) -> match ilinfo.MetadataScope with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let typeVarNames = getTypeVarNames ilinfo ParamTypeSymbol.tryOfILTypes typeVarNames ilinfo.ILMethodRef.ArgTypes |> Option.map (fun args -> let externalSym = ExternalSymbol.Constructor (ilinfo.ILMethodRef.DeclaringTypeRef.FullName, args) - FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.MethodGroup (name, (ILMeth (_,ilinfo,_)) :: _, _) -> match ilinfo.MetadataScope with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let typeVarNames = getTypeVarNames ilinfo ParamTypeSymbol.tryOfILTypes typeVarNames ilinfo.ILMethodRef.ArgTypes |> Option.map (fun args -> let externalSym = ExternalSymbol.Method (ilinfo.ILMethodRef.DeclaringTypeRef.FullName, name, args, ilinfo.ILMethodRef.GenericArity) - FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.Property (name, ILProp propInfo :: _) -> @@ -1188,24 +1186,24 @@ type TypeCheckInfo match methInfo with | Some methInfo -> match methInfo.MetadataScope with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let externalSym = ExternalSymbol.Property (methInfo.ILMethodRef.DeclaringTypeRef.FullName, name) - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | None -> None | Item.ILField (ILFieldInfo (typeInfo, fieldDef)) when not typeInfo.TyconRefOfRawMetadata.IsLocalRef -> match typeInfo.ILScopeRef with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let externalSym = ExternalSymbol.Field (typeInfo.ILTypeRef.FullName, fieldDef.Name) - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.Event (ILEvent (ILEventInfo (typeInfo, eventDef))) when not typeInfo.TyconRefOfRawMetadata.IsLocalRef -> match typeInfo.ILScopeRef with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let externalSym = ExternalSymbol.Event (typeInfo.ILTypeRef.FullName, eventDef.Name) - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.ImplicitOp(_, {contents = Some(TraitConstraintSln.FSMethSln(_, _vref, _))}) -> @@ -1216,9 +1214,9 @@ type TypeCheckInfo | Item.Types (_, [ AppTy g (tr, _) ]) when not tr.IsLocalRef -> match tr.TypeReprInfo, tr.PublicPath with - | TILObjectRepr(TILObjectReprData (ILScopeRef.Assembly assref, _, _)), Some (PubPath parts) -> + | TILObjectRepr(TILObjectReprData (ILScopeRef.Assembly assemblyRef, _, _)), Some (PubPath parts) -> let fullName = parts |> String.concat "." - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, ExternalSymbol.Type fullName)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, ExternalSymbol.Type fullName)) | _ -> None | _ -> None match result with @@ -1324,13 +1322,23 @@ type TypeCheckInfo let underlyingTy = stripTyEqnsAndMeasureEqns g ty isStructTy g underlyingTy + let isValRefMutable (vref: ValRef) = + // Mutable values, ref cells, and non-inref byrefs are mutable. + vref.IsMutable + || Tastops.isRefCellTy g vref.Type + || (Tastops.isByrefTy g vref.Type && not (Tastops.isInByrefTy g vref.Type)) + + let isRecdFieldMutable (rfinfo: RecdFieldInfo) = + (rfinfo.RecdField.IsMutable && rfinfo.LiteralValue.IsNone) + || Tastops.isRefCellTy g rfinfo.RecdField.FormalType + resolutions |> Seq.choose (fun cnr -> match cnr with // 'seq' in 'seq { ... }' gets colored as keywords | CNR(_, (Item.Value vref), ItemOccurence.Use, _, _, _, m) when valRefEq g g.seq_vref vref -> Some (m, SemanticClassificationType.ComputationExpression) - | CNR(_, (Item.Value vref), _, _, _, _, m) when vref.IsMutable || Tastops.isRefCellTy g vref.Type -> + | CNR(_, (Item.Value vref), _, _, _, _, m) when isValRefMutable vref -> Some (m, SemanticClassificationType.MutableVar) | CNR(_, Item.Value KeywordIntrinsicValue, ItemOccurence.Use, _, _, _, m) -> Some (m, SemanticClassificationType.IntrinsicFunction) @@ -1343,7 +1351,7 @@ type TypeCheckInfo Some (m, SemanticClassificationType.Operator) else Some (m, SemanticClassificationType.Function) - | CNR(_, Item.RecdField rfinfo, _, _, _, _, m) when rfinfo.RecdField.IsMutable && rfinfo.LiteralValue.IsNone -> + | CNR(_, Item.RecdField rfinfo, _, _, _, _, m) when isRecdFieldMutable rfinfo -> Some (m, SemanticClassificationType.MutableVar) | CNR(_, Item.RecdField rfinfo, _, _, _, _, m) when isFunction g rfinfo.FieldType -> Some (m, SemanticClassificationType.Function) @@ -1599,7 +1607,7 @@ module internal Parser = let isExe = options.IsExe try Some (ParseInput(lexfun, errHandler.ErrorLogger, lexbuf, None, fileName, (isLastCompiland, isExe))) with e -> - errHandler.ErrorLogger.ErrorR(e) + errHandler.ErrorLogger.StopProcessingRecovery e Range.range0 // don't re-raise any exceptions, we must return None. None) errHandler.CollectedDiagnostics, parseResult, errHandler.AnyErrors @@ -1616,6 +1624,7 @@ module internal Parser = tcGlobals: TcGlobals, tcImports: TcImports, tcState: TcState, + moduleNamesDict: ModuleNamesDict, loadClosure: LoadClosure option, // These are the errors and warnings seen by the background compiler for the entire antecedent backgroundDiagnostics: (PhasedDiagnostic * FSharpErrorSeverity)[], @@ -1719,6 +1728,9 @@ module internal Parser = async { try let checkForErrors() = (parseResults.ParseHadErrors || errHandler.ErrorCount > 0) + + let parsedMainInput, _moduleNamesDict = DeduplicateParsedInputModuleName moduleNamesDict parsedMainInput + // Typecheck is potentially a long running operation. We chop it up here with an Eventually continuation and, at each slice, give a chance // for the client to claim the result as obsolete and have the typecheck abort. @@ -1905,7 +1917,8 @@ type FSharpCheckProjectResults(projectFileName:string, tcConfigOption, keepAssem let cenv = SymbolEnv(tcGlobals, thisCcu, Some ccuSig, tcImports) [| for r in tcSymbolUses do - for symbolUse in r.AllUsesOfSymbols do + for symbolUseChunk in r.AllUsesOfSymbols do + for symbolUse in symbolUseChunk do if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.Item) yield FSharpSymbolUse(tcGlobals, symbolUse.DisplayEnv, symbol, symbolUse.ItemOccurence, symbolUse.Range) |] @@ -2099,7 +2112,8 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp (fun () -> [| |]) (fun scope -> let cenv = scope.SymbolEnv - [| for symbolUse in scope.ScopeSymbolUses.AllUsesOfSymbols do + [| for symbolUseChunk in scope.ScopeSymbolUses.AllUsesOfSymbols do + for symbolUse in symbolUseChunk do if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.Item) yield FSharpSymbolUse(scope.TcGlobals, symbolUse.DisplayEnv, symbol, symbolUse.ItemOccurence, symbolUse.Range) |]) @@ -2597,7 +2611,7 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC let loadClosure = scriptClosureCacheLock.AcquireLock (fun ltok -> scriptClosureCache.TryGet (ltok, options)) let! tcErrors, tcFileResult = Parser.CheckOneFile(parseResults, source, fileName, options.ProjectFileName, tcPrior.TcConfig, tcPrior.TcGlobals, tcPrior.TcImports, - tcPrior.TcState, loadClosure, tcPrior.TcErrors, reactorOps, (fun () -> builder.IsAlive), textSnapshotInfo, userOpName) + tcPrior.TcState, tcPrior.ModuleNamesDict, loadClosure, tcPrior.TcErrors, reactorOps, (fun () -> builder.IsAlive), textSnapshotInfo, userOpName) let parsingOptions = FSharpParsingOptions.FromTcConfig(tcPrior.TcConfig, Array.ofList builder.SourceFiles, options.UseScriptResolutionRules) let checkAnswer = MakeCheckFileAnswer(fileName, tcFileResult, options, builder, Array.ofList tcPrior.TcDependencyFiles, creationErrors, parseResults.Errors, tcErrors) bc.RecordTypeCheckFileInProjectResults(fileName, options, parsingOptions, parseResults, fileVersion, tcPrior.TimeStamp, Some checkAnswer, source) @@ -2678,9 +2692,7 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC | _ -> Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "CheckFileInProject.CacheMiss", filename) let! tcPrior = execWithReactorAsync <| fun ctok -> builder.GetCheckResultsBeforeFileInProject (ctok, filename) - let parseTreeOpt = parseResults.ParseTree |> Option.map builder.DeduplicateParsedInputModuleNameInProject - let parseResultsAterDeDuplication = FSharpParseFileResults(parseResults.Errors, parseTreeOpt, parseResults.ParseHadErrors, parseResults.DependencyFiles) - let! checkAnswer = bc.CheckOneFileImpl(parseResultsAterDeDuplication, source, filename, options, textSnapshotInfo, fileVersion, builder, tcPrior, creationErrors, userOpName) + let! checkAnswer = bc.CheckOneFileImpl(parseResults, source, filename, options, textSnapshotInfo, fileVersion, builder, tcPrior, creationErrors, userOpName) return checkAnswer finally bc.ImplicitlyStartCheckProjectInBackground(options, userOpName) @@ -2723,7 +2735,6 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC // Do the parsing. let parsingOptions = FSharpParsingOptions.FromTcConfig(builder.TcConfig, Array.ofList (builder.SourceFiles), options.UseScriptResolutionRules) let parseErrors, parseTreeOpt, anyErrors = Parser.parseFile (source, filename, parsingOptions, userOpName) - let parseTreeOpt = parseTreeOpt |> Option.map builder.DeduplicateParsedInputModuleNameInProject let parseResults = FSharpParseFileResults(parseErrors, parseTreeOpt, anyErrors, builder.AllDependenciesDeprecated) let! checkResults = bc.CheckOneFileImpl(parseResults, source, filename, options, textSnapshotInfo, fileVersion, builder, tcPrior, creationErrors, userOpName) @@ -3280,23 +3291,23 @@ type FSharpChecker(legacyReferenceResolver, projectCacheSize, keepAssemblyConten member internal __.FrameworkImportsCache = backgroundCompiler.FrameworkImportsCache /// Tokenize a single line, returning token information and a tokenization state represented by an integer - member x.TokenizeLine (line: string, state: int64) : FSharpTokenInfo[] * int64 = + member x.TokenizeLine (line: string, state: FSharpTokenizerLexState) = let tokenizer = FSharpSourceTokenizer([], None) let lineTokenizer = tokenizer.CreateLineTokenizer line - let state = ref (None, state) + let mutable state = (None, state) let tokens = - [| while (state := lineTokenizer.ScanToken (snd !state); (fst !state).IsSome) do - yield (fst !state).Value |] - tokens, snd !state + [| while (state <- lineTokenizer.ScanToken (snd state); (fst state).IsSome) do + yield (fst state).Value |] + tokens, snd state /// Tokenize an entire file, line by line member x.TokenizeFile (source: string) : FSharpTokenInfo[][] = let lines = source.Split('\n') let tokens = - [| let state = ref 0L + [| let mutable state = FSharpTokenizerLexState.Initial for line in lines do - let tokens, n = x.TokenizeLine(line, !state) - state := n + let tokens, n = x.TokenizeLine(line, state) + state <- n yield tokens |] tokens @@ -3323,7 +3334,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, reactorOps: IReactorOperatio CompileOptions.ParseCompilerOptions (ignore, fsiCompilerOptions, [ ]) let loadClosure = LoadClosure.ComputeClosureOfScriptText(ctok, legacyReferenceResolver, defaultFSharpBinariesDir, filename, source, CodeContext.Editing, tcConfig.useSimpleResolution, tcConfig.useFsiAuxLib, new Lexhelp.LexResourceManager(), applyCompilerOptions, assumeDotNetFramework, tryGetMetadataSnapshot=(fun _ -> None), reduceMemoryUsage=reduceMemoryUsage) - let! tcErrors, tcFileResult = Parser.CheckOneFile(parseResults, source, filename, "project", tcConfig, tcGlobals, tcImports, tcState, Some loadClosure, backgroundDiagnostics, reactorOps, (fun () -> true), None, userOpName) + let! tcErrors, tcFileResult = Parser.CheckOneFile(parseResults, source, filename, "project", tcConfig, tcGlobals, tcImports, tcState, Map.empty, Some loadClosure, backgroundDiagnostics, reactorOps, (fun () -> true), None, userOpName) return match tcFileResult with @@ -3333,7 +3344,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, reactorOps: IReactorOperatio let projectResults = FSharpCheckProjectResults (filename, Some tcConfig, keepAssemblyContents, errors, Some(tcGlobals, tcImports, tcFileInfo.ThisCcu, tcFileInfo.CcuSigForFile, - [tcFileInfo.ScopeSymbolUses], None, None, mkSimpleAssRef "stdin", + [tcFileInfo.ScopeSymbolUses], None, None, mkSimpleAssemblyRef "stdin", tcState.TcEnvFromImpls.AccessRights, None, dependencyFiles)) parseResults, typeCheckResults, projectResults | _ -> diff --git a/src/fsharp/service/service.fsi b/src/fsharp/service/service.fsi index 5ccb31e450..2d07c23561 100755 --- a/src/fsharp/service/service.fsi +++ b/src/fsharp/service/service.fsi @@ -711,7 +711,7 @@ type public FSharpChecker = member internal ReferenceResolver : ReferenceResolver.Resolver /// Tokenize a single line, returning token information and a tokenization state represented by an integer - member TokenizeLine: line:string * state:int64 -> FSharpTokenInfo [] * int64 + member TokenizeLine: line:string * state:FSharpTokenizerLexState-> FSharpTokenInfo [] * FSharpTokenizerLexState /// Tokenize an entire file, line by line member TokenizeFile: source:string -> FSharpTokenInfo [] [] diff --git a/src/fsharp/symbols/Exprs.fs b/src/fsharp/symbols/Exprs.fs index f6213ef2ff..4da520daed 100644 --- a/src/fsharp/symbols/Exprs.fs +++ b/src/fsharp/symbols/Exprs.fs @@ -1033,7 +1033,7 @@ module FSharpExprConvert = // 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) ] let rty = - match ImportReturnTypeFromMetaData cenv.amap m ilMethRef.ReturnType scoref tinst1 tinst2 with + match ImportReturnTypeFromMetadata cenv.amap m ilMethRef.ReturnType emptyILCustomAttrs scoref tinst1 tinst2 with | None -> if isCtor then enclosingType else cenv.g.unit_ty | Some ty -> ty @@ -1223,7 +1223,7 @@ and FSharpImplementationFileDeclaration = | InitAction of FSharpExpr and FSharpImplementationFileContents(cenv, mimpl) = - let (TImplFile(qname, _pragmas, ModuleOrNamespaceExprWithSig(_, mdef, _), hasExplicitEntryPoint, isScript)) = mimpl + let (TImplFile(qname, _pragmas, ModuleOrNamespaceExprWithSig(_, mdef, _), hasExplicitEntryPoint, isScript, _anonRecdTypes)) = mimpl let rec getDecls2 (ModuleOrNamespaceExprWithSig(_mty, def, _m)) = getDecls def and getBind (bind: Binding) = let v = bind.Var diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 2a3031e004..f4fb7c0238 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -361,11 +361,12 @@ module internal SymbolHelpers = | Item.UnionCase(ucinfo, _) -> Some (rangeOfUnionCaseInfo preferFlag ucinfo) | Item.ActivePatternCase apref -> Some (rangeOfValRef preferFlag apref.ActivePatternVal) | Item.ExnCase tcref -> Some tcref.Range + | Item.AnonRecdField (_,_,_,m) -> Some m | Item.RecdField rfinfo -> Some (rangeOfRecdFieldInfo preferFlag rfinfo) | Item.Event einfo -> rangeOfEventInfo preferFlag einfo | Item.ILField _ -> None | Item.Property(_, pinfos) -> rangeOfPropInfo preferFlag pinfos.Head - | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTy >> Option.map (rangeOfEntityRef preferFlag)) + | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTyOption >> Option.map (rangeOfEntityRef preferFlag)) | Item.CustomOperation (_, _, Some minfo) -> rangeOfMethInfo g preferFlag minfo | Item.TypeVar (_, tp) -> Some tp.Range | Item.ModuleOrNamespaces(modrefs) -> modrefs |> List.tryPick (rangeOfEntityRef preferFlag >> Some) @@ -379,7 +380,7 @@ module internal SymbolHelpers = | Item.ImplicitOp _ -> None | Item.UnqualifiedType tcrefs -> tcrefs |> List.tryPick (rangeOfEntityRef preferFlag >> Some) | Item.DelegateCtor ty - | Item.FakeInterfaceCtor ty -> ty |> tryNiceEntityRefOfTy |> Option.map (rangeOfEntityRef preferFlag) + | Item.FakeInterfaceCtor 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. @@ -419,7 +420,7 @@ module internal SymbolHelpers = | Item.CtorGroup(_, minfos) -> minfos |> List.tryPick (ccuOfMethInfo g) | Item.CustomOperation (_, _, Some minfo) -> ccuOfMethInfo g minfo - | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTy >> Option.bind computeCcuOfTyconRef) + | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTyOption >> Option.bind computeCcuOfTyconRef) | Item.ArgName (_, _, Some (ArgumentContainer.Type eref)) -> computeCcuOfTyconRef eref @@ -427,6 +428,7 @@ module internal SymbolHelpers = | Item.UnqualifiedType(erefs) -> erefs |> List.tryPick computeCcuOfTyconRef | Item.SetterArg (_, item) -> ccuOfItem g item + | Item.AnonRecdField (info, _, _, _) -> Some info.Assembly | Item.TypeVar _ -> None | _ -> None @@ -713,8 +715,12 @@ module internal SymbolHelpers = // In this case just bail out and assume items are not equal protectAssemblyExploration false (fun () -> let equalHeadTypes(ty1, ty2) = - if isAppTy g ty1 && isAppTy g ty2 then tyconRefEq g (tcrefOfAppTy g ty1) (tcrefOfAppTy g ty2) - else typeEquiv g ty1 ty2 + match tryDestAppTy g ty1 with + | ValueSome tcref1 -> + match tryDestAppTy g ty2 with + | ValueSome tcref2 -> tyconRefEq g tcref1 tcref2 + | _ -> typeEquiv g ty1 ty2 + | _ -> typeEquiv g ty1 ty2 ItemsAreEffectivelyEqual g item1 item2 || @@ -752,6 +758,8 @@ module internal SymbolHelpers = List.zip pi1s pi2s |> List.forall(fun (pi1, pi2) -> PropInfo.PropInfosUseIdenticalDefinitions pi1 pi2) | Item.Event(evt1), Item.Event(evt2) -> EventInfo.EventInfosUseIdenticalDefintions evt1 evt2 + | Item.AnonRecdField(anon1, _, i1, _), Item.AnonRecdField(anon2, _, i2, _) -> + Tastops.anonInfoEquiv anon1 anon2 && i1 = i2 | Item.CtorGroup(_, meths1), Item.CtorGroup(_, meths2) -> List.zip meths1 meths2 |> List.forall (fun (minfo1, minfo2) -> MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2) @@ -768,8 +776,9 @@ module internal SymbolHelpers = protectAssemblyExploration 1027 (fun () -> match item with | ItemWhereTypIsPreferred ty -> - if isAppTy g ty then hash (tcrefOfAppTy g ty).LogicalName - else 1010 + match tryDestAppTy g ty with + | ValueSome tcref -> hash (tcref).LogicalName + | _ -> 1010 | Item.ILField(ILFieldInfo(_, fld)) -> System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode fld // hash on the object identity of the AbstractIL metadata blob for the field | Item.TypeVar (nm, _tp) -> hash nm @@ -784,6 +793,7 @@ module internal SymbolHelpers = | Item.ExnCase(tcref) -> hash tcref.LogicalName | Item.UnionCase(UnionCaseInfo(_, UCRef(tcref, n)), _) -> hash(tcref.Stamp, n) | Item.RecdField(RecdFieldInfo(_, RFRef(tcref, n))) -> hash(tcref.Stamp, n) + | Item.AnonRecdField(anon, _, i, _) -> hash anon.SortedNames.[i] | Item.Event evt -> evt.ComputeHashCode() | Item.Property(_name, pis) -> hash (pis |> List.map (fun pi -> pi.ComputeHashCode())) | Item.UnqualifiedType(tcref :: _) -> hash tcref.LogicalName @@ -864,6 +874,7 @@ module internal SymbolHelpers = | Item.ActivePatternResult(apinfo, _ty, idx, _) -> apinfo.Names.[idx] | Item.ActivePatternCase apref -> FullNameOfItem g (Item.Value apref.ActivePatternVal) + "." + apref.Name | Item.ExnCase ecref -> fullDisplayTextOfExnRef ecref + | Item.AnonRecdField(anon, _argTys, i, _) -> anon.SortedNames.[i] | Item.RecdField rfinfo -> fullDisplayTextOfRecdFieldRef rfinfo.RecdFieldRef | Item.NewDef id -> id.idText | Item.ILField finfo -> bufs (fun os -> NicePrint.outputILTypeRef denv os finfo.ILTypeRef; bprintf os ".%s" finfo.FieldName) @@ -878,7 +889,7 @@ module internal SymbolHelpers = | Item.DelegateCtor ty | Item.Types(_, ty:: _) -> match tryDestAppTy g ty with - | Some tcref -> bufs (fun os -> NicePrint.outputTyconRef denv os tcref) + | ValueSome tcref -> bufs (fun os -> NicePrint.outputTyconRef denv os tcref) | _ -> "" | Item.ModuleOrNamespaces((modref :: _) as modrefs) -> let definiteNamespace = modrefs |> List.forall (fun modref -> modref.IsNamespace) @@ -1180,7 +1191,7 @@ module internal SymbolHelpers = ([], modrefs) ||> Seq.fold (fun st modref -> match fullDisplayTextOfParentOfModRef modref with - | Some(txt) -> txt::st + | ValueSome txt -> txt::st | _ -> st) |> Seq.mapi (fun i x -> i, x) |> Seq.toList @@ -1201,6 +1212,17 @@ module internal SymbolHelpers = else FSharpStructuredToolTipElement.Single (layout, xml) + | Item.AnonRecdField(anon, argTys, i, _) -> + let argTy = argTys.[i] + let nm = anon.SortedNames.[i] + let argTy, _ = PrettyTypes.PrettifyType g argTy + let layout = + wordL (tagText (FSComp.SR.typeInfoAnonRecdField())) ^^ + wordL (tagRecordField nm) ^^ + RightL.colon ^^ + NicePrint.layoutType denv argTy + FSharpStructuredToolTipElement.Single (layout, FSharpXmlDoc.None) + // Named parameters | Item.ArgName (id, argTy, _) -> let argTy, _ = PrettyTypes.PrettifyType g argTy @@ -1320,6 +1342,8 @@ module internal SymbolHelpers = | Item.RecdField rfi -> (rfi.TyconRef |> ticksAndArgCountTextOfTyconRef)+"."+rfi.Name |> Some + | Item.AnonRecdField _ -> None + | Item.ILField finfo -> match finfo with | ILFieldInfo(tinfo, fdef) -> diff --git a/src/fsharp/symbols/SymbolPatterns.fs b/src/fsharp/symbols/SymbolPatterns.fs index 74b9bcf60c..eb12229f7c 100644 --- a/src/fsharp/symbols/SymbolPatterns.fs +++ b/src/fsharp/symbols/SymbolPatterns.fs @@ -186,7 +186,9 @@ module Symbol = let (|RecordField|_|) (e: FSharpSymbol) = match e with | :? FSharpField as field -> - if field.DeclaringEntity.IsFSharpRecord then Some field else None + match field.DeclaringEntity with + | None -> None + | Some e -> if e.IsFSharpRecord then Some field else None | _ -> None let (|ActivePatternCase|_|) (symbol: FSharpSymbol) = diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index fc57dedae9..fa3fcccfc8 100755 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -80,13 +80,13 @@ module Impl = | None -> mkLocalEntityRef entity | Some viewedCcu -> match tryRescopeEntity viewedCcu entity with - | None -> mkLocalEntityRef entity - | Some eref -> eref + | ValueNone -> mkLocalEntityRef entity + | ValueSome eref -> eref let entityIsUnresolved(entity:EntityRef) = match entity with | ERefNonLocal(NonLocalEntityRef(ccu, _)) -> - ccu.IsUnresolvedReference && entity.TryDeref.IsNone + ccu.IsUnresolvedReference && ValueOptionInternal.isNone entity.TryDeref | _ -> false let checkEntityIsResolved(entity:EntityRef) = @@ -245,6 +245,8 @@ type FSharpSymbol(cenv: SymbolEnv, item: (unit -> Item), access: (FSharpSymbol - | Item.RecdField rfinfo -> FSharpField(cenv, RecdOrClass rfinfo.RecdFieldRef) :> _ | Item.ILField finfo -> FSharpField(cenv, ILField finfo) :> _ + + | Item.AnonRecdField (anonInfo, tinst, n, m) -> FSharpField(cenv, AnonField (anonInfo, tinst, n, m)) :> _ | Item.Event einfo -> FSharpMemberOrFunctionOrValue(cenv, E einfo, item) :> _ @@ -475,7 +477,7 @@ and FSharpEntity(cenv: SymbolEnv, entity:EntityRef) = member __.IsByRef = isResolved() && - tyconRefEq cenv.g cenv.g.byref_tcr entity + isByrefTyconRef cenv.g entity member __.IsOpaque = isResolved() && @@ -753,11 +755,12 @@ and FSharpUnionCase(cenv, v: UnionCaseRef) = ) - let isUnresolved() = - entityIsUnresolved v.TyconRef || v.TryUnionCase.IsNone + let isUnresolved() = + entityIsUnresolved v.TyconRef || ValueOptionInternal.isNone v.TryUnionCase + let checkIsResolved() = checkEntityIsResolved v.TyconRef - if v.TryUnionCase.IsNone then + if ValueOptionInternal.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) member __.IsUnresolved = @@ -815,26 +818,43 @@ and FSharpUnionCase(cenv, v: UnionCaseRef) = and FSharpFieldData = + | AnonField of AnonRecdTypeInfo * TTypes * int * range | ILField of ILFieldInfo | RecdOrClass of RecdFieldRef | Union of UnionCaseRef * int member x.TryRecdField = match x with - | RecdOrClass v -> v.RecdField |> Choice1Of2 - | Union (v, n) -> v.FieldByIndex(n) |> Choice1Of2 - | ILField f -> f |> Choice2Of2 + | AnonField (anonInfo, tinst, n, m) -> (anonInfo, tinst, n, m) |> Choice3Of3 + | RecdOrClass v -> v.RecdField |> Choice1Of3 + | Union (v, n) -> v.FieldByIndex(n) |> Choice1Of3 + | ILField f -> f |> Choice2Of3 - member x.DeclaringTyconRef = + member x.TryDeclaringTyconRef = match x with - | RecdOrClass v -> v.TyconRef - | Union (v, _) -> v.TyconRef - | ILField f -> f.DeclaringTyconRef + | AnonField _ -> None + | RecdOrClass v -> Some v.TyconRef + | Union (v, _) -> Some v.TyconRef + | ILField f -> Some f.DeclaringTyconRef + +and FSharpAnonRecordTypeDetails(cenv: SymbolEnv, anonInfo: AnonRecdTypeInfo) = + member __.Assembly = FSharpAssembly (cenv, anonInfo.Assembly) + + /// Names of any enclosing types of the compiled form of the anonymous type (if the anonymous type was defined as a nested type) + member __.EnclosingCompiledTypeNames = anonInfo.ILTypeRef.Enclosing + + /// The name of the compiled form of the anonymous type + member __.CompiledName = anonInfo.ILTypeRef.Name + + /// The sorted labels of the anonymous type + member __.SortedFieldNames = anonInfo.SortedNames and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = inherit FSharpSymbol (cenv, (fun () -> match d with + | AnonField (anonInfo, tinst, n, m) -> + Item.AnonRecdField(anonInfo, tinst, n, m) | RecdOrClass v -> checkEntityIsResolved v.TyconRef Item.RecdField(RecdFieldInfo(generalizeTypars v.TyconRef.TyparsNoRange, v)) @@ -852,20 +872,22 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = ) let isUnresolved() = - entityIsUnresolved d.DeclaringTyconRef || - match d with - | RecdOrClass v -> v.TryRecdField.IsNone - | Union (v, _) -> v.TryUnionCase.IsNone + d.TryDeclaringTyconRef |> Option.exists entityIsUnresolved || + match d with + | AnonField _ -> false + | RecdOrClass v -> ValueOptionInternal.isNone v.TryRecdField + | Union (v, _) -> ValueOptionInternal.isNone v.TryUnionCase | ILField _ -> false let checkIsResolved() = - checkEntityIsResolved d.DeclaringTyconRef + d.TryDeclaringTyconRef |> Option.iter checkEntityIsResolved match d with + | AnonField _ -> () | RecdOrClass v -> - if v.TryRecdField.IsNone then + if ValueOptionInternal.isNone v.TryRecdField then invalidOp (sprintf "The record field '%s' could not be found in the target type" v.FieldName) | Union (v, _) -> - if v.TryUnionCase.IsNone then + if ValueOptionInternal.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) | ILField _ -> () @@ -874,7 +896,7 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = new (cenv, rfref) = FSharpField(cenv, FSharpFieldData.RecdOrClass(rfref)) member __.DeclaringEntity = - FSharpEntity(cenv, d.DeclaringTyconRef) + d.TryDeclaringTyconRef |> Option.map (fun tcref -> FSharpEntity(cenv, tcref)) member __.IsUnresolved = isUnresolved() @@ -882,32 +904,47 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = member __.IsMutable = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsMutable - | Choice2Of2 f -> not f.IsInitOnly && f.LiteralValue.IsNone + | Choice1Of3 r -> r.IsMutable + | Choice2Of3 f -> not f.IsInitOnly && f.LiteralValue.IsNone + | Choice3Of3 _ -> false member __.IsLiteral = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.LiteralValue.IsSome - | Choice2Of2 f -> f.LiteralValue.IsSome + | Choice1Of3 r -> r.LiteralValue.IsSome + | Choice2Of3 f -> f.LiteralValue.IsSome + | Choice3Of3 _ -> false member __.LiteralValue = if isUnresolved() then None else match d.TryRecdField with - | Choice1Of2 r -> getLiteralValue r.LiteralValue - | Choice2Of2 f -> f.LiteralValue |> Option.map AbstractIL.ILRuntimeWriter.convFieldInit + | Choice1Of3 r -> getLiteralValue r.LiteralValue + | Choice2Of3 f -> f.LiteralValue |> Option.map AbstractIL.ILRuntimeWriter.convFieldInit + | Choice3Of3 _ -> None member __.IsVolatile = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsVolatile - | Choice2Of2 _ -> false // F# doesn't actually respect "volatile" from other assemblies in any case + | Choice1Of3 r -> r.IsVolatile + | Choice2Of3 _ -> false // F# doesn't actually respect "volatile" from other assemblies in any case + | Choice3Of3 _ -> false member __.IsDefaultValue = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsZeroInit - | Choice2Of2 _ -> false + | Choice1Of3 r -> r.IsZeroInit + | Choice2Of3 _ -> false + | Choice3Of3 _ -> false + + member __.IsAnonRecordField = + match d with + | AnonField _ -> true + | _ -> false + + member __.AnonRecordFieldDetails = + match d with + | AnonField (anonInfo, types, n, _) -> FSharpAnonRecordTypeDetails(cenv, anonInfo), [| for ty in types -> FSharpType(cenv, ty) |], n + | _ -> invalidOp "not an anonymous record field" member __.XmlDocSig = checkIsResolved() @@ -921,6 +958,7 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = SymbolHelpers.GetXmlDocSigOfUnionCaseInfo unionCase | ILField f -> SymbolHelpers.GetXmlDocSigOfILFieldInfo cenv.infoReader range0 f + | AnonField _ -> None match xmlsig with | Some (_, docsig) -> docsig | _ -> "" @@ -928,68 +966,77 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = member __.XmlDoc = if isUnresolved() then XmlDoc.Empty |> makeXmlDoc else match d.TryRecdField with - | Choice1Of2 r -> r.XmlDoc - | Choice2Of2 _ -> XmlDoc.Empty + | Choice1Of3 r -> r.XmlDoc + | Choice2Of3 _ -> XmlDoc.Empty + | Choice3Of3 _ -> XmlDoc.Empty |> makeXmlDoc member __.FieldType = checkIsResolved() let fty = match d.TryRecdField with - | Choice1Of2 r -> r.FormalType - | Choice2Of2 f -> f.FieldType(cenv.amap, range0) + | Choice1Of3 r -> r.FormalType + | Choice2Of3 f -> f.FieldType(cenv.amap, range0) + | Choice3Of3 (_,tinst,n,_) -> tinst.[n] FSharpType(cenv, fty) member __.IsStatic = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsStatic - | Choice2Of2 f -> f.IsStatic + | Choice1Of3 r -> r.IsStatic + | Choice2Of3 f -> f.IsStatic + | Choice3Of3 _ -> false member __.Name = checkIsResolved() match d.TryRecdField with - | Choice1Of2 r -> r.Name - | Choice2Of2 f -> f.FieldName + | Choice1Of3 r -> r.Name + | Choice2Of3 f -> f.FieldName + | Choice3Of3 (anonInfo, _tinst, n, _) -> anonInfo.SortedNames.[n] member __.IsCompilerGenerated = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsCompilerGenerated - | Choice2Of2 _ -> false + | Choice1Of3 r -> r.IsCompilerGenerated + | Choice2Of3 _ -> false + | Choice3Of3 _ -> false member __.IsNameGenerated = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.rfield_name_generated + | Choice1Of3 r -> r.rfield_name_generated | _ -> false member __.DeclarationLocation = checkIsResolved() match d.TryRecdField with - | Choice1Of2 r -> r.Range - | Choice2Of2 _ -> range0 + | Choice1Of3 r -> r.Range + | Choice2Of3 _ -> range0 + | Choice3Of3 (_anonInfo, _tinst, _n, m) -> m member __.FieldAttributes = if isUnresolved() then makeReadOnlyCollection [] else match d.TryRecdField with - | Choice1Of2 r -> r.FieldAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) - | Choice2Of2 _ -> [] + | Choice1Of3 r -> r.FieldAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) + | Choice2Of3 _ -> [] + | Choice3Of3 _ -> [] |> makeReadOnlyCollection member __.PropertyAttributes = if isUnresolved() then makeReadOnlyCollection [] else match d.TryRecdField with - | Choice1Of2 r -> r.PropertyAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) - | Choice2Of2 _ -> [] + | Choice1Of3 r -> r.PropertyAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) + | Choice2Of3 _ -> [] + | Choice3Of3 _ -> [] |> makeReadOnlyCollection member __.Accessibility: FSharpAccessibility = if isUnresolved() then FSharpAccessibility(taccessPublic) else let access = match d.TryRecdField with - | Choice1Of2 r -> r.Accessibility - | Choice2Of2 _ -> taccessPublic + | Choice1Of3 r -> r.Accessibility + | Choice2Of3 _ -> taccessPublic + | Choice3Of3 _ -> taccessPublic FSharpAccessibility(access) member private x.V = d @@ -1001,6 +1048,7 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = match d, uc.V with | RecdOrClass r1, RecdOrClass r2 -> recdFieldRefOrder.Compare(r1, r2) = 0 | Union (u1, n1), Union (u2, n2) -> cenv.g.unionCaseRefEq u1 u2 && n1 = n2 + | AnonField (anonInfo1, _, _, _) , AnonField (anonInfo2, _, _, _) -> x.Name = uc.Name && anonInfoEquiv anonInfo1 anonInfo2 | _ -> false | _ -> false @@ -1331,7 +1379,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = let isUnresolved() = match fsharpInfo() with | None -> false - | Some v -> v.TryDeref.IsNone + | Some v -> ValueOptionInternal.isNone v.TryDeref let checkIsResolved() = if isUnresolved() then @@ -2032,6 +2080,7 @@ and FSharpType(cenv, ty:TType) = member __.GenericArguments = protect <| fun () -> match stripTyparEqns ty with + | TType_anon (_, tyargs) | TType_app (_, tyargs) | TType_tuple (_, tyargs) -> (tyargs |> List.map (fun ty -> FSharpType(cenv, ty)) |> makeReadOnlyCollection) | TType_fun(d, r) -> [| FSharpType(cenv, d); FSharpType(cenv, r) |] |> makeReadOnlyCollection @@ -2063,6 +2112,19 @@ and FSharpType(cenv, ty:TType) = | TType_fun _ -> true | _ -> false + member __.IsAnonRecordType = + isResolved() && + protect <| fun () -> + match stripTyparEqns ty with + | TType_anon _ -> true + | _ -> false + + member __.AnonRecordTypeDetails = + protect <| fun () -> + match stripTyparEqns ty with + | TType_anon (anonInfo, _) -> FSharpAnonRecordTypeDetails(cenv, anonInfo) + | _ -> invalidOp "not an anonymous record type" + member __.IsGenericParameter = protect <| fun () -> match stripTyparEqns ty with @@ -2117,6 +2179,7 @@ and FSharpType(cenv, ty:TType) = | TType_tuple (_, l1) -> 10400 + List.sumBy hashType l1 | TType_fun (dty, rty) -> 10500 + hashType dty + hashType rty | TType_measure _ -> 10600 + | TType_anon (_,l1) -> 10800 + List.sumBy hashType l1 hashType ty member x.Format(denv: FSharpDisplayContext) = diff --git a/src/fsharp/symbols/Symbols.fsi b/src/fsharp/symbols/Symbols.fsi index 7b7f565fdc..3f3a3f0e0e 100644 --- a/src/fsharp/symbols/Symbols.fsi +++ b/src/fsharp/symbols/Symbols.fsi @@ -401,7 +401,20 @@ and [] public FSharpUnionCase = /// Indicates if the union case is for a type in an unresolved assembly member IsUnresolved : bool +/// A subtype of FSharpSymbol that represents a record or union case field as seen by the F# language +and [] public FSharpAnonRecordTypeDetails = + + /// The assembly where the compiled form of the anonymous type is defined + member Assembly : FSharpAssembly + + /// Names of any enclosing types of the compiled form of the anonymous type (if the anonymous type was defined as a nested type) + member EnclosingCompiledTypeNames : string list + + /// The name of the compiled form of the anonymous type + member CompiledName : string + /// The sorted labels of the anonymous type + member SortedFieldNames : string[] /// A subtype of FSharpSymbol that represents a record or union case field as seen by the F# language and [] public FSharpField = @@ -410,8 +423,14 @@ and [] public FSharpField = internal new : SymbolEnv * RecdFieldRef -> FSharpField internal new : SymbolEnv * UnionCaseRef * int -> FSharpField - /// Get the declaring entity of this field - member DeclaringEntity: FSharpEntity + /// Get the declaring entity of this field, if any. Fields from anonymous types do not have a declaring entity + member DeclaringEntity: FSharpEntity option + + /// Is this a field from an anonymous record type? + member IsAnonRecordField: bool + + /// If the field is from an anonymous record type then get the details of the field including the index in the sorted array of fields + member AnonRecordFieldDetails: FSharpAnonRecordTypeDetails * FSharpType[] * int /// Indicates if the field is declared 'static' member IsMutable: bool @@ -934,6 +953,12 @@ and [] public FSharpType = /// Indicates if the type is a function type. The GenericArguments property returns the domain and range of the function type. member IsFunctionType : bool + /// Indicates if the type is an anonymous record type. The GenericArguments property returns the type instantiation of the anonymous record type + member IsAnonRecordType: bool + + /// Get the details of the anonymous record type. + member AnonRecordTypeDetails: FSharpAnonRecordTypeDetails + /// Indicates if the type is a variable type, whether declared, generalized or an inference type parameter member IsGenericParameter : bool diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 27130dc085..63e7412d90 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -261,7 +261,7 @@ type ValFlags(flags:int64) = (flags &&& ~~~0b0011001100000000000L) /// Represents the kind of a type parameter -[] +[] type TyparKind = | Type @@ -270,13 +270,13 @@ type TyparKind = member x.AttrName = match x with - | TyparKind.Type -> None - | TyparKind.Measure -> Some "Measure" + | TyparKind.Type -> ValueNone + | TyparKind.Measure -> ValueSome "Measure" - [] - member x.DebugText = x.ToString() + //[] + //member x.DebugText = x.ToString() - override x.ToString() = + override x.ToString() = match x with | TyparKind.Type -> "type" | TyparKind.Measure -> "measure" @@ -480,10 +480,11 @@ let KeyTyconByDemangledNameAndArity nm (typars: _ list) x = /// Generic types can be accessed either by 'List' or 'List`1'. This lists both keys. The second form should really be deprecated. let KeyTyconByAccessNames nm x = - if IsMangledGenericName nm then - let dnm = DemangleGenericTypeName nm + match TryDemangleGenericNameAndPos nm with + | ValueSome pos -> + let dnm = DemangleGenericTypeNameWithPos pos nm [| KeyValuePair(nm,x); KeyValuePair(dnm,x) |] - else + | _ -> [| KeyValuePair(nm,x) |] type ModuleOrNamespaceKind = @@ -965,14 +966,14 @@ and /// Represents a type definition, exception definition, module definition or /// Get the union cases and other union-type information for a type, if any member x.UnionTypeInfo = match x.TypeReprInfo with - | TUnionRepr x -> Some x - | _ -> None + | TUnionRepr x -> ValueSome x + | _ -> ValueNone /// Get the union cases for a type, if any member x.UnionCasesArray = match x.UnionTypeInfo with - | Some x -> x.CasesTable.CasesByIndex - | None -> [| |] + | ValueSome x -> x.CasesTable.CasesByIndex + | ValueNone -> [| |] /// Get the union cases for a type, if any, as a list member x.UnionCasesAsList = x.UnionCasesArray |> Array.toList @@ -980,8 +981,8 @@ and /// Represents a type definition, exception definition, module definition or /// Get a union case of a type by name member x.GetUnionCaseByName n = match x.UnionTypeInfo with - | Some x -> NameMap.tryFind n x.CasesTable.CasesByName - | None -> None + | ValueSome x -> NameMap.tryFind n x.CasesTable.CasesByName + | ValueNone -> None /// Create a new entity with empty, unlinked data. Only used during unpickling of F# metadata. @@ -1349,7 +1350,7 @@ and override x.ToString() = "TyconAugmentation(...)" and - [] + [] /// The information for the contents of a type. Also used for a provided namespace. TyconRepresentation = @@ -1393,10 +1394,10 @@ and /// The information for exception definitions should be folded into here. | TNoRepr - [] - member x.DebugText = x.ToString() + //[] + //member x.DebugText = x.ToString() - override x.ToString() = "TyconRepresentation(...)" + override x.ToString() = sprintf "%+A" x and [] @@ -1751,7 +1752,7 @@ and override x.ToString() = x.Name and - [] + [] ExceptionInfo = /// Indicates that an exception is an abbreviation for the given exception | TExnAbbrevRepr of TyconRef @@ -1765,10 +1766,11 @@ and /// Indicates that an exception is abstract, i.e. is in a signature file, and we do not know the representation | TExnNone - [] - member x.DebugText = x.ToString() + // %+A formatting is used, so this is not needed + //[] + //member x.DebugText = x.ToString() - override x.ToString() = "ExceptionInfo(...)" + override x.ToString() = sprintf "%+A" x and [] ModuleOrNamespaceType(kind: ModuleOrNamespaceKind, vals: QueueList, entities: QueueList) = @@ -1899,7 +1901,7 @@ and [] |> List.tryFind (fun v -> match key.TypeForLinkage with | None -> true | Some keyTy -> ccu.MemberSignatureEquality(keyTy,v.Type)) - |> ValueOption.ofOption + |> ValueOptionInternal.ofOption /// Get a table of values indexed by logical name member mtyp.AllValsByLogicalName = @@ -2340,11 +2342,11 @@ and /// Indicates a constraint that a type is .NET unmanaged type | IsUnmanaged of range - // Prefer the default formatting of this union type + // %+A formatting is used, so this is not needed //[] //member x.DebugText = x.ToString() - // - //override x.ToString() = "TyparConstraint(...)" + + override x.ToString() = sprintf "%+A" x /// The specification of a member constraint that must be solved and @@ -2374,7 +2376,7 @@ and override x.ToString() = "TTrait(" + x.MemberName + ")" and - [] + [] /// Indicates the solution of a member constraint during inference. TraitConstraintSln = @@ -2394,6 +2396,9 @@ and /// isSetProp -- indicates if this is a set of a record field | FSRecdFieldSln of TypeInst * RecdFieldRef * bool + /// Indicates a trait is solved by an F# anonymous record field. + | FSAnonRecdFieldSln of AnonRecdTypeInfo * TypeInst * int + /// ILMethSln(ty, extOpt, ilMethodRef, minst) /// /// Indicates a trait is solved by a .NET method. @@ -2411,10 +2416,11 @@ and /// Indicates a trait is solved by a 'fake' instance of an operator, like '+' on integers | BuiltInSln - [] - member x.DebugText = x.ToString() + // %+A formatting is used, so this is not needed + //[] + //member x.DebugText = x.ToString() - override x.ToString() = "TraitConstraintSln(...)" + override x.ToString() = sprintf "%+A" x /// The partial information used to index the methods of all those in a ModuleOrNamespace. and [] @@ -3043,13 +3049,12 @@ and static member TryDerefEntityPath(ccu: CcuThunk, path:string[], i:int, entity:Entity) = if i >= path.Length then ValueSome entity else - let next = entity.ModuleOrNamespaceType.AllEntitiesByCompiledAndLogicalMangledNames.TryFind(path.[i]) - match next with - | Some res -> NonLocalEntityRef.TryDerefEntityPath(ccu, path, (i+1), res) + match entity.ModuleOrNamespaceType.AllEntitiesByCompiledAndLogicalMangledNames.TryGetValue path.[i] with + | true, res -> NonLocalEntityRef.TryDerefEntityPath(ccu, path, (i+1), res) #if !NO_EXTENSIONTYPING - | None -> NonLocalEntityRef.TryDerefEntityPathViaProvidedType(ccu, path, i, entity) + | _ -> NonLocalEntityRef.TryDerefEntityPathViaProvidedType(ccu, path, i, entity) #else - | None -> ValueNone + | _ -> ValueNone #endif #if !NO_EXTENSIONTYPING @@ -3258,7 +3263,7 @@ and ValueSome tcr.binding /// Is the destination assembly available? - member tcr.CanDeref = tcr.TryDeref.IsSome + member tcr.CanDeref = ValueOptionInternal.isSome tcr.TryDeref /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. member x.CompiledRepresentation = x.Deref.CompiledRepresentation @@ -3809,7 +3814,7 @@ and | None -> error(InternalError(sprintf "union case %s not found in type %s" x.CaseName x.TyconRef.LogicalName, x.TyconRef.Range)) /// Try to dereference the reference - member x.TryUnionCase = x.TyconRef.TryDeref |> ValueOption.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOption.ofOption) + member x.TryUnionCase = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOptionInternal.ofOption) /// Get the attributes associated with the union case member x.Attribs = x.UnionCase.Attribs @@ -3868,7 +3873,7 @@ and | None -> error(InternalError(sprintf "field %s not found in type %s" id tcref.LogicalName, tcref.Range)) /// Try to dereference the reference - member x.TryRecdField = x.TyconRef.TryDeref |> ValueOption.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOption.ofOption) + member x.TryRecdField = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOptionInternal.ofOption) /// Get the attributes associated with the compiled property of the record field member x.PropertyAttribs = x.RecdField.PropertyAttribs @@ -3910,6 +3915,11 @@ and /// Indicates the type is built from a named type and a number of type arguments | TType_app of TyconRef * TypeInst + /// TType_anon + /// + /// Indicates the type is an anonymous record type whose compiled representation is located in the given assembly + | TType_anon of AnonRecdTypeInfo * TType list + /// TType_tuple(elementTypes). /// /// Indicates the type is a tuple type. elementTypes must be of length 2 or greater. @@ -3940,6 +3950,7 @@ and | TType_forall (_tps, ty) -> ty.GetAssemblyName() | TType_app (tcref, _tinst) -> tcref.CompilationPath.ILScopeRef.QualifiedName | TType_tuple (_tupInfo, _tinst) -> "" + | TType_anon (anonInfo, _tinst) -> defaultArg anonInfo.Assembly.QualifiedName "" | TType_fun (_d,_r) -> "" | TType_measure _ms -> "" | TType_var tp -> tp.Solution |> function Some sln -> sln.GetAssemblyName() | None -> "" @@ -3958,7 +3969,12 @@ and (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 (d,r) -> "(" + string d + " -> " + string r + ")" | TType_ucase (uc,tinst) -> "ucase " + uc.CaseName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") | TType_var tp -> @@ -3970,7 +3986,50 @@ and and TypeInst = TType list and TTypes = TType list - +and [] AnonRecdTypeInfo = + // Mutability for pickling/unpickling only + { mutable Assembly: CcuThunk + mutable TupInfo: TupInfo + mutable SortedIds: Ident[] + mutable Stamp: Stamp + mutable SortedNames: string[] } + + /// Create an AnonRecdTypeInfo from the basic data + static member Create(ccu: CcuThunk, tupInfo, ids: Ident[]) = + let sortedIds = ids |> Array.sortBy (fun id -> id.idText) + // Hash all the data to form a unique stamp + let stamp = + sha1HashInt64 + [| for c in ccu.AssemblyName do yield byte c; yield byte (int32 c >>> 8); + match tupInfo with + | TupInfo.Const b -> yield (if b then 0uy else 1uy) + for id in sortedIds do + for c in id.idText do yield byte c; yield byte (int32 c >>> 8) |] + let sortedNames = Array.map textOfId sortedIds + { Assembly = ccu; TupInfo = tupInfo; SortedIds = sortedIds; Stamp = stamp; SortedNames = sortedNames } + + /// Get the ILTypeRef for the generated type implied by the anonymous type + member x.ILTypeRef = + let ilTypeName = sprintf "<>f__AnonymousType%s%u`%d'" (match x.TupInfo with TupInfo.Const b -> if b then "1000" else "") (uint32 x.Stamp) x.SortedIds.Length + mkILTyRef(x.Assembly.ILScopeRef,ilTypeName) + + static member NewUnlinked() : AnonRecdTypeInfo = + { Assembly = Unchecked.defaultof<_> + TupInfo = Unchecked.defaultof<_> + SortedIds = Unchecked.defaultof<_> + Stamp = Unchecked.defaultof<_> + SortedNames = Unchecked.defaultof<_> } + + member x.Link d = + let sortedNames = Array.map textOfId d.SortedIds + x.Assembly <- d.Assembly + x.TupInfo <- d.TupInfo + x.SortedIds <- d.SortedIds + x.Stamp <- d.Stamp + x.SortedNames <- sortedNames + + member x.IsLinked = (match x.SortedIds with null -> true | _ -> false) + and [] TupInfo = /// Some constant, e.g. true or false for tupInfo | Const of bool @@ -3996,11 +4055,11 @@ and /// Raising a measure to a rational power | RationalPower of Measure * Rational - // Prefer the default formatting of this union type + // %+A formatting is used, so this is not needed //[] //member x.DebugText = x.ToString() - // - //override x.ToString() = "Measure(...)" + + override x.ToString() = sprintf "%+A" x and [] @@ -4196,9 +4255,10 @@ and /// Try to resolve a path into the CCU by referencing the .NET/CLI type forwarder table of the CCU member ccu.TryForward(nlpath:string[],item:string) : EntityRef option = ccu.EnsureDerefable(nlpath) - match ccu.TypeForwarders.TryFind(nlpath,item) with - | Some entity -> Some(entity.Force()) - | None -> None + let key = nlpath,item + match ccu.TypeForwarders.TryGetValue key with + | true, entity -> Some(entity.Force()) + | _ -> None //printfn "trying to forward %A::%s from ccu '%s', res = '%A'" p n ccu.AssemblyName res.IsSome /// Used to make forward calls into the type/assembly loader when comparing member signatures during linking @@ -4249,7 +4309,7 @@ and and Attribs = Attrib list and - [] + [] AttribKind = /// Indicates an attribute refers to a type defined in an imported .NET assembly @@ -4258,10 +4318,11 @@ and /// Indicates an attribute refers to a type defined in an imported F# assembly | FSAttrib of ValRef - [] - member x.DebugText = x.ToString() + // %+A formatting is used, so this is not needed + //[] + //member x.DebugText = x.ToString() - override x.ToString() = sprintf "AttribKind(...)" + override x.ToString() = sprintf "%+A" x /// Attrib(kind,unnamedArgs,propVal,appliedToAGetterOrSetter,targetsOpt,range) and @@ -4325,10 +4386,11 @@ and [] /// Decision trees. Pattern matching has been compiled down to /// a decision tree by this point. The right-hand-sides (actions) of +/// a decision tree by this point. The right-hand-sides (actions) of /// the decision tree are labelled by integers that are unique for that /// particular tree. and - [] + [] DecisionTree = /// TDSwitch(input, cases, default, range) @@ -4357,10 +4419,11 @@ and /// body -- the rest of the decision tree | TDBind of Binding * DecisionTree - [] - member x.DebugText = x.ToString() + // %+A formatting is used, so this is not needed + //[] + //member x.DebugText = x.ToString() - override x.ToString() = sprintf "DecisionTree(...)" + override x.ToString() = sprintf "%+A" x /// Represents a test and a subsequent decision tree and @@ -4380,7 +4443,7 @@ and override x.ToString() = sprintf "DecisionTreeCase(...)" and - [] + [] DecisionTreeTest = /// Test if the input to a decision tree matches the given union case | UnionCase of UnionCaseRef * TypeInst @@ -4410,10 +4473,11 @@ and /// activePatternInfo -- The extracted info for the active pattern. | ActivePatternCase of Expr * TTypes * (ValRef * TypeInst) option * int * ActivePatternInfo - [] - member x.DebugText = x.ToString() + // %+A formatting is used, so this is not needed + //[] + //member x.DebugText = x.ToString() - override x.ToString() = sprintf "DecisionTreeTest(...)" + override x.ToString() = sprintf "%+A" x /// A target of a decision tree. Can be thought of as a little function, though is compiled as a local block. and @@ -4644,6 +4708,12 @@ and /// An operation representing the creation of a tuple value | Tuple of TupInfo + /// An operation representing the creation of an anonymous record + | AnonRecd of AnonRecdTypeInfo + + /// An operation representing the get of a property from an anonymous record + | AnonRecdGet of AnonRecdTypeInfo * int + /// An operation representing the creation of an array value | Array @@ -4907,7 +4977,7 @@ and /// The contents of a module-or-namespace-fragment definition and - [] + [] ModuleOrNamespaceExpr = /// Indicates the module is a module with a signature | TMAbstract of ModuleOrNamespaceExprWithSig @@ -4924,10 +4994,11 @@ and /// Indicates the module fragment is a 'rec' or 'non-rec' definition of types and modules | TMDefRec of isRec:bool * Tycon list * ModuleOrNamespaceBinding list * range - [] + // %+A formatting is used, so this is not needed + //[] member x.DebugText = x.ToString() - override x.ToString() = "ModuleOrNamespaceExpr(...)" + override x.ToString() = sprintf "%+A" x /// A named module-or-namespace-fragment definition and @@ -4954,7 +5025,7 @@ and and [] TypedImplFile = - | TImplFile of QualifiedNameOfFile * ScopedPragma list * ModuleOrNamespaceExprWithSig * bool * bool + | TImplFile of QualifiedNameOfFile * ScopedPragma list * ModuleOrNamespaceExprWithSig * bool * bool * StampMap [] member x.DebugText = x.ToString() @@ -5128,6 +5199,7 @@ let arityOfVal (v:Val) = (match v.ValReprInfo with None -> ValReprInfo.emptyValD let tupInfoRef = TupInfo.Const false let tupInfoStruct = TupInfo.Const true +let mkTupInfo b = if b then tupInfoStruct else tupInfoRef let structnessDefault = false let mkRawRefTupleTy tys = TType_tuple (tupInfoRef, tys) let mkRawStructTupleTy tys = TType_tuple (tupInfoStruct, tys) @@ -5137,9 +5209,9 @@ let mkRawStructTupleTy tys = TType_tuple (tupInfoStruct, tys) // make up the entire compilation unit //--------------------------------------------------------------------------- -let mapTImplFile f (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)) = TImplFile(fragName, pragmas,f moduleExpr,hasExplicitEntryPoint,isScript) -let mapAccImplFile f z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)) = let moduleExpr,z = f z moduleExpr in TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript), z -let foldTImplFile f z (TImplFile(_,_,moduleExpr,_,_)) = f z moduleExpr +let mapTImplFile f (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = TImplFile(fragName, pragmas,f moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes) +let mapAccImplFile f z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = let moduleExpr,z = f z moduleExpr in TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes), z +let foldTImplFile f z (TImplFile(_,_,moduleExpr,_,_,_)) = f z moduleExpr //--------------------------------------------------------------------------- // Equality relations on locally defined things @@ -5415,7 +5487,7 @@ let fslibValRefEq fslibCcu vref1 vref2 = // is not significant nlr1.ItemKey.PartialKey = nm2.PartialKey && fslibRefEq nlr1.EnclosingEntity.nlr pp2 - | None -> + | _ -> false // Note: I suspect this private-to-private reference comparison is not needed | (VRefLocal e1, VRefLocal e2) -> @@ -5439,9 +5511,9 @@ let primEntityRefEq compilingFslib fslibCcu (x : EntityRef) (y : EntityRef) = // The tcrefs may have forwarders. If they may possibly be equal then resolve them to get their canonical references // and compare those using pointer equality. (not (nonLocalRefDefinitelyNotEq x.nlr y.nlr) && - let v1 = x.TryDeref - let v2 = y.TryDeref - v1.IsSome && v2.IsSome && v1.Value === v2.Value)) then + match x.TryDeref with + | ValueSome v1 -> match y.TryDeref with ValueSome v2 -> v1 === v2 | _ -> false + | _ -> match y.TryDeref with ValueNone -> true | _ -> false)) then true else compilingFslib && fslibEntityRefEq fslibCcu x y @@ -5465,9 +5537,9 @@ let primValRefEq compilingFslib fslibCcu (x : ValRef) (y : ValRef) = else (// Use TryDeref to guard against the platforms/times when certain F# language features aren't available, // e.g. CompactFramework doesn't have support for quotations. - let v1 = x.TryDeref - let v2 = y.TryDeref - v1.IsSome && v2.IsSome && v1.Value === v2.Value) + match x.TryDeref with + | ValueSome v1 -> match y.TryDeref with ValueSome v2 -> v1 === v2 | _ -> false + | _ -> match y.TryDeref with ValueNone -> true | _ -> false) || (if compilingFslib then fslibValRefEq fslibCcu x y else false) //--------------------------------------------------------------------------- @@ -5711,13 +5783,13 @@ let CombineCcuContentFragments m l = let tab2 = mty2.AllEntitiesByLogicalMangledName let entities = [ for e1 in mty1.AllEntities do - match tab2.TryFind e1.LogicalName with - | Some e2 -> yield CombineEntites path e1 e2 - | None -> yield e1 + match tab2.TryGetValue e1.LogicalName with + | true, e2 -> yield CombineEntites path e1 e2 + | _ -> yield e1 for e2 in mty2.AllEntities do - match tab1.TryFind e2.LogicalName with - | Some _ -> () - | None -> yield e2 ] + match tab1.TryGetValue e2.LogicalName with + | true, _ -> () + | _ -> yield e2 ] let vals = QueueList.append mty1.AllValsAndMembers mty2.AllValsAndMembers @@ -5767,3 +5839,4 @@ let FSharpOptimizationDataResourceName2 = "FSharpOptimizationInfo." let FSharpSignatureDataResourceName2 = "FSharpSignatureInfo." + diff --git a/src/ilx/ilxsettings.fs b/src/ilx/ilxsettings.fs index 9033fca069..520da651c1 100755 --- a/src/ilx/ilxsettings.fs +++ b/src/ilx/ilxsettings.fs @@ -22,7 +22,7 @@ let ilxFsharpCoreLibScopeRef () = if !ilxCompilingFSharpCoreLib then ILScopeRef.Local else - let assref = + let assemblyRef = match !ilxFsharpCoreLibAssemRef with | Some o -> o | None -> @@ -34,6 +34,6 @@ let ilxFsharpCoreLibScopeRef () = Some (PublicKeyToken(Bytes.ofInt32Array [| 0xb0; 0x3f; 0x5f; 0x7f; 0x11; 0xd5; 0x0a; 0x3a |])), false, Some (IL.parseILVersion "0.0.0.0"), None) - ILScopeRef.Assembly assref + ILScopeRef.Assembly assemblyRef let ilxNamespace () = "Microsoft.FSharp.Core" \ No newline at end of file diff --git a/src/scripts/fssrgen.fsx b/src/scripts/fssrgen.fsx deleted file mode 100644 index 32c5b4fa58..0000000000 --- a/src/scripts/fssrgen.fsx +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -open System -open System.IO - -let PrintErr(filename, line, msg) = - printfn "%s(%d): error : %s" filename line msg - -let Err(filename, line, msg) = - PrintErr(filename, line, msg) - printfn "Note that the syntax of each line is one of these three alternatives:" - printfn "# comment" - printfn "ident,\"string\"" - printfn "errNum,ident,\"string\"" - failwith (sprintf "there were errors in the file '%s'" filename) - -let xmlBoilerPlateString = @" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - -" - - -type HoleType = string - - -// The kinds of 'holes' we can do -let ComputeHoles filename lineNum (txt:string) : ResizeArray * string = - // takes in a %d%s kind of string, returns array of HoleType and {0}{1} kind of string - let mutable i = 0 - let mutable holeNumber = 0 - let mutable holes = ResizeArray() // order - let sb = new System.Text.StringBuilder() - let AddHole holeType = - sb.Append(sprintf "{%d}" holeNumber) |> ignore - holeNumber <- holeNumber + 1 - holes.Add(holeType) - while i < txt.Length do - if txt.[i] = '%' then - if i+1 = txt.Length then - Err(filename, lineNum, "(at end of string) % must be followed by d, f, s, or %") - else - match txt.[i+1] with - | 'd' -> AddHole "System.Int32" - | 'f' -> AddHole "System.Double" - | 's' -> AddHole "System.String" - | '%' -> sb.Append('%') |> ignore - | c -> Err(filename, lineNum, sprintf "'%%%c' is not a valid sequence, only %%d %%f %%s or %%%%" c) - i <- i + 2 - else - match txt.[i] with - | '{' -> sb.Append "{{" |> ignore - | '}' -> sb.Append "}}" |> ignore - | c -> sb.Append c |> ignore - i <- i + 1 - //printfn "holes.Length = %d, lineNum = %d" holes.Length //lineNum txt - (holes, sb.ToString()) - -let Unquote (s : string) = - if s.StartsWith "\"" && s.EndsWith "\"" then s.Substring(1, s.Length - 2) - else failwith "error message string should be quoted" - -let ParseLine filename lineNum (txt:string) = - let mutable errNum = None - let identB = new System.Text.StringBuilder() - let mutable i = 0 - // parse optional error number - if i < txt.Length && System.Char.IsDigit txt.[i] then - let numB = new System.Text.StringBuilder() - while i < txt.Length && System.Char.IsDigit txt.[i] do - numB.Append txt.[i] |> ignore - i <- i + 1 - errNum <- Some(int (numB.ToString())) - if i = txt.Length || not(txt.[i] = ',') then - Err(filename, lineNum, sprintf "After the error number '%d' there should be a comma" errNum.Value) - // Skip the comma - i <- i + 1 - // parse short identifier - if i < txt.Length && not(System.Char.IsLetter(txt.[i])) then - Err(filename, lineNum, sprintf "The first character in the short identifier should be a letter, but found '%c'" txt.[i]) - while i < txt.Length && System.Char.IsLetterOrDigit txt.[i] do - identB.Append txt.[i] |> ignore - i <- i + 1 - let ident = identB.ToString() - if ident.Length = 0 then - Err(filename, lineNum, "Did not find the short identifier") - else - if i = txt.Length || not(txt.[i] = ',') then - Err(filename, lineNum, sprintf "After the identifier '%s' there should be a comma" ident) - else - // Skip the comma - i <- i + 1 - if i = txt.Length then - Err(filename, lineNum, sprintf "After the identifier '%s' and comma, there should be the quoted string resource" ident) - else - let str = - try - System.String.Format(Unquote(txt.Substring i)) // Format turns e.g '\n' into that char, but also requires that we 'escape' curlies in the original .txt file, e.g. "{{" - with - e -> Err(filename, lineNum, sprintf "Error calling System.String.Format (note that curly braces must be escaped, and there cannot be trailing space on the line): >>>%s<<< -- %s" (txt.Substring i) e.Message) - let holes, netFormatString = ComputeHoles filename lineNum str - (lineNum, (errNum,ident), str, holes.ToArray(), netFormatString) - -let stringBoilerPlatePrefix = @" -open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators -open Microsoft.FSharp.Reflection -open System.Reflection -// (namespaces below for specific case of using the tool to compile FSharp.Core itself) -open Microsoft.FSharp.Core -open Microsoft.FSharp.Core.Operators -open Microsoft.FSharp.Text -open Microsoft.FSharp.Collections -open Printf -" -let StringBoilerPlate filename = - - @" - // BEGIN BOILERPLATE - - static let getCurrentAssembly () = - #if FX_RESHAPED_REFLECTION - typeof.GetTypeInfo().Assembly - #else - System.Reflection.Assembly.GetExecutingAssembly() - #endif - - static let getTypeInfo (t: System.Type) = - #if FX_RESHAPED_REFLECTION - t.GetTypeInfo() - #else - t - #endif - - static let resources = lazy (new System.Resources.ResourceManager(""" + filename + @""", getCurrentAssembly())) - - static let GetString(name:string) = - let s = resources.Value.GetString(name, System.Globalization.CultureInfo.CurrentUICulture) - #if DEBUG - if null = s then - System.Diagnostics.Debug.Assert(false, sprintf ""**RESOURCE ERROR**: Resource token %s does not exist!"" name) - #endif - s - - static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = - FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) - - static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() - - static let isNamedType(ty:System.Type) = not (ty.IsArray || ty.IsByRef || ty.IsPointer) - static let isFunctionType (ty1:System.Type) = - isNamedType(ty1) && getTypeInfo(ty1).IsGenericType && (ty1.GetGenericTypeDefinition()).Equals(funTyC) - - static let rec destFunTy (ty:System.Type) = - if isFunctionType ty then - ty, ty.GetGenericArguments() - else - match getTypeInfo(ty).BaseType with - | null -> failwith ""destFunTy: not a function type"" - | b -> destFunTy b - - static let buildFunctionForOneArgPat (ty: System.Type) impl = - let _,tys = destFunTy ty - let rty = tys.[1] - // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf ""%x""') - mkFunctionValue tys (fun inp -> impl rty inp) - - static let capture1 (fmt:string) i args ty (go : obj list -> System.Type -> int -> obj) : obj = - match fmt.[i] with - | '%' -> go args ty (i+1) - | 'd' - | 'f' - | 's' -> buildFunctionForOneArgPat ty (fun rty n -> go (n::args) rty (i+1)) - | _ -> failwith ""bad format specifier"" - - // newlines and tabs get converted to strings when read from a resource file - // this will preserve their original intention - static let postProcessString (s : string) = - s.Replace(""\\n"",""\n"").Replace(""\\t"",""\t"").Replace(""\\r"",""\r"").Replace(""\\\"""", ""\"""") - - static let createMessageString (messageString : string) (fmt : Printf.StringFormat<'T>) : 'T = - let fmt = fmt.Value // here, we use the actual error string, as opposed to the one stored as fmt - let len = fmt.Length - - /// Function to capture the arguments and then run. - let rec capture args ty i = - if i >= len || (fmt.[i] = '%' && i+1 >= len) then - let b = new System.Text.StringBuilder() - b.AppendFormat(messageString, [| for x in List.rev args -> x |]) |> ignore - box(b.ToString()) - // REVIEW: For these purposes, this should be a nop, but I'm leaving it - // in incase we ever decide to support labels for the error format string - // E.g., ""%s%d"" - elif System.Char.IsSurrogatePair(fmt,i) then - capture args ty (i+2) - else - match fmt.[i] with - | '%' -> - let i = i+1 - capture1 fmt i args ty capture - | _ -> - capture args ty (i+1) - - (unbox (capture [] (typeof<'T>) 0) : 'T) - - static let mutable swallowResourceText = false - - static let GetStringFunc((messageID : string),(fmt : Printf.StringFormat<'T>)) : 'T = - if swallowResourceText then - sprintf fmt - else - let mutable messageString = GetString(messageID) - messageString <- postProcessString messageString - createMessageString messageString fmt - - /// If set to true, then all error messages will just return the filled 'holes' delimited by ',,,'s - this is for language-neutral testing (e.g. localization-invariant baselines). - static member SwallowResourceText with get () = swallowResourceText - and set (b) = swallowResourceText <- b - // END BOILERPLATE -" - -let RunMain(filename, outFilename, outXmlFilenameOpt, projectNameOpt) = - try - let justfilename = System.IO.Path.GetFileNameWithoutExtension(filename) - if justfilename |> Seq.exists (fun c -> not(System.Char.IsLetterOrDigit(c))) then - Err(filename, 0, sprintf "The filename '%s' is not allowed; only letters and digits can be used, as the filename also becomes the namespace for the SR class" justfilename) - - printfn "fssrgen.fsx: Reading %s" filename - let lines = System.IO.File.ReadAllLines(filename) - |> Array.mapi (fun i s -> i,s) // keep line numbers - |> Array.filter (fun (i,s) -> not(s.StartsWith "#")) // filter out comments - - printfn "fssrgen.fsx: Parsing %s" filename - let stringInfos = lines |> Array.map (fun (i,s) -> ParseLine filename i s) - // now we have array of (lineNum, ident, str, holes, netFormatString) // str has %d, netFormatString has {0} - - printfn "fssrgen.fsx: Validating %s" filename - // validate that all the idents are unique - let allIdents = new System.Collections.Generic.Dictionary() - for (line,(_,ident),_,_,_) in stringInfos do - if allIdents.ContainsKey(ident) then - Err(filename,line,sprintf "Identifier '%s' is already used previously on line %d - each identifier must be unique" ident allIdents.[ident]) - allIdents.Add(ident,line) - - printfn "fssrgen.fsx: Validating uniqueness of %s" filename - // validate that all the strings themselves are unique - let allStrs = new System.Collections.Generic.Dictionary() - for (line,(_,ident),str,_,_) in stringInfos do - if allStrs.ContainsKey(str) then - let prevLine,prevIdent = allStrs.[str] - Err(filename,line,sprintf "String '%s' already appears on line %d with identifier '%s' - each string must be unique" str prevLine prevIdent) - allStrs.Add(str,(line,ident)) - - printfn "fssrgen.fsx: Generating %s" outFilename - - use out = new System.IO.StringWriter() - fprintfn out "// This is a generated file; the original input is '%s'" filename - fprintfn out "namespace %s" justfilename - if Option.isNone outXmlFilenameOpt then - fprintfn out "type internal SR private() =" - else - fprintfn out "%s" stringBoilerPlatePrefix - fprintfn out "type internal SR private() =" - let theResourceName = match projectNameOpt with Some p -> sprintf "%s.%s" p justfilename | None -> justfilename - fprintfn out "%s" (StringBoilerPlate theResourceName) - - printfn "fssrgen.fsx: Generating resource methods for %s" outFilename - // gen each resource method - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - let formalArgs = System.Text.StringBuilder() - let actualArgs = System.Text.StringBuilder() - let firstTime = ref true - let n = ref 0 - formalArgs.Append "(" |> ignore - for hole in holes do - if !firstTime then - firstTime := false - else - formalArgs.Append ", " |> ignore - actualArgs.Append " " |> ignore - formalArgs.Append(sprintf "a%d : %s" !n hole) |> ignore - actualArgs.Append(sprintf "a%d" !n) |> ignore - n := !n + 1 - formalArgs.Append ")" |> ignore - fprintfn out " /// %s" str - fprintfn out " /// (Originally from %s:%d)" filename (lineNum+1) - let justPercentsFromFormatString = - (holes |> Array.fold (fun acc holeType -> - acc + match holeType with - | "System.Int32" -> ",,,%d" - | "System.Double" -> ",,,%f" - | "System.String" -> ",,,%s" - | _ -> failwith "unreachable") "") + ",,," - let errPrefix = match optErrNum with - | None -> "" - | Some n -> sprintf "%d, " n - if Option.isNone outXmlFilenameOpt then - fprintfn out " static member %s%s = (%ssprintf \"%s\" %s)" ident (formalArgs.ToString()) errPrefix str (actualArgs.ToString()) - else - fprintfn out " static member %s%s = (%sGetStringFunc(\"%s\",\"%s\") %s)" ident (formalArgs.ToString()) errPrefix ident justPercentsFromFormatString (actualArgs.ToString()) - ) - - if Option.isSome outXmlFilenameOpt then - printfn "fssrgen.fsx: Generating .resx for %s" outFilename - fprintfn out "" - // gen validation method - fprintfn out " /// Call this method once to validate that all known resources are valid; throws if not" - fprintfn out " static member RunStartupValidation() =" - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - fprintfn out " ignore(GetString(\"%s\"))" ident - ) - fprintfn out " ()" // in case there are 0 strings, we need the generated code to parse - - let outFileNewText = out.ToString() - let nothingChanged = try File.Exists(outFilename) && File.ReadAllText(outFilename) = outFileNewText with _ -> false - if not nothingChanged then - File.WriteAllText(outFilename, outFileNewText, System.Text.Encoding.UTF8) - - if Option.isSome outXmlFilenameOpt then - // gen resx - let xd = new System.Xml.XmlDocument() - xd.LoadXml(xmlBoilerPlateString) - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - let xn = xd.CreateElement("data") - xn.SetAttribute("name",ident) |> ignore - xn.SetAttribute("xml:space","preserve") |> ignore - let xnc = xd.CreateElement "value" - xn.AppendChild xnc |> ignore - xnc.AppendChild(xd.CreateTextNode netFormatString) |> ignore - xd.LastChild.AppendChild xn |> ignore - ) - let outXmlFileNewText = - use outXmlStream = new System.IO.StringWriter() - xd.Save outXmlStream - outXmlStream.ToString() - let outXmlFile = outXmlFilenameOpt.Value - let nothingChanged = try File.Exists(outXmlFile) && File.ReadAllText(outXmlFile) = outXmlFileNewText with _ -> false - if not nothingChanged then - File.WriteAllText(outXmlFile, outXmlFileNewText, System.Text.Encoding.Unicode) - - - printfn "fssrgen.fsx: Done %s" outFilename - 0 - with e -> - PrintErr(filename, 0, sprintf "An exception occurred when processing '%s'\n%s" filename (e.ToString())) - 1 - -#if COMPILED -[] -#endif -let Main args = - - match args |> List.ofArray with - | [ inputFile; outFile; ] -> - let filename = System.IO.Path.GetFullPath(inputFile) - let outFilename = System.IO.Path.GetFullPath(outFile) - - RunMain(filename, outFilename, None, None) - - | [ inputFile; outFile; outXml ] -> - let filename = System.IO.Path.GetFullPath inputFile - let outFilename = System.IO.Path.GetFullPath outFile - let outXmlFilename = System.IO.Path.GetFullPath outXml - - RunMain(filename, outFilename, Some outXmlFilename, None) - - | [ inputFile; outFile; outXml; projectName ] -> - let filename = System.IO.Path.GetFullPath inputFile - let outFilename = System.IO.Path.GetFullPath outFile - let outXmlFilename = System.IO.Path.GetFullPath outXml - - RunMain(filename, outFilename, Some outXmlFilename, Some projectName) - - | _ -> - printfn "Error: invalid arguments." - printfn "Usage: " - 1 -#if !COMPILED -printfn "fssrgen: args = %A" fsi.CommandLineArgs -Main (fsi.CommandLineArgs |> Seq.skip 1 |> Seq.toArray) -#endif diff --git a/src/scripts/fssrgen.targets b/src/scripts/fssrgen.targets deleted file mode 100644 index 3458dd5bff..0000000000 --- a/src/scripts/fssrgen.targets +++ /dev/null @@ -1,57 +0,0 @@ - - - - - ProcessFsSrGen;$(BuildDependsOn) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - diff --git a/src/scripts/scriptlib.fsx b/src/scripts/scriptlib.fsx index 6835b9418f..df3c548cbc 100644 --- a/src/scripts/scriptlib.fsx +++ b/src/scripts/scriptlib.fsx @@ -60,15 +60,15 @@ module Scripting = let (++) a b = Path.Combine(a,b) - let getBasename a = Path.GetFileNameWithoutExtension a - let getFullPath a = Path.GetFullPath a - let getFilename a = Path.GetFileName a - let getDirectoryName a = Path.GetDirectoryName a + let getBasename (a:string) = Path.GetFileNameWithoutExtension a + let getFullPath (a:string) = Path.GetFullPath a + let getFilename (a:string) = Path.GetFileName a + let getDirectoryName (a:string) = Path.GetDirectoryName a - let copyFile source dir = + let copyFile (source:string) dir = let dest = if not (Directory.Exists dir) then Directory.CreateDirectory dir |>ignore - let result = Path.Combine(dir, Path.GetFileName source) + let result = Path.Combine(dir, getFilename source) result //printfn "Copy %s --> %s" source dest File.Copy(source, dest, true) @@ -93,10 +93,10 @@ module Scripting = module Process = - let processExePath baseDir exe = + let processExePath baseDir (exe:string) = if Path.IsPathRooted(exe) then exe else - match Path.GetDirectoryName(exe) with + match getDirectoryName exe with | "" -> exe | _ -> Path.Combine(baseDir,exe) |> Path.GetFullPath @@ -108,7 +108,7 @@ module Scripting = processInfo.UseShellExecute <- false processInfo.WorkingDirectory <- workDir -#if NETSTANDARD1_6 +#if !NET46 ignore envs // work out what to do about this #else envs @@ -159,9 +159,9 @@ module Scripting = match p.ExitCode with | 0 -> Success - | err -> + | errCode -> let msg = sprintf "Error running command '%s' with args '%s' in directory '%s'.\n---- stdout below --- \n%s\n---- stderr below --- \n%s " exePath arguments workDir (out.ToString()) (err.ToString()) - ErrorLevel (msg, err) + ErrorLevel (msg, errCode) type OutPipe (writer: TextWriter) = member x.Post (msg:string) = lock writer (fun () -> writer.WriteLine(msg)) diff --git a/src/scripts/subst.fsx b/src/scripts/subst.fsx deleted file mode 100644 index 4e8199e0ab..0000000000 --- a/src/scripts/subst.fsx +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -// -//========================================================================================= - -#load "scriptlib.fsx" - -open System.IO -open System.Text.RegularExpressions - -try - let input = getCmdLineArgReqd "--in:" - let output = getCmdLineArgReqd "--out:" - let pattern1 = getCmdLineArgReqd "--pattern1:" - let replacement1 = getCmdLineArgReqd "--replacement1:" - let pattern2 = getCmdLineArgOptional "--pattern2:" - let replacement2 = getCmdLineArgOptional "--replacement2:" - - let inp0 = File.ReadAllText(input) - let inp1 = Regex.Replace(inp0, pattern1, replacement1) - let inp2 = match pattern2, replacement2 with Some p2, Some r2 -> Regex.Replace(inp1, p2, r2) | None, None -> inp1 | _ -> failwith "if pattern2 is given, replacement2 must also be given" - File.WriteAllText(output,inp2) - exit 0 -with e -> - eprintfn "%A" e - exit 1 diff --git a/src/utils/CompilerLocationUtils.fs b/src/utils/CompilerLocationUtils.fs index 3499e7e5b2..55dcac8ccc 100755 --- a/src/utils/CompilerLocationUtils.fs +++ b/src/utils/CompilerLocationUtils.fs @@ -37,19 +37,6 @@ module internal FSharpEnvironment = | s -> Some(s) with _ -> None - - // The F# team version number. This version number is used for - // - the F# version number reported by the fsc.exe and fsi.exe banners in the CTP release - // - the F# version number printed in the HTML documentation generator - // - the .NET DLL version number for all VS2008 DLLs - // - the VS2008 registry key, written by the VS2008 installer - // HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\AssemblyFolders\Microsoft.FSharp-" + FSharpTeamVersionNumber - // Also - // - for Beta2, the language revision number indicated on the F# language spec - // - // It is NOT the version number listed on FSharp.Core.dll - let FSharpTeamVersionNumber = "2.0.0.0" - // The F# binary format revision number. The first three digits of this form the significant part of the // format revision number for F# binary signature and optimization metadata. The last digit is not significant. // diff --git a/src/utils/EditDistance.fs b/src/utils/EditDistance.fs index 6beac0c408..503662400f 100644 --- a/src/utils/EditDistance.fs +++ b/src/utils/EditDistance.fs @@ -23,33 +23,45 @@ let jaro (s1: string) (s2: string) = let matchRadius = let minLen = Math.Min(s1.Length, s2.Length) minLen / 2 + minLen % 2 - - // An inner function which recursively finds the number - // of matched characters within the radius. - let commonChars (chars1: string) (chars2: string) = - let result = ResizeArray(chars1.Length) - for i = 0 to chars1.Length - 1 do - let c = chars1.[i] - if existsInWin c chars2 i matchRadius then - result.Add c - result - - // The sets of common characters and their lengths as floats - let c1 = commonChars s1 s2 - let c2 = commonChars s2 s1 - let c1length = float c1.Count - let c2length = float c2.Count - + + let rec nextChar (s1:string) (s2:string) i c = + if i < s1.Length then + let c = s1.[i] + if not (existsInWin c s2 i matchRadius) then + nextChar s1 s2 (i + 1) c + else + struct (i, c) + else + struct (i, c) + + // The sets of common characters and their lengths as floats // The number of transpositions within the sets of common characters. - let transpositions = - let mutable mismatches = 0.0 - for i = 0 to (Math.Min(c1.Count, c2.Count)) - 1 do - if c1.[i] <> c2.[i] then - mismatches <- mismatches + 1.0 - - // If one common string is longer than the other - // each additional char counts as half a transposition - (mismatches + abs (c1length - c2length)) / 2.0 + let struct (transpositions, c1length, c2length) = + let rec loop i j mismatches c1length c2length = + if i < s1.Length && j < s2.Length then + let struct (ti, ci) = nextChar s1 s2 i ' ' + let struct (tj, cj) = nextChar s2 s1 j ' ' + if ci <> cj then + loop (ti + 1) (tj + 1) (mismatches + 1) (c1length + 1) (c2length + 1) + else + loop (ti + 1) (tj + 1) mismatches (c1length + 1) (c2length + 1) + else struct (i, j, mismatches, c1length, c2length) + + let struct (i, j, mismatches, c1length, c2length) = loop 0 0 0 0 0 + + let rec loop (s1:string) (s2:string) i length = + if i < s1.Length - 1 then + let c = s1.[i] + if existsInWin c s2 i matchRadius then + loop s1 s2 (i + 1) (length + 1) + else + loop s1 s2 (i + 1) length + else + length + let c1length = loop s1 s2 i c1length |> float + let c2length = loop s2 s1 j c2length |> float + + struct ((float mismatches + abs (c1length - c2length)) / 2.0, c1length, c2length) let tLength = Math.Max(c1length, c2length) diff --git a/src/utils/prim-lexing.fs b/src/utils/prim-lexing.fs index 531e3e5f18..2a49afc579 100755 --- a/src/utils/prim-lexing.fs +++ b/src/utils/prim-lexing.fs @@ -2,6 +2,7 @@ #nowarn "47" // recursive initialization of LexBuffer +// NOTE: the code in this file is a drop-in replacement runtime for Lexing.fs from the FsLexYacc repository namespace Internal.Utilities.Text.Lexing diff --git a/src/utils/prim-lexing.fsi b/src/utils/prim-lexing.fsi index 49eb2e6bc4..9ee890b8d1 100755 --- a/src/utils/prim-lexing.fsi +++ b/src/utils/prim-lexing.fsi @@ -2,7 +2,10 @@ // LexBuffers are for use with automatically generated lexical analyzers, // in particular those produced by 'fslex'. - +// +// 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. +// The underlying table format intepreted must precisely match the format generated by FsLex. namespace Internal.Utilities.Text.Lexing open System.Collections.Generic @@ -14,27 +17,35 @@ open Microsoft.FSharp.Control type internal Position = /// The file index for the file associated with the input stream, use fileOfFileIndex in range.fs to decode val FileIndex : int + /// The line number in the input stream, assuming fresh positions have been updated /// for the new line by modifying the EndPos property of the LexBuffer. val Line : int + /// The line number for the position in the input stream, assuming fresh positions have been updated /// using for the new line. val OriginalLine : int + /// The character number in the input stream. val AbsoluteOffset : int + /// Return absolute offset of the start of the line marked by the position. val StartOfLineAbsoluteOffset : int + /// Return the column number marked by the position, /// i.e. the difference between the AbsoluteOffset and the StartOfLineAbsoluteOffset member Column : int - // Given a position just beyond the end of a line, return a position at the start of the next line. + + /// Given a position just beyond the end of a line, return a position at the start of the next line. member NextLine : Position /// Given a position at the start of a token of length n, return a position just beyond the end of the token. member EndOfToken: n:int -> Position + /// Gives a position shifted by specified number of characters. member ShiftColumnBy: by:int -> Position - // Same line, column -1. + + /// Same line, column -1. member ColumnMinusOne : Position /// Apply a #line directive. @@ -47,11 +58,15 @@ type internal Position = [] /// Input buffers consumed by lexers generated by fslex.exe. +/// The type must be generic to match the code generated by FsLex and FsYacc (if you would like to +/// fix this, please submit a PR to the FsLexYacc repository allowing for optional emit of a non-generic type reference). type internal LexBuffer<'Char> = /// The start position for the lexeme. member StartPos: Position with get,set + /// The end position for the lexeme. member EndPos: Position with get,set + /// The matched string. member Lexeme: 'Char [] @@ -67,13 +82,17 @@ type internal LexBuffer<'Char> = /// Create a lex buffer suitable for Unicode lexing that reads characters from the given array. /// Important: does take ownership of the array. static member FromChars: char[] -> LexBuffer + /// Create a lex buffer that reads character or byte inputs by using the given function. static member FromFunction: ('Char[] * int * int -> int) -> LexBuffer<'Char> /// The type of tables for an unicode lexer generated by fslex.exe. [] type internal UnicodeTables = + + /// Create the tables from raw data static member Create : uint16[][] * uint16[] -> UnicodeTables + /// Interpret tables for a unicode lexer generated by fslex.exe. member Interpret: initialState:int * LexBuffer -> int diff --git a/src/utils/prim-parsing.fs b/src/utils/prim-parsing.fs index b5e87d19f2..c9ff1bb595 100755 --- a/src/utils/prim-parsing.fs +++ b/src/utils/prim-parsing.fs @@ -1,6 +1,9 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// NOTE: the code in this file is a drop-in replacement runtime for Parsing.fs from the FsLexYacc repository + namespace Internal.Utilities.Text.Parsing + open Internal.Utilities open Internal.Utilities.Text.Lexing @@ -11,21 +14,29 @@ exception RecoverableParseError exception Accept of obj [] -type internal IParseState(ruleStartPoss:Position[],ruleEndPoss:Position[],lhsPos:Position[],ruleValues:obj[],lexbuf:LexBuffer) = +type internal IParseState(ruleStartPoss:Position[], ruleEndPoss:Position[], lhsPos:Position[], ruleValues:obj[], lexbuf:LexBuffer) = member p.LexBuffer = lexbuf - member p.InputRange n = ruleStartPoss.[n-1], ruleEndPoss.[n-1]; + + member p.InputRange n = ruleStartPoss.[n-1], ruleEndPoss.[n-1] + member p.InputStartPosition n = ruleStartPoss.[n-1] - member p.InputEndPosition n = ruleEndPoss.[n-1]; + + member p.InputEndPosition n = ruleEndPoss.[n-1] + member p.ResultStartPosition = lhsPos.[0] - member p.ResultEndPosition = lhsPos.[1]; - member p.GetInput n = ruleValues.[n-1]; - member p.ResultRange = (lhsPos.[0], lhsPos.[1]); - member p.RaiseError() = raise RecoverableParseError (* NOTE: this binding tests the fairly complex logic associated with an object expression implementing a generic abstract method *) -//------------------------------------------------------------------------- -// This context is passed to the error reporter when a syntax error occurs + member p.ResultEndPosition = lhsPos.[1] + + member p.GetInput n = ruleValues.[n-1] + + member p.ResultRange = (lhsPos.[0], lhsPos.[1]) + + // Side note: this definition coincidentally tests the fairly complex logic associated with an object expression implementing a generic abstract method. + member p.RaiseError() = raise RecoverableParseError + [] +/// This context is passed to the error reporter when a syntax error occurs type internal ParseErrorContext<'tok> (//lexbuf: LexBuffer<_>, stateStack:int list, @@ -49,24 +60,24 @@ type internal ParseErrorContext<'tok> // This is the data structure emitted as code by FSYACC. type internal Tables<'tok> = - { reductions: (IParseState -> obj)[]; - endOfInputTag: int; - tagOfToken: 'tok -> int; - dataOfToken: 'tok -> obj; - actionTableElements: uint16[]; - actionTableRowOffsets: uint16[]; - reductionSymbolCounts: uint16[]; - immediateActions: uint16[]; - gotos: uint16[]; - sparseGotoTableRowOffsets: uint16[]; - stateToProdIdxsTableElements: uint16[]; - stateToProdIdxsTableRowOffsets: uint16[]; - productionToNonTerminalTable: uint16[]; + { reductions: (IParseState -> obj)[] + endOfInputTag: int + tagOfToken: 'tok -> int + dataOfToken: 'tok -> obj + actionTableElements: uint16[] + actionTableRowOffsets: uint16[] + reductionSymbolCounts: uint16[] + immediateActions: uint16[] + gotos: uint16[] + sparseGotoTableRowOffsets: uint16[] + stateToProdIdxsTableElements: uint16[] + stateToProdIdxsTableRowOffsets: uint16[] + productionToNonTerminalTable: uint16[] /// For fsyacc.exe, this entry is filled in by context from the generated parser file. If no 'parse_error' function /// is defined by the user then ParseHelpers.parse_error is used by default (ParseHelpers is opened /// at the top of the generated parser file) - parseError: ParseErrorContext<'tok> -> unit; - numTerminals: int; + parseError: ParseErrorContext<'tok> -> unit + numTerminals: int tagOfErrorTerminal: int } //------------------------------------------------------------------------- @@ -91,8 +102,8 @@ type Stack<'a>(n) = member buf.Peep() = contents.[count - 1] member buf.Top(n) = [ for x in contents.[max 0 (count-n)..count - 1] -> x ] |> List.rev member buf.Push(x) = - buf.Ensure(count + 1); - contents.[count] <- x; + buf.Ensure(count + 1) + contents.[count] <- x count <- count + 1 member buf.IsEmpty = (count = 0) @@ -197,10 +208,10 @@ module internal Implementation = let interpret (tables: Tables<'tok>) lexer (lexbuf : LexBuffer<_>) initialState = #if DEBUG - if Flags.debug then System.Console.WriteLine("\nParser: interpret tables"); + if Flags.debug then System.Console.WriteLine("\nParser: interpret tables") #endif let stateStack : Stack = new Stack<_>(100) - stateStack.Push(initialState); + stateStack.Push(initialState) let valueStack = new Stack(100) let mutable haveLookahead = false let mutable lookaheadToken = Unchecked.defaultof<'tok> @@ -244,19 +255,19 @@ module internal Implementation = let rec popStackUntilErrorShifted(tokenOpt) = // Keep popping the stack until the "error" terminal is shifted #if DEBUG - if Flags.debug then System.Console.WriteLine("popStackUntilErrorShifted"); + if Flags.debug then System.Console.WriteLine("popStackUntilErrorShifted") #endif if stateStack.IsEmpty then #if DEBUG if Flags.debug then - System.Console.WriteLine("state stack empty during error recovery - generating parse error"); + System.Console.WriteLine("state stack empty during error recovery - generating parse error") #endif - failwith "parse error"; + failwith "parse error" let currState = stateStack.Peep() #if DEBUG if Flags.debug then - System.Console.WriteLine("In state {0} during error recovery", currState); + System.Console.WriteLine("In state {0} during error recovery", currState) #endif let action = actionTable.Read(currState, tables.tagOfErrorTerminal) @@ -269,22 +280,22 @@ module internal Implementation = actionKind (actionTable.Read(nextState, tables.tagOfToken(token))) = shiftFlag) then #if DEBUG - if Flags.debug then System.Console.WriteLine("shifting error, continuing with error recovery"); + if Flags.debug then System.Console.WriteLine("shifting error, continuing with error recovery") #endif let nextState = actionValue action // The "error" non terminal needs position information, though it tends to be unreliable. // Use the StartPos/EndPos from the lex buffer. - valueStack.Push(ValueInfo(box (), lexbuf.StartPos, lexbuf.EndPos)); + valueStack.Push(ValueInfo(box (), lexbuf.StartPos, lexbuf.EndPos)) stateStack.Push(nextState) else if valueStack.IsEmpty then - failwith "parse error"; + failwith "parse error" #if DEBUG if Flags.debug then - System.Console.WriteLine("popping stack during error recovery"); + System.Console.WriteLine("popping stack during error recovery") #endif - valueStack.Pop(); - stateStack.Pop(); + valueStack.Pop() + stateStack.Pop() popStackUntilErrorShifted(tokenOpt) while not finished do @@ -316,7 +327,7 @@ module internal Implementation = lookaheadToken <- lexer lexbuf lookaheadStartPos <- lexbuf.StartPos lookaheadEndPos <- lexbuf.EndPos - haveLookahead <- true; + haveLookahead <- true let tag = if haveLookahead then tables.tagOfToken lookaheadToken @@ -328,17 +339,17 @@ module internal Implementation = let kind = actionKind action if kind = shiftFlag then ( if errorSuppressionCountDown > 0 then - errorSuppressionCountDown <- errorSuppressionCountDown - 1; + errorSuppressionCountDown <- errorSuppressionCountDown - 1 #if DEBUG - if Flags.debug then Console.WriteLine("shifting, reduced errorRecoverylevel to {0}\n", errorSuppressionCountDown); + if Flags.debug then Console.WriteLine("shifting, reduced errorRecoverylevel to {0}\n", errorSuppressionCountDown) #endif let nextState = actionValue action - if not haveLookahead then failwith "shift on end of input!"; + if not haveLookahead then failwith "shift on end of input!" let data = tables.dataOfToken lookaheadToken - valueStack.Push(ValueInfo(data, lookaheadStartPos, lookaheadEndPos)); - stateStack.Push(nextState); + valueStack.Push(ValueInfo(data, lookaheadStartPos, lookaheadEndPos)) + stateStack.Push(nextState) #if DEBUG - if Flags.debug then Console.WriteLine("shift/consume input {0}, shift to state {1}", report haveLookahead lookaheadToken, nextState); + if Flags.debug then Console.WriteLine("shift/consume input {0}, shift to state {1}", report haveLookahead lookaheadToken, nextState) #endif haveLookahead <- false @@ -348,31 +359,31 @@ module internal Implementation = let n = int tables.reductionSymbolCounts.[prod] // pop the symbols, populate the values and populate the locations #if DEBUG - if Flags.debug then Console.Write("reduce popping {0} values/states, lookahead {1}", n, report haveLookahead lookaheadToken); + if Flags.debug then Console.Write("reduce popping {0} values/states, lookahead {1}", n, report haveLookahead lookaheadToken) #endif for i = 0 to n - 1 do - if valueStack.IsEmpty then failwith "empty symbol stack"; + if valueStack.IsEmpty then failwith "empty symbol stack" let topVal = valueStack.Peep() - valueStack.Pop(); - stateStack.Pop(); - ruleValues.[(n-i)-1] <- topVal.value; - ruleStartPoss.[(n-i)-1] <- topVal.startPos; - ruleEndPoss.[(n-i)-1] <- topVal.endPos; - if i = 0 then lhsPos.[1] <- topVal.endPos; + valueStack.Pop() + stateStack.Pop() + ruleValues.[(n-i)-1] <- topVal.value + ruleStartPoss.[(n-i)-1] <- topVal.startPos + ruleEndPoss.[(n-i)-1] <- topVal.endPos + if i = 0 then lhsPos.[1] <- topVal.endPos if i = n - 1 then lhsPos.[0] <- topVal.startPos // Use the lookahead token to populate the locations if the rhs is empty if n = 0 then if haveLookahead then - lhsPos.[0] <- lookaheadStartPos; - lhsPos.[1] <- lookaheadEndPos; + lhsPos.[0] <- lookaheadStartPos + lhsPos.[1] <- lookaheadEndPos else - lhsPos.[0] <- lexbuf.StartPos; - lhsPos.[1] <- lexbuf.EndPos; + lhsPos.[0] <- lexbuf.StartPos + lhsPos.[1] <- lexbuf.EndPos try - // printf "reduce %d\n" prod; + // printf "reduce %d\n" prod let redResult = reduction parseState - valueStack.Push(ValueInfo(redResult, lhsPos.[0], lhsPos.[1])); + valueStack.Push(ValueInfo(redResult, lhsPos.[0], lhsPos.[1])) let currState = stateStack.Peep() let newGotoState = gotoTable.Read(int tables.productionToNonTerminalTable.[prod], currState) stateStack.Push(newGotoState) @@ -381,23 +392,23 @@ module internal Implementation = #endif with | Accept res -> - finished <- true; + finished <- true valueStack.Push(ValueInfo(res, lhsPos.[0], lhsPos.[1])) | RecoverableParseError -> #if DEBUG - if Flags.debug then Console.WriteLine("RecoverableParseErrorException...\n"); + if Flags.debug then Console.WriteLine("RecoverableParseErrorException...\n") #endif - popStackUntilErrorShifted(None); + popStackUntilErrorShifted(None) // User code raised a Parse_error. Don't report errors again until three tokens have been shifted errorSuppressionCountDown <- 3 elif kind = errorFlag then ( #if DEBUG - if Flags.debug then Console.Write("ErrorFlag... "); + if Flags.debug then Console.Write("ErrorFlag... ") #endif // Silently discard inputs and don't report errors // until three tokens in a row have been shifted #if DEBUG - if Flags.debug then printfn "error on token '%s' " (report haveLookahead lookaheadToken); + if Flags.debug then printfn "error on token '%s' " (report haveLookahead lookaheadToken) #endif if errorSuppressionCountDown > 0 then // If we're in the end-of-file count down then we're very keen to 'Accept'. @@ -405,16 +416,16 @@ module internal Implementation = // and an EOF token. if inEofCountDown && eofCountDown < 10 then #if DEBUG - if Flags.debug then printfn "popping stack, looking to shift both 'error' and that token, during end-of-file error recovery" ; + if Flags.debug then printfn "popping stack, looking to shift both 'error' and that token, during end-of-file error recovery" #endif - popStackUntilErrorShifted(if haveLookahead then Some(lookaheadToken) else None); + popStackUntilErrorShifted(if haveLookahead then Some(lookaheadToken) else None) // If we don't haveLookahead then the end-of-file count down is over and we have no further options. if not haveLookahead then failwith "parse error: unexpected end of file" #if DEBUG - if Flags.debug then printfn "discarding token '%s' during error suppression" (report haveLookahead lookaheadToken); + if Flags.debug then printfn "discarding token '%s' during error suppression" (report haveLookahead lookaheadToken) #endif // Discard the token haveLookahead <- false @@ -449,28 +460,30 @@ module internal Implementation = if not (explicit.Contains(tag)) then yield tag ] in //let activeRules = stateStack |> List.iter (fun state -> - let errorContext = new ParseErrorContext<'tok>(stateStack,parseState, reduceTokens,currentToken,reducibleProductions, shiftableTokens, "syntax error") - tables.parseError(errorContext); - popStackUntilErrorShifted(None); - errorSuppressionCountDown <- 3; + let errorContext = new ParseErrorContext<'tok>(stateStack, parseState, reduceTokens, currentToken, reducibleProductions, shiftableTokens, "syntax error") + tables.parseError(errorContext) + popStackUntilErrorShifted(None) + errorSuppressionCountDown <- 3 #if DEBUG - if Flags.debug then System.Console.WriteLine("generated syntax error and shifted error token, haveLookahead = {0}\n", haveLookahead); + if Flags.debug then System.Console.WriteLine("generated syntax error and shifted error token, haveLookahead = {0}\n", haveLookahead) #endif ) ) elif kind = acceptFlag then finished <- true #if DEBUG else - if Flags.debug then System.Console.WriteLine("ALARM!!! drop through case in parser"); + if Flags.debug then System.Console.WriteLine("ALARM!!! drop through case in parser") #endif - done; + done // OK, we're done - read off the overall generated value valueStack.Peep().value type internal Tables<'tok> with - member tables.Interpret (lexer,lexbuf,initialState) = + member tables.Interpret (lexer, lexbuf, initialState) = Implementation.interpret tables lexer lexbuf initialState module internal ParseHelpers = + let parse_error (_s:string) = () + let parse_error_rich = (None : (ParseErrorContext<_> -> unit) option) diff --git a/src/utils/prim-parsing.fsi b/src/utils/prim-parsing.fsi index d6502da55b..7ec3e7a0a8 100755 --- a/src/utils/prim-parsing.fsi +++ b/src/utils/prim-parsing.fsi @@ -1,6 +1,9 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// NOTE: the code in this file is a drop-in replacement runtime for Parsing.fsi from the FsLexYacc repository + namespace Internal.Utilities.Text.Parsing + open Internal.Utilities open Internal.Utilities.Text.Lexing @@ -8,22 +11,31 @@ open System.Collections.Generic [] type internal IParseState = + /// Get the start and end position for the terminal or non-terminal at a given index matched by the production. member InputRange: index:int -> Position * Position + /// Get the end position for the terminal or non-terminal at a given index matched by the production. member InputEndPosition: int -> Position + /// Get the start position for the terminal or non-terminal at a given index matched by the production. member InputStartPosition: int -> Position + /// Get the start of the range of positions matched by the production. member ResultStartPosition: Position + /// Get the end of the range of positions matched by the production. member ResultEndPosition: Position + /// Get the full range of positions matched by the production. member ResultRange: Position * Position + /// Get the value produced by the terminal or non-terminal at the given position. member GetInput : int -> obj + /// Raise an error in this parse context. member RaiseError<'b> : unit -> 'b + /// Return the LexBuffer for this parser instance. member LexBuffer : LexBuffer @@ -33,16 +45,22 @@ type internal IParseState = type internal ParseErrorContext<'tok> = /// The stack of state indexes active at the parse error . member StateStack : int list + /// The state active at the parse error. member ParseState : IParseState + /// The tokens that would cause a reduction at the parse error. member ReduceTokens: int list + /// The stack of productions that would be reduced at the parse error. member ReducibleProductions : int list list + /// The token that caused the parse error. member CurrentToken : 'tok option + /// The token that would cause a shift at the parse error. member ShiftTokens : int list + /// The message associated with the parse error. member Message : string @@ -51,35 +69,50 @@ type internal ParseErrorContext<'tok> = type internal Tables<'tok> = { /// The reduction table. - reductions: (IParseState -> obj) array ; + reductions: (IParseState -> obj)[] + /// The token number indicating the end of input. - endOfInputTag: int; + endOfInputTag: int + /// A function to compute the tag of a token. - tagOfToken: 'tok -> int; + tagOfToken: 'tok -> int + /// A function to compute the data carried by a token. - dataOfToken: 'tok -> obj; + dataOfToken: 'tok -> obj + /// The sparse action table elements. - actionTableElements: uint16[]; + actionTableElements: uint16[] + /// The sparse action table row offsets. - actionTableRowOffsets: uint16[]; + actionTableRowOffsets: uint16[] + /// The number of symbols for each reduction. - reductionSymbolCounts: uint16[]; + reductionSymbolCounts: uint16[] + /// The immediate action table. - immediateActions: uint16[]; + immediateActions: uint16[] + /// The sparse goto table. - gotos: uint16[]; + gotos: uint16[] + /// The sparse goto table row offsets. - sparseGotoTableRowOffsets: uint16[]; + sparseGotoTableRowOffsets: uint16[] + /// The sparse table for the productions active for each state. - stateToProdIdxsTableElements: uint16[]; + stateToProdIdxsTableElements: uint16[] + /// The sparse table offsets for the productions active for each state. - stateToProdIdxsTableRowOffsets: uint16[]; + stateToProdIdxsTableRowOffsets: uint16[] + /// This table is logically part of the Goto table. - productionToNonTerminalTable: uint16[]; + productionToNonTerminalTable: uint16[] + /// This function is used to hold the user specified "parse_error" or "parse_error_rich" functions. - parseError: ParseErrorContext<'tok> -> unit; + parseError: ParseErrorContext<'tok> -> unit + /// The total number of terminals. - numTerminals: int; + numTerminals: int + /// The tag of the error terminal. tagOfErrorTerminal: int } @@ -89,6 +122,7 @@ type internal Tables<'tok> = /// Indicates an accept action has occurred. exception internal Accept of obj + /// Indicates a parse error has occurred and parse recovery is in progress. exception internal RecoverableParseError @@ -99,8 +133,10 @@ module internal Flags = /// Helpers used by generated parsers. module internal ParseHelpers = + /// The default implementation of the parse_error_rich function. val parse_error_rich: (ParseErrorContext<'tok> -> unit) option + /// The default implementation of the parse_error function. val parse_error: string -> unit diff --git a/src/utils/reshapedmsbuild.fs b/src/utils/reshapedmsbuild.fs index 925b904e3e..f84e8a5d31 100644 --- a/src/utils/reshapedmsbuild.fs +++ b/src/utils/reshapedmsbuild.fs @@ -85,6 +85,10 @@ module internal MsBuildAdapters = | Version46 = 7 | Version461 = 8 | Version452 = 9 + | Version462 = 10 + | Version47 = 11 + | Version471 = 12 + | Version472 = 13 | VersionLatest = 8 //TargetDotNetFrameworkVersion.Version461 /// diff --git a/src/utils/sformat.fs b/src/utils/sformat.fs index d2d3511777..7620a2c411 100755 --- a/src/utils/sformat.fs +++ b/src/utils/sformat.fs @@ -199,6 +199,8 @@ namespace Microsoft.FSharp.Text.StructuredPrintfImpl let rightBracket = tagPunctuation "]" let leftBrace= tagPunctuation "{" let rightBrace = tagPunctuation "}" + let leftBraceBar = tagPunctuation "{|" + let rightBraceBar = tagPunctuation "|}" let equals = tagOperator "=" let arrow = tagPunctuation "->" let questionMark = tagPunctuation "?" diff --git a/src/utils/sformat.fsi b/src/utils/sformat.fsi index fb768703e1..afdd931f90 100755 --- a/src/utils/sformat.fsi +++ b/src/utils/sformat.fsi @@ -148,6 +148,8 @@ namespace Microsoft.FSharp.Text.StructuredPrintfImpl val rightBracket : TaggedText val leftBrace: TaggedText val rightBrace : TaggedText + val leftBraceBar: TaggedText + val rightBraceBar : TaggedText val equals : TaggedText val arrow : TaggedText val questionMark : TaggedText diff --git a/tests/FSharp.Compiler.UnitTests/Directory.Build.props b/tests/FSharp.Compiler.UnitTests/Directory.Build.props new file mode 100644 index 0000000000..bb8eac309b --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Compiler.UnitTests/Directory.Build.targets b/tests/FSharp.Compiler.UnitTests/Directory.Build.targets new file mode 100644 index 0000000000..ccd47cc0a9 --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj new file mode 100644 index 0000000000..4b9f4d21a3 --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj @@ -0,0 +1,28 @@ + + + + + + net46;netcoreapp2.0 + Library + true + nunit + + + + + + + + + + + + + + + + + + + diff --git a/tests/FSharp.Compiler.UnitTests/ILHelpers.fs b/tests/FSharp.Compiler.UnitTests/ILHelpers.fs new file mode 100644 index 0000000000..372e11d070 --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/ILHelpers.fs @@ -0,0 +1,116 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.UnitTests + +open System +open System.IO +open System.Diagnostics + +open NUnit.Framework + +open Microsoft.FSharp.Compiler.SourceCodeServices + +module ILChecker = + + let checker = FSharpChecker.Create() + + let private (++) a b = Path.Combine(a,b) + + let private getfullpath workDir path = + let rooted = + if Path.IsPathRooted(path) then path + else Path.Combine(workDir, path) + rooted |> Path.GetFullPath + + let private fileExists workDir path = + if path |> getfullpath workDir |> File.Exists then Some path else None + + let private requireFile nm = + if fileExists __SOURCE_DIRECTORY__ nm |> Option.isSome then nm else failwith (sprintf "couldn't find %s. Running 'build test' once might solve this issue" nm) + + let private exec exe args = + let startInfo = ProcessStartInfo(exe, String.concat " " args) + startInfo.RedirectStandardError <- true + startInfo.UseShellExecute <- false + use p = Process.Start(startInfo) + p.WaitForExit() + p.StandardError.ReadToEnd(), p.ExitCode + + /// Compile the source and check to see if the expected IL exists. + /// The first line of each expected IL string is found first. + let check source expectedIL = + let packagesDir = Environment.GetEnvironmentVariable("USERPROFILE") ++ ".nuget" ++ "packages" + let Is64BitOperatingSystem = sizeof = 8 + let architectureMoniker = if Is64BitOperatingSystem then "x64" else "x86" + let ildasmExe = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") + let coreclrDll = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.Runtime.CoreCLR") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "coreclr.dll") + + let tmp = Path.GetTempFileName() + let tmpFs = Path.ChangeExtension(tmp, ".fs") + let tmpDll = Path.ChangeExtension(tmp, ".dll") + let tmpIL = Path.ChangeExtension(tmp, ".il") + + let mutable errorMsgOpt = None + try + // ildasm requires coreclr.dll to run which has already been restored to the packages directory + File.Copy(coreclrDll, Path.GetDirectoryName(ildasmExe) ++ "coreclr.dll", overwrite=true) + + File.WriteAllText(tmpFs, source) + + let errors, exitCode = checker.Compile([| "fsc.exe"; "--optimize+"; "-o"; tmpDll; "-a"; tmpFs |]) |> Async.RunSynchronously + let errors = + String.concat "\n" (errors |> Array.map (fun x -> x.Message)) + + if exitCode = 0 then + exec ildasmExe [ sprintf "%s /out=%s" tmpDll tmpIL ] |> ignore + + let text = File.ReadAllText(tmpIL) + let blockComments = @"/\*(.*?)\*/" + let lineComments = @"//(.*?)\r?\n" + let strings = @"""((\\[^\n]|[^""\n])*)""" + let verbatimStrings = @"@(""[^""]*"")+" + let textNoComments = + System.Text.RegularExpressions.Regex.Replace(text, + blockComments + "|" + lineComments + "|" + strings + "|" + verbatimStrings, + (fun me -> + if (me.Value.StartsWith("/*") || me.Value.StartsWith("//")) then + if me.Value.StartsWith("//") then Environment.NewLine else String.Empty + else + me.Value), System.Text.RegularExpressions.RegexOptions.Singleline) + + expectedIL + |> List.iter (fun (ilCode: string) -> + let expectedLines = ilCode.Split('\n') + let startIndex = textNoComments.IndexOf(expectedLines.[0]) + if startIndex = -1 || textNoComments.Length < startIndex + ilCode.Length then + errorMsgOpt <- Some("==EXPECTED CONTAINS==\n" + ilCode + "\n") + else + let errors = ResizeArray() + let actualLines = textNoComments.Substring(startIndex, textNoComments.Length - startIndex).Split('\n') + for i = 0 to expectedLines.Length - 1 do + let expected = expectedLines.[i].Trim() + let actual = actualLines.[i].Trim() + if expected <> actual then + errors.Add(sprintf "\n==\nName: %s\n\nExpected:\t %s\nActual:\t\t %s\n==" actualLines.[0] expected actual) + + if errors.Count > 0 then + let msg = String.concat "\n" errors + "\n\n\n==EXPECTED==\n" + ilCode + "\n" + errorMsgOpt <- Some(msg + "\n\n\n==ACTUAL==\n" + String.Join("\n", actualLines, 0, expectedLines.Length)) + ) + + match errorMsgOpt with + | Some(msg) -> errorMsgOpt <- Some(msg + "\n\n\n==ENTIRE ACTUAL==\n" + textNoComments) + | _ -> () + else + errorMsgOpt <- Some(errors) + finally + try File.Delete(tmp) with | _ -> () + try File.Delete(tmpFs) with | _ -> () + try File.Delete(tmpDll) with | _ -> () + try File.Delete(tmpIL) with | _ -> () + + match errorMsgOpt with + | Some(errorMsg) -> + Assert.Fail(errorMsg) + | _ -> () + diff --git a/tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs b/tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs new file mode 100644 index 0000000000..fa18e7bb42 --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs @@ -0,0 +1,845 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.UnitTests + +open System +open NUnit.Framework + +[] +module StringConcat = + + [] + let Optimizations () = + let baseSource = """ +module Test + +open System + +let arr = ResizeArray() + +let inline ss (x: int) = + arr.Add(x) + "_" + x.ToString() + "_" +""" + + let test1Source = """ +let test1 () = + ss 1 + ss 2 + ss 3 +""" + let test1IL = """.method public static string test1() cil managed + { + + .maxstack 7 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0007: ldc.i4.1 + IL_0008: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_000d: ldstr "_" + IL_0012: ldloca.s V_0 + IL_0014: constrained. [mscorlib]System.Int32 + IL_001a: callvirt instance string [mscorlib]System.Object::ToString() + IL_001f: ldstr "_" + IL_0024: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0029: ldc.i4.2 + IL_002a: stloc.0 + IL_002b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0030: ldc.i4.2 + IL_0031: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0036: ldstr "_" + IL_003b: ldloca.s V_0 + IL_003d: constrained. [mscorlib]System.Int32 + IL_0043: callvirt instance string [mscorlib]System.Object::ToString() + IL_0048: ldstr "_" + IL_004d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0052: ldc.i4.3 + IL_0053: stloc.0 + IL_0054: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0059: ldc.i4.3 + IL_005a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_005f: ldstr "_" + IL_0064: ldloca.s V_0 + IL_0066: constrained. [mscorlib]System.Int32 + IL_006c: callvirt instance string [mscorlib]System.Object::ToString() + IL_0071: ldstr "_" + IL_0076: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_007b: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0080: ret + }""" + + let test2Source = """ +let test2 () = + ss 1 + ss 2 + ss 3 + ss 4 +""" + let test2IL = """.method public static string test2() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0007: ldc.i4.1 + IL_0008: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_000d: ldstr "_" + IL_0012: ldloca.s V_0 + IL_0014: constrained. [mscorlib]System.Int32 + IL_001a: callvirt instance string [mscorlib]System.Object::ToString() + IL_001f: ldstr "_" + IL_0024: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0029: ldc.i4.2 + IL_002a: stloc.0 + IL_002b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0030: ldc.i4.2 + IL_0031: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0036: ldstr "_" + IL_003b: ldloca.s V_0 + IL_003d: constrained. [mscorlib]System.Int32 + IL_0043: callvirt instance string [mscorlib]System.Object::ToString() + IL_0048: ldstr "_" + IL_004d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0052: ldc.i4.3 + IL_0053: stloc.0 + IL_0054: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0059: ldc.i4.3 + IL_005a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_005f: ldstr "_" + IL_0064: ldloca.s V_0 + IL_0066: constrained. [mscorlib]System.Int32 + IL_006c: callvirt instance string [mscorlib]System.Object::ToString() + IL_0071: ldstr "_" + IL_0076: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_007b: ldc.i4.4 + IL_007c: stloc.0 + IL_007d: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0082: ldc.i4.4 + IL_0083: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0088: ldstr "_" + IL_008d: ldloca.s V_0 + IL_008f: constrained. [mscorlib]System.Int32 + IL_0095: callvirt instance string [mscorlib]System.Object::ToString() + IL_009a: ldstr "_" + IL_009f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00a4: call string [mscorlib]System.String::Concat(string, + string, + string, + string) + IL_00a9: ret + }""" + + let test3Source = """ +let test3 () = + ss 1 + ss 2 + ss 3 + ss 4 + ss 5 +""" + let test3IL = """.method public static string test3() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.5 + IL_0001: newarr [mscorlib]System.String + IL_0006: dup + IL_0007: ldc.i4.0 + IL_0008: ldc.i4.1 + IL_0009: stloc.0 + IL_000a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_000f: ldc.i4.1 + IL_0010: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0015: ldstr "_" + IL_001a: ldloca.s V_0 + IL_001c: constrained. [mscorlib]System.Int32 + IL_0022: callvirt instance string [mscorlib]System.Object::ToString() + IL_0027: ldstr "_" + IL_002c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0031: stelem [mscorlib]System.String + IL_0036: dup + IL_0037: ldc.i4.1 + IL_0038: ldc.i4.2 + IL_0039: stloc.0 + IL_003a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_003f: ldc.i4.2 + IL_0040: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0045: ldstr "_" + IL_004a: ldloca.s V_0 + IL_004c: constrained. [mscorlib]System.Int32 + IL_0052: callvirt instance string [mscorlib]System.Object::ToString() + IL_0057: ldstr "_" + IL_005c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0061: stelem [mscorlib]System.String + IL_0066: dup + IL_0067: ldc.i4.2 + IL_0068: ldc.i4.3 + IL_0069: stloc.0 + IL_006a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_006f: ldc.i4.3 + IL_0070: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0075: ldstr "_" + IL_007a: ldloca.s V_0 + IL_007c: constrained. [mscorlib]System.Int32 + IL_0082: callvirt instance string [mscorlib]System.Object::ToString() + IL_0087: ldstr "_" + IL_008c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0091: stelem [mscorlib]System.String + IL_0096: dup + IL_0097: ldc.i4.3 + IL_0098: ldc.i4.4 + IL_0099: stloc.0 + IL_009a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_009f: ldc.i4.4 + IL_00a0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00a5: ldstr "_" + IL_00aa: ldloca.s V_0 + IL_00ac: constrained. [mscorlib]System.Int32 + IL_00b2: callvirt instance string [mscorlib]System.Object::ToString() + IL_00b7: ldstr "_" + IL_00bc: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00c1: stelem [mscorlib]System.String + IL_00c6: dup + IL_00c7: ldc.i4.4 + IL_00c8: ldc.i4.5 + IL_00c9: stloc.0 + IL_00ca: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00cf: ldc.i4.5 + IL_00d0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00d5: ldstr "_" + IL_00da: ldloca.s V_0 + IL_00dc: constrained. [mscorlib]System.Int32 + IL_00e2: callvirt instance string [mscorlib]System.Object::ToString() + IL_00e7: ldstr "_" + IL_00ec: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00f1: stelem [mscorlib]System.String + IL_00f6: call string [mscorlib]System.String::Concat(string[]) + IL_00fb: ret + }""" + + let test4Source = """ +let test4 () = + ss 5 + ss 6 + ss 7 + String.Concat(ss 8, ss 9) + ss 10 + "_50_" + "_60_" + String.Concat(ss 100, String.Concat(ss 101, ss 102), ss 103) + String.Concat([|"_104_";"_105_"|]) + ss 106 +""" + let test4IL = """.method public static string test4() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.s 13 + IL_0002: newarr [mscorlib]System.String + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.i4.5 + IL_000a: stloc.0 + IL_000b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0010: ldc.i4.5 + IL_0011: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0016: ldstr "_" + IL_001b: ldloca.s V_0 + IL_001d: constrained. [mscorlib]System.Int32 + IL_0023: callvirt instance string [mscorlib]System.Object::ToString() + IL_0028: ldstr "_" + IL_002d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0032: stelem [mscorlib]System.String + IL_0037: dup + IL_0038: ldc.i4.1 + IL_0039: ldc.i4.6 + IL_003a: stloc.0 + IL_003b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0040: ldc.i4.6 + IL_0041: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0046: ldstr "_" + IL_004b: ldloca.s V_0 + IL_004d: constrained. [mscorlib]System.Int32 + IL_0053: callvirt instance string [mscorlib]System.Object::ToString() + IL_0058: ldstr "_" + IL_005d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0062: stelem [mscorlib]System.String + IL_0067: dup + IL_0068: ldc.i4.2 + IL_0069: ldc.i4.7 + IL_006a: stloc.0 + IL_006b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0070: ldc.i4.7 + IL_0071: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0076: ldstr "_" + IL_007b: ldloca.s V_0 + IL_007d: constrained. [mscorlib]System.Int32 + IL_0083: callvirt instance string [mscorlib]System.Object::ToString() + IL_0088: ldstr "_" + IL_008d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0092: stelem [mscorlib]System.String + IL_0097: dup + IL_0098: ldc.i4.3 + IL_0099: ldc.i4.8 + IL_009a: stloc.0 + IL_009b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00a0: ldc.i4.8 + IL_00a1: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00a6: ldstr "_" + IL_00ab: ldloca.s V_0 + IL_00ad: constrained. [mscorlib]System.Int32 + IL_00b3: callvirt instance string [mscorlib]System.Object::ToString() + IL_00b8: ldstr "_" + IL_00bd: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00c2: stelem [mscorlib]System.String + IL_00c7: dup + IL_00c8: ldc.i4.4 + IL_00c9: ldc.i4.s 9 + IL_00cb: stloc.0 + IL_00cc: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00d1: ldc.i4.s 9 + IL_00d3: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00d8: ldstr "_" + IL_00dd: ldloca.s V_0 + IL_00df: constrained. [mscorlib]System.Int32 + IL_00e5: callvirt instance string [mscorlib]System.Object::ToString() + IL_00ea: ldstr "_" + IL_00ef: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00f4: stelem [mscorlib]System.String + IL_00f9: dup + IL_00fa: ldc.i4.5 + IL_00fb: ldc.i4.s 10 + IL_00fd: stloc.0 + IL_00fe: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0103: ldc.i4.s 10 + IL_0105: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_010a: ldstr "_" + IL_010f: ldloca.s V_0 + IL_0111: constrained. [mscorlib]System.Int32 + IL_0117: callvirt instance string [mscorlib]System.Object::ToString() + IL_011c: ldstr "_" + IL_0121: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0126: stelem [mscorlib]System.String + IL_012b: dup + IL_012c: ldc.i4.6 + IL_012d: ldstr "_50__60_" + IL_0132: stelem [mscorlib]System.String + IL_0137: dup + IL_0138: ldc.i4.7 + IL_0139: ldc.i4.s 100 + IL_013b: stloc.0 + IL_013c: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0141: ldc.i4.s 100 + IL_0143: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0148: ldstr "_" + IL_014d: ldloca.s V_0 + IL_014f: constrained. [mscorlib]System.Int32 + IL_0155: callvirt instance string [mscorlib]System.Object::ToString() + IL_015a: ldstr "_" + IL_015f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0164: stelem [mscorlib]System.String + IL_0169: dup + IL_016a: ldc.i4.8 + IL_016b: ldc.i4.s 101 + IL_016d: stloc.0 + IL_016e: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0173: ldc.i4.s 101 + IL_0175: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_017a: ldstr "_" + IL_017f: ldloca.s V_0 + IL_0181: constrained. [mscorlib]System.Int32 + IL_0187: callvirt instance string [mscorlib]System.Object::ToString() + IL_018c: ldstr "_" + IL_0191: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0196: stelem [mscorlib]System.String + IL_019b: dup + IL_019c: ldc.i4.s 9 + IL_019e: ldc.i4.s 102 + IL_01a0: stloc.0 + IL_01a1: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_01a6: ldc.i4.s 102 + IL_01a8: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01ad: ldstr "_" + IL_01b2: ldloca.s V_0 + IL_01b4: constrained. [mscorlib]System.Int32 + IL_01ba: callvirt instance string [mscorlib]System.Object::ToString() + IL_01bf: ldstr "_" + IL_01c4: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_01c9: stelem [mscorlib]System.String + IL_01ce: dup + IL_01cf: ldc.i4.s 10 + IL_01d1: ldc.i4.s 103 + IL_01d3: stloc.0 + IL_01d4: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_01d9: ldc.i4.s 103 + IL_01db: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01e0: ldstr "_" + IL_01e5: ldloca.s V_0 + IL_01e7: constrained. [mscorlib]System.Int32 + IL_01ed: callvirt instance string [mscorlib]System.Object::ToString() + IL_01f2: ldstr "_" + IL_01f7: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_01fc: stelem [mscorlib]System.String + IL_0201: dup + IL_0202: ldc.i4.s 11 + IL_0204: ldstr "_104__105_" + IL_0209: stelem [mscorlib]System.String + IL_020e: dup + IL_020f: ldc.i4.s 12 + IL_0211: ldc.i4.s 106 + IL_0213: stloc.0 + IL_0214: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0219: ldc.i4.s 106 + IL_021b: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0220: ldstr "_" + IL_0225: ldloca.s V_0 + IL_0227: constrained. [mscorlib]System.Int32 + IL_022d: callvirt instance string [mscorlib]System.Object::ToString() + IL_0232: ldstr "_" + IL_0237: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_023c: stelem [mscorlib]System.String + IL_0241: call string [mscorlib]System.String::Concat(string[]) + IL_0246: ret + }""" + + let test5Source = """ +let test5 () = + ss 5 + ss 6 + ss 7 + String.Concat(ss 8, ss 9) + ss 10 + "_50_" + "_60_" + String.Concat(ss 100, (let x = String.Concat(ss 101, ss 102) in Console.WriteLine(x);x), ss 103) + String.Concat([|"_104_";"_105_"|]) + ss 106 +""" + let test5IL = """.method public static string test5() cil managed + { + + .maxstack 9 + .locals init (int32 V_0, + string V_1) + IL_0000: ldc.i4.s 12 + IL_0002: newarr [mscorlib]System.String + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.i4.5 + IL_000a: stloc.0 + IL_000b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0010: ldc.i4.5 + IL_0011: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0016: ldstr "_" + IL_001b: ldloca.s V_0 + IL_001d: constrained. [mscorlib]System.Int32 + IL_0023: callvirt instance string [mscorlib]System.Object::ToString() + IL_0028: ldstr "_" + IL_002d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0032: stelem [mscorlib]System.String + IL_0037: dup + IL_0038: ldc.i4.1 + IL_0039: ldc.i4.6 + IL_003a: stloc.0 + IL_003b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0040: ldc.i4.6 + IL_0041: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0046: ldstr "_" + IL_004b: ldloca.s V_0 + IL_004d: constrained. [mscorlib]System.Int32 + IL_0053: callvirt instance string [mscorlib]System.Object::ToString() + IL_0058: ldstr "_" + IL_005d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0062: stelem [mscorlib]System.String + IL_0067: dup + IL_0068: ldc.i4.2 + IL_0069: ldc.i4.7 + IL_006a: stloc.0 + IL_006b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0070: ldc.i4.7 + IL_0071: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0076: ldstr "_" + IL_007b: ldloca.s V_0 + IL_007d: constrained. [mscorlib]System.Int32 + IL_0083: callvirt instance string [mscorlib]System.Object::ToString() + IL_0088: ldstr "_" + IL_008d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0092: stelem [mscorlib]System.String + IL_0097: dup + IL_0098: ldc.i4.3 + IL_0099: ldc.i4.8 + IL_009a: stloc.0 + IL_009b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00a0: ldc.i4.8 + IL_00a1: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00a6: ldstr "_" + IL_00ab: ldloca.s V_0 + IL_00ad: constrained. [mscorlib]System.Int32 + IL_00b3: callvirt instance string [mscorlib]System.Object::ToString() + IL_00b8: ldstr "_" + IL_00bd: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00c2: stelem [mscorlib]System.String + IL_00c7: dup + IL_00c8: ldc.i4.4 + IL_00c9: ldc.i4.s 9 + IL_00cb: stloc.0 + IL_00cc: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00d1: ldc.i4.s 9 + IL_00d3: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00d8: ldstr "_" + IL_00dd: ldloca.s V_0 + IL_00df: constrained. [mscorlib]System.Int32 + IL_00e5: callvirt instance string [mscorlib]System.Object::ToString() + IL_00ea: ldstr "_" + IL_00ef: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00f4: stelem [mscorlib]System.String + IL_00f9: dup + IL_00fa: ldc.i4.5 + IL_00fb: ldc.i4.s 10 + IL_00fd: stloc.0 + IL_00fe: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0103: ldc.i4.s 10 + IL_0105: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_010a: ldstr "_" + IL_010f: ldloca.s V_0 + IL_0111: constrained. [mscorlib]System.Int32 + IL_0117: callvirt instance string [mscorlib]System.Object::ToString() + IL_011c: ldstr "_" + IL_0121: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0126: stelem [mscorlib]System.String + IL_012b: dup + IL_012c: ldc.i4.6 + IL_012d: ldstr "_50__60_" + IL_0132: stelem [mscorlib]System.String + IL_0137: dup + IL_0138: ldc.i4.7 + IL_0139: ldc.i4.s 100 + IL_013b: stloc.0 + IL_013c: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0141: ldc.i4.s 100 + IL_0143: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0148: ldstr "_" + IL_014d: ldloca.s V_0 + IL_014f: constrained. [mscorlib]System.Int32 + IL_0155: callvirt instance string [mscorlib]System.Object::ToString() + IL_015a: ldstr "_" + IL_015f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0164: stelem [mscorlib]System.String + IL_0169: dup + IL_016a: ldc.i4.8 + IL_016b: ldc.i4.s 101 + IL_016d: stloc.0 + IL_016e: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0173: ldc.i4.s 101 + IL_0175: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_017a: ldstr "_" + IL_017f: ldloca.s V_0 + IL_0181: constrained. [mscorlib]System.Int32 + IL_0187: callvirt instance string [mscorlib]System.Object::ToString() + IL_018c: ldstr "_" + IL_0191: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0196: ldc.i4.s 102 + IL_0198: stloc.0 + IL_0199: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_019e: ldc.i4.s 102 + IL_01a0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01a5: ldstr "_" + IL_01aa: ldloca.s V_0 + IL_01ac: constrained. [mscorlib]System.Int32 + IL_01b2: callvirt instance string [mscorlib]System.Object::ToString() + IL_01b7: ldstr "_" + IL_01bc: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_01c1: call string [mscorlib]System.String::Concat(string, + string) + IL_01c6: stloc.1 + IL_01c7: ldloc.1 + IL_01c8: call void [mscorlib]System.Console::WriteLine(string) + IL_01cd: ldloc.1 + IL_01ce: stelem [mscorlib]System.String + IL_01d3: dup + IL_01d4: ldc.i4.s 9 + IL_01d6: ldc.i4.s 103 + IL_01d8: stloc.0 + IL_01d9: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_01de: ldc.i4.s 103 + IL_01e0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01e5: ldstr "_" + IL_01ea: ldloca.s V_0 + IL_01ec: constrained. [mscorlib]System.Int32 + IL_01f2: callvirt instance string [mscorlib]System.Object::ToString() + IL_01f7: ldstr "_" + IL_01fc: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0201: stelem [mscorlib]System.String + IL_0206: dup + IL_0207: ldc.i4.s 10 + IL_0209: ldstr "_104__105_" + IL_020e: stelem [mscorlib]System.String + IL_0213: dup + IL_0214: ldc.i4.s 11 + IL_0216: ldc.i4.s 106 + IL_0218: stloc.0 + IL_0219: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_021e: ldc.i4.s 106 + IL_0220: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0225: ldstr "_" + IL_022a: ldloca.s V_0 + IL_022c: constrained. [mscorlib]System.Int32 + IL_0232: callvirt instance string [mscorlib]System.Object::ToString() + IL_0237: ldstr "_" + IL_023c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0241: stelem [mscorlib]System.String + IL_0246: call string [mscorlib]System.String::Concat(string[]) + IL_024b: ret + }""" + + let test6Source = """ +let inline inlineStringConcat str1 str2 = str1 + str2 + +let test6 () = + inlineStringConcat (inlineStringConcat (ss 1) (ss 2)) (ss 3) + ss 4 +""" + let test6IL = """.method public static string test6() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0007: ldc.i4.1 + IL_0008: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_000d: ldstr "_" + IL_0012: ldloca.s V_0 + IL_0014: constrained. [mscorlib]System.Int32 + IL_001a: callvirt instance string [mscorlib]System.Object::ToString() + IL_001f: ldstr "_" + IL_0024: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0029: ldc.i4.2 + IL_002a: stloc.0 + IL_002b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0030: ldc.i4.2 + IL_0031: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0036: ldstr "_" + IL_003b: ldloca.s V_0 + IL_003d: constrained. [mscorlib]System.Int32 + IL_0043: callvirt instance string [mscorlib]System.Object::ToString() + IL_0048: ldstr "_" + IL_004d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0052: ldc.i4.3 + IL_0053: stloc.0 + IL_0054: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0059: ldc.i4.3 + IL_005a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_005f: ldstr "_" + IL_0064: ldloca.s V_0 + IL_0066: constrained. [mscorlib]System.Int32 + IL_006c: callvirt instance string [mscorlib]System.Object::ToString() + IL_0071: ldstr "_" + IL_0076: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_007b: ldc.i4.4 + IL_007c: stloc.0 + IL_007d: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0082: ldc.i4.4 + IL_0083: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0088: ldstr "_" + IL_008d: ldloca.s V_0 + IL_008f: constrained. [mscorlib]System.Int32 + IL_0095: callvirt instance string [mscorlib]System.Object::ToString() + IL_009a: ldstr "_" + IL_009f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00a4: call string [mscorlib]System.String::Concat(string, + string, + string, + string) + IL_00a9: ret + }""" + + let test7Source = """ +let test7 () = + let x = 1 + x.ToString() + x.ToString() + x.ToString() +""" + let test7IL = """.method public static string test7() cil managed + { + + .maxstack 5 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: ldloca.s V_0 + IL_0004: constrained. [mscorlib]System.Int32 + IL_000a: callvirt instance string [mscorlib]System.Object::ToString() + IL_000f: ldloca.s V_0 + IL_0011: constrained. [mscorlib]System.Int32 + IL_0017: callvirt instance string [mscorlib]System.Object::ToString() + IL_001c: ldloca.s V_0 + IL_001e: constrained. [mscorlib]System.Int32 + IL_0024: callvirt instance string [mscorlib]System.Object::ToString() + IL_0029: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_002e: ret + }""" + + let test8Source = """ +let test8 () = + let x = 1 + x.ToString() + x.ToString() + x.ToString() + x.ToString() +""" + let test8IL = """.method public static string test8() cil managed + { + + .maxstack 6 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: ldloca.s V_0 + IL_0004: constrained. [mscorlib]System.Int32 + IL_000a: callvirt instance string [mscorlib]System.Object::ToString() + IL_000f: ldloca.s V_0 + IL_0011: constrained. [mscorlib]System.Int32 + IL_0017: callvirt instance string [mscorlib]System.Object::ToString() + IL_001c: ldloca.s V_0 + IL_001e: constrained. [mscorlib]System.Int32 + IL_0024: callvirt instance string [mscorlib]System.Object::ToString() + IL_0029: ldloca.s V_0 + IL_002b: constrained. [mscorlib]System.Int32 + IL_0031: callvirt instance string [mscorlib]System.Object::ToString() + IL_0036: call string [mscorlib]System.String::Concat(string, + string, + string, + string) + IL_003b: ret + }""" + + let test9Source = """ +let test9 () = + let x = 1 + x.ToString() + x.ToString() + x.ToString() + x.ToString() + x.ToString() +""" + let test9IL = """.method public static string test9() cil managed + { + + .maxstack 6 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: ldc.i4.5 + IL_0003: newarr [mscorlib]System.String + IL_0008: dup + IL_0009: ldc.i4.0 + IL_000a: ldloca.s V_0 + IL_000c: constrained. [mscorlib]System.Int32 + IL_0012: callvirt instance string [mscorlib]System.Object::ToString() + IL_0017: stelem [mscorlib]System.String + IL_001c: dup + IL_001d: ldc.i4.1 + IL_001e: ldloca.s V_0 + IL_0020: constrained. [mscorlib]System.Int32 + IL_0026: callvirt instance string [mscorlib]System.Object::ToString() + IL_002b: stelem [mscorlib]System.String + IL_0030: dup + IL_0031: ldc.i4.2 + IL_0032: ldloca.s V_0 + IL_0034: constrained. [mscorlib]System.Int32 + IL_003a: callvirt instance string [mscorlib]System.Object::ToString() + IL_003f: stelem [mscorlib]System.String + IL_0044: dup + IL_0045: ldc.i4.3 + IL_0046: ldloca.s V_0 + IL_0048: constrained. [mscorlib]System.Int32 + IL_004e: callvirt instance string [mscorlib]System.Object::ToString() + IL_0053: stelem [mscorlib]System.String + IL_0058: dup + IL_0059: ldc.i4.4 + IL_005a: ldloca.s V_0 + IL_005c: constrained. [mscorlib]System.Int32 + IL_0062: callvirt instance string [mscorlib]System.Object::ToString() + IL_0067: stelem [mscorlib]System.String + IL_006c: call string [mscorlib]System.String::Concat(string[]) + IL_0071: ret + }""" + + let sources = + [ + baseSource + test1Source + test2Source + test3Source + test4Source + test5Source + test6Source + test7Source + test8Source + test9Source + ] + let source = String.Join("", sources) + ILChecker.check source + [ + test1IL + test2IL + test3IL + test4IL + test5IL + test6IL + test7IL + test8IL + test9IL + ] diff --git a/tests/FSharp.Directory.Build.props b/tests/FSharp.Directory.Build.props new file mode 100644 index 0000000000..bb8eac309b --- /dev/null +++ b/tests/FSharp.Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Directory.Build.targets b/tests/FSharp.Directory.Build.targets new file mode 100644 index 0000000000..590214e9b0 --- /dev/null +++ b/tests/FSharp.Directory.Build.targets @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/projects/Directory.Build.props b/tests/projects/Directory.Build.props new file mode 100644 index 0000000000..bb5b23d29d --- /dev/null +++ b/tests/projects/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/Directory.Build.targets b/tests/projects/Directory.Build.targets new file mode 100644 index 0000000000..bb5b23d29d --- /dev/null +++ b/tests/projects/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props new file mode 100644 index 0000000000..bb8eac309b --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets new file mode 100644 index 0000000000..ccd47cc0a9 --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/misc/Directory.Build.props b/tests/projects/misc/Directory.Build.props new file mode 100644 index 0000000000..056d355249 --- /dev/null +++ b/tests/projects/misc/Directory.Build.props @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tests/projects/misc/Directory.Build.targets b/tests/projects/misc/Directory.Build.targets new file mode 100644 index 0000000000..056d355249 --- /dev/null +++ b/tests/projects/misc/Directory.Build.targets @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj index 43aa06b77c..b1a44ceda7 100644 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj +++ b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj @@ -1,83 +1,15 @@  - - + + - Debug - AnyCPU - 2.0 - 9eda4075-e1e5-4f51-8908-5d608c092254 - Exe - ProjectWithBuildErrors - ProjectWithBuildErrors - v4.5.2 - true + net452 4.4.1.0 - ProjectWithBuildErrors - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + - - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - \ No newline at end of file + + diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config deleted file mode 100644 index 4db38eab9c..0000000000 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj index 2bbd1c6f28..090a7331af 100644 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj +++ b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj @@ -1,81 +1,17 @@  - - + + - Debug - AnyCPU - 2.0 - e72ee9de-323e-4f99-8d7e-1a1ed8a3477c - Library - Library2 - Library2 - v4.5.2 + net452 4.4.1.0 - true - Library2 - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - RELEASE;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + Class.fs - - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - \ No newline at end of file + + diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config deleted file mode 100644 index 4db38eab9c..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj index 5215c45575..f8ab90c783 100644 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj +++ b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj @@ -1,90 +1,19 @@  - - + + - Debug - AnyCPU - 2.0 - df29450f-abd7-49fb-96c5-c9cae9a54f40 - Exe - ConsoleApplication1 - ConsoleApplication1 - v4.5.2 - true + net452> 4.4.1.0 - SameFileBelongsToMultipleProjects - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - True - - - - - + + - - Library2 - {e72ee9de-323e-4f99-8d7e-1a1ed8a3477c} - True - + - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file + + diff --git a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj index a69c8f4efe..7b711f6166 100644 --- a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj +++ b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj @@ -1,77 +1,14 @@  - - + + - Debug - AnyCPU - 2.0 - 9f36577a-657b-4117-a118-f69ab182aa31 - Library - Library1AlwaysInMatchingConfiguration - Library1AlwaysInMatchingConfiguration - v4.5.2 + net452 4.4.1.0 - true - Library1AlwaysInMatchingConfiguration - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - RELEASE;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - - \ No newline at end of file + + diff --git a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config deleted file mode 100644 index 4db38eab9c..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj index a39259e191..7b711f6166 100644 --- a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj +++ b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj @@ -1,78 +1,14 @@  - - + + - Debug - AnyCPU - 2.0 - e72ee9de-323e-4f99-8d7e-1a1ed8a3477c - Library - Library2AlwaysInDebugConfiguration - Library2AlwaysInDebugConfiguration - v4.5.2 + net452 4.4.1.0 - true - Library2AlwaysInDebugConfiguration - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - RELEASE;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + - - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - \ No newline at end of file + + diff --git a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config deleted file mode 100644 index 4db38eab9c..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj b/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj index 1428be0568..3c5f9cd080 100644 --- a/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj +++ b/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj @@ -1,96 +1,20 @@  - - + + - Debug - AnyCPU - 2.0 - df29450f-abd7-49fb-96c5-c9cae9a54f40 - Exe - ConsoleApplication1 - ConsoleApplication1 - v4.5.2 - true + net452 4.4.1.0 - TestProjectChanges - - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - True - - - - - + + - - Library1AlwaysInMatchingConfiguration - {9f36577a-657b-4117-a118-f69ab182aa31} - True - - - Library2AlwaysInDebugConfiguration - {e72ee9de-323e-4f99-8d7e-1a1ed8a3477c} - True - + + - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - + diff --git a/tests/scripts/update-baselines.fsx b/tests/scripts/update-baselines.fsx new file mode 100644 index 0000000000..389517a9c3 --- /dev/null +++ b/tests/scripts/update-baselines.fsx @@ -0,0 +1,83 @@ +open System +open System.IO + +// this script is usefull for tests using a .bsl file (baseline) containing expected compiler output +// which is matched against .vserr or .err file aside once the test has run +// the script replaces all the .bsl/.bslpp with either .err or .vserr + +let diff path1 path2 = + let result = System.Text.StringBuilder() + let append s = result.AppendLine s |> ignore + + if not <| File.Exists(path1) then failwithf "Invalid path %s" path1 + if not <| File.Exists(path2) then failwithf "Invalid path %s" path2 + + let lines1 = File.ReadAllLines(path1) + let lines2 = File.ReadAllLines(path2) + + let minLines = min lines1.Length lines2.Length + + for i = 0 to (minLines - 1) do + + let normalizePath line = line + let line1 = normalizePath lines1.[i] + let line2 = normalizePath lines2.[i] + + if not (line1.Contains "// MVID") && + not (line1.Contains "// Image base:") && + not (line1.Contains ".line") && + not (line1.Contains " .ver ") && + not (line1.Contains "// Offset:") then + if line1 <> line2 then + append <| sprintf "diff between [%s] and [%s]" path1 path2 + append <| sprintf "line %d" (i+1) + append <| sprintf " - %s" line1 + append <| sprintf " + %s" line2 + + if lines1.Length <> lines2.Length then + append <| sprintf "diff between [%s] and [%s]" path1 path2 + append <| sprintf "diff at line %d" minLines + lines1.[minLines .. (lines1.Length - 1)] |> Array.iter (append << sprintf "- %s") + lines2.[minLines .. (lines2.Length - 1)] |> Array.iter (append << sprintf "+ %s") + + result.ToString() + +let fsdiff actualFile expectedFile = + let errorText = System.IO.File.ReadAllText actualFile + + let result = diff expectedFile actualFile + if result <> "" then + printfn "%s" result + + result + +let directories = + [ + "../fsharp/typecheck/sigs" + "../fsharp/typeProviders/negTests" + "../fsharpqa/Source" + ] + |> List.map (fun d -> Path.Combine(__SOURCE_DIRECTORY__, d) |> DirectoryInfo) + +let extensionPatterns = ["*.bsl"; "*.vsbsl"; "*.il.bsl"] +for d in directories do + for p in extensionPatterns do + for bslFile in d.GetFiles (p, SearchOption.AllDirectories) do + let baseLineFileName = bslFile.FullName + if not (baseLineFileName.EndsWith("bslpp")) then + let errFileName = + if baseLineFileName.EndsWith "vsbsl" then Path.ChangeExtension(baseLineFileName, "vserr") + elif baseLineFileName.EndsWith "il.bsl" then baseLineFileName.Replace("il.bsl", "il") + else Path.ChangeExtension(baseLineFileName, "err") + let baseLineFile = FileInfo(baseLineFileName) + let errFile = FileInfo(errFileName) + //let baseLineFilePreProcess = FileInfo(Path.ChangeExtension(errFile.FullName, "bslpp")) + + if baseLineFile.Exists && errFile.Exists then + + //printfn "consider %s and %s" baseLineFile.FullName errFileName + if fsdiff errFileName baseLineFileName <> "" then + + printfn "%s not matching, replacing with %s" baseLineFileName errFileName + if not (fsi.CommandLineArgs |> Array.contains "-n") then + errFile.CopyTo(baseLineFileName, true) |> ignore diff --git a/tests/service/CSharpProjectAnalysis.fs b/tests/service/CSharpProjectAnalysis.fs index a8b300abac..1aea1c82ef 100644 --- a/tests/service/CSharpProjectAnalysis.fs +++ b/tests/service/CSharpProjectAnalysis.fs @@ -30,8 +30,8 @@ open FSharp.Compiler.Service.Tests.Common let ``Test that csharp references are recognized as such`` () = let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" let _, table = getProjectReferences("""module M""", [csharpAssembly]) - let ass = table.["CSharp_Analysis"] - let search = ass.Contents.Entities |> Seq.tryFind (fun e -> e.DisplayName = "CSharpClass") + let assembly = table.["CSharp_Analysis"] + let search = assembly.Contents.Entities |> Seq.tryFind (fun e -> e.DisplayName = "CSharpClass") Assert.True search.IsSome let found = search.Value // this is no F# thing diff --git a/tests/service/Common.fs b/tests/service/Common.fs index 0b60faa11a..589bcb3528 100644 --- a/tests/service/Common.fs +++ b/tests/service/Common.fs @@ -109,7 +109,7 @@ let mkProjectCommandLineArgsSilent (dllName, fileNames) = yield "--noframework" yield "--debug:full" yield "--define:DEBUG" -#if NETCOREAPP2_0 +#if NETCOREAPP yield "--targetprofile:netcore" #endif yield "--optimize-" @@ -212,17 +212,18 @@ let parseAndCheckScript (file, input) = | FSharpCheckFileAnswer.Succeeded(res) -> parseResult, res | res -> failwithf "Parsing did not finish... (%A)" res -let parseSourceCode (name: string, code: string) = - let location = Path.Combine(Path.GetTempPath(),"test"+string(hash (name, code))) - try Directory.CreateDirectory(location) |> ignore with _ -> () +let parseSource (source: string) = + let location = Path.GetTempFileName() + let filePath = Path.Combine(location, ".fs") + let dllPath = Path.Combine(location, ".dll") - let projPath = Path.Combine(location, name + ".fsproj") - let filePath = Path.Combine(location, name + ".fs") - let dllPath = Path.Combine(location, name + ".dll") let args = mkProjectCommandLineArgs(dllPath, [filePath]) let options, errors = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) - let parseResults = checker.ParseFile(filePath, code, options) |> Async.RunSynchronously - parseResults.ParseTree + let parseResults = checker.ParseFile(filePath, source, options) |> Async.RunSynchronously + + match parseResults.ParseTree with + | Some parseTree -> parseTree + | None -> failwithf "Expected there to be a parse tree for source:\n%s" source /// Extract range info let tups (m:Range.range) = (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn) @@ -248,6 +249,9 @@ let attribsOfSymbol (s:FSharpSymbol) = if v.IsVolatile then yield "volatile" if v.IsStatic then yield "static" if v.IsLiteral then yield sprintf "%A" v.LiteralValue.Value + if v.IsAnonRecordField then + let info, tys, i = v.AnonRecordFieldDetails + yield "anon(" + string i + ", [" + info.Assembly.QualifiedName + "/" + String.concat "+" info.EnclosingCompiledTypeNames + "/" + info.CompiledName + "]" + String.concat "," info.SortedFieldNames + ")" | :? FSharpEntity as v -> diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index d097c71065..91990f95b7 100755 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -36,12 +36,17 @@ open Microsoft.FSharp.Compiler.SourceCodeServices open FSharp.Compiler.Service.Tests.Common let stringMethods = - ["Chars"; "Clone"; "CompareTo"; "Contains"; "CopyTo"; "EndsWith"; "Equals"; - "GetEnumerator"; "GetHashCode"; "GetType"; "GetTypeCode"; "IndexOf"; - "IndexOfAny"; "Insert"; "IsNormalized"; "LastIndexOf"; "LastIndexOfAny"; + ["Chars"; "Clone"; "CompareTo"; "Contains"; "CopyTo"; + "EndsWith"; "Equals"; "GetEnumerator"; "GetHashCode"; "GetType"; "GetTypeCode"; + "IndexOf"; "IndexOfAny"; "Insert"; "IsNormalized"; "LastIndexOf"; "LastIndexOfAny"; "Length"; "Normalize"; "PadLeft"; "PadRight"; "Remove"; "Replace"; "Split"; "StartsWith"; "Substring"; "ToCharArray"; "ToLower"; "ToLowerInvariant"; - "ToString"; "ToUpper"; "ToUpperInvariant"; "Trim"; "TrimEnd"; "TrimStart"] + "ToString"; "ToUpper"; "ToUpperInvariant"; "Trim"; "TrimEnd"; "TrimStart"; ] + +// opening System introduces these methods, and some samples here, do this and then assert +// on the string methods, so here we adjust the 'expected' list to include the new methods +let stringMethodsWhenSystemNamespaceOpened = + ["AsMemory"; "AsSpan"] @ stringMethods let input = """ @@ -63,6 +68,12 @@ let ``Intro test`` () = let identToken = FSharpTokenTag.IDENT // let projectOptions = checker.GetProjectOptionsFromScript(file, input) |> Async.RunSynchronously + // So we check that the messages are the same + for msg in typeCheckResults.Errors do + printfn "Got an error, hopefully with the right text: %A" msg + + printfn "typeCheckResults.Errors.Length = %d" typeCheckResults.Errors.Length + // We only expect one reported error. However, // on Unix, using filenames like /home/user/Test.fsx gives a second copy of all parse errors due to the // way the load closure for scripts is generated. So this returns two identical errors @@ -433,8 +444,7 @@ let _ = printf " %*a" 3 (fun _ _ -> ()) 2 typeCheckResults.GetFormatSpecifierLocationsAndArity() |> Array.map (fun (range,numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) |> shouldEqual - [|(2, 45, 2, 47, 1); (3, 23, 3, 25, 1); (4, 38, 4, 40, 1); (5, 27, 5, 29 -, 1); + [|(2, 45, 2, 47, 1); (3, 23, 3, 25, 1); (4, 38, 4, 40, 1); (5, 27, 5, 29, 1); (6, 17, 6, 20, 2); (7, 17, 7, 22, 1); (8, 17, 8, 23, 1); (9, 18, 9, 22, 1); (10, 18, 10, 21, 1); (12, 12, 12, 15, 1); (15, 12, 15, 15, 1); (16, 28, 16, 30, 1); (18, 30, 18, 32, 1); (19, 30, 19, 32, 1); @@ -1093,7 +1103,7 @@ let _ = RegexTypedStatic.IsMatch<"ABC" >( (*$*) ) // TEST: no assert on Ctrl-sp File.WriteAllText(fileName1, fileSource1) let fileLines1 = File.ReadAllLines(fileName1) let fileNames = [fileName1] - let args = Array.append (mkProjectCommandLineArgs (dllName, fileNames)) [| "-r:" + PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll") |] + let args = Array.append (mkProjectCommandLineArgs (dllName, fileNames)) [| "-r:" + PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") |] let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) let cleanFileName a = if a = fileName1 then "file1" else "??" diff --git a/tests/service/FscTests.fs b/tests/service/FscTests.fs index 82914dbdba..553f5e468b 100644 --- a/tests/service/FscTests.fs +++ b/tests/service/FscTests.fs @@ -48,7 +48,7 @@ type PEVerifier () = Some ("pedump", "--verify all") else let peverifyPath configuration = - Path.Combine(__SOURCE_DIRECTORY__, "..", "fsharpqa", "testenv", "src", "PEVerify", "bin", configuration, "net46", "PEVerify.exe") + Path.Combine(__SOURCE_DIRECTORY__, "..", "..", "artifacts", "bin", "PEVerify", configuration, "net46", "PEVerify.exe") let peverify = if File.Exists(peverifyPath "Debug") then peverifyPath "Debug" else peverifyPath "Release" diff --git a/tests/service/InteractiveCheckerTests.fs b/tests/service/InteractiveCheckerTests.fs index fba9adcb63..136505b6dd 100644 --- a/tests/service/InteractiveCheckerTests.fs +++ b/tests/service/InteractiveCheckerTests.fs @@ -54,11 +54,7 @@ let internal identsAndRanges (input: Ast.ParsedInput) = | Ast.ParsedInput.SigFile _ -> [] let internal parseAndExtractRanges code = - let file = "Test" - let result = parseSourceCode (file, code) - match result with - | Some tree -> tree |> identsAndRanges - | None -> failwith "fail to parse..." + parseSource code |> identsAndRanges let input = """ diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index 60c936fbf2..5ea55a4050 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -3811,6 +3811,10 @@ let ``Test Project26 parameter symbols`` () = let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Class") let objEntity = objSymbol.Symbol :?> FSharpEntity + let rec isByRef (ty: FSharpType) = + if ty.IsAbbreviation then isByRef ty.AbbreviatedType + else ty.IsNamedType && ty.NamedEntity.IsByRef + // check we can get the CurriedParameterGroups let objMethodsCurriedParameterGroups = [ for x in objEntity.MembersFunctionsAndValues do @@ -3823,14 +3827,14 @@ let ``Test Project26 parameter symbols`` () = if p.IsOptionalArg then yield "optional" } |> String.concat "," - yield x.CompiledName, p.Name, p.Type.ToString(), attributeNames ] + yield x.CompiledName, p.Name, p.Type.ToString(), isByRef p.Type, attributeNames ] objMethodsCurriedParameterGroups |> shouldEqual - [("M1", Some "arg1", "type 'c", ""); - ("M1", Some "arg2", "type 'd Microsoft.FSharp.Core.option", "optional"); - ("M2", Some "arg1", "type 'a", "params"); - ("M2", Some "arg2", "type 'b", "optional"); - ("M3", Some "arg", "type Microsoft.FSharp.Core.byref", "out")] + [("M1", Some "arg1", "type 'c", false, ""); + ("M1", Some "arg2", "type 'd Microsoft.FSharp.Core.option", false, "optional"); + ("M2", Some "arg1", "type 'a", false, "params"); + ("M2", Some "arg2", "type 'b", false, "optional"); + ("M3", Some "arg", "type Microsoft.FSharp.Core.byref", true, "out")] // check we can get the ReturnParameter let objMethodsReturnParameter = @@ -5044,6 +5048,101 @@ let ``Test Project40 all symbols`` () = ("IsItAnAMethod", ((13, 25), (13, 40)), ["member"; "funky"]); ("g", ((13, 4), (13, 5)), ["val"]); ("M", ((2, 7), (2, 8)), ["module"])] +//-------------------------------------------- + +module internal Project41 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + // We need to us a stable name to keep the hashes stable + let base2 = Path.Combine(Path.GetDirectoryName(Path.GetTempFileName()), "stabletmp.tmp") + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + + let data1 = {| X = 1 |} + + // Types can be written with the same syntax + let data2 : {| X : int |} = data1 + + type D = {| X : int |} + + // Access is as expected + let f1 (v : {| X : int |}) = v.X + + // Access is as expected + let f2 (v : D) = v.X + + // Access can be nested + let f3 (v : {| X: {| X : int; Y : string |} |}) = v.X.X + + """ + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test project41 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project41.options) |> Async.RunSynchronously + let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + let allSymbolUsesInfo = + [ for s in allSymbolUses do + let pos = + match s.Symbol.DeclarationLocation with + | Some r when r.FileName = Project41.fileName1 -> r.StartLine, r.StartColumn + | _ -> (0,0) + yield (s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol, pos) ] + allSymbolUsesInfo |> shouldEqual + [("X", ((4, 19), (4, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (4, 19)); + ("data1", ((4, 8), (4, 13)), ["val"], (4, 8)); + ("int", ((7, 23), (7, 26)), ["abbrev"], (0, 0)); + ("X", ((7, 19), (7, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (7, 19)); + ("data1", ((7, 32), (7, 37)), ["val"], (4, 8)); + ("data2", ((7, 8), (7, 13)), ["val"], (7, 8)); + ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); + ("X", ((9, 16), (9, 17)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); + ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); + ("X", ((9, 16), (9, 17)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); + ("D", ((9, 9), (9, 10)), ["abbrev"], (9, 9)); + ("int", ((12, 23), (12, 26)), ["abbrev"], (0, 0)); + ("X", ((12, 19), (12, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); + ("v", ((12, 12), (12, 13)), [], (12, 12)); + ("v", ((12, 33), (12, 34)), [], (12, 12)); + ("X", ((12, 33), (12, 36)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); + ("f1", ((12, 8), (12, 10)), ["val"], (12, 8)); + ("D", ((15, 16), (15, 17)), ["abbrev"], (9, 9)); + ("v", ((15, 12), (15, 13)), [], (15, 12)); + ("v", ((15, 21), (15, 22)), [], (15, 12)); + ("X", ((15, 21), (15, 24)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); + ("f2", ((15, 8), (15, 10)), ["val"], (15, 8)); + ("int", ((18, 29), (18, 32)), ["abbrev"], (0, 0)); + ("string", ((18, 38), (18, 44)), ["abbrev"], (0, 0)); + ("X", ((18, 25), (18, 26)), + ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); + ("Y", ((18, 34), (18, 35)), + ["field"; "anon(1, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 34)); + ("X", ((18, 19), (18, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); + ("v", ((18, 12), (18, 13)), [], (18, 12)); + ("v", ((18, 54), (18, 55)), [], (18, 12)); + ("X", ((18, 56), (18, 57)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); + ("X", ((18, 54), (18, 59)), + ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); + ("f3", ((18, 8), (18, 10)), ["val"], (18, 8)); + ("M", ((2, 7), (2, 8)), ["module"], (2, 7))] + module internal ProjectBig = open System.IO diff --git a/tests/service/ServiceUntypedParseTests.fs b/tests/service/ServiceUntypedParseTests.fs index d47acf69de..ccda4f5bac 100644 --- a/tests/service/ServiceUntypedParseTests.fs +++ b/tests/service/ServiceUntypedParseTests.fs @@ -40,14 +40,12 @@ let private (=>) (source: string) (expected: CompletionContext option) = match markerPos with | None -> failwithf "Marker '%s' was not found in the source code" Marker | Some markerPos -> - match parseSourceCode("C:\\test.fs", source) with - | None -> failwith "No parse tree" - | Some parseTree -> - let actual = UntypedParseImpl.TryGetCompletionContext(markerPos, parseTree, lines.[Line.toZ markerPos.Line]) - try Assert.AreEqual(expected, actual) - with e -> - printfn "ParseTree: %A" parseTree - reraise() + let parseTree = parseSource source + let actual = UntypedParseImpl.TryGetCompletionContext(markerPos, parseTree, lines.[Line.toZ markerPos.Line]) + try Assert.AreEqual(expected, actual) + with e -> + printfn "ParseTree: %A" parseTree + reraise() module AttributeCompletion = [] diff --git a/tests/service/StructureTests.fs b/tests/service/StructureTests.fs index f24948890f..c98027c4ca 100644 --- a/tests/service/StructureTests.fs +++ b/tests/service/StructureTests.fs @@ -40,27 +40,23 @@ let (=>) (source: string) (expectedRanges: (Range * Range) list) = let getRange (r: range) = (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn) - let ast = parseSourceCode(fileName, source) - + let tree = parseSource source try - match ast with - | Some tree -> - let actual = - Structure.getOutliningRanges lines tree - |> Seq.filter (fun sr -> sr.Range.StartLine <> sr.Range.EndLine) - |> Seq.map (fun sr -> getRange sr.Range, getRange sr.CollapseRange) - |> Seq.sort - |> List.ofSeq - let expected = List.sort expectedRanges - if actual <> expected then - failwithf "Expected %s, but was %s" (formatList expected) (formatList actual) - | None -> failwithf "Expected there to be a parse tree for source:\n%s" source + let actual = + Structure.getOutliningRanges lines tree + |> Seq.filter (fun sr -> sr.Range.StartLine <> sr.Range.EndLine) + |> Seq.map (fun sr -> getRange sr.Range, getRange sr.CollapseRange) + |> Seq.sort + |> List.ofSeq + let expected = List.sort expectedRanges + if actual <> expected then + failwithf "Expected %s, but was %s" (formatList expected) (formatList actual) with _ -> - printfn "AST:\n%+A" ast + printfn "AST:\n%+A" tree reraise() [] -let ``empty file``() = "" => [ (1, 0, 2, 0), (1, 0, 2, 0) ] +let ``empty file``() = "" => [] [] let ``nested module``() = @@ -68,8 +64,7 @@ let ``nested module``() = module MyModule = () """ - => [ (1, 0, 4, 0), (1, 0, 4, 0) - (2, 0, 3, 6), (2, 15, 3, 6) ] + => [ (2, 0, 3, 6), (2, 15, 3, 6) ] [] let ``module with multiline function``() = @@ -78,8 +73,7 @@ module MyModule = let foo() = foo() """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 13), (2, 15, 4, 13) + => [ (2, 0, 4, 13), (2, 15, 4, 13) (3, 4, 4, 13), (3, 13, 4, 13) (3, 8, 4, 13), (3, 13, 4, 13) ] @@ -91,8 +85,7 @@ type Color = | Green | Blue """ - => [ (1, 0, 6, 0), (1, 0, 6, 0) - (2, 5, 5, 10), (2, 11, 5, 10) + => [ (2, 5, 5, 10), (2, 11, 5, 10) (3, 4, 5, 10), (3, 4, 5, 10) ] [] @@ -107,8 +100,7 @@ type Color = member __.Dispose() = (docEventListener :> IDisposable).Dispose() """ - => [ (1, 0, 10, 0), (1, 0, 10, 0) - (2, 5, 9, 55), (2, 11, 9, 55) + => [ (2, 5, 9, 55), (2, 11, 9, 55) (3, 4, 5, 10), (3, 4, 5, 10) (7, 4, 9, 55), (7, 25, 9, 55) (8, 15, 9, 55), (8, 27, 9, 55) @@ -128,8 +120,7 @@ type Color = (docEventListener :> IDisposable).Dispose() """ => - [ (1, 0, 11, 0), (1, 0, 11, 0) - (2, 5, 10, 55), (2, 11, 10, 55) + [ (2, 5, 10, 55), (2, 11, 10, 55) (3, 4, 4, 14), (3, 4, 4, 14) (3, 6, 4, 13), (3, 6, 4, 13) (8, 4, 10, 55), (8, 25, 10, 55) @@ -147,8 +138,7 @@ type Color() = // 2 foo() () // 8 """ - => [ (1, 0, 9, 0), (1, 0, 9, 0) - (2, 5, 8, 10), (2, 11, 8, 10) + => [ (2, 5, 8, 10), (2, 11, 8, 10) (3, 8, 4, 10), (3, 13, 4, 10) (6, 4, 8, 10), (6, 6, 8, 10) ] @@ -182,8 +172,7 @@ module MyModule = // 2 member __.Dispose() = (docEventListener :> IDisposable).Dispose() """ - => [ (1, 0, 28, 0), (1, 0, 28, 0) - (2, 0, 27, 63), (2, 15, 27, 63) + => [ (2, 0, 27, 63), (2, 15, 27, 63) (4, 4, 5, 10), (4, 13, 5, 10) (4, 8, 5, 10), (4, 13, 5, 10) (7, 9, 15, 59), (7, 15, 15, 59) @@ -228,8 +217,7 @@ open H open G open H """ - => [ (1, 0, 26, 6), (1, 0, 26, 6) - (2, 5, 3, 6), (2, 5, 3, 6) + => [ (2, 5, 3, 6), (2, 5, 3, 6) (5, 0, 19, 17), (5, 8, 19, 17) (8, 9, 9, 10), (8, 9, 9, 10) (11, 4, 14, 17), (11, 12, 14, 17) @@ -263,8 +251,7 @@ let x = 1 "c" #r "d" """ - => [ (1, 0, 23, 6), (1, 0, 23, 6) - (2, 3, 8, 6), (2, 3, 8, 6) + => [ (2, 3, 8, 6), (2, 3, 8, 6) (11, 3, 23, 6), (11, 3, 23, 6) ] [] @@ -277,8 +264,7 @@ let f x = // 2 () // 6 x // 7 """ - => [ (1, 0, 8, 0), (1, 0, 8, 0) - (2, 0, 7, 5), (2, 7, 7, 5) + => [ (2, 0, 7, 5), (2, 7, 7, 5) (2, 4, 7, 5), (2, 7, 7, 5) (3, 8, 6, 10), (3, 11, 6, 10) (4, 12, 5, 14), (4, 13, 5, 14) ] @@ -296,11 +282,31 @@ match None with // 2 let x = () // 9 () // 10 """ - => [ (1, 0, 11, 0), (1, 0, 11, 0) - (2, 0, 10, 10), (2, 15, 10, 10) + => [ (2, 0, 10, 10), (2, 15, 10, 10) (6, 4, 10, 10), (5, 6, 10, 10) (6, 4, 10, 10), (6, 19, 10, 10) (9, 8, 10, 10), (8, 10, 10, 10) ] + +[] +let ``matchbang``() = + """ +async { // 2 + match! async { return None } with // 3 + | Some _ -> // 4 + () // 5 + | None -> // 6 + match None with // 7 + | Some _ -> () // 8 + | None -> // 9 + let x = () // 10 + () // 11 +} // 12 +""" + => [ (2, 0, 12, 1), (2, 7, 12, 0) + (3, 4, 11, 14), (3, 37, 11, 14) + (7, 8, 11, 14), (6, 10, 11, 14) + (7, 8, 11, 14), (7, 23, 11, 14) + (10, 12, 11, 14), (9, 14, 11, 14) ] [] let ``computation expressions``() = @@ -313,8 +319,7 @@ seq { // 2 yield () } // 7 } // 8 """ - => [ (1, 0, 8, 1), (1, 0, 8, 1) - (2, 0, 8, 1), (2, 5, 8, 0) + => [ (2, 0, 8, 1), (2, 5, 8, 0) (4, 8, 5, 10), (4, 11, 5, 10) (6, 4, 7, 18), (6, 4, 7, 18) (6, 11, 7, 18), (6, 16, 7, 17) ] @@ -326,8 +331,7 @@ let _ = [ 1; 2 3 ] """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 9), (2, 5, 4, 9) + => [ (2, 0, 4, 9), (2, 5, 4, 9) (2, 4, 4, 9), (2, 5, 4, 9) (3, 4, 4, 9), (3, 5, 4, 8) ] @@ -338,8 +342,7 @@ let _ = { new System.IDisposable with member __.Dispose() = () } """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 34), (2, 5, 4, 34) + => [ (2, 0, 4, 34), (2, 5, 4, 34) (2, 4, 4, 34), (2, 5, 4, 34) (3, 4, 4, 34), (3, 28, 4, 34) ] @@ -354,8 +357,7 @@ with _ -> // 5 () // 7 () // 8 """ - => [ (1, 0, 9, 0), (1, 0, 9, 0) - (2, 0, 5, 0), (2, 3, 5, 0) + => [ (2, 0, 5, 0), (2, 3, 5, 0) (2, 0, 8, 6), (2, 3, 8, 6) (3, 8, 4, 10), (3, 11, 4, 10) (5, 0, 8, 6), (5, 4, 8, 6) @@ -373,8 +375,7 @@ finally // 5 () // 7 () // 8 """ - => [ (1, 0, 9, 0), (1, 0, 9, 0) - (2, 0, 8, 6), (2, 3, 8, 6) + => [ (2, 0, 8, 6), (2, 3, 8, 6) (3, 8, 4, 10), (3, 11, 4, 10) (5, 0, 8, 6), (5, 7, 8, 6) (6, 8, 7, 10), (6, 11, 7, 10) ] @@ -391,8 +392,7 @@ else () () """ - => [ (1, 0, 10, 0), (1, 0, 10, 0) - (2, 0, 9, 6), (2, 7, 9, 6) + => [ (2, 0, 9, 6), (2, 7, 9, 6) (2, 8, 5, 6), (2, 12, 5, 6) (3, 8, 4, 10), (3, 11, 4, 10) (7, 8, 8, 10), (7, 11, 8, 10) ] @@ -404,8 +404,7 @@ let ``code quotation``() = "code" @> """ - => [ (1, 0, 4, 10), (1, 0, 4, 10) - (2, 0, 4, 10), (2, 2, 4, 8) ] + => [ (2, 0, 4, 10), (2, 2, 4, 8) ] [] let ``raw code quotation``() = @@ -414,8 +413,7 @@ let ``raw code quotation``() = "code" @@> """ - => [ (1, 0, 4, 11), (1, 0, 4, 11) - (2, 0, 4, 11), (2, 3, 4, 8) ] + => [ (2, 0, 4, 11), (2, 3, 4, 8) ] [] let ``match lambda aka function``() = @@ -424,8 +422,7 @@ function | 0 -> () () """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 10), (2, 8, 4, 10) + => [ (2, 0, 4, 10), (2, 8, 4, 10) (3, 8, 4, 10), (3, 3, 4, 10) ] [] @@ -436,8 +433,7 @@ let matchwith num = | 0 -> () () """ - => [ (1, 0, 6, 0), (1, 0, 6, 0) - (2, 0, 5, 13), (2, 17, 5, 13) + => [ (2, 0, 5, 13), (2, 17, 5, 13) (2, 4, 5, 13), (2, 17, 5, 13) (3, 4, 5, 13), (3, 18, 5, 13) (4, 11, 5, 13), (4, 7, 5, 13) ] @@ -449,8 +445,7 @@ for x = 100 downto 10 do () () """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 6), (2, 0, 4, 6) ] + => [ (2, 0, 4, 6), (2, 0, 4, 6) ] [] let ``for each``() = @@ -459,8 +454,7 @@ for x in 0 .. 100 -> () () """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 14), (2, 0, 4, 14) + => [ (2, 0, 4, 14), (2, 0, 4, 14) (2, 18, 4, 14), (2, 18, 4, 14) ] [] @@ -470,8 +464,7 @@ let ``tuple``() = , 322 , 123123 ) """ - => [ (1, 0, 4, 10), (1, 0, 4, 10) - (2, 2, 4, 8), (2, 2, 4, 8) ] + => [ (2, 2, 4, 8), (2, 2, 4, 8) ] [] let ``do!``() = @@ -480,8 +473,7 @@ do! printfn "allo" printfn "allo" """ - => [(1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 18), (2, 3, 4, 18)] + => [ (2, 0, 4, 18), (2, 3, 4, 18) ] [] let ``cexpr yield yield!``() = @@ -495,11 +487,10 @@ cexpr{ } } """ - => [(1, 0, 9, 5), (1, 0, 9, 5) - (2, 0, 9, 5), (2, 6, 9, 4) - (3, 4, 8, 17), (3, 4, 8, 17) - (4, 8, 8, 17), (4, 14, 8, 16) - (5, 20, 7, 26), (5, 20, 7, 26)] + => [ (2, 0, 9, 5), (2, 6, 9, 4) + (3, 4, 8, 17), (3, 4, 8, 17) + (4, 8, 8, 17), (4, 14, 8, 16) + (5, 20, 7, 26), (5, 20, 7, 26) ] [] let ``XML doc comments``() = @@ -517,8 +508,7 @@ module M = /// Single line comment let f x = x """ - => [ (1, 0, 14, 0), (1, 0, 14, 0) - (2, 0, 3, 10), (2, 0, 3, 10) + => [ (2, 0, 3, 10), (2, 0, 3, 10) (4, 0, 13, 15), (4, 8, 13, 15) (5, 4, 6, 14), (5, 4, 6, 14) (7, 9, 11, 19), (7, 11, 11, 19) @@ -540,8 +530,7 @@ module M = // Single line comment let f x = x """ - => [ (1, 0, 14, 0), (1, 0, 14, 0) - (2, 0, 3, 9), (2, 0, 3, 9) + => [ (2, 0, 3, 9), (2, 0, 3, 9) (4, 0, 13, 15), (4, 8, 13, 15) (5, 4, 6, 13), (5, 4, 6, 13) (7, 9, 11, 19), (7, 11, 11, 19) @@ -560,8 +549,7 @@ let ``XML doc and regular comments in one block``() = /// Line 8 /// Line 9 """ - => [ (1, 0, 11, 0), (1, 0, 11, 0) - (2, 0, 3, 9), (2, 0, 3, 9) + => [ (2, 0, 3, 9), (2, 0, 3, 9) (4, 0, 5, 10), (4, 0, 5, 10) (7, 0, 10, 10), (7, 0, 10, 10) ] @@ -574,9 +562,45 @@ module M = 'c', 1) """ - => [ (1, 0, 7, 0), (1, 0, 7, 0) - (2, 0, 6, 14), (2, 8, 6, 14) + => [ (2, 0, 6, 14), (2, 8, 6, 14) (3, 4, 6, 14), (3, 9, 6, 14) (3, 8, 6, 14), (3, 9, 6, 14) (4, 8, 6, 14), (4, 25, 6, 14) (5, 12, 6, 13), (5, 12, 6, 13) ] + +[] +let ``Top level module`` () = + """ +module TopLevelModule + +module Nested = + let x = 123 +""" + => [ (2, 7, 5, 15), (2, 21, 5, 15) + (4, 0, 5, 15), (4, 13, 5, 15) ] + +[] +let ``Top level namespace`` () = + """ +namespace TopLevelNamespace.Another + +module Nested = + let x = 123 +""" + => [ (4, 0, 5, 15), (4, 13, 5, 15) ] + +[] +let ``Multiple namespaces`` () = + """ +namespace TopLevelNamespace.Another + +module Nested = + let x = 123 + +namespace AnotherTopLevel.Nested + +module NestedModule = + let x = 123 +""" + => [ (4, 0, 5, 15), (4, 13, 5, 15) + (9, 0, 10, 15), (9, 19, 10, 15) ] diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 8b5749f054..da2a779557 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -100,4 +100,27 @@ module Mod2 = mod1val1.XmlDocSig |> shouldEqual "P:Mod1.val1" mod2func2.XmlDocSig |> shouldEqual "M:Mod1.Mod2.func2" - \ No newline at end of file + +module Attributes = + [] + let ``Emit conditional attributes`` () = + let source = """ +open System +open System.Diagnostics + +[] +type FooAttribute() = + inherit Attribute() + +[] +let x = 123 +""" + let fileName, options = mkTestFileAndOptions source [| "--noconditionalerasure" |] + let _, checkResults = parseAndCheckFile fileName source options + + checkResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.tryFind (fun su -> su.Symbol.DisplayName = "x") + |> Option.orElseWith (fun _ -> failwith "Could not get symbol") + |> Option.map (fun su -> su.Symbol :?> FSharpMemberOrFunctionOrValue) + |> Option.iter (fun symbol -> symbol.Attributes.Count |> shouldEqual 1) diff --git a/tests/service/TokenizerTests.fs b/tests/service/TokenizerTests.fs index 4973d398f2..84b95e5175 100644 --- a/tests/service/TokenizerTests.fs +++ b/tests/service/TokenizerTests.fs @@ -20,7 +20,7 @@ open System.IO let sourceTok = FSharpSourceTokenizer([], Some "C:\\test.fsx") -let rec parseLine(line: string, state: int64 ref, tokenizer: FSharpLineTokenizer) = seq { +let rec parseLine(line: string, state: FSharpTokenizerLexState ref, tokenizer: FSharpLineTokenizer) = seq { match tokenizer.ScanToken(!state) with | Some(tok), nstate -> let str = line.Substring(tok.LeftColumn, tok.RightColumn - tok.LeftColumn + 1) @@ -31,7 +31,7 @@ let rec parseLine(line: string, state: int64 ref, tokenizer: FSharpLineTokenizer state := nstate } let tokenizeLines (lines:string[]) = - [ let state = ref 0L + [ let state = ref FSharpTokenizerLexState.Initial for n, line in lines |> Seq.zip [ 0 .. lines.Length-1 ] do let tokenizer = sourceTok.CreateLineTokenizer(line) yield n, parseLine(line, state, tokenizer) |> List.ofSeq ] diff --git a/tests/service/TreeVisitorTests.fs b/tests/service/TreeVisitorTests.fs new file mode 100644 index 0000000000..e81d140011 --- /dev/null +++ b/tests/service/TreeVisitorTests.fs @@ -0,0 +1,22 @@ +module Tests.Service.TreeVisitorTests + +open FSharp.Compiler.Service.Tests.Common +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.SourceCodeServices.AstTraversal +open NUnit.Framework + +[] +let ``Visit type test`` () = + let visitor = + { new AstVisitorBase<_>() with + member x.VisitExpr(_, _, defaultTraverse, expr) = defaultTraverse expr + member x.VisitType(_, _) = Some () } + + let source = "123 :? int" + let parseTree = parseSource source + + Traverse(mkPos 1 11, parseTree, visitor) + |> Option.defaultWith (fun _ -> failwith "Did not visit type") + + Traverse(mkPos 1 3, parseTree, visitor) + |> Option.iter (fun _ -> failwith "Should not visit type") diff --git a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj index 4f88e4a787..4fc4184b23 100644 --- a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj +++ b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj @@ -1,58 +1,11 @@  - - + + - Debug - AnyCPU - {887630A3-4B1D-40EA-B8B3-2D842E9C40DB} - Library - Properties - CSharp_Analysis - CSharp_Analysis - v4.5 - ..\..\..\..\ - ..\..\..\..\$(Configuration)\net40\bin - 512 - + net45 + 1.0.0.0 + nunit + $(NoWarn);0067;1591 - - true - full - false - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - ..\..\..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll - True - True - - - - - \ No newline at end of file + + diff --git a/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs b/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs index 6c36814e76..641372fb96 100644 --- a/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs +++ b/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs @@ -2,35 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("CSharp_Analysis")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("CSharp_Analysis")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - // Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar // für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von // COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. [assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("e1b15939-475d-4134-a76c-20845e07be39")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/service/data/Directory.Build.props b/tests/service/data/Directory.Build.props new file mode 100644 index 0000000000..bb8eac309b --- /dev/null +++ b/tests/service/data/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/service/data/Directory.Build.targets b/tests/service/data/Directory.Build.targets new file mode 100644 index 0000000000..ccd47cc0a9 --- /dev/null +++ b/tests/service/data/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/service/data/FSharp.Data.DesignTime.dll b/tests/service/data/FSharp.Data.DesignTime.dll index fca7289ce562acdd1a3c88b34cd6f31d21fc376e..db2a3317bbc7c85fc26c767fe3390f33ab738eb2 100644 GIT binary patch literal 2305024 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

CAw+gU#zaUekUJrH(D6 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

kE3gw0bXM3-N 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%0Dx7$gUDt8h7>JB7;uEg27CNJ|P0RekZ|cdF`1 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 z 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�BeuH7Y)#lKJ8|p%R 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%0DDdE2Hz0>wkmb4?@Td3pr&FF1_J9ktkgmoR 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 b9;E{RyFTBp<}Ft*%>CcR_W$QrB=CO#d3Z8u literal 714240 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

Z&KF)G?rgRW(_P<1^n&~)D5k#m|u{;(WsEVb2j z&2Z!xgVs9V$O0NyIO1!Hgy&byM=~;xY?JOW%bc?@5p^7>qY;C;R%KHFOo-8h#|Im_A{_6;C@ao3H4HI=`fY_T&`|Ct z&Prgc#q0``nSN0o41ptogZN-9_whE;d%P)y7H>v@$D7H9%!xCK)SHu&E2KG&`X>pUXL5>TABWP2$bSU2iXftRPp%&5? zhOJq}o12x{R>&bg4_=tLLgoI@tN@ZNc(%dtQ(I1KZc~k)%9aOQ@M^8ACgg8!@YQht zqORc0&CM3GXZV{68!(B6{i9H6VHoDeHs)A{nL3py;R51G)lwo}Bg(Q+EwOQ?D@sxu zW`=Xq9R{07pe8KRYiclbc=IwnD5Y8y5IUzfFE=wiGe+kTR*z;D&*s!}n4goL6Qj$H z(Pf#s{0vWeevB?JMu%qO&G(oUN4%{!KPw-hqwqs5ran7PpC$F){OpW$kE(U4$q+R( zNkikY@|>ZH7p)Vs1-gzJTG4C1;Gf_5Mgz3FIMfWsA&j#v(VtORZ)8iGSYK6C*=W} z+l)bXL`zAnH!~{}X+kcKVE1SKu*`ZSe@C`K4lo%)mxF*ao$&7={NRVVJ=be3-^3zRY|Jts%iY5@kOoGeip3YZ3&ROd#wEU%g2Z}gek z5-b!bj<(cSGb7OCx0y&D(`I1g-Skr!!k`F&#R!9XpUu7OKsE#Jo#oNyW=x3w+7T^r z3~@=LuikIx@lXM57WR6wWCtY|tV31UZFA5R?5Qv{<9&_(a5LtXvHo~I*bwop^c(V> zDJrC;AYar4{0+6}C}2uxzVl{zcnqQ8bmSbc8^i}- zTrF?**ANe?Ldo*v$;$jocRAeNGc(ayGA*UYQexIZZz2a6FXVWFp^SpJX_VJ&^qMTi zoEr^WOX568bEOZxWB!Hr{HAzk1}H8oyjS zP?FAge?-KX%XvNrHI${=J*kcPpVY)~5Ra9Umu~hNQsYq()7%*D$lMy-XvU{p)3?Q7 zJiVD7nn~l$GOQ*cTa71=J0_2_q|CFHuxKJM<`Yk>v0Qn|$`Nt$p}9n&76H|ghtl!- zgiojkdo^h`5o(pV`dNXJ~Nk^=@S%S=u#_!lc4Xw2l~=B1WXjps{w(0irR+28Oc<(NKdIZHMZWk|PxqEt_N_ zWK!f|mNXQ3VBU>ptn8G3VzkIa&DD8%;I>Ggk0C~dgQUv#l$Qhki!6~xj|`hsG9*$- zmaG6wiJH)5Wy@^A}$)L_{Ds869Els5=W#H{Fh{%XBCU`_Yb1l!1L}W9} z%s|sM+I}WA-CQ+7^XgH$a-D8^Pq!_1rgJMp6EnNFH#67hE}0lLkRcgOmIqlf`c76h z;xwFP1}d8pebzEZzcn=IOj#n(RO_GP_2g%m z#`)Rkt%e(Da_yQN(*sQohO2@s2ue0hfnAfYvOvWfR(S{CgRW#`F3tvwV<Zsis8)Wsdd{pe-dTSTJ^Zb{)oH7M({a{tAOgy+5LKnfV-gs0GcES_(v- zf`2&K$8I>teN53Wb{C>BT+)QqWPb=uFmhmObF;k|3do=sTwSBD0df|!N&{oLVS^zc z8yaIzhD!lnutHRU-8l@X&3)`@f<2n3-64m&V@nN=)$yeVa#heD5pHk z>(tPwX?elI*>t=rVAJPOLT!2o#94N|2dgfWXv|dOu%+sy@i$8-#-^l9@D?IRW^)8d zE|bdhbbkZZnXzX_y`>fgSe`<|p5({!MF>l`*0LHVt-3%c93cl7ud`!x)VSCd>^ErUk~ zr8NVa9sP3X9g^aYz}F-!pKsD#MXweAWIv!UJsIG7}DU4 zm1qyxh1Nzk&z3txZMcNDycmtm1KGi;TwIJu?-*V%f5e+*dOcEbrVU%(mX$LHqya1= zLj3W7%fhG|L{6dPf_cn5#XauOnp%zRU)rS}KN2)q)HID(g5S@V%mf zXHY{-uWZ7a(M)uC59%b=YJ#!=Z-N9G9!%4ig-Xj5_1LCs#N4*InMkAFjF_0oDfLA# z&SAVK(ZkM7Wg8RJ=mrd6X#H|6s|ZW0;H-E@)bg7vEH!m>QwOOc%cg@=Zqw1|Z@9$j z7>0aHmk9<6`QfrQ#*7gyG(X`)4El*&u%bbvEnBJ@S=d$pHs26gV#2mt$rUOyV4GDI z4a723Zu)ks9IO;ugGMHI(RdRyjW{=G5wRw*dWf0X;#~AbUO1!Rt)bdru3}B?O~4B| z#?~Ud*)+$+7!ZdM+a$fM8YxWRtuU;XE%K=hEFHCXlY^uE1F}^79T+<77m$I$(0MYb zjTxLA3yd}$Bq-<%#?F&T$+dBIo-COV=IA__HcPNz8sZ%(Pj-$RwPbIUJK<&`!3ddY z!VGO`h~vzsC`^768pUPOJZvQfV!tgVD5H98Mk(eJ9JX2Us#4T?WI=)IPo=(QZ1wQC z$_+>Ia_Ynvrh3R4jp2GshFB&sRUSiys13$33o<9A%hG3CvoyG8Lw>;0Dfr|}IuE5z z`&lAlSgx9fiN(j3SE=7el9Cs*3<(g_xiBx*@J3uDfHOrESe2mCXk`Q;Dq2l`%u{D! zZ+?DThLo^q6DIeV17p;eG45cKMxGtY5?ER1@|oZZgiv5d_Co1lTk8yt3N1JHNETFb zaejEe79$@qQb)3q7INxUaTMgVWk}7nJ`{|CftKzhrx<6H9q)#E5X)<^S>X|G{siLr z>1akKcV3?qXEL*Cc*EHfEFM5q&CH=*X4i^9cog_T5`!R9QNlO|vz{n@uuy_xoH18+ zTkg^IRZ`=9&=}vQ4=hl$ZIO+UzfB)Gm;~Ci$isYKh(fb*8WM-ODDU8-l^jJQ!C;t1 z8+;*a&pb?ryZmzmPPF0BU|F3!3pkqU2{JU6YqMy~JxR!B7krx_H_chfv_`{_EoWp6V=T?l~kjpDCw2B@U^T**Vl0Q@& zs1HP_N+Ec*HbPa+ucWh(>>@WtLw4hWvz1+5j0SdC?Vxi^5FDUEAIBLA*7LB5&Kt&= zJ};KaAfMo1#ROlt#@9gW3|~ zE^A&vtt(fyv0ItQ0i2j-IffY%3Su?K1 zM+gfQ(56iW)*$83j_Cq(fjQDEt(afdfN#vU@@EvQ0B#${bV^{%Z^Sv z%O+UFJG1pT5=gQwmJ6itfgCFvHix*REJ~V6vF#ITk;b&#O8zj-hRVYqQ~e$aN>c5g970ru459`PnhM(%*cv2!LgxMX5eTb zNAQVy@`{EL7YsaMW0R^|9=ngXrm1;0PI{rWfp^P`^c(wH-FEo4&@n~FB%G#fdl5rVs}W}CU?iz3WuJ{N zPdG-~pp_=NXn}oP3c8T$w8+=cPz_O3l(1Iq8^k(gR+6qo*o{eiv+HxI9mT|emSods z3tyB^UD@|>!?GA6d@wJIwkl~R;~OC(=QM#WrIn3%lU8p2I%E{(--sXUZ)n4RnMzvk z{Tr?XM$4L+=tq5v#sIY4>hQu3W(wKsJ z|)=o(5->yXb4A?!1v<} zyB~EyEiKLrs|$unX|PG|^T(RxXA7_@5XKQ|d4n&^3wCHetqqyMKjMvs!Tko0A6bFJ zuZ@1lP%{Uq+YrNNWe?6k9m*>bg%Q+wbu@xareTouW?|rpJ(E)G=g~U$u0%z4c1BJ{ z6;5`KXn|L+U>S({LfQ6+dk@v&{2UlppNiOwN(`nGIYNnYYE~btT%iGCXCs91#!R{8 z(auS>%0Ya9bXYUybU7!g33A`$Kv*tzSRosU@z<&AlV%B31R@Q7%b^i17}{Dax3sn} zj(CDmZf)7BD2(8UD{5t_5>*`V)i(vhe3G1RV%AgZumYE6C^)(Ugo~TFQ)J}bJWwC+ z+8=@-P>JhobP=Yt0H2HTW?0qg_68jNrtU4(TAy zfC>%mzbR5j7QV>z931DtmMhL&jq}g)H(1wy*p+l-oEMJuNyGN6AZ~|LRdLObAk=_+ zi=#1dqc>B53#p*nuYNHO(^Aw|Z(CV|Q@(Xau83nY4z!~IBZ*x!{Yf>31jk+rg34KcI&k{_Ci*ZtQT<(hI6ms-pdK*2q@*YNJwk*%I=KF z$j*q6m<_N$#`95hrcPchV4jOPP&pLHIb)K)4yzP0pDHF)Fs_%G z6B49%^N1ZKZDeCJ?oV4?v)Etf!;TfCbjjb!(B-ZsHd~M>nq9y^S1E>%l!Z}Tn51hu zSY1LNLV41n3L39XC!NdDho?GTLsWT3qYu$YNP)$tUhcvvhZx~vIJ!8lf)6wW(PEK) zzC3Joml@zoRg!DC;aTMq#>9a|6Jn4dgi)bQ0%Ea*vAMi!1w zRLAgh-0qBWB+hX}6kGVH2U$nVOd3YTej3*7{G}@4I3p4zZQkkrPdP%K5d!}c4L6{# z@!JQ3D`sGun^=5NSZCEq=@*-o58~1mLC=>jU6WRJzS`5is0Y^cGGyxUR_czkF;Rb0GDlf z0x=i7sG-uhXkBBn?Mk6itR2<}7PZm-iEH7U8|{Ek0oyW!*m2R#+~#7nS{g-~0vLFM zQMwW>|P|?C=c}rt84oa)gIRo~PRVLWTXe?A(Xj&QA zAF&qgRqpJ5DTk~_;S+Z-Dimy#>%PY2Kr&S(aSV;chL|ckwMPrnbd|U|I7fLsL5kw}1+M1ah(!>QJ?b|Rk!;~&eEfpe?Ykv6o5Qrt}(GbKXxqy-|ZREqH zIk1$-fu#gYpK0LJ;7>hbnUd6bw2;yHLK zSN#5Y(Ll(r9zF2a$}9C2Ls5cza>mm;kPp!)BsE&8*&N6iX|!Bdp%=1kL{tU&1SI4W znRc5a9!aX?wK($6C5*4Fe5$Z14yKI41Iq!s)`dlp%b+clnL;pFr{mx$GtfNvgy}#C zM!RM;T>i;Ux4;%caJJoRG4ApiLDP#y;N)>#9xR-aIq`@K^PYy#X%*%8pcK1EEVE28 zxL_Eymk%Y5GQ&2cFl|*akr|g8DU_KkBUwc3hs%sq(#+^Q{CE)=v%+R7SvG#w$Y#n3 zp=XZN%2fr8td&TzdAQSjwR26l%bNN)2{UNk=k1sjg~9 z^94socL3o)`mVxbAN*zjm$5BOV{|lR7UJ1uJcd{lwmoXaTd2X2;KSv1I97Y;nKcYK zB(RXUgI>%NIh$koSdK&GKDt~Vdvpv7QaHH6!Z#gsVR=aM028n{h?nEAKaYpMtZrn> z7vE0#0Xig<9y zMq!&+6_)4Kv3|@_7G`2PErVSn1j8(Qjfg--oQ;KVI(0*5(rV?Qf5|Rk@ht406bweB zRxUS42dd)P1wxaCbkIzyMnd*z4hO<4#e*%w2E2S*Obvczby(SuPUY!7sg^B+104t9 z5T|2=e-3UXW3LbYtz?N*)OKS8NGcm8wm>X2+S(jiVU(|iS#>7GKYyqc%MiYLTV+Dn z97VFzXzTDW-8P`W!iyXyX_7+D5Gu7#S(-9gmcAVIZ=_MW@EKZ6M%XM;%Lrw4 zDEeq4L~(QcrBA_3HA?aTVywx^Y@Nr>n$+Pu4#rb&iLp1suq&l_H&N$(Aqy7M#lg$J$6hmwSoA zwl^!z@H0n(RI43d)E2kwFwK(kbxiil1sQ57!@(YUQc{_j54hA~hnpWRp;TfsZ*Ge@ zt*hF%fQbRo_q)@gR9F&&<$rO_>l}=T4Ru;l|bAopc({0asPWRAD z6gDQH4R1E*agHPOG$!X6ftZCVdDa*cv(WI?2ftksJ3mh`-X4v)86OkE-}lCBZ;W3n zc3X-5gOu2PQ3+T%wQJBIea(T0uc3&fiH;HIhJ0>pEcLzlxO|#YQUqp+IHqoCP)m-+)aF>?_eL ztii@&ANn>q+7&GO7WiwNJ zQ<$F7!i{`rjd!ogG40|>v2nDJCU6ji7B;ZYLrY5&=^>txv#{NP`Khd_s3Cw^r<}Gh zA!A8*b=As$UA0_}IK%kXATSXB21Q#ChBJKeBsH=vUjPGA~kne)Ec7^hkVm6%?GNcdVxiDI3z|9eG zXVML#F-=tTRGK6PQ-M#wcA;E0!R`?DXi;CB8P1&bSY0WKkl%{Ygj zf8-5CuNu%l^=5BPvbFucgwW=UcEpN7s*l`w|7kMX3ds_Otyxq^Y1-sf?a!Pa`Qc5o zi$MP5LnVLv$xc2rB8B3A=n)4t_yuOKl1XF{bHP6}p z?SfEY84d2A=0UCpiYi~I9?u!mg)S>8w%YxNCBp%QIn+#g>X66#|33m&VG(CaNj4tp z`P-#sq@`>&Ee=&Rt8oGx@NiWnIQhI9}8jx-67CNgfk|w5ov4PRNpoyt@ zOK&8L!d5jxDyj}<9BkQ!x#3!70tRY2HXb6y1W$}6F-@YD9}C4S@b@~td@_{B_J8W9 zjdZ|B2FT2mOiB@$MEbjee;B;sjksr9nExbKW)SsqUPMSFw8+0i;1psGMzU}~)n*Zv zg-h!sYT*F}f3q~L;7QWA1`R@vlfQgL=H~E^wGlKL8BQxgXg1BQWSJUcI9(J!)avA4uX42-HhW=}7@J64_`-Bcyk_JxN-1Mwl+Y7~A{C za|KEy!!cXAsI4~eN6{mEvf5}B(s*ME>q*$U#U>7lrzxx&2F0R`xR=^uBr7(Ns@l70+8Xd`8op|Qvq>e-zY@Pjo&IU^_C_MZD4((-> zH8tQr0F2QU`BZ76!lQK2X$|DeDhe4fcnT7e<`;%3G33xV4G`zj(&C{9!wtEYX9+E9 z4p$mlMKRh>FGA2#2#Hz|o9p?88QIU5E847NQI=IC4YEQW@s&!s70+tLdXjnqHd`8T z9>DfKhL}IuM~_WlmAbLI7O!iYEt$&L^gz#7umf^RHnf_N#VXnpvBW)k(t-lvsEs`* z-ej4t{--T2igErrwQCcopAoVCe`XS0u;EY)A;eY`{c5nwg2#9>_!tXvVEMDTqQ9;y zMCWMp-);m36w{*hs1X;p(LhyAnI3KCy!9HyO#z&Vp*o>{#*6Z!{CHuDa)PH6@Y)96 zG@s;$Fo3_1X)74|Cmy~dV%cJS>pbhvb&v#hgCb}mUQXT{!e1A0ndIQvBs@Jw8zm#@ zK2X>)#+Ahx7(nBV@qQr=bzuKY{h3X*ua@T*Y%gJJj%H6ZnHem}AO@0R@M4JZTsti` ztJCfL?1%kdV2qj&=hY}^F%{1*o;R%>8d5#D*a&$bziVuC`S2jG?uC`Y+JjSFQ*i$N{)`g zqxz6*u(IKY)qV;OPbhzz7MwTjNK%>6krmknDq3)k4g_Y_$~X8S@r3QB>Np>@VeTi`G>>iR#@|S_ zGDpe6vC;QzeH{U zPg>XvV68%uR!YOZ5U$}KN*Hk*(ukFK=a`Nz3H-|%Hm;f0qTz{P^|{<-{n+6b%{4ey zCU?WRPl5O2ZE||3R?vgaG8WzmwzT8GEg8;vxf#<%c!q6jlagUfA!euM^ctp=1Pm<3 zHiYc#G)>7FnNIZt&4n9!;56O(M<^C!QQMO9QcD~k2Ew@PN&nC#=#}KKygo&7M6qg(*Y@a% zcRckGs+TX$<2{d1y?itu@3n;L@svQFIcA@0ta#Zf*2qJ;6l6JK+GauPJt zwjVZ#yNxW592m@sQ79Hq{^wpL(}L^MNFKN;PHh!lO|&!~ekfB;B&b@v^%APbi&f2F zIk+5*v#zu#G}HFZV3^Lw%#yeI@U{oNn}*p{-XXI#PdFUrfw*3A97jYB z&^UNGk_~XMeiFnxHOZki<=QZ~K+~{%Mljk?3sGA>Gc0pqWllaf2)PiqiE#9l|D2VE zBx980%TjdGNZxoVRFaX!T12@q(L4G|_Ovl4Hd8D_f?HA5TM?8kDhrRsXLCMfC`^?V z9u}c_LH+LxO12cRnOJ)_R4QaCSCmY}>4Dl>+_;jaT)u__uQHS_3>`U<+qH%}PMOrG zz$hwPfVI3jsqCbNBce@CI?RTS6*AY4kuam~*b%xHALgZsgq=~~;P5C5il?iMJ?ak| zbl&rDG0)&9pdg?0w~&DvIr?+UFrvc$q+z_Pk^h>7Q?RP_$jrtj!5f*k_=*_VK=e4uhghKUd4F^7&LE>sCIX0btV9Z~l% zdJD#znSMG49_vo^DRy30&7(oIsTNBR=uGO5&5$EgCF{e~VxYpD*FepSLNGtlnKF{= z8C+SGQo6A8#7?2C*%kQQ|=^5J5(u$*8iA3~EEI=z9) z@x~Zg9@)99H)Ba2H7*Tsk(~sQm7$lM$r%Ozs#VB zvC?EUjn;o9YHpk%<~XO+DG@n;THC^LOm8p)LYz3hj0Fu_qTpSYD3%K4Wdxc1MjUQY zbwCYQ#zGN-zf>M#{=qNS1(F~g#r@A8xuQViS$$Nx3|Edwcw3rt)WFBN&{^?bEVUqe z(B_FAN;jmiBmcRdDjybzDOk?9(YdU0r;3P4k?&7R&*lv$RIrnU!)iWy_+3@!5sDp2 zA)mxJ5~Ud}gARwYBuj@tA!C<-z!8Q=Tw$6eh~>t`IZ)#k9H~iAF5x!IKA>eU$O7g( zR>Fw9OA|vyUZn}CAOon2&MhK}hkrB41Wxgu6))ZK-}a5e3n6%>fjM8}ul!gXAO^@} z|M4d$#(TXcb3{*}U?tFY6EnhVu6V-`e_GB*-;41muv+ty3)JSNzF2GQRQl(X)lu5P z`qKV4JgJiH5?M52UqF7oNb7)`E$VcKnzQ{L)mwYYK7%P#&pRlxI>J z0n{J>T3ev7LmV}t@DcB4u&##7k#zkE|Ncu`H*m^skV?ypf+Z<68jkrlLS>}l=XVyl zj#M;c9v>B%#YCs}?QI)w<@Wtl`{t?_W#3?Ku9`b>mJ!x;$y9B=M(x|5_>*bd@ltx$ zxlZx#lQV?e$o1l{K1Mdp3g9&sy6{Ln)}}>G1z5zkqT_x|8ETyeGF97_vAc}6olJIP z&uazVOTfDoa>EMgQ=B@|!5jwd^6~&+o}7S<8r#)efWZi%%Drc>c=Vs(>QQ6%NFm^8 z;3PjTd0;Ufo4XOYBs|H-FOq?knB{8-)S8RnmMnE14Y{(ROD_}_Np*D7lA4#See<5o zV5ChsudQp4x4(FjCJVVC7~__W;9#&^42kVyc!&{EfOVA{c({Fm0nU#J0$rC_sR_P% ze{pbjQv_t_cO?fBSHsFr476BjvHya)Mz}ozAu$ou^Ju$J@Oq4C}0Yh|M@i z(-VgcK7m5U)F!V9nx)f*38pS`i%im?cbXebmEqku4z0e1F=|@1FU|*ejhILSMwOV6 zS|&!MHD;uy$_kw_Y@F*i!=NgZnX`&A#uENzOHfP4rq&3ULa-beDIrrc;~cc9vwJj( zf}F<{$7nf&7t#Y!G+^*-h_5Xi=|jvmu6kZykJNgLV1;A8qd*TlaO{d;ZR$C?1kJ zN93UuSurKkaTLqfmSj0r5~Xo%S(0P5@gugJI1}eev`9&eDU#;HmJ@p}AL=Ve0UL-f zoPmu|0U0*|QjCj>Vy1u!Oo7he2Dk+ppuxD9DbNcvz%8a1m;h5??jIMJ&v&i;`2Ef~ zr0mqOsq_2o*V=2Zz1G@mul@MhuRiS%7$LvW$~g?MV6yU!LsSXhMqo|GSPjbLfHEGR zvt7&v;n0A#~6xpk$ zFLy6|qN=KEo81w*pWK^kR62qSQ4~CK7A=Mo^c3Xg+B$t>A^QMfv&vU0@h8VGB!&-{ z*hR;-A|5_w=Vu4BD5J$m4?P*kC3exNZI~4zF4>WX;JW?1CLHlomm#UJLxw(nM3IJR z9_R9mM|5A;6WT5`^Rli_my=kG8Fp5ky28C@v#-iV^ecImv3H)H=7v(af5QhNi}On_ zLlb=)qI%<%>~+4E5iZ=Ynr**ISWmwH*!?(1*}tN`^#pyZQ0Ed4;f~iGqBrlrBoVTJSn5uiij~n=@1o*=ad*j27~A+_8OuB z^qdePNDlRRQV3kKGo9%=CqqPQ3MT)HoM5HTF@`ZSJ*P4(1uW3z93uViW)>Jdmyhu8 z{*pBEF**y8S2Qze(sy_|<>6tzQPD#j9_E_~GW&gXSe**FZQu^~#>vZtyO|TqlJ&d= zN{Xgu7Qb3mvLWA%t&Rk5xGr4N1}|=y@TG21NGpi2pl+~WDs_Hxaq1Di3ZmtgI1WV5 zzw^3%WX2>5?Z`!u`l97r{ET97ubsFw&k-m#(xrSNjeVWc4;iQ!+sNjo6V;vTOyBE1 z)p%UjjwC4K!DGpS)l` zd=DL|ge-ByDm9Lqw4Aow{(>d^hELG z1-rT76`gdpf_%ux&pn&wobp57TGn8$rA+>-tayfWouMDzeomXk>;QEf$>KqNJ_m%g z&ThKS2)9zwmb;*T_3^5>1jDIveK)D{S;r%M1pLu?be^v@1`jh|YU1m_^uBxET>JW+ z0}l6oJ~JcLWv7y#c*ZUjU|)yOa!-lz%2ShznrgvD;&LeteFLW8t6;XU6>{d8g7^&| zftHzMwQ4Cathhl~C-!SzNE=u>YrHSMryKR)W6w#`*%e^?v7z z$1lj*h-#)-m}Q#mIoXPZW35DAEY3Bqs}x@HI3vOxPjr4Y#5>(w4j#o>=&% zH}weRoFBamgAZem4a&KslGub+)tQYVnd`#Fb>#doq-XmK`1dV_{U#(fyG!{>0Il(I2p@!$AZrn^u;slC7pq{ z7m8@bJb(J^b4RrkDwsQRb1`6XIRZ@$l8N)f=uk-$tk5;eDpy#ru3(vI`>u8ou8ITY zh$qvRscZ!2(BoR7&UBXA)lL?;v+H|g$vCBXVGP7CagLr`I4eHVMYeDXwAM$rR>Bf+Ym| zwNp<%D%Mt4cb2rc_*JuzBYekzKD?$fHg?~Uz6KL)WOJ7~{G}-t_@~>#$J|1on#R(ZHQE#1^r_}Bbjz6%aRR`F5`fU`FygqZKIu2HpSFustf{3h zn#G;YK0uhpgqCPiCNuU0G^@T`;I}4Uo_xmKOfIT+({+$?K3{#L*eU}b&hDMu`}=5N z?@DFA`3Y`64|~`0>&fI!$B1>Cq4GsFt&PtF-?{G!IP?rV_c3)|J#=F6)rIBxi;I&B zm$(f3vExS`pPa+bp)ClEikj+4s-8XbsC~1}KDl8$e|(mMPk1BzI|`fvklhUr%0U0z z13`~nA}+kbT{C{AoBKFqu7@P^-fKoDAMsRhD!NDYB&U|ODel#%xMdbi<9*cinXLD- zjm2Y_4TPNO-j*1S1ko`E%^_!}9k#C&_1vGP3^bjyp1g2*?m;B{!)0XBjVs4}y+*j@ z^G{#{hpkOtVJYDZ$7z!1Mq`mIG&4JOJHxZf=b1ZCPO%bZ`;;vq20FfV7r&(zrt3@G zL5`KbEccOhn)WlCw>R?)pmCPC_}(HqAA%eZ@`Rrtum@Yz7}xQySw=!d5wY^pXr3GLjd6#%=0 z`xWp}Ybqd)$B(h8?4vAfP5IUPPp6Lr29`kGiXMz)A)+@JH5%V>`SWY?C5JEyxD*IG zFo=wA;dy#an51YA#x=MSfEX2vcZ9v1=v^wKUC$qA`N=l9m z#M&Z4<>YU-FCKK}vxTz?-CeKed{(Ux+XRAfXwKf%n^qoc-BYdi#y;*z?37NNb$XDbA zurH-7;vRuVaM9~CRpx+9Ls4`~YMnN!Omzo7J)5sCGI8KL15YjD5L=YzH08RY(fcf4aloaIj7aUC=b}X2&gys2S!{SuX2W?phk3;GqQ*|SW7M55 zn6s{!Us+}n;TL&XzdR#nkA8e)DY&YYk;Cx+vfluK`Oat~Bxz7r+@m-EE;&5!R!JHL zl5WTgQ>f`Hc8V#|Aplc<#VCz5SS+EKHA-N_aI6k7bUJNIbF9+WOgycZ$rkJsjCr=K zGH)>VO$kUqHE#DQVQwhcRM~v&rbjfNwHMzT#ZHw|`9(W+ZqxIpKKm3~cqcD%l@;R_pSW6C=BpCy@f3^D z#T389Q*-AF8it;c7Se;YQhh;+>5}a)krj7-8Iy00&Rt}k(5D70AhF^=0ZYNho=CyQ zj8}`V%}f?wpInssDZc*ouU9G$BI6GR2%J4Ai;_Zs>Lyic@3I{IQ@oh1>G7$m={O7V z`1rjthG+k9nVlJ&XHS6YXF~EF-ywv}FYh4JgC$c^>QL<>F}huzI?809>oG7^MP~+_ z;)Ur;lP}Nceo!e+X6ZD&FuA%U;X<%9=CcQD**0Ev$l2)&+KLpia49YMy>Cxncy{h` zMI?WFdV1mbEZ!kJCh_g@$tzgTudtZ0R0IyCDd=v-t7`Y=7CQVT`84p~&*^}Flxka1 zQ@@>JTF<1t)Qe$?@8?uFi@d9Im z2r;hwrO?U;K$#-y%b*$t`PL#Izw)n%YGmyE1gN#eBxEIgfmChjiG(HeK*ZxK$dscD z6Ga51^x6Y4MRy@*o3DK0VXp<|%tekUY9)EemazRDuk3t&lP1KqY`JuZTBcq#RGwqU z99}^TnV~P7^ujW$rz)acR$+tey>45Wyr!45?aN;mfZ%WE<%eJzP)5+>NoQQE zApAs8^gp3m2k+$lu+{%X>OWZ21~DIjJ5A14t-hk~NKp)5pcI!@D!yO!7k&2?MXfk` zs^G{svE1NKjdR6CYTs{ID&+6?^5jq`IXqn47IUaImkm=q{8qYn{Y3G_;`!psgqL|f z3N0>CH~0BNsgu^0NlHBfycJ^4Q}Iv9k6Q*vMe`Zz#fi-O#iAJX*09qk;8qNNnbI?YGklzU%Ckllx7>0}dvNwiWg#Q`xsQ(0AZ7x=S z=hxjCPLLIm<^l(oh3TlI%WP82#eW;E~hJum{Ug9rQ&fK#brJGil|?+W{Q26 zV514j%<-OC)P*DypxpdJ)XaySi(=QalvW2Ggc&aKCibZveYCg}h?xa{3nqLL@tH^% zPZUp4Y93;X(8dCL#EL5KP!6WNwL2!MOX8`Hm59z*&cnsGsolDC_1|~)TN}T~Nh7IHkjzaLl0o)jP>J)Z@;=DFAsXrb51HKN@IlfdDxG;%qC3B0YlCwT zU9wX=bkfK$SKMWoT_D7zV${hNY#Jzz6aLaycUj$c@uobkC2Ds*K`!Ab*_q(|1@LiA zqpp<>DelO5oF-AaQjWbjhoA`lvav>I`JDQ>;(?r_gvEq)DtDP9;gY6Q$L+a}30QU( zT-6&Xy#nI}QnOA-dG?oKaI%W>Sd&)QbcR%FjdZGOiv(j>91*m}vCTEJb4sLnr*^L0 z9#cfEZVg>~@#9bmk&~Y<;#*IBe5zL~oF8&q#UbL8h<8_u`VJSxmt8b_bKM+0A_y8K zr82~&RhW^+wZjo#jk2ycw;GX)!%+`^$o$72vwoLs%m?M8iyqj4E++ekn)7^i_bB$L%F3s ztbB)>RXWm8N?f=^zI5$815I5YXPaoMsC~q`rWw>+$IqGu{YZ74-MU@nK9|npa5{aT z>FfjAq;bteuq-s>x{N^C2cNZ;cMiLvp4&e!z|Y=KZkLox7sq;+mQ|7m(q8ozefMIQ z4r2Qp0{Rk|6?c4{Qj13MM~qiq?6CWarL9JzUV6btsPbskYeeI+awJOf@gkIAR|jtz zZ#C-FR{!Fg#dnP{4uhyGk;5RG2e=%sK~aRwOe7EvXu>ME3#Q!+iWql_vJN8-%|dId zQga|Lq3H1hl*5s4M*OFCz zH(L@>TmAPRt;ree%~1a}Hh4xjZ`Iea?k^%-Zn)hH+f3+OW}>L|t6cH;UGVV&{OH!K z%%r>E-#Dqf8SKc%DsvYw?}Eeidq+|Gtl}n$58ocjA6EITTHjqCEg2N6=wET0<0~6o zbXvByND5Hct3Q@TinGC}Da0?|A**X;&COYWH!gC0x0SZ>IeOVn$b1>ow&q`<+e6>n zaWe%`+_`y<*xkDCEw(p~1=*&TR*XId>3Q#dx2R-KY}M|0O7?1X?Jl3Mz5-39@*<5j z|JVE{+WN&k5yy$*rg?`Wo8#~Jszy;+gqnW(82%EyrBPh7lFizramZ)Mn&(8{hhmG{ zAEoRx|4aXC5?Qrsi`9R37p8}%U@{c0P=y;6GJN<98-?7!(10uLt5l&P;LcKVEofdV z;8I;a9El`l)YUK{=EJP=InpxtRK62U5me27*?tef-T&uSh&~BAe5s0l`*k8&MM-`O z+31(8@p^MoT!aKdTYVz(O<13Z`g&Kh)!=Mr(70W_+yX`OGe{)Egj>X+yrdBS9HO9!Zlt<|P({%J1o{E*v=Ly=W;knqe znba2jDpL$+>$h0_1CgR?EQ-L9fuqsN*IO*sdBzbb3$#xOrPnph<&&LMB(>wDkNl%@+yCfk()*}sE>NZog^>o9sG(I!u?{(=Y*Q8lr6_?U3SuV zlmV`fe+PSUv+F0h&EzMN-K=5jI9^>hJZl3!oYr~{aYxAgdQsag$ZD}>8uBZ-B~+<1I|0pV{+kXq}!tY zi#NynW2vX_n`jjb61?-S2a4fL$6_#YVlntln_-ain;%`qj?>mSph&P^AmpB?ssPve zUz2V-FYb7ee^LX|zLG-sGRrO~J2fZp3|7Z)*-7$~3%;j{J4Na8v$pd|_|ILblCq+C z#-z~Yrda(S(p5i^gL)tYyy> zz3PZ$>mU>k|Eyt)JIcuS67b^AYIA$$+3oD8S)jVhC*4dc?>Z4gRW11{UEyYoa;vpI z`8>{`@b#p~ic$H}mr7pqVo-|!HUQou2S>Ic1Vk>%j}hbdDcp)k1t9vZi~5O0L#sCkX}}wEEct6F-=CP9K_R5v$y(MiqvnB9|ti@ho4F6*aJEv-}&=QSf!V=L}V@l+ri|SSNm&; zYa_>1D4#INoEG{ZmD7|(oLVV&yc17NTwY1s=cAhURP2W`$6)S%xf4R>xU(OD}iM%UNI1xdc7L!`6BA)-a*TTOXn)*bV zLe%K$lb$%ne$HcZxdpk`@|f{$;B)58aL6r_wd{T<^&pf@Et90m!dC3&IAu;R^;^>9 z+?Mew>VY5KV zE@~t^Vvfi`l8DShG1Y2L+AhX^o7yyfz(vVY%>AS?XVGFdhWALX)R-t-?!yX%M4Kv) zZI&m>)>bWdOISHm52Q9mTcea#(kZTGLXV^}TKd#RGPl9?p82Ah)`eB#VL3j<3ul9s z6D@j!_91ei`%>Tf=valMzP-$hg!?bqoG4%Qeas7rG>?cp8!f3ks;Jka#*BT3-8b4< zqWF!dd$)$sDSK53aLZ9WBsYTSA8npSX5W39%73;Yk&5|?O!#qGC}<&hvpeB>M6EZyf)z0+Sc4JlpK zJ6&@J&1pN*QxE!Ph)UUnxyF{Rk}1`7Y6sku8twGnkj3B9GrdzI$5&Dl#j<9vq^Fu) zvup-C>Yd(YrCl}VR8mvT+W2`Higcu>ntguXk(x@YC$ze|S-N`CN32TiNggt%_}n{6 z16nZYtt$UUZVmIilCvLf{5A2iq)sDa*=~zH6E#nk>pWk|acZli4Eayi zf#AuD=$4_@=w!!9(@PquE6KJvPnte^QoPol_EVy=Z`zLXAK_(y7NTS*tWc%fBUEl}ac1^NrDN#demL$4?OD)9C1> zM5SoGWU8y*B=P8=REy%GrkBRVqDU5js31=1sw1_->8^#st~{lArCS7QVYH_2 z_&GmF->0KnW5UMAY>lTS2q{%_DUClG-xCEA zWz|0~lY&K>_{r%H?+m85BwOm&9vY)GJ5df%#%Cq6;7em#vMb!e%r=qm*lM0$_3trn zFV$G}&UA3xk!UH&>X5CHG26u28jLx!*72A~!-}p<@)gJUoHuhs=Iv5y;?r24`lmPS z&hlu}RIk$9BOBr5nP?R!N+qtyoT*x!GTEy1UXC_Uub%AckE4;!(sbGeAij$mS;~G6 z;hSv2q&se2W7cjuOyl|eU`=>WJpCf+8adDw!=?Ac!_s}$vu2ptDp~)Zm5oPl{|?%v9_`4H+Fgy$bQdMU%>AL*KUo?! zD;2f2=76dE=VSSDyK_xtZ?H?E>!YGs&Y!(rUbpY~!Db26N#RsmmHN59O|(xMc`CIg zubuj{l9DVsmpP3hQC_|6lE-2&rslPYvVXiRpH+ObhOWlvS~jIylBc|4l}l~X`lPKl ztF6oWOrzEml45pdv)r;g!>q(68OVCDyq-}@RPC&r{8LSF*I_ z-qQ?9wt=stVmo|<+!so#7tvpzA#ch}smG!xIc|ZFy(amK_O0kQS+WnR`MSo~XQlU3U#M@?2R;0}Y(0r-S({XA&++rX(CUnIAXZP}ow5$dxRxY7Vdq;> z%&HwOy(dg%iOKUN9ni@&s+HS?M9-8z$93gTQqzmGla-NpB}&JZxql;S?X7ZU3REPf zq)mGH)pDtXTN=~K5?dJ!QV&EvJcz#aS%B=~yfR%&IrAK$oSxUHvn`vYw2WJ{jB~zh z0rkw6bYjx_Pev+!c!|r9o%_lbT9)@-@O-@1Ji#rVD`$La-E3u?v<+(W~Ow7 zd$;8LSkoqD(^~cmXpWVVO;G05I2+6`s(KwwUDA$QOHgN<@?4@bCD*p8u1}IvmBJo& zO&WpKvpQfeZ!WfKn&(JT_)<5ib3EmJVXR0tR)yXPmN;Eo^E5tUJEeZ;=Jl*^bE_&a zlMPhf15lk4cWKd*<=BhnWm~N>w@!WK`z2ha9544sX!fg-C*vBt`-$Evqun3Azg}Zf zTssZ6a2i!aOO3nVVUAULPw9fJc`06mWV>o*BYNvCCG|rkHc7OotI??hKcz+Aaw#oA zi)$2CN19Y*#&cvyz%oi(ca0IP2D0aD;F;U{8uXtCG)5=i=?{dD}^Rka}O8J;kjxSdKkDDF860=nIZh!dW zSBGt)AMfor48g>fav5k3whn=H=8$XIU8~jHANioz@LhJ`%g+e*5|T(7Z6R`!FM*91 zHf|r*hNa#D*1N2jS0W^ZmDrbIuUkNSmlqc2VgD5{5Efb37(OcO9m{u$kl!a$jLFHS zmS_WtyU}H)=ThD2hi$5*Q>_JtLN~@$l@i;h^Uj*wRaK5-tLbv?`EtL?g(OB+TM@=h zRhUdOwL;?H^yp+_4GYELn{6|84vvRzYpcJE2LQHWzABP&hw{zOisHj$6X_jil2 zqaM^K7GX-0NEeA!J?CZ}@Zks&;l|oI_HpE9B+`sJpDN}E%G%%EtVq-g6Ex(o$+N$G zI4;XaKUFGk;r955x|5@uTRqo@$FK^oED2SPiZ%7ZV)Ih5#j#B{>&6c^G*@xZX86t6 zsPizcwhE|2{c!93Z1wQ}{lv6wt6#tC=A2w@mOA;Ps)a0P5mql7rrOXb0h^WBx{E$4 zhMkHlcA;3Slbx%qlG*>`VXm8DzLgc%i-O(S=A*L-rz0+JHQ49A_|A(JWVzaHfKk}-;SM%kR?hdT7P?X92*v~i1TV}W3`D4A^(p%2oJz&Ig z)fr8%SxMA3og(sKVRp`v{-yA?n)yW7-$bOh?#b8-xmCUUvzxBv5?is9blpTS)72Ml zB5Xx97v$`GQA_1KkULKfLM^1bGd^BLl5r9A>d9&FI`c7X>~$J$t&j zlY8?56CmB`BuF?^QVsGH#LZVa+?H!lZ8m#M3k%LeY~W1}KXIum)Vz_XT+TN{A1#hD z|2S4!PLhQBMv>T_R4O_2G_Up}O66@zuUaf_x#Sd#F1`{j$r0>Oy@wN~X}PDog(@y| zm?Js0ZwZ=r9$^t*T}=JLqC~=2Zf9-CQcvY=ggQ(mXSB9_`SOU>k+2YUzO}IGBF@V# zqPtUBbSqDAOGj+L*{RJ3H`su#CEZLTX(+#gF)b@4`gxjrGsJ873rg+R0ooVotGs=# zypgifqJ+WyV6sSm<0ekEsCVRY^j@-BQZLCl>lg$Iuk_flz@AVc;;Zjz9^K1JI4RjxV7)#qOX3#i3*D8 zv9%yA`t$0&ZK)cNso)(nK!HD)3~rn`6P|0E!FZRE=UWl(vi}Kl1Xh> z(T2E0t5lEpXp+8}A(fAZLLKY7R8Q<@*9xT^sUNjvQGVc38cuzu(s^o?bser1SXhLNs% z*r`6$MipPxD2};Rcz{c#r9XTLPEHQR%OZQ4{IZ)wqa1&CQTx`fR?=@Rm2Q^K5fvWe zmycmqp?_Y71D1*XBKoM?ktZr?^gm?Olx9(Ha1F>EkAm?j{(l6^?-`zFc|OJcRcDLe zCiD$%4T_L;J-1+cUmb!MWSjUMv<^+ze~YSu-)%F$tZ^Yh`)GJd$4b^@TOYQ!S9lgP zow!ME#s99OoodTq^{e1oUY{z49}4Ry+@izcav2*PTNbyn73=ngj3=%TqyF;o`a#<5 zKH6efCByRJv90rd1`0|_#be9#wc7*Ibw%H&up&N18&#`w?WgD);iP4Td(rycsg&ve zl+w^0P9tsjlQd|gc?paok32+3aJ268ATzRJ^i!o6)l~H15!(5g3I@e!H4L55lUqS9 zhCfrH>1SxCbnZOu&Ijm#GAvA_lNimK`JFYWW_iuZA zinvO*$Q56e740(*&66@EG!M(Q%aIgiUhnx1_Rc%jYr~HMF?@$%moBIGO^k5?TzPrPJ5)L_g{pj0?@h z*b%G~ts8vNxbrA)#Y3I?wfipKEj8>3wKY>ucF_d&#w&G1?@Tw{`*w;{?^{uEKchx% zFtvL)zKKS8eUVVV#uSZ2Zqe%!1-0M5Em7<$hn^tCEZebedKAMMYOz~%@}oQIuM@OG z{+76{-f2sCFpa54PeWm!KMNnfY)Peb-IOlT)7T-76lS{6Nh3h9(>EAB5plnx6H4^* zI7KM&vE1H%g1TR}?`-I)I{kYRKEh6;BkjWtmqjH{Ib-&R-x2*RvE9CfXW%W_8`4ov z@z3YWPZJZz&wQJx4%NrJ-m>Ftb2ZW@#Mat_ke z>z;A-zhqRi!hCP4U~6PbH~szEs4vQE{Feqx)bAT&OQTwWH8ku`eMg}fjNd!ZQ5X4a zq$7)+D($m)$%hVVg)g5VeXe&j;uV7qiEraHGfYCm5vo!$TtcH&$jTeFl-^@KyqivQ z`N~V}#hzS`U-TAj%VKw|vm<^_uD>H?Zxxr0)ZG!U&iII9NBnJN%5D3n=186EY(@x0j%xcOt|O* zqo|u=`2*Mij%#O)chdshEVx!7=@9NQ6P`l*RX%`WIva*iuN-?W0{r8(o zHQ`XFONb8g&sDLEL78?F#k0VWDEs7R0@balnpoadaGaDVhXy1m`j{Tec*jlxuQqT3 zL-=c$s;8-;tlm9dD$R#D2~t_GgrROe>ZQJl(;o(!T3Wuq(cwwuWJOr4{-HFVHl9p@ zpns`FBc*HKjD%}4H8pCUNOC7br$#>2u@%tuoZm_sb+qflth1Ptee>6YjmFB_XFKhY z_!WdWHud;?&+Qt;d(Sg3OK;uXdo0U-@T4CP_Ri@uWsU7(K+pXoS9$f$E!r!e=g#Ay z7*K4a@jz`&wGN1}xt6_O7gH8}*xx%pg%y4uD-*K4iEEa_#i&^D3UK7dmGx2B9k8Kgq(_zy*Bwj2FmqsSFct52k&?lPR=rX=&JLxjaXdf_}zPLhp zx0oNJ2Gt^Ak-aQSMe?zfZeVumN=D?d(XFJeOyZT7!f*oY+^?ZgIldR)$o0ssiINog z?_U6U;CWQVJ@oMX{F6;9jEjEpg?tn0RfXl((QUCgOe|rkJf+)JDe#Q#?CY1Osu=LE zSIA0MNWaQCZz26Ev|=Is66*7O5hCA;1EMUV0*DIfS0Pbc5Iv;%zYaxsXvISM6+}-l zh-}vO{=jF{%{k zi6K%AhKEhMO1bfU0a0^pdWd-U%^Ni>q<9PM7R_8+E4L1&smF>vz2m`@V@4WvT_=UB zenzWt;EI*4K2>kTH_A5sJy4Jo@sn}qPH9!=2jfK`mcx{_827*s`0`|v05>aTxzBhd!iho9xe!uV^=Yn-$R`oiu8F>kWmW@Qs8S!h;uYXs~x~Y z&NWi`#lw;{dc+R1yZ6F+fl~4-x@5}l<35jajAN!b)`Fm#ZqYtugJ1L$SICxr!#ZRTf8_EkzW;+@e)z5+^tQ8~g zEv+JNeD@Sx?WAj9l%m7N8bQft5|6(MkC+bs%U4J2&T@$IW71C=Ii$%#{kuEkgdKS) zD_@NJ!z8UaOdCc;Ma}XA%i2f&9HUlBH;QZ2Q^n452jlZ;v#D)(Asinr@XQlh$xO6g*`qMKx$GTs>pG zv9lba#!){4r>nMH=NEgFTQh5U3MD_S9hH17pIDgG!_xIFGfI_08a0HCX@{NSO0`Ab z3nJfGHEj5o;@lc1ANIh@);F>jWCKSF0V&7lsajnZQX=Ecfr&;*en!u{U=$MPSXhG zIEnM5XACB}T{Kcj;eZ#yVr9X>uIxN@Y^3 zQcP+SB}C0QZpBc!L{7Js;7K|hK60zCCChts5Wmdx^sxL%^38mam>5>d-ITyL)Bim0 z1;1JydS12&zi4BAS4>pu68{YbWWMA>~Js6(` z{->=KqN|6rmZM(QJko7x^>^{$)BK7rUAwsVHhxq|pLEzyTAn$3NMFsEV&7YF;u%Uy zU&qqAfa@c|81U7|;`YFRTUdyDPEED%8%~K8WNv) z&SL*b;Q6(|o42>vQ^h0BqM7@Tc6vmLy<4ux47kUn72$(k9I_6+PT zhx927_pAs4pPR<>l=B{>g^r!tu2HRa`|(Qp$*%Njd0Fso8G8?O!dL6nGqO8m&(v&2 z==M%=o9}ScSfU>Mj@9M#EpC%N?|kW>^Kgf%G--{Qf%-stPh(psafio>Pn7qdJuA3% z<@ib`c0F=vyma1Boi%1FdgfX#L&Kv*4ScKd;!m}lHt*?7i$1Da-_vMcX;s(yXfm@{ zHHtdFNdvj87K1+0lLyP{0_}626^&|l#u$y?de``&9WE}vl9SqPo<}35C|4;TAeM0E z8+ocjeRSTS?{)(q4^n8cS-oso$kjRZF#WZIAHQei~WKi>86J;)Ex)>3kp$ zq2>}#8dt=SBv3r0(i;6Ebu}B69VF>wCH_=ZE0w>{mbG(qs6U;cRGs9-U2dUV0kYbq zQMDJB)^@6w+~$>jDf)#+vD3$FwT}BJmkOd_9vK>X6=9Vmpww2s>Z3g=ad1s-`6gc2t z$IsB)pIr>zLtmRuo3%LCtG-H?HDj^2s&h_sXsl}LDX379>JE+7CDX&l!8B?d*VDcF zvbgO8t&bY#gh`3pRMI#e?$kIjSJXINxZTm2qYJwpIXX2?Cyd9jqoi><<1;tc2BY3C znx`t-#Y0)UJPK!M^eYA*<0*+PMo*jMKMpnAzNy_AW2%yTknvdj=-S2eJYjT`b}5w) z5KH*o<+-1wbf#f&ML21YyA+bo zQxd*8SJZ|x)>^5}nnsr0L9_2_J7sm0wZIwH5{jK}qhu}M;i?vRwyFgNzD66-Z#%!v zZ%N+yUfENu6r5)7$rDgry>$w#Pco-^ilxOfXv>qte1(5j_wX64hvO_V3Xc<3>IvRY zDCe%zw!(6d-MU|ZkB-rbBXD@$yLFg;*O&w^9NA2+eHJN;LSu~NL^jvuqBc|JH`i8L z(sX!QwTSx^Gz->(sn%26pQ;weRgbFObHM1Ve3AZlW6R%3+q4(?Q8+{WitWn``>a`s z$s%N4d^YSPVWv1Lei5!3B{cpNyN?6aXJfv*{8`d9zx*m%Upig00PP!bA9vnsrCDr< z-J5L{eNl71iou=b)Ja8-wxe!_1~T9+t7Q__@BS?{MYt8@b`bPeOG(1 z)^7OY0FTjHTMr^1_K+TgPWt1FKc4e6JxDv}p>qQkTD`^-F!m&M^?C^Fsql|NSWkt2 z5}xmecs&(=BZT!Nytd85_EfkL!g?w^(%98ryOo#mpy0L9cN29WJnse7 zyK7@b5j54TKgE_0XtR@d>q7he3ggCwoh9Hb+2^v zS!J!a+Ik4(qxBeN*~Z7MG1M$P?cI@RK^RJ`-e_3O!tGmzWqacsf2l=aQQsM|?rKj` zll1{uu3Z^1sQIV0E5GNrmKFC}MMyRETeTLg5s<5fW@|hU#k**HTvd&a8)|*zAm_9r zJk!2xbZB3$ho`r&J)=%+4XWPuOYOC5mc7+p3mmo~PJ{#P31@6fg|MCqUkYJ86`l=Y zJr!OEVLcUI4q-hNz7oQED*Rdq>#6W+2(KC&K}DjR(N=Hl<=vaNu`0qS{~IB{o(lgU zg!NST?GV;e;deq%Z>xZ=9q4H^TcHyw6(iD^h_{rrBKfo&0(& zzrK-QujJR);DA$sxgz`+o~`dLB}P%9+IopNq5&+h@rJYc#;o{A9MxW_H?7Av-cVF~ z#i_W`UU4d19rspW9k+zBVyp((LCRkJ3KGTpXnc?8?lpNkC4FF!S8ur3&|`a@_o3$1 zKy7;}9H?zig#)#(UU&3h&f|)8NxFL7q=B%>rC3*j)sgv~koldE`JHO!clHWBON*K< zC>Rq2qaG!sa7L{mR{`YW)oPjKhI%b~1srP5Ka8NUQ@S;;h-4T$O; z-Do1xLN^xK)qWkyM~!UKF9798X8?owPV?bS64SkoN65HsjilJOI}GNeWxePtM5341ODo1@rMdr?_J<}R{=4M z3S8@5;96G!NuATS6~`JwJ+{=lzCzeY`%-t=U`V}d2NDOo9)?E6-V0W+^Y8qF^&T`k zXk($C?UnZG`x3e|FwGz^tAEhfXi0?~tvA{;R*{KO3|LpS+B3#N29F;JE|P6!4Q-Ed zimZh}QC0>hEf`G8u=*3}2uigV^uHwlO;q@aCp6k;+>~JOYp-}$%B~?eWN5WUSO3t% z%@}?&zPtrRGD;1@yuJEE(YL)eQ6blalj(Oqh&UXq?`<`}!8?fe)P2tJF~(`rMJ)(q zSoPJdR%6DQHve0Gy*Pu;fR9D(Wta{x?HQv!!?w{_GB#HDuL+d%g&Q;N)ps$G0-Z-9 z@^r_V2LNdS!`@JdF;*F)tL!Uv_1cIL#Pbkx{MJUs3MbSW$cR;9xq`~nbF1%SP`qmx zj|YA+7#3{1aIVxH2SRj*1mB0TnA~1D=uxYG+$Tyh(vPnG zNxglpz0eT=B#|~)r7Z1p5A`l>7(7>jk)s4Dg{-_+8ROdLyfx?QwS6bg>6zGa-|-XTn6h=6Y=mmIsD+p8{jGV9e2VV+`+- z3ICP!Anu6_k+7logS9^8>q}!=Lld~8nosd$1o~dV6Z7?ZF0v}#Y7v@HF0mXn8h3q< z3RnM}#PD#;6^qD3D}qMk*CES7ei8W(b9^(uI>&}AZO5nUz8{*TrAw0Gw9Bb`v~J^Xd-Z=q_pkm%NGA~9e%hV$ zuaxtrA)P=VH0<`hcS_?gx?5F*S!=_MH_O{_BhlVNgg0;XXKG(mKR?d_a=ngz{h?_# z^+_r8QV7vh^_Ls>R81DQ5<>o&O5wkC*_Q5D{k!q@>VGnt@@%jE!ZWV^!eNAv8HHu0 zgeBWEpL8l}dM>UE{Ax+?eAy}u$OQJ9$<_U11+RZJf&?41y&4i%|JHDMxPsZkC7v+% z$auP)e zs><36&yy|`-=A_J`TmqE&X?LRIhLRWBN5y_(N}9U8Y8u$j#n%Hw{4J#J~QJIO9GV#D| zwc-qsIC#RQYF3z2qxy)+KCu%Hmm(tEmFD>Ji1EJwkbWwc1R^0!U znHLr(7hj#2zcBIWofFHiE=*4>EY80?GX+)?lXFuOQ$U}XJb!+AX=!44ets4}J8H$i z{fF*5^o2tlc-&5_M%V6W#Mbs5C>niSdbX`b%RTW3iT)pn_5K1^UTa{YPO)PRU^Nnn zC|BRE7$*S9x-H&Wl;;&BWAZXFz{$(Ve0U$Jed23jf|=d3#hwl~@% zt@bVLTX9ZK)ReEkDC`#xSZjEs)>pT(`-)o!cC=xN_6YyqVkIb}{~<(uoJ{aby}qy5 zSA1e%xL3aZi5iW9hw9^>tQEVyd-m+f=@(Wm1|B(Z_q}s3v8BWbehh*;<+h2o+e9fy z-)g{_BD#3fQp%KXQ3KY`Z`6vwy3$yc+Q(ZOeI6z-U z`iGjF57d-lhO?O1q{bZDF;Ob_#aeN6D-0f;U%dRa$yu7*Rlm__#C~tF-&@7b2U_CV z1AF`7m;++Q10_a0;EWjg?m*zX17flJwry{(P4e=9@y%p^QAfXuZ{Vd#al_caAlz^t z|F2E9AK?E3?E_TYpdNn5+XI8`10h35g`tRFn`{hhqhPE3z{r3YPatyndi%i9T5(@D z6_ys}=a!~ZPj?YOI%CUH-hEx=j9B;C?*p(&`v5|mSug~gXF|Zcbx<8{>NrIA8PA4* zL(l};vcO;M1B2>nSKt%1jtp0)yT>V8q^{)Qn6RK|Y7oGL>4=EP7Csphu)zn$1Fiw^E z7hNC?p?w@ZBoS}H2q>?eC@)1yf!)n--;nvL@ha~iWp9k$uFQK|0|UnJt(JlrFg3p< zHk+w$uMbe|+T~hZ;g@z2kkc|^K*kw0XHBUq%K9KOi*|OrnkXpM_#lYvD@+l_k^^x6 z+Utyb4qd&BY02;C+M1fbrXjLi6&*EJv;j!bQVT$b@shfLeU&yDY z>fb(uF5KHcxU2pB@%la@UY;1VEH)Io0V&89v>%m=rj|1Y$&pVqUbwyDvjeNsrwcYl ztj$0^`S3wg)PDh{vjsW4}VLO22A3I4Mr7gHT0n>2~Z%nk<^sl zo4f84mqQP0tDD{X*i~sYi<3Li{+CxgIMnBW$7$wx`{Z+StI*7oA5U$WijpFcZ#ODk z?ekVL+f%DX*M0~Cp=ul+qY3Oh6baerz_<-e}ruxbh(@Kpv`ZA1VVMa^OS28;bCTh621H z!5j1(O!K#Gm;a-L89}%N40u6_@;fqsN5LZq@z-?BcoQrk@gS4SfK0Q#y=k;)mQiYY zg-uXu-qxXARXl3gZA0~Db7Wwfi#2+WdYet~Q>Lbzj?{RokKvIH@ySjz<*MH`Fp!E1 zF-NcaHxR@?Y5@8((c;ZS8u`E1{)|ENPZK{_y5AlA>KtJG{WC~<{Q*a`U->mf4Tf*_J zMuD9V)VCtkx2&h$%02ZKiTnk2Xf^t=99G{8sK~%jDhWd&N)A?{7#6jDurs18e;Uyk;FcSEhuTzaVa~0l>i|ou z2S^$+6Qnm2Bza;}^jplw6r?p4i-3h><3O$7qv7ZVT-ZNuNR9|L2Hh-Cie($JY(pV^ zXegx*NhZzp6}s>bcQ_1Zdbq{$Cg_lwlKZA{#orD|M&M9bbf`ed8)8k*S8sZv+Z1(6 zS7wAf)c9tqNnKy6>CKqqt$@>8DQDxa__cQoJX41I3RwXT;xRzr8IRZnoLa-FPRj;(tTU#Wt%g%< zU$MuDuAZn=zONXyLD2}OhQMF0!mtCk?;2hErP0NoJDmf_=3!0i!>bDJD=fm^LNo*V z_ntD_u#I?Y^i$i`{+T9@6(XSx#+G1I{AXylucoQV0*3Gc<3M{shHQIbJLOx%&}T|I zBQyR?CPn*g`J{NQ9 zJY{`)Wo{Wi*`a5a7gx?NuPjc^%7w9X==9u$>BZ?O1i3c_C1F zK~%oNzt=QAtPa8-SK6=f2I*MQ3Rb`h8SGuCDC5-;G*YE@322bMGw*3+3OJ{S=79 zgqZDDHa}E-j=EOh)q+v6T%~QpDW<)!`nv;r!R8A8gQw%`zx6tV18!+$}Xzl3>uDX9$aTDlx{v(j)*Zm*QQa&A_ZBHSCY1I-$nP?w5YF}Hyz z@+)xpJx?vpT%K8;d3n0aU1KNIN}Y@b2UM2YQWi(%RvTc%h#g!QNpWs8_@pwB zCu+s%kBa$;`Ptd&^UEw2bm2douxu{`{CogV6Ly$J41zSAP-!oGwN`xPqayLx^z!uL z{Ke_H>G_pS{G(S)N4|yuh}F94kE{Opef&x6xs`NZL$mW+l8V)9uJMK>ymHB0i+e(^ z$sxqXi)&^GUn8JYgLPf7t{bfDWmwlcU|o-}t_N7x4c2vsb=_e7NU(lnuzpmA^`j10 zKZ>w^6kz?xVExEp{iq+QUVUG%-tR|7SKlASGst$ID7hi=C&Q@j)t?YjmSP+4%H(^P z+ABL_3|iP!o;CU>R?|-m-S-XC_sf{R-+}4-5!3errtc4^()Y2>4BYz$4qQi9{}+RK zLulWy*~yI-hCKn<+4jQpPhqzC;iBV3hJx=w^mLYXXzh(MJ~uk>xe?H~VQAdI$kEK^ z2EQNxN=#q$pm%RDA>r2)v!+3y^)tq_J4mI(FNO!8*UyxpeFw7?Ud)3Bp;q6+R%*pK zc7j-(d0}siYG(AhYK(AYrCP*baKg}DWn!O1&ZKpP=f4|b4$z9lT$@;U#+;OEcz+yJ(xu^a~Hcb3`{LXfciXOYkoI}@x;pI z7p51xV6X<&lp)+?*4;c@EB;k)3?60aXSu5|DlT!}(Dw8y<(2{{xAeX_cAHps+o^y~ z@852_Y6X_ib|CWD9NFWGi<7T*Ascis0ulaGv+GA{#l5|o{0J+n)05qLU2OlC&hme$ z_y6GU|3UBn(ck~0-v8R)|61>Vw&Mv4wx(fvuZXaW7nZ0(U+aq!HgnWc%#)619UrzUutnOmNoo0^`Q zxG=wHO6bDk{N;%gcTUXD&AxhwkMLl@ovAlYFFiIhH8nj~lS5KE&q?gt$ml!xidx1{ zwn`2&lA_L<7rQi~6C!5A`(Z={2E6A4j*Lly?PEzW>D^o(d)^{2GCG`AGlL-Vv+@f5 zb!vOLwACMxC@0{{5;(dYSg~yiGSMx;3O=`xmElyXhQDoC4VMQPUA5mk!4j`?vIb5c z3J7ZYn;YOm?I0p%D7A)E*?U5(MMX{_1|-&>av63(v!jPH2D{bBWg3*xR#%m;mKmbV zkjmJ8q1I3?BX{IbE>j||m~=+INfCsHVaO9NTELM2V>Z9JJerABO=ZR3eAh@{zfVuA zo+>4?0%$v_XbNp-hvp6$Lhl7V!S;`4u2^l}TP7_V#9DQg zHF<5-bCcyar3sNtl_tMwO@7mx{AOsfT#Tv7aU%Rv8O|8L*N=RiJs3BW+nKouS^0~T%Lw!N z`KjqF!S#v+z++xZLtQ*qhXRm z`fUR^1ssgX73whgyJHAFLmC?gWvznEHd(1_+nTu9zI&EQ^V~99ZCHQ$lnw5-ML|Mx zBjV}$b=$x9|L}~fqS^b*h8Nb~f+y8I&%gKoh7$juKYxE4&(93l>H+WrMeQx> zd=nLVykPub+0~k>A;h}@hKd>C2ypuS1`s=k6_OA?eocLASh4p~$744J-Hi_d+e-t`$io%B<0UVi09C3eb(7PHt;T=>2*n)Y7(=WC)>LJHl@r6SWx@ zQy$al0Ty+nc*<5nZy8-JnbGu|`uQm^)AJ0^T_d$^-c?%ah?s8MPMq7&2Adx>M}?l_ z`ROkDTVu63+N~a$G`Grz@L=u%g&Ezd5&7tc)?I{7XAbq%tzep|T0*vBeXZ%}iZ_EY zviHVs)f|F;=|GyO$S=_XD{~9UyTOG=MuvbeVF`|31$>-`tQZxUcJ1~3>?dT)qb;kx z$)a^VC{a2mEHpI2b0|EUDaRj%m|W(qsDjsuJW`L-_ribm#(1{;6lo%@7lu&uXVV`; z{%EZJ4+EbDKmIT}tr3Eg6p{!`bm_rZtq>3YQ@}dbeyG4x?SXF5BBp*J2tW1c`fYriy@WQXHj=Tc zx|Gx!hxaKS3bfcFi(0ao%D#dZ7>z;6Xy*CGTV`*(%h0y^u1zlAWlUp?eAlL-ieDSC zQI$y%bQ&QAy0+IJw7qs~Be->9!VhgkA4!wbcYRkF8{z^2dTM)|jdbq{u-J42FC#%M*KLRq+QC5_Ra;R97DIpOnB{0@m4RNN}4ZOsBB#Q6| z+XS8Z4H%@+xCL#_3pt|BAqS-Ry|?MS(g462JsSW>Ee`;lrQV^`C`=U;254%(&uyh4 zBbQJbtJ%z}LVup-*i@JqfRE(YMm*kkroqk=Xbn2w@`U{ZE@wXAT5EQ@H4@^z>o6bJ z66q}$+H1Tag*SpgX;enC*j5h9oo0uI&V^fqSP?m_$o6)vQJ6k00V>o-M z7de;4v)h%Uik5wx#d+?tTr)7}Y8#y}*%d)4O84m2& z3>lM8i0+1fYMH&Q{*XShle9T6n%Nvdp4GZett$D3VRW(fmmtI*n*)@vNL4b!9V?Cw zNMKT21+vH%kih2n-4E*g3uFVm^>0wTZ#(~nYPys{R5W5(0@d4-oe-gi?jC5i*g@hu zv3%x>27_(=M6Ts-&#*K1ju9<1u767)%>XkO+@$HiNlVjq*_bAUx%zV)d%>%iOUzh_ znI_J^oZU|9c%7VfxX%Pw{Gyh|Xy5rPrLLH0K}AH3ZLE7ZR4gjn)d^7*gt(^wIb?B~ zUex!@RMdSN0}51f!irvQKN450OVE+p1M72EWVF-pb{&7_w5d3vng$8A##%_TN? zXJeLq1-=iu5Jl1Wl$4z#;T)GM@$lZ(?W}i!pUJP{a_5_=Qx8o(E${Ydrvda-fK8&-chbH_wm2I@>i)8bKCe+f^JOm+tc?QG3ulj<=5;)MG> z-s3D=d-JfntOnHVDDI^A?nEJPoJV`!ICa)eKdfte4i(f;9rA?BiQ$GM{wNP52Bv*U911rI2yhui=BPBL8 zpYnorBxi*AxM*%0Kf#oNl=0r2bgzc@wFe||4^*0ZEjINU zP}^%KZL+Z@ok8=EzU8h?g7&j!LhK(bsqpk}#-SgL?J>ADi+UVf5Oko`gMTOfG^i#PpguE0Ka7x3BOkJ)%b zp*J+Q+0ZRUu@>5gq!9<q*3V;v3-sAc094c20n|m3GvDwf>h7{~*U? z+H0>7nUprX;m{0)6?wSDCji5DOTao9TD9-1(P^cE`wFW?(t5>oT|;UL!mH-SCrW)* zBD+uB;3?}GA6~>^3@=u;r6W-h#$6qKTY`gqOFipr+we}|o+@>8DO0~rd9)rF7*yWa zjtt%r7_#M5l4s7Wgc*F8&sb*JmS4?FK z=$?Uo;aovXGuSIFln)Q<)hRL1x!nWX$r(w;E5sM7oJI>R;ASz)Kg(}pvpxUn1Qvbm zjC~L&KSA3FNHto!v8U~AgEy^p!&cVNJ|~L^z8{w(Ps4~V!jSsFK##93Vu}<^ra}RubvcIC|Hy)Wq@d-T))s|nSp<9A)Ai^(Mt2J0AMFAg z$3@iD+(vkrjRF&nw`)c7yWy0y&Msqin7#2hdW);=G?uTurcq`6jAG~$MYPv7a9JK} z_BrBgl>NSnsH6rD-bON>5pti3;6ko*&m5pM5MQsce7T$2`B|6}^sgYC7BnCoN){q;Yg<`J{L zLS}7F`jl<=jm23yHRb85nAm-iS=LZ>W1&~@l4|=C>;cp%fGx6RM&p7}iw3N{hODj2 zDs@bKAour5%C%C;wbuQ7{q8>geZihAsQGSmcB6g&`+I7|EyowQi{Q%4WtJdkUwwRX z`TV76t{>PgQ+jV}cdckwGCVmq{p1C9htnZHmCjiIt6Jl>AWwD~3(UU$GZLk`cvHro zlTJXF^I068ERyz*uK%Y`u>FqQ>=#ygNajwA5pf%!@w=@5>~>%6LWAkDmk#)(W1UC@ zd!=%#TCZp^$}w#$U;lag7`X0jA5+vfP^PN#*gdRXs0C`==D^7UfFW=t)8iCmKT_U2 zt5wTgwPK`1y%Y0nibpbPMSpl5w>hxNIs~fxFEoXTCW}|f_w`Hcmgmp`>WJO4n$yw# znH^#633t`{Ps@Q{vUyKU8GY7s9y96vsm~YwnJY$#X23lrSwDvFD-uUUFzO#0WFDi{ z!7*KVR3>ZA!s#CoPP7~E?3$d5O6dCk3TaTO$J#4tM~DI@%Kw$*u#y=wd7=NtK(DId ziDQ=YzqQx@TR0Bov6gS6Ch`79Rr5==b4?er$Z&>4;PJ~*hf<0eV^w-zIqT9#vph9q`AIA|ogt!mGGq>8u*qjp4610%e zfE|6cE))swa$IB`C7Pi`vwh4a=|1=Xiiz>C*TS1OV2}nti;Y1;dXSfpgE!C7^obpu zv7yYc#>Su~gByc^lyrgemPi?53}myt(X7xfB({(3G5+htVD7-AgF+6GJ;Ef)UX_Oz zU5IO8IC@OHuQ>P!t~IP6fzvWaJT@?xqO9?mAwB4+rAk8;4qPIw_97gydoygLhk=K* zzU`yW!gU*?@F~gkD!r7dwcr;926Z8CZviq)X1vBwFA#vIzf!#h3C>8AA`^!)bU4co zosKswK!<-x?oHdZ4Egxen=fzC#}*mZTgE9ltmMc;AaTThL7$TZn zk=#Be=dJ8h0!%H!&B!Bi27Jk$><@Dk<<&?D|&WXRVl31P9PjhUCUIj4S8junf9An-@Fua!eH!7S` zX6K@4a!Q;8Ih2JY;cfMQ9|(HZwPYn*%9UdELN7&S?LqrZZ8S%qH&^`!4|(a5daD-m z7JD2Tu{%+ydUG67K;1GDZ-1#fLt^{b>eYdgbV9qEpi*h9JI_68ld8oJy^!88enW9O zUUW(18@<^bxYdY*u8~sxj%PKGSjUT-UZ^IvkCm?w(HxJFwaiCe^6-GE;}2O+``E2f z6Li+LE3jELUae63;=Cc?Vf~TOXU3Apbr%UQM#67I-B|@(Dhw;B3fBsha28<7JA1oZ zB%yJoBDixf^koaI{k?wvK|lXlKmUY=LHI{>zth^^lR`YE?>`M=?Qm67d+mev%on)O zNojwdA?7zLqEhzvPZTwP_M`LYf}p==Ijt|}1(khLchLx5cUh{9C1!NJ65hBGS%WPm z>0_2M~GPwhd_B;lW!Jck3;wp{a71(~N5IzYvPQxE~z5QceaE5J?Hz zg4Gcdu;_|!JvYE;eGask#EQ$-Z{a>D?z)m(*JfZlMCS2b+N{5We5G<5=WJR0ZiZ~U=U-AgF_uE>+s%u1_*qEmPcgjXTRR#!{ z9N3QSV>na?WxH?ekrTq!=hwC0E3eD9k7@B87RB_7$KVym!~#bIFN^M#G1X&ISsowb zKwNtW3Cr3W{Xe#ZXJgC!<=jh2fx5fKSTlForY)NAhVI;*~w zh}QV7&KTt`?bIQ=^(TiYs1t4>>=MO`j!3S35Kd~YePBMt4{(y*VY|-lCd8R$*ER+wO#p@3qU7VhNfs=xVzPd8K`0DA)3$xRgr{|U@b-wtXm}qHVU74Jn zxiE9ylb)TM;WkKad|a4bTz>V5`Q;~8W@oz&z%AB_%fH52dsWG{B%D^PV&IJm|M&(I zPNPhj*7(PbSER#}3n#cZad~pC``}_&ABni>Xu0s?%X?Maj5op}%J@>PnEN>C*NtcQ z;cfS5|Ghu{!5{zGAOEDm9UZZ84*SQH1w*04GMebB+AUz<)nUSDaazsVp=AJ>Eefc1 z(&R{2aI#iB|1qF(W^!isnQ0y9?}-fLbR5tDLSXHKZ`F$DK8AW9otfnXe^;Hh5<)9K zCL*7ie6gFzyF}iu@g>NtiZ6`NiIjiwv+n;O>rxRutKx zWBN%lvG$rV-)k)lC!wPu8J954bO>$S^7M(|;?c*pvMHE0$k{|m9}6=CU$etRtg#V} zX8*eO&w0GwJbqh))ehDQz5ze9zoBM7XI~+s==cB&Xe$_Xb|`zp?D>uTIylAE3hY+d z#$BLpTj{P+jnM>I+yk%nY1`JK50lY&TB0{~NjN+bKT)C7c zmZss^v>x&N5e^Po@zBN|j=ix>J{a*Jz^;4Rs5SqH7e0(offOiFnx(>$UabCnTQ9G0XW%!uV5 zEX^$-;D?7xEoH#T;gmdldG+0-hRULK>(x}zya~9iG3)7U?B(tf7&SY1QhnGqhx|=v zs4n^f;Qsk4yC7t2*no$`0j38qo?jdYOEWaiYTnWm4+ekPQ;@YET@$zO$O0)bKFlnu zUi>N=ULCjjTN958o5ZSd9YGzs+c;OvB4EuX>sZ^GwgpQkez*=&*Pk@>FppLpyIhfV z_VSO*Q=tnt<@2iF%F2X!&)oCnk;>Xc==Jc_;i7+BcfPN{HRCL#hHqQd?#U$O%0Tx%xcnI;5pX0B=Aqyym6V-w(yfgOV zzq{EEn-lXJmH`{>#+Xpo*gMGZvi`rKtzDmKml`7&8$i)Wrs`3Y28B@e^%008m~Cid zGnzrts-AYOY53TfwX-Y+Esa&AYE_e6C+EOD?!|#9q1`cNzmJOaF&r8r4Q>qJUA^{_SSo8*_f0h5j;q$8IKSU0TL#3JnsU{eay2*Q z>Q3!nER~ffMV7=>y)g2xT{Q>VRl3|l!O*z6TaG)+7!txmqgxAGMs(CE6W?j>10Lk= z8`GW_hAZ}R13)p2KHIaVqYMgeD{6gxk+J&{WBbt&%a4V{wz&0ocL;S_ix0fLV%ws| zF(IZ8Ot4_QcGYx5Wm}i!vr5E&?dfdJOeb?@nwv(V-xOf`C5G+&8Znb zeR*O;_~S~n&eGOvb(LKYq{qG*muR*xkMku766A4|#j?M>p9U$+6i9Z>+O@Djh)*y! z$k?U7Fv|wbEJH2G;4xB-)9Y71t)Bz>vEaS?28M{#-`XSz{543jzkAzP@3mD756|o> zdR1ln;X3ps-%AP>XH{q3R?v!`DXiFnDf+rJ<5NhV<%s?c!iXz|2`{$y+P{GzwA-Y|_%+Cm*=!q55Q95XmSlKoD=2>r z;WaC~P%4CNr+%u+k)1VUXAwyT+LfbmrI0aX#Y}7)C;Sx&45Aj_%(!T;+@syJRsvP- z-E9kWsjL{l%bJJZvT`aTq*K-BC%De?=7kNm-LnQno^>`cS~*_T@JJ*l&w@H`!3e^x z?L?4;)KLr8cHiY@>G3uT3pkKv0a?~<78}cf&<1h21aUb*TsDZyHrd{oO1EP~ZUcaJ z$8KCPcvlFD4GkW9e)Vo$b|t~PV(_lm)m0nIwwZj{XGheb8>}{#w{we%9>%NMuDJ1< z6?(0yvzeT7Rw}F^UU)45)^10tUse89LtwSkpjGl&Wvkj60j=5cy0Pjtt@^m2AicWU z8pSf8iq)Jitp9NK1hNMqTQ!_kajudTaDE&#Lbhcl_GYRjN(DJ>wdVobu6pZdz1_37 z$P|!-h@;gu{>?gSv!mP?m6*W9!JGL832rgH>{=~q?&$UHT^(y z^o<{AEa!X78V-3TE(O>Ryu!Ct;oHVlZ&RTXth%@T-C)0+V83m!-*&pbZ5{o#Q}^w_ zRc|{%i4~W;Bj|RHXycs{SG^s$>YW7m9S3>IKwff?mxgsdi4KFDmmKURfRu>lm0VLL z*GS*Q{079EAl#0S;o3Xk$SK^z`Hgb$fb^*Hz!sE$gbJ=xf$`^c-3qjET`I6;`<9rqz@&a1hrffCF@FpN=D%)iFF?sk zUf3_&MFMhNi1BA|?T3*W>qltI*&-WyA==Oj*>YYmbk11``|bm1*&V=t4we=TyUIkD z@|B?2=JObM!!Ok!+P{w-@>xKifh+^j4l9H3MtYn5w6u2urq>9{qYaP?wCvRMcFsuo zjxqE*_I}MQGPUxWh2P-DKX0|9GbMVoCb)_=ca5lAex0)NS8f>yH|Q%hT6pbn;9~zdclQ=*;QIe{j2zDRQ^Ys)Up8Z4Bv&DQtJyHhDe=Yf|Qe*Zsv?*b;* zRh@}ezpJaetE;P958JXVzrc;%ZAq4GurXLqyFs!Psr>*(R|g~4Z$nq=pn@Qs2rM{Cl;13_Lp!P< z6OkN0SdSr_V8oGyJqIKmDMY;A7t+q}!}MYBS>^nFLS7JS(&929V32yEUVmSA4;uya zE0iv_Gl>=^ldYc$ApFkb7f5Oe%;!6iT#1II6;25goP6@LFqW!80&J!dpe~gFJ2?rk zQ!--_2nzTq!Y`uhxPJr25@H@0b|EK)LRC5-(^y!&`cYTzDLFyIc^`&dI^YYX71PLJ z%9^2d2td~4>*hUEz_*|U2X(1J5)eZc;4f-JfvgZpLnd}&p~dOw$)L{2rx2)YDT<~h zr$}(AUAH!>s0G;y3v|mEffSrQxv0f>WQYw`;7e7 zto+sjnXLsQd)*ha3>yS>p^3#A?d*EgD4-=nnAGn>vzFl`{O&7TIG$SB!tTqC7`I@2 z!f@bM#`nkw3-6!^x*h@PI9Il8!{WG=EihYj7`l24DjodF4d@>+JiX-_oJ|o2XP*4y zh;^gfU>Cxr(a4OMvRhx-a=0z=mNjR`?3DH~>>`=XxfyOuXV-2%HnD0xjE2?97Tw@N zO4uWfN|fZXI8;KA-=XE(DaE)Qm;_=L3K4jFE%$v` zb3#IDS;QlI>3Lqjhz5tZB+?nWCG0LTUVEDkM_|?pC6f(kEF!m$$@UV?RmdiDc&BkD zI{xG4p>$-EnjjP9^$UQ;CNfTe(b|DcHn?5(l)6GgC9a$WLw0XV(^?k7!3f>M4|c=3 zDCyMAD8H;baO7&<4XhdxH6~m8aZBrV9(O_?oyEk4fSNY-M6WZ_V$-VLY$YO00G#=t zUt}Ux^Hc{sOAC)AN(z6XE>Gr69wLM=corAPDxg?7g7L=65!hFJ1$lDujEI$deRIzy zO(O|`kn@NONNx_KSUFgbp%`3yY16^>&pu{}L#$SX2WMTWc3>j)icn43c-3_NJaX4-!O}0>-|NnB#AmL@{G`~!0*ZZ$OXtxxk`QTLf(1K&SUrZMSFC>g z;66DxGFP7EUy)19BOkFkTt>d;yItJvztAu3MbOCJQ=*`}$gq3mSJ#PJ{r z856HOukg>yF{qdrSb5$Z@vss^J{v?nD@)fzBg6acl3fZQF3CC^K%_Yel`~5OF`Hj- zg30rdkIzOwKFi^ng{4?TQQ<;~;4=#Apw%M8MQow(dT^^2jV3)!QWQRP zfM^gRZnJ*YWc{pU4Sk~!n)S0T>t}Jy81f=mFrNp`xUH;3$5Q>J@y5s+6Be#S3%LzOS5BB=RQm1oE!kBMHuwRDKo&PJ6k`$R?bVZ zh!qKK8V6_+!^h&HaNO&Fxp-BaXYK=t3>*nOu?mfmG`N#K@gA;0)V%^Eb=}E%)GE$V zChOU}tYQk9>Q&q683UL=*wKx~Y$URvAU3hgT!*n`b!9lT460Jq1vUeUt;GC^jGF@) zhB3r|_FpuR7Uk8hF0=2#bmD`x0=60(+a72ejCyn*Kwt$dW#g0Hr2#8QIH&|m@ykS10&Vrgt402azucDoGpVHUyqchTgm zgdwS{vc^;TN0CCjfZxQ+{9x9ZhhgX{N^m7XM&%}eg|TO5AmBvflnwr*f*evDPL z>@sbV9}d^DaX3T_$BavfS0zQeqz3dqi5VE8p2hMbT(yGZ>#SGF|Ktsv9F}a={zoA= zG$9?r5j-(vfKG$=N`Q$dIReg$1S=Uc7eifg6 z(n8%xQ(SndK!zY_MXe2hh+{>K7^X)ACqAAH*M=IlKony+%-&F)(Vl*-@wrB+TSXUp zTT8(6LcsIRUAFSP5b%720Ccj#fH(oqM+kU6Tf7O5Jp=35Q;#z|2*pxxNhnZ5OjsZj z9V?e26kM_t!1ZF9hAQ1SNtYrdp^LDZ+VR9zkbOcD(ABW#vQ31qMhSDV5d;);DOAW9 z(g;J>aHKWpC#OPf3nqV(+N7INW0VQ8i|7~{G5(M<0I^`^CTuxN;+O~!#?uO+o>c)r zcs5WCF79GTgc1e};Elu^gI$F!sD{OxSPkan!NpxTX-k?XV&L9EuD9?Ox9s8@wKmg0 zcndmHYg~u$=sAS9P#wu3gN`hoL#XxZn%v4IS>|vL`hb;>V#Lcdazr2+qKn`Geh!J8 z0>pOme1PQnj9W1T5BEIocN<}Z;W{}dk@RFO@5e8$(w6&ugm{}GQ7;9&UPu8Cu>Ude z;KJAW^DX{-hd-y_rllH_=0%EB2LD*iw|Zmd?j0a4V=LjzAk?NP?+yzdGXy# z0!(=P$-Zd7;|~do*Y)&6hptXX^dr&CV@FE!MwqXsH<-sLZtzg+*2c<<&EKPw=Sggz;(Z* zZ&xEHQWQmRdfvLpwygCLy^o>%O+4)V6EWQ3LJJRseGwqKJbo!Vf1R+qE&-B1>VU_} zFHdv2|i6ujuSLcq7!~ zEGWBZpRz2)BakhiNI2>ah918|y4bD1L}wI(P%AW!c~J;zKWyiLGlGmX;d}{;&*r{ZtW9@d8^SDw@~Y0-gZ&8LZF+S<0fVlCMlzL!6u)`8X{mt>M@C{(ab+?<`f1!oL^r^;FV z7lZ2s%njHOS`ImAOTCnxGb1mASq29J9UFSnW2wP-kvpka&L(MH(3qV>daiXjCwM32 zCOpX?R7n&u5nAmFg4z?ok}tSF!N5e>yN&!-f>r5JQ>Dc_yw#1>!M7g`1=Tzz{%$!H{U(&J5 zOSG{3moAg=1NAoj%1TNww9&+D6J`+So`t$BX>_4>6O2a-<@yY6L!EtH_;BG{`uL7M zzN?SF6Zb`(J_j>FSZEH};51TFCf1xkOG3Bd{4sg584P~WdLVE4J2ep#nvT< z)Y*h+nQRI+AwptZOPn63>{OJvm4Y{1VQZU%;BbnM*@*_f$@NSS-H@&mec%w`+cj$T zI8`W}UN`|Wh~kiSJSM@7dIA8%3^3rhn5FaD!6DL6BS#mzT$8eSV#@|DB3j%gBXHX3 z=$ZJ>YU7ZJFRK9-x41Fmq8zUQ%^9LIDMpTro8liH#B8Og>UP@!gtb5N6x|xZWlBet zP#0w~JGnX2(E&WjjQVjadp5b6r+qLLr3?KPom_FMV0zU>4bv+QdWCVZto{OlF~izP zSX$XhnWi8!CwF3K-nh`FkCUVCeS8oDbDR@_ zBYfe-B10F={Y}Xf=U6}*%pK9Q&&Vcr|Ep+t*kS`jZ7CMOL_ed^>`MI4vz4Al;2F9; z{AWaQ$ol{%0TH9Xx(&2r1O~OpBgD#HVFf-zq>yHD8^C$;ygOv1ft>4$_(rEG(}}F;{Eyg}1izLKY|_Y@z0*GMr{{6sS{|gA^AF_5lDnr+sMiV0w&4(OC zr@(QJ9aKh$#+El)C_z3036xAS#Xvj}dE*Ut%O=Oz=nnaq%rF}ij9*>pkT9pD-phkF zV|1FL1w=@*uvrE0$YnS&gvkQwB{&5Ni>26sB_r7-+zR}RJfMO^-Qj~MHE@78#lSmB zh^z69!KHx_9_tiTvwTb9elOgnp18VWq^I|4oVWm#^1=M-M23+<#HD%lIyXpCITN{z zCq>A4DF-@s=7s~La7B6&XAH6A=n0D1rFVihG1tVVq^_4aDbY_wECZ!@^V)NbKsz9% z`a*Alyr2z>?lDJ3=vUxlU2GN|WpDNgp^|>&8JU}S2D6@!Fuk70EZ&iuxKPhF5`7rl zFY#C<-z z4TxL52U4jd_Kx$4#$N0f$MAd$Iy~qGUMQD=1t3wzN?y$PAMCjn=a1tLEdf&KE|4@K zU}k*$0!fe{$K{#_GG<78l`UT)$rQ>Gm2ckrM+!(MhO)RZ0JPg>qVP8vS>fVQ2&BwX z`_JK!KFo1paElue!C_UuB9kaK+${vfU&!GFK;!W8p9>sbjO`W4WC)j5$l}y!t`y!? z9xr6$G)8)h^9NZHuIWi(Whsh6@@S1dN0$d$41bVzAORo0T$9H|&fI>0^83$OUzPvd zCUg;!4zbcz;E7Q}M$8|0Yk+uZLj6l})gC$y#5o(*e=anNzzvm{aL5Fs2n4}ZVY*?R z>LOf981xMCIRH%BPD6@d;e$>?z@_gI?WoAvnsL=1i-lMOL6y`e!}>9)+QP7g@p3v4#WiW%(!P_8U4%#E*M8smHm2x8^#*D*gr>!Y#xXTwF?9AbpS;2 zM7+rpA(JOU;oC%oHk1BaWMybh9?_=KEfn{P{pjBT49_1+m?uv|1b?xDGN?yg$&5R! zgL*_1HMW$C`{DfGP?r9rdN5o(#U`KZcNP$LNuz)&a)}Wx$3pj|Gui`JrxAQXq{)B5^4ffCkG-e$Vo{fv z8r&4bq<{)$emu~~lzI_&n2H$;2$bXa$SOg_hoJdm;@ud*h~`iZk1hDD-3eZ>WC6dl z3ZSPxDXZ=rJyH~Onu{-z^$@uiv8#>Mf`#-bU30AKEBhzO9P;iQ+r7v9A{elEVqLqxc2UvXM|NPx{-U0j^e z-i7|abcgU`k~%$22}4IfNka^fzn|Hv76ga!lI2Y1?O=-kqVmE2B)r?#A1M`ZjN7(( z{CkU6DL<4e%@@Xx7N#oI{I((v;w$9xn9!762uMhWh`3l7FjIII9}QFba_u{^hZE+jT7xrGKvk-cVye3*kBNdu~QQx67^tI@Bf zNoHyl?;>Vu*^4a=@YD@l-wKW_4an^qqrU)Wv8Mv5I@00FZ;c!7yY7u3A*b2u#X zu-F)H?`T0#PRqrp&dvt4!;vK|BNR1;DZ{f_95;u8nn@!jH2Y3njDBywf@7073h~j| zQ^&&D#U`UTHbyzX1r%tvmQY`Gc*QTUNAbb5a69f|(`4!J-G86G#2}mzQiO^GhM$va znABe_i_~SB&P2gaWG;~Pe=O_!@`u0*{>&#K_z?#gyrPni3-;p}1z-}7c%g?-5MCoj zd|69hbRi7NSA%%jn(dDyQ9c{wshI|7$bFHM;T`ul!2WLeBq`%K9Ugew~STx!svn( zKFK3@Cet#%2rg>7MD;>wC$p0>Vn&TjYI;-cfx|bTmr^vBJ-&q;&_V$@ymmMdc<-)(cT$tn==?bW?KpC3h3Cua}2zW*Tn0Q5GnZ3oOW1YM>C5 zjfGM2?vvyfhO){t{t5@sq0&8Ryd*d`3OZ(9e8tPBXtyqX8^dE9u87l`uHF({tf|Tn zb}olX^uw5oHBCI#|MJ2x?237~!2sg$i+|gHAxY0i600>?AQ)09oR?{~#+U4*W2%u>&y^RGBWG4_{SgKK6Vll^WjOGbY=t1UT(rHB)B`ZcMbd@o1 zsJ38`Qj4KF4UAbiWZN4DNUUqjDBz4Y(^9W(+A`I`u<&}*Adx(b>2!!m;|3l1q8Ynv zwe8k{$j;r&j>v#F(;D2RX(^+HdEC8mpQJ-C_@K$me7O^DY?RT|7GP{OH|(c6=%8~} zXA#3FQWms9?FB#zuC5r0uy2ig>SQC(t{kyE$=vKC@;{pQDiWhySAlM$RGHe_K8IkZYiTcRORhXi~gy|~nMy*NZWhbvOI}@ShPz=#_^0aRo zkqbV>l_D}qXD7M*n%YPW2=Iz8<`y~nT2vj*VaX!vfgiJvY+20)N}_(IIY`b*(L_RR z$tY~AG@NQdx&@8z=LHO|s9xa^Xfw^0?qf`BF%J3+<5n2qfN)9&%;FpOjKU(LPQWwC zb<*&uwkKhxF)56_7kHN{!&FN)j8V@ESnz7lV+`fKz%~zk!7$~8bc%)?_FG|6Fhx5} zgRm)=&$Hmm=j8|y{}X!WDi|n~Sw&3_DNFrN=;<=&F$x4Otn}s(8~9liq4g7V7?_S7 ziKv!x+_o(XMwb_XnN^3Lk&JuyN2MdVUM4eido=UnCQ0#=fTyelGE)3f-0lLLNcfT@ zG+tqiMwLrGHbZ2?f}od?Y*jRgoaui_(`*07WLw+h(pZ2p@9=}*zarpw$lMRy_yS{} zyHVrZTMoa@Fc-K%VEIbVkol!tAeKz!vQPcp!;69fMlm{gvt!6cC|d>bfI-iHs!u*qMNa>I>4-QM1zU-h~esL~>Vag!!ndKj6U zbFCv1%)BQDY2pU2$xJXG#LrlaXtun`NuF}7>+%I$MGh&%gVx)3m&|CX7Dqtx+Iska}pfI z7x~2nQ9(hl6_a0-37SrM7Zz|hdsMv5c1p;NqNdAMCZ_}3CR4d$To{fY&UcYRVH$9H zoV*4ZMp?r6W(=zVE26v*sF$OKNlkmZwnTx+_6#t=ABpdJ5lErZAzrj9Nqcv~%+ zMO~C6T5@7Q^3sZHPhTUAqj5@D@{N#!0fGuB(X`1Abn2i(Mj9MrsKz7nt=6Lra50g- zgSj_C8!rHHi?KqVd=kmgM_!a;P%mPmJSI8uLX-U>y~X$?HM)1ss9|_v*g~W}k*S#k z)DXl)1IA0BFIXI|Sb(l8ff364O}D0>VWEeRy@l8QsLCOoL8kG7m^uz6Ws6Xhq%nK# zR`%J5sGHJE9?&6sF|iE=lFizUptqPFt}ZIsVF=rRE_YT>%32HXH6jk)O1S!7Fdqjj zlsU(qrqla_1RrF@Uwk9G7(DMa&wY4urvzqasPECITs$ZtXb)r=M4J#6YZ)W$JObKX zF=TNdia3shu^|rfq#Yx00vvPCID3I5;&_wvJOXuyd07*O$wN5?1<~SoC*%Nqh430e z_pv)z8puEuq8>F09zxj}q;Ht!=Ulz}v^2mxc!UV-TnHZa<3szR*vlW(6q;1zcZ zgx{Iw900jw2WLJ6U$Kq=GX)%;M&R|WMCmaBSOjh&9ClatGK%B>Mo4O(^q%l zn2@V+#^E!FC*X_l1Y%hJ3v>uBznH!ehu5KKTqY_<2Ov&EWQ4Xcta2D43mpuM-}B)j z36WX^oa&7&KA4*(xWtEws_);ww5=BU`!lafcLSGAk3GJQ*ff#NW zhln)(q@2GNMabQ0=}}eE#0xyaNj&i6nb+=tb}mN z&K0^KL6~Go&R+aLI(tgfApu=25SfoDtH8~GZz4!qh26_<(sOlF^^j`dc zzR+1DVS2fs{Xao5BTvx5I9_U>BL}Ho`~VkADhsfHKn^!z->)J8RRmF%)hVG=x|K_kR#aaGM zsu%+=hVE|)$Y-18uHEl z$F>g%rAK79b~LUXtd)j?Y6C-3y2*!v>;{s2F+)uTuj=UrApW>Y-0@5U-P`4|8dMF` z-LK2T|1`(NPynB%Gszhw{Rs2s!lL^*~mkie5)J#5W zUOyYjv8CZW53Ift?F8Kg4>2s5 zQyV#Iids!H+vvPteY2sR=hXA(>AZjg%oKSDsl)F;tKx3k1xHz%+<6VQ1rV7|>-e7! zA^#!{ZjGT!bDGfqB3k?BhL%4+wERVytavvRQLl0O8YO^=z&DVH**l>YA=X@H8}(f% z?i71H+v#wL^vnGTli=m7|5Yk^TF8(jI?=@l`L>D6V19h*+bjhk(2Mmu;~I8N4+x>R zz0W{_&_#4*9URwTrkdS2^lve{SiHK6s^(?->6c$d+2)zc^2@xy2^UI(ip6B64V*&& zO8-4iBk0yNK-_3rZ2*9aClopI8u+OciO3>YikY1Gh!$Q>6rhPCW%~zX- zVJx(@uUZz(<89nI5^y3Kwq%$grIy=K1)DUAF(43yxt3elKtX-nx)zA2pvsF|+1I1{ zh%_z5#?P4Z!WT9sMTWS=qVxq{8_UqU!5X!sWc@#Z3j7jZ@lX+z7w}gsM0V|80|H{i zbvBf1{N2FiTljP@cN>{;8>Ao0FQ5|S0g>O{mVnQ*=?+7?<1mp>g~gJ==0zn!n*Eo# z;uFTM|FV{ut>NmfB-V+efRuYUC7^fwuZCbYsu2PQE@DYIgbF{laieIe&tHaePNjyH z|D>a*E#;c>%UHgfYU_gCt{Esh%nQyU31uW`7KP3~5y2%p+5G%3F(f|PKiMLSbiiV$ zb3}3_kpERcY%-=2daVeVR7D`s(!4?TCYK!Z9{B;N`>hdVC3V3ExOfkWia2<6&&9{*3E$qVP5) zDgs|@t3V${2HIEI2}3zo`GZ0DCHCDz%U?~yQluqb;1 z2c(PW*hH;T)i+%uibmvr$<`@eL}hAoRa{<&_n#O3FB zNTf*9@^e}2en8W_iLvNU5xCaohIPp=iv+!#y*Cv1)oZZZs$njH)ZJ^_&AnL11A~6~ zxskaUrN|un#ax8HO z==1n6jel$%$%6=#6Hg>E2k|9bj_xCg+Y(0-{YQX=e3`}X4ScBp_X1GuMsp)alv1k^ z3W@YlL`|ElPbN0KM*M zigT1%p>t9IHxx|Cg{CQVebPmm1ZD`BBA618!pz9ikC;uu_hmZ7UewVZ0n~n!cjNy@ z@5~^XXj_+Z!i4GwQW5<*vU zb@nL`gRqSgqeX7gTmCl3@5|rLo|0kKH;^f2MwY(;2u<#GbS!^^uB+v5b5kt3dL>@H ziRtuxQbmZf19*nyReorbS^H-V?y4`HpfHY}&WJtrc4X&}fvPat_2E_`vZvHI0z)WQ zT;@fF{eN`oEdMtXGZGrQiac-_bZe%wdn-mBoUD{zp-ZL63eeULT5^Qm+P*VIn~IPv z7k?-Wts@X_X}4n$n)1VmH*gZiaM3(i3X}nV7|77brac@5Ay-2-@7HMKa(IOy6GfGq zke(h9j?ZDLk?}(ME9ST>d^j`8qcKuZ56CF|QQET-B?jNuz*5-kI(mx|yjcjAl5jpj z^5O&o3$sPO-L?&5C#?Zf6^1Q!Tlc*(5QIEDy{(VU=ILz`0S#n>=5*ccy`&i!!%PO( zne--2dQ*^8gL;lDeN&vpzbU&5bW&B(cXY2A=g5>T#x;wl9)VqJ7!xR)@Oan|0ASQn z`~wg$QWz3rFISA->vpkIR$dloEB!mpey0RcAyJs*D`vA-B zV_-lOfJk)^xX+s7`!GgCWj!kGX1JXvQ{eRx^P0wa_37cZomz?bELFKy4em2Z*b_N4 zBjm1oGZ0s8!%ROlI?;xU0V**NY1KP)H#V ziucmD!7}(wzIkg0jtS~BXYK5*R15B9U#^x*BxgNrWhoU;B>IjmU^mO`xWIJlOJdMO zJ~CSxKUgfE@;|irrj`4i`fH1jICkv4>(Tp)wMRqe`D{B@nXgV2km89)z3SAXyFITk zd!n>}S}f0G4i;;LYOb`qhSwAGwL;hURIO6&oW~hLJv+y@kH3C=`!ST@K@T)MIx{~r zU#LF1dv1;;d-PysDpz`RvM@XM==cNsCl6F{;?9{$^@&?d&i9<&1q_x#mxYHi4(ypP zmh#66wHk=<-rSr=_Cl9OZQ$@6=mx38)=6@DcY71%T4AP8y`wogoF4Qj{_Q_oE0oDw zV(C66EJ;@8$l~KW2JS0WPUK3(cL~e;_Ttp0`D%f+&`~Vc1|rFOj?R~B#o0n;Z)J9_ zSSnPH6{@F;Qw1;UvT)@Oi_%V0jV3w7E1Gok1J%l$ z&3(v0+WK`8y*-w5EamvBlzmeH1Ns79@9F|G?$`zH?<-6dXLF^Vym{{S4wNdnTIW07 zd3;CLG=l@PMbATp%Qi6&N%mAK*g#h9Jb`Bl7;?43B)FKgf$rVjee=b9Cx5oLT&o9A z0jSR&)DVN+cpj~s>7L6~!K( z@g40Ghf|Y5?PPI%`1e|JAAjOT`F;rCn*d#i^+AkSaD|6~reETQ$M?b)?vflC1~c z$mHcD8SOk+$>pg>3b|QoSUmji)Mo=BEf*#Zk87HB6zhL(Ms%wv`QL4+@PQoulVL!| ze6{F*yLsug8vn@@8#;ZVJVn{=*;^^ss+CfY#2nw@|4n^nxCFK_{1f9y3fIlSRH+pU z-s_w9VBAFgD1ThPPs^m&?X6Bnziqbm!l8oaM|?{}`H!Y2s|%qtN7h6hg>4CcCwtceYhsoDw=NT6v_kxMSF5>& zyVpc#fa+5>I)K9NFT>K44!IA;NU1PI8`bNZ2;z6InL`9cgM9X{iJ^Is)#OR;_OuE6 zi)-SuVD*VvhenK;>Ej_Y{rsrE)Pw|(%n`$@O2bNPG~BW4Ri&aCCye#}s?zW)O*kRr zg;$Y+bqJM;@H^hwf(#jh@l~XI)L(AGIXhr_HHo;Z2@M>i)z5#lccNS_RB7hjvnCP; z)(8*#I}GC{E4QtqFV#~?roE2JiO2gU6h-btsW1=pLfQ0s!O2s*^=qa!=NKs0U*e^iF z|CB78odf?0`L^n*)e@o=c!bnkww1U>FX1)H@s*Cz*2wcri+Ntw&}fZ(=Nskw%I)wq za-D0GYna0-PV3OoYh>6b!g4G(i#E`Z)ghQyL#!4W6 z?f8!V`)jp196LV;ixG|-yd08&LC;Bb==guoh*E>+vT4*RZON5V#|7lfT;mBkh|*X; z(BwR7*1j0YiHs7?pFcm^Z|E1<_W!s^DFy0()uMJDsd%-a!zVm+2DM-uxY_Vz)rWxy zvusK2(t|fla&XnCAd>cUBFdc@GnHGk>KNT@aDDn3T11wUrZGvUtNcCbH{gfp!9=# zE0rgT1^Pa6MVLHklJ{`ogaJff9WFKe-uVSMq?yDU)Tc|D@!-2I*9fn!*3DJZg!h-H zDtWlk51%entHpd_WNO~4Rc4FtDkyT{dB2FW$#?nsdQ79M#sD;DShW!K$G!^fwH4L> zeabe{T3XU)Vdp@oS}6G~rT_jG6rzmzkBBI@M7815W%$rvSy$ntlam*=TVNr``k?(; z=gjIa=q0;UL}S0gTCT_wZ3A&v;|{i-O#wT{J_3yWl;2k z(aEd5!sq*MUxnHXO{>`ADh_jS?z)WpLF*5!DzoJE2V;_dI#yNok^Q9tm%9dQV_KL6 z#Mo%V)y&(|tgJzRE+WwuR5R&=h;CS#*)6YBuRPOkV)+AoXk(N4_92egjc zD2v37d+h3Q2VlJvs&rnR4xo=pvxu`uz(}QKtlM8bNUGlrLZ(?5&lRzG)pnCzx<+#UpWHA40C!%FyHklVF zEDFXKZx9QQP86z#r_FL`S(psG-VM@AwSyrR_Ki&$37W$@Fo3@VG++5pq*IsIm z8=FxkP~GUIAhW%5)k3~F1^pCTn7dlvXaXy(F%4p8rbas_b59hyrYhLCwX+!^1hx2d zk!vrbu%fC|m}n)jKw1n9DLRH#T1{yoki}$ZVN`3hI7o}35iQBdDkjpv?K_$l&j4DC zN>h(o8igxWOO1srk1_Kp1;fr5^eOhaj~&5=#99L*A%GoMxY)#;m4XnQmFb>>jv8X? zqwA!Ic2ukE&e7P~#ike{>U%V$=(&icRZABji_xlmk`}5TYZ0)-peCSgN3pg+UKJ`= z!d}P7`_2Ii?{UAI|G(82oq$@*Fe`q6KYn~iWYy}Lc>yx&-UXu1_USgyi9-S%rYD z%taYp&srPp*JOI-Un*y}nR-dn>b!v&v~5>_+nbMp2rFA)Y&~Ls?-BI1y_(Ylg)>-Q zT01#Wo~nvBpq~kBMcz{1W)FjmJ7Pv#09I{tbA9eb&{}=-Knt*1lt^tls-jXp8rwQ! znG(s`pfeU>MD4_|{ZPxqHPk&ZjJImj8^a3p+?b(mEYi5fA`bdpIZqT;9jO%e5y;Tj`8dKDs)_bNhs7-*R-2jEJ9gRcW@Cg^hO$Q?6WPd&3@orQ zFRZGx%kr^jNAltl`C;gf2P$Q&MWuCiROV^}m1=ROSk9Fs#(%MKO<5VJgNRBrItpsR zqN8?f#a<38S;zA8qaFFmR1fUBIV?%@f3!K-R_k+HR3oJy5g;pZ4K;lfT9p09=)SK9 z%UJmSL?PeF&al{=#`>uv4c68|H1i1aN4M6;!`_$@8e8gaF@_{{d~F2lCTJvz?}#vE zX1)B-Wb4j+2m))j2P%qu^PE?uS$DRZR-rgtePF&+di*jn*Ocog!N|OA^p*?$rRFp= zNV=|;6Ya>?(~f!$I@E5K(l6|IT6XTf~! z!B_5*@qej#aT_9e1qHtR;$NZdB`B6FQ!8a@nE3lrmW>hCx`M>EN7Pe7^%JhQ6<9T{ zwJ~Z`k@R+s82{&+ONeqcn(q6;(7wrv>jvM_oNl#Ogl^kM*EOkAX6H24gc}Q9#P49M zIS6z#2RK!u9n%}uVTY>%vZv$>P8^U^h@iqwW9@lW_O69MuEbs7FmDQgqLMvam3?Q& z(ES!R1)mOu4}y{5zn=7xf~c7tyl-kwBE09b&ZxsdL^#bvkKw`ogTByfZ1c4R3PFqq z`C85yG3A&!LhX=I$ohQ`deE$iF{UGJ+Oo3}XyQM)f@wj82na z;r3iPzhl^BU@c4nTC0;*Cg1&^tuHdMa>tEPwxx))v|<~!YC}d4pC8R=k2qPOtjN5S zv=8Lg(u0%|h4K;6V&cJxu5clk-C&ePgzIg1n zz)q3WX*ylxZMHdno9g)So%ISNXKa{N4gxBf+19S^JQvq~pft3-8>hNmS2L7@bBn}AErW6&r(Q0Gfgz`aZ-8CK&tU%wzW_)7G%ks&z z^?uvZc*xg7t>$l=prwE9JYtIttS$(zzB)uV+Ov@6@sI)Z%#m#TB2kgLA2^`vruhiNA0s&G2lK**HZ zU5g$6VJp906-3fGxfh%=fBrU5=Jnji8Rg;>x7pjZCC7I(n8~k~i(nBxOQ+zigU_1a z4lV6ikiR!(h#Iper(jn8_zuK|PFNYR-yozo2GG6ob&Gn#7*VO6jP%{LI-J?!K(dwKd#(S!qMXr(@rhqi@0m zvDAxQZun~|_;^P>52F*qu@D+orb~Bs>&aH-zA1z>M8CJuVaFkgu6=uZTFxq*Dnji* zm~=0RmIwp6x`4yE>)de!LMCZM*jfgraEQ9wo0}`vaE=Df#<;Cng}a=B zG@=Hy7ip@fZE^+Q)r5-%I>I(j#vxkXtYuoDMJ(G`I2hu>mf$N?M%8t9FesZz%qj#V z#YDm)QS{7;a<1_h8umD{G%Lmi4-$8MhS_s}e1On_Emlnszqfu3`;J z1j=t~IZ4ngdQo&mHDt;i@H=ZM4?3AQw3J1Fg7hht?ukjN;x74Zuxu=75&|U+qD4@$ ztZ9WP)=-;n#$-tl6<|){N_0jG6qI#HqJ#J2JML`4tyltPBvI)J#|h5ly=GMvNgt7;W@N8QX^3m4_*bRVl8i@J3D+@?A|^5#BowVQ z*R69nN)^Ica`JoxXZ7vFX*(qxl<48mUSkpKEGp)$M5E|i{|qf%Picq83Bsu#dbm6W zQ!Y^ITupO)M=#C?s7Y9qrBW@1vIdb&;cOv4fVCKMdR(r$aD1mI3rB#rL2|S7;6P&OzGZCLRtQ4*q$YT37gMUXp|i3C>yxrU2TjT$ad=H9h%d`EYU;NE=)BJ16oNpc-dE1m&;n958Qo!ATo zLGv*bW2C2dN~9e9LB@p)aF5o2mo`rm-M6op!^y*54Mo_zuW(|12Gh3j!ST&zfD?ip zZv@-@BzbtgGY_sN`NM`W+O(P5V(w}gGE^%!H%)}n>iF1uT~k;GdS_G60BwjGZ)4G+ z2uI)16kXk9H#JSBg1zwCW`G86XEV6fwpkZexXyaFHA`qR2zP@`i87YQYntKK2D_sf z*eXM&X=xR4nC7OmXzzbxGg?HCY;Oh?Hzk@DQP76zZQhAGeNSCC){LSEbn?M!@xfZL z$3yz-D<#$%vFo0u~2fN49`G$s&Jr`oAFXd z3)AL|*8V+gV&xf$AD){(QG&t_!=~qebh-#tR;huie*1c;Qm%9tJwCEHd>wlTo+x0Q z6Jd~hrckE49HC<+oIzOdy5z8=YwMRIu6x+L zn}g4aQy2-V_2H@4Jy+^8AViVfn=9Xsh0OcWt1hTJr<3s=wS~E>_RArK-u;*fDHXhk zFFS)CwsIzv>YerdxN(9*S&y%Q-r5z$uRJ=q5B7kiA0=vA5QFUj7`g0R8n|=T$Q+aD zGN9;{Q{p&)Yp?>W2@aRsQVe*A;b`ZcVr@Hrc68upGZx*>7Hh@Ryw`&B`L?$D$m@rz zSk+UgroeI&G?!!KO1IY+v<5_3tlh^zLaC6p4Aa-7Jqzy*>p~h9q-$u06|03G;^~`c zO!?hYxO~HNKJ!k_#dPZ?p&nCrot(T)1=?xgew>_Et#BVqW!}TM8dtyM8+7sw%1Nf7 z0ypiI1G)B_vp^jc8y=|Wxu8Yl>|%Re9dv{8Qr_!AzJ+QRxL)u&ph6p{*)?crU^&E7 zP!w7R-O<1_s)M!9*p%eQz=OC;=J52PLXHQEzNxh;b}WgBWhbYW8(1fCI+(c;+i@oA zR;hb^YZQc2Yr>?R&%0~=7;MrOt1^`Na8NAe1^bxw&ezq!0S(=>K3#_WWu87>oFZLb z8aI0m1@nSfOt+qnyNcT)p&gbR^gGl(ViN9(ImSb!tZ&YG%YXq=|lxE&_0QTSWd2|t=PMKlcTsGwJ>)OPwG zZM_^(4FA{#*o2F+D&wTi{ENpn(C$h$78+mUFg}i>!`Z0CA9APdo?TY z`%|D*VsM!DRJT}FJM^(LBQ>oyo=8c1ZAW`;=VIqNWhI2+GUP-~G+swVTRXa?I=gJ- zqr*jZXwhcmztB2o>Liad$4EwyhX?nqEEgCLO{1?@f8h{M$=h|AtlH8#36CVUbT>R} zJmy;F8Y@-ivNZYtuGxW>$Ee5uxz@>Ogkzn=w6bo`wovftJgzUphQkIfntFW|!Evo# zvASoWYr0s)i-$o|Iq&~k>t&TJ6-R?5Zf|+m*biwN z(ER%qnZESWjUryXH?DWo<5HsR*VG@gIgl<;y1Uj^?C^56o^$&TAAmVMcc4u>>}G z-(7ziuAVu-RCX>=_OD)UTJAc#u5mGJ9u1ttBxA1|-g+%;=8bA2>`a~ZHrLO7;_wih z*|?cK&1p*FB5=i1a8DYy3>UQq6ET1 znP4f509!G@r_sUu{Os(49$mm;eMhM>GlYM7aRC zm=ET>nw-Egh`Il%C$Lf&hlP|et(-ig>AgV-1Rn-+dftC7&z`B{vD#eUykR&Po0^tg z9YpW{e*N|aCPh%xTaNDfYHbVl@VUk#8X#@JAltzkg>t^`z$RL8(Iobb)z@bIRd!>J^x6#r1R8h7tD~s!PDO2o~y(e3% z8b@Ir6qe}bbVX?%O$D^{8x=ND2G`O->!W~gGCK@{Skors5#2QXuvm^_ZCi!cRV_?o zDGTPbRJ@0HNSX50HVh-+xC6bOs*G&M?d7?cmuEbFW-wrAbJ~_d8%wOb!CoEBoHJQ+vcZFG((dhO_jdN4J6tXtp2mBJ zSE%*P%H7&xVA?<}()5EO+q+Z3Jf>v4$gU-;Y5Z z&E_^oU(sinZ2}wZ2f7r4==SLo$>|fCmRp=2q(^wG%;d?m=6+~X+?`f9T;5wMViUqK z>^u`H0~E66NioP0^n>(K;bR5DIeuze^=KDDM#e8C}#Dbyo z(H)N70Pc6g#CNeKm2qPuFb^l&eD);UQTG2e(}tD#!W2fR7%u4hM1Ii4C`XfQ z*fFhRIz*E@QQ|z%GLVi_1HWyiVk&n&{3rbLycBSs!X|*m~2q z(ZN`vW{spto@*JYqg#-dS?}T2tGIGMvHrp~#MP|OJXxe(;>%!oJv3`FA#LSC8$hyh z;&IA=*C&ox)ma-r-?1W>rH93%FIPH~Tks}v*KMJJbH?I!ieEDkrOL+AXe(Z$bQAdo z+cO&_a1DKDlQv}$7y{X@o9TjB5^06&CeJkf!5J8sW(_h`mKl;nPs6eqj>Uw2jEP-I zZ`aYxI+C)mmy@BPz3x7UHE9)AtuGlQP_^6cbrlcE!Xhgg?TxPl!^C!!&j93X=*2;otcIFAJ7G#-fkr!j=Ndz}P^(+&!T zfcMz|x0TK}T^@RyJZl3%CNv224DZ|5iCa^paZWDmr9H5X$QVIKMtJK+C#kN8@gR`1 zUMG8$W>XN16W1%vLCP(wxe;VX(X-zVpTSh|dPOgixP30){@C0V)!Z4lrEngGJ-zW5 z?@+;q3w;^7wMCWLmp zE?Qe~&17_MYw{dI%Nh(`S=>g)uUr1PS`3oe#c|CfJCtH|zP2cJM?zQH+>hY~Yd92W zNMK{;Zfpq@m!)~fWJKU4RY*}HgzH5LOsd149AHgLJl|-~M+Guk=|<7i0P3nc6xWUI z^lvRJ^n2ypoOiOq-Gqe!cv}xvFncWy{6|3r%t z62dWV(yqlwJHWKgZtV=mqdbp&G_RxgwI*C4iURduo2>}gyDy_`-=n;vyczACK0!I) ze#u-ukGoAoxI{F1bsr4QDjCL+$e1jQe9cgV!r;jX>C%ty7}|SKgRUdbhEN+h-4I1- zVr4ULRKP{J&8A#znN8F69=vWO6@j2J#93b1o(!ja@MVbUA~E9G-z}m$WagdJ+T(hf z27A`5+}c&kL4y7%wG?HFp*vr}hO9!W=)tdz8`R4)-P0#%C$vwW<~c?*DKU?d!kI6i zpPl`%a6Gydxxv0YM?;+?*A?o_Xgtgj`2z)RT*2P#2b+w1>tG#kjx~GkP@#6RlIO%A z?RQKNr8EZ1nJR6wBj>D{6oTltafC@540|y>gVcSYwN0rY+*U}P+wGBKfayPnQ@iC@ zLc9#R9H7nQBPxe`=lGH`vsnoCo)ecKLdkR7J|SQCNqr&Mcg~!mCtw5f zhOz$%#lwIgpec3kU~cwAJ|{`Aw1;019z3TLY`KzL=yPu9oUOT|h0@_UK#aJU5UCqh zMat}3!Q19O?4FyeR?Ze@p=V1AG9M@CHaP&xSLMX*_2O9#M=Dr520696NMt+QfdUR@ z1#z3}r6MU?-3Q3}sd?uELT3Ej3HdI&&Pt@o?4Hu5IZ);fhGOX$PI8~B4V}p41qL^# z;g%q@yd=0QA~dW^2jr{e5407_2FA9Zn#w8wBXnEV-m~pj6mT6I=|QU7LYvfgUR=CeSUg0&r$_Dq=jsoPWO*U^zUy~nTv z#za~UV*CdF4u;rDO5JRafH9`+l>e)j%`u1NvUs&7f9q9~WxmUHl%|axq)z13^tJPN{*mdg=FIdo5!l?D}nkk8%sb~PkH@=1j&W*VrP|NDA?mWo=Xx`O=T(7Y z!5~qFbQUJ9@%A+pfJu)UsIME>Ko&rW31`m#qxyZ#TB-C%KZ3n;O{+!98f|!E^;s`P zv#fUvKJjW`k5;VHWU|=5pvp?C$JyDg%6KUnPLUX#lDpenbZ^l!sk6{ZWe>|+(GXev z^VLGftT&UjB@1-f{`!kNEZ}$@);R?fVCmxFd^_ZK=Z2`degIp((fws(v4|4z+nfvO z@SN4Y!$i!v${@Yx3C>mh4)^Z=uxcQd*}8$#&%wTrcgOUIu7y% zv0TZSj188HyYjmcsgC;^9L%s9JTw4nu-|ian&{Z5Wy&;J%aj?pY4MZ(v z4)Gcs*kKbm5eXaaOxMC9Xp7@f8!(GQro9HoDOk85Q(43#D-aKbmbxgPu*!hTG`JSD zWBP>Zy9rOFQ%rT-83?s4w>U!Pic_k9sASx#q1{z9KkNgyIrC#EBNdg2{MPVy@0e~E zE#&tsD1d9%GQ&XIvshhAFGUfmGH>lHzQ zSPl-VOnLpVp=2_IgG65FVP4#1j-0h#Dw%dDi)UCyj4t?i9a5k{g}>r8vb4s!7KM$X zLxMg`+|c3^bL76Qi5*}|6I&;wuK{LG@WmLx(rJ_#7^5(6|6b=7puSdFLoQ)VW@v#b z4tUk*&IDV;m=woeqh$rx*T|_g%P7XuiTo%R-2|8s(qeeWBIRhXE$NjNqfus@6=6yB zpnZ7G-uu0)!Z6;;Wtsn;?;Sm^VO};d&wS5`af;!xXmY7X*&0#Ds{hRVLsy9lX0YC) zfW14^ZT`Ri-q9b=?6T;mgxFD$4C?ERwHhoP*KyN%TXJcxcGVV@1$*QDXR$huvo;4R z)#&;*tb>yjw8|L}O^UY#yJiTQbX-%VXn%ZH0-^GxoHZ-gyR;!czIQ7^E49|_BBMpWmRar-&nIg zWrxt314gU!Vye_qyC(K}8x7Rr7$+00*cs38c?{3%Y@K(qciFT`UTa~F(FxMdW4CHl zGKi#~(qn}Q*J?dcfDA1)xVOzRF4oDpSIfaz^)sIz)H{w@`aacra}lf~!K}0vgtuWz z^TAG$#FUcJV$5W4`h+Y*nJ?$j&rB{jBN{e77G=*pW{w+JXrJHFKEIPO`!EMdZ+zE0 z7w-2=<6Kkh>}Yi%mTC5qwwJp#;QuPLK0=bg%D786FpD`5Z1_7^sXQ@1*Ou=w??Y4Y z=X2D;{oUe0?R^|?63TMh1L%j_-HvT?>r=Qc`|;JNB2A4HNS>ofH48CH(ZK!1e7;al z=?nYulx@Cnk2w>-`QizYhTjLySzV4lksmPrG8Sbbf3U&+LbGtzDTxMJ7pI`{&>tE1 zfPj5)1JA&bogbtaxYK$j@(;YiY+~rT@qTK)&})W>*ik{5#NG?Fd06U=j9EP#?9pLh zKFQC7OCG{f7;b*W&Lvn!aBCOx-OAp9$Y3i?XdMw2%Q#F`Yobeq#C;oZA&eWnW_};5 znq%D6?A^F6qwi+?gTZ8vMtJ+0xRusKZ_ytGwfTr@%}V_v*Q7;Q(j?Z+lM0hjN9;^@G{NDFs8*#bMShM9@VCWRg(ajY4;RC`%Y$4ChTH^fB>XYD6 z0hIx~CH{~mlPTH#p``FWtDVbp$_A!*p7TEJ`4?XX_x|Dfta7^Krs*k&;t)5B)q-hO zo$L+G?78*R3_a5Q&@6FGhIq9sa77=W$%%4{VC8l6kn6xp!Tp7c~`TxWi|RO4~yGQpUQ zKu8ozE&;UXEvr8x7K;kN>#4TKJ9*w>_g*OxHr`S=dQ6=ShF4A8d*_ZGGl`CQ?(i~? ze)B4v%?4FwC%jWZRDZd`SY3IMiLAr8_s%;8Ja<(3y?5T3nl@Vdq3yl8isRnb?`$^j zY^Bb2BiP?J@MLJQ^7#z>Wc=tIF7Lyxy>h-)2chcXR`UsLw9fH`{iUIk(EtfSiLDjq0I}Oc&P3#Sh ztZ?7^po{W&;||#d+btaIcnH=mEWx&BHdf8dj+3-a**EMdui}bt@3cGXq?JAY-swlf zNuZz`961n%l56U>ZU@-QSrPn-_7WITyQ;}4?QtjNLqsrz%Dfk_=J02Kjv#CfIG==9&9BsjjM9_ccfz2o(FH11ZZ2#)W#YrV%z z(JIEuL3DEs4ty{GeK=6yC@zI57ETvBU~z0vLmDQ(0TA>0js_BMGO3#eUCpq5m?$5D z_XB(KIfO_R&dwEe6w%;rKa=rzoy4KNk9Gtyn!-8sC$(e3=}Z_7(SB&Kh0vl7l31l> zdbUkAQ`CQ%DzSv4uRt|UP~b$yWGj4t;6)Qh^RTMd6`;X&36@rSlaAbJETjKJl{}7J zxsLv@qOJy^SH1uvUoXOR%OJKk1d)UPW0K)UA&NhBP7P|TL%RM*3B$(1HVg;0IVeap z&m!Me#401SoHs{VWzcz`UT0Ug-r4N?2beK6^jmM*zgwMzz0o1)`um!Rh~Z?b*t zvFoDV1b#n;qx-cd@#OIBA&fh?8V55pn4_nSee2qZR>61DA618sp_~TIMak%TD);W# zerE=I_%YPQ5=Ns!Mo8Lz4!q?oK2y7^OBV-8(Z{&}m0FxiJq{GgqNA(pA)atNNLarz ztcaRMAxpl@cnuzu&5qUM=o-1KjLUlPAq|^#4vWqTNLR?srZ|9|_c(g(vtKyQ-wPio zpl^tlkmuG|D6WH39K+#gqkLnBnAL&UY*utu6l<0Q?&j3Hdi|;XI;f^0&J9r1s~9~W16^Q_e|l&7KofFbO`~kZ2^|W?-wm* zXm5eSF!+GH*n;D30=sN6cHd&Xk_N!M2OJ`fo_ngo9VoF2=Ncpqr{J~Zd>^wYEXsr6 z`#gL{t)sLl97-E8VDdOvD9_YR#;%23gGPl z#m3%ikVj}s!x&#W;S4FfrgGgL0RfKw4l; z7<_;)V>U5P#4SJ30-Xd)S|4BRF35U3w4fbFZadO~5&~5B5uVAEyQw)76mSTg#o2}3 z^EIqvhHn!*k4?wbBWqO}E-pR0FcwDBbF?sx+Bn%lbr?w8h6Gp2?rGR+EwrQn7+o3C zjY-08`nU_#7K*Qcy)dw~_lwm^1aHMr_)GTg@)h4uP z`OfsC2C)^@WWm@mZ)y>-O=uCb9YLH7T5EqKOU9OI6|GGeLyNgUZm9EaZ%!S}!&vG8 z%59}ue3wl2^ZVJ!xebLaiIFt+m~ewrsIXe@cp#PlJar`*j(SzCzty6Q-^fsdgX zM6@wSan$`(VRzG_#1dG1jxT)^(_AYc#B~;GxtZo75=vpw8785WGAwANcmfzpKQuA@ zV0kuNz`ZRLFqXvPbVclaYoRc=yM((5d!MkO=7QuBS$w99&9!`Z6kroOV)_o{&cb(f zCRfdS&2>Qt*kY2IrO|HnVst~}!$;D*H7U5oVTu9|DTe~hQ=1_}WIAh9P5MZ;v!`io zxq*S}s$w*CiClDf*ePGbHHPJ)ce1&VM`Q^Mx?`7hhsnz*hZ@)tU+sZMn9t_&X%fVU zYoFZTUMuWuTFS}&v4lM}HME;&4BMC%c`SXen9RH-qZgQDLt&x02)jfvY&{Ro%~UaQ z(lf8m=2V#kF+9BwVr>b$U*%da+{_wkPL)d(!-hLwI5NAfDR*Jo$C5TLfHCl6>4qP< ze{%AO9$R3i!JBKGI*DR<`*b~oSn9mD7q}y31^V9&M-SdZy@^DhLfHhJ9FmD*fiS3*nG8AAoC0P zW(06LBSHWtQ&Pd{`ORnvAUB3-c^t>@dvg4KGtNCSTZ(Y*>};vysOL3H29V)!hE>nI z8A&^L*DABk%1oG%aAM45&oXt#(foANjPujcjPuiyF)!9>mN8*^DUr9HM5yZ#zQ?Bi z;-Wq-KpVo;o@HXm^H?R&Gj(7ZjJFZxp_HYKfJ`) z<6PW6*z!1SViP99LDv z`Pgt8lcJc;25}zs!Lar@Jlw%?`8H!Q+NDG~w@sf>^)#-L^2Y0=+0l9$)4dG^SWHYm zw`x=ul=DLYolxLnLqXe271&2(>7!16Vv;ijo72pF4o>M1+V%kbVQ*JT`NCP`A9X{Mg#$i}BV>p$UwK+BToleYSvg5J2TrIYPYZbon zdibn3f+MJ7YaHv_Xf~1ptLP6;>#0XFXYVTWN>edMcpy^r)B0$V9M+u_Zxh-3caDPK^i0p*$(q^K}VSY(2|rw5{Qi6Sw-|dthsTv*`GawmCm`=G$uA zlBx-vwyvZMK?dG<5VqGz$U@N2IYMSpAGQbfKB;S>yz?VbB?nE36;-__MJeE>7A&E| zg5%rn9NQ7oh5+QknqfTm$Cf?B=JxAAbWce(4@9f54q&5I4gdw2mK8>9uWh=%%KuPX zqOGI7qqD82y(iO_Y)@u8l3D*x@pDxt{w?m5-<#z3<6VsT_~Ng2o9EIsF0{>suCt-V zUo-HZG|xXW&o7(jSIqOz%=6F9^S_wq*Uj^9%=5eE`S<4eKlHiOZJs^m*=wFD^URp% zka-T9=SG%lsmiyd>e9TF@dNVvi}L%Vz&*M2lzINBJ{QlK_jjA;hs^UQ&GW8_mcG06-}$zjl6>DTzmLlA5&3;DfA=%t{^i%{;}(6~sgJt^ zY&UFmEShBmrP8_(O$Zcv~d?wHncoz;7^+8 zi{|-P=J^-qDUAX3&}rWP!93?!mlxh5zYj3(!UGo`lDCSyRW6(|&njd6zvS=I^^9A( ze(44@;0r&2pU2po-^-u(GwKEW9Ov7o`S!~UeTqN-3O`R}82UF1&GY9e{=A2A{}w+> z-{k8T`SS<(xfB2H;LBg)=gP%IqO&L2o08wYLae?Aa5JnJ32OPmf#g_ zOxDraan+WqCF0t4gs;0^!Z*q9>*V(q`5lwr?ZC7X|8_C)9sIcyZ~K6C{{aEGkHMo1 zzWp8i{1|_Z%cmSZRpun<`$*+4@@I*${ssAciV^RY;6?d;4^#W^W%T z2EJ?qU$KEdvw=Uif&XFyU$=q3v4QW}z~9@z|1g22ZX4*afnFO(*+9kyhHPNi1~!_& z;;*_=E?pA@w*|rL1d^>u%eo|j`Szu^qR2}REj_G^`?x}}18MJAIwO%wRf4>0=}FBC zU5E|*s13XuykB~cefy9N{G<(h*an`lfsbf@Pf8sv{hU62ULP-Mwx1GMb~2rv9ZP?; z^w&$@u`%DYG0I|gIi^&9uW7$4k7Z>cx*2)hFUj{W-(sG3n&(}bcKMiOzx*HsbpNt4 zWLc$e>6-!yt$$KDia=?3)&|SV75jNEh&vwye6SLAu!r#8qr;oH0V`WeuTP)BOHgKJY%*t!^@jB>6|0^rEtc=;fU4|p*yYCNz z4+p^?4uSSO4?H@2s7q8dg=EE!JiC*9}a@g1i_C4!Ji6( z&$;08mtAn>r-R_nxFEQ0I??jVCCl7$5ck_kq z4erCr7l`NW7jBc%UU-W>9*_*#)oK8}tPNBZq9Tta?Wr#Ob0Ox!2dF$R{6rhfXXf&= z^7?}O{<1(k)yJ2oGV(jmD*mgd-YqXr$?tm<>SOq_|EW(fYU!K6^pptoXP^2En%h-d zp89wC_?#5-ssEs9{zwq~0iplY$jVdyS>pcE|7fD4t*a;5H;~Q@Wrs&LY}$OqRabAl zX4`ew-*Dq=UORfr_^sP_+_vlXJKk{5o8G*8&))q9CJsGt_}Juw4?X669B=T3RG`O|04F1+i>b3gLWeBWR8FZfUS7yYOGANSwuzu*6W|3Uvl{!jWJ z_Mh=T;{TNYtpA+<)Bex+m;9ggf6o6G{`39|{{QZO)PK?cKm4EfU-Ey!|3&{_`oHA= zvi~do$NZ1`pYVUx|26-U{;&K0m;WjM)BgYM|Aznn_@807>Hn7h+y3YL-|>If|2_Zn z{_p$$-v6Tivj0c^ANybOzwG~+|DXN8@W0`I%l~WtJO1DJ|JDC*{@?ol{U3hhp7sR) zYr_cVNSg$MpY{Y|6N$S3!%rVFU*2Tk?(0k>+QGX-2a>1SGQbh}&m><)Bs1xVd_OQKhl4d{v`b8St9<|-qx4s2Lc9x zLeNV-ZJllDG>PK>J&8dSV7M)Y-4x&e5~8SyF8s6q5fT3Zq%)C0@{zV{5sLh$$uVXm zS|+ZKKq%-+BojluJ-q{MVIZV2H2lil?I>il4w%2zL0fksi{$CvEJBh03=PTlQ$Wzu z2*DF=!-=+$OeS-M{B$JR!Sc55HZZ9RyliXhwMbFXAZaV2lK=W$k3Mw8uK)CIa)AF` zgMa-JLX9EcZ6ld0GgqMkq#CZZ)j$H<`hnzzdPr^zki2Fjvomv#aDe%@zZN8J%51ty ze!?X7yaEz8ZP|47D^UlA9#?%W!1vGZn- zcw^?qP4WZTw-wFmZf_f;9_YP1Vxa}Ljoi5T#w%V4KX2TAoMR3BqI$AbFk-T@MKWp-UDKVcI4UIB@_uG+Qb^11k$ zkzKd#dXwW~&ut*_?#$gAUzSEf&XSo#4YgXyJT zfqK{gZJ-^8s+8B?p6SnI6K!v}J+mcqy`lk3?_EGM+&?@lKOJppsC&gDgl-V6uNs@W zAOGF0$Ww1b!vCMTHvzD#s_)0|nRzeEY4I-5WrM4DZix!vv=kq=1+;`ub`!bpE z>%Z+w?m2hP^7($x_xnBTJ?GxKin>~HBx72!_W)^|5NQ?IqN^75*VWZE2f<>Sxty6B zDjI6Vk<3U{Eb~BrLtR5h5G=8oE0!X2b6sfxUcT-KDv8Ra@?B!?j_wTlH=C)cdzO`AvtbcfA{9@v!HQ|Hb#|Hm&`_| z0-nYkhr-OMoijn4QdNo3i0iUyC`CV^E2~n#epoC6cR|3 zgJ{;ufv_YLs15z|>*hBdd0kuGKfibWtRv6Arhoo1^H(2v{=YBhSCCf7Q*a^j$%4l9lK)*U%v%Vz=PO%cL*#e1f%WP{D=a3RDQB6u! zCfe!A{o9(hy^q28>i%uBwk-x9dxJ};?1gBZ4 z)}9`yZS9%%CUHttHHS3p09Ccfuf_Im?9L8nPSz^Zu(N^+%NNVQznHUdTXh}6(1XA_2M|a7V7kH$%tMC8U`AJ;8F|UbQ$1R z*01am2k@!}RaI0ryb=iX%I=jDgWyV=znKDBQ@^HJ94nwSI6oqI&ZV}kX;}jSE!wuG zeGNvaS6MPGSA)!k%!USWgp4RW}tSUjWU zjQ7z*PuzCK)HCJ=!F86!cC43dJ3n)Nqd0LE?Rv?Pv3P#d`R_}L=TA8wQoP=>*n#zu zZI@>*uNQ~wC1{4ZFh)0Ty=2(Ta=m2R$y=2%$l!~{bX~+B0$BrpGppOq&7RMh27PZM})8xE3n|96Q$k^1T zS)2E>Y65=xw3!nGAGEAaz`6;Kad5)rCkUs#6L7*)b)JB^|*nvaC#Odk3UM>`8;LF&3#+^@aEf zl0%i%w>VDqZK|FhZ@E%WP5@{c3;_ACl((s- z0(N8t!%47L-(ARz6thW{#|$d?m2EeLKLK%W5gmG_OinT`OoI71|W{ducU`re!SYWlF8<+4v5Tr}u!P_Zay zh$%9(s5EggO-sP49)wk*dT44&CzzU`ab%HT#?!HOcJqam7uJiz-T>m1$0TK{Ro2NS zOIh7I8CrOK|IHURT-Xt)i8o(3`NCNUc;My>XJ2>>3Xi;8$x;e=W?&)eW;3SJjHz~B zscPjzD?7-YTp&ac$;*C}{s{BeRhqgc=h^%vs`qd)X6lauxYo{+ELez6-V-BR9RwP)D`{k&DU06JFcJ*v-HORa{Z|5E5%8x5_?-kTR8ADsuMmn{OO*V5di3$Uc2pRq(%*q&h^V+LApHsZyI#JYzAQxJ}lu3P%U%F(Jm~37 zGPg?aBXeh!o3q9^Pncuxen@#KH5J3BE}#tBhoQfWrlJDR^@~Kmz>!Ur{t9|a>qdh@ z%Kog3Icr>T{?BSPXJMtrjoemqfQ!9IFQ@g(HQp~(?Hsw-aq=`!!B|oiA1A|D*A#{E zqvaS340VXnG7#5t80Z=DJ{f~pYq11v2bU4*FvrXwu&x+^Xyh6LA9~~p#N&!0whv-g z#;@(FG->?Gu_q)nc>D?)>oHY=G+s&TS8BaqsycGhy6H|`hcm649t0bT;dMCmM|dTw zQ>hM>O5)hf^9E1uK;ifz6hx1HiWgBC-V_h;8=d71mWVfCk6qk=0dqo87;nHan4t|A zh?|@>3}P(LfFsml8ZZc)Sd2hqz%lTl4H$@-soUI14VWFO0g* zC<^2C6@wXCUqC$56@Cz7dHRY_hp8_RII9?eNMAAVq4fpCvx_2jI(_93MPHq2RFb|% z71I}JoP!k~{nc=4I-EM%`_$EVS?xKBIsL9E++o-zyOZ?Skpz+F>TgK)8O`C0DabCq z8-GV5VY^^!p$KPZc={!#?+a&OO!C4!hcDV*Dj`|q)wM~8El78#*ZP;-w7=dLai z|0Tw+3+HYs68{|IPYUOrStR}y#-9_;J-y;;=j-M1>wA61=!E{lfroy4K~K}^s8boyQ{<9ZAd15X@DpFgB6#r?!!~CO%*BF z&G2Fh4lpRS>fGHP?k+O36kFfj9qukV!z1fc!`-urNQf%jJty2<%tWZd-N%HxR~5-m z74BXe?k=(s5$7uqzd77}Zjt=d;O_Io-Pae1rv`U_Fx;*0FOq;N+^rwP^=VZ1zd}y} z8J@5IT9mh^I^5HR1mgcUDlef?^2*!O9qz&MdE)e&^>5FVaL%n zl7iaXqaVff47B$*R(ludzZLE6tq%86d*YV{qyJx3y!{zmWr_tdFFHHQ0}!u>@SCZ#dl-x2QbE@Ex0Py2hq{l!+C zSfBRK4EHZAlArZy|3J8Zd69V5r~NC#{l^uFXMNg#e7OINBJr$G`_B&dUsWWY^=bdL z;eI?`Om0x9xc&M*Tu(r8e{U6ck^X@w?m%^TpdAUs|8G*+Wb>YE7sqElM;lV?x?BE6A!D1?- zMh@N(9@O_jA+K45G>#1P4+H&r*~qd+g?Xz|C>=Ks{Ky~I>*kas_tS51eqx_oAB~v^ z=T5xJ-E|54%W$cZOY|3%{zs)>A2Vi5opnpq#6vs~FnGYHX3N?M07wM)d?0|#^<#=W z>cYX;*T-~?nO4LKzl7MM#$d;pJ_vB^&AC+nvC?mWtF|$1&DK2>SN3VZAvkMmX)AIH zhMcucZaca-XKk~2Fi-!)a)zRg3Yr7`)3Um(Z|kpA z;7PXk)2brIk1d_>T~SI?MzQRktNCJDbg=OwCk|Q}e)>NU3=&u9UkZsot z8vR>=eH#3`&-z@*{IG1f6OU~FW^KQV`~mIKi?oD#JV zkFn6c41R)UXc85wq*yezPbnP4Q9afP6ozjwgF$=i4R$OCRpQ2W*O%n)t~Y7fY|qIt zU@^&x8zTH2!%E6m0tbI{6KBy?Lz&^GFyjU*`Qy+({a|IS5DQhoEfOK zygggLa!H`p@%A$P$_D{AlJ`6Du7F)ZV1Q4nzt*-I`%Ac_{wo~=eq;Mlzc zfy1T1?Kwg(bP;*A>>)cu%OPdkKT_|ncV*k(ulKLO@j^0jtlp2u@N6IUpR4y{TRY3P z{|dbyJDgdz{nz6)2gVj|Ki;*lpFNwwbcZFn&Tzi^wtlZ%zc@Gn_iCHOGqewS~bQ1W5bF@8CHOU z#-SP^aAnYTQUE(mgOE77+#HQg*@&N3P01vhP*k+t*a{&V;OHUZ9;Bgxmj3)Xz|mk zC7E1{En|x-W6R+XWf>RNnT61zX}3ggHXTBANx50VGK!y8t;s~OZP%8u^>E0sj7u_R z3Cq}N$!TrI3%wQPW(5l=ei})x5HR7jLdoopQ@v)_BKipETt}(0eSkH7jdZC%9%p`Wv->%Z%M&+@7T6H8- z?BFO;*#U*rI2hzaHHmePRkN^|2*ad_HiMDD?I_vnbJKIjShrO563p&U8Xy>~yZH0g z0btych~Xc$#xRC{*h;uv^60XFB{Unky-5+|FrTy%{Z@m6Rr>X%{d>O>Z) z{jVJXv;E}H^g=T%&}}?mpkH5Exw6)}QGuRg3ThDl<7X89_m>R^%cN|#%Vg*EwVAb8 zC83M;2-PdK3PrcS|GlMQ%`tsoynbyP6gJfr>JD3|jhT%o6x~ux5&lmVYBTt*-`I*W zO>svEho2-j6$;{{fTDi71Z|y|6uvjAocvn(e6m80gwL?R1%3xi+I}xte z?a0W%$&QR()tR&-1MIO;9=wN<1U_Vrq8={JT#N-gx@Zh!@M@d4CAP{C01&XwqmioR z;&$5~AXeXFW)a}B%w_G?<&KPA`z+2agXDprA0fzP9haf6H2t`naT)p*b}xjx*UTo| zbq&|`ST};htk~MdAhUC-JtbE??>pEs}@Js zdXmE%+_>RJ%&~I(jw_+ql?)9xx^sP7ul_bZUl8-+d>!cUE7O-hab{Sy?Glpa2RO2slNEZ0yK`rb}` zFNP~Z|K6kYy$f((%kV||UiapzB@o~PW})zMe@5RAU2E~v3R~p)M~A+Dd=f7cXicdJ zMR~CqBVO+B()Z)6weWKPEPelC$IJao^!-b7a`}i^B)mMB(GPZjy!dI=CA>V?sUMt> zz>9E#{W9REt0+GIa)u1CjsVIN8w{;l~DL%Mt_mg5I?OZMpModBvBe*b&<7( zqoveDf0xWd?vR{HIcC1ts=r9HT}=X$^%rqk*{tFHJpIL`j>qMm zR>-2r!5@c-pocT%ETHm7wuzWhKBdO2qbru;&mfZmb>;Pi8-pc&v4$r&X*KI+l+S>T z(RDfPs4mL+zrJ-ac;TzUea0N8%qc*bSUC~x6Wzq> zjARZ46(DaAM3m2(^~!7k%B0Fk;Ds(x{Fp%&H+{o^q(mw~zf6vBYc@#p366wB3I1~3 z_N4krG-7nyliK+1G|%-@No_uQK70I8D51dmZh5x{mQahmTcexGiZxF0Z@%vOy zQrF!hMJk-)7ZCcKblscNo14u#x}|DrZrHILW zAfKhY;Y0*EoZ*B+e=Z3f2`49cLa~fNWXXtG31A8$GVF~`HZ$RI9op*cfDuej4tag(&;}o+X#7f z=Il1>7DC$nKuM5ix1Y_i6d=!@ayF)}9`aAj8HC)P+1_E@LP+~&xFpE!o!hZsO~~z2 zx8pp5humk*B;*B|3&17aLP+~2w29Mdi2xU8tEu4uo)aeT#; zD`FhKV9q7v)tRf?ty>6b-%FOqFW4c!S9e^EhaBYc>b|RS-pq6P6|{vZ+;;7pm|NTt!KS8I{L~b`v=f8J zdy-rxS=hl?X=l$)E-s#ryZ)V6q%;@cZpF?M(C=R8?DtQ(4rtctyE6JNDAM|A)kiFS zSF64&S_i~oBUuHUlIr8oBh^=o1(!`~&P7D&)OU4($i=*$rSDn*@|QUBUo)2q`G+$4 zp^1nWpL&sVcNAr^nu+_+B>fPzavAUE>xZzSXfAiSFPbX^_pywAY#QRlcerY5am>f2 z>&Ip~%*U4L$5sOKN{9J%bCqB|p3#qY0aN@quXe~8(}-<7$m`?X`f;`&0umy!f8iLts8R9*bTM^T~ewcf)pl+;vOY-(yz zW3d^I!MU!A63#e)(yGWyk}`c*F7-OT&r z^sAWTNZDUKNxynJ%C246zikX+*6G(W`Zcm9ep*cz)?Vw?uN7epJ9(gr=|x$yStHh7 zo2Fm$ti5)$ehmxb!rE&C`ZcVr3Tv;e(ywg*YoTN9J0>fvy_wN(vObH?o2!M ztd|*5_!&hDZ?i^)e|xfin{6lAd3&LLn+2v`-o~EC4Y;RGzP(YueF|8+)v@+nbDOaC z^9KF%35XZJRHZl=9^8)6ASt4sck7?y1hg#d>7NhipF=ze_V_)nXPb4VDr2h9*;t=7 znycAGS_w>?O;wAj>O@Wy#8gc(RTvc*tb&P+zhYJiW=+P_pz$~215;+uz1mrQZ*e_UOGlQemmAxdQ3bhNoDRu+Qupzgn+>BuIjH^V);Zm{g>m2SC^@4 zv~CQ{j@;s4oW}s6uBom&hwyz$;O>@8OS5%j2zH>BfY8#?GAW0!pTm{A$7jZa2f8r? zJ1$E=7~eEL#>1;@v+wT7^we7y!w~NE%@>Xxj>WOiUaD!x(a_UPG2MsTi9L&KA$u10 zV51@jI>@2_if!`U(=yY*BHb8^wyBN7Ix$Uaniga6ui2E`-Jj`ivTh8)j=K^N`kVVF z=6LuU^I<~F%gn2@E*@%l#oMu#g|G{kbUpWfYwkzR2P!fZP1a?>Q_@AOirEVJhAlr( z(Odz>&4VaAqV?aIk23ez%-9a=BDa-qGQ!zN)j8IUz6tR6GVOSvG1J&;#I>VDfJ9S{ zLN+!aVO!&PTLfbKK;{__G-sOIjJT}&4nc6NwdUcV_$*Fydov6Sh|N=)-Ef$Q{~*(h z2k;>*6pL;lqP5;6#J0{h7#tAWrnbe(c|c|v4|HZa!6V&5L~G4Sh@I`7mdDO1oiQF? zGiOosU74;H>&7P;w)EDj^Dx<^pxj-pU3QZ3K-c6hOftZ4*McrL$Djm$D07SlCTAvt zU%G|-TGP(Mb~2sZKH2g+dCKG%zpu*_4~BV0vbHvk^CLJJ#y+&|t#AnBFqIBWF8rn1?7u)V)sYIt(}6EzFN6Ob_&r@1K+d z_($_F0p?`pjJIyCSU7()xE44e&6zNV&rSh1XZjp0X|g)9Og}asBizEw!Y=FP;6@$- zZejOAwnBhgc+^7l2_EiE^9bRv_zUjn=HNyh0&eMqrH;F$)4Aa4;r_`yO1PDom8chV z<2Hx0;Dd|n>}_S|N;bo1BiGcG94vv;l>;l;ox6e`G>;K_Q)Ux5r7O@C0fVBqjLpQCC!Vv9&3%V{CG^stx zHiW68{NOBRk(|`pOfp5d41e@oU?;T?T+n}kozy;X!HNqwseRnZ`EB!uG6RZt<_ zw3-=vDqlJx6{s29O^)I4%o4Q*ZlP9VkK$Rr^MTWORTpS{($V;5^CW5DJ?x-CH?5A= zkKlIJj{YDOXrXj;0u7g5dY(_=kMTROfMxbL8b33iCJn3%G*~xXGK=!q*|@XW zj&l3W0{q#!GdD|@x3=Jv0(OnhO7+WM{Rwg{iEttWnXrEbaGg78#~0&n&Q4CMKkL}} z7xNUtpGHgBWnFZ@v5s)9bfx*dFT(V{a>({H+QbIyO7|J{d^Q)eLe3QRGf36g$Ia_} zXC(oC&N154XaXCpD?)+TVJdH1vG+Q@@ zW&67XteGt{Ct0kSJu|U)#bdpLF2FpEW)*zVjbYiIE&;2*so(L{Ke0c?*DomYr!lsv zw=Rq`K7xz)b#YW|F2M-y>3I$F+z9UJc@yW^5!}=B7SCI4*`Bv{9w%vEa5DIJHlt6Y zr3Bw}V|?2lFHS)Q(9a@a^HL{-rSq4%&09#P|AXVYr`KfGG+8$WW;?q=FeqnD^O}j4 zvo$?yxEbh+jg5SFLTTypJ@>@ z&6P}t+_Q!fpb4C77W<5gnQ@+EEV{W2g+r!!W{J1D6MD}HQISK&LhYJRMtF5Etavv+nQmCPVzsoy*&Er;7mLVcIH3(JfFum5xx z8m3Z2njTmP4;jcqErnNR@ZsH;aF7&c5h$F~t}=U(*1BwzU`LpR1p1%!>kCs0D`;-` zAs@Kz;eiC&6E|4ltf>n^(HVrtHa_TXevz}6Mj?j>qTF}8q^9Rq8g8O}(U|Vzg)_bOD*}P}V;0Wu&7nZc-IXZN z^1%E_VD_ck(v$ESu)H5?We(^f41*xL07C@P%7yT$nad#Fl2!UYD^T(G>F=iXcdNWl z8<|N6b+jC9M-zr0IYJP}Twh_zM*ZChxc@5e=jiXQ!Tq1|ev|(0nSiGD6msf!&DVs) zUsmeB9E$|vm#U+wI6LsN&ux(b_{@i&dC}$mmHE2lezj7++JxNV51IQLF88m^OOpF< zD)rxxw)jKl{-(?QU*=nq`|m6D-;YCX@rTU)vdjIR`L^UfP^k|zAh-BK=KhY${hOtd z`A3!dM;T-mUoxlN_lFCG2Gy89W6H7mM?5X{T?h1A^F2X2Sg8+EfZ|&uX&&q}&Z1HB zRs|mIV6#5h4zyPs+V9Mt3);^r_0Ot-CcZ6H2|kdn?69DaH!Ae|4&nD^zaad)62l81 zh#y0U^OJ89uUZ5H(=~rZqkU(perLY-J;X*9fI{Nt1v0|_mzAg!T)0|*0odQ7e8>AQ zsBja(MwLP>i_DMx8ar+UQh!HMzv$7w==Z)Qg|otWBowAHfK@dKI3>20y_?qWHUdTb zTrKODT6Q9(Us%iD?b7dZp70OMwM@Ue7Wb@W@1CgNJ8a*uGe?Dv)W z_cRFchs^!D%RSQ8GNUSuLM^lYkhy>4a*r}^&=^g+(xjmn>zAt8?2wN3TU0mW4~otU z4u4VyCf#Dv*z!PI*$f$uHa`}u5tU{{8=}RxSn`^bA@N3Zni1{+H}T5EX3Xfc89fGY z;OI$J5RJ3}( zRLzkRi$R}+!ty_o&W5K@SX+Fhu*{rm9w>r}Hd8Uhih%GH=Euq$Bz)yqQ#s!I7TyXW zpTv&~N!Ub%WGW|^O1CsaGL^0YFjZ4b)m%^!U#Lh`#(a=9(-%Z4zdBkiEK>3DNHDMB zlSGxP_-0Ix8H0*%eM`bs{0P2S#V5`fXJF$h%{UsE_@!zt#og}>?BpT_Hm=2ta|U)Y zurk&l>e8mJ8BpSTgP11eOl(3--7%)_IByVqf-;r{@l$H7VU}rF z;{8%JPdF4go{}>NY#hro2rOLW8$`oW)3Dwe1mUZ_rW$9P#^pd4U(l_l`tvAQP4%lq zMKpy&0C}1siE&<2O+BWGniAiVaGLT3xU86_h*M+UhLHA|wo226CeZq&3R4HX7|CmD zOM#{!ZC3v+$X{!!X|))(i$ChktVXUBkp^m{yghgXv{s@{Q>n#b52pz^sjXaW^OGX-2K$WozL~OSxlPg+bRw(k%<2x5?)S_y z%dF-)6b(orwV4p&4iW1r%{o>x@kdmE2vfnOa|I*0Y%sf5_Y{ z4{3Ls->9&Z)Q=x)j^~I*{IohITF$ryi_TIDg(DIAF<$6ojQ@dx2L~$>RE4aPWd%~@ z)}~`pB^MLX3WX_hv2m=~$kCtpt`xSxib%Z;QshYCeS48Oe0e5?X_4jTO0$`*iuk1p zl{Zj}J=bU857Cm#k3U5-n;XsM30Bu>r>L^lv+TEpH?fSkf+p{QyQE-F6Ml{ zM4hQpE2UvNGiL$T5^Z8A(+)9DnQcy4;tc?a&1BygZS68!*%*nRR>vlh5<Z&j)k>eiq_dJUg8*POP@ zYM2G?bFIOdmF7&g2I7~hB`noEZ!KpPSW95@pN0HWt%Yn)o9$)DF1~LKmWnN$jnspN zl-p~~_I4Nphm_loHrvsZ+SUN6%``V?xuDWq!1^qHsgh>juJ@cRC8ZOYe^`z(Gxv1Y z8eCLqE@E!+hs=#)NbVVKHh4*;xrBoj@rTS^>2e>%T3khqUOK^CI>Y-e|2)wfdFOv5 zUBWxaIaUnTVwPfNI0i}fnJX*Jm8^Q=m#Ssd|5C4)a|-l=KSiQfHkd0rt&YwC*3ni+ z*QCugHGmR7jTgMp$gZh1*VMaOywuj>b5&}sXb!^#{7P{-YqE)>T71nca}7+*Dh`Rw zEMJSS>oV7|7K@)&>yk*7C=gobYwa9A!f$6L6L z_ja^BXGgZVwpn5Y-3}si!x}Nk8!OF??4-p{tBpeB#s+g^Q>-_Lh-@rM#AYcVGB2zZ zA~#i+{43;2`_*JOok7tmqjT`Xd8NQ(!t7(_JE2yPu~Zsj0C{IuGXFo-zDD`1mn`#fj& zKv^EB6BE=14au9+u+|34_n&Qzm5W>~3~N-_L@sU{Yi{EdU;H%QWa)F*p$z-$h>OjI zTmS`JoRpwf&jl7HigU3jtW{w%xww6-xt*Pg_-VXnIG+ouFyi9mL0r_5i&GL5@43LF zyC@f!Oq=KNbfbD?b*;kFiy_~;9Ja76_HUIle^T3M+hP_P(!;$sgr z!z>PA3T9tTrUoUXtGIHFC|qn3)Aq%>05Z>`TAvT~41{gWQk$urX5FE)Ea6V(ef8D# zoz^W?D{|+vE+8jh`Y?`#Bi#kyU}+NE3b64M6L`21)v449wI%704kdxKX%>{$=ZotI zEK4AObh)G85s_h>(GtGM{&G2CRVWUBO3OnRIi(e$9FvIR&uPU_npx7~pAC-ySIFU~ z0=A^o{@`~6I-HYQ5&p^~e8|)uGK^t2T84`sGIUxxHW6^eAV7J#xI%4BG6bxRkQyG@ zCK|#jF@(12wsy0RZmGhfWB+aY3#Dj>Yq)scXjUh|t#pPP!HMCnRHr8Ki}e=rn`F2o zuqJ^(p5aDBhHJP)Uu#XSKpft1J@larmniEJQM}>CP!7j%2`FF0wED?uDbH{t&|w=c z@z;l)Y`!Lpoq$0JU9kcfjclhPHm%275N@PJQOvr*nrMNT1r(NDD2S|AQ@^B($8Hcynzi74LYV)Rn$R!|l zcrd4h-1@gqKh>Lhz;M!{B*N^y3hL_M0hzYm~A1q4(`*RYu2A5 zjQDXF4*A^{mm#EcM%X7%cwyEvU4RnbL!nqJ52sjXhTK-YPk+8ye}0PhJ%|+Ruwc## zx#3`+{z9|<0v_R7-@{Ci;lkk+>gPkpqw>-m{n9b0OEDtbLvFR)r@z&#zcttD@9Wi;HCpMufAGt*LJUZ?THm zcXZ#}c2k}0IT5&v#+77fg4Aq0y2)lE6u*fvc{@hu&phOI@auKDr>6F zMcEvy%)aKb=1gJmYO}AUtOdL696nbHRM@U=;zm+C)h`IaY&}ZEjj1cxipl)i2it9} z$c(X;%dBsAco;bOAlcUHa$}wv<-R*2jWA(G`yk8^1JoF7IbFdmr!w@!U7b=5EG0!$ zu<*gL0>mU27f^UzhP1r!zZ4N+2jtIjzN)f;h)8)sL;me$?Md?QDC>yHA2}iWHD+ID zS!Yg~R$JzGX5aX-@j2PsqIOsz+i9tkG#7%IWt50QURfaI4!3t0nZ1x1M9Cq@3mHKo zWS2V=-Mj((W>1f>3Ch5jTBa)|Ou`b|jxWQBgR<&f!pXG97o zBFCpH^ryxhGKZ9z#t?2s`aKnTPg9Zfu&YX(V>n;Ij4Dtc5@ui%U37>W-`}FZ$A*)9 z1a5qU)nz!@N8!dt$?ya73ZWI^#z$BUg^0INxQRzuWrTe`8aF-~DOZM5eFScNgg~wg z@%2Cpi5nl~r5WNtgN>Av4R%s!1sCFLxi)GBn~3BAdx)2L+eFA3PvpniA-)i36W}nP zP=`^FW5~Q%pT$LgUWs+R6j9~{)OLI5K_Ov@x(ra*H9PoQXCWR_;D}0Tk!bw_?V~Eh z#z5x=i6>j~5};wRLlm5L;#?$mWFq$1;RWBO#7g3eifGtGh1osYv|FD12Z}?7o0B1XBj1zg$6@*697I5%V<{%p12`J}_VR zfw+kRU-E&ti2}dn191}te%lA)#s@BSVM}QmI8g$&&G&q|@A*J`&cXb-kHC!uutyfm zejkCGSj6ZOJVTBN59JNHh8Ta$1XTuTm*q;dw(7wAfVL)E{`sQ9|Nm{x4hmo;*skFY z5foU-4XESL*0rBKJ;FVaw`oR1%3)q@A zt(A(&BH1GRZ8m^*%R6Ei$sovma9nr}qYFqkAdFWc>4w1kjHD-|u|=NGB>o4R!u;*_ zF-86?Pmy+aeu0K0$s8&XLub=9%5)8?AWVW^+A8s9aV0Kr4IxA!4WZr4&!!GyMxeBL zF7V%cAa4BTdGiY&h#Ma$AM%1ZU^meqonRIa@JiH4V_^Q1I+>9+GwS)8+nhNd{FfY( z<@U-WmI<(Tn!F~*hufK?z$`Fq4tOQ9(4@|gT_X8g=FP9jmh7ol%*twr6^dN@Wp~FH zsODF$j-}3^dd>qv|0vUseIWUDjLC>;)$=Q=C#}v*;6hq889o33o3+n`I09D*K?A?= ze6UqmUOdeTc%9|0yfu^N!2FhFTb4G&WS zZYAcgg!!SH!v%7+doWap4I6`sh51#$i;WJiykfNk=65WX>?l`A_CHv=e@{N5UFxyg z{W~Z=XF_&Udx338lBjmC8D-WCs@+V2U#T^p-^FY9;xG^e{4U^)-^K1~H{>I=+ir|k z+y)K_Yu z5mST>O7PR_oCGc~H!M-u!+s8mAJtKoA_y-|sH5$O;Ke4BSDrDq2O(Z*vCo{5HfNM8 zCW}OjaH)1nDD!!UVWh1`%u^5-Uc%^t=CA`{yb?)w1R>s);PzrGB>Nw%N0>0g_IJm0 zSC&_g>~`?{dK5|$y!^`!b$;B8*p}_&b9Ti-G&h6=`!ttzxoB^O+#T2krbWZp1J$ z93z!$a9ns9qYE@Y9$~x^Nsm|OidpAx>JG75;dXs1W*tSi*7|`w})S; z?MDxrA2K5BA09{8V(XG0Hc#OdV5`uax)8>TT?nr{F?R(aW;1Sov|=)v4iuj20B;#( zZYk{D!n!=0sPnZFIn^=pr2y#sN}?6mb~nO!B{EZrsPL*FygJ>L?o)VW5*dmA!fQyt zzx`zMh#;7V=t;PUcQGy&?j~l;n9H#BDZDyUnW?dEsaloWs&xg^0Bgv7wfI7qUBwTt z5@wWwjLqdq*sGM?WE)|Zs7}06PhFU_U55;V16kt3xYL%jB$?V33Di(=b31M$io@8% zl}zeN?!_7;HSj6hhdrGlJGzn~uS$gU+q+_rLu~I#M!%X{rwSPs;rNZY5ryIG^-3mo zO%kza<5!Fj=1Ay@bg^B!$>`T6qOWqhz;fvFbas`xD9NliSOe)Y8q`o`bzO+JkcU^- zRMd>KZmGgaw*cqro*)SGtCJB^TZ2cxD%^qFPP|Z<&#~imLaD1zBd!ne?(gvGDHT&X ztcw$F76w>}Id+6QnFCu=+O0cejt_)4GRL%vX-(GUN;H_p(Y-^H`d}zE=){T>8^WvU z9&W}P!kbC)!io#4tqWxwn$*rvGsndh7q?k=$Q(C@hB@?|DSaoJD(e@PN}4Ok8SlCZ zuSE;VW=&1ZS45#zQH9hae&)FF>aion!YoSCdCJTGL(~o@48yCdM^xjDQ9~q$kzb|4 zYwa^&+q@Qppiztxu>)Tfe+Ddh?Oq0CX3uNk>@#2l$unS^N}d6`-1Zr;3+HG{NSFEC zce@}|oxna(UllzA#$En1;G8L=2`IwKzV=x6YkNB8J;xVHT^Qez`G{0n{5%-vnd(6d&Jmp=kX19;q z9Y-uju21+F+*qzF5Q@$nCiz7*1c@>~1FrN#|)05JZY7`T4tZ09u%~Qe=qH)d$ zb=kfk^J*6eUn&5NeVhv$2f_2*@YWL3c(4rte=eAm7d#RVwIz6RUhpV9+m+xcDe8#z z%D+wB!i~m*W=VjrD#WOi+4oF-F2GA|W5MNkd@QNqdxr4n6Y`+|^W-xb0lX6BGdVCf z1mP~#rttAAB#Qk?022Yt=n8^fMDl@<2pK*F{Y_jY$C{gD#I&n2U0D-~TdLMd^C*L` zYmf-#<=z<%GjJabA^`(B>KZioHz#8FQCAFOh*6h=(=s+GU@OLD@=P5oS zF+9Z+`%bI00zr7id*I@VC&pcg7+&!)jG+}zxVx?5^I6JMd;~d6#S{HQ{H|-b3&Yr2 z>$)Z`kQ4LLJV6uj@4BL;Mb~9ai`Yn<|BKrR z3-Ewd?75Zajth6u6$~D`%2=+t1 z(~3kCE8c@iy-YN}jykPFvgY8}2YxgWZY@fRF^bB;$%J~Xx+dRpm{H$a zu5TUV{h>044?qvh{qgW4lKbwAzPk~*#pk4Hnx#v!^0RG(d4_44^xb&M7Cz`O_+54c ze>|-}KHB@G3U3ARz1t4fQ~(^#ux1CC;uqLGkoN^}gX`fUKbGxD?uo}r}N;&TQK7MVNo34+r@B(?(GQqN7j@FvzFK6 zMX|7mA{ zgN5P^*@G81Wa50LD2_Me7|zg!OvukVn;67eo*_rD!!%@4kndr8OYpw42-~y9&>Lx3 zs^~&EA_*zq!uC+!7s%tCA?F~)kdIe8l8geCBH55hgx|pi_9xT&lcT&}sy5~f`GdnS zTMJ5S;58Fd~pCs}OIU+MWLngj_6WarO zU&`PO*@G81Wa7wov3-8;3ywGB7|zg!Oi1}Qwukb5RCfPxCxRWOA(Mi9AKN2)Uzqmq zpopOlZODX_Z)AHY?+fHcXUI87G31TvgGojKtYkwbk-e_fcnZq`tso+PsX8IIM0A6* zBLnd5HXyg4T6wgbp|nrwLF7}V25cCr0}Qux6(%Pd&hOK2=VbK3`6VnYLhI-ugAOP zI5`(3QBj=Sr?4UGGN!M`y9a=PiN1ceRX^K-`$u^{9$z~SR3&ex>1Su!nJ!K6YmVXz z8T|q&itj0w4NdWddi{c@_(H3GffOGj&UpO--Z?>vFZAgbX5=WoSgcw_W5-yP8oH%o zA--M|@&wmX-b!NS6rvZT!{{T;mUAVRjO)~=mw{_7<5;-YfQzM41@5)aOXx9 z-pWN7JWH_a_E8X@Iv@zu$p^_}&9$~ew~sY#Zh3}@q;j-1KL`sLTp4p@aO2m`?5Bd( z@>wVO`Z&4q4|vTD*jy3>Q`~hEd|ux~N?!P1ipcOb6r0N#iV1-nsCD5V;NPygR9%@! zVO_Wz|8~`<>Z{$~p9nt@?rKQk2tB1FeBEZB2-{Wsf)FglM~V1EcwID_@xfMf$c*O8 zWwuX*5#&X8n>!Wkaz~|8}*d+D3_-riD-7->!~Shn4HJ z@RRtrt25PEZsTjQjy66u-p4)}J{j(skec9f&zu?V>PmH4nNOQFE8Nwc>h{Q=3O^O@ znv}vBZfay&xCj4s^`v^n;%{i$KBGjDE(&+`R`oWEF;5FWjeom(Q@xfVMQ3(eJ>sM7 zShgq#!OFTQjEShnY596Yu+<|nJ3UGem4hIsM+V&;%kA|j;V!AG0`VZMF_ngR&Q2Bs z-uSg0ZUmJ;yCYO+2jNG2O5Dggjuq2&5iti6%XrF%p2W~(a~X-M%GaC(?3EUbT~K4&7TdKT7+u7ImIWO) zlx=Uo4rIZc1p}hW=Z-{Co?xI@x#RRcTM;Na}u}lxb zhbR_V2vJNXVmUs12>%dVp&yTlz&s z7(R@D2rk#3w7rH1;bAKlyGT+Hf>jPH79^rra;p+P*jfuRd$Bz1#DX9%76ge{T<%CL z45wIxw6&I45N6X(EE^-S;4Tu&mlDKs6vB8Vish&v{20X|6IaD#u{Q)^%%`7D>8EAX zhnV$<4(~wV=TiD}zWI~Dy$F0JrJr$uQG*@+F(N*n(w`q|n>@9N5RV}63n~2tmzoBO z%J(s6PIf*Y1yL9X@^V8ek=qH@7$dnc+$Htq6br)GzJy<(B$+_}7Mo{+!iiE+Y&5B{ zBg_*ha~9xFL{4r8of~0dq7?8-6!T0JnqvMsr|;Nejv^=bfEajg3isjPF8$I7{Zd&F zK99tk!Y||BF8!?$`dbxzix`8xf`7a8w@2u2<3&SXB_xaYh_zh1Fi;SJnSGRqmbz_Cw?FYmkgKn2&uce2JMlD>|F3TbL;X1!p0-TrY?CXlD2#2C&FQ z*FS+LCH7tz_`KNF+|>pndl>;j>f0f{l^MP`IW@W5y689MkzADNI|#3uT!&15<}-aK z#5XR(7nfBmYql==LrK;T;`4h6eEwPZ3UjZiSkr1<@QMGnUOT}+Dk}VQM7P-&$o&Ow z@dCMIaeX)ZO9F1I+&132+_naGj#I}G6oW?xjv<1TyTIRr#9iBFakPYA`27S{zZdQ& z^7W&xud}Xfh{I?D&<=`2U+hMB@%sAf<^6WA;ch1v?!$o_+%3Ra*gBBk&FW$3-w%H*WcH`@{(2-3-;(K7 zF>~;irS~`J{Q~!Srk>EZT=|0Hnlr1U#5EiHbjO3|8p<3Om1jBC*EOu)UF z!#`%~cev~2phtQ&e2YkCLdr~N@xDbu*|9fteV(ZT&`fAG6UZ6?&4kHj!ZiF*$@}SM z0@}s!Cl0)1RuKLatzgB-igKL2&ijRLODmXbg;=xt-Q^p?zd{rD*SHkE8yo&J`K%sW z4e`-Um)sQFzZ(QM$NoZlURs*EDRnc7fOD!hIgeTlN>ewpTq(TjkFM2eNt8Ldp(sr) zXf;$f;x_ylZkwvbj{XI=9o4X+@Lz>F9fI#ta3B60rPZ&E(XZ91{yY=TYi|3|P?sqE zBR}ix&XY_K;`@F0mlMri#It|krQJobNFPyZ{yN0R`#|@N5&Dg4@8hcvMf-?b&`11D z_)E$3)(HL97-SNkM=z{TEZgN2# z!YV~+!e0g9uPeGLrm5MKBf?|9@V`U~?la~0p__!=26J&~T$DJAe~=lg%-?Y}|JSvZ z*sLmUsoEmTBeJPT-^xVbYRGLJxzifI5^m7R-3nR#eG>W>6qs9a5-WCx@7Znu4e@)h$3z!xWVbE7VV>nMRipc1PN#tbFAkPM{t}w)s zc@g~A6Y;kUE{d$5!^ljckr``b1uOqWX#Obt4QowfMPs#fS^Wds<849vbQ^mRh}7N0 znuXjMC+Zx^yB)RUjqrDb(_gL7U#;^#8V0rvfy*r2+wU3KpufsyHH#KNf3-`06$`bo z6KOHnf6O8o68*43{}8p?`T`3cd3GTNoh@O4M*YK9LYMN7N&1IJ6@&h9HYLz+R_Hey zky!jgLBH9o-((LU&~HxGZ=$zL=K9Snz6J=$w^RD<3h&1y0mfB!1Y;`o+hYNf6XZW- zM@rt`r1Wp9kV5>#yuTTve={zg7q1fu--Afm5~?}*YAUn>>X!8xzwD^+*L5T6Y5!uRaF&o;@0L1;&F$vE@d5}*0m>~_%t`DN2*EToEmIc{z%>KIU>z9jK#kW$}5tY-Sw>!y_sqoGs^r4kY;9SRL) zdCz@Ni?x9is_Lq^0G&YLr`fTjFs5=$i*=KD2A!n5Z)dBS7aQB_tUHXn|C}AiykjfJ zA}`%x1SGvPr2bWS%Z(}Hn){*bNr znf^7~z)WjXYsXm^^3UeWzci(@9R1Qw5`VT4IcwIo0Jh1){yd9k;@R>uQ)gCKH;I=s ztIot?S+>Pz`nN2;(3LH}Hg#>Kb(1n(TXiinwfRi%WZRkP1E~+dFzF^``atFbXeqND zE)&L(^YD=ie4uA@dULb9(nXpyF)=hwLAKMZJ1KQiIjjPINlRyrGwV)HoorVPQ7dr5 zY^!aZrn={8c_CA!ak4>do2JIwCJ9DcBH^}aazSitfF~`J4U&e*<+crz3wKGSUCIxd z8Z}E(qh<+rzFEqSmomAAgpJaCcd-%S#YRLL5;jWn19KWAwKcsp!_RKVjtMrp)31m= z72L1}SqX|8xD&95%{u{GEwTOtEMoIcz}i@U0v54n4n`j3PQW7eEXdZ56JnJ830TCR zGdQAc)vE7m_qi~)Yk}Z!^Z{G?Mdn z$@yBZeyvzeEa#G!+fCNz%v#G3e3W>X58ow-cL?I!-TLiGMR>WxBHm$c^EtttEN|38 z4J&=%N-Mxx6l026EwuD$Mt1^2PUR5kEg$+7vg7WEe5;2bwt9U9t={o&EgqR=Kqhcn*5VQ5 zTRo(bR?p>*T0MqS2SOSn6Pw!y^{KKE2HRyAiVwK4_(G=I*i**{#ElCK_{i4g$4wN7 z$0d?o|JJItnu_Bimb_4C73#ESl7Y%Y$xyTCdW=$2M#xO7FKT*mCrz*H!U?ii{mChe zieBihL`5$Q%sn{1SCPgTjR`@@{YG6aY~2%FO_`L*0chKXxkK6a(2oVD?V;>@0{F3D zcPRUwK%_GrRacr0cPRUwU{xKQ`LJWxd|39< zcsdmp-{p1=dQkJ)^5ew_CSVZH=w{+=+x7T@JbSBk45o&A%rBZdGpOA_A1;~n9|=TYez6svh|n-rcyjo^o_^cce&P4$eNTrTDpl~hqH8(qwuRF3c1yq82S*aH95#%Cqi!Z3p6=MX*OUMcO{y| zUDhnhSWnQWz{O8)U`VjN|H|UiWZ51}q^hmUm(KXdPPF5b5nSUYNw6;sK=Yp1Ql=`? znC+oks!om7fV-s-hg}2i2Hl&=f zaqU(%s`yOn6Eqy8azBLO(SCL+5;oRN!re67O|DylyXm-FR(C>VqJ%EV&LDJOWnYbT z#oShdeQT-27PBV2w{qHTUu|ClIth$r9R08~Ne;Ps8k50c)l+hpN`ySs*V7!N)KeJm zhZ2qVL&7{}U{MJW;OZ&Kq_cP*d$#AY%F9};t0uYim|Qwk&2U5(Z&T0qTwZf|y>&5y zz9)ZTp3?U~WSp?U^Iz&lRnG?+nVm(TD{8Ljwl09~jgqI3xHP5jJq(~x*?t0DS#xEx zb<-vKzC0lP;k-YAdmpY3qlCg_!n3l%mW(AIot;fO*H>PTlG80!r*SB&{0GM|cC*c2 zl8hn$uq=xY*kyZmRPJcCu0_C-mHZNMK!Kof=@F_tix-+^dp=N!kAaNXZE{Gr9))rrMie=n#rqe_H{5nJ%o%Vw9il z(I2bQ9~nDPDj<_2-3G`0^9g3i?r(g5S(cZkxU??mg6KyPezsnFvWhRC@1{&B|X zdDS&8SQ>A2c9~@TOa(rgimc*8>2WPNOJU2VKhvr|(}Ce=Ldgj?F1uXdUar(HHzB$B zvMOPD*tl#S7ALxDbTjTXx^Y{lkApO>S z{ni@(!4kisKQ|fP>q~F?t60h~;t;?=MvL4wEf$q%u5nbHmkrw%q+B?(qJ1ac3 zcUJ0mPV&^=Ia$ARmZSF0+4`OBpmv<2mRcNSdoh9G%tI{}i=^Pum2S9{a}8G1n&2EFci$<}Cgj61(D$)d!XKDLb5 z(jymVZoD{ili3>^&VeA?2QhLmqz1eg*`TVeNSZx9+k@90)}V%483CKY8?!y*MvQAM z3_c;-Q!}ClyUp??+GizdhsCx)xgZQ|okS5viJn?0(LT4}f&7s~8OA9)!Xk+xOeE?6 zauQ{POKhJ&L4C0>3{PYWCT0}090eD}kM? z(B>iH7!OSCPuCF7eNYH*8Ph3hMTov1V5NY>PBHUz z)tIU}yqepyp1Z;3u|w_<%hG6~8Ehq!>98St1{ir7ubQp0E(QP} z$sYhfF=Z+J5xZ9Yk-{N>0uF!KGb55H$ph%^8?$E-dfdoy_0~oC@n2RR-7{X=v&x>0 z=%#TkygdiE-Q%!QhzO@Mht`xmmuU4P>oe8`qYuUyMP-sD%#?nx6jz)|{&*$39r>&4 zxn6Ic!EIf=9jxS&Yv#5&^K{dQrfTaJY?;eX-I6_zsmG5PKi0Yld*$+SK+Ra*JU`Gs zEo&>A$afgUeB1r-}AidXF?(q6mszROYrNpstD~*iq~)wpb96SYjk5#w40(Vo5O( z()F9f6yxuC&dl8M?tNL{|M|ag@7$f4^PDqh&Y5=S-iyhH+T2*%*rLx+!a{1b&YhvB zAgpwn72SYV7c4-=0gYIqMmAag;ANg&AQ%@3#aOP}*G^cZJ$`E_Y|M zQJSfx{bo){#m=Dxk`D;*B5t*LWaG$w`fSK&Z5#Q(;3ATb>NN`FJR5Ruk|c)?xDN_0 z&LQWxEk#aobv04dmuNoFLAn@&gG&iCx^eW*`fTJdQ^Str7!oWc`IyErWA%Ca$cF}( zk$jKFJ%;Nu$x%sj+&SXCbJN9Po$KPjIf7*%7_kReniQ^f-vhgC0xw;%VS!KV@wMak z)n~L8H>Fw&ID}zlZoE1b>LzKNWBm)qOw)nhQCN@PZ#-;02!K3g{An4x8Xkn?JGpl9 z5PddmP%PZq#gJ@-i|=Bkswq=0^%{tVO&$sG2v?&g<8DyOXh#IC1V66fxc&55z~S(6 z>lo^R>bA;)3wed&bCj309EZ^oHrEUY@PW z+<99mLvSTB?=}5Ez+Q!`qoyb8gY=wTgR2QTt6>((!1FeP&f0(0p&E47v9nHss9d=) zqK*vkqDHlOLBoPW^;u9WA?O@;Zbw?dUcBI1kR7(*1YBK*s|5?-V8JR}sc?ZT8KO`N z)Ex`deTav)7N{o|s23r_^@$9l0=$DxZ645d0CqO>j2rB!x?x3%5zN<17rGUTt6yLT z^c}#*JXl8qh7EvGrz(GRa1-HEEhCyMH{Bv)fJz&{8BT77o5AU2f&LDGv|D3>ZxRG6 zT@CtN?w&4Vv3RBHHbEdr(#BKEx1sKK^Ij$O(we2+^?6&UgPSe+?!hf2zr5yhFz0!j z$Zxgedjz+Ud|A!1I(^pUw0_swn*71-7Glrf4nioeMtP7yhZY8&Squ}`4ljZ`EzH

6Ra?W`O-WMZR<5r$gdU#)M(^+UWKr`8{g>xX%LqFO&Yc2$u2`x^Ury_b4@SLBco z8oXIF`1(lo`e_4+}kh_6pkucJ9+ zGKs-|KU0I7dZ|r&f?h)KzeUhCja8fWZqNUg()=|=n*XM8Y7-X^sp3s1s7*67{PzzY zkt%$vw|Z+7a!6S2+OoPmbqAO#XU00;8m-=9_d)Qtj#6(;%YYwXtba>ywPhG`NGRat zsK7ZGCYFF_J<_+f3|Cut>wxfE4pUpE;`&iupQ5&$o?&&MZZ5o*ZeB}owONN`#ep%K zi~Mq+>Vn5?U5w|w1<(%ahVO~mP-A52Gfi&rElYopZn3=)y}c0wKrf-8pO@yJrGGrJ zhJ$sh?Tzf_jjRWPgdI!pgq7eB-R^p0x_M)If?h(a1-8AVrFha}OwdigH@2HMmYS5X zV;P>Z^oIsdixv;*<{g6G)swJ8dNg<1Ar9l4jzKn|&YRH3hA}yywbM~&xbKANAe!uq zK4YYb!8hID+r-+ZySERqB+SEdUF3y9mBcz6pSug5A=bF=-Z-jO!h9^`-5S=U;1)M{ zmRS3C_x7b+66Rwe@7A!62ySzO=ZLjmcW*!RlRDH`y1SJZPfJ6^(jmXb(}^rH8w>nm zy&W0c;ReqWbN}w%{*+Hbiz&{OsR!h@m`u#WJSte@2J47oR z0mCv4opi*v#$6Q~ApQr=>8SbJq?u{R5Lul%D(bV`+-uN-?HFbM?P2DS+x5dN#_#UQEQ<1upWuz3oRW7+aK9V8NO=$H?j3|yUWZ%J)cxC`se^`l z2bm7QJ7{0;AS~gvTl3`_4cyG%C+@l1GE*d5o>C_Hx=U|9hSg)b*os%1>bdp*NJsZ zy>|@dlF(qCRaD0BTCB73%6NS6h8t`m*0J^8u>);ruof0!yKYL5C(2%_?Zwf($#_lCv zADhPs!H?bGCxrc4z4tZ3N@zq}R3ze$t%!^AL_9IZnpW>kBbJ23lC7AF-F!UP^>8N` zdo>rsQXpy!o)z_^;9WQP8AUy@-aE0yhAH@Sio|`_Xdw%Kj+H$NKRtNQ4c;gGN%h`I zG)M_W6KA(m@OxIlzi?4qlsctgH~1yV2YV+CO?l$iWBI4od($bughti*vI9337hK|M zJ307({lD5+P#b}yLqY1P2Xg*;kfsOTdN>WY{E*oPs*Ss*;7-wFy5N|a;FzvzvkuGM zbF(w)``D!OziFtgK=+|RJ~jB50tLs`1jl0OO^1R2#_E38Jw0xEH4KOi3{bgp6C67r zIChv3ijb$t#3qoLK!WYq!L z{TaBs7JNccPpk`0#PCsv12VKO=t zEL-d}AcXo@0D-(rtj|F|Biboe#`M9#^j$FQ{ynRayk?myI;|!+ja4LJxqDu=iXJRc zMGpdDcCcBhXhuyig9?>U5TMVvb~FOjs(WMB4mCNWUoc~^sU4!t(X}(DI+%k|d?2B% zo%40=JVcb@+L<#ln8SsDKagl#Fy{zhQroUVc7JZL*$w_kjho3&WeS~OMyR0SJ{^Ehb;*qgNk;OkF_*`VXsCRG?rmlg6 z+%9{ep5G&E;9}!5zWpBj#SQ*Jtu3hwmY`SEVYz!@Tvn~Q zM{M2vg`X4QD9Rdo@HbmYG7PpOCu(8I;9v>&0aFW0Mg~iE2kU=Y)@N!pTwWPmPJ57$ z`_V4aYIu~Qr_^vF^E3yS4>X!Yx_?&iFVVpjHNh3Q8x%-b?p{RS;deVx$VWxE_SH=C zg<1lyGVsu;1rpL6FV+$~RwP02A7<(wc((CJ2LJ5fzaj$m#QB(j1QM3JcxH)4Cn7vn zLIjd83ceKb)|#M|?j~WmdkMujKla^k;V%)!SQ-8lKWiNvw2n3U_!iI>>jJH;4pvg7 z5|%qvq{eCkk1p<|x^R!D3s>d1p+kZZ!AgwGed==MxM1Z3@WJh=VCB)l%C8|0?PTT2 z!Ai_Q!ZKc;6Rf-(dCupxig2urZ4?arb3!a-Ann@P;95+kby)6RO64ro%Hi~%CTblB z7vhE_KR3jJH^^4i1*=FdVY~7e9Ky&C<+SBl)hAfhY|680K(K08Q=V0$f>l^|lk%+E zCs=i;DbK2j!K&j;c~(seR-uguf#oVnvn2S^4Lebu8+Q+GJluv-98{Ke6IsnbS&;V< z1ZZjgpleP(>XS5KY$b1;6x@jAu&`h`oTsaAbw#k6)h8j{a3&gurMlXlkRq1jjABAj zVP|F>5v=C+Ts9P|_Y79!ArsT|BD;Tnh&RL{<@Va(c6JXEmb*(ac2iH{<1E<8dJl9? zA)YW+Msz_SH>nN+T@Y&d{yzg<7}n%V#MLVG6lBtMs>Oj!5bbH`vdj&;+IP)dCMuwi zX%R09y9x50wZWZOa1JC)%6ic@m-XThk7-)~8}10uB_W>Kwg5IHkS*&)J6hID!ybaX zrhl-e1;`R=WZUw@3N-bZR@Kt5UXzax)*M1|hC)ttOT(qfd9%`*gWR4C)=UW2*r_ND z<1&4dIJm2Ka2K^Mp^?PgDBhYRm+PCv!CiX=ca0-CLm`iE6ql0Zu6={M@ML0aqF01? z{u~f@*9LcEx~Ri#*U7T5LCDv(1Zz3!lhBZxJIz}whzc7u`C-A@NhD_|DnWL zwMV83;)T5g>Ym!*9*$)s)RM@pIn%XlMVcNHov=3=b#-M|b!D?VG2SGG8*S-p`j7pE zcw!#^%%&=2{1PdLo8wM|JbV~L$o8Vl_roSisoDyv4N~e*cFE!az`5mkSK{TcB$|)x zQAJmx+8R__e=rHrVjI0b!sJ{Wr{DuVQbY~Sy?Av*_KPbtLxS3zLxLmL2C6V{2_Cu)qAPc*stk^a3ZyO zqFQ|n|DZ&xr>oU7a)rRS|6FMw+m7;X|B^vmH!eU)sDW$ChLnb%GVAc!zcz9)l?ZsH&Z-kioA!S8p zZv}3L=`aRFx1r(}#>FTr8oU*a8I%+H308Cyb&QbLxtUS1m(+D(s2SyqO- z3Ci`Iz3VZ8_aw9^xTVbsfIQ2JOLcvdcYWUs(v=||zX8H+oxR&AkAw*lM)US9cyXa_ z>*d{+73ZoDoj-{0>g?S`)ktVTq${8&5Ws(f$&KD!J7=W0I^0tL?(Xc}%{xC5#sKN} zp$Wj<4c^`TGXQNNp2Y#-+RonE?lz18tS!b8tnKNo?Uw<#Cd6KY{m$O^*+@xf zf#N1V_LT28d*4Tsn{wRM;XwlMZfEaZH1M8;vhxKZ&}~J%yen%xCOnwgTD*5T?M#~A zo5Mo{=>5*#``CHlNoXYzYiWstY*dfm5L%q$s@sr@(79J)zpLg~?Zvl>kF%JEJ zB_l<9sXia*eLg6Ic6&IHXgL~cdjWY;X_QZd}oyJ?9M+>YTr59 zcP3}>@8C17NU84ZS7Y%)hrskX!!(a}ub09hTmB>B=zO7CSFJ~7+*ukfeoi(8*THkL zY2-EBn`H&Gp$H09CLcOiG5YpAE}Ld_S4l=-V_qnjVuGH8g9XJ^ZeDhwnTa{@?|2I) zm2-D#WaYPqmgiEDpzh3lFqH$Kt@B$O;u!|0s&~QfjlNNbxDmLfXmg}nfhh5hWD6v! zT$e(RmhK6U6sSH0zYi7?dC&Py2SFQ5nEv zfx+Lq+24Bv86U$xCir{viL>xn{xQ+tdlLURj(;5C?|mZ1tjCM@NtquAv4(`CgA4w_ zm?r8FGOf+ZWCdCaD5HZ!3~AiS`QU#3!Pz0egW)uRpHT285MDyv*7)f%$u-wX{0aU2 z3BxEbbvWS=f5M>|9X=GEAb_V<`=_#wB-DUGyGD>LmVlnx*FSX#K~EydQ2$h{QiszM zEj%24T~HSl{6#ct3DFV+?i^F$QpS^+)Zj15mhqAB6d_(x?JsFT4hdtCu>HXHU9mVz z2Kq}zQXB#R;v2x&q#pel%0AU6PlO@nP7693u&Ykn-m zqZy#Syt{w-P#ap5+1m*6t#GD*EbHtqYX*pf08x589j3J7U(ED@{<7hj!aN?%5`^Ui ze>ny`zJ!<%#*-+~>};kq_{+0HoF~FLLc5~iufPz;mk`EzPdJxQ+Q!D!TE3%W9CuQNxzoWB%2L?bo1opiu;9pJt9sLY8Y;!i$j&AlPw?f^k z*Zf{0TfGvFw3vd+e`0ZW?Cjrx*_;1$Chg+iF*;TXDE+7S1_h+7Y4F$3EhGf<`%+N4 zU|>GSoekdigZF(XAS^)hCV!ekmiIEE_4C(Yo-1;!8SJmg@_ss;FTB?__-kpd5`y>r zDX5rts^Ir`%$)wac7VTjS5xq{_y!hkFTn1N*#5V})7|h47XAJP|9&=t5`z5$?bsWI zKOj~g>80G42n8^}@a@UGR8f&0$PT|0*Jr}B+;AbeKG5JlKs%NYTpujO^+DmPinyMY za8(_0eKtJX4HuE?gAM+JRJDZQ`cNsZ50UGXBBp1@Os90n^SMQMn>krN+~7Yv(1u|7 za4D7#gJqd}EUfF{G+)PEROTMXSlpAso6vp+RUhMo71S&)H3e=~Wh}70=AVZ=Kc_s8 zHu#TH9tk1Oqow3|lq#q%5``~#XI*1j)&awH;i+!8m>j>=;D3wlo`m4|SSgN=NmU1F zmN2kW(cWsNe6XPdt}lc$-0&Q7eZ0Yc9GiA^2(I5M#r0d{I=hJJjF{={4tcKE?bnk9 z|4CZ3gkbo%FnqGbe{x{E_UmQT=i|EldYKiOZof1|+JJNnVxtsqa?`XlV zpa)R;FPb*w=?4Gl7BH6(%%A9h`4hSg(ab4;(Q6U&rw8~?+cxCsQU23O8$#wA;x^>@ z2LE}sArgZ9lkM1}4Pl|5lqxoD$jdATIOn$^T9m9Mlj}=y8?vs!Uq_8g2(C|+;`)?u zHEl@DHMb2Z#dTxchP=?=zd%(>2(C|;;`%hXnl>b6n%9Pu;`trhhO8gvuOADR5`yKo zOR@YmSn3wx+uEQt-?$CIj@M^OwINtN&KN;^&A)8hkQc}MFCGnfB!oQAmXhaLs=%}% zu_*1^kWvbGC2m7rYVcoT8zLb%K39t4b5hl&4T-g$+lG|l`fA*UY;5p1vJH_CT%Rw+ z^?7nNZAi>CuMH{1^EKUuyj<{KrbSCAC0VXp39g36_xo|h%0X=*+W&6IO|P5%xBB>R zagZvZ&_>$HH7y9}Y+2gZ!}Emp)gJz7N=gl7e zo7e~JO9*jZh#9cklMy{Mz?X==uoYpTBRw^IbEyC3aQqQoNX!ZTn-eo!-_TEFX{94a ztbFrSmM$qd8~v3zRfV!TywVW&fWiT8xFoKOPLrJQA_o{|x5rQuR0bn$C;j!Ck3watDl+y5NA+OdA^xFm^q zmxY%BueOU{+czcwWlFxT&3@M`9;Fodx{md`^2TMtiVHB|r+^tzSw)cmdi$ zH=M+kG`t7FEV3n$e6t24^=m|QPI-+8BEeKvxe^R{j|j8t7m1kc7K1BFT-SDl(XxbI=rN&-Utb?nWg&ak`#lFI zM6@QK>RZp9wu zgr~7$mv;7-?(80wRBSogA+gib9Q3U;Nwby_$IeJ%XKM+{n3J|$OoM*X#urnS5c+5! z^2inXXe={J2b-Gnhx1qrSsK6#L!dSh2`|p!l{*`XkuFA0^4Yv*TjqH*V@w-dr)d7) zJ{y3``2rS{bDmQzF93hBSQ7jFLyxk za#coe8`FB*NCmzI*o`7fz5+4BcX+&Fj*J4QIN=hiOGXM95{We;qqR#FVYw>|k>f|5 zgQKy;+0HPRpsD8zshkim2+%l^D|y@-6$!+|D3{p1U1~YzOJa6Q91i{TP%pU2#&I;m zI3X|LhumbrBe!(rND5Y?d>2<=+~gt~kiQE&Y%pt$g;)V7lDriP@*7F+&w`-v_;qHX+ZUh3*0E^?u;3a@t)L9GV1C$bL5J7oD+OR zF{f4rQ|n!3O~m}jh^e1j(L53NF~vk2TRT390vh~cS+i8Z$6KWfSAw)yug4>fN3Ouf zJHh`ba8wyYyuwuUIi{;VHtMz9 z`|Fey*(+H>^v$}Q@%?lrbt9qlrcd zj(7%nycb?e&)BPGuWtG*_7Qsq@$)@{#P8<`n0Q7?xNYfB zObgr2s5}GJz%!c5D^nfw8{6ATpfmOPfwcCRcni9j&&8m+W4_W=KggB-2U_|P4Fx&< zJ&#kirHGmBKubXu@)foArHPvgi{C+0L8yP~rlMHcaa)ms+QznmsPe_Mb^>M_ix_!F z8VfS{mu@W1tUD8p1<%qkU#UGE8O$$fEzWE@Gifb|@NaF=#f6Wjb}13J(NBo_pL|r< zn(0pySlyq(*nXI6Y(Lb-R-!*8FMe7rY&*O1>>m0ISHZpBxI^8vy{>{D+~=3n+GAqw zZCoV=)vj`ttKQ0${w*zi30EPf|K)MYx=PG!2V8|LGoh$v@TKW>MLQb9XIAvWWX0`*aLKX#W z-^Ch=UB%*e;3|aboDUVdN(yQlU4^J!w5t>en01vHc}HA@Om@<)a#7tya21}#Rj$^q zf(+)DxXMLM7bUJjgz8)|lhId7#BFpHqSoZ2!q$wdB(U05U~E6mHMSpXV=Lh*iQSHX}k=$ea(Z@n2;i9xliw7KdhxzhhcOJBlO$f;W%r>v{Q z%yz(4$fCQp?_v$bu43^!a1}z;#LZe1p`Xrs%x#U#=zQFuXWYWa!c_uU5XOE zN^S#7am)H@%y0*Mm23tX=gQGm?5mbX2fj+U!KLA1UroVnqpuQqh_Ryff@Xa+M&A)% zC8MFnSFfv6*U?uc6koko`zkV-U&>dnYf{%GzDk^7dXZ1v+*RF-Wj-BhJ9OwDwNe_0Mzd`sdoNOL!;w?V|1a)=G6N7BiHD z(8_fw?|f@}y%S3i!LB87@eyj%lg7Z>JFj!qd%2}}PnV*Ecaq!4QrxoM88h4g?=U(SdgoZggq5*gI2j+vuG{9%HPiy`Wj|jL~<*JIQD_nkKa-@lN9GZoKo}uIgTTr-a%LWA7AUJMvC~?NPGyiFc+-zKz~Vo;WCeYeDVb|~H+V%U|u1k0)`Hj_feSf98zc;iZA+)k8<()s;Uhl-3O|VxpeTevw;>U+7Yl@J@2uyA-#qcg75Nz&puiALC9r+KRo?^60=j2{*1ZT7oKjWPb)v1T*of3+7uF~F#Oy-yJ&WD=RLy311XMf|J zk9Jj$(mN&8b{Ko72-}f&66}DIrBA#wRq}20P9h&z8X0D7yfcB;-U++@Wv*TSQrmS2 z?zy(Bj(8^- z9cH}q$vX8Uy;DN*&g->zB9r;0yz|K>^SEts|p(GTC;^(lju!2nHmvX3eO=?}@P{f&Py1NZs)dqHV z5^6h)yE_rKqwbDi$CNC6;+?6IZ=-h-`PkCPFl*zT3AFZ3*!9P`cKtCmQ}P{ny4FaBeg3bv~pw0JAbmh-iiAP!SN+=)s5CWV_@x_H@fOqxuy7(E=39NB)6}X;+FN! znBfk1C)rFh?v$gg*gGwc4!o0aCzOVZy)y;3jowM*6O9$M7c}dgG5U^pCmEe&yz`Yh z^$P7rLh;TUwRa+u`K7$`l_vE{;+@2q9^NI3uCLdr*EuPYP%pYd;^a$*8MrdD==yq- zdc7a^e7;7)G3xcP@uDlCzaHK#(C^f#clslTgc^EIhtTgdt9J&N_1t&Hs(0|I5wo64 z=##^>0{vc{dT%hGC5)GfJCORlq3S)nDwvL45?o4-u9Yux&DHjH6B;Z1)7ugO8s5wNgVld_ z$so=Q?-RuT)~f&RgB%hHBFqAx_$mz;EMxX@>c8VNfV0B;1@OyS^(9Lxp#Zw>%(QeA zv3S!Y%Q!oHKmfj~RbMp&Ktcnc%vcsN zrb7#vIB`x{>APOnCa>#2AU>HOo}t?XudddsV=YK1h`58)F=E{SuWkeopGpuHgxKB= zq@J~2Pa;Z4M83TdcShuml4zRn$h9&XEQ;kV2LL?5>p8&dISkj|=JnoQPrlmc8D1aa z^*kC}pG~-)89pam2iAH6$yGvK4s2scn>1Z6cDUdw<{jV-9G>xyv%=>EZCJfGY%Fp} zC}qHFQ7HJeuBZpapil2YJZ_1VQC@Lr(DsMx2(p(q46pJQmczz-!;;qo(H$0sFOa4B zu%JG~4p>|tBM&^XoFE7_EaC@n-IZ)Bp;|gF@43hI*@8;ataxhPO9)Gq1rtOb7?0vdXvz1nwlf+dEv`K%Wsg51g(VJI}T4nZ!!ZBMc)x7;Dz9gGlh23Sy{6snW{7Zp_+1fU zX1zCa2(m~hB2<+WK}shlm^4)clhzyL6H%&+C^Lt8Gdc30C^HZBW}ak3nfY~Z=GnM@ zo$-sknM-l~Jzih#&Ey+Rf=Bs>YQ=FKBz_~2_=0c~^0s;N>%I9@nuJzq)J-Xotaj#) z^5#=J-zV`=-h8}KSh&qU#hZ_(;7$EdITy-M-&;`WEx?^;9ik>~N=;ba5y7_O8D;G1 z2rep#i>ARWC&a*IE}m3Iy!uV;U0ND0p0K3gwsFEjc)@`SS2bg1oqgx0sENgxiR`xY1i| zkrxm57H5&KD5;!eE|5~pHqHeo^Rm*&P==WcB+z;;04@DC*X)0*&A!B3fc#YWw&>`* z3h%tm(2;~??n3%Eofy^du3J^XHr8CCIykbxFVu4qg+{vWL?`?y-g(fcQ=e|`iS%~- zcgN!C8&G|0-*+>ZRLL)Vhy8u(wM)Swyv4wAPC^zQpWxVx!^2!e-i1&Rc;UMgw{M{@ zOoivlGWChN1=mCR4s|M!S^W<00&D9xs-OLYHw0K-R-rzrP`@ijP|g#s@n4suEGCZ$ z`BswfX8>*N+Y6Wep}5?&?`T|lWILwsZgB&MEiHi`{+vR!6k6~AKF<*9_e5_0eZg>AH67Oto6tQGG|Dw!&XZJt}V8DMy_Im!ppPA`15; zB$OeR)eIVK5NC#MyVdX32Px%}ZfjSIX}&0-(^u8g?CXT z+4v5dIdoiUh~s#)kD4AWr=?flFqmlm;y8IjpaDR`l>o>K0_9~Ih}1GE8;92w@Eg85 z+PoYFSy5Pw?eWgQIecZHbUV0ea9vo6R!NaXQx((AL2KqgYZi;9TBkd~N~o1j!n@N; zsC8`9*p`%9=LIW+m0{c1sEYPISYA!zZFD7?tPlpb+Z>%3yM;`vumE9hgj zGLC9RT&z~aiCPUnqE;rD%y@vp3J}NPS$8+Q)6Mh)B?N_y5T_yqXPWVySwtv=jIW6DO@^^kH{xEsdnVdnlrL%y%WPKULvVWMq14?Qor)jV8p7I6r0`Z zJ`>5up7FSh5zyh4EDf&2PJ0?UGvi7#j4d5h*3@~~L8Y7wP4URBl#`v{3RDW8vvp5S zRZ78D%Ew{bp;d>bRjiwq@K<5mVO5859!7_fALvmjzYg0bR!z*-melWW!nVV!4zJHp zNCGB{M^+u#1GJwMVf`*_JF4oaEE6I5eb_d+YI0AId|E`ZIc%F!HKjVmMb~t2g|>;g zG7Q%CobxKXbd8N@k3@dahS&! zj3uy2j3vwsZ!n@dyb@~Mtq5<7V{sM7@@;u&$U%-P9h*$Xj7d=rF)1mC6TTeNyj&qP z9nRuHyf)9U`EDmovaPeOa8pdWDdDE4Kf1Y@8=E$+IapS@4Hj>YHy0-B^S#9HSrPd^p<5mKf9q95@=#fXRE>CsB)zBp$ zMs!b2=@J7Dt;;`zZHuZFrJXKm(-&7QPPgesb*qh%QFuH+s+F9I;{%{cPEqnz#Y$dn zl?;qn$&3^QAu?7nBDInYMxtb<*zB>A(~*2SFjg{@V3mB8QSw!Zl5yFAl23zzdE_ej zG$*_nO6CJ+?rB9zo(CefxEEAikTzJ;6#p@7yRhoQbQ^6{ce7Ele)Lc)ITeR?z$zKB zqU5WKm3*^RGB9E#Gg7pM$XLmU)JirOiISOOv&TwKM?#Q9$xwn-^3_JkXs^uBj!jnw zO2*6E93Ht!p5cVIK*@Ym$(@l>GB0^c1G7D7`cGloWmT8;ZP$l{w-|-$2h_AeQ*nI2 z%%~o*qR_Tth2CNn3XE8xj1&zaGFB)ewL%R>qEM#T?6E@Ak$n0nwptX}Dzwcgv@KC6 zE;~@@OsIrMu0m%z;jK`pet5;5nN_K79R7@CuS$6}?e%%9(WicbN$WEe$ES~sJ`pSW zyrx*6w_1GyBi1J)ML~#+^@&KWPlJ)@lPNZPtj}~LpAd=1X(+GN=QZ*^Q;gGYb%Hy9 z03({oCHfJ`SnZlb)wt|H)w7^x9=WQX<%G9W)$;6tJ1eE?PN{ZSt*lZjvn??Io$xQ9 zys}DNnQn_s`|(#KT~(#7%1QbglCG{&SEm~n)3kqvq_!&6mf@9hqR)|jO_jO^o>P%}ZI!w<4Q#6Vc4HL!Q5kI%sW{%uNpgx&Tw81uw_BqCMr;&}lv+k)Y!ryp zMqw}#qhN~79vekEk`E@tMuD2KMsY10DGuI|Sw>oX=qE7<%&=@@hRY5NVm4I8BiA5i zJHfAM5VGAJukePVkrlSUH4W{1m{Y0Ss?=>cRg1}!y1h!>o~{Ai2ofXwKP2B#rS8a% z*CpxiNV>C1-I=a=T_eG-P2K4SDMStFI6efCyDAS z?hHm;cambW+q%m{a@)GCJ1WuE-F2q!m|54INMV*3Ko!>=E<30@PE>g0*4-Q@yn}To zo1w9Gk<=XrRifs9Ao+nR^}tSP2f{NdNDTjpvnac_ zY!x7zbst=IPz7_LD;~L3FxLt1WEIGcSKLQUs(_a=8dybLe}OztRH-M@4Vls4okrJs z@3Yo*DvtY>lboXK>x*@Lr`0tuVqG&*l!wSz*ND`*HW-PnnPRiYx=u%O+iE->K%uR! zuQ%g?>l3Bo(keCl7mA;=ddATxk6f+JbAm0@>NDKU>he&>e+^j zVFS?dCnD*&D)k)JeTq5_wG!#!e~|usm3qGYSR&YB>Oyau)lE+-j$2-JT`;HA#SKMu zfdpgsz_4{8k)m8g+PYw*t_y<^*M+3m?6xj4k=&$c?VhT#b#a4jdVsC%UZk*gkJ-Pq zdtAm<^j~Ntr;6qynn!LG&3D2ztfGzF(&)}lRS~L68~&A4_Ls=>ohtR6oX+EaNP4+S zz1%rfPsY;Mn0n9~B(+bZ;<&jn$tm@4V^KYXYivCL!`6dDieeFI>w%HF9t=iY50YZD z+j_`Eaw}H_wa=~^`mptIV|Z5_cNY+3OotP9rG$6KNq5^MY%!3ewQ&^@xh+}bOV%7EGLvb{&bhO?) zb3^z@ob*V-0b_M_ZTMK6gsU{wwc+D&(&Gu0D9xAyD}(0X&JqQstbr+OO^Pvw@aY)t zX)b}~Z%_)Ki*r3^>9L_Gd_IoG$JvCqY->A%PzTcd<`~!+NaB%eU}retn=mkav)Mf( zF)$aqf?yi>;og#WX0>-_YM~dmC!?~cj0siVnT5CohlwKzG~p#kJFC_^D|JgMPP>$8 z{k*e=Crt_g%cF88RC#CN<4`be{<44zYrKWHqiYj0fD8M23x_3X1gwZE0JyNqTi7|F zVM1k8iG;JOytC5@qVVud)2Qi96z$@0E7&$_$SIB5O~sAco3>E{M%<_|lJ(2o8F8bA zNZqIzjHFRxip?H3YUxPclP(K?U<7o+A0Rh9-Q2nle-x+uD4Sy1sGE{D3YQ(UQ43HN zJaSE_97(}KC#tF$S#yB9z?u!KPyeD$Fr@Tr_n*RY{+UQygoBWHm!;g4dzekyz#zhg zkf>^SwK=uZ<>zD!KKXCs$G4mffb5?kNEsVs zkSIJv9<;XSxg{pa@Z4gVZ*k35n3yx~NgBz}wf`Y^W56FY(@JuV8RW~fyuD0+j7c&w z{V_H{{hs$&qOI?h$qFFqC{oKexXVS?fz(u z%kX+!_8-*(m5A?%BV3iEkk4YMjMaTc?`y9N);L7Ty!$n)gZ9;Mbq?3h^SOR*{qOVk zytzHVIN;~5`oCNU{6Eo-yePIKsj%XOYQgq^-uhhb!2G`n&FOz?wcfV>z9^hM77{9< z*HOscXHV>ujdsG-h&{2JFRI4X?tAWos~TMGyXV2Us>RiWJ*UR{2T*WL)DOty5Dh}zU&)f>c4bP%gT>D=kzWX5@g=lO21Qvkag66t9>R; zL^Xr)#A7C&f~zuI&6~I+<_MtRrl^skspsm{a|3Odsz}XDS0v9ySdxA->?x${YSp@C zkV=T>MAFnGftc;hfB>sQsS5Q%t$Lv^03_4^aF3^4_XsEnK6>L;QEm=vM2z*dYCWn{ zNti}4Cb@N#TfzoGd9g*kI0z^bn!=b3?OO-9HPniHaXhhmvB=FC6%(QuG zIr_@H<2quAl$!9Tx zh3*&-o`nkF@db{5;dlU}2bukp2M1Lm}8j z_V3?+XV=|H#A>nIf2)wujfNq0K>wsrA3(JaM#J4`1h@^TAAp{MXL2JXZj#sKax$Iq zfPMp#M@@+JP_&C1?Fy_R4MSS=8I|-!Jp4=su3vx$8C0k*GzVK0*0>$#qGn{YI%L3* zfw+uD0&?(>jQH@rvt0GB>_9Oppq4m$bkBl{^mtp}C?l5$gR>D;BQnd*qRD7z8Ir1>(R;7gggLGyymWeVi|Uw+>I+0_f37poV@ z`&EA4ue2a$QNs`r+;egXJov3%>qzHK2I=X^hvyo-c-SPTZ+MUhi@RV@<|UIKA@a&& ztBQ@#;~Yvi5nj10ikS8SpGefJx5?kh@(8>v>&+bYFEj_2%y`g~#hckZU}dBW43e`5 zcOepuK_Ux8!QWV5wQ~cud8xJ7g>HmL@=P8(YuH+z^n9Wej-8R@c6IT^C2=DvqY}e^V7Y)maubRa~o`Vd27*2tbw)uh5C-nJ^8Q4q&QRYw$# z;H~q#jGF6SQPq+4N9u+vQ!R!oyJ<4r8~F-H>Iu%)@?qF{RN<(6o@gk$5Nljib#%9* z`{l}oJi>3^sA_Vz$$fJ3AcNrS7gbFyOf4mo#@RorI<9bBZ3!GySyydRs3K!h5J3K6 z<`p%HEwK79%$FHX*waSwN)Kjm(?S~!GV;m}abz+R*2Dz3N+&rXTo?9ADqIYIyXjS=hRGrH zg!WI5yU;RKcop~`^|2&TpP0E5^^IfuRuHIiYlB)3jT;2hgIcdL>K7CDvyjF^Ac3Ak zWyULP;TD;LE44f_EnGR0gER0^*v8t%7I%>t1?&fOxU^5X;5t}&VZ5F)Prr(!7K_=92d5VF8ctS(o4=P#A0*g7Gg2R zLMVb-U#ZsjaFNx;cjU>)`?kKP<+!`KPHl7`gwkJ?GzYeP(cI+cT{~R@ zTv?8C$DXm~j=j!X=AP;34^u}6LFL8vb`Iir6kswuGEQ@j6MV++C@-!I7WZm%PaZzu4y!NIiA#nSvb7WlWM9urL4 zCoc=dF#`WOE$|Xol;cDbas*~kc;pIvo)cD3;MEnu>Yb(36qv2aOq4wA%%l;)>OG32 z3FWSAY$2=n3|1eQmjzA5Q?7dvprSnib#o!OSr2BChDo4wzKfY}Eb`q_2yW5iilTfd zhIHbuyAa#d*i6*f(h&V7+y${=7dF95IV^wDbuUJDsx`(WQe=|YVQVVsu$PL%Q{;<7 zjwE$bw=~s70OV*=Cv`7Q;^06h$>1OXyhwU=oz#PV!6ayyy}FK-ULCP$@dI$tvAi;Q zD+3h9#9plVqR(|@l%f%2lwxo>-q5i!-jG;5-q5i!-ast$CL;wMDWjO zA8|Z#ZR&g{_=+~QvN~9~v&(GloS>}`wCTZIQo+GjbOOBKz=;k6^)-dy8txR$48fTN zKifrr2wj=j${Zrsy@bfoM4XCUo~;*; z+|pj)1m~c%&9%*g+zYfDOL?n+!=Y<%9uiM$o?l#)bC`D)Gb}-deVftNWXmcUW-1WV&sT*a}M#j%&Mb*M#7J|nV{t}sb)13+ zTw7>%dOCt1nsLqN)SzTFES#Y{+SGf>zJUSx_ zkIY!097)lUj@r_rTaVu8wn?7(MMoh9%bFUJ&%9h@jx^pQ=s{3x4@XC19d%2us$Sjo zx!moF)~(z{dpZL8m6bi1oVicNhHn}&_UP3cS4ZG#XfKR(-6L_eZ?Exi&B+u9uL}js zaxjjjIMGy;Y$*Dd%r817EoHaPj&m{6>E4vG8V4m@Pbs?vk3`2}O>b&#b!~$_>mfZV zc#3rtiRqwX5K6ga$glu=1x@XOv{UbSJ8RQn)kl9r7D^WTs zGP8w(-oamSA%6v}JeiM(%|?2^LJBc&r-VQYdLH;wa)Z8DT+sByZYHw_AZF0Ph6v$= z!DOj|Je|uc*=vyE)0>v*s?1)4trz6m`QYl7_NCCT__)ROI_GU9@L=EMjs+&Y0AEsf z&jgquMpO5z-mhMtF=OwNZ2%#2mkJLfs45qMw#{TE+%2K3k5TK-Mkf+{eD!!(D$fAl zDFu$M0t=l^g|`#VbbfT&;$xcEPQ|=X`EGO)p!$s;ic9ZXxEwZq7kDDxkkHPto{R8y zqG;-j>KRS?OkVC3oH)XP823;|_(Oxv=sRPG0i7{)1{xzbIvI4k%-A3Jcy_lP{`1kP z#8)e8)Jn7yIBzWRpa%7^g4uuxlW|EBI!u}^JDxU>StHH_mUwjDDbH+tOI(izEk5&lgbS1}G= zUJ?!l1&eZ{6WDpe)J?ydL~;_xNWBkN=hXXfZ^_)UGATB@zBg4A$&LfExWfRCWhA*P z%jP<5z!>q!Fo;7T4ug1b7$id>4ywwL94*EGa7x!Hz1>UDp6L-xa?#<9=5xR?&R$(` z9JEEwWriW$o6Nq8!|f8R=SV?qIi}MwJ@pytxHUEQ_%)3Xa3#hbWmY^JqUgUySM*{& zY&-x-!FDhJDaBy}JMVUaqs2;%LSio4GYToi@TFXa$xtN4tb?IQDGnR+IjCFhcqCz= zjqFy}tIi#d;QlnLt!O+_itl%@Ax>>Mx$DUT^clm38Z7N@IeFm8gB`TXG)tH@_Q81Q zXVK!y6(+U6VT|4{_ZwzIKC+EzF<5b<^8hsTWNw!`A6Mf}J}BeWcqqjhIPhROFE4Vv zpF*6|x}MfopCL|d45`I2ylX|8VL^@|nXmVr zC7S;&H2+$JMMAYjEw56`d)W|W?4BAzqKXagF6CytRpE7Ko1v|ud+`|3N~D(eR?7!~ z|ItAHMsM|v!MOIS@W+bYY6V23_S3ciiOMc@qI1y_vT<@RjT76MF)Fo_RGuE&V1Kz2 zU97eoTXifd8B=ak%yuCd@`ZXF5Rv2(wdJ^~nm3c|Qnlsys^dAz*a|0C zgj%Y$e68whT=v;oR(P!wU8c57tD45ex2y-X8KH%VzcW$vnY~{o9#1i&FwQ6bLG-mYK}V8 z6%Te_(uJ|nS?YRqSx1bPz;4*0xl5C=LE_R_Gc)S~NnC6mwnQ= zH(CNwwB<`K+t$&P&8n)-1!Lzbq5ns<<&18Y*>Sb&0-a9tgq*CSh~xE1aZ z%htoRgb4SH1p!jD47X^Kafj9+hX6b{1mKa;VYzde>(%2)l`U#rjat`JH~i|)(4$&c zsn%7yB&BXJpa8M!pmkB}6h1woR!ez|O4XlZonU*cgQpdcZKhf`Hz(6RWfdOQ+{FWt z^)JlYtk#Wbm(|5yb_b0ZnB9Wo&h{C&Y^pwEj?0nZs&*MtzK)FFX2$c?I+zt|A}zU# zIgX?L%Jd`EI*gYy>2M8MpH)n!R*KT0BIp)(JC1hMpPgzPcs`E zs!a%g+V%)^SQ#sG_jQp=;U=Eo@dAJi?ErN~?A0`#bA$T3CBX$q8cUEg3W?>a{%NUj z0jgdlsCt3QtyI_@rNzPpa`!HgyEk(?>OVF&E|9xViQIjdyPNvb=Kiw4+)eFrJB2cL zKit~XDy;CDv`P`k1h*^oCu`!EM zuZ!%x=+_QZXY7YI+#Sx^Wu5ZuV%aB4+rI>Df70R}*VbrvEVI*KSxCG^3=tYwZ_WE0r z{z5XO1j!J?Y=~tx#A~*c%|bb}1m)0}*-&qQC4qV%->?!S!wj=wmf0{A(&%K6P!2Ca zIXq@I+(kQwU*tLLm&|Ynjk|NXIj|z<@W^x$mplGIC-Sl4Kfq{F{;;mYx^XuETv^?$p+;ILn~Vm^jaGoJ*N_1KU1>o#MOPB^!0H2`XP&v($LA-g zEFroI@x2ag0nycQKj;rc6D&e~KWZcW#EOYc`V4xC!4Vs`D#ln)pc`F-Jbfn);3Z_4 zIB+6%tVGuuS+H2=jmqlZ9|T+KRM}}Km!^V+m@=|;86AopkIv>d^))&+iP3TX2$t=7 zV{-G4G4(qJ0?V%~;{C+!ViZL&#dffYu1k-?pjJ8?g{y8eXDO9AMK`i)oidJZxkE%Do=2M94=G1k z@MeU2mCH`~MRE@3I zC6d?E#A+jK7&d2$h5yaVPVR9sroho^7VT45{tpyDm(8h~Q!OXdvKHX~7ZD(IbhF_M zZ7YS>1}2d?1f1#M#V@SSUZq| zd!+jJ`1dRuSTWG1^A^#W%Ldg9;!F|g(Jj#}%LY{p!fOXe&rt@OA=$I&tyng=b}+Z| z5$Hkx!DWLh1{)w5jsU~)j$AgRW{BYy-5TAx3~h%&!(@ZphISp=!+_lD-@9yR#n7Dq zNzAqW+GWEkhGDUog?80u>fn!jhU(K10se^ObOuRQPkD$b_0cTFVx(Z@;;~GxM zI}Q+~r-_nFW{HN{JPV-XIY$)M7!`>y`jrQWs&l(k%a%LIh@1415td{labc+OAT#a@ zlia}#4e@#z`&77f$C~(Kb-W%=wU6&=^G`SVr)O}=P?mOBs5Oj|fTj345i(bgWvGyH zgH5?1lfv;3QlGG?PjKr3)MFYrJ#zqC@8Y_YFO^pyui52t z`?B6;O}w8%Hhc`d((#{P*1MuNoGH2^j&!3tmo-&1!PKKQh?E}+h78f&_#-8tk3V_j z3+Ov|kJ_>YH47SD!HL+O-yWQ141kq!QVGPL8cW0*JCf z*W69FnJarUg=nEdPEcD>;8gu9GD|tg@F^@ z>zt-;>ZES!iNO~n-QMo$K9tNT{Ti?e&5>sJBg#=0{4l!TaZgjLJE_$L6NvAl{W2pM zD8`K*K-x}fbx&N+$7PFJ&0)ubl2|7A*-Qr^m?xa)nfQ6S zVZhRsTX%+uJ0p&hCZ_I86MtqL@766eaR?2rTerx>Aw-;8-;S=*tvk=;InQ93M$Ey! zNSM}42MbDUKq09#Zk0n#JeDfb@trV{ko=h4rsE43OiTPO+CmKu(WC=&+|C@lk<;ib zWtZJd{BGI!o%S&C2wAFX?lL1iLjEm!F0$nakvyz%(Xeca~4Ay-_BlD>tck1EthCJBbb;;8SKuCyiTN+k};a1m$wQpQPV+Cr_%Ew2RNDwA0+ zxN1-v*Fw9M7Qe+s8nY1PMDtSZ5KQcY>cpF9RUSyyo>=5BQ7Ga|kyc@kN2v^ms zs|Er=!VVE$u?Vj^!Ox=C1fi{7wGlzW4iUa<5ngwKpGV&lglp^7wJku9utS75EW#!y zcrW_CAgroat0;qn9U{DG5q{tV??*orgd6JB4b-HB9U{DC5q{(ZzliW1Cs5v0uWlM* z!wwOCY!QCq1iy@aDhR9V)oR*Xw~>AYq3HKeq_)Il+g~ z`+{&=y}GRz5G3pn;TIO+eJA)R`lTS;QLpYGf`lC+d|(lN=>#7~9}2>ndbOqr2oiRP z@R3FM&j!NeMed_?1QYHJ&1gej^C?)T?_~3JE(z_^n0wjT8JP`a}@! zt5^5+1%iYfBK*!GeBuPZjeai(57es%*hWd%A;PB?;rCAPNwirI9;#Ol^#Ou}9U^S8 z2%DYYchMgN;gNdv$Y3By*df9nEyACi;P=s=1%WSBU~Nj+A;MoQ!k?Ys)99~)@OZs? zoW3bxhX~jjtXq3L2(>x-To9hDS5Hz85_X92e-`0$JO&m0T@aqejs1Q=kg!99e^`Wn zI>8^JF9hM4di4xtkg!99e_4btoZyeqzXjpBdiC5cK#;IQg#TEC|2n~+qAvwuUAhaK`4Ld|Aw+LlU z@YhyMxj?zGUTvgbNZ26)ZrzDJfH?SDYn33pT(4fH9wh7#p_4_Z!ZUlV1wnYVUcJg5 zN5T#fI$H!R(O?j|+)*1H5dWZ3{Qxs64wtythcgFOXCmc?wd#j@#i`l<%>RrrRqBW7 z)gayum8@@dQ*ZIvF2`+dt!}MG*0-wETh$zUVjRWcSr9s`-qFxk2q1k0Z7!(1d}Oi-fxr zc0nS~<(P}KbX24Npd_>a~m5{@j41R>A495E0W*=r;T`&q(&wqhYcZ5Uk` z4MLuC2{D=*-D@-nn=RoNdIGXrVYeE!f#+Pp7Nm9E4Glx<0899<)`8@>M_~^rhv!^E zwC;N}?lAy_gDv5|^@L??VJzBio^uH?_#N9YwjT(GTEhS6dCJ~}z3bElp7RL37m-%K zcYhELvxNWE)01(9acJmy&LeDvR>$=o*8;-fmhekGE7`BG9|(EQC4^S@>%AWdM_9uD z>8Zp4g#$pyb1ose-vfFdK*C)u;a7SFF}^S!W#l=Ra3s>|$Kzcat)mQK=;&ep!G(jN zRi1MRMf-tOX%v+{)EB=cmU72giPx>ftItIB`ni}{KE=|p_|}2*T{EATJ2$2 z0%_gD5|+2_Nz1{zQ{az0=W@iG@DA^GIF@!>@tlD8V_2bw^ms)|SG9rXT#j(7Bf1|! z!o4kFW$QlVi1(a8RGxD=jze1QQCNO$-PaOUweCkkyao+~Jm(VbkF?q;EaL%|uv6=S zBs{ioEJWowmvB7Nx*yvJ!hfmcw(YG9KUicv{XOmauc{1QJdwOhaAq zoXhc0r1hLev3{l5FTv_Yod=ycxvHP7&*_SIG);YDqDcbmaw*U z3JGTvWo$wZInEMx)03t- zg*hPPIhXKwq;;D^!mnAv?yb|vab95_#`iqu5~5w5*LU7f5T0NO>sn7F;pv6b(USAb zzQ2>(DO*mA>{?Gkde_s@&9zR)Ro~OuJb&H7^k_YqFbfI`U=BRz@;?P>-521_LhGrP zu)g&)5}sW+yNf>O63#$c_1PF5wa&DJJ@tHIabYny@|;UJ3u)aKljCel*w8wM9M3JB z3p?UDmvAo9dYnr;nr8_cTj!JTyux|l$a5~?=}7B-9yy+23466JAmIgt3&4@*TtbYw zFX(XrIi6(+d+XW8MTLuYQX6>AC0vNKnv2*1ooxyG=t;&Ug-akR&v}FqYW$M!mr&G2 zmawUHF-2WkSc;idT#5v$osu2^}X(l;MfZL-Qp?58x86W=t8nCXZ&ax_>TFi*?U9j@ z0p3)vHVrem&ucvoxi{g3ocQWAIh!%?OJ)$eb7~OFIF3sZ7Y||)CxcjQV#}^@Gr?qz z2eGNRo#Pd5y!=q^>9n3t?#V5#EAb}}JKE$(Q%0LIZMf2Dy#VU#-l;n#4a}DMwO$Au zgR~!Xg>9yCq>%=3+*%0xwqC><>`~}}s^>W#u!5%bV%FDRaQmxY>m|(Av(OW!#d9Xx zr8Zmt)}_qWSZG97#&agy|7-6{;N!Z=d+(J-(rC9WS>7GlmhITF6wC6Oc!?~@juLON z|DGy|4O0o?bh74F>J}nc~%OK7z(d)F0RYJ zS}1%M&!4`3QxD@o+b}+o|VGu4F!A*uoF)((V9PK&HaFyl=G|<-e4%;8(m%b zHwuLxw&s3F3UZ#6!kY|*$DE7T=ie+8o@vcJLp{iORtmiTEgtn2=iTx;$*@*w9~DZJBAc$af=bN=0=;5)6p13jqotQ2rxQ)%)Kr8jwnllurF z#dK%YbZ0F-=7U!6avMJyb{=n&Q+GIXZ$fmy{d4`R)%!a>V)9q!o~#2k{=`0gR&MC~4lAkNDkY^Bwob$}T))Vzbm@ z&?8V6(tAC303tjy!ITN_bJ}cDUHAEQE8Pv+RGa4${>rO8@=36dhZY zyFB*=ThkYQt~EKiFWQ>ESPPl(+LM`jDU|Ta^cP68LT?dc}%`6xPK7>pD^hA(FT7x#%*r?Pk1rMU(Op7g?wzwV}Ap3dush23_{fzd~C7QAhhFeEw}_9 zTNsNX{#HEeT#gN3C^mYU{GPdnjh=aaPa7`$ZLDp9-^1xjAy3=$?-!nKiTbxt!E#1J zLXeZWj_j7?7aPPqNEr8~{99W5TSz$nL0(+z-_kvU@Q(b4gz&Mbe{2P?sPeX)zBR{6&|X3)MN{}G`bi~6y(z>+g)ZwG-7_!rjs7uGuw zaLfmCRUqB2PeDZnk5%D0G7!1ekFA?g)s6Wlq^kQH{QGey%a=23w!`v@yKVK3e?#aR z6|3+S@pnZ08wxJalttDuu9W{X*3seLzlqxYC@*^a`}=0FwKM-QVe4Ylzla4@U(To~ z+zl}tnoq-so4$vLE&j#Dq)jtkTgd(0(%NKZ#W(U(U)U(1)R?!cO1Z zZx_47lk@#2u`|}qeVRqq`A_bcL3nrm6GHf@sQ(mJ^L;tvnTf~Pk})O#*&kur(SgK_ zorC#L!k!H-oCwwH@l4(29f{^M6ZkP*vnX^btV$Mq-O6mEDd;)dSwPjlDJ zTgR2rZ)>*LN*-~xIa}sb&8c^h1pJ_QTj4vl^WPD&Jjw(Ke(g5G8@6wm(=Z43Y@lk{ zP>%+VG&*zSJ3F?_SvqG`VJ6B~t7+9X^U~Tz?T$@1z;xenw>dahx>)Lm5=d#M2Jhrz zBfw}G#UNDHtFd|mtYQ$b_{)D6hfqs@6)yS5#>qc6PHCXh(qH9lb++KKA83b2m_oqu zA!7m}yH%i*|K}~&S6`1?@gj^5&LQpiZK78@`R_Tcy*0g9qy!e!^(|Q7il5ZW ze;-xp%6d`BYxG~Zvi8aNpWj(-)P4xFd>&hbK?B_SN@sP`szLZ%N;3$RfMn zE}=Zy+H0J}PHSUT<2?C_($DztLQRW!!eaAK03rpv1y8)IhXNKm`k?>=*AE3OcJxC5 z2Cg3pSnTMB0yJC==-A@SLjjA;Ljk6wekfqEqaO+|aQ#rgV$7=Gqm{0N|Dq1{wa@_n zj9RHu{-MRG=PfIp{10%Ue(%U3P&oDbhR(*)6J7nWY|M#{XGT)#MEtY`_odRFQ#~}5 z$$H~Xy*hUZuvuT+F`no;5KrFg?0;~2W3{3dA+_e4v)PHG-o2AvCc8H^I#s{l%ibKz zob5}EdYWQ=Un-ICMzZl#GBbB@;NHntBA%Vp(0yHW?f9j-=z`@ofCOmsv9AWl!$+l3qGK zQe3T7LWdRCGTAkQ$!aN{sZ5=|CvrNKO3YDGXC@$$N3mb~EnXm7gOk^k1-eB@fDsmtd8?6{TT#e$OSU2ol z$R71#qi_IWliBq`V<t3jwOvh`^3ZYC? z@p7s=awwJbn#ke6g{+s%(DUk!q*D`KIve*gk-MLFs+*3gK~qh`>8a3VWDxD3VM5_g z9g2;6P-$;E9h+(d)-R?DHK#vXoQE_!6aOUYOn6goIjenuc~VVGSuK=Up(Q}v#p?^PL3xtwUAOJql8i$krBj? zM&Jetr6u7~Ed{`XsnN-VSC^VN**}$xjmPm6v{Y6%BBZIyx%<+dcRH4V=O{I1T6-s; z>m{ZR#Io$8(w%I`}}CbRDFp1vDS?2l(p zgo0iBP--$g;vsaMJCR9`oG^9Ugk_@ZOeVqzSEYz$qKrJZ$I{*5csO4hmWW-JnT26! zm`CFjFmKPMs^e$9v{yfHVIu8i#3dVoG}`&T$>hkXP40vVNK!|Dk?9K3r@9+;m8wva zzS6ExbF-I#ZZi_47!i&TP1H%JV!|B+FS2cXJw{L(!Fp18lrtk2fLj!%o^H_(D z8>9ubRQHaIcoW(Bkw7zz3e*QD&v@BJI(uv+>!pXhY^F)&b?Qug$tIR%TN~Alu34j* z4AXO(wrDJ-T1}g_*dUc3V<0*o2XF4t<|0VDMl1-dU7^6*Dor$bK9-Khl3AUhnKTB7 zdfGgONt2=ROxGDr=swionT)F5L?U%x&A8Yq)7U!+o25;ZA4z+o@UVC+k!k3Qq3xP} zhzdr3)F{AC4XwkO20~0mP%ue!ZQ`beu{rv>(*O*D;m9HwfJI1+Naqtx=tO|20px&9 z;$Z)l>haMnnaOdCPz2HmP=ih%g(|$NG>?rYTVMv6Ey^Hw@`B?bFG7E)MpK1|wWqza zvGeg%I#UBc9L+wmFP$2%^2THFMC4{Pl*m~eY6j0p%&Vpnvs2N*Go5nX3^*FqnYcGP z6i<$LbD5z5odT&JJj0$&up?eJHr5CfLKFcI7LG|#5}PCRImRrvNK&kH@NUbskiY z$I?l}J2Z(*27}I)J8m8xKB8jTVdSULn(NNm@YZ%mC-XZMLZ`uKQNc+CM;)COGLB?2 zbUCygX?IFd4JyEh$eBtoWZd$AmmJHUou{3&KMryk41iO~$iQ%HjGfxK=mG8fl}CDx z%(cp;!=bf!)F8a`Y~4{Wo1W@DgUDAsBy!dw0;*9by8BpmGP8j3Ya}bmoJgg!L*58R zVA-iT0)ZV&gN>l?oN7LP{5UOUDrzkplfjEPTDS+jj`E2n1~agy2Wm3Nl&(o*KA_MZ zIQc-eO4S^NlOYT@vuA?_pnBC}m?F8&|&&X2~=%g{+9ho)R87$5J< za%6$gQ=A?cl8h|07J{~JCeYw%feA875uw94T5y6|G%X`MVMZZTfZ)I$h<|D@5le{4 zch5d5#Efk`mDH|uBIF1VYmOo|oTBYH^mO-NQhF|#x-VHP^cni=OeV&qCOMo^B{9y& z?CxM}LcCcCp=KoXQ8hwuV7ur~jbLVx%r+8EfRL}_71{)*1J!+)I%U1a!7z560v^CD zF>)l9JzJ};4|(^sSsIFw-sC6|>Iv4eM(#nnL1n8Z7CDW{$&vpV_ejaqkgnk#+cLWq z$k&Mwb0}yUgUqVh3TJ7@l4ybFywT;Q!JK1L+}6VEBT{BA{6vSDDFs?X-tlt%;f$bdyP_j+ko(gX0(pWvZ#Y!BH_B ztuET!o0v?WmcVupOIL!}Ogt(e5u0Mj)wxuJH#ph~dZzZhQ-h=AZ*j1r82n!)N2|~2L1Cm)&SAm5Iwy_i_L+i^^zx@zAq8WNDJV2 z!4@%1LPr=c-AEzr71=ct=JTkbd4R`$FC$a)RC->JZxqF0Glx!70T%5tFdBzjONt~i zi;5@(%+^`~D5s`|6|&Th;Sl`7^%3iB_7~TUQ%Pux$hddxB$IMD% zdMs0UEFG5spkcUNScEMrJs37+#7E_d9%~uGkR%4XakQtrI=Eh9NQH1Prp|(gOwCCZ z*ymd@jo@T?&KTN>0=4vO6{#E6ZK7Ub0497~R3u5+rpC5;$y-YdwR7b2u(oEM^? zLGuesYN(Ek>GSas?^rs~gw+wyHkZ=04{*7?mKl<2V{M#nBqSi2iN{=mF_j8(=CViu zM20%O6Y*QUsX0b%nvYEFv1}Z-4d9E`yN0mTFdl0W-3)TgnBAVt{padNui6p^TeX~N zkwm5~rWV^{qcmY}R->*f4Q7Xg#uOh*a$)r-W-FOmwp$_9l!R7}#4?bTutr|?At6`I zSU{X)ZaL2iDRy%=M$Tf1Wp3{=a1XgZd;ME;5&~!@>m2LcP%S=vix|KPG zRY^3XgI+8%nf7Y3XigY&G-W1FGpWONE9yocVq?(ZG}e~p2v7|o*a|Z(arO=Y7J>5w zX1f7`IF-_LdC3(FJ-gwUvsq`E0MMeZ^~!yG1arftP;oF@AG#F(8qAmh!@Ry&@@90Z z1LG6fDH$eYmJB2*X-2ttreLdx?%A%qMI@uvuf##47h_|6?<&|s@K zD=p+s56g-*`bJbE?hl#1;Z(N}Qi3*y?k1e-ZngE9SPt5C7MNkTVz1`P6eA32vw66G zpn43H&tP>FGhEEesi?l#L_CXT3dIQWcB{k_HWl>4GP_n} zt5uyk{IYs#SGr6=Ky#m`P{ItbCsWX>;nYNYWUd^;7*Svdu+i4f_{*AALAl2v7@4NR z*fGxxqzCM+qsG0H7~`9$y|_1%@y1Ulrfyej4e(}J!v*vB>NFm}!EIRFG_Q*Uxf$N9u)BgR6e7V)rHa+b+)IgeG>R8~gX@sjaK`$}G~>LA*B9yXw8*Y!Ab zZ{ndx(6>p^U2^Ot?VBZeSdO>JamcNR+>XCHNaO?$cM1FyV5fOG!oygkGLpO}5{V@5 zyMT--!XD%y_mCVPk>g{?%Dsb0d@PX1WpZqn<0>KR?*xv2D-Q>-vlDMa_ixkZWBPoj zLOh`_Q&o{j?j=coLSMg#W%E3|go672OT%BK&%e&B-*B*d1hgOZU$4P$(2zIyzXkRA zzwiHnI=x$+{!pF%NS*#KX}nLR|I`-zfK7eKrao*_PgJ7J$L;0EZ0Zv>^+}uhOUk&) z|BO0)PVv~SS^c&?KdsM?>SB-jKenl#*wnK&^;46YuCl3Wn}YW!l}tw!-RU|7nXa3z zcO#Li>ABPM^tsjM%(tmFn_6U3i*0JTO|7u04x3tIQ)_K%9lc_@bH7``R#6kJt*dWp zo;$Clb^fBoOO`HMeogy|l^Zr~-m-Q3j$JqP_Vo|!+kf-mEw>&xcExq$}EZ9>?^$sI8G z35dHg0K%KSs~`&ZT-5WhfpyAW4Z^UY3)`Cl81|MF69f%K8GC+E6koiLR5(p28hz)U zlMl}QLLHv@k8t;-(~R98bFiV#!5c0@fFUs+C|Tnn+|qae1;&e%;IXQt@lcwo zQ3Mr_piCYkSH*aWZ82V(E5_3zTjK$&IjjyWWkA+=itEOV2fuU%; znv%u~N`oL2qbO4`)ndFT9n7f-j0Xf`Jd~w1qD97Aq;w5LYdnBxJb(h@MN9BlThe$1 z1Qn0kcz9j-RcLvNZ86>=WjrmiH6Fk;9uWC)81d`?WR162DW*207=Wl4fC9zTQ8BfJ z#;Y%>m;!=OjG|2A;cZ-3K{1MLQOshcnA)O{1TYl?#9E`60Av-j#968yDCTF8(iZR{vb9;og6#W{rAatOWms zvR#=pfgE^dPgSt?=Oss=s%w94RaiBx`=3`6+)PxoUd2gl5^gkcG5`f}vVl#lv9PH% zmW-1@X%IwHQ6Ifvl=_HYzxFk0TV!gk$S>A$)TI9f=slv}V+? zrJzhu_tpZq>}a>N*76exPzfF{3ZhgH5zzLu0NXE*sAHN&-eG;KDBifys)`!+{B!Ve zO}7!x!USX7in%ueR@Y%+^LBD~emJNGd1{!q-kFtu@wxKiv9;jUD`+7l<;Sp9-uSX$ zH@Abk&O8iZtbN035+!Q8hvA}-JO6x$O29=fytC119REWTUx11vh9kf6=ye>%^ht8Br_gTgR zruPfXormWJz=S)$h>41MdZT!m`Nbd%yua-1;}+!Na|{^gYt@B0pfRaLKHlOwcy%FO z9@j|ZLIpvnDz};nYAfPx!L6WP5hx5H=tdOgV3P7RR?J>&8#J}RYKr<(wI9&t(JfiW zjXm;Y2#gNCrG@K2yT^Qe#lTyPnU56G!8a%s{iA48N`BH&?E;#p!;9@T#&BUtJ?Pux z94mzLab5i1;~ZCZTwt#8KnT@|H;yv@F6VAl4xf;ddKMYDe4YWXLc{b$GBo=0f$joK z2QLC)++;u}XJQ$U#X8}1s%KI{Z4!%FRG=D5Rk30+dBWMKFjZhx_?O32q4r8Jub}qL zv+yZlQS%xzu7EG=gCanAEwa*>%x5#X)?)>^E3HQV&aw9;yoU zug z9)1y$PoXFkm&!rU6jq%=tPV(EsYOUsyUvTkEr9ONKe|8v@PWLy$w?iGv+<}HUNV=< zfp2&llYWq#4w5epk{5&IuLQ|_kbFsy{M8_d*A|;9@ESdnd})w;S&)2rkmOr_z|}(x zE#_A&1iTY3V!)%~LY7H9`OQ*~Kp6WgE`>4cdf@Ph&?bD$3F9`o=A(m6x!2n3Uz6)! zH`jPe0kU6bE_1&j*ZlIfD*k%8{!M%R2D$z%d;LbaeiN>p++*LzBd6vUW^W&W_!`i4 zziaIsR8`F83~$O00?v{fksObZy^bZ!`I~A3PPcv8zS*GlDMV} ziQgd!4wc;Y-0$Mp)s?=MT@10=D!42cg~5^HiFDof&nB(bIpi4R*6YcFGwkC4RL zG9;d`B(A-TMgEK=5H(Bc;-i+ty4=Ug3i5H1K+Gyh;?FIK^|?=!CGi&|fml|O#3wC@ z>+r&maz_12l0dL1N#d_83Hk7D8Nc{zlGsp&#HUH3iUFiE_Zb{Z2ar$yLIjY`s~tc- zOXWz@?aFv{DDfeVq5`RY$o63;*GD%1`+;bT#f8`g#$~{-x%70Jg$S`Mf z?jOqP_aCX>&1LlaRcoRxmx+~MBZ)0#NPOLzXzOK6^o?H#6K%cPCi-W1!Q;+YFA?ev};48Yzj2ym4gWq6D6b_A_wj^%k+oj8p zc$y?|W1!^tPwvNMN&F{C>?uRyCzixbe9KrF&HjWWZYo3KrJ1c{Qwzzh z^-?Asf7v6(Iyi?7bTh881cjmbC|p48LEGnJHO6i1U=i5IaY%1J>>hRta~COmd$06; zw|(GXKkp{Ndw6qM&S0<0UGMn#HiLk$I2hbGbo_QG!Tt=t)~+#~({Ph`;+>ccbffIR0v^S(_U>SPG|bH~VXF46kJ4RabRYPLsbDD>F_0 zwQ^i1$Mtf&4*iha8nUFoiqJnmiS&IH@+ZK9T(Vzk;9QYb@IwV~RI1^;EfV0jTKG}i zqBiy7t=*QQ+#r*hcv~cZ%gq6S^A1@6$EVzMO>&1!vAaM6H#mN$2;nwYxwX{KpbrNL zTff!`t!$TGn0g!z>0`Hbxjy>wvWxvMgtc&&0)Gy_HpKsOLidb@#>}!E|Ie@*Mp7VL zo)q%#z8w23?>3V&aM|qQn=W;733Wq*8?_tA?L#0bC_ZWq`{CA@b`b4db3<>W5 zS=H)X=N1hsC}L^#z@i*8gy_j#9#vDp?h1t?H{Dcj!9EI=E4SWM?p8Q823QzMglHQV zgKXPo)-1Q*RB60^xR@`w38!**6ly^3%&Hu|c2U)brl$s8xB4Wa|Vn`7KEYu_zucw!ry zKvcEJy>3MvA*`yR9^5>z=z%4Qn}*yU;Bwgm#w2Lz*bf-NRzcijtB=U;zzB>g%0BFH zTLHg8fM}++3K;5#9q<+sTD-Q`I!zGBI3G(!|Zf z&ancxiJONVA205PO%2N?cHZXrM_B@&;Y60E4&aal8mG8TZORfv3v+z4!vO|I-zXYF zaSfeY2)$joBA_Ch#dk~b;QA8kb$yz$>)$~}L&i75_}%!$T8ICGp?xO0ZGND-p+UEs%+;|d>dY5)4CR$ z?b5)pYZAx-|LCM^Gwe zbM8_yED%C^goNFhntvG#E=u^P9_V;r#$a%fM8U?$B0Ug=kH@$RYBBJ0FI|>QUuR4|uN4oh>6)RvRlcUR}WyS6kB%Y_;~scv+fP&(imT}U(I z0wuq2fjSI)3UZS+w;+cb?BF&l?DGw1;ec`c30N>Bx|>6y6@^2$6Qzel1tcLf=;$HQ z-B)Eur1)0KN~uR2R9J+v(MkPR_p03ig8a76^c20_NmHc-iZEYvQA9%;`# zVup-#He0A&T8)V`D0G2^R!E`OtjN7)m1%6DLQ-UfItDCGvEWK6_~`Q7qwOUMMpjCp zm0F9a?FE6fri}u6zl9RtwqE2URD@9Nc7^IqD^K|kz`CJTo*0)n+(=;V)5ZO*9_xbQ zIIXoRG?B-0hl8kKB1B}BNl8S&W9Dv$|3W+MFUIaD#OAB~D=I?dxZ^emJrUPAg~u^; zC<;>Ygaw4eRz9w>I5G5Fr|GJ&otE9Y#?LB%R{o0||3OZER{J^M&%LiP_rCesV*Fr3 zWHl7cM}8u!1N>>?uPKecM)3L2jV#WoW`a6i%ra|Bms!j9Y-Ym1y-3_^OXFTkT(gD& z++QK?y3)Aoh`Tu8dzeqMuAhPHU|9!Wq!EL-b&>V5l7gcMz*PZ$E*bwsAM3TFzsR|} z2EglPQmZMTh9|+WE`uYfRk--LiKQs?@bH*K4T$oq^uP@>2nyN;S{xpTR-hhFkf&@5 zN_Lhm*~yaX@rH6GyGobr5-%%P=l^CizrJ+I>(PM}lrs?zQofW1+gQ5XMsXf^9Ts?v zY%k-Os=G8kKcxxnc5B;U0oas!IZJISU1}4YO_aJRz<&ktdrIT?s9Jh-Ej>Z0hgfQJ z=~A0bEt>=Uhl#(XH2xM<%NAYBmY~!tS!!$PQkZoqS+*K{*MEc>-c}la8=C~iy-ohB zRg+{6~5u!Ri-*64F)JyqHV6b*Y$tP z@!!aPSVbu;IErJcj5nE#Fz~Tbz&9J9@D?KR+a@DS;w>|QYOF#g0z}t;YY9ZZ1Ou*L zq8`^T!v6?|<#_#GB#73})&ECqa*1zsBz|34PEE&#sA0@nw? zKgJ+~4$%=7>%A5e-{Lg_yjNk0qi%o=ZN{GzWON1@@7J`~hiU(brEM@j;QDVOuuFM_ z(ingrWN`q|aiIIXUaRuMuKy8cAX?VpMz6vK@J%Ga5DKsYKH>O(MqtF1&8o2`M@hZ>65Pi*OUoG>M*cYwf&{zf0}f-v{d0@C~s;- z#%GDW6=1AoY(`Sq0vVq#m+^%HQbtUa_?u9Po-nB|mdp5CLki4VR==dM0YdZ?mjUf3 zEvDQ)groreoyO$J@{MovDoMjMzhZ$^0nNYH#WAM|fd61HrQZcx5&s`?=idGp3&Ziy zas97`k6yHV^xu3L+ zku?I4%>BXRPt@(c?O18BVh6C`cArPFw-<_iro`>OVv-PB(Wcm*-0s^>2Anfk%GGb~ z0D`*RrwTJJZ&!Ts)g6lepD6PHH82lgG!I}HXX;b8{SWyY3N+gs`%|mF)e^d=&}|FfPtCj z@Kd$4hdT5!9xGPNNWF%cA1gdCxXsoaz=E*!?10u;_{7!eeO8Gn%J#IA3KLiVWew@B^W1-I{OZt4M zI7q^m6m9zaxcK~y;`7PC=egn{l`DQ|${Pcp7hQm;I4Dr9&l5&r01JFRRf5lnl0IKZ zQt_#MK6O=mUh!?j6Q9>&+mHkval=xpP`gD4W?f~vTA6WYC6<-6+lF9)8SkZfb{3j3 zUD}KVB%vNfn`XpoWN~YKrVmEiM2 zX)_j(RD5bP-gi~ZsQ6Z9tWjpvVh3gfoMr^-E^EdBX3gloUa1EQ=2ks~Q9WElx8tWN zs%Lef8DCIRJ%uEp9z~mGoVqINQGAPfz>5T{)ygYu2R$8C-n+Zf-EF-$fCb)rKgHf% zDE0%Ty*DThk`P#Y3vO3Vg)g&1W73Sg& z2ktL~a+T-93s&2q2;6`&17?RJ(1XCh&TiX60+_TAXS%l31d@|O{yENc-AhBOx12!o z`2v%V<*U=~biE$k?4iA6bfbV^y3#EIs)f@c;53$!XJAe@l>nZkkSJY&*JI(Q>Oudf zfTE{R#vDVT!X2e|VZ^RVv=n5>ZYXBB@(MIESK)fR>Bnkxp&-wlr>mZ?<-RE_H-I8{ z5m3op1XOYt14ZrvV4FLQy)>0>FV(w8*A5_F;iZ7`KB^!?!~n90fdWc|HYEb#R)j^G z@?KKDNmE{=5CKyJZqfuoa7$pZ)vWjpgXI)EVqe5obm3e|3;VkaSuMLz=+)eHDA{+D zxjWkYI~Ho$`zd?EjWFPd?D)>Rh@%VaDOW(+pOL-8onFmbSvQr#hA-B+{hIU|ZSaAx z!PjWHi-4*L7Xr0>0^F;GUaREmB?H;{es+PDZ-DY8-AJ#I&nQF}*juguT^BB@l(E*G zzLxU!mBWTd*0}?kmv!d-cr^AtO=6ukVSfn|?i1#4C%)fMaHrSP-UCI*u$F6)ZFTN6 zZZ%iA`-+eudVstSl&3d@12uziI1nRHcish<`4#758ZzNxqmH~+b7gP?8Fw(kFXB}1 z1rvmKeG`1O}B?k)>`z`M(Q2*`fMk`LU?{P_2} zgYl7cDw8^s?FxONvdfmb?pP9^3*z?z-9sUS4ek0X9=kSo^>l6Q+PI-zfB17((woGG zViOzMk4&CU#7FQ^qT$pzFS+aV#-1}<&TKo=-95TxW2`6U*6Ocx9X{ih{Svr)NPowf z-_{IQiYl+D(rw#fTSm5Q?cUL|+1t2%hig9hJv@mIAD!9+pEh6DRUhXmLfGOKe2d(z z>-SDij>)%V-7EN>i!p-zs+!d+zOLuwK8g*v7$M>y;Ts=$Kr5}NuHm(Su$EpC#iKbD zb+yc?50VW6C^|}+1`HsGPm(M@dm+3L5&f(w(~AD40)$z<6+1#~It;(dz=5{yCwR11 z|L$bE-CPx(Zw=uEIVWM+{zQVGw{ylb_)??ib&Vzx0m7x#PWw%A`JM-oLrkz4;C_hn zFbF>Ul{)9>Q2)@~xyL5PJ~g!ev5CE>pLhQ4AEF9p|LR@p^gSnz;=_-zjAuUL%J1ED zO^lvK`CtBise#!w;Ns=V4&LzT zx`5vWe4Z&g%b9wLv1j6M7W^ZinZncPlej;Yowbgf(}OztP+}baJn)ePM-HATi-XTJ zb|a>R*A!%I2QRB|%mOk2+;$vU*LmQMYFXM*B8jVZ{KbG7Ln;PNMvzbWSvrM(38}?# zZo;#=fsFlvH3F(}(9T-T@I?qi&RI}O1K#EIYueN;%NNRg2)UGnzjEbx57>ovNYQ9G uu%v@`+|dh$kxO|p;Fr=EOOf(BiSWzc|BD8mu9GLUC$Mw(m%so2H1J>hWhcJ? diff --git a/tests/service/data/TestTP/TestTP.fsproj b/tests/service/data/TestTP/TestTP.fsproj index 2e0ac9aa19..c56ec5f349 100644 --- a/tests/service/data/TestTP/TestTP.fsproj +++ b/tests/service/data/TestTP/TestTP.fsproj @@ -1,76 +1,21 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - - - - Debug - AnyCPU - 2.0 - ff76bd3c-5e0a-4752-b6c3-044f6e15719b - Library - TestTP - TestTP - v4.5 - true - TestTP - ..\..\..\..\$(Configuration)\net40\bin - - - - true - full - false - false - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\TestTP.xml - true - - - pdbonly - true - true - TRACE - 3 - AnyCPU - bin\Release\TestTP.xml - true + net45 + true + nunit + + - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - CSharp_Analysis - {887630a3-4b1d-40ea-b8b3-2d842e9c40db} - True - + + - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - + diff --git a/verify-translations.cmd b/verify-translations.cmd index 6717de0f77..2580890c6f 100644 --- a/verify-translations.cmd +++ b/verify-translations.cmd @@ -1,3 +1,3 @@ @echo off -%~dp0release\net40\bin\fsi.exe %~dp0src\scripts\VerifyAllTranslations.fsx -- %~dp0 +%~dp0artifacts\bin\fsi\Release\net46\fsi.exe %~dp0src\scripts\VerifyAllTranslations.fsx -- %~dp0 From 0f9853db63eaf6a32942e123ca3ea7e0d44ee25c Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Wed, 30 Jan 2019 21:25:42 -0500 Subject: [PATCH 2/2] add type annotation to work with more recent mono --- fcs/build.fsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fcs/build.fsx b/fcs/build.fsx index fc163b67f7..5690fb73b0 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -57,7 +57,7 @@ let releaseDir = Path.Combine(__SOURCE_DIRECTORY__, "../artifacts/bin/fcs") let release = LoadReleaseNotes (__SOURCE_DIRECTORY__ + "/RELEASE_NOTES.md") let isAppVeyorBuild = buildServer = BuildServer.AppVeyor let isJenkinsBuild = buildServer = BuildServer.Jenkins -let isVersionTag tag = Version.TryParse tag |> fst +let isVersionTag (tag: string) = Version.TryParse tag |> fst let hasRepoVersionTag = isAppVeyorBuild && AppVeyorEnvironment.RepoTag && isVersionTag AppVeyorEnvironment.RepoTagName let assemblyVersion = if hasRepoVersionTag then AppVeyorEnvironment.RepoTagName else release.NugetVersion

t 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�judlDjx@NqV64qiq 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�IG= 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 literal 1452544 zcmd4437{NRmH%I<>aOnBZ%O*SmwwsEO9F(VyORJ>OoBiJ*%1K|!;T=xUa>1dO#31- zf(ijwTu>2#i2H)OGo!eU;~>Um)Nx@PbsT?=I*#M0<7oJQzUNkTSHJXo1jpa+KQHOJ z+qvhSbMCq4u664vXTRJFJkKled*l(%`zWsdHrjLc$MqzSOn!XC`{2NrmVb24$zNK2 z#$}f$%Qm;-XSbet^|FhfdCfKPmSq=RvaGfBnq`+?v+T)FecH0C<7Zv6dU&|9UyAzF zV?6KVIf3`3=U?-*thDcYBg+Tpls#`n%@Ibz(j)ON!*e07sFUCCBzqx2`@4&D;`JAJ z7ZyElp8fB-Y0!aq4;)eR&XFIy-%sx<_+Q7kMfuFBs@xBndiYl=dVoo_)f_4 zR&TlFx-Ep~Elc?luhYsW%Z003N$XQg2qs|Rr#91L}N~^?s;do zpmMXysYLi1ehm6b-5WcoTXrt3@Mc)hHg}TD1<3@UMEhzeR)& z)+)Fjfpr9AjajS~N*iLvwbIN5D1!GdYw(=aviAk_n<(HU}{1Zq#f13(%F??m5PP z!TTvRB962kza{=jU;iZ|y<9El*emDQs|2$OrnK>9Lm>I6*3kzioK**=5?ghw<9#SF z-iOP^vlBoM=Y_y=UPLTXfs}tZg5wV3VUP*{xkv$0_JJz(=X*l*iSMksn-xFYJs#7z zLWJaP@TKyhA55t()V7SkdN*FgSiE_<@haZp%|pD}D|jG;_(S}*JPsK&bkk`~E?pjD zl`6`mqopog9%EAJIeS3R>;WdK)ApNb95i&>J`GxS%-X&ZvId{Fcg%1lf(Y9CK2kwz zC-;yCOP}h=%LtjCyaJz5cO@F@X?kLX>c2>wveXfuI zAX07pow!&q>fBN*lF0g7#EOL#YWLxXcHYYmZF}u$DL*S5KQv+Sqb4jK(A7Oz2~$?2 z!hP5%m5q&zl$00Q+RGpc8|h@2Kb?3rt3Pth)Tq zF|39;wM0*Q6<2zCN-EoBy?WZCpm_>0PmWTm+z51ao0+E`0@d%z?ods#J5GG5-H9Y> zXLlCk#a^f~&5oD{JCVk#6pJ@c*M5vxJoZH%Q$Oi_H=R~bKGNkeT9uAnqgfXiPqb+o z=AvrmB1UuRG7I(lJ9bRqeql<`esM~`{zzd;!2U>a%7DQuo%vT>!f9Q6laSTLgLtet z54y640wZC#JWz`FgZD~UTjPiIuy!!d3{b^k4UEXKuv)B!YYOwdMoGTizBfjbtE~yD zg*xuRacsI z$Mzs1*`9T-`Iszz0Mm>FWqXwBY|p195(`U5?B+MjIFo_J7kVvUsLL#NQt0
s}+Fbl?{_B+($E>yG4XOh}Sy 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�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
-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