diff --git a/src/linter/ui5Types/SourceFileLinter.ts b/src/linter/ui5Types/SourceFileLinter.ts index e5c5b0e9..6cdd7d26 100644 --- a/src/linter/ui5Types/SourceFileLinter.ts +++ b/src/linter/ui5Types/SourceFileLinter.ts @@ -214,7 +214,8 @@ export default class SourceFileLinter { if (!ts.isPropertyAccessExpression(exprNode) && !ts.isElementAccessExpression(exprNode) && - !ts.isIdentifier(exprNode)) { + !ts.isIdentifier(exprNode) && + !ts.isCallExpression(exprNode)) { // TODO: Transform into coverage message if it's really ok not to handle this throw new Error(`Unhandled CallExpression expression syntax: ${ts.SyntaxKind[exprNode.kind]}`); } @@ -229,7 +230,7 @@ export default class SourceFileLinter { reportNode = exprNode.name; } else if (ts.isElementAccessExpression(exprNode)) { reportNode = exprNode.argumentExpression; - } else { // Identifier + } else { // Identifier / CallExpression reportNode = exprNode; } diff --git a/test/fixtures/linter/general/Class.js b/test/fixtures/linter/general/Class.js new file mode 100644 index 00000000..59c700f9 --- /dev/null +++ b/test/fixtures/linter/general/Class.js @@ -0,0 +1,7 @@ +import BaseObject from "sap/ui/base/Object"; + +class Foo extends BaseObject { + constructor() { + super(); + } +} diff --git a/test/fixtures/linter/general/FunctionCall.js b/test/fixtures/linter/general/FunctionCall.js new file mode 100644 index 00000000..835ae341 --- /dev/null +++ b/test/fixtures/linter/general/FunctionCall.js @@ -0,0 +1,3 @@ +import values from "sap/base/util/values"; +const getValues = () => values; +getValues()({foo: "bar"}); // Special case: CallExpression on a CallExpression diff --git a/test/fixtures/linter/rules/NoDeprecatedApi/NoDeprecatedApi.js b/test/fixtures/linter/rules/NoDeprecatedApi/NoDeprecatedApi.js index 1f81a893..7de1cd73 100644 --- a/test/fixtures/linter/rules/NoDeprecatedApi/NoDeprecatedApi.js +++ b/test/fixtures/linter/rules/NoDeprecatedApi/NoDeprecatedApi.js @@ -23,6 +23,9 @@ sap.ui.define([ includes([1], 1); // Function "includes" is deprecated + const getIncludesFunction = () => includes; + getIncludesFunction()([1], 1); // Function "includes" is deprecated + Configuration.getCompatibilityVersion("sapMDialogWithPadding"); // Method "getCompatibilityVersion" is deprecated Configuration["getCompatibilityVersion"]("sapMDialogWithPadding"); // Method "getCompatibilityVersion" is deprecated diff --git a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md index bef9f713..474457c1 100644 --- a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md +++ b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md @@ -70,7 +70,7 @@ Generated by [AVA](https://avajs.dev). [ { coverageInfo: [], - errorCount: 18, + errorCount: 19, fatalErrorCount: 0, filePath: 'NoDeprecatedApi.js', messages: [ @@ -164,10 +164,19 @@ Generated by [AVA](https://avajs.dev). ruleId: 'ui5-linter-no-deprecated-api', severity: 2, }, + { + column: 2, + fatal: undefined, + line: 27, + message: 'Call to deprecated function \'getIncludesFunction()\'', + messageDetails: 'Deprecated test message', + ruleId: 'ui5-linter-no-deprecated-api', + severity: 2, + }, { column: 16, fatal: undefined, - line: 26, + line: 29, message: 'Call to deprecated function \'getCompatibilityVersion\' of class \'Configuration\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-api', @@ -176,7 +185,7 @@ Generated by [AVA](https://avajs.dev). { column: 16, fatal: undefined, - line: 27, + line: 30, message: 'Call to deprecated function \'getCompatibilityVersion\' of class \'Configuration\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-api', @@ -185,7 +194,7 @@ Generated by [AVA](https://avajs.dev). { column: 2, fatal: undefined, - line: 29, + line: 32, message: 'Access of deprecated property \'webview\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-property', @@ -194,7 +203,7 @@ Generated by [AVA](https://avajs.dev). { column: 2, fatal: undefined, - line: 30, + line: 33, message: 'Access of deprecated property \'webview\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-property', @@ -203,7 +212,7 @@ Generated by [AVA](https://avajs.dev). { column: 2, fatal: undefined, - line: 32, + line: 35, message: 'Access of deprecated property \'AnimationMode\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-property', @@ -212,7 +221,7 @@ Generated by [AVA](https://avajs.dev). { column: 2, fatal: undefined, - line: 34, + line: 37, message: 'Access of deprecated property \'MessageType\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-property', @@ -221,7 +230,7 @@ Generated by [AVA](https://avajs.dev). { column: 2, fatal: undefined, - line: 36, + line: 39, message: 'Access of deprecated property \'Date\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-property', @@ -230,7 +239,7 @@ Generated by [AVA](https://avajs.dev). { column: 20, fatal: undefined, - line: 39, + line: 42, message: 'Call to deprecated function \'storeInnerAppState\' of class \'NavigationHandler\'', messageDetails: 'Deprecated test message', ruleId: 'ui5-linter-no-deprecated-api', diff --git a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap index 2703175e..b0f1b7c9 100644 Binary files a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap and b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap differ diff --git a/test/lib/linter/snapshots/linter.ts.md b/test/lib/linter/snapshots/linter.ts.md index c01d6fc7..973ad2db 100644 --- a/test/lib/linter/snapshots/linter.ts.md +++ b/test/lib/linter/snapshots/linter.ts.md @@ -4,6 +4,21 @@ The actual snapshot is saved in `linter.ts.snap`. Generated by [AVA](https://avajs.dev). +## General: Class.js + +> Snapshot 1 + + [ + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'Class.js', + messages: [], + warningCount: 0, + }, + ] + ## General: Coverage.js > Snapshot 1 @@ -92,6 +107,21 @@ Generated by [AVA](https://avajs.dev). }, ] +## General: FunctionCall.js + +> Snapshot 1 + + [ + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'FunctionCall.js', + messages: [], + warningCount: 0, + }, + ] + ## General: JSDoc.js > Snapshot 1 diff --git a/test/lib/linter/snapshots/linter.ts.snap b/test/lib/linter/snapshots/linter.ts.snap index 5e688adc..3367654d 100644 Binary files a/test/lib/linter/snapshots/linter.ts.snap and b/test/lib/linter/snapshots/linter.ts.snap differ