Skip to content

Commit f7ba50a

Browse files
knoctewebwarrior-ws
andcommitted
Core: add new all{upper,lower}case styles
Also modified a test to make sure they work. Co-authored-by: webwarrior-ws <reg@webwarrior.ws>
1 parent 396da7c commit f7ba50a

File tree

4 files changed

+44
-5
lines changed

4 files changed

+44
-5
lines changed

src/FSharpLint.Core/Framework/Rules.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ type AstNodeRuleConfig =
5353
type NamingCase =
5454
| PascalCase = 0
5555
| CamelCase = 1
56+
| AllLowercase = 2
57+
| AllUppercase = 3
5658

5759
type NamingUnderscores =
5860
| None = 0

src/FSharpLint.Core/Rules/Conventions/Naming/NamingHelper.fs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,16 @@ module QuickFixes =
6767
let camelCaseIdent = mapFirstChar Char.ToLower ident.idText
6868
Some { FromText = ident.idText; FromRange = ident.idRange; ToText = camelCaseIdent })
6969

70+
let toAllLowercase (ident:Ident) = lazy(
71+
let newIdent = ident.idText.ToLower()
72+
//TODO: in case Underscores=AllowAny or AllowInfix, and ident is PascalCase or CamelCase, try to inject them when case changes
73+
Some { FromText = ident.idText; FromRange = ident.idRange; ToText = newIdent })
74+
75+
let toAllUppercase (ident:Ident) = lazy(
76+
let newIdent = ident.idText.ToUpper()
77+
//TODO: in case Underscores=AllowAny or AllowInfix, and ident is PascalCase or CamelCase, try to inject them when case changes
78+
Some { FromText = ident.idText; FromRange = ident.idRange; ToText = newIdent })
79+
7080
[<Literal>]
7181
let private NumberOfExpectedBackticks = 4
7282

@@ -94,6 +104,12 @@ let isCamelCase (identifier:string) =
94104
if withoutUnderscorePrefix.Length = 0 then true
95105
else Char.IsLower withoutUnderscorePrefix.[0]
96106

107+
let isAllLowercase (identifier:string) =
108+
Seq.forall (fun char -> Char.IsLower char || (not <| Char.IsLetter char)) identifier
109+
110+
let isAllUppercase (identifier:string) =
111+
Seq.forall (fun char -> Char.IsUpper char || (not <| Char.IsLetter char)) identifier
112+
97113
let private pascalCaseRule (identifier:string) =
98114
if not (isPascalCase identifier) then Some "RulesNamingConventionsPascalCaseError"
99115
else None
@@ -102,6 +118,15 @@ let private camelCaseRule (identifier:string) =
102118
if not (isCamelCase identifier) then Some "RulesNamingConventionsCamelCaseError"
103119
else None
104120

121+
let private uppercaseRule (identifier:string) =
122+
if not (isAllUppercase identifier) then Some "RulesNamingConventionsUppercaseError"
123+
else None
124+
125+
let private lowercaseRule (identifier:string) =
126+
if not (isAllLowercase identifier) then Some "RulesNamingConventionsLowercaseError"
127+
else None
128+
129+
105130
let private underscoreRule (underscoreMode: NamingUnderscores) (identifier:string) =
106131
let errorKeyToRemoveUnderscores = "RulesNamingConventionsUnderscoreError"
107132
let errorKeyToRemoveLeadingOrTrailingUnderscores = "RulesNamingConventionsNoInfixUnderscoreError"
@@ -140,6 +165,12 @@ let private checkIdentifierPart (config:NamingConfig) (identifier:Ident) (idText
140165
| Some NamingCase.CamelCase ->
141166
camelCaseRule idText
142167
|> Option.map (formatError >> tryAddFix QuickFixes.toCamelCase)
168+
| Some NamingCase.AllLowercase ->
169+
lowercaseRule idText
170+
|> Option.map (formatError >> tryAddFix QuickFixes.toAllLowercase)
171+
| Some NamingCase.AllUppercase ->
172+
uppercaseRule idText
173+
|> Option.map (formatError >> tryAddFix QuickFixes.toAllUppercase)
143174
| _ -> None
144175

145176
let underscoresError =

src/FSharpLint.Core/Text.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@
177177
<data name="RulesNamingConventionsNoInfixUnderscoreError" xml:space="preserve">
178178
<value>Consider removing any leading or trailing underscore from `{0}`.</value>
179179
</data>
180+
<data name="RulesNamingConventionsUppercaseError" xml:space="preserve">
181+
<value>Consider changing `{0}` to uppercase.</value>
182+
</data>
183+
<data name="RulesNamingConventionsLowercaseError" xml:space="preserve">
184+
<value>Consider changing `{0}` to lowercase.</value>
185+
</data>
180186
<data name="RulesAvoidTooShortNamesError" xml:space="preserve">
181187
<value>Consider using a longer name, as it is currently too short.</value>
182188
</data>

tests/FSharpLint.Core.Tests/Rules/Conventions/Naming/LiteralNames.fs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ let cat = 5
7171
Assert.IsTrue(this.ErrorExistsAt(5, 4))
7272

7373
let infixConfig =
74-
{ NamingConfig.Naming = Some NamingCase.PascalCase
74+
{ NamingConfig.Naming = Some NamingCase.AllLowercase
7575
Underscores = Some NamingUnderscores.AllowInfix
7676
Prefix = None
7777
Suffix = None }
@@ -86,7 +86,7 @@ type TestConventionsLiteralNamesInfix() =
8686
module Program
8787
8888
[<Literal>]
89-
let Super_Cat = 5
89+
let super_cat = 5
9090
"""
9191

9292
this.AssertNoWarnings()
@@ -97,7 +97,7 @@ let Super_Cat = 5
9797
module Program
9898
9999
[<Literal>]
100-
let _Cat = 5
100+
let _cat = 5
101101
"""
102102

103103
Assert.IsTrue(this.ErrorExistsOnLine 5)
@@ -108,7 +108,7 @@ let _Cat = 5
108108
module Program
109109
110110
[<Literal>]
111-
let Cat_ = 5
111+
let cat_ = 5
112112
"""
113113

114114
Assert.IsTrue(this.ErrorExistsOnLine 5)
@@ -122,5 +122,5 @@ module Program
122122
let SuperCat = 5
123123
"""
124124

125-
this.AssertNoWarnings()
125+
Assert.IsTrue(this.ErrorExistsOnLine 5)
126126

0 commit comments

Comments
 (0)