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 =