fix(tsetse): avoid double type discover in failure condition for ban-expect-truthy-promise rule

Also optimize must-use-promises rule via removal of unneeded type/node checks

Closes #372

PiperOrigin-RevId: 231994937
diff --git a/internal/tsetse/rules/ban_expect_truthy_promise_rule.ts b/internal/tsetse/rules/ban_expect_truthy_promise_rule.ts
index fbbefd9..d1e79c0 100644
--- a/internal/tsetse/rules/ban_expect_truthy_promise_rule.ts
+++ b/internal/tsetse/rules/ban_expect_truthy_promise_rule.ts
@@ -56,11 +56,11 @@
     return;
   }
 
-  if (!tsutils.isThenableType(tc, expectCallNode.arguments[0])) {
+  const argType = tc.getTypeAtLocation(expectCallNode.arguments[0]);
+  if (!tsutils.isThenableType(tc, expectCallNode.arguments[0], argType)) {
     return;
   }
 
-  const argType = tc.getTypeAtLocation(expectCallNode.arguments[0]);
   checker.addFailureAtNode(
       node,
       `Value passed to expect() is of type ${tc.typeToString(argType)}, which` +
diff --git a/internal/tsetse/rules/must_use_promises_rule.ts b/internal/tsetse/rules/must_use_promises_rule.ts
index 5c39fe5..7e4905a 100644
--- a/internal/tsetse/rules/must_use_promises_rule.ts
+++ b/internal/tsetse/rules/must_use_promises_rule.ts
@@ -30,30 +30,29 @@
     return;
   }
 
-  const signature = checker.typeChecker.getResolvedSignature(node);
-  if (signature === undefined) {
-    return;
-  }
-
-  const returnType = checker.typeChecker.getReturnTypeOfSignature(signature);
-  if (!!(returnType.flags & ts.TypeFlags.Void)) {
-    return;
-  }
-
   if (tsutils.isThenableType(checker.typeChecker, node)) {
     checker.addFailureAtNode(node, FAILURE_STRING);
   }
 }
 
 function inAsyncFunction(node: ts.Node): boolean {
-  const isFunction = tsutils.isFunctionDeclaration(node) ||
-      tsutils.isArrowFunction(node) || tsutils.isMethodDeclaration(node) ||
-      tsutils.isFunctionExpression(node);
-  if (isFunction) {
-    return tsutils.hasModifier(node.modifiers, ts.SyntaxKind.AsyncKeyword);
+  for (let inode = node.parent; inode !== undefined; inode = inode.parent) {
+    switch (inode.kind) {
+      case ts.SyntaxKind.ArrowFunction:
+      case ts.SyntaxKind.FunctionDeclaration:
+      case ts.SyntaxKind.FunctionExpression:
+      case ts.SyntaxKind.MethodDeclaration:
+        // Potentially async
+        return tsutils.hasModifier(inode.modifiers, ts.SyntaxKind.AsyncKeyword);
+      case ts.SyntaxKind.GetAccessor:
+      case ts.SyntaxKind.SetAccessor:
+        // These cannot be async
+        return false;
+      default:
+        // Loop and check parent
+        break;
+    }
   }
-  if (node.parent) {
-    return inAsyncFunction(node.parent);
-  }
+
   return false;
 }