Skip to content

Commit 440ec9a

Browse files
authored
Merge pull request #362 from kimdv/kimdv/add-source-file-tests
Add `SourceFile` tests
2 parents 01a4732 + 29193dc commit 440ec9a

10 files changed

+286
-3
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
15+
extension ClassDecl {
16+
/// A convenience initializer that allows passing in members using a result builder instead of having to wrap them in a `MemberDeclBlock`.
17+
public init(
18+
classOrActorKeyword: TokenSyntax,
19+
identifier: String,
20+
genericParameterClause: ExpressibleAsGenericParameterClause? = nil,
21+
inheritanceClause: ExpressibleAsTypeInheritanceClause? = nil,
22+
genericWhereClause: ExpressibleAsGenericWhereClause? = nil,
23+
@AttributeListBuilder attributesBuilder: () -> ExpressibleAsAttributeList? = { nil },
24+
@ModifierListBuilder modifiersBuilder: () -> ExpressibleAsModifierList? = { nil },
25+
@MemberDeclListBuilder membersBuilder: () -> ExpressibleAsMemberDeclList = { MemberDeclList([]) }
26+
) {
27+
self.init(
28+
attributes: attributesBuilder(),
29+
modifiers: modifiersBuilder(),
30+
classOrActorKeyword: classOrActorKeyword,
31+
identifier: TokenSyntax.identifier(identifier),
32+
genericParameterClause: genericParameterClause,
33+
inheritanceClause: inheritanceClause,
34+
genericWhereClause: genericWhereClause,
35+
members: membersBuilder()
36+
)
37+
}
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
15+
extension EnumDecl {
16+
/// A convenience initializer that allows passing in members using a result builder instead of having to wrap them in a `MemberDeclBlock`.
17+
public init(
18+
enumKeyword: TokenSyntax = TokenSyntax.`enum`,
19+
identifier: String,
20+
genericParameters: ExpressibleAsGenericParameterClause? = nil,
21+
inheritanceClause: ExpressibleAsTypeInheritanceClause? = nil,
22+
genericWhereClause: ExpressibleAsGenericWhereClause? = nil,
23+
@AttributeListBuilder attributesBuilder: () -> ExpressibleAsAttributeList? = { nil },
24+
@ModifierListBuilder modifiersBuilder: () -> ExpressibleAsModifierList? = { nil },
25+
@MemberDeclListBuilder membersBuilder: () -> ExpressibleAsMemberDeclList = { MemberDeclList([]) }
26+
) {
27+
self.init(
28+
attributes: attributesBuilder(),
29+
modifiers: modifiersBuilder(),
30+
enumKeyword: enumKeyword,
31+
identifier: TokenSyntax.identifier(identifier),
32+
genericParameters: genericParameters,
33+
inheritanceClause: inheritanceClause,
34+
genericWhereClause: genericWhereClause,
35+
members: membersBuilder()
36+
)
37+
}
38+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
15+
extension ExtensionDecl {
16+
/// A convenience initializer that allows passing in members using a result builder instead of having to wrap them in a `MemberDeclBlock`.
17+
public init(
18+
extensionKeyword: TokenSyntax = TokenSyntax.`extension`,
19+
extendedType: ExpressibleAsTypeBuildable,
20+
inheritanceClause: ExpressibleAsTypeInheritanceClause? = nil,
21+
genericWhereClause: ExpressibleAsGenericWhereClause? = nil,
22+
@AttributeListBuilder attributesBuilder: () -> ExpressibleAsAttributeList? = { nil },
23+
@ModifierListBuilder modifiersBuilder: () -> ExpressibleAsModifierList? = { nil },
24+
@MemberDeclListBuilder membersBuilder: () -> ExpressibleAsMemberDeclList = { MemberDeclList([]) }
25+
) {
26+
self.init(
27+
attributes: attributesBuilder(),
28+
modifiers: modifiersBuilder(),
29+
extensionKeyword: extensionKeyword,
30+
extendedType: extendedType,
31+
inheritanceClause: inheritanceClause,
32+
genericWhereClause: genericWhereClause,
33+
members: membersBuilder()
34+
)
35+
}
36+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
15+
extension FunctionDecl {
16+
/// A convenience initializer that allows passing in members using a result builder instead of having to wrap them in a `MemberDeclBlock`.
17+
public init(
18+
funcKeyword: TokenSyntax = TokenSyntax.`func`,
19+
identifier: TokenSyntax,
20+
genericParameterClause: ExpressibleAsGenericParameterClause? = nil,
21+
signature: ExpressibleAsFunctionSignature,
22+
genericWhereClause: ExpressibleAsGenericWhereClause? = nil,
23+
@AttributeListBuilder attributesBuilder: () -> ExpressibleAsAttributeList? = { nil },
24+
@ModifierListBuilder modifiersBuilder: () -> ExpressibleAsModifierList? = { nil },
25+
@CodeBlockItemListBuilder bodyBuilder: () -> CodeBlockItemList? = { nil }
26+
) {
27+
self.init(
28+
attributes: attributesBuilder(),
29+
modifiers: modifiersBuilder(),
30+
funcKeyword: funcKeyword,
31+
identifier: identifier,
32+
genericParameterClause: genericParameterClause,
33+
signature: signature,
34+
genericWhereClause: genericWhereClause,
35+
body: bodyBuilder()
36+
)
37+
}
38+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
15+
extension ProtocolDecl {
16+
/// A convenience initializer that allows passing in members using a result builder instead of having to wrap them in a `MemberDeclBlock`.
17+
public init(
18+
protocolKeyword: TokenSyntax = TokenSyntax.`protocol`,
19+
identifier: String,
20+
inheritanceClause: ExpressibleAsTypeInheritanceClause? = nil,
21+
genericWhereClause: ExpressibleAsGenericWhereClause? = nil,
22+
@AttributeListBuilder attributesBuilder: () -> ExpressibleAsAttributeList? = { nil },
23+
@ModifierListBuilder modifiersBuilder: () -> ExpressibleAsModifierList? = { nil },
24+
@MemberDeclListBuilder membersBuilder: () -> ExpressibleAsMemberDeclList = { MemberDeclList([]) }
25+
) {
26+
self.init(
27+
attributes: attributesBuilder(),
28+
modifiers: modifiersBuilder(),
29+
protocolKeyword: protocolKeyword,
30+
identifier: TokenSyntax.identifier(identifier),
31+
inheritanceClause: inheritanceClause,
32+
genericWhereClause: genericWhereClause,
33+
members: membersBuilder()
34+
)
35+
}
36+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
extension SourceFile {
14+
/// A convenience initializer that allows passing in statements using a result builder instead of having to wrap them in a `CodeBlockItemList`.
15+
public init(
16+
@CodeBlockItemListBuilder statementsBuilder: () -> ExpressibleAsCodeBlockItemList
17+
) {
18+
self.init(
19+
statements: statementsBuilder(),
20+
eofToken: .eof
21+
)
22+
}
23+
}

Sources/SwiftSyntaxBuilder/StringConvenienceInitializers.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ extension String: ExpressibleAsReturnClause {
4646
}
4747
}
4848

49+
extension String: ExpressibleAsAccessPathComponent {
50+
public func createAccessPathComponent() -> AccessPathComponent {
51+
return AccessPathComponent(name: self)
52+
}
53+
}
54+
4955
/// Default conformance to `ExpressibleByTypeBuildable`
5056
extension String {
5157
public func createTypeBuildable() -> TypeBuildable {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
15+
extension StructDecl {
16+
/// A convenience initializer that allows passing in members using a result builder instead of having to wrap them in a `MemberDeclBlock`.
17+
public init(
18+
structKeyword: TokenSyntax = TokenSyntax.`struct`,
19+
identifier: String,
20+
genericParameterClause: ExpressibleAsGenericParameterClause? = nil,
21+
inheritanceClause: ExpressibleAsTypeInheritanceClause? = nil,
22+
genericWhereClause: ExpressibleAsGenericWhereClause? = nil,
23+
@AttributeListBuilder attributesBuilder: () -> ExpressibleAsAttributeList? = { nil },
24+
@ModifierListBuilder modifiersBuilder: () -> ExpressibleAsModifierList? = { nil },
25+
@MemberDeclListBuilder membersBuilder: () -> ExpressibleAsMemberDeclList = { MemberDeclList([]) }
26+
) {
27+
self.init(
28+
attributes: attributesBuilder(),
29+
modifiers: modifiersBuilder(),
30+
structKeyword: structKeyword,
31+
identifier: TokenSyntax.identifier(identifier),
32+
genericParameterClause: genericParameterClause,
33+
inheritanceClause: inheritanceClause,
34+
genericWhereClause: genericWhereClause,
35+
members: membersBuilder()
36+
)
37+
}
38+
}

Tests/SwiftSyntaxBuilderTest/ProtocolDeclTests.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ final class ProtocolDeclTests: XCTestCase {
1111
})
1212
let functionSignature = FunctionSignature(input: input, output: returnType)
1313

14-
// FIXME: We need to add the `modifiersBuilder` with a non-empty value, otherwise will the builder omit newline.
15-
let functionDecl = FunctionDecl(identifier: .identifier("buildDeclList"), signature: functionSignature, modifiersBuilder: { TokenSyntax.public })
16-
let buildable = ProtocolDecl(modifiers: TokenSyntax.public, identifier: .identifier("DeclListBuildable"), members: functionDecl)
14+
let buildable = ProtocolDecl(identifier: "DeclListBuildable", attributesBuilder: { TokenSyntax.public }, membersBuilder: {
15+
// FIXME: We need to add the `modifiersBuilder` with a non-empty value, otherwise will the builder omit newline.
16+
FunctionDecl(identifier: .identifier("buildDeclList"), signature: functionSignature, body: nil, modifiersBuilder: { TokenSyntax.public })
17+
})
1718

1819
let syntax = buildable.buildSyntax(format: Format())
1920

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import XCTest
2+
import SwiftSyntax
3+
import SwiftSyntaxBuilder
4+
5+
final class SourceFileTests: XCTestCase {
6+
func testSourceFile() {
7+
let source = SourceFile {
8+
ImportDecl(path: "Foundation")
9+
ImportDecl(path: "UIKit")
10+
ClassDecl(classOrActorKeyword: .class, identifier: "SomeViewController", membersBuilder: {
11+
VariableDecl(.let, name: "tableView", type: "UITableView")
12+
})
13+
}
14+
15+
let syntax = source.buildSyntax(format: Format())
16+
17+
var text = ""
18+
syntax.write(to: &text)
19+
20+
XCTAssertEqual(text, """
21+
22+
import Foundation
23+
import UIKit
24+
class SomeViewController{
25+
let tableView: UITableView
26+
}
27+
""")
28+
}
29+
}

0 commit comments

Comments
 (0)