Files
swift-mirror/unittests/Syntax/DeclSyntaxTests.cpp
David Farler c343298b8f [Syntax] Implement return-statement and integer-literal-expr
A return statement needs something to return, so implement
integer-literal-expression too. This necessarily also forced
UnknownExprSyntax, UnknownStmtSyntax, and UnknownDeclSyntax,
which are stand-in token buckets for when we don't know
how to transform/migrate an AST.

This commit also contains the core function for caching
SyntaxData children. This is highly tricky code, with some
detailed comments in SyntaxData.{h,cpp}. The gist is that
we have to atomically swap in a SyntaxData pointer into the
child field, so we can maintain pointer identity of SyntaxData
nodes, while still being able to cache them internally.

To prove that this works, there is a multithreaded test that
checks that two threads can ask for a child that hasn't been
cached yet without crashing or violating pointer identity.

https://bugs.swift.org/browse/SR-4010
2017-02-22 18:45:29 -08:00

140 lines
4.9 KiB
C++

#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<Element> = Array<Element>");
}
}
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<Element> = Array<Element>");
}
}
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<Element> = Array<Element>");
}