// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// WARNING: Do not edit - generated code.

#include "{{dart_class}}.h"

{% for filename in cpp_includes %}
#include "{{filename}}"
{% endfor %}

namespace blink {

static void RefObject(DartWrappable* impl) {
  static_cast<{{cpp_class}}*>(impl)->ref();
}

static void DerefObject(DartWrappable* impl) {
  static_cast<{{cpp_class}}*>(impl)->deref();
}

static const DartWrapperInfo kDartWrapperInfo = {
  "{{interface_name}}",
  sizeof({{cpp_class}}),
  &RefObject,
  &DerefObject,
};

const DartWrapperInfo& {{cpp_class}}::dart_wrapper_info_ = kDartWrapperInfo;

namespace {{dart_class}}Internal {

{% from 'methods_cpp.template' import generate_constructor, generate_event_constructor, generate_method, method_callback, overload_resolution_method with context %}

{# Constructors #}
{% for constructor in constructors %}
{{generate_constructor(constructor, constructor.number_of_arguments)}}
{% endfor %}
{% block overloaded_constructor %}{% endblock %}
{% if named_constructor %}
{{generate_constructor(named_constructor, named_constructor.number_of_arguments)}}
{% endif %}
{% if has_event_constructor %}
{{generate_event_constructor()}}
{% endif %}

{# Attributes getters/setters. #}
{% from 'attributes_cpp.template' import attribute_getter, attribute_getter_callback,
       attribute_setter, attribute_setter_callback
   with context %}
{% for attribute in attributes %}
{% if not attribute.has_custom_getter %}
{{attribute_getter(cpp_class, attribute)}}
{% endif %}
{# FIXME I'm disabling put_forwards for now since we didn't support it before #}
{# https://code.google.com/p/dart/issues/detail?id=18784 #}
{# {% if not attribute.has_custom_setter and (not attribute.is_read_only or attribute.put_forwards) %}#}
{% if not attribute.has_custom_setter and not attribute.is_read_only %}
{{attribute_setter(cpp_class, attribute)}}
{% endif %}
{% endfor %}

{# Methods #}
{% for method in methods %}
  {% if not method.is_custom and not method.suppressed %}
{{generate_method(method, method.number_of_arguments)}}
  {% endif %}
  {% if method.overloads %}
{{overload_resolution_method(method)}}
  {% endif %}
{% endfor %}

  {% block named_property_getter %}{% endblock %}
  {% block named_property_setter %}{% endblock %}
  {% block indexed_property_getter %}{% endblock %}
}

Dart_NativeFunction {{dart_class}}::Resolver(Dart_Handle nameHandle, int argumentCount, bool* autoSetupScope)
{
    String name = StringFromDart(nameHandle);
    {% from 'methods_cpp.template' import generate_resolver_constructor with context %}
    {% from 'methods_cpp.template' import generate_resolver_event_constructor with context %}
    {# Resolver Constructors #}
    {% for constructor in constructors %}
{{generate_resolver_constructor(dart_class, interface_name, constructor) | indent(4)}}
    {% endfor %}
    {% from 'methods_cpp.template' import generate_resolver_custom_constructor with context %}
    {# Resolver Custom Constructors #}
    {% for constructor in custom_constructors %}
{{generate_resolver_constructor(dart_class, interface_name, constructor) | indent(4)}}
    {% endfor %}
    {% if named_constructor %}
{{generate_resolver_constructor(dart_class, interface_name, named_constructor) | indent(4)}}
    {% endif %}
    {% if has_event_constructor %}
{{generate_resolver_event_constructor(dart_class, interface_name) | indent(4)}}
    {% endif %}
    {# Resolver Attributes #}
    {% from 'attributes_cpp.template' import generate_attribute_resolver_body %}
    {% for attribute in attributes %}
{{generate_attribute_resolver_body(dart_class, interface_name, attribute) | indent(4)}}
    {% endfor %}
    {# Resolver Methods #}
    {% from 'methods_cpp.template' import generate_resolver_body with context %}
    {% for method in methods if not method.suppressed %}
{{generate_resolver_body(dart_class, interface_name, method) | indent(4)}}
    {% endfor %}
    {# Special operations (methods) #}
    {# TODO(terry): Only emit indexed getter for DataTransferItemList; emit for interfaces. #}
{% block indexed_property_getter_resolver %}{% endblock %}
{% block named_property_getter_resolver %}{% endblock %}
{% block named_property_setter_resolver %}{% endblock %}
    return 0;
}

const uint8_t* {{dart_class}}::Symbolizer(Dart_NativeFunction native_function)
{
    {% from 'methods_cpp.template' import generate_symbolizer_constructor with context %}
    {% for constructor in constructors %}
{{generate_symbolizer_constructor(dart_class, interface_name, constructor) | indent(4)}}
    {% endfor %}
    {% for constructor in custom_constructors %}
{{generate_symbolizer_constructor(dart_class, interface_name, constructor) | indent(4)}}
    {% endfor %}
    {% if named_constructor %}
{{generate_symbolizer_constructor(dart_class, interface_name, named_constructor) | indent(4)}}
    {% endif %}
    {% from 'attributes_cpp.template' import generate_attribute_symbolizer_body %}
    {% for attribute in attributes %}
{{generate_attribute_symbolizer_body(dart_class, interface_name, attribute) | indent(4)}}
    {% endfor %}
    {% from 'methods_cpp.template' import generate_symbolizer_body with context %}
    {% for method in methods if not method.suppressed %}
{{generate_symbolizer_body(dart_class, interface_name, method) | indent(4)}}
    {% endfor %}
{% block generate_symbolizer_named_property_getter %}{% endblock %}
{% block generate_symbolizer_named_property_setter %}{% endblock %}
{% block generate_symbolizer_indexed_property_getter %}{% endblock %}
    return 0;
}

}  // namespace blink
