Skip to content

Commit 5b642c3

Browse files
authored
Merge branch 'typetools:master' into bugfix/wpi-loop-unknowninitialization
2 parents 33c82a6 + e3a0b54 commit 5b642c3

File tree

6 files changed

+59
-22
lines changed

6 files changed

+59
-22
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ ext {
5555
versions = [
5656
autoValue : '1.11.0',
5757
googleJavaFormat : '1.19.2',
58-
lombok : '1.18.32',
58+
lombok : '1.18.34',
5959
hashmapUtil : '0.0.1',
6060
reflectionUtil : '1.1.3',
6161
plumeUtil : '1.9.3',

framework/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ configurations {
3131
dependencies {
3232
api project(':javacutil')
3333
api project(':dataflow')
34-
api 'org.checkerframework:stubparser:3.25.10'
34+
api 'org.checkerframework:stubparser:3.26.1'
3535
// AFU is an "includedBuild" imported in checker-framework/settings.gradle, so the version number doesn't matter.
3636
// https://docs.gradle.org/current/userguide/composite_builds.html#settings_defined_composite
3737
api('org.checkerframework:annotation-file-utilities:*') {

framework/src/main/java/org/checkerframework/framework/ajava/InsertAjavaAnnotations.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package org.checkerframework.framework.ajava;
22

3+
import com.github.javaparser.JavaToken;
4+
import com.github.javaparser.JavaToken.Kind;
35
import com.github.javaparser.Position;
6+
import com.github.javaparser.TokenRange;
47
import com.github.javaparser.ast.CompilationUnit;
58
import com.github.javaparser.ast.ImportDeclaration;
69
import com.github.javaparser.ast.Node;
@@ -11,6 +14,7 @@
1114
import com.github.javaparser.ast.expr.AnnotationExpr;
1215
import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
1316
import com.github.javaparser.ast.type.ArrayType;
17+
import com.github.javaparser.ast.type.ArrayType.ArrayBracketPair;
1418
import com.github.javaparser.ast.type.ClassOrInterfaceType;
1519
import com.github.javaparser.ast.type.Type;
1620
import com.github.javaparser.printer.DefaultPrettyPrinter;
@@ -238,23 +242,29 @@ public void defaultAction(Node src, Node dest) {
238242
@Override
239243
public void visit(ArrayType src, Node other) {
240244
ArrayType dest = (ArrayType) other;
241-
// The second component of this pair contains a list of ArrayBracketPairs from left to
242-
// right. For example, if src contains String[][], then the list will contain the
243-
// types String[] and String[][]. To insert array annotations in the correct location,
244-
// we insert them directly to the right of the end of the previous element.
245-
Pair<Type, List<ArrayType.ArrayBracketPair>> srcArrayTypes = ArrayType.unwrapArrayTypes(src);
246-
Pair<Type, List<ArrayType.ArrayBracketPair>> destArrayTypes =
247-
ArrayType.unwrapArrayTypes(dest);
248-
// The first annotations go directly after the element type.
249-
Position firstPosition = destArrayTypes.a.getEnd().get();
250-
addAnnotations(firstPosition, srcArrayTypes.b.get(0).getAnnotations(), 1, false);
251-
for (int i = 1; i < srcArrayTypes.b.size(); i++) {
252-
Position position = destArrayTypes.b.get(i - 1).getTokenRange().get().toRange().get().end;
253-
addAnnotations(position, srcArrayTypes.b.get(i).getAnnotations(), 1, true);
245+
Pair<Type, List<ArrayBracketPair>> destArrayTypes = ArrayType.unwrapArrayTypes(dest);
246+
TokenRange innerMostCom = destArrayTypes.a.getTokenRange().get();
247+
248+
List<Position> positions = new ArrayList<>();
249+
for (JavaToken token : dest.getTokenRange().get().withBegin(innerMostCom.getEnd())) {
250+
if (token.getKind() == Kind.LBRACKET.getKind()) {
251+
positions.add(token.getRange().get().begin);
252+
}
253+
}
254+
255+
// At the end of the loop, these two variables will contain the innermost array type.
256+
ArrayType srcArray = src;
257+
ArrayType destArray = dest;
258+
for (Position position : positions) {
259+
addAnnotations(position, srcArray.getAnnotations(), 0, true);
260+
if (srcArray.getComponentType().isArrayType()) {
261+
srcArray = (ArrayType) srcArray.getComponentType();
262+
destArray = (ArrayType) destArray.getComponentType();
263+
}
254264
}
255265

256-
// Visit the component type.
257-
srcArrayTypes.a.accept(this, destArrayTypes.a);
266+
// Visit the innermost component type.
267+
srcArray.getComponentType().accept(this, destArray.getComponentType());
258268
}
259269

260270
@Override

framework/src/main/java/org/checkerframework/framework/ajava/JointJavacJavaParserVisitor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.github.javaparser.ast.expr.SwitchExpr;
4646
import com.github.javaparser.ast.expr.ThisExpr;
4747
import com.github.javaparser.ast.expr.TypeExpr;
48+
import com.github.javaparser.ast.expr.TypePatternExpr;
4849
import com.github.javaparser.ast.expr.UnaryExpr;
4950
import com.github.javaparser.ast.modules.ModuleDeclaration;
5051
import com.github.javaparser.ast.modules.ModuleExportsDirective;
@@ -284,7 +285,7 @@ public Void visitBinary(BinaryTree javacTree, Node javaParserNode) {
284285
*/
285286
@SuppressWarnings("UnusedVariable")
286287
public Void visitBindingPattern17(Tree javacTree, Node javaParserNode) {
287-
PatternExpr patternExpr = castNode(PatternExpr.class, javaParserNode, javacTree);
288+
TypePatternExpr patternExpr = castNode(TypePatternExpr.class, javaParserNode, javacTree);
288289
processBindingPattern(javacTree, patternExpr);
289290
VariableTree variableTree = BindingPatternUtils.getVariable(javacTree);
290291
// The name expression can be null, even when a name exists.

framework/src/main/java/org/checkerframework/framework/util/JavaParserUtil.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ public class JavaParserUtil {
3737
* The Language Level to use when parsing if a specific level isn't applied. This should be the
3838
* highest version of Java that the Checker Framework can process.
3939
*/
40-
// JavaParser's ParserConfiguration.LanguageLevel has no constant for JDK 18, as of version
41-
// 3.25.1 (2023-02-28). See
42-
// https://www.javadoc.io/doc/com.github.javaparser/javaparser-core/latest/com/github/javaparser/ParserConfiguration.LanguageLevel.html .
43-
public static final LanguageLevel DEFAULT_LANGUAGE_LEVEL = LanguageLevel.JAVA_17;
40+
public static final LanguageLevel DEFAULT_LANGUAGE_LEVEL = LanguageLevel.JAVA_21;
4441

4542
///
4643
/// Replacements for StaticJavaParser
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// @below-java17-jdk-skip-test
2+
// @infer-jaifs-skip-test
3+
// from https://docs.oracle.com/en/java/javase/15/language/sealed-classes-and-interfaces.html
4+
5+
public sealed class Figure
6+
// The permits clause has been omitted
7+
// as its permitted classes have been
8+
// defined in the same file.
9+
{}
10+
11+
@SuppressWarnings("initializedfields:contracts.postcondition")
12+
final class Circle extends Figure {
13+
float radius;
14+
}
15+
16+
@SuppressWarnings("initializedfields:contracts.postcondition")
17+
non-sealed class Square extends Figure {
18+
float side;
19+
}
20+
21+
@SuppressWarnings("initializedfields:contracts.postcondition")
22+
sealed class Rectangle extends Figure {
23+
float length, width;
24+
}
25+
26+
@SuppressWarnings("initializedfields:contracts.postcondition")
27+
final class FilledRectangle extends Rectangle {
28+
int red, green, blue, sealed;
29+
}

0 commit comments

Comments
 (0)