class A {}

class B extends A {
  int get foo => 42;
}

main() {}
oracle<T>([T? t]) => true;
testForElement(
    dynamic dynVar,
    List<int> listInt,
    List<double> listDouble,
    int index,
    Map<String, int> mapStringInt,
    Map<String, double> mapStringDouble) {}
testForElementErrors(Map<int, int> map, List<int> list) async {}
testForElementErrorsNotAsync(Stream<int> stream) {}
testIfElement(dynamic dynVar, List<int> listInt, List<double> listDouble,
    Map<String, int> mapToInt, Map<String, double> mapToDouble) {}
testIfElementErrors(Map<int, int> map) {}
testPromotion(A a) {}
