// 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 VM_RESOLVER_H_
#define VM_RESOLVER_H_

#include "vm/allocation.h"

namespace dart {

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


// 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,
                                     int num_arguments,
                                     int num_named_arguments);

  static RawFunction* ResolveDynamicForReceiverClass(
      const Class& receiver_class,
      const String& function_name,
      int num_arguments,
      int num_named_arguments);

  static RawFunction* ResolveDynamicAnyArgs(
      const Class& receiver_class,
      const String& function_name);

  enum StaticResolveType {
    kIsQualified,
    kNotQualified
  };

  // 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,
                                    int num_arguments,
                                    const Array& argument_names,
                                    StaticResolveType resolve_type);

  // Resolve specified dart static function.
  static RawFunction* ResolveStaticByName(const Class&  cls,
                                          const String& function_name,
                                          StaticResolveType resolve_type);

  // Resolve specified dart static function with specified arity.
  static RawFunction* ResolveStatic(const Class&  cls,
                                    const String& function_name,
                                    int num_arguments,
                                    const Array& argument_names,
                                    StaticResolveType resolve_type);
};

}  // namespace dart

#endif  // VM_RESOLVER_H_
