blob: 99f0e4e0ddc1289c253b14ff9692e1b7ef67ed2a [file]
#include "Python.h"
#include "errcode.h"
#include "pycore_token.h"
#include "tokenizer.h"
#include "reader.h"
#include "reader_internal.h"
#include "../lexer/state.h"
int
_PyTokenizer_GetStatus(const struct tok_state *tok)
{
return tok->done;
}
int
_PyTokenizer_GetNewlineRequirements(const struct tok_state *tok)
{
return tok->needs_newline;
}
_PyTokenizer_Info
_PyTokenizer_GetInfo(const struct tok_state *tok)
{
_PyTokenizer_Info info = {
.status = tok->done,
.implicit_newline = tok->implicit_newline,
.diagnostic = tok->diagnostic,
.location = {tok->lineno, tok->line_start < 0
? -1 : (int)(tok->cur - tok->line_start)},
.cursor = tok->cur,
.input_span = {tok->buf_offset, tok->inp},
.line_span = {tok->line_start, tok->inp},
.level = tok->level,
.delimiter_loc = {-1, -1},
.in_formatted_string = tok->ftstring_depth != 0,
.is_interactive = _PyTok_ReaderIsInteractive(tok),
.is_file = tok->reader->fp != NULL && tok->reader->fp != stdin,
.filename = tok->filename,
.module = tok->module,
.encoding = tok->reader->encoding,
};
if (tok->level > 0) {
int level = tok->level - 1;
info.delimiter = tok->parenstack[level];
info.delimiter_loc = (_PyTok_Loc){
tok->parenlinenostack[level], tok->parencolstack[level]};
}
return info;
}
const char *
_PyToken_TextView(const struct tok_state *tok, const struct token *token,
Py_ssize_t *length)
{
assert(length != NULL);
if (token->span.start < 0) {
assert(token->span.start == -1 && token->span.end == -1);
*length = 0;
return "";
}
return _PyTok_SourceSpanView(&tok->source, token->span, length);
}
const char *
_PyTokenizer_SpanView(const struct tok_state *tok, _PyTok_Span span,
Py_ssize_t *length)
{
return _PyTok_SourceSpanView(&tok->source, span, length);
}
void
_PyToken_GetView(const struct tok_state *tok, const struct token *token,
_PyToken_View *view)
{
assert(view != NULL);
view->text = _PyToken_TextView(tok, token, &view->length);
view->end_line_start = tok->line_start;
view->line_span = (_PyTok_Span){
ISSTRINGLIT(token->type)
? token->span.start - token->start_loc.byte_col : tok->line_start,
tok->inp,
};
view->implicit_newline = tok->implicit_newline;
view->at_eof = tok->done == E_EOF;
}
const char *
_PyTokenizer_LineView(const struct tok_state *tok, Py_ssize_t lineno,
Py_ssize_t *length)
{
return _PyTok_SourceLineView(&tok->source, lineno, length);
}
void
_PyTokenizer_SetContext(struct tok_state *tok, PyObject *filename,
PyObject *module)
{
Py_XINCREF(filename);
Py_XINCREF(module);
Py_XSETREF(tok->filename, filename);
Py_XSETREF(tok->module, module);
}
void
_PyTokenizer_SetOptions(struct tok_state *tok, int extra_tokens,
int type_comments)
{
tok->tok_extra_tokens = extra_tokens;
tok->type_comments = type_comments;
}
void
_PyTokenizer_ImplyDedents(struct tok_state *tok)
{
_PyLexer_ImplyDedents(tok);
}
void
_PyTokenizer_AllowIncompleteInput(struct tok_state *tok, int allow)
{
tok->allow_incomplete_input = allow != 0;
}
int
_PyTokenizer_HasTrailingStatement(const struct tok_state *tok)
{
_PyTok_Off cur = tok->cur;
_PyTok_Off end = tok->source.base_offset + tok->source.len;
while (cur < end) {
int c = _PyTok_SourceByte(&tok->source, cur++);
if (c == '\0') {
return 0;
}
if (c == ' ' || c == '\t' || c == '\n' || c == '\014') {
continue;
}
if (c != '#') {
return 1;
}
while (cur < end) {
c = _PyTok_SourceByte(&tok->source, cur);
if (c == '\0' || c == '\n') {
break;
}
cur++;
}
}
return 0;
}
int
_PyTokenizer_IsInteractive(const struct tok_state *tok)
{
return _PyTok_ReaderIsInteractive(tok);
}
void
_PyTokenizer_StopInteractive(struct tok_state *tok)
{
_PyTok_ReaderStopInteractive(tok);
}