boperators 0.1.3 → 0.2.0

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 (55) hide show
  1. package/README.md +8 -2
  2. package/dist/{esm/core → core}/OverloadInjector.d.ts +3 -3
  3. package/dist/core/OverloadInjector.js +154 -0
  4. package/dist/core/SourceMap.d.ts +20 -0
  5. package/dist/{cjs/core → core}/SourceMap.js +2 -78
  6. package/dist/core/v3SourceMap.d.ts +21 -0
  7. package/dist/core/v3SourceMap.js +121 -0
  8. package/dist/{esm/index.d.ts → index.d.ts} +3 -1
  9. package/dist/{cjs/index.js → index.js} +4 -2
  10. package/package.json +14 -12
  11. package/dist/cjs/core/OverloadInjector.js +0 -136
  12. package/dist/cjs/lib/index.js +0 -17
  13. package/dist/esm/core/BopConfig.js +0 -65
  14. package/dist/esm/core/ErrorManager.js +0 -118
  15. package/dist/esm/core/OverloadInjector.js +0 -129
  16. package/dist/esm/core/OverloadStore.js +0 -624
  17. package/dist/esm/core/SourceMap.d.ts +0 -41
  18. package/dist/esm/core/SourceMap.js +0 -164
  19. package/dist/esm/core/helpers/ensureImportedName.js +0 -46
  20. package/dist/esm/core/helpers/getImportedNameForSymbol.js +0 -60
  21. package/dist/esm/core/helpers/getModuleSpecifier.js +0 -57
  22. package/dist/esm/core/helpers/getOperatorStringFromProperty.js +0 -30
  23. package/dist/esm/core/helpers/resolveExpressionType.js +0 -37
  24. package/dist/esm/core/helpers/unwrapInitializer.js +0 -15
  25. package/dist/esm/core/operatorMap.js +0 -92
  26. package/dist/esm/core/validateExports.js +0 -84
  27. package/dist/esm/index.js +0 -14
  28. package/dist/esm/lib/index.d.ts +0 -1
  29. package/dist/esm/lib/index.js +0 -1
  30. package/dist/esm/lib/operatorSymbols.js +0 -36
  31. package/logo.png +0 -0
  32. /package/dist/{esm/core → core}/BopConfig.d.ts +0 -0
  33. /package/dist/{cjs/core → core}/BopConfig.js +0 -0
  34. /package/dist/{esm/core → core}/ErrorManager.d.ts +0 -0
  35. /package/dist/{cjs/core → core}/ErrorManager.js +0 -0
  36. /package/dist/{esm/core → core}/OverloadStore.d.ts +0 -0
  37. /package/dist/{cjs/core → core}/OverloadStore.js +0 -0
  38. /package/dist/{esm/core → core}/helpers/ensureImportedName.d.ts +0 -0
  39. /package/dist/{cjs/core → core}/helpers/ensureImportedName.js +0 -0
  40. /package/dist/{esm/core → core}/helpers/getImportedNameForSymbol.d.ts +0 -0
  41. /package/dist/{cjs/core → core}/helpers/getImportedNameForSymbol.js +0 -0
  42. /package/dist/{esm/core → core}/helpers/getModuleSpecifier.d.ts +0 -0
  43. /package/dist/{cjs/core → core}/helpers/getModuleSpecifier.js +0 -0
  44. /package/dist/{esm/core → core}/helpers/getOperatorStringFromProperty.d.ts +0 -0
  45. /package/dist/{cjs/core → core}/helpers/getOperatorStringFromProperty.js +0 -0
  46. /package/dist/{esm/core → core}/helpers/resolveExpressionType.d.ts +0 -0
  47. /package/dist/{cjs/core → core}/helpers/resolveExpressionType.js +0 -0
  48. /package/dist/{esm/core → core}/helpers/unwrapInitializer.d.ts +0 -0
  49. /package/dist/{cjs/core → core}/helpers/unwrapInitializer.js +0 -0
  50. /package/dist/{esm/core → core}/operatorMap.d.ts +0 -0
  51. /package/dist/{cjs/core → core}/operatorMap.js +0 -0
  52. /package/dist/{esm/core → core}/validateExports.d.ts +0 -0
  53. /package/dist/{cjs/core → core}/validateExports.js +0 -0
  54. /package/dist/{esm/lib → lib}/operatorSymbols.d.ts +0 -0
  55. /package/dist/{cjs/lib → lib}/operatorSymbols.js +0 -0
@@ -1,136 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.OverloadInjector = void 0;
7
- const node_path_1 = __importDefault(require("node:path"));
8
- const ts_morph_1 = require("ts-morph");
9
- const ensureImportedName_1 = require("./helpers/ensureImportedName");
10
- const getModuleSpecifier_1 = require("./helpers/getModuleSpecifier");
11
- const resolveExpressionType_1 = require("./helpers/resolveExpressionType");
12
- const operatorMap_1 = require("./operatorMap");
13
- const SourceMap_1 = require("./SourceMap");
14
- class OverloadInjector {
15
- constructor(
16
- /**
17
- * TS Morph project.
18
- */
19
- _project,
20
- /**
21
- * Overload store.
22
- */
23
- _overloadStore, logger) {
24
- this._project = _project;
25
- this._overloadStore = _overloadStore;
26
- this._logger = logger;
27
- }
28
- overloadFile(file) {
29
- const sourceFile = file instanceof ts_morph_1.SourceFile
30
- ? file
31
- : this._project.getSourceFileOrThrow(file);
32
- const fileName = node_path_1.default.basename(sourceFile.getFilePath());
33
- const originalText = sourceFile.getFullText();
34
- let transformCount = 0;
35
- // Process one innermost binary expression per iteration,
36
- // re-fetching descendants each time so types resolve correctly
37
- // after each transformation and AST references stay fresh.
38
- let changed = true;
39
- while (changed) {
40
- changed = false;
41
- // Reverse DFS pre-order → innermost expressions first
42
- const binaryExpressions = sourceFile
43
- .getDescendantsOfKind(ts_morph_1.SyntaxKind.BinaryExpression)
44
- .reverse();
45
- for (const expression of binaryExpressions) {
46
- const operatorKind = expression.getOperatorToken().getKind();
47
- if (!(0, operatorMap_1.isOperatorSyntaxKind)(operatorKind))
48
- continue;
49
- const lhs = expression.getLeft();
50
- const leftType = (0, resolveExpressionType_1.resolveExpressionType)(lhs);
51
- const rhs = expression.getRight();
52
- const rightType = (0, resolveExpressionType_1.resolveExpressionType)(rhs);
53
- const overloadDesc = this._overloadStore.findOverload(operatorKind, leftType, rightType);
54
- if (!overloadDesc)
55
- continue;
56
- const { className: classNameRaw, classFilePath, operatorString, index, isStatic, } = overloadDesc;
57
- // Look up the fresh ClassDeclaration from the project
58
- const classSourceFile = this._project.getSourceFileOrThrow(classFilePath);
59
- const classDecl = classSourceFile.getClassOrThrow(classNameRaw);
60
- // Ensure class is imported, get its textual name
61
- const classModuleSpecifier = (0, getModuleSpecifier_1.getModuleSpecifier)(sourceFile, classSourceFile);
62
- const className = (0, ensureImportedName_1.ensureImportedName)(sourceFile, classDecl.getSymbol(), classModuleSpecifier);
63
- // Build the text code to replace the binary operator with the overload call
64
- const overloadCall = isStatic
65
- ? `${className}["${operatorString}"][${index}](${lhs.getText()}, ${rhs.getText()})`
66
- : `${lhs.getText()}["${operatorString}"][${index}].call(${lhs.getText()}, ${rhs.getText()})`;
67
- this._logger.debug(`${fileName}: ${expression.getText()} => ${overloadCall}`);
68
- expression.replaceWithText(overloadCall);
69
- transformCount++;
70
- changed = true;
71
- break; // re-fetch descendants after each mutation
72
- }
73
- }
74
- // Process prefix unary expressions (-x, +x, !x, ~x)
75
- changed = true;
76
- while (changed) {
77
- changed = false;
78
- const prefixExpressions = sourceFile
79
- .getDescendantsOfKind(ts_morph_1.SyntaxKind.PrefixUnaryExpression)
80
- .reverse();
81
- for (const expression of prefixExpressions) {
82
- const operatorKind = expression.getOperatorToken();
83
- if (!(0, operatorMap_1.isPrefixUnaryOperatorSyntaxKind)(operatorKind))
84
- continue;
85
- const operand = expression.getOperand();
86
- const operandType = (0, resolveExpressionType_1.resolveExpressionType)(operand);
87
- const overloadDesc = this._overloadStore.findPrefixUnaryOverload(operatorKind, operandType);
88
- if (!overloadDesc)
89
- continue;
90
- const { className: classNameRaw, classFilePath, operatorString, index, } = overloadDesc;
91
- const classSourceFile = this._project.getSourceFileOrThrow(classFilePath);
92
- const classDecl = classSourceFile.getClassOrThrow(classNameRaw);
93
- const classModuleSpecifier = (0, getModuleSpecifier_1.getModuleSpecifier)(sourceFile, classSourceFile);
94
- const className = (0, ensureImportedName_1.ensureImportedName)(sourceFile, classDecl.getSymbol(), classModuleSpecifier);
95
- const overloadCall = `${className}["${operatorString}"][${index}](${operand.getText()})`;
96
- this._logger.debug(`${fileName}: ${expression.getText()} => ${overloadCall}`);
97
- expression.replaceWithText(overloadCall);
98
- transformCount++;
99
- changed = true;
100
- break;
101
- }
102
- }
103
- // Process postfix unary expressions (x++, x--)
104
- changed = true;
105
- while (changed) {
106
- changed = false;
107
- const postfixExpressions = sourceFile
108
- .getDescendantsOfKind(ts_morph_1.SyntaxKind.PostfixUnaryExpression)
109
- .reverse();
110
- for (const expression of postfixExpressions) {
111
- const operatorKind = expression.getOperatorToken();
112
- if (!(0, operatorMap_1.isPostfixUnaryOperatorSyntaxKind)(operatorKind))
113
- continue;
114
- const operand = expression.getOperand();
115
- const operandType = (0, resolveExpressionType_1.resolveExpressionType)(operand);
116
- const overloadDesc = this._overloadStore.findPostfixUnaryOverload(operatorKind, operandType);
117
- if (!overloadDesc)
118
- continue;
119
- const { operatorString, index } = overloadDesc;
120
- const overloadCall = `${operand.getText()}["${operatorString}"][${index}].call(${operand.getText()})`;
121
- this._logger.debug(`${fileName}: ${expression.getText()} => ${overloadCall}`);
122
- expression.replaceWithText(overloadCall);
123
- transformCount++;
124
- changed = true;
125
- break;
126
- }
127
- }
128
- if (transformCount > 0) {
129
- this._logger.debug(`${fileName}: ${transformCount} expression${transformCount === 1 ? "" : "s"} transformed`);
130
- }
131
- const text = sourceFile.getFullText();
132
- const sourceMap = new SourceMap_1.SourceMap(originalText, text);
133
- return { sourceFile, text, sourceMap };
134
- }
135
- }
136
- exports.OverloadInjector = OverloadInjector;
@@ -1,17 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./operatorSymbols"), exports);
@@ -1,65 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- const CONFIG_FILE_NAME = ".bopconf.json";
4
- // ----- ConsoleLogger -----
5
- export class ConsoleLogger {
6
- debug(msg) {
7
- console.debug(`[boperators] ${msg}`);
8
- }
9
- info(msg) {
10
- console.log(`[boperators] ${msg}`);
11
- }
12
- warn(msg) {
13
- console.warn(`[boperators] ${msg}`);
14
- }
15
- error(msg) {
16
- console.error(`[boperators] ${msg}`);
17
- }
18
- }
19
- // ----- Filtered logger -----
20
- const LOG_LEVELS = ["debug", "info", "warn", "error", "silent"];
21
- function createFilteredLogger(inner, level) {
22
- const minIndex = LOG_LEVELS.indexOf(level);
23
- const noop = () => { };
24
- return {
25
- debug: minIndex <= 0 ? inner.debug.bind(inner) : noop,
26
- info: minIndex <= 1 ? inner.info.bind(inner) : noop,
27
- warn: minIndex <= 2 ? inner.warn.bind(inner) : noop,
28
- error: minIndex <= 3 ? inner.error.bind(inner) : noop,
29
- };
30
- }
31
- // ----- Config file discovery -----
32
- function findConfigFile(startDir) {
33
- let dir = path.resolve(startDir);
34
- while (true) {
35
- const candidate = path.join(dir, CONFIG_FILE_NAME);
36
- try {
37
- const content = fs.readFileSync(candidate, "utf-8");
38
- return JSON.parse(content);
39
- }
40
- catch (_a) {
41
- // File not found or invalid JSON — keep walking up
42
- }
43
- const parent = path.dirname(dir);
44
- if (parent === dir)
45
- break; // filesystem root
46
- dir = parent;
47
- }
48
- return {};
49
- }
50
- const DEFAULTS = {
51
- errorOnWarning: false,
52
- logLevel: "info",
53
- };
54
- export function loadConfig(options) {
55
- var _a, _b;
56
- const fileConfig = findConfigFile((_a = options === null || options === void 0 ? void 0 : options.searchDir) !== null && _a !== void 0 ? _a : process.cwd());
57
- const merged = Object.assign(Object.assign(Object.assign({}, DEFAULTS), fileConfig), options === null || options === void 0 ? void 0 : options.overrides);
58
- const baseLogger = (_b = options === null || options === void 0 ? void 0 : options.logger) !== null && _b !== void 0 ? _b : new ConsoleLogger();
59
- const logger = createFilteredLogger(baseLogger, merged.logLevel);
60
- return {
61
- errorOnWarning: merged.errorOnWarning,
62
- logLevel: merged.logLevel,
63
- logger,
64
- };
65
- }
@@ -1,118 +0,0 @@
1
- import path from "node:path";
2
- /**
3
- * Stores information about an error or warning for later use.
4
- */
5
- export class ErrorDescription {
6
- /**
7
- * Create an ErrorDescription.
8
- *
9
- * @param errorMessage Custom message text describing the error.
10
- * @param filePath Error file path.
11
- * @param lineNumber Error line number in its file.
12
- * @param codeText Code relevant to the error.q
13
- */
14
- constructor(errorMessage, filePath, lineNumber, codeText) {
15
- this.errorMessage = errorMessage;
16
- this.filePath = filePath;
17
- this.lineNumber = lineNumber;
18
- this.codeText = codeText;
19
- this.fileName = path.basename(filePath);
20
- }
21
- toString() {
22
- return `${this.fileName}:${this.lineNumber}: ${this.errorMessage}\n${this.codeText}\n`;
23
- }
24
- }
25
- /**
26
- * Stores errors and warnings in a way that means
27
- * they can be logged or thrown at a later point.
28
- */
29
- export class ErrorManager {
30
- constructor(config) {
31
- /**
32
- * Array of warnings.
33
- */
34
- this._warnings = [];
35
- /**
36
- * Array of errors.
37
- */
38
- this._errors = [];
39
- this._config = config;
40
- this._errorOnWarning = config.errorOnWarning;
41
- }
42
- /**
43
- * Add an ErrorDescription or a string as a "warning",
44
- * meaning it will not throw unless `errorOnWarning` is true.
45
- * @param description Either a string describing the error or a {@link ErrorDescription} instance.
46
- */
47
- addWarning(description) {
48
- this._warnings.push(description);
49
- }
50
- /**
51
- * Add an ErrorDescription or a string as an "error",
52
- * meaning it will throw when checked.
53
- * @param description Either a string describing the error or a {@link ErrorDescription} instance.
54
- */
55
- addError(description) {
56
- this._errors.push(description);
57
- }
58
- /**
59
- * Gets all warnings as a single string, separated by newlines.
60
- * @returns String of all warnings.
61
- */
62
- getWarningString() {
63
- return this._warnings.map((warning) => warning.toString()).join("\n");
64
- }
65
- /**
66
- * Gets all errors as a single string, separated by newlines.
67
- * @returns String of all errors.
68
- */
69
- getErrorsString() {
70
- return this._errors.map((error) => error.toString()).join("\n");
71
- }
72
- /**
73
- * Throws if there are any errors currently registered in the ErrorManager.
74
- * If `errorOnWarning` is true then it will also throw if there are warnings.
75
- */
76
- throwIfErrors() {
77
- const shouldThrow = this._errors.length > 0 ||
78
- (this._errorOnWarning && this._warnings.length > 0);
79
- if (!shouldThrow)
80
- return;
81
- const errorString = this.getErrorsString() +
82
- (this._errorOnWarning ? this.getWarningString() : "");
83
- throw new Error(errorString);
84
- }
85
- /**
86
- * Will throw if there are any errors, or if there are warnings and `errorOnWarning` is true.
87
- * If it does not throw then it will log all wanrnings to the console.
88
- * @param clearSelf If true, all warnings will be cleared after logging.
89
- */
90
- throwIfErrorsElseLogWarnings(clearSelf = true) {
91
- this.throwIfErrors();
92
- if (this._warnings.length > 0) {
93
- this._config.logger.warn(this.getWarningString());
94
- }
95
- if (clearSelf) {
96
- this.clearWarnings();
97
- }
98
- }
99
- /**
100
- * Clear out registered warnings to prevent duplicate logging.
101
- */
102
- clearWarnings() {
103
- this._warnings = [];
104
- }
105
- /**
106
- * Clear out registered errors.
107
- */
108
- clearErrors() {
109
- this._errors = [];
110
- }
111
- /**
112
- * Clear all registered errors and warnings.
113
- */
114
- clear() {
115
- this._errors = [];
116
- this._warnings = [];
117
- }
118
- }
@@ -1,129 +0,0 @@
1
- import path from "node:path";
2
- import { SourceFile, SyntaxKind, } from "ts-morph";
3
- import { ensureImportedName } from "./helpers/ensureImportedName";
4
- import { getModuleSpecifier } from "./helpers/getModuleSpecifier";
5
- import { resolveExpressionType } from "./helpers/resolveExpressionType";
6
- import { isOperatorSyntaxKind, isPostfixUnaryOperatorSyntaxKind, isPrefixUnaryOperatorSyntaxKind, } from "./operatorMap";
7
- import { SourceMap } from "./SourceMap";
8
- export class OverloadInjector {
9
- constructor(
10
- /**
11
- * TS Morph project.
12
- */
13
- _project,
14
- /**
15
- * Overload store.
16
- */
17
- _overloadStore, logger) {
18
- this._project = _project;
19
- this._overloadStore = _overloadStore;
20
- this._logger = logger;
21
- }
22
- overloadFile(file) {
23
- const sourceFile = file instanceof SourceFile
24
- ? file
25
- : this._project.getSourceFileOrThrow(file);
26
- const fileName = path.basename(sourceFile.getFilePath());
27
- const originalText = sourceFile.getFullText();
28
- let transformCount = 0;
29
- // Process one innermost binary expression per iteration,
30
- // re-fetching descendants each time so types resolve correctly
31
- // after each transformation and AST references stay fresh.
32
- let changed = true;
33
- while (changed) {
34
- changed = false;
35
- // Reverse DFS pre-order → innermost expressions first
36
- const binaryExpressions = sourceFile
37
- .getDescendantsOfKind(SyntaxKind.BinaryExpression)
38
- .reverse();
39
- for (const expression of binaryExpressions) {
40
- const operatorKind = expression.getOperatorToken().getKind();
41
- if (!isOperatorSyntaxKind(operatorKind))
42
- continue;
43
- const lhs = expression.getLeft();
44
- const leftType = resolveExpressionType(lhs);
45
- const rhs = expression.getRight();
46
- const rightType = resolveExpressionType(rhs);
47
- const overloadDesc = this._overloadStore.findOverload(operatorKind, leftType, rightType);
48
- if (!overloadDesc)
49
- continue;
50
- const { className: classNameRaw, classFilePath, operatorString, index, isStatic, } = overloadDesc;
51
- // Look up the fresh ClassDeclaration from the project
52
- const classSourceFile = this._project.getSourceFileOrThrow(classFilePath);
53
- const classDecl = classSourceFile.getClassOrThrow(classNameRaw);
54
- // Ensure class is imported, get its textual name
55
- const classModuleSpecifier = getModuleSpecifier(sourceFile, classSourceFile);
56
- const className = ensureImportedName(sourceFile, classDecl.getSymbol(), classModuleSpecifier);
57
- // Build the text code to replace the binary operator with the overload call
58
- const overloadCall = isStatic
59
- ? `${className}["${operatorString}"][${index}](${lhs.getText()}, ${rhs.getText()})`
60
- : `${lhs.getText()}["${operatorString}"][${index}].call(${lhs.getText()}, ${rhs.getText()})`;
61
- this._logger.debug(`${fileName}: ${expression.getText()} => ${overloadCall}`);
62
- expression.replaceWithText(overloadCall);
63
- transformCount++;
64
- changed = true;
65
- break; // re-fetch descendants after each mutation
66
- }
67
- }
68
- // Process prefix unary expressions (-x, +x, !x, ~x)
69
- changed = true;
70
- while (changed) {
71
- changed = false;
72
- const prefixExpressions = sourceFile
73
- .getDescendantsOfKind(SyntaxKind.PrefixUnaryExpression)
74
- .reverse();
75
- for (const expression of prefixExpressions) {
76
- const operatorKind = expression.getOperatorToken();
77
- if (!isPrefixUnaryOperatorSyntaxKind(operatorKind))
78
- continue;
79
- const operand = expression.getOperand();
80
- const operandType = resolveExpressionType(operand);
81
- const overloadDesc = this._overloadStore.findPrefixUnaryOverload(operatorKind, operandType);
82
- if (!overloadDesc)
83
- continue;
84
- const { className: classNameRaw, classFilePath, operatorString, index, } = overloadDesc;
85
- const classSourceFile = this._project.getSourceFileOrThrow(classFilePath);
86
- const classDecl = classSourceFile.getClassOrThrow(classNameRaw);
87
- const classModuleSpecifier = getModuleSpecifier(sourceFile, classSourceFile);
88
- const className = ensureImportedName(sourceFile, classDecl.getSymbol(), classModuleSpecifier);
89
- const overloadCall = `${className}["${operatorString}"][${index}](${operand.getText()})`;
90
- this._logger.debug(`${fileName}: ${expression.getText()} => ${overloadCall}`);
91
- expression.replaceWithText(overloadCall);
92
- transformCount++;
93
- changed = true;
94
- break;
95
- }
96
- }
97
- // Process postfix unary expressions (x++, x--)
98
- changed = true;
99
- while (changed) {
100
- changed = false;
101
- const postfixExpressions = sourceFile
102
- .getDescendantsOfKind(SyntaxKind.PostfixUnaryExpression)
103
- .reverse();
104
- for (const expression of postfixExpressions) {
105
- const operatorKind = expression.getOperatorToken();
106
- if (!isPostfixUnaryOperatorSyntaxKind(operatorKind))
107
- continue;
108
- const operand = expression.getOperand();
109
- const operandType = resolveExpressionType(operand);
110
- const overloadDesc = this._overloadStore.findPostfixUnaryOverload(operatorKind, operandType);
111
- if (!overloadDesc)
112
- continue;
113
- const { operatorString, index } = overloadDesc;
114
- const overloadCall = `${operand.getText()}["${operatorString}"][${index}].call(${operand.getText()})`;
115
- this._logger.debug(`${fileName}: ${expression.getText()} => ${overloadCall}`);
116
- expression.replaceWithText(overloadCall);
117
- transformCount++;
118
- changed = true;
119
- break;
120
- }
121
- }
122
- if (transformCount > 0) {
123
- this._logger.debug(`${fileName}: ${transformCount} expression${transformCount === 1 ? "" : "s"} transformed`);
124
- }
125
- const text = sourceFile.getFullText();
126
- const sourceMap = new SourceMap(originalText, text);
127
- return { sourceFile, text, sourceMap };
128
- }
129
- }