| Index: runtime/vm/scanner_test.cc
|
| diff --git a/runtime/vm/scanner_test.cc b/runtime/vm/scanner_test.cc
|
| index 49b8cc4dc6ba71389a869fa70ce9dea660efca2c..3d8d70ccc0f0cbd992f226b61d51cc1d9963b958 100644
|
| --- a/runtime/vm/scanner_test.cc
|
| +++ b/runtime/vm/scanner_test.cc
|
| @@ -10,6 +10,10 @@
|
|
|
| namespace dart {
|
|
|
| +
|
| +typedef ZoneGrowableArray<Scanner::TokenDescriptor> GrowableTokenStream;
|
| +
|
| +
|
| static void LogTokenDesc(Scanner::TokenDescriptor token) {
|
| OS::Print("pos %2d:%d-%d token %s ",
|
| token.position.line, token.position.column,
|
| @@ -22,7 +26,7 @@ static void LogTokenDesc(Scanner::TokenDescriptor token) {
|
| }
|
|
|
|
|
| -static void LogTokenStream(const Scanner::GrowableTokenStream& token_stream) {
|
| +static void LogTokenStream(const GrowableTokenStream& token_stream) {
|
| int token_index = 0;
|
| EXPECT_GT(token_stream.length(), 0);
|
| while (token_index < token_stream.length()) {
|
| @@ -35,7 +39,7 @@ static void LogTokenStream(const Scanner::GrowableTokenStream& token_stream) {
|
| }
|
|
|
|
|
| -static void CheckKind(const Scanner::GrowableTokenStream &token_stream,
|
| +static void CheckKind(const GrowableTokenStream &token_stream,
|
| int index,
|
| Token::Kind kind) {
|
| if (token_stream[index].kind != kind) {
|
| @@ -46,7 +50,7 @@ static void CheckKind(const Scanner::GrowableTokenStream &token_stream,
|
| }
|
|
|
|
|
| -static void CheckLiteral(const Scanner::GrowableTokenStream& token_stream,
|
| +static void CheckLiteral(const GrowableTokenStream& token_stream,
|
| int index,
|
| const char* literal) {
|
| if (token_stream[index].literal == NULL) {
|
| @@ -59,7 +63,7 @@ static void CheckLiteral(const Scanner::GrowableTokenStream& token_stream,
|
| }
|
|
|
|
|
| -static void CheckIdent(const Scanner::GrowableTokenStream& token_stream,
|
| +static void CheckIdent(const GrowableTokenStream& token_stream,
|
| int index,
|
| const char* literal) {
|
| CheckKind(token_stream, index, Token::kIDENT);
|
| @@ -67,7 +71,7 @@ static void CheckIdent(const Scanner::GrowableTokenStream& token_stream,
|
| }
|
|
|
|
|
| -static void CheckInteger(const Scanner::GrowableTokenStream& token_stream,
|
| +static void CheckInteger(const GrowableTokenStream& token_stream,
|
| int index,
|
| const char* literal) {
|
| CheckKind(token_stream, index, Token::kINTEGER);
|
| @@ -75,7 +79,7 @@ static void CheckInteger(const Scanner::GrowableTokenStream& token_stream,
|
| }
|
|
|
|
|
| -static void CheckLineNumber(const Scanner::GrowableTokenStream& token_stream,
|
| +static void CheckLineNumber(const GrowableTokenStream& token_stream,
|
| int index,
|
| int line_number) {
|
| if (token_stream[index].position.line != line_number) {
|
| @@ -85,7 +89,7 @@ static void CheckLineNumber(const Scanner::GrowableTokenStream& token_stream,
|
| }
|
|
|
|
|
| -static void CheckNumTokens(const Scanner::GrowableTokenStream& token_stream,
|
| +static void CheckNumTokens(const GrowableTokenStream& token_stream,
|
| int index) {
|
| if (token_stream.length() != index) {
|
| OS::PrintErr("Expected %d tokens but got only %" Pd ".\n",
|
| @@ -94,19 +98,35 @@ static void CheckNumTokens(const Scanner::GrowableTokenStream& token_stream,
|
| }
|
|
|
|
|
| -static const Scanner::GrowableTokenStream& Scan(const char* source) {
|
| +class Collector : public Scanner::TokenCollector {
|
| + public:
|
| + explicit Collector(GrowableTokenStream* ts) : ts_(ts) { }
|
| + virtual ~Collector() { }
|
| +
|
| + virtual void AddToken(const Scanner::TokenDescriptor& token) {
|
| + ts_->Add(token);
|
| + }
|
| + private:
|
| + GrowableTokenStream* ts_;
|
| +};
|
| +
|
| +
|
| +static const GrowableTokenStream& Scan(const char* source) {
|
| + OS::Print("\nScanning: <%s>\n", source);
|
| +
|
| Scanner scanner(String::Handle(String::New(source)),
|
| String::Handle(String::New("")));
|
| + GrowableTokenStream* tokens = new GrowableTokenStream(128);
|
| + Collector collector(tokens);
|
|
|
| - OS::Print("\nScanning: <%s>\n", source);
|
| - const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
|
| - LogTokenStream(tokens);
|
| - return tokens;
|
| + scanner.ScanAll(&collector);
|
| + LogTokenStream(*tokens);
|
| + return *tokens;
|
| }
|
|
|
|
|
| static void BoringTest() {
|
| - const Scanner::GrowableTokenStream& tokens = Scan("x = iffy++;");
|
| + const GrowableTokenStream& tokens = Scan("x = iffy++;");
|
|
|
| CheckNumTokens(tokens, 6);
|
| CheckIdent(tokens, 0, "x");
|
| @@ -118,7 +138,7 @@ static void BoringTest() {
|
|
|
|
|
| static void CommentTest() {
|
| - const Scanner::GrowableTokenStream& tokens =
|
| + const GrowableTokenStream& tokens =
|
| Scan("Foo( /*block \n"
|
| "comment*/ 0xff) // line comment;");
|
|
|
| @@ -135,7 +155,7 @@ static void CommentTest() {
|
|
|
| static void GreedIsGood() {
|
| // means i++ + j
|
| - const Scanner::GrowableTokenStream& tokens = Scan("x=i+++j");
|
| + const GrowableTokenStream& tokens = Scan("x=i+++j");
|
|
|
| CheckNumTokens(tokens, 7);
|
| CheckIdent(tokens, 0, "x");
|
| @@ -149,7 +169,7 @@ static void GreedIsGood() {
|
|
|
| static void StringEscapes() {
|
| // sss = "\" \\ \n\r\t \'"
|
| - const Scanner::GrowableTokenStream& tokens =
|
| + const GrowableTokenStream& tokens =
|
| Scan("sss = \"\\\" \\\\ \\n\\r\\t \\\'\"");
|
|
|
| EXPECT_EQ(4, tokens.length());
|
| @@ -172,70 +192,70 @@ static void StringEscapes() {
|
|
|
|
|
| static void InvalidStringEscapes() {
|
| - const Scanner::GrowableTokenStream& high_start_4 =
|
| + const GrowableTokenStream& high_start_4 =
|
| Scan("\"\\uD800\"");
|
| EXPECT_EQ(2, high_start_4.length());
|
| CheckKind(high_start_4, 0, Token::kERROR);
|
| EXPECT(high_start_4[0].literal->Equals("invalid code point"));
|
| CheckKind(high_start_4, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& high_start_seq =
|
| + const GrowableTokenStream& high_start_seq =
|
| Scan("\"\\u{D800}\"");
|
| EXPECT_EQ(2, high_start_seq.length());
|
| CheckKind(high_start_seq, 0, Token::kERROR);
|
| EXPECT(high_start_seq[0].literal->Equals("invalid code point"));
|
| CheckKind(high_start_seq, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& high_end_4 =
|
| + const GrowableTokenStream& high_end_4 =
|
| Scan("\"\\uDBFF\"");
|
| EXPECT_EQ(2, high_end_4.length());
|
| CheckKind(high_end_4, 0, Token::kERROR);
|
| EXPECT(high_end_4[0].literal->Equals("invalid code point"));
|
| CheckKind(high_end_4, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& high_end_seq =
|
| + const GrowableTokenStream& high_end_seq =
|
| Scan("\"\\u{DBFF}\"");
|
| EXPECT_EQ(2, high_end_seq.length());
|
| CheckKind(high_end_seq, 0, Token::kERROR);
|
| EXPECT(high_end_seq[0].literal->Equals("invalid code point"));
|
| CheckKind(high_end_seq, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& low_start_4 =
|
| + const GrowableTokenStream& low_start_4 =
|
| Scan("\"\\uDC00\"");
|
| EXPECT_EQ(2, low_start_4.length());
|
| CheckKind(low_start_4, 0, Token::kERROR);
|
| EXPECT(low_start_4[0].literal->Equals("invalid code point"));
|
| CheckKind(low_start_4, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& low_start_seq =
|
| + const GrowableTokenStream& low_start_seq =
|
| Scan("\"\\u{DC00}\"");
|
| EXPECT_EQ(2, low_start_seq.length());
|
| CheckKind(low_start_seq, 0, Token::kERROR);
|
| EXPECT(low_start_seq[0].literal->Equals("invalid code point"));
|
| CheckKind(low_start_seq, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& low_end_4 =
|
| + const GrowableTokenStream& low_end_4 =
|
| Scan("\"\\uDFFF\"");
|
| EXPECT_EQ(2, low_end_4.length());
|
| CheckKind(low_end_4, 0, Token::kERROR);
|
| EXPECT(low_end_4[0].literal->Equals("invalid code point"));
|
| CheckKind(low_end_4, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& low_end_seq =
|
| + const GrowableTokenStream& low_end_seq =
|
| Scan("\"\\u{DFFF}\"");
|
| EXPECT_EQ(2, low_end_seq.length());
|
| CheckKind(low_end_seq, 0, Token::kERROR);
|
| EXPECT(low_end_seq[0].literal->Equals("invalid code point"));
|
| CheckKind(low_end_seq, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& out_of_range_low =
|
| + const GrowableTokenStream& out_of_range_low =
|
| Scan("\"\\u{110000}\"");
|
| EXPECT_EQ(2, out_of_range_low.length());
|
| CheckKind(out_of_range_low, 0, Token::kERROR);
|
| EXPECT(out_of_range_low[0].literal->Equals("invalid code point"));
|
| CheckKind(out_of_range_low, 1, Token::kEOS);
|
|
|
| - const Scanner::GrowableTokenStream& out_of_range_high =
|
| + const GrowableTokenStream& out_of_range_high =
|
| Scan("\"\\u{FFFFFF}\"");
|
| EXPECT_EQ(2, out_of_range_high.length());
|
| CheckKind(out_of_range_high, 0, Token::kERROR);
|
| @@ -246,7 +266,7 @@ static void InvalidStringEscapes() {
|
|
|
| static void RawString() {
|
| // rs = @"\' \\"
|
| - const Scanner::GrowableTokenStream& tokens = Scan("rs = r\"\\\' \\\\\"");
|
| + const GrowableTokenStream& tokens = Scan("rs = r\"\\\' \\\\\"");
|
|
|
| EXPECT_EQ(4, tokens.length());
|
| CheckIdent(tokens, 0, "rs");
|
| @@ -269,7 +289,7 @@ static void MultilineString() {
|
| // |mls = '''
|
| // |1' x
|
| // |2''';
|
| - const Scanner::GrowableTokenStream& tokens = Scan("mls = '''\n1' x\n2''';");
|
| + const GrowableTokenStream& tokens = Scan("mls = '''\n1' x\n2''';");
|
|
|
| EXPECT_EQ(7, tokens.length());
|
| CheckIdent(tokens, 0, "mls");
|
| @@ -295,7 +315,7 @@ static void MultilineString() {
|
|
|
| static void EmptyString() {
|
| // es = "";
|
| - const Scanner::GrowableTokenStream& tokens = Scan("es = \"\";");
|
| + const GrowableTokenStream& tokens = Scan("es = \"\";");
|
|
|
| EXPECT_EQ(5, tokens.length());
|
| CheckIdent(tokens, 0, "es");
|
| @@ -308,7 +328,7 @@ static void EmptyString() {
|
|
|
| static void EmptyMultilineString() {
|
| // es = """""";
|
| - const Scanner::GrowableTokenStream& tokens = Scan("es = \"\"\"\"\"\";");
|
| + const GrowableTokenStream& tokens = Scan("es = \"\"\"\"\"\";");
|
|
|
| EXPECT_EQ(5, tokens.length());
|
| CheckIdent(tokens, 0, "es");
|
| @@ -321,7 +341,7 @@ static void EmptyMultilineString() {
|
|
|
|
|
| static void NumberLiteral() {
|
| - const Scanner::GrowableTokenStream& tokens =
|
| + const GrowableTokenStream& tokens =
|
| Scan("5 0x5d 0.3 0.33 1E+12 .42 +5");
|
|
|
| CheckKind(tokens, 0, Token::kINTEGER);
|
| @@ -401,7 +421,7 @@ static void ScanLargeText() {
|
|
|
|
|
| void InvalidText() {
|
| - const Scanner::GrowableTokenStream& tokens =
|
| + const GrowableTokenStream& tokens =
|
| Scan("\\");
|
|
|
| EXPECT_EQ(2, tokens.length());
|
| @@ -419,7 +439,7 @@ void NewlinesTest() {
|
| "d\n"
|
| "\"\"\";";
|
|
|
| - const Scanner::GrowableTokenStream& tokens = Scan(source);
|
| + const GrowableTokenStream& tokens = Scan(source);
|
|
|
| EXPECT_EQ(11, tokens.length());
|
| CheckKind(tokens, 0, Token::kVAR);
|
|
|