瀏覽代碼

HackStudio: Make CppTokens have (line,column) positions

These are infinitely more useful than raw indices into the input text.
Andreas Kling 5 年之前
父節點
當前提交
0604fcf9fd
共有 2 個文件被更改,包括 27 次插入6 次删除
  1. 18 5
      DevTools/HackStudio/CppLexer.cpp
  2. 9 1
      DevTools/HackStudio/CppLexer.h

+ 18 - 5
DevTools/HackStudio/CppLexer.cpp

@@ -17,7 +17,15 @@ char CppLexer::peek(int offset) const
 char CppLexer::consume()
 {
     ASSERT(m_index < m_input.length());
-    return m_input[m_index++];
+    char ch = m_input[m_index++];
+    m_previous_position = m_position;
+    if (ch == '\n') {
+        m_position.line++;
+        m_position.column = 0;
+    } else {
+        m_position.column++;
+    }
+    return ch;
 }
 
 static bool is_valid_first_character_of_identifier(char ch)
@@ -41,22 +49,27 @@ Vector<CppToken> CppLexer::lex()
 {
     Vector<CppToken> tokens;
 
+    int token_start_index = 0;
+    CppPosition token_start_position;
+
     auto emit_token = [&](auto type) {
         CppToken token;
         token.m_type = type;
-        token.m_view = StringView(m_input.characters_without_null_termination() + m_index, 1);
+        token.m_start = m_position;
+        token.m_end = m_position;
         tokens.append(token);
-        m_index++;
+        consume();
     };
 
-    int token_start_index = 0;
     auto begin_token = [&] {
         token_start_index = m_index;
+        token_start_position = m_position;
     };
     auto commit_token = [&](auto type) {
         CppToken token;
         token.m_type = type;
-        token.m_view = StringView(m_input.characters_without_null_termination() + token_start_index, m_index - token_start_index);
+        token.m_start = token_start_position;
+        token.m_end = m_previous_position;
         tokens.append(token);
     };
 

+ 9 - 1
DevTools/HackStudio/CppLexer.h

@@ -23,6 +23,11 @@
     __TOKEN(Keyword)               \
     __TOKEN(Identifier)
 
+struct CppPosition {
+    int line { -1 };
+    int column { -1 };
+};
+
 struct CppToken {
     enum class Type {
 #define __TOKEN(x) x,
@@ -43,7 +48,8 @@ struct CppToken {
     }
 
     Type m_type { Type::Invalid };
-    StringView m_view;
+    CppPosition m_start;
+    CppPosition m_end;
 };
 
 class CppLexer {
@@ -58,4 +64,6 @@ private:
 
     StringView m_input;
     int m_index { 0 };
+    CppPosition m_previous_position { 0, 0 };
+    CppPosition m_position { 0, 0 };
 };