From 3dc8ec4a90c8c426e24faff87a8dc38759726647 Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Tue, 3 Jun 2025 17:28:40 +0200 Subject: [PATCH 1/7] feat: Added FixHintsGenerator for Configuration API --- .../ConfigurationFixHintsGenerator.ts | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts diff --git a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts new file mode 100644 index 000000000..84fd174ac --- /dev/null +++ b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts @@ -0,0 +1,85 @@ +import ts from "typescript"; +import type {ExportCodeToBeUsed, FixHints} from "./FixHints.js"; +import {isExpectedValueExpression, Ui5TypeInfoKind} from "../utils/utils.js"; +import {AmbientModuleCache} from "../AmbientModuleCache.js"; +import type {Ui5TypeInfo} from "../utils/utils.js"; + +const configurationModulesReplacements = new Map([ + // https://github.com/SAP/ui5-linter/issues/620 + ["getAccessibility", { + moduleName: "sap/ui/core/ControlBehavior", exportNameToBeUsed: "isAccessibilityEnabled", + }], + ["getActiveTerminologies", { + moduleName: "sap/base/i18n/Localization", exportNameToBeUsed: "getActiveTerminologies", + }], + ["getAllowlistService", { + moduleName: "sap/ui/security/Security", exportNameToBeUsed: "getAllowlistService", + }], + ["getAnimationMode", { + moduleName: "sap/ui/core/ControlBehavior", exportNameToBeUsed: "getAnimationMode", + }], + ["getCalendarType", { + moduleName: "sap/base/i18n/Formatting", exportNameToBeUsed: "getCalendarType", + }], + ["getCalendarWeekNumbering", { + moduleName: "sap/base/i18n/Formatting", exportNameToBeUsed: "getCalendarWeekNumbering", + }], + ["getFrameOptions", { + moduleName: "sap/ui/security/Security", exportNameToBeUsed: "getFrameOptions", + }], + ["getLanguage", { + moduleName: "sap/base/i18n/Localization", exportNameToBeUsed: "getLanguage", + }], + ["getRTL", { + moduleName: "sap/base/i18n/Localization", exportNameToBeUsed: "getRTL", + }], + ["getSAPLogonLanguage", { + moduleName: "sap/base/i18n/Localization", exportNameToBeUsed: "getSAPLogonLanguage", + }], + ["getSecurityTokenHandlers", { + moduleName: "sap/ui/security/Security", exportNameToBeUsed: "getSecurityTokenHandlers", + }], + ["getTheme", { + moduleName: "sap/ui/core/Theming", exportNameToBeUsed: "getTheme", + }], + ["getTimezone", { + moduleName: "sap/base/i18n/Localization", exportNameToBeUsed: "getTimezone", + }], + ["getUIDPrefix", { + moduleName: "sap/ui/base/ManagedObjectMetadata", exportNameToBeUsed: "getUIDPrefix", + }], + ["getWhitelistService", { + moduleName: "sap/ui/security/Security", exportNameToBeUsed: "getAllowlistService", + }], + ["setAnimationMode", { + moduleName: "sap/ui/core/ControlBehavior", exportNameToBeUsed: "setAnimationMode", + }], + ["setSecurityTokenHandlers", { + moduleName: "sap/ui/security/Security", exportNameToBeUsed: "setSecurityTokenHandlers", + }], + + // TODO: MR: Discuss: Old API returns this, but new API returns undefined. Is this problematic? + // setCalendarType() + // setCalendarWeekNumbering() + // setFormatLocale() + // setLanguage() + // setRTL() + // setTheme() + // setTimezone() + ["getLanguageTag", { + moduleName: "sap/base/i18n/Localization", exportCodeToBeUsed: "$moduleIdentifier.getLanguageTag().toString()", + }], + // TODO: + // getAnimation() //TODO: MR: Discuss: Old API returns boolean, new API returns AnimationMode. How to migrate? + // getFormatLocale() + // getLocale() //TODO: MR: Discuss: + // "Configuration.getLocale()" needs to be replaced with "new Locale(Localization.getLanguageTag())". + // (-> 2 new module imports) How to setup this map entry? + // getVersion() //TODO: MR: Discuss: New API needs wrapper around the replacement + +]); + +export default class ConfigurationFixHintsGenerator { + getFixHints(node: ts.CallExpression | ts.AccessExpression, ui5TypeInfo?: Ui5TypeInfo): FixHints | undefined { + } +} From b08e084c98b73f78971e967a84ffbaf88251ec56 Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Wed, 4 Jun 2025 13:49:51 +0200 Subject: [PATCH 2/7] feat: Adjust FixHints map --- .../fixHints/ConfigurationFixHintsGenerator.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts index 84fd174ac..d1ac20485 100644 --- a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts +++ b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts @@ -58,7 +58,7 @@ const configurationModulesReplacements = new Map([ moduleName: "sap/ui/security/Security", exportNameToBeUsed: "setSecurityTokenHandlers", }], - // TODO: MR: Discuss: Old API returns this, but new API returns undefined. Is this problematic? + // TODO: Complex replacements: Old API returns this, but new API returns undefined. // setCalendarType() // setCalendarWeekNumbering() // setFormatLocale() @@ -69,13 +69,18 @@ const configurationModulesReplacements = new Map([ ["getLanguageTag", { moduleName: "sap/base/i18n/Localization", exportCodeToBeUsed: "$moduleIdentifier.getLanguageTag().toString()", }], - // TODO: - // getAnimation() //TODO: MR: Discuss: Old API returns boolean, new API returns AnimationMode. How to migrate? - // getFormatLocale() - // getLocale() //TODO: MR: Discuss: + // TODO: Complex replacement: Discuss: Old API returns boolean, new API returns AnimationMode. How to migrate? + // getAnimation() + ["getFormatLocale", { + moduleName: "sap/base/i18n/Formatting", exportCodeToBeUsed: "$moduleIdentifier.getFormatLocale().toString()", + }], + // getLocale() //TODO: Complex replacement: // "Configuration.getLocale()" needs to be replaced with "new Locale(Localization.getLanguageTag())". // (-> 2 new module imports) How to setup this map entry? - // getVersion() //TODO: MR: Discuss: New API needs wrapper around the replacement + + // Migration not possible + // Old API is sync and new API is async + // getVersion() // MR: Discuss: New API needs wrapper around the replacement ]); From cced646e0319ad8fcf8cfb30eae99d82d3c27e41 Mon Sep 17 00:00:00 2001 From: Yavor Ivanov Date: Wed, 4 Jun 2025 14:57:49 +0300 Subject: [PATCH 3/7] feat: Enable ConfigFixHintsGenerator --- src/linter/ui5Types/SourceFileLinter.ts | 4 ++++ src/linter/ui5Types/fixHints/FixHintsGenerator.ts | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/linter/ui5Types/SourceFileLinter.ts b/src/linter/ui5Types/SourceFileLinter.ts index 5697375c9..25274099d 100644 --- a/src/linter/ui5Types/SourceFileLinter.ts +++ b/src/linter/ui5Types/SourceFileLinter.ts @@ -1795,4 +1795,8 @@ export default class SourceFileLinter { getCoreFixHints(node: ts.CallExpression | ts.AccessExpression, ui5TypeInfo?: Ui5TypeInfo) { return this.#fixHintsGenerator?.getCoreFixHints(node, ui5TypeInfo); } + + getConfigFixHints(node: ts.CallExpression | ts.AccessExpression, ui5TypeInfo?: Ui5TypeInfo) { + return this.#fixHintsGenerator?.getConfigFixHints(node, ui5TypeInfo); + } } diff --git a/src/linter/ui5Types/fixHints/FixHintsGenerator.ts b/src/linter/ui5Types/fixHints/FixHintsGenerator.ts index c97b4994f..ef2983d21 100644 --- a/src/linter/ui5Types/fixHints/FixHintsGenerator.ts +++ b/src/linter/ui5Types/fixHints/FixHintsGenerator.ts @@ -5,11 +5,13 @@ import JquerySapFixHintsGenerator from "./JquerySapFixHintsGenerator.js"; import CoreFixHintsGenerator from "./CoreFixHintsGenerator.js"; import {FixHints} from "./FixHints.js"; import type {Ui5TypeInfo} from "../utils/utils.js"; +import ConfigurationFixHintsGenerator from "./ConfigurationFixHintsGenerator.js"; export default class FixHintsGenerator { private globalsGenerator: GlobalsFixHintsGenerator; private jquerySapGenerator: JquerySapFixHintsGenerator; private coreGenerator: CoreFixHintsGenerator; + private configGenerator: ConfigurationFixHintsGenerator; constructor( resourcePath: string, @@ -18,6 +20,7 @@ export default class FixHintsGenerator { this.globalsGenerator = new GlobalsFixHintsGenerator(resourcePath, ambientModuleCache); this.jquerySapGenerator = new JquerySapFixHintsGenerator(); this.coreGenerator = new CoreFixHintsGenerator(ambientModuleCache); + this.configGenerator = new ConfigurationFixHintsGenerator(); } public getGlobalsFixHints(node: ts.CallExpression | ts.AccessExpression): FixHints | undefined { @@ -34,4 +37,9 @@ export default class FixHintsGenerator { ui5TypeInfo?: Ui5TypeInfo): FixHints | undefined { return this.coreGenerator.getFixHints(node, ui5TypeInfo); } + + public getConfigFixHints(node: ts.CallExpression | ts.AccessExpression, + ui5TypeInfo?: Ui5TypeInfo): FixHints | undefined { + return this.configGenerator.getFixHints(node, ui5TypeInfo); + } } From 6ff8f563281f6365d89e852946d4872de9922aa9 Mon Sep 17 00:00:00 2001 From: Yavor Ivanov Date: Wed, 4 Jun 2025 15:11:06 +0300 Subject: [PATCH 4/7] feat: Implement getFixHints for ConfigurationGenerator --- src/linter/ui5Types/SourceFileLinter.ts | 3 +- .../ConfigurationFixHintsGenerator.ts | 45 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/linter/ui5Types/SourceFileLinter.ts b/src/linter/ui5Types/SourceFileLinter.ts index 25274099d..35f3de2ae 100644 --- a/src/linter/ui5Types/SourceFileLinter.ts +++ b/src/linter/ui5Types/SourceFileLinter.ts @@ -916,7 +916,8 @@ export default class SourceFileLinter { ts.isPropertyAccessExpression(exprNode) || ts.isCallExpression(exprNode)) { fixHints = this.getJquerySapFixHints(exprNode) ?? - this.getCoreFixHints(exprNode, deprecationInfo.ui5TypeInfo); + this.getCoreFixHints(exprNode, deprecationInfo.ui5TypeInfo) ?? + this.getConfigFixHints(exprNode, deprecationInfo.ui5TypeInfo); } this.#reporter.addMessage(MESSAGE.DEPRECATED_FUNCTION_CALL, { functionName: propName, diff --git a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts index d1ac20485..fd003ff67 100644 --- a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts +++ b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts @@ -1,7 +1,6 @@ import ts from "typescript"; import type {ExportCodeToBeUsed, FixHints} from "./FixHints.js"; import {isExpectedValueExpression, Ui5TypeInfoKind} from "../utils/utils.js"; -import {AmbientModuleCache} from "../AmbientModuleCache.js"; import type {Ui5TypeInfo} from "../utils/utils.js"; const configurationModulesReplacements = new Map([ @@ -86,5 +85,49 @@ const configurationModulesReplacements = new Map([ export default class ConfigurationFixHintsGenerator { getFixHints(node: ts.CallExpression | ts.AccessExpression, ui5TypeInfo?: Ui5TypeInfo): FixHints | undefined { + if (!ts.isPropertyAccessExpression(node)) { + return undefined; + } + + if (!ui5TypeInfo || + ui5TypeInfo.kind !== Ui5TypeInfoKind.Module || + ui5TypeInfo.module !== "sap/ui/core/Configuration") { + return undefined; + } + + const methodName = "export" in ui5TypeInfo ? ui5TypeInfo.export ?? "" : ""; + const moduleReplacement = configurationModulesReplacements.get(methodName); + if (!moduleReplacement) { + return undefined; + } + + let exportCodeToBeUsed; + if (moduleReplacement.exportCodeToBeUsed) { + exportCodeToBeUsed = { + name: moduleReplacement.exportCodeToBeUsed, + // Check whether the return value of the call expression is assigned to a variable, + // passed to another function or used elsewhere. + isExpectedValue: isExpectedValueExpression(node), + } as ExportCodeToBeUsed; + + let callExpression; + if (ts.isCallExpression(node.parent) && + // if a prop is wrapped in a function, then current.parent is the call expression + // which is wrong. That's why check if parent expression is actually the current node + // which would ensure that the prop is actually a call expression. + node.parent.expression === node) { + callExpression = node.parent; + } + + // Extract arguments from the call expression + if (callExpression) { + exportCodeToBeUsed.args = callExpression.arguments.map((arg) => ({ + value: arg.getText(), + kind: arg?.kind, + })); + } + } + + return {...moduleReplacement, exportCodeToBeUsed}; } } From 9611cc285e5a73b2d46286a4bbc80836a0f7e83c Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Wed, 4 Jun 2025 15:59:18 +0200 Subject: [PATCH 5/7] test: Add fixtures for basic migrations --- .../ConfigurationFixHintsGenerator.ts | 15 +- .../DeprecatedConfigurationApi.js | 24 ++ ...DeprecatedConfigurationApiWithoutImport.js | 62 +++++ .../autofix/snapshots/autofix.fixtures.ts.md | 242 ++++++++++++++++++ .../snapshots/autofix.fixtures.ts.snap | Bin 35267 -> 36668 bytes 5 files changed, 338 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js create mode 100644 test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js diff --git a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts index fd003ff67..29759e363 100644 --- a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts +++ b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts @@ -65,22 +65,27 @@ const configurationModulesReplacements = new Map([ // setRTL() // setTheme() // setTimezone() + ["getLanguageTag", { moduleName: "sap/base/i18n/Localization", exportCodeToBeUsed: "$moduleIdentifier.getLanguageTag().toString()", }], + // TODO: Complex replacement: Discuss: Old API returns boolean, new API returns AnimationMode. How to migrate? + // (-> 2 new module imports) How to setup this map entry? // getAnimation() + ["getFormatLocale", { moduleName: "sap/base/i18n/Formatting", exportCodeToBeUsed: "$moduleIdentifier.getFormatLocale().toString()", }], - // getLocale() //TODO: Complex replacement: - // "Configuration.getLocale()" needs to be replaced with "new Locale(Localization.getLanguageTag())". - // (-> 2 new module imports) How to setup this map entry? + + // TODO: Complex replacement: + // "Configuration.getLocale()" needs to be replaced with "new Locale(Localization.getLanguageTag())". + // (-> 2 new module imports) How to setup this map entry? + // getLocale() // Migration not possible // Old API is sync and new API is async - // getVersion() // MR: Discuss: New API needs wrapper around the replacement - + // getVersion() ]); export default class ConfigurationFixHintsGenerator { diff --git a/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js new file mode 100644 index 000000000..9e045151e --- /dev/null +++ b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js @@ -0,0 +1,24 @@ +// This test artifact contains all deprecated configuration API methods which are EASILY migratable +sap.ui.define([ + "sap/ui/core/Configuration", +], (ConfigurationRenamed) => { + ConfigurationRenamed.getAccessibility(); + ConfigurationRenamed.getActiveTerminologies(); + ConfigurationRenamed.getAllowlistService(); + ConfigurationRenamed.getAnimationMode(); + ConfigurationRenamed.getCalendarType(); + ConfigurationRenamed.getCalendarWeekNumbering(); + ConfigurationRenamed.getFrameOptions(); + ConfigurationRenamed.getLanguage(); + ConfigurationRenamed.getRTL(); + ConfigurationRenamed.getSAPLogonLanguage(); + ConfigurationRenamed.getSecurityTokenHandlers(); + ConfigurationRenamed.getTheme(); + ConfigurationRenamed.getTimezone(); + ConfigurationRenamed.getUIDPrefix(); + ConfigurationRenamed.getWhitelistService(); + ConfigurationRenamed.setAnimationMode(ConfigurationRenamed.AnimationMode.minimal); + ConfigurationRenamed.setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]); + ConfigurationRenamed.getLanguageTag(); + ConfigurationRenamed.getFormatLocale(); +}); diff --git a/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js new file mode 100644 index 000000000..11934be31 --- /dev/null +++ b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js @@ -0,0 +1,62 @@ +// This test artifact contains all deprecated configuration API methods which are EASILY migratable +// without import (only use of globals) +sap.ui.define([], () => { + const globalConfiguration = sap.ui.getCore().getConfiguration(); + + globalConfiguration.getAccessibility(); + sap.ui.getCore().getConfiguration().getAccessibility(); + + globalConfiguration.getActiveTerminologies(); + sap.ui.getCore().getConfiguration().getActiveTerminologies(); + + globalConfiguration.getAllowlistService(); + sap.ui.getCore().getConfiguration().getAllowlistService(); + + globalConfiguration.getAnimationMode(); + sap.ui.getCore().getConfiguration().getAnimationMode(); + + globalConfiguration.getCalendarType(); + sap.ui.getCore().getConfiguration().getCalendarType(); + + globalConfiguration.getCalendarWeekNumbering(); + sap.ui.getCore().getConfiguration().getCalendarWeekNumbering(); + + globalConfiguration.getFrameOptions(); + sap.ui.getCore().getConfiguration().getFrameOptions(); + + globalConfiguration.getLanguage(); + sap.ui.getCore().getConfiguration().getLanguage(); + + globalConfiguration.getRTL(); + sap.ui.getCore().getConfiguration().getRTL(); + + globalConfiguration.getSAPLogonLanguage(); + sap.ui.getCore().getConfiguration().getSAPLogonLanguage(); + + globalConfiguration.getSecurityTokenHandlers(); + sap.ui.getCore().getConfiguration().getSecurityTokenHandlers(); + + globalConfiguration.getTheme(); + sap.ui.getCore().getConfiguration().getTheme(); + + globalConfiguration.getTimezone(); + sap.ui.getCore().getConfiguration().getTimezone(); + + globalConfiguration.getUIDPrefix(); + sap.ui.getCore().getConfiguration().getUIDPrefix(); + + globalConfiguration.getWhitelistService(); + sap.ui.getCore().getConfiguration().getWhitelistService(); + + globalConfiguration.setAnimationMode(globalConfiguration.AnimationMode.minimal); + sap.ui.getCore().getConfiguration().setAnimationMode(sap.ui.getCore().getConfiguration().AnimationMode.minimal); + + globalConfiguration.setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]); + sap.ui.getCore().getConfiguration().setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]); + + globalConfiguration.getLanguageTag(); + sap.ui.getCore().getConfiguration().getLanguageTag(); + + globalConfiguration.getFormatLocale(); + sap.ui.getCore().getConfiguration().getFormatLocale(); +}); diff --git a/test/lib/autofix/snapshots/autofix.fixtures.ts.md b/test/lib/autofix/snapshots/autofix.fixtures.ts.md index 3f2b0cac0..dbed80dd7 100644 --- a/test/lib/autofix/snapshots/autofix.fixtures.ts.md +++ b/test/lib/autofix/snapshots/autofix.fixtures.ts.md @@ -5209,6 +5209,248 @@ Generated by [AVA](https://avajs.dev). }, ] +## General: configurationApi/DeprecatedConfigurationApi.js + +> AutofixResult: /configurationApi/DeprecatedConfigurationApi.js + + `// This test artifact contains all deprecated configuration API methods which are EASILY migratable␊ + sap.ui.define([␊ + "sap/ui/core/Configuration",␊ + "sap/base/i18n/Formatting",␊ + "sap/base/i18n/Localization",␊ + "sap/ui/base/ManagedObjectMetadata",␊ + "sap/ui/core/ControlBehavior",␊ + "sap/ui/core/Theming",␊ + "sap/ui/security/Security",␊ + ], (ConfigurationRenamed, Formatting, Localization, ManagedObjectMetadata, ControlBehavior, Theming, Security) => {␊ + ControlBehavior.isAccessibilityEnabled();␊ + Localization.getActiveTerminologies();␊ + Security.getAllowlistService();␊ + ControlBehavior.getAnimationMode();␊ + Formatting.getCalendarType();␊ + Formatting.getCalendarWeekNumbering();␊ + Security.getFrameOptions();␊ + Localization.getLanguage();␊ + Localization.getRTL();␊ + Localization.getSAPLogonLanguage();␊ + Security.getSecurityTokenHandlers();␊ + Theming.getTheme();␊ + Localization.getTimezone();␊ + ManagedObjectMetadata.getUIDPrefix();␊ + Security.getAllowlistService();␊ + ControlBehavior.setAnimationMode(ConfigurationRenamed.AnimationMode.minimal);␊ + Security.setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]);␊ + Localization.getLanguageTag().toString();␊ + Formatting.getFormatLocale().toString();␊ + });␊ + ` + +> LintResult: configurationApi/DeprecatedConfigurationApi.js + + [ + { + coverageInfo: [ + { + category: 1, + column: 2, + line: 29, + message: 'Unable to analyze this method call because the type of identifier "toString" in "Formatting.getFormatLocale().toString()"" could not be determined', + }, + { + category: 1, + column: 2, + line: 29, + message: 'Unable to analyze this method call because the type of identifier "getFormatLocale" in "Formatting.getFormatLocale()"" could not be determined', + }, + ], + errorCount: 2, + fatalErrorCount: 0, + filePath: 'DeprecatedConfigurationApi.js', + messages: [ + { + column: 2, + line: 3, + message: 'Import of deprecated module \'sap/ui/core/Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 35, + line: 26, + message: 'Use of deprecated property \'AnimationMode\' (ConfigurationRenamed.AnimationMode.minimal)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + ], + warningCount: 0, + }, + ] + +## General: configurationApi/DeprecatedConfigurationApiWithoutImport.js + +> AutofixResult: /configurationApi/DeprecatedConfigurationApiWithoutImport.js + + `// This test artifact contains all deprecated configuration API methods which are EASILY migratable␊ + // without import (only use of globals)␊ + sap.ui.define(["sap/base/i18n/Formatting", "sap/base/i18n/Localization", "sap/ui/base/ManagedObjectMetadata", "sap/ui/core/ControlBehavior", "sap/ui/core/Theming", "sap/ui/security/Security"], (Formatting, Localization, ManagedObjectMetadata, ControlBehavior, Theming, Security) => {␊ + const globalConfiguration = sap.ui.getCore().getConfiguration();␊ + ␊ + ControlBehavior.isAccessibilityEnabled();␊ + ControlBehavior.isAccessibilityEnabled();␊ + ␊ + Localization.getActiveTerminologies();␊ + Localization.getActiveTerminologies();␊ + ␊ + Security.getAllowlistService();␊ + Security.getAllowlistService();␊ + ␊ + ControlBehavior.getAnimationMode();␊ + ControlBehavior.getAnimationMode();␊ + ␊ + Formatting.getCalendarType();␊ + Formatting.getCalendarType();␊ + ␊ + Formatting.getCalendarWeekNumbering();␊ + Formatting.getCalendarWeekNumbering();␊ + ␊ + Security.getFrameOptions();␊ + Security.getFrameOptions();␊ + ␊ + Localization.getLanguage();␊ + Localization.getLanguage();␊ + ␊ + Localization.getRTL();␊ + Localization.getRTL();␊ + ␊ + Localization.getSAPLogonLanguage();␊ + Localization.getSAPLogonLanguage();␊ + ␊ + Security.getSecurityTokenHandlers();␊ + Security.getSecurityTokenHandlers();␊ + ␊ + Theming.getTheme();␊ + Theming.getTheme();␊ + ␊ + Localization.getTimezone();␊ + Localization.getTimezone();␊ + ␊ + ManagedObjectMetadata.getUIDPrefix();␊ + ManagedObjectMetadata.getUIDPrefix();␊ + ␊ + Security.getAllowlistService();␊ + Security.getAllowlistService();␊ + ␊ + ControlBehavior.setAnimationMode(globalConfiguration.AnimationMode.minimal);␊ + ControlBehavior.setAnimationMode(sap.ui.getCore().getConfiguration().AnimationMode.minimal);␊ + ␊ + Security.setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]);␊ + Security.setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]);␊ + ␊ + Localization.getLanguageTag().toString();␊ + Localization.getLanguageTag().toString();␊ + ␊ + Formatting.getFormatLocale().toString();␊ + Formatting.getFormatLocale().toString();␊ + });␊ + ` + +> LintResult: configurationApi/DeprecatedConfigurationApiWithoutImport.js + + [ + { + coverageInfo: [ + { + category: 1, + column: 2, + line: 60, + message: 'Unable to analyze this method call because the type of identifier "toString" in "Formatting.getFormatLocale().toString()"" could not be determined', + }, + { + category: 1, + column: 2, + line: 60, + message: 'Unable to analyze this method call because the type of identifier "getFormatLocale" in "Formatting.getFormatLocale()"" could not be determined', + }, + { + category: 1, + column: 2, + line: 61, + message: 'Unable to analyze this method call because the type of identifier "toString" in "Formatting.getFormatLocale().toString()"" could not be determined', + }, + { + category: 1, + column: 2, + line: 61, + message: 'Unable to analyze this method call because the type of identifier "getFormatLocale" in "Formatting.getFormatLocale()"" could not be determined', + }, + ], + errorCount: 7, + fatalErrorCount: 0, + filePath: 'DeprecatedConfigurationApiWithoutImport.js', + messages: [ + { + column: 30, + line: 4, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 37, + line: 4, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 47, + line: 4, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 35, + line: 51, + message: 'Use of deprecated property \'AnimationMode\' (globalConfiguration.AnimationMode.minimal)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 35, + line: 52, + message: 'Use of deprecated property \'AnimationMode\' (sap.ui.getCore().getConfiguration().AnimationMode.minimal)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 42, + line: 52, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 52, + line: 52, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + ], + warningCount: 0, + }, + ] + ## General: coreApi/DeprecatedCoreApi.js > AutofixResult: /coreApi/DeprecatedCoreApi.js diff --git a/test/lib/autofix/snapshots/autofix.fixtures.ts.snap b/test/lib/autofix/snapshots/autofix.fixtures.ts.snap index e1534e872e36384b2f92dfbd9a11b1895b2019d8..fd78f15889b8e1e91990b4e5a4753fd1adeb08b1 100644 GIT binary patch delta 15658 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 Io(G}*4=E|RHUIzs delta 14271 zcmYj&Wmpu8oB_Q3>wYws)bazU3NK36RNJ|R{2q>M>poG`| zyyxur@`ZD{A;DG^|=Q{_d%D*AeJhWKb zA4=4*`@|Es$6Wn*St^^zO;XcRghPSfnj0bd2y&yszm?MaProCJMFLA-vsSQb2au{G z-yt=gI3lyLfFy0Rmiy$sA9EWH=wVi9D%PKTFz!I6K>WhZs))(v$@tpI?a4{$lf)L8 zMd=oimXr8?srxS>MwXTjHFIC5afML#!1adUB9mWXYj=HjVf|8W`sM2-be8u^79YpI zA*$C$95|C?0=wp!cOc(KHaU_sgSz5Vv=lZEP%a9<}Bt(%c|IN0(d#g+^Yf`2x|GoDbeK4nwx93)K z>ae>)gD8&iJDbHl*ykO8D}JNMwGVVbb@m3u<>GY{4MY$X6_&wwtUl4iKSJJhD(l!D zPNbh(6~Hu{W1i?6%BX*7=y0eQZH8XF4)(~+UvcOwo*r0RzA@o%_}N{}5fYiTS%$DD zS6F9{4F&&bXXD2*;^O2Et)$=GO-tk7dQAQ=B#qskR6j%9Dytiu2Ckt`dy5(~EBK^q zWTf^x{-B1Y#c}ees*sWNEklW^m64HDOG)Y%kb&_@m8`aAv+!U9R~|HJ_1m?PNq@WK zIkzWc0Mna&@;09Me?txRP}uRplSOdfB+9-x@1)BaUr;@G@pG?a=p@#T@GBcj0-R!O z6J*cN*ASlIy>*uAzS(>AWQQ%OwxlaxS-XE<>U?i>)7G9}b9!idC}miS@rLouD|T6* zoY8jO_GJ%jp_`o1nXZuyit**r&%zd;|2s)z(rOkJONGwXxOu4Km%_`RN!1{Rw$-_~ z#1a(yd~x|orM5VA43v*3OAl73%)qRw?+ArvC92J0YwAl<(N$tS#x0rS<4*kdhZ(&k z+|?vP&B?2|q_9z9cg2Z*tCaLAVuO$NMqMtRXj3LLgF^wh&{{C(K&em9rzv5b6 zUUQ>rFgr4=|1_drDS_Y~GSQgPjZK=@Bv@e?T+uSpLhz|Xq$s161wI>!)5TPkaiffz zSFlJ!2CHhY-dfsv4G2rUM{DaD#W$iQ;uMpd2o|fv-fLfGU0uCB*j7v;r=0hVz3MoW zNEPRTe{$CkfClVB)IQ*m{@m@D%0JARg`*MkLYHgUzALTN5+Wrlez$W~Jx+oz;& z8k{06*#p!`Qo@!i#=H$SlS6xg%`RXsJZ+{TH`bVRH{vjlwblFIx2+YE!)g9shUpTrlPU?w zzU^L~RWFPV)77UWanvUzNr;Kd7mD-C%X8oSxi#GUv1yPHnWUr6!qg}Mk(al82$QWn z-HHS6bxyg5RUWn_>6pC!BcmM>7MlBC>WBU7vz&~7I}pKDlqA8Em*m(wHq6mBGMtw& zH0-EL%H%nV!=%IAJM|^6raei=*qX_+p-$eawou-xFh0iB2@ml`8hEOy%%4qq zud}7TFEU=KQswD+46=+9R}a_FD6`wL{iNLWI}V*|51R-<`j<9M_2=Bb(Z=nu1Z^a!~&3@pFkk4vcEAX+`TrUe=|T=n1V+rpI_> zE9udG!^bCI%Fm!bFL~{7!Qy3}vn2|P7NgiayuDm`-Zsko{UKL_q%Toa%wc$H|Jm#s z-6V2uz>tuflVSr!)L-I9@B6X=Q zt<)BgUiD6m?&7H*jCbhakV2U7qKqO+N~~{wICN)eB0+_wKSpA{y;pN<8{KZpt{fa0 z9+?#90%K(BnvoyV)Kg)LAo&-+$!cw$J(FOrh@5v@pIv%_<6Hg=|99(9f>w0~f6IQO z2NylZ+#+oUPpR5h;d-<|+sn8V&x<$#C{GqhT@%zReHne6#XkO5hZSP{;Qi<@{&G-mNE%=kZq z&*HxQ-@rX@`(oi?fBidO!6Y5);C+^G^Mh8y-F$`M1v3wmo%5;3Z}tMCQ&~YO?Ebjr zPD{tj`PMG{y}nHbcA}Yss~wbDo`=FR(pF8jk;XjV8^zA~EaXvp{z?WO9Hzp%70w0O49 zsHr{B$yVK=VNzJp!SgaNVX-c0{L-d6r;5hr@P39I*X&BHsa8ZvMHJi09apBf0~6uc zICgC7IBkEKlULchjBgX1Gr8x66;?K}XvTgJJ|jBY-lMfvMT^li3#Lk)dA;}v@kYo% zQ-q~GrH&OL<(P)Wcw78{W(#WvA3XI_2 ziElUhQCUsVyV)QyE>wVqR7JxpjJnLsiH)@eKc-6k7u5&J+M2QKn6aZSrx~)^Q<4u- zW&XH&efdYw$bDtO204}iN%zQXL=t+YY5DWb^AvOri1aOO*fwiPP3##yS56@tTP8;2 z1J(k0P0~bv{4V&l9MmuD;dNWj!g(IFR1M7&9!|ma)v0>S6Ft`JoauA-hiKbiFl*_@ z{j%?|YxHhJ*``G@8ZtWKd3~hx;KQBSs)~9rWv6|(_sOC9`2))gp|4Maa4K<)d~YnI zr5c?>pPO^=g0q~Fr#sWKJN=ls5WIK3xvU{OzKpLqPTKxOpnC^2r@ zeTomA-zmWwZ*NKkW9F@Nc)eO8RL|Yd1pT@7>pCF|w=(wBM{|RX=j?)HQAby&e$`@z z3(;v(HTznIVAYxtZzFs$gsL(NchrH#d}x8QyZAo+{)Sn0eI+};_=rnZdsW%=wn-m< z+lK3INY%ozw4t@^GWW`-V6^w^+nr~U6{EYQzO>bQJge0r`&_SeWNJ>nrxPgG=nGhu zUlToHk6r1reT>b$Ot$xWk)A`1MMT<0oW2EwxU)UG> zdoat{8wamGTf$+{Hy_t2K?f&`Nr#Rup;|&(Q`7^?cudy&o0W|hXRftj_gYK}(;W(aV3tW0T7a26FUuG{*!y~5% z5$V_smg~kX~0is6H_k+r=x$|;bmOu>Z zCDz;xH_rV=ahUBNc#&Yn#zv^~5Zro}c1`JS4yeE>iOuvqn#^#k76e zmfd55(Pz@k95G*~hQuxf2!rJQNPP^}$w}&f&Tj~14zbM*Niob4G?kvza|%qotCm$K z{uVifH50JgOM%#?xZZEnDYt%cymjF>u@KI0&$g*I@~(T*hZ3ok8d0WF&p}YtXPxCQ zi+o3H+YGNHCb-6VXO*JWb$_^jP8??3C^xI~SFl!Ov`T%v-ZutDR-jmT7xA21oc2S) zyUQ|2BHvruqY{In)<`Dls>CZA+}NvqPotc^ zxVZ1pg5W$Mxg5FUd2A`Jl>8uj`S>4f-^(Te1SeO%X@W7-&h8Ss$!Z3Xdnc88yd?v; z!cM2N7h1ku3$ilBIuG{Q20Q-c43M(`^%>nT!?@u*MyB7-gEy4t*(D32RbUA|Nz_zI zw6Tqv3JAo{#Yv0(_ibmBv6FSL9+rO^xSyv-pJM{w44sKhi#7mSbT=OnMOno@k zSvd8Re@(wVqs=E8JCi&^D*GtCPz-TCJNF9>;uAP~BdqpvT+^V^B~4fkbsjZQomRrq z?5R>IA(z`W`%yUDgTZ-1?h?14)$G4yXUh+56iW68iG{M~`#49J1h^L(|F-FYg>J7P zKZkAgE{)3;q*>wVjcOZhwE(qnob=Fad68#~rrg$y+0MY+vXFDF{{$7QqQVNk{gdS7 z6T@X&TU}C^z14WJzNgP97K2loh?Xcu*u6eV>S0TVsJK+ziKC>7@xpHi$c30YzphxY z-{eIMzV&$u8zfIT3Rx^?D11(d2rf47;2Fr_MyTtL00}O5YHaP5b~o~>YPk8r?A!YK z`wS>H-D`+B9`g40GObyrdI~*`N%qy_k3}A6beJH1(GIlr~g*A2-iya+yK zkvsOZFI09=t@xGZ`l$;&*0^pVX*43hQ&yvu(!s#J$z7wZKeQ0 zQ_?$zOiBM!%zcHX5mqkB%fm5>RThpij-Ot(S~Djrs`wb%*N)CBuHIy&@yx6I73S({NQYEQI=u33j{<{iP41DqREj3z>dc1zj-V-CFpI!R$ zth$D6il^PRIp`ZawyFZhS>4w^b{UX^e@4{)y{^Hl`<>M@{rzg=3jXpyc7cR3HKmHL zdL84w)S0c(1i0mha9G1t&)ld_$0Nm?PL#X@-W(&o*rQ3Fzq6YRI2|cq6g!J8t zq0mA_+imNQ$_Smb?0Xjn`?Qle={Ha6mC92BZX{I8HXwiOk$Zcx>{7X+58QNuF6VyY z!YYOu|HYGe+Sk>^&F#ex+C6jXB1*lSSzb%lHIf>Gkl~ED>s#2G3DfC%a zCvPpKGEbQL^+9}PPA!j|PmXM^%e!(ND&==gin)2o>5}QrCT)F;GtSa_4UOT{^t-+J_c?d;sN!Af~EzZ7@o!fCFcHs07wT+R4h&G_d$*!YGU~Du{+vYEojUxxeZx zBo7xT62)XI6O(2T)X-mOK0|aFu9rXG_Q_b%V~P{Q6AJb+YqVb`G5%OPU&H5}_U$E% zlH_+FtS0~2y2))&n5#rrOZpCpX?Ms5$3v0=3?~vDUBYd^d7K`uz7@jOrYUpGtOoOG zBqvy$ZkpRU_q}aQWo0yHm~RvfT;ZLWvr31EeLT>@)M?OjCXPkie?-Vbo>q3Xl07e! zy7=>vH8iO`$~pj5`JZ(-%JGEWi2P$#jQv90M8TXkwtIOBug-$yMs-ru&yr$`jU2M+ zwaEf9K|9%@5upb3=v>i|JJGT|jb~5wu4t!3j=UX2jfnEK=4sC-O>gS}`@TNfv`l-I zc+KVCkCS?NPbOhl6ewg$HN!(TMs#)bghAWcwAEkGV5hyqXUT%u!JKhf_B4&surKW#K- z8t@*MWDY6{bkkkfdA6l1{AO`UJFZ;sg|g8@yO1k1KvwSa`XB-e9OBqz5R10Iz}!~l zQ0JC;O6zNI&m?(%==eN*u*)#lZ}?w*a0?)?7H}I5Je>n=m|$c6QUZ!704Itzwk#Mb zkO35Rpjg~T?8J{{OaWquga@!pn>=yj!fK}i$v{y!P*f!p)kqFn=fqm$!wT1ba&N+N zdZ)P27zuAikV#JBYWaYyI0V1rPWXZ13gF#jog=t)0U%rsuSl|`9jp^CP)I%|?Zt)) z$7vK<;0o@29NFy%?)?I8=m8d99P&&BGpd3~hZXlcsp11sk^^@sfmGzcA24PsEH{2o z0}sf94|Ku@V&nl8@_?)aKz){2_f1c3Z(th|DhSM93ZR9MU^}(sd+Jki@LVj)>@(a> zsHunA)ByioEU-(m*MYL^>jbIC0^8rJQ4?~o1Ua~a3VcHa)*%NAkb`kzQNJj`zo@_p zJP>()$fE^5c{*S?9l((RaLfdtNQ*15oVbDJ&yj6xa7WyxW~|Outj>0<&T_0JOOPzW z9CRcAwBiA-aRbA3L7}Fg`;S<+Wmrfk^(H7W0O;5WD1v71gJ>- zWUVDen}5TD>NFV|IE3Bv6V$g4T6J;(T;lFL?oKkw_sRswP`3l zoPIO@M<*?;Q2Vn7>_z#{2jxq>vpeN{)z2jYfWhNo>cl+lK>!7-GH>P2Fy*@9pEqbz z4V7IgpocVtBZ)VJLIOeD92+MFBvi^Q9q0?GjzT)O^OO=Iwzp@q&ME%yn#Eg!`? z+fRCKN_rwMKf^lqpBCKDmGjj;hoA!qDb`tRd;il>SvD&+g9ALsy-1x%7PF-Kxf{Lo;`1+JZ?>-t2~+(=`GzasDydy+3vH{8 z=l+4aLj(M_0-u`q?NmiBRmTkm1Z@v9)ltigGNZaHI~q~TR{sMM>@+TS9sg33(qD96 zZi_0p7a{(k73%_rs^gqWI+u`{{ix-&u#fNC6=c8buHg2(Z`TY`a&P=W&?bkWbGb8F z(_P7Nq;{cG7|>k_`v>mEMgH}BBs71mnDo9~MlNdk5o1?%d^;Mo%%9^{b-eHoFlPS) z>+EzcGIv@^?qrU%E_X*cQOn_>74O?$BmVKG_&0!V$JqDnOj`dMDr>=Svkc07-!4(~ zy6Skvk;dhaTWr3)dR}*hM^mhg??--PCde}r#FQ~RXq%cvlSNUHH2z$2x1$HMVzpr> zAXtIV$!Ev>0=m`x8gny-R7eMsO+rE)MUr9AtrbV`uR? zy$aB00KBgNc^QEWxM@ZZLJK{HAWtJue+^b_B{;28B>9YT@`ic>QRujgW5sY&xcUoo{`F*si_)-@!@o{U?EiMFa2`t?=MO^u~iU#3vQo=g`7t*J5M43v>4dr7-!Lnd2oz5aa2X>;}gLQfC)PHuZ|R(vWc-VnILXb`}Sz~CHv)O`c+whWlP^hC=O%UD!6 zd5$+(K^#;h4&wNN<1mS{yd#o4$49J2raOxjn1{sHhO3c*fAA%jU}KiBk)FUNd*E~z z5|#f7H7|fg$&d9P6jcvJ$w6t*!yspKEM7}2H-sscMgNmPClYXu8_JgtQWA$cjze)! zf&aEinTiU$Kauq zBT42cge&&rGG6{FWWvpk`QOx7w*r|ufSb#x>SIiaKjdcz{IQYY)>X#q;CZnFTaybL z7}u0pl8959Nb*qD<}nEA#Rx`lb->vhKrhU&=Nmu^b)aBlp=3Ph(kgkfD2$l^v8Z~dm ztP_KI13Lwi+#({L#Q(Bqep7#J%5kd2aq7Wwy7IzCD;qV@0>6$zsSRKhB2jrCtBPmCu=up^nsL2G(S2~m&9nA;~TE;@i8wVWJ%$IzY1tt@~ zso}?2=Et$k5=qXW9BJi2?wbJIO#pO_fOhLo@W~ecMiY>c35cf=E1d_$U?QAsM5+GO z2!3pYS*}Gs)*@vZY?*88Bi8sZ|M9^Cp-q0!rT{3|Y(O!V%8G!un|8?yA?9_gu+`BB z8FIsR=@6c7qug7rM>bJ(hVnGI@|?!iW71ub8H<9`P~Pc5F-(OkvS1M~WexUP1YI;> zZ@JR!NkcCyTv02H*w@z3o;Q46V}6+2L*!wjT``q;agrsDY#77owI8Oj0bJ97lYWT8 zX>cs2GAs79BI@yzJ4M7DqTbRWDI@?AYk;0$Ft~RK^soWhD5V2<&;~O2gK?l4QD5IRX_GpAQVjS zvRGmrv>F6Gz30P(bO0*X@#?xMI?s$D%db%<-4sg*p3}8@%y0*&tpoVb0ZjTn1ZRU@ z)~_G~JP=^{J_4`rgmpa(omc)FUsh=Lf}xkCD=6#lgyic$tv>KlAkOI}1135^aGHQ} z&oKZnDT5jf09~A5wSUL$@#8q%FTfYIMHTu|dHu13f49Wsb|ckJK#v#vHa}lLmfcat z$5<`_AXk4-OaTT}fN_*TVZP&wx}X|5=}dzV62+?otG*JapT1+bx{>AG)KzXMk0ork zRqWMPXrL|CX{9Cns~j?r2%KP6{PGvD{X1CJpXf9p1Zful=J5w-{ca8ZJL$561(?4>k9x9DLwwU&zp$gG1ekP8C9^o&EzAG*L;03kcc? zOn;zS>ZZEA>BYRmp>|5bHh%=@J^-d40mLDIz)c{42((QkJZ%MS-F~*wg9E&JW-}at znPSAcjYeihQ#%!5(}q0R3wqLdj9}Twi3SW0V5Eq^&CxVY{n#HjUu`5tqjnh~Yhl!< zvLK85Crz6qkl+~XKNGANXc9mn5bO4V6~0-D$w&fC$&bM$%!+@>;r0CGJRL2?cqakr z7{T{R;95q<;wi`gUMS!(1kmSCG z&DS(cn~w1GIPbJtA=b4VZs@MYMwSkU;tmkRHZum_b`r07XT+%L--$sPnWV# z)}b_#uM{GBmtzaMn5tHY>b?_Q9^>@&F?q@27|IXZbeK2SPXTL-z`>6s*9*Hyq9QQ6 z91(9w;U_D*&;ANToKs*41tQri+0(y;I1ar4-(HMOW1DRwA_Tbf2s+(@VqOXW$gHuJ zt+3jAMr;~eY?%T{0*_QSUJ8H|5G2`Gq|+Cqr>C0u*TFp3c>=)oFx=ZKP59Y3{B9h> zCjj>BnXvI}vPE1ApN?mtN*V!a{h%sqphMrk^}~z!?(o^_4A1Ke4<@1!fMW$ryyHF{ zXaphtaw8%hQYk`~YcV;EAc95^RWF|GU+&Xk6Vzy<&=Ot!($FIEb0hG_BC^&R-1nE( z>*x^vaER~UO~KPc_|6)qy^ruHjNx|k5CgRa%iq&R^p3_p9JwMd0D`{(UX#F$3NU5` z2iebH(3q~QrjTL&Dh1NcM1OMfA!cM?d1$eMkVgvgTjr6Byz@AfT*G+;iwTt?8_ z-rGi4tQ$-=d}T^g?jIgAkX1#z->~Y>pHm>%|6#Kh}P`Mv(TcqWp|T(C)2=)&;FG4ui5c@xRu5RKOGjKlW_|o zMX;<(K}Pe$)!nC`%7&EXFlX6NQ0 zbu&qRDAZ34A4=BJBzS{<#q!cJTjGEY5s_1xuHe z&j|jpH1Fn69U)g#{k14ly_|U4aN_$Js}R$UaR-k~hI%;*mfw!>sLX#^V4pW9Gs|`c zA?8V^%W3Xx8?tmB?f4Lh`PpZx9utYlQSMf)%TW;p5g6cT2>YUOPk|>-_#4ExY2i1| z87Js*+w2kua8{!0{O#XZi{Uq-GBB3&l{;K{wP_H5PFM^s_IQdm8{^D=9*gWm>p=THU=w= zjp3S^?l-^MKKW$BmVF{Jp{OB<$fN3gRl1{3=i-l#BNp~Bpf=(_r|7}JsE8Kmf3>;w zVTy-iE;=b~++DKEQBv|%K8%n{DkJ&@VMn-^^nsy&bnSqj#iv{f`dH`5XNwW9WQ4Yt zYzJ_tX!1)W?z-q_Cti%Dev>)E`&;o$ipb^Kxr(AUVQ%0R&x6eIlP+(;Cy1F|0T;uq zjZAO#ed?mf!~%a`3kl8^@dMK7S$6yLr&4ZOtM0>t#rP~AM1+#nCSI|=&SKySU|`gT zTpmfe{gcs#C)(dTM)~neyV)PfKUa;74>=y`e7!eHjj=mw^7biW;8?_$<6xia7#JFO zC<3dzVz?mWqS-bZ30(4EUPDMcvDjPl5fh$$*d<(4joakvHa}gpnFkF})s(}ww(a~o zJtQOx+wG2j3=A#r=2ki$1uh4421-+V_7A8ow)p$X1$XX^&AdKq;(OX_J3McKv+KdN zsk8W>sTE^D^r3m`X088GSb&#!Un+luh+7~*pTv(J(wT>WUp;M{z1PO-t~|TPgUpVeTNghyu09&A^5Xaj9(aYVb8Z4Jyme-#Zc_q^LluH zIO0=v4@<)ItAM|E26c#`|Z@e97a6*0mYMQ>+6&rQ2_Q>Kw$jZR2bSSI-pa{5H$cNr5p4b`(iL?`#xRc-1a!qob$w^YfO zB1oM`HS?OsMdJ^)-n!VwJCh_zC@Hi`@#7}snjXVAX${3(TA~)<$aBh@9om<#Shb0lpxfKA|}W>$@tGqNmWAn~nbFf}F;e|CKDmRF#Ix7AN2b--+kELMdq*6|BoQz(_31qw?E&aiH)gg^#%UvT|!UUqJl#v(;}gZuc}E> zZ5xOy#Ee<0{-g=GU%hSnn0m(+v`_(B5h-lbfA35f)7+`vNpN<>7x#Pia%HSsi+6ah zd4kI5SuE%1FoI)3=d&Vz>eKqzrs^aP*w3H3=ex~%LFNY+bMLYTGrM5dXm5>Uo&7F8 zj^EiU*V}_J4%)A`gwmqJ4)i9q82xM2q(p+2J}_=iY`t0!P8Uf_`f@n)MN9s=NlilJ z_tF^S_lYe#wGbDN3F2|gKO<&nyj#)^Om{kX8?E%MP-n^F9uT3G$)fbX4Ip&{-Y&PK7I zrLD;f8kdzf|05>%e~CHd{EwI^{r@FqpH=(8ama-!U`sDO`m<%jY$0r@;>X_4;UUD) z3CUDa0>v6@AroC(kD9E4Kg1~sEBsvOWr#9y`f>5Wu|L+A|7Z22kNlt2lVxb?X)s8W zqdNV@L3r9clT0VkGFxEo!f309@&Y@O@qD(g-^ZI`oiCbntD2r8vh4P^xZW1slPX}cgGz>{PK{f@KhreH(CUb{CDFm^yxAxhF%HXn_0wxh zFD>cWENeEc3|*O;pqT%)s+yG8Z))mohb03$AwubM&avTGP6@uOjE6Fo>6Bq@BT5g# zC2s?7Vkj*4cT_2q1;jS#^%Ulk;DK({M*m*q2~jc9XSHSO*Nu<$X0Z*HDZ2GeMt>vt z{QvnueLOjzR{cl2`x2WI@_X~SWHb?+4JqKIGVC+?2N7tox7%4J8h#&`Y#>M9DMT;9 zfy;e@-9&@o2Q-3i_n6MP=ygBulTbJtFiyTgld)^5XWj|XcjSUogP7>jLzMMt<4OyJ z2jcPyZ=BP~^o$&%5>Y6#eC2o#qg;!4Ysen>`xM^md;Neu0W9w*ccgXOqrsMJ4;i2GK$iySce=mMG5*v z4(jK^aw&lKlLbzU!sA4YkV<(zK9lz*52A?Dogxv-skBU6I&&Y%@4Q^vgC37QQlg-{ zShv+qw@$8(UG^{Rcf0Wny;<4$%~|T6OCNlxwSBolyL#XUnumf7voiP|jWe$#z3VoO z6Q@&??{f#3f0-x220;vOVGz<9a@>C=)}}qP-Ax%XJ(q`3&7$g^ZkhdEMsG z%bvc#Vc2DGplKY10Yuhix&6Rq4dTRbhp#E2d=sO5Idz-zz>FKnF#iDn4%J_f*yMmfUt|U15 z6Wd}kzD_fR9UYUyV%04aQ_Kt8JffEFUx`0AEwJPICS*$aOhx6zAR@w0PedwBwEreE zbH@=^C`no{w{kLQKEfigUZnh1YE$jk+e-VRx8D+BnjEXo1+tx4GPKeLzuwL6pl{yh zu;x}o$mZ0|G>TsZk>g|)SpV&;0TXb3XO5J{Wk(=h8RPHEhf zOBaXnxa4O$T&rydb|8pT_(^&Tx1qFhuR|>@qiouC_VvFZ=h(ytMypT1L`cuyawCg? zk{RHdHw-RyQuFU2GEpNTWuH=&)3T^@Y37h=WpzfY`tiXO3g68?n`pQ!+Dea3N{-M6 ztR&+L>+B$Dx-#!;lo;(l7{n{_{@E01Q6a0upV8{t%0X}rLlN|+VuZJZIQMAqV+8my z5Bz8^5yCH?IhkTEwTM@tW3Bv8N4{%|d;@#TL`NF(@)Xz8kSHnhmXrrt15b54oTiavM%^dIz(y5F!?U z6mmfxdzbtXy0N6iRalZOSdx`kOU5AH0AO#!QN%21!|e;Irj`FGn`;5UH>(&nj}31L zu%B7+x>3Ir8d?5@st9>JAG{3*mH$ zryR#JbvN1zg=OAF-OkjXe(DYyg(Xprzv9W{-9@Om#g$j5Oe7nAll2iFLX>|rIM>&A zp^XgPCpA}nL)j+ay1YUc*mW*Nho-fLU$@1wZOzK|d20Z!OZ9(H zJ*&S}D@MjLUT)2j)h90f4Sb^%8EEL;Lp3IDZicmF^A=*85j33{wb=A*LgXYBfXKE*p`3wpWnTo z`p$Lb8_bc#?ll$t`D&r%hU{S11D9D~3D*%_32q;27e%2TtdXQINt5(Zlkk=gC*BWW z754W|1LxE;@o4U}XQI0qGN~G=^nPn51-PQC>UbID8#|K>+3qxDN&{72io56tBihR% z9n0IwILIAbG|2RkgS5;fY`z)O zDL>q-Si1MtdvX=>CAvTz%A+>&4YA$SQRgq>u1AFZj7+28+PP$Qx*tx;`aaTIisU8z zd2m^BWu16dva5zJ)2|f8j6y$Af4N<((l~;LYEGQ+Mj{o;6)dtgCRM=#D^d?{L%m2R z-TB~L^0}?=peIjs^%%7QThEReQ7|t-) zCwOFO%22bbMx<8FpSsSiHL?On!kNRA-r*@iNx0jxd|gY^s>pC(-Isidw+=QffYRz` zIZIkDDD4|g>weTy+W)}F%`KtH;LWnOzO-PhRDd?%l|nxgZkSJY+4bS_=~zk+H68F= zKJxDp@3u5gnBlJKXXU@)M%b>d^Zon0;BAw-&lq3#0DFHK+i*wAE*7(<5X+sqyuQSy zJYb7XkFS=wY5pG6zM$%9i{}zmrl61l=6-WLWkMK$c>Jt|HB;tJUz2!GNZ85Ik$C^A zl$AsCcmD>U5-d3YwD<)GKL)&Lmm17m)DT_JdAgD!Abi#PENt0c6hZkqJiNT`SHA{Y zW0!3uVeCt&78?59ey%X9B$gZR{p!a*x%R6$l_eC9v18}|?x)0Qpo)s2e+#=bAx{(} zx*?VX`B0NDPhZu_M3~(CE?-x~?E~8|Wb)YAE@Hgk+c1P?7?=}8o(bCfAskTM)AEAEyyDHx;?;g z85iB?g^_sE9eP{n4G(ZTSRMRtetV#n9^*&2@e1cO3M| Date: Thu, 5 Jun 2025 10:16:37 +0300 Subject: [PATCH 6/7] feat: Migrate use cases that return `this` --- src/autofix/solutions/codeReplacer.ts | 26 + .../ConfigurationFixHintsGenerator.ts | 36 +- .../DeprecatedConfigurationApi.js | 27 + ...DeprecatedConfigurationApiWithoutImport.js | 27 + .../autofix/snapshots/autofix.fixtures.ts.md | 784 +++++++++++++++++- .../snapshots/autofix.fixtures.ts.snap | Bin 36668 -> 41253 bytes 6 files changed, 890 insertions(+), 10 deletions(-) diff --git a/src/autofix/solutions/codeReplacer.ts b/src/autofix/solutions/codeReplacer.ts index 9f62d9e9f..c08161b21 100644 --- a/src/autofix/solutions/codeReplacer.ts +++ b/src/autofix/solutions/codeReplacer.ts @@ -314,6 +314,32 @@ function patchMessageFixHints(fixHints?: FixHints, apiName?: string) { `$moduleIdentifier.${fnName}(${cleanRedundantArguments(fixHints.exportCodeToBeUsed.args)})`; } } + } else if ([ + "setCalendarType", + "setCalendarWeekNumbering", + "setFormatLocale", + "setLanguage", + "setRTL", + "setTheme", + "setTimezone", + ].includes(apiName ?? "") && + [ + "sap/base/i18n/Formatting", + "sap/base/i18n/Localization", + "sap/ui/core/Theming", + ].includes(fixHints?.moduleName ?? "")) { + if (fixHints?.exportCodeToBeUsed.isExpectedValue) { + // API not compatible + fixHints = undefined; + log.verbose(`Autofix skipped for ${apiName}.`); + } else { + const fnName = apiName ?? ""; + if (fnName && fixHints && typeof fixHints.exportCodeToBeUsed === "object" && + fixHints.exportCodeToBeUsed.args) { + fixHints.exportCodeToBeUsed.name = + `$moduleIdentifier.${fnName}(${cleanRedundantArguments(fixHints.exportCodeToBeUsed.args)})`; + } + } } return fixHints; diff --git a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts index 29759e363..4ed13fb52 100644 --- a/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts +++ b/src/linter/ui5Types/fixHints/ConfigurationFixHintsGenerator.ts @@ -57,14 +57,34 @@ const configurationModulesReplacements = new Map([ moduleName: "sap/ui/security/Security", exportNameToBeUsed: "setSecurityTokenHandlers", }], - // TODO: Complex replacements: Old API returns this, but new API returns undefined. - // setCalendarType() - // setCalendarWeekNumbering() - // setFormatLocale() - // setLanguage() - // setRTL() - // setTheme() - // setTimezone() + // Note: Not 1:1 compatible. Does not return "this" + ["setCalendarType", { + moduleName: "sap/base/i18n/Formatting", exportCodeToBeUsed: "$moduleIdentifier.setCalendarType($1)", + }], + // Note: Not 1:1 compatible. Does not return "this" + ["setCalendarWeekNumbering", { + moduleName: "sap/base/i18n/Formatting", exportCodeToBeUsed: "$moduleIdentifier.setCalendarWeekNumbering($1)", + }], + // Note: Not 1:1 compatible. Does not return "this" + ["setFormatLocale", { + moduleName: "sap/base/i18n/Formatting", exportCodeToBeUsed: "$moduleIdentifier.setFormatLocale($1)", + }], + // Note: Not 1:1 compatible. Does not return "this" + ["setLanguage", { + moduleName: "sap/base/i18n/Localization", exportCodeToBeUsed: "$moduleIdentifier.setLanguage($1, $2)", + }], + // Note: Not 1:1 compatible. Does not return "this" + ["setRTL", { + moduleName: "sap/base/i18n/Localization", exportCodeToBeUsed: "$moduleIdentifier.setRTL($1)", + }], + // Note: Not 1:1 compatible. Does not return "this" + ["setTheme", { + moduleName: "sap/ui/core/Theming", exportCodeToBeUsed: "$moduleIdentifier.setTheme($1)", + }], + // Note: Not 1:1 compatible. Does not return "this" + ["setTimezone", { + moduleName: "sap/base/i18n/Localization", exportCodeToBeUsed: "$moduleIdentifier.setTimezone($1)", + }], ["getLanguageTag", { moduleName: "sap/base/i18n/Localization", exportCodeToBeUsed: "$moduleIdentifier.getLanguageTag().toString()", diff --git a/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js index 9e045151e..119d46a30 100644 --- a/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js +++ b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApi.js @@ -21,4 +21,31 @@ sap.ui.define([ ConfigurationRenamed.setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]); ConfigurationRenamed.getLanguageTag(); ConfigurationRenamed.getFormatLocale(); + + + ConfigurationRenamed.setCalendarType(sCalendarType); + ConfigurationRenamed.setCalendarWeekNumbering(sCalendarWeekNumbering); + ConfigurationRenamed.setFormatLocale(sFormatLocale); + ConfigurationRenamed.setLanguage(sLanguage, sSAPLogonLanguage); + ConfigurationRenamed.setLanguage(sLanguage); + ConfigurationRenamed.setRTL(bRTL); + ConfigurationRenamed.setTheme(sTheme); + ConfigurationRenamed.setTimezone(sTimezone); + + // Do not migrate these methods, as they used to return "this" and now return "undefined". + // Further more, now the functionality is moved into multiple modules. + ConfigurationRenamed.setRTL(false).setLanguage("en"); + const setCalendar = (type) => ConfigurationRenamed.setCalendarType(type); + const typedCalendar = sType ? ConfigurationRenamed.setCalendarType(sType) : null; + debug("msg 2", ConfigurationRenamed.setFormatLocale(sFormatLocale)); + debug("msg 2", (ConfigurationRenamed.setFormatLocale(sFormatLocale))); + debug("msg 2", ((((ConfigurationRenamed.setFormatLocale(sFormatLocale)))))); + var time = ConfigurationRenamed.setTimezone(sTimezone); + var info = { + theme: ConfigurationRenamed.setTheme(sTheme) + }; + ConfigurationRenamed.setTheme(sTheme) ?? ConfigurationRenamed.setTimezone(sTimezone); + ConfigurationRenamed.setCalendarWeekNumbering(sCalendarWeekNumbering) ? "a" : "b"; + ConfigurationRenamed.setCalendarType(sCalendarType), ConfigurationRenamed.setCalendarWeekNumbering(sCalendarWeekNumbering); + fnCall(ConfigurationRenamed.setLanguage(sLanguage)); }); diff --git a/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js index 11934be31..cd5c58e72 100644 --- a/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js +++ b/test/fixtures/autofix/configurationApi/DeprecatedConfigurationApiWithoutImport.js @@ -59,4 +59,31 @@ sap.ui.define([], () => { globalConfiguration.getFormatLocale(); sap.ui.getCore().getConfiguration().getFormatLocale(); + + + sap.ui.getCore().getConfiguration().setCalendarType(sCalendarType); + sap.ui.getCore().getConfiguration().setCalendarWeekNumbering(sCalendarWeekNumbering); + sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale); + globalConfiguration.setLanguage(sLanguage, sSAPLogonLanguage); + sap.ui.getCore().getConfiguration().setLanguage(sLanguage); + sap.ui.getCore().getConfiguration().setRTL(bRTL); + globalConfiguration.setTheme(sTheme); + sap.ui.getCore().getConfiguration().setTimezone(sTimezone); + + // Do not migrate these methods, as they used to return "this" and now return "undefined". + // Further more, now the functionality is moved into multiple modules. + sap.ui.getCore().getConfiguration().setRTL(false).setLanguage("en"); + const setCalendar = (type) => sap.ui.getCore().getConfiguration().setCalendarType(type); + const typedCalendar = sType ? sap.ui.getCore().getConfiguration().setCalendarType(sType) : null; + debug("msg 2", sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale)); + debug("msg 2", (globalConfiguration.setFormatLocale(sFormatLocale))); + debug("msg 2", ((((sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale)))))); + var time = sap.ui.getCore().getConfiguration().setTimezone(sTimezone); + var info = { + theme: globalConfiguration.setTheme(sTheme) + }; + globalConfiguration.setTheme(sTheme) ?? sap.ui.getCore().getConfiguration().setTimezone(sTimezone); + sap.ui.getCore().getConfiguration().setCalendarWeekNumbering(sCalendarWeekNumbering) ? "a" : "b"; + globalConfiguration.setCalendarType(sCalendarType), sap.ui.getCore().getConfiguration().setCalendarWeekNumbering(sCalendarWeekNumbering); + fnCall(sap.ui.getCore().getConfiguration().setLanguage(sLanguage)); }); diff --git a/test/lib/autofix/snapshots/autofix.fixtures.ts.md b/test/lib/autofix/snapshots/autofix.fixtures.ts.md index dbed80dd7..e5f670b22 100644 --- a/test/lib/autofix/snapshots/autofix.fixtures.ts.md +++ b/test/lib/autofix/snapshots/autofix.fixtures.ts.md @@ -5242,6 +5242,33 @@ Generated by [AVA](https://avajs.dev). Security.setSecurityTokenHandlers([() => {console.log("*Security token handler*");}]);␊ Localization.getLanguageTag().toString();␊ Formatting.getFormatLocale().toString();␊ + ␊ + ␊ + Formatting.setCalendarType(sCalendarType);␊ + Formatting.setCalendarWeekNumbering(sCalendarWeekNumbering);␊ + Formatting.setFormatLocale(sFormatLocale);␊ + Localization.setLanguage(sLanguage, sSAPLogonLanguage);␊ + Localization.setLanguage(sLanguage);␊ + Localization.setRTL(bRTL);␊ + Theming.setTheme(sTheme);␊ + Localization.setTimezone(sTimezone);␊ + ␊ + // Do not migrate these methods, as they used to return "this" and now return "undefined".␊ + // Further more, now the functionality is moved into multiple modules.␊ + ConfigurationRenamed.setRTL(false).setLanguage("en");␊ + const setCalendar = (type) => ConfigurationRenamed.setCalendarType(type);␊ + const typedCalendar = sType ? ConfigurationRenamed.setCalendarType(sType) : null;␊ + debug("msg 2", ConfigurationRenamed.setFormatLocale(sFormatLocale));␊ + debug("msg 2", (ConfigurationRenamed.setFormatLocale(sFormatLocale)));␊ + debug("msg 2", ((((ConfigurationRenamed.setFormatLocale(sFormatLocale))))));␊ + var time = ConfigurationRenamed.setTimezone(sTimezone);␊ + var info = {␊ + theme: ConfigurationRenamed.setTheme(sTheme)␊ + };␊ + ConfigurationRenamed.setTheme(sTheme) ?? ConfigurationRenamed.setTimezone(sTimezone);␊ + ConfigurationRenamed.setCalendarWeekNumbering(sCalendarWeekNumbering) ? "a" : "b";␊ + ConfigurationRenamed.setCalendarType(sCalendarType), ConfigurationRenamed.setCalendarWeekNumbering(sCalendarWeekNumbering);␊ + fnCall(ConfigurationRenamed.setLanguage(sLanguage));␊ });␊ ` @@ -5262,8 +5289,38 @@ Generated by [AVA](https://avajs.dev). line: 29, message: 'Unable to analyze this method call because the type of identifier "getFormatLocale" in "Formatting.getFormatLocale()"" could not be determined', }, + { + category: 1, + column: 2, + line: 34, + message: 'Unable to analyze this method call because the type of identifier "setFormatLocale" in "Formatting.setFormatLocale(sFormatLocale)"" could not be determined', + }, + { + category: 1, + column: 2, + line: 46, + message: 'Unable to analyze this method call because the type of identifier in "debug("msg 2", ConfigurationRenamed.setFormatLocale(sFormatLocale))"" could not be determined', + }, + { + category: 1, + column: 2, + line: 47, + message: 'Unable to analyze this method call because the type of identifier in "debug("msg 2", (ConfigurationRenamed.setFormatLocale(sFormatLocale)))"" could not be determined', + }, + { + category: 1, + column: 2, + line: 48, + message: 'Unable to analyze this method call because the type of identifier in "debug("msg 2", ((((ConfigurationRenamed.setFormatLocale(sFormatLocale))))))"" could not be determined', + }, + { + category: 1, + column: 2, + line: 56, + message: 'Unable to analyze this method call because the type of identifier in "fnCall(ConfigurationRenamed.setLanguage(sLanguage))"" could not be determined', + }, ], - errorCount: 2, + errorCount: 17, fatalErrorCount: 0, filePath: 'DeprecatedConfigurationApi.js', messages: [ @@ -5283,6 +5340,126 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 23, + line: 43, + message: 'Call to deprecated function \'setRTL\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 37, + line: 43, + message: 'Call to deprecated function \'setLanguage\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 53, + line: 44, + message: 'Call to deprecated function \'setCalendarType\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 53, + line: 45, + message: 'Call to deprecated function \'setCalendarType\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 46, + message: 'Call to deprecated function \'setFormatLocale\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 39, + line: 47, + message: 'Call to deprecated function \'setFormatLocale\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 42, + line: 48, + message: 'Call to deprecated function \'setFormatLocale\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 34, + line: 49, + message: 'Call to deprecated function \'setTimezone\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 31, + line: 51, + message: 'Call to deprecated function \'setTheme\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 23, + line: 53, + message: 'Call to deprecated function \'setTheme\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 64, + line: 53, + message: 'Call to deprecated function \'setTimezone\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 23, + line: 54, + message: 'Call to deprecated function \'setCalendarWeekNumbering\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 23, + line: 55, + message: 'Call to deprecated function \'setCalendarType\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 76, + line: 55, + message: 'Call to deprecated function \'setCalendarWeekNumbering\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 30, + line: 56, + message: 'Call to deprecated function \'setLanguage\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, ], warningCount: 0, }, @@ -5353,6 +5530,33 @@ Generated by [AVA](https://avajs.dev). ␊ Formatting.getFormatLocale().toString();␊ Formatting.getFormatLocale().toString();␊ + ␊ + ␊ + sap.ui.getCore().getConfiguration().setCalendarType(sCalendarType);␊ + sap.ui.getCore().getConfiguration().setCalendarWeekNumbering(sCalendarWeekNumbering);␊ + sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale);␊ + Localization.setLanguage(sLanguage, sSAPLogonLanguage);␊ + sap.ui.getCore().getConfiguration().setLanguage(sLanguage);␊ + sap.ui.getCore().getConfiguration().setRTL(bRTL);␊ + Theming.setTheme(sTheme);␊ + sap.ui.getCore().getConfiguration().setTimezone(sTimezone);␊ + ␊ + // Do not migrate these methods, as they used to return "this" and now return "undefined".␊ + // Further more, now the functionality is moved into multiple modules.␊ + sap.ui.getCore().getConfiguration().setRTL(false).setLanguage("en");␊ + const setCalendar = (type) => sap.ui.getCore().getConfiguration().setCalendarType(type);␊ + const typedCalendar = sType ? sap.ui.getCore().getConfiguration().setCalendarType(sType) : null;␊ + debug("msg 2", sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale));␊ + debug("msg 2", (globalConfiguration.setFormatLocale(sFormatLocale)));␊ + debug("msg 2", ((((sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale))))));␊ + var time = sap.ui.getCore().getConfiguration().setTimezone(sTimezone);␊ + var info = {␊ + theme: globalConfiguration.setTheme(sTheme)␊ + };␊ + globalConfiguration.setTheme(sTheme) ?? sap.ui.getCore().getConfiguration().setTimezone(sTimezone);␊ + sap.ui.getCore().getConfiguration().setCalendarWeekNumbering(sCalendarWeekNumbering) ? "a" : "b";␊ + globalConfiguration.setCalendarType(sCalendarType), sap.ui.getCore().getConfiguration().setCalendarWeekNumbering(sCalendarWeekNumbering);␊ + fnCall(sap.ui.getCore().getConfiguration().setLanguage(sLanguage));␊ });␊ ` @@ -5385,8 +5589,32 @@ Generated by [AVA](https://avajs.dev). line: 61, message: 'Unable to analyze this method call because the type of identifier "getFormatLocale" in "Formatting.getFormatLocale()"" could not be determined', }, + { + category: 1, + column: 2, + line: 78, + message: 'Unable to analyze this method call because the type of identifier in "debug("msg 2", sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale))"" could not be determined', + }, + { + category: 1, + column: 2, + line: 79, + message: 'Unable to analyze this method call because the type of identifier in "debug("msg 2", (globalConfiguration.setFormatLocale(sFormatLocale)))"" could not be determined', + }, + { + category: 1, + column: 2, + line: 80, + message: 'Unable to analyze this method call because the type of identifier in "debug("msg 2", ((((sap.ui.getCore().getConfiguration().setFormatLocale(sFormatLocale))))))"" could not be determined', + }, + { + category: 1, + column: 2, + line: 88, + message: 'Unable to analyze this method call because the type of identifier in "fnCall(sap.ui.getCore().getConfiguration().setLanguage(sLanguage))"" could not be determined', + }, ], - errorCount: 7, + errorCount: 76, fatalErrorCount: 0, filePath: 'DeprecatedConfigurationApiWithoutImport.js', messages: [ @@ -5446,6 +5674,558 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 2, + line: 64, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 64, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 64, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 64, + message: 'Call to deprecated function \'setCalendarType\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 2, + line: 65, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 65, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 65, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 65, + message: 'Call to deprecated function \'setCalendarWeekNumbering\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 2, + line: 66, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 66, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 66, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 66, + message: 'Call to deprecated function \'setFormatLocale\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 2, + line: 68, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 68, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 68, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 68, + message: 'Call to deprecated function \'setLanguage\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 2, + line: 69, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 69, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 69, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 69, + message: 'Call to deprecated function \'setRTL\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 2, + line: 71, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 71, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 71, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 71, + message: 'Call to deprecated function \'setTimezone\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 2, + line: 75, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 75, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 75, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 75, + message: 'Call to deprecated function \'setRTL\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 52, + line: 75, + message: 'Call to deprecated function \'setLanguage\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 32, + line: 76, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 39, + line: 76, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 49, + line: 76, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 68, + line: 76, + message: 'Call to deprecated function \'setCalendarType\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 32, + line: 77, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 39, + line: 77, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 49, + line: 77, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 68, + line: 77, + message: 'Call to deprecated function \'setCalendarType\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 17, + line: 78, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 24, + line: 78, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 34, + line: 78, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 53, + line: 78, + message: 'Call to deprecated function \'setFormatLocale\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 79, + message: 'Call to deprecated function \'setFormatLocale\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 21, + line: 80, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 28, + line: 80, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 80, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 57, + line: 80, + message: 'Call to deprecated function \'setFormatLocale\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 13, + line: 81, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 20, + line: 81, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 30, + line: 81, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 49, + line: 81, + message: 'Call to deprecated function \'setTimezone\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 30, + line: 83, + message: 'Call to deprecated function \'setTheme\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 22, + line: 85, + message: 'Call to deprecated function \'setTheme\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 42, + line: 85, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 49, + line: 85, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 59, + line: 85, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 78, + line: 85, + message: 'Call to deprecated function \'setTimezone\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 2, + line: 86, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 9, + line: 86, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 19, + line: 86, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 38, + line: 86, + message: 'Call to deprecated function \'setCalendarWeekNumbering\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 22, + line: 87, + message: 'Call to deprecated function \'setCalendarType\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 54, + line: 87, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 61, + line: 87, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 71, + line: 87, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 90, + line: 87, + message: 'Call to deprecated function \'setCalendarWeekNumbering\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 9, + line: 88, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + messageDetails: 'Do not use global variables to access UI5 modules or APIs. See Best Practices for Developers (https://ui5.sap.com/#/topic/28fcd55b04654977b63dacbee0552712)', + ruleId: 'no-globals', + severity: 2, + }, + { + column: 16, + line: 88, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 26, + line: 88, + message: 'Call to deprecated function \'getConfiguration\' of class \'Core\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, + { + column: 45, + line: 88, + message: 'Call to deprecated function \'setLanguage\' of class \'Configuration\'', + messageDetails: 'Deprecated test message', + ruleId: 'no-deprecated-api', + severity: 2, + }, ], warningCount: 0, }, diff --git a/test/lib/autofix/snapshots/autofix.fixtures.ts.snap b/test/lib/autofix/snapshots/autofix.fixtures.ts.snap index fd78f15889b8e1e91990b4e5a4753fd1adeb08b1..efa97ca99c0560d2b43ee084b5613fc44752e123 100644 GIT binary patch delta 20303 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 delta 15682 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 From e3ca3f2e0fda1c87827b62e65888a0b41292b907 Mon Sep 17 00:00:00 2001 From: Yavor Ivanov Date: Fri, 6 Jun 2025 10:39:21 +0300 Subject: [PATCH 7/7] fix: Assume chaining only on the right hand side --- src/linter/ui5Types/utils/utils.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/linter/ui5Types/utils/utils.ts b/src/linter/ui5Types/utils/utils.ts index 273950a5a..ae26fbf21 100644 --- a/src/linter/ui5Types/utils/utils.ts +++ b/src/linter/ui5Types/utils/utils.ts @@ -249,9 +249,11 @@ export function isExpectedValueExpression(node: ts.Node): boolean { node.parent.arguments.some((arg) => arg === node)) || // Chaining (ts.isPropertyAccessExpression(node) && - ts.isCallExpression(node.expression) && - ts.isPropertyAccessExpression(node.expression.parent) && - ts.isCallExpression(node.expression.parent.expression)) + ts.isCallExpression(node.parent) && node.parent.expression === node && + ts.isPropertyAccessExpression(node.parent.parent) && + node.parent.parent.expression === node.parent && + ts.isCallExpression(node.parent.parent.parent) && + node.parent.parent.parent.expression === node.parent.parent) ) { isExpectedValue = true; }