// Copyright (c) 2011, 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_RESOLVER_H_
#define RUNTIME_VM_RESOLVER_H_

#include "vm/allocation.h"

namespace dart {

// Forward declarations.
class Array;
class Class;
class Instance;
class Library;
class RawFunction;
class String;
class ArgumentsDescriptor;


// Resolver abstracts functionality needed to resolve dart functions at
// invocations.
class Resolver : public AllStatic {
 public:
  // Resolve specified dart instance function.
  static RawFunction* ResolveDynamic(const Instance& receiver,
                                     const String& function_name,
                                     const ArgumentsDescriptor& args_desc);

  // If 'allow_add' is true we may add a function to the class during lookup.
  static RawFunction* ResolveDynamicForReceiverClass(
      const Class& receiver_class,
      const String& function_name,
      const ArgumentsDescriptor& args_desc,
      bool allow_add = true);

  // If 'allow_add' is true we may add a function to the class during lookup.
  static RawFunction* ResolveDynamicAnyArgs(
      Zone* zone,
      const Class& receiver_class,
      const String& function_name,
      bool allow_add = true);

  // Resolve specified dart static function. If library.IsNull, use
  // either application library or core library if no application library
  // exists. Passing negative num_arguments means that the function
  // will be resolved by name only.
  // Otherwise null is returned if the number or names of arguments are not
  // valid for the resolved function.
  static RawFunction* ResolveStatic(const Library& library,
                                    const String& cls_name,
                                    const String& function_name,
                                    intptr_t num_arguments,
                                    const Array& argument_names);

  // Resolve specified dart static function with specified arity. Only resolves
  // public functions.
  static RawFunction* ResolveStatic(const Class&  cls,
                                    const String& function_name,
                                    intptr_t num_arguments,
                                    const Array& argument_names);

  // Resolve specified dart static function with specified arity. Resolves both
  // public and private functions.
  static RawFunction* ResolveStaticAllowPrivate(const Class&  cls,
                                                const String& function_name,
                                                intptr_t num_arguments,
                                                const Array& argument_names);
};

}  // namespace dart

#endif  // RUNTIME_VM_RESOLVER_H_
