/* * Copyright 2020 The JSpecify Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import org.jspecify.annotations.NullnessUnspecified; /* * Warning: I have probably gotten some things wrong in adding jspecify_* comments in this file. * (Now, that may be the case for *any* file :) But it is particularly likely in this one.) * Additionally, some checks would probably have different results under slightly different * implementations of type inference and/or if we passed explicit type arguments. Fortunately, most * of the checks here are for edge cases that are unlikely to arise in practice. */ @NullMarked class ComplexParametric { interface SuperSuper { Lib t(); Lib<@NullnessUnspecified T> tUnspec(); Lib<@Nullable T> tUnionNull(); void checkT(Lib lib); void checkTUnspec(Lib<@NullnessUnspecified T> lib); void checkTUnionNull(Lib<@Nullable T> lib); // And some method that do not use T: void checkNeverNull(Lib lib); void checkUnspecNull(Lib<@NullnessUnspecified U> lib); } interface SuperNeverNever extends SuperSuper { default void x() { checkNeverNull(t()); // jspecify_nullness_not_enough_information checkUnspecNull(t()); checkT(t()); // jspecify_nullness_not_enough_information checkTUnspec(t()); // jspecify_nullness_mismatch checkTUnionNull(t()); // jspecify_nullness_not_enough_information checkNeverNull(tUnspec()); // jspecify_nullness_not_enough_information checkUnspecNull(tUnspec()); // jspecify_nullness_not_enough_information checkT(tUnspec()); // jspecify_nullness_not_enough_information checkTUnspec(tUnspec()); // jspecify_nullness_not_enough_information checkTUnionNull(tUnspec()); // jspecify_nullness_mismatch checkNeverNull(tUnionNull()); // jspecify_nullness_not_enough_information this.checkUnspecNull(tUnionNull()); // jspecify_nullness_mismatch checkT(tUnionNull()); // jspecify_nullness_not_enough_information checkTUnspec(tUnionNull()); checkTUnionNull(tUnionNull()); } } interface SuperNeverUnspec extends SuperSuper { default void x() { checkNeverNull(t()); // jspecify_nullness_not_enough_information checkUnspecNull(t()); checkT(t()); // jspecify_nullness_not_enough_information checkTUnspec(t()); // jspecify_nullness_mismatch checkTUnionNull(t()); // jspecify_nullness_not_enough_information checkNeverNull(tUnspec()); // jspecify_nullness_not_enough_information checkUnspecNull(tUnspec()); // jspecify_nullness_not_enough_information checkT(tUnspec()); // jspecify_nullness_not_enough_information checkTUnspec(tUnspec()); // jspecify_nullness_not_enough_information checkTUnionNull(tUnspec()); // jspecify_nullness_mismatch checkNeverNull(tUnionNull()); // jspecify_nullness_not_enough_information this.checkUnspecNull(tUnionNull()); // jspecify_nullness_mismatch checkT(tUnionNull()); // jspecify_nullness_not_enough_information checkTUnspec(tUnionNull()); checkTUnionNull(tUnionNull()); } } interface SuperNeverUnionNull extends SuperSuper { default void x() { checkNeverNull(t()); // jspecify_nullness_not_enough_information checkUnspecNull(t()); checkT(t()); // jspecify_nullness_not_enough_information checkTUnspec(t()); // jspecify_nullness_mismatch checkTUnionNull(t()); // jspecify_nullness_not_enough_information checkNeverNull(tUnspec()); // jspecify_nullness_not_enough_information checkUnspecNull(tUnspec()); // jspecify_nullness_not_enough_information checkT(tUnspec()); // jspecify_nullness_not_enough_information checkTUnspec(tUnspec()); // jspecify_nullness_not_enough_information checkTUnionNull(tUnspec()); // jspecify_nullness_mismatch checkNeverNull(tUnionNull()); // jspecify_nullness_not_enough_information this.checkUnspecNull(tUnionNull()); // jspecify_nullness_mismatch checkT(tUnionNull()); // jspecify_nullness_not_enough_information checkTUnspec(tUnionNull()); checkTUnionNull(tUnionNull()); } } interface SuperUnspecNever extends SuperSuper { default void x() { checkNeverNull(t()); // jspecify_nullness_not_enough_information checkUnspecNull(t()); checkT(t()); // jspecify_nullness_not_enough_information checkTUnspec(t()); // jspecify_nullness_mismatch checkTUnionNull(t()); // jspecify_nullness_not_enough_information checkNeverNull(tUnspec()); // jspecify_nullness_not_enough_information checkUnspecNull(tUnspec()); // jspecify_nullness_not_enough_information checkT(tUnspec()); // jspecify_nullness_not_enough_information checkTUnspec(tUnspec()); // jspecify_nullness_not_enough_information checkTUnionNull(tUnspec()); // jspecify_nullness_mismatch checkNeverNull(tUnionNull()); // jspecify_nullness_not_enough_information this.checkUnspecNull(tUnionNull()); // jspecify_nullness_mismatch checkT(tUnionNull()); // jspecify_nullness_not_enough_information checkTUnspec(tUnionNull()); checkTUnionNull(tUnionNull()); } } interface SuperUnspecUnspec extends SuperSuper { // TODO(cpovirk): Add method calls like in the other classes. } interface SuperUnspecUnionNull extends SuperSuper { // TODO(cpovirk): Add method calls like in the other classes. } interface SuperUnionNullNever extends SuperSuper { default void x() { checkNeverNull(t()); // jspecify_nullness_not_enough_information checkUnspecNull(t()); checkT(t()); // jspecify_nullness_not_enough_information checkTUnspec(t()); // jspecify_nullness_mismatch checkTUnionNull(t()); // jspecify_nullness_not_enough_information checkNeverNull(tUnspec()); // jspecify_nullness_not_enough_information checkUnspecNull(tUnspec()); // jspecify_nullness_not_enough_information checkT(tUnspec()); // jspecify_nullness_not_enough_information checkTUnspec(tUnspec()); // jspecify_nullness_not_enough_information checkTUnionNull(tUnspec()); // jspecify_nullness_mismatch checkNeverNull(tUnionNull()); // jspecify_nullness_not_enough_information this.checkUnspecNull(tUnionNull()); // jspecify_nullness_mismatch checkT(tUnionNull()); // jspecify_nullness_not_enough_information checkTUnspec(tUnionNull()); checkTUnionNull(tUnionNull()); } } interface SuperUnionNullUnspec extends SuperSuper { // TODO(cpovirk): Add method calls like in the other classes. } interface SuperUnionNullUnionNull extends SuperSuper { default void x() { // jspecify_nullness_mismatch checkNeverNull(t()); // jspecify_nullness_mismatch checkUnspecNull(t()); checkT(t()); // jspecify_nullness_not_enough_information checkTUnspec(t()); // jspecify_nullness_mismatch checkTUnionNull(t()); // jspecify_nullness_mismatch checkNeverNull(tUnspec()); // jspecify_nullness_not_enough_information checkUnspecNull(tUnspec()); // jspecify_nullness_not_enough_information checkT(tUnspec()); // jspecify_nullness_not_enough_information checkTUnspec(tUnspec()); // jspecify_nullness_not_enough_information checkTUnionNull(tUnspec()); // jspecify_nullness_mismatch checkNeverNull(tUnionNull()); // jspecify_nullness_not_enough_information this.checkUnspecNull(tUnionNull()); // jspecify_nullness_mismatch checkT(tUnionNull()); // jspecify_nullness_not_enough_information checkTUnspec(tUnionNull()); checkTUnionNull(tUnionNull()); } } interface Foo {} interface Lib {} }