Skip to content

Commit 5538ecb

Browse files
committed
[Lint] Extend type capitalization rule to cover actors, associated types and typealias
1 parent 9a1f74f commit 5538ecb

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

Sources/SwiftFormat/Pipelines+Generated.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ class LintPipeline: SyntaxVisitor {
3434
super.init(viewMode: .sourceAccurate)
3535
}
3636

37+
override func visit(_ node: ActorDeclSyntax) -> SyntaxVisitorContinueKind {
38+
visitIfEnabled(TypeNamesShouldBeCapitalized.visit, for: node)
39+
return .visitChildren
40+
}
41+
3742
override func visit(_ node: AsExprSyntax) -> SyntaxVisitorContinueKind {
3843
visitIfEnabled(NeverForceUnwrap.visit, for: node)
3944
return .visitChildren
@@ -42,6 +47,7 @@ class LintPipeline: SyntaxVisitor {
4247
override func visit(_ node: AssociatedTypeDeclSyntax) -> SyntaxVisitorContinueKind {
4348
visitIfEnabled(BeginDocumentationCommentWithOneLineSummary.visit, for: node)
4449
visitIfEnabled(NoLeadingUnderscores.visit, for: node)
50+
visitIfEnabled(TypeNamesShouldBeCapitalized.visit, for: node)
4551
return .visitChildren
4652
}
4753

@@ -304,6 +310,7 @@ class LintPipeline: SyntaxVisitor {
304310
visitIfEnabled(AllPublicDeclarationsHaveDocumentation.visit, for: node)
305311
visitIfEnabled(BeginDocumentationCommentWithOneLineSummary.visit, for: node)
306312
visitIfEnabled(NoLeadingUnderscores.visit, for: node)
313+
visitIfEnabled(TypeNamesShouldBeCapitalized.visit, for: node)
307314
visitIfEnabled(UseTripleSlashForDocumentationComments.visit, for: node)
308315
return .visitChildren
309316
}

Sources/SwiftFormatRules/TypeNamesShouldBeCapitalized.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,21 @@ public final class TypeNamesShouldBeCapitalized : SyntaxLintRule {
3737
return .visitChildren
3838
}
3939

40+
public override func visit(_ node: ActorDeclSyntax) -> SyntaxVisitorContinueKind {
41+
diagnoseNameConventionMismatch(node, name: node.name)
42+
return .visitChildren
43+
}
44+
45+
public override func visit(_ node: AssociatedTypeDeclSyntax) -> SyntaxVisitorContinueKind {
46+
diagnoseNameConventionMismatch(node, name: node.name)
47+
return .visitChildren
48+
}
49+
50+
public override func visit(_ node: TypeAliasDeclSyntax) -> SyntaxVisitorContinueKind {
51+
diagnoseNameConventionMismatch(node, name: node.name)
52+
return .visitChildren
53+
}
54+
4055
private func diagnoseNameConventionMismatch<T: DeclSyntaxProtocol>(_ type: T, name: TokenSyntax) {
4156
if let firstChar = name.text.first, !firstChar.isUppercase {
4257
diagnose(.capitalizeTypeName(name: name.text), on: type, severity: .convention)

Tests/SwiftFormatRulesTests/TypeNamesShouldBeCapitalizedTests.swift

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,51 @@ final class TypeNamesShouldBeCapitalizedTests: LintOrFormatRuleTestCase {
2424
XCTAssertNotDiagnosed(.capitalizeTypeName(name: "myType"))
2525
XCTAssertDiagnosed(.capitalizeTypeName(name: "innerType"))
2626
}
27+
28+
func testActors() {
29+
let input =
30+
"""
31+
actor myActor {}
32+
actor OtherActor {}
33+
distributed actor greeter {}
34+
distributed actor DistGreeter {}
35+
"""
36+
37+
performLint(TypeNamesShouldBeCapitalized.self, input: input)
38+
39+
XCTAssertDiagnosed(.capitalizeTypeName(name: "myActor"))
40+
XCTAssertNotDiagnosed(.capitalizeTypeName(name: "OtherActor"))
41+
XCTAssertDiagnosed(.capitalizeTypeName(name: "greeter"))
42+
XCTAssertNotDiagnosed(.capitalizeTypeName(name: "DistGreeter"))
43+
}
44+
45+
func testAssociatedTypeandTypeAlias() {
46+
let input =
47+
"""
48+
protocol P {
49+
associatedtype kind
50+
associatedtype OtherKind
51+
}
52+
53+
typealias x = Int
54+
typealias Y = String
55+
56+
struct MyType {
57+
typealias data<T> = Y
58+
59+
func test() {
60+
typealias Value<T> = Y
61+
}
62+
}
63+
"""
64+
65+
performLint(TypeNamesShouldBeCapitalized.self, input: input)
66+
67+
XCTAssertDiagnosed(.capitalizeTypeName(name: "kind"))
68+
XCTAssertNotDiagnosed(.capitalizeTypeName(name: "OtherKind"))
69+
XCTAssertDiagnosed(.capitalizeTypeName(name: "x"))
70+
XCTAssertNotDiagnosed(.capitalizeTypeName(name: "Y"))
71+
XCTAssertDiagnosed(.capitalizeTypeName(name: "data"))
72+
XCTAssertNotDiagnosed(.capitalizeTypeName(name: "Value"))
73+
}
2774
}

0 commit comments

Comments
 (0)