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 }