// 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(), StackTrace.current);
  }
}

class Child$TestBase extends Child {
  @override
  $async.Future<void> first($fidl.InterfaceRequest<Parent> request) {
    return $async.Future.error(UnimplementedError(), StackTrace.current);
  }

  @override
  $async.Future<void> second($fidl.InterfaceRequest<Parent> request) {
    return $async.Future.error(UnimplementedError(), StackTrace.current);
  }
}
