// WARNING: This file is machine generated by fidlgen_dart.
// @dart = 2.12

library fidl_fidl_test_inheritancewithrecursivedecl_test;

import 'dart:async' as $async;
import 'dart:core' hide Error, Future, Match, Set, Stream, Type;
import 'dart:typed_data';

import 'package:fidl/fidl.dart' as $fidl;
import 'package:meta/meta.dart';
import 'package:zircon/zircon.dart' as $zircon;

import './fidl_async.dart';

// ignore_for_file: always_specify_types
// ignore_for_file: constant_identifier_names
// ignore_for_file: one_member_abstracts
// ignore_for_file: public_member_api_docs
// ignore_for_file: unused_import
// ignore_for_file: library_prefixes
// ignore_for_file: unused_shown_name

class Parent$TestBase extends Parent {
  @override
  $async.Future<void> first($fidl.InterfaceRequest<Parent> request) {
    return $async.Future.error(
        UnimplementedError(
            r'first not implemented on Parent test base. Please implement.'),
        StackTrace.current);
  }
}

class Child$TestBase extends Child {
  @override
  $async.Future<void> first($fidl.InterfaceRequest<Parent> request) {
    return $async.Future.error(
        UnimplementedError(
            r'first not implemented on Child test base. Please implement.'),
        StackTrace.current);
  }

  @override
  $async.Future<void> second($fidl.InterfaceRequest<Parent> request) {
    return $async.Future.error(
        UnimplementedError(
            r'second not implemented on Child test base. Please implement.'),
        StackTrace.current);
  }
}
