/*
 * Copyright 2024 WebAssembly Community Group participants
 *
 * 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.
 */

#include "contexts.h"
#include "parsers.h"

#ifndef parser_wat_parser_internal_h
#define parser_wat_parser_internal_h

namespace wasm::WATParser {

Result<> parseModule(ParseDeclsCtx& decls);

Result<> parseModuleBody(ParseDeclsCtx& decls);

Result<> parseTypeDefs(
  ParseDeclsCtx& decls,
  Lexer& input,
  IndexMap& typeIndices,
  std::vector<HeapType>& types,
  std::unordered_map<HeapType, std::unordered_map<Name, Index>>& typeNames);

Result<>
parseImplicitTypeDefs(ParseDeclsCtx& decls,
                      Lexer& input,
                      IndexMap& typeIndices,
                      std::vector<HeapType>& types,
                      std::unordered_map<Index, HeapType>& implicitTypes);

Result<> parseModuleTypes(ParseDeclsCtx& decls,
                          Lexer& input,
                          IndexMap& typeIndices,
                          std::vector<HeapType>& types,
                          std::unordered_map<Index, HeapType>& implicitTypes);

Result<> parseDefinitions(
  ParseDeclsCtx& decls,
  Lexer& input,
  IndexMap& typeIndices,
  std::vector<HeapType>& types,
  std::unordered_map<Index, HeapType>& implicitTypes,
  std::unordered_map<HeapType, std::unordered_map<Name, Index>>& typeNames);

// RAII utility for temporarily changing the parsing position of a parsing
// context.
template<typename Ctx> struct WithPosition {
  Ctx& ctx;
  Index original;
  std::vector<Annotation> annotations;

  WithPosition(Ctx& ctx, Index pos)
    : ctx(ctx), original(ctx.in.getPos()),
      annotations(ctx.in.takeAnnotations()) {
    ctx.in.setPos(pos);
  }

  ~WithPosition() {
    ctx.in.setPos(original);
    ctx.in.setAnnotations(std::move(annotations));
  }
};

template<typename Ctx>
Result<> parseDefs(Ctx& ctx,
                   const std::vector<DefPos>& defs,
                   MaybeResult<> (*parser)(Ctx&)) {
  for (auto& def : defs) {
    ctx.index = def.index;
    WithPosition with(ctx, def.pos);
    if (auto parsed = parser(ctx)) {
      CHECK_ERR(parsed);
    } else {
      auto im = import_(ctx);
      assert(im);
      CHECK_ERR(im);
    }
  }
  return Ok{};
}

// Deduction guide to satisfy -Wctad-maybe-unsupported.
template<typename Ctx> WithPosition(Ctx& ctx, Index) -> WithPosition<Ctx>;

} // namespace wasm::WATParser

#endif // parser_wat_parser_internal_h
