// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "identifier_table.h"

namespace fidl {

IdentifierTable::IdentifierTable() {
    keyword_table_ = {
#define KEYWORD(Name, Spelling) {Spelling, Token::Name},
#include "token_definitions.h"
    };
}

Token IdentifierTable::MakeIdentifier(StringView source_data, uint32_t offset, bool escaped_identifier) const {
    auto kind = Token::Kind::Identifier;
    if (!escaped_identifier) {
        auto lookup = keyword_table_.find(source_data);
        if (lookup != keyword_table_.end())
            kind = lookup->second;
    }
    return Token(source_data, offset, kind);
}

} // namespace fidl
