// Copyright (c) 2016, 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.

// @dart = 2.9

class _RenderTabBar extends RenderBox
    with
        ContainerRenderObjectMixin<RenderBox, _TabBarParentData>,
        RenderBoxContainerDefaultsMixin<RenderBox, _TabBarParentData> {}

class RenderObject {}

class RenderSector extends RenderObject {}

class RenderBox extends RenderObject {}

class ParentData {}

class BoxParentData extends ParentData {}

class SectorParentData extends ParentData {}

class ContainerParentDataMixin<ChildType extends RenderObject> {}

class ContainerRenderObjectMixin<ChildType extends RenderObject,
    ParentDataType extends ContainerParentDataMixin<ChildType>> {}

class SectorChildListParentData extends SectorParentData
    with ContainerParentDataMixin<RenderSector> {}

class RenderDecoratedSector extends RenderSector {}

class RenderSectorWithChildren extends RenderDecoratedSector
    with ContainerRenderObjectMixin<RenderSector, SectorChildListParentData> {}

class ContainerBoxParentDataMixin<ChildType extends RenderObject>
    extends BoxParentData with ContainerParentDataMixin<ChildType> {}

class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox,
        ParentDataType extends ContainerBoxParentDataMixin<ChildType>>
    implements ContainerRenderObjectMixin<ChildType, ParentDataType> {}

class FlexParentData extends ContainerBoxParentDataMixin<RenderBox> {}

class _TabBarParentData extends ContainerBoxParentDataMixin<RenderBox> {}

main() {
  new _RenderTabBar();
}
