@@ -19,6 +19,94 @@ extension SourceLocation: Hashable {
1919 }
2020}
2121
22+ // MARK: -
23+
24+ protocol SymbolDeclProtocol : SyntaxProtocol {
25+ var declaration : Syntax { get }
26+ }
27+
28+ extension AssociatedtypeDeclSyntax : SymbolDeclProtocol { }
29+ extension ClassDeclSyntax : SymbolDeclProtocol { }
30+ extension EnumDeclSyntax : SymbolDeclProtocol { }
31+ extension EnumCaseDeclSyntax : SymbolDeclProtocol { }
32+ extension FunctionDeclSyntax : SymbolDeclProtocol { }
33+ extension InitializerDeclSyntax : SymbolDeclProtocol { }
34+ extension OperatorDeclSyntax : SymbolDeclProtocol { }
35+ extension PrecedenceGroupDeclSyntax : SymbolDeclProtocol { }
36+ extension ProtocolDeclSyntax : SymbolDeclProtocol { }
37+ extension StructDeclSyntax : SymbolDeclProtocol { }
38+ extension SubscriptDeclSyntax : SymbolDeclProtocol { }
39+ extension TypealiasDeclSyntax : SymbolDeclProtocol { }
40+ extension VariableDeclSyntax : SymbolDeclProtocol { }
41+
42+ extension DeclGroupSyntax {
43+ var declaration : Syntax {
44+ Syntax ( self . withoutTrailingTrivia ( )
45+ . withoutLeadingTrivia ( )
46+ . withMembers ( SyntaxFactory . makeBlankMemberDeclBlock ( ) ) )
47+ }
48+ }
49+
50+ extension EnumDeclSyntax {
51+ var declaration : Syntax {
52+ Syntax ( self . withoutTrailingTrivia ( )
53+ . withoutLeadingTrivia ( )
54+ . withMembers ( SyntaxFactory . makeBlankMemberDeclBlock ( ) ) )
55+ }
56+ }
57+
58+ extension FunctionDeclSyntax {
59+ var declaration : Syntax {
60+ Syntax ( self . withoutTrailingTrivia ( )
61+ . withoutLeadingTrivia ( )
62+ . withBody ( SyntaxFactory . makeBlankCodeBlock ( ) ) )
63+ }
64+ }
65+
66+ extension InitializerDeclSyntax {
67+ var declaration : Syntax {
68+ Syntax ( self . withoutTrailingTrivia ( )
69+ . withoutLeadingTrivia ( )
70+ . withBody ( SyntaxFactory . makeBlankCodeBlock ( ) ) )
71+ }
72+ }
73+
74+ extension SubscriptDeclSyntax {
75+ var declaration : Syntax {
76+ Syntax ( self . withoutTrailingTrivia ( )
77+ . withoutLeadingTrivia ( )
78+ . withAccessor ( nil ) )
79+ }
80+ }
81+
82+ extension VariableDeclSyntax {
83+ var declaration : Syntax {
84+ let bindings = self . bindings. map { binding -> PatternBindingSyntax in
85+ if let value = binding. initializer? . value,
86+ value. is ( ClosureExprSyntax . self) || value. is ( FunctionCallExprSyntax . self)
87+ {
88+ return binding. withInitializer ( nil )
89+ . withAccessor ( nil )
90+ } else {
91+ return binding. withAccessor ( nil )
92+ }
93+ }
94+
95+ return Syntax ( self . withoutTrailingTrivia ( )
96+ . withoutLeadingTrivia ( )
97+ . withBindings ( SyntaxFactory . makePatternBindingList ( bindings) ) )
98+ }
99+ }
100+
101+ extension SyntaxProtocol {
102+ var declaration : Syntax {
103+ Syntax ( self . withoutLeadingTrivia ( )
104+ . withoutTrailingTrivia ( ) )
105+ }
106+ }
107+
108+ // MARK: -
109+
22110extension SyntaxProtocol {
23111 var documentation : String ? {
24112 return leadingTrivia? . documentation
@@ -49,13 +137,13 @@ fileprivate extension TriviaPiece {
49137 }
50138}
51139
52- fileprivate extension String {
140+ extension String {
53141 var unindented : String {
54142 let lines = split ( separator: " \n " , omittingEmptySubsequences: false )
55143 guard lines. count > 1 else { return trimmingCharacters ( in: . whitespaces) }
56144
57145 let indentation = lines. compactMap { $0. firstIndex ( where: { !$0. isWhitespace } ) ? . utf16Offset ( in: $0) }
58- . min ( ) ?? 0
146+ . min ( ) ?? 0
59147
60148 return lines. map {
61149 guard $0. count > indentation else { return String ( $0) }
0 commit comments