{% extends 'interface_base_cpp.template' %}


{# TODO(terry): Implement setter and deleter too #}


{##############################################################################}
{% block named_property_getter %}
{% if named_property_getter and not named_property_getter.is_custom %}
static void namedPropertyGetter(Dart_NativeArguments args)
{
    {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = GetReceiver<{{cpp_class}}>(args);
    Dart_Handle exception = nullptr;
    {
  {% if named_property_getter.is_raises_exception %}
        ExceptionState es;
  {% endif %}

        String name = DartConverter<String>::FromArguments(args, 1, exception);
        if (exception)
            goto fail;
        {{named_property_getter.cpp_type}} result = {{named_property_getter.cpp_value}};
        if (!result)
            return;
        {{named_property_getter.dart_set_return_value}};
        return;
    }

fail:
    Dart_ThrowException(exception);
    ASSERT_NOT_REACHED();
}

{% endif %}
{% endblock %}

{##############################################################################}
{% block named_property_setter %}
{% if named_property_setter and not named_property_setter.is_custom %}
static void namedPropertySetter(Dart_NativeArguments args)
{
    {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = GetReceiver<{{cpp_class}}>(args);
    Dart_Handle exception = nullptr;
    {
  {% if named_property_setter.is_raises_exception %}
        ExceptionState es;
  {% endif %}

        String name = DartConverter<String>::FromArguments(args, 1, exception);
        if (exception)
            goto fail;
        String value = DartConverter<String>::FromArgumentsWithNullCheck(args, 2, exception);
        if (exception)
            goto fail;
        {{named_property_setter.cpp_value}};
        return;
    }

fail:
    Dart_ThrowException(exception);
    ASSERT_NOT_REACHED();
}

{% endif %}
{% endblock %}

{##############################################################################}
{% block indexed_property_getter %}
{% if indexed_property_getter and not indexed_property_getter.is_custom %}
  {% set getter = indexed_property_getter %}
static void indexedPropertyGetter(Dart_NativeArguments args)
{
    {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = GetReceiver<{{cpp_class}}>(args);
    Dart_Handle exception = nullptr;
    {
  {% if indexed_property_getter.is_raises_exception %}
        ExceptionState es;
  {% endif %}

        {# TODO(terry): Assume index is unsigned long, which all currently are. #}
        unsigned index = DartConverter<unsigned>::FromArguments(args, 1, exception);
        if (exception)
            goto fail;
        {{indexed_property_getter.cpp_type}} result = {{indexed_property_getter.cpp_value}};
        if (!result)
            return;
        {{indexed_property_getter.dart_set_return_value}};

        return;
    }

fail:
    Dart_ThrowException(exception);
    ASSERT_NOT_REACHED();
}

{% endif %}
{# TODO(terry): Should handle custom index getter - none today. #}
{% endblock %}

{##############################################################################}
{% block indexed_property_getter_resolver %}
    {# TODO(terry): Support all indexed and named properties today only indexed getter is supported. #}
    {# Resolver indexed properties #}
    {% if indexed_property_getter and not indexed_property_getter.is_custom %}
      {% for native_entry in indexed_property_getter.native_entries %}
        {% set resolver_string = native_entry.resolver_string %}
if (argumentCount == 2 && name == "{{resolver_string}}") {
    *autoSetupScope = true;
    return {{dart_class}}Internal::indexedPropertyGetter;
}
      {% endfor %}
    {% endif %}
{% endblock %}

{##############################################################################}
{% block named_property_getter_resolver %}
    {# Resolver named properties #}
    {% if named_property_getter and not named_property_getter.is_custom %}
      {% for native_entry in named_property_getter.native_entries %}
        {% set resolver_string = native_entry.resolver_string %}
if (argumentCount == 2 && (name == "{{resolver_string}}")) {
    *autoSetupScope = true;
    return {{dart_class}}Internal::namedPropertyGetter;
}
      {% endfor %}
    {% endif %}
{% endblock %}

{##############################################################################}
{% block named_property_setter_resolver %}
    {# Resolver named properties #}
    {% if named_property_setter and not named_property_setter.is_custom %}
      {% for native_entry in named_property_setter.native_entries %}
        {% set resolver_string = native_entry.resolver_string %}
if (argumentCount == 3 && (name == "{{resolver_string}}")) {
    *autoSetupScope = true;
    return {{dart_class}}Internal::namedPropertySetter;
}
      {% endfor %}
    {% endif %}
{% endblock %}

{##############################################################################}
{% block generate_symbolizer_indexed_property_getter %}
    {% if indexed_property_getter and not indexed_property_getter.is_custom %}
      {% for native_entry in indexed_property_getter.native_entries %}
        {% set resolver_string = native_entry.resolver_string %}
if (native_function == {{dart_class}}Internal::indexedPropertyGetter) {
    return reinterpret_cast<const uint8_t*>("{{resolver_string}}");
}
      {% endfor %}
    {% endif %}
{% endblock %}

{##############################################################################}
{% block generate_symbolizer_named_property_getter %}
    {% if named_property_getter %}
      {% for native_entry in named_property_getter.native_entries %}
        {% set resolver_string = native_entry.resolver_string %}
if (native_function == {{dart_class}}Internal::namedPropertyGetter) {
    return reinterpret_cast<const uint8_t*>("{{resolver_string}}");
}
      {% endfor %}
    {% endif %}
{% endblock %}

{##############################################################################}
{% block generate_symbolizer_named_property_setter %}
    {% if named_property_setter %}
      {% for native_entry in named_property_setter.native_entries %}
        {% set resolver_string = native_entry.resolver_string %}
if (native_function == {{dart_class}}Internal::namedPropertySetter) {
    return reinterpret_cast<const uint8_t*>("{{resolver_string}}");
}
      {% endfor %}
    {% endif %}
{% endblock %}

{##############################################################################}

{% from 'methods_cpp.template' import static_method_name with context %}

{##############################################################################}
{% block overloaded_constructor %}
{% if constructor_overloads %}
static void constructorCallbackDispatcher(Dart_NativeArguments args)
{
    Dart_Handle exception = nullptr;
    const int argOffset = 0;
    int argCount = Dart_GetNativeArgumentCount(args) + argOffset;
    {# 2. Initialize argcount to be min(maxarg, n). #}
    switch (std::min({{constructor_overloads.maxarg}}, argCount)) {
    {# 3. Remove from S all entries whose type list is not of length argcount. #}
    {% for length, tests_constructors in constructor_overloads.length_tests_methods %}
    case {{length}}:
        {# Then resolve by testing argument #}
        {% for test, constructor in tests_constructors %}
        {# 10. If i = d, then: #}
        if ({{test}}) {
          {% if constructor.is_custom %}
            {{static_method_name(constructor.name)}}(args);
          {% else %}
            {{static_method_name(constructor.name, constructor.overload_index)}}(args);
          {% endif %}
            return;
        }
        {% endfor %}
        break;
    {% endfor %}
    default:
        {# Invalid arity, throw error #}
        {# Report full list of valid arities if gaps and above minimum #}
        {% if constructor_overloads.valid_arities %}
        if (argCount >= {{overloads.minarg}}) {
            const String message = "Wrong arity, expected one of {{constructor_overloads.valid_arities}}";
            // TODO(dart): exception = DartUtilities::coreArgumentErrorException(message);
            goto fail;
        }
        {% endif %}
        {# Otherwise just report "not enough arguments" #}
        {
            const String message = "Not enough arguments (at least {{constructor_overloads.minarg}} required)";
            // TODO(dart): exception = DartUtilities::coreArgumentErrorException(message);
            goto fail;
        }
        return;
    }
    {# No match, throw error #}
    {
        const String message = "No matching constructor signature.";
        // TODO(dart): exception = DartUtilities::coreArgumentErrorException(message);
        goto fail;
    }
    return;
fail:
    Dart_ThrowException(exception);
    ASSERT_NOT_REACHED();
}
{% endif %}
{% endblock %}


{##############################################################################}
