From 1efe4fe4ca2900bcfa161c9af7fcb990b8c474a8 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Mon, 25 Dec 2023 14:39:42 +0330 Subject: [PATCH] Core: introduce new rule --- src/FSharpLint.Core/FSharpLint.Core.fsproj | 1 + ...dingRecursiveKeywordInNonRecursiveFuncs.fs | 20 +++++++++++++ src/FSharpLint.Core/Rules/Identifiers.fs | 1 + .../FSharpLint.Core.Tests.fsproj | 1 + ...dingRecursiveKeywordInNonRecursiveFuncs.fs | 28 +++++++++++++++++++ 5 files changed, 51 insertions(+) create mode 100644 src/FSharpLint.Core/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs create mode 100644 tests/FSharpLint.Core.Tests/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs diff --git a/src/FSharpLint.Core/FSharpLint.Core.fsproj b/src/FSharpLint.Core/FSharpLint.Core.fsproj index e0eea381c..8a2729590 100644 --- a/src/FSharpLint.Core/FSharpLint.Core.fsproj +++ b/src/FSharpLint.Core/FSharpLint.Core.fsproj @@ -42,6 +42,7 @@ + diff --git a/src/FSharpLint.Core/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs b/src/FSharpLint.Core/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs new file mode 100644 index 000000000..ebc5460fd --- /dev/null +++ b/src/FSharpLint.Core/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs @@ -0,0 +1,20 @@ +module FSharpLint.Rules.AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs + +open System +open FSharp.Compiler.Syntax +open FSharpLint.Framework.Ast +open FSharpLint.Framework.Rules +open FSharpLint.Framework +open FSharpLint.Framework.Suggestion + +let runner (args:AstNodeRuleParams) = + printfn "%A" args.AstNode + failwith "not implemented" + +let rule = + { Name = "AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs" + Identifier = Identifiers.AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs + RuleConfig = + { AstNodeRuleConfig.Runner = runner + Cleanup = ignore } } + |> AstNodeRule diff --git a/src/FSharpLint.Core/Rules/Identifiers.fs b/src/FSharpLint.Core/Rules/Identifiers.fs index 0999cd8e9..ab5b36baf 100644 --- a/src/FSharpLint.Core/Rules/Identifiers.fs +++ b/src/FSharpLint.Core/Rules/Identifiers.fs @@ -86,3 +86,4 @@ let AsyncExceptionWithoutReturn = identifier 78 let SuggestUseAutoProperty = identifier 79 let UnnestedFunctionNames = identifier 80 let NestedFunctionNames = identifier 81 +let AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs = identifier 82 diff --git a/tests/FSharpLint.Core.Tests/FSharpLint.Core.Tests.fsproj b/tests/FSharpLint.Core.Tests/FSharpLint.Core.Tests.fsproj index ccd3b58c4..13d3c5a5d 100644 --- a/tests/FSharpLint.Core.Tests/FSharpLint.Core.Tests.fsproj +++ b/tests/FSharpLint.Core.Tests/FSharpLint.Core.Tests.fsproj @@ -26,6 +26,7 @@ + diff --git a/tests/FSharpLint.Core.Tests/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs b/tests/FSharpLint.Core.Tests/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs new file mode 100644 index 000000000..7969e3e53 --- /dev/null +++ b/tests/FSharpLint.Core.Tests/Rules/Conventions/AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.fs @@ -0,0 +1,28 @@ +module FSharpLint.Core.Tests.Rules.Conventions.AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs + +open NUnit.Framework +open FSharpLint.Framework.Rules +open FSharpLint.Rules + +[] +type TestConventionsAvoidMisleadingRecursiveKeywordInNonRecursiveFuncs() = + inherit TestAstNodeRuleBase.TestAstNodeRuleBase(AvoidMisleadingRecursiveKeywordInNonRecursiveFuncs.rule) + + [] + member this.AvoidMisleadingRecursiveKeywordInNonRecursiveFuncsShouldNotProduceError() = + this.Parse """ +let rec Foo () = + if someParam then + Foo() + else + ()""" + + Assert.IsTrue this.NoErrorsExist + + [] + member this.AvoidMisleadingRecursiveKeywordInNonRecursiveFuncsShouldProduceError() = + this.Parse """ +let rec Foo someParam = + ()""" + + Assert.IsTrue this.ErrorsExist