apex-mutation-testing 1.3.0 → 1.4.0-dev-92.22356249620-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +1 -1
  2. package/lib/adapter/sObjectDescribeRepository.d.ts +1 -1
  3. package/lib/adapter/sObjectDescribeRepository.js +19 -19
  4. package/lib/adapter/sObjectDescribeRepository.js.map +1 -1
  5. package/lib/mutator/argumentPropagationMutator.d.ts +9 -0
  6. package/lib/mutator/argumentPropagationMutator.js +57 -0
  7. package/lib/mutator/argumentPropagationMutator.js.map +1 -0
  8. package/lib/mutator/arithmeticOperatorDeletionMutator.d.ts +14 -0
  9. package/lib/mutator/arithmeticOperatorDeletionMutator.js +71 -0
  10. package/lib/mutator/arithmeticOperatorDeletionMutator.js.map +1 -0
  11. package/lib/mutator/arithmeticOperatorMutator.d.ts +4 -11
  12. package/lib/mutator/arithmeticOperatorMutator.js +25 -89
  13. package/lib/mutator/arithmeticOperatorMutator.js.map +1 -1
  14. package/lib/mutator/astUtils.d.ts +14 -0
  15. package/lib/mutator/astUtils.js +71 -0
  16. package/lib/mutator/astUtils.js.map +1 -0
  17. package/lib/mutator/baseListener.d.ts +6 -3
  18. package/lib/mutator/baseListener.js +11 -3
  19. package/lib/mutator/baseListener.js.map +1 -1
  20. package/lib/mutator/bitwiseOperatorMutator.d.ts +9 -0
  21. package/lib/mutator/bitwiseOperatorMutator.js +33 -0
  22. package/lib/mutator/bitwiseOperatorMutator.js.map +1 -0
  23. package/lib/mutator/emptyReturnMutator.d.ts +5 -3
  24. package/lib/mutator/emptyReturnMutator.js +32 -41
  25. package/lib/mutator/emptyReturnMutator.js.map +1 -1
  26. package/lib/mutator/falseReturnMutator.d.ts +5 -2
  27. package/lib/mutator/falseReturnMutator.js +18 -11
  28. package/lib/mutator/falseReturnMutator.js.map +1 -1
  29. package/lib/mutator/inlineConstantMutator.d.ts +8 -0
  30. package/lib/mutator/inlineConstantMutator.js +129 -0
  31. package/lib/mutator/inlineConstantMutator.js.map +1 -0
  32. package/lib/mutator/memberVariableMutator.d.ts +7 -0
  33. package/lib/mutator/memberVariableMutator.js +38 -0
  34. package/lib/mutator/memberVariableMutator.js.map +1 -0
  35. package/lib/mutator/mutationListener.d.ts +1 -5
  36. package/lib/mutator/mutationListener.js +5 -29
  37. package/lib/mutator/mutationListener.js.map +1 -1
  38. package/lib/mutator/nakedReceiverMutator.d.ts +7 -0
  39. package/lib/mutator/nakedReceiverMutator.js +25 -0
  40. package/lib/mutator/nakedReceiverMutator.js.map +1 -0
  41. package/lib/mutator/negationMutator.d.ts +5 -2
  42. package/lib/mutator/negationMutator.js +22 -12
  43. package/lib/mutator/negationMutator.js.map +1 -1
  44. package/lib/mutator/nonVoidMethodCallMutator.d.ts +12 -0
  45. package/lib/mutator/nonVoidMethodCallMutator.js +144 -0
  46. package/lib/mutator/nonVoidMethodCallMutator.js.map +1 -0
  47. package/lib/mutator/nullReturnMutator.d.ts +5 -2
  48. package/lib/mutator/nullReturnMutator.js +18 -8
  49. package/lib/mutator/nullReturnMutator.js.map +1 -1
  50. package/lib/mutator/trueReturnMutator.d.ts +5 -2
  51. package/lib/mutator/trueReturnMutator.js +18 -11
  52. package/lib/mutator/trueReturnMutator.js.map +1 -1
  53. package/lib/mutator/unaryOperatorInsertionMutator.d.ts +6 -0
  54. package/lib/mutator/unaryOperatorInsertionMutator.js +37 -0
  55. package/lib/mutator/unaryOperatorInsertionMutator.js.map +1 -0
  56. package/lib/mutator/voidMethodCallMutator.d.ts +0 -1
  57. package/lib/mutator/voidMethodCallMutator.js +3 -10
  58. package/lib/mutator/voidMethodCallMutator.js.map +1 -1
  59. package/lib/service/mutantGenerator.d.ts +2 -3
  60. package/lib/service/mutantGenerator.js +32 -8
  61. package/lib/service/mutantGenerator.js.map +1 -1
  62. package/lib/service/mutationTestingService.js +8 -9
  63. package/lib/service/mutationTestingService.js.map +1 -1
  64. package/lib/service/typeDiscoverer.d.ts +7 -0
  65. package/lib/service/typeDiscoverer.js +144 -0
  66. package/lib/service/typeDiscoverer.js.map +1 -0
  67. package/lib/service/typeMatcher.d.ts +16 -1
  68. package/lib/service/typeMatcher.js +27 -1
  69. package/lib/service/typeMatcher.js.map +1 -1
  70. package/lib/type/ApexMethod.d.ts +22 -20
  71. package/lib/type/ApexMethod.js +45 -21
  72. package/lib/type/ApexMethod.js.map +1 -1
  73. package/lib/type/TypeRegistry.d.ts +22 -0
  74. package/lib/type/TypeRegistry.js +144 -0
  75. package/lib/type/TypeRegistry.js.map +1 -0
  76. package/npm-shrinkwrap.json +594 -1832
  77. package/oclif.manifest.json +1 -1
  78. package/package.json +19 -20
  79. package/lib/mutator/returnTypeAwareBaseListener.d.ts +0 -12
  80. package/lib/mutator/returnTypeAwareBaseListener.js +0 -24
  81. package/lib/mutator/returnTypeAwareBaseListener.js.map +0 -1
  82. package/lib/service/typeGatherer.d.ts +0 -12
  83. package/lib/service/typeGatherer.js +0 -142
  84. package/lib/service/typeGatherer.js.map +0 -1
package/README.md CHANGED
@@ -174,7 +174,7 @@ EXAMPLES
174
174
  $ sf apex mutation test run --apex-class MyClass --test-class MyClassTest
175
175
  ```
176
176
 
177
- _See code: [src/commands/apex/mutation/test/run.ts](https://github.com/scolladon/apex-mutation-testing/blob/v1.3.0/src/commands/apex/mutation/test/run.ts)_
177
+ _See code: [src/commands/apex/mutation/test/run.ts](https://github.com/scolladon/apex-mutation-testing/blob/v1.4.0-dev-92.22356249620-1/src/commands/apex/mutation/test/run.ts)_
178
178
  <!-- commandsstop -->
179
179
 
180
180
  ## Backlog
@@ -1,5 +1,5 @@
1
1
  import { Connection } from '@salesforce/core';
2
- import { ApexType } from '../type/ApexMethod.js';
2
+ import type { ApexType } from '../type/ApexMethod.js';
3
3
  export declare class SObjectDescribeRepository {
4
4
  private readonly connection;
5
5
  private readonly fieldTypes;
@@ -1,23 +1,23 @@
1
1
  import { mapLimit } from 'async';
2
- import { ApexType } from '../type/ApexMethod.js';
2
+ import { APEX_TYPE } from '../type/ApexMethod.js';
3
3
  const DESCRIBE_FIELD_TYPE_MAP = {
4
- int: ApexType.INTEGER,
5
- double: ApexType.DOUBLE,
6
- currency: ApexType.DECIMAL,
7
- percent: ApexType.DOUBLE,
8
- date: ApexType.DATE,
9
- datetime: ApexType.DATETIME,
10
- boolean: ApexType.BOOLEAN,
11
- id: ApexType.ID,
12
- reference: ApexType.ID,
13
- string: ApexType.STRING,
14
- textarea: ApexType.STRING,
15
- email: ApexType.STRING,
16
- phone: ApexType.STRING,
17
- url: ApexType.STRING,
18
- picklist: ApexType.STRING,
19
- multipicklist: ApexType.STRING,
20
- encryptedstring: ApexType.STRING,
4
+ int: APEX_TYPE.INTEGER,
5
+ double: APEX_TYPE.DOUBLE,
6
+ currency: APEX_TYPE.DECIMAL,
7
+ percent: APEX_TYPE.DOUBLE,
8
+ date: APEX_TYPE.DATE,
9
+ datetime: APEX_TYPE.DATETIME,
10
+ boolean: APEX_TYPE.BOOLEAN,
11
+ id: APEX_TYPE.ID,
12
+ reference: APEX_TYPE.ID,
13
+ string: APEX_TYPE.STRING,
14
+ textarea: APEX_TYPE.STRING,
15
+ email: APEX_TYPE.STRING,
16
+ phone: APEX_TYPE.STRING,
17
+ url: APEX_TYPE.STRING,
18
+ picklist: APEX_TYPE.STRING,
19
+ multipicklist: APEX_TYPE.STRING,
20
+ encryptedstring: APEX_TYPE.STRING,
21
21
  };
22
22
  const MAX_CONCURRENT_DESCRIBE_CALLS = 25;
23
23
  export class SObjectDescribeRepository {
@@ -32,7 +32,7 @@ export class SObjectDescribeRepository {
32
32
  const describeResult = await this.connection.describe(name);
33
33
  const fieldMap = new Map();
34
34
  for (const field of describeResult.fields) {
35
- fieldMap.set(field.name.toLowerCase(), DESCRIBE_FIELD_TYPE_MAP[field.type] ?? ApexType.OBJECT);
35
+ fieldMap.set(field.name.toLowerCase(), DESCRIBE_FIELD_TYPE_MAP[field.type] ?? APEX_TYPE.OBJECT);
36
36
  }
37
37
  this.fieldTypes.set(name.toLowerCase(), fieldMap);
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sObjectDescribeRepository.js","sourceRoot":"","sources":["../../src/adapter/sObjectDescribeRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAA;AAEnE,MAAM,uBAAuB,GAA6B;IACxD,GAAG,EAAE,QAAQ,CAAC,OAAO;IACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,QAAQ,EAAE,QAAQ,CAAC,OAAO;IAC1B,OAAO,EAAE,QAAQ,CAAC,MAAM;IACxB,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;IACzB,EAAE,EAAE,QAAQ,CAAC,EAAE;IACf,SAAS,EAAE,QAAQ,CAAC,EAAE;IACtB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,KAAK,EAAE,QAAQ,CAAC,MAAM;IACtB,KAAK,EAAE,QAAQ,CAAC,MAAM;IACtB,GAAG,EAAE,QAAQ,CAAC,MAAM;IACpB,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,aAAa,EAAE,QAAQ,CAAC,MAAM;IAC9B,eAAe,EAAE,QAAQ,CAAC,MAAM;CACjC,CAAA;AAED,MAAM,6BAA6B,GAAG,EAAE,CAAA;AAExC,MAAM,OAAO,yBAAyB;IAGP;IAFZ,UAAU,GAAsB,IAAI,GAAG,EAAE,CAAA;IAE1D,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEhD,KAAK,CAAC,QAAQ,CAAC,YAAsB;QAC1C,MAAM,QAAQ,CACZ,YAAY,EACZ,6BAA6B,EAC7B,KAAK,EAAE,IAAY,EAAE,EAAE;YACrB,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;gBAC5C,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;oBAC1C,QAAQ,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EACxB,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,CACvD,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAA;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,6DAA6D;YAC/D,CAAC;QACH,CAAC,CACF,CAAA;IACH,CAAC;IAEM,SAAS,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IACpD,CAAC;IAEM,gBAAgB,CACrB,eAAuB,EACvB,SAAiB;QAEjB,OAAO,IAAI,CAAC,UAAU;aACnB,GAAG,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;YACnC,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"sObjectDescribeRepository.js","sourceRoot":"","sources":["../../src/adapter/sObjectDescribeRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAqB,MAAM,uBAAuB,CAAA;AAEpE,MAAM,uBAAuB,GAA6B;IACxD,GAAG,EAAE,SAAS,CAAC,OAAO;IACtB,MAAM,EAAE,SAAS,CAAC,MAAM;IACxB,QAAQ,EAAE,SAAS,CAAC,OAAO;IAC3B,OAAO,EAAE,SAAS,CAAC,MAAM;IACzB,IAAI,EAAE,SAAS,CAAC,IAAI;IACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;IAC5B,OAAO,EAAE,SAAS,CAAC,OAAO;IAC1B,EAAE,EAAE,SAAS,CAAC,EAAE;IAChB,SAAS,EAAE,SAAS,CAAC,EAAE;IACvB,MAAM,EAAE,SAAS,CAAC,MAAM;IACxB,QAAQ,EAAE,SAAS,CAAC,MAAM;IAC1B,KAAK,EAAE,SAAS,CAAC,MAAM;IACvB,KAAK,EAAE,SAAS,CAAC,MAAM;IACvB,GAAG,EAAE,SAAS,CAAC,MAAM;IACrB,QAAQ,EAAE,SAAS,CAAC,MAAM;IAC1B,aAAa,EAAE,SAAS,CAAC,MAAM;IAC/B,eAAe,EAAE,SAAS,CAAC,MAAM;CAClC,CAAA;AAED,MAAM,6BAA6B,GAAG,EAAE,CAAA;AAExC,MAAM,OAAO,yBAAyB;IAGP;IAFZ,UAAU,GAAsB,IAAI,GAAG,EAAE,CAAA;IAE1D,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEhD,KAAK,CAAC,QAAQ,CAAC,YAAsB;QAC1C,MAAM,QAAQ,CACZ,YAAY,EACZ,6BAA6B,EAC7B,KAAK,EAAE,IAAY,EAAE,EAAE;YACrB,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;gBAC5C,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;oBAC1C,QAAQ,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EACxB,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,CACxD,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAA;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,6DAA6D;YAC/D,CAAC;QACH,CAAC,CACF,CAAA;IACH,CAAC;IAEM,SAAS,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IACpD,CAAC;IAEM,gBAAgB,CACrB,eAAuB,EACvB,SAAiB;QAEjB,OAAO,IAAI,CAAC,UAAU;aACnB,GAAG,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;YACnC,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IAClC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { DotExpressionContext, MethodCallExpressionContext } from 'apex-parser';
2
+ import { TypeRegistry } from '../type/TypeRegistry.js';
3
+ import { BaseListener } from './baseListener.js';
4
+ export declare class ArgumentPropagationMutator extends BaseListener {
5
+ constructor(typeRegistry?: TypeRegistry);
6
+ enterMethodCallExpression(ctx: MethodCallExpressionContext): void;
7
+ enterDotExpression(ctx: DotExpressionContext): void;
8
+ private createMutationsForMatchingArgs;
9
+ }
@@ -0,0 +1,57 @@
1
+ import { ParserRuleContext } from 'antlr4ts';
2
+ import { extractArguments, resolveDotMethodCall, resolveExpressionApexType, } from './astUtils.js';
3
+ import { BaseListener } from './baseListener.js';
4
+ export class ArgumentPropagationMutator extends BaseListener {
5
+ constructor(typeRegistry) {
6
+ super(typeRegistry);
7
+ }
8
+ enterMethodCallExpression(ctx) {
9
+ if (ctx.childCount !== 1) {
10
+ return;
11
+ }
12
+ const methodCall = ctx.getChild(0);
13
+ if (!(methodCall instanceof ParserRuleContext)) {
14
+ return;
15
+ }
16
+ if (!methodCall.children || methodCall.children.length < 3) {
17
+ return;
18
+ }
19
+ const methodName = methodCall.children[0].text;
20
+ const enclosingMethod = this.getEnclosingMethodName(ctx);
21
+ if (!this.typeRegistry || !enclosingMethod) {
22
+ return;
23
+ }
24
+ const methodReturnType = this.typeRegistry.resolveType(enclosingMethod, `${methodName}()`);
25
+ if (!methodReturnType) {
26
+ return;
27
+ }
28
+ const args = extractArguments(methodCall);
29
+ if (args.length === 0) {
30
+ return;
31
+ }
32
+ this.createMutationsForMatchingArgs(ctx, args, methodReturnType.apexType, enclosingMethod);
33
+ }
34
+ enterDotExpression(ctx) {
35
+ if (!this.typeRegistry) {
36
+ return;
37
+ }
38
+ const info = resolveDotMethodCall(ctx, this.typeRegistry);
39
+ if (!info) {
40
+ return;
41
+ }
42
+ const args = extractArguments(info.dotMethodCall);
43
+ if (args.length === 0) {
44
+ return;
45
+ }
46
+ this.createMutationsForMatchingArgs(ctx, args, info.returnType.apexType, info.enclosingMethod);
47
+ }
48
+ createMutationsForMatchingArgs(ctx, args, returnType, enclosingMethod) {
49
+ for (const arg of args) {
50
+ const argType = resolveExpressionApexType(arg.text, enclosingMethod, this.typeRegistry);
51
+ if (argType === returnType) {
52
+ this.createMutationFromParserRuleContext(ctx, arg.text);
53
+ }
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=argumentPropagationMutator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argumentPropagationMutator.js","sourceRoot":"","sources":["../../src/mutator/argumentPropagationMutator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAI5C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,OAAO,0BAA2B,SAAQ,YAAY;IAC1D,YAAY,YAA2B;QACrC,KAAK,CAAC,YAAY,CAAC,CAAA;IACrB,CAAC;IAED,yBAAyB,CAAC,GAAgC;QACxD,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACzB,OAAM;QACR,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAClC,IAAI,CAAC,CAAC,UAAU,YAAY,iBAAiB,CAAC,EAAE,CAAC;YAC/C,OAAM;QACR,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,OAAM;QACR,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAA;QACxD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,OAAM;QACR,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CACpD,eAAe,EACf,GAAG,UAAU,IAAI,CAClB,CAAA;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,8BAA8B,CACjC,GAAG,EACH,IAAI,EACJ,gBAAgB,CAAC,QAAQ,EACzB,eAAe,CAChB,CAAA;IACH,CAAC;IAED,kBAAkB,CAAC,GAAyB;QAC1C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACzD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,8BAA8B,CACjC,GAAG,EACH,IAAI,EACJ,IAAI,CAAC,UAAU,CAAC,QAAQ,EACxB,IAAI,CAAC,eAAe,CACrB,CAAA;IACH,CAAC;IAEO,8BAA8B,CACpC,GAAsB,EACtB,IAAyB,EACzB,UAAoB,EACpB,eAAuB;QAEvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,yBAAyB,CACvC,GAAG,CAAC,IAAI,EACR,eAAe,EACf,IAAI,CAAC,YAAa,CACnB,CAAA;YACD,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,mCAAmC,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { Arth1ExpressionContext, Arth2ExpressionContext, AssignExpressionContext } from 'apex-parser';
2
+ import { TypeRegistry } from '../type/TypeRegistry.js';
3
+ import { BaseListener } from './baseListener.js';
4
+ export declare class ArithmeticOperatorDeletionMutator extends BaseListener {
5
+ private static readonly ARITHMETIC_OPERATORS;
6
+ private static readonly NUMERIC_TYPES;
7
+ constructor(typeRegistry?: TypeRegistry);
8
+ enterArth1Expression(ctx: Arth1ExpressionContext): void;
9
+ enterArth2Expression(ctx: Arth2ExpressionContext): void;
10
+ enterAssignExpression(_ctx: AssignExpressionContext): void;
11
+ private processArithmeticDeletion;
12
+ private isNonNumericContext;
13
+ private isNonNumericOperand;
14
+ }
@@ -0,0 +1,71 @@
1
+ import { TerminalNode } from 'antlr4ts/tree/index.js';
2
+ import { APEX_TYPE } from '../type/ApexMethod.js';
3
+ import { BaseListener } from './baseListener.js';
4
+ export class ArithmeticOperatorDeletionMutator extends BaseListener {
5
+ static ARITHMETIC_OPERATORS = new Set(['+', '-', '*', '/']);
6
+ static NUMERIC_TYPES = new Set([
7
+ APEX_TYPE.INTEGER,
8
+ APEX_TYPE.LONG,
9
+ APEX_TYPE.DOUBLE,
10
+ APEX_TYPE.DECIMAL,
11
+ ]);
12
+ constructor(typeRegistry) {
13
+ super(typeRegistry);
14
+ }
15
+ enterArth1Expression(ctx) {
16
+ this.processArithmeticDeletion(ctx);
17
+ }
18
+ enterArth2Expression(ctx) {
19
+ this.processArithmeticDeletion(ctx);
20
+ }
21
+ enterAssignExpression(_ctx) {
22
+ // Method intentionally left empty - enables traversal into children
23
+ }
24
+ processArithmeticDeletion(ctx) {
25
+ if (ctx.childCount !== 3) {
26
+ return;
27
+ }
28
+ const operatorNode = ctx.getChild(1);
29
+ if (!(operatorNode instanceof TerminalNode)) {
30
+ return;
31
+ }
32
+ const operatorText = operatorNode.text;
33
+ if (!ArithmeticOperatorDeletionMutator.ARITHMETIC_OPERATORS.has(operatorText)) {
34
+ return;
35
+ }
36
+ if (operatorText === '+') {
37
+ const methodName = this.typeRegistry
38
+ ? this.getEnclosingMethodName(ctx)
39
+ : null;
40
+ if (this.isNonNumericContext(ctx, methodName)) {
41
+ return;
42
+ }
43
+ }
44
+ const leftOperand = ctx.getChild(0);
45
+ const rightOperand = ctx.getChild(2);
46
+ if (ctx.start && ctx.stop) {
47
+ this.createMutation(ctx.start, ctx.stop, ctx.text, leftOperand.text);
48
+ this.createMutation(ctx.start, ctx.stop, ctx.text, rightOperand.text);
49
+ }
50
+ }
51
+ isNonNumericContext(ctx, methodName) {
52
+ const leftText = ctx.getChild(0).text;
53
+ const rightText = ctx.getChild(2).text;
54
+ return (this.isNonNumericOperand(leftText, methodName) ||
55
+ this.isNonNumericOperand(rightText, methodName));
56
+ }
57
+ isNonNumericOperand(text, methodName) {
58
+ if (text.includes("'")) {
59
+ return true;
60
+ }
61
+ if (this.typeRegistry && methodName) {
62
+ const resolved = this.typeRegistry.resolveType(methodName, text);
63
+ if (resolved) {
64
+ return !ArithmeticOperatorDeletionMutator.NUMERIC_TYPES.has(resolved.apexType);
65
+ }
66
+ return false;
67
+ }
68
+ return false;
69
+ }
70
+ }
71
+ //# sourceMappingURL=arithmeticOperatorDeletionMutator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arithmeticOperatorDeletionMutator.js","sourceRoot":"","sources":["../../src/mutator/arithmeticOperatorDeletionMutator.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,14 @@
1
1
  import { ParserRuleContext } from 'antlr4ts';
2
- import { ReturnTypeAwareBaseListener } from './returnTypeAwareBaseListener.js';
3
- export declare class ArithmeticOperatorMutator extends ReturnTypeAwareBaseListener {
2
+ import { TypeRegistry } from '../type/TypeRegistry.js';
3
+ import { BaseListener } from './baseListener.js';
4
+ export declare class ArithmeticOperatorMutator extends BaseListener {
4
5
  private readonly REPLACEMENT_MAP;
5
6
  private static readonly NUMERIC_TYPES;
6
- private methodScopeVariables;
7
- private classFields;
8
- enterMethodDeclaration(ctx: ParserRuleContext): void;
9
- enterLocalVariableDeclaration(ctx: ParserRuleContext): void;
10
- enterFormalParameter(ctx: ParserRuleContext): void;
11
- enterFieldDeclaration(ctx: ParserRuleContext): void;
12
- enterEnhancedForControl(ctx: ParserRuleContext): void;
7
+ constructor(typeRegistry?: TypeRegistry);
13
8
  enterArth1Expression(ctx: ParserRuleContext): void;
14
9
  enterArth2Expression(ctx: ParserRuleContext): void;
15
10
  enterAssignExpression(_ctx: ParserRuleContext): void;
16
11
  private processArithmeticOperation;
17
12
  private isNonNumericContext;
18
13
  private isNonNumericOperand;
19
- private resolveApexType;
20
- private trackVariableDeclaration;
21
14
  }
@@ -1,7 +1,7 @@
1
1
  import { TerminalNode } from 'antlr4ts/tree/index.js';
2
- import { ApexType } from '../type/ApexMethod.js';
3
- import { ReturnTypeAwareBaseListener } from './returnTypeAwareBaseListener.js';
4
- export class ArithmeticOperatorMutator extends ReturnTypeAwareBaseListener {
2
+ import { APEX_TYPE } from '../type/ApexMethod.js';
3
+ import { BaseListener } from './baseListener.js';
4
+ export class ArithmeticOperatorMutator extends BaseListener {
5
5
  REPLACEMENT_MAP = {
6
6
  '+': ['-', '*', '/'],
7
7
  '-': ['+', '*', '/'],
@@ -9,36 +9,13 @@ export class ArithmeticOperatorMutator extends ReturnTypeAwareBaseListener {
9
9
  '/': ['+', '-', '*'],
10
10
  };
11
11
  static NUMERIC_TYPES = new Set([
12
- ApexType.INTEGER,
13
- ApexType.LONG,
14
- ApexType.DOUBLE,
15
- ApexType.DECIMAL,
12
+ APEX_TYPE.INTEGER,
13
+ APEX_TYPE.LONG,
14
+ APEX_TYPE.DOUBLE,
15
+ APEX_TYPE.DECIMAL,
16
16
  ]);
17
- methodScopeVariables = new Map();
18
- classFields = new Map();
19
- enterMethodDeclaration(ctx) {
20
- super.enterMethodDeclaration(ctx);
21
- this.methodScopeVariables = new Map();
22
- }
23
- enterLocalVariableDeclaration(ctx) {
24
- this.trackVariableDeclaration(ctx, this.methodScopeVariables);
25
- }
26
- enterFormalParameter(ctx) {
27
- if (ctx.children && ctx.children.length >= 2) {
28
- const typeName = ctx.children[ctx.children.length - 2].text;
29
- const paramName = ctx.children[ctx.children.length - 1].text;
30
- this.methodScopeVariables.set(paramName, typeName.toLowerCase());
31
- }
32
- }
33
- enterFieldDeclaration(ctx) {
34
- this.trackVariableDeclaration(ctx, this.classFields);
35
- }
36
- enterEnhancedForControl(ctx) {
37
- if (ctx.children && ctx.children.length >= 2) {
38
- const typeName = ctx.children[0].text;
39
- const varName = ctx.children[1].text;
40
- this.methodScopeVariables.set(varName, typeName.toLowerCase());
41
- }
17
+ constructor(typeRegistry) {
18
+ super(typeRegistry);
42
19
  }
43
20
  // Handle MUL, DIV, and MOD operations (*, /, %)
44
21
  enterArth1Expression(ctx) {
@@ -58,8 +35,13 @@ export class ArithmeticOperatorMutator extends ReturnTypeAwareBaseListener {
58
35
  const operatorText = operatorNode.text;
59
36
  const replacements = this.REPLACEMENT_MAP[operatorText];
60
37
  if (replacements) {
61
- if (operatorText === '+' && this.isNonNumericContext(ctx)) {
62
- return;
38
+ if (operatorText === '+') {
39
+ const methodName = this.typeRegistry
40
+ ? this.getEnclosingMethodName(ctx)
41
+ : null;
42
+ if (this.isNonNumericContext(ctx, methodName)) {
43
+ return;
44
+ }
63
45
  }
64
46
  for (const replacement of replacements) {
65
47
  this.createMutationFromTerminalNode(operatorNode, replacement);
@@ -68,70 +50,24 @@ export class ArithmeticOperatorMutator extends ReturnTypeAwareBaseListener {
68
50
  }
69
51
  }
70
52
  }
71
- isNonNumericContext(ctx) {
53
+ isNonNumericContext(ctx, methodName) {
72
54
  const leftText = ctx.getChild(0).text;
73
55
  const rightText = ctx.getChild(2).text;
74
- return (this.isNonNumericOperand(leftText) || this.isNonNumericOperand(rightText));
56
+ return (this.isNonNumericOperand(leftText, methodName) ||
57
+ this.isNonNumericOperand(rightText, methodName));
75
58
  }
76
- isNonNumericOperand(text) {
59
+ isNonNumericOperand(text, methodName) {
77
60
  if (text.includes("'")) {
78
61
  return true;
79
62
  }
80
- const variableType = this.methodScopeVariables.get(text) ?? this.classFields.get(text);
81
- if (variableType !== undefined) {
82
- return !ArithmeticOperatorMutator.NUMERIC_TYPES.has(this.resolveApexType(variableType));
83
- }
84
- if (text.includes('.')) {
85
- const rootVar = text.split('.')[0];
86
- const rootType = this.methodScopeVariables.get(rootVar) ?? this.classFields.get(rootVar);
87
- if (rootType !== undefined) {
88
- if (this._sObjectDescribeRepository?.isSObject(rootType)) {
89
- const fieldName = text.split('.').slice(1).join('.');
90
- const fieldType = this._sObjectDescribeRepository.resolveFieldType(rootType, fieldName);
91
- if (fieldType !== undefined) {
92
- return !ArithmeticOperatorMutator.NUMERIC_TYPES.has(fieldType);
93
- }
94
- return true;
95
- }
96
- return !ArithmeticOperatorMutator.NUMERIC_TYPES.has(this.resolveApexType(rootType));
97
- }
98
- }
99
- const methodCallMatch = text.match(/^(\w+)\(/);
100
- if (methodCallMatch) {
101
- const methodName = methodCallMatch[1];
102
- const methodInfo = this.typeTable.get(methodName);
103
- if (methodInfo) {
104
- return !ArithmeticOperatorMutator.NUMERIC_TYPES.has(methodInfo.type);
63
+ if (this.typeRegistry && methodName) {
64
+ const resolved = this.typeRegistry.resolveType(methodName, text);
65
+ if (resolved) {
66
+ return !ArithmeticOperatorMutator.NUMERIC_TYPES.has(resolved.apexType);
105
67
  }
68
+ return false;
106
69
  }
107
70
  return false;
108
71
  }
109
- resolveApexType(typeName) {
110
- const typeMap = {
111
- integer: ApexType.INTEGER,
112
- long: ApexType.LONG,
113
- double: ApexType.DOUBLE,
114
- decimal: ApexType.DECIMAL,
115
- string: ApexType.STRING,
116
- boolean: ApexType.BOOLEAN,
117
- date: ApexType.DATE,
118
- datetime: ApexType.DATETIME,
119
- id: ApexType.ID,
120
- };
121
- return typeMap[typeName] ?? ApexType.OBJECT;
122
- }
123
- trackVariableDeclaration(ctx, target) {
124
- if (ctx.children && ctx.children.length >= 2) {
125
- const typeName = ctx.children[0].text;
126
- for (let i = 1; i < ctx.children.length; i++) {
127
- const child = ctx.children[i];
128
- const childText = child.text;
129
- if (childText !== ',' && childText !== '=') {
130
- const varName = childText.split('=')[0];
131
- target.set(varName, typeName.toLowerCase());
132
- }
133
- }
134
- }
135
- }
136
72
  }
137
73
  //# sourceMappingURL=arithmeticOperatorMutator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"arithmeticOperatorMutator.js","sourceRoot":"","sources":["../../src/mutator/arithmeticOperatorMutator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"arithmeticOperatorMutator.js","sourceRoot":"","sources":["../../src/mutator/arithmeticOperatorMutator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ParserRuleContext } from 'antlr4ts';
2
+ import { DotMethodCallContext } from 'apex-parser';
3
+ import type { ApexType } from '../type/ApexMethod.js';
4
+ import type { ResolvedType, TypeRegistry } from '../type/TypeRegistry.js';
5
+ export interface DotMethodCallInfo {
6
+ dotMethodCall: DotMethodCallContext;
7
+ methodName: string;
8
+ enclosingMethod: string;
9
+ returnType: ResolvedType;
10
+ }
11
+ export declare function getEnclosingMethodName(ctx: ParserRuleContext): string | null;
12
+ export declare function resolveDotMethodCall(ctx: ParserRuleContext, typeRegistry: TypeRegistry): DotMethodCallInfo | null;
13
+ export declare function extractArguments(methodCallCtx: ParserRuleContext): ParserRuleContext[];
14
+ export declare function resolveExpressionApexType(text: string, enclosingMethod: string, typeRegistry: TypeRegistry): ApexType | null;
@@ -0,0 +1,71 @@
1
+ import { ParserRuleContext } from 'antlr4ts';
2
+ import { DotMethodCallContext, ExpressionListContext, MethodDeclarationContext, } from 'apex-parser';
3
+ import { APEX_TYPE } from '../type/ApexMethod.js';
4
+ export function getEnclosingMethodName(ctx) {
5
+ let current = ctx.parent;
6
+ while (current) {
7
+ if (current instanceof MethodDeclarationContext) {
8
+ return current.children?.[1]?.text ?? null;
9
+ }
10
+ current = current.parent;
11
+ }
12
+ return null;
13
+ }
14
+ export function resolveDotMethodCall(ctx, typeRegistry) {
15
+ if (!ctx.children || ctx.children.length < 3) {
16
+ return null;
17
+ }
18
+ const lastChild = ctx.children[ctx.children.length - 1];
19
+ if (!(lastChild instanceof DotMethodCallContext)) {
20
+ return null;
21
+ }
22
+ if (!lastChild.children || lastChild.children.length < 3) {
23
+ return null;
24
+ }
25
+ const methodName = lastChild.children[0].text;
26
+ const enclosingMethod = getEnclosingMethodName(ctx);
27
+ if (!enclosingMethod) {
28
+ return null;
29
+ }
30
+ const returnType = typeRegistry.resolveType(enclosingMethod, `${methodName}()`);
31
+ if (!returnType) {
32
+ return null;
33
+ }
34
+ return {
35
+ dotMethodCall: lastChild,
36
+ methodName,
37
+ enclosingMethod,
38
+ returnType,
39
+ };
40
+ }
41
+ export function extractArguments(methodCallCtx) {
42
+ if (!methodCallCtx.children) {
43
+ return [];
44
+ }
45
+ for (const child of methodCallCtx.children) {
46
+ if (child instanceof ExpressionListContext) {
47
+ if (!child.children) {
48
+ return [];
49
+ }
50
+ return child.children.filter(c => c instanceof ParserRuleContext);
51
+ }
52
+ }
53
+ return [];
54
+ }
55
+ export function resolveExpressionApexType(text, enclosingMethod, typeRegistry) {
56
+ if (/^\d/.test(text)) {
57
+ if (/L$/i.test(text))
58
+ return APEX_TYPE.LONG;
59
+ if (text.includes('.'))
60
+ return APEX_TYPE.DOUBLE;
61
+ return APEX_TYPE.INTEGER;
62
+ }
63
+ if (text.startsWith("'"))
64
+ return APEX_TYPE.STRING;
65
+ const lower = text.toLowerCase();
66
+ if (lower === 'true' || lower === 'false')
67
+ return APEX_TYPE.BOOLEAN;
68
+ const resolved = typeRegistry.resolveType(enclosingMethod, text);
69
+ return resolved?.apexType ?? null;
70
+ }
71
+ //# sourceMappingURL=astUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astUtils.js","sourceRoot":"","sources":["../../src/mutator/astUtils.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  import { ParserRuleContext, Token } from 'antlr4ts';
2
2
  import { TerminalNode } from 'antlr4ts/tree/index.js';
3
3
  import { ApexParserListener } from 'apex-parser';
4
- import { SObjectDescribeRepository } from '../adapter/sObjectDescribeRepository.js';
5
4
  import { ApexMutation } from '../type/ApexMutation.js';
5
+ import { TypeRegistry } from '../type/TypeRegistry.js';
6
6
  export declare class BaseListener implements ApexParserListener {
7
+ protected typeRegistry?: TypeRegistry | undefined;
7
8
  _mutations: ApexMutation[];
8
- _sObjectDescribeRepository?: SObjectDescribeRepository;
9
- setSObjectDescribeRepository(repository: SObjectDescribeRepository): void;
9
+ _coveredLines?: Set<number>;
10
+ setCoveredLines(coveredLines: Set<number>): void;
11
+ constructor(typeRegistry?: TypeRegistry | undefined);
12
+ protected getEnclosingMethodName(ctx: ParserRuleContext): string | null;
10
13
  protected createMutation(startToken: Token, endToken: Token, originalText: string, replacement: string): void;
11
14
  protected createMutationFromParserRuleContext(ctx: ParserRuleContext, replacement: string): void;
12
15
  protected createMutationFromTerminalNode(node: TerminalNode, replacement: string): void;
@@ -1,9 +1,17 @@
1
+ import { getEnclosingMethodName } from './astUtils.js';
1
2
  // @ts-ignore: Base type with just a common _mutations property
2
3
  export class BaseListener {
4
+ typeRegistry;
3
5
  _mutations = [];
4
- _sObjectDescribeRepository;
5
- setSObjectDescribeRepository(repository) {
6
- this._sObjectDescribeRepository = repository;
6
+ _coveredLines;
7
+ setCoveredLines(coveredLines) {
8
+ this._coveredLines = coveredLines;
9
+ }
10
+ constructor(typeRegistry) {
11
+ this.typeRegistry = typeRegistry;
12
+ }
13
+ getEnclosingMethodName(ctx) {
14
+ return getEnclosingMethodName(ctx);
7
15
  }
8
16
  createMutation(startToken, endToken, originalText, replacement) {
9
17
  this._mutations.push({
@@ -1 +1 @@
1
- {"version":3,"file":"baseListener.js","sourceRoot":"","sources":["../../src/mutator/baseListener.ts"],"names":[],"mappings":"AAMA,+DAA+D;AAC/D,MAAM,OAAO,YAAY;IACvB,UAAU,GAAmB,EAAE,CAAA;IAC/B,0BAA0B,CAA4B;IAEtD,4BAA4B,CAAC,UAAqC;QAChE,IAAI,CAAC,0BAA0B,GAAG,UAAU,CAAA;IAC9C,CAAC;IAES,cAAc,CACtB,UAAiB,EACjB,QAAe,EACf,YAAoB,EACpB,WAAmB;QAEnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YACnC,MAAM,EAAE;gBACN,UAAU;gBACV,QAAQ;gBACR,IAAI,EAAE,YAAY;aACnB;YACD,WAAW;SACZ,CAAC,CAAA;IACJ,CAAC;IAES,mCAAmC,CAC3C,GAAsB,EACtB,WAAmB;QAEnB,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAES,8BAA8B,CACtC,IAAkB,EAClB,WAAmB;QAEnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"baseListener.js","sourceRoot":"","sources":["../../src/mutator/baseListener.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAEtD,+DAA+D;AAC/D,MAAM,OAAO,YAAY;IAQD;IAPtB,UAAU,GAAmB,EAAE,CAAA;IAC/B,aAAa,CAAc;IAE3B,eAAe,CAAC,YAAyB;QACvC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAA;IACnC,CAAC;IAED,YAAsB,YAA2B;QAA3B,iBAAY,GAAZ,YAAY,CAAe;IAAG,CAAC;IAE3C,sBAAsB,CAAC,GAAsB;QACrD,OAAO,sBAAsB,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;IAES,cAAc,CACtB,UAAiB,EACjB,QAAe,EACf,YAAoB,EACpB,WAAmB;QAEnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YACnC,MAAM,EAAE;gBACN,UAAU;gBACV,QAAQ;gBACR,IAAI,EAAE,YAAY;aACnB;YACD,WAAW;SACZ,CAAC,CAAA;IACJ,CAAC;IAES,mCAAmC,CAC3C,GAAsB,EACtB,WAAmB;QAEnB,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAES,8BAA8B,CACtC,IAAkB,EAClB,WAAmB;QAEnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { ParserRuleContext } from 'antlr4ts';
2
+ import { BaseListener } from './baseListener.js';
3
+ export declare class BitwiseOperatorMutator extends BaseListener {
4
+ private readonly REPLACEMENT_MAP;
5
+ enterBitAndExpression(ctx: ParserRuleContext): void;
6
+ enterBitOrExpression(ctx: ParserRuleContext): void;
7
+ enterBitNotExpression(ctx: ParserRuleContext): void;
8
+ private processBitwiseOperation;
9
+ }
@@ -0,0 +1,33 @@
1
+ import { TerminalNode } from 'antlr4ts/tree/index.js';
2
+ import { BaseListener } from './baseListener.js';
3
+ export class BitwiseOperatorMutator extends BaseListener {
4
+ REPLACEMENT_MAP = {
5
+ '&': '|',
6
+ '|': '&',
7
+ '^': '&',
8
+ };
9
+ enterBitAndExpression(ctx) {
10
+ this.processBitwiseOperation(ctx);
11
+ }
12
+ enterBitOrExpression(ctx) {
13
+ this.processBitwiseOperation(ctx);
14
+ }
15
+ enterBitNotExpression(ctx) {
16
+ this.processBitwiseOperation(ctx);
17
+ }
18
+ processBitwiseOperation(ctx) {
19
+ if (ctx.childCount !== 3) {
20
+ return;
21
+ }
22
+ const operatorNode = ctx.getChild(1);
23
+ if (!(operatorNode instanceof TerminalNode)) {
24
+ return;
25
+ }
26
+ const operatorText = operatorNode.text;
27
+ const replacement = this.REPLACEMENT_MAP[operatorText];
28
+ if (replacement) {
29
+ this.createMutationFromTerminalNode(operatorNode, replacement);
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=bitwiseOperatorMutator.js.map