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

// SharedOptions=--enable-experiment=constructor-tearoffs

// Test the support for generic function instantiation with constant and
// potentially constant expressions. Include both some explicit generic
// function instantiations, and some implicit ones (for the latter, the type
// arguments are derived by type inference based on the context type). The
// main goal is to test the new feature where the underlying function is
// given as an existing function object, which also implies that there are
// several new possible syntactic forms, e.g., `(b ? f1 : f2)<int>`.

import 'instantiated_function_constant_test.dart' as prefix;

void f1<X extends num>(X x, [num n = 0, List<X> xList = const []]) {}
void f2<Y extends num>(Y y, [int i = 1, Map<Y, Y> yMap = const {}]) {}

const b = true;

const c01 = f1;
const c02 = f2;

// Explicitly instantiate function declaration.
const c03 = f1<int>;
const c04 = prefix.f2<int>;
const c05 = prefix.f1<int>;
const c06 = f2<int>;

// Explicitly instantiate constant variable.
const c07 = prefix.c01<int>;
const c08 = c02<int>;
const c09 = c01<int>;
const c10 = prefix.c02<int>;

// Implicitly instantiate function declaration.
const void Function(double) c11 = f1;
const void Function(Never, [int, Map<int, int>]) c12 = prefix.f2;

// Implicitly instantiate constant variable.
const void Function(double) c13 = prefix.c01;
const void Function(Never, [int, Map<int, int>]) c14 = c02;

// Test new potentially constant expressions. A type variable is a potentially
// constant type expression, so there are no errors in the initializer list.
class A<U extends num> {
  final x1, x2, x3, x4, x5, x6;
  final void Function(U) x7;
  final void Function(U) x8;
  final void Function(U, [int, Map<num, Never>]) x9;
  final void Function(U) x10;
  final void Function(num) x11;
  final void Function(double) x12;
  final void Function(num, [int, Map<num, Never>]) x13;
  final void Function(int) x14;

  const A(bool b)
      : x1 = b ? (b ? f1 : prefix.f2)<U> : (b ? f1 : prefix.f2)<int>,
        x2 = b ? (b ? prefix.c01 : c02)<U> : (b ? prefix.c01 : c02)<int>,
        x3 = b ? ((b ? prefix.f1 : f2))<U> : ((b ? prefix.f1 : f2))<int>,
        x4 = b ? ((b ? c01 : prefix.c02))<U> : ((b ? c01 : prefix.c02))<int>,
        x5 = b ? (null ?? f1)<U> : (null ?? f1)<int>,
        x6 = b
            ? ((c01 as dynamic) as void Function<X extends num>(X,
                [num, List<X>]))<U>
            : ((c01 as dynamic) as void Function<X extends num>(X,
                [num, List<X>]))<int>,
        x7 = b ? f1 : f2,
        x8 = b ? c01 : c02,
        x9 = null ?? c02,
        x10 =
            (c01 as dynamic) as void Function<X extends num>(X, [int, List<X>]),
        x11 = b ? f1 : f2,
        x12 = b ? c01 : c02,
        x13 = null ?? c02,
        x14 =
            (c01 as dynamic) as void Function<X extends num>(X, [int, List<X>]);
}

void main() {
  const ff = false;
  const A<double>(true);
  const A<num>(ff);
}
