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 import dextool.plugin.mutate.backend.analyze.ast;
20 
21 auto aorMutations(Kind operator) @safe pure nothrow {
22     alias Rval = Tuple!(Mutation.Kind[], "op", Mutation.Kind[], "lhs", Mutation.Kind[], "rhs");
23     Rval rval;
24 
25     switch (operator) with (Mutation.Kind) {
26     case Kind.OpAdd:
27         rval = Rval([aorMul, aorDiv, aorRem, aorSub], null, null);
28         break;
29     case Kind.OpDiv:
30         rval = Rval([aorMul, aorRem, aorAdd, aorSub], null, null);
31         break;
32     case Kind.OpMod:
33         rval = Rval([aorMul, aorDiv, aorAdd, aorSub], null, null);
34         break;
35     case Kind.OpMul:
36         rval = Rval([aorDiv, aorRem, aorAdd, aorSub], null, null);
37         break;
38     case Kind.OpSub:
39         rval = Rval([aorMul, aorDiv, aorRem, aorAdd], null, null);
40         break;
41     case Kind.OpAssignAdd:
42         rval = Rval([aorDivAssign, aorRemAssign,
43                 aorMulAssign, aorSubAssign], null, null);
44         break;
45     case Kind.OpAssignDiv:
46         rval = Rval([aorAddAssign, aorRemAssign,
47                 aorMulAssign, aorSubAssign], null, null);
48         break;
49     case Kind.OpAssignMod:
50         rval = Rval([aorAddAssign, aorDivAssign,
51                 aorMulAssign, aorSubAssign], null, null);
52         break;
53     case Kind.OpAssignMul:
54         rval = Rval([aorAddAssign, aorDivAssign,
55                 aorRemAssign, aorSubAssign], null, null);
56         break;
57     case Kind.OpAssignSub:
58         rval = Rval([aorAddAssign, aorDivAssign,
59                 aorRemAssign, aorMulAssign], null, null);
60         break;
61     default:
62     }
63 
64     return rval;
65 }
66 
67 immutable Mutation.Kind[] aorMutationsAll;
68 immutable Mutation.Kind[] aorAssignMutationsAll;
69 
70 shared static this() {
71     with (Mutation.Kind) {
72         aorMutationsAll = [
73             aorMul, aorDiv, aorRem, aorAdd, aorSub, aorLhs, aorRhs
74         ];
75         aorAssignMutationsAll = [
76             aorMulAssign, aorDivAssign, aorRemAssign, aorAddAssign, aorSubAssign
77         ];
78     }
79 }