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.lcrb;
11 
12 import dextool.plugin.mutate.backend.type;
13 import dextool.clang_extensions : OpKind;
14 
15 auto lcrbMutations(OpKind k) @safe pure nothrow {
16     auto v = k in isLcrb;
17     if (v is null)
18         return null;
19 
20     if (*v == Mutation.Kind.lcrbAnd)
21         return [Mutation.Kind.lcrbOr];
22     else if (*v == Mutation.Kind.lcrbOr)
23         return [Mutation.Kind.lcrbAnd];
24     return null;
25 }
26 
27 auto lcrbLhsMutations(OpKind k) @safe pure nothrow {
28     return k in isLcrb ? [Mutation.Kind.lcrbLhs] : null;
29 }
30 
31 auto lcrbRhsMutations(OpKind k) @safe pure nothrow {
32     return k in isLcrb ? [Mutation.Kind.lcrbRhs] : null;
33 }
34 
35 auto lcrbAssignMutations(OpKind k) @safe pure nothrow {
36     auto v = k in isLcrbAssign;
37     if (v is null)
38         return null;
39 
40     if (*v == Mutation.Kind.lcrbAndAssign)
41         return [Mutation.Kind.lcrbOrAssign];
42     else if (*v == Mutation.Kind.lcrbOrAssign)
43         return [Mutation.Kind.lcrbAndAssign];
44     return null;
45 }
46 
47 immutable Mutation.Kind[OpKind] isLcrb;
48 immutable Mutation.Kind[OpKind] isLcrbAssign;
49 
50 immutable Mutation.Kind[] lcrbMutationsAll;
51 immutable Mutation.Kind[] lcrbAssignMutationsAll;
52 
53 shared static this() {
54     // dfmt off
55     with (OpKind) {
56     isLcrb = [
57         And : Mutation.Kind.lcrbAnd, // "&"
58         Or : Mutation.Kind.lcrbOr, // "|"
59         OO_Amp : Mutation.Kind.lcrbAnd, // "&"
60         OO_Pipe : Mutation.Kind.lcrbOr, // "|"
61     ];
62 
63     isLcrbAssign = [
64         AndAssign : Mutation.Kind.lcrbAndAssign,
65         OrAssign : Mutation.Kind.lcrbOrAssign,
66         OO_AmpEqual : Mutation.Kind.lcrbAndAssign,
67         OO_PipeEqual : Mutation.Kind.lcrbOrAssign,
68     ];
69     }
70     // dfmt on
71 
72     with (Mutation.Kind) {
73         lcrbMutationsAll = [lcrbAnd, lcrbOr, lcrbLhs, lcrbRhs];
74         lcrbAssignMutationsAll = [lcrbOrAssign, lcrbAndAssign];
75     }
76 }