1 /**
2 Copyright: Copyright (c) 2018, Joakim Brännström. All rights reserved.
3 License: MPL-2
4 Author: Joakim Brännström (joakim.brannstrom@gmx.com)
5 
6 This Source Code Form is subject to the terms of the Mozilla Public License,
7 v.2.0. If a copy of the MPL was not distributed with this file, You can obtain
8 one at http://mozilla.org/MPL/2.0/.
9 */
10 module dextool.plugin.mutate.backend.mutation_type.aor;
11 
12 import std.algorithm : filter, among;
13 import std.array : array;
14 import std.typecons : Tuple;
15 
16 import dextool.plugin.mutate.backend.type;
17 import dextool.clang_extensions : OpKind;
18 
19 Mutation.Kind[] aorMutations(OpKind k) @safe pure nothrow {
20     auto v = k in isAor;
21     if (v is null)
22         return null;
23 
24     return aorMutationsAll.dup.filter!(a => !a.among(*v,
25             Mutation.Kind.aorRhs, Mutation.Kind.aorLhs)).array;
26 }
27 
28 Mutation.Kind[] aorAssignMutations(OpKind k) @safe pure nothrow {
29     auto v = k in isAorAssign;
30     if (v is null)
31         return null;
32 
33     return aorAssignMutationsAll.dup.filter!(a => !a.among(*v,
34             Mutation.Kind.aorRhs, Mutation.Kind.aorLhs)).array;
35 }
36 
37 auto aorLhsMutations(OpKind k) @safe pure nothrow {
38     return k in isAor ? [Mutation.Kind.aorLhs] : null;
39 }
40 
41 auto aorRhsMutations(OpKind k) @safe pure nothrow {
42     return k in isAor ? [Mutation.Kind.aorRhs] : null;
43 }
44 
45 immutable Mutation.Kind[OpKind] isAor;
46 immutable Mutation.Kind[OpKind] isAorAssign;
47 
48 immutable Mutation.Kind[] aorMutationsAll;
49 immutable Mutation.Kind[] aorAssignMutationsAll;
50 shared static this() {
51     // dfmt off
52     with (OpKind) {
53     isAor = cast(immutable)
54         [
55         Mul: Mutation.Kind.aorMul, // "*"
56         Div: Mutation.Kind.aorDiv, // "/"
57         Rem: Mutation.Kind.aorRem, // "%"
58         Add: Mutation.Kind.aorAdd, // "+"
59         Sub: Mutation.Kind.aorSub, // "-"
60         OO_Plus: Mutation.Kind.aorAdd, // "+"
61         OO_Minus: Mutation.Kind.aorSub, // "-"
62         OO_Star: Mutation.Kind.aorMul, // "*"
63         OO_Slash: Mutation.Kind.aorDiv, // "/"
64         OO_Percent: Mutation.Kind.aorRem, // "%"
65         ];
66 
67     isAorAssign = cast(immutable)
68         [
69         MulAssign: Mutation.Kind.aorMulAssign, // "*="
70         DivAssign: Mutation.Kind.aorDivAssign, // "/="
71         RemAssign: Mutation.Kind.aorRemAssign, // "%="
72         AddAssign: Mutation.Kind.aorAddAssign, // "+="
73         SubAssign: Mutation.Kind.aorSubAssign, // "-="
74         OO_PlusEqual: Mutation.Kind.aorAddAssign, // "+="
75         OO_MinusEqual: Mutation.Kind.aorSubAssign, // "-="
76         OO_StarEqual: Mutation.Kind.aorMulAssign, // "*="
77         OO_SlashEqual: Mutation.Kind.aorDivAssign, // "/="
78         OO_PercentEqual: Mutation.Kind.aorRemAssign, // "%="
79         ];
80     }
81     // dfmt on
82 
83     with (Mutation.Kind) {
84         aorMutationsAll = [
85             aorMul, aorDiv, aorRem, aorAdd, aorSub, aorLhs, aorRhs
86         ];
87         aorAssignMutationsAll = [
88             aorMulAssign, aorDivAssign, aorRemAssign, aorAddAssign, aorSubAssign
89         ];
90     }
91 }