#include "swift/Syntax/SyntaxFactory.h" #include "swift/Syntax/SyntaxNodes.h" #include "swift/Syntax/SyntaxBuilders.h" #include "llvm/ADT/SmallString.h" #include "gtest/gtest.h" using llvm::None; using llvm::SmallString; using namespace swift; using namespace swift::syntax; #pragma mark - declaration-modifier DeclModifierSyntax getCannedDeclModifier() { auto Private = SyntaxFactory::makeIdentifier("private", "", ""); auto LParen = SyntaxFactory::makeLeftParenToken("", ""); auto Set = SyntaxFactory::makeIdentifier("set", "", ""); auto RParen = SyntaxFactory::makeRightParenToken("", ""); return SyntaxFactory::makeDeclModifier(Private, LParen, Set, RParen); } TEST(DeclSyntaxTests, DeclModifierMakeAPIs) { { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankDeclModifier().print(OS); ASSERT_EQ(OS.str().str(), ""); } { SmallString<24> Scratch; llvm::raw_svector_ostream OS(Scratch); getCannedDeclModifier().print(OS); ASSERT_EQ(OS.str().str(), "private(set)"); } } TEST(DeclSyntaxTests, DeclModifierGetAPIs) { auto Private = SyntaxFactory::makeIdentifier("private", "", ""); auto LParen = SyntaxFactory::makeLeftParenToken("", ""); auto Set = SyntaxFactory::makeIdentifier("set", "", ""); auto RParen = SyntaxFactory::makeRightParenToken("", ""); auto Mod = SyntaxFactory::makeDeclModifier(Private, LParen, Set, RParen); ASSERT_EQ(Private.getRaw(), Mod.getName().getRaw()); ASSERT_EQ(LParen.getRaw(), Mod.getDetailLeftParen()->getRaw()); ASSERT_EQ(Set.getRaw(), Mod.getDetail()->getRaw()); ASSERT_EQ(RParen.getRaw(), Mod.getDetailRightParen()->getRaw()); } TEST(DeclSyntaxTests, DeclModifierWithAPIs) { auto Private = SyntaxFactory::makeIdentifier("private", "", ""); auto LParen = SyntaxFactory::makeLeftParenToken("", ""); auto Set = SyntaxFactory::makeIdentifier("set", "", ""); auto RParen = SyntaxFactory::makeRightParenToken("", ""); SmallString<24> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankDeclModifier() .withName(Private) .withDetailLeftParen(LParen) .withDetail(Set) .withDetailRightParen(RParen) .print(OS); ASSERT_EQ(OS.str().str(), "private(set)"); } #pragma mark - typealias-decl 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("", " "); auto Subsequence = SyntaxFactory::makeIdentifier("MyCollection", "", ""); auto ElementName = SyntaxFactory::makeIdentifier("Element", "", ""); auto ElementParam = SyntaxFactory::makeGenericParameter(None, ElementName, None, None, None); auto LeftAngle = SyntaxFactory::makeLeftAngleToken("", ""); auto RightAngle = SyntaxFactory::makeRightAngleToken("", " "); auto GenericParams = GenericParameterClauseSyntaxBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(RightAngle) .addGenericParameter(ElementParam) .build(); auto Assignment = SyntaxFactory::makeEqualToken("", " "); auto ElementType = SyntaxFactory::makeTypeIdentifier("Element", "", ""); auto ElementArg = SyntaxFactory::makeGenericArgument(ElementType, None); auto GenericArgs = GenericArgumentClauseSyntaxBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(SyntaxFactory::makeRightAngleToken("", "")) .addArgument(ElementArg) .build(); auto Array = SyntaxFactory::makeIdentifier("Array", "", ""); auto Array_Int = SyntaxFactory::makeSimpleTypeIdentifier(Array, GenericArgs); auto TypeInit = SyntaxFactory::makeTypeInitializerClause(Assignment, Array_Int); SyntaxFactory::makeTypealiasDecl(None, None, Typealias, Subsequence, GenericParams, TypeInit, None) .print(OS); ASSERT_EQ(OS.str().str(), "typealias MyCollection = Array"); } } TEST(DeclSyntaxTests, TypealiasWithAPIs) { auto Typealias = SyntaxFactory::makeTypealiasKeyword("", " "); auto MyCollection = SyntaxFactory::makeIdentifier("MyCollection", "", ""); auto ElementName = SyntaxFactory::makeIdentifier("Element", "", ""); auto ElementParam = SyntaxFactory::makeGenericParameter(None, ElementName, None, None, None); auto LeftAngle = SyntaxFactory::makeLeftAngleToken("", ""); auto RightAngle = SyntaxFactory::makeRightAngleToken("", " "); auto GenericParams = GenericParameterClauseSyntaxBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(RightAngle) .addGenericParameter(ElementParam) .build(); auto Equal = SyntaxFactory::makeEqualToken("", " "); auto ElementType = SyntaxFactory::makeTypeIdentifier("Element", "", ""); auto ElementArg = SyntaxFactory::makeGenericArgument(ElementType, None); auto GenericArgs = GenericArgumentClauseSyntaxBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(SyntaxFactory::makeRightAngleToken("", "")) .addArgument(ElementArg) .build(); auto Array = SyntaxFactory::makeIdentifier("Array", "", ""); auto Array_Int = SyntaxFactory::makeSimpleTypeIdentifier(Array, GenericArgs); auto Type_Init = SyntaxFactory::makeTypeInitializerClause(Equal, Array_Int); { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankTypealiasDecl() .withTypealiasKeyword(Typealias) .withIdentifier(MyCollection) .withGenericParameterClause(GenericParams) .withInitializer(Type_Init) .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("", " "); auto MyCollection = SyntaxFactory::makeIdentifier("MyCollection", "", ""); auto ElementName = SyntaxFactory::makeIdentifier("Element", "", ""); auto ElementParam = SyntaxFactory::makeGenericParameter(ElementName, None); auto LeftAngle = SyntaxFactory::makeLeftAngleToken("", ""); auto RightAngle = SyntaxFactory::makeRightAngleToken("", " "); auto GenericParams = GenericParameterClauseSyntaxBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(RightAngle) .addGenericParameter(ElementParam) .build(); auto Equal = SyntaxFactory::makeEqualToken("", " "); auto ElementType = SyntaxFactory::makeTypeIdentifier("Element", "", ""); auto ElementArg = SyntaxFactory::makeGenericArgument(ElementType, None); auto GenericArgs = GenericArgumentClauseSyntaxBuilder() .useLeftAngleBracket(LeftAngle) .useRightAngleBracket(SyntaxFactory::makeRightAngleToken("", "")) .addArgument(ElementArg) .build(); auto Array = SyntaxFactory::makeIdentifier("Array", "", ""); auto Array_Int = SyntaxFactory::makeSimpleTypeIdentifier(Array, GenericArgs); auto Type_Init = SyntaxFactory::makeTypeInitializerClause(Equal, Array_Int); TypealiasDeclSyntaxBuilder() .useTypealiasKeyword(Typealias) .useIdentifier(MyCollection) .useGenericParameterClause(GenericParams) .useInitializer(Type_Init) .build() .print(OS); ASSERT_EQ(OS.str().str(), "typealias MyCollection = Array"); } #pragma mark - parameter FunctionParameterSyntax getCannedFunctionParameter() { auto ExternalName = SyntaxFactory::makeIdentifier("with", "", " "); auto LocalName = SyntaxFactory::makeIdentifier("radius", "", ""); auto Colon = SyntaxFactory::makeColonToken("", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", " "); auto NoEllipsis = TokenSyntax::missingToken(tok::identifier, "..."); auto Equal = SyntaxFactory::makeEqualToken("", " "); auto Sign = SyntaxFactory::makePrefixOperator("-", "", ""); auto OneDigits = SyntaxFactory::makeIntegerLiteral("1", "", ""); auto One = SyntaxFactory::makePrefixOperatorExpr(Sign, SyntaxFactory::makeIntegerLiteralExpr(OneDigits)); auto DefaultArg = SyntaxFactory::makeInitializerClause(Equal, One); auto Comma = SyntaxFactory::makeCommaToken("", " "); return SyntaxFactory::makeFunctionParameter(None, ExternalName, LocalName, Colon, Int, NoEllipsis, DefaultArg, Comma); } TEST(DeclSyntaxTests, FunctionParameterMakeAPIs) { { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); getCannedFunctionParameter().print(OS); ASSERT_EQ(OS.str().str(), "with radius: Int = -1, "); } { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankFunctionParameter().print(OS); ASSERT_EQ(OS.str().str(), ""); } } TEST(DeclSyntaxTests, FunctionParameterGetAPIs) { auto ExternalName = SyntaxFactory::makeIdentifier("with", "", " "); auto LocalName = SyntaxFactory::makeIdentifier("radius", "", ""); auto Colon = SyntaxFactory::makeColonToken("", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", " "); auto NoEllipsis = TokenSyntax::missingToken(tok::identifier, "..."); auto Equal = SyntaxFactory::makeEqualToken("", " "); auto Sign = SyntaxFactory::makePrefixOperator("-", "", ""); auto OneDigits = SyntaxFactory::makeIntegerLiteral("1", "", ""); auto One = SyntaxFactory::makePrefixOperatorExpr(Sign, SyntaxFactory::makeIntegerLiteralExpr(OneDigits)); auto DefaultArg = SyntaxFactory::makeInitializerClause(Equal, One); auto Comma = SyntaxFactory::makeCommaToken("", ""); auto Param = SyntaxFactory::makeFunctionParameter(None, ExternalName, LocalName, Colon, Int, NoEllipsis, DefaultArg, Comma); ASSERT_EQ(ExternalName.getRaw(), Param.getFirstName()->getRaw()); ASSERT_EQ(LocalName.getRaw(), Param.getSecondName()->getRaw()); ASSERT_EQ(Colon.getRaw(), Param.getColon()->getRaw()); auto GottenType = Param.getType(); auto GottenType2 = Param.getType(); ASSERT_TRUE(GottenType->hasSameIdentityAs(*GottenType2)); ASSERT_EQ(DefaultArg.getRaw(), Param.getDefaultArgument()->getRaw()); auto GottenDefaultValue = Param.getDefaultArgument()->getValue(); auto GottenDefaultValue2 = Param.getDefaultArgument()->getValue(); ASSERT_TRUE(GottenDefaultValue.hasSameIdentityAs(GottenDefaultValue2)); ASSERT_EQ(Comma.getRaw(), Param.getTrailingComma()->getRaw()); // Test that llvm::None is returned for non-token missing children: auto Decimated = Param .withType(llvm::None) .withDefaultArgument(llvm::None); ASSERT_FALSE(Decimated.getType().hasValue()); ASSERT_FALSE(Decimated.getDefaultArgument().hasValue()); } TEST(DeclSyntaxTests, FunctionParameterWithAPIs) { auto ExternalName = SyntaxFactory::makeIdentifier("for", "", " "); auto LocalName = SyntaxFactory::makeIdentifier("integer", "", ""); auto Colon = SyntaxFactory::makeColonToken(" ", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", " "); auto Equal = SyntaxFactory::makeEqualToken("", " "); auto NoSign = TokenSyntax::missingToken(tok::oper_prefix, ""); auto OneDigits = SyntaxFactory::makeIntegerLiteral("1", "", ""); auto One = SyntaxFactory::makeIntegerLiteralExpr(OneDigits); auto DefaultArg = SyntaxFactory::makeInitializerClause(Equal, One); auto Comma = SyntaxFactory::makeCommaToken("", ""); { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); getCannedFunctionParameter() .withFirstName(ExternalName) .withSecondName(LocalName) .withColon(Colon) .withType(Int) .withDefaultArgument(DefaultArg) .withTrailingComma(Comma) .print(OS); ASSERT_EQ(OS.str().str(), "for integer : Int = 1,"); } { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); getCannedFunctionParameter() .withType(llvm::None) .withDefaultArgument(llvm::None) .print(OS); ASSERT_EQ(OS.str().str(), "with radius: , "); } } TEST(DeclSyntaxTests, FunctionParameterWithEllipsis) { auto ExternalName = SyntaxFactory::makeIdentifier("for", "", " "); auto LocalName = SyntaxFactory::makeIdentifier("integer", "", ""); auto Colon = SyntaxFactory::makeColonToken(" ", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", ""); auto Ellipsis = SyntaxFactory::makeEllipsisToken("", " "); auto Comma = SyntaxFactory::makeCommaToken("", ""); { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); getCannedFunctionParameter() .withFirstName(ExternalName) .withSecondName(LocalName) .withColon(Colon) .withType(Int) .withEllipsis(Ellipsis) .withDefaultArgument(llvm::None) .withTrailingComma(Comma) .print(OS); ASSERT_EQ(OS.str().str(), "for integer : Int... ,"); } } #pragma mark - parameter-list TEST(DeclSyntaxTests, FunctionParameterListMakeAPIs) { { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankFunctionParameterList().print(OS); ASSERT_EQ(OS.str().str(), ""); } { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto Param = getCannedFunctionParameter(); std::vector Params { Param, Param, Param }; SyntaxFactory::makeFunctionParameterList(Params).print(OS); ASSERT_EQ(OS.str().str(), "with radius: Int = -1, with radius: Int = -1, with radius: Int = -1, "); } } #pragma mark - function-signature FunctionSignatureSyntax getCannedFunctionSignature() { auto LParen = SyntaxFactory::makeLeftParenToken("", ""); auto Param = getCannedFunctionParameter(); auto List = SyntaxFactory::makeBlankFunctionParameterList() .appending(Param) .appending(Param) .appending(Param) .castTo(); auto RParen = SyntaxFactory::makeRightParenToken("", " "); auto Parameter = SyntaxFactory::makeParameterClause(LParen, List, RParen); auto Throws = SyntaxFactory::makeThrowsKeyword("", " "); auto Arrow = SyntaxFactory::makeArrowToken("", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", " "); auto Return = SyntaxFactory::makeReturnClause(Arrow, Int); return SyntaxFactory::makeFunctionSignature(Parameter, None, Throws, Return); } TEST(DeclSyntaxTests, FunctionSignatureMakeAPIs) { { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankFunctionSignature().print(OS); ASSERT_EQ(OS.str().str(), ""); } { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); getCannedFunctionSignature().print(OS); ASSERT_EQ(OS.str().str(), "(with radius: Int = -1, " "with radius: Int = -1, " "with radius: Int = -1, ) throws -> Int "); } } TEST(DeclSyntaxTests, FunctionSignatureGetAPIs) { auto LParen = SyntaxFactory::makeLeftParenToken("", ""); auto Param = getCannedFunctionParameter(); auto List = SyntaxFactory::makeBlankFunctionParameterList() .appending(Param) .appending(Param) .appending(Param) .castTo(); auto RParen = SyntaxFactory::makeRightParenToken("", " "); auto Throws = SyntaxFactory::makeThrowsKeyword("", " "); auto Arrow = SyntaxFactory::makeArrowToken("", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", ""); auto Sig = SyntaxFactory::makeFunctionSignature( SyntaxFactory::makeParameterClause(LParen, List, RParen), None, Throws, SyntaxFactory::makeReturnClause(Arrow, Int)); ASSERT_EQ(LParen.getRaw(), Sig.getInput().getLeftParen().getRaw()); { SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto GottenList1 = Sig.getInput().getParameterList(); auto GottenList2 = Sig.getInput().getParameterList(); ASSERT_TRUE(GottenList1.hasSameIdentityAs(GottenList2)); GottenList1.print(OS); ASSERT_EQ(OS.str().str(), "with radius: Int = -1, " "with radius: Int = -1, " "with radius: Int = -1, "); } ASSERT_EQ(RParen.getRaw(), Sig.getInput().getRightParen().getRaw()); ASSERT_EQ(Throws.getRaw(), Sig.getThrowsOrRethrowsKeyword()->getRaw()); ASSERT_EQ(Sig.getThrowsOrRethrowsKeyword()->getTokenKind(), tok::kw_throws); ASSERT_EQ(Arrow.getRaw(), Sig.getOutput()->getArrow().getRaw()); { SmallString<3> Scratch; llvm::raw_svector_ostream OS(Scratch); auto GottenReturnType1 = Sig.getOutput()->getReturnType(); auto GottenReturnType2 = Sig.getOutput()->getReturnType(); ASSERT_TRUE(GottenReturnType1.hasSameIdentityAs(GottenReturnType2)); GottenReturnType1.print(OS); ASSERT_EQ(OS.str().str(), "Int"); } } TEST(DeclSyntaxTests, FunctionSignatureWithAPIs) { auto LParen = SyntaxFactory::makeLeftParenToken("", ""); auto Param = getCannedFunctionParameter(); auto List = SyntaxFactory::makeBlankFunctionParameterList() .appending(Param) .appending(Param) .appending(Param) .castTo(); auto RParen = SyntaxFactory::makeRightParenToken("", " "); auto Throws = SyntaxFactory::makeThrowsKeyword("", " "); auto Arrow = SyntaxFactory::makeArrowToken("", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", ""); auto Parameter = SyntaxFactory::makeParameterClause(LParen, List, RParen); auto Return = SyntaxFactory::makeReturnClause(Arrow, Int); SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankFunctionSignature() .withInput(Parameter) .withThrowsOrRethrowsKeyword(Throws) .withOutput(Return) .print(OS); ASSERT_EQ(OS.str().str(), "(with radius: Int = -1, " "with radius: Int = -1, " "with radius: Int = -1, ) throws -> Int"); } #pragma mark - function-declaration ModifierListSyntax getCannedModifiers() { auto PublicID = SyntaxFactory::makePublicKeyword("", " "); auto NoLParen = TokenSyntax::missingToken(tok::l_paren, "("); auto NoArgument = TokenSyntax::missingToken(tok::identifier, ""); auto NoRParen = TokenSyntax::missingToken(tok::r_paren, ")"); auto Public = SyntaxFactory::makeDeclModifier(PublicID, NoLParen, NoArgument, NoRParen); auto StaticKW = SyntaxFactory::makeStaticKeyword("", " "); auto Static = SyntaxFactory::makeDeclModifier(StaticKW, NoLParen, NoArgument, NoRParen); return SyntaxFactory::makeBlankModifierList() .appending(Public) .appending(Static); } GenericParameterClauseSyntax getCannedGenericParams() { GenericParameterClauseSyntaxBuilder GB; auto LAngle = SyntaxFactory::makeLeftAngleToken("", ""); auto RAngle = SyntaxFactory::makeRightAngleToken("", ""); auto TType = SyntaxFactory::makeIdentifier("T", "", ""); auto UType = SyntaxFactory::makeIdentifier("U", "", ""); auto Comma = SyntaxFactory::makeCommaToken("", " "); auto T = SyntaxFactory::makeGenericParameter(TType, Comma); auto U = SyntaxFactory::makeGenericParameter(UType, None); GB.addGenericParameter(T); GB.addGenericParameter(U); GB.useLeftAngleBracket(LAngle); GB.useRightAngleBracket(RAngle); return GB.build(); } CodeBlockSyntax getCannedBody() { auto NoSign = TokenSyntax::missingToken(tok::oper_prefix, "-"); auto OneDigits = SyntaxFactory::makeIntegerLiteral("1", "", ""); auto One = SyntaxFactory::makeIntegerLiteralExpr(OneDigits); auto ReturnKW = SyntaxFactory::makeReturnKeyword("\n ", ""); auto Return = SyntaxFactory::makeReturnStmt(ReturnKW, One); auto ReturnItem = SyntaxFactory::makeCodeBlockItem(Return, None, None); auto Stmts = SyntaxFactory::makeCodeBlockItemList({ReturnItem}); auto LBrace = SyntaxFactory::makeLeftBraceToken("", ""); auto RBrace = SyntaxFactory::makeRightBraceToken("\n", ""); return SyntaxFactory::makeCodeBlock(LBrace, Stmts, RBrace); } GenericWhereClauseSyntax getCannedWhereClause() { auto WhereKW = SyntaxFactory::makeWhereKeyword("", " "); auto T = SyntaxFactory::makeTypeIdentifier("T", "", " "); auto EqualEqual = SyntaxFactory::makeEqualityOperator("", " "); auto Int = SyntaxFactory::makeTypeIdentifier("Int", "", " "); auto SameType = SyntaxFactory::makeSameTypeRequirement(T, EqualEqual, Int); auto Req = SyntaxFactory::makeGenericRequirement(SameType, None); auto Requirements = SyntaxFactory::makeBlankGenericRequirementList() .appending(Req); return SyntaxFactory::makeBlankGenericWhereClause() .withWhereKeyword(WhereKW) .withRequirementList(Requirements); } FunctionDeclSyntax getCannedFunctionDecl() { auto NoAttributes = SyntaxFactory::makeBlankAttributeList(); auto Foo = SyntaxFactory::makeIdentifier("foo", "", ""); auto FuncKW = SyntaxFactory::makeFuncKeyword("", " "); auto Modifiers = getCannedModifiers(); auto GenericParams = getCannedGenericParams(); auto GenericWhere = getCannedWhereClause(); auto Signature = getCannedFunctionSignature(); auto Body = getCannedBody(); return SyntaxFactory::makeFunctionDecl(NoAttributes, Modifiers, FuncKW, Foo, GenericParams, Signature, GenericWhere, Body); } TEST(DeclSyntaxTests, FunctionDeclMakeAPIs) { { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankFunctionDecl().print(OS); ASSERT_EQ(OS.str().str(), ""); } { SmallString<64> Scratch; llvm::raw_svector_ostream OS(Scratch); getCannedFunctionDecl().print(OS); ASSERT_EQ(OS.str().str(), "public static func foo" "(with radius: Int = -1, " "with radius: Int = -1, " "with radius: Int = -1, ) " "throws -> Int " "where T == Int {\n" " return1\n" "}"); } } TEST(DeclSyntaxTests, FunctionDeclGetAPIs) { { SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankFunctionDecl().print(OS); ASSERT_EQ(OS.str().str(), ""); } { } } TEST(DeclSyntaxTests, FunctionDeclWithAPIs) { } TEST(DeclSyntaxTests, FunctionDeclBuilderAPIs) { }