Skip to content

Commit f8ed0c4

Browse files
committed
Documentation - Typos & Consistency Fixes
1 parent 1d36fc2 commit f8ed0c4

File tree

88 files changed

+482
-482
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+482
-482
lines changed

Changelog.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ For increased performance, the modelling of the syntax node hierarchy has been s
138138
```swift
139139
let identifierExprSyntax: IdentifierExprSyntax = /* ... */
140140
let node = Syntax(identifierExprSyntax)
141-
node.asProtocol(SyntaxProtocol.self) // returns a IdentifierExprSyntax with static type SyntaxProtocol
142-
node.asProtocol(ExprSyntaxProtocol.self) // returns a IdentifierExprSyntax with static type ExprSyntaxProtocol?
141+
node.asProtocol(SyntaxProtocol.self) // returns an IdentifierExprSyntax with static type SyntaxProtocol
142+
node.asProtocol(ExprSyntaxProtocol.self) // returns an IdentifierExprSyntax with static type ExprSyntaxProtocol?
143143
```
144144

145145

CodeGeneration/Sources/SyntaxSupport/AvailabilityNodes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public let AVAILABILITY_NODES: [Node] = [
6060
kind: .availabilityLabeledArgument,
6161
base: .syntax,
6262
nameForDiagnostics: "availability argument",
63-
documentation: "A argument to an `@available` attribute that consists of a label and a value, e.g. `message: \"This has been deprecated\"`.",
63+
documentation: "An argument to an `@available` attribute that consists of a label and a value, e.g. `message: \"This has been deprecated\"`.",
6464
children: [
6565
Child(
6666
name: "Label",

CodeGeneration/Sources/SyntaxSupport/CommonNodes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public let COMMON_NODES: [Node] = [
191191
kind: .missingExpr,
192192
base: .expr,
193193
nameForDiagnostics: "expression",
194-
documentation: "In case the source code is missing a expression, this node stands in place of the missing expression.",
194+
documentation: "In case the source code is missing an expression, this node stands in place of the missing expression.",
195195
children: [
196196
Child(
197197
name: "Placeholder",

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,7 +1341,7 @@ public let DECL_NODES: [Node] = [
13411341
name: "Signature",
13421342
kind: .node(kind: .functionSignature),
13431343
nameForDiagnostics: "function signature",
1344-
documentation: "The arguments of the initializer. While the function signature allows specifying an return clause, doing so is not semantically valid."
1344+
documentation: "The arguments of the initializer. While the function signature allows specifying a return clause, doing so is not semantically valid."
13451345
),
13461346
Child(
13471347
name: "GenericWhereClause",
@@ -1353,7 +1353,7 @@ public let DECL_NODES: [Node] = [
13531353
Child(
13541354
name: "Body",
13551355
kind: .node(kind: .codeBlock),
1356-
documentation: "The initializer’s body. Missing if the initialier is a requirement of a protocol declaration.",
1356+
documentation: "The initializer’s body. Missing if the initializer is a requirement of a protocol declaration.",
13571357
isOptional: true
13581358
),
13591359
]

CodeGeneration/Sources/SyntaxSupport/ExprNodes.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ public let EXPR_NODES: [Node] = [
864864
// else-clause ';'?
865865
//
866866
// This node represents both an 'if' expression, as well as an 'if' statement
867-
// when wrapped in a ExpressionStmt node.
867+
// when wrapped in an ExpressionStmt node.
868868
Node(
869869
kind: .ifExpr,
870870
base: .expr,
@@ -1652,7 +1652,7 @@ public let EXPR_NODES: [Node] = [
16521652
// switch-case-list '}' ';'?
16531653
//
16541654
// This node represents both a 'switch' expression, as well as a 'switch'
1655-
// statement when wrapped in a ExpressionStmt node.
1655+
// statement when wrapped in an ExpressionStmt node.
16561656
Node(
16571657
kind: .switchExpr,
16581658
base: .expr,

CodeGeneration/Sources/SyntaxSupport/Node.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import SwiftSyntax
1616
/// The definition of a syntax node that, when generated, conforms to
1717
/// `SyntaxProtocol`.
1818
///
19-
/// There are two fundemantally different kinds of nodes:
19+
/// There are two fundamentally different kinds of nodes:
2020
/// - Layout nodes contain a fixed number of children of possibly different,
2121
/// but fixed types.
2222
/// - Collection nodes contains an arbitrary number of children but all those
@@ -253,14 +253,14 @@ public struct CollectionNode {
253253
self.node = node
254254
}
255255

256-
/// Allow transparent accesss to the properties of the underlying `Node`.
256+
/// Allow transparent access to the properties of the underlying `Node`.
257257
public subscript<T>(dynamicMember keyPath: KeyPath<Node, T>) -> T {
258258
return node[keyPath: keyPath]
259259
}
260260

261261
/// The kinds the elements can have.
262262
///
263-
/// This can be more than one in which case each element an have either of
263+
/// This can be more than one in which case each element can have either of
264264
/// these kinds.
265265
public var elementChoices: [SyntaxNodeKind] {
266266
switch node.data {

CodeGeneration/Sources/SyntaxSupport/SyntaxNodeKind.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ public enum SyntaxNodeKind: String, CaseIterable {
304304
case yieldList
305305
case yieldStmt
306306

307-
// Nodes that have special handling throught the codebase
307+
// Nodes that have special handling throughout the codebase
308308

309309
case syntax
310310
case syntaxCollection

CodeGeneration/Sources/Utils/CodeGenerationFormat.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public class CodeGenerationFormat: BasicFormat {
9292
// MARK: - Private
9393

9494
private func shouldBeSeparatedByTwoNewlines(node: CodeBlockItemSyntax) -> Bool {
95-
// First item in the ``CodeBlockItemListSyntax`` don't need a newline or identation if the parent is a ``SourceFileSyntax``.
95+
// First item in the ``CodeBlockItemListSyntax`` don't need a newline or indentation if the parent is a ``SourceFileSyntax``.
9696
// We want to group imports so newline between them should be omitted
9797
return node.parent?.as(CodeBlockItemListSyntax.self)?.first == node || node.item.is(ImportDeclSyntax.self)
9898
}

CodeGeneration/Sources/Utils/SyntaxBuildableChild.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public extension Child {
111111

112112
let choicesTexts: [String]
113113
if tokenCanContainArbitraryText {
114-
// Don't generate an precondition statement if token can contain arbitrary text.
114+
// Don't generate a precondition statement if token can contain arbitrary text.
115115
return nil
116116
} else if !choices.isEmpty {
117117
choicesTexts = choices.compactMap {

CodeGeneration/Sources/Utils/SyntaxBuildableType.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public struct SyntaxBuildableType: Hashable {
140140
return optionalWrapped(type: SimpleTypeIdentifierSyntax(name: .identifier(syntaxBaseName)))
141141
}
142142

143-
/// The type that is used for paramters in SwiftSyntaxBuilder that take this
143+
/// The type that is used for parameters in SwiftSyntaxBuilder that take this
144144
/// type of syntax node.
145145
public var parameterBaseType: String {
146146
if isBaseType {

CodeGeneration/Sources/generate-swiftsyntax/LayoutNode+Extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ extension LayoutNode {
101101
}
102102

103103
/// Create a builder-based convenience initializer, if needed.
104-
func createConvenienceBuilerInitializer(useDeprecatedChildName: Bool = false) throws -> InitializerDeclSyntax? {
104+
func createConvenienceBuilderInitializer(useDeprecatedChildName: Bool = false) throws -> InitializerDeclSyntax? {
105105
// Only create the convenience initializer if at least one parameter
106106
// is different than in the default initializer generated above.
107107
var shouldCreateInitializer = false

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftparser/ParserEntryFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ let parserEntryFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
112112
"""
113113
mutating func parseNonOptionalCodeBlockItem() -> RawCodeBlockItemSyntax {
114114
guard let node = self.parseCodeBlockItem(isAtTopLevel: false, allowInitDecl: true) else {
115-
// The missing item is not neccessary to be a declaration,
115+
// The missing item is not necessary to be a declaration,
116116
// which is just a placeholder here
117117
return RawCodeBlockItemSyntax(
118118
item: .decl(RawDeclSyntax(RawMissingDeclSyntax(attributes: nil, modifiers: nil, arena: self.arena))),

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/SyntaxAnyVisitorFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ let syntaxAnyVisitorFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
5252

5353
DeclSyntax(
5454
"""
55-
/// The function called after visiting the node and its descendents.
55+
/// The function called after visiting the node and its descendants.
5656
/// - node: the node we just finished visiting.
5757
open func visitAnyPost(_ node: Syntax) {}
5858
"""

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/SyntaxNodesFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extension Child {
2828
}
2929

3030
/// This file generates the syntax nodes for SwiftSyntax. To keep the generated
31-
/// files at a managable file size, it is to be invoked multiple times with the
31+
/// files at a manageable file size, it is to be invoked multiple times with the
3232
/// variable `emitKind` set to a base kind listed in
3333
/// It then only emits those syntax nodes whose base kind are that specified kind.
3434
func syntaxNode(emitKind: SyntaxNodeKind) -> SourceFileSyntax {

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/SyntaxRewriterFile.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
6969

7070
DeclSyntax(
7171
"""
72-
/// The function called before visiting the node and its descendents.
72+
/// The function called before visiting the node and its descendants.
7373
/// - node: the node we are about to visit.
7474
open func visitPre(_ node: Syntax) {}
7575
"""
@@ -92,7 +92,7 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
9292

9393
DeclSyntax(
9494
"""
95-
/// The function called after visiting the node and its descendents.
95+
/// The function called after visiting the node and its descendants.
9696
/// - node: the node we just finished visiting.
9797
open func visitPost(_ node: Syntax) {}
9898
"""
@@ -220,7 +220,7 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
220220
/// To circumvent this problem, make calling the specific visitation function
221221
/// a two-step process: First determine the function to call in this function
222222
/// and return a reference to it, then call it. This way, the stack frame
223-
/// that determines the correct visitiation function will be popped of the
223+
/// that determines the correct visitation function will be popped of the
224224
/// stack before the function is being called, making the switch's stack
225225
/// space transient instead of having it linger in the call stack.
226226
private func visitationFunc(for data: SyntaxData) -> ((SyntaxData) -> Syntax)
@@ -281,7 +281,7 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
281281
// rewritten nodes until the first non-`nil` value is encountered. When this
282282
// happens, retrieve all previous syntax nodes from the parent node to
283283
// initialize the new layout. Once we know that we have to rewrite the
284-
// layout, we need to collect all futher children, regardless of whether
284+
// layout, we need to collect all further children, regardless of whether
285285
// they are rewritten or not.
286286
287287
// newLayout is nil until the first child node is rewritten and rewritten

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/SyntaxVisitorFile.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ import Utils
1818
let syntaxVisitorFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
1919
DeclSyntax(
2020
"""
21-
/// The enum describes how the SyntaxVistor should continue after visiting
21+
/// The enum describes how the ``SyntaxVisitor`` should continue after visiting
2222
/// the current node.
2323
public enum SyntaxVisitorContinueKind {
24-
/// The visitor should visit the descendents of the current node.
24+
/// The visitor should visit the descendants of the current node.
2525
case visitChildren
26-
/// The visitor should avoid visiting the descendents of the current node.
26+
/// The visitor should avoid visiting the descendants of the current node.
2727
case skipChildren
2828
}
2929
"""
@@ -64,7 +64,7 @@ let syntaxVisitorFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
6464

6565
DeclSyntax(
6666
"""
67-
/// The function called after visiting ``\(node.kind.syntaxType)`` and its descendents.
67+
/// The function called after visiting ``\(node.kind.syntaxType)`` and its descendants.
6868
/// - node: the node we just finished visiting.
6969
open func visitPost(_ node: \(node.kind.syntaxType)) {}
7070
"""
@@ -84,7 +84,7 @@ let syntaxVisitorFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
8484

8585
DeclSyntax(
8686
"""
87-
/// The function called after visiting the node and its descendents.
87+
/// The function called after visiting the node and its descendants.
8888
/// - node: the node we just finished visiting.
8989
open func visitPost(_ node: TokenSyntax) {}
9090
"""

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/TriviaPiecesFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ let triviaPiecesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
174174
/// Trivia piece for token RawSyntax.
175175
///
176176
/// In contrast to ``TriviaPiece``, a ``RawTriviaPiece`` does not own the source
177-
/// text of a the trivia.
177+
/// text of the trivia.
178178
@_spi(RawSyntax)
179179
public enum RawTriviaPiece: Equatable
180180
"""

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntaxbuilder/BuildableNodesFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ let buildableNodesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
2121
for node in SYNTAX_NODES.compactMap(\.layoutNode) {
2222
let type = node.type
2323

24-
if let convenienceInit = try! node.createConvenienceBuilerInitializer() {
24+
if let convenienceInit = try! node.createConvenienceBuilderInitializer() {
2525
DeclSyntax(
2626
"""
2727
extension \(raw: type.syntaxBaseName) {

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntaxbuilder/RenamedChildrenBuilderCompatibilityFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ let renamedChildrenBuilderCompatibilityFile = try! SourceFileSyntax(leadingTrivi
1919
DeclSyntax("import SwiftSyntax")
2020

2121
for layoutNode in SYNTAX_NODES.compactMap(\.layoutNode).filter({ $0.children.hasDeprecatedChild }) {
22-
if let convenienceInit = try layoutNode.createConvenienceBuilerInitializer(useDeprecatedChildName: true) {
22+
if let convenienceInit = try layoutNode.createConvenienceBuilderInitializer(useDeprecatedChildName: true) {
2323
let deprecatedNames = layoutNode.children
2424
.filter { !$0.isUnexpectedNodes }
2525
.compactMap { $0.deprecatedName?.withFirstCharacterLowercased }

CodeGeneration/Tests/ValidateSyntaxNodes/ValidateSyntaxNodes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ class ValidateSyntaxNodes: XCTestCase {
158158
/// Checks standardized naming of children with a single token choice
159159
///
160160
/// - If a child has a single keyword as its choice, it should be named `*Keyword` (e.g. `ImportKeyword`)
161-
/// - If it’s another token kind, name it the same as the the token choice (e.g. `LeftParen`)
161+
/// - If it’s another token kind, name it the same as the token choice (e.g. `LeftParen`)
162162
func testSingleTokenChoiceChildNaming() {
163163
var failures: [ValidationFailure] = []
164164
for node in SYNTAX_NODES.compactMap(\.layoutNode) {

Sources/SwiftBasicFormat/BasicFormat.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ open class BasicFormat: SyntaxRewriter {
2424
/// How much indentation should be added at a new indentation level.
2525
public let indentationWidth: Trivia
2626

27-
/// As we reach a new indendation level, its indentation will be added to the
28-
/// stack. As we exit that indentation level, the indendation will be popped.
27+
/// As we reach a new indentation level, its indentation will be added to the
28+
/// stack. As we exit that indentation level, the indentation will be popped.
2929
/// `isUserDefined` is `true` if the indentation was inferred from something
3030
/// the user provided manually instead of being inferred from the nesting
3131
/// level.

Sources/SwiftBasicFormat/Trivia+FormatExtensions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ extension Trivia {
3737

3838
/// Returns `true` if this trivia contains indentation.
3939
func containsIndentation(isOnNewline: Bool) -> Bool {
40-
guard let indentaton = indentation(isOnNewline: isOnNewline) else {
40+
guard let indentation = indentation(isOnNewline: isOnNewline) else {
4141
return false
4242
}
43-
return !indentaton.isEmpty
43+
return !indentation.isEmpty
4444
}
4545

4646
/// Returns the indentation of the last trivia piece in this trivia that is

Sources/SwiftCompilerPlugin/CompilerPlugin.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import SwiftSyntaxMacros
2525
// A plugin receives messages from the "plugin host" (typically
2626
// 'swift-frontend'), and sends back messages in return based on its actions.
2727
//
28-
// Depending on the platform, plugins are invoked in a sanbox that blocks
28+
// Depending on the platform, plugins are invoked in a sandbox that blocks
2929
// network access and prevents any file system changes.
3030
//
3131
// The host process and the plugin communicate using messages in the form of
@@ -36,7 +36,7 @@ import SwiftSyntaxMacros
3636
//
3737
// Within the plugin process, `stdout` is redirected to `stderr` so that print
3838
// statements from the plugin are treated as plain-text output, and `stdin` is
39-
// closed so that any attemps by the plugin logic to read from console result
39+
// closed so that any attempts by the plugin logic to read from console result
4040
// in errors instead of blocking the process. The original `stdin` and `stdout`
4141
// are duplicated for use as messaging pipes, and are not directly used by the
4242
// plugin logic.

Sources/SwiftCompilerPluginMessageHandling/PluginMacroExpansionContext.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class SourceManager {
104104
}
105105

106106
/// Get position (file name + UTF-8 offset) of `node` in the known root nodes.
107-
/// The root node of `node` must be one of the retured value from `add(_:)`.
107+
/// The root node of `node` must be one of the returned value from `add(_:)`.
108108
func position(
109109
of node: Syntax,
110110
at kind: PositionInSyntaxNode
@@ -121,7 +121,7 @@ class SourceManager {
121121
}
122122

123123
/// Get ``SourceRange`` (file name + UTF-8 offset range) of `node` in the known root nodes.
124-
/// The root node of `node` must be one of the retured value from `add(_:)`.
124+
/// The root node of `node` must be one of the returned value from `add(_:)`.
125125
func range(
126126
of node: Syntax,
127127
from startKind: PositionInSyntaxNode = .afterLeadingTrivia,
@@ -144,7 +144,7 @@ class SourceManager {
144144
}
145145

146146
/// Get location of `node` in the known root nodes.
147-
/// The root node of `node` must be one of the retured value from `add(_:)`.
147+
/// The root node of `node` must be one of the returned value from `add(_:)`.
148148
func location(of node: Syntax, at kind: PositionInSyntaxNode, filePathMode: SourceLocationFilePathMode) -> SourceLocation? {
149149
guard let base = self.knownSourceSyntax[node.root.id] else {
150150
return nil

Sources/SwiftOperators/OperatorTable+Folding.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ extension OperatorTable {
462462
/// Syntax rewriter that folds all of the sequence expressions it
463463
/// encounters.
464464
private class SequenceFolder: SyntaxRewriter {
465-
/// The first operator precedecence that caused the error handler to
465+
/// The first operator precedence that caused the error handler to
466466
/// also throw.
467467
var firstFatalError: OperatorError? = nil
468468

Sources/SwiftParser/Availability.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extension Parser {
2323
var elements = [RawAvailabilityArgumentSyntax]()
2424
do {
2525
var keepGoing: RawTokenSyntax? = nil
26-
var availablityArgumentProgress = LoopProgressCondition()
26+
var availabilityArgumentProgress = LoopProgressCondition()
2727
repeat {
2828
let entry: RawAvailabilityArgumentSyntax.Entry
2929
if self.at(.identifier) {
@@ -48,7 +48,7 @@ extension Parser {
4848
arena: self.arena
4949
)
5050
)
51-
} while keepGoing != nil && availablityArgumentProgress.evaluate(currentToken)
51+
} while keepGoing != nil && availabilityArgumentProgress.evaluate(currentToken)
5252
}
5353

5454
return RawAvailabilitySpecListSyntax(elements: elements, arena: self.arena)
@@ -260,7 +260,7 @@ extension Parser {
260260
///
261261
/// version-tuple -> integer-literal version-list?
262262
/// version-list -> version-tuple-element version-list?
263-
/// version-tuple-element -> '.' interger-literal
263+
/// version-tuple-element -> '.' integer-literal
264264
mutating func parseVersionTuple(maxComponentCount: Int) -> RawVersionTupleSyntax {
265265
if self.at(.floatingLiteral),
266266
let periodIndex = self.currentToken.tokenText.firstIndex(of: UInt8(ascii: ".")),

0 commit comments

Comments
 (0)