//start line index in expected file is 2
package com.puppycrawl.tools.checkstyle.grammar;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
import java.util.List;
import java.util.function.IntBinaryOperator;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class InputRegressionJava8Class1 {
    static class Inner1 { static class Inner2<V> { public void m() {} } }
    static class Inner3<T> { public void m() {} }

    public void m() {}
    public static void sm() {}
    void m1() throws @Nullable Exception {}
    public static <T> void m2(T @Nullable [] array) {}
    public void m3() throws NullPointerException, @Nullable ArrayIndexOutOfBoundsException {}
    public void m4(InputRegressionJava8Class1 this) {}
    public void m5(@Nullable InputRegressionJava8Class1 this) {}

    {
        List<String> vlist = new ArrayList<String>();
    }

    public void instructions() {
        // used to let inputs compile
        boolean b = Math.random() > 0;

        int vint;
        Object o = null;
        List<String> vlist;
        vlist = new ArrayList<String>();
        Supplier<?> s;

        // annotations
        Map.@Nullable Entry e;
        String str = (@Nullable String) "";
        (new Inner3()).<@Nullable String>m();

        // method reference
        IntBinaryOperator ibo = Math::max;
        s = InputRegressionJava8Class1::new;
        s = Inner1.Inner2<String>::new;

        // lambda
        Runnable r1 = () -> m();
        Runnable r2 = () -> { m(); } ;
        Collections.sort(vlist, (l,  r) -> l == r ? 0 : 1);
        Predicate<?> t = (b) ? null : object -> o.equals(object);
        Double mPi = Math.PI;
    }

    static final Comparator<?> f = (Comparator<?>) (dateTime1, dateTime2) -> { return 0; };

    private class Inner {
        public Inner(InputRegressionJava8Class1 InputRegressionJava8Class1.this) {}
    }
}
;
class InputRegressionJava8TypeParam <@Nullable T> {
}
@Retention(RetentionPolicy.CLASS)
@Target({ ElementType.TYPE_USE })
@interface Nullable {
}
