tree-sitter/src/runtime/stack.h

139 lines
4.4 KiB
C
Raw Normal View History

2015-05-25 20:21:13 -07:00
#ifndef RUNTIME_PARSE_STACK_H_
#define RUNTIME_PARSE_STACK_H_
#ifdef __cplusplus
extern "C" {
#endif
2016-02-17 20:41:29 -08:00
#include "runtime/array.h"
#include "runtime/tree.h"
#include "runtime/error_costs.h"
#include <stdio.h>
2015-05-25 20:21:13 -07:00
2015-09-18 18:04:52 -07:00
typedef struct Stack Stack;
2015-05-25 20:21:13 -07:00
typedef unsigned StackVersion;
#define STACK_VERSION_NONE ((StackVersion)-1)
2016-04-04 12:25:57 -07:00
2015-06-03 09:44:13 -07:00
typedef struct {
TreeArray trees;
2016-04-04 12:25:57 -07:00
StackVersion version;
2016-03-03 10:16:10 -08:00
} StackSlice;
typedef Array(StackSlice) StackSliceArray;
typedef struct {
Length position;
unsigned depth;
TSStateId state;
} StackSummaryEntry;
typedef Array(StackSummaryEntry) StackSummary;
// Create a stack.
Stack *ts_stack_new(TreePool *);
2015-06-03 09:44:13 -07:00
// Release the memory reserved for a given stack.
2015-09-18 18:04:52 -07:00
void ts_stack_delete(Stack *);
2015-05-25 20:21:13 -07:00
// Get the stack's current number of versions.
uint32_t ts_stack_version_count(const Stack *);
2015-05-25 20:21:13 -07:00
// Get the state at the top of the given version of the stack. If the stack is
// empty, this returns the initial state, 0.
TSStateId ts_stack_state(const Stack *, StackVersion);
2015-06-03 09:44:13 -07:00
// Get the number of trees that have been pushed to a given version of
// the stack.
unsigned ts_stack_push_count(const Stack *, StackVersion);
// In the event that trees were permanently removed from some version
// of the stack, decrease the version's push count to account for the
// removal.
void ts_stack_decrease_push_count(Stack *, StackVersion, unsigned);
// Get the last external token associated with a given version of the stack.
Tree *ts_stack_last_external_token(const Stack *, StackVersion);
// Set the last external token associated with a given version of the stack.
void ts_stack_set_last_external_token(Stack *, StackVersion, Tree *);
// Get the position of the given version of the stack within the document.
Length ts_stack_position(const Stack *, StackVersion);
// Push a tree and state onto the given version of the stack.
//
// This transfers ownership of the tree to the Stack. Callers that
// need to retain ownership of the tree for their own purposes should
// first retain the tree.
2017-06-29 10:43:20 -07:00
void ts_stack_push(Stack *, StackVersion, Tree *, bool, TSStateId);
2015-06-03 09:44:13 -07:00
// Pop the given number of entries from the given version of the stack. This
// operation can increase the number of stack versions by revealing multiple
// versions which had previously been merged. It returns an array that
// specifies the index of each revealed version and the trees that were
// removed from that version.
StackSliceArray ts_stack_pop_count(Stack *, StackVersion, uint32_t count);
// Remove an error at the top of the given version of the stack.
StackSliceArray ts_stack_pop_error(Stack *, StackVersion);
// Remove any pending trees from the top of the given version of the stack.
StackSliceArray ts_stack_pop_pending(Stack *, StackVersion);
// Remove any all trees from the given version of the stack.
StackSliceArray ts_stack_pop_all(Stack *, StackVersion);
unsigned ts_stack_depth_since_error(Stack *, StackVersion);
int ts_stack_dynamic_precedence(Stack *, StackVersion);
// Compute a summary of all the parse states near the top of the given
// version of the stack and store the summary for later retrieval.
void ts_stack_record_summary(Stack *, StackVersion, unsigned max_depth);
// Retrieve a summary of all the parse states near the top of the
// given version of the stack.
StackSummary *ts_stack_get_summary(Stack *, StackVersion);
unsigned ts_stack_error_cost(const Stack *, StackVersion version);
bool ts_stack_merge(Stack *, StackVersion, StackVersion);
bool ts_stack_can_merge(Stack *, StackVersion, StackVersion);
void ts_stack_force_merge(Stack *, StackVersion, StackVersion);
TSSymbol ts_stack_resume(Stack *, StackVersion);
void ts_stack_pause(Stack *, StackVersion, TSSymbol);
void ts_stack_halt(Stack *, StackVersion);
bool ts_stack_is_active(const Stack *, StackVersion);
bool ts_stack_is_paused(const Stack *, StackVersion);
bool ts_stack_is_halted(const Stack *, StackVersion);
void ts_stack_renumber_version(Stack *, StackVersion, StackVersion);
2015-05-25 20:21:13 -07:00
void ts_stack_swap_versions(Stack *, StackVersion, StackVersion);
2016-11-14 17:25:55 -08:00
StackVersion ts_stack_copy_version(Stack *, StackVersion);
// Remove the given version from the stack.
2016-04-04 12:25:57 -07:00
void ts_stack_remove_version(Stack *, StackVersion);
2015-09-18 18:04:52 -07:00
void ts_stack_clear(Stack *);
bool ts_stack_print_dot_graph(Stack *, const char **, FILE *);
typedef void (*StackIterateCallback)(void *, TSStateId, uint32_t);
void ts_stack_iterate(Stack *, StackVersion, StackIterateCallback, void *);
2015-05-25 20:21:13 -07:00
#ifdef __cplusplus
}
#endif
#endif // RUNTIME_PARSE_STACK_H_