#include "swift/Syntax/SyntaxFactory.h" #include "swift/Syntax/DeclSyntax.h" #include "llvm/ADT/SmallString.h" #include "gtest/gtest.h" using llvm::None; using llvm::SmallString; using namespace swift; using namespace swift::syntax; TEST(DeclSyntaxTests, TypealiasMakeAPIs) { { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankTypealiasDecl().print(OS); ASSERT_EQ(OS.str().str(), ""); } { SmallString<64> Scratch; llvm::raw_svector_ostream OS(Scratch); auto Typealias = SyntaxFactory::makeTypealiasKeyword({}, { Trivia::spaces(1) }); auto Subsequence = SyntaxFactory::makeIdentifier("MyCollection", {}, {}); auto ElementParam = SyntaxFactory::makeGenericParameter("Element", {}, {}); auto LeftAngle = SyntaxFactory::makeLeftAngleToken({}, {}); auto RightAngle = SyntaxFactory::makeRightAngleToken({}, { Trivia::spaces(1) }); auto GenericParams = GenericParameterClauseBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(RightAngle) .addParameter(None, ElementParam) .build(); auto Assignment = SyntaxFactory::makeEqualToken({}, { Trivia::spaces(1) }); auto ElementArg = SyntaxFactory::makeTypeIdentifier("Element", {}, {}); auto GenericArgs = GenericArgumentClauseBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(SyntaxFactory::makeRightAngleToken({}, {})) .addGenericArgument(None, ElementArg) .build(); auto Array = SyntaxFactory::makeIdentifier("Array", {}, {}); auto Array_Int = SyntaxFactory::makeTypeIdentifier(Array, GenericArgs); SyntaxFactory::makeTypealiasDecl(Typealias, Subsequence, GenericParams, Assignment, Array_Int) .print(OS); ASSERT_EQ(OS.str().str(), "typealias MyCollection = Array"); } } TEST(DeclSyntaxTests, TypealiasWithAPIs) { auto Typealias = SyntaxFactory::makeTypealiasKeyword({}, { Trivia::spaces(1) }); auto MyCollection = SyntaxFactory::makeIdentifier("MyCollection", {}, {}); auto ElementParam = SyntaxFactory::makeGenericParameter("Element", {}, {}); auto LeftAngle = SyntaxFactory::makeLeftAngleToken({}, {}); auto RightAngle = SyntaxFactory::makeRightAngleToken({}, { Trivia::spaces(1) }); auto GenericParams = GenericParameterClauseBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(RightAngle) .addParameter(None, ElementParam) .build(); auto Equal = SyntaxFactory::makeEqualToken({}, { Trivia::spaces(1) }); auto ElementArg = SyntaxFactory::makeTypeIdentifier("Element", {}, {}); auto GenericArgs = GenericArgumentClauseBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(SyntaxFactory::makeRightAngleToken({}, {})) .addGenericArgument(None, ElementArg) .build(); auto Array = SyntaxFactory::makeIdentifier("Array", {}, {}); auto Array_Int = SyntaxFactory::makeTypeIdentifier(Array, GenericArgs); { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankTypealiasDecl() .withTypeAliasKeyword(Typealias) .withIdentifier(MyCollection) .withGenericParameterClause(GenericParams) .withEqualToken(Equal) .withTypeSyntax(Array_Int) .print(OS); ASSERT_EQ(OS.str().str(), "typealias MyCollection = Array"); } } TEST(DeclSyntaxTests, TypealiasBuilderAPIs) { SmallString<64> Scratch; llvm::raw_svector_ostream OS(Scratch); auto Typealias = SyntaxFactory::makeTypealiasKeyword({}, { Trivia::spaces(1) }); auto MyCollection = SyntaxFactory::makeIdentifier("MyCollection", {}, {}); auto ElementParam = SyntaxFactory::makeGenericParameter("Element", {}, {}); auto LeftAngle = SyntaxFactory::makeLeftAngleToken({}, {}); auto RightAngle = SyntaxFactory::makeRightAngleToken({}, { Trivia::spaces(1) }); auto GenericParams = GenericParameterClauseBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(RightAngle) .addParameter(None, ElementParam) .build(); auto Equal = SyntaxFactory::makeEqualToken({}, { Trivia::spaces(1) }); auto ElementArg = SyntaxFactory::makeTypeIdentifier("Element", {}, {}); auto GenericArgs = GenericArgumentClauseBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(SyntaxFactory::makeRightAngleToken({}, {})) .addGenericArgument(None, ElementArg) .build(); auto Array = SyntaxFactory::makeIdentifier("Array", {}, {}); auto Array_Int = SyntaxFactory::makeTypeIdentifier(Array, GenericArgs); TypeAliasDeclSyntaxBuilder() .useTypeAliasKeyword(Typealias) .useIdentifier(MyCollection) .useGenericParameterClause(GenericParams) .useEqualToken(Equal) .useType(Array_Int) .build() .print(OS); ASSERT_EQ(OS.str().str(), "typealias MyCollection = Array"); }