|
14 | 14 |
|
15 | 15 | using llvm::StringRef; |
16 | 16 |
|
17 | | -std::vector<std::pair<lldb_private::dil::Token::Kind, std::string>> |
18 | | -ExtractTokenData(lldb_private::dil::DILLexer &lexer) { |
19 | | - std::vector<std::pair<lldb_private::dil::Token::Kind, std::string>> data; |
| 17 | +using namespace lldb_private::dil; |
| 18 | + |
| 19 | +llvm::Expected<std::vector<std::pair<Token::Kind, std::string>>> |
| 20 | +ExtractTokenData(llvm::StringRef input_expr) { |
| 21 | + |
| 22 | + llvm::Expected<DILLexer> maybe_lexer = DILLexer::Create(input_expr); |
| 23 | + if (!maybe_lexer) |
| 24 | + return maybe_lexer.takeError(); |
| 25 | + DILLexer lexer(*maybe_lexer); |
| 26 | + |
20 | 27 | if (lexer.NumLexedTokens() == 0) |
21 | | - return data; |
| 28 | + return llvm::createStringError("No lexed tokens"); |
22 | 29 |
|
23 | 30 | lexer.ResetTokenIdx(UINT_MAX); |
| 31 | + std::vector<std::pair<Token::Kind, std::string>> data; |
24 | 32 | do { |
25 | 33 | lexer.Advance(); |
26 | | - lldb_private::dil::Token tok = lexer.GetCurrentToken(); |
| 34 | + Token tok = lexer.GetCurrentToken(); |
27 | 35 | data.push_back(std::make_pair(tok.GetKind(), tok.GetSpelling())); |
28 | | - } while (data.back().first != lldb_private::dil::Token::eof); |
| 36 | + } while (data.back().first != Token::eof); |
29 | 37 | return data; |
30 | 38 | } |
31 | 39 |
|
32 | 40 | TEST(DILLexerTests, SimpleTest) { |
33 | 41 | StringRef input_expr("simple_var"); |
34 | | - uint32_t tok_len = 10; |
35 | | - llvm::Expected<lldb_private::dil::DILLexer> maybe_lexer = |
36 | | - lldb_private::dil::DILLexer::Create(input_expr); |
| 42 | + llvm::Expected<DILLexer> maybe_lexer = DILLexer::Create(input_expr); |
37 | 43 | ASSERT_THAT_EXPECTED(maybe_lexer, llvm::Succeeded()); |
38 | | - lldb_private::dil::DILLexer lexer(*maybe_lexer); |
39 | | - lldb_private::dil::Token token = |
40 | | - lldb_private::dil::Token(lldb_private::dil::Token::unknown, "", 0); |
41 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::unknown); |
| 44 | + DILLexer lexer(*maybe_lexer); |
| 45 | + Token token = Token(Token::unknown, "", 0); |
| 46 | + EXPECT_EQ(token.GetKind(), Token::unknown); |
42 | 47 |
|
43 | 48 | lexer.Advance(); |
44 | 49 | token = lexer.GetCurrentToken(); |
45 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::identifier); |
| 50 | + EXPECT_EQ(token.GetKind(), Token::identifier); |
46 | 51 | EXPECT_EQ(token.GetSpelling(), "simple_var"); |
47 | | - EXPECT_EQ(token.GetSpelling().size(), tok_len); |
48 | 52 | lexer.Advance(); |
49 | 53 | token = lexer.GetCurrentToken(); |
50 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::eof); |
| 54 | + EXPECT_EQ(token.GetKind(), Token::eof); |
51 | 55 | } |
52 | 56 |
|
53 | 57 | TEST(DILLexerTests, TokenKindTest) { |
54 | | - StringRef input_expr("namespace"); |
55 | | - llvm::Expected<lldb_private::dil::DILLexer> maybe_lexer = |
56 | | - lldb_private::dil::DILLexer::Create(input_expr); |
57 | | - ASSERT_THAT_EXPECTED(maybe_lexer, llvm::Succeeded()); |
58 | | - lldb_private::dil::DILLexer lexer(*maybe_lexer); |
59 | | - lldb_private::dil::Token token = |
60 | | - lldb_private::dil::Token(lldb_private::dil::Token::unknown, "", 0); |
61 | | - lexer.Advance(); |
62 | | - token = lexer.GetCurrentToken(); |
| 58 | + Token token = Token(Token::identifier, "ident", 0); |
63 | 59 |
|
64 | | - EXPECT_TRUE(token.Is(lldb_private::dil::Token::identifier)); |
65 | | - EXPECT_FALSE(token.Is(lldb_private::dil::Token::l_paren)); |
66 | | - EXPECT_TRUE(token.IsOneOf(lldb_private::dil::Token::eof, |
67 | | - lldb_private::dil::Token::identifier)); |
68 | | - EXPECT_FALSE(token.IsOneOf( |
69 | | - lldb_private::dil::Token::l_paren, lldb_private::dil::Token::r_paren, |
70 | | - lldb_private::dil::Token::coloncolon, lldb_private::dil::Token::eof)); |
| 60 | + EXPECT_TRUE(token.Is(Token::identifier)); |
| 61 | + EXPECT_FALSE(token.Is(Token::l_paren)); |
| 62 | + EXPECT_TRUE(token.IsOneOf(Token::eof, Token::identifier)); |
| 63 | + EXPECT_FALSE(token.IsOneOf(Token::l_paren, Token::r_paren, Token::coloncolon, |
| 64 | + Token::eof)); |
71 | 65 | } |
72 | 66 |
|
73 | 67 | TEST(DILLexerTests, LookAheadTest) { |
74 | 68 | StringRef input_expr("(anonymous namespace)::some_var"); |
75 | | - llvm::Expected<lldb_private::dil::DILLexer> maybe_lexer = |
76 | | - lldb_private::dil::DILLexer::Create(input_expr); |
| 69 | + llvm::Expected<DILLexer> maybe_lexer = DILLexer::Create(input_expr); |
77 | 70 | ASSERT_THAT_EXPECTED(maybe_lexer, llvm::Succeeded()); |
78 | | - lldb_private::dil::DILLexer lexer(*maybe_lexer); |
79 | | - lldb_private::dil::Token token = |
80 | | - lldb_private::dil::Token(lldb_private::dil::Token::unknown, "", 0); |
81 | | - uint32_t expect_loc = 23; |
| 71 | + DILLexer lexer(*maybe_lexer); |
| 72 | + Token token = Token(Token::unknown, "", 0); |
82 | 73 | lexer.Advance(); |
83 | 74 | token = lexer.GetCurrentToken(); |
84 | 75 |
|
85 | 76 | // Current token is '('; check the next 4 tokens, to make |
86 | 77 | // sure they are the identifier 'anonymous', the identifier 'namespace' |
87 | 78 | // ')' and '::', in that order. |
88 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::l_paren); |
89 | | - EXPECT_EQ(lexer.LookAhead(1).GetKind(), lldb_private::dil::Token::identifier); |
| 79 | + EXPECT_EQ(token.GetKind(), Token::l_paren); |
| 80 | + EXPECT_EQ(lexer.LookAhead(1).GetKind(), Token::identifier); |
90 | 81 | EXPECT_EQ(lexer.LookAhead(1).GetSpelling(), "anonymous"); |
91 | | - EXPECT_EQ(lexer.LookAhead(2).GetKind(), lldb_private::dil::Token::identifier); |
| 82 | + EXPECT_EQ(lexer.LookAhead(2).GetKind(), Token::identifier); |
92 | 83 | EXPECT_EQ(lexer.LookAhead(2).GetSpelling(), "namespace"); |
93 | | - EXPECT_EQ(lexer.LookAhead(3).GetKind(), lldb_private::dil::Token::r_paren); |
94 | | - EXPECT_EQ(lexer.LookAhead(4).GetKind(), lldb_private::dil::Token::coloncolon); |
| 84 | + EXPECT_EQ(lexer.LookAhead(3).GetKind(), Token::r_paren); |
| 85 | + EXPECT_EQ(lexer.LookAhead(4).GetKind(), Token::coloncolon); |
95 | 86 |
|
96 | 87 | // Our current index should still be 0, as we only looked ahead; we are still |
97 | 88 | // officially on the '('. |
98 | | - EXPECT_EQ(lexer.GetCurrentTokenIdx(), (uint32_t)0); |
| 89 | + EXPECT_EQ(lexer.GetCurrentTokenIdx(), 0u); |
99 | 90 |
|
100 | 91 | // Accept the 'lookahead', so our current token is '::', which has the index |
101 | 92 | // 4 in our vector of tokens (which starts at zero). |
102 | 93 | lexer.Advance(4); |
103 | 94 | token = lexer.GetCurrentToken(); |
104 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::coloncolon); |
105 | | - EXPECT_EQ(lexer.GetCurrentTokenIdx(), (uint32_t)4); |
| 95 | + EXPECT_EQ(token.GetKind(), Token::coloncolon); |
| 96 | + EXPECT_EQ(lexer.GetCurrentTokenIdx(), 4u); |
106 | 97 |
|
107 | 98 | lexer.Advance(); |
108 | 99 | token = lexer.GetCurrentToken(); |
109 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::identifier); |
| 100 | + EXPECT_EQ(token.GetKind(), Token::identifier); |
110 | 101 | EXPECT_EQ(token.GetSpelling(), "some_var"); |
111 | | - EXPECT_EQ(lexer.GetCurrentTokenIdx(), (uint32_t)5); |
112 | | - // Verify we've advanced our position counter (lexing location) in the |
113 | | - // input 23 characters (the length of '(anonymous namespace)::'. |
114 | | - EXPECT_EQ(token.GetLocation(), expect_loc); |
| 102 | + EXPECT_EQ(lexer.GetCurrentTokenIdx(), 5u); |
| 103 | + EXPECT_EQ(token.GetLocation(), strlen("(anonymous namespace)::")); |
115 | 104 |
|
116 | 105 | lexer.Advance(); |
117 | 106 | token = lexer.GetCurrentToken(); |
118 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::eof); |
| 107 | + EXPECT_EQ(token.GetKind(), Token::eof); |
119 | 108 | } |
120 | 109 |
|
121 | 110 | TEST(DILLexerTests, MultiTokenLexTest) { |
122 | | - StringRef input_expr("This string has (several ) ::identifiers"); |
123 | | - llvm::Expected<lldb_private::dil::DILLexer> maybe_lexer = |
124 | | - lldb_private::dil::DILLexer::Create(input_expr); |
125 | | - ASSERT_THAT_EXPECTED(maybe_lexer, llvm::Succeeded()); |
126 | | - lldb_private::dil::DILLexer lexer(*maybe_lexer); |
127 | | - lldb_private::dil::Token token = |
128 | | - lldb_private::dil::Token(lldb_private::dil::Token::unknown, "", 0); |
129 | | - |
130 | | - std::vector<std::pair<lldb_private::dil::Token::Kind, std::string>> |
131 | | - lexer_tokens_data = ExtractTokenData(lexer); |
132 | | - |
133 | | - EXPECT_THAT( |
134 | | - lexer_tokens_data, |
135 | | - testing::ElementsAre( |
136 | | - testing::Pair(lldb_private::dil::Token::identifier, "This"), |
137 | | - testing::Pair(lldb_private::dil::Token::identifier, "string"), |
138 | | - testing::Pair(lldb_private::dil::Token::identifier, "has"), |
139 | | - testing::Pair(lldb_private::dil::Token::l_paren, "("), |
140 | | - testing::Pair(lldb_private::dil::Token::identifier, "several"), |
141 | | - testing::Pair(lldb_private::dil::Token::r_paren, ")"), |
142 | | - testing::Pair(lldb_private::dil::Token::coloncolon, "::"), |
143 | | - testing::Pair(lldb_private::dil::Token::identifier, "identifiers"), |
144 | | - testing::Pair(lldb_private::dil::Token::eof, ""))); |
145 | | - lexer.Advance(); |
146 | | - token = lexer.GetCurrentToken(); |
147 | | - EXPECT_EQ(token.GetSpelling(), ""); |
148 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::eof); |
| 111 | + EXPECT_THAT_EXPECTED( |
| 112 | + ExtractTokenData("This string has (several ) ::identifiers"), |
| 113 | + llvm::HasValue( |
| 114 | + testing::ElementsAre(testing::Pair(Token::identifier, "This"), |
| 115 | + testing::Pair(Token::identifier, "string"), |
| 116 | + testing::Pair(Token::identifier, "has"), |
| 117 | + testing::Pair(Token::l_paren, "("), |
| 118 | + testing::Pair(Token::identifier, "several"), |
| 119 | + testing::Pair(Token::r_paren, ")"), |
| 120 | + testing::Pair(Token::coloncolon, "::"), |
| 121 | + testing::Pair(Token::identifier, "identifiers"), |
| 122 | + testing::Pair(Token::eof, "")))); |
149 | 123 | } |
150 | 124 |
|
151 | 125 | TEST(DILLexerTests, IdentifiersTest) { |
152 | 126 | std::vector<std::string> valid_identifiers = { |
153 | | - "$My_name1", "$pc", "abcd", "ab cd", "_", "_a", "_a_", |
154 | | - "a_b", "this", "self", "a", "MyName", "namespace"}; |
| 127 | + "$My_name1", "$pc", "abcd", "_", "_a", "_a_", |
| 128 | + "a_b", "this", "self", "a", "MyName", "namespace"}; |
155 | 129 | std::vector<std::string> invalid_identifiers = {"234", "2a", "2", |
156 | 130 | "$", "1MyName", ""}; |
157 | 131 |
|
158 | 132 | // Verify that all of the valid identifiers come out as identifier tokens. |
159 | 133 | for (auto &str : valid_identifiers) { |
160 | 134 | SCOPED_TRACE(str); |
161 | | - llvm::Expected<lldb_private::dil::DILLexer> maybe_lexer = |
162 | | - lldb_private::dil::DILLexer::Create(str); |
163 | | - ASSERT_THAT_EXPECTED(maybe_lexer, llvm::Succeeded()); |
164 | | - lldb_private::dil::DILLexer lexer(*maybe_lexer); |
165 | | - lldb_private::dil::Token token = |
166 | | - lldb_private::dil::Token(lldb_private::dil::Token::unknown, "", 0); |
167 | | - lexer.Advance(); |
168 | | - token = lexer.GetCurrentToken(); |
169 | | - EXPECT_EQ(token.GetKind(), lldb_private::dil::Token::identifier); |
| 135 | + EXPECT_THAT_EXPECTED(ExtractTokenData(str), |
| 136 | + llvm::HasValue(testing::ElementsAre( |
| 137 | + testing::Pair(Token::identifier, str), |
| 138 | + testing::Pair(Token::eof, "")))); |
170 | 139 | } |
171 | 140 |
|
172 | 141 | // Verify that none of the invalid identifiers come out as identifier tokens. |
173 | 142 | for (auto &str : invalid_identifiers) { |
174 | 143 | SCOPED_TRACE(str); |
175 | | - llvm::Expected<lldb_private::dil::DILLexer> maybe_lexer = |
176 | | - lldb_private::dil::DILLexer::Create(str); |
| 144 | + llvm::Expected<DILLexer> maybe_lexer = DILLexer::Create(str); |
177 | 145 | if (!maybe_lexer) { |
178 | 146 | llvm::consumeError(maybe_lexer.takeError()); |
179 | 147 | // In this case, it's ok for lexing to return an error. |
180 | 148 | } else { |
181 | | - lldb_private::dil::DILLexer lexer(*maybe_lexer); |
182 | | - lldb_private::dil::Token token = |
183 | | - lldb_private::dil::Token(lldb_private::dil::Token::unknown, "", 0); |
| 149 | + DILLexer lexer(*maybe_lexer); |
| 150 | + Token token = Token(Token::unknown, "", 0); |
184 | 151 | // We didn't get an error; make sure we did not get an identifier token. |
185 | 152 | lexer.Advance(); |
186 | 153 | token = lexer.GetCurrentToken(); |
187 | | - EXPECT_TRUE(token.IsNot(lldb_private::dil::Token::identifier)); |
188 | | - EXPECT_TRUE(token.IsOneOf(lldb_private::dil::Token::unknown, |
189 | | - lldb_private::dil::Token::eof)); |
| 154 | + EXPECT_TRUE(token.IsNot(Token::identifier)); |
| 155 | + EXPECT_TRUE(token.IsOneOf(Token::unknown, Token::eof)); |
190 | 156 | } |
191 | 157 | } |
192 | 158 | } |
0 commit comments