diff --git a/FSharpLint.sln b/FSharpLint.sln
index cb85d26a2..ce44fe008 100644
--- a/FSharpLint.sln
+++ b/FSharpLint.sln
@@ -114,6 +114,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rules", "rules", "{AEBB56D7
docs\content\how-tos\rules\FL0082.md = docs\content\how-tos\rules\FL0082.md
EndProjectSection
EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "documentation", "docs\documentation.fsproj", "{BDBE9823-53B0-0AA0-CB68-77B20FE137E2}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -196,6 +198,18 @@ Global
{B4A92AC6-F74A-4709-B2F7-6C5BABBFDEB0}.Release|x64.Build.0 = Release|Any CPU
{B4A92AC6-F74A-4709-B2F7-6C5BABBFDEB0}.Release|x86.ActiveCfg = Release|Any CPU
{B4A92AC6-F74A-4709-B2F7-6C5BABBFDEB0}.Release|x86.Build.0 = Release|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Debug|x64.Build.0 = Debug|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Debug|x86.Build.0 = Debug|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Release|x64.ActiveCfg = Release|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Release|x64.Build.0 = Release|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Release|x86.ActiveCfg = Release|Any CPU
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -209,6 +223,7 @@ Global
{B4A92AC6-F74A-4709-B2F7-6C5BABBFDEB0} = {1CD44876-BCDC-4C93-9DC2-C45244BD62AE}
{E1E03FFE-30DF-4522-83DA-9089147B431E} = {270E691D-ECA1-4BC5-B851-C5431A64E9FA}
{AEBB56D7-30B4-40D7-B065-54B8BE960298} = {E1E03FFE-30DF-4522-83DA-9089147B431E}
+ {BDBE9823-53B0-0AA0-CB68-77B20FE137E2} = {270E691D-ECA1-4BC5-B851-C5431A64E9FA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B54B4B7D-F019-48A3-BB5B-635B68FE41C3}
diff --git a/docs/documentation.fsproj b/docs/documentation.fsproj
new file mode 100644
index 000000000..7210d0879
--- /dev/null
+++ b/docs/documentation.fsproj
@@ -0,0 +1,17 @@
+
+
+
+ false
+ $(MSBuildThisFileDirectory)../packages/docs
+ true
+ net9.0
+ false
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/generators/apiref.fsx b/docs/generators/apiref.fsx
index 559dbb13d..28c1f046d 100644
--- a/docs/generators/apiref.fsx
+++ b/docs/generators/apiref.fsx
@@ -1,7 +1,7 @@
#r "../_lib/Fornax.Core.dll"
-#r "../../packages/docs/Markdig/lib/netstandard2.0/Markdig.dll"
-#r "../../packages/docs/Newtonsoft.Json/lib/netstandard2.0/Newtonsoft.Json.dll"
-#r "../../packages/docs/FSharp.Formatting/lib/netstandard2.0/FSharp.MetadataFormat.dll"
+#r "../../packages/docs/markdig/0.34.0/lib/netstandard2.0/Markdig.dll"
+#r "../../packages/docs/newtonsoft.json/13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll"
+#r "../../packages/docs/fsharp.formatting/4.1.0/lib/netstandard2.0/FSharp.MetadataFormat.dll"
#if !FORNAX
#load "../loaders/apirefloader.fsx"
diff --git a/docs/generators/lunr.fsx b/docs/generators/lunr.fsx
index a38fd9e55..a51d509a3 100644
--- a/docs/generators/lunr.fsx
+++ b/docs/generators/lunr.fsx
@@ -1,6 +1,6 @@
#r "../_lib/Fornax.Core.dll"
-#r "../../packages/docs/Newtonsoft.Json/lib/netstandard2.0/Newtonsoft.Json.dll"
-#r "../../packages/docs/FSharp.Formatting/lib/netstandard2.0/FSharp.MetadataFormat.dll"
+#r "../../packages/docs/newtonsoft.json/13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll"
+#r "../../packages/docs/fsharp.formatting/4.1.0/lib/netstandard2.0/FSharp.MetadataFormat.dll"
#if !FORNAX
#load "../loaders/contentloader.fsx"
#load "../loaders/apirefloader.fsx"
diff --git a/docs/loaders/apirefloader.fsx b/docs/loaders/apirefloader.fsx
index 0e75204ed..f82512f59 100644
--- a/docs/loaders/apirefloader.fsx
+++ b/docs/loaders/apirefloader.fsx
@@ -1,5 +1,5 @@
#r "../_lib/Fornax.Core.dll"
-#r "../../packages/docs/FSharp.Formatting/lib/netstandard2.0/FSharp.MetadataFormat.dll"
+#r "../../packages/docs/fsharp.formatting/4.1.0/lib/netstandard2.0/FSharp.MetadataFormat.dll"
open System
open System.IO
@@ -38,7 +38,7 @@ let loader (projectRoot: string) (siteContet: SiteContents) =
Path.Combine (projectRoot, "..", "build")
]
for (label, dll) in dlls do
- let output = MetadataFormat.Generate(dll, markDownComments = true, publicOnly = true, libDirs = libs)
+ let output = MetadataFormat.Generate(dllFile = dll, markDownComments = true, publicOnly = true, libDirs = libs, parameters = [("project-name", label)])
let allModules =
output.AssemblyGroup.Namespaces
diff --git a/docs/loaders/contentloader.fsx b/docs/loaders/contentloader.fsx
index c101a5ca3..8cb9a660e 100644
--- a/docs/loaders/contentloader.fsx
+++ b/docs/loaders/contentloader.fsx
@@ -1,6 +1,6 @@
open System
#r "../_lib/Fornax.Core.dll"
-#r "../../packages/docs/Markdig/lib/netstandard2.0/Markdig.dll"
+#r "../../packages/docs/markdig/0.34.0/lib/netstandard2.0/Markdig.dll"
open Markdig
open System.IO
diff --git a/src/FSharpLint.Core/Rules/Conventions/NoPartialFunctions.fs b/src/FSharpLint.Core/Rules/Conventions/NoPartialFunctions.fs
index b480f0fc9..502db2f95 100644
--- a/src/FSharpLint.Core/Rules/Conventions/NoPartialFunctions.fs
+++ b/src/FSharpLint.Core/Rules/Conventions/NoPartialFunctions.fs
@@ -119,107 +119,94 @@ let rec private tryFindTypedExpression (range: Range) (expression: FSharpExpr) =
if expression.Range = range then
Some expression
else
- try
- match expression with
- | FSharpExprPatterns.AddressOf(lvalueExpr) ->
- tryFindTypedExpression range lvalueExpr
- | FSharpExprPatterns.AddressSet(lvalueExpr, rvalueExpr) ->
- tryFindTypedExpression range lvalueExpr |> Option.orElse (tryFindTypedExpression range rvalueExpr)
- | FSharpExprPatterns.Application(funcExpr, _typeArgs, argExprs) ->
- (funcExpr :: argExprs) |> tryFindFirst
- | FSharpExprPatterns.Call(objExprOpt, _memberOrFunc, _typeArgs1, _typeArgs2, argExprs) ->
- (List.append (Option.toList objExprOpt) argExprs) |> tryFindFirst
- | FSharpExprPatterns.Coerce(_targetType, inpExpr) ->
- tryFindTypedExpression range inpExpr
- | FSharpExprPatterns.FastIntegerForLoop(startExpr, limitExpr, consumeExpr, _isUp, _, _) ->
- [ startExpr; limitExpr; consumeExpr ] |> tryFindFirst
- | FSharpExprPatterns.ILAsm(_asmCode, _typeArgs, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.ILFieldGet (objExprOpt, _fieldType, _fieldName) ->
- objExprOpt |> Option.bind (tryFindTypedExpression range)
- | FSharpExprPatterns.ILFieldSet (objExprOpt, _fieldType, _fieldName, valueExpr) ->
- objExprOpt |> Option.bind (tryFindTypedExpression range) |> Option.orElse (tryFindTypedExpression range valueExpr)
- | FSharpExprPatterns.IfThenElse (guardExpr, thenExpr, elseExpr) ->
- [ guardExpr; thenExpr; elseExpr ] |> tryFindFirst
- | FSharpExprPatterns.Lambda(_lambdaVar, bodyExpr) ->
- tryFindTypedExpression range bodyExpr
- | FSharpExprPatterns.Let((_bindingVar, bindingExpr, _), bodyExpr) ->
- tryFindTypedExpression range bindingExpr |> Option.orElse (tryFindTypedExpression range bodyExpr)
- | FSharpExprPatterns.LetRec(recursiveBindings, bodyExpr) ->
- recursiveBindings
- |> Seq.choose (fun (_, expr, _) -> tryFindTypedExpression range expr)
- |> Seq.tryHead
- |> Option.orElse (tryFindTypedExpression range bodyExpr)
- | FSharpExprPatterns.NewArray(_arrayType, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.NewDelegate(_delegateType, delegateBodyExpr) ->
- tryFindTypedExpression range delegateBodyExpr
- | FSharpExprPatterns.NewObject(_objType, _typeArgs, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.NewRecord(_recordType, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.NewAnonRecord(_recordType, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.NewTuple(_tupleType, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.NewUnionCase(_unionType, _unionCase, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.Quote(quotedExpr) ->
- tryFindTypedExpression range quotedExpr
- | FSharpExprPatterns.FSharpFieldGet(objExprOpt, _recordOrClassType, _fieldInfo) ->
- objExprOpt |> Option.bind (tryFindTypedExpression range)
- | FSharpExprPatterns.AnonRecordGet(objExpr, _recordOrClassType, _fieldInfo) ->
- tryFindTypedExpression range objExpr
- | FSharpExprPatterns.FSharpFieldSet(objExprOpt, _recordOrClassType, _fieldInfo, argExpr) ->
- objExprOpt |> Option.bind (tryFindTypedExpression range) |> Option.orElse (tryFindTypedExpression range argExpr)
- | FSharpExprPatterns.Sequential(firstExpr, secondExpr) ->
- tryFindTypedExpression range firstExpr |> Option.orElse (tryFindTypedExpression range secondExpr)
- | FSharpExprPatterns.TryFinally(bodyExpr, finalizeExpr, _, _) ->
- tryFindTypedExpression range bodyExpr |> Option.orElse (tryFindTypedExpression range finalizeExpr)
- | FSharpExprPatterns.TryWith(bodyExpr, _, _, _catchVar, catchExpr, _, _) ->
- tryFindTypedExpression range bodyExpr |> Option.orElse (tryFindTypedExpression range catchExpr)
- | FSharpExprPatterns.TupleGet(_tupleType, _tupleElemIndex, tupleExpr) ->
- tryFindTypedExpression range tupleExpr
- | FSharpExprPatterns.DecisionTree(decisionExpr, decisionTargets) ->
- tryFindTypedExpression range decisionExpr
- |> Option.orElse (decisionTargets |> Seq.choose (fun (_, expr) -> tryFindTypedExpression range expr) |> Seq.tryHead)
- | FSharpExprPatterns.DecisionTreeSuccess (_decisionTargetIdx, decisionTargetExprs) ->
- tryFindFirst decisionTargetExprs
- | FSharpExprPatterns.TypeLambda(_genericParam, bodyExpr) ->
- tryFindTypedExpression range bodyExpr
- | FSharpExprPatterns.TypeTest(_ty, inpExpr) ->
- tryFindTypedExpression range inpExpr
- | FSharpExprPatterns.UnionCaseSet(unionExpr, unionType, unionCase, unionCaseField, valueExpr) ->
- tryFindTypedExpression range unionExpr |> Option.orElse (tryFindTypedExpression range valueExpr)
- | FSharpExprPatterns.UnionCaseGet(unionExpr, _unionType, _unionCase, _unionCaseField) ->
- tryFindTypedExpression range unionExpr
- | FSharpExprPatterns.UnionCaseTest(unionExpr, _unionType, _unionCase) ->
- tryFindTypedExpression range unionExpr
- | FSharpExprPatterns.UnionCaseTag(unionExpr, _unionType) ->
- tryFindTypedExpression range unionExpr
- | FSharpExprPatterns.ObjectExpr(_objType, baseCallExpr, overrides, interfaceImplementations) ->
- let interfaceImlps = interfaceImplementations |> List.collect snd
- baseCallExpr :: (List.append overrides interfaceImlps |> Seq.cast |> Seq.toList)
- |> tryFindFirst
- | FSharpExprPatterns.TraitCall(_sourceTypes, _traitName, _typeArgs, _typeInstantiation, _argTypes, argExprs) ->
- tryFindFirst argExprs
- | FSharpExprPatterns.ValueSet(_valToSet, valueExpr) ->
- tryFindTypedExpression range valueExpr
- | FSharpExprPatterns.WhileLoop(guardExpr, bodyExpr, _) ->
- tryFindTypedExpression range guardExpr |> Option.orElse (tryFindTypedExpression range bodyExpr)
- | _ -> None
- with
- | exn ->
- // workaround for bug in FSharp.Compiler.Services that sometimes results in
- // "FSharp.Compiler.Service cannot yet return this kind of pattern match at ..." exception
- // see https://github.com/dotnet/fsharp/issues/8854
- // also see https://github.com/ionide/FSharp.Analyzers.SDK/blob/49a5a209455870884888761afd9039bd7bea3a72/src/FSharp.Analyzers.SDK/TASTCollecting.fs#L370
- // there is a merged PR that should address this bug: https://github.com/dotnet/fsharp/pull/16121
- // but at the time of writing this comment latest FSharp.Compiler.Services on nuget (43.8.101) doesn't include that fix
- if exn.Message.Contains "FSharp.Compiler.Service cannot yet return this kind of pattern match at" then
- None
- else
- reraise()
+ match expression with
+ | FSharpExprPatterns.AddressOf(lvalueExpr) ->
+ tryFindTypedExpression range lvalueExpr
+ | FSharpExprPatterns.AddressSet(lvalueExpr, rvalueExpr) ->
+ tryFindTypedExpression range lvalueExpr |> Option.orElse (tryFindTypedExpression range rvalueExpr)
+ | FSharpExprPatterns.Application(funcExpr, _typeArgs, argExprs) ->
+ (funcExpr :: argExprs) |> tryFindFirst
+ | FSharpExprPatterns.Call(objExprOpt, _memberOrFunc, _typeArgs1, _typeArgs2, argExprs) ->
+ (List.append (Option.toList objExprOpt) argExprs) |> tryFindFirst
+ | FSharpExprPatterns.Coerce(_targetType, inpExpr) ->
+ tryFindTypedExpression range inpExpr
+ | FSharpExprPatterns.FastIntegerForLoop(startExpr, limitExpr, consumeExpr, _isUp, _, _) ->
+ [ startExpr; limitExpr; consumeExpr ] |> tryFindFirst
+ | FSharpExprPatterns.ILAsm(_asmCode, _typeArgs, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.ILFieldGet (objExprOpt, _fieldType, _fieldName) ->
+ objExprOpt |> Option.bind (tryFindTypedExpression range)
+ | FSharpExprPatterns.ILFieldSet (objExprOpt, _fieldType, _fieldName, valueExpr) ->
+ objExprOpt |> Option.bind (tryFindTypedExpression range) |> Option.orElse (tryFindTypedExpression range valueExpr)
+ | FSharpExprPatterns.IfThenElse (guardExpr, thenExpr, elseExpr) ->
+ [ guardExpr; thenExpr; elseExpr ] |> tryFindFirst
+ | FSharpExprPatterns.Lambda(_lambdaVar, bodyExpr) ->
+ tryFindTypedExpression range bodyExpr
+ | FSharpExprPatterns.Let((_bindingVar, bindingExpr, _), bodyExpr) ->
+ tryFindTypedExpression range bindingExpr |> Option.orElse (tryFindTypedExpression range bodyExpr)
+ | FSharpExprPatterns.LetRec(recursiveBindings, bodyExpr) ->
+ recursiveBindings
+ |> Seq.choose (fun (_, expr, _) -> tryFindTypedExpression range expr)
+ |> Seq.tryHead
+ |> Option.orElse (tryFindTypedExpression range bodyExpr)
+ | FSharpExprPatterns.NewArray(_arrayType, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.NewDelegate(_delegateType, delegateBodyExpr) ->
+ tryFindTypedExpression range delegateBodyExpr
+ | FSharpExprPatterns.NewObject(_objType, _typeArgs, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.NewRecord(_recordType, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.NewAnonRecord(_recordType, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.NewTuple(_tupleType, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.NewUnionCase(_unionType, _unionCase, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.Quote(quotedExpr) ->
+ tryFindTypedExpression range quotedExpr
+ | FSharpExprPatterns.FSharpFieldGet(objExprOpt, _recordOrClassType, _fieldInfo) ->
+ objExprOpt |> Option.bind (tryFindTypedExpression range)
+ | FSharpExprPatterns.AnonRecordGet(objExpr, _recordOrClassType, _fieldInfo) ->
+ tryFindTypedExpression range objExpr
+ | FSharpExprPatterns.FSharpFieldSet(objExprOpt, _recordOrClassType, _fieldInfo, argExpr) ->
+ objExprOpt |> Option.bind (tryFindTypedExpression range) |> Option.orElse (tryFindTypedExpression range argExpr)
+ | FSharpExprPatterns.Sequential(firstExpr, secondExpr) ->
+ tryFindTypedExpression range firstExpr |> Option.orElse (tryFindTypedExpression range secondExpr)
+ | FSharpExprPatterns.TryFinally(bodyExpr, finalizeExpr, _, _) ->
+ tryFindTypedExpression range bodyExpr |> Option.orElse (tryFindTypedExpression range finalizeExpr)
+ | FSharpExprPatterns.TryWith(bodyExpr, _, _, _catchVar, catchExpr, _, _) ->
+ tryFindTypedExpression range bodyExpr |> Option.orElse (tryFindTypedExpression range catchExpr)
+ | FSharpExprPatterns.TupleGet(_tupleType, _tupleElemIndex, tupleExpr) ->
+ tryFindTypedExpression range tupleExpr
+ | FSharpExprPatterns.DecisionTree(decisionExpr, decisionTargets) ->
+ tryFindTypedExpression range decisionExpr
+ |> Option.orElse (decisionTargets |> Seq.choose (fun (_, expr) -> tryFindTypedExpression range expr) |> Seq.tryHead)
+ | FSharpExprPatterns.DecisionTreeSuccess (_decisionTargetIdx, decisionTargetExprs) ->
+ tryFindFirst decisionTargetExprs
+ | FSharpExprPatterns.TypeLambda(_genericParam, bodyExpr) ->
+ tryFindTypedExpression range bodyExpr
+ | FSharpExprPatterns.TypeTest(_ty, inpExpr) ->
+ tryFindTypedExpression range inpExpr
+ | FSharpExprPatterns.UnionCaseSet(unionExpr, unionType, unionCase, unionCaseField, valueExpr) ->
+ tryFindTypedExpression range unionExpr |> Option.orElse (tryFindTypedExpression range valueExpr)
+ | FSharpExprPatterns.UnionCaseGet(unionExpr, _unionType, _unionCase, _unionCaseField) ->
+ tryFindTypedExpression range unionExpr
+ | FSharpExprPatterns.UnionCaseTest(unionExpr, _unionType, _unionCase) ->
+ tryFindTypedExpression range unionExpr
+ | FSharpExprPatterns.UnionCaseTag(unionExpr, _unionType) ->
+ tryFindTypedExpression range unionExpr
+ | FSharpExprPatterns.ObjectExpr(_objType, baseCallExpr, overrides, interfaceImplementations) ->
+ let interfaceImlps = interfaceImplementations |> List.collect snd
+ baseCallExpr :: (List.append overrides interfaceImlps |> Seq.cast |> Seq.toList)
+ |> tryFindFirst
+ | FSharpExprPatterns.TraitCall(_sourceTypes, _traitName, _typeArgs, _typeInstantiation, _argTypes, argExprs) ->
+ tryFindFirst argExprs
+ | FSharpExprPatterns.ValueSet(_valToSet, valueExpr) ->
+ tryFindTypedExpression range valueExpr
+ | FSharpExprPatterns.WhileLoop(guardExpr, bodyExpr, _) ->
+ tryFindTypedExpression range guardExpr |> Option.orElse (tryFindTypedExpression range bodyExpr)
+ | _ -> None
let private getTypedExpressionForRange (checkFile:FSharpCheckFileResults) (range: Range) =
let expressions =