1*2167191dSAndroid Build Coastguard Worker /*
2*2167191dSAndroid Build Coastguard Worker  * Copyright 2020 The JSpecify Authors.
3*2167191dSAndroid Build Coastguard Worker  *
4*2167191dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*2167191dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*2167191dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*2167191dSAndroid Build Coastguard Worker  *
8*2167191dSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*2167191dSAndroid Build Coastguard Worker  *
10*2167191dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*2167191dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*2167191dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*2167191dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*2167191dSAndroid Build Coastguard Worker  * limitations under the License.
15*2167191dSAndroid Build Coastguard Worker  */
16*2167191dSAndroid Build Coastguard Worker package annotatedboundsofwildcard;
17*2167191dSAndroid Build Coastguard Worker 
18*2167191dSAndroid Build Coastguard Worker import org.jspecify.annotations.NullMarked;
19*2167191dSAndroid Build Coastguard Worker import org.jspecify.annotations.Nullable;
20*2167191dSAndroid Build Coastguard Worker import org.jspecify.annotations.NullnessUnspecified;
21*2167191dSAndroid Build Coastguard Worker 
22*2167191dSAndroid Build Coastguard Worker @NullMarked
23*2167191dSAndroid Build Coastguard Worker public class AnnotatedBoundsOfWildcard {
superAsIs( Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a)24*2167191dSAndroid Build Coastguard Worker   public void superAsIs(
25*2167191dSAndroid Build Coastguard Worker       // jspecify_nullness_not_enough_information
26*2167191dSAndroid Build Coastguard Worker       Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a) {}
27*2167191dSAndroid Build Coastguard Worker 
superNotNull(Test<? super Base, ? super Base, ? super Base> a)28*2167191dSAndroid Build Coastguard Worker   public void superNotNull(Test<? super Base, ? super Base, ? super Base> a) {}
29*2167191dSAndroid Build Coastguard Worker 
superNullable( Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a)30*2167191dSAndroid Build Coastguard Worker   public void superNullable(
31*2167191dSAndroid Build Coastguard Worker       // jspecify_nullness_not_enough_information
32*2167191dSAndroid Build Coastguard Worker       Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {}
33*2167191dSAndroid Build Coastguard Worker 
extendsAsIs( Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a)34*2167191dSAndroid Build Coastguard Worker   public void extendsAsIs(
35*2167191dSAndroid Build Coastguard Worker       Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a) {}
36*2167191dSAndroid Build Coastguard Worker 
extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a)37*2167191dSAndroid Build Coastguard Worker   public void extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a) {}
38*2167191dSAndroid Build Coastguard Worker 
extendsNullable( Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a)39*2167191dSAndroid Build Coastguard Worker   public void extendsNullable(
40*2167191dSAndroid Build Coastguard Worker       Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {}
41*2167191dSAndroid Build Coastguard Worker 
noBounds( Test< ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object> a)42*2167191dSAndroid Build Coastguard Worker   public void noBounds(
43*2167191dSAndroid Build Coastguard Worker       Test<
44*2167191dSAndroid Build Coastguard Worker               ? extends @NullnessUnspecified Object,
45*2167191dSAndroid Build Coastguard Worker               ? extends @NullnessUnspecified Object,
46*2167191dSAndroid Build Coastguard Worker               ? extends @NullnessUnspecified Object>
47*2167191dSAndroid Build Coastguard Worker           a) {}
48*2167191dSAndroid Build Coastguard Worker }
49*2167191dSAndroid Build Coastguard Worker 
50*2167191dSAndroid Build Coastguard Worker class Base {}
51*2167191dSAndroid Build Coastguard Worker 
52*2167191dSAndroid Build Coastguard Worker class Derived extends Base {}
53*2167191dSAndroid Build Coastguard Worker 
54*2167191dSAndroid Build Coastguard Worker @NullMarked
55*2167191dSAndroid Build Coastguard Worker class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
56*2167191dSAndroid Build Coastguard Worker 
57*2167191dSAndroid Build Coastguard Worker @NullMarked
58*2167191dSAndroid Build Coastguard Worker class Use {
main( Test<Derived, Derived, Derived> aNotNullNotNullNotNull, Test<Derived, Derived, @Nullable Derived> aNotNullNotNullNull, Test<Derived, @Nullable Derived, Derived> aNotNullNullNotNull, Test<Derived, @Nullable Derived, @Nullable Derived> aNotNullNullNull, Test<Object, Object, Object> aObjectNotNullNotNullNotNull, Test<Object, Object, @Nullable Object> aObjectNotNullNotNullNull, Test<Object, @Nullable Object, Object> aObjectNotNullNullNotNull, Test<Object, @Nullable Object, @Nullable Object> aObjectNotNullNullNull, AnnotatedBoundsOfWildcard b)59*2167191dSAndroid Build Coastguard Worker   public void main(
60*2167191dSAndroid Build Coastguard Worker       Test<Derived, Derived, Derived> aNotNullNotNullNotNull,
61*2167191dSAndroid Build Coastguard Worker       // jspecify_nullness_not_enough_information
62*2167191dSAndroid Build Coastguard Worker       Test<Derived, Derived, @Nullable Derived> aNotNullNotNullNull,
63*2167191dSAndroid Build Coastguard Worker       Test<Derived, @Nullable Derived, Derived> aNotNullNullNotNull,
64*2167191dSAndroid Build Coastguard Worker       // jspecify_nullness_not_enough_information
65*2167191dSAndroid Build Coastguard Worker       Test<Derived, @Nullable Derived, @Nullable Derived> aNotNullNullNull,
66*2167191dSAndroid Build Coastguard Worker       //
67*2167191dSAndroid Build Coastguard Worker       Test<Object, Object, Object> aObjectNotNullNotNullNotNull,
68*2167191dSAndroid Build Coastguard Worker       // jspecify_nullness_not_enough_information
69*2167191dSAndroid Build Coastguard Worker       Test<Object, Object, @Nullable Object> aObjectNotNullNotNullNull,
70*2167191dSAndroid Build Coastguard Worker       Test<Object, @Nullable Object, Object> aObjectNotNullNullNotNull,
71*2167191dSAndroid Build Coastguard Worker       // jspecify_nullness_not_enough_information
72*2167191dSAndroid Build Coastguard Worker       Test<Object, @Nullable Object, @Nullable Object> aObjectNotNullNullNull,
73*2167191dSAndroid Build Coastguard Worker       //
74*2167191dSAndroid Build Coastguard Worker       AnnotatedBoundsOfWildcard b) {
75*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
76*2167191dSAndroid Build Coastguard Worker     b.superAsIs(aObjectNotNullNotNullNotNull);
77*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
78*2167191dSAndroid Build Coastguard Worker     b.superAsIs(aObjectNotNullNotNullNull);
79*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_not_enough_information
80*2167191dSAndroid Build Coastguard Worker     b.superAsIs(aObjectNotNullNullNotNull);
81*2167191dSAndroid Build Coastguard Worker     b.superAsIs(aObjectNotNullNullNull);
82*2167191dSAndroid Build Coastguard Worker 
83*2167191dSAndroid Build Coastguard Worker     b.superNotNull(aObjectNotNullNotNullNotNull);
84*2167191dSAndroid Build Coastguard Worker     b.superNotNull(aObjectNotNullNotNullNull);
85*2167191dSAndroid Build Coastguard Worker     b.superNotNull(aObjectNotNullNullNotNull);
86*2167191dSAndroid Build Coastguard Worker     b.superNotNull(aObjectNotNullNullNull);
87*2167191dSAndroid Build Coastguard Worker 
88*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
89*2167191dSAndroid Build Coastguard Worker     b.superNullable(aObjectNotNullNotNullNotNull);
90*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
91*2167191dSAndroid Build Coastguard Worker     b.superNullable(aObjectNotNullNotNullNull);
92*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
93*2167191dSAndroid Build Coastguard Worker     b.superNullable(aObjectNotNullNullNotNull);
94*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
95*2167191dSAndroid Build Coastguard Worker     b.superNullable(aObjectNotNullNullNull);
96*2167191dSAndroid Build Coastguard Worker 
97*2167191dSAndroid Build Coastguard Worker     b.extendsAsIs(aNotNullNotNullNotNull);
98*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_not_enough_information
99*2167191dSAndroid Build Coastguard Worker     b.extendsAsIs(aNotNullNotNullNull);
100*2167191dSAndroid Build Coastguard Worker     b.extendsAsIs(aNotNullNullNotNull);
101*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_not_enough_information
102*2167191dSAndroid Build Coastguard Worker     b.extendsAsIs(aNotNullNullNull);
103*2167191dSAndroid Build Coastguard Worker 
104*2167191dSAndroid Build Coastguard Worker     b.extendsNotNull(aNotNullNotNullNotNull);
105*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
106*2167191dSAndroid Build Coastguard Worker     b.extendsNotNull(aNotNullNotNullNull);
107*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
108*2167191dSAndroid Build Coastguard Worker     b.extendsNotNull(aNotNullNullNotNull);
109*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_mismatch
110*2167191dSAndroid Build Coastguard Worker     b.extendsNotNull(aNotNullNullNull);
111*2167191dSAndroid Build Coastguard Worker 
112*2167191dSAndroid Build Coastguard Worker     b.extendsNullable(aNotNullNotNullNotNull);
113*2167191dSAndroid Build Coastguard Worker     b.extendsNullable(aNotNullNotNullNull);
114*2167191dSAndroid Build Coastguard Worker     b.extendsNullable(aNotNullNullNotNull);
115*2167191dSAndroid Build Coastguard Worker     b.extendsNullable(aNotNullNullNull);
116*2167191dSAndroid Build Coastguard Worker 
117*2167191dSAndroid Build Coastguard Worker     b.noBounds(aNotNullNotNullNotNull);
118*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_not_enough_information
119*2167191dSAndroid Build Coastguard Worker     b.noBounds(aNotNullNotNullNull);
120*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_not_enough_information
121*2167191dSAndroid Build Coastguard Worker     b.noBounds(aNotNullNullNotNull);
122*2167191dSAndroid Build Coastguard Worker     // jspecify_nullness_not_enough_information
123*2167191dSAndroid Build Coastguard Worker     b.noBounds(aNotNullNullNull);
124*2167191dSAndroid Build Coastguard Worker   }
125*2167191dSAndroid Build Coastguard Worker }
126