@samitouri / QOS-React-1 / commits / 4b3e662e4c

[compiler] Add VoidUseMemo rule to RecommendedLatest (#34783)

Adds a new error category VoidUseMemo which is only enabled in the RecommendedLatest preset for now.

lauren committed Oct 8, 2025 at 15:55 UTC 4b3e662e4ce54eb54a8701c48a967cc84a389501
2 files changed +17 -2
compiler/packages/babel-plugin-react-compiler/src/CompilerError.ts
+16 -1
@@ -536,7 +536,8 @@ function printErrorSummary(category: ErrorCategory, message: string): string {
536 case ErrorCategory.StaticComponents:
537 case ErrorCategory.Suppression:
538 case ErrorCategory.Syntax:
539 - case ErrorCategory.UseMemo: {
539 + case ErrorCategory.UseMemo:
540 + case ErrorCategory.VoidUseMemo: {
541 heading = 'Error';
542 break;
543 }
@@ -582,6 +583,10 @@ export enum ErrorCategory {
583 * Checking for valid usage of manual memoization
584 */
585 UseMemo = 'UseMemo',
586 + /**
587 + * Checking that useMemos always return a value
588 + */
589 + VoidUseMemo = 'VoidUseMemo',
590 /**
591 * Checking for higher order functions acting as factories for components/hooks
592 */
@@ -977,6 +982,16 @@ function getRuleForCategoryImpl(category: ErrorCategory): LintRule {
982 preset: LintRulePreset.Recommended,
983 };
984 }
985 + case ErrorCategory.VoidUseMemo: {
986 + return {
987 + category,
988 + severity: ErrorSeverity.Error,
989 + name: 'void-use-memo',
990 + description:
991 + 'Validates that useMemos always return a value. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.',
992 + preset: LintRulePreset.RecommendedLatest,
993 + };
994 + }
995 case ErrorCategory.IncompatibleLibrary: {
996 return {
997 category,
compiler/packages/babel-plugin-react-compiler/src/Inference/DropManualMemoization.ts
+1 -1
@@ -454,7 +454,7 @@ export function dropManualMemoization(
454 if (!hasNonVoidReturn(funcToCheck.loweredFunc.func)) {
455 errors.pushDiagnostic(
456 CompilerDiagnostic.create({
457 - category: ErrorCategory.UseMemo,
457 + category: ErrorCategory.VoidUseMemo,
458 reason: 'useMemo() callbacks must return a value',
459 description: `This ${
460 manualMemo.loadInstr.value.kind === 'PropertyLoad'