From b563b7dd2553a9db4d4fec4f53656e3a50dace05 Mon Sep 17 00:00:00 2001 From: Jason Weinzierl Date: Tue, 24 Jun 2025 10:28:53 -0500 Subject: [PATCH] feat(no-misused-observables): improve report loc for methods --- src/rules/no-misused-observables.ts | 25 ++++++++++++++++++---- tests/rules/no-misused-observables.test.ts | 4 ++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/rules/no-misused-observables.ts b/src/rules/no-misused-observables.ts index e4df550c..9c7a9225 100644 --- a/src/rules/no-misused-observables.ts +++ b/src/rules/no-misused-observables.ts @@ -1,4 +1,5 @@ import { AST_NODE_TYPES, TSESTree as es, TSESLint as eslint, ESLintUtils } from '@typescript-eslint/utils'; +import { getFunctionHeadLocation, isFunction } from '@typescript-eslint/utils/ast-utils'; import * as tsutils from 'ts-api-utils'; import ts from 'typescript'; import { @@ -251,10 +252,25 @@ export const noMisusedObservablesRule = ruleCreator({ return; } - context.report({ - messageId: 'forbiddenVoidReturnProperty', - node: node.value, - }); + if (isFunction(node.value)) { + const functionNode = node.value; + if (functionNode.returnType) { + context.report({ + messageId: 'forbiddenVoidReturnProperty', + node: functionNode.returnType.typeAnnotation, + }); + } else { + context.report({ + messageId: 'forbiddenVoidReturnProperty', + loc: getFunctionHeadLocation(functionNode, context.sourceCode), + }); + } + } else { + context.report({ + messageId: 'forbiddenVoidReturnProperty', + node: node.value, + }); + } } function checkReturnStatement(node: es.ReturnStatement): void { @@ -277,6 +293,7 @@ export const noMisusedObservablesRule = ruleCreator({ return current; } const functionNode = getFunctionNode(); + if ( functionNode?.returnType && !isPossiblyFunctionType(functionNode.returnType) diff --git a/tests/rules/no-misused-observables.test.ts b/tests/rules/no-misused-observables.test.ts index e1e75689..23737a32 100644 --- a/tests/rules/no-misused-observables.test.ts +++ b/tests/rules/no-misused-observables.test.ts @@ -740,7 +740,7 @@ ruleTester({ types: true }).run('no-misused-observables', noMisusedObservablesRu type Foo = { bar: () => void }; const foo: Foo = { bar: () => of(42), - ~~~~~~~~~~~~ [forbiddenVoidReturnProperty] + ~~ [forbiddenVoidReturnProperty] }; `, ), @@ -752,7 +752,7 @@ ruleTester({ types: true }).run('no-misused-observables', noMisusedObservablesRu type Foo = { bar: () => void }; const foo: Foo = { bar(): Observable { return of(42); }, - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [forbiddenVoidReturnProperty] + ~~~~~~~~~~~~~~~~~~ [forbiddenVoidReturnProperty] }; `, ),