// Test that certain unevaluated constant expression arguments that are
// deemed too verbose or complex and that may leak private or
// `doc(hidden)` struct fields are not displayed in the documentation.
//
// Read the documentation of `rustdoc::clean::utils::print_const_expr`
// for further details.
#![feature(const_trait_impl, generic_const_exprs, adt_const_params, generic_const_items)]
#![allow(incomplete_features)]

use std::marker::ConstParamTy;

//@ has hide_complex_unevaluated_const_arguments/trait.Stage.html
pub trait Stage {
    // A helper constant that prevents const expressions containing it
    // from getting fully evaluated since it doesn't have a body and
    // thus is non-reducible. This allows us to specifically test the
    // pretty-printing of *unevaluated* consts.
    const ABSTRACT: usize;

    // Currently considered "overly complex" by the `generic_const_exprs`
    // feature. If / once this expression kind gets supported, this
    // unevaluated const expression could leak the private struct field.
    //
    // FIXME: Once the line below compiles, make this a test that
    //        ensures that the private field is not printed.
    //
    //const ARRAY0: [u8; Struct { private: () } + Self::ABSTRACT];

    // This assoc. const could leak the private assoc. function `Struct::new`.
    // Ensure that this does not happen.
    //
    //@ has - '//*[@id="associatedconstant.ARRAY1"]' \
    //        'const ARRAY1: [u8; { _ }]'
    const ARRAY1: [u8; Struct::new(/* ... */).do_something(Self::ABSTRACT * 1_000)]
        where [(); Struct::new(/* ... */).do_something(Self::ABSTRACT * 1_000)]:;

    //@ has - '//*[@id="associatedconstant.VERBOSE"]' \
    //        'const VERBOSE: [u16; { _ }]'
    const VERBOSE: [u16; compute("thing", 9 + 9) * Self::ABSTRACT]
        where [(); compute("thing", 9 + 9) * Self::ABSTRACT]:;

    // Check that we do not leak the private struct field contained within
    // the path. The output could definitely be improved upon
    // (e.g. printing sth. akin to `<Self as Helper<{ _ }>>::OUT`) but
    // right now “safe is safe”.
    //
    //@ has - '//*[@id="associatedconstant.PATH"]' \
    //        'const PATH: usize = _'
    const PATH: usize = <Self as Helper<{ Struct { private: () } }>>::OUT;
}

const fn compute(input: &str, extra: usize) -> usize {
    input.len() + extra
}

pub trait Helper<const S: Struct> {
    const OUT: usize;
}

impl<const S: Struct, St: Stage + ?Sized> Helper<S> for St {
    const OUT: usize = St::ABSTRACT;
}

// Currently in rustdoc, const arguments are not evaluated in this position
// and therefore they fall under the realm of `print_const_expr`.
// If rustdoc gets patched to evaluate const arguments, it is fine to replace
// this test as long as one can ensure that private fields are not leaked!
//
//@ has hide_complex_unevaluated_const_arguments/trait.Sub.html \
//      '//pre[@class="rust item-decl"]' \
//      'pub trait Sub: Sup<{ _ }, { _ }> { }'
pub trait Sub: Sup<{ 90 * 20 * 4 }, { Struct { private: () } }> {}

pub trait Sup<const N: usize, const S: Struct> {}

#[derive(ConstParamTy, PartialEq, Eq)]
pub struct Struct { private: () }

impl Struct {
    const fn new() -> Self { Self { private: () } }
    const fn do_something(self, x: usize) -> usize {
        x
    }
}
/* FIXME(const-trait): readd this
impl const std::ops::Add<usize> for Struct {
    type Output = usize;

    fn add(self, _: usize) -> usize { 0 }
}
*/
