// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_

#if !defined(DART_PRECOMPILED_RUNTIME)

#include "vm/object.h"
#include "vm/parser.h"  // For ParsedFunction.
#include "vm/scopes.h"

namespace dart {
namespace kernel {

// Builds scopes, populates parameters and local variables for
// certain functions declared in bytecode.
class BytecodeScopeBuilder : public ValueObject {
 public:
  explicit BytecodeScopeBuilder(ParsedFunction* parsed_function);

  void BuildScopes();

 private:
  void AddParameters(const Function& function,
                     LocalVariable::TypeCheckMode mode);
  LocalVariable* MakeVariable(const String& name, const AbstractType& type);
  LocalVariable* MakeReceiverVariable(bool is_parameter);

  ParsedFunction* parsed_function_;
  Zone* zone_;
  LocalScope* scope_;
};

}  // namespace kernel
}  // namespace dart

#endif  // !defined(DART_PRECOMPILED_RUNTIME)
#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
