Skip to content

Commit 2100dc1

Browse files
authored
Merge pull request #20136 from github/idrissrio/flexible-constructors
Java: Add test for flexible constructor support
2 parents c5e5b8a + 1605438 commit 2100dc1

File tree

11 files changed

+470
-0
lines changed

11 files changed

+470
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
unexpectedDiagnostic
2+
| <compilation flexible-constructors.testproj/trap/java/diagnostics/diagnostic.trap.gz> | -1 | 0 | file://:0:0:0:0 | Unknown location for jdk.internal.RequiresIdentity+Annotation | Unknown location for jdk.internal.RequiresIdentity+Annotation |
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
class A {
2+
A(String msg) {
3+
System.out.println("A: " + msg);
4+
}
5+
}
6+
7+
class B extends A {
8+
B(String input) {
9+
var msg = input.trim().toUpperCase();
10+
super(msg);
11+
}
12+
}
13+
14+
class C {
15+
private final int x;
16+
17+
C(int x) {
18+
if (x < 0) throw new IllegalArgumentException();
19+
super();
20+
this.x = x;
21+
}
22+
}
23+
24+
record R(String name, int score) {
25+
public R(String name) {
26+
var score = name.length();
27+
this(name, score);
28+
}
29+
}
30+
31+
class Outer {
32+
private final String prefix = "outer";
33+
34+
class Inner {
35+
private String full;
36+
37+
Inner(String suffix) {
38+
var combined = prefix + "_" + suffix;
39+
super();
40+
this.full = combined;
41+
}
42+
}
43+
}
44+
45+
class D {
46+
private final String value;
47+
private final int length;
48+
49+
D(String input) {
50+
var processed = input.toLowerCase();
51+
value = processed;
52+
this.length = processed.length();
53+
super();
54+
}
55+
}
56+
57+
class E extends A {
58+
private boolean isValid;
59+
private String processed;
60+
61+
E(String data) {
62+
var temp = data != null ? data.trim() : "";
63+
this.processed = temp;
64+
isValid = !temp.isEmpty();
65+
super(temp);
66+
}
67+
}
68+
69+
class F {
70+
private int x;
71+
private final int y;
72+
private int sum;
73+
74+
F(int a, int b) {
75+
x = a;
76+
this.y = b;
77+
this.sum = a + b;
78+
super();
79+
}
80+
}
81+
82+
class G {
83+
private String instance_val;
84+
85+
{
86+
instance_val = "instance";
87+
}
88+
89+
G(String input) {
90+
var tmp = input != null ? input : "default";
91+
var string = tmp + "_initialized";
92+
super();
93+
this.instance_val = string;
94+
}
95+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| FlexibleConstructors.java:31:7:31:11 | <Expr>; | 1 | <obinit> | Instance initializer call at index 1 |
2+
| FlexibleConstructors.java:89:5:89:5 | <Expr>; | 3 | <obinit> | Instance initializer call at index 3 |
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import java
2+
3+
from MethodCall call, Method m
4+
where
5+
call.getMethod() = m and
6+
m.getName() = "<obinit>"
7+
select call.getEnclosingStmt(), call.getEnclosingStmt().getIndex(), call.getMethod().getName(),
8+
"Instance initializer call at index " + call.getEnclosingStmt().getIndex()
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
| FlexibleConstructors.java:1:7:1:7 | A | 0 | class A { |
2+
| FlexibleConstructors.java:1:7:1:7 | A | 1 | A(String msg) { |
3+
| FlexibleConstructors.java:1:7:1:7 | A | 2 | super(); |
4+
| FlexibleConstructors.java:1:7:1:7 | A | 3 | System.out.println("A: " + msg); |
5+
| FlexibleConstructors.java:1:7:1:7 | A | 4 | } |
6+
| FlexibleConstructors.java:1:7:1:7 | A | 5 | } |
7+
| FlexibleConstructors.java:7:7:7:7 | B | 0 | class B { |
8+
| FlexibleConstructors.java:7:7:7:7 | B | 1 | B(String input) { |
9+
| FlexibleConstructors.java:7:7:7:7 | B | 2 | var msg = input.trim().toUpperCase(); |
10+
| FlexibleConstructors.java:7:7:7:7 | B | 3 | super(msg); |
11+
| FlexibleConstructors.java:7:7:7:7 | B | 4 | } |
12+
| FlexibleConstructors.java:7:7:7:7 | B | 5 | } |
13+
| FlexibleConstructors.java:14:7:14:7 | C | 0 | class C { |
14+
| FlexibleConstructors.java:14:7:14:7 | C | 1 | private final int x; |
15+
| FlexibleConstructors.java:14:7:14:7 | C | 2 | |
16+
| FlexibleConstructors.java:14:7:14:7 | C | 3 | C(int x) { |
17+
| FlexibleConstructors.java:14:7:14:7 | C | 4 | if (x < 0) |
18+
| FlexibleConstructors.java:14:7:14:7 | C | 5 | throw new IllegalArgumentException(); |
19+
| FlexibleConstructors.java:14:7:14:7 | C | 6 | super(); |
20+
| FlexibleConstructors.java:14:7:14:7 | C | 7 | this.x = x; |
21+
| FlexibleConstructors.java:14:7:14:7 | C | 8 | } |
22+
| FlexibleConstructors.java:14:7:14:7 | C | 9 | } |
23+
| FlexibleConstructors.java:24:8:24:8 | R | 0 | final class R { |
24+
| FlexibleConstructors.java:24:8:24:8 | R | 1 | public final boolean equals(Object p0) { <missing body> } |
25+
| FlexibleConstructors.java:24:8:24:8 | R | 2 | |
26+
| FlexibleConstructors.java:24:8:24:8 | R | 3 | public final int hashCode() { <missing body> } |
27+
| FlexibleConstructors.java:24:8:24:8 | R | 4 | |
28+
| FlexibleConstructors.java:24:8:24:8 | R | 5 | public String name() { <missing body> } |
29+
| FlexibleConstructors.java:24:8:24:8 | R | 6 | |
30+
| FlexibleConstructors.java:24:8:24:8 | R | 7 | public int score() { <missing body> } |
31+
| FlexibleConstructors.java:24:8:24:8 | R | 8 | |
32+
| FlexibleConstructors.java:24:8:24:8 | R | 9 | public final String toString() { <missing body> } |
33+
| FlexibleConstructors.java:24:8:24:8 | R | 10 | |
34+
| FlexibleConstructors.java:24:8:24:8 | R | 11 | R(String name, int score) { |
35+
| FlexibleConstructors.java:24:8:24:8 | R | 12 | super(); |
36+
| FlexibleConstructors.java:24:8:24:8 | R | 13 | this.name = name; |
37+
| FlexibleConstructors.java:24:8:24:8 | R | 14 | this.score = score; |
38+
| FlexibleConstructors.java:24:8:24:8 | R | 15 | } |
39+
| FlexibleConstructors.java:24:8:24:8 | R | 16 | |
40+
| FlexibleConstructors.java:24:8:24:8 | R | 17 | private final String name; |
41+
| FlexibleConstructors.java:24:8:24:8 | R | 18 | |
42+
| FlexibleConstructors.java:24:8:24:8 | R | 19 | private final int score; |
43+
| FlexibleConstructors.java:24:8:24:8 | R | 20 | |
44+
| FlexibleConstructors.java:24:8:24:8 | R | 21 | public R(String name) { |
45+
| FlexibleConstructors.java:24:8:24:8 | R | 22 | var score = name.length(); |
46+
| FlexibleConstructors.java:24:8:24:8 | R | 23 | this(name, score); |
47+
| FlexibleConstructors.java:24:8:24:8 | R | 24 | } |
48+
| FlexibleConstructors.java:24:8:24:8 | R | 25 | } |
49+
| FlexibleConstructors.java:31:7:31:11 | Outer | 0 | class Outer { |
50+
| FlexibleConstructors.java:31:7:31:11 | Outer | 1 | private void <obinit>() { |
51+
| FlexibleConstructors.java:31:7:31:11 | Outer | 2 | prefix = "outer"; |
52+
| FlexibleConstructors.java:31:7:31:11 | Outer | 3 | } |
53+
| FlexibleConstructors.java:31:7:31:11 | Outer | 4 | |
54+
| FlexibleConstructors.java:31:7:31:11 | Outer | 5 | Outer() { |
55+
| FlexibleConstructors.java:31:7:31:11 | Outer | 6 | super(); |
56+
| FlexibleConstructors.java:31:7:31:11 | Outer | 7 | <obinit>(); |
57+
| FlexibleConstructors.java:31:7:31:11 | Outer | 8 | } |
58+
| FlexibleConstructors.java:31:7:31:11 | Outer | 9 | |
59+
| FlexibleConstructors.java:31:7:31:11 | Outer | 10 | private final String prefix; |
60+
| FlexibleConstructors.java:31:7:31:11 | Outer | 11 | |
61+
| FlexibleConstructors.java:31:7:31:11 | Outer | 12 | class Inner { |
62+
| FlexibleConstructors.java:31:7:31:11 | Outer | 13 | private String full; |
63+
| FlexibleConstructors.java:31:7:31:11 | Outer | 14 | |
64+
| FlexibleConstructors.java:31:7:31:11 | Outer | 15 | Inner(String suffix) { |
65+
| FlexibleConstructors.java:31:7:31:11 | Outer | 16 | var combined = prefix + "_" + suffix; |
66+
| FlexibleConstructors.java:31:7:31:11 | Outer | 17 | super(); |
67+
| FlexibleConstructors.java:31:7:31:11 | Outer | 18 | this.full = combined; |
68+
| FlexibleConstructors.java:31:7:31:11 | Outer | 19 | } |
69+
| FlexibleConstructors.java:31:7:31:11 | Outer | 20 | } |
70+
| FlexibleConstructors.java:31:7:31:11 | Outer | 21 | } |
71+
| FlexibleConstructors.java:45:7:45:7 | D | 0 | class D { |
72+
| FlexibleConstructors.java:45:7:45:7 | D | 1 | private final String value; |
73+
| FlexibleConstructors.java:45:7:45:7 | D | 2 | |
74+
| FlexibleConstructors.java:45:7:45:7 | D | 3 | private final int length; |
75+
| FlexibleConstructors.java:45:7:45:7 | D | 4 | |
76+
| FlexibleConstructors.java:45:7:45:7 | D | 5 | D(String input) { |
77+
| FlexibleConstructors.java:45:7:45:7 | D | 6 | var processed = input.toLowerCase(); |
78+
| FlexibleConstructors.java:45:7:45:7 | D | 7 | value = processed; |
79+
| FlexibleConstructors.java:45:7:45:7 | D | 8 | this.length = processed.length(); |
80+
| FlexibleConstructors.java:45:7:45:7 | D | 9 | super(); |
81+
| FlexibleConstructors.java:45:7:45:7 | D | 10 | } |
82+
| FlexibleConstructors.java:45:7:45:7 | D | 11 | } |
83+
| FlexibleConstructors.java:57:7:57:7 | E | 0 | class E { |
84+
| FlexibleConstructors.java:57:7:57:7 | E | 1 | private boolean isValid; |
85+
| FlexibleConstructors.java:57:7:57:7 | E | 2 | |
86+
| FlexibleConstructors.java:57:7:57:7 | E | 3 | private String processed; |
87+
| FlexibleConstructors.java:57:7:57:7 | E | 4 | |
88+
| FlexibleConstructors.java:57:7:57:7 | E | 5 | E(String data) { |
89+
| FlexibleConstructors.java:57:7:57:7 | E | 6 | var temp = data != null ? data.trim() : ""; |
90+
| FlexibleConstructors.java:57:7:57:7 | E | 7 | this.processed = temp; |
91+
| FlexibleConstructors.java:57:7:57:7 | E | 8 | isValid = !temp.isEmpty(); |
92+
| FlexibleConstructors.java:57:7:57:7 | E | 9 | super(temp); |
93+
| FlexibleConstructors.java:57:7:57:7 | E | 10 | } |
94+
| FlexibleConstructors.java:57:7:57:7 | E | 11 | } |
95+
| FlexibleConstructors.java:69:7:69:7 | F | 0 | class F { |
96+
| FlexibleConstructors.java:69:7:69:7 | F | 1 | private int x; |
97+
| FlexibleConstructors.java:69:7:69:7 | F | 2 | |
98+
| FlexibleConstructors.java:69:7:69:7 | F | 3 | private final int y; |
99+
| FlexibleConstructors.java:69:7:69:7 | F | 4 | |
100+
| FlexibleConstructors.java:69:7:69:7 | F | 5 | private int sum; |
101+
| FlexibleConstructors.java:69:7:69:7 | F | 6 | |
102+
| FlexibleConstructors.java:69:7:69:7 | F | 7 | F(int a, int b) { |
103+
| FlexibleConstructors.java:69:7:69:7 | F | 8 | x = a; |
104+
| FlexibleConstructors.java:69:7:69:7 | F | 9 | this.y = b; |
105+
| FlexibleConstructors.java:69:7:69:7 | F | 10 | this.sum = a + b; |
106+
| FlexibleConstructors.java:69:7:69:7 | F | 11 | super(); |
107+
| FlexibleConstructors.java:69:7:69:7 | F | 12 | } |
108+
| FlexibleConstructors.java:69:7:69:7 | F | 13 | } |
109+
| FlexibleConstructors.java:82:7:82:7 | G | 0 | class G { |
110+
| FlexibleConstructors.java:82:7:82:7 | G | 1 | private void <obinit>() { |
111+
| FlexibleConstructors.java:82:7:82:7 | G | 2 | { |
112+
| FlexibleConstructors.java:82:7:82:7 | G | 3 | instance_val = "instance"; |
113+
| FlexibleConstructors.java:82:7:82:7 | G | 4 | } |
114+
| FlexibleConstructors.java:82:7:82:7 | G | 5 | } |
115+
| FlexibleConstructors.java:82:7:82:7 | G | 6 | |
116+
| FlexibleConstructors.java:82:7:82:7 | G | 7 | private String instance_val; |
117+
| FlexibleConstructors.java:82:7:82:7 | G | 8 | |
118+
| FlexibleConstructors.java:82:7:82:7 | G | 9 | G(String input) { |
119+
| FlexibleConstructors.java:82:7:82:7 | G | 10 | var tmp = input != null ? input : "default"; |
120+
| FlexibleConstructors.java:82:7:82:7 | G | 11 | var string = tmp + "_initialized"; |
121+
| FlexibleConstructors.java:82:7:82:7 | G | 12 | super(); |
122+
| FlexibleConstructors.java:82:7:82:7 | G | 13 | <obinit>(); |
123+
| FlexibleConstructors.java:82:7:82:7 | G | 14 | this.instance_val = string; |
124+
| FlexibleConstructors.java:82:7:82:7 | G | 15 | } |
125+
| FlexibleConstructors.java:82:7:82:7 | G | 16 | } |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import semmle.code.java.PrettyPrintAst
2+
3+
from ClassOrInterface cori, string s, int line
4+
where pp(cori, s, line) and cori.fromSource()
5+
select cori, line, s

0 commit comments

Comments
 (0)