// Copyright 2022 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_TINT_RESOLVER_SEM_HELPER_H_
#define SRC_TINT_RESOLVER_SEM_HELPER_H_

#include <string>

#include "src/tint/diagnostic/diagnostic.h"
#include "src/tint/program_builder.h"
#include "src/tint/resolver/dependency_graph.h"
#include "src/tint/utils/map.h"

namespace tint::resolver {

/// Helper class to retrieve sem information.
class SemHelper {
  public:
    /// Constructor
    /// @param builder the program builder
    /// @param dependencies the program dependency graph
    explicit SemHelper(ProgramBuilder* builder, DependencyGraph& dependencies);
    ~SemHelper();

    /// Get is a helper for obtaining the semantic node for the given AST node.
    /// @param ast the ast node to get the sem for
    /// @returns the sem node for the provided |ast|
    template <typename SEM = sem::Info::InferFromAST, typename AST_OR_TYPE = CastableBase>
    auto* Get(const AST_OR_TYPE* ast) const {
        using T = sem::Info::GetResultType<SEM, AST_OR_TYPE>;
        auto* sem = builder_->Sem().Get(ast);
        if (!sem) {
            TINT_ICE(Resolver, builder_->Diagnostics())
                << "AST node '" << ast->TypeInfo().name << "' had no semantic info\n"
                << "At: " << ast->source << "\n"
                << "Pointer: " << ast;
        }
        return const_cast<T*>(As<T>(sem));
    }

    /// @returns the resolved symbol (function, type or variable) for the given
    /// ast::Identifier or ast::TypeName cast to the given semantic type.
    /// @param node the node to retrieve
    template <typename SEM = sem::Node>
    SEM* ResolvedSymbol(const ast::Node* node) const {
        auto resolved = dependencies_.resolved_symbols.Find(node);
        return resolved ? const_cast<SEM*>(builder_->Sem().Get<SEM>(*resolved)) : nullptr;
    }

    /// @returns the resolved type of the ast::Expression `expr`
    /// @param expr the expression
    sem::Type* TypeOf(const ast::Expression* expr) const;

    /// @returns the type name of the given semantic type, unwrapping
    /// references.
    /// @param ty the type to look up
    std::string TypeNameOf(const sem::Type* ty) const;

    /// @returns the type name of the given semantic type, without unwrapping
    /// references.
    /// @param ty the type to look up
    std::string RawTypeNameOf(const sem::Type* ty) const;

  private:
    ProgramBuilder* builder_;
    DependencyGraph& dependencies_;
};

}  // namespace tint::resolver

#endif  // SRC_TINT_RESOLVER_SEM_HELPER_H_
