/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SKSL_SYMBOLTABLE
#define SKSL_SYMBOLTABLE

#include <unordered_map>
#include <memory>
#include <vector>
#include "SkSLErrorReporter.h"
#include "SkSLSymbol.h"

namespace SkSL {

struct FunctionDeclaration;

/**
 * Maps identifiers to symbols. Functions, in particular, are mapped to either FunctionDeclaration
 * or UnresolvedFunction depending on whether they are overloaded or not.
 */
class SymbolTable {
public:
    SymbolTable(ErrorReporter* errorReporter)
    : fErrorReporter(*errorReporter) {}

    SymbolTable(std::shared_ptr<SymbolTable> parent, ErrorReporter* errorReporter)
    : fParent(parent)
    , fErrorReporter(*errorReporter) {}

    const Symbol* operator[](StringFragment name);

    void add(StringFragment name, std::unique_ptr<Symbol> symbol);

    void addWithoutOwnership(StringFragment name, const Symbol* symbol);

    Symbol* takeOwnership(Symbol* s);

    IRNode* takeOwnership(IRNode* n);

    void markAllFunctionsBuiltin();

    std::unordered_map<StringFragment, const Symbol*>::iterator begin();

    std::unordered_map<StringFragment, const Symbol*>::iterator end();

    const std::shared_ptr<SymbolTable> fParent;

private:
    static std::vector<const FunctionDeclaration*> GetFunctions(const Symbol& s);

    std::vector<std::unique_ptr<Symbol>> fOwnedSymbols;

    std::vector<std::unique_ptr<IRNode>> fOwnedNodes;

    std::unordered_map<StringFragment, const Symbol*> fSymbols;

    ErrorReporter& fErrorReporter;
};

} // namespace

#endif
