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 }