From 0102d5dd6783d507e7abcb0bbc60686df36e8cdc Mon Sep 17 00:00:00 2001 From: Kim de Vos Date: Wed, 29 Sep 2021 22:00:35 +0200 Subject: [PATCH] Make syntax collections conform to `ExpressibleByArrayLiteral` --- .../SwiftSyntaxBuilder/Buildables.swift.gyb | 7 + .../gyb_generated/Buildables.swift | 246 ++++++++++++++++++ .../ExprListTests.swift | 22 ++ 3 files changed, 275 insertions(+) create mode 100644 Tests/SwiftSyntaxBuilderTest/ExprListTests.swift diff --git a/Sources/SwiftSyntaxBuilder/Buildables.swift.gyb b/Sources/SwiftSyntaxBuilder/Buildables.swift.gyb index 42baef844d3..59b809cf595 100644 --- a/Sources/SwiftSyntaxBuilder/Buildables.swift.gyb +++ b/Sources/SwiftSyntaxBuilder/Buildables.swift.gyb @@ -265,6 +265,13 @@ public struct ${node.syntax_kind}: SyntaxBuildable { } } +extension ${node.syntax_kind}: ExpressibleByArrayLiteral { +% extension_protocol = element_type if element_type is 'TokenSyntax' else 'ExpressibleAs' + element_type + public init(arrayLiteral elements: ${extension_protocol}...) { + self.init(elements) + } +} + % end % if node.is_buildable() or node.is_syntax_collection(): % expressible_as_type = 'ExpressibleAs' + node.syntax_kind diff --git a/Sources/SwiftSyntaxBuilder/gyb_generated/Buildables.swift b/Sources/SwiftSyntaxBuilder/gyb_generated/Buildables.swift index 16dfb47bd24..61ea921c20b 100644 --- a/Sources/SwiftSyntaxBuilder/gyb_generated/Buildables.swift +++ b/Sources/SwiftSyntaxBuilder/gyb_generated/Buildables.swift @@ -435,6 +435,12 @@ public struct CodeBlockItemList: SyntaxBuildable { } } +extension CodeBlockItemList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsCodeBlockItem...) { + self.init(elements) + } +} + public protocol ExpressibleAsCodeBlockItemList: ExpressibleAsCodeBlock { func createCodeBlockItemList() -> CodeBlockItemList } @@ -618,6 +624,12 @@ public struct TupleExprElementList: SyntaxBuildable { } } +extension TupleExprElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsTupleExprElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsTupleExprElementList { func createTupleExprElementList() -> TupleExprElementList } @@ -659,6 +671,12 @@ public struct ArrayElementList: SyntaxBuildable { } } +extension ArrayElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsArrayElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsArrayElementList { func createArrayElementList() -> ArrayElementList } @@ -700,6 +718,12 @@ public struct DictionaryElementList: SyntaxBuildable { } } +extension DictionaryElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsDictionaryElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsDictionaryElementList { func createDictionaryElementList() -> DictionaryElementList } @@ -741,6 +765,12 @@ public struct StringLiteralSegments: SyntaxBuildable { } } +extension StringLiteralSegments: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsSyntaxBuildable...) { + self.init(elements) + } +} + public protocol ExpressibleAsStringLiteralSegments { func createStringLiteralSegments() -> StringLiteralSegments } @@ -929,6 +959,12 @@ public struct DeclNameArgumentList: SyntaxBuildable { } } +extension DeclNameArgumentList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsDeclNameArgument...) { + self.init(elements) + } +} + public protocol ExpressibleAsDeclNameArgumentList { func createDeclNameArgumentList() -> DeclNameArgumentList } @@ -1280,6 +1316,12 @@ public struct ExprList: SyntaxBuildable { } } +extension ExprList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsExprBuildable...) { + self.init(elements) + } +} + public protocol ExpressibleAsExprList: ExpressibleAsConditionElement, ExpressibleAsSyntaxBuildable { func createExprList() -> ExprList } @@ -2530,6 +2572,12 @@ public struct ClosureCaptureItemList: SyntaxBuildable { } } +extension ClosureCaptureItemList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsClosureCaptureItem...) { + self.init(elements) + } +} + public protocol ExpressibleAsClosureCaptureItemList { func createClosureCaptureItemList() -> ClosureCaptureItemList } @@ -2671,6 +2719,12 @@ public struct ClosureParamList: SyntaxBuildable { } } +extension ClosureParamList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsClosureParam...) { + self.init(elements) + } +} + public protocol ExpressibleAsClosureParamList { func createClosureParamList() -> ClosureParamList } @@ -2937,6 +2991,12 @@ public struct MultipleTrailingClosureElementList: SyntaxBuildable { } } +extension MultipleTrailingClosureElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsMultipleTrailingClosureElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsMultipleTrailingClosureElementList { func createMultipleTrailingClosureElementList() -> MultipleTrailingClosureElementList } @@ -3650,6 +3710,12 @@ public struct ObjcName: SyntaxBuildable { } } +extension ObjcName: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsObjcNamePiece...) { + self.init(elements) + } +} + public protocol ExpressibleAsObjcName { func createObjcName() -> ObjcName } @@ -4158,6 +4224,12 @@ public struct FunctionParameterList: SyntaxBuildable { } } +extension FunctionParameterList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsFunctionParameter...) { + self.init(elements) + } +} + public protocol ExpressibleAsFunctionParameterList { func createFunctionParameterList() -> FunctionParameterList } @@ -4409,6 +4481,12 @@ public struct IfConfigClauseList: SyntaxBuildable { } } +extension IfConfigClauseList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsIfConfigClause...) { + self.init(elements) + } +} + public protocol ExpressibleAsIfConfigClauseList { func createIfConfigClauseList() -> IfConfigClauseList } @@ -4856,6 +4934,12 @@ public struct InheritedTypeList: SyntaxBuildable { } } +extension InheritedTypeList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsInheritedType...) { + self.init(elements) + } +} + public protocol ExpressibleAsInheritedTypeList { func createInheritedTypeList() -> InheritedTypeList } @@ -5294,6 +5378,12 @@ public struct MemberDeclList: SyntaxBuildable { } } +extension MemberDeclList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsMemberDeclListItem...) { + self.init(elements) + } +} + public protocol ExpressibleAsMemberDeclList: ExpressibleAsMemberDeclBlock { func createMemberDeclList() -> MemberDeclList } @@ -5558,6 +5648,12 @@ public struct ModifierList: SyntaxBuildable { } } +extension ModifierList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsDeclModifier...) { + self.init(elements) + } +} + public protocol ExpressibleAsModifierList { func createModifierList() -> ModifierList } @@ -5999,6 +6095,12 @@ public struct AccessPath: SyntaxBuildable { } } +extension AccessPath: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsAccessPathComponent...) { + self.init(elements) + } +} + public protocol ExpressibleAsAccessPath { func createAccessPath() -> AccessPath } @@ -6230,6 +6332,12 @@ public struct AccessorList: SyntaxBuildable { } } +extension AccessorList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsAccessorDecl...) { + self.init(elements) + } +} + public protocol ExpressibleAsAccessorList: ExpressibleAsAccessorBlock { func createAccessorList() -> AccessorList } @@ -6386,6 +6494,12 @@ public struct PatternBindingList: SyntaxBuildable { } } +extension PatternBindingList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsPatternBinding...) { + self.init(elements) + } +} + public protocol ExpressibleAsPatternBindingList { func createPatternBindingList() -> PatternBindingList } @@ -6544,6 +6658,12 @@ public struct EnumCaseElementList: SyntaxBuildable { } } +extension EnumCaseElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsEnumCaseElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsEnumCaseElementList { func createEnumCaseElementList() -> EnumCaseElementList } @@ -6786,6 +6906,12 @@ public struct IdentifierList: SyntaxBuildable { } } +extension IdentifierList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: TokenSyntax...) { + self.init(elements) + } +} + public protocol ExpressibleAsIdentifierList { func createIdentifierList() -> IdentifierList } @@ -6952,6 +7078,12 @@ public struct PrecedenceGroupAttributeList: SyntaxBuildable { } } +extension PrecedenceGroupAttributeList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsSyntaxBuildable...) { + self.init(elements) + } +} + public protocol ExpressibleAsPrecedenceGroupAttributeList { func createPrecedenceGroupAttributeList() -> PrecedenceGroupAttributeList } @@ -7050,6 +7182,12 @@ public struct PrecedenceGroupNameList: SyntaxBuildable { } } +extension PrecedenceGroupNameList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsPrecedenceGroupNameElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsPrecedenceGroupNameList { func createPrecedenceGroupNameList() -> PrecedenceGroupNameList } @@ -7252,6 +7390,12 @@ public struct TokenList: SyntaxBuildable { } } +extension TokenList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: TokenSyntax...) { + self.init(elements) + } +} + public protocol ExpressibleAsTokenList { func createTokenList() -> TokenList } @@ -7291,6 +7435,12 @@ public struct NonEmptyTokenList: SyntaxBuildable { } } +extension NonEmptyTokenList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: TokenSyntax...) { + self.init(elements) + } +} + public protocol ExpressibleAsNonEmptyTokenList { func createNonEmptyTokenList() -> NonEmptyTokenList } @@ -7471,6 +7621,12 @@ public struct AttributeList: SyntaxBuildable { } } +extension AttributeList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsSyntaxBuildable...) { + self.init(elements) + } +} + public protocol ExpressibleAsAttributeList { func createAttributeList() -> AttributeList } @@ -7513,6 +7669,12 @@ public struct SpecializeAttributeSpecList: SyntaxBuildable { } } +extension SpecializeAttributeSpecList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsSyntaxBuildable...) { + self.init(elements) + } +} + public protocol ExpressibleAsSpecializeAttributeSpecList { func createSpecializeAttributeSpecList() -> SpecializeAttributeSpecList } @@ -7956,6 +8118,12 @@ public struct ObjCSelector: SyntaxBuildable { } } +extension ObjCSelector: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsObjCSelectorPiece...) { + self.init(elements) + } +} + public protocol ExpressibleAsObjCSelector { func createObjCSelector() -> ObjCSelector } @@ -8174,6 +8342,12 @@ public struct DifferentiabilityParamList: SyntaxBuildable { } } +extension DifferentiabilityParamList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsDifferentiabilityParam...) { + self.init(elements) + } +} + public protocol ExpressibleAsDifferentiabilityParamList { func createDifferentiabilityParamList() -> DifferentiabilityParamList } @@ -8653,6 +8827,12 @@ public struct SwitchCaseList: SyntaxBuildable { } } +extension SwitchCaseList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsSyntaxBuildable...) { + self.init(elements) + } +} + public protocol ExpressibleAsSwitchCaseList { func createSwitchCaseList() -> SwitchCaseList } @@ -9045,6 +9225,12 @@ public struct CatchClauseList: SyntaxBuildable { } } +extension CatchClauseList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsCatchClause...) { + self.init(elements) + } +} + public protocol ExpressibleAsCatchClauseList { func createCatchClauseList() -> CatchClauseList } @@ -9391,6 +9577,12 @@ public struct CaseItemList: SyntaxBuildable { } } +extension CaseItemList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsCaseItem...) { + self.init(elements) + } +} + public protocol ExpressibleAsCaseItemList { func createCaseItemList() -> CaseItemList } @@ -9432,6 +9624,12 @@ public struct CatchItemList: SyntaxBuildable { } } +extension CatchItemList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsCatchItem...) { + self.init(elements) + } +} + public protocol ExpressibleAsCatchItemList { func createCatchItemList() -> CatchItemList } @@ -9752,6 +9950,12 @@ public struct ConditionElementList: SyntaxBuildable { } } +extension ConditionElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsConditionElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsConditionElementList { func createConditionElementList() -> ConditionElementList } @@ -10468,6 +10672,12 @@ public struct GenericRequirementList: SyntaxBuildable { } } +extension GenericRequirementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsGenericRequirement...) { + self.init(elements) + } +} + public protocol ExpressibleAsGenericRequirementList { func createGenericRequirementList() -> GenericRequirementList } @@ -10607,6 +10817,12 @@ public struct GenericParameterList: SyntaxBuildable { } } +extension GenericParameterList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsGenericParameter...) { + self.init(elements) + } +} + public protocol ExpressibleAsGenericParameterList { func createGenericParameterList() -> GenericParameterList } @@ -11319,6 +11535,12 @@ public struct CompositionTypeElementList: SyntaxBuildable { } } +extension CompositionTypeElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsCompositionTypeElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsCompositionTypeElementList { func createCompositionTypeElementList() -> CompositionTypeElementList } @@ -11481,6 +11703,12 @@ public struct TupleTypeElementList: SyntaxBuildable { } } +extension TupleTypeElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsTupleTypeElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsTupleTypeElementList { func createTupleTypeElementList() -> TupleTypeElementList } @@ -11703,6 +11931,12 @@ public struct GenericArgumentList: SyntaxBuildable { } } +extension GenericArgumentList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsGenericArgument...) { + self.init(elements) + } +} + public protocol ExpressibleAsGenericArgumentList { func createGenericArgumentList() -> GenericArgumentList } @@ -12334,6 +12568,12 @@ public struct TuplePatternElementList: SyntaxBuildable { } } +extension TuplePatternElementList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsTuplePatternElement...) { + self.init(elements) + } +} + public protocol ExpressibleAsTuplePatternElementList { func createTuplePatternElementList() -> TuplePatternElementList } @@ -12422,6 +12662,12 @@ public struct AvailabilitySpecList: SyntaxBuildable { } } +extension AvailabilitySpecList: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: ExpressibleAsAvailabilityArgument...) { + self.init(elements) + } +} + public protocol ExpressibleAsAvailabilitySpecList { func createAvailabilitySpecList() -> AvailabilitySpecList } diff --git a/Tests/SwiftSyntaxBuilderTest/ExprListTests.swift b/Tests/SwiftSyntaxBuilderTest/ExprListTests.swift new file mode 100644 index 00000000000..6ea2968f068 --- /dev/null +++ b/Tests/SwiftSyntaxBuilderTest/ExprListTests.swift @@ -0,0 +1,22 @@ +import XCTest +import SwiftSyntax +import SwiftSyntaxBuilder + +final class ExprListTests: XCTestCase { + func testExprList() { + let testCases: [UInt: (ExprList, String)] = [ + #line: (ExprList([IntegerLiteralExpr(1), BinaryOperatorExpr("+"), FloatLiteralExpr(2.34)]), "1 + 2.34"), + #line: ([IntegerLiteralExpr(1), BinaryOperatorExpr("+"), FloatLiteralExpr(2.34)], "1 + 2.34") + ] + + for (line, testCase) in testCases { + let (builder, expected) = testCase + let syntax = builder.buildSyntax(format: Format()) + + var text = "" + syntax.write(to: &text) + + XCTAssertEqual(text, expected, line: line) + } + } +}