Skip to content

Commit deb086f

Browse files
committed
Allow inline comment commands on most declarations
1 parent 4dcd2e9 commit deb086f

File tree

3 files changed

+148
-17
lines changed

3 files changed

+148
-17
lines changed

Sources/SyntaxAnalysis/DeclarationSyntaxVisitor.swift

Lines changed: 78 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
4343
parse(
4444
modifiers: node.modifiers,
4545
attributes: node.attributes,
46-
trivia: node.leadingTrivia,
46+
trivia: node.commentCommandTrivia,
4747
inheritanceClause: node.inheritanceClause,
4848
genericParameterClause: node.genericParameterClause,
4949
genericWhereClause: node.genericWhereClause,
@@ -56,7 +56,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
5656
parse(
5757
modifiers: node.modifiers,
5858
attributes: node.attributes,
59-
trivia: node.leadingTrivia,
59+
trivia: node.commentCommandTrivia,
6060
inheritanceClause: node.inheritanceClause,
6161
genericParameterClause: node.genericParameterClause,
6262
genericWhereClause: node.genericWhereClause,
@@ -69,7 +69,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
6969
parse(
7070
modifiers: node.modifiers,
7171
attributes: node.attributes,
72-
trivia: node.leadingTrivia,
72+
trivia: node.commentCommandTrivia,
7373
inheritanceClause: node.inheritanceClause,
7474
genericWhereClause: node.genericWhereClause,
7575
at: node.name.positionAfterSkippingLeadingTrivia
@@ -80,7 +80,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
8080
parse(
8181
modifiers: node.modifiers,
8282
attributes: node.attributes,
83-
trivia: node.leadingTrivia,
83+
trivia: node.commentCommandTrivia,
8484
inheritanceClause: node.inheritanceClause,
8585
genericParameterClause: node.genericParameterClause,
8686
genericWhereClause: node.genericWhereClause,
@@ -93,7 +93,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
9393
parse(
9494
modifiers: node.modifiers,
9595
attributes: node.attributes,
96-
trivia: node.leadingTrivia,
96+
trivia: node.commentCommandTrivia,
9797
inheritanceClause: node.inheritanceClause,
9898
genericParameterClause: node.genericParameterClause,
9999
genericWhereClause: node.genericWhereClause,
@@ -128,7 +128,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
128128
parse(
129129
modifiers: node.modifiers,
130130
attributes: node.attributes,
131-
trivia: node.leadingTrivia,
131+
trivia: node.commentCommandTrivia,
132132
inheritanceClause: node.inheritanceClause,
133133
genericWhereClause: node.genericWhereClause,
134134
consumeCapitalSelfFunctionCalls: true,
@@ -140,7 +140,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
140140
parse(
141141
modifiers: node.modifiers,
142142
attributes: node.attributes,
143-
trivia: node.leadingTrivia,
143+
trivia: node.commentCommandTrivia,
144144
parameterClause: node.signature.parameterClause,
145145
returnClause: node.signature.returnClause,
146146
genericParameterClause: node.genericParameterClause,
@@ -153,7 +153,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
153153
parse(
154154
modifiers: node.modifiers,
155155
attributes: node.attributes,
156-
trivia: node.leadingTrivia,
156+
trivia: node.commentCommandTrivia,
157157
parameterClause: node.signature.parameterClause,
158158
genericParameterClause: node.genericParameterClause,
159159
genericWhereClause: node.genericWhereClause,
@@ -165,7 +165,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
165165
parse(
166166
modifiers: node.modifiers,
167167
attributes: node.attributes,
168-
trivia: node.leadingTrivia,
168+
trivia: node.commentCommandTrivia,
169169
at: node.deinitKeyword.positionAfterSkippingLeadingTrivia
170170
)
171171
}
@@ -174,7 +174,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
174174
parse(
175175
modifiers: node.modifiers,
176176
attributes: node.attributes,
177-
trivia: node.leadingTrivia,
177+
trivia: node.commentCommandTrivia,
178178
parameterClause: node.parameterClause,
179179
returnClause: node.returnClause,
180180
genericParameterClause: node.genericParameterClause,
@@ -192,7 +192,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
192192
parse(
193193
modifiers: node.modifiers,
194194
attributes: node.attributes,
195-
trivia: node.leadingTrivia,
195+
trivia: node.commentCommandTrivia,
196196
variableType: binding.typeAnnotation?.type,
197197
closureParameterClause: closureParameters,
198198
returnClause: closureSignature?.returnClause,
@@ -210,7 +210,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
210210
parse(
211211
modifiers: node.modifiers,
212212
attributes: node.attributes,
213-
trivia: node.leadingTrivia,
213+
trivia: node.leadingTrivia.merging(node.trailingTrivia),
214214
at: binding.positionAfterSkippingLeadingTrivia
215215
)
216216
}
@@ -237,7 +237,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
237237
parse(
238238
modifiers: node.modifiers,
239239
attributes: node.attributes,
240-
trivia: node.leadingTrivia,
240+
trivia: node.commentCommandTrivia,
241241
variableType: type?.type,
242242
variableInitFunctionCallExpr: initializer?.expression.as(FunctionCallExprSyntax.self),
243243
at: element.positionAfterSkippingLeadingTrivia
@@ -250,7 +250,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
250250
parse(
251251
modifiers: node.modifiers,
252252
attributes: node.attributes,
253-
trivia: node.leadingTrivia,
253+
trivia: node.leadingTrivia.merging(node.trailingTrivia),
254254
genericParameterClause: node.genericParameterClause,
255255
genericWhereClause: node.genericWhereClause,
256256
typeInitializerClause: node.initializer,
@@ -262,7 +262,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
262262
parse(
263263
modifiers: node.modifiers,
264264
attributes: node.attributes,
265-
trivia: node.leadingTrivia,
265+
trivia: node.leadingTrivia.merging(node.trailingTrivia),
266266
inheritanceClause: node.inheritanceClause,
267267
genericWhereClause: node.genericWhereClause,
268268
typeInitializerClause: node.initializer,
@@ -274,7 +274,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
274274
parse(
275275
modifiers: nil,
276276
attributes: nil,
277-
trivia: node.leadingTrivia,
277+
trivia: node.commentCommandTrivia,
278278
at: node.name.positionAfterSkippingLeadingTrivia
279279
)
280280
}
@@ -283,7 +283,7 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
283283
parse(
284284
modifiers: node.modifiers,
285285
attributes: node.attributes,
286-
trivia: node.leadingTrivia,
286+
trivia: node.commentCommandTrivia,
287287
at: node.name.positionAfterSkippingLeadingTrivia
288288
)
289289
}
@@ -517,3 +517,64 @@ public final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
517517
}
518518
}
519519
}
520+
521+
// MARK: - Inline Comment Commands
522+
523+
private extension SyntaxProtocol {
524+
/// All trivia where inline comment commands can be found.
525+
///
526+
/// Matches uses like these:
527+
///
528+
/// ```
529+
/// // periphery:ignore
530+
/// Foo {
531+
/// }
532+
/// ```
533+
///
534+
/// ```
535+
/// Foo { // periphery:ignore
536+
/// }
537+
/// ```
538+
///
539+
/// ```
540+
/// Foo {} // periphery:ignore
541+
/// ```
542+
var commentCommandTrivia: Trivia {
543+
var commandTrivia = leadingTrivia
544+
545+
if let hasMemberBlock = self as? HasMemberBlock {
546+
commandTrivia = commandTrivia
547+
.merging(hasMemberBlock.memberBlock.leftBrace.trailingTrivia)
548+
.merging(hasMemberBlock.memberBlock.rightBrace.trailingTrivia)
549+
}
550+
551+
if let hasCodeBody = self as? HasCodeBody, let body = hasCodeBody.body {
552+
commandTrivia = commandTrivia
553+
.merging(body.leftBrace.trailingTrivia)
554+
.merging(body.rightBrace.trailingTrivia)
555+
}
556+
557+
return commandTrivia
558+
}
559+
}
560+
561+
/// Identifies types with a MemberBlockSyntax child
562+
private protocol HasMemberBlock {
563+
var memberBlock: MemberBlockSyntax { get }
564+
}
565+
566+
extension ActorDeclSyntax: HasMemberBlock {}
567+
extension ClassDeclSyntax: HasMemberBlock {}
568+
extension ProtocolDeclSyntax: HasMemberBlock {}
569+
extension ExtensionDeclSyntax: HasMemberBlock {}
570+
extension StructDeclSyntax: HasMemberBlock {}
571+
extension EnumDeclSyntax: HasMemberBlock {}
572+
573+
/// Identifies types with a CodeBlockSyntax child
574+
private protocol HasCodeBody {
575+
var body: CodeBlockSyntax? { get }
576+
}
577+
578+
extension FunctionDeclSyntax: HasCodeBody {}
579+
extension InitializerDeclSyntax: HasCodeBody {}
580+
extension DeinitializerDeclSyntax: HasCodeBody {}

Tests/Fixtures/Sources/RetentionFixtures/testIgnoreComments.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,49 @@ public class FixtureClass213: Fixture114 {
6767
public protocol Fixture205Protocol {}
6868
// periphery:ignore
6969
public class Fixture205: Fixture205Protocol {}
70+
71+
// MARK: - Inline comment commands
72+
73+
public class Fixture300Class { // periphery:ignore
74+
}
75+
76+
public class Fixture301Class {} // periphery:ignore
77+
78+
public protocol Fixture302Protocol { // periphery:ignore
79+
}
80+
81+
public protocol Fixture303Protocol {} // periphery:ignore
82+
83+
public struct Fixture304Struct { // periphery:ignore
84+
}
85+
86+
public struct Fixture305Struct {} // periphery:ignore
87+
88+
public protocol Fixture306Protocol {}
89+
public extension Fixture306Protocol { // periphery:ignore
90+
func foo() {}
91+
}
92+
93+
public enum Fixture307Enum { // periphery:ignore
94+
case foo
95+
}
96+
97+
public class Fixture308Class {
98+
var storage: String
99+
100+
public init() {
101+
storage = "noValue"
102+
}
103+
104+
public init(string: String) { // periphery:ignore
105+
storage = string
106+
}
107+
108+
public func someFunc() { // periphery:ignore
109+
storage = "someFunc"
110+
}
111+
}
112+
113+
public class Fixture309Class { // periphery:ignore
114+
public let reference = Fixture308Class()
115+
}

Tests/PeripheryTests/RetentionTest.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,30 @@ final class RetentionTest: FixtureSourceGraphTestCase {
938938
assertReferenced(.protocol("Fixture205Protocol"))
939939
assertNotRedundantProtocol("Fixture205Protocol")
940940
}
941+
942+
// inline comment command tests
943+
analyze(retainPublic: false) {
944+
assertReferenced(.class("Fixture300Class"))
945+
assertReferenced(.class("Fixture301Class"))
946+
947+
assertReferenced(.protocol("Fixture302Protocol"))
948+
assertNotRedundantProtocol("Fixture302Protocol")
949+
assertReferenced(.protocol("Fixture303Protocol"))
950+
assertNotRedundantProtocol("Fixture303Protocol")
951+
952+
assertReferenced(.struct("Fixture304Struct"))
953+
assertReferenced(.struct("Fixture305Struct"))
954+
955+
assertReferenced(.extensionProtocol("Fixture306Protocol"))
956+
assertNotRedundantProtocol("Fixture306Protocol")
957+
958+
assertReferenced(.enum("Fixture307Enum"))
959+
960+
assertReferenced(.class("Fixture308Class")) {
961+
self.assertReferenced(.functionMethodInstance("someFunc()"))
962+
self.assertReferenced(.functionConstructor("init(string:)"))
963+
}
964+
}
941965
}
942966

943967
func testIgnoreAllComment() {

0 commit comments

Comments
 (0)