Skip to content

Commit fc545a8

Browse files
authored
Fix capture conversion in lenient mode. (#197)
...by always performing capture conversion in _strict_ mode, where there is a better-defined hierarchy (non-null < unspecified < nullable, with no "but also unspecified < non-null if you want). Fixes #193
1 parent 3c80e50 commit fc545a8

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/main/java/com/google/jspecify/nullness/NullSpecAnnotatedTypeFactory.java

+8
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,14 @@ public boolean isParametricQualifier(AnnotationMirror qualifier) {
531531
}
532532
}
533533

534+
@Override
535+
public AnnotatedTypeMirror applyCaptureConversion(
536+
AnnotatedTypeMirror type, TypeMirror typeMirror) {
537+
return this == withLeastConvenientWorld
538+
? super.applyCaptureConversion(type, typeMirror)
539+
: withLeastConvenientWorld.applyCaptureConversion(type, typeMirror);
540+
}
541+
534542
@Override
535543
protected TypeHierarchy createTypeHierarchy() {
536544
return new NullSpecTypeHierarchy(

tests/regression/Issue197.java

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2024 The JSpecify Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
// Test case for Issue 197:
16+
// https://github.com/jspecify/jspecify-reference-checker/issues/197
17+
18+
import org.jspecify.annotations.NullMarked;
19+
import org.jspecify.annotations.Nullable;
20+
21+
class Issue197<E> {
22+
interface Function<A, B> {}
23+
24+
interface Super<E> {
25+
void i(Function<? super E, ? extends E> p);
26+
}
27+
28+
@NullMarked
29+
interface Sub<E extends @Nullable Object> extends Super<E> {
30+
@Override
31+
void i(Function<? super E, ? extends E> p);
32+
}
33+
}

0 commit comments

Comments
 (0)