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