Jelajahi Sumber

LibCpp: Add Parser::tokens_in_range(start, end)

This function returns the tokens that exist in the specified range.
Itamar 4 tahun lalu
induk
melakukan
232013c05b

+ 1 - 2
Userland/Libraries/LibCpp/AST.h

@@ -182,6 +182,7 @@ public:
     virtual ~Parameter() override = default;
     virtual ~Parameter() override = default;
     virtual const char* class_name() const override { return "Parameter"; }
     virtual const char* class_name() const override { return "Parameter"; }
     virtual void dump(FILE* = stdout, size_t indent = 0) const override;
     virtual void dump(FILE* = stdout, size_t indent = 0) const override;
+    virtual bool is_parameter() const override { return true; }
 
 
     Parameter(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename, StringView name)
     Parameter(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename, StringView name)
         : VariableOrParameterDeclaration(parent, start, end, filename)
         : VariableOrParameterDeclaration(parent, start, end, filename)
@@ -189,8 +190,6 @@ public:
         m_name = name;
         m_name = name;
     }
     }
 
 
-    virtual bool is_parameter() const override { return true; }
-
     bool m_is_ellipsis { false };
     bool m_is_ellipsis { false };
 };
 };
 
 

+ 13 - 3
Userland/Libraries/LibCpp/Parser.cpp

@@ -869,16 +869,26 @@ String Parser::text_of_node(const ASTNode& node) const
 }
 }
 
 
 String Parser::text_in_range(Position start, Position end) const
 String Parser::text_in_range(Position start, Position end) const
+{
+    StringBuilder builder;
+    for (auto token : tokens_in_range(start, end)) {
+        builder.append(token.text());
+    }
+    return builder.to_string();
+}
+
+Vector<Token> Parser::tokens_in_range(Position start, Position end) const
 {
 {
     auto start_token_index = index_of_token_at(start);
     auto start_token_index = index_of_token_at(start);
     auto end_node_index = index_of_token_at(end);
     auto end_node_index = index_of_token_at(end);
     VERIFY(start_token_index.has_value());
     VERIFY(start_token_index.has_value());
     VERIFY(end_node_index.has_value());
     VERIFY(end_node_index.has_value());
-    StringBuilder text;
+
+    Vector<Token> tokens;
     for (size_t i = start_token_index.value(); i <= end_node_index.value(); ++i) {
     for (size_t i = start_token_index.value(); i <= end_node_index.value(); ++i) {
-        text.append(m_tokens[i].text());
+        tokens.append(m_tokens[i]);
     }
     }
-    return text.build();
+    return tokens;
 }
 }
 
 
 void Parser::error(StringView message)
 void Parser::error(StringView message)

+ 1 - 0
Userland/Libraries/LibCpp/Parser.h

@@ -49,6 +49,7 @@ public:
         Preprocessor::DefinedValue preprocessor_value;
         Preprocessor::DefinedValue preprocessor_value;
     };
     };
     const Vector<TokenAndPreprocessorDefinition>& replaced_preprocessor_tokens() const { return m_replaced_preprocessor_tokens; }
     const Vector<TokenAndPreprocessorDefinition>& replaced_preprocessor_tokens() const { return m_replaced_preprocessor_tokens; }
+    Vector<Token> tokens_in_range(Position start, Position end) const;
 
 
 private:
 private:
     enum class DeclarationType {
     enum class DeclarationType {