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

library main;

import 'dart:io' show File, Process, exit;

List<String> listOfStrings = ["hello"];

int doitstat(int x) => x + 1;
int _privateToplevel(int x) => x + 1;

int globalVar = 6;
int _globalPrivate = 7;

class A<T> {
  const A();
  static int doit(int x) => x + 1;
  static int staticVar = 3;
  int doit_with_this(int x) => x + 1;

  final int _priv = 0;
  void _privMethod() {}
}

T id<T>(T x) => x;

class B extends A<Object> {
  int x;
  final int y = 7;
  int _priv;
  String get z {
    return "";
  }

  void set z(int _) {}
  void _privMethod() {}
}

class Bound {}

class HasPrivate {
  int _priv = 0;
}

class C<T extends Bound> extends HasPrivate {}

void hasBound<T extends Bound>() {}

Object k;

class D<T> {
  Y id<Y>(Y x) => x;
  m(List<T> l) {
    assert(l is List<T>);
  }

  foo() {
    List<T> s;
  }
}

abstract class Built<V extends Built<V, B>, B extends Builder<V, B>> {}

abstract class Builder<V extends Built<V, B>, B extends Builder<V, B>> {}

class MiddlewareApi<State extends Built<State, StateBuilder>,
    StateBuilder extends Builder<State, StateBuilder>> {}

main() {
  exit(0);
}
