// Copyright 2020 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_AST_FUNCTION_H_
#define SRC_AST_FUNCTION_H_

#include <memory>
#include <ostream>
#include <string>
#include <utility>
#include <vector>

#include "src/ast/expression.h"
#include "src/ast/node.h"
#include "src/ast/statement.h"
#include "src/ast/type/type.h"
#include "src/ast/variable.h"

namespace tint {
namespace ast {

/// A Function statement.
class Function : public Node {
 public:
  /// Create a new empty function statement
  Function();
  /// Create a function
  /// @param name the function name
  /// @param params the function parameters
  /// @param return_type the return type
  Function(const std::string& name,
           VariableList params,
           type::Type* return_type);
  /// Create a function
  /// @param source the variable source
  /// @param name the function name
  /// @param params the function parameters
  /// @param return_type the return type
  Function(const Source& source,
           const std::string& name,
           VariableList params,
           type::Type* return_type);
  /// Move constructor
  Function(Function&&);

  ~Function() override;

  /// Sets the function name
  /// @param name the name to set
  void set_name(const std::string& name) { name_ = name; }
  /// @returns the function name
  const std::string& name() { return name_; }

  /// Sets the function parameters
  /// @param params the function parameters
  void set_params(VariableList params) { params_ = std::move(params); }
  /// @returns the function params
  const VariableList& params() const { return params_; }

  /// Adds the given variable to the list of referenced module variables if it
  /// is not already included.
  /// @param var the module variable to add
  void add_referenced_module_variable(Variable* var);
  /// @returns the referenced module variables
  const std::vector<Variable*>& referenced_module_variables() const {
    return referenced_module_vars_;
  }

  /// Sets the return type of the function
  /// @param type the return type
  void set_return_type(type::Type* type) { return_type_ = type; }
  /// @returns the function return type.
  type::Type* return_type() const { return return_type_; }

  /// Sets the body of the function
  /// @param body the function body
  void set_body(StatementList body) { body_ = std::move(body); }
  /// @returns the function body
  const StatementList& body() const { return body_; }

  /// @returns true if the name and type are both present
  bool IsValid() const override;

  /// Writes a representation of the node to the output stream
  /// @param out the stream to write to
  /// @param indent number of spaces to indent the node when writing
  void to_str(std::ostream& out, size_t indent) const override;

  /// @returns the type name for this function
  std::string type_name() const;

 private:
  Function(const Function&) = delete;

  std::string name_;
  VariableList params_;
  type::Type* return_type_ = nullptr;
  StatementList body_;
  std::vector<Variable*> referenced_module_vars_;
};

/// A list of unique functions
using FunctionList = std::vector<std::unique_ptr<Function>>;

}  // namespace ast
}  // namespace tint

#endif  // SRC_AST_FUNCTION_H_
