This mapping has 3 multi-map groups: several pairings are equally correct there. The code view shows one arbitrary valid pairing, not the only one.

Before

…lines 1–65 unchanged (65 lines)
66 }
67 return frames
68 }
69
70 /// Given a set of stack frames, find the deepest one that should be considered
71 /// the signature of the crash.
72 private static func findFrameSignature(
73 _ frames: [Frame], isStackOverflow: Bool
74 ) -> String? {
75 guard let lastFrameIdx = frames.lastIndex(
76 where: { Self.targetImageNames.contains($0.image) })
77 else {
78 return nil
79 }
80 let firstFrameIdx = frames[...lastFrameIdx].reversed().firstIndex(where: {
81 !Self.targetImageNames.contains($0.image)
82 })?.base ?? frames.startIndex
83
84 let unfiltered = Array(frames[firstFrameIdx ... lastFrameIdx])
85 let filtered = unfiltered.filter { frame in
86 // Ignore frames with 0 offset, they're almost certainly bogus.
87 frame.offset != 0 && !Signature.symbol(frame.symbol, assert: nil).shouldIgnore
88 }
89 let symbols = (filtered.isEmpty ? unfiltered : filtered).map(\.symbol)
90
91 // Check for recursion
92 if isStackOverflow,
93 let recurse = symbols.reversed().findRepeatedSlice(minRepeats: 10) {
94 return recurse.min()
95 }
96 return symbols.first
97 }
98
99 private static func findAbort(_ lines: [String]) -> String? {
100 for line in lines {
101 if let match = line.wholeMatch(of: Self.abortRegex) {
102 return String(match.symbol)
…lines 103–117 unchanged (15 lines)
118 self.isStackOverflow = Self.checkStackOverflow(lines)
119 self.frames = Self.getFrames(from: lines)
120
121 let assertion = Self.findAssertion(lines)
122
123 var sig: Signature?
124
125 sig = Self.findFrameSignature(frames, isStackOverflow: isStackOverflow)
126 .map { Signature(symbol: $0, assertion: assertion) }
127
128 if sig == nil {
129 sig = Self.findAbort(lines)
130 .map({ Signature(symbol: $0, assertion: assertion) })
131 }
132 if sig == nil {
133 sig = assertion.map(Signature.assertion)
134 }
135 guard let sig = sig else { return nil }
136 self.signature = sig
…lines 137–328 unchanged (192 lines)

After

…lines 1–65 unchanged (65 lines)
66 }
67 return frames
68 }
69
70 /// Given a set of stack frames, find the deepest one that should be considered
71 /// the signature of the crash.
72 private static func findInterestingSymbols(
73 _ frames: [Frame], isStackOverflow: Bool
74 ) -> [String] {
75 guard let lastFrameIdx = frames.lastIndex(
76 where: { Self.targetImageNames.contains($0.image) })
77 else {
78 return []
79 }
80 let firstFrameIdx = frames[...lastFrameIdx].reversed().firstIndex(where: {
81 !Self.targetImageNames.contains($0.image)
82 })?.base ?? frames.startIndex
83
84 let unfiltered = Array(frames[firstFrameIdx ... lastFrameIdx])
85 let filtered = unfiltered.filter { frame in
86 // Ignore frames with 0 offset, they're almost certainly bogus.
87 frame.offset != 0 && !Signature.symbols([frame.symbol], assert: nil).shouldIgnore
88 }
89 let symbols = (filtered.isEmpty ? unfiltered : filtered).map(\.symbol)
90
91 // Check for recursion
92 if isStackOverflow,
93 let recurse = symbols.reversed().findRepeatedSlice(minRepeats: 10) {
94 guard let min = recurse.min() else { return [] }
95 return [min]
96 }
97 guard let firstSymbol = symbols.first else {
98 return []
99 }
100 // Return the first full symbol, and the next symbol with a different short
101 // signature.
102 if let firstShort = Signature.symbols([firstSymbol], assert: nil).short {
103 let nextSyms = symbols.dropFirst().map {
104 Signature.symbols([$0], assert: nil)
105 }
106 let next = nextSyms.first(where: {
107 guard let nextShort = $0.short else { return false }
108 return nextShort != firstShort
109 })
110 if let next {
111 return [firstSymbol, next.short!.symbol]
112 }
113 }
114 return [firstSymbol]
115 }
116
117 private static func findAbort(_ lines: [String]) -> String? {
118 for line in lines {
119 if let match = line.wholeMatch(of: Self.abortRegex) {
120 return String(match.symbol)
…lines 121–135 unchanged (15 lines)
136 self.isStackOverflow = Self.checkStackOverflow(lines)
137 self.frames = Self.getFrames(from: lines)
138
139 let assertion = Self.findAssertion(lines)
140
141 var sig: Signature?
142
143 let syms = Self.findInterestingSymbols(frames, isStackOverflow: isStackOverflow)
144 if !syms.isEmpty {
145 sig = Signature(symbols: syms, assertion: assertion)
146 }
147 if sig == nil {
148 sig = Self.findAbort(lines)
149 .map({ Signature(symbols: [$0], assertion: assertion) })
150 }
151 if sig == nil {
152 sig = assertion.map(Signature.assertion)
153 }
154 guard let sig = sig else { return nil }
155 self.signature = sig
…lines 156–347 unchanged (192 lines)

Before

source_file
comment "//===--- CrashLog.swift ------------------------------------"...
comment "//"
comment "// This source file is part of the Swift.org open source pro"...
comment "//"
comment "// Copyright (c) 2026 Apple Inc. and the Swift project autho"...
comment "// Licensed under Apache License v2.0 with Runtime Library E"...
comment "//"
comment "// See https://swift.org/LICENSE.txt for license information"
comment "// See https://swift.org/CONTRIBUTORS.txt for the list of Sw"...
comment "//"
comment "//===-------------------------------------------------------"...
import_declaration
import "import"
identifier
simple_identifier "Foundation"
comment "/// A parsed crash log."
class_declaration
modifiers
visibility_modifier
public "public"
struct "struct"
type_identifier "CrashLog"
: ":"
inheritance_specifier
user_type
type_identifier "Sendable"
class_body
{ "{"
property_declaration
modifiers
visibility_modifier
public "public"
value_binding_pattern
var "var"
pattern
simple_identifier "frames"
type_annotation
: ":"
array_type
[ "["
user_type
type_identifier "Frame"
] "]"
property_declaration
modifiers
visibility_modifier
public "public"
value_binding_pattern
var "var"
pattern
simple_identifier "isStackOverflow"
type_annotation
: ":"
user_type
type_identifier "Bool"
property_declaration
modifiers
visibility_modifier
public "public"
value_binding_pattern
var "var"
pattern
simple_identifier "signature"
type_annotation
: ":"
user_type
type_identifier "Signature"
comment "// TODO: Ideally this ought to be a blocklist, not an allowl"...
comment "// here is to exclude frames in system libraries)."
property_declaration (+35 nodes collapsed)
property_declaration
modifiers
property_modifier
static "static"
value_binding_pattern
let "let"
pattern
simple_identifier "sanitizerFrameSymbolRegex"
= "="
regex_literal
# "#"
property_declaration
modifiers
property_modifier
static "static"
value_binding_pattern
let "let"
pattern
simple_identifier "abortRegex"
= "="
regex_literal
# "#"
function_declaration (+58 nodes collapsed)
function_declaration (+321 nodes collapsed)
comment "/// Given a set of stack frames, find the deepest one that s"...
comment "/// the signature of the crash."
function_declaration
modifiers
visibility_modifier
private "private"
property_modifier
static "static"
func "func"
simple_identifier "findFrameSignature"
( "("
parameter
simple_identifier "_"
simple_identifier "frames"
: ":"
array_type
[ "["
user_type
type_identifier "Frame"
] "]"
, ","
parameter
simple_identifier "isStackOverflow"
: ":"
user_type
type_identifier "Bool"
) ")"
-> "->"
optional_type
user_type
type_identifier "String"
?
? "?"
function_body
{ "{"
statements
guard_statement
guard "guard"
value_binding_pattern
let "let"
simple_identifier "lastFrameIdx"
= "="
call_expression (+38 nodes collapsed)
else "else"
{ "{"
statements
control_transfer_statement
return "return"
nil "nil"
} "}"
property_declaration (+77 nodes collapsed)
property_declaration (+24 nodes collapsed)
property_declaration
value_binding_pattern
let "let"
pattern
simple_identifier "filtered"
= "="
call_expression
navigation_expression
simple_identifier "unfiltered"
navigation_suffix
. "."
simple_identifier "filter"
call_suffix
lambda_literal
{ "{"
lambda_function_type
lambda_function_type_parameters
lambda_parameter
simple_identifier "frame"
in "in"
comment "// Ignore frames with 0 offset, they're almost certainly bog"...
statements
infix_expression
navigation_expression
simple_identifier "frame"
navigation_suffix
. "."
simple_identifier "offset"
custom_operator "!="
conjunction_expression
integer_literal "0"
&& "&&"
navigation_expression
call_expression
navigation_expression
prefix_expression
bang "!"
simple_identifier "Signature"
navigation_suffix
. "."
simple_identifier "symbol"
call_suffix
value_arguments
( "("
value_argument
navigation_expression
simple_identifier "frame"
navigation_suffix
. "."
simple_identifier "symbol"
, ","
value_argument
value_argument_label
simple_identifier "assert"
: ":"
nil "nil"
) ")"
navigation_suffix
. "."
simple_identifier "shouldIgnore"
} "}"
property_declaration (+35 nodes collapsed)
comment "// Check for recursion"
if_statement
if "if"
simple_identifier "isStackOverflow"
, ","
value_binding_pattern
let "let"
simple_identifier "recurse"
= "="
call_expression (+24 nodes collapsed)
{ "{"
statements
control_transfer_statement any 1:2
return "return" any 1:2
call_expression
navigation_expression
simple_identifier "recurse"
navigation_suffix
. "."
simple_identifier "min"
call_suffix
value_arguments
( "("
) ")"
} "}"
control_transfer_statement
return "return"
navigation_expression
simple_identifier "symbols"
navigation_suffix
. "."
simple_identifier "first"
} "}"
function_declaration (+83 nodes collapsed)
function_declaration (+67 nodes collapsed)
init_declaration
modifiers
visibility_modifier
public "public"
init "init"
? "?"
( "("
parameter
simple_identifier "from"
simple_identifier "log"
: ":"
user_type
type_identifier "String"
) ")"
function_body
{ "{"
statements
property_declaration (+24 nodes collapsed)
assignment (+21 nodes collapsed)
assignment (+24 nodes collapsed)
property_declaration
value_binding_pattern
let "let"
pattern
simple_identifier "assertion"
= "="
call_expression
navigation_expression
simple_identifier "Self"
navigation_suffix
. "."
simple_identifier "findAssertion"
call_suffix
value_arguments
( "("
value_argument
simple_identifier "lines"
) ")"
property_declaration
value_binding_pattern
var "var"
pattern
simple_identifier "sig"
type_annotation
: ":"
optional_type
user_type
type_identifier "Signature"
?
? "?"
assignment
directly_assignable_expression
simple_identifier "sig"
= "=" any 1:2
call_expression
navigation_expression
call_expression
navigation_expression
simple_identifier "Self"
navigation_suffix
. "."
simple_identifier "findFrameSignature"
call_suffix
value_arguments
( "("
value_argument
simple_identifier "frames"
, ","
value_argument
value_argument_label
simple_identifier "isStackOverflow"
: ":"
simple_identifier "isStackOverflow"
) ")"
navigation_suffix
. "."
simple_identifier "map"
call_suffix
lambda_literal
{ "{"
statements
call_expression
simple_identifier "Signature"
call_suffix
value_arguments
( "("
value_argument
value_argument_label
simple_identifier "symbol"
: ":"
simple_identifier "$0"
, ","
value_argument
value_argument_label
simple_identifier "assertion"
: ":"
simple_identifier "assertion"
) ")"
} "}"
if_statement
if "if"
equality_expression
simple_identifier "sig"
== "=="
nil "nil"
{ "{"
statements
assignment
directly_assignable_expression
simple_identifier "sig"
= "="
call_expression
navigation_expression
call_expression
navigation_expression
simple_identifier "Self"
navigation_suffix
. "."
simple_identifier "findAbort"
call_suffix
value_arguments
( "("
value_argument
simple_identifier "lines"
) ")"
navigation_suffix
. "."
simple_identifier "map"
call_suffix
value_arguments
( "("
value_argument
lambda_literal
{ "{"
statements
call_expression
simple_identifier "Signature"
call_suffix
value_arguments
( "("
value_argument
value_argument_label
simple_identifier "symbol"
: ":"
simple_identifier "$0"
, ","
value_argument
value_argument_label
simple_identifier "assertion"
: ":"
simple_identifier "assertion"
) ")"
} "}"
) ")"
} "}"
if_statement (+29 nodes collapsed)
guard_statement
guard "guard"
value_binding_pattern
let "let"
simple_identifier "sig"
= "="
simple_identifier "sig"
else "else"
{ "{"
statements
control_transfer_statement
return "return"
nil "nil"
} "}"
assignment
directly_assignable_expression
navigation_expression
self_expression
self "self"
navigation_suffix
. "."
simple_identifier "signature"
= "="
simple_identifier "sig"
} "}"
} "}"
class_declaration (+168 nodes collapsed)
class_declaration (+800 nodes collapsed)
class_declaration (+68 nodes collapsed)
class_declaration (+419 nodes collapsed)
class_declaration (+154 nodes collapsed)
class_declaration (+78 nodes collapsed)
class_declaration (+279 nodes collapsed)

After

source_file
comment "//===--- CrashLog.swift ------------------------------------"...
comment "//"
comment "// This source file is part of the Swift.org open source pro"...
comment "//"
comment "// Copyright (c) 2026 Apple Inc. and the Swift project autho"...
comment "// Licensed under Apache License v2.0 with Runtime Library E"...
comment "//"
comment "// See https://swift.org/LICENSE.txt for license information"
comment "// See https://swift.org/CONTRIBUTORS.txt for the list of Sw"...
comment "//"
comment "//===-------------------------------------------------------"...
import_declaration
import "import"
identifier
simple_identifier "Foundation"
comment "/// A parsed crash log."
class_declaration
modifiers
visibility_modifier
public "public"
struct "struct"
type_identifier "CrashLog"
: ":"
inheritance_specifier
user_type
type_identifier "Sendable"
class_body
{ "{"
property_declaration
modifiers
visibility_modifier
public "public"
value_binding_pattern
var "var"
pattern
simple_identifier "frames"
type_annotation
: ":"
array_type
[ "["
user_type
type_identifier "Frame"
] "]"
property_declaration
modifiers
visibility_modifier
public "public"
value_binding_pattern
var "var"
pattern
simple_identifier "isStackOverflow"
type_annotation
: ":"
user_type
type_identifier "Bool"
property_declaration
modifiers
visibility_modifier
public "public"
value_binding_pattern
var "var"
pattern
simple_identifier "signature"
type_annotation
: ":"
user_type
type_identifier "Signature"
comment "// TODO: Ideally this ought to be a blocklist, not an allowl"...
comment "// here is to exclude frames in system libraries)."
property_declaration (+35 nodes collapsed)
property_declaration
modifiers
property_modifier
static "static"
value_binding_pattern
let "let"
pattern
simple_identifier "sanitizerFrameSymbolRegex"
= "="
regex_literal
# "#"
property_declaration
modifiers
property_modifier
static "static"
value_binding_pattern
let "let"
pattern
simple_identifier "abortRegex"
= "="
regex_literal
# "#"
function_declaration (+58 nodes collapsed)
function_declaration (+321 nodes collapsed)
comment "/// Given a set of stack frames, find the deepest one that s"...
comment "/// the signature of the crash."
function_declaration
modifiers
visibility_modifier
private "private"
property_modifier
static "static"
func "func"
simple_identifier "findInterestingSymbols"
( "("
parameter
simple_identifier "_"
simple_identifier "frames"
: ":"
array_type
[ "["
user_type
type_identifier "Frame"
] "]"
, ","
parameter
simple_identifier "isStackOverflow"
: ":"
user_type
type_identifier "Bool"
) ")"
-> "->"
array_type
[ "["
user_type
type_identifier "String"
] "]"
function_body
{ "{"
statements
guard_statement
guard "guard"
value_binding_pattern
let "let"
simple_identifier "lastFrameIdx"
= "="
call_expression (+38 nodes collapsed)
else "else"
{ "{"
statements
control_transfer_statement
return "return"
array_literal
[ "["
] "]"
} "}"
property_declaration (+77 nodes collapsed)
property_declaration (+24 nodes collapsed)
property_declaration
value_binding_pattern
let "let"
pattern
simple_identifier "filtered"
= "="
call_expression
navigation_expression
simple_identifier "unfiltered"
navigation_suffix
. "."
simple_identifier "filter"
call_suffix
lambda_literal
{ "{"
lambda_function_type
lambda_function_type_parameters
lambda_parameter
simple_identifier "frame"
in "in"
comment "// Ignore frames with 0 offset, they're almost certainly bog"...
statements
infix_expression
navigation_expression
simple_identifier "frame"
navigation_suffix
. "."
simple_identifier "offset"
custom_operator "!="
conjunction_expression
integer_literal "0"
&& "&&"
navigation_expression
call_expression
navigation_expression
prefix_expression
bang "!"
simple_identifier "Signature"
navigation_suffix
. "."
simple_identifier "symbols"
call_suffix
value_arguments
( "("
value_argument
array_literal
[ "["
navigation_expression
simple_identifier "frame"
navigation_suffix
. "."
simple_identifier "symbol"
] "]"
, ","
value_argument
value_argument_label
simple_identifier "assert"
: ":"
nil "nil"
) ")"
navigation_suffix
. "."
simple_identifier "shouldIgnore"
} "}"
property_declaration (+35 nodes collapsed)
comment "// Check for recursion"
if_statement
if "if"
simple_identifier "isStackOverflow"
, ","
value_binding_pattern
let "let"
simple_identifier "recurse"
= "="
call_expression (+24 nodes collapsed)
{ "{"
statements
guard_statement
guard "guard"
value_binding_pattern
let "let"
simple_identifier "min"
= "="
call_expression
navigation_expression
simple_identifier "recurse"
navigation_suffix
. "."
simple_identifier "min"
call_suffix
value_arguments
( "("
) ")"
else "else"
{ "{"
statements
control_transfer_statement any 1:2
return "return" any 1:2
array_literal
[ "["
] "]"
} "}"
control_transfer_statement any 1:2
return "return" any 1:2
array_literal
[ "["
simple_identifier "min"
] "]"
} "}"
guard_statement
guard "guard"
value_binding_pattern
let "let"
simple_identifier "firstSymbol"
= "="
navigation_expression
simple_identifier "symbols"
navigation_suffix
. "."
simple_identifier "first"
else "else"
{ "{"
statements
control_transfer_statement
return "return"
array_literal
[ "["
] "]"
} "}"
comment "// Return the first full symbol, and the next symbol with a "...
comment "// signature."
if_statement
if "if"
value_binding_pattern
let "let"
simple_identifier "firstShort"
= "="
navigation_expression
call_expression
navigation_expression
simple_identifier "Signature"
navigation_suffix
. "."
simple_identifier "symbols"
call_suffix
value_arguments
( "("
value_argument
array_literal
[ "["
simple_identifier "firstSymbol"
] "]"
, ","
value_argument
value_argument_label
simple_identifier "assert"
: ":"
nil "nil"
) ")"
navigation_suffix
. "."
simple_identifier "short"
{ "{"
statements
property_declaration
value_binding_pattern
let "let"
pattern
simple_identifier "nextSyms"
= "="
call_expression
navigation_expression
call_expression
navigation_expression
simple_identifier "symbols"
navigation_suffix
. "."
simple_identifier "dropFirst"
call_suffix
value_arguments
( "("
) ")"
navigation_suffix
. "."
simple_identifier "map"
call_suffix
lambda_literal
{ "{"
statements
call_expression
navigation_expression
simple_identifier "Signature"
navigation_suffix
. "."
simple_identifier "symbols"
call_suffix
value_arguments
( "("
value_argument
array_literal
[ "["
simple_identifier "$0"
] "]"
, ","
value_argument
value_argument_label
simple_identifier "assert"
: ":"
nil "nil"
) ")"
} "}"
property_declaration
value_binding_pattern
let "let"
pattern
simple_identifier "next"
= "="
call_expression
navigation_expression
simple_identifier "nextSyms"
navigation_suffix
. "."
simple_identifier "first"
call_suffix
value_arguments
( "("
value_argument
value_argument_label
simple_identifier "where"
: ":"
lambda_literal
{ "{"
statements
guard_statement
guard "guard"
value_binding_pattern
let "let"
simple_identifier "nextShort"
= "="
navigation_expression
simple_identifier "$0"
navigation_suffix
. "."
simple_identifier "short"
else "else"
{ "{"
statements
control_transfer_statement
return "return"
boolean_literal
false "false"
} "}"
control_transfer_statement
return "return"
infix_expression
simple_identifier "nextShort"
custom_operator "!="
simple_identifier "firstShort"
} "}"
) ")"
if_statement
if "if"
value_binding_pattern
let "let"
simple_identifier "next"
{ "{"
statements
control_transfer_statement
return "return"
array_literal
[ "["
simple_identifier "firstSymbol"
, ","
navigation_expression
postfix_expression
navigation_expression
simple_identifier "next"
navigation_suffix
. "."
simple_identifier "short"
bang "!"
navigation_suffix
. "."
simple_identifier "symbol"
] "]"
} "}"
} "}"
control_transfer_statement
return "return"
array_literal
[ "["
simple_identifier "firstSymbol"
] "]"
} "}"
function_declaration (+83 nodes collapsed)
function_declaration (+67 nodes collapsed)
init_declaration
modifiers
visibility_modifier
public "public"
init "init"
? "?"
( "("
parameter
simple_identifier "from"
simple_identifier "log"
: ":"
user_type
type_identifier "String"
) ")"
function_body
{ "{"
statements
property_declaration (+24 nodes collapsed)
assignment (+21 nodes collapsed)
assignment (+24 nodes collapsed)
property_declaration
value_binding_pattern
let "let"
pattern
simple_identifier "assertion"
= "="
call_expression
navigation_expression
simple_identifier "Self"
navigation_suffix
. "."
simple_identifier "findAssertion"
call_suffix
value_arguments
( "("
value_argument
simple_identifier "lines"
) ")"
property_declaration
value_binding_pattern
var "var"
pattern
simple_identifier "sig"
type_annotation
: ":"
optional_type
user_type
type_identifier "Signature"
?
? "?"
property_declaration
value_binding_pattern
let "let"
pattern
simple_identifier "syms"
= "=" any 1:2
call_expression
navigation_expression
simple_identifier "Self"
navigation_suffix
. "."
simple_identifier "findInterestingSymbols"
call_suffix
value_arguments
( "("
value_argument
simple_identifier "frames"
, ","
value_argument
value_argument_label
simple_identifier "isStackOverflow"
: ":"
simple_identifier "isStackOverflow"
) ")"
if_statement
if "if"
navigation_expression
prefix_expression
bang "!"
simple_identifier "syms"
navigation_suffix
. "."
simple_identifier "isEmpty"
{ "{"
statements
assignment
directly_assignable_expression
simple_identifier "sig"
= "=" any 1:2
call_expression
simple_identifier "Signature"
call_suffix
value_arguments
( "("
value_argument
value_argument_label
simple_identifier "symbols"
: ":"
simple_identifier "syms"
, ","
value_argument
value_argument_label
simple_identifier "assertion"
: ":"
simple_identifier "assertion"
) ")"
} "}"
if_statement
if "if"
equality_expression
simple_identifier "sig"
== "=="
nil "nil"
{ "{"
statements
assignment
directly_assignable_expression
simple_identifier "sig"
= "="
call_expression
navigation_expression
call_expression
navigation_expression
simple_identifier "Self"
navigation_suffix
. "."
simple_identifier "findAbort"
call_suffix
value_arguments
( "("
value_argument
simple_identifier "lines"
) ")"
navigation_suffix
. "."
simple_identifier "map"
call_suffix
value_arguments
( "("
value_argument
lambda_literal
{ "{"
statements
call_expression
simple_identifier "Signature"
call_suffix
value_arguments
( "("
value_argument
value_argument_label
simple_identifier "symbols"
: ":"
array_literal
[ "["
simple_identifier "$0"
] "]"
, ","
value_argument
value_argument_label
simple_identifier "assertion"
: ":"
simple_identifier "assertion"
) ")"
} "}"
) ")"
} "}"
if_statement (+29 nodes collapsed)
guard_statement
guard "guard"
value_binding_pattern
let "let"
simple_identifier "sig"
= "="
simple_identifier "sig"
else "else"
{ "{"
statements
control_transfer_statement
return "return"
nil "nil"
} "}"
assignment
directly_assignable_expression
navigation_expression
self_expression
self "self"
navigation_suffix
. "."
simple_identifier "signature"
= "="
simple_identifier "sig"
} "}"
} "}"
class_declaration (+168 nodes collapsed)
class_declaration (+800 nodes collapsed)
class_declaration (+68 nodes collapsed)
class_declaration (+419 nodes collapsed)
class_declaration (+154 nodes collapsed)
class_declaration (+78 nodes collapsed)
class_declaration (+279 nodes collapsed)