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