-
Notifications
You must be signed in to change notification settings - Fork 397
Expand file tree
/
Copy pathTransformation.java
More file actions
122 lines (101 loc) · 3.12 KB
/
Transformation.java
File metadata and controls
122 lines (101 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package sqlancer.transformations;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* The base class of transformations. Defines APIs to remove, replace, remove elements of a list.
*/
public class Transformation {
private static Supplier<Boolean> bugJudgement;
private static long reduceSteps;
protected boolean isChanged;
protected String current;
protected String desc = "";
protected Consumer<String> statementChangedHandler;
public Transformation(String desc) {
this.desc = desc;
}
@SuppressWarnings("unused")
protected Transformation() {
}
public static void setBugJudgement(Supplier<Boolean> judgement) {
bugJudgement = judgement;
}
@Override
public String toString() {
return desc;
}
public boolean init(String sql) {
isChanged = false;
return true;
}
public <P, T> boolean tryRemove(P parent, T target, BiConsumer<P, T> setter) {
setter.accept(parent, null);
onStatementChanged();
if (!bugStillTriggers()) {
setter.accept(parent, target);
onStatementChanged();
return false;
}
reduceSteps++;
isChanged = true;
return true;
}
public <P, T> boolean tryReplace(P parent, T original, T vari, BiConsumer<P, T> setter) {
setter.accept(parent, vari);
onStatementChanged();
if (!bugStillTriggers()) {
setter.accept(parent, original);
onStatementChanged();
return false;
}
reduceSteps++;
isChanged = true;
return true;
}
public <P, T> void tryRemoveElms(P parent, List<T> elms, // NOPMD
BiConsumer<P, List<T>> setter) {
boolean observeChange;
do {
observeChange = false;
for (int i = elms.size() - 1; i >= 0; i--) {
List<T> reducedElms = new ArrayList<>(elms);
reducedElms.subList(i, i + 1).clear();
setter.accept(parent, reducedElms);
onStatementChanged();
if (bugStillTriggers()) {
elms = reducedElms;
onStatementChanged();
observeChange = true;
}
}
isChanged |= observeChange;
setter.accept(parent, elms);
reduceSteps++;
onStatementChanged();
} while (observeChange);
}
public boolean bugStillTriggers() {
try {
return Transformation.bugJudgement.get();
} catch (Exception ignored) {
}
return false;
}
public void apply() {
isChanged = false;
}
public boolean changed() {
return isChanged;
}
public static long getReduceSteps() {
return reduceSteps;
}
protected void onStatementChanged() {
}
public void setStatementChangedCallBack(Consumer<String> statementChangedHandler) {
this.statementChangedHandler = statementChangedHandler;
}
}