Move innermost_block_tracker to expression.h

I think parser-defs.h should hold declarations that can be used by
parser implementations, whereas expression.h should hold declarations
that are used by code that wants to call a parser.  Following this
logic, this patch moves innermost_block_tracker to expression.h.
This commit is contained in:
Tom Tromey 2023-04-28 08:01:54 -06:00
parent 98d630e910
commit 562db56844
2 changed files with 44 additions and 45 deletions

View file

@ -21,6 +21,7 @@
#define EXPRESSION_H 1
#include "gdbtypes.h"
#include "symtab.h"
/* While parsing expressions we need to track the innermost lexical block
that we encounter. In some situations we need to track the innermost
@ -239,9 +240,51 @@ struct expression
typedef std::unique_ptr<expression> expression_up;
/* When parsing expressions we track the innermost block that was
referenced. */
class innermost_block_tracker
{
public:
innermost_block_tracker (innermost_block_tracker_types types
= INNERMOST_BLOCK_FOR_SYMBOLS)
: m_types (types),
m_innermost_block (NULL)
{ /* Nothing. */ }
/* Update the stored innermost block if the new block B is more inner
than the currently stored block, or if no block is stored yet. The
type T tells us whether the block B was for a symbol or for a
register. The stored innermost block is only updated if the type T is
a type we are interested in, the types we are interested in are held
in M_TYPES and set during RESET. */
void update (const struct block *b, innermost_block_tracker_types t);
/* Overload of main UPDATE method which extracts the block from BS. */
void update (const struct block_symbol &bs)
{
update (bs.block, INNERMOST_BLOCK_FOR_SYMBOLS);
}
/* Return the stored innermost block. Can be nullptr if no symbols or
registers were found during an expression parse, and so no innermost
block was defined. */
const struct block *block () const
{
return m_innermost_block;
}
private:
/* The type of innermost block being looked for. */
innermost_block_tracker_types m_types;
/* The currently stored innermost block found while parsing an
expression. */
const struct block *m_innermost_block;
};
/* From parse.c */
class innermost_block_tracker;
extern expression_up parse_expression (const char *,
innermost_block_tracker * = nullptr,
bool void_context_p = false);
@ -270,7 +313,6 @@ struct expr_completion_base
extern expression_up parse_expression_for_completion
(const char *, std::unique_ptr<expr_completion_base> *completer);
class innermost_block_tracker;
extern expression_up parse_exp_1 (const char **, CORE_ADDR pc,
const struct block *, int,
innermost_block_tracker * = nullptr);

View file

@ -316,49 +316,6 @@ private:
std::vector<expr::operation_up> m_operations;
};
/* When parsing expressions we track the innermost block that was
referenced. */
class innermost_block_tracker
{
public:
innermost_block_tracker (innermost_block_tracker_types types
= INNERMOST_BLOCK_FOR_SYMBOLS)
: m_types (types),
m_innermost_block (NULL)
{ /* Nothing. */ }
/* Update the stored innermost block if the new block B is more inner
than the currently stored block, or if no block is stored yet. The
type T tells us whether the block B was for a symbol or for a
register. The stored innermost block is only updated if the type T is
a type we are interested in, the types we are interested in are held
in M_TYPES and set during RESET. */
void update (const struct block *b, innermost_block_tracker_types t);
/* Overload of main UPDATE method which extracts the block from BS. */
void update (const struct block_symbol &bs)
{
update (bs.block, INNERMOST_BLOCK_FOR_SYMBOLS);
}
/* Return the stored innermost block. Can be nullptr if no symbols or
registers were found during an expression parse, and so no innermost
block was defined. */
const struct block *block () const
{
return m_innermost_block;
}
private:
/* The type of innermost block being looked for. */
innermost_block_tracker_types m_types;
/* The currently stored innermost block found while parsing an
expression. */
const struct block *m_innermost_block;
};
/* A string token, either a char-string or bit-string. Char-strings are
used, for example, for the names of symbols. */