@@ -12,62 +12,51 @@ import SwiftSyntax
12
12
///
13
13
/// - SeeAlso: https://google.github.io/swift#static-and-class-properties
14
14
public final class DontRepeatTypeInStaticProperties : SyntaxLintRule {
15
-
15
+
16
16
public override func visit( _ node: ClassDeclSyntax ) {
17
17
determinePropertyNameViolations ( members: node. members. members, nodeId: node. identifier. text)
18
18
}
19
-
19
+
20
20
public override func visit( _ node: EnumDeclSyntax ) {
21
21
determinePropertyNameViolations ( members: node. members. members, nodeId: node. identifier. text)
22
22
}
23
-
23
+
24
24
public override func visit( _ node: ProtocolDeclSyntax ) {
25
25
determinePropertyNameViolations ( members: node. members. members, nodeId: node. identifier. text)
26
26
}
27
-
27
+
28
28
public override func visit( _ node: StructDeclSyntax ) {
29
29
determinePropertyNameViolations ( members: node. members. members, nodeId: node. identifier. text)
30
30
}
31
-
31
+
32
32
public override func visit( _ node: ExtensionDeclSyntax ) {
33
- determinePropertyNameViolations ( members: node. members. members, nodeId: node. extendedType. description)
33
+ determinePropertyNameViolations ( members: node. members. members,
34
+ nodeId: node. extendedType. description)
34
35
}
35
36
36
37
func determinePropertyNameViolations( members: MemberDeclListSyntax , nodeId: String ) {
37
38
for member in members {
38
39
guard let decl = member. decl as? VariableDeclSyntax else { continue }
39
40
guard let modifiers = decl. modifiers else { continue }
40
- guard containsClassOrStatic ( modifiers: modifiers) else { continue }
41
-
41
+ guard modifiers. has ( modifier : " static " ) || modifiers. has ( modifier : " class " ) else { continue }
42
+
42
43
let typeName = withoutPrefix ( name: nodeId)
43
- var varName = " "
44
-
45
- for binding in decl. bindings {
46
- guard let exp = binding. pattern as? IdentifierPatternSyntax else { continue }
47
- varName = exp. identifier. text
48
- }
49
-
50
- if varName. contains ( typeName) {
44
+
45
+ for id in decl. identifiers {
46
+ let varName = id. identifier. text
47
+ guard varName. contains ( typeName) else { continue }
51
48
diagnose ( . removeTypeFromName( name: varName, type: typeName) , on: decl)
52
49
}
53
50
}
54
51
}
55
52
56
- func containsClassOrStatic( modifiers: ModifierListSyntax ) -> Bool {
57
- for modifier in modifiers {
58
- let name = modifier. name. text
59
- if name == " class " || name == " static " { return true }
60
- }
61
- return false
62
- }
63
-
64
53
// Returns the given string without capitalized prefix in the beginning
65
54
func withoutPrefix( name: String ) -> String {
66
55
let formattedName = name. trimmingCharacters ( in: CharacterSet . whitespaces)
67
56
let upperCase = Array ( formattedName. uppercased ( ) )
68
57
let original = Array ( formattedName)
69
58
guard original [ 0 ] == upperCase [ 0 ] else { return name }
70
-
59
+
71
60
var prefixEndsAt = 0
72
61
var idx = 0
73
62
while idx <= name. count - 2 {
@@ -83,6 +72,6 @@ public final class DontRepeatTypeInStaticProperties: SyntaxLintRule {
83
72
84
73
extension Diagnostic . Message {
85
74
static func removeTypeFromName( name: String , type: String ) -> Diagnostic . Message {
86
- return . init( . warning, " Remove '\( type) ' from ' \( name) ' " )
75
+ return . init( . warning, " remove '\( type) ' from ' \( name) ' " )
87
76
}
88
77
}
0 commit comments