1 /* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
2 * Use of this file is governed by the BSD 3-clause license that
3 * can be found in the LICENSE.txt file in the project root.
7 #include "CommonToken.h"
8 #include "CharStream.h"
10 #include "ListTokenSource.h"
12 using namespace antlr4;
14 ListTokenSource::ListTokenSource(std::vector<std::unique_ptr<Token>> tokens_) : ListTokenSource(std::move(tokens_), "") {
17 ListTokenSource::ListTokenSource(std::vector<std::unique_ptr<Token>> tokens_, const std::string &sourceName_)
18 : tokens(std::move(tokens_)), sourceName(sourceName_) {
19 InitializeInstanceFields();
21 throw "tokens cannot be null";
24 // Check if there is an eof token and create one if not.
25 if (tokens.back()->getType() != Token::EOF) {
26 Token *lastToken = tokens.back().get();
27 size_t start = INVALID_INDEX;
28 size_t previousStop = lastToken->getStopIndex();
29 if (previousStop != INVALID_INDEX) {
30 start = previousStop + 1;
33 size_t stop = std::max(INVALID_INDEX, start - 1);
34 tokens.emplace_back((_factory->create({ this, getInputStream() }, Token::EOF, "EOF",
35 Token::DEFAULT_CHANNEL, start, stop, static_cast<int>(lastToken->getLine()), lastToken->getCharPositionInLine())));
39 size_t ListTokenSource::getCharPositionInLine() {
40 if (i < tokens.size()) {
41 return tokens[i]->getCharPositionInLine();
46 std::unique_ptr<Token> ListTokenSource::nextToken() {
47 if (i < tokens.size()) {
48 return std::move(tokens[i++]);
53 size_t ListTokenSource::getLine() const {
54 if (i < tokens.size()) {
55 return tokens[i]->getLine();
61 CharStream *ListTokenSource::getInputStream() {
62 if (i < tokens.size()) {
63 return tokens[i]->getInputStream();
64 } else if (!tokens.empty()) {
65 return tokens.back()->getInputStream();
68 // no input stream information is available
72 std::string ListTokenSource::getSourceName() {
73 if (sourceName != "") {
77 CharStream *inputStream = getInputStream();
78 if (inputStream != nullptr) {
79 return inputStream->getSourceName();
85 TokenFactory<CommonToken>* ListTokenSource::getTokenFactory() {
89 void ListTokenSource::InitializeInstanceFields() {
91 _factory = CommonTokenFactory::DEFAULT.get();