@colrealpro/react-luau-doctor 0.18.2 → 0.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +69 -3
- package/dist/cli.js.map +24 -24
- package/dist/scan-worker.js +68 -2
- package/dist/scan-worker.js.map +25 -25
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -11,45 +11,45 @@
|
|
|
11
11
|
"import path from \"node:path\";\nimport { loadConfig } from \"./config\";\nimport { isSelectedLuauPath } from \"./files\";\nimport { createGitScopePlan, type GitScopePlan } from \"./git\";\nimport { createScanAnalysisSession, rebuildReport, scanPath, scoreDiagnostics, type ScanAnalysisSession } from \"./scanner\";\nimport type {\n Category,\n Diagnostic,\n DoctorConfig,\n ScanOptions,\n ScanProgress,\n ScanReport,\n ScanScope,\n Severity,\n} from \"./types\";\n\nexport interface ScopedScanOptions {\n scope: ScanScope;\n targetRoot?: string;\n base?: string;\n includeUntracked?: boolean;\n staged?: boolean;\n changedFilesFrom?: string;\n minSeverity?: Severity;\n categories?: Category[];\n config?: DoctorConfig;\n respectInlineDisables?: boolean;\n deadlineAt?: number;\n onProgress?: (progress: ScanProgress) => void;\n cache?: boolean;\n parallel?: boolean;\n analysisSession?: ScanAnalysisSession;\n}\n\nfunction diagnosticFingerprint(diagnostic: Diagnostic): string {\n return `${diagnostic.file}\\0${diagnostic.rule}\\0${diagnostic.severity}\\0${diagnostic.message}`;\n}\n\nfunction introducedDiagnostics(current: Diagnostic[], baseline: Diagnostic[]): Diagnostic[] {\n const baselineCounts = new Map<string, number>();\n for (const diagnostic of baseline) {\n const fingerprint = diagnosticFingerprint(diagnostic);\n baselineCounts.set(fingerprint, (baselineCounts.get(fingerprint) ?? 0) + 1);\n }\n\n const introduced: Diagnostic[] = [];\n for (const diagnostic of current) {\n const fingerprint = diagnosticFingerprint(diagnostic);\n const remaining = baselineCounts.get(fingerprint) ?? 0;\n if (remaining > 0) baselineCounts.set(fingerprint, remaining - 1);\n else introduced.push(diagnostic);\n }\n return introduced;\n}\n\nfunction touchesChangedLines(diagnostic: Diagnostic, ranges: Array<{ start: number; end: number }>): boolean {\n const locations = [diagnostic.location, ...(diagnostic.highlights ?? [])];\n return locations.some((location) =>\n ranges.some((range) => location.endLine >= range.start && location.line <= range.end)\n );\n}\n\nfunction filterGitScopePlan(plan: GitScopePlan, config: DoctorConfig): GitScopePlan {\n const selected = (relativePath: string | undefined): boolean =>\n relativePath !== undefined && isSelectedLuauPath(relativePath, config);\n\n return {\n ...plan,\n changedFiles: plan.changedFiles.filter((file) => isSelectedLuauPath(file, config)),\n currentFiles: plan.currentFiles.filter((file) => selected(file.relativePath)),\n baselineFiles: plan.baselineFiles.filter((file) => selected(file.relativePath)),\n changedLines: new Map(\n [...plan.changedLines].filter(([file]) => isSelectedLuauPath(file, config)),\n ),\n };\n}\n\nfunction sharedScanOptions(options: ScopedScanOptions, projectRoot: string, phase?: string): ScanOptions & { analysisSession?: ScanAnalysisSession } {\n return {\n projectRoot,\n minSeverity: options.minSeverity,\n categories: options.categories,\n config: options.config,\n respectInlineDisables: options.respectInlineDisables,\n deadlineAt: options.deadlineAt,\n onProgress: options.onProgress,\n progressPhase: phase,\n cache: options.cache,\n parallel: options.parallel,\n analysisSession: options.analysisSession,\n };\n}\n\nexport async function scanProjectWithScope(projectRoot: string, options: ScopedScanOptions): Promise<ScanReport> {\n const targetRoot = path.resolve(options.targetRoot ?? projectRoot);\n const config = options.config ?? loadConfig(projectRoot);\n const configuredOptions = options.config ? options : { ...options, config };\n\n if (options.scope === \"full\" && !options.staged && !options.changedFilesFrom) {\n const report = await scanPath(targetRoot, sharedScanOptions(configuredOptions, projectRoot));\n return { ...report, scope: \"full\" };\n }\n\n const effectiveScope: Exclude<ScanScope, \"full\"> = options.staged\n ? options.scope === \"lines\"\n ? \"lines\"\n : \"files\"\n : options.scope === \"full\"\n ? \"files\"\n : options.scope;\n const scanOptions: ScopedScanOptions = effectiveScope === \"changed\"\n ? { ...configuredOptions, analysisSession: options.analysisSession ?? createScanAnalysisSession() }\n : configuredOptions;\n\n const plan = filterGitScopePlan(createGitScopePlan(targetRoot, {\n scope: effectiveScope,\n base: options.base,\n includeUntracked: options.includeUntracked,\n staged: options.staged,\n changedFilesFrom: options.changedFilesFrom,\n }, projectRoot), config);\n\n const current = await scanPath(targetRoot, {\n ...sharedScanOptions(scanOptions, projectRoot, effectiveScope === \"changed\" ? \"current\" : undefined),\n files: plan.currentFiles,\n });\n\n let diagnostics = current.diagnostics;\n let partial = current.partial;\n let skippedFiles = current.skippedFiles;\n\n if (effectiveScope === \"changed\") {\n const baseline = await scanPath(targetRoot, {\n ...sharedScanOptions(scanOptions, projectRoot, \"baseline\"),\n files: plan.baselineFiles,\n });\n const baselineSkipped = new Set(baseline.skippedFiles ?? []);\n const baselinePaths = new Set(plan.baselineFiles.map((file) => file.relativePath ?? \"\"));\n const comparableCurrent = current.diagnostics.filter(\n (diagnostic) => !baselinePaths.has(diagnostic.file) || !baselineSkipped.has(diagnostic.file),\n );\n diagnostics = introducedDiagnostics(comparableCurrent, baseline.diagnostics);\n partial = partial || Boolean(baseline.partial);\n skippedFiles = [...new Set([...(current.skippedFiles ?? []), ...(baseline.skippedFiles ?? [])])].sort();\n } else if (effectiveScope === \"lines\") {\n diagnostics = current.diagnostics.filter((diagnostic) =>\n touchesChangedLines(diagnostic, plan.changedLines.get(diagnostic.file) ?? []),\n );\n }\n\n return rebuildReport(current, diagnostics, {\n partial,\n skippedFiles,\n scope: options.staged ? \"staged\" : effectiveScope,\n base: plan.base,\n changedFiles: plan.changedFiles,\n });\n}\n\nfunction normalize(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction prefixDiagnostic(diagnostic: Diagnostic, prefix: string): Diagnostic {\n if (!prefix || prefix === \".\") return diagnostic;\n return { ...diagnostic, file: normalize(path.posix.join(prefix, diagnostic.file)) };\n}\n\nexport function aggregateReports(root: string, reports: Array<{ projectRoot: string; report: ScanReport }>): ScanReport {\n const startedDuration = reports.reduce((total, entry) => total + entry.report.durationMs, 0);\n const diagnostics: Diagnostic[] = [];\n const skippedFiles: string[] = [];\n const changedFiles: string[] = [];\n const notes: string[] = [];\n const projects: string[] = [];\n let scannedFiles = 0;\n let candidateFiles = 0;\n let partial = false;\n\n for (const { projectRoot, report } of reports) {\n const prefix = normalize(path.relative(root, projectRoot));\n projects.push(prefix || \".\");\n scannedFiles += report.scannedFiles;\n candidateFiles += report.candidateFiles ?? 0;\n partial = partial || Boolean(report.partial);\n diagnostics.push(...report.diagnostics.map((diagnostic) => prefixDiagnostic(diagnostic, prefix)));\n skippedFiles.push(...(report.skippedFiles ?? []).map((file) => (prefix ? normalize(path.posix.join(prefix, file)) : file)));\n changedFiles.push(...(report.changedFiles ?? []).map((file) => (prefix ? normalize(path.posix.join(prefix, file)) : file)));\n notes.push(...(report.notes ?? []));\n }\n\n diagnostics.sort(\n (a, b) => a.file.localeCompare(b.file) || a.location.line - b.location.line || b.severity.localeCompare(a.severity),\n );\n const counts: Record<Severity, number> = { error: 0, warning: 0, suggestion: 0 };\n for (const diagnostic of diagnostics) counts[diagnostic.severity] += 1;\n\n const scopes = new Set(reports.map((entry) => entry.report.scope).filter(Boolean));\n const bases = new Set(reports.map((entry) => entry.report.base).filter(Boolean));\n\n return {\n schemaVersion: 1,\n root,\n scannedFiles,\n candidateFiles,\n durationMs: Math.round(startedDuration * 100) / 100,\n score: scoreDiagnostics(diagnostics, scannedFiles),\n counts,\n diagnostics,\n partial,\n skippedFiles: [...new Set(skippedFiles)].sort(),\n scope: scopes.size === 1 ? [...scopes][0] : undefined,\n base: bases.size === 1 ? [...bases][0] : undefined,\n changedFiles: [...new Set(changedFiles)].sort(),\n projects,\n notes: notes.length > 0 ? [...new Set(notes)] : undefined,\n };\n}\n",
|
|
12
12
|
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n cacheHasSameFileSet,\n cachedEffectModules,\n cachedProjectModel,\n cachedReport,\n changedProjectFiles,\n knownReactFile,\n previousCachedReport,\n previousProjectModel,\n projectModelFeatureKey,\n materializeProjectCandidates,\n prepareProjectCache,\n recordReactFile,\n saveProjectCache,\n stableCacheKey,\n} from \"./cache\";\nimport { loadConfig } from \"./config\";\nimport { discoverLuauFiles } from \"./files\";\nimport { analyzeReactFile, type ReactFileAnalysisInput, type ReactFileAnalysisResult } from \"./file-analysis\";\nimport { AnalysisWorkerPool, analysisWorkerCount } from \"./parallel\";\nimport { buildProjectModel, type ProjectModelModuleCacheEntry } from \"./project-model\";\nimport { buildProjectSourceEffects, type CachedSourceEffectModule, type ProjectEffectParseCacheEntry } from \"./project-effects\";\nimport { rules } from \"./rules\";\nimport type {\n Diagnostic,\n DoctorConfig,\n ScanFileInput,\n ScanOptions,\n ScanReport,\n Severity,\n} from \"./types\";\n\nconst REACT_SOURCE_MARKER = /\\bReact(?:Roblox)?\\b/i;\n\nexport interface ScanAnalysisSession {\n projectModelModules: Map<string, ProjectModelModuleCacheEntry>;\n effectModules?: Record<string, CachedSourceEffectModule>;\n}\n\nexport function createScanAnalysisSession(): ScanAnalysisSession {\n return { projectModelModules: new Map() };\n}\n\ntype ScanRuntimeOptions = ScanOptions & { analysisSession?: ScanAnalysisSession };\n\nexport function scoreDiagnostics(diagnostics: Diagnostic[], scannedFiles: number): number {\n const weightedFindings = diagnostics.reduce((total, diagnostic) => {\n if (diagnostic.severity === \"error\") return total + 8;\n if (diagnostic.severity === \"warning\") return total + 3;\n return total + 1;\n }, 0);\n const penalty = (weightedFindings / Math.max(scannedFiles, 1)) * 20;\n return Math.max(0, Math.round(100 - Math.min(100, penalty)));\n}\n\nfunction countDiagnostics(diagnostics: Diagnostic[]): Record<Severity, number> {\n const counts: Record<Severity, number> = { error: 0, warning: 0, suggestion: 0 };\n for (const diagnostic of diagnostics) counts[diagnostic.severity] += 1;\n return counts;\n}\n\nexport function rebuildReport(\n report: ScanReport,\n diagnostics: Diagnostic[],\n metadata: Partial<Omit<ScanReport, \"schemaVersion\" | \"diagnostics\" | \"counts\" | \"score\">> = {},\n): ScanReport {\n const sorted = [...diagnostics].sort(\n (a, b) => a.file.localeCompare(b.file) || a.location.line - b.location.line || b.severity.localeCompare(a.severity),\n );\n const next = { ...report, ...metadata };\n return {\n ...next,\n schemaVersion: 1,\n diagnostics: sorted,\n counts: countDiagnostics(sorted),\n score: scoreDiagnostics(sorted, next.scannedFiles),\n };\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction transitiveAffectedFiles(\n changedFiles: string[],\n previousModules: Readonly<Record<string, CachedSourceEffectModule>>,\n currentModules: Readonly<Record<string, CachedSourceEffectModule>>,\n): Set<string> {\n const affected = new Set(changedFiles.map(normalizeRelative));\n const modules = new Map<string, { file: string; id: string }>();\n const reverse = new Map<string, Set<string>>();\n\n for (const source of [previousModules, currentModules]) {\n for (const [rawFile, module] of Object.entries(source)) {\n const file = normalizeRelative(rawFile);\n modules.set(file, { file, id: module.id });\n for (const dependency of module.importedModuleIds) {\n const importers = reverse.get(dependency) ?? new Set<string>();\n importers.add(file);\n reverse.set(dependency, importers);\n }\n }\n }\n\n const queue = [...affected].map((file) => modules.get(file)?.id ?? file.toLowerCase());\n const visitedIds = new Set(queue);\n while (queue.length > 0) {\n const moduleId = queue.shift()!;\n for (const importerFile of reverse.get(moduleId) ?? []) {\n if (!affected.has(importerFile)) affected.add(importerFile);\n const importerId = modules.get(importerFile)?.id;\n if (importerId && !visitedIds.has(importerId)) {\n visitedIds.add(importerId);\n queue.push(importerId);\n }\n }\n }\n return affected;\n}\n\nfunction candidateInputs(targetPath: string, projectRoot: string, config: DoctorConfig, options: ScanOptions): ScanFileInput[] {\n if (options.files) return options.files;\n const targetStat = fs.statSync(targetPath);\n return discoverLuauFiles(targetPath, config, projectRoot).map((absolutePath) => ({\n absolutePath,\n forceScan: targetStat.isFile(),\n }));\n}\n\nfunction projectInputs(root: string, config: DoctorConfig, scopedCandidates: ScanFileInput[]): ScanFileInput[] {\n const all = discoverLuauFiles(root, config).map((absolutePath) => ({ absolutePath } satisfies ScanFileInput));\n const overlays = new Map<string, ScanFileInput>();\n for (const candidate of scopedCandidates) {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n overlays.set(relativePath, candidate);\n }\n\n const result: ScanFileInput[] = [];\n const used = new Set<string>();\n for (const candidate of all) {\n const relativePath = normalizeRelative(path.relative(root, candidate.absolutePath));\n result.push(overlays.get(relativePath) ?? candidate);\n used.add(relativePath);\n }\n for (const [relativePath, candidate] of overlays) {\n if (!used.has(relativePath)) result.push(candidate);\n }\n return result;\n}\n\nexport async function scanPath(target = \".\", options: ScanRuntimeOptions = {}): Promise<ScanReport> {\n const startedAt = performance.now();\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const targetPath = path.resolve(cwd, target);\n if (!fs.existsSync(targetPath)) throw new Error(`Scan path does not exist: ${target}`);\n const targetStat = fs.statSync(targetPath);\n const defaultRoot = targetStat.isFile() ? path.dirname(targetPath) : targetPath;\n const root = path.resolve(options.projectRoot ?? defaultRoot);\n const config: DoctorConfig = options.config ?? loadConfig(root);\n\n if (config.rules) {\n const knownRules = new Set(rules.map((rule) => rule.id));\n for (const ruleId of Object.keys(config.rules)) {\n if (!knownRules.has(ruleId)) throw new Error(`Unknown configured rule: ${ruleId}`);\n }\n }\n\n const candidates = candidateInputs(targetPath, root, config, options);\n const targetIsProjectRoot = path.resolve(targetPath) === path.resolve(root);\n const modelCandidates = options.files || !targetIsProjectRoot ? projectInputs(root, config, candidates) : candidates;\n const hasSourceOverlays = modelCandidates.some((candidate) => candidate.source !== undefined);\n const canPersistCache = !hasSourceOverlays;\n const phaseSuffix = options.progressPhase ? ` (${options.progressPhase})` : \"\";\n const phaseId = (phase: string): string => [options.progressPhase, phase].filter(Boolean).join(\":\");\n const progress = (phase: string, label: string, current: number, total: number, file?: string, partial?: boolean): void => {\n options.onProgress?.({ current, total, file, partial, phase: phaseId(phase), label: `${label}${phaseSuffix}` });\n };\n\n const cacheSession = prepareProjectCache(\n root,\n modelCandidates,\n options.cache ?? true,\n (current, total, file) => progress(\"index\", \"Indexing project\", current, total, file),\n );\n\n const deadlineAt = options.deadlineAt ?? (options.maxDurationMs !== undefined ? startedAt + options.maxDurationMs : undefined);\n const respectInlineDisables = options.respectInlineDisables ?? config.respectInlineDisables ?? true;\n const minSeverity = options.minSeverity ?? \"suggestion\";\n const reportCacheKey = stableCacheKey({\n minSeverity,\n categories: options.categories ? [...options.categories].sort() : [],\n respectInlineDisables,\n rules: config.rules ?? {},\n });\n const canCacheWholeReport = canPersistCache && targetIsProjectRoot && options.files === undefined && deadlineAt === undefined;\n const previousReport = canCacheWholeReport ? previousCachedReport(cacheSession, reportCacheKey) : null;\n const previousProject = previousProjectModel(cacheSession);\n const previousEffectModules = options.analysisSession?.effectModules ?? cachedEffectModules(cacheSession);\n const changedFiles = changedProjectFiles(cacheSession);\n\n if (canCacheWholeReport) {\n const reportHit = cachedReport(cacheSession, reportCacheKey);\n if (reportHit) {\n progress(\"report-cache\", \"Loading cached results\", 1, 1);\n return {\n schemaVersion: 1,\n root,\n scannedFiles: reportHit.scannedFiles,\n candidateFiles: reportHit.candidateFiles,\n durationMs: Math.round((performance.now() - startedAt) * 100) / 100,\n score: scoreDiagnostics(reportHit.diagnostics, reportHit.scannedFiles),\n counts: countDiagnostics(reportHit.diagnostics),\n diagnostics: reportHit.diagnostics,\n partial: false,\n skippedFiles: [],\n };\n }\n }\n\n const projectParseCache = new Map<string, ProjectEffectParseCacheEntry>();\n const fileHashes = Object.fromEntries(Object.entries(cacheSession.files).map(([file, state]) => [file, state.hash]));\n const materializedCandidates = materializeProjectCandidates(cacheSession, modelCandidates);\n const parallelEnabled = options.parallel !== false && deadlineAt === undefined;\n const workerCount = parallelEnabled ? analysisWorkerCount(Math.max(materializedCandidates.length, candidates.length)) : 1;\n const workerPool = workerCount > 1 ? new AnalysisWorkerPool(workerCount) : null;\n\n try {\n let project = cachedProjectModel(cacheSession);\n if (project && !options.analysisSession) {\n progress(\"project-cache\", \"Loading cached project analysis\", 1, 1);\n } else {\n // Changed-scope scans share per-module project summaries between the current\n // and baseline passes. Even when the aggregate current model is cached, one\n // module-summary pass seeds the in-memory session so the baseline only has to\n // re-analyze files whose Git contents differ.\n progress(\"model\", \"Building project model\", 0, 1);\n const rebuilt = buildProjectModel(root, materializedCandidates, {\n fileHashes,\n moduleCache: options.analysisSession?.projectModelModules,\n });\n if (project?.sourceEffects) rebuilt.sourceEffects = project.sourceEffects;\n project = rebuilt;\n progress(\"model\", \"Building project model\", 1, 1);\n }\n\n if (project.sourceEffects.size === 0) {\n const effectBuild = await buildProjectSourceEffects(\n root,\n materializedCandidates,\n projectParseCache,\n (effectProgress) => {\n if (effectProgress.phase === \"parse\") {\n progress(\"effects-parse\", \"Parsing effect sources\", effectProgress.current, effectProgress.total, effectProgress.file);\n } else if (effectProgress.phase === \"index-functions\") {\n progress(\"effects-index-functions\", \"Indexing effect functions\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"analyze-calls\") {\n progress(\"effects-analyze-calls\", \"Resolving effect calls\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"assemble-graph\") {\n progress(\"effects-assemble-graph\", \"Building effect graph\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"resolve\") {\n progress(\"effects-resolve\", \"Linking effect dependencies\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"propagate\") {\n progress(\"effects-propagate\", \"Propagating project effects\", effectProgress.current, effectProgress.total);\n } else {\n progress(\"effects-summarize\", \"Finalizing project effects\", effectProgress.current, effectProgress.total);\n }\n },\n fileHashes,\n previousEffectModules,\n workerPool ?? undefined,\n );\n project.sourceEffects = effectBuild.effects;\n cacheSession.effectModules = effectBuild.cacheModules;\n } else if (!cacheSession.effectModules) {\n cacheSession.effectModules = previousEffectModules;\n }\n if (options.analysisSession) options.analysisSession.effectModules = cacheSession.effectModules ?? previousEffectModules;\n\n const diagnostics: Diagnostic[] = [];\n const skippedFiles: string[] = [];\n let scannedFiles = 0;\n let scanCandidates = candidates;\n let incrementalReuse = false;\n\n const currentEffectModules = cacheSession.effectModules ?? previousEffectModules;\n if (\n canCacheWholeReport &&\n previousReport &&\n previousProject &&\n cacheHasSameFileSet(cacheSession) &&\n projectModelFeatureKey(previousProject) === projectModelFeatureKey(project)\n ) {\n const affectedFiles = transitiveAffectedFiles(changedFiles, previousEffectModules, currentEffectModules);\n diagnostics.push(...previousReport.diagnostics.filter((diagnostic) => !affectedFiles.has(normalizeRelative(diagnostic.file))));\n scanCandidates = candidates.filter((candidate) => {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n return affectedFiles.has(relativePath);\n });\n incrementalReuse = true;\n }\n\n let processedCandidates = 0;\n const scanLabel = incrementalReuse ? \"Scanning affected React files\" : \"Scanning React files\";\n progress(\"scan\", scanLabel, 0, scanCandidates.length);\n\n const applyResult = (result: ReactFileAnalysisResult): void => {\n recordReactFile(cacheSession, result.relativePath, result.isReactFile);\n if (result.scanned) scannedFiles += 1;\n diagnostics.push(...result.diagnostics);\n };\n\n const prepareCandidate = (candidate: ScanFileInput): { input: ReactFileAnalysisInput; tree?: ProjectEffectParseCacheEntry[\"tree\"] } | null => {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n if (candidate.source === undefined && !fs.existsSync(candidate.absolutePath)) return null;\n const forceScan = candidate.forceScan ?? targetStat.isFile();\n const cached = projectParseCache.get(relativePath);\n if (!forceScan && !cached && !changedFiles.includes(relativePath) && knownReactFile(cacheSession, relativePath) === false) return null;\n\n const source = candidate.source ?? cached?.source ?? cacheSession.sources.get(relativePath) ?? fs.readFileSync(candidate.absolutePath, \"utf8\");\n if (!forceScan && !REACT_SOURCE_MARKER.test(source)) {\n recordReactFile(cacheSession, relativePath, false);\n return null;\n }\n\n return {\n input: {\n absolutePath: candidate.absolutePath,\n relativePath,\n source,\n forceScan,\n project,\n config,\n categories: options.categories,\n minSeverity,\n respectInlineDisables,\n },\n tree: cached && cached.source === source ? cached.tree : undefined,\n };\n };\n\n if (parallelEnabled) {\n const prepared = scanCandidates.map(prepareCandidate).filter((value) => value !== null);\n if (workerPool && prepared.length >= 16) {\n let completed = scanCandidates.length - prepared.length;\n progress(\"scan\", scanLabel, completed, scanCandidates.length);\n const results = await workerPool.scanReactFiles(\n prepared.map((entry) => entry.input),\n options.onProgress\n ? (count, file) => {\n completed += count;\n progress(\"scan\", scanLabel, Math.min(completed, scanCandidates.length), scanCandidates.length, file);\n }\n : undefined,\n );\n for (const result of results) applyResult(result);\n processedCandidates = scanCandidates.length;\n progress(\"scan\", scanLabel, processedCandidates, scanCandidates.length);\n } else {\n for (const entry of prepared) {\n applyResult(await analyzeReactFile(entry.input, entry.tree));\n processedCandidates += 1;\n progress(\"scan\", scanLabel, processedCandidates, prepared.length, entry.input.relativePath);\n }\n }\n } else {\n for (let candidateIndex = 0; candidateIndex < scanCandidates.length; candidateIndex += 1) {\n const candidate = scanCandidates[candidateIndex];\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n\n if (deadlineAt !== undefined && performance.now() >= deadlineAt) {\n for (const remaining of scanCandidates.slice(candidateIndex)) {\n skippedFiles.push(normalizeRelative(remaining.relativePath ?? path.relative(root, remaining.absolutePath)));\n }\n progress(\"scan\", scanLabel, processedCandidates, scanCandidates.length, relativePath, true);\n break;\n }\n\n try {\n const prepared = prepareCandidate(candidate);\n if (!prepared) continue;\n applyResult(await analyzeReactFile(prepared.input, prepared.tree));\n } finally {\n processedCandidates = candidateIndex + 1;\n progress(\"scan\", scanLabel, processedCandidates, scanCandidates.length, relativePath);\n }\n }\n }\n\n if (incrementalReuse) {\n scannedFiles = Object.values(cacheSession.files).filter((state) => state.isReactFile === true).length;\n }\n\n diagnostics.sort(\n (a, b) => a.file.localeCompare(b.file) || a.location.line - b.location.line || b.severity.localeCompare(a.severity),\n );\n\n const report: ScanReport = {\n schemaVersion: 1,\n root,\n scannedFiles,\n candidateFiles: candidates.length,\n durationMs: Math.round((performance.now() - startedAt) * 100) / 100,\n score: scoreDiagnostics(diagnostics, scannedFiles),\n counts: countDiagnostics(diagnostics),\n diagnostics,\n partial: skippedFiles.length > 0,\n skippedFiles,\n };\n\n if (canPersistCache) saveProjectCache(\n cacheSession,\n project,\n cacheSession.effectModules ?? cachedEffectModules(cacheSession),\n canCacheWholeReport && !report.partial ? reportCacheKey : undefined,\n canCacheWholeReport && !report.partial\n ? { scannedFiles: report.scannedFiles, candidateFiles: report.candidateFiles ?? candidates.length, diagnostics: report.diagnostics }\n : undefined,\n );\n\n return report;\n } finally {\n workerPool?.close();\n }\n}\n",
|
|
13
13
|
"import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport packageJson from \"../package.json\";\nimport type { CachedSourceEffectModule } from \"./project-effects\";\nimport type {\n Diagnostic,\n ProjectModel,\n ScanFileInput,\n SourceEffectModuleSummary,\n} from \"./types\";\n\nconst CACHE_SCHEMA_VERSION = 1;\nconst MAX_CACHED_REPORTS = 8;\n\ninterface CachedFileState {\n size?: number;\n mtimeMs?: number;\n ctimeMs?: number;\n hash: string;\n isReactFile?: boolean;\n}\n\ninterface SerializedSourceEffectSummary {\n effectfulMembers: string[];\n effectfulExport: boolean;\n mutatingMembers: string[];\n mutatingExportParameters: number[];\n mutatingMemberParameters: Array<[string, number[]]>;\n localMutatingParameters: Array<[string, number[]]>;\n instanceFactories: string[];\n}\n\ninterface SerializedProjectModel {\n memoizedModules: Array<[string, \"shallow\" | \"custom\"]>;\n bindingCandidateHooks: Array<[string, ProjectModel[\"bindingCandidateHooks\"] extends Map<string, infer V> ? V : never]>;\n externalCallbackModules: Array<[string, ProjectModel[\"externalCallbackModules\"] extends Map<string, infer V> ? V : never]>;\n bindingApiAlternatives: Array<[string, string]>;\n bindingCompatibleComponentProps: Array<[string, string[]]>;\n staticIterationTables: Array<[string, string[]]>;\n conditionalHookModes: Array<[string, ProjectModel[\"conditionalHookModes\"] extends Map<string, infer V> ? V : never]>;\n sourceEffects: Array<[string, SerializedSourceEffectSummary]>;\n}\n\nexport interface CachedReportData {\n scannedFiles: number;\n candidateFiles: number;\n diagnostics: Diagnostic[];\n}\n\ninterface CachedReportEntry extends CachedReportData {\n lastUsedAt: number;\n}\n\ninterface ProjectCachePayload {\n schemaVersion: number;\n analyzerVersion: string;\n root: string;\n fingerprint: string;\n files: Record<string, CachedFileState>;\n projectModel?: SerializedProjectModel;\n effectModules?: Record<string, CachedSourceEffectModule>;\n reports?: Record<string, CachedReportEntry>;\n lastUsedAt: number;\n}\n\nexport interface ProjectCacheSession {\n enabled: boolean;\n root: string;\n filename: string | null;\n fingerprint: string;\n files: Record<string, CachedFileState>;\n sources: Map<string, string>;\n previous: ProjectCachePayload | null;\n exact: boolean;\n effectModules?: Record<string, CachedSourceEffectModule>;\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction hashText(value: string): string {\n return crypto.createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction stableValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stableValue);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableValue(entry)]),\n );\n }\n return value;\n}\n\nexport function stableCacheKey(value: unknown): string {\n return hashText(JSON.stringify(stableValue(value))).slice(0, 24);\n}\n\nexport function cacheBaseDirectory(): string {\n if (process.env.REACT_LUAU_DOCTOR_CACHE_DIR) return path.resolve(process.env.REACT_LUAU_DOCTOR_CACHE_DIR);\n if (process.platform === \"win32\") {\n const base = process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\");\n return path.join(base, \"react-luau-doctor\", \"Cache\");\n }\n if (process.platform === \"darwin\") return path.join(os.homedir(), \"Library\", \"Caches\", \"react-luau-doctor\");\n return path.join(process.env.XDG_CACHE_HOME ?? path.join(os.homedir(), \".cache\"), \"react-luau-doctor\");\n}\n\nfunction projectCacheFilename(root: string): string {\n const canonical = process.platform === \"win32\" ? path.resolve(root).toLowerCase() : path.resolve(root);\n return path.join(cacheBaseDirectory(), `project-${hashText(canonical).slice(0, 24)}.json`);\n}\n\nfunction readPayload(filename: string, root: string): ProjectCachePayload | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(filename, \"utf8\")) as ProjectCachePayload;\n if (\n parsed.schemaVersion !== CACHE_SCHEMA_VERSION ||\n parsed.analyzerVersion !== packageJson.version ||\n path.resolve(parsed.root) !== path.resolve(root) ||\n !parsed.files ||\n typeof parsed.fingerprint !== \"string\"\n ) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writePayload(filename: string, payload: ProjectCachePayload): void {\n try {\n fs.mkdirSync(path.dirname(filename), { recursive: true });\n const temporary = `${filename}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, JSON.stringify(payload));\n fs.renameSync(temporary, filename);\n } catch {\n // Caching is an optimization. A read-only or unavailable cache directory must\n // never prevent the analyzer from running.\n }\n}\n\nfunction fileStateMatches(previous: CachedFileState | undefined, stat: fs.Stats): boolean {\n return Boolean(\n previous &&\n previous.size === stat.size &&\n previous.mtimeMs === stat.mtimeMs &&\n previous.ctimeMs === stat.ctimeMs &&\n previous.hash,\n );\n}\n\nexport function prepareProjectCache(\n root: string,\n candidates: ScanFileInput[],\n enabled = true,\n onProgress?: (current: number, total: number, file?: string) => void,\n): ProjectCacheSession {\n const cacheEnabled = enabled && process.env.REACT_LUAU_DOCTOR_DISABLE_CACHE !== \"1\";\n const filename = cacheEnabled ? projectCacheFilename(root) : null;\n const previous = filename ? readPayload(filename, root) : null;\n const files: Record<string, CachedFileState> = {};\n const sources = new Map<string, string>();\n const fingerprintParts: string[] = [];\n\n onProgress?.(0, candidates.length);\n for (let index = 0; index < candidates.length; index += 1) {\n const candidate = candidates[index];\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n const previousState = previous?.files[relativePath];\n let state: CachedFileState;\n\n if (candidate.source !== undefined) {\n const hash = hashText(candidate.source);\n sources.set(relativePath, candidate.source);\n state = { hash, isReactFile: previousState?.hash === hash ? previousState.isReactFile : undefined };\n } else {\n try {\n const stat = fs.statSync(candidate.absolutePath);\n if (fileStateMatches(previousState, stat)) {\n state = { ...previousState! };\n } else {\n const source = fs.readFileSync(candidate.absolutePath, \"utf8\");\n const hash = hashText(source);\n sources.set(relativePath, source);\n state = {\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n hash,\n isReactFile: previousState?.hash === hash ? previousState.isReactFile : undefined,\n };\n }\n } catch {\n onProgress?.(index + 1, candidates.length, relativePath);\n continue;\n }\n }\n\n files[relativePath] = state;\n fingerprintParts.push(`${relativePath}\\0${state.hash}`);\n onProgress?.(index + 1, candidates.length, relativePath);\n }\n\n const fingerprint = hashText(fingerprintParts.join(\"\\0\"));\n return {\n enabled: cacheEnabled,\n root,\n filename,\n fingerprint,\n files,\n sources,\n previous,\n exact: Boolean(previous && previous.fingerprint === fingerprint),\n };\n}\n\nexport function materializeProjectCandidates(session: ProjectCacheSession, candidates: ScanFileInput[]): ScanFileInput[] {\n return candidates.map((candidate) => {\n if (candidate.source !== undefined) return candidate;\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(session.root, candidate.absolutePath));\n const cachedSource = session.sources.get(relativePath);\n if (cachedSource !== undefined) return { ...candidate, relativePath, source: cachedSource };\n try {\n const source = fs.readFileSync(candidate.absolutePath, \"utf8\");\n session.sources.set(relativePath, source);\n return { ...candidate, relativePath, source };\n } catch {\n return { ...candidate, relativePath };\n }\n });\n}\n\nfunction serializeSourceEffect(summary: SourceEffectModuleSummary): SerializedSourceEffectSummary {\n return {\n effectfulMembers: [...summary.effectfulMembers].sort(),\n effectfulExport: summary.effectfulExport,\n mutatingMembers: [...summary.mutatingMembers].sort(),\n mutatingExportParameters: [...summary.mutatingExportParameters].sort((a, b) => a - b),\n mutatingMemberParameters: [...summary.mutatingMemberParameters]\n .map(([name, indexes]) => [name, [...indexes].sort((a, b) => a - b)] as [string, number[]])\n .sort(([left], [right]) => left.localeCompare(right)),\n localMutatingParameters: [...summary.localMutatingParameters]\n .map(([name, indexes]) => [name, [...indexes].sort((a, b) => a - b)] as [string, number[]])\n .sort(([left], [right]) => left.localeCompare(right)),\n instanceFactories: [...summary.instanceFactories].sort(),\n };\n}\n\nfunction deserializeSourceEffect(summary: SerializedSourceEffectSummary): SourceEffectModuleSummary {\n return {\n effectfulMembers: new Set(summary.effectfulMembers),\n effectfulExport: summary.effectfulExport,\n mutatingMembers: new Set(summary.mutatingMembers ?? []),\n mutatingExportParameters: new Set(summary.mutatingExportParameters ?? []),\n mutatingMemberParameters: new Map(\n (summary.mutatingMemberParameters ?? []).map(([name, indexes]) => [name, new Set(indexes)]),\n ),\n localMutatingParameters: new Map(\n (summary.localMutatingParameters ?? []).map(([name, indexes]) => [name, new Set(indexes)]),\n ),\n instanceFactories: new Set(summary.instanceFactories),\n };\n}\n\nexport function serializeProjectModel(project: ProjectModel): SerializedProjectModel {\n return {\n memoizedModules: [...project.memoizedModules],\n bindingCandidateHooks: [...project.bindingCandidateHooks],\n externalCallbackModules: [...project.externalCallbackModules],\n bindingApiAlternatives: [...project.bindingApiAlternatives],\n bindingCompatibleComponentProps: [...project.bindingCompatibleComponentProps].map(([key, value]) => [key, [...value].sort()]),\n staticIterationTables: [...project.staticIterationTables].map(([key, value]) => [key, [...value].sort()]),\n conditionalHookModes: [...project.conditionalHookModes],\n sourceEffects: [...project.sourceEffects].map(([key, value]) => [key, serializeSourceEffect(value)]),\n };\n}\n\nexport function deserializeProjectModel(project: SerializedProjectModel): ProjectModel {\n return {\n memoizedModules: new Map(project.memoizedModules),\n bindingCandidateHooks: new Map(project.bindingCandidateHooks),\n externalCallbackModules: new Map(project.externalCallbackModules),\n bindingApiAlternatives: new Map(project.bindingApiAlternatives),\n bindingCompatibleComponentProps: new Map(project.bindingCompatibleComponentProps.map(([key, value]) => [key, new Set(value)])),\n staticIterationTables: new Map(project.staticIterationTables.map(([key, value]) => [key, new Set(value)])),\n conditionalHookModes: new Map(project.conditionalHookModes),\n sourceEffects: new Map(project.sourceEffects.map(([key, value]) => [key, deserializeSourceEffect(value)])),\n };\n}\n\nexport function cachedEffectModules(session: ProjectCacheSession): Record<string, CachedSourceEffectModule> {\n return session.previous?.effectModules ?? {};\n}\n\nexport function previousProjectModel(session: ProjectCacheSession): ProjectModel | null {\n if (!session.previous?.projectModel) return null;\n try {\n return deserializeProjectModel(session.previous.projectModel);\n } catch {\n return null;\n }\n}\n\nexport function projectModelFeatureKey(project: ProjectModel): string {\n const serialized = serializeProjectModel(project);\n return stableCacheKey({\n memoizedModules: serialized.memoizedModules,\n bindingCandidateHooks: serialized.bindingCandidateHooks,\n externalCallbackModules: serialized.externalCallbackModules,\n bindingApiAlternatives: serialized.bindingApiAlternatives,\n bindingCompatibleComponentProps: serialized.bindingCompatibleComponentProps,\n staticIterationTables: serialized.staticIterationTables,\n conditionalHookModes: serialized.conditionalHookModes,\n });\n}\n\nexport function cachedProjectModel(session: ProjectCacheSession): ProjectModel | null {\n if (!session.exact || !session.previous?.projectModel) return null;\n try {\n return deserializeProjectModel(session.previous.projectModel);\n } catch {\n return null;\n }\n}\n\nexport function previousCachedReport(session: ProjectCacheSession, key: string): CachedReportData | null {\n const report = session.previous?.reports?.[key];\n if (!report) return null;\n return {\n scannedFiles: report.scannedFiles,\n candidateFiles: report.candidateFiles,\n diagnostics: report.diagnostics,\n };\n}\n\nexport function cachedReport(session: ProjectCacheSession, key: string): CachedReportData | null {\n if (!session.exact) return null;\n const report = session.previous?.reports?.[key];\n if (!report) return null;\n return {\n scannedFiles: report.scannedFiles,\n candidateFiles: report.candidateFiles,\n diagnostics: report.diagnostics,\n };\n}\n\nexport function cacheHasSameFileSet(session: ProjectCacheSession): boolean {\n if (!session.previous) return false;\n const previousFiles = Object.keys(session.previous.files).sort();\n const currentFiles = Object.keys(session.files).sort();\n return previousFiles.length === currentFiles.length && previousFiles.every((file, index) => file === currentFiles[index]);\n}\n\nexport function changedProjectFiles(session: ProjectCacheSession): string[] {\n if (!session.previous) return Object.keys(session.files);\n const all = new Set([...Object.keys(session.previous.files), ...Object.keys(session.files)]);\n return [...all].filter((file) => session.previous?.files[file]?.hash !== session.files[file]?.hash).sort();\n}\n\nexport function knownReactFile(session: ProjectCacheSession, relativePath: string): boolean | undefined {\n return session.files[normalizeRelative(relativePath)]?.isReactFile;\n}\n\nexport function recordReactFile(session: ProjectCacheSession, relativePath: string, isReactFile: boolean): void {\n const state = session.files[normalizeRelative(relativePath)];\n if (state) state.isReactFile = isReactFile;\n}\n\nexport function saveProjectCache(\n session: ProjectCacheSession,\n project: ProjectModel,\n effectModules: Record<string, CachedSourceEffectModule> = session.previous?.effectModules ?? {},\n reportKey?: string,\n report?: CachedReportData,\n): void {\n if (!session.enabled || !session.filename) return;\n const reports: Record<string, CachedReportEntry> = session.exact ? { ...(session.previous?.reports ?? {}) } : {};\n if (reportKey && report) reports[reportKey] = { ...report, lastUsedAt: Date.now() };\n const prunedReports = Object.fromEntries(\n Object.entries(reports)\n .sort(([, left], [, right]) => right.lastUsedAt - left.lastUsedAt)\n .slice(0, MAX_CACHED_REPORTS),\n );\n writePayload(session.filename, {\n schemaVersion: CACHE_SCHEMA_VERSION,\n analyzerVersion: packageJson.version,\n root: path.resolve(session.root),\n fingerprint: session.fingerprint,\n files: session.files,\n projectModel: serializeProjectModel(project),\n effectModules,\n reports: prunedReports,\n lastUsedAt: Date.now(),\n });\n}\n\nexport function projectCachePath(root: string): string {\n return projectCacheFilename(root);\n}\n",
|
|
14
|
-
"import crypto from \"node:crypto\";\nimport type {
|
|
15
|
-
"import type {
|
|
16
|
-
"import type {
|
|
17
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FunctionInfo, ReactModel, StateBinding } from \"../types\";\nimport { nodeKey, normalizeExpressionText, sameNode, walk } from \"./walk\";\n\nconst REACT_HOOKS = new Set([\n \"useState\",\n \"useEffect\",\n \"useLayoutEffect\",\n \"useMemo\",\n \"useCallback\",\n \"useContext\",\n \"useReducer\",\n \"useRef\",\n \"useImperativeHandle\",\n \"useBinding\",\n]);\n\nconst REACT_MEMBERS = new Set([...REACT_HOOKS, \"createElement\", \"createContext\", \"memo\", \"joinBindings\"]);\nconst STABLE_CUSTOM_HOOK_RETURN = /^(?:set[A-Z0-9_]|dispatch$|send$|emit$|fire$)/i;\nconst INSTANCE_FACTORY_MEMBERS = new Set([\n \"Clone\",\n \"FindFirstAncestor\",\n \"FindFirstAncestorOfClass\",\n \"FindFirstAncestorWhichIsA\",\n \"FindFirstChild\",\n \"FindFirstChildOfClass\",\n \"FindFirstChildWhichIsA\",\n \"GetButton\",\n \"GetMouse\",\n \"GetService\",\n \"WaitForChild\",\n]);\nconst STABLE_ENGINE_FACTORY_MEMBERS = new Set([\"GetMouse\", \"GetService\"]);\n\nfunction identifiersFromParameters(node: SyntaxNode | null): string[] {\n if (!node) return [];\n const result: string[] = [];\n for (const child of walk(node)) {\n if (child.type !== \"identifier\") continue;\n const parentType = child.parent?.type;\n if (parentType === \"parameters\" || parentType === \"parameter\" || parentType === \"typed_identifier\") {\n result.push(child.text);\n }\n }\n return [...new Set(result)];\n}\n\nfunction getFunctionName(node: SyntaxNode): string | null {\n if (node.type === \"function_declaration\") {\n return node.childForFieldName(\"name\")?.text ?? null;\n }\n\n if (node.type !== \"function_definition\") return null;\n let owner = node.parent;\n while (owner && owner.type !== \"variable_declaration\") {\n if (owner.type === \"function_definition\" || owner.type === \"function_declaration\") return null;\n owner = owner.parent;\n }\n if (!owner) return null;\n\n const prefix = owner.text.slice(0, Math.max(0, node.startIndex - owner.startIndex));\n const directMatch = prefix.match(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*$/s);\n if (directMatch) return directMatch[1];\n\n const wrappedMatch = prefix.match(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*[A-Za-z_][A-Za-z0-9_.]*\\s*\\(\\s*$/s);\n return wrappedMatch?.[1] ?? null;\n}\n\nfunction requireTargetContainsModule(target: string, moduleName: string): boolean {\n return (target.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? [])\n .some((token) => token.toLowerCase() === moduleName.toLowerCase());\n}\n\nfunction resolvePath(\n rawPath: string,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): string {\n const normalized = normalizeExpressionText(rawPath);\n const direct = aliases.get(normalized);\n if (direct) return direct;\n\n const namespaceMatch = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(.+)$/);\n if (namespaceMatch && reactNamespaces.has(namespaceMatch[1])) return `React.${namespaceMatch[2]}`;\n if (namespaceMatch && reactRobloxNamespaces.has(namespaceMatch[1])) return `ReactRoblox.${namespaceMatch[2]}`;\n return normalized;\n}\n\nfunction directCalls(node: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n const pending = [...node.namedChildren];\n while (pending.length > 0) {\n const child = pending.pop()!;\n if (child.type === \"function_definition\" || child.type === \"function_declaration\") continue;\n if (child.type === \"function_call\") result.push(child);\n pending.push(...child.namedChildren);\n }\n return result;\n}\n\nfunction hasDirectCreateElementCall(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n return directCalls(node).some((call) => {\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(name, aliases, reactNamespaces, reactRobloxNamespaces);\n return path === \"React.createElement\" || path === \"ReactRoblox.createPortal\";\n });\n}\n\nfunction hasDirectHookCall(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n return directCalls(node).some((call) => {\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(name, aliases, reactNamespaces, reactRobloxNamespaces);\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return /^use[A-Z0-9_]/.test(final);\n });\n}\n\nfunction isMemoWrappedFunction(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n): boolean {\n const argumentsNode = node.parent;\n const call = argumentsNode?.type === \"arguments\" ? argumentsNode.parent : null;\n if (!call || call.type !== \"function_call\") return false;\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n return resolvePath(name, aliases, reactNamespaces, new Set()) === \"React.memo\";\n}\n\nfunction isModuleReturnedFunction(node: SyntaxNode): boolean {\n const expressionList = node.parent;\n const returnStatement = expressionList?.type === \"expression_list\" ? expressionList.parent : null;\n if (!returnStatement || returnStatement.type !== \"return_statement\") return false;\n let current = returnStatement.parent;\n while (current) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return true;\n}\n\nfunction collectDirectLocals(body: SyntaxNode | null): Set<string> {\n const locals = new Set<string>();\n if (!body) return locals;\n\n for (const child of body.namedChildren) {\n if (child.type === \"variable_declaration\") {\n const beforeEquals = child.text.split(\"=\")[0] ?? \"\";\n const localPart = beforeEquals.replace(/^\\s*local\\s+/, \"\");\n for (const piece of localPart.split(\",\")) {\n const match = piece.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/);\n if (match) locals.add(match[1]);\n }\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) locals.add(name);\n }\n }\n\n return locals;\n}\n\nfunction nearestFunctionInfo(node: SyntaxNode, functionByNode: Map<number, FunctionInfo>): FunctionInfo | null {\n let current = node.parent;\n while (current) {\n const info = functionByNode.get(nodeKey(current));\n if (info) return info;\n current = current.parent;\n }\n return null;\n}\n\nfunction declarationCall(node: SyntaxNode): SyntaxNode | null {\n if (node.type !== \"variable_declaration\") return null;\n for (const child of walk(node)) {\n if (child.type === \"function_call\") return child;\n if (!sameNode(child, node) && (child.type === \"function_definition\" || child.type === \"function_declaration\")) return null;\n }\n return null;\n}\n\nfunction declarationNames(node: SyntaxNode): string[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variableList = assignment?.namedChildren.find((child) => child.type === \"variable_list\");\n return variableList?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [];\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction isSyntacticallyStableInitializer(node: SyntaxNode | undefined): boolean {\n if (!node) return false;\n return [\"nil\", \"true\", \"false\", \"number\", \"string\", \"string_content\"].includes(node.type)\n || /^(?:nil|true|false|-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)$/i.test(node.text.trim());\n}\n\n\nfunction finalCallMember(path: string): string {\n return path.split(/[.:]/).at(-1) ?? path;\n}\n\nfunction expressionCreatesInstance(\n node: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!node) return false;\n const text = node.text.trim();\n if (/^(?:workspace|game|script)(?:\\.|:|$)/.test(text)) return true;\n\n for (const candidate of walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const rawPath = candidate.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n if (path === \"Instance.new\" || INSTANCE_FACTORY_MEMBERS.has(finalCallMember(path))) return true;\n }\n return false;\n}\n\nfunction expressionIsStableEngineObject(\n node: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!node) return false;\n const calls = [...walk(node)].filter((candidate) => candidate.type === \"function_call\");\n if (calls.length !== 1) return false;\n const rawPath = calls[0].childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n return STABLE_ENGINE_FACTORY_MEMBERS.has(finalCallMember(path));\n}\n\nfunction memoReturnsInstance(\n callback: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!callback || callback.type !== \"function_definition\") return false;\n for (const candidate of walk(callback)) {\n if (candidate.type !== \"return_statement\") continue;\n if (expressionCreatesInstance(candidate, aliases, reactNamespaces, reactRobloxNamespaces)) return true;\n }\n return false;\n}\n\nfunction isEmptyDependencyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(node?.type === \"table_constructor\" && node.namedChildren.every((child) => child.type !== \"field\"));\n}\n\nexport function buildReactModel(root: SyntaxNode): ReactModel {\n const reactNamespaces = new Set<string>();\n const reactRobloxNamespaces = new Set<string>();\n const aliases = new Map<string, string>();\n const stateSetters = new Map<string, string>();\n const stateValues = new Map<string, string>();\n const stateBindings: StateBinding[] = [];\n const refVariables = new Set<string>();\n const bindingSetters = new Set<string>();\n const stableVariables = new Set<string>();\n const refVariablesByFunction = new Map<number, Set<string>>();\n const stableVariablesByFunction = new Map<number, Set<string>>();\n const externalMutableVariablesByFunction = new Map<number, Set<string>>();\n const instanceVariablesByFunction = new Map<number, Set<string>>();\n\n const allNodes = [...walk(root)];\n const declarations = allNodes.filter((node) => node.type === \"variable_declaration\");\n let isReactFile = false;\n\n for (const declaration of declarations) {\n const text = declaration.text;\n const requireMatch = text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!requireMatch) continue;\n const [, localName, target] = requireMatch;\n if (requireTargetContainsModule(target, \"ReactRoblox\")) {\n reactRobloxNamespaces.add(localName);\n isReactFile = true;\n } else if (requireTargetContainsModule(target, \"React\")) {\n reactNamespaces.add(localName);\n isReactFile = true;\n }\n }\n\n for (const node of allNodes) {\n if (node.type !== \"function_call\") continue;\n const rawPath = normalizeExpressionText(node.childForFieldName(\"name\")?.text ?? \"\");\n const memberMatch = rawPath.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!memberMatch) continue;\n const [, namespace, member] = memberMatch;\n if (namespace === \"React\" && REACT_MEMBERS.has(member)) {\n reactNamespaces.add(namespace);\n isReactFile = true;\n } else if (namespace === \"ReactRoblox\" && [\"createRoot\", \"createPortal\"].includes(member)) {\n reactRobloxNamespaces.add(namespace);\n isReactFile = true;\n }\n }\n\n for (const declaration of declarations) {\n const text = declaration.text;\n const aliasMatch = text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)\\s*$/s);\n if (!aliasMatch) continue;\n const [, localName, namespace, member] = aliasMatch;\n if (reactNamespaces.has(namespace) && REACT_MEMBERS.has(member)) aliases.set(localName, `React.${member}`);\n if (reactRobloxNamespaces.has(namespace) && [\"createRoot\", \"createPortal\"].includes(member)) {\n aliases.set(localName, `ReactRoblox.${member}`);\n }\n }\n\n const functions: FunctionInfo[] = [];\n const functionByNode = new Map<number, FunctionInfo>();\n\n for (const node of allNodes) {\n if (node.type !== \"function_declaration\" && node.type !== \"function_definition\") continue;\n const name = getFunctionName(node);\n const body = node.childForFieldName(\"body\");\n const parameters = identifiersFromParameters(node.childForFieldName(\"parameters\"));\n const info: FunctionInfo = {\n node,\n body,\n name,\n parameters,\n isHook: Boolean(isReactFile && name && /^use[A-Z0-9_]/.test(name)),\n isComponent: false,\n };\n functions.push(info);\n functionByNode.set(nodeKey(node), info);\n }\n\n const functionsBySimpleName = new Map<string, FunctionInfo[]>();\n for (const info of functions) {\n if (!info.name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(info.name)) continue;\n const existing = functionsBySimpleName.get(info.name) ?? [];\n existing.push(info);\n functionsBySimpleName.set(info.name, existing);\n }\n\n for (const info of functions) {\n if (!isReactFile || !info.body || info.isHook) continue;\n const simplePascalName = Boolean(info.name && /^[A-Z][A-Za-z0-9_]*$/.test(info.name));\n const hasHooks = hasDirectHookCall(info.body, aliases, reactNamespaces, reactRobloxNamespaces);\n const renders = hasDirectCreateElementCall(info.body, aliases, reactNamespaces, reactRobloxNamespaces);\n if (hasHooks || isMemoWrappedFunction(info.node, aliases, reactNamespaces) || (simplePascalName && renders)) {\n info.isComponent = true;\n } else if (!info.name && isModuleReturnedFunction(info.node) && hasHooks) {\n info.isComponent = true;\n }\n }\n\n for (const call of allNodes) {\n if (call.type !== \"function_call\") continue;\n const rawPath = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n if (path !== \"React.createElement\") continue;\n const element = call.childForFieldName(\"arguments\")?.namedChildren[0]?.text.trim() ?? \"\";\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(element)) continue;\n for (const info of functionsBySimpleName.get(element) ?? []) info.isComponent = true;\n }\n\n const addScopedVariable = (map: Map<number, Set<string>>, owner: FunctionInfo | null, name: string): void => {\n if (!owner) return;\n const key = nodeKey(owner.node);\n const names = map.get(key) ?? new Set<string>();\n names.add(name);\n map.set(key, names);\n };\n\n for (const declaration of declarations) {\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n const owner = nearestFunctionInfo(declaration, functionByNode);\n\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (isSyntacticallyStableInitializer(expression) || expressionIsStableEngineObject(expression, aliases, reactNamespaces, reactRobloxNamespaces)) {\n stableVariables.add(names[index]);\n addScopedVariable(stableVariablesByFunction, owner, names[index]);\n }\n if (expressionCreatesInstance(expression, aliases, reactNamespaces, reactRobloxNamespaces)) {\n addScopedVariable(externalMutableVariablesByFunction, owner, names[index]);\n addScopedVariable(instanceVariablesByFunction, owner, names[index]);\n }\n }\n\n const call = declarationCall(declaration);\n if (!call) continue;\n const rawPath = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n const args = call.childForFieldName(\"arguments\")?.namedChildren ?? [];\n\n if (path === \"React.joinBindings\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n } else if (path === \"React.useState\" && names.length >= 2) {\n const [valueName, setterName] = names;\n stateSetters.set(setterName, valueName);\n stateValues.set(valueName, setterName);\n stableVariables.add(setterName);\n addScopedVariable(stableVariablesByFunction, owner, setterName);\n stateBindings.push({\n valueName,\n setterName,\n declaration,\n call,\n initializer: args[0] ?? null,\n owner,\n });\n } else if (path === \"React.useReducer\" && names.length >= 2) {\n stableVariables.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n } else if (path === \"React.useBinding\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n if (names.length >= 2) {\n stableVariables.add(names[1]);\n bindingSetters.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n }\n } else if (path === \"React.useMemo\" && names.length >= 1) {\n if (isEmptyDependencyTable(args[1])) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n }\n if (memoReturnsInstance(args[0], aliases, reactNamespaces, reactRobloxNamespaces)) {\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n addScopedVariable(instanceVariablesByFunction, owner, names[0]);\n }\n } else if (path === \"React.useCallback\" && names.length >= 1 && isEmptyDependencyTable(args[1])) {\n // Empty-dependency callbacks keep a stable identity. Their own stale captures are\n // diagnosed on the useCallback dependency table instead of cascading into every\n // effect that consumes the callback.\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n } else if (path === \"React.useRef\" && names.length >= 1) {\n stableVariables.add(names[0]);\n refVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(refVariablesByFunction, owner, names[0]);\n } else {\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n if (/^use[A-Z0-9_]/.test(final)) {\n for (const name of names.slice(1)) {\n if (!STABLE_CUSTOM_HOOK_RETURN.test(name)) continue;\n stableVariables.add(name);\n addScopedVariable(stableVariablesByFunction, owner, name);\n }\n }\n }\n }\n\n // React state/binding hooks can be assigned into previously declared locals.\n // The setter/Binding contracts are still stable even when the declaration and hook\n // call are split across statements. Rules-of-hooks separately reports conditional calls.\n for (const assignment of allNodes) {\n if (assignment.type !== \"assignment_statement\" || assignment.parent?.type === \"variable_declaration\") continue;\n const owner = nearestFunctionInfo(assignment, functionByNode);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const variableList = assignment.namedChildren.find((child) => child.type === \"variable_list\");\n const expressionList = assignment.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variableList?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [];\n const expression = expressionList?.namedChildren[0];\n if (!expression || expression.type !== \"function_call\") continue;\n const rawPath = expression.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n\n if (path === \"React.useState\" && names.length >= 2) {\n stableVariables.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n } else if (path === \"React.useBinding\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n if (names.length >= 2) {\n stableVariables.add(names[1]);\n bindingSetters.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n }\n }\n }\n\n // Binding-like values are stable mutable handles. Custom React-Luau animation hooks\n // often return bindings without the analyzer knowing the hook implementation. Infer\n // them from Binding-only APIs instead of requiring them in dependency arrays.\n for (const call of allNodes) {\n if (call.type !== \"function_call\") continue;\n const rawPath = normalizeExpressionText(call.childForFieldName(\"name\")?.text ?? \"\");\n const match = rawPath.match(/^([A-Za-z_][A-Za-z0-9_]*):(?:getValue|map)$/);\n if (!match) continue;\n const owner = nearestFunctionInfo(call, functionByNode);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n stableVariables.add(match[1]);\n addScopedVariable(stableVariablesByFunction, owner, match[1]);\n addScopedVariable(externalMutableVariablesByFunction, owner, match[1]);\n }\n\n const componentLocals = new Map<number, Set<string>>();\n for (const info of functions) {\n if (!info.isComponent && !info.isHook) continue;\n const names = collectDirectLocals(info.body);\n for (const parameter of info.parameters) names.add(parameter);\n if (info.name?.includes(\":\")) names.add(\"self\");\n componentLocals.set(nodeKey(info.node), names);\n }\n\n return {\n allNodes,\n isReactFile,\n reactNamespaces,\n reactRobloxNamespaces,\n aliases,\n stateSetters,\n stateValues,\n stateBindings,\n refVariables,\n bindingSetters,\n stableVariables,\n refVariablesByFunction,\n stableVariablesByFunction,\n externalMutableVariablesByFunction,\n instanceVariablesByFunction,\n componentLocals,\n functions,\n functionByNode,\n };\n}\n",
|
|
14
|
+
"import crypto from \"node:crypto\";\nimport type { SyntaxTree } from \"./syntax\";\nimport { createRuleContext } from \"./ast/context\";\nimport { buildReactModel } from \"./ast/react-model\";\nimport { effectiveSeverity } from \"./config\";\nimport { createInlineSuppressionChecker } from \"./inline-disables\";\nimport { parseLuau } from \"./parser\";\nimport { rules } from \"./rules\";\nimport type {\n Category,\n Diagnostic,\n DiagnosticInput,\n DoctorConfig,\n ProjectModel,\n Severity,\n SourceFile,\n} from \"./types\";\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n suggestion: 0,\n warning: 1,\n error: 2,\n};\n\nexport interface ReactFileAnalysisInput {\n absolutePath: string;\n relativePath: string;\n source: string;\n forceScan: boolean;\n project: ProjectModel;\n config: DoctorConfig;\n categories?: Category[];\n minSeverity: Severity;\n respectInlineDisables: boolean;\n}\n\nexport interface ReactFileAnalysisResult {\n relativePath: string;\n isReactFile: boolean;\n scanned: boolean;\n diagnostics: Diagnostic[];\n}\n\nfunction diagnosticId(file: string, rule: string, startIndex: number, message: string): string {\n return crypto.createHash(\"sha256\").update(`${file}\\0${rule}\\0${startIndex}\\0${message}`).digest(\"hex\").slice(0, 16);\n}\n\nfunction nodeLocation(node: DiagnosticInput[\"node\"]): Diagnostic[\"location\"] {\n return {\n line: node.startPosition.row + 1,\n column: node.startPosition.column + 1,\n endLine: node.endPosition.row + 1,\n endColumn: node.endPosition.column + 1,\n };\n}\n\nfunction toDiagnostic(\n file: SourceFile,\n ruleId: string,\n category: Diagnostic[\"category\"],\n severity: Severity,\n input: DiagnosticInput,\n): Diagnostic {\n const node = input.node;\n const highlights = input.highlights?.map(nodeLocation);\n return {\n id: diagnosticId(file.relativePath, ruleId, node.startIndex, input.message),\n rule: ruleId,\n category,\n severity: input.severity ?? severity,\n message: input.message,\n help: input.help,\n file: file.relativePath,\n location: nodeLocation(node),\n highlights: highlights && highlights.length > 0 ? highlights : undefined,\n fixPreview: input.fixPreview,\n };\n}\n\nexport async function analyzeReactFile(input: ReactFileAnalysisInput, tree?: SyntaxTree): Promise<ReactFileAnalysisResult> {\n const parsedTree = tree ?? await parseLuau(input.source);\n const model = buildReactModel(parsedTree.rootNode);\n if (!input.forceScan && !model.isReactFile) {\n return { relativePath: input.relativePath, isReactFile: false, scanned: false, diagnostics: [] };\n }\n\n const file: SourceFile = {\n absolutePath: input.absolutePath,\n relativePath: input.relativePath,\n source: input.source,\n tree: parsedTree,\n root: parsedTree.rootNode,\n model,\n project: input.project,\n };\n const context = createRuleContext(file);\n const categorySet = input.categories && input.categories.length > 0 ? new Set(input.categories) : null;\n const isSuppressed = input.respectInlineDisables ? createInlineSuppressionChecker(input.source) : () => false;\n const diagnostics: Diagnostic[] = [];\n\n for (const rule of rules) {\n if (categorySet && !categorySet.has(rule.category)) continue;\n const severity = effectiveSeverity(rule.severity, rule.id, input.config);\n if (!severity) continue;\n const findings = rule.run(context);\n for (const finding of findings) {\n const configuredSeverity = input.config.rules?.[rule.id];\n const diagnostic = toDiagnostic(file, rule.id, rule.category, severity, {\n ...finding,\n severity: configuredSeverity && configuredSeverity !== \"off\" ? severity : finding.severity,\n });\n if (SEVERITY_RANK[diagnostic.severity] < SEVERITY_RANK[input.minSeverity]) continue;\n if (isSuppressed(diagnostic.rule, diagnostic.location.line)) continue;\n diagnostics.push(diagnostic);\n }\n if (rule.id === \"react-luau/parse-error\" && findings.length > 0) break;\n }\n\n return {\n relativePath: input.relativePath,\n isReactFile: model.isReactFile,\n scanned: true,\n diagnostics,\n };\n}\n",
|
|
15
|
+
"import type { SyntaxNode } from \"../syntax\";\n\nexport function walk(node: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n const stack = [node];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n result.push(current);\n\n const children = current.namedChildren;\n for (let index = children.length - 1; index >= 0; index -= 1) {\n stack.push(children[index]);\n }\n }\n\n return result;\n}\n\nexport function ancestors(node: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n let current = node.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result;\n}\n\nexport function nearestAncestor(node: SyntaxNode, predicate: (candidate: SyntaxNode) => boolean): SyntaxNode | null {\n let current = node.parent;\n while (current) {\n if (predicate(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nexport function descendantsOfType(node: SyntaxNode, type: string): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n for (const candidate of walk(node)) {\n if (candidate.type === type) result.push(candidate);\n }\n return result;\n}\n\nexport function rootIdentifier(text: string): string | null {\n const match = text.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/);\n return match?.[1] ?? null;\n}\n\nexport function normalizeExpressionText(text: string): string {\n return text.replace(/\\s+/g, \"\").replace(/^\\((.*)\\)$/s, \"$1\");\n}\n\nexport function nodeKey(node: SyntaxNode): number {\n return node.id;\n}\n\nexport function sameNode(left: SyntaxNode | null | undefined, right: SyntaxNode | null | undefined): boolean {\n return Boolean(left && right && nodeKey(left) === nodeKey(right));\n}\n",
|
|
16
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { FunctionInfo, RuleContext, SourceFile } from \"../types\";\nimport { nodeKey, normalizeExpressionText, walk } from \"./walk\";\n\nexport function createRuleContext(file: SourceFile): RuleContext {\n // buildReactModel already materialized the root traversal. Reuse those node\n // wrappers here and only materialize subtrees lazily when a rule needs one.\n const allNodes = file.model.allNodes;\n const calls = allNodes.filter((node) => node.type === \"function_call\");\n const traversalCache = new Map<number, SyntaxNode[]>([[file.root.id, allNodes]]);\n const callPathCache = new Map<number, string | null>();\n const resolvedCallPathCache = new Map<string, string>();\n const nearestFunctionCache = new Map<number, FunctionInfo | null>();\n const componentCache = new Map<number, FunctionInfo | null>();\n\n const traversal = (node: SyntaxNode): SyntaxNode[] => {\n const key = node.id;\n const existing = traversalCache.get(key);\n if (existing) return existing;\n const result = walk(node);\n traversalCache.set(key, result);\n return result;\n };\n\n const getCallPath = (node: SyntaxNode): string | null => {\n if (node.type !== \"function_call\") return null;\n const key = node.id;\n if (callPathCache.has(key)) return callPathCache.get(key) ?? null;\n const name = node.childForFieldName(\"name\");\n const result = name ? normalizeExpressionText(name.text) : null;\n callPathCache.set(key, result);\n return result;\n };\n\n const resolveCallPath = (value: string): string => {\n const normalized = normalizeExpressionText(value);\n const cached = resolvedCallPathCache.get(normalized);\n if (cached) return cached;\n\n const direct = file.model.aliases.get(normalized);\n if (direct) {\n resolvedCallPathCache.set(normalized, direct);\n return direct;\n }\n\n const namespaceMatch = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(.+)$/);\n let result = normalized;\n if (namespaceMatch && file.model.reactNamespaces.has(namespaceMatch[1])) {\n result = `React.${namespaceMatch[2]}`;\n } else if (namespaceMatch && file.model.reactRobloxNamespaces.has(namespaceMatch[1])) {\n result = `ReactRoblox.${namespaceMatch[2]}`;\n }\n resolvedCallPathCache.set(normalized, result);\n return result;\n };\n\n const callArguments = (node: SyntaxNode): SyntaxNode[] => {\n return node.childForFieldName(\"arguments\")?.namedChildren ?? [];\n };\n\n const nearestFunction = (node: SyntaxNode): FunctionInfo | null => {\n const key = node.id;\n if (nearestFunctionCache.has(key)) return nearestFunctionCache.get(key) ?? null;\n\n const visited: number[] = [key];\n let current = node.parent;\n let result: FunctionInfo | null = null;\n while (current) {\n const info = file.model.functionByNode.get(nodeKey(current));\n if (info) {\n result = info;\n break;\n }\n if (nearestFunctionCache.has(current.id)) {\n result = nearestFunctionCache.get(current.id) ?? null;\n break;\n }\n visited.push(current.id);\n current = current.parent;\n }\n\n for (const visitedKey of visited) nearestFunctionCache.set(visitedKey, result);\n return result;\n };\n\n const containingComponent = (node: SyntaxNode): FunctionInfo | null => {\n const key = node.id;\n if (componentCache.has(key)) return componentCache.get(key) ?? null;\n\n const visited: number[] = [key];\n let current = node.parent;\n let result: FunctionInfo | null = null;\n while (current) {\n const info = file.model.functionByNode.get(nodeKey(current));\n if (info?.isComponent) {\n result = info;\n break;\n }\n if (componentCache.has(current.id)) {\n result = componentCache.get(current.id) ?? null;\n break;\n }\n visited.push(current.id);\n current = current.parent;\n }\n\n for (const visitedKey of visited) componentCache.set(visitedKey, result);\n return result;\n };\n\n const isDirectlyExecutedInFunction = (node: SyntaxNode, fn: FunctionInfo): boolean => nearestFunction(node) === fn;\n\n return {\n ...file,\n findCalls: () => calls,\n getCallPath,\n resolveCallPath,\n callArguments,\n nearestFunction,\n containingComponent,\n isDirectlyExecutedInFunction,\n walk: (node = file.root) => traversal(node),\n };\n}\n",
|
|
17
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { FunctionInfo, ReactModel, StateBinding } from \"../types\";\nimport { nodeKey, normalizeExpressionText, sameNode, walk } from \"./walk\";\n\nconst REACT_HOOKS = new Set([\n \"useState\",\n \"useEffect\",\n \"useLayoutEffect\",\n \"useMemo\",\n \"useCallback\",\n \"useContext\",\n \"useReducer\",\n \"useRef\",\n \"useImperativeHandle\",\n \"useBinding\",\n]);\n\nconst REACT_MEMBERS = new Set([...REACT_HOOKS, \"createElement\", \"createContext\", \"memo\", \"joinBindings\"]);\nconst STABLE_CUSTOM_HOOK_RETURN = /^(?:set[A-Z0-9_]|dispatch$|send$|emit$|fire$)/i;\nconst INSTANCE_FACTORY_MEMBERS = new Set([\n \"Clone\",\n \"FindFirstAncestor\",\n \"FindFirstAncestorOfClass\",\n \"FindFirstAncestorWhichIsA\",\n \"FindFirstChild\",\n \"FindFirstChildOfClass\",\n \"FindFirstChildWhichIsA\",\n \"GetButton\",\n \"GetMouse\",\n \"GetService\",\n \"WaitForChild\",\n]);\nconst STABLE_ENGINE_FACTORY_MEMBERS = new Set([\"GetMouse\", \"GetService\"]);\n\nfunction identifiersFromParameters(node: SyntaxNode | null): string[] {\n if (!node) return [];\n const result: string[] = [];\n for (const child of walk(node)) {\n if (child.type !== \"identifier\") continue;\n const parentType = child.parent?.type;\n if (parentType === \"parameters\" || parentType === \"parameter\" || parentType === \"typed_identifier\") {\n result.push(child.text);\n }\n }\n return [...new Set(result)];\n}\n\nfunction getFunctionName(node: SyntaxNode): string | null {\n if (node.type === \"function_declaration\") {\n return node.childForFieldName(\"name\")?.text ?? null;\n }\n\n if (node.type !== \"function_definition\") return null;\n let owner = node.parent;\n while (owner && owner.type !== \"variable_declaration\") {\n if (owner.type === \"function_definition\" || owner.type === \"function_declaration\") return null;\n owner = owner.parent;\n }\n if (!owner) return null;\n\n const prefix = owner.text.slice(0, Math.max(0, node.startIndex - owner.startIndex));\n const directMatch = prefix.match(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*$/s);\n if (directMatch) return directMatch[1];\n\n const wrappedMatch = prefix.match(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*[A-Za-z_][A-Za-z0-9_.]*\\s*\\(\\s*$/s);\n return wrappedMatch?.[1] ?? null;\n}\n\nfunction requireTargetContainsModule(target: string, moduleName: string): boolean {\n return (target.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? [])\n .some((token) => token.toLowerCase() === moduleName.toLowerCase());\n}\n\nfunction resolvePath(\n rawPath: string,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): string {\n const normalized = normalizeExpressionText(rawPath);\n const direct = aliases.get(normalized);\n if (direct) return direct;\n\n const namespaceMatch = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(.+)$/);\n if (namespaceMatch && reactNamespaces.has(namespaceMatch[1])) return `React.${namespaceMatch[2]}`;\n if (namespaceMatch && reactRobloxNamespaces.has(namespaceMatch[1])) return `ReactRoblox.${namespaceMatch[2]}`;\n return normalized;\n}\n\nfunction directCalls(node: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n const pending = [...node.namedChildren];\n while (pending.length > 0) {\n const child = pending.pop()!;\n if (child.type === \"function_definition\" || child.type === \"function_declaration\") continue;\n if (child.type === \"function_call\") result.push(child);\n pending.push(...child.namedChildren);\n }\n return result;\n}\n\nfunction hasDirectCreateElementCall(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n return directCalls(node).some((call) => {\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(name, aliases, reactNamespaces, reactRobloxNamespaces);\n return path === \"React.createElement\" || path === \"ReactRoblox.createPortal\";\n });\n}\n\nfunction hasDirectHookCall(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n return directCalls(node).some((call) => {\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(name, aliases, reactNamespaces, reactRobloxNamespaces);\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return /^use[A-Z0-9_]/.test(final);\n });\n}\n\nfunction isMemoWrappedFunction(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n): boolean {\n const argumentsNode = node.parent;\n const call = argumentsNode?.type === \"arguments\" ? argumentsNode.parent : null;\n if (!call || call.type !== \"function_call\") return false;\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n return resolvePath(name, aliases, reactNamespaces, new Set()) === \"React.memo\";\n}\n\nfunction isModuleReturnedFunction(node: SyntaxNode): boolean {\n const expressionList = node.parent;\n const returnStatement = expressionList?.type === \"expression_list\" ? expressionList.parent : null;\n if (!returnStatement || returnStatement.type !== \"return_statement\") return false;\n let current = returnStatement.parent;\n while (current) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return true;\n}\n\nfunction collectDirectLocals(body: SyntaxNode | null): Set<string> {\n const locals = new Set<string>();\n if (!body) return locals;\n\n for (const child of body.namedChildren) {\n if (child.type === \"variable_declaration\") {\n const beforeEquals = child.text.split(\"=\")[0] ?? \"\";\n const localPart = beforeEquals.replace(/^\\s*local\\s+/, \"\");\n for (const piece of localPart.split(\",\")) {\n const match = piece.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/);\n if (match) locals.add(match[1]);\n }\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) locals.add(name);\n }\n }\n\n return locals;\n}\n\nfunction nearestFunctionInfo(node: SyntaxNode, functionByNode: Map<number, FunctionInfo>): FunctionInfo | null {\n let current = node.parent;\n while (current) {\n const info = functionByNode.get(nodeKey(current));\n if (info) return info;\n current = current.parent;\n }\n return null;\n}\n\nfunction declarationCall(node: SyntaxNode): SyntaxNode | null {\n if (node.type !== \"variable_declaration\") return null;\n for (const child of walk(node)) {\n if (child.type === \"function_call\") return child;\n if (!sameNode(child, node) && (child.type === \"function_definition\" || child.type === \"function_declaration\")) return null;\n }\n return null;\n}\n\nfunction declarationNames(node: SyntaxNode): string[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variableList = assignment?.namedChildren.find((child) => child.type === \"variable_list\");\n return variableList?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [];\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction isSyntacticallyStableInitializer(node: SyntaxNode | undefined): boolean {\n if (!node) return false;\n return [\"nil\", \"true\", \"false\", \"number\", \"string\", \"string_content\"].includes(node.type)\n || /^(?:nil|true|false|-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)$/i.test(node.text.trim());\n}\n\n\nfunction finalCallMember(path: string): string {\n return path.split(/[.:]/).at(-1) ?? path;\n}\n\nfunction expressionCreatesInstance(\n node: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!node) return false;\n const text = node.text.trim();\n if (/^(?:workspace|game|script)(?:\\.|:|$)/.test(text)) return true;\n\n for (const candidate of walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const rawPath = candidate.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n if (path === \"Instance.new\" || INSTANCE_FACTORY_MEMBERS.has(finalCallMember(path))) return true;\n }\n return false;\n}\n\nfunction expressionIsStableEngineObject(\n node: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!node) return false;\n const calls = [...walk(node)].filter((candidate) => candidate.type === \"function_call\");\n if (calls.length !== 1) return false;\n const rawPath = calls[0].childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n return STABLE_ENGINE_FACTORY_MEMBERS.has(finalCallMember(path));\n}\n\nfunction memoReturnsInstance(\n callback: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!callback || callback.type !== \"function_definition\") return false;\n for (const candidate of walk(callback)) {\n if (candidate.type !== \"return_statement\") continue;\n if (expressionCreatesInstance(candidate, aliases, reactNamespaces, reactRobloxNamespaces)) return true;\n }\n return false;\n}\n\nfunction isEmptyDependencyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(node?.type === \"table_constructor\" && node.namedChildren.every((child) => child.type !== \"field\"));\n}\n\nexport function buildReactModel(root: SyntaxNode): ReactModel {\n const reactNamespaces = new Set<string>();\n const reactRobloxNamespaces = new Set<string>();\n const aliases = new Map<string, string>();\n const stateSetters = new Map<string, string>();\n const stateValues = new Map<string, string>();\n const stateBindings: StateBinding[] = [];\n const refVariables = new Set<string>();\n const bindingSetters = new Set<string>();\n const stableVariables = new Set<string>();\n const refVariablesByFunction = new Map<number, Set<string>>();\n const stableVariablesByFunction = new Map<number, Set<string>>();\n const externalMutableVariablesByFunction = new Map<number, Set<string>>();\n const instanceVariablesByFunction = new Map<number, Set<string>>();\n\n const allNodes = [...walk(root)];\n const declarations = allNodes.filter((node) => node.type === \"variable_declaration\");\n let isReactFile = false;\n\n for (const declaration of declarations) {\n const text = declaration.text;\n const requireMatch = text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!requireMatch) continue;\n const [, localName, target] = requireMatch;\n if (requireTargetContainsModule(target, \"ReactRoblox\")) {\n reactRobloxNamespaces.add(localName);\n isReactFile = true;\n } else if (requireTargetContainsModule(target, \"React\")) {\n reactNamespaces.add(localName);\n isReactFile = true;\n }\n }\n\n for (const node of allNodes) {\n if (node.type !== \"function_call\") continue;\n const rawPath = normalizeExpressionText(node.childForFieldName(\"name\")?.text ?? \"\");\n const memberMatch = rawPath.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!memberMatch) continue;\n const [, namespace, member] = memberMatch;\n if (namespace === \"React\" && REACT_MEMBERS.has(member)) {\n reactNamespaces.add(namespace);\n isReactFile = true;\n } else if (namespace === \"ReactRoblox\" && [\"createRoot\", \"createPortal\"].includes(member)) {\n reactRobloxNamespaces.add(namespace);\n isReactFile = true;\n }\n }\n\n for (const declaration of declarations) {\n const text = declaration.text;\n const aliasMatch = text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)\\s*$/s);\n if (!aliasMatch) continue;\n const [, localName, namespace, member] = aliasMatch;\n if (reactNamespaces.has(namespace) && REACT_MEMBERS.has(member)) aliases.set(localName, `React.${member}`);\n if (reactRobloxNamespaces.has(namespace) && [\"createRoot\", \"createPortal\"].includes(member)) {\n aliases.set(localName, `ReactRoblox.${member}`);\n }\n }\n\n const functions: FunctionInfo[] = [];\n const functionByNode = new Map<number, FunctionInfo>();\n\n for (const node of allNodes) {\n if (node.type !== \"function_declaration\" && node.type !== \"function_definition\") continue;\n const name = getFunctionName(node);\n const body = node.childForFieldName(\"body\");\n const parameters = identifiersFromParameters(node.childForFieldName(\"parameters\"));\n const info: FunctionInfo = {\n node,\n body,\n name,\n parameters,\n isHook: Boolean(isReactFile && name && /^use[A-Z0-9_]/.test(name)),\n isComponent: false,\n };\n functions.push(info);\n functionByNode.set(nodeKey(node), info);\n }\n\n const functionsBySimpleName = new Map<string, FunctionInfo[]>();\n for (const info of functions) {\n if (!info.name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(info.name)) continue;\n const existing = functionsBySimpleName.get(info.name) ?? [];\n existing.push(info);\n functionsBySimpleName.set(info.name, existing);\n }\n\n for (const info of functions) {\n if (!isReactFile || !info.body || info.isHook) continue;\n const simplePascalName = Boolean(info.name && /^[A-Z][A-Za-z0-9_]*$/.test(info.name));\n const hasHooks = hasDirectHookCall(info.body, aliases, reactNamespaces, reactRobloxNamespaces);\n const renders = hasDirectCreateElementCall(info.body, aliases, reactNamespaces, reactRobloxNamespaces);\n if (hasHooks || isMemoWrappedFunction(info.node, aliases, reactNamespaces) || (simplePascalName && renders)) {\n info.isComponent = true;\n } else if (!info.name && isModuleReturnedFunction(info.node) && hasHooks) {\n info.isComponent = true;\n }\n }\n\n for (const call of allNodes) {\n if (call.type !== \"function_call\") continue;\n const rawPath = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n if (path !== \"React.createElement\") continue;\n const element = call.childForFieldName(\"arguments\")?.namedChildren[0]?.text.trim() ?? \"\";\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(element)) continue;\n for (const info of functionsBySimpleName.get(element) ?? []) info.isComponent = true;\n }\n\n const addScopedVariable = (map: Map<number, Set<string>>, owner: FunctionInfo | null, name: string): void => {\n if (!owner) return;\n const key = nodeKey(owner.node);\n const names = map.get(key) ?? new Set<string>();\n names.add(name);\n map.set(key, names);\n };\n\n for (const declaration of declarations) {\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n const owner = nearestFunctionInfo(declaration, functionByNode);\n\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (isSyntacticallyStableInitializer(expression) || expressionIsStableEngineObject(expression, aliases, reactNamespaces, reactRobloxNamespaces)) {\n stableVariables.add(names[index]);\n addScopedVariable(stableVariablesByFunction, owner, names[index]);\n }\n if (expressionCreatesInstance(expression, aliases, reactNamespaces, reactRobloxNamespaces)) {\n addScopedVariable(externalMutableVariablesByFunction, owner, names[index]);\n addScopedVariable(instanceVariablesByFunction, owner, names[index]);\n }\n }\n\n const call = declarationCall(declaration);\n if (!call) continue;\n const rawPath = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n const args = call.childForFieldName(\"arguments\")?.namedChildren ?? [];\n\n if (path === \"React.joinBindings\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n } else if (path === \"React.useState\" && names.length >= 2) {\n const [valueName, setterName] = names;\n stateSetters.set(setterName, valueName);\n stateValues.set(valueName, setterName);\n stableVariables.add(setterName);\n addScopedVariable(stableVariablesByFunction, owner, setterName);\n stateBindings.push({\n valueName,\n setterName,\n declaration,\n call,\n initializer: args[0] ?? null,\n owner,\n });\n } else if (path === \"React.useReducer\" && names.length >= 2) {\n stableVariables.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n } else if (path === \"React.useBinding\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n if (names.length >= 2) {\n stableVariables.add(names[1]);\n bindingSetters.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n }\n } else if (path === \"React.useMemo\" && names.length >= 1) {\n if (isEmptyDependencyTable(args[1])) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n }\n if (memoReturnsInstance(args[0], aliases, reactNamespaces, reactRobloxNamespaces)) {\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n addScopedVariable(instanceVariablesByFunction, owner, names[0]);\n }\n } else if (path === \"React.useCallback\" && names.length >= 1 && isEmptyDependencyTable(args[1])) {\n // Empty-dependency callbacks keep a stable identity. Their own stale captures are\n // diagnosed on the useCallback dependency table instead of cascading into every\n // effect that consumes the callback.\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n } else if (path === \"React.useRef\" && names.length >= 1) {\n stableVariables.add(names[0]);\n refVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(refVariablesByFunction, owner, names[0]);\n } else {\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n if (/^use[A-Z0-9_]/.test(final)) {\n for (const name of names.slice(1)) {\n if (!STABLE_CUSTOM_HOOK_RETURN.test(name)) continue;\n stableVariables.add(name);\n addScopedVariable(stableVariablesByFunction, owner, name);\n }\n }\n }\n }\n\n // React state/binding hooks can be assigned into previously declared locals.\n // The setter/Binding contracts are still stable even when the declaration and hook\n // call are split across statements. Rules-of-hooks separately reports conditional calls.\n for (const assignment of allNodes) {\n if (assignment.type !== \"assignment_statement\" || assignment.parent?.type === \"variable_declaration\") continue;\n const owner = nearestFunctionInfo(assignment, functionByNode);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const variableList = assignment.namedChildren.find((child) => child.type === \"variable_list\");\n const expressionList = assignment.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variableList?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [];\n const expression = expressionList?.namedChildren[0];\n if (!expression || expression.type !== \"function_call\") continue;\n const rawPath = expression.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n\n if (path === \"React.useState\" && names.length >= 2) {\n stableVariables.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n } else if (path === \"React.useBinding\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n if (names.length >= 2) {\n stableVariables.add(names[1]);\n bindingSetters.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n }\n }\n }\n\n // Binding-like values are stable mutable handles. Custom React-Luau animation hooks\n // often return bindings without the analyzer knowing the hook implementation. Infer\n // them from Binding-only APIs instead of requiring them in dependency arrays.\n for (const call of allNodes) {\n if (call.type !== \"function_call\") continue;\n const rawPath = normalizeExpressionText(call.childForFieldName(\"name\")?.text ?? \"\");\n const match = rawPath.match(/^([A-Za-z_][A-Za-z0-9_]*):(?:getValue|map)$/);\n if (!match) continue;\n const owner = nearestFunctionInfo(call, functionByNode);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n stableVariables.add(match[1]);\n addScopedVariable(stableVariablesByFunction, owner, match[1]);\n addScopedVariable(externalMutableVariablesByFunction, owner, match[1]);\n }\n\n const componentLocals = new Map<number, Set<string>>();\n for (const info of functions) {\n if (!info.isComponent && !info.isHook) continue;\n const names = collectDirectLocals(info.body);\n for (const parameter of info.parameters) names.add(parameter);\n if (info.name?.includes(\":\")) names.add(\"self\");\n componentLocals.set(nodeKey(info.node), names);\n }\n\n return {\n allNodes,\n isReactFile,\n reactNamespaces,\n reactRobloxNamespaces,\n aliases,\n stateSetters,\n stateValues,\n stateBindings,\n refVariables,\n bindingSetters,\n stableVariables,\n refVariablesByFunction,\n stableVariablesByFunction,\n externalMutableVariablesByFunction,\n instanceVariablesByFunction,\n componentLocals,\n functions,\n functionByNode,\n };\n}\n",
|
|
18
18
|
"interface SuppressionState {\n active: Set<string>;\n oneLine: Map<number, Set<string>>;\n}\n\nfunction normalizeRuleToken(token: string): string {\n const normalized = token.trim();\n if (!normalized || normalized === \"all\" || normalized === \"*\") return \"*\";\n return normalized.includes(\"/\") ? normalized : `react-luau/${normalized}`;\n}\n\nfunction parseRuleTokens(value: string): Set<string> {\n const withoutReason = value.split(\"--\", 1)[0] ?? \"\";\n const tokens = withoutReason\n .split(/[\\s,]+/)\n .map(normalizeRuleToken)\n .filter(Boolean);\n return new Set(tokens.length > 0 ? tokens : [\"*\"]);\n}\n\nfunction matchesRule(rules: Set<string> | undefined, ruleId: string): boolean {\n return Boolean(rules && (rules.has(\"*\") || rules.has(ruleId)));\n}\n\nexport function createInlineSuppressionChecker(source: string): (ruleId: string, line: number) => boolean {\n const state: SuppressionState = {\n active: new Set<string>(),\n oneLine: new Map<number, Set<string>>(),\n };\n const activeByLine = new Map<number, Set<string>>();\n const lines = source.split(/\\r?\\n/);\n const directive = /--\\s*react-luau-doctor-(disable|enable)(?:-(next-line|line))?\\b(.*)$/i;\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n activeByLine.set(lineNumber, new Set(state.active));\n\n const match = lines[index].match(directive);\n if (!match) continue;\n\n const action = match[1].toLowerCase();\n const placement = match[2]?.toLowerCase();\n const rules = parseRuleTokens(match[3] ?? \"\");\n\n if (placement === \"line\" || placement === \"next-line\") {\n if (action !== \"disable\") continue;\n const targetLine = placement === \"line\" ? lineNumber : lineNumber + 1;\n const existing = state.oneLine.get(targetLine) ?? new Set<string>();\n for (const rule of rules) existing.add(rule);\n state.oneLine.set(targetLine, existing);\n continue;\n }\n\n if (action === \"disable\") {\n for (const rule of rules) state.active.add(rule);\n } else if (rules.has(\"*\")) {\n state.active.clear();\n } else {\n for (const rule of rules) state.active.delete(rule);\n }\n }\n\n return (ruleId: string, line: number): boolean =>\n matchesRule(activeByLine.get(line), ruleId) || matchesRule(state.oneLine.get(line), ruleId);\n}\n",
|
|
19
|
-
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Language, Parser
|
|
20
|
-
"interface BracketDepth {\n parentheses: number;\n brackets: number;\n braces: number;\n}\n\ninterface Range {\n start: number;\n end: number;\n}\n\nfunction scanTypeLine(text: string, depth: BracketDepth): void {\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n const next = text[index + 1];\n\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n\n if (char === \"\\\"\" || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"-\" && next === \"-\") break;\n\n if (char === \"(\") depth.parentheses += 1;\n else if (char === \")\") depth.parentheses = Math.max(0, depth.parentheses - 1);\n else if (char === \"[\") depth.brackets += 1;\n else if (char === \"]\") depth.brackets = Math.max(0, depth.brackets - 1);\n else if (char === \"{\") depth.braces += 1;\n else if (char === \"}\") depth.braces = Math.max(0, depth.braces - 1);\n }\n}\n\nfunction depthIsZero(depth: BracketDepth): boolean {\n return depth.parentheses === 0 && depth.brackets === 0 && depth.braces === 0;\n}\n\nfunction lineData(source: string): { lines: string[]; offsets: number[] } {\n const lines = source.match(/[^\\n]*(?:\\n|$)/g)?.filter((line, index, all) => line.length > 0 || index < all.length - 1) ?? [source];\n const offsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n offsets.push(offset);\n offset += line.length;\n }\n return { lines, offsets };\n}\n\nfunction longBracketEquals(source: string, start: number): number | null {\n if (source[start] !== \"[\") return null;\n let index = start + 1;\n while (source[index] === \"=\") index += 1;\n return source[index] === \"[\" ? index - start - 1 : null;\n}\n\nfunction longBracketEnd(source: string, start: number, equals: number): number {\n const closer = `]${\"=\".repeat(equals)}]`;\n const end = source.indexOf(closer, start + equals + 2);\n return end < 0 ? source.length : end + closer.length;\n}\n\n/**\n * Marks executable-code positions. Strings and comments are false so syntax\n * compatibility rewrites never alter text that merely contains a keyword.\n */\nfunction codeMask(source: string): Uint8Array {\n const mask = new Uint8Array(source.length);\n mask.fill(1);\n\n let index = 0;\n while (index < source.length) {\n const char = source[index];\n\n if (char === \"'\" || char === \"\\\"\") {\n const quote = char;\n let cursor = index;\n let escaped = false;\n while (cursor < source.length) {\n mask[cursor] = 0;\n const current = source[cursor];\n cursor += 1;\n if (cursor - 1 === index) continue;\n if (escaped) escaped = false;\n else if (current === \"\\\\\") escaped = true;\n else if (current === quote) break;\n }\n index = cursor;\n continue;\n }\n\n if (char === \"`\") {\n let cursor = index;\n let escaped = false;\n while (cursor < source.length) {\n mask[cursor] = 0;\n const current = source[cursor];\n cursor += 1;\n if (cursor - 1 === index) continue;\n if (escaped) escaped = false;\n else if (current === \"\\\\\") escaped = true;\n else if (current === \"`\") break;\n }\n index = cursor;\n continue;\n }\n\n if (char === \"-\" && source[index + 1] === \"-\") {\n const longEquals = longBracketEquals(source, index + 2);\n const end = longEquals === null ? source.indexOf(\"\\n\", index + 2) : longBracketEnd(source, index + 2, longEquals);\n const stop = end < 0 ? source.length : end;\n mask.fill(0, index, stop);\n index = stop;\n continue;\n }\n\n if (char === \"[\") {\n const equals = longBracketEquals(source, index);\n if (equals !== null) {\n const end = longBracketEnd(source, index, equals);\n mask.fill(0, index, end);\n index = end;\n continue;\n }\n }\n\n index += 1;\n }\n\n return mask;\n}\n\nfunction isCode(mask: Uint8Array, start: number, end = start + 1): boolean {\n for (let index = start; index < end; index += 1) {\n if (mask[index] !== 1) return false;\n }\n return true;\n}\n\nfunction maskTypeAliases(source: string, mask: Uint8Array): Range[] {\n const { lines, offsets } = lineData(source);\n const ranges: Range[] = [];\n const typeStart = /^(\\s*)(?:export\\s+)?type\\s+[A-Za-z_][A-Za-z0-9_]*(?:<[^>]*>)?\\s*=/;\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex].replace(/\\r?\\n$/, \"\");\n const match = line.match(typeStart);\n if (!match || !isCode(mask, offsets[lineIndex] + match.index!, offsets[lineIndex] + match.index! + match[0].trimStart().length)) continue;\n\n const depth: BracketDepth = { parentheses: 0, brackets: 0, braces: 0 };\n let sawExpression = false;\n let endLine = lineIndex;\n\n for (let current = lineIndex; current < lines.length; current += 1) {\n const currentLine = lines[current].replace(/\\r?\\n$/, \"\");\n const segment = current === lineIndex ? currentLine.slice(match[0].length) : currentLine;\n if (segment.trim().length > 0) sawExpression = true;\n scanTypeLine(segment, depth);\n endLine = current;\n\n if (!sawExpression || !depthIsZero(depth)) continue;\n const trimmed = segment.trimEnd();\n if (/[|&=,]$/.test(trimmed)) continue;\n\n let nextNonEmpty = \"\";\n for (let lookahead = current + 1; lookahead < lines.length; lookahead += 1) {\n nextNonEmpty = lines[lookahead].trim();\n if (nextNonEmpty.length > 0) break;\n }\n if (/^[|&]/.test(nextNonEmpty)) continue;\n break;\n }\n\n ranges.push({\n start: offsets[lineIndex],\n end: offsets[endLine] + lines[endLine].length,\n });\n lineIndex = endLine;\n }\n\n return ranges;\n}\n\nfunction maskTypeLevelBlocks(source: string, mask: Uint8Array): Range[] {\n const { lines, offsets } = lineData(source);\n const ranges: Range[] = [];\n const declarationStart = /^(\\s*)(?:(?:export\\s+)?type\\s+function\\b|declare\\s+(?:extern\\s+type|class|global)\\b)/;\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex].replace(/\\r?\\n$/, \"\");\n const match = line.match(declarationStart);\n if (!match) continue;\n const firstToken = offsets[lineIndex] + match[1].length;\n if (!isCode(mask, firstToken)) continue;\n\n const indentation = match[1].replace(/\\t/g, \" \").length;\n let endLine = lineIndex;\n const afterStart = line.slice(match[0].length);\n if (!/\\bend\\b/.test(afterStart)) {\n for (let current = lineIndex + 1; current < lines.length; current += 1) {\n const currentLine = lines[current].replace(/\\r?\\n$/, \"\");\n const trimmed = currentLine.trim();\n if (!trimmed) continue;\n const currentIndent = currentLine.match(/^\\s*/)?.[0].replace(/\\t/g, \" \").length ?? 0;\n if (trimmed === \"end\" && currentIndent <= indentation && isCode(mask, offsets[current] + currentLine.indexOf(\"end\"), offsets[current] + currentLine.indexOf(\"end\") + 3)) {\n endLine = current;\n break;\n }\n }\n }\n\n ranges.push({ start: offsets[lineIndex], end: offsets[endLine] + lines[endLine].length });\n lineIndex = endLine;\n }\n\n return ranges;\n}\n\nfunction attributeRanges(source: string, mask: Uint8Array): Range[] {\n const ranges: Range[] = [];\n for (let index = 0; index < source.length; index += 1) {\n if (source[index] !== \"@\" || !isCode(mask, index)) continue;\n\n if (source[index + 1] === \"[\") {\n let depth = 0;\n let cursor = index + 1;\n while (cursor < source.length) {\n if (isCode(mask, cursor)) {\n if (source[cursor] === \"[\") depth += 1;\n else if (source[cursor] === \"]\") {\n depth -= 1;\n if (depth === 0) {\n cursor += 1;\n break;\n }\n }\n }\n cursor += 1;\n }\n ranges.push({ start: index, end: cursor });\n index = cursor - 1;\n continue;\n }\n\n const match = source.slice(index + 1).match(/^[A-Za-z_][A-Za-z0-9_]*/);\n if (match && isCode(mask, index + 1, index + 1 + match[0].length)) {\n ranges.push({ start: index, end: index + 1 + match[0].length });\n index += match[0].length;\n }\n }\n return ranges;\n}\n\nfunction explicitTypeArgumentRanges(source: string, mask: Uint8Array): Range[] {\n const ranges: Range[] = [];\n for (let index = 0; index < source.length - 1; index += 1) {\n if (source[index] !== \"<\" || source[index + 1] !== \"<\" || !isCode(mask, index, index + 2)) continue;\n\n let depth = 2;\n let cursor = index + 2;\n while (cursor < source.length && depth > 0) {\n if (isCode(mask, cursor)) {\n if (source[cursor] === \"<\") depth += 1;\n else if (source[cursor] === \">\") depth -= 1;\n }\n cursor += 1;\n }\n if (depth === 0) {\n ranges.push({ start: index, end: cursor });\n index = cursor - 1;\n }\n }\n return ranges;\n}\n\nfunction mergeRanges(ranges: Range[]): Range[] {\n const sorted = ranges.filter((range) => range.end > range.start).sort((a, b) => a.start - b.start || a.end - b.end);\n const merged: Range[] = [];\n for (const range of sorted) {\n const previous = merged.at(-1);\n if (previous && range.start <= previous.end) previous.end = Math.max(previous.end, range.end);\n else merged.push({ ...range });\n }\n return merged;\n}\n\nfunction blankPreservingUtf8Bytes(value: string): string {\n let result = \"\";\n for (const char of value) {\n if (char === \"\\n\" || char === \"\\r\") result += char;\n else result += \" \".repeat(new TextEncoder().encode(char).length);\n }\n return result;\n}\n\nfunction applyMasks(source: string, ranges: Range[]): string {\n let output = source;\n for (const range of mergeRanges(ranges).sort((a, b) => b.start - a.start)) {\n output = `${output.slice(0, range.start)}${blankPreservingUtf8Bytes(output.slice(range.start, range.end))}${output.slice(range.end)}`;\n }\n return output;\n}\n\nfunction normalizeIntegerLiteralSuffixes(source: string, mask: Uint8Array): string {\n const suffixes: number[] = [];\n const integerPattern = /\\b(?:0[xX][0-9A-Fa-f_]+|0[bB][01_]+|[0-9][0-9_]*)i\\b/g;\n\n for (const match of source.matchAll(integerPattern)) {\n const start = match.index;\n const suffix = start + match[0].length - 1;\n if (isCode(mask, start, suffix + 1)) suffixes.push(suffix);\n }\n\n let output = source;\n for (const suffix of suffixes.sort((a, b) => b - a)) {\n output = `${output.slice(0, suffix)} ${output.slice(suffix + 1)}`;\n }\n return output;\n}\n\nfunction replaceContextualKeywords(source: string, mask: Uint8Array): string {\n const replacements: Array<{ start: number; end: number; value: string }> = [];\n\n const constPattern = /\\bconst\\b(?=\\s+(?:function\\b|[A-Za-z_][A-Za-z0-9_]*\\s*(?::|,|=)))/g;\n for (const match of source.matchAll(constPattern)) {\n const start = match.index;\n if (isCode(mask, start, start + 5)) replacements.push({ start, end: start + 5, value: \"local\" });\n }\n\n const exportPattern = /\\bexport\\b(?=\\s+(?:local\\b|const\\b|function\\b))/g;\n for (const match of source.matchAll(exportPattern)) {\n const start = match.index;\n if (isCode(mask, start, start + 6)) replacements.push({ start, end: start + 6, value: \" \" });\n }\n\n let output = source;\n for (const replacement of replacements.sort((a, b) => b.start - a.start)) {\n output = `${output.slice(0, replacement.start)}${replacement.value}${output.slice(replacement.end)}`;\n }\n return output;\n}\n\n/**\n * Adapts syntax added after the bundled Tree-sitter grammar without moving any\n * UTF-8 byte offsets. Runtime declarations are normalized to older equivalent\n * syntax; type-only syntax and attributes are blanked because React analysis\n * does not need their AST nodes.\n */\nexport function parserCompatibleSource(source: string): string {\n const mask = codeMask(source);\n const keywordCompatible = replaceContextualKeywords(source, mask);\n const literalCompatible = normalizeIntegerLiteralSuffixes(keywordCompatible, mask);\n const ranges = [\n ...maskTypeAliases(source, mask),\n ...maskTypeLevelBlocks(source, mask),\n ...attributeRanges(source, mask),\n ...explicitTypeArgumentRanges(source, mask),\n ];\n const masked = applyMasks(literalCompatible, ranges);\n\n // tree-sitter-luau 1.2.0 treats a statement-level assignment to the valid\n // Luau identifier `type` as a malformed type alias. Replace only that token\n // with an equal-width identifier so syntax locations remain aligned.\n return masked.replace(\n /^(\\s*)type(?=\\s*(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|=(?!=)))/gm,\n \"$1_typ\",\n );\n}\n",
|
|
21
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { RuleContext } from \"./types\";\n\n/**\n * Engine members that are documented/known to yield. The analyzer intentionally\n * matches exact member names instead of every `*Async` function so custom\n * promise-style APIs do not become false positives merely because of naming.\n */\nconst YIELDING_ENGINE_MEMBERS = new Set([\n \"WaitForChild\",\n \"Wait\",\n \"GetAsync\",\n \"SetAsync\",\n \"UpdateAsync\",\n \"RemoveAsync\",\n \"IncrementAsync\",\n \"GetSortedAsync\",\n \"ListKeysAsync\",\n \"ListVersionsAsync\",\n \"GetVersionAsync\",\n \"PublishAsync\",\n \"SubscribeAsync\",\n \"RequestAsync\",\n \"PostAsync\",\n \"PreloadAsync\",\n \"ComputeAsync\",\n \"FilterStringAsync\",\n \"FilterStringForBroadcast\",\n \"FilterStringForPlayerAsync\",\n \"GetNonChatStringForBroadcastAsync\",\n \"GetNonChatStringForUserAsync\",\n \"GetChatForUserAsync\",\n \"AwardBadgeAsync\",\n \"UserHasBadgeAsync\",\n \"GetBadgeInfoAsync\",\n \"GetPolicyInfoForPlayerAsync\",\n \"GetTranslatorForPlayerAsync\",\n \"GetUserIdFromNameAsync\",\n \"GetNameFromUserIdAsync\",\n \"GetHumanoidDescriptionFromUserId\",\n \"GetHumanoidDescriptionFromOutfitId\",\n \"GetFriendsAsync\",\n \"GetUserThumbnailAsync\",\n \"GetUserInfosByUserIdsAsync\",\n \"GetGroupInfoAsync\",\n \"GetAlliesAsync\",\n \"GetEnemiesAsync\",\n \"GetGroupsAsync\",\n \"TeleportAsync\",\n \"ReserveServerAsync\",\n \"CreatePlaceAsync\",\n \"SavePlaceAsync\",\n \"LoadAsset\",\n \"LoadAssetVersion\",\n \"GetProductInfo\",\n \"CreateEditableImageAsync\",\n \"CreateEditableMeshAsync\",\n \"GetBundleDetailsAsync\",\n \"GetGamePlacesAsync\",\n \"GetDeveloperProductsAsync\",\n \"GetInventoryAsync\",\n \"GetItemDetailsAsync\",\n \"GetBatchItemDetailsAsync\",\n \"PromptCreateAssetAsync\",\n \"PromptImportAnimationClipFromVideoAsync\",\n \"GetAnimationClipAsync\",\n]);\n\nconst ROBLOX_MUTABLE_LEAFS = new Set([\n \"AbsolutePosition\",\n \"AbsoluteRotation\",\n \"AbsoluteSize\",\n \"AssemblyAngularVelocity\",\n \"AssemblyLinearVelocity\",\n \"CFrame\",\n \"Changed\",\n \"ContentSize\",\n \"CurrentCamera\",\n \"Enabled\",\n \"FocusLost\",\n \"Focused\",\n \"Heartbeat\",\n \"InputBegan\",\n \"InputChanged\",\n \"InputEnded\",\n \"Parent\",\n \"Position\",\n \"PreRender\",\n \"PreSimulation\",\n \"RenderStepped\",\n \"Rotation\",\n \"Size\",\n \"Stepped\",\n \"TextBounds\",\n \"Value\",\n \"ViewportSize\",\n \"WorldCFrame\",\n \"WorldPosition\",\n \"X\",\n \"Y\",\n]);\n\nconst INSTANCE_FACTORY_MEMBERS = new Set([\n \"Clone\",\n \"FindFirstAncestor\",\n \"FindFirstAncestorOfClass\",\n \"FindFirstAncestorWhichIsA\",\n \"FindFirstChild\",\n \"FindFirstChildOfClass\",\n \"FindFirstChildWhichIsA\",\n \"GetButton\",\n \"GetMouse\",\n \"GetService\",\n \"WaitForChild\",\n]);\n\nexport function finalCallMember(path: string): string {\n return path.split(/[.:]/).at(-1) ?? path;\n}\n\nfunction declarationInitializer(node: SyntaxNode, name: string): SyntaxNode | null | undefined {\n if (node.type !== \"variable_declaration\") return undefined;\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variables = assignment?.namedChildren.find((child) => child.type === \"variable_list\")\n ?? node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variables?.namedChildren.filter((child) => child.type === \"identifier\") ?? [];\n const index = names.findIndex((candidate) => candidate.text === name);\n if (index < 0) return undefined;\n return expressions?.namedChildren[index] ?? expressions?.namedChildren[0] ?? null;\n}\n\nfunction functionBindsName(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"function_definition\" && node.type !== \"function_declaration\") return false;\n const parameters = node.childForFieldName(\"parameters\");\n if (!parameters) return false;\n return parameters.namedChildren.some((parameter) =>\n parameter.namedChildren.some((child) => child.type === \"identifier\" && child.text === name)\n || (parameter.type === \"identifier\" && parameter.text === name)\n );\n}\n\nfunction loopBindsName(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"for_statement\") return false;\n const header = node.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`^\\\\s*for\\\\s+(?:${escaped}\\\\s*=|[^\\\\n]*\\\\b${escaped}\\\\b[^\\\\n]*\\\\bin\\\\b)`, \"s\").test(header);\n}\n\nfunction visibleInitializer(name: string, from: SyntaxNode, context: RuleContext): SyntaxNode | null | undefined {\n let current: SyntaxNode | null = from.parent;\n while (current) {\n if (current.type === \"block\" || current.id === context.root.id) {\n const children = current.namedChildren;\n for (let index = children.length - 1; index >= 0; index -= 1) {\n const child = children[index];\n if (child.startIndex >= from.startIndex) continue;\n const initializer = declarationInitializer(child, name);\n if (initializer !== undefined) return initializer;\n if (child.type === \"function_declaration\") {\n const declared = child.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (declared === name) return null;\n }\n }\n }\n if (functionBindsName(current, name) || loopBindsName(current, name)) return null;\n current = current.parent;\n }\n return undefined;\n}\n\nfunction expressionHasRobloxOrigin(\n expression: SyntaxNode | null | undefined,\n from: SyntaxNode,\n context: RuleContext,\n seen: Set<string>,\n): boolean {\n if (!expression) return false;\n const normalized = expression.text.replace(/\\s+/g, \"\");\n if (/^(?:game|workspace|script)(?:[.:]|$)/.test(normalized) || /^Instance\\.new\\(/.test(normalized)) return true;\n\n const root = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!root || root === \"require\" || seen.has(root)) return false;\n if (expression.type !== \"identifier\" && expression.type !== \"function_call\") return false;\n\n seen.add(root);\n return expressionHasRobloxOrigin(visibleInitializer(root, from, context), from, context, seen);\n}\n\nfunction hasRobloxReceiver(path: string, call: SyntaxNode, context: RuleContext): boolean {\n const normalized = path.replace(/\\s+/g, \"\");\n if (/^(?:game|workspace|script)(?:[.:]|$)/.test(normalized)) return true;\n const root = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!root) return false;\n return expressionHasRobloxOrigin(visibleInitializer(root, call, context), call, context, new Set([root]));\n}\n\nconst runServiceCallCache = new WeakMap<RuleContext, Map<number, boolean>>();\nconst runServiceExpressionCache = new WeakMap<RuleContext, Map<number, boolean>>();\n\nfunction cachedNodeBoolean(\n cache: WeakMap<RuleContext, Map<number, boolean>>,\n context: RuleContext,\n node: SyntaxNode,\n compute: () => boolean,\n): boolean {\n let entries = cache.get(context);\n if (!entries) {\n entries = new Map<number, boolean>();\n cache.set(context, entries);\n }\n const cached = entries.get(node.id);\n if (cached !== undefined) return cached;\n const value = compute();\n entries.set(node.id, value);\n return value;\n}\n\nconst RUN_SERVICE_EVENTS = new Set([\n \"RenderStepped\",\n \"Heartbeat\",\n \"Stepped\",\n \"PreRender\",\n \"PreSimulation\",\n \"PostSimulation\",\n]);\n\nfunction expressionIsRunService(\n expression: SyntaxNode | null | undefined,\n from: SyntaxNode,\n context: RuleContext,\n seen: Set<string>,\n): boolean {\n if (!expression) return false;\n const normalized = expression.text.replace(/\\s+/g, \"\");\n if (/^game:GetService\\([\"']RunService[\"']\\)$/.test(normalized)) return true;\n if (expression.type !== \"identifier\") return false;\n const name = expression.text;\n if (seen.has(name)) return false;\n seen.add(name);\n return expressionIsRunService(visibleInitializer(name, from, context), from, context, seen);\n}\n\nfunction rootIsRunService(root: string, from: SyntaxNode, context: RuleContext): boolean {\n if (root === \"game\") return false;\n return expressionIsRunService(visibleInitializer(root, from, context), from, context, new Set([root]));\n}\n\nexport function isHighFrequencyRunServiceExpression(node: SyntaxNode, context: RuleContext): boolean {\n return cachedNodeBoolean(runServiceExpressionCache, context, node, () => {\n const normalized = node.text.replace(/\\s+/g, \"\");\n if (/^game:GetService\\([\"']RunService[\"']\\)\\.(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)$/.test(normalized)) {\n return true;\n }\n const match = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)$/);\n return Boolean(match && RUN_SERVICE_EVENTS.has(match[2]) && rootIsRunService(match[1], node, context));\n });\n}\n\nexport function isHighFrequencyRunServiceCall(call: SyntaxNode, context: RuleContext): boolean {\n return cachedNodeBoolean(runServiceCallCache, context, call, () => {\n const normalized = (context.getCallPath(call) ?? \"\").replace(/\\s+/g, \"\");\n const direct = call.text.replace(/\\s+/g, \"\");\n if (/^game:GetService\\([\"']RunService[\"']\\)(?:\\.(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation):Connect|:BindToRenderStep|:BindToSimulation)\\(/.test(direct)) {\n return true;\n }\n\n const event = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation):Connect$/);\n if (event) return rootIsRunService(event[1], call, context);\n\n const bind = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*):(?:BindToRenderStep|BindToSimulation)$/);\n return Boolean(bind && rootIsRunService(bind[1], call, context));\n });\n}\n\nexport function sourceHasHighFrequencyRunService(source: string): boolean {\n if (/game\\s*:\\s*GetService\\s*\\(\\s*[\"']RunService[\"']\\s*\\)\\s*(?:\\.\\s*(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)\\s*:\\s*Connect|:\\s*(?:BindToRenderStep|BindToSimulation))/.test(source)) {\n return true;\n }\n\n const aliases = new Set<string>();\n for (const match of source.matchAll(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*game\\s*:\\s*GetService\\s*\\(\\s*[\"']RunService[\"']\\s*\\)/g)) {\n aliases.add(match[1]);\n }\n for (const alias of aliases) {\n const escaped = alias.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = new RegExp(`\\\\b${escaped}\\\\s*(?:\\\\.\\\\s*(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)\\\\s*:\\\\s*Connect|:\\\\s*(?:BindToRenderStep|BindToSimulation))`);\n if (pattern.test(source)) return true;\n }\n return false;\n}\n\nexport function knownYieldReason(path: string, call?: SyntaxNode, context?: RuleContext): string | null {\n const normalized = path.replace(/\\s+/g, \"\");\n if (normalized === \"task.wait\") return \"task.wait\";\n if (normalized === \"coroutine.yield\") return \"coroutine.yield\";\n\n const member = finalCallMember(normalized);\n if (!YIELDING_ENGINE_MEMBERS.has(member)) return null;\n if (!call || !context) return null;\n return hasRobloxReceiver(normalized, call, context) ? member : null;\n}\n\nexport function functionYieldPoint(node: SyntaxNode, context: RuleContext): { call: SyntaxNode; reason: string } | null {\n for (const candidate of context.walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const nearest = context.nearestFunction(candidate);\n const owner = context.model.functionByNode.get(node.id);\n if (owner && nearest !== owner) continue;\n const path = context.resolveCallPath(context.getCallPath(candidate) ?? \"\");\n const reason = knownYieldReason(path, candidate, context);\n if (reason) return { call: candidate, reason };\n }\n return null;\n}\n\nexport function isInstanceProducingExpression(node: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!node) return false;\n\n const text = node.text.trim();\n if (/^(?:workspace|game|script)(?:\\.|:|$)/.test(text)) return true;\n\n for (const candidate of context.walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(candidate) ?? \"\");\n if (path === \"Instance.new\") return true;\n if (INSTANCE_FACTORY_MEMBERS.has(finalCallMember(path))) return true;\n }\n\n return false;\n}\n\nexport function mutableDependencyBase(path: string, externallyMutableRoots: Set<string>): string | null {\n const normalized = path.replace(/\\s+/g, \"\");\n if (/\\.current(?:\\.|$)/.test(normalized)) return \"\";\n\n const segments = normalized.split(\".\");\n if (segments.length < 2) return null;\n\n if (externallyMutableRoots.has(segments[0])) return segments[0];\n\n const mutableIndex = segments.findIndex((segment, index) => index > 0 && ROBLOX_MUTABLE_LEAFS.has(segment));\n if (mutableIndex <= 0) return null;\n\n const ownerPath = segments.slice(0, mutableIndex).join(\".\");\n const mutableLeaf = segments[mutableIndex];\n const signalLike = /(?:Changed|Began|Ended|Focused|Heartbeat|Stepped|PreRender|PreSimulation)$/.test(mutableLeaf);\n const objectLike = /(?:instance|attachment|camera|mouse|frame|gui|part|value|humanoid|sound|tween|workspace|root|viewport)/i.test(ownerPath);\n return signalLike || objectLike ? ownerPath : null;\n}\n",
|
|
22
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FunctionInfo, RuleContext } from \"../types\";\nimport { rootIdentifier, sameNode } from \"../ast/walk\";\n\nexport const CONDITIONAL_TYPES = new Set([\n \"if_statement\",\n \"if_expression\",\n \"for_statement\",\n \"while_statement\",\n \"repeat_statement\",\n]);\n\nexport function isHookPath(path: string): boolean {\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return /^use[A-Z0-9_]/.test(final);\n}\n\n\nexport function assignmentTargetNode(statement: SyntaxNode): SyntaxNode {\n return statement.namedChildren[0] ?? statement;\n}\n\nexport function tableStartNode(table: SyntaxNode): SyntaxNode {\n return table.children.find((child) => child.type === \"{\") ?? table;\n}\n\nexport function identifierNode(node: SyntaxNode, name: string): SyntaxNode | null {\n const stack = [node];\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (current.type === \"identifier\" && current.text === name) return current;\n for (let index = current.namedChildren.length - 1; index >= 0; index -= 1) stack.push(current.namedChildren[index]);\n }\n return null;\n}\n\nexport function callNameNode(call: SyntaxNode): SyntaxNode {\n return call.childForFieldName(\"name\") ?? call;\n}\n\nexport function fieldNameNode(field: SyntaxNode): SyntaxNode {\n return field.childForFieldName(\"name\") ?? field;\n}\n\nexport function firstFunctionArgument(context: RuleContext, call: SyntaxNode): SyntaxNode | null {\n return context.callArguments(call).find((arg) => arg.type === \"function_definition\") ?? null;\n}\n\nexport function directComponentForCall(context: RuleContext, call: SyntaxNode): FunctionInfo | null {\n const fn = context.nearestFunction(call);\n return fn?.isComponent ? fn : null;\n}\n\nexport function findAncestorBetween(node: SyntaxNode, stop: SyntaxNode, predicate: (node: SyntaxNode) => boolean): SyntaxNode | null {\n let current = node.parent;\n while (current && !sameNode(current, stop)) {\n if (predicate(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nexport function declarationNames(node: SyntaxNode): string[] {\n if (node.type !== \"variable_declaration\") return [];\n const beforeEquals = node.text.split(\"=\")[0] ?? \"\";\n return beforeEquals\n .replace(/^\\s*local\\s+/, \"\")\n .split(\",\")\n .map((piece) => piece.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null)\n .filter((name): name is string => Boolean(name));\n}\n\nexport function callRoot(path: string): string | null {\n return rootIdentifier(path);\n}\n\nexport function isNestedInsideFunction(node: SyntaxNode, boundary: SyntaxNode): boolean {\n let current = node.parent;\n while (current && !sameNode(current, boundary)) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function functionHasReturnedBefore(call: SyntaxNode, fn: FunctionInfo, context: RuleContext): boolean {\n if (!fn.body) return false;\n for (const node of context.walk(fn.body)) {\n if (node.endIndex > call.startIndex) continue;\n if (node.type !== \"return_statement\") continue;\n if (isNestedInsideFunction(node, fn.node)) continue;\n return true;\n }\n return false;\n}\n\nexport function parseDependencyRoots(node: SyntaxNode | undefined): Set<string> {\n const result = new Set<string>();\n if (!node || node.type !== \"table_constructor\") return result;\n\n for (const child of node.namedChildren) {\n const root = rootIdentifier(child.text);\n if (root) result.add(root);\n }\n return result;\n}\n\nexport function assignmentLeft(text: string): string {\n const match = text.match(/^(.*?)(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|\\/=|=)/s);\n return match?.[1]?.trim() ?? \"\";\n}\n\nexport function functionInfoForNode(context: RuleContext, node: SyntaxNode | null): FunctionInfo | null {\n if (!node) return null;\n return context.model.functionByNode.get(node.id) ?? null;\n}\n\nexport function stateBindingsFor(context: RuleContext, owner: FunctionInfo): typeof context.model.stateBindings {\n return context.model.stateBindings.filter((binding) => binding.owner === owner);\n}\n\nexport function isEffectPath(path: string): boolean {\n return path === \"React.useEffect\" || path === \"React.useLayoutEffect\";\n}\n\nexport function dependencyExpressions(node: SyntaxNode | undefined): SyntaxNode[] {\n if (!node || node.type !== \"table_constructor\") return [];\n return node.namedChildren\n .filter((child) => child.type === \"field\")\n .map((field) => {\n const name = field.childForFieldName(\"name\");\n if (name && field.text.trim().startsWith(\"[\")) return name;\n return field.namedChildren.find((child) => !sameNode(child, name)) ?? name ?? field;\n });\n}\n\nexport function fieldName(node: SyntaxNode): string | null {\n if (node.type !== \"field\") return null;\n const name = node.childForFieldName(\"name\");\n return name?.type === \"identifier\" ? name.text : null;\n}\n\nexport function fieldValue(node: SyntaxNode): SyntaxNode | null {\n if (node.type !== \"field\") return null;\n const name = node.childForFieldName(\"name\");\n if (!name) return node.namedChildren[0] ?? null;\n return node.namedChildren.find((child) => child.startIndex > name.endIndex) ?? null;\n}\n\nexport function containsIdentifier(node: SyntaxNode | null | undefined, name: string, context: RuleContext): boolean {\n if (!node) return false;\n for (const child of context.walk(node)) {\n if (child.type !== \"identifier\" || child.text !== name) continue;\n const parent = child.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), child)) continue;\n if (parent?.type === \"method_index_expression\" && (sameNode(parent.childForFieldName(\"method\"), child) || sameNode(parent.namedChildren.at(-1), child))) continue;\n return true;\n }\n return false;\n}\n\nexport function ownerStateSetter(context: RuleContext, owner: FunctionInfo, path: string): string | null {\n for (const binding of context.model.stateBindings) {\n if (binding.owner === owner && binding.setterName === path) return binding.valueName;\n }\n return null;\n}\n\n\nfunction parameterNames(node: SyntaxNode | null): Set<string> {\n const names = new Set<string>();\n if (!node) return names;\n for (const candidate of node.namedChildren) {\n for (const child of [candidate, ...Array.from((function* walkLocal(current: SyntaxNode): Iterable<SyntaxNode> {\n for (const nested of current.namedChildren) {\n yield nested;\n yield* walkLocal(nested);\n }\n })(candidate))]) {\n if (child.type === \"identifier\") names.add(child.text);\n }\n }\n return names;\n}\n\nfunction blockBindingsBefore(block: SyntaxNode, beforeIndex: number): Set<string> {\n const names = new Set<string>();\n for (const child of block.namedChildren) {\n if (child.startIndex >= beforeIndex) continue;\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) names.add(name);\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) names.add(name);\n }\n }\n return names;\n}\n\nfunction loopBindings(loop: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const header = loop.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const numeric = header.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) names.add(numeric[1]);\n const generic = header.match(/^\\s*for\\s+(.+?)\\s+in\\b/s);\n if (generic) {\n for (const part of generic[1].split(\",\")) {\n const name = part.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (name) names.add(name);\n }\n }\n return names;\n}\n\nexport function isNameShadowedBetween(node: SyntaxNode, boundary: FunctionInfo, name: string): boolean {\n let current: SyntaxNode | null = node.parent;\n while (current && !sameNode(current, boundary.node)) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") {\n if (parameterNames(current.childForFieldName(\"parameters\")).has(name)) return true;\n }\n if (current.type === \"block\" && !sameNode(current.parent, boundary.node) && blockBindingsBefore(current, node.startIndex).has(name)) return true;\n if (current.type === \"for_statement\" && loopBindings(current).has(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nconst topLevelBindingsCache = new WeakMap<FunctionInfo, Map<string, SyntaxNode[]>>();\n\nfunction topLevelBindings(boundary: FunctionInfo): Map<string, SyntaxNode[]> {\n const cached = topLevelBindingsCache.get(boundary);\n if (cached) return cached;\n\n const result = new Map<string, SyntaxNode[]>();\n const add = (name: string, node: SyntaxNode): void => {\n const existing = result.get(name) ?? [];\n existing.push(node);\n result.set(name, existing);\n };\n\n for (const child of boundary.body?.namedChildren ?? []) {\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) add(name, child);\n } else if (child.type === \"function_declaration\") {\n const declared = child.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(declared)) add(declared, child);\n }\n }\n\n topLevelBindingsCache.set(boundary, result);\n return result;\n}\n\nexport function isBindingShadowedBetween(\n node: SyntaxNode,\n boundary: FunctionInfo,\n name: string,\n declaration: SyntaxNode | null = null,\n): boolean {\n if (isNameShadowedBetween(node, boundary, name)) return true;\n if (!boundary.body) return false;\n\n const afterIndex = declaration?.endIndex ?? boundary.body.startIndex - 1;\n return (topLevelBindings(boundary).get(name) ?? []).some((binding) =>\n binding.startIndex > afterIndex && binding.startIndex < node.startIndex\n );\n}\n\nexport function containsUnshadowedIdentifier(\n node: SyntaxNode | null | undefined,\n name: string,\n context: RuleContext,\n boundary: FunctionInfo,\n): boolean {\n if (!node) return false;\n for (const child of context.walk(node)) {\n if (child.type !== \"identifier\" || child.text !== name) continue;\n const parent = child.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), child)) continue;\n if (parent?.type === \"method_index_expression\" && (sameNode(parent.childForFieldName(\"method\"), child) || sameNode(parent.namedChildren.at(-1), child))) continue;\n if (isNameShadowedBetween(child, boundary, name)) continue;\n return true;\n }\n return false;\n}\n\nexport function directFunctionCalls(context: RuleContext, fn: FunctionInfo): SyntaxNode[] {\n if (!fn.body) return [];\n return [...context.walk(fn.body)].filter((node) => node.type === \"function_call\" && context.nearestFunction(node) === fn);\n}\n",
|
|
23
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FixPreview, FunctionInfo, RuleContext, RuleDefinition, Severity } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { functionYieldPoint } from \"../roblox-semantics\";\nimport { callNameNode, declarationNames, firstFunctionArgument, functionInfoForNode } from \"./helpers\";\n\ninterface Resource {\n call: SyntaxNode;\n label: string;\n variable: string | null;\n detail?: string;\n severity?: Severity;\n cleanupMatches(cleanupText: string, variable: string | null, call: SyntaxNode): boolean;\n}\n\nconst ALWAYS_MANAGED_METHOD = /:GiveTask$/;\nconst GENERIC_MANAGER_METHOD = /:(?:Add|AddTask|AddObject|Track)$/;\nconst MANAGER_ROOT = /(?:maid|trove|janitor|cleaner|cleanup|scope|bin|disposer)(?:$|[._])/i;\nconst CONNECTION_RETURNING_METHODS = new Set([\"BindToSimulation\", \"SubscribeAsync\", \"OnUpdate\"]);\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction connectionOwnerExpression(rawPath: string): string | null {\n const connected = rawPath.match(/^(.*):Connect$/s)?.[1];\n if (!connected) return null;\n\n const signalMethod = connected.match(/^(.*):(?:GetPropertyChangedSignal|GetAttributeChangedSignal)\\s*\\(.*\\)$/s);\n if (signalMethod) return signalMethod[1]?.trim() || null;\n\n const eventProperty = connected.match(/^(.*)\\.[A-Za-z_][A-Za-z0-9_]*$/s);\n return eventProperty?.[1]?.trim() || null;\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction initializerCreatesInstance(initializer: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!initializer) return false;\n for (const candidate of context.walk(initializer)) {\n if (candidate.type !== \"function_call\") continue;\n if (context.resolveCallPath(context.getCallPath(candidate) ?? \"\") === \"Instance.new\") return true;\n }\n return false;\n}\n\nfunction bodyDeclaresInstanceBefore(\n body: SyntaxNode | null,\n beforeIndex: number,\n expression: string,\n context: RuleContext,\n): boolean {\n if (!body) return false;\n for (const child of body.namedChildren) {\n if (child.startIndex >= beforeIndex) break;\n if (child.type !== \"variable_declaration\") continue;\n const names = declarationNames(child);\n const index = names.indexOf(expression);\n if (index === -1) continue;\n if (initializerCreatesInstance(declarationExpressions(child)[index], context)) return true;\n }\n return false;\n}\n\nfunction isProvenInstanceExpression(\n expression: string | null,\n call: SyntaxNode,\n context: RuleContext,\n callback: FunctionInfo,\n): boolean {\n if (!expression || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(expression)) return false;\n const callbackInstances = context.model.instanceVariablesByFunction.get(callback.node.id);\n if (callbackInstances?.has(expression)) return true;\n if (bodyDeclaresInstanceBefore(callback.body, call.startIndex, expression, context)) return true;\n\n const effectOwner = context.nearestFunction(callback.node);\n if (effectOwner) {\n const ownerInstances = context.model.instanceVariablesByFunction.get(effectOwner.node.id);\n if (ownerInstances?.has(expression)) return true;\n }\n return Boolean(effectOwner && bodyDeclaresInstanceBefore(effectOwner.body, callback.node.startIndex, expression, context));\n}\n\nfunction cleanupDestroysExpression(cleanupText: string, expression: string): boolean {\n return new RegExp(`(?:^|[^A-Za-z0-9_])${escapeRegExp(expression)}\\\\s*:\\\\s*Destroy\\\\s*\\\\(`, \"s\").test(cleanupText);\n}\n\nfunction assignedVariableName(call: SyntaxNode, callback: FunctionInfo): string | null {\n let current = call.parent;\n while (current && !sameNode(current, callback.node)) {\n if (current.type === \"variable_declaration\") {\n const names = declarationNames(current);\n const expressions = declarationExpressions(current);\n const index = expressions.findIndex((expression) => expression.startIndex <= call.startIndex && expression.endIndex >= call.endIndex);\n if (index >= 0) return names[index] ?? names[0] ?? null;\n return names[0] ?? null;\n }\n if (current.type === \"assignment_statement\") {\n const beforeCall = current.text.slice(0, Math.max(0, call.startIndex - current.startIndex));\n const match = beforeCall.match(/^\\s*([A-Za-z_][A-Za-z0-9_]*(?:\\s*\\[[^\\]]+\\]|\\s*\\.[A-Za-z_][A-Za-z0-9_]*)*)\\s*=\\s*$/s);\n const target = match?.[1]?.replace(/\\s+/g, \"\") ?? \"\";\n const root = target.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (root) return root;\n // A call can be nested inside a conditional/table initializer. In that case\n // keep walking so the surrounding variable declaration can own the resource.\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction cleanupIteratesAndDisconnects(cleanupText: string, collection: string): boolean {\n const escaped = escapeRegExp(collection);\n const loops = new RegExp(\n `for\\\\s+[^\\\\n]*?([A-Za-z_][A-Za-z0-9_]*)\\\\s+in\\\\s+${escaped}\\\\s+do([\\\\s\\\\S]*?)end`,\n \"g\",\n );\n for (const match of cleanupText.matchAll(loops)) {\n const item = match[1];\n const body = match[2] ?? \"\";\n if (new RegExp(`\\\\b${escapeRegExp(item)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(body)) return true;\n }\n return false;\n}\n\nfunction cleanupCallsDisposer(cleanupText: string, variable: string): boolean {\n return new RegExp(`(?:^|[^A-Za-z0-9_.:])${escapeRegExp(variable)}\\\\s*\\\\(`, \"s\").test(cleanupText);\n}\n\nfunction isManagedByCleanupContainer(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback.node)) {\n if (current.type === \"function_call\") {\n const path = context.getCallPath(current) ?? \"\";\n if (ALWAYS_MANAGED_METHOD.test(path)) return true;\n if (GENERIC_MANAGER_METHOD.test(path)) {\n const receiver = path.split(\":\", 1)[0] ?? \"\";\n if (MANAGER_ROOT.test(receiver)) return true;\n }\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return false;\n}\n\nfunction localFunctionByName(callback: FunctionInfo, name: string, context: RuleContext): SyntaxNode | null {\n if (!callback.body) return null;\n for (const child of callback.body.namedChildren) {\n if (child.type === \"function_declaration\" && child.childForFieldName(\"name\")?.text === name) return child;\n if (child.type !== \"variable_declaration\") continue;\n const match = child.text.match(new RegExp(`^\\\\s*local\\\\s+${escapeRegExp(name)}\\\\s*=\\\\s*function\\\\b`, \"s\"));\n if (!match) continue;\n return [...context.walk(child)].find((node) => node.type === \"function_definition\") ?? null;\n }\n return null;\n}\n\nfunction cleanupTexts(callback: FunctionInfo, context: RuleContext): string[] {\n if (!callback.body) return [];\n const texts: string[] = [];\n\n for (const node of context.walk(callback.body)) {\n if (node.type !== \"return_statement\") continue;\n if (context.nearestFunction(node) !== callback) continue;\n const expressionList = node.namedChildren.find((child) => child.type === \"expression_list\");\n const returned = expressionList?.namedChildren[0];\n if (!returned) continue;\n if (returned.type === \"function_definition\") {\n texts.push(returned.text);\n continue;\n }\n if (returned.type === \"identifier\") {\n const localFunction = localFunctionByName(callback, returned.text, context);\n if (localFunction) texts.push(localFunction.text);\n }\n }\n\n return texts;\n}\n\nfunction taskCallbackNode(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): SyntaxNode | null {\n const args = context.callArguments(call);\n const candidate = args.find((arg) => arg.type === \"function_definition\");\n if (candidate) return candidate;\n const named = args[0];\n if (named?.type === \"identifier\") return localFunctionByName(callback, named.text, context);\n return null;\n}\n\nfunction cancellationFlagMatches(taskCallback: SyntaxNode | null, cleanupText: string, callback: FunctionInfo): boolean {\n if (!taskCallback || !callback.body) return false;\n const beforeTask = callback.body.text.slice(0, Math.max(0, taskCallback.startIndex - callback.body.startIndex));\n const declarations = [...beforeTask.matchAll(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*false\\b/g)].map((match) => match[1]);\n\n for (const name of declarations) {\n const escaped = escapeRegExp(name);\n if (!new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*true\\\\b`).test(cleanupText)) continue;\n const taskText = taskCallback.text;\n const observesCancellation = new RegExp(`(?:if\\\\s+${escaped}\\\\s+then[\\\\s\\\\S]{0,120}?return|if\\\\s+not\\\\s+${escaped}\\\\s+then|while\\\\s+not\\\\s+${escaped}\\\\b|until\\\\s+${escaped}\\\\b)`, \"s\").test(taskText);\n if (observesCancellation) return true;\n }\n\n return false;\n}\n\nfunction connectionResource(call: SyntaxNode, variable: string | null, label = \"RBXScriptConnection\"): Resource {\n return {\n call,\n label,\n variable,\n cleanupMatches(text, name) {\n return Boolean(\n name\n && (new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(text)\n || cleanupIteratesAndDisconnects(text, name)),\n );\n },\n };\n}\n\nfunction numericTaskDelay(call: SyntaxNode, context: RuleContext): number | null {\n const first = context.callArguments(call)[0]?.text.trim();\n if (!first || !/^-?\\d+(?:\\.\\d+)?$/.test(first)) return null;\n const value = Number(first);\n return Number.isFinite(value) ? value : null;\n}\n\nfunction isCleanupOnlyTask(callbackNode: SyntaxNode | null, context: RuleContext): boolean {\n if (!callbackNode) return false;\n const info = functionInfoForNode(context, callbackNode);\n if (!info?.body) return false;\n const calls = [...context.walk(info.body)].filter((node) => node.type === \"function_call\" && context.nearestFunction(node) === info);\n if (calls.length === 0) return false;\n return calls.every((call) => /:(?:Destroy|Disconnect)$/.test(context.getCallPath(call) ?? \"\"));\n}\n\nfunction taskSeverity(path: string, call: SyntaxNode, taskCallback: SyntaxNode | null, yieldPoint: unknown, context: RuleContext): Severity {\n if (path === \"task.defer\" && !yieldPoint) return \"suggestion\";\n if (path === \"task.delay\" && !yieldPoint) {\n if (isCleanupOnlyTask(taskCallback, context)) return \"suggestion\";\n const delay = numericTaskDelay(call, context);\n if (delay !== null && delay <= 0.25) return \"suggestion\";\n }\n return \"warning\";\n}\n\nfunction cleanupHelp(resources: Resource[], details: string[]): string {\n const labels = new Set(resources.map((resource) => resource.label));\n let action: string;\n\n if (resources.every((resource) => resource.label.includes(\"task\"))) {\n action = \"Cancel the task in returned cleanup if it must stop with the effect.\";\n } else if (labels.size === 1 && labels.has(\"connection/subscription\")) {\n action = \"Disconnect the connection in returned cleanup, or hand it to a cleanup manager.\";\n } else if (labels.size === 1 && [...labels][0]?.endsWith(\" connection\")) {\n action = \"Disconnect the returned connection in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"RenderStep binding\")) {\n action = \"Call UnbindFromRenderStep with the same binding name in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"ContextAction binding\")) {\n action = \"Call UnbindAction with the same action name in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"ContextAction activation binding\")) {\n action = \"Call UnbindActivate with the same input type in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"React root\")) {\n action = \"Unmount the root in cleanup.\";\n } else {\n action = \"Release the owned resources in returned cleanup.\";\n }\n\n return `${details.length > 0 ? `${details.join(\" \")} ` : \"\"}${action}`;\n}\n\nfunction cleanupFixPreview(resources: Resource[], context: RuleContext): FixPreview | undefined {\n const labels = new Set(resources.map((resource) => resource.label));\n const first = resources[0];\n if (!first) return undefined;\n\n if (labels.size === 1 && labels.has(\"RenderStep binding\")) {\n const bindingName = context.callArguments(first.call)[0]?.text.trim() ?? '\"RenderStepName\"';\n return {\n kind: \"pattern\",\n before: `RunService:BindToRenderStep(${bindingName}, priority, onStep)`,\n after: `RunService:BindToRenderStep(${bindingName}, priority, onStep)\n\nreturn function()\n\tRunService:UnbindFromRenderStep(${bindingName})\nend`,\n note: \"Unbind the same RenderStep name when the effect reruns or unmounts.\",\n };\n }\n\n if ([...labels].every((label) => label.includes(\"task\"))) {\n const path = context.resolveCallPath(context.getCallPath(first.call) ?? \"task.delay\");\n const taskCall = path === \"task.defer\"\n ? `task.defer(function()\n\tdoWork()\nend)`\n : path === \"task.spawn\"\n ? `task.spawn(function()\n\tdoWork()\nend)`\n : `task.delay(delaySeconds, function()\n\tdoWork()\nend)`;\n return {\n kind: \"pattern\",\n before: taskCall,\n after: `local thread = ${taskCall}\n\nreturn function()\n\ttask.cancel(thread)\nend`,\n note: \"Cancel scheduled work only when it must not outlive this effect. Short fire-and-forget work may intentionally remain uncancelled.\",\n };\n }\n\n if (labels.size === 1 && labels.has(\"ContextAction binding\")) {\n return {\n kind: \"pattern\",\n before: `ContextActionService:BindAction(actionName, onAction, false, inputType)`,\n after: `ContextActionService:BindAction(actionName, onAction, false, inputType)\n\nreturn function()\n\tContextActionService:UnbindAction(actionName)\nend`,\n note: \"Unbind the same action name in the effect cleanup.\",\n };\n }\n\n if (labels.size === 1 && labels.has(\"React root\")) {\n return {\n kind: \"pattern\",\n before: `local root = ReactRoblox.createRoot(container)`,\n after: `local root = ReactRoblox.createRoot(container)\n\nreturn function()\n\troot:unmount()\nend`,\n note: \"Unmount roots created by the effect when ownership ends.\",\n };\n }\n\n return {\n kind: \"pattern\",\n before: `local connection = signal:Connect(onChanged)`,\n after: `local connection = signal:Connect(onChanged)\n\nreturn function()\n\tconnection:Disconnect()\nend`,\n note: \"Return cleanup from the same effect that acquires the resource.\",\n };\n}\n\nfunction classifyResource(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): Resource | null {\n const rawPath = context.getCallPath(call) ?? \"\";\n const path = context.resolveCallPath(rawPath);\n const variable = assignedVariableName(call, callback);\n const finalMember = path.split(/[.:]/).at(-1) ?? path;\n\n if (/:Connect$/.test(rawPath)) {\n const ownerExpression = connectionOwnerExpression(rawPath);\n const ownerIsInstance = isProvenInstanceExpression(ownerExpression, call, context, callback);\n return {\n call,\n label: \"connection/subscription\",\n variable,\n cleanupMatches(text, name) {\n if (name && new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(text)) return true;\n if (name && cleanupIteratesAndDisconnects(text, name)) return true;\n // Custom Signal/Iris-style Connect APIs may return a disposer function instead of RBXScriptConnection.\n if (name && cleanupCallsDisposer(text, name)) return true;\n return Boolean(ownerIsInstance && ownerExpression && cleanupDestroysExpression(text, ownerExpression));\n },\n };\n }\n\n if (CONNECTION_RETURNING_METHODS.has(finalMember)) {\n return connectionResource(call, variable, `${finalMember} connection`);\n }\n\n if (/BindToRenderStep$/.test(rawPath)) {\n const bindingName = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"RenderStep binding\",\n variable,\n cleanupMatches(text) {\n if (!/UnbindFromRenderStep\\s*\\(/.test(text)) return false;\n if (!bindingName) return true;\n return new RegExp(`UnbindFromRenderStep\\\\s*\\\\(\\\\s*${escapeRegExp(bindingName)}\\\\s*\\\\)`).test(text);\n },\n };\n }\n\n if (/:BindAction(?:AtPriority)?$/.test(rawPath)) {\n const actionName = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"ContextAction binding\",\n variable,\n cleanupMatches(text) {\n if (/:UnbindAllActions\\s*\\(/.test(text)) return true;\n if (!/:UnbindAction\\s*\\(/.test(text)) return false;\n if (!actionName) return true;\n return new RegExp(`:UnbindAction\\\\s*\\\\(\\\\s*${escapeRegExp(actionName)}\\\\s*\\\\)`).test(text);\n },\n };\n }\n\n if (/:BindActivate$/.test(rawPath)) {\n const inputType = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"ContextAction activation binding\",\n variable,\n cleanupMatches(text) {\n if (!/:UnbindActivate\\s*\\(/.test(text)) return false;\n if (!inputType) return true;\n return new RegExp(`:UnbindActivate\\\\s*\\\\(\\\\s*${escapeRegExp(inputType)}(?:\\\\s*,|\\\\s*\\\\))`).test(text);\n },\n };\n }\n\n if (path === \"ReactRoblox.createRoot\") {\n return {\n call,\n label: \"React root\",\n variable,\n cleanupMatches(text, name) {\n return Boolean(name && new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*unmount\\\\s*\\\\(`, \"i\").test(text));\n },\n };\n }\n\n if (path === \"task.delay\" || path === \"task.defer\" || path === \"task.spawn\") {\n const taskCallback = taskCallbackNode(call, context, callback);\n const yieldPoint = taskCallback ? functionYieldPoint(taskCallback, context) : null;\n const outlivesEffect = path !== \"task.spawn\" || Boolean(yieldPoint);\n if (!outlivesEffect) return null;\n\n return {\n call,\n label: path === \"task.spawn\" ? \"yielding spawned task\" : path === \"task.defer\" ? \"deferred task\" : \"delayed task\",\n detail: yieldPoint ? `The task can outlive the effect because it yields at ${yieldPoint.reason}.` : \"The task is scheduled to run after the effect callback can finish.\",\n severity: taskSeverity(path, call, taskCallback, yieldPoint, context),\n variable,\n cleanupMatches(text, name) {\n if (name) {\n const escaped = escapeRegExp(name);\n if (new RegExp(`task\\\\.cancel\\\\s*\\\\(\\\\s*${escaped}\\\\s*\\\\)`).test(text)) return true;\n if (new RegExp(`p?call\\\\s*\\\\(\\\\s*task\\\\.cancel\\\\s*,\\\\s*${escaped}\\\\s*\\\\)`).test(text)) return true;\n }\n return cancellationFlagMatches(taskCallback, text, callback);\n },\n };\n }\n\n return null;\n}\n\nexport const effectNeedsCleanup: RuleDefinition = {\n id: \"react-luau/effect-needs-cleanup\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Effects that create owned resources or outliving tasks should return matching cleanup.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (path !== \"React.useEffect\" && path !== \"React.useLayoutEffect\") continue;\n\n const callbackNode = firstFunctionArgument(context, call);\n const callback = functionInfoForNode(context, callbackNode);\n if (!callbackNode || !callback) continue;\n const cleanup = cleanupTexts(callback, context);\n const missing: Resource[] = [];\n\n for (const candidate of context.walk(callbackNode)) {\n if (candidate.type !== \"function_call\") continue;\n if (context.nearestFunction(candidate) !== callback) continue;\n if (isManagedByCleanupContainer(candidate, context, callback)) continue;\n const resource = classifyResource(candidate, context, callback);\n if (!resource) continue;\n if (cleanup.some((text) => resource.cleanupMatches(text, resource.variable, resource.call))) continue;\n missing.push(resource);\n }\n\n if (missing.length === 0) continue;\n const labels = [...new Set(missing.map((resource) => resource.label))];\n const details = [...new Set(missing.map((resource) => resource.detail).filter((detail): detail is string => Boolean(detail)))];\n const severityRank: Record<Severity, number> = { suggestion: 0, warning: 1, error: 2 };\n const severity = missing.reduce<Severity>(\n (highest, resource) => severityRank[resource.severity ?? \"warning\"] > severityRank[highest] ? resource.severity ?? \"warning\" : highest,\n \"suggestion\",\n );\n const highlights = missing.map((resource) => callNameNode(resource.call));\n diagnostics.push({\n node: highlights[0],\n highlights,\n severity,\n message: `Effect creates ${labels.join(\", \")} without matching returned cleanup.`,\n help: cleanupHelp(missing, details),\n fixPreview: cleanupFixPreview(missing, context),\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
24
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { nodeKey, rootIdentifier } from \"../ast/walk\";\nimport {\n callNameNode,\n containsUnshadowedIdentifier,\n dependencyExpressions,\n functionInfoForNode,\n isEffectPath,\n parseDependencyRoots,\n stateBindingsFor,\n} from \"./helpers\";\n\nconst HOOKS_WITH_DEPS = new Set([\n \"React.useEffect\",\n \"React.useLayoutEffect\",\n \"React.useMemo\",\n \"React.useCallback\",\n \"React.useImperativeHandle\",\n]);\n\nfunction ownerForHook(context: RuleContext, call: SyntaxNode): FunctionInfo | null {\n const owner = context.nearestFunction(call);\n return owner && (owner.isComponent || owner.isHook) ? owner : null;\n}\n\nfunction callbackAndDeps(context: RuleContext, call: SyntaxNode): { callback: SyntaxNode; deps: SyntaxNode } | null {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const args = context.callArguments(call);\n if (path === \"React.useImperativeHandle\") {\n const callback = args[1];\n const deps = args[2];\n if (callback?.type === \"function_definition\" && deps?.type === \"table_constructor\") return { callback, deps };\n return null;\n }\n const callback = args[0];\n const deps = args[1];\n if (callback?.type === \"function_definition\" && deps?.type === \"table_constructor\") return { callback, deps };\n return null;\n}\n\nfunction directTopLevelCalls(context: RuleContext, callback: SyntaxNode): SyntaxNode[] {\n const info = functionInfoForNode(context, callback);\n if (!info?.body) return [];\n return info.body.namedChildren.filter((child) => child.type === \"function_call\");\n}\n\nfunction hasCall(node: SyntaxNode, context: RuleContext): boolean {\n for (const child of context.walk(node)) {\n if (child.type === \"function_call\") return true;\n }\n return false;\n}\n\nfunction hasExternalSubscription(node: SyntaxNode, context: RuleContext): boolean {\n for (const child of context.walk(node)) {\n if (child.type !== \"function_call\") continue;\n const path = context.getCallPath(child) ?? \"\";\n if (/:Connect$/.test(path) || /BindToRenderStep$/.test(path) || /:BindAction(?:AtPriority)?$/.test(path)) return true;\n }\n return false;\n}\n\nfunction directLocalInitializer(owner: FunctionInfo, name: string): SyntaxNode | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const assignment = statement.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variableList = assignment?.namedChildren.find((child) => child.type === \"variable_list\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variableList?.namedChildren.filter((child) => child.type === \"identifier\") ?? [];\n const expressions = expressionList?.namedChildren ?? [];\n const index = names.findIndex((child) => child.text === name);\n if (index >= 0) return expressions[index] ?? expressions[0] ?? null;\n }\n return null;\n}\n\nfunction setterCalledOutsideCallback(context: RuleContext, owner: FunctionInfo, callback: SyntaxNode, setterName: string): boolean {\n if (!owner.body) return false;\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"function_call\" || context.getCallPath(node) !== setterName) continue;\n if (node.startIndex >= callback.startIndex && node.endIndex <= callback.endIndex) continue;\n return true;\n }\n return false;\n}\n\nfunction freshDependencyKind(node: SyntaxNode, owner: FunctionInfo): string | null {\n if (node.type === \"table_constructor\") return \"table\";\n if (node.type === \"function_definition\") return \"function\";\n\n if (node.type === \"identifier\") {\n const initializer = directLocalInitializer(owner, node.text);\n if (initializer?.type === \"table_constructor\") return \"table\";\n if (initializer?.type === \"function_definition\") return \"function\";\n }\n\n return null;\n}\n\nexport const noDerivedStateEffect: RuleDefinition = {\n id: \"react-luau/no-derived-state-effect\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Avoid copying render-known derived values into state from an effect.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!isEffectPath(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n if (hasExternalSubscription(parts.callback, context)) continue;\n const available = context.model.componentLocals.get(nodeKey(owner.node)) ?? new Set(owner.parameters);\n const bindings = stateBindingsFor(context, owner);\n const setterToValue = new Map(bindings.map((binding) => [binding.setterName, binding.valueName]));\n\n for (const setterCall of directTopLevelCalls(context, parts.callback)) {\n const setter = context.getCallPath(setterCall) ?? \"\";\n const targetState = setterToValue.get(setter);\n if (!targetState) continue;\n // If the setter is also used by handlers or other effects, the state has independent\n // ownership and is not merely a render-known derived copy.\n if (setterCalledOutsideCallback(context, owner, parts.callback, setter)) continue;\n const argument = context.callArguments(setterCall)[0];\n if (!argument || argument.type === \"function_definition\" || hasCall(argument, context)) continue;\n\n const sourceNames = [...available].filter((name) => name !== targetState && containsUnshadowedIdentifier(argument, name, context, owner));\n if (sourceNames.length === 0) continue;\n\n diagnostics.push({\n node: callNameNode(setterCall),\n message: `${setter}() stores a value derived from ${sourceNames.slice(0, 3).join(\", \")} inside an effect.`,\n help: \"Compute the value during render when it is fully derived from render-known inputs.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noSelfUpdatingEffect: RuleDefinition = {\n id: \"react-luau/no-self-updating-effect\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Effects should not unconditionally update state that is also one of their dependencies.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!isEffectPath(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n const deps = parseDependencyRoots(parts.deps);\n\n for (const binding of stateBindingsFor(context, owner)) {\n if (!deps.has(binding.valueName)) continue;\n for (const setterCall of directTopLevelCalls(context, parts.callback)) {\n if (context.getCallPath(setterCall) !== binding.setterName) continue;\n diagnostics.push({\n node: callNameNode(setterCall),\n message: `${binding.setterName}() updates ${binding.valueName}, which is also in this effect's dependency table.`,\n help: \"Guard the update so it converges, move it to the originating event, or derive the value during render.\",\n });\n }\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noEffectWithFreshDeps: RuleDefinition = {\n id: \"react-luau/no-effect-with-fresh-deps\",\n category: \"Hooks\",\n severity: \"error\",\n description: \"Dependency tables should not contain tables or functions recreated on every render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!HOOKS_WITH_DEPS.has(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n\n for (const dependency of dependencyExpressions(parts.deps)) {\n const kind = freshDependencyKind(dependency, owner);\n if (!kind) continue;\n const label = dependency.type === \"identifier\" ? ` ${dependency.text}` : \"\";\n diagnostics.push({\n node: dependency,\n message: `${path} depends on${label || \" an inline value\"} that is a new ${kind} on every render.`,\n help: \"Move the value inside the hook callback and depend on its simple inputs, or intentionally stabilize the value with useMemo/useCallback when identity is part of the contract.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noMutableInDeps: RuleDefinition = {\n id: \"react-luau/no-mutable-in-deps\",\n category: \"Hooks\",\n severity: \"error\",\n description: \"Mutable ref.current values do not belong in hook dependency tables.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!HOOKS_WITH_DEPS.has(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n const refs = context.model.refVariablesByFunction.get(nodeKey(owner.node)) ?? new Set<string>();\n\n for (const dependency of dependencyExpressions(parts.deps)) {\n const root = rootIdentifier(dependency.text);\n if (!root || !refs.has(root)) continue;\n if (!new RegExp(`^${root.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\s*\\\\.\\\\s*current\\\\b`).test(dependency.text.trim())) continue;\n diagnostics.push({\n node: dependency,\n message: `${dependency.text.trim()} is mutable ref state and will not itself trigger a React render when it changes.`,\n help: \"Read ref.current inside the hook body. Depend on reactive inputs that actually cause renders instead of listing the mutable current value.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
25
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { nodeKey, normalizeExpressionText, rootIdentifier, sameNode } from \"../ast/walk\";\nimport { mutableDependencyBase } from \"../roblox-semantics\";\nimport { declarationNames, dependencyExpressions, tableStartNode } from \"./helpers\";\n\nconst GLOBALS = new Set([\n \"game\", \"workspace\", \"script\", \"shared\", \"Enum\", \"Instance\", \"task\", \"coroutine\", \"debug\", \"os\", \"utf8\", \"buffer\", \"bit32\",\n \"math\", \"string\", \"table\", \"pairs\", \"ipairs\", \"next\", \"pcall\", \"xpcall\", \"print\", \"warn\", \"error\", \"assert\", \"type\", \"typeof\",\n \"tonumber\", \"tostring\", \"select\", \"unpack\", \"rawget\", \"rawset\", \"rawequal\", \"setmetatable\", \"getmetatable\", \"Vector2\", \"Vector3\", \"UDim\",\n \"UDim2\", \"CFrame\", \"Color3\", \"BrickColor\", \"Rect\", \"Region3\", \"Ray\", \"TweenInfo\", \"NumberRange\", \"NumberSequence\", \"ColorSequence\",\n \"DateTime\", \"Random\", \"Axes\", \"Faces\", \"PhysicalProperties\", \"RaycastParams\", \"OverlapParams\", \"DockWidgetPluginGuiInfo\",\n]);\n\nconst HOOK_ARGUMENTS = new Map<string, { callbackIndex: number; depsIndex: number }>([\n [\"React.useEffect\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useLayoutEffect\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useMemo\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useCallback\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useImperativeHandle\", { callbackIndex: 1, depsIndex: 2 }],\n]);\n\nfunction parameterNames(functionNode: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const parameters = functionNode.childForFieldName(\"parameters\");\n if (!parameters) return names;\n for (const node of parameters.namedChildren) {\n for (const candidate of descendants(node)) {\n if (candidate.type === \"identifier\") names.add(candidate.text);\n }\n }\n return names;\n}\n\nfunction* descendants(node: SyntaxNode): Iterable<SyntaxNode> {\n yield node;\n for (const child of node.namedChildren) yield* descendants(child);\n}\n\nfunction directBlockBindingNames(block: SyntaxNode, beforeIndex: number): Set<string> {\n const names = new Set<string>();\n for (const child of block.namedChildren) {\n if (child.startIndex >= beforeIndex) continue;\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) names.add(name);\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) names.add(name);\n }\n }\n return names;\n}\n\nfunction loopBindingNames(loop: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const header = loop.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const numeric = header.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) names.add(numeric[1]);\n const generic = header.match(/^\\s*for\\s+(.+?)\\s+in\\b/s);\n if (generic) {\n for (const part of generic[1].split(\",\")) {\n const name = part.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (name) names.add(name);\n }\n }\n return names;\n}\n\nfunction isLocallyBoundOccurrence(identifier: SyntaxNode, callback: SyntaxNode, name: string): boolean {\n if (parameterNames(callback).has(name)) return true;\n\n let current = identifier.parent;\n while (current && !sameNode(current, callback)) {\n if ((current.type === \"function_definition\" || current.type === \"function_declaration\") && parameterNames(current).has(name)) {\n return true;\n }\n if (current.type === \"block\" && directBlockBindingNames(current, identifier.startIndex).has(name)) return true;\n if (current.type === \"for_statement\" && loopBindingNames(current).has(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (!parent) return false;\n if (parent.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent.type === \"method_index_expression\") return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n // `fieldName = value` uses fieldName as a table key, not as a captured value.\n // Without this, a coincidentally named component local can create a fake dep.\n if (parent.type === \"field\" && !parent.text.trim().startsWith(\"[\")) {\n return sameNode(parent.childForFieldName(\"name\"), node);\n }\n return false;\n}\n\nfunction outermostDotPath(node: SyntaxNode): boolean {\n const parent = node.parent;\n return !(parent?.type === \"dot_index_expression\" && sameNode(parent.namedChildren[0], node));\n}\n\nfunction rootIdentifierNode(node: SyntaxNode, root: string): SyntaxNode | null {\n for (const candidate of descendants(node)) {\n if (candidate.type !== \"identifier\" || candidate.text !== root) continue;\n if (isPropertyName(candidate)) continue;\n return candidate;\n }\n return null;\n}\n\nfunction normalizeCapturedPath(\n path: string,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n): string | null {\n const normalized = normalizeExpressionText(path);\n const root = rootIdentifier(normalized);\n if (!root) return normalized;\n\n const mutableBase = mutableDependencyBase(normalized, externallyMutableRoots);\n if (mutableBase === \"\") return null;\n if (mutableBase) {\n const baseRoot = rootIdentifier(mutableBase);\n if (baseRoot && stableVariables.has(baseRoot)) return null;\n return mutableBase;\n }\n\n return normalized;\n}\n\nfunction capturedDependencyPaths(\n callback: SyntaxNode,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n): Set<string> {\n const captured = new Set<string>();\n\n for (const node of descendants(callback)) {\n if (node.type === \"dot_index_expression\" && outermostDotPath(node)) {\n const root = rootIdentifier(node.text);\n if (!root || !available.has(root) || GLOBALS.has(root) || stableVariables.has(root)) continue;\n const rootNode = rootIdentifierNode(node, root);\n if (!rootNode || isLocallyBoundOccurrence(rootNode, callback, root)) continue;\n const capture = normalizeCapturedPath(node.text, stableVariables, externallyMutableRoots);\n if (capture) captured.add(capture);\n continue;\n }\n\n if (node.type !== \"identifier\" || isPropertyName(node)) continue;\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.namedChildren[0], node)) continue;\n const name = node.text;\n if (!available.has(name) || GLOBALS.has(name) || stableVariables.has(name)) continue;\n if (isLocallyBoundOccurrence(node, callback, name)) continue;\n captured.add(name);\n }\n\n return captured;\n}\n\nfunction localFunctionNode(owner: FunctionInfo, name: string, context: RuleContext): SyntaxNode | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type === \"function_declaration\" && statement.childForFieldName(\"name\")?.text === name) return statement;\n if (statement.type !== \"variable_declaration\" || !declarationNames(statement).includes(name)) continue;\n const prefix = statement.text.split(\"=\", 1)[0] ?? \"\";\n if (!new RegExp(`\\b${name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\b`).test(prefix)) continue;\n const fn = [...context.walk(statement)].find((node) => node.type === \"function_definition\");\n if (fn) return fn;\n }\n return null;\n}\n\nfunction expandLocalFunctionCaptures(\n captured: Set<string>,\n owner: FunctionInfo,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n context: RuleContext,\n): Set<string> {\n const result = new Set<string>();\n const visiting = new Set<string>();\n\n const addCapture = (capture: string): void => {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(capture)) {\n result.add(capture);\n return;\n }\n const fn = localFunctionNode(owner, capture, context);\n if (visiting.has(capture)) return;\n if (!fn) {\n result.add(capture);\n return;\n }\n\n visiting.add(capture);\n const inner = capturedDependencyPaths(fn, available, stableVariables, externallyMutableRoots);\n for (const dependency of inner) addCapture(dependency);\n visiting.delete(capture);\n };\n\n for (const capture of captured) addCapture(capture);\n return result;\n}\n\nfunction dependencyPaths(node: SyntaxNode): Set<string> {\n return new Set(dependencyExpressions(node).map((dependency) => normalizeExpressionText(dependency.text)));\n}\n\nconst PURE_DERIVED_CALL = /^(?:math\\.(?!random(?:seed)?$)[A-Za-z_][A-Za-z0-9_]*|string\\.[A-Za-z_][A-Za-z0-9_]*|table\\.(?:find|concat|clone|create|isfrozen)|(?:Color3|Vector2|Vector3|UDim|UDim2|CFrame|BrickColor|Rect|NumberRange|NumberSequence|ColorSequence|TweenInfo|Font|Ray|Region3|PhysicalProperties)\\.[A-Za-z_][A-Za-z0-9_]*|[^:]+:(?:ToHSV|Lerp|Dot|Cross|FuzzyEq|Inverse|ToObjectSpace|ToWorldSpace))$/;\n\nfunction isPureDerivedExpression(node: SyntaxNode, context: RuleContext): boolean {\n for (const candidate of context.walk(node)) {\n if (candidate !== node && (candidate.type === \"function_definition\" || candidate.type === \"function_declaration\")) return false;\n if (candidate.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(candidate);\n if (!rawPath) return false;\n const path = normalizeExpressionText(context.resolveCallPath(rawPath));\n if (!PURE_DERIVED_CALL.test(path)) return false;\n }\n return true;\n}\n\nfunction mutatedOwnerLocals(owner: FunctionInfo, context: RuleContext): Set<string> {\n const mutated = new Set<string>();\n if (!owner.body) return mutated;\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"assignment_statement\" && node.type !== \"update_statement\") continue;\n if (node.parent?.type === \"variable_declaration\") continue;\n const variables = node.namedChildren.find((child) => child.type === \"variable_list\");\n if (!variables) continue;\n for (const variable of variables.namedChildren) {\n const root = rootIdentifier(normalizeExpressionText(variable.text));\n if (root) mutated.add(root);\n }\n }\n\n return mutated;\n}\n\nfunction derivedLocalDependencies(\n owner: FunctionInfo,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n context: RuleContext,\n): Map<string, Set<string>> {\n const derived = new Map<string, Set<string>>();\n if (!owner.body) return derived;\n const mutated = mutatedOwnerLocals(owner, context);\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || mutated.has(name) || !isPureDerivedExpression(expression, context)) continue;\n derived.set(name, capturedDependencyPaths(expression, available, stableVariables, externallyMutableRoots));\n }\n }\n\n return derived;\n}\n\nfunction expandDerivedLocalCaptures(\n captured: Set<string>,\n derived: Map<string, Set<string>>,\n dependencies: Set<string>,\n): Set<string> {\n const result = new Set<string>();\n const visiting = new Set<string>();\n\n const addCapture = (capture: string): void => {\n if (dependencySatisfies(capture, dependencies)) {\n result.add(capture);\n return;\n }\n const root = rootIdentifier(capture);\n if (!root || !derived.has(root)) {\n result.add(capture);\n return;\n }\n if (visiting.has(root)) return;\n\n visiting.add(root);\n for (const dependency of derived.get(root) ?? []) addCapture(dependency);\n visiting.delete(root);\n };\n\n for (const capture of captured) addCapture(capture);\n return result;\n}\n\nfunction hasDynamicUnpackDependencies(node: SyntaxNode, context: RuleContext): boolean {\n for (const dependency of dependencyExpressions(node)) {\n for (const candidate of context.walk(dependency)) {\n if (candidate.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(candidate);\n if (!rawPath) continue;\n const path = normalizeExpressionText(context.resolveCallPath(rawPath));\n if (path === \"unpack\" || path === \"table.unpack\") return true;\n }\n }\n return false;\n}\n\nfunction memoizedProducerDependencies(owner: FunctionInfo, context: RuleContext): Map<string, Set<string>> {\n const producers = new Map<string, Set<string>>();\n if (!owner.body) return producers;\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || expression.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(expression);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (path !== \"React.useMemo\" && path !== \"React.useCallback\") continue;\n const args = context.callArguments(expression);\n const deps = args[1];\n if (!deps || deps.type !== \"table_constructor\" || hasDynamicUnpackDependencies(deps, context)) continue;\n producers.set(name, dependencyPaths(deps));\n }\n }\n\n return producers;\n}\n\nfunction isTransitivelyCoveredMemoizedValue(\n dependency: string,\n producers: Map<string, Set<string>>,\n dependencies: Set<string>,\n): boolean {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(dependency)) return false;\n const producerDependencies = producers.get(dependency);\n if (!producerDependencies) return false;\n return [...producerDependencies].every((producerDependency) => dependencySatisfies(producerDependency, dependencies));\n}\n\nfunction dependencySatisfies(captured: string, dependencies: Set<string>): boolean {\n for (const dependency of dependencies) {\n if (captured === dependency) return true;\n if (captured.startsWith(`${dependency}.`) || captured.startsWith(`${dependency}[`)) return true;\n }\n return false;\n}\n\nfunction minimalMissingDependencies(captured: Set<string>, dependencies: Set<string>): string[] {\n const missing = [...captured]\n .filter((name) => !dependencySatisfies(name, dependencies))\n .sort((left, right) => left.length - right.length || left.localeCompare(right));\n const result: string[] = [];\n for (const candidate of missing) {\n if (dependencySatisfies(candidate, new Set(result))) continue;\n result.push(candidate);\n }\n return result.sort();\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction directCallsInExpression(node: SyntaxNode): SyntaxNode[] {\n const calls: SyntaxNode[] = [];\n const pending = [node];\n while (pending.length > 0) {\n const current = pending.pop()!;\n if (current !== node && (current.type === \"function_definition\" || current.type === \"function_declaration\")) continue;\n if (current.type === \"function_call\") calls.push(current);\n pending.push(...current.namedChildren);\n }\n return calls;\n}\n\nfunction isCustomHookCall(call: SyntaxNode, context: RuleContext): boolean {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return !path.startsWith(\"React.\") && /^use[A-Z0-9_]/.test(final);\n}\n\ninterface CustomHookDependencyHints {\n memberHandleRoots: Set<string>;\n likelyHandleRoots: Set<string>;\n compositeHandleRoots: Set<string>;\n}\n\nconst HANDLE_VALUE_NAME = /(?:ref|binding|tween|spring|motion|animation|controller|handle|connection|signal)$/i;\nconst HANDLE_HOOK_NAME = /(?:Tween|Spring|Binding|Motion|Animated|Animation|Sound)$/i;\n\nfunction isCalledAsFunction(owner: FunctionInfo, name: string, context: RuleContext): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const path = normalizeExpressionText(context.getCallPath(call) ?? \"\");\n if (path === name) return true;\n }\n return false;\n}\n\nfunction customHookDependencyHints(owner: FunctionInfo, context: RuleContext): CustomHookDependencyHints {\n const hints: CustomHookDependencyHints = {\n memberHandleRoots: new Set<string>(),\n likelyHandleRoots: new Set<string>(),\n compositeHandleRoots: new Set<string>(),\n };\n if (!owner.body) return hints;\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression) continue;\n const calls = directCallsInExpression(expression);\n if (calls.length === 0) continue;\n\n const directHook = calls.find((call) => isCustomHookCall(call, context));\n if (directHook && expression.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(directHook) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n const likelyHandle = HANDLE_VALUE_NAME.test(name) || HANDLE_HOOK_NAME.test(final) || isCalledAsFunction(owner, name, context);\n if (likelyHandle) {\n hints.memberHandleRoots.add(name);\n hints.likelyHandleRoots.add(name);\n }\n continue;\n }\n\n if (expression.type === \"table_constructor\") {\n const meaningfulCalls = calls.filter((call) => {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n return !/^(?:Color3|Vector2|Vector3|UDim|UDim2|CFrame|TweenInfo|NumberSequence|ColorSequence)\\./.test(path);\n });\n const allHandleHooks = meaningfulCalls.length > 0 && meaningfulCalls.every((call) => {\n if (!isCustomHookCall(call, context)) return false;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return HANDLE_HOOK_NAME.test(final);\n });\n if (allHandleHooks) hints.compositeHandleRoots.add(name);\n }\n }\n }\n\n return hints;\n}\n\nfunction isAmbiguousCustomHookHandle(dependency: string, hints: CustomHookDependencyHints): boolean {\n const root = rootIdentifier(dependency);\n if (!root) return false;\n if (hints.compositeHandleRoots.has(root)) return true;\n if (hints.likelyHandleRoots.has(root)) return true;\n return hints.memberHandleRoots.has(root) && dependency !== root;\n}\n\n\nexport const exhaustiveDeps: RuleDefinition = {\n id: \"react-luau/exhaustive-deps\",\n category: \"Hooks\",\n severity: \"warning\",\n description: \"React hook dependency tables should include captured reactive render values.\",\n run(context: RuleContext) {\n const diagnostics: DiagnosticInput[] = [];\n const derivedDependenciesByOwner = new Map<number, Map<string, Set<string>>>();\n const dependencyHintsByOwner = new Map<number, CustomHookDependencyHints>();\n const memoizedProducersByOwner = new Map<number, Map<string, Set<string>>>();\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n const shape = HOOK_ARGUMENTS.get(path);\n if (!shape) continue;\n\n const args = context.callArguments(call);\n const callback = args[shape.callbackIndex];\n const deps = args[shape.depsIndex];\n if (!callback || callback.type !== \"function_definition\" || !deps || deps.type !== \"table_constructor\") continue;\n\n const owner = context.nearestFunction(call);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const ownerKey = nodeKey(owner.node);\n const available = context.model.componentLocals.get(ownerKey) ?? new Set<string>();\n const stableVariables = context.model.stableVariablesByFunction.get(ownerKey) ?? new Set<string>();\n const externallyMutableRoots = context.model.externalMutableVariablesByFunction.get(ownerKey) ?? new Set<string>();\n const functionExpandedCaptures = expandLocalFunctionCaptures(\n capturedDependencyPaths(callback, available, stableVariables, externallyMutableRoots),\n owner,\n available,\n stableVariables,\n externallyMutableRoots,\n context,\n );\n const dependencies = dependencyPaths(deps);\n let derivedDependencies = derivedDependenciesByOwner.get(ownerKey);\n if (!derivedDependencies) {\n derivedDependencies = derivedLocalDependencies(owner, available, stableVariables, externallyMutableRoots, context);\n derivedDependenciesByOwner.set(ownerKey, derivedDependencies);\n }\n const captured = expandDerivedLocalCaptures(\n functionExpandedCaptures,\n derivedDependencies,\n dependencies,\n );\n const missing = minimalMissingDependencies(captured, dependencies);\n if (missing.length === 0) continue;\n\n if (hasDynamicUnpackDependencies(deps, context)) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} uses dynamic unpack(...) dependencies, so exhaustive dependency analysis is partial.`,\n help: \"The analyzer cannot prove which values unpack(...) contributes. Review the explicit dependencies and the custom hook contract.\",\n });\n continue;\n }\n\n let hints = dependencyHintsByOwner.get(ownerKey);\n if (!hints) {\n hints = customHookDependencyHints(owner, context);\n dependencyHintsByOwner.set(ownerKey, hints);\n }\n let memoizedProducers = memoizedProducersByOwner.get(ownerKey);\n if (!memoizedProducers) {\n memoizedProducers = memoizedProducerDependencies(owner, context);\n memoizedProducersByOwner.set(ownerKey, memoizedProducers);\n }\n const uncertainHandles = missing.filter((dependency) => isAmbiguousCustomHookHandle(dependency, hints));\n const transitivelyCoveredMemoized = missing.filter((dependency) =>\n !isAmbiguousCustomHookHandle(dependency, hints)\n && isTransitivelyCoveredMemoizedValue(dependency, memoizedProducers, dependencies)\n );\n const reactiveMissing = missing.filter((dependency) =>\n !isAmbiguousCustomHookHandle(dependency, hints)\n && !isTransitivelyCoveredMemoizedValue(dependency, memoizedProducers, dependencies)\n );\n\n if (reactiveMissing.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n message: `${path} dependency table is missing ${reactiveMissing.join(\", \")}.`,\n help: `Add ${reactiveMissing.join(\", \")} to the dependency table, or stop capturing ${reactiveMissing.length === 1 ? \"that value\" : \"those values\"} in the callback.`,\n });\n }\n\n if (transitivelyCoveredMemoized.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} captures memoized value ${transitivelyCoveredMemoized.join(\", \")} without listing ${transitivelyCoveredMemoized.length === 1 ? \"it directly\" : \"them directly\"}, but ${transitivelyCoveredMemoized.length === 1 ? \"its memo dependencies are\" : \"their memo dependencies are\"} already covered.`,\n help: \"The producing memo dependencies are already covered. Listing the memoized value directly can make the dependency relationship clearer.\",\n });\n }\n\n if (uncertainHandles.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} captures custom-hook handle ${uncertainHandles.join(\", \")} without listing ${uncertainHandles.length === 1 ? \"it as a dependency\" : \"them as dependencies\"}.`,\n help: \"The analyzer cannot prove this custom-hook return is stable. Check the hook contract before changing the dependency table.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
26
|
-
"import type {
|
|
19
|
+
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Language, Parser } from \"web-tree-sitter\";\nimport type { SyntaxTree } from \"./syntax\";\nimport { parserCompatibleSource } from \"./parser-compat\";\n\nlet parserPromise: Promise<Parser> | null = null;\n\nasync function createParser(): Promise<Parser> {\n await Parser.init();\n const grammarPath = path.resolve(import.meta.dir, \"../vendor/tree-sitter-luau.wasm\");\n const grammar = new Uint8Array(fs.readFileSync(grammarPath));\n const language = await Language.load(grammar);\n const parser = new Parser();\n parser.setLanguage(language);\n return parser;\n}\n\nasync function getParser(): Promise<Parser> {\n parserPromise ??= createParser();\n return parserPromise;\n}\n\nexport async function parseLuau(source: string): Promise<SyntaxTree> {\n const parser = await getParser();\n const tree = parser.parse(parserCompatibleSource(source));\n if (!tree) throw new Error(\"Tree-sitter failed to parse Luau source\");\n return tree;\n}\n",
|
|
20
|
+
"interface BracketDepth {\n parentheses: number;\n brackets: number;\n braces: number;\n}\n\ninterface Range {\n start: number;\n end: number;\n}\n\nfunction scanTypeLine(text: string, depth: BracketDepth): void {\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n const next = text[index + 1];\n\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n\n if (char === \"\\\"\" || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"-\" && next === \"-\") break;\n\n if (char === \"(\") depth.parentheses += 1;\n else if (char === \")\") depth.parentheses = Math.max(0, depth.parentheses - 1);\n else if (char === \"[\") depth.brackets += 1;\n else if (char === \"]\") depth.brackets = Math.max(0, depth.brackets - 1);\n else if (char === \"{\") depth.braces += 1;\n else if (char === \"}\") depth.braces = Math.max(0, depth.braces - 1);\n }\n}\n\nfunction depthIsZero(depth: BracketDepth): boolean {\n return depth.parentheses === 0 && depth.brackets === 0 && depth.braces === 0;\n}\n\nfunction lineData(source: string): { lines: string[]; offsets: number[] } {\n const lines = source.match(/[^\\n]*(?:\\n|$)/g)?.filter((line, index, all) => line.length > 0 || index < all.length - 1) ?? [source];\n const offsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n offsets.push(offset);\n offset += line.length;\n }\n return { lines, offsets };\n}\n\nfunction longBracketEquals(source: string, start: number): number | null {\n if (source[start] !== \"[\") return null;\n let index = start + 1;\n while (source[index] === \"=\") index += 1;\n return source[index] === \"[\" ? index - start - 1 : null;\n}\n\nfunction longBracketEnd(source: string, start: number, equals: number): number {\n const closer = `]${\"=\".repeat(equals)}]`;\n const end = source.indexOf(closer, start + equals + 2);\n return end < 0 ? source.length : end + closer.length;\n}\n\n/**\n * Marks executable-code positions. Strings and comments are false so syntax\n * compatibility rewrites never alter text that merely contains a keyword.\n */\nfunction codeMask(source: string): Uint8Array {\n const mask = new Uint8Array(source.length);\n mask.fill(1);\n\n let index = 0;\n while (index < source.length) {\n const char = source[index];\n\n if (char === \"'\" || char === \"\\\"\") {\n const quote = char;\n let cursor = index;\n let escaped = false;\n while (cursor < source.length) {\n mask[cursor] = 0;\n const current = source[cursor];\n cursor += 1;\n if (cursor - 1 === index) continue;\n if (escaped) escaped = false;\n else if (current === \"\\\\\") escaped = true;\n else if (current === quote) break;\n }\n index = cursor;\n continue;\n }\n\n if (char === \"`\") {\n let cursor = index;\n let escaped = false;\n while (cursor < source.length) {\n mask[cursor] = 0;\n const current = source[cursor];\n cursor += 1;\n if (cursor - 1 === index) continue;\n if (escaped) escaped = false;\n else if (current === \"\\\\\") escaped = true;\n else if (current === \"`\") break;\n }\n index = cursor;\n continue;\n }\n\n if (char === \"-\" && source[index + 1] === \"-\") {\n const longEquals = longBracketEquals(source, index + 2);\n const end = longEquals === null ? source.indexOf(\"\\n\", index + 2) : longBracketEnd(source, index + 2, longEquals);\n const stop = end < 0 ? source.length : end;\n mask.fill(0, index, stop);\n index = stop;\n continue;\n }\n\n if (char === \"[\") {\n const equals = longBracketEquals(source, index);\n if (equals !== null) {\n const end = longBracketEnd(source, index, equals);\n mask.fill(0, index, end);\n index = end;\n continue;\n }\n }\n\n index += 1;\n }\n\n return mask;\n}\n\nfunction isCode(mask: Uint8Array, start: number, end = start + 1): boolean {\n for (let index = start; index < end; index += 1) {\n if (mask[index] !== 1) return false;\n }\n return true;\n}\n\nfunction maskTypeAliases(source: string, mask: Uint8Array): Range[] {\n const { lines, offsets } = lineData(source);\n const ranges: Range[] = [];\n const typeStart = /^(\\s*)(?:export\\s+)?type\\s+[A-Za-z_][A-Za-z0-9_]*(?:<[^>]*>)?\\s*=/;\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex].replace(/\\r?\\n$/, \"\");\n const match = line.match(typeStart);\n if (!match || !isCode(mask, offsets[lineIndex] + match.index!, offsets[lineIndex] + match.index! + match[0].trimStart().length)) continue;\n\n const depth: BracketDepth = { parentheses: 0, brackets: 0, braces: 0 };\n let sawExpression = false;\n let endLine = lineIndex;\n\n for (let current = lineIndex; current < lines.length; current += 1) {\n const currentLine = lines[current].replace(/\\r?\\n$/, \"\");\n const segment = current === lineIndex ? currentLine.slice(match[0].length) : currentLine;\n if (segment.trim().length > 0) sawExpression = true;\n scanTypeLine(segment, depth);\n endLine = current;\n\n if (!sawExpression || !depthIsZero(depth)) continue;\n const trimmed = segment.trimEnd();\n if (/[|&=,]$/.test(trimmed)) continue;\n\n let nextNonEmpty = \"\";\n for (let lookahead = current + 1; lookahead < lines.length; lookahead += 1) {\n nextNonEmpty = lines[lookahead].trim();\n if (nextNonEmpty.length > 0) break;\n }\n if (/^[|&]/.test(nextNonEmpty)) continue;\n break;\n }\n\n ranges.push({\n start: offsets[lineIndex],\n end: offsets[endLine] + lines[endLine].length,\n });\n lineIndex = endLine;\n }\n\n return ranges;\n}\n\nfunction maskTypeLevelBlocks(source: string, mask: Uint8Array): Range[] {\n const { lines, offsets } = lineData(source);\n const ranges: Range[] = [];\n const declarationStart = /^(\\s*)(?:(?:export\\s+)?type\\s+function\\b|declare\\s+(?:extern\\s+type|class|global)\\b)/;\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex].replace(/\\r?\\n$/, \"\");\n const match = line.match(declarationStart);\n if (!match) continue;\n const firstToken = offsets[lineIndex] + match[1].length;\n if (!isCode(mask, firstToken)) continue;\n\n const indentation = match[1].replace(/\\t/g, \" \").length;\n let endLine = lineIndex;\n const afterStart = line.slice(match[0].length);\n if (!/\\bend\\b/.test(afterStart)) {\n for (let current = lineIndex + 1; current < lines.length; current += 1) {\n const currentLine = lines[current].replace(/\\r?\\n$/, \"\");\n const trimmed = currentLine.trim();\n if (!trimmed) continue;\n const currentIndent = currentLine.match(/^\\s*/)?.[0].replace(/\\t/g, \" \").length ?? 0;\n if (trimmed === \"end\" && currentIndent <= indentation && isCode(mask, offsets[current] + currentLine.indexOf(\"end\"), offsets[current] + currentLine.indexOf(\"end\") + 3)) {\n endLine = current;\n break;\n }\n }\n }\n\n ranges.push({ start: offsets[lineIndex], end: offsets[endLine] + lines[endLine].length });\n lineIndex = endLine;\n }\n\n return ranges;\n}\n\nfunction attributeRanges(source: string, mask: Uint8Array): Range[] {\n const ranges: Range[] = [];\n for (let index = 0; index < source.length; index += 1) {\n if (source[index] !== \"@\" || !isCode(mask, index)) continue;\n\n if (source[index + 1] === \"[\") {\n let depth = 0;\n let cursor = index + 1;\n while (cursor < source.length) {\n if (isCode(mask, cursor)) {\n if (source[cursor] === \"[\") depth += 1;\n else if (source[cursor] === \"]\") {\n depth -= 1;\n if (depth === 0) {\n cursor += 1;\n break;\n }\n }\n }\n cursor += 1;\n }\n ranges.push({ start: index, end: cursor });\n index = cursor - 1;\n continue;\n }\n\n const match = source.slice(index + 1).match(/^[A-Za-z_][A-Za-z0-9_]*/);\n if (match && isCode(mask, index + 1, index + 1 + match[0].length)) {\n ranges.push({ start: index, end: index + 1 + match[0].length });\n index += match[0].length;\n }\n }\n return ranges;\n}\n\nfunction explicitTypeArgumentRanges(source: string, mask: Uint8Array): Range[] {\n const ranges: Range[] = [];\n for (let index = 0; index < source.length - 1; index += 1) {\n if (source[index] !== \"<\" || source[index + 1] !== \"<\" || !isCode(mask, index, index + 2)) continue;\n\n let depth = 2;\n let cursor = index + 2;\n while (cursor < source.length && depth > 0) {\n if (isCode(mask, cursor)) {\n if (source[cursor] === \"<\") depth += 1;\n else if (source[cursor] === \">\") depth -= 1;\n }\n cursor += 1;\n }\n if (depth === 0) {\n ranges.push({ start: index, end: cursor });\n index = cursor - 1;\n }\n }\n return ranges;\n}\n\nfunction mergeRanges(ranges: Range[]): Range[] {\n const sorted = ranges.filter((range) => range.end > range.start).sort((a, b) => a.start - b.start || a.end - b.end);\n const merged: Range[] = [];\n for (const range of sorted) {\n const previous = merged.at(-1);\n if (previous && range.start <= previous.end) previous.end = Math.max(previous.end, range.end);\n else merged.push({ ...range });\n }\n return merged;\n}\n\nfunction blankPreservingUtf8Bytes(value: string): string {\n let result = \"\";\n for (const char of value) {\n if (char === \"\\n\" || char === \"\\r\") result += char;\n else result += \" \".repeat(new TextEncoder().encode(char).length);\n }\n return result;\n}\n\nfunction applyMasks(source: string, ranges: Range[]): string {\n let output = source;\n for (const range of mergeRanges(ranges).sort((a, b) => b.start - a.start)) {\n output = `${output.slice(0, range.start)}${blankPreservingUtf8Bytes(output.slice(range.start, range.end))}${output.slice(range.end)}`;\n }\n return output;\n}\n\nfunction genericFunctionParameterRanges(source: string, mask: Uint8Array): Range[] {\n const ranges: Range[] = [];\n const functionPattern = /\\bfunction\\b/g;\n\n for (const match of source.matchAll(functionPattern)) {\n const start = match.index;\n if (!isCode(mask, start, start + match[0].length)) continue;\n\n let cursor = start + match[0].length;\n while (cursor < source.length) {\n const char = source[cursor];\n if (/\\s/.test(char)) {\n cursor += 1;\n continue;\n }\n if (char === \"(\") break;\n if (char === \"<\") {\n let depth = 0;\n const rangeStart = cursor;\n while (cursor < source.length) {\n if (isCode(mask, cursor)) {\n if (source[cursor] === \"<\") depth += 1;\n else if (source[cursor] === \">\") {\n depth -= 1;\n if (depth === 0) {\n cursor += 1;\n ranges.push({ start: rangeStart, end: cursor });\n break;\n }\n }\n }\n cursor += 1;\n }\n break;\n }\n\n if (/[A-Za-z0-9_.:]/.test(char)) {\n cursor += 1;\n continue;\n }\n break;\n }\n }\n\n return ranges;\n}\n\n// The bundled grammar understands variadic types (`...T`) but not generic\n// type-pack references (`T...`). Reorder only pack uses outside a function's\n// generic declaration so Tree-sitter sees an equal-width type node.\nfunction normalizeGenericTypePackUses(source: string, mask: Uint8Array): string {\n const declarationRanges = genericFunctionParameterRanges(source, mask);\n const replacements: Array<{ start: number; end: number; value: string }> = [];\n const packPattern = /\\b[A-Za-z_][A-Za-z0-9_]*\\.\\.\\./g;\n\n for (const match of source.matchAll(packPattern)) {\n const start = match.index;\n const end = start + match[0].length;\n if (!isCode(mask, start, end)) continue;\n if (declarationRanges.some((range) => start >= range.start && end <= range.end)) continue;\n\n const name = match[0].slice(0, -3);\n replacements.push({ start, end, value: `...${name}` });\n }\n\n let output = source;\n for (const replacement of replacements.sort((a, b) => b.start - a.start)) {\n output = `${output.slice(0, replacement.start)}${replacement.value}${output.slice(replacement.end)}`;\n }\n return output;\n}\n\nfunction normalizeIntegerLiteralSuffixes(source: string, mask: Uint8Array): string {\n const suffixes: number[] = [];\n const integerPattern = /\\b(?:0[xX][0-9A-Fa-f_]+|0[bB][01_]+|[0-9][0-9_]*)i\\b/g;\n\n for (const match of source.matchAll(integerPattern)) {\n const start = match.index;\n const suffix = start + match[0].length - 1;\n if (isCode(mask, start, suffix + 1)) suffixes.push(suffix);\n }\n\n let output = source;\n for (const suffix of suffixes.sort((a, b) => b - a)) {\n output = `${output.slice(0, suffix)} ${output.slice(suffix + 1)}`;\n }\n return output;\n}\n\nfunction replaceContextualKeywords(source: string, mask: Uint8Array): string {\n const replacements: Array<{ start: number; end: number; value: string }> = [];\n\n const constPattern = /\\bconst\\b(?=\\s+(?:function\\b|[A-Za-z_][A-Za-z0-9_]*\\s*(?::|,|=)))/g;\n for (const match of source.matchAll(constPattern)) {\n const start = match.index;\n if (isCode(mask, start, start + 5)) replacements.push({ start, end: start + 5, value: \"local\" });\n }\n\n const exportPattern = /\\bexport\\b(?=\\s+(?:local\\b|const\\b|function\\b))/g;\n for (const match of source.matchAll(exportPattern)) {\n const start = match.index;\n if (isCode(mask, start, start + 6)) replacements.push({ start, end: start + 6, value: \" \" });\n }\n\n let output = source;\n for (const replacement of replacements.sort((a, b) => b.start - a.start)) {\n output = `${output.slice(0, replacement.start)}${replacement.value}${output.slice(replacement.end)}`;\n }\n return output;\n}\n\n/**\n * Adapts syntax added after the bundled Tree-sitter grammar without moving any\n * UTF-8 byte offsets. Runtime declarations are normalized to older equivalent\n * syntax; type-only syntax and attributes are blanked because React analysis\n * does not need their AST nodes.\n */\nexport function parserCompatibleSource(source: string): string {\n const mask = codeMask(source);\n const keywordCompatible = replaceContextualKeywords(source, mask);\n const literalCompatible = normalizeIntegerLiteralSuffixes(keywordCompatible, mask);\n const packCompatible = normalizeGenericTypePackUses(literalCompatible, mask);\n const ranges = [\n ...maskTypeAliases(source, mask),\n ...maskTypeLevelBlocks(source, mask),\n ...attributeRanges(source, mask),\n ...explicitTypeArgumentRanges(source, mask),\n ];\n const masked = applyMasks(packCompatible, ranges);\n\n // tree-sitter-luau 1.2.0 treats a statement-level assignment to the valid\n // Luau identifier `type` as a malformed type alias. Replace only that token\n // with an equal-width identifier so syntax locations remain aligned.\n return masked.replace(\n /^(\\s*)type(?=\\s*(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|=(?!=)))/gm,\n \"$1_typ\",\n );\n}\n",
|
|
21
|
+
"import type { SyntaxNode } from \"./syntax\";\nimport type { RuleContext } from \"./types\";\n\n/**\n * Engine members that are documented/known to yield. The analyzer intentionally\n * matches exact member names instead of every `*Async` function so custom\n * promise-style APIs do not become false positives merely because of naming.\n */\nconst YIELDING_ENGINE_MEMBERS = new Set([\n \"WaitForChild\",\n \"Wait\",\n \"GetAsync\",\n \"SetAsync\",\n \"UpdateAsync\",\n \"RemoveAsync\",\n \"IncrementAsync\",\n \"GetSortedAsync\",\n \"ListKeysAsync\",\n \"ListVersionsAsync\",\n \"GetVersionAsync\",\n \"PublishAsync\",\n \"SubscribeAsync\",\n \"RequestAsync\",\n \"PostAsync\",\n \"PreloadAsync\",\n \"ComputeAsync\",\n \"FilterStringAsync\",\n \"FilterStringForBroadcast\",\n \"FilterStringForPlayerAsync\",\n \"GetNonChatStringForBroadcastAsync\",\n \"GetNonChatStringForUserAsync\",\n \"GetChatForUserAsync\",\n \"AwardBadgeAsync\",\n \"UserHasBadgeAsync\",\n \"GetBadgeInfoAsync\",\n \"GetPolicyInfoForPlayerAsync\",\n \"GetTranslatorForPlayerAsync\",\n \"GetUserIdFromNameAsync\",\n \"GetNameFromUserIdAsync\",\n \"GetHumanoidDescriptionFromUserId\",\n \"GetHumanoidDescriptionFromOutfitId\",\n \"GetFriendsAsync\",\n \"GetUserThumbnailAsync\",\n \"GetUserInfosByUserIdsAsync\",\n \"GetGroupInfoAsync\",\n \"GetAlliesAsync\",\n \"GetEnemiesAsync\",\n \"GetGroupsAsync\",\n \"TeleportAsync\",\n \"ReserveServerAsync\",\n \"CreatePlaceAsync\",\n \"SavePlaceAsync\",\n \"LoadAsset\",\n \"LoadAssetVersion\",\n \"GetProductInfo\",\n \"CreateEditableImageAsync\",\n \"CreateEditableMeshAsync\",\n \"GetBundleDetailsAsync\",\n \"GetGamePlacesAsync\",\n \"GetDeveloperProductsAsync\",\n \"GetInventoryAsync\",\n \"GetItemDetailsAsync\",\n \"GetBatchItemDetailsAsync\",\n \"PromptCreateAssetAsync\",\n \"PromptImportAnimationClipFromVideoAsync\",\n \"GetAnimationClipAsync\",\n]);\n\nconst ROBLOX_MUTABLE_LEAFS = new Set([\n \"AbsolutePosition\",\n \"AbsoluteRotation\",\n \"AbsoluteSize\",\n \"AssemblyAngularVelocity\",\n \"AssemblyLinearVelocity\",\n \"CFrame\",\n \"Changed\",\n \"ContentSize\",\n \"CurrentCamera\",\n \"Enabled\",\n \"FocusLost\",\n \"Focused\",\n \"Heartbeat\",\n \"InputBegan\",\n \"InputChanged\",\n \"InputEnded\",\n \"Parent\",\n \"Position\",\n \"PreRender\",\n \"PreSimulation\",\n \"RenderStepped\",\n \"Rotation\",\n \"Size\",\n \"Stepped\",\n \"TextBounds\",\n \"Value\",\n \"ViewportSize\",\n \"WorldCFrame\",\n \"WorldPosition\",\n \"X\",\n \"Y\",\n]);\n\nconst INSTANCE_FACTORY_MEMBERS = new Set([\n \"Clone\",\n \"FindFirstAncestor\",\n \"FindFirstAncestorOfClass\",\n \"FindFirstAncestorWhichIsA\",\n \"FindFirstChild\",\n \"FindFirstChildOfClass\",\n \"FindFirstChildWhichIsA\",\n \"GetButton\",\n \"GetMouse\",\n \"GetService\",\n \"WaitForChild\",\n]);\n\nexport function finalCallMember(path: string): string {\n return path.split(/[.:]/).at(-1) ?? path;\n}\n\nfunction declarationInitializer(node: SyntaxNode, name: string): SyntaxNode | null | undefined {\n if (node.type !== \"variable_declaration\") return undefined;\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variables = assignment?.namedChildren.find((child) => child.type === \"variable_list\")\n ?? node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variables?.namedChildren.filter((child) => child.type === \"identifier\") ?? [];\n const index = names.findIndex((candidate) => candidate.text === name);\n if (index < 0) return undefined;\n return expressions?.namedChildren[index] ?? expressions?.namedChildren[0] ?? null;\n}\n\nfunction functionBindsName(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"function_definition\" && node.type !== \"function_declaration\") return false;\n const parameters = node.childForFieldName(\"parameters\");\n if (!parameters) return false;\n return parameters.namedChildren.some((parameter) =>\n parameter.namedChildren.some((child) => child.type === \"identifier\" && child.text === name)\n || (parameter.type === \"identifier\" && parameter.text === name)\n );\n}\n\nfunction loopBindsName(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"for_statement\") return false;\n const header = node.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`^\\\\s*for\\\\s+(?:${escaped}\\\\s*=|[^\\\\n]*\\\\b${escaped}\\\\b[^\\\\n]*\\\\bin\\\\b)`, \"s\").test(header);\n}\n\nfunction visibleInitializer(name: string, from: SyntaxNode, context: RuleContext): SyntaxNode | null | undefined {\n let current: SyntaxNode | null = from.parent;\n while (current) {\n if (current.type === \"block\" || current.id === context.root.id) {\n const children = current.namedChildren;\n for (let index = children.length - 1; index >= 0; index -= 1) {\n const child = children[index];\n if (child.startIndex >= from.startIndex) continue;\n const initializer = declarationInitializer(child, name);\n if (initializer !== undefined) return initializer;\n if (child.type === \"function_declaration\") {\n const declared = child.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (declared === name) return null;\n }\n }\n }\n if (functionBindsName(current, name) || loopBindsName(current, name)) return null;\n current = current.parent;\n }\n return undefined;\n}\n\nfunction expressionHasRobloxOrigin(\n expression: SyntaxNode | null | undefined,\n from: SyntaxNode,\n context: RuleContext,\n seen: Set<string>,\n): boolean {\n if (!expression) return false;\n const normalized = expression.text.replace(/\\s+/g, \"\");\n if (/^(?:game|workspace|script)(?:[.:]|$)/.test(normalized) || /^Instance\\.new\\(/.test(normalized)) return true;\n\n const root = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!root || root === \"require\" || seen.has(root)) return false;\n if (expression.type !== \"identifier\" && expression.type !== \"function_call\") return false;\n\n seen.add(root);\n return expressionHasRobloxOrigin(visibleInitializer(root, from, context), from, context, seen);\n}\n\nfunction hasRobloxReceiver(path: string, call: SyntaxNode, context: RuleContext): boolean {\n const normalized = path.replace(/\\s+/g, \"\");\n if (/^(?:game|workspace|script)(?:[.:]|$)/.test(normalized)) return true;\n const root = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!root) return false;\n return expressionHasRobloxOrigin(visibleInitializer(root, call, context), call, context, new Set([root]));\n}\n\nconst runServiceCallCache = new WeakMap<RuleContext, Map<number, boolean>>();\nconst runServiceExpressionCache = new WeakMap<RuleContext, Map<number, boolean>>();\n\nfunction cachedNodeBoolean(\n cache: WeakMap<RuleContext, Map<number, boolean>>,\n context: RuleContext,\n node: SyntaxNode,\n compute: () => boolean,\n): boolean {\n let entries = cache.get(context);\n if (!entries) {\n entries = new Map<number, boolean>();\n cache.set(context, entries);\n }\n const cached = entries.get(node.id);\n if (cached !== undefined) return cached;\n const value = compute();\n entries.set(node.id, value);\n return value;\n}\n\nconst RUN_SERVICE_EVENTS = new Set([\n \"RenderStepped\",\n \"Heartbeat\",\n \"Stepped\",\n \"PreRender\",\n \"PreSimulation\",\n \"PostSimulation\",\n]);\n\nfunction expressionIsRunService(\n expression: SyntaxNode | null | undefined,\n from: SyntaxNode,\n context: RuleContext,\n seen: Set<string>,\n): boolean {\n if (!expression) return false;\n const normalized = expression.text.replace(/\\s+/g, \"\");\n if (/^game:GetService\\([\"']RunService[\"']\\)$/.test(normalized)) return true;\n if (expression.type !== \"identifier\") return false;\n const name = expression.text;\n if (seen.has(name)) return false;\n seen.add(name);\n return expressionIsRunService(visibleInitializer(name, from, context), from, context, seen);\n}\n\nfunction rootIsRunService(root: string, from: SyntaxNode, context: RuleContext): boolean {\n if (root === \"game\") return false;\n return expressionIsRunService(visibleInitializer(root, from, context), from, context, new Set([root]));\n}\n\nexport function isHighFrequencyRunServiceExpression(node: SyntaxNode, context: RuleContext): boolean {\n return cachedNodeBoolean(runServiceExpressionCache, context, node, () => {\n const normalized = node.text.replace(/\\s+/g, \"\");\n if (/^game:GetService\\([\"']RunService[\"']\\)\\.(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)$/.test(normalized)) {\n return true;\n }\n const match = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)$/);\n return Boolean(match && RUN_SERVICE_EVENTS.has(match[2]) && rootIsRunService(match[1], node, context));\n });\n}\n\nexport function isHighFrequencyRunServiceCall(call: SyntaxNode, context: RuleContext): boolean {\n return cachedNodeBoolean(runServiceCallCache, context, call, () => {\n const normalized = (context.getCallPath(call) ?? \"\").replace(/\\s+/g, \"\");\n const direct = call.text.replace(/\\s+/g, \"\");\n if (/^game:GetService\\([\"']RunService[\"']\\)(?:\\.(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation):Connect|:BindToRenderStep|:BindToSimulation)\\(/.test(direct)) {\n return true;\n }\n\n const event = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation):Connect$/);\n if (event) return rootIsRunService(event[1], call, context);\n\n const bind = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*):(?:BindToRenderStep|BindToSimulation)$/);\n return Boolean(bind && rootIsRunService(bind[1], call, context));\n });\n}\n\nexport function sourceHasHighFrequencyRunService(source: string): boolean {\n if (/game\\s*:\\s*GetService\\s*\\(\\s*[\"']RunService[\"']\\s*\\)\\s*(?:\\.\\s*(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)\\s*:\\s*Connect|:\\s*(?:BindToRenderStep|BindToSimulation))/.test(source)) {\n return true;\n }\n\n const aliases = new Set<string>();\n for (const match of source.matchAll(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*game\\s*:\\s*GetService\\s*\\(\\s*[\"']RunService[\"']\\s*\\)/g)) {\n aliases.add(match[1]);\n }\n for (const alias of aliases) {\n const escaped = alias.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = new RegExp(`\\\\b${escaped}\\\\s*(?:\\\\.\\\\s*(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)\\\\s*:\\\\s*Connect|:\\\\s*(?:BindToRenderStep|BindToSimulation))`);\n if (pattern.test(source)) return true;\n }\n return false;\n}\n\nexport function knownYieldReason(path: string, call?: SyntaxNode, context?: RuleContext): string | null {\n const normalized = path.replace(/\\s+/g, \"\");\n if (normalized === \"task.wait\") return \"task.wait\";\n if (normalized === \"coroutine.yield\") return \"coroutine.yield\";\n\n const member = finalCallMember(normalized);\n if (!YIELDING_ENGINE_MEMBERS.has(member)) return null;\n if (!call || !context) return null;\n return hasRobloxReceiver(normalized, call, context) ? member : null;\n}\n\nexport function functionYieldPoint(node: SyntaxNode, context: RuleContext): { call: SyntaxNode; reason: string } | null {\n for (const candidate of context.walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const nearest = context.nearestFunction(candidate);\n const owner = context.model.functionByNode.get(node.id);\n if (owner && nearest !== owner) continue;\n const path = context.resolveCallPath(context.getCallPath(candidate) ?? \"\");\n const reason = knownYieldReason(path, candidate, context);\n if (reason) return { call: candidate, reason };\n }\n return null;\n}\n\nexport function isInstanceProducingExpression(node: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!node) return false;\n\n const text = node.text.trim();\n if (/^(?:workspace|game|script)(?:\\.|:|$)/.test(text)) return true;\n\n for (const candidate of context.walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(candidate) ?? \"\");\n if (path === \"Instance.new\") return true;\n if (INSTANCE_FACTORY_MEMBERS.has(finalCallMember(path))) return true;\n }\n\n return false;\n}\n\nexport function mutableDependencyBase(path: string, externallyMutableRoots: Set<string>): string | null {\n const normalized = path.replace(/\\s+/g, \"\");\n if (/\\.current(?:\\.|$)/.test(normalized)) return \"\";\n\n const segments = normalized.split(\".\");\n if (segments.length < 2) return null;\n\n if (externallyMutableRoots.has(segments[0])) return segments[0];\n\n const mutableIndex = segments.findIndex((segment, index) => index > 0 && ROBLOX_MUTABLE_LEAFS.has(segment));\n if (mutableIndex <= 0) return null;\n\n const ownerPath = segments.slice(0, mutableIndex).join(\".\");\n const mutableLeaf = segments[mutableIndex];\n const signalLike = /(?:Changed|Began|Ended|Focused|Heartbeat|Stepped|PreRender|PreSimulation)$/.test(mutableLeaf);\n const objectLike = /(?:instance|attachment|camera|mouse|frame|gui|part|value|humanoid|sound|tween|workspace|root|viewport)/i.test(ownerPath);\n return signalLike || objectLike ? ownerPath : null;\n}\n",
|
|
22
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { FunctionInfo, RuleContext } from \"../types\";\nimport { rootIdentifier, sameNode } from \"../ast/walk\";\n\nexport const CONDITIONAL_TYPES = new Set([\n \"if_statement\",\n \"if_expression\",\n \"for_statement\",\n \"while_statement\",\n \"repeat_statement\",\n]);\n\nexport function isHookPath(path: string): boolean {\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return /^use[A-Z0-9_]/.test(final);\n}\n\n\nexport function assignmentTargetNode(statement: SyntaxNode): SyntaxNode {\n return statement.namedChildren[0] ?? statement;\n}\n\nexport function tableStartNode(table: SyntaxNode): SyntaxNode {\n return table.children.find((child) => child.type === \"{\") ?? table;\n}\n\nexport function identifierNode(node: SyntaxNode, name: string): SyntaxNode | null {\n const stack = [node];\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (current.type === \"identifier\" && current.text === name) return current;\n for (let index = current.namedChildren.length - 1; index >= 0; index -= 1) stack.push(current.namedChildren[index]);\n }\n return null;\n}\n\nexport function callNameNode(call: SyntaxNode): SyntaxNode {\n return call.childForFieldName(\"name\") ?? call;\n}\n\nexport function fieldNameNode(field: SyntaxNode): SyntaxNode {\n return field.childForFieldName(\"name\") ?? field;\n}\n\nexport function firstFunctionArgument(context: RuleContext, call: SyntaxNode): SyntaxNode | null {\n return context.callArguments(call).find((arg) => arg.type === \"function_definition\") ?? null;\n}\n\nexport function directComponentForCall(context: RuleContext, call: SyntaxNode): FunctionInfo | null {\n const fn = context.nearestFunction(call);\n return fn?.isComponent ? fn : null;\n}\n\nexport function findAncestorBetween(node: SyntaxNode, stop: SyntaxNode, predicate: (node: SyntaxNode) => boolean): SyntaxNode | null {\n let current = node.parent;\n while (current && !sameNode(current, stop)) {\n if (predicate(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nexport function declarationNames(node: SyntaxNode): string[] {\n if (node.type !== \"variable_declaration\") return [];\n const beforeEquals = node.text.split(\"=\")[0] ?? \"\";\n return beforeEquals\n .replace(/^\\s*local\\s+/, \"\")\n .split(\",\")\n .map((piece) => piece.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null)\n .filter((name): name is string => Boolean(name));\n}\n\nexport function callRoot(path: string): string | null {\n return rootIdentifier(path);\n}\n\nexport function isNestedInsideFunction(node: SyntaxNode, boundary: SyntaxNode): boolean {\n let current = node.parent;\n while (current && !sameNode(current, boundary)) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function functionHasReturnedBefore(call: SyntaxNode, fn: FunctionInfo, context: RuleContext): boolean {\n if (!fn.body) return false;\n for (const node of context.walk(fn.body)) {\n if (node.endIndex > call.startIndex) continue;\n if (node.type !== \"return_statement\") continue;\n if (isNestedInsideFunction(node, fn.node)) continue;\n return true;\n }\n return false;\n}\n\nexport function parseDependencyRoots(node: SyntaxNode | undefined): Set<string> {\n const result = new Set<string>();\n if (!node || node.type !== \"table_constructor\") return result;\n\n for (const child of node.namedChildren) {\n const root = rootIdentifier(child.text);\n if (root) result.add(root);\n }\n return result;\n}\n\nexport function assignmentLeft(text: string): string {\n const match = text.match(/^(.*?)(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|\\/=|=)/s);\n return match?.[1]?.trim() ?? \"\";\n}\n\nexport function functionInfoForNode(context: RuleContext, node: SyntaxNode | null): FunctionInfo | null {\n if (!node) return null;\n return context.model.functionByNode.get(node.id) ?? null;\n}\n\nexport function stateBindingsFor(context: RuleContext, owner: FunctionInfo): typeof context.model.stateBindings {\n return context.model.stateBindings.filter((binding) => binding.owner === owner);\n}\n\nexport function isEffectPath(path: string): boolean {\n return path === \"React.useEffect\" || path === \"React.useLayoutEffect\";\n}\n\nexport function dependencyExpressions(node: SyntaxNode | undefined): SyntaxNode[] {\n if (!node || node.type !== \"table_constructor\") return [];\n return node.namedChildren\n .filter((child) => child.type === \"field\")\n .map((field) => {\n const name = field.childForFieldName(\"name\");\n if (name && field.text.trim().startsWith(\"[\")) return name;\n return field.namedChildren.find((child) => !sameNode(child, name)) ?? name ?? field;\n });\n}\n\nexport function fieldName(node: SyntaxNode): string | null {\n if (node.type !== \"field\") return null;\n const name = node.childForFieldName(\"name\");\n return name?.type === \"identifier\" ? name.text : null;\n}\n\nexport function fieldValue(node: SyntaxNode): SyntaxNode | null {\n if (node.type !== \"field\") return null;\n const name = node.childForFieldName(\"name\");\n if (!name) return node.namedChildren[0] ?? null;\n return node.namedChildren.find((child) => child.startIndex > name.endIndex) ?? null;\n}\n\nexport function containsIdentifier(node: SyntaxNode | null | undefined, name: string, context: RuleContext): boolean {\n if (!node) return false;\n for (const child of context.walk(node)) {\n if (child.type !== \"identifier\" || child.text !== name) continue;\n const parent = child.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), child)) continue;\n if (parent?.type === \"method_index_expression\" && (sameNode(parent.childForFieldName(\"method\"), child) || sameNode(parent.namedChildren.at(-1), child))) continue;\n return true;\n }\n return false;\n}\n\nexport function ownerStateSetter(context: RuleContext, owner: FunctionInfo, path: string): string | null {\n for (const binding of context.model.stateBindings) {\n if (binding.owner === owner && binding.setterName === path) return binding.valueName;\n }\n return null;\n}\n\n\nfunction parameterNames(node: SyntaxNode | null): Set<string> {\n const names = new Set<string>();\n if (!node) return names;\n for (const candidate of node.namedChildren) {\n for (const child of [candidate, ...Array.from((function* walkLocal(current: SyntaxNode): Iterable<SyntaxNode> {\n for (const nested of current.namedChildren) {\n yield nested;\n yield* walkLocal(nested);\n }\n })(candidate))]) {\n if (child.type === \"identifier\") names.add(child.text);\n }\n }\n return names;\n}\n\nfunction blockBindingsBefore(block: SyntaxNode, beforeIndex: number): Set<string> {\n const names = new Set<string>();\n for (const child of block.namedChildren) {\n if (child.startIndex >= beforeIndex) continue;\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) names.add(name);\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) names.add(name);\n }\n }\n return names;\n}\n\nfunction loopBindings(loop: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const header = loop.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const numeric = header.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) names.add(numeric[1]);\n const generic = header.match(/^\\s*for\\s+(.+?)\\s+in\\b/s);\n if (generic) {\n for (const part of generic[1].split(\",\")) {\n const name = part.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (name) names.add(name);\n }\n }\n return names;\n}\n\nexport function isNameShadowedBetween(node: SyntaxNode, boundary: FunctionInfo, name: string): boolean {\n let current: SyntaxNode | null = node.parent;\n while (current && !sameNode(current, boundary.node)) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") {\n if (parameterNames(current.childForFieldName(\"parameters\")).has(name)) return true;\n }\n if (current.type === \"block\" && !sameNode(current.parent, boundary.node) && blockBindingsBefore(current, node.startIndex).has(name)) return true;\n if (current.type === \"for_statement\" && loopBindings(current).has(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nconst topLevelBindingsCache = new WeakMap<FunctionInfo, Map<string, SyntaxNode[]>>();\n\nfunction topLevelBindings(boundary: FunctionInfo): Map<string, SyntaxNode[]> {\n const cached = topLevelBindingsCache.get(boundary);\n if (cached) return cached;\n\n const result = new Map<string, SyntaxNode[]>();\n const add = (name: string, node: SyntaxNode): void => {\n const existing = result.get(name) ?? [];\n existing.push(node);\n result.set(name, existing);\n };\n\n for (const child of boundary.body?.namedChildren ?? []) {\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) add(name, child);\n } else if (child.type === \"function_declaration\") {\n const declared = child.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(declared)) add(declared, child);\n }\n }\n\n topLevelBindingsCache.set(boundary, result);\n return result;\n}\n\nexport function isBindingShadowedBetween(\n node: SyntaxNode,\n boundary: FunctionInfo,\n name: string,\n declaration: SyntaxNode | null = null,\n): boolean {\n if (isNameShadowedBetween(node, boundary, name)) return true;\n if (!boundary.body) return false;\n\n const afterIndex = declaration?.endIndex ?? boundary.body.startIndex - 1;\n return (topLevelBindings(boundary).get(name) ?? []).some((binding) =>\n binding.startIndex > afterIndex && binding.startIndex < node.startIndex\n );\n}\n\nexport function containsUnshadowedIdentifier(\n node: SyntaxNode | null | undefined,\n name: string,\n context: RuleContext,\n boundary: FunctionInfo,\n): boolean {\n if (!node) return false;\n for (const child of context.walk(node)) {\n if (child.type !== \"identifier\" || child.text !== name) continue;\n const parent = child.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), child)) continue;\n if (parent?.type === \"method_index_expression\" && (sameNode(parent.childForFieldName(\"method\"), child) || sameNode(parent.namedChildren.at(-1), child))) continue;\n if (isNameShadowedBetween(child, boundary, name)) continue;\n return true;\n }\n return false;\n}\n\nexport function directFunctionCalls(context: RuleContext, fn: FunctionInfo): SyntaxNode[] {\n if (!fn.body) return [];\n return [...context.walk(fn.body)].filter((node) => node.type === \"function_call\" && context.nearestFunction(node) === fn);\n}\n",
|
|
23
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { FixPreview, FunctionInfo, RuleContext, RuleDefinition, Severity } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { functionYieldPoint } from \"../roblox-semantics\";\nimport { callNameNode, declarationNames, firstFunctionArgument, functionInfoForNode } from \"./helpers\";\n\ninterface Resource {\n call: SyntaxNode;\n label: string;\n variable: string | null;\n detail?: string;\n severity?: Severity;\n cleanupMatches(cleanupText: string, variable: string | null, call: SyntaxNode): boolean;\n}\n\nconst ALWAYS_MANAGED_METHOD = /:GiveTask$/;\nconst GENERIC_MANAGER_METHOD = /:(?:Add|AddTask|AddObject|Track)$/;\nconst MANAGER_ROOT = /(?:maid|trove|janitor|cleaner|cleanup|scope|bin|disposer)(?:$|[._])/i;\nconst CONNECTION_RETURNING_METHODS = new Set([\"BindToSimulation\", \"SubscribeAsync\", \"OnUpdate\"]);\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction connectionOwnerExpression(rawPath: string): string | null {\n const connected = rawPath.match(/^(.*):Connect$/s)?.[1];\n if (!connected) return null;\n\n const signalMethod = connected.match(/^(.*):(?:GetPropertyChangedSignal|GetAttributeChangedSignal)\\s*\\(.*\\)$/s);\n if (signalMethod) return signalMethod[1]?.trim() || null;\n\n const eventProperty = connected.match(/^(.*)\\.[A-Za-z_][A-Za-z0-9_]*$/s);\n return eventProperty?.[1]?.trim() || null;\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction initializerCreatesInstance(initializer: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!initializer) return false;\n for (const candidate of context.walk(initializer)) {\n if (candidate.type !== \"function_call\") continue;\n if (context.resolveCallPath(context.getCallPath(candidate) ?? \"\") === \"Instance.new\") return true;\n }\n return false;\n}\n\nfunction bodyDeclaresInstanceBefore(\n body: SyntaxNode | null,\n beforeIndex: number,\n expression: string,\n context: RuleContext,\n): boolean {\n if (!body) return false;\n for (const child of body.namedChildren) {\n if (child.startIndex >= beforeIndex) break;\n if (child.type !== \"variable_declaration\") continue;\n const names = declarationNames(child);\n const index = names.indexOf(expression);\n if (index === -1) continue;\n if (initializerCreatesInstance(declarationExpressions(child)[index], context)) return true;\n }\n return false;\n}\n\nfunction isProvenInstanceExpression(\n expression: string | null,\n call: SyntaxNode,\n context: RuleContext,\n callback: FunctionInfo,\n): boolean {\n if (!expression || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(expression)) return false;\n const callbackInstances = context.model.instanceVariablesByFunction.get(callback.node.id);\n if (callbackInstances?.has(expression)) return true;\n if (bodyDeclaresInstanceBefore(callback.body, call.startIndex, expression, context)) return true;\n\n const effectOwner = context.nearestFunction(callback.node);\n if (effectOwner) {\n const ownerInstances = context.model.instanceVariablesByFunction.get(effectOwner.node.id);\n if (ownerInstances?.has(expression)) return true;\n }\n return Boolean(effectOwner && bodyDeclaresInstanceBefore(effectOwner.body, callback.node.startIndex, expression, context));\n}\n\nfunction cleanupDestroysExpression(cleanupText: string, expression: string): boolean {\n return new RegExp(`(?:^|[^A-Za-z0-9_])${escapeRegExp(expression)}\\\\s*:\\\\s*Destroy\\\\s*\\\\(`, \"s\").test(cleanupText);\n}\n\nfunction assignedVariableName(call: SyntaxNode, callback: FunctionInfo): string | null {\n let current = call.parent;\n while (current && !sameNode(current, callback.node)) {\n if (current.type === \"variable_declaration\") {\n const names = declarationNames(current);\n const expressions = declarationExpressions(current);\n const index = expressions.findIndex((expression) => expression.startIndex <= call.startIndex && expression.endIndex >= call.endIndex);\n if (index >= 0) return names[index] ?? names[0] ?? null;\n return names[0] ?? null;\n }\n if (current.type === \"assignment_statement\") {\n const beforeCall = current.text.slice(0, Math.max(0, call.startIndex - current.startIndex));\n const match = beforeCall.match(/^\\s*([A-Za-z_][A-Za-z0-9_]*(?:\\s*\\[[^\\]]+\\]|\\s*\\.[A-Za-z_][A-Za-z0-9_]*)*)\\s*=\\s*$/s);\n const target = match?.[1]?.replace(/\\s+/g, \"\") ?? \"\";\n const root = target.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (root) return root;\n // A call can be nested inside a conditional/table initializer. In that case\n // keep walking so the surrounding variable declaration can own the resource.\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction cleanupIteratesAndDisconnects(cleanupText: string, collection: string): boolean {\n const escaped = escapeRegExp(collection);\n const loops = new RegExp(\n `for\\\\s+[^\\\\n]*?([A-Za-z_][A-Za-z0-9_]*)\\\\s+in\\\\s+${escaped}\\\\s+do([\\\\s\\\\S]*?)end`,\n \"g\",\n );\n for (const match of cleanupText.matchAll(loops)) {\n const item = match[1];\n const body = match[2] ?? \"\";\n if (new RegExp(`\\\\b${escapeRegExp(item)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(body)) return true;\n }\n return false;\n}\n\nfunction cleanupCallsDisposer(cleanupText: string, variable: string): boolean {\n return new RegExp(`(?:^|[^A-Za-z0-9_.:])${escapeRegExp(variable)}\\\\s*\\\\(`, \"s\").test(cleanupText);\n}\n\nfunction isManagedByCleanupContainer(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback.node)) {\n if (current.type === \"function_call\") {\n const path = context.getCallPath(current) ?? \"\";\n if (ALWAYS_MANAGED_METHOD.test(path)) return true;\n if (GENERIC_MANAGER_METHOD.test(path)) {\n const receiver = path.split(\":\", 1)[0] ?? \"\";\n if (MANAGER_ROOT.test(receiver)) return true;\n }\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return false;\n}\n\nfunction localFunctionByName(callback: FunctionInfo, name: string, context: RuleContext): SyntaxNode | null {\n if (!callback.body) return null;\n for (const child of callback.body.namedChildren) {\n if (child.type === \"function_declaration\" && child.childForFieldName(\"name\")?.text === name) return child;\n if (child.type !== \"variable_declaration\") continue;\n const match = child.text.match(new RegExp(`^\\\\s*local\\\\s+${escapeRegExp(name)}\\\\s*=\\\\s*function\\\\b`, \"s\"));\n if (!match) continue;\n return [...context.walk(child)].find((node) => node.type === \"function_definition\") ?? null;\n }\n return null;\n}\n\nfunction cleanupTexts(callback: FunctionInfo, context: RuleContext): string[] {\n if (!callback.body) return [];\n const texts: string[] = [];\n\n for (const node of context.walk(callback.body)) {\n if (node.type !== \"return_statement\") continue;\n if (context.nearestFunction(node) !== callback) continue;\n const expressionList = node.namedChildren.find((child) => child.type === \"expression_list\");\n const returned = expressionList?.namedChildren[0];\n if (!returned) continue;\n if (returned.type === \"function_definition\") {\n texts.push(returned.text);\n continue;\n }\n if (returned.type === \"identifier\") {\n const localFunction = localFunctionByName(callback, returned.text, context);\n if (localFunction) texts.push(localFunction.text);\n }\n }\n\n return texts;\n}\n\nfunction taskCallbackNode(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): SyntaxNode | null {\n const args = context.callArguments(call);\n const candidate = args.find((arg) => arg.type === \"function_definition\");\n if (candidate) return candidate;\n const named = args[0];\n if (named?.type === \"identifier\") return localFunctionByName(callback, named.text, context);\n return null;\n}\n\nfunction cancellationFlagMatches(taskCallback: SyntaxNode | null, cleanupText: string, callback: FunctionInfo): boolean {\n if (!taskCallback || !callback.body) return false;\n const beforeTask = callback.body.text.slice(0, Math.max(0, taskCallback.startIndex - callback.body.startIndex));\n const declarations = [...beforeTask.matchAll(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*false\\b/g)].map((match) => match[1]);\n\n for (const name of declarations) {\n const escaped = escapeRegExp(name);\n if (!new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*true\\\\b`).test(cleanupText)) continue;\n const taskText = taskCallback.text;\n const observesCancellation = new RegExp(`(?:if\\\\s+${escaped}\\\\s+then[\\\\s\\\\S]{0,120}?return|if\\\\s+not\\\\s+${escaped}\\\\s+then|while\\\\s+not\\\\s+${escaped}\\\\b|until\\\\s+${escaped}\\\\b)`, \"s\").test(taskText);\n if (observesCancellation) return true;\n }\n\n return false;\n}\n\nfunction connectionResource(call: SyntaxNode, variable: string | null, label = \"RBXScriptConnection\"): Resource {\n return {\n call,\n label,\n variable,\n cleanupMatches(text, name) {\n return Boolean(\n name\n && (new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(text)\n || cleanupIteratesAndDisconnects(text, name)),\n );\n },\n };\n}\n\nfunction numericTaskDelay(call: SyntaxNode, context: RuleContext): number | null {\n const first = context.callArguments(call)[0]?.text.trim();\n if (!first || !/^-?\\d+(?:\\.\\d+)?$/.test(first)) return null;\n const value = Number(first);\n return Number.isFinite(value) ? value : null;\n}\n\nfunction isCleanupOnlyTask(callbackNode: SyntaxNode | null, context: RuleContext): boolean {\n if (!callbackNode) return false;\n const info = functionInfoForNode(context, callbackNode);\n if (!info?.body) return false;\n const calls = [...context.walk(info.body)].filter((node) => node.type === \"function_call\" && context.nearestFunction(node) === info);\n if (calls.length === 0) return false;\n return calls.every((call) => /:(?:Destroy|Disconnect)$/.test(context.getCallPath(call) ?? \"\"));\n}\n\nfunction taskSeverity(path: string, call: SyntaxNode, taskCallback: SyntaxNode | null, yieldPoint: unknown, context: RuleContext): Severity {\n if (path === \"task.defer\" && !yieldPoint) return \"suggestion\";\n if (path === \"task.delay\" && !yieldPoint) {\n if (isCleanupOnlyTask(taskCallback, context)) return \"suggestion\";\n const delay = numericTaskDelay(call, context);\n if (delay !== null && delay <= 0.25) return \"suggestion\";\n }\n return \"warning\";\n}\n\nfunction cleanupHelp(resources: Resource[], details: string[]): string {\n const labels = new Set(resources.map((resource) => resource.label));\n let action: string;\n\n if (resources.every((resource) => resource.label.includes(\"task\"))) {\n action = \"Cancel the task in returned cleanup if it must stop with the effect.\";\n } else if (labels.size === 1 && labels.has(\"connection/subscription\")) {\n action = \"Disconnect the connection in returned cleanup, or hand it to a cleanup manager.\";\n } else if (labels.size === 1 && [...labels][0]?.endsWith(\" connection\")) {\n action = \"Disconnect the returned connection in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"RenderStep binding\")) {\n action = \"Call UnbindFromRenderStep with the same binding name in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"ContextAction binding\")) {\n action = \"Call UnbindAction with the same action name in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"ContextAction activation binding\")) {\n action = \"Call UnbindActivate with the same input type in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"React root\")) {\n action = \"Unmount the root in cleanup.\";\n } else {\n action = \"Release the owned resources in returned cleanup.\";\n }\n\n return `${details.length > 0 ? `${details.join(\" \")} ` : \"\"}${action}`;\n}\n\nfunction cleanupFixPreview(resources: Resource[], context: RuleContext): FixPreview | undefined {\n const labels = new Set(resources.map((resource) => resource.label));\n const first = resources[0];\n if (!first) return undefined;\n\n if (labels.size === 1 && labels.has(\"RenderStep binding\")) {\n const bindingName = context.callArguments(first.call)[0]?.text.trim() ?? '\"RenderStepName\"';\n return {\n kind: \"pattern\",\n before: `RunService:BindToRenderStep(${bindingName}, priority, onStep)`,\n after: `RunService:BindToRenderStep(${bindingName}, priority, onStep)\n\nreturn function()\n\tRunService:UnbindFromRenderStep(${bindingName})\nend`,\n note: \"Unbind the same RenderStep name when the effect reruns or unmounts.\",\n };\n }\n\n if ([...labels].every((label) => label.includes(\"task\"))) {\n const path = context.resolveCallPath(context.getCallPath(first.call) ?? \"task.delay\");\n const taskCall = path === \"task.defer\"\n ? `task.defer(function()\n\tdoWork()\nend)`\n : path === \"task.spawn\"\n ? `task.spawn(function()\n\tdoWork()\nend)`\n : `task.delay(delaySeconds, function()\n\tdoWork()\nend)`;\n return {\n kind: \"pattern\",\n before: taskCall,\n after: `local thread = ${taskCall}\n\nreturn function()\n\ttask.cancel(thread)\nend`,\n note: \"Cancel scheduled work only when it must not outlive this effect. Short fire-and-forget work may intentionally remain uncancelled.\",\n };\n }\n\n if (labels.size === 1 && labels.has(\"ContextAction binding\")) {\n return {\n kind: \"pattern\",\n before: `ContextActionService:BindAction(actionName, onAction, false, inputType)`,\n after: `ContextActionService:BindAction(actionName, onAction, false, inputType)\n\nreturn function()\n\tContextActionService:UnbindAction(actionName)\nend`,\n note: \"Unbind the same action name in the effect cleanup.\",\n };\n }\n\n if (labels.size === 1 && labels.has(\"React root\")) {\n return {\n kind: \"pattern\",\n before: `local root = ReactRoblox.createRoot(container)`,\n after: `local root = ReactRoblox.createRoot(container)\n\nreturn function()\n\troot:unmount()\nend`,\n note: \"Unmount roots created by the effect when ownership ends.\",\n };\n }\n\n return {\n kind: \"pattern\",\n before: `local connection = signal:Connect(onChanged)`,\n after: `local connection = signal:Connect(onChanged)\n\nreturn function()\n\tconnection:Disconnect()\nend`,\n note: \"Return cleanup from the same effect that acquires the resource.\",\n };\n}\n\nfunction classifyResource(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): Resource | null {\n const rawPath = context.getCallPath(call) ?? \"\";\n const path = context.resolveCallPath(rawPath);\n const variable = assignedVariableName(call, callback);\n const finalMember = path.split(/[.:]/).at(-1) ?? path;\n\n if (/:Connect$/.test(rawPath)) {\n const ownerExpression = connectionOwnerExpression(rawPath);\n const ownerIsInstance = isProvenInstanceExpression(ownerExpression, call, context, callback);\n return {\n call,\n label: \"connection/subscription\",\n variable,\n cleanupMatches(text, name) {\n if (name && new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(text)) return true;\n if (name && cleanupIteratesAndDisconnects(text, name)) return true;\n // Custom Signal/Iris-style Connect APIs may return a disposer function instead of RBXScriptConnection.\n if (name && cleanupCallsDisposer(text, name)) return true;\n return Boolean(ownerIsInstance && ownerExpression && cleanupDestroysExpression(text, ownerExpression));\n },\n };\n }\n\n if (CONNECTION_RETURNING_METHODS.has(finalMember)) {\n return connectionResource(call, variable, `${finalMember} connection`);\n }\n\n if (/BindToRenderStep$/.test(rawPath)) {\n const bindingName = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"RenderStep binding\",\n variable,\n cleanupMatches(text) {\n if (!/UnbindFromRenderStep\\s*\\(/.test(text)) return false;\n if (!bindingName) return true;\n return new RegExp(`UnbindFromRenderStep\\\\s*\\\\(\\\\s*${escapeRegExp(bindingName)}\\\\s*\\\\)`).test(text);\n },\n };\n }\n\n if (/:BindAction(?:AtPriority)?$/.test(rawPath)) {\n const actionName = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"ContextAction binding\",\n variable,\n cleanupMatches(text) {\n if (/:UnbindAllActions\\s*\\(/.test(text)) return true;\n if (!/:UnbindAction\\s*\\(/.test(text)) return false;\n if (!actionName) return true;\n return new RegExp(`:UnbindAction\\\\s*\\\\(\\\\s*${escapeRegExp(actionName)}\\\\s*\\\\)`).test(text);\n },\n };\n }\n\n if (/:BindActivate$/.test(rawPath)) {\n const inputType = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"ContextAction activation binding\",\n variable,\n cleanupMatches(text) {\n if (!/:UnbindActivate\\s*\\(/.test(text)) return false;\n if (!inputType) return true;\n return new RegExp(`:UnbindActivate\\\\s*\\\\(\\\\s*${escapeRegExp(inputType)}(?:\\\\s*,|\\\\s*\\\\))`).test(text);\n },\n };\n }\n\n if (path === \"ReactRoblox.createRoot\") {\n return {\n call,\n label: \"React root\",\n variable,\n cleanupMatches(text, name) {\n return Boolean(name && new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*unmount\\\\s*\\\\(`, \"i\").test(text));\n },\n };\n }\n\n if (path === \"task.delay\" || path === \"task.defer\" || path === \"task.spawn\") {\n const taskCallback = taskCallbackNode(call, context, callback);\n const yieldPoint = taskCallback ? functionYieldPoint(taskCallback, context) : null;\n const outlivesEffect = path !== \"task.spawn\" || Boolean(yieldPoint);\n if (!outlivesEffect) return null;\n\n return {\n call,\n label: path === \"task.spawn\" ? \"yielding spawned task\" : path === \"task.defer\" ? \"deferred task\" : \"delayed task\",\n detail: yieldPoint ? `The task can outlive the effect because it yields at ${yieldPoint.reason}.` : \"The task is scheduled to run after the effect callback can finish.\",\n severity: taskSeverity(path, call, taskCallback, yieldPoint, context),\n variable,\n cleanupMatches(text, name) {\n if (name) {\n const escaped = escapeRegExp(name);\n if (new RegExp(`task\\\\.cancel\\\\s*\\\\(\\\\s*${escaped}\\\\s*\\\\)`).test(text)) return true;\n if (new RegExp(`p?call\\\\s*\\\\(\\\\s*task\\\\.cancel\\\\s*,\\\\s*${escaped}\\\\s*\\\\)`).test(text)) return true;\n }\n return cancellationFlagMatches(taskCallback, text, callback);\n },\n };\n }\n\n return null;\n}\n\nexport const effectNeedsCleanup: RuleDefinition = {\n id: \"react-luau/effect-needs-cleanup\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Effects that create owned resources or outliving tasks should return matching cleanup.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (path !== \"React.useEffect\" && path !== \"React.useLayoutEffect\") continue;\n\n const callbackNode = firstFunctionArgument(context, call);\n const callback = functionInfoForNode(context, callbackNode);\n if (!callbackNode || !callback) continue;\n const cleanup = cleanupTexts(callback, context);\n const missing: Resource[] = [];\n\n for (const candidate of context.walk(callbackNode)) {\n if (candidate.type !== \"function_call\") continue;\n if (context.nearestFunction(candidate) !== callback) continue;\n if (isManagedByCleanupContainer(candidate, context, callback)) continue;\n const resource = classifyResource(candidate, context, callback);\n if (!resource) continue;\n if (cleanup.some((text) => resource.cleanupMatches(text, resource.variable, resource.call))) continue;\n missing.push(resource);\n }\n\n if (missing.length === 0) continue;\n const labels = [...new Set(missing.map((resource) => resource.label))];\n const details = [...new Set(missing.map((resource) => resource.detail).filter((detail): detail is string => Boolean(detail)))];\n const severityRank: Record<Severity, number> = { suggestion: 0, warning: 1, error: 2 };\n const severity = missing.reduce<Severity>(\n (highest, resource) => severityRank[resource.severity ?? \"warning\"] > severityRank[highest] ? resource.severity ?? \"warning\" : highest,\n \"suggestion\",\n );\n const highlights = missing.map((resource) => callNameNode(resource.call));\n diagnostics.push({\n node: highlights[0],\n highlights,\n severity,\n message: `Effect creates ${labels.join(\", \")} without matching returned cleanup.`,\n help: cleanupHelp(missing, details),\n fixPreview: cleanupFixPreview(missing, context),\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
24
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { nodeKey, rootIdentifier } from \"../ast/walk\";\nimport {\n callNameNode,\n containsUnshadowedIdentifier,\n dependencyExpressions,\n functionInfoForNode,\n isEffectPath,\n parseDependencyRoots,\n stateBindingsFor,\n} from \"./helpers\";\n\nconst HOOKS_WITH_DEPS = new Set([\n \"React.useEffect\",\n \"React.useLayoutEffect\",\n \"React.useMemo\",\n \"React.useCallback\",\n \"React.useImperativeHandle\",\n]);\n\nfunction ownerForHook(context: RuleContext, call: SyntaxNode): FunctionInfo | null {\n const owner = context.nearestFunction(call);\n return owner && (owner.isComponent || owner.isHook) ? owner : null;\n}\n\nfunction callbackAndDeps(context: RuleContext, call: SyntaxNode): { callback: SyntaxNode; deps: SyntaxNode } | null {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const args = context.callArguments(call);\n if (path === \"React.useImperativeHandle\") {\n const callback = args[1];\n const deps = args[2];\n if (callback?.type === \"function_definition\" && deps?.type === \"table_constructor\") return { callback, deps };\n return null;\n }\n const callback = args[0];\n const deps = args[1];\n if (callback?.type === \"function_definition\" && deps?.type === \"table_constructor\") return { callback, deps };\n return null;\n}\n\nfunction directTopLevelCalls(context: RuleContext, callback: SyntaxNode): SyntaxNode[] {\n const info = functionInfoForNode(context, callback);\n if (!info?.body) return [];\n return info.body.namedChildren.filter((child) => child.type === \"function_call\");\n}\n\nfunction hasCall(node: SyntaxNode, context: RuleContext): boolean {\n for (const child of context.walk(node)) {\n if (child.type === \"function_call\") return true;\n }\n return false;\n}\n\nfunction hasExternalSubscription(node: SyntaxNode, context: RuleContext): boolean {\n for (const child of context.walk(node)) {\n if (child.type !== \"function_call\") continue;\n const path = context.getCallPath(child) ?? \"\";\n if (/:Connect$/.test(path) || /BindToRenderStep$/.test(path) || /:BindAction(?:AtPriority)?$/.test(path)) return true;\n }\n return false;\n}\n\nfunction directLocalInitializer(owner: FunctionInfo, name: string): SyntaxNode | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const assignment = statement.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variableList = assignment?.namedChildren.find((child) => child.type === \"variable_list\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variableList?.namedChildren.filter((child) => child.type === \"identifier\") ?? [];\n const expressions = expressionList?.namedChildren ?? [];\n const index = names.findIndex((child) => child.text === name);\n if (index >= 0) return expressions[index] ?? expressions[0] ?? null;\n }\n return null;\n}\n\nfunction setterCalledOutsideCallback(context: RuleContext, owner: FunctionInfo, callback: SyntaxNode, setterName: string): boolean {\n if (!owner.body) return false;\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"function_call\" || context.getCallPath(node) !== setterName) continue;\n if (node.startIndex >= callback.startIndex && node.endIndex <= callback.endIndex) continue;\n return true;\n }\n return false;\n}\n\nfunction freshDependencyKind(node: SyntaxNode, owner: FunctionInfo): string | null {\n if (node.type === \"table_constructor\") return \"table\";\n if (node.type === \"function_definition\") return \"function\";\n\n if (node.type === \"identifier\") {\n const initializer = directLocalInitializer(owner, node.text);\n if (initializer?.type === \"table_constructor\") return \"table\";\n if (initializer?.type === \"function_definition\") return \"function\";\n }\n\n return null;\n}\n\nexport const noDerivedStateEffect: RuleDefinition = {\n id: \"react-luau/no-derived-state-effect\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Avoid copying render-known derived values into state from an effect.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!isEffectPath(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n if (hasExternalSubscription(parts.callback, context)) continue;\n const available = context.model.componentLocals.get(nodeKey(owner.node)) ?? new Set(owner.parameters);\n const bindings = stateBindingsFor(context, owner);\n const setterToValue = new Map(bindings.map((binding) => [binding.setterName, binding.valueName]));\n\n for (const setterCall of directTopLevelCalls(context, parts.callback)) {\n const setter = context.getCallPath(setterCall) ?? \"\";\n const targetState = setterToValue.get(setter);\n if (!targetState) continue;\n // If the setter is also used by handlers or other effects, the state has independent\n // ownership and is not merely a render-known derived copy.\n if (setterCalledOutsideCallback(context, owner, parts.callback, setter)) continue;\n const argument = context.callArguments(setterCall)[0];\n if (!argument || argument.type === \"function_definition\" || hasCall(argument, context)) continue;\n\n const sourceNames = [...available].filter((name) => name !== targetState && containsUnshadowedIdentifier(argument, name, context, owner));\n if (sourceNames.length === 0) continue;\n\n diagnostics.push({\n node: callNameNode(setterCall),\n message: `${setter}() stores a value derived from ${sourceNames.slice(0, 3).join(\", \")} inside an effect.`,\n help: \"Compute the value during render when it is fully derived from render-known inputs.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noSelfUpdatingEffect: RuleDefinition = {\n id: \"react-luau/no-self-updating-effect\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Effects should not unconditionally update state that is also one of their dependencies.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!isEffectPath(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n const deps = parseDependencyRoots(parts.deps);\n\n for (const binding of stateBindingsFor(context, owner)) {\n if (!deps.has(binding.valueName)) continue;\n for (const setterCall of directTopLevelCalls(context, parts.callback)) {\n if (context.getCallPath(setterCall) !== binding.setterName) continue;\n diagnostics.push({\n node: callNameNode(setterCall),\n message: `${binding.setterName}() updates ${binding.valueName}, which is also in this effect's dependency table.`,\n help: \"Guard the update so it converges, move it to the originating event, or derive the value during render.\",\n });\n }\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noEffectWithFreshDeps: RuleDefinition = {\n id: \"react-luau/no-effect-with-fresh-deps\",\n category: \"Hooks\",\n severity: \"error\",\n description: \"Dependency tables should not contain tables or functions recreated on every render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!HOOKS_WITH_DEPS.has(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n\n for (const dependency of dependencyExpressions(parts.deps)) {\n const kind = freshDependencyKind(dependency, owner);\n if (!kind) continue;\n const label = dependency.type === \"identifier\" ? ` ${dependency.text}` : \"\";\n diagnostics.push({\n node: dependency,\n message: `${path} depends on${label || \" an inline value\"} that is a new ${kind} on every render.`,\n help: \"Move the value inside the hook callback and depend on its simple inputs, or intentionally stabilize the value with useMemo/useCallback when identity is part of the contract.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noMutableInDeps: RuleDefinition = {\n id: \"react-luau/no-mutable-in-deps\",\n category: \"Hooks\",\n severity: \"error\",\n description: \"Mutable ref.current values do not belong in hook dependency tables.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!HOOKS_WITH_DEPS.has(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n const refs = context.model.refVariablesByFunction.get(nodeKey(owner.node)) ?? new Set<string>();\n\n for (const dependency of dependencyExpressions(parts.deps)) {\n const root = rootIdentifier(dependency.text);\n if (!root || !refs.has(root)) continue;\n if (!new RegExp(`^${root.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\s*\\\\.\\\\s*current\\\\b`).test(dependency.text.trim())) continue;\n diagnostics.push({\n node: dependency,\n message: `${dependency.text.trim()} is mutable ref state and will not itself trigger a React render when it changes.`,\n help: \"Read ref.current inside the hook body. Depend on reactive inputs that actually cause renders instead of listing the mutable current value.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
25
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { nodeKey, normalizeExpressionText, rootIdentifier, sameNode } from \"../ast/walk\";\nimport { mutableDependencyBase } from \"../roblox-semantics\";\nimport { declarationNames, dependencyExpressions, tableStartNode } from \"./helpers\";\n\nconst GLOBALS = new Set([\n \"game\", \"workspace\", \"script\", \"shared\", \"Enum\", \"Instance\", \"task\", \"coroutine\", \"debug\", \"os\", \"utf8\", \"buffer\", \"bit32\",\n \"math\", \"string\", \"table\", \"pairs\", \"ipairs\", \"next\", \"pcall\", \"xpcall\", \"print\", \"warn\", \"error\", \"assert\", \"type\", \"typeof\",\n \"tonumber\", \"tostring\", \"select\", \"unpack\", \"rawget\", \"rawset\", \"rawequal\", \"setmetatable\", \"getmetatable\", \"Vector2\", \"Vector3\", \"UDim\",\n \"UDim2\", \"CFrame\", \"Color3\", \"BrickColor\", \"Rect\", \"Region3\", \"Ray\", \"TweenInfo\", \"NumberRange\", \"NumberSequence\", \"ColorSequence\",\n \"DateTime\", \"Random\", \"Axes\", \"Faces\", \"PhysicalProperties\", \"RaycastParams\", \"OverlapParams\", \"DockWidgetPluginGuiInfo\",\n]);\n\nconst HOOK_ARGUMENTS = new Map<string, { callbackIndex: number; depsIndex: number }>([\n [\"React.useEffect\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useLayoutEffect\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useMemo\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useCallback\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useImperativeHandle\", { callbackIndex: 1, depsIndex: 2 }],\n]);\n\nfunction parameterNames(functionNode: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const parameters = functionNode.childForFieldName(\"parameters\");\n if (!parameters) return names;\n for (const node of parameters.namedChildren) {\n for (const candidate of descendants(node)) {\n if (candidate.type === \"identifier\") names.add(candidate.text);\n }\n }\n return names;\n}\n\nfunction* descendants(node: SyntaxNode): Iterable<SyntaxNode> {\n yield node;\n for (const child of node.namedChildren) yield* descendants(child);\n}\n\nfunction directBlockBindingNames(block: SyntaxNode, beforeIndex: number): Set<string> {\n const names = new Set<string>();\n for (const child of block.namedChildren) {\n if (child.startIndex >= beforeIndex) continue;\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) names.add(name);\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) names.add(name);\n }\n }\n return names;\n}\n\nfunction loopBindingNames(loop: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const header = loop.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const numeric = header.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) names.add(numeric[1]);\n const generic = header.match(/^\\s*for\\s+(.+?)\\s+in\\b/s);\n if (generic) {\n for (const part of generic[1].split(\",\")) {\n const name = part.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (name) names.add(name);\n }\n }\n return names;\n}\n\nfunction isLocallyBoundOccurrence(identifier: SyntaxNode, callback: SyntaxNode, name: string): boolean {\n if (parameterNames(callback).has(name)) return true;\n\n let current = identifier.parent;\n while (current && !sameNode(current, callback)) {\n if ((current.type === \"function_definition\" || current.type === \"function_declaration\") && parameterNames(current).has(name)) {\n return true;\n }\n if (current.type === \"block\" && directBlockBindingNames(current, identifier.startIndex).has(name)) return true;\n if (current.type === \"for_statement\" && loopBindingNames(current).has(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (!parent) return false;\n if (parent.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent.type === \"method_index_expression\") return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n // `fieldName = value` uses fieldName as a table key, not as a captured value.\n // Without this, a coincidentally named component local can create a fake dep.\n if (parent.type === \"field\" && !parent.text.trim().startsWith(\"[\")) {\n return sameNode(parent.childForFieldName(\"name\"), node);\n }\n return false;\n}\n\nfunction outermostDotPath(node: SyntaxNode): boolean {\n const parent = node.parent;\n return !(parent?.type === \"dot_index_expression\" && sameNode(parent.namedChildren[0], node));\n}\n\nfunction rootIdentifierNode(node: SyntaxNode, root: string): SyntaxNode | null {\n for (const candidate of descendants(node)) {\n if (candidate.type !== \"identifier\" || candidate.text !== root) continue;\n if (isPropertyName(candidate)) continue;\n return candidate;\n }\n return null;\n}\n\nfunction normalizeCapturedPath(\n path: string,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n): string | null {\n const normalized = normalizeExpressionText(path);\n const root = rootIdentifier(normalized);\n if (!root) return normalized;\n\n const mutableBase = mutableDependencyBase(normalized, externallyMutableRoots);\n if (mutableBase === \"\") return null;\n if (mutableBase) {\n const baseRoot = rootIdentifier(mutableBase);\n if (baseRoot && stableVariables.has(baseRoot)) return null;\n return mutableBase;\n }\n\n return normalized;\n}\n\nfunction capturedDependencyPaths(\n callback: SyntaxNode,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n): Set<string> {\n const captured = new Set<string>();\n\n for (const node of descendants(callback)) {\n if (node.type === \"dot_index_expression\" && outermostDotPath(node)) {\n const root = rootIdentifier(node.text);\n if (!root || !available.has(root) || GLOBALS.has(root) || stableVariables.has(root)) continue;\n const rootNode = rootIdentifierNode(node, root);\n if (!rootNode || isLocallyBoundOccurrence(rootNode, callback, root)) continue;\n const capture = normalizeCapturedPath(node.text, stableVariables, externallyMutableRoots);\n if (capture) captured.add(capture);\n continue;\n }\n\n if (node.type !== \"identifier\" || isPropertyName(node)) continue;\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.namedChildren[0], node)) continue;\n const name = node.text;\n if (!available.has(name) || GLOBALS.has(name) || stableVariables.has(name)) continue;\n if (isLocallyBoundOccurrence(node, callback, name)) continue;\n captured.add(name);\n }\n\n return captured;\n}\n\nfunction localFunctionNode(owner: FunctionInfo, name: string, context: RuleContext): SyntaxNode | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type === \"function_declaration\" && statement.childForFieldName(\"name\")?.text === name) return statement;\n if (statement.type !== \"variable_declaration\" || !declarationNames(statement).includes(name)) continue;\n const prefix = statement.text.split(\"=\", 1)[0] ?? \"\";\n if (!new RegExp(`\\b${name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\b`).test(prefix)) continue;\n const fn = [...context.walk(statement)].find((node) => node.type === \"function_definition\");\n if (fn) return fn;\n }\n return null;\n}\n\nfunction expandLocalFunctionCaptures(\n captured: Set<string>,\n owner: FunctionInfo,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n context: RuleContext,\n): Set<string> {\n const result = new Set<string>();\n const visiting = new Set<string>();\n\n const addCapture = (capture: string): void => {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(capture)) {\n result.add(capture);\n return;\n }\n const fn = localFunctionNode(owner, capture, context);\n if (visiting.has(capture)) return;\n if (!fn) {\n result.add(capture);\n return;\n }\n\n visiting.add(capture);\n const inner = capturedDependencyPaths(fn, available, stableVariables, externallyMutableRoots);\n for (const dependency of inner) addCapture(dependency);\n visiting.delete(capture);\n };\n\n for (const capture of captured) addCapture(capture);\n return result;\n}\n\nfunction dependencyPaths(node: SyntaxNode): Set<string> {\n return new Set(dependencyExpressions(node).map((dependency) => normalizeExpressionText(dependency.text)));\n}\n\nconst PURE_DERIVED_CALL = /^(?:math\\.(?!random(?:seed)?$)[A-Za-z_][A-Za-z0-9_]*|string\\.[A-Za-z_][A-Za-z0-9_]*|table\\.(?:find|concat|clone|create|isfrozen)|(?:Color3|Vector2|Vector3|UDim|UDim2|CFrame|BrickColor|Rect|NumberRange|NumberSequence|ColorSequence|TweenInfo|Font|Ray|Region3|PhysicalProperties)\\.[A-Za-z_][A-Za-z0-9_]*|[^:]+:(?:ToHSV|Lerp|Dot|Cross|FuzzyEq|Inverse|ToObjectSpace|ToWorldSpace))$/;\n\nfunction isPureDerivedExpression(node: SyntaxNode, context: RuleContext): boolean {\n for (const candidate of context.walk(node)) {\n if (candidate !== node && (candidate.type === \"function_definition\" || candidate.type === \"function_declaration\")) return false;\n if (candidate.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(candidate);\n if (!rawPath) return false;\n const path = normalizeExpressionText(context.resolveCallPath(rawPath));\n if (!PURE_DERIVED_CALL.test(path)) return false;\n }\n return true;\n}\n\nfunction mutatedOwnerLocals(owner: FunctionInfo, context: RuleContext): Set<string> {\n const mutated = new Set<string>();\n if (!owner.body) return mutated;\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"assignment_statement\" && node.type !== \"update_statement\") continue;\n if (node.parent?.type === \"variable_declaration\") continue;\n const variables = node.namedChildren.find((child) => child.type === \"variable_list\");\n if (!variables) continue;\n for (const variable of variables.namedChildren) {\n const root = rootIdentifier(normalizeExpressionText(variable.text));\n if (root) mutated.add(root);\n }\n }\n\n return mutated;\n}\n\nfunction derivedLocalDependencies(\n owner: FunctionInfo,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n context: RuleContext,\n): Map<string, Set<string>> {\n const derived = new Map<string, Set<string>>();\n if (!owner.body) return derived;\n const mutated = mutatedOwnerLocals(owner, context);\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || mutated.has(name) || !isPureDerivedExpression(expression, context)) continue;\n derived.set(name, capturedDependencyPaths(expression, available, stableVariables, externallyMutableRoots));\n }\n }\n\n return derived;\n}\n\nfunction expandDerivedLocalCaptures(\n captured: Set<string>,\n derived: Map<string, Set<string>>,\n dependencies: Set<string>,\n): Set<string> {\n const result = new Set<string>();\n const visiting = new Set<string>();\n\n const addCapture = (capture: string): void => {\n if (dependencySatisfies(capture, dependencies)) {\n result.add(capture);\n return;\n }\n const root = rootIdentifier(capture);\n if (!root || !derived.has(root)) {\n result.add(capture);\n return;\n }\n if (visiting.has(root)) return;\n\n visiting.add(root);\n for (const dependency of derived.get(root) ?? []) addCapture(dependency);\n visiting.delete(root);\n };\n\n for (const capture of captured) addCapture(capture);\n return result;\n}\n\nfunction hasDynamicUnpackDependencies(node: SyntaxNode, context: RuleContext): boolean {\n for (const dependency of dependencyExpressions(node)) {\n for (const candidate of context.walk(dependency)) {\n if (candidate.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(candidate);\n if (!rawPath) continue;\n const path = normalizeExpressionText(context.resolveCallPath(rawPath));\n if (path === \"unpack\" || path === \"table.unpack\") return true;\n }\n }\n return false;\n}\n\nfunction memoizedProducerDependencies(owner: FunctionInfo, context: RuleContext): Map<string, Set<string>> {\n const producers = new Map<string, Set<string>>();\n if (!owner.body) return producers;\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || expression.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(expression);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (path !== \"React.useMemo\" && path !== \"React.useCallback\") continue;\n const args = context.callArguments(expression);\n const deps = args[1];\n if (!deps || deps.type !== \"table_constructor\" || hasDynamicUnpackDependencies(deps, context)) continue;\n producers.set(name, dependencyPaths(deps));\n }\n }\n\n return producers;\n}\n\nfunction isTransitivelyCoveredMemoizedValue(\n dependency: string,\n producers: Map<string, Set<string>>,\n dependencies: Set<string>,\n): boolean {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(dependency)) return false;\n const producerDependencies = producers.get(dependency);\n if (!producerDependencies) return false;\n return [...producerDependencies].every((producerDependency) => dependencySatisfies(producerDependency, dependencies));\n}\n\nfunction dependencySatisfies(captured: string, dependencies: Set<string>): boolean {\n for (const dependency of dependencies) {\n if (captured === dependency) return true;\n if (captured.startsWith(`${dependency}.`) || captured.startsWith(`${dependency}[`)) return true;\n }\n return false;\n}\n\nfunction minimalMissingDependencies(captured: Set<string>, dependencies: Set<string>): string[] {\n const missing = [...captured]\n .filter((name) => !dependencySatisfies(name, dependencies))\n .sort((left, right) => left.length - right.length || left.localeCompare(right));\n const result: string[] = [];\n for (const candidate of missing) {\n if (dependencySatisfies(candidate, new Set(result))) continue;\n result.push(candidate);\n }\n return result.sort();\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction directCallsInExpression(node: SyntaxNode): SyntaxNode[] {\n const calls: SyntaxNode[] = [];\n const pending = [node];\n while (pending.length > 0) {\n const current = pending.pop()!;\n if (current !== node && (current.type === \"function_definition\" || current.type === \"function_declaration\")) continue;\n if (current.type === \"function_call\") calls.push(current);\n pending.push(...current.namedChildren);\n }\n return calls;\n}\n\nfunction isCustomHookCall(call: SyntaxNode, context: RuleContext): boolean {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return !path.startsWith(\"React.\") && /^use[A-Z0-9_]/.test(final);\n}\n\ninterface CustomHookDependencyHints {\n memberHandleRoots: Set<string>;\n likelyHandleRoots: Set<string>;\n compositeHandleRoots: Set<string>;\n}\n\nconst HANDLE_VALUE_NAME = /(?:ref|binding|tween|spring|motion|animation|controller|handle|connection|signal)$/i;\nconst HANDLE_HOOK_NAME = /(?:Tween|Spring|Binding|Motion|Animated|Animation|Sound)$/i;\n\nfunction isCalledAsFunction(owner: FunctionInfo, name: string, context: RuleContext): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const path = normalizeExpressionText(context.getCallPath(call) ?? \"\");\n if (path === name) return true;\n }\n return false;\n}\n\nfunction customHookDependencyHints(owner: FunctionInfo, context: RuleContext): CustomHookDependencyHints {\n const hints: CustomHookDependencyHints = {\n memberHandleRoots: new Set<string>(),\n likelyHandleRoots: new Set<string>(),\n compositeHandleRoots: new Set<string>(),\n };\n if (!owner.body) return hints;\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression) continue;\n const calls = directCallsInExpression(expression);\n if (calls.length === 0) continue;\n\n const directHook = calls.find((call) => isCustomHookCall(call, context));\n if (directHook && expression.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(directHook) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n const likelyHandle = HANDLE_VALUE_NAME.test(name) || HANDLE_HOOK_NAME.test(final) || isCalledAsFunction(owner, name, context);\n if (likelyHandle) {\n hints.memberHandleRoots.add(name);\n hints.likelyHandleRoots.add(name);\n }\n continue;\n }\n\n if (expression.type === \"table_constructor\") {\n const meaningfulCalls = calls.filter((call) => {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n return !/^(?:Color3|Vector2|Vector3|UDim|UDim2|CFrame|TweenInfo|NumberSequence|ColorSequence)\\./.test(path);\n });\n const allHandleHooks = meaningfulCalls.length > 0 && meaningfulCalls.every((call) => {\n if (!isCustomHookCall(call, context)) return false;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return HANDLE_HOOK_NAME.test(final);\n });\n if (allHandleHooks) hints.compositeHandleRoots.add(name);\n }\n }\n }\n\n return hints;\n}\n\nfunction isAmbiguousCustomHookHandle(dependency: string, hints: CustomHookDependencyHints): boolean {\n const root = rootIdentifier(dependency);\n if (!root) return false;\n if (hints.compositeHandleRoots.has(root)) return true;\n if (hints.likelyHandleRoots.has(root)) return true;\n return hints.memberHandleRoots.has(root) && dependency !== root;\n}\n\n\nexport const exhaustiveDeps: RuleDefinition = {\n id: \"react-luau/exhaustive-deps\",\n category: \"Hooks\",\n severity: \"warning\",\n description: \"React hook dependency tables should include captured reactive render values.\",\n run(context: RuleContext) {\n const diagnostics: DiagnosticInput[] = [];\n const derivedDependenciesByOwner = new Map<number, Map<string, Set<string>>>();\n const dependencyHintsByOwner = new Map<number, CustomHookDependencyHints>();\n const memoizedProducersByOwner = new Map<number, Map<string, Set<string>>>();\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n const shape = HOOK_ARGUMENTS.get(path);\n if (!shape) continue;\n\n const args = context.callArguments(call);\n const callback = args[shape.callbackIndex];\n const deps = args[shape.depsIndex];\n if (!callback || callback.type !== \"function_definition\" || !deps || deps.type !== \"table_constructor\") continue;\n\n const owner = context.nearestFunction(call);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const ownerKey = nodeKey(owner.node);\n const available = context.model.componentLocals.get(ownerKey) ?? new Set<string>();\n const stableVariables = context.model.stableVariablesByFunction.get(ownerKey) ?? new Set<string>();\n const externallyMutableRoots = context.model.externalMutableVariablesByFunction.get(ownerKey) ?? new Set<string>();\n const functionExpandedCaptures = expandLocalFunctionCaptures(\n capturedDependencyPaths(callback, available, stableVariables, externallyMutableRoots),\n owner,\n available,\n stableVariables,\n externallyMutableRoots,\n context,\n );\n const dependencies = dependencyPaths(deps);\n let derivedDependencies = derivedDependenciesByOwner.get(ownerKey);\n if (!derivedDependencies) {\n derivedDependencies = derivedLocalDependencies(owner, available, stableVariables, externallyMutableRoots, context);\n derivedDependenciesByOwner.set(ownerKey, derivedDependencies);\n }\n const captured = expandDerivedLocalCaptures(\n functionExpandedCaptures,\n derivedDependencies,\n dependencies,\n );\n const missing = minimalMissingDependencies(captured, dependencies);\n if (missing.length === 0) continue;\n\n if (hasDynamicUnpackDependencies(deps, context)) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} uses dynamic unpack(...) dependencies, so exhaustive dependency analysis is partial.`,\n help: \"The analyzer cannot prove which values unpack(...) contributes. Review the explicit dependencies and the custom hook contract.\",\n });\n continue;\n }\n\n let hints = dependencyHintsByOwner.get(ownerKey);\n if (!hints) {\n hints = customHookDependencyHints(owner, context);\n dependencyHintsByOwner.set(ownerKey, hints);\n }\n let memoizedProducers = memoizedProducersByOwner.get(ownerKey);\n if (!memoizedProducers) {\n memoizedProducers = memoizedProducerDependencies(owner, context);\n memoizedProducersByOwner.set(ownerKey, memoizedProducers);\n }\n const uncertainHandles = missing.filter((dependency) => isAmbiguousCustomHookHandle(dependency, hints));\n const transitivelyCoveredMemoized = missing.filter((dependency) =>\n !isAmbiguousCustomHookHandle(dependency, hints)\n && isTransitivelyCoveredMemoizedValue(dependency, memoizedProducers, dependencies)\n );\n const reactiveMissing = missing.filter((dependency) =>\n !isAmbiguousCustomHookHandle(dependency, hints)\n && !isTransitivelyCoveredMemoizedValue(dependency, memoizedProducers, dependencies)\n );\n\n if (reactiveMissing.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n message: `${path} dependency table is missing ${reactiveMissing.join(\", \")}.`,\n help: `Add ${reactiveMissing.join(\", \")} to the dependency table, or stop capturing ${reactiveMissing.length === 1 ? \"that value\" : \"those values\"} in the callback.`,\n });\n }\n\n if (transitivelyCoveredMemoized.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} captures memoized value ${transitivelyCoveredMemoized.join(\", \")} without listing ${transitivelyCoveredMemoized.length === 1 ? \"it directly\" : \"them directly\"}, but ${transitivelyCoveredMemoized.length === 1 ? \"its memo dependencies are\" : \"their memo dependencies are\"} already covered.`,\n help: \"The producing memo dependencies are already covered. Listing the memoized value directly can make the dependency relationship clearer.\",\n });\n }\n\n if (uncertainHandles.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} captures custom-hook handle ${uncertainHandles.join(\", \")} without listing ${uncertainHandles.length === 1 ? \"it as a dependency\" : \"them as dependencies\"}.`,\n help: \"The analyzer cannot prove this custom-hook return is stable. Check the hook contract before changing the dependency table.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
26
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { RuleContext, RuleDefinition } from \"../types\";\nimport { assignmentLeft, fieldName, fieldValue } from \"./helpers\";\n\nfunction loopIndex(text: string): string | null {\n const numeric = text.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) return numeric[1];\n\n const generic = text.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,/s);\n const candidate = generic?.[1] ?? null;\n // Single-letter keys are frequently dictionary keys in Luau, not array positions.\n return candidate && /^(?:idx|index|position)$/i.test(candidate) ? candidate : null;\n}\n\nfunction assignmentAncestor(call: SyntaxNode, loop: SyntaxNode): SyntaxNode | null {\n let current = call.parent;\n while (current && current.startIndex >= loop.startIndex && current.endIndex <= loop.endIndex) {\n if (current.type === \"assignment_statement\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction createElementCallsInLoop(context: RuleContext, loop: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n for (const node of context.walk(loop)) {\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"React.createElement\") result.push(node);\n }\n return result;\n}\n\nexport const noArrayIndexAsKey: RuleDefinition = {\n id: \"react-luau/no-array-index-as-key\",\n category: \"Correctness\",\n severity: \"suggestion\",\n description: \"Review dynamic React children that use their current array position as identity.\",\n run(context) {\n const diagnostics = [];\n\n for (const node of context.walk()) {\n if (node.type !== \"for_statement\") continue;\n const index = loopIndex(node.text);\n if (!index) continue;\n const escaped = index.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const keyProp = new RegExp(`\\\\bkey\\\\s*=\\\\s*${escaped}\\\\b`);\n const indexedTarget = new RegExp(`\\\\[\\\\s*${escaped}\\\\s*\\\\]\\\\s*$`);\n\n const highlights: SyntaxNode[] = [];\n for (const call of createElementCallsInLoop(context, node)) {\n const props = context.callArguments(call)[1];\n if (props?.type === \"table_constructor\" && keyProp.test(props.text)) {\n const keyField = props.namedChildren.find((field) =>\n field.type === \"field\" && fieldName(field) === \"key\" && fieldValue(field)?.text.trim() === index\n );\n highlights.push(fieldValue(keyField ?? props) ?? keyField ?? props);\n }\n\n const assignment = assignmentAncestor(call, node);\n if (assignment && indexedTarget.test(assignmentLeft(assignment.text))) {\n const indexNode = [...context.walk(assignment)].find((candidate) =>\n candidate.type === \"identifier\" && candidate.text === index && candidate.startIndex < call.startIndex\n );\n highlights.push(indexNode ?? assignment);\n }\n }\n\n if (highlights.length === 0) continue;\n diagnostics.push({\n node: highlights[0],\n highlights,\n message: `Loop index ${index} is used as React child identity.`,\n help: \"Use a stable item key when children can be inserted, removed, reordered, or kept alive for exit animation.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
27
27
|
"import type { RuleDefinition } from \"../types\";\nimport { callNameNode } from \"./helpers\";\n\nexport const noCreateContextInRender: RuleDefinition = {\n id: \"react-luau/no-create-context-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"React contexts must have stable identity and should not be created during render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.createContext\") continue;\n const owner = context.nearestFunction(call);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n if (!context.isDirectlyExecutedInFunction(call, owner)) continue;\n\n diagnostics.push({\n node: callNameNode(call),\n message: `React.createContext() is called during ${owner.isHook ? \"hook\" : \"component\"} render${owner.name ? ` in ${owner.name}` : \"\"}.`,\n help: \"Create the context once at module scope so providers and consumers keep the same context identity.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
28
28
|
"import type { FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\n\nfunction enclosingComponent(context: RuleContext, candidate: FunctionInfo): FunctionInfo | null {\n let current = candidate.node.parent;\n while (current) {\n const info = context.model.functionByNode.get(current.id);\n if (info?.isComponent) return info;\n current = current.parent;\n }\n return null;\n}\n\nfunction isRenderedBy(context: RuleContext, component: FunctionInfo, name: string): boolean {\n if (!component.body) return false;\n for (const call of context.walk(component.body)) {\n if (call.type !== \"function_call\") continue;\n if (context.nearestFunction(call) !== component) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.createElement\") continue;\n if (context.callArguments(call)[0]?.text.trim() === name) return true;\n }\n return false;\n}\n\n\nfunction componentNameNode(context: RuleContext, candidate: FunctionInfo): FunctionInfo[\"node\"] {\n const direct = candidate.node.childForFieldName(\"name\");\n if (direct) return direct;\n let current = candidate.node.parent;\n while (current && current.type !== \"variable_declaration\" && current.type !== \"function_declaration\") current = current.parent;\n if (current) {\n const identifier = [...context.walk(current)].find((node) =>\n node.type === \"identifier\" && node.text === candidate.name && node.startIndex < candidate.node.startIndex\n );\n if (identifier) return identifier;\n }\n return candidate.node;\n}\n\nexport const noNestedComponentDefinition: RuleDefinition = {\n id: \"react-luau/no-nested-component-definition\",\n category: \"Architecture\",\n severity: \"warning\",\n description: \"Do not define rendered component types inside another component.\",\n run(context) {\n const diagnostics = [];\n\n for (const candidate of context.model.functions) {\n if (!candidate.isComponent || !candidate.name || !/^[A-Z]/.test(candidate.name)) continue;\n const parent = enclosingComponent(context, candidate);\n if (!parent || !isRenderedBy(context, parent, candidate.name)) continue;\n\n diagnostics.push({\n node: componentNameNode(context, candidate),\n message: `${candidate.name} is defined inside ${parent.name ?? \"another component\"} and rendered as a component type.`,\n help: \"Move the nested component to module scope. Recreating a component type on each parent render can remount it and discard its local state.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
29
29
|
"import path from \"node:path\";\n\nexport interface ModuleIdentity {\n id: string;\n keys: string[];\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nexport function moduleKeys(relativePath: string): string[] {\n let normalized = normalizeRelative(relativePath).replace(/\\.(?:lua|luau)$/i, \"\");\n if (normalized.endsWith(\"/init\")) normalized = normalized.slice(0, -\"/init\".length);\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments[0]?.toLowerCase() === \"src\") segments.shift();\n\n const keys = new Set<string>();\n for (let index = 0; index < segments.length; index += 1) {\n const suffix = segments.slice(index).join(\".\").toLowerCase();\n if (suffix) keys.add(suffix);\n }\n return [...keys];\n}\n\nexport function normalizeRequireTarget(text: string): string {\n return (text.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? []).join(\".\").toLowerCase();\n}\n\n/**\n * Builds feature aliases only when an alias uniquely identifies one module in\n * the entire project. This prevents basename collisions and overlapping names\n * when one module name is merely a suffix of another or when multiple\n * directories contain modules with the same basename.\n */\nexport function buildUniqueFeatureAliases<T>(\n modules: ModuleIdentity[],\n featureByModuleId: Map<string, T>,\n): Map<string, T> {\n const owners = new Map<string, Set<string>>();\n for (const module of modules) {\n for (const key of module.keys) {\n const ids = owners.get(key) ?? new Set<string>();\n ids.add(module.id);\n owners.set(key, ids);\n }\n }\n\n const aliases = new Map<string, T>();\n for (const module of modules) {\n const value = featureByModuleId.get(module.id);\n if (value === undefined) continue;\n for (const key of module.keys) {\n const ids = owners.get(key);\n if (ids?.size === 1 && ids.has(module.id)) aliases.set(key, value);\n }\n }\n return aliases;\n}\n\nexport function resolveModuleReference<T>(target: string, aliases: Map<string, T>): T | null {\n // Module aliases are segment suffixes (for example `foo.bar` and `bar`).\n // Walk those suffixes directly instead of scanning every alias in the project\n // for every require expression. The first hit is necessarily the longest one.\n let candidate = target;\n while (true) {\n if (aliases.has(candidate)) return aliases.get(candidate)!;\n const separator = candidate.indexOf(\".\");\n if (separator < 0) return null;\n candidate = candidate.slice(separator + 1);\n }\n}\n",
|
|
30
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport { moduleKeys, normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport { normalizeExpressionText, rootIdentifier, sameNode } from \"../ast/walk\";\nimport type { FunctionInfo, RuleContext, SourceEffectModuleSummary, StateBinding } from \"../types\";\n\nexport type MutationValueOrigin =\n | { kind: \"props\"; name: string }\n | { kind: \"state\"; binding: StateBinding }\n | { kind: \"fresh\" }\n | { kind: \"unknown\" };\n\ninterface ImportBinding {\n declaration: SyntaxNode;\n summary: SourceEffectModuleSummary;\n}\n\ninterface BindingLookup {\n node: SyntaxNode;\n expression: SyntaxNode | null;\n}\n\ninterface MutationAnalysis {\n currentSummary: SourceEffectModuleSummary | null;\n imports: Map<string, ImportBinding>;\n mutatingFactoryMembers: Set<string>;\n callIndexes: Map<number, ReadonlySet<number>>;\n originCache: Map<string, MutationValueOrigin>;\n}\n\nconst analysisCache = new WeakMap<RuleContext, MutationAnalysis>();\nconst EMPTY_INDEXES: ReadonlySet<number> = new Set<number>();\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variables = assignment?.namedChildren.find((child) => child.type === \"variable_list\")\n ?? node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction assignmentParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"assignment_statement\" || node.parent?.type === \"variable_declaration\") {\n return { names: [], expressions: [] };\n }\n const variables = node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = node.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction expressionForName(node: SyntaxNode, name: string): SyntaxNode | null | undefined {\n const { names, expressions } = node.type === \"variable_declaration\" ? declarationParts(node) : assignmentParts(node);\n const index = names.indexOf(name);\n if (index < 0) return undefined;\n return expressions[index] ?? expressions[0] ?? null;\n}\n\nfunction currentModuleSummary(context: RuleContext): SourceEffectModuleSummary | null {\n for (const key of moduleKeys(context.relativePath)) {\n const summary = context.project.sourceEffects.get(key);\n if (summary) return summary;\n }\n return null;\n}\n\nfunction topLevelImports(context: RuleContext): Map<string, ImportBinding> {\n const result = new Map<string, ImportBinding>();\n for (const node of context.root.namedChildren) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_call\") continue;\n const match = expression.text.match(/^\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const summary = resolveModuleReference(normalizeRequireTarget(match[1]), context.project.sourceEffects);\n if (summary) result.set(names[index], { declaration: node, summary });\n }\n }\n return result;\n}\n\nfunction analysisFor(context: RuleContext): MutationAnalysis {\n const cached = analysisCache.get(context);\n if (cached) return cached;\n const imports = topLevelImports(context);\n const mutatingFactoryMembers = new Set<string>();\n for (const { summary } of imports.values()) {\n if (summary.instanceFactories.size === 0) continue;\n for (const member of summary.mutatingMemberParameters.keys()) mutatingFactoryMembers.add(member);\n }\n const result: MutationAnalysis = {\n currentSummary: currentModuleSummary(context),\n imports,\n mutatingFactoryMembers,\n callIndexes: new Map(),\n originCache: new Map(),\n };\n analysisCache.set(context, result);\n return result;\n}\n\nfunction directChildContaining(block: SyntaxNode, node: SyntaxNode): SyntaxNode | null {\n for (const child of block.namedChildren) {\n if (child.startIndex <= node.startIndex && child.endIndex >= node.endIndex) return child;\n }\n return null;\n}\n\nfunction visibleBinding(name: string, node: SyntaxNode, owner: FunctionInfo): BindingLookup | null {\n let current: SyntaxNode | null = node;\n while (current && !sameNode(current, owner.node)) {\n const parent: SyntaxNode | null = current.parent;\n if (parent?.type === \"block\") {\n const containing = directChildContaining(parent, node);\n const beforeIndex = containing?.startIndex ?? node.startIndex;\n const children = parent.namedChildren;\n for (let index = children.length - 1; index >= 0; index -= 1) {\n const child = children[index];\n if (child.startIndex >= beforeIndex) continue;\n if (child.type !== \"variable_declaration\" && child.type !== \"assignment_statement\") continue;\n const expression = expressionForName(child, name);\n if (expression !== undefined) return { node: child, expression };\n }\n }\n current = parent;\n }\n return null;\n}\n\nfunction isTopLevelFunctionVisible(context: RuleContext, name: string, owner: FunctionInfo): boolean {\n for (const node of context.root.namedChildren) {\n if (node.startIndex >= owner.node.startIndex) break;\n if (node.type === \"function_declaration\") {\n const declared = node.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (declared === name) return true;\n continue;\n }\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n const index = names.indexOf(name);\n if (index < 0) continue;\n if ((expressions[index] ?? expressions[0])?.type === \"function_definition\") return true;\n }\n return false;\n}\n\nfunction moduleBindingVisible(binding: ImportBinding, name: string, call: SyntaxNode, owner: FunctionInfo): boolean {\n if (binding.declaration.startIndex >= owner.node.startIndex) return false;\n if (owner.parameters.includes(name)) return false;\n return visibleBinding(name, call, owner) === null;\n}\n\nfunction builtinMutatedParameterIndexes(path: string, argumentCount: number): ReadonlySet<number> {\n switch (path) {\n case \"rawset\":\n case \"setmetatable\":\n case \"table.clear\":\n case \"table.freeze\":\n case \"table.insert\":\n case \"table.remove\":\n case \"table.sort\":\n return argumentCount > 0 ? new Set([0]) : EMPTY_INDEXES;\n case \"table.move\":\n return argumentCount >= 5 ? new Set([4]) : argumentCount > 0 ? new Set([0]) : EMPTY_INDEXES;\n default:\n return EMPTY_INDEXES;\n }\n}\n\nfunction importedFactorySummary(\n context: RuleContext,\n receiver: string,\n call: SyntaxNode,\n owner: FunctionInfo,\n analysis: MutationAnalysis,\n): SourceEffectModuleSummary | null {\n const binding = visibleBinding(receiver, call, owner);\n if (!binding?.expression) return null;\n const expression = binding.expression;\n if (expression.type === \"identifier\") {\n return importedFactorySummary(context, expression.text, expression, owner, analysis);\n }\n if (expression.type !== \"function_call\") return null;\n const path = normalizeExpressionText(context.getCallPath(expression) ?? \"\");\n const match = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) return null;\n const imported = analysis.imports.get(match[1]);\n if (!imported || !moduleBindingVisible(imported, match[1], expression, owner)) return null;\n return imported.summary.instanceFactories.has(match[2]) ? imported.summary : null;\n}\n\nexport function mightMutateParameters(context: RuleContext, call: SyntaxNode): boolean {\n const path = normalizeExpressionText(context.getCallPath(call) ?? \"\");\n if (builtinMutatedParameterIndexes(path, context.callArguments(call).length).size > 0) return true;\n\n const analysis = analysisFor(context);\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(path)) {\n if ((analysis.currentSummary?.localMutatingParameters.get(path)?.size ?? 0) > 0) return true;\n return (analysis.imports.get(path)?.summary.mutatingExportParameters.size ?? 0) > 0;\n }\n\n const member = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!member) return false;\n if ((analysis.imports.get(member[1])?.summary.mutatingMemberParameters.get(member[2])?.size ?? 0) > 0) return true;\n return analysis.mutatingFactoryMembers.has(member[2]);\n}\n\nexport function mutatedParameterIndexesForCall(\n context: RuleContext,\n call: SyntaxNode,\n owner: FunctionInfo,\n): ReadonlySet<number> {\n const analysis = analysisFor(context);\n const cached = analysis.callIndexes.get(call.id);\n if (cached) return cached;\n\n const path = normalizeExpressionText(context.getCallPath(call) ?? \"\");\n const builtin = builtinMutatedParameterIndexes(path, context.callArguments(call).length);\n if (builtin.size > 0) {\n analysis.callIndexes.set(call.id, builtin);\n return builtin;\n }\n\n let result: ReadonlySet<number> = EMPTY_INDEXES;\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(path)) {\n const importBinding = analysis.imports.get(path);\n if (importBinding && moduleBindingVisible(importBinding, path, call, owner)) {\n result = importBinding.summary.mutatingExportParameters;\n } else if (\n !owner.parameters.includes(path)\n && visibleBinding(path, call, owner) === null\n && isTopLevelFunctionVisible(context, path, owner)\n ) {\n result = analysis.currentSummary?.localMutatingParameters.get(path) ?? EMPTY_INDEXES;\n }\n } else {\n const member = path.match(/^([A-Za-z_][A-Za-z0-9_]*)([.:])([A-Za-z_][A-Za-z0-9_]*)$/);\n if (member) {\n const imported = analysis.imports.get(member[1]);\n if (imported && moduleBindingVisible(imported, member[1], call, owner)) {\n result = imported.summary.mutatingMemberParameters.get(member[3]) ?? EMPTY_INDEXES;\n } else {\n const factory = importedFactorySummary(context, member[1], call, owner, analysis);\n result = factory?.mutatingMemberParameters.get(member[3]) ?? EMPTY_INDEXES;\n }\n }\n }\n\n analysis.callIndexes.set(call.id, result);\n return result;\n}\n\nfunction freshExpression(context: RuleContext, expression: SyntaxNode): boolean {\n if (expression.type === \"table_constructor\" || expression.type === \"function_definition\") return true;\n if (expression.type !== \"function_call\") return false;\n const path = normalizeExpressionText(context.getCallPath(expression) ?? \"\");\n if (path === \"table.clone\" || path === \"table.create\" || path === \"table.pack\") return true;\n if (path === \"setmetatable\") {\n const first = context.callArguments(expression)[0];\n return Boolean(first && freshExpression(context, first));\n }\n return false;\n}\n\nfunction stateBindingForName(context: RuleContext, owner: FunctionInfo, name: string, bindingNode: SyntaxNode): StateBinding | null {\n return context.model.stateBindings.find((binding) =>\n binding.owner === owner && binding.valueName === name && sameNode(binding.declaration, bindingNode)\n ) ?? null;\n}\n\nfunction resolveNameOrigin(\n context: RuleContext,\n name: string,\n atNode: SyntaxNode,\n owner: FunctionInfo,\n seen: Set<string>,\n): MutationValueOrigin {\n const key = `${owner.node.id}:${name}:${atNode.startIndex}`;\n if (seen.has(key)) return { kind: \"unknown\" };\n seen.add(key);\n\n const binding = visibleBinding(name, atNode, owner);\n if (binding) {\n const state = stateBindingForName(context, owner, name, binding.node);\n if (state) return { kind: \"state\", binding: state };\n if (!binding.expression) return { kind: \"unknown\" };\n return resolveExpressionOriginInternal(context, binding.expression, owner, seen);\n }\n\n if (owner.isComponent && owner.parameters[0] === name) return { kind: \"props\", name };\n return { kind: \"unknown\" };\n}\n\nfunction resolveExpressionOriginInternal(\n context: RuleContext,\n expression: SyntaxNode,\n owner: FunctionInfo,\n seen: Set<string>,\n): MutationValueOrigin {\n if (freshExpression(context, expression)) return { kind: \"fresh\" };\n const root = rootIdentifier(expression.text);\n if (!root) return { kind: \"unknown\" };\n return resolveNameOrigin(context, root, expression, owner, seen);\n}\n\nexport function mutationOriginForExpression(\n context: RuleContext,\n expression: SyntaxNode,\n owner: FunctionInfo,\n): MutationValueOrigin {\n const analysis = analysisFor(context);\n const key = `${owner.node.id}:${expression.id}`;\n const cached = analysis.originCache.get(key);\n if (cached) return cached;\n const result = resolveExpressionOriginInternal(context, expression, owner, new Set());\n analysis.originCache.set(key, result);\n return result;\n}\n",
|
|
30
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport { moduleKeys, normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport { normalizeExpressionText, rootIdentifier, sameNode } from \"../ast/walk\";\nimport type { FunctionInfo, RuleContext, SourceEffectModuleSummary, StateBinding } from \"../types\";\n\nexport type MutationValueOrigin =\n | { kind: \"props\"; name: string }\n | { kind: \"state\"; binding: StateBinding }\n | { kind: \"fresh\" }\n | { kind: \"unknown\" };\n\ninterface ImportBinding {\n declaration: SyntaxNode;\n summary: SourceEffectModuleSummary;\n}\n\ninterface BindingLookup {\n node: SyntaxNode;\n expression: SyntaxNode | null;\n}\n\ninterface MutationAnalysis {\n currentSummary: SourceEffectModuleSummary | null;\n imports: Map<string, ImportBinding>;\n mutatingFactoryMembers: Set<string>;\n callIndexes: Map<number, ReadonlySet<number>>;\n originCache: Map<string, MutationValueOrigin>;\n}\n\nconst analysisCache = new WeakMap<RuleContext, MutationAnalysis>();\nconst EMPTY_INDEXES: ReadonlySet<number> = new Set<number>();\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variables = assignment?.namedChildren.find((child) => child.type === \"variable_list\")\n ?? node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction assignmentParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"assignment_statement\" || node.parent?.type === \"variable_declaration\") {\n return { names: [], expressions: [] };\n }\n const variables = node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = node.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction expressionForName(node: SyntaxNode, name: string): SyntaxNode | null | undefined {\n const { names, expressions } = node.type === \"variable_declaration\" ? declarationParts(node) : assignmentParts(node);\n const index = names.indexOf(name);\n if (index < 0) return undefined;\n return expressions[index] ?? expressions[0] ?? null;\n}\n\nfunction currentModuleSummary(context: RuleContext): SourceEffectModuleSummary | null {\n for (const key of moduleKeys(context.relativePath)) {\n const summary = context.project.sourceEffects.get(key);\n if (summary) return summary;\n }\n return null;\n}\n\nfunction topLevelImports(context: RuleContext): Map<string, ImportBinding> {\n const result = new Map<string, ImportBinding>();\n for (const node of context.root.namedChildren) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_call\") continue;\n const match = expression.text.match(/^\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const summary = resolveModuleReference(normalizeRequireTarget(match[1]), context.project.sourceEffects);\n if (summary) result.set(names[index], { declaration: node, summary });\n }\n }\n return result;\n}\n\nfunction analysisFor(context: RuleContext): MutationAnalysis {\n const cached = analysisCache.get(context);\n if (cached) return cached;\n const imports = topLevelImports(context);\n const mutatingFactoryMembers = new Set<string>();\n for (const { summary } of imports.values()) {\n if (summary.instanceFactories.size === 0) continue;\n for (const member of summary.mutatingMemberParameters.keys()) mutatingFactoryMembers.add(member);\n }\n const result: MutationAnalysis = {\n currentSummary: currentModuleSummary(context),\n imports,\n mutatingFactoryMembers,\n callIndexes: new Map(),\n originCache: new Map(),\n };\n analysisCache.set(context, result);\n return result;\n}\n\nfunction directChildContaining(block: SyntaxNode, node: SyntaxNode): SyntaxNode | null {\n for (const child of block.namedChildren) {\n if (child.startIndex <= node.startIndex && child.endIndex >= node.endIndex) return child;\n }\n return null;\n}\n\nfunction visibleBinding(name: string, node: SyntaxNode, owner: FunctionInfo): BindingLookup | null {\n let current: SyntaxNode | null = node;\n while (current && !sameNode(current, owner.node)) {\n const parent: SyntaxNode | null = current.parent;\n if (parent?.type === \"block\") {\n const containing = directChildContaining(parent, node);\n const beforeIndex = containing?.startIndex ?? node.startIndex;\n const children = parent.namedChildren;\n for (let index = children.length - 1; index >= 0; index -= 1) {\n const child = children[index];\n if (child.startIndex >= beforeIndex) continue;\n if (child.type !== \"variable_declaration\" && child.type !== \"assignment_statement\") continue;\n const expression = expressionForName(child, name);\n if (expression !== undefined) return { node: child, expression };\n }\n }\n current = parent;\n }\n return null;\n}\n\nfunction isTopLevelFunctionVisible(context: RuleContext, name: string, owner: FunctionInfo): boolean {\n for (const node of context.root.namedChildren) {\n if (node.startIndex >= owner.node.startIndex) break;\n if (node.type === \"function_declaration\") {\n const declared = node.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (declared === name) return true;\n continue;\n }\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n const index = names.indexOf(name);\n if (index < 0) continue;\n if ((expressions[index] ?? expressions[0])?.type === \"function_definition\") return true;\n }\n return false;\n}\n\nfunction moduleBindingVisible(binding: ImportBinding, name: string, call: SyntaxNode, owner: FunctionInfo): boolean {\n if (binding.declaration.startIndex >= owner.node.startIndex) return false;\n if (owner.parameters.includes(name)) return false;\n return visibleBinding(name, call, owner) === null;\n}\n\nfunction builtinMutatedParameterIndexes(path: string, argumentCount: number): ReadonlySet<number> {\n switch (path) {\n case \"rawset\":\n case \"setmetatable\":\n case \"table.clear\":\n case \"table.freeze\":\n case \"table.insert\":\n case \"table.remove\":\n case \"table.sort\":\n return argumentCount > 0 ? new Set([0]) : EMPTY_INDEXES;\n case \"table.move\":\n return argumentCount >= 5 ? new Set([4]) : argumentCount > 0 ? new Set([0]) : EMPTY_INDEXES;\n default:\n return EMPTY_INDEXES;\n }\n}\n\nfunction importedFactorySummary(\n context: RuleContext,\n receiver: string,\n call: SyntaxNode,\n owner: FunctionInfo,\n analysis: MutationAnalysis,\n): SourceEffectModuleSummary | null {\n const binding = visibleBinding(receiver, call, owner);\n if (!binding?.expression) return null;\n const expression = binding.expression;\n if (expression.type === \"identifier\") {\n return importedFactorySummary(context, expression.text, expression, owner, analysis);\n }\n if (expression.type !== \"function_call\") return null;\n const path = normalizeExpressionText(context.getCallPath(expression) ?? \"\");\n const match = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) return null;\n const imported = analysis.imports.get(match[1]);\n if (!imported || !moduleBindingVisible(imported, match[1], expression, owner)) return null;\n return imported.summary.instanceFactories.has(match[2]) ? imported.summary : null;\n}\n\nexport function mightMutateParameters(context: RuleContext, call: SyntaxNode): boolean {\n const path = normalizeExpressionText(context.getCallPath(call) ?? \"\");\n if (builtinMutatedParameterIndexes(path, context.callArguments(call).length).size > 0) return true;\n\n const analysis = analysisFor(context);\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(path)) {\n if ((analysis.currentSummary?.localMutatingParameters.get(path)?.size ?? 0) > 0) return true;\n return (analysis.imports.get(path)?.summary.mutatingExportParameters.size ?? 0) > 0;\n }\n\n const member = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!member) return false;\n if ((analysis.imports.get(member[1])?.summary.mutatingMemberParameters.get(member[2])?.size ?? 0) > 0) return true;\n return analysis.mutatingFactoryMembers.has(member[2]);\n}\n\nexport function mutatedParameterIndexesForCall(\n context: RuleContext,\n call: SyntaxNode,\n owner: FunctionInfo,\n): ReadonlySet<number> {\n const analysis = analysisFor(context);\n const cached = analysis.callIndexes.get(call.id);\n if (cached) return cached;\n\n const path = normalizeExpressionText(context.getCallPath(call) ?? \"\");\n const builtin = builtinMutatedParameterIndexes(path, context.callArguments(call).length);\n if (builtin.size > 0) {\n analysis.callIndexes.set(call.id, builtin);\n return builtin;\n }\n\n let result: ReadonlySet<number> = EMPTY_INDEXES;\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(path)) {\n const importBinding = analysis.imports.get(path);\n if (importBinding && moduleBindingVisible(importBinding, path, call, owner)) {\n result = importBinding.summary.mutatingExportParameters;\n } else if (\n !owner.parameters.includes(path)\n && visibleBinding(path, call, owner) === null\n && isTopLevelFunctionVisible(context, path, owner)\n ) {\n result = analysis.currentSummary?.localMutatingParameters.get(path) ?? EMPTY_INDEXES;\n }\n } else {\n const member = path.match(/^([A-Za-z_][A-Za-z0-9_]*)([.:])([A-Za-z_][A-Za-z0-9_]*)$/);\n if (member) {\n const imported = analysis.imports.get(member[1]);\n if (imported && moduleBindingVisible(imported, member[1], call, owner)) {\n result = imported.summary.mutatingMemberParameters.get(member[3]) ?? EMPTY_INDEXES;\n } else {\n const factory = importedFactorySummary(context, member[1], call, owner, analysis);\n result = factory?.mutatingMemberParameters.get(member[3]) ?? EMPTY_INDEXES;\n }\n }\n }\n\n analysis.callIndexes.set(call.id, result);\n return result;\n}\n\nfunction freshExpression(context: RuleContext, expression: SyntaxNode): boolean {\n if (expression.type === \"table_constructor\" || expression.type === \"function_definition\") return true;\n if (expression.type !== \"function_call\") return false;\n const path = normalizeExpressionText(context.getCallPath(expression) ?? \"\");\n if (path === \"table.clone\" || path === \"table.create\" || path === \"table.pack\") return true;\n if (path === \"setmetatable\") {\n const first = context.callArguments(expression)[0];\n return Boolean(first && freshExpression(context, first));\n }\n return false;\n}\n\nfunction stateBindingForName(context: RuleContext, owner: FunctionInfo, name: string, bindingNode: SyntaxNode): StateBinding | null {\n return context.model.stateBindings.find((binding) =>\n binding.owner === owner && binding.valueName === name && sameNode(binding.declaration, bindingNode)\n ) ?? null;\n}\n\nfunction resolveNameOrigin(\n context: RuleContext,\n name: string,\n atNode: SyntaxNode,\n owner: FunctionInfo,\n seen: Set<string>,\n): MutationValueOrigin {\n const key = `${owner.node.id}:${name}:${atNode.startIndex}`;\n if (seen.has(key)) return { kind: \"unknown\" };\n seen.add(key);\n\n const binding = visibleBinding(name, atNode, owner);\n if (binding) {\n const state = stateBindingForName(context, owner, name, binding.node);\n if (state) return { kind: \"state\", binding: state };\n if (!binding.expression) return { kind: \"unknown\" };\n return resolveExpressionOriginInternal(context, binding.expression, owner, seen);\n }\n\n if (owner.isComponent && owner.parameters[0] === name) return { kind: \"props\", name };\n return { kind: \"unknown\" };\n}\n\nfunction resolveExpressionOriginInternal(\n context: RuleContext,\n expression: SyntaxNode,\n owner: FunctionInfo,\n seen: Set<string>,\n): MutationValueOrigin {\n if (freshExpression(context, expression)) return { kind: \"fresh\" };\n const root = rootIdentifier(expression.text);\n if (!root) return { kind: \"unknown\" };\n return resolveNameOrigin(context, root, expression, owner, seen);\n}\n\nexport function mutationOriginForExpression(\n context: RuleContext,\n expression: SyntaxNode,\n owner: FunctionInfo,\n): MutationValueOrigin {\n const analysis = analysisFor(context);\n const key = `${owner.node.id}:${expression.id}`;\n const cached = analysis.originCache.get(key);\n if (cached) return cached;\n const result = resolveExpressionOriginInternal(context, expression, owner, new Set());\n analysis.originCache.set(key, result);\n return result;\n}\n",
|
|
31
31
|
"import type { RuleDefinition } from \"../types\";\nimport { assignmentLeft, assignmentTargetNode, callNameNode, isBindingShadowedBetween } from \"./helpers\";\nimport { mightMutateParameters, mutatedParameterIndexesForCall, mutationOriginForExpression } from \"./parameter-mutations\";\n\nexport const noPropMutation: RuleDefinition = {\n id: \"react-luau/no-prop-mutation\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Component props should be treated as immutable inputs.\",\n run(context) {\n const diagnostics = [];\n\n for (const node of context.walk()) {\n if (node.type === \"assignment_statement\" || node.type === \"update_statement\") {\n const component = context.containingComponent(node);\n if (!component || !context.isDirectlyExecutedInFunction(node, component)) continue;\n\n const propsName = component.parameters[0];\n if (!propsName) continue;\n if (isBindingShadowedBetween(node, component, propsName)) continue;\n const left = assignmentLeft(node.text);\n const escaped = propsName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`^${escaped}\\\\s*(?:\\\\.|\\\\[)`).test(left)) continue;\n\n diagnostics.push({\n node: assignmentTargetNode(node),\n message: `Component mutates ${propsName} directly.`,\n help: \"Treat props as immutable. Derive a local value, clone a table you own, or update state in the owner instead.\",\n });\n continue;\n }\n\n if (node.type !== \"function_call\" || !mightMutateParameters(context, node)) continue;\n const component = context.containingComponent(node);\n if (!component || !context.isDirectlyExecutedInFunction(node, component)) continue;\n const propsName = component.parameters[0];\n if (!propsName) continue;\n\n const arguments_ = context.callArguments(node);\n const mutatedIndexes = mutatedParameterIndexesForCall(context, node, component);\n let mutatedArgument = null;\n for (const index of mutatedIndexes) {\n const argument = arguments_[index];\n if (!argument) continue;\n const origin = mutationOriginForExpression(context, argument, component);\n if (origin.kind !== \"props\" || origin.name !== propsName) continue;\n mutatedArgument = argument;\n break;\n }\n if (!mutatedArgument) continue;\n\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\") || \"This call\";\n diagnostics.push({\n node: callNameNode(node),\n highlights: [mutatedArgument],\n message: `${path} mutates an argument derived from ${propsName}.`,\n help: \"Treat props as immutable. Clone the table before passing it to a mutating helper, or move the mutation into the owner that controls the value.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
32
|
-
"import type {
|
|
32
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { RuleContext, RuleDefinition } from \"../types\";\nimport { fieldName, fieldValue } from \"./helpers\";\n\nconst FRESH_CALLS = [\n /^math\\.random$/,\n /^Random\\.new$/,\n /:GenerateGUID$/,\n /^DateTime\\.now$/,\n /^os\\.clock$/,\n /^tick$/,\n /^time$/,\n /:GetServerTimeNow$/,\n /:NextInteger$/,\n /:NextNumber$/,\n];\n\nfunction freshDescription(node: SyntaxNode, context: RuleContext): string | null {\n for (const child of context.walk(node)) {\n if (child.type !== \"function_call\") continue;\n const path = context.getCallPath(child) ?? \"\";\n if (FRESH_CALLS.some((pattern) => pattern.test(path)) || /Random\\.new\\s*\\([^)]*\\)\\s*:\\s*Next(?:Integer|Number)/s.test(child.text)) {\n return `${path || \"fresh-value call\"}()`;\n }\n }\n return null;\n}\n\nfunction isCreateElementCall(node: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!node || node.type !== \"function_call\") return false;\n return context.resolveCallPath(context.getCallPath(node) ?? \"\") === \"React.createElement\";\n}\n\nexport const noRandomKey: RuleDefinition = {\n id: \"react-luau/no-random-key\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"React child keys must not be regenerated on each render.\",\n run(context) {\n const diagnostics = [];\n\n for (const field of context.walk()) {\n if (field.type !== \"field\") continue;\n const name = field.childForFieldName(\"name\");\n let keyExpression: SyntaxNode | null = null;\n\n if (fieldName(field) === \"key\") {\n keyExpression = fieldValue(field);\n } else if (field.text.trim().startsWith(\"[\") && name) {\n const value = field.namedChildren.find((child) => child.startIndex > name.endIndex);\n if (isCreateElementCall(value, context)) keyExpression = name;\n }\n\n if (!keyExpression) continue;\n const description = freshDescription(keyExpression, context);\n if (!description) continue;\n\n diagnostics.push({\n node: keyExpression,\n message: `React key is created from ${description}, so its identity can change every render.`,\n help: \"Use stable identity from the item itself, such as UserId, an immutable record ID, or another persistent key. Changing keys remounts children and breaks preserved state or exit-animation identity.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
33
33
|
"import type { RuleDefinition } from \"../types\";\nimport { callNameNode, isBindingShadowedBetween, stateBindingsFor } from \"./helpers\";\n\nexport const noSetStateInRender: RuleDefinition = {\n id: \"react-luau/no-set-state-in-render\",\n category: \"Correctness\",\n severity: \"warning\",\n description: \"Do not call a component's state setter unconditionally during render.\",\n run(context) {\n const diagnostics = [];\n\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n const bindings = stateBindingsFor(context, component);\n const setters = new Map(bindings.map((binding) => [binding.setterName, binding]));\n if (setters.size === 0) continue;\n\n for (const statement of component.body.namedChildren) {\n if (statement.type !== \"function_call\") continue;\n const path = context.getCallPath(statement);\n const binding = path ? setters.get(path) : undefined;\n if (!path || !binding || isBindingShadowedBetween(statement, component, path, binding.declaration)) continue;\n\n diagnostics.push({\n node: callNameNode(statement),\n message: `${path}() is called unconditionally during component render.`,\n help: \"Move the update to the event or effect that owns it, or derive the value during render. An unconditional render-phase state update can continuously trigger new renders.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
34
|
-
"import type {
|
|
35
|
-
"import { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { normalizeExpressionText, sameNode } from \"../ast/walk\";\nimport { isHighFrequencyRunServiceCall } from \"../roblox-semantics\";\nimport { callNameNode, declarationNames, identifierNode, fieldName, fieldNameNode, fieldValue, isBindingShadowedBetween, stateBindingsFor } from \"./helpers\";\n\nconst STATIC_DISCOVERY = /(?::|\\.)(GetChildren|GetDescendants)$/;\nconst PURE_TRIVIAL_CALLS = /^(?:tostring|tonumber|type|typeof|math\\.[A-Za-z_][A-Za-z0-9_]*|string\\.(?:lower|upper|format|len)|Color3\\.(?:new|fromRGB|fromHSV)|Vector[23]\\.new|UDim2?\\.(?:new|fromOffset|fromScale)|CFrame\\.new)$/;\n\nfunction declarationForCall(call: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = call.parent;\n while (current) {\n if (current.type === \"variable_declaration\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction declaredNameForCall(call: SyntaxNode): string | null {\n const declaration = declarationForCall(call);\n return declaration ? declarationNames(declaration)[0] ?? null : null;\n}\n\nfunction isIdentifierPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent?.type === \"method_index_expression\") {\n return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n }\n return false;\n}\n\nfunction identifierReferences(\n context: RuleContext,\n owner: FunctionInfo,\n name: string,\n declaration: SyntaxNode | null,\n): SyntaxNode[] {\n if (!owner.body) return [];\n const result: SyntaxNode[] = [];\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"identifier\" || node.text !== name) continue;\n if (declaration && node.startIndex >= declaration.startIndex && node.endIndex <= declaration.endIndex) continue;\n if (isIdentifierPropertyName(node)) continue;\n if (isBindingShadowedBetween(node, owner, name, declaration)) continue;\n result.push(node);\n }\n return result;\n}\n\nfunction nearestAncestor(node: SyntaxNode, stop: SyntaxNode, type: string): SyntaxNode | null {\n let current = node.parent;\n while (current && !sameNode(current, stop)) {\n if (current.type === type) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction highFrequencyCallback(node: SyntaxNode, context: RuleContext): SyntaxNode | null {\n let current = node.parent;\n while (current) {\n if (current.type === \"function_definition\") {\n const argumentsNode = current.parent;\n const call = argumentsNode?.type === \"arguments\" ? argumentsNode.parent : null;\n if (call?.type === \"function_call\" && isHighFrequencyRunServiceCall(call, context)) return current;\n }\n current = current.parent;\n }\n return null;\n}\n\nfunction setterIsNoChangeGuarded(call: SyntaxNode, callback: SyntaxNode, binding: StateBinding): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback)) {\n if (current.type === \"if_statement\" || current.type === \"if_expression\") {\n const header = current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\";\n const escaped = binding.valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`\\\\b${escaped}\\\\b[^\\\\n]*(?:~=|==)|(?:~=|==)[^\\\\n]*\\\\b${escaped}\\\\b`).test(header)) return true;\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction setterIsOneShotGuarded(call: SyntaxNode, callback: SyntaxNode): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback)) {\n if (current.type === \"if_statement\") {\n const header = current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\";\n const candidates = [\n ...header.matchAll(/\\bnot\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/g),\n ...header.matchAll(/\\b([A-Za-z_][A-Za-z0-9_]*)\\s*==\\s*false\\b/g),\n ].map((match) => match[1]);\n for (const guard of candidates) {\n const escaped = guard.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*true\\\\b`).test(current.text)) continue;\n if (new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*false\\\\b`).test(callback.text)) continue;\n return true;\n }\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction componentRenderCost(context: RuleContext, owner: FunctionInfo): string[] {\n if (!owner.body) return [];\n let clones = 0;\n let loops = 0;\n let discovery = 0;\n for (const node of context.walk(owner.body)) {\n if (context.nearestFunction(node) !== owner) continue;\n if (node.type === \"for_statement\" || node.type === \"while_statement\" || node.type === \"repeat_statement\") loops += 1;\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"table.clone\") clones += 1;\n if (STATIC_DISCOVERY.test(path) || /:GetTagged$/.test(path)) discovery += 1;\n }\n const parts: string[] = [];\n if (clones > 0) parts.push(`${clones} table clone${clones === 1 ? \"\" : \"s\"}`);\n if (loops > 1) parts.push(`${loops} collection/loop passes`);\n if (discovery > 0) parts.push(`${discovery} Instance discovery call${discovery === 1 ? \"\" : \"s\"}`);\n return parts;\n}\n\nfunction memoizedImports(context: RuleContext): Map<string, \"shallow\" | \"custom\"> {\n const result = new Map<string, \"shallow\" | \"custom\">();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const localName = match[1];\n const memoKind = resolveModuleReference(normalizeRequireTarget(match[2]), context.project.memoizedModules);\n if (memoKind) result.set(localName, memoKind);\n }\n return result;\n}\n\nfunction fieldLabel(field: SyntaxNode): string {\n return fieldName(field) ?? field.childForFieldName(\"name\")?.text ?? \"prop\";\n}\n\nfunction isInlineFreshValue(node: SyntaxNode | null): boolean {\n return node?.type === \"table_constructor\" || node?.type === \"function_definition\";\n}\n\nexport const rerenderUnstableMemoProps: RuleDefinition = {\n id: \"react-luau/rerender-unstable-memo-props\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Warn when fresh table or function props defeat shallow React.memo comparisons.\",\n run(context) {\n const imports = memoizedImports(context);\n if (imports.size === 0) return [];\n const diagnostics: DiagnosticInput[] = [];\n\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.createElement\") continue;\n const component = context.containingComponent(call);\n if (!component || context.nearestFunction(call) !== component) continue;\n const args = context.callArguments(call);\n const childName = args[0]?.text.trim() ?? \"\";\n if (imports.get(childName) !== \"shallow\") continue;\n const props = args[1];\n if (!props || props.type !== \"table_constructor\") continue;\n\n const unstableFields = props.namedChildren\n .filter((node) => node.type === \"field\")\n .filter((field) => isInlineFreshValue(fieldValue(field)));\n if (unstableFields.length === 0) continue;\n const unstable = unstableFields.map(fieldLabel);\n const highlights = unstableFields.map(fieldNameNode);\n\n diagnostics.push({\n node: highlights[0],\n highlights,\n severity: \"warning\",\n message: `Memoized ${childName} receives fresh ${unstable.join(\", \")} prop${unstable.length === 1 ? \"\" : \"s\"} on every parent render.`,\n help: \"Fresh table or function identity prevents the shallow memo comparison from skipping this child. Stabilize the prop only when the parent rerenders frequently, move construction into the child, or remove ineffective memoization.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderHighFrequencyState: RuleDefinition = {\n id: \"react-luau/rerender-high-frequency-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find state updates from frame callbacks that can rerender expensive component trees continuously.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n const seen = new Set<string>();\n\n for (const call of context.findCalls()) {\n const callback = highFrequencyCallback(call, context);\n if (!callback) continue;\n const component = context.containingComponent(call);\n if (!component) continue;\n const setter = context.getCallPath(call) ?? \"\";\n const binding = context.model.stateBindings.find((candidate) => candidate.owner === component && candidate.setterName === setter);\n if (!binding || setterIsNoChangeGuarded(call, callback, binding) || setterIsOneShotGuarded(call, callback)) continue;\n const key = `${callback.startIndex}:${setter}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const renderCost = componentRenderCost(context, component);\n diagnostics.push({\n node: callNameNode(call),\n severity: \"warning\",\n message: `${binding.valueName} has a state setter called from a per-frame callback and may cause frequent rerenders when its value changes.`,\n help: renderCost.length > 0\n ? `This render also performs ${renderCost.join(\" and \")}. Isolate or throttle the high-frequency state, or use Bindings for host-property-only updates.`\n : \"Isolate or throttle the high-frequency state. Use React.useBinding when the value only drives host Instance properties.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nfunction singleReturnExpression(callback: SyntaxNode | undefined): SyntaxNode | null {\n if (!callback || callback.type !== \"function_definition\") return null;\n const body = callback.childForFieldName(\"body\");\n if (!body || body.namedChildren.length !== 1) return null;\n const statement = body.namedChildren[0];\n if (statement.type !== \"return_statement\") return null;\n const expressionList = statement.namedChildren.find((child) => child.type === \"expression_list\");\n if (!expressionList || expressionList.namedChildren.length !== 1) return null;\n return expressionList.namedChildren[0] ?? null;\n}\n\nfunction isTrivialMemoExpression(expression: SyntaxNode, context: RuleContext): boolean {\n if (expression.type === \"table_constructor\" || expression.type === \"function_definition\") return false;\n let calls = 0;\n for (const node of context.walk(expression)) {\n if (node.type === \"for_statement\" || node.type === \"while_statement\" || node.type === \"repeat_statement\") return false;\n if (node.type !== \"function_call\") continue;\n calls += 1;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (/random|GenerateGUID|GetServerTimeNow|tick|time|clock/i.test(path)) return false;\n if (!PURE_TRIVIAL_CALLS.test(path)) return false;\n }\n return calls <= 2 && expression.text.length <= 180;\n}\n\nfunction valueIdentityIsObservedByHook(context: RuleContext, owner: FunctionInfo, name: string, declaration: SyntaxNode): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!/^React\\.use(?:Effect|LayoutEffect|Memo|Callback)$/.test(path)) continue;\n const dependencies = context.callArguments(call)[1];\n if (!dependencies) continue;\n for (const reference of identifierReferences(context, owner, name, declaration)) {\n if (reference.startIndex >= dependencies.startIndex && reference.endIndex <= dependencies.endIndex) return true;\n }\n }\n return false;\n}\n\nfunction isEmptyDependencyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(node && node.type === \"table_constructor\" && node.namedChildren.length === 0);\n}\n\nexport const rerenderUnnecessaryUseMemo: RuleDefinition = {\n id: \"react-luau/rerender-unnecessary-usememo\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find trivial derived values that cost more to memoize than to compute directly.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useMemo\") continue;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n const declaration = declarationForCall(call);\n const name = declaredNameForCall(call);\n const argumentsList = context.callArguments(call);\n const expression = singleReturnExpression(argumentsList[0]);\n if (isEmptyDependencyTable(argumentsList[1])) continue;\n if (!owner || !declaration || !name || !expression || !isTrivialMemoExpression(expression, context)) continue;\n if (valueIdentityIsObservedByHook(context, owner, name, declaration)) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: \"useMemo caches a trivial derived value.\",\n help: \"Compute the value directly unless stable identity or a genuinely expensive calculation is required.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction isOnlyDirectFunctionCallReference(node: SyntaxNode, name: string): boolean {\n const parent = node.parent;\n return parent?.type === \"function_call\"\n && sameNode(parent.childForFieldName(\"name\"), node)\n && (parent.childForFieldName(\"name\")?.text.trim() ?? \"\") === name;\n}\n\nexport const rerenderUnnecessaryUseCallback: RuleDefinition = {\n id: \"react-luau/rerender-unnecessary-usecallback\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find useCallback values whose stable function identity is never observed.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useCallback\") continue;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n const declaration = declarationForCall(call);\n const name = declaredNameForCall(call);\n if (!owner || !declaration || !name) continue;\n const references = identifierReferences(context, owner, name, declaration);\n if (references.length === 0 || references.some((node) => !isOnlyDirectFunctionCallReference(node, name))) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${name} is wrapped in useCallback, but its identity is never observed.`,\n help: \"Use a normal local function. Keep useCallback when the function is passed to a memoized child, retained by another hook, or otherwise compared by identity.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction staticDiscoveryPath(path: string): boolean {\n if (/:GetTagged$/.test(path)) return true;\n if (!STATIC_DISCOVERY.test(path)) return false;\n const receiver = path.replace(/(?::|\\.)(?:GetChildren|GetDescendants)$/, \"\");\n return /^(?:ReplicatedStorage|ServerStorage|ServerScriptService|StarterGui|StarterPlayer|script)(?:\\.|:|$)/.test(receiver);\n}\n\nexport const rerenderStaticDiscoveryInRender: RuleDefinition = {\n id: \"react-luau/rerender-static-discovery-in-render\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find static Instance/module discovery repeated during component render.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || context.nearestFunction(call) !== component) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!staticDiscoveryPath(path)) continue;\n const loop = nearestAncestor(call, component.node, \"for_statement\");\n const body = loop?.childForFieldName(\"body\");\n const requiresModules = Boolean(body && [...context.walk(body)].some((node) => node.type === \"function_call\" && context.getCallPath(node) === \"require\"));\n diagnostics.push({\n node: callNameNode(call),\n severity: \"warning\",\n message: `${path} runs during component render${requiresModules ? \" and feeds module requires\" : \"\"}.`,\n help: requiresModules\n ? \"Discover and require static modules once outside the component, or cache the derived catalog by the inputs that can actually change.\"\n : \"Move static discovery outside the component or memoize the derived result when the source can change.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction genericLoopCollection(loop: SyntaxNode): string | null {\n const clause = loop.namedChildren.find((child) => child.type === \"for_generic_clause\");\n if (!clause) return null;\n const match = clause.text.match(/\\bin\\s+(.+)$/s);\n if (!match) return null;\n const expression = normalizeExpressionText(match[1]);\n if (!expression || expression.length > 160) return null;\n return expression;\n}\n\nexport const rerenderRepeatedCollectionScan: RuleDefinition = {\n id: \"react-luau/rerender-repeated-collection-scan\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find repeated direct render passes over the same collection expression.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n const groups = new Map<string, { display: string; loops: SyntaxNode[] }>();\n for (const node of context.walk(component.body)) {\n if (node.type !== \"for_statement\" || context.nearestFunction(node) !== component) continue;\n const collection = genericLoopCollection(node);\n if (!collection || collection === \"{}\") continue;\n const clause = node.namedChildren.find((child) => child.type === \"for_generic_clause\");\n const display = clause?.text.match(/\\bin\\s+(.+)$/s)?.[1]?.trim().replace(/\\s+/g, \" \") ?? collection;\n const group = groups.get(collection) ?? { display, loops: [] };\n group.loops.push(node);\n groups.set(collection, group);\n }\n for (const { display, loops } of groups.values()) {\n if (loops.length < 2) continue;\n const repeatedCollections = loops.map((loop) => {\n const clause = loop.namedChildren.find((child) => child.type === \"for_generic_clause\");\n return clause?.namedChildren.at(-1) ?? clause ?? loop;\n });\n diagnostics.push({\n node: repeatedCollections[1],\n highlights: repeatedCollections,\n message: `${display} is scanned ${loops.length} times during this render.`,\n help: \"Consider combining the passes or deriving a lookup when the collection is large or the component rerenders frequently.\",\n });\n }\n }\n return diagnostics;\n },\n};\n\nexport const rerenderStaticState: RuleDefinition = {\n id: \"react-luau/rerender-static-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find React state whose setter is never used and therefore cannot change.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n for (const binding of stateBindingsFor(context, component)) {\n if (binding.setterName === \"_\" || binding.setterName.startsWith(\"_\")) continue;\n const setterRefs = identifierReferences(context, component, binding.setterName, binding.declaration);\n if (setterRefs.length > 0) continue;\n const valueRefs = identifierReferences(context, component, binding.valueName, binding.declaration);\n if (valueRefs.length === 0) continue;\n diagnostics.push({\n node: identifierNode(binding.declaration, binding.setterName) ?? binding.declaration,\n message: `${binding.valueName} cannot change because ${binding.setterName} is never used.`,\n help: \"Use a normal derived value. If the initial value must be captured once for the component lifetime, use a ref.\",\n });\n }\n }\n return diagnostics;\n },\n};\n\nfunction memoReturnsCurrentCell(call: SyntaxNode, context: RuleContext): boolean {\n const args = context.callArguments(call);\n const callback = args[0];\n const deps = args[1];\n if (!callback || callback.type !== \"function_definition\" || deps?.type !== \"table_constructor\" || deps.namedChildren.length > 0) return false;\n const expression = singleReturnExpression(callback);\n if (!expression || expression.type !== \"table_constructor\") return false;\n const fields = expression.namedChildren.filter((node) => node.type === \"field\");\n return fields.length === 1 && fieldName(fields[0]) === \"current\";\n}\n\nexport const preferUseRefForMutableCell: RuleDefinition = {\n id: \"react-luau/prefer-use-ref-for-mutable-cell\",\n category: \"Hooks\",\n severity: \"suggestion\",\n description: \"Prefer useRef over useMemo-created tables that only emulate a mutable current cell.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useMemo\") continue;\n if (!memoReturnsCurrentCell(call, context)) continue;\n const name = declaredNameForCall(call) ?? \"This value\";\n diagnostics.push({\n node: callNameNode(call),\n message: `${name} uses useMemo to create a { current = ... } mutable cell.`,\n help: \"Use React.useRef(initialValue) to express the same lifetime and mutable-cell intent directly.\",\n });\n }\n return diagnostics;\n },\n};\n",
|
|
36
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport type { BindingCandidateHookSummary, ExternalCallbackFunctionSummary, FixPreview, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { isHighFrequencyRunServiceCall, isHighFrequencyRunServiceExpression } from \"../roblox-semantics\";\nimport { callNameNode, declarationNames, fieldName, fieldValue, isBindingShadowedBetween } from \"./helpers\";\n\nconst EXTERNAL_CALLBACK = /(?:^|[.:])(?:Connect|Once|Subscribe|Observe|Listen|Watch)$/i;\nconst NON_BINDABLE_HOST_FIELDS = new Set([\"ref\", \"key\", \"children\"]);\n\nfunction replaceWithinNode(container: SyntaxNode, target: SyntaxNode, replacement: string): string | null {\n const start = target.startIndex - container.startIndex;\n const end = target.endIndex - container.startIndex;\n if (start < 0 || end < start || end > container.text.length) return null;\n return `${container.text.slice(0, start)}${replacement}${container.text.slice(end)}`;\n}\n\nfunction bindingModeFixPreview(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n context: RuleContext,\n): FixPreview | undefined {\n const parameterIndex = summary.bindingModeParameterIndex;\n if (parameterIndex === undefined || summary.bindingWhenTruthy === undefined) return undefined;\n const desired = summary.bindingWhenTruthy ? \"true\" : \"false\";\n const args = context.callArguments(call);\n\n if (parameterIndex < args.length) {\n const after = replaceWithinNode(call, args[parameterIndex], desired);\n if (!after || after === call.text) return undefined;\n return {\n kind: \"exact\",\n before: call.text,\n after,\n note: summary.bindingModeParameterName\n ? `Switch the ${summary.bindingModeParameterName} parameter to the hook's Binding mode.`\n : \"Switch this call to the hook's Binding mode.\",\n };\n }\n\n if (parameterIndex >= args.length) {\n const close = call.text.lastIndexOf(\")\");\n if (close < 0) return undefined;\n // Omitted Lua/Luau arguments are nil. Fill any skipped optional parameters\n // explicitly so the inferred Binding-mode argument lands in the right slot.\n const skipped = Array.from({ length: parameterIndex - args.length }, () => \"nil\");\n const appended = [...skipped, desired].join(\", \");\n const insertion = `${args.length > 0 ? \", \" : \"\"}${appended}`;\n return {\n kind: \"exact\",\n before: call.text,\n after: `${call.text.slice(0, close)}${insertion}${call.text.slice(close)}`,\n note: summary.bindingModeParameterName\n ? `Enable the hook's Binding mode through the ${summary.bindingModeParameterName} parameter without changing omitted optional arguments.`\n : \"Enable the hook's Binding mode without changing omitted optional arguments.\",\n };\n }\n\n return undefined;\n}\n\nfunction callMemberFixPreview(call: SyntaxNode, replacement: string): FixPreview | undefined {\n const name = callNameNode(call);\n const path = name.text;\n const separator = Math.max(path.lastIndexOf(\".\"), path.lastIndexOf(\":\"));\n const member = separator >= 0 ? path.slice(separator + 1) : path;\n const replacementName = separator >= 0 ? `${path.slice(0, separator + 1)}${replacement}` : replacement;\n const after = replaceWithinNode(call, name, replacementName);\n if (!after || member === replacement) return undefined;\n return { kind: \"exact\", before: call.text, after };\n}\n\nfunction useBindingFixPreview(call: SyntaxNode): FixPreview | undefined {\n const name = callNameNode(call);\n const current = name.text;\n const afterName = current.replace(/(?:^|\\.)useState$/, (match) => match.replace(\"useState\", \"useBinding\"));\n if (afterName === current) return undefined;\n const after = replaceWithinNode(call, name, afterName);\n return after ? { kind: \"exact\", before: call.text, after } : undefined;\n}\n\ninterface ImportedBindingSummaries {\n hooks: Map<string, BindingCandidateHookSummary>;\n callbacks: Map<string, ExternalCallbackFunctionSummary>;\n compatibleProps: Map<string, Set<string>>;\n}\n\nconst importedBindingSummariesCache = new WeakMap<RuleContext, ImportedBindingSummaries>();\n\nfunction importedBindingSummaries(context: RuleContext): ImportedBindingSummaries {\n const cached = importedBindingSummariesCache.get(context);\n if (cached) return cached;\n\n const result: ImportedBindingSummaries = {\n hooks: new Map(),\n callbacks: new Map(),\n compatibleProps: new Map(),\n };\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const [, localName, target] = match;\n const normalizedTarget = normalizeRequireTarget(target);\n\n const hook = resolveModuleReference(normalizedTarget, context.project.bindingCandidateHooks);\n if (hook) result.hooks.set(localName, hook);\n\n const callback = resolveModuleReference(normalizedTarget, context.project.externalCallbackModules);\n if (callback) result.callbacks.set(localName, callback);\n\n const compatibleProps = resolveModuleReference(normalizedTarget, context.project.bindingCompatibleComponentProps);\n if (compatibleProps) result.compatibleProps.set(localName, compatibleProps);\n }\n\n importedBindingSummariesCache.set(context, result);\n return result;\n}\n\nfunction importedBindingCandidateHooks(context: RuleContext): Map<string, BindingCandidateHookSummary> {\n return importedBindingSummaries(context).hooks;\n}\n\nfunction importedExternalCallbackFunctions(context: RuleContext): Map<string, ExternalCallbackFunctionSummary> {\n return importedBindingSummaries(context).callbacks;\n}\n\nfunction importedBindingCompatibleComponentProps(context: RuleContext): Map<string, Set<string>> {\n return importedBindingSummaries(context).compatibleProps;\n}\n\nfunction declarationForCall(call: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = call.parent;\n while (current) {\n if (current.type === \"variable_declaration\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nconst TRANSPARENT_PARENTS = new Set([\n \"binary_expression\",\n \"unary_expression\",\n \"parenthesized_expression\",\n \"cast_expression\",\n \"type_cast_expression\",\n \"interpolated_string\",\n \"string_interpolation\",\n \"expression_list\",\n \"assignment_statement\",\n \"arguments\",\n \"function_call\",\n \"dot_index_expression\",\n \"method_index_expression\",\n \"table_constructor\",\n \"field\",\n]);\n\nfunction isInside(node: SyntaxNode, ancestor: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n if (sameNode(current, ancestor)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isIdentifierPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent?.type === \"method_index_expression\") return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n return false;\n}\n\nfunction isReadNode(node: SyntaxNode, valueName: string, owner: FunctionInfo, declaration: SyntaxNode): boolean {\n if (node.type !== \"identifier\" || node.text !== valueName) return false;\n if (isInside(node, declaration)) return false;\n if (isIdentifierPropertyName(node)) return false;\n if (isBindingShadowedBetween(node, owner, valueName, declaration)) return false;\n const parent = node.parent;\n if (parent?.type === \"variable_list\" || parent?.type === \"typed_identifier\") return false;\n if (parent?.type === \"field\" && !sameNode(fieldValue(parent), node) && /^[A-Za-z_][A-Za-z0-9_]*\\s*=/.test(parent.text.trim())) {\n return false;\n }\n return true;\n}\n\nfunction hasAnyRead(valueName: string, owner: FunctionInfo, declaration: SyntaxNode, context: RuleContext): boolean {\n if (!owner.body) return false;\n return [...context.walk(owner.body)].some((node) => isReadNode(node, valueName, owner, declaration));\n}\n\nfunction isCreateElementCall(call: SyntaxNode, context: RuleContext): boolean {\n return call.type === \"function_call\"\n && context.resolveCallPath(context.getCallPath(call) ?? \"\") === \"React.createElement\";\n}\n\nfunction isHostCreateElementCall(call: SyntaxNode, context: RuleContext): boolean {\n if (!isCreateElementCall(call, context)) return false;\n const args = context.callArguments(call);\n const host = args[0]?.text.trim() ?? \"\";\n return /^(?:\"[^\"]+\"|'[^']+')$/.test(host);\n}\n\nfunction isTransparentUsage(\n node: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return false;\n\n if (parent.type === \"field\") {\n const value = fieldValue(parent);\n if (!value || !sameNode(value, current)) return false;\n const property = fieldName(parent);\n if (!property || NON_BINDABLE_HOST_FIELDS.has(property)) return false;\n const table = parent.parent;\n if (table?.type !== \"table_constructor\") return false;\n const args = table.parent;\n if (args?.type !== \"arguments\") return false;\n const call = args.parent;\n if (!call || !isCreateElementCall(call, context)) return false;\n if (!sameNode(context.callArguments(call)[1], table)) return false;\n if (isHostCreateElementCall(call, context)) return true;\n\n const component = context.callArguments(call)[0]?.text.trim() ?? \"\";\n return compatibleComponentProps.get(component)?.has(property) ?? false;\n }\n\n if (parent.type === \"if_statement\" || parent.type === \"elseif_clause\" || parent.type === \"while_statement\"\n || parent.type === \"repeat_statement\" || parent.type === \"return_statement\") {\n return false;\n }\n\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return false;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return false;\n current = parent;\n }\n return false;\n}\n\nfunction derivedLocalDeclarationForRead(node: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return null;\n if (parent.type === \"variable_declaration\") return parent;\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return null;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return null;\n current = parent;\n }\n return null;\n}\n\nfunction stateReadsAreBindingCompatible(\n valueName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n visited = new Set<string>(),\n): boolean {\n if (!owner.body) return false;\n const visitKey = `${declaration.startIndex}:${valueName}`;\n if (visited.has(visitKey)) return false;\n visited.add(visitKey);\n\n let reads = 0;\n for (const node of context.walk(owner.body)) {\n if (!isReadNode(node, valueName, owner, declaration)) continue;\n reads += 1;\n if (isTransparentUsage(node, context, compatibleComponentProps)) continue;\n\n const derivedDeclaration = derivedLocalDeclarationForRead(node);\n const derivedNames = derivedDeclaration ? declarationNames(derivedDeclaration) : [];\n if (derivedDeclaration && derivedNames.length === 1) {\n if (stateReadsAreBindingCompatible(\n derivedNames[0],\n owner,\n derivedDeclaration,\n context,\n compatibleComponentProps,\n new Set(visited),\n )) continue;\n }\n return false;\n }\n\n return reads > 0;\n}\n\nfunction callbackSource(call: SyntaxNode, context: RuleContext): { highFrequency: boolean; external: boolean } {\n const normalized = (context.getCallPath(call) ?? \"\").replace(/\\s+/g, \"\");\n const highFrequency = isHighFrequencyRunServiceCall(call, context);\n const final = normalized.split(/[.:]/).at(-1) ?? normalized;\n const external = highFrequency || EXTERNAL_CALLBACK.test(normalized) || EXTERNAL_CALLBACK.test(final);\n return { highFrequency, external };\n}\n\nfunction importedCallbackSource(\n call: SyntaxNode,\n callbackArgument: SyntaxNode,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedCallbacks.get(path);\n if (!summary) return null;\n const args = context.callArguments(call);\n const callbackIndex = args.findIndex((arg) => sameNode(arg, callbackArgument));\n if (callbackIndex < 0 || !summary.callbackParameterIndexes.includes(callbackIndex)) return null;\n return {\n highFrequency: summary.highFrequency || args.some((arg) => isHighFrequencyRunServiceExpression(arg, context)),\n external: true,\n };\n}\n\nfunction directCallbackSource(\n node: SyntaxNode,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const parent = node.parent;\n if (parent?.type !== \"arguments\" || parent.parent?.type !== \"function_call\") return null;\n const call = parent.parent;\n const imported = importedCallbackSource(call, node, importedCallbacks, context);\n if (imported) return imported;\n const source = callbackSource(call, context);\n return source.external ? source : null;\n}\n\nfunction namedFunctionCallbackSource(\n fn: FunctionInfo,\n owner: FunctionInfo,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n if (!fn.name || !owner.body) return null;\n let foundExternal = false;\n let foundHighFrequency = false;\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const args = context.callArguments(call);\n const callbackArg = args.find((arg) => arg.type === \"identifier\" && arg.text === fn.name);\n if (!callbackArg) continue;\n const imported = importedCallbackSource(call, callbackArg, importedCallbacks, context);\n const source = imported ?? callbackSource(call, context);\n if (!source.external) continue;\n foundExternal = true;\n foundHighFrequency ||= source.highFrequency;\n }\n\n return foundExternal ? { highFrequency: foundHighFrequency, external: true } : null;\n}\n\nfunction setterCallbackSource(\n call: SyntaxNode,\n binding: StateBinding,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const owner = binding.owner;\n if (!owner) return null;\n const nearest = context.nearestFunction(call);\n if (!nearest || nearest === owner) return null;\n\n const direct = directCallbackSource(nearest.node, importedCallbacks, context);\n if (direct) return direct;\n\n return namedFunctionCallbackSource(nearest, owner, importedCallbacks, context);\n}\n\nfunction bindingHasExternalOrHighFrequencyUpdates(\n binding: StateBinding,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const owner = binding.owner;\n if (!owner?.body) return null;\n let highFrequency = false;\n let external = false;\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"function_call\") continue;\n const path = context.getCallPath(node);\n if (path !== binding.setterName) continue;\n const source = setterCallbackSource(node, binding, importedCallbacks, context);\n if (!source) continue;\n highFrequency ||= source.highFrequency;\n external ||= source.external;\n }\n\n return highFrequency || external ? { highFrequency, external } : null;\n}\n\nfunction returnedHookValues(binding: StateBinding, context: RuleContext): Array<{ exportName: string; node: SyntaxNode }> {\n const owner = binding.owner;\n if (!owner?.body || !owner.isHook) return [];\n const results: Array<{ exportName: string; node: SyntaxNode }> = [];\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"return_statement\") continue;\n if (context.nearestFunction(node) !== owner) continue;\n\n for (const returned of node.namedChildren.flatMap((child) => child.type === \"expression_list\" ? child.namedChildren : [child])) {\n if (returned.type === \"identifier\" && returned.text === binding.valueName) {\n results.push({ exportName: binding.valueName, node: returned });\n } else if (returned.type === \"table_constructor\") {\n for (const field of returned.namedChildren.filter((child) => child.type === \"field\")) {\n const value = fieldValue(field);\n const name = fieldName(field);\n if (value?.type === \"identifier\" && value.text === binding.valueName && name) {\n results.push({ exportName: name, node: value });\n }\n }\n }\n }\n }\n\n return results;\n}\n\nfunction hookCallSitesAreBindingCompatible(\n binding: StateBinding,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n const owner = binding.owner;\n if (!owner?.isHook || !owner.name) return false;\n const returned = returnedHookValues(binding, context);\n if (returned.length === 0) return false;\n\n let callSites = 0;\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call);\n if (path !== owner.name) continue;\n const declaration = declarationForCall(call);\n if (!declaration) continue;\n const localName = declarationNames(declaration)[0] ?? null;\n const caller = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!localName || !caller) continue;\n\n if (returned.length === 1 && returned[0].exportName === binding.valueName) {\n if (!stateReadsAreBindingCompatible(localName, caller, declaration, context, compatibleComponentProps)) return false;\n callSites += 1;\n continue;\n }\n }\n\n return callSites > 0;\n}\n\nfunction selectorFieldName(call: SyntaxNode, context: RuleContext): string | null {\n const selector = context.callArguments(call)[0];\n if (!selector || selector.type !== \"function_definition\") return null;\n const text = selector.text;\n return text.match(/\\breturn\\s+[A-Za-z_][A-Za-z0-9_]*\\.([A-Za-z_][A-Za-z0-9_]*)\\b/)?.[1]\n ?? text.match(/\\breturn\\s+[A-Za-z_][A-Za-z0-9_]*\\[\\s*[\"']([^\"']+)[\"']\\s*\\]/)?.[1]\n ?? null;\n}\n\nfunction callDefinitelyUsesBindingMode(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n context: RuleContext,\n): boolean {\n const parameterIndex = summary.bindingModeParameterIndex;\n if (parameterIndex === undefined || summary.bindingWhenTruthy === undefined) return false;\n\n const argument = context.callArguments(call)[parameterIndex];\n const value = argument?.text.trim() ?? \"nil\";\n let truthy: boolean | null = null;\n if (value === \"true\") truthy = true;\n else if (value === \"false\" || value === \"nil\") truthy = false;\n if (truthy === null) return false;\n\n return truthy === summary.bindingWhenTruthy;\n}\n\nfunction shouldRecommendImportedHook(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n localName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n if (!summary.external || callDefinitelyUsesBindingMode(summary, call, context)) return false;\n if (!hasAnyRead(localName, owner, declaration, context)) return false;\n\n // A hook that mirrors an externally changing Instance property through React state is\n // already a strong producer-side Binding candidate. Consumers may need Binding:map or a\n // binding-aware effect rather than a direct value substitution, so requiring every read to\n // already terminate at a host property creates widespread false negatives.\n if (summary.sourceKind === \"measurement\") return true;\n\n return stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps);\n}\n\n\ntype BindingUsageKind = \"compatible\" | \"custom-component\" | \"effect\" | \"structural\" | \"unknown\";\n\ninterface BindingUsageSummary {\n reads: number;\n compatible: number;\n customComponent: number;\n visualCustomComponent: number;\n effect: number;\n structural: number;\n unknown: number;\n}\n\nconst LIKELY_VISUAL_PROP = /(?:position|size|rotation|transparency|opacity|color|image|text|anchor|visible|enabled|layout|scale|offset|zindex|canvas|viewport|cframe|width|height|radius|stroke|padding|spacing|angle|alpha|progress)/i;\n\nfunction createElementPropUsage(node: SyntaxNode, context: RuleContext): { component: string; property: string } | null {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return null;\n if (parent.type === \"field\") {\n const value = fieldValue(parent);\n if (!value || !sameNode(value, current)) return null;\n const property = fieldName(parent);\n const table = parent.parent;\n const args = table?.parent;\n const call = args?.parent;\n if (!property || table?.type !== \"table_constructor\" || args?.type !== \"arguments\" || !call || !isCreateElementCall(call, context)) {\n return null;\n }\n if (!sameNode(context.callArguments(call)[1], table)) return null;\n const component = context.callArguments(call)[0]?.text.trim() ?? \"\";\n if (!component || /^(?:\"[^\"]+\"|'[^']+')$/.test(component)) return null;\n return { component, property };\n }\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return null;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return null;\n current = parent;\n }\n return null;\n}\n\nfunction isEffectUsage(node: SyntaxNode, context: RuleContext): boolean {\n const nearest = context.nearestFunction(node);\n if (nearest) {\n const parent = nearest.node.parent;\n if (parent?.type === \"arguments\" && parent.parent?.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(parent.parent) ?? \"\");\n if (/^React\\.use(?:Effect|LayoutEffect)$/.test(path)) return true;\n }\n }\n\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) break;\n if (parent.type === \"arguments\" && parent.parent?.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(parent.parent) ?? \"\");\n if (/^React\\.use(?:Effect|LayoutEffect)$/.test(path)) return true;\n }\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") break;\n current = parent;\n }\n return false;\n}\n\nfunction isStructuralUsage(node: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return false;\n if (parent.type === \"if_statement\" || parent.type === \"elseif_clause\" || parent.type === \"while_statement\"\n || parent.type === \"repeat_statement\" || parent.type === \"return_statement\") return true;\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return false;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return false;\n current = parent;\n }\n return false;\n}\n\nfunction classifyBindingUsage(\n node: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): BindingUsageKind {\n if (isTransparentUsage(node, context, compatibleComponentProps)) return \"compatible\";\n if (createElementPropUsage(node, context)) return \"custom-component\";\n if (isEffectUsage(node, context)) return \"effect\";\n if (isStructuralUsage(node)) return \"structural\";\n return \"unknown\";\n}\n\nfunction bindingUsageSummary(\n valueName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): BindingUsageSummary {\n const summary: BindingUsageSummary = {\n reads: 0,\n compatible: 0,\n customComponent: 0,\n visualCustomComponent: 0,\n effect: 0,\n structural: 0,\n unknown: 0,\n };\n if (!owner.body) return summary;\n\n for (const node of context.walk(owner.body)) {\n if (!isReadNode(node, valueName, owner, declaration)) continue;\n summary.reads += 1;\n const customComponentUsage = createElementPropUsage(node, context);\n const kind = classifyBindingUsage(node, context, compatibleComponentProps);\n if (kind === \"compatible\") summary.compatible += 1;\n else if (kind === \"custom-component\") {\n summary.customComponent += 1;\n if (customComponentUsage && LIKELY_VISUAL_PROP.test(customComponentUsage.property)) {\n summary.visualCustomComponent += 1;\n }\n } else if (kind === \"effect\") summary.effect += 1;\n else if (kind === \"structural\") summary.structural += 1;\n else summary.unknown += 1;\n }\n return summary;\n}\n\nfunction hasCandidatePresentationEvidence(summary: BindingUsageSummary): boolean {\n return summary.compatible > 0 || summary.visualCustomComponent > 0;\n}\n\nexport const preferBindingOverState: RuleDefinition = {\n id: \"react-luau/prefer-binding-over-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Prefer React.useBinding when externally updated values do not need React reconciliation on every change.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n\n const importedHooks = importedBindingCandidateHooks(context);\n const importedCallbacks = importedExternalCallbackFunctions(context);\n const compatibleComponentProps = importedBindingCompatibleComponentProps(context);\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedHooks.get(path);\n if (!summary) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner) continue;\n if (!shouldRecommendImportedHook(summary, call, localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const key = `imported:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const hasBindingMode = summary.bindingModeParameterIndex !== undefined && summary.bindingWhenTruthy !== undefined;\n const message = summary.sourceKind === \"measurement\"\n ? hasBindingMode\n ? `${path} is using its React state mode for an externally changing GUI measurement, so ${localName} rerenders this consumer when the measurement changes.`\n : `${path} returns React state for an externally changing GUI measurement, so ${localName} rerenders this consumer when the measurement changes.`\n : summary.sourceKind === \"derived-external-state\"\n ? `${path} derives React state from another externally updated reactive value, so ${localName} adds another rerendering state layer.`\n : `${path} returns state updated${summary.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"}, and ${localName} only flows into bindable host properties.`;\n const bindingModeInstruction = hasBindingMode\n ? `Use the hook's Binding-returning mode${summary.bindingModeParameterName ? ` by passing ${summary.bindingWhenTruthy ? \"true\" : \"false\"} for ${summary.bindingModeParameterName}` : \"\"}. `\n : \"Prefer a Binding-returning measurement hook. \";\n const help = summary.sourceKind === \"measurement\"\n ? `${bindingModeInstruction}Use Binding:map for derived visual values or a binding-aware effect for imperative reactions; keep React state only when the measurement truly needs to rebuild component structure.`\n : \"Prefer a Binding-returning hook API so host properties can update without rerendering the consumer.\";\n diagnostics.push({\n node: callNameNode(call),\n message,\n help,\n fixPreview: hasBindingMode ? bindingModeFixPreview(summary, call, context) : undefined,\n });\n }\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const member = path.split(/[.:]/).at(-1) ?? path;\n const bindingAlternative = context.project.bindingApiAlternatives.get(member);\n if (!bindingAlternative) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (!stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps)) continue;\n const field = selectorFieldName(call, context);\n\n const key = `state-api:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} subscribes ${localName} through React state${field ? ` for ${field}` : \"\"}, but ${bindingAlternative} is available and every use of the value only updates bindable host properties.`,\n help: `Use ${bindingAlternative} so the host property can update without rerendering the component.`,\n fixPreview: callMemberFixPreview(call, bindingAlternative),\n });\n }\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const updateKind = bindingHasExternalOrHighFrequencyUpdates(binding, importedCallbacks, context);\n if (!updateKind) continue;\n\n const localCompatible = stateReadsAreBindingCompatible(\n binding.valueName,\n owner,\n binding.declaration,\n context,\n compatibleComponentProps,\n );\n const hookCompatible = owner.isHook ? hookCallSitesAreBindingCompatible(binding, context, compatibleComponentProps) : false;\n if (owner.isHook ? !hookCompatible : !localCompatible) continue;\n\n const key = `${binding.call.startIndex}:${binding.call.endIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n if (owner.isHook && hookCompatible) {\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `Hook state ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"} and is only consumed by host properties at analyzed call sites.`,\n help: \"Consider returning a Binding, or adding a Binding-returning variant of this hook, so consumers can update host properties without rerendering.\",\n });\n } else {\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `State ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency callback\" : \" from an external callback\"} and is read by the component render path.`,\n help: \"Prefer React.useBinding when the update is visual and does not need React to rebuild component structure.\",\n fixPreview: useBindingFixPreview(binding.call),\n });\n }\n }\n\n return diagnostics;\n },\n};\n\n\nexport const preferBindingOverStateCandidate: RuleDefinition = {\n id: \"react-luau/prefer-binding-over-state-candidate\",\n category: \"Performance\",\n severity: \"suggestion\",\n description: \"Surface lower-confidence state-to-Binding opportunities that need developer review.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n const importedHooks = importedBindingCandidateHooks(context);\n const importedCallbacks = importedExternalCallbackFunctions(context);\n const compatibleComponentProps = importedBindingCompatibleComponentProps(context);\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedHooks.get(path);\n if (!summary || !summary.external || callDefinitelyUsesBindingMode(summary, call, context)) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (shouldRecommendImportedHook(summary, call, localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const usage = bindingUsageSummary(localName, owner, declaration, context, compatibleComponentProps);\n const hasPresentationEvidence = hasCandidatePresentationEvidence(usage)\n || (summary.sourceKind === \"derived-external-state\" && usage.effect > 0);\n if (!summary.highFrequency && !hasPresentationEvidence) continue;\n\n const key = `imported:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} updates ${localName} through React state when outside data changes. Some uses of ${localName} may need a rerender, so switching it entirely to a Binding could change behavior.`,\n help: \"Inspect whether the value can become a Binding, use Binding:map for visual derivation, or split visual updates from the smaller part of the value that truly needs React state.\",\n });\n }\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const member = path.split(/[.:]/).at(-1) ?? path;\n const bindingAlternative = context.project.bindingApiAlternatives.get(member);\n if (!bindingAlternative) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const key = `state-api:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} uses React state even though ${bindingAlternative} is available. Some uses of ${localName} may need a rerender, so replacing it entirely with the Binding API could change behavior.`,\n help: `Inspect whether ${bindingAlternative}, Binding:map, or splitting visual and structural consumers would avoid unnecessary rerenders.`,\n fixPreview: callMemberFixPreview(call, bindingAlternative),\n });\n }\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner || !owner.isComponent || !owner.body) continue;\n const updateKind = bindingHasExternalOrHighFrequencyUpdates(binding, importedCallbacks, context);\n if (!updateKind) continue;\n if (stateReadsAreBindingCompatible(binding.valueName, owner, binding.declaration, context, compatibleComponentProps)) continue;\n\n const usage = bindingUsageSummary(binding.valueName, owner, binding.declaration, context, compatibleComponentProps);\n if (!hasCandidatePresentationEvidence(usage)) continue;\n\n const key = `state:${binding.call.startIndex}:${binding.call.endIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `State ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"} and appears at least partly presentation-oriented, but some consumers may still require React state.`,\n help: \"Inspect whether visual consumers can move to React.useBinding while structural consumers keep a smaller state value. Splitting the responsibilities can remove rerenders without changing component behavior.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
34
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { RuleDefinition } from \"../types\";\n\nconst REQUIRED_CLOSERS = new Map<string, string>([\n [\"parameters\", \")\"],\n [\"arguments\", \")\"],\n [\"table_constructor\", \"}\"],\n]);\n\nconst TYPE_SYNTAX_ANCESTORS = new Set([\n \"type_definition\",\n \"type_annotation\",\n \"type_parameters\",\n \"generic_type\",\n \"function_type\",\n \"optional_type\",\n \"object_type\",\n \"union_type\",\n \"intersection_type\",\n \"tuple_type\",\n \"singleton_type\",\n \"variadic_type\",\n \"variadic_type_pack\",\n]);\n\nfunction incompleteDelimitedNode(node: SyntaxNode): string | null {\n const closer = REQUIRED_CLOSERS.get(node.type);\n if (!closer) return null;\n return node.text.trimEnd().endsWith(closer) ? null : closer;\n}\n\nfunction isBundledGrammarTypeGap(node: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n if (TYPE_SYNTAX_ANCESTORS.has(current.type)) {\n if (current.type !== \"type_definition\") return true;\n if (/^\\s*(?:export\\s+)?type\\s+[A-Za-z_][A-Za-z0-9_]*/s.test(current.text)) return true;\n }\n current = current.parent;\n }\n return false;\n}\n\nexport const parseErrors: RuleDefinition = {\n id: \"react-luau/parse-error\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Report executable Luau syntax that the bundled parser cannot form into a complete syntax tree.\",\n run(context) {\n const diagnostics = [];\n const covered: Array<{ start: number; end: number }> = [];\n\n for (const node of context.walk()) {\n const missingCloser = incompleteDelimitedNode(node);\n if (!node.isError && !node.isMissing && !missingCloser) continue;\n if (isBundledGrammarTypeGap(node)) continue;\n if (covered.some((range) => node.startIndex >= range.start && node.endIndex <= range.end)) continue;\n covered.push({ start: node.startIndex, end: node.endIndex });\n\n let message = \"Luau syntax could not be parsed cleanly at this location.\";\n if (node.isMissing) message = `Luau syntax is missing ${node.type}.`;\n else if (missingCloser) message = `Luau syntax is missing closing ${missingCloser}.`;\n\n diagnostics.push({\n node,\n message,\n help: \"Fix the syntax error before relying on downstream React-Luau diagnostics in this file.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
35
|
+
"import { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport type { SyntaxNode } from \"../syntax\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { normalizeExpressionText, sameNode } from \"../ast/walk\";\nimport { isHighFrequencyRunServiceCall } from \"../roblox-semantics\";\nimport { callNameNode, declarationNames, identifierNode, fieldName, fieldNameNode, fieldValue, isBindingShadowedBetween, stateBindingsFor } from \"./helpers\";\n\nconst STATIC_DISCOVERY = /(?::|\\.)(GetChildren|GetDescendants)$/;\nconst PURE_TRIVIAL_CALLS = /^(?:tostring|tonumber|type|typeof|math\\.[A-Za-z_][A-Za-z0-9_]*|string\\.(?:lower|upper|format|len)|Color3\\.(?:new|fromRGB|fromHSV)|Vector[23]\\.new|UDim2?\\.(?:new|fromOffset|fromScale)|CFrame\\.new)$/;\n\nfunction declarationForCall(call: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = call.parent;\n while (current) {\n if (current.type === \"variable_declaration\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction declaredNameForCall(call: SyntaxNode): string | null {\n const declaration = declarationForCall(call);\n return declaration ? declarationNames(declaration)[0] ?? null : null;\n}\n\nfunction isIdentifierPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent?.type === \"method_index_expression\") {\n return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n }\n return false;\n}\n\nfunction identifierReferences(\n context: RuleContext,\n owner: FunctionInfo,\n name: string,\n declaration: SyntaxNode | null,\n): SyntaxNode[] {\n if (!owner.body) return [];\n const result: SyntaxNode[] = [];\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"identifier\" || node.text !== name) continue;\n if (declaration && node.startIndex >= declaration.startIndex && node.endIndex <= declaration.endIndex) continue;\n if (isIdentifierPropertyName(node)) continue;\n if (isBindingShadowedBetween(node, owner, name, declaration)) continue;\n result.push(node);\n }\n return result;\n}\n\nfunction nearestAncestor(node: SyntaxNode, stop: SyntaxNode, type: string): SyntaxNode | null {\n let current = node.parent;\n while (current && !sameNode(current, stop)) {\n if (current.type === type) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction highFrequencyCallback(node: SyntaxNode, context: RuleContext): SyntaxNode | null {\n let current = node.parent;\n while (current) {\n if (current.type === \"function_definition\") {\n const argumentsNode = current.parent;\n const call = argumentsNode?.type === \"arguments\" ? argumentsNode.parent : null;\n if (call?.type === \"function_call\" && isHighFrequencyRunServiceCall(call, context)) return current;\n }\n current = current.parent;\n }\n return null;\n}\n\nfunction setterIsNoChangeGuarded(call: SyntaxNode, callback: SyntaxNode, binding: StateBinding): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback)) {\n if (current.type === \"if_statement\" || current.type === \"if_expression\") {\n const header = current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\";\n const escaped = binding.valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`\\\\b${escaped}\\\\b[^\\\\n]*(?:~=|==)|(?:~=|==)[^\\\\n]*\\\\b${escaped}\\\\b`).test(header)) return true;\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction setterIsOneShotGuarded(call: SyntaxNode, callback: SyntaxNode): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback)) {\n if (current.type === \"if_statement\") {\n const header = current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\";\n const candidates = [\n ...header.matchAll(/\\bnot\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/g),\n ...header.matchAll(/\\b([A-Za-z_][A-Za-z0-9_]*)\\s*==\\s*false\\b/g),\n ].map((match) => match[1]);\n for (const guard of candidates) {\n const escaped = guard.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*true\\\\b`).test(current.text)) continue;\n if (new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*false\\\\b`).test(callback.text)) continue;\n return true;\n }\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction componentRenderCost(context: RuleContext, owner: FunctionInfo): string[] {\n if (!owner.body) return [];\n let clones = 0;\n let loops = 0;\n let discovery = 0;\n for (const node of context.walk(owner.body)) {\n if (context.nearestFunction(node) !== owner) continue;\n if (node.type === \"for_statement\" || node.type === \"while_statement\" || node.type === \"repeat_statement\") loops += 1;\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"table.clone\") clones += 1;\n if (STATIC_DISCOVERY.test(path) || /:GetTagged$/.test(path)) discovery += 1;\n }\n const parts: string[] = [];\n if (clones > 0) parts.push(`${clones} table clone${clones === 1 ? \"\" : \"s\"}`);\n if (loops > 1) parts.push(`${loops} collection/loop passes`);\n if (discovery > 0) parts.push(`${discovery} Instance discovery call${discovery === 1 ? \"\" : \"s\"}`);\n return parts;\n}\n\nfunction memoizedImports(context: RuleContext): Map<string, \"shallow\" | \"custom\"> {\n const result = new Map<string, \"shallow\" | \"custom\">();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const localName = match[1];\n const memoKind = resolveModuleReference(normalizeRequireTarget(match[2]), context.project.memoizedModules);\n if (memoKind) result.set(localName, memoKind);\n }\n return result;\n}\n\nfunction fieldLabel(field: SyntaxNode): string {\n return fieldName(field) ?? field.childForFieldName(\"name\")?.text ?? \"prop\";\n}\n\nfunction isInlineFreshValue(node: SyntaxNode | null): boolean {\n return node?.type === \"table_constructor\" || node?.type === \"function_definition\";\n}\n\nexport const rerenderUnstableMemoProps: RuleDefinition = {\n id: \"react-luau/rerender-unstable-memo-props\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Warn when fresh table or function props defeat shallow React.memo comparisons.\",\n run(context) {\n const imports = memoizedImports(context);\n if (imports.size === 0) return [];\n const diagnostics: DiagnosticInput[] = [];\n\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.createElement\") continue;\n const component = context.containingComponent(call);\n if (!component || context.nearestFunction(call) !== component) continue;\n const args = context.callArguments(call);\n const childName = args[0]?.text.trim() ?? \"\";\n if (imports.get(childName) !== \"shallow\") continue;\n const props = args[1];\n if (!props || props.type !== \"table_constructor\") continue;\n\n const unstableFields = props.namedChildren\n .filter((node) => node.type === \"field\")\n .filter((field) => isInlineFreshValue(fieldValue(field)));\n if (unstableFields.length === 0) continue;\n const unstable = unstableFields.map(fieldLabel);\n const highlights = unstableFields.map(fieldNameNode);\n\n diagnostics.push({\n node: highlights[0],\n highlights,\n severity: \"warning\",\n message: `Memoized ${childName} receives fresh ${unstable.join(\", \")} prop${unstable.length === 1 ? \"\" : \"s\"} on every parent render.`,\n help: \"Fresh table or function identity prevents the shallow memo comparison from skipping this child. Stabilize the prop only when the parent rerenders frequently, move construction into the child, or remove ineffective memoization.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderHighFrequencyState: RuleDefinition = {\n id: \"react-luau/rerender-high-frequency-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find state updates from frame callbacks that can rerender expensive component trees continuously.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n const seen = new Set<string>();\n\n for (const call of context.findCalls()) {\n const callback = highFrequencyCallback(call, context);\n if (!callback) continue;\n const component = context.containingComponent(call);\n if (!component) continue;\n const setter = context.getCallPath(call) ?? \"\";\n const binding = context.model.stateBindings.find((candidate) => candidate.owner === component && candidate.setterName === setter);\n if (!binding || setterIsNoChangeGuarded(call, callback, binding) || setterIsOneShotGuarded(call, callback)) continue;\n const key = `${callback.startIndex}:${setter}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const renderCost = componentRenderCost(context, component);\n diagnostics.push({\n node: callNameNode(call),\n severity: \"warning\",\n message: `${binding.valueName} has a state setter called from a per-frame callback and may cause frequent rerenders when its value changes.`,\n help: renderCost.length > 0\n ? `This render also performs ${renderCost.join(\" and \")}. Isolate or throttle the high-frequency state, or use Bindings for host-property-only updates.`\n : \"Isolate or throttle the high-frequency state. Use React.useBinding when the value only drives host Instance properties.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nfunction singleReturnExpression(callback: SyntaxNode | undefined): SyntaxNode | null {\n if (!callback || callback.type !== \"function_definition\") return null;\n const body = callback.childForFieldName(\"body\");\n if (!body || body.namedChildren.length !== 1) return null;\n const statement = body.namedChildren[0];\n if (statement.type !== \"return_statement\") return null;\n const expressionList = statement.namedChildren.find((child) => child.type === \"expression_list\");\n if (!expressionList || expressionList.namedChildren.length !== 1) return null;\n return expressionList.namedChildren[0] ?? null;\n}\n\nfunction isTrivialMemoExpression(expression: SyntaxNode, context: RuleContext): boolean {\n if (expression.type === \"table_constructor\" || expression.type === \"function_definition\") return false;\n let calls = 0;\n for (const node of context.walk(expression)) {\n if (node.type === \"for_statement\" || node.type === \"while_statement\" || node.type === \"repeat_statement\") return false;\n if (node.type !== \"function_call\") continue;\n calls += 1;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (/random|GenerateGUID|GetServerTimeNow|tick|time|clock/i.test(path)) return false;\n if (!PURE_TRIVIAL_CALLS.test(path)) return false;\n }\n return calls <= 2 && expression.text.length <= 180;\n}\n\nfunction valueIdentityIsObservedByHook(context: RuleContext, owner: FunctionInfo, name: string, declaration: SyntaxNode): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!/^React\\.use(?:Effect|LayoutEffect|Memo|Callback)$/.test(path)) continue;\n const dependencies = context.callArguments(call)[1];\n if (!dependencies) continue;\n for (const reference of identifierReferences(context, owner, name, declaration)) {\n if (reference.startIndex >= dependencies.startIndex && reference.endIndex <= dependencies.endIndex) return true;\n }\n }\n return false;\n}\n\nfunction isEmptyDependencyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(node && node.type === \"table_constructor\" && node.namedChildren.length === 0);\n}\n\nexport const rerenderUnnecessaryUseMemo: RuleDefinition = {\n id: \"react-luau/rerender-unnecessary-usememo\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find trivial derived values that cost more to memoize than to compute directly.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useMemo\") continue;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n const declaration = declarationForCall(call);\n const name = declaredNameForCall(call);\n const argumentsList = context.callArguments(call);\n const expression = singleReturnExpression(argumentsList[0]);\n if (isEmptyDependencyTable(argumentsList[1])) continue;\n if (!owner || !declaration || !name || !expression || !isTrivialMemoExpression(expression, context)) continue;\n if (valueIdentityIsObservedByHook(context, owner, name, declaration)) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: \"useMemo caches a trivial derived value.\",\n help: \"Compute the value directly unless stable identity or a genuinely expensive calculation is required.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction isOnlyDirectFunctionCallReference(node: SyntaxNode, name: string): boolean {\n const parent = node.parent;\n return parent?.type === \"function_call\"\n && sameNode(parent.childForFieldName(\"name\"), node)\n && (parent.childForFieldName(\"name\")?.text.trim() ?? \"\") === name;\n}\n\nexport const rerenderUnnecessaryUseCallback: RuleDefinition = {\n id: \"react-luau/rerender-unnecessary-usecallback\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find useCallback values whose stable function identity is never observed.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useCallback\") continue;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n const declaration = declarationForCall(call);\n const name = declaredNameForCall(call);\n if (!owner || !declaration || !name) continue;\n const references = identifierReferences(context, owner, name, declaration);\n if (references.length === 0 || references.some((node) => !isOnlyDirectFunctionCallReference(node, name))) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${name} is wrapped in useCallback, but its identity is never observed.`,\n help: \"Use a normal local function. Keep useCallback when the function is passed to a memoized child, retained by another hook, or otherwise compared by identity.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction staticDiscoveryPath(path: string): boolean {\n if (/:GetTagged$/.test(path)) return true;\n if (!STATIC_DISCOVERY.test(path)) return false;\n const receiver = path.replace(/(?::|\\.)(?:GetChildren|GetDescendants)$/, \"\");\n return /^(?:ReplicatedStorage|ServerStorage|ServerScriptService|StarterGui|StarterPlayer|script)(?:\\.|:|$)/.test(receiver);\n}\n\nexport const rerenderStaticDiscoveryInRender: RuleDefinition = {\n id: \"react-luau/rerender-static-discovery-in-render\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find static Instance/module discovery repeated during component render.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || context.nearestFunction(call) !== component) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!staticDiscoveryPath(path)) continue;\n const loop = nearestAncestor(call, component.node, \"for_statement\");\n const body = loop?.childForFieldName(\"body\");\n const requiresModules = Boolean(body && [...context.walk(body)].some((node) => node.type === \"function_call\" && context.getCallPath(node) === \"require\"));\n diagnostics.push({\n node: callNameNode(call),\n severity: \"warning\",\n message: `${path} runs during component render${requiresModules ? \" and feeds module requires\" : \"\"}.`,\n help: requiresModules\n ? \"Discover and require static modules once outside the component, or cache the derived catalog by the inputs that can actually change.\"\n : \"Move static discovery outside the component or memoize the derived result when the source can change.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction genericLoopCollection(loop: SyntaxNode): string | null {\n const clause = loop.namedChildren.find((child) => child.type === \"for_generic_clause\");\n if (!clause) return null;\n const match = clause.text.match(/\\bin\\s+(.+)$/s);\n if (!match) return null;\n const expression = normalizeExpressionText(match[1]);\n if (!expression || expression.length > 160) return null;\n return expression;\n}\n\nexport const rerenderRepeatedCollectionScan: RuleDefinition = {\n id: \"react-luau/rerender-repeated-collection-scan\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find repeated direct render passes over the same collection expression.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n const groups = new Map<string, { display: string; loops: SyntaxNode[] }>();\n for (const node of context.walk(component.body)) {\n if (node.type !== \"for_statement\" || context.nearestFunction(node) !== component) continue;\n const collection = genericLoopCollection(node);\n if (!collection || collection === \"{}\") continue;\n const clause = node.namedChildren.find((child) => child.type === \"for_generic_clause\");\n const display = clause?.text.match(/\\bin\\s+(.+)$/s)?.[1]?.trim().replace(/\\s+/g, \" \") ?? collection;\n const group = groups.get(collection) ?? { display, loops: [] };\n group.loops.push(node);\n groups.set(collection, group);\n }\n for (const { display, loops } of groups.values()) {\n if (loops.length < 2) continue;\n const repeatedCollections = loops.map((loop) => {\n const clause = loop.namedChildren.find((child) => child.type === \"for_generic_clause\");\n return clause?.namedChildren.at(-1) ?? clause ?? loop;\n });\n diagnostics.push({\n node: repeatedCollections[1],\n highlights: repeatedCollections,\n message: `${display} is scanned ${loops.length} times during this render.`,\n help: \"Consider combining the passes or deriving a lookup when the collection is large or the component rerenders frequently.\",\n });\n }\n }\n return diagnostics;\n },\n};\n\nexport const rerenderStaticState: RuleDefinition = {\n id: \"react-luau/rerender-static-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find React state whose setter is never used and therefore cannot change.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n for (const binding of stateBindingsFor(context, component)) {\n if (binding.setterName === \"_\" || binding.setterName.startsWith(\"_\")) continue;\n const setterRefs = identifierReferences(context, component, binding.setterName, binding.declaration);\n if (setterRefs.length > 0) continue;\n const valueRefs = identifierReferences(context, component, binding.valueName, binding.declaration);\n if (valueRefs.length === 0) continue;\n diagnostics.push({\n node: identifierNode(binding.declaration, binding.setterName) ?? binding.declaration,\n message: `${binding.valueName} cannot change because ${binding.setterName} is never used.`,\n help: \"Use a normal derived value. If the initial value must be captured once for the component lifetime, use a ref.\",\n });\n }\n }\n return diagnostics;\n },\n};\n\nfunction memoReturnsCurrentCell(call: SyntaxNode, context: RuleContext): boolean {\n const args = context.callArguments(call);\n const callback = args[0];\n const deps = args[1];\n if (!callback || callback.type !== \"function_definition\" || deps?.type !== \"table_constructor\" || deps.namedChildren.length > 0) return false;\n const expression = singleReturnExpression(callback);\n if (!expression || expression.type !== \"table_constructor\") return false;\n const fields = expression.namedChildren.filter((node) => node.type === \"field\");\n return fields.length === 1 && fieldName(fields[0]) === \"current\";\n}\n\nexport const preferUseRefForMutableCell: RuleDefinition = {\n id: \"react-luau/prefer-use-ref-for-mutable-cell\",\n category: \"Hooks\",\n severity: \"suggestion\",\n description: \"Prefer useRef over useMemo-created tables that only emulate a mutable current cell.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useMemo\") continue;\n if (!memoReturnsCurrentCell(call, context)) continue;\n const name = declaredNameForCall(call) ?? \"This value\";\n diagnostics.push({\n node: callNameNode(call),\n message: `${name} uses useMemo to create a { current = ... } mutable cell.`,\n help: \"Use React.useRef(initialValue) to express the same lifetime and mutable-cell intent directly.\",\n });\n }\n return diagnostics;\n },\n};\n",
|
|
36
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport type { BindingCandidateHookSummary, ExternalCallbackFunctionSummary, FixPreview, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { isHighFrequencyRunServiceCall, isHighFrequencyRunServiceExpression } from \"../roblox-semantics\";\nimport { callNameNode, declarationNames, fieldName, fieldValue, isBindingShadowedBetween } from \"./helpers\";\n\nconst EXTERNAL_CALLBACK = /(?:^|[.:])(?:Connect|Once|Subscribe|Observe|Listen|Watch)$/i;\nconst NON_BINDABLE_HOST_FIELDS = new Set([\"ref\", \"key\", \"children\"]);\n\nfunction replaceWithinNode(container: SyntaxNode, target: SyntaxNode, replacement: string): string | null {\n const start = target.startIndex - container.startIndex;\n const end = target.endIndex - container.startIndex;\n if (start < 0 || end < start || end > container.text.length) return null;\n return `${container.text.slice(0, start)}${replacement}${container.text.slice(end)}`;\n}\n\nfunction bindingModeFixPreview(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n context: RuleContext,\n): FixPreview | undefined {\n const parameterIndex = summary.bindingModeParameterIndex;\n if (parameterIndex === undefined || summary.bindingWhenTruthy === undefined) return undefined;\n const desired = summary.bindingWhenTruthy ? \"true\" : \"false\";\n const args = context.callArguments(call);\n\n if (parameterIndex < args.length) {\n const after = replaceWithinNode(call, args[parameterIndex], desired);\n if (!after || after === call.text) return undefined;\n return {\n kind: \"exact\",\n before: call.text,\n after,\n note: summary.bindingModeParameterName\n ? `Switch the ${summary.bindingModeParameterName} parameter to the hook's Binding mode.`\n : \"Switch this call to the hook's Binding mode.\",\n };\n }\n\n if (parameterIndex >= args.length) {\n const close = call.text.lastIndexOf(\")\");\n if (close < 0) return undefined;\n // Omitted Lua/Luau arguments are nil. Fill any skipped optional parameters\n // explicitly so the inferred Binding-mode argument lands in the right slot.\n const skipped = Array.from({ length: parameterIndex - args.length }, () => \"nil\");\n const appended = [...skipped, desired].join(\", \");\n const insertion = `${args.length > 0 ? \", \" : \"\"}${appended}`;\n return {\n kind: \"exact\",\n before: call.text,\n after: `${call.text.slice(0, close)}${insertion}${call.text.slice(close)}`,\n note: summary.bindingModeParameterName\n ? `Enable the hook's Binding mode through the ${summary.bindingModeParameterName} parameter without changing omitted optional arguments.`\n : \"Enable the hook's Binding mode without changing omitted optional arguments.\",\n };\n }\n\n return undefined;\n}\n\nfunction callMemberFixPreview(call: SyntaxNode, replacement: string): FixPreview | undefined {\n const name = callNameNode(call);\n const path = name.text;\n const separator = Math.max(path.lastIndexOf(\".\"), path.lastIndexOf(\":\"));\n const member = separator >= 0 ? path.slice(separator + 1) : path;\n const replacementName = separator >= 0 ? `${path.slice(0, separator + 1)}${replacement}` : replacement;\n const after = replaceWithinNode(call, name, replacementName);\n if (!after || member === replacement) return undefined;\n return { kind: \"exact\", before: call.text, after };\n}\n\nfunction useBindingFixPreview(call: SyntaxNode): FixPreview | undefined {\n const name = callNameNode(call);\n const current = name.text;\n const afterName = current.replace(/(?:^|\\.)useState$/, (match) => match.replace(\"useState\", \"useBinding\"));\n if (afterName === current) return undefined;\n const after = replaceWithinNode(call, name, afterName);\n return after ? { kind: \"exact\", before: call.text, after } : undefined;\n}\n\ninterface ImportedBindingSummaries {\n hooks: Map<string, BindingCandidateHookSummary>;\n callbacks: Map<string, ExternalCallbackFunctionSummary>;\n compatibleProps: Map<string, Set<string>>;\n}\n\nconst importedBindingSummariesCache = new WeakMap<RuleContext, ImportedBindingSummaries>();\n\nfunction importedBindingSummaries(context: RuleContext): ImportedBindingSummaries {\n const cached = importedBindingSummariesCache.get(context);\n if (cached) return cached;\n\n const result: ImportedBindingSummaries = {\n hooks: new Map(),\n callbacks: new Map(),\n compatibleProps: new Map(),\n };\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const [, localName, target] = match;\n const normalizedTarget = normalizeRequireTarget(target);\n\n const hook = resolveModuleReference(normalizedTarget, context.project.bindingCandidateHooks);\n if (hook) result.hooks.set(localName, hook);\n\n const callback = resolveModuleReference(normalizedTarget, context.project.externalCallbackModules);\n if (callback) result.callbacks.set(localName, callback);\n\n const compatibleProps = resolveModuleReference(normalizedTarget, context.project.bindingCompatibleComponentProps);\n if (compatibleProps) result.compatibleProps.set(localName, compatibleProps);\n }\n\n importedBindingSummariesCache.set(context, result);\n return result;\n}\n\nfunction importedBindingCandidateHooks(context: RuleContext): Map<string, BindingCandidateHookSummary> {\n return importedBindingSummaries(context).hooks;\n}\n\nfunction importedExternalCallbackFunctions(context: RuleContext): Map<string, ExternalCallbackFunctionSummary> {\n return importedBindingSummaries(context).callbacks;\n}\n\nfunction importedBindingCompatibleComponentProps(context: RuleContext): Map<string, Set<string>> {\n return importedBindingSummaries(context).compatibleProps;\n}\n\nfunction declarationForCall(call: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = call.parent;\n while (current) {\n if (current.type === \"variable_declaration\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nconst TRANSPARENT_PARENTS = new Set([\n \"binary_expression\",\n \"unary_expression\",\n \"parenthesized_expression\",\n \"cast_expression\",\n \"type_cast_expression\",\n \"interpolated_string\",\n \"string_interpolation\",\n \"expression_list\",\n \"assignment_statement\",\n \"arguments\",\n \"function_call\",\n \"dot_index_expression\",\n \"method_index_expression\",\n \"table_constructor\",\n \"field\",\n]);\n\nfunction isInside(node: SyntaxNode, ancestor: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n if (sameNode(current, ancestor)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isIdentifierPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent?.type === \"method_index_expression\") return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n return false;\n}\n\nfunction isReadNode(node: SyntaxNode, valueName: string, owner: FunctionInfo, declaration: SyntaxNode): boolean {\n if (node.type !== \"identifier\" || node.text !== valueName) return false;\n if (isInside(node, declaration)) return false;\n if (isIdentifierPropertyName(node)) return false;\n if (isBindingShadowedBetween(node, owner, valueName, declaration)) return false;\n const parent = node.parent;\n if (parent?.type === \"variable_list\" || parent?.type === \"typed_identifier\") return false;\n if (parent?.type === \"field\" && !sameNode(fieldValue(parent), node) && /^[A-Za-z_][A-Za-z0-9_]*\\s*=/.test(parent.text.trim())) {\n return false;\n }\n return true;\n}\n\nfunction hasAnyRead(valueName: string, owner: FunctionInfo, declaration: SyntaxNode, context: RuleContext): boolean {\n if (!owner.body) return false;\n return [...context.walk(owner.body)].some((node) => isReadNode(node, valueName, owner, declaration));\n}\n\nfunction isCreateElementCall(call: SyntaxNode, context: RuleContext): boolean {\n return call.type === \"function_call\"\n && context.resolveCallPath(context.getCallPath(call) ?? \"\") === \"React.createElement\";\n}\n\nfunction isHostCreateElementCall(call: SyntaxNode, context: RuleContext): boolean {\n if (!isCreateElementCall(call, context)) return false;\n const args = context.callArguments(call);\n const host = args[0]?.text.trim() ?? \"\";\n return /^(?:\"[^\"]+\"|'[^']+')$/.test(host);\n}\n\nfunction isTransparentUsage(\n node: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return false;\n\n if (parent.type === \"field\") {\n const value = fieldValue(parent);\n if (!value || !sameNode(value, current)) return false;\n const property = fieldName(parent);\n if (!property || NON_BINDABLE_HOST_FIELDS.has(property)) return false;\n const table = parent.parent;\n if (table?.type !== \"table_constructor\") return false;\n const args = table.parent;\n if (args?.type !== \"arguments\") return false;\n const call = args.parent;\n if (!call || !isCreateElementCall(call, context)) return false;\n if (!sameNode(context.callArguments(call)[1], table)) return false;\n if (isHostCreateElementCall(call, context)) return true;\n\n const component = context.callArguments(call)[0]?.text.trim() ?? \"\";\n return compatibleComponentProps.get(component)?.has(property) ?? false;\n }\n\n if (parent.type === \"if_statement\" || parent.type === \"elseif_clause\" || parent.type === \"while_statement\"\n || parent.type === \"repeat_statement\" || parent.type === \"return_statement\") {\n return false;\n }\n\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return false;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return false;\n current = parent;\n }\n return false;\n}\n\nfunction derivedLocalDeclarationForRead(node: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return null;\n if (parent.type === \"variable_declaration\") return parent;\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return null;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return null;\n current = parent;\n }\n return null;\n}\n\nfunction stateReadsAreBindingCompatible(\n valueName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n visited = new Set<string>(),\n): boolean {\n if (!owner.body) return false;\n const visitKey = `${declaration.startIndex}:${valueName}`;\n if (visited.has(visitKey)) return false;\n visited.add(visitKey);\n\n let reads = 0;\n for (const node of context.walk(owner.body)) {\n if (!isReadNode(node, valueName, owner, declaration)) continue;\n reads += 1;\n if (isTransparentUsage(node, context, compatibleComponentProps)) continue;\n\n const derivedDeclaration = derivedLocalDeclarationForRead(node);\n const derivedNames = derivedDeclaration ? declarationNames(derivedDeclaration) : [];\n if (derivedDeclaration && derivedNames.length === 1) {\n if (stateReadsAreBindingCompatible(\n derivedNames[0],\n owner,\n derivedDeclaration,\n context,\n compatibleComponentProps,\n new Set(visited),\n )) continue;\n }\n return false;\n }\n\n return reads > 0;\n}\n\nfunction callbackSource(call: SyntaxNode, context: RuleContext): { highFrequency: boolean; external: boolean } {\n const normalized = (context.getCallPath(call) ?? \"\").replace(/\\s+/g, \"\");\n const highFrequency = isHighFrequencyRunServiceCall(call, context);\n const final = normalized.split(/[.:]/).at(-1) ?? normalized;\n const external = highFrequency || EXTERNAL_CALLBACK.test(normalized) || EXTERNAL_CALLBACK.test(final);\n return { highFrequency, external };\n}\n\nfunction importedCallbackSource(\n call: SyntaxNode,\n callbackArgument: SyntaxNode,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedCallbacks.get(path);\n if (!summary) return null;\n const args = context.callArguments(call);\n const callbackIndex = args.findIndex((arg) => sameNode(arg, callbackArgument));\n if (callbackIndex < 0 || !summary.callbackParameterIndexes.includes(callbackIndex)) return null;\n return {\n highFrequency: summary.highFrequency || args.some((arg) => isHighFrequencyRunServiceExpression(arg, context)),\n external: true,\n };\n}\n\nfunction directCallbackSource(\n node: SyntaxNode,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const parent = node.parent;\n if (parent?.type !== \"arguments\" || parent.parent?.type !== \"function_call\") return null;\n const call = parent.parent;\n const imported = importedCallbackSource(call, node, importedCallbacks, context);\n if (imported) return imported;\n const source = callbackSource(call, context);\n return source.external ? source : null;\n}\n\nfunction namedFunctionCallbackSource(\n fn: FunctionInfo,\n owner: FunctionInfo,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n if (!fn.name || !owner.body) return null;\n let foundExternal = false;\n let foundHighFrequency = false;\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const args = context.callArguments(call);\n const callbackArg = args.find((arg) => arg.type === \"identifier\" && arg.text === fn.name);\n if (!callbackArg) continue;\n const imported = importedCallbackSource(call, callbackArg, importedCallbacks, context);\n const source = imported ?? callbackSource(call, context);\n if (!source.external) continue;\n foundExternal = true;\n foundHighFrequency ||= source.highFrequency;\n }\n\n return foundExternal ? { highFrequency: foundHighFrequency, external: true } : null;\n}\n\nfunction setterCallbackSource(\n call: SyntaxNode,\n binding: StateBinding,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const owner = binding.owner;\n if (!owner) return null;\n const nearest = context.nearestFunction(call);\n if (!nearest || nearest === owner) return null;\n\n const direct = directCallbackSource(nearest.node, importedCallbacks, context);\n if (direct) return direct;\n\n return namedFunctionCallbackSource(nearest, owner, importedCallbacks, context);\n}\n\nfunction bindingHasExternalOrHighFrequencyUpdates(\n binding: StateBinding,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const owner = binding.owner;\n if (!owner?.body) return null;\n let highFrequency = false;\n let external = false;\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"function_call\") continue;\n const path = context.getCallPath(node);\n if (path !== binding.setterName) continue;\n const source = setterCallbackSource(node, binding, importedCallbacks, context);\n if (!source) continue;\n highFrequency ||= source.highFrequency;\n external ||= source.external;\n }\n\n return highFrequency || external ? { highFrequency, external } : null;\n}\n\nfunction returnedHookValues(binding: StateBinding, context: RuleContext): Array<{ exportName: string; node: SyntaxNode }> {\n const owner = binding.owner;\n if (!owner?.body || !owner.isHook) return [];\n const results: Array<{ exportName: string; node: SyntaxNode }> = [];\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"return_statement\") continue;\n if (context.nearestFunction(node) !== owner) continue;\n\n for (const returned of node.namedChildren.flatMap((child) => child.type === \"expression_list\" ? child.namedChildren : [child])) {\n if (returned.type === \"identifier\" && returned.text === binding.valueName) {\n results.push({ exportName: binding.valueName, node: returned });\n } else if (returned.type === \"table_constructor\") {\n for (const field of returned.namedChildren.filter((child) => child.type === \"field\")) {\n const value = fieldValue(field);\n const name = fieldName(field);\n if (value?.type === \"identifier\" && value.text === binding.valueName && name) {\n results.push({ exportName: name, node: value });\n }\n }\n }\n }\n }\n\n return results;\n}\n\nfunction hookCallSitesAreBindingCompatible(\n binding: StateBinding,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n const owner = binding.owner;\n if (!owner?.isHook || !owner.name) return false;\n const returned = returnedHookValues(binding, context);\n if (returned.length === 0) return false;\n\n let callSites = 0;\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call);\n if (path !== owner.name) continue;\n const declaration = declarationForCall(call);\n if (!declaration) continue;\n const localName = declarationNames(declaration)[0] ?? null;\n const caller = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!localName || !caller) continue;\n\n if (returned.length === 1 && returned[0].exportName === binding.valueName) {\n if (!stateReadsAreBindingCompatible(localName, caller, declaration, context, compatibleComponentProps)) return false;\n callSites += 1;\n continue;\n }\n }\n\n return callSites > 0;\n}\n\nfunction selectorFieldName(call: SyntaxNode, context: RuleContext): string | null {\n const selector = context.callArguments(call)[0];\n if (!selector || selector.type !== \"function_definition\") return null;\n const text = selector.text;\n return text.match(/\\breturn\\s+[A-Za-z_][A-Za-z0-9_]*\\.([A-Za-z_][A-Za-z0-9_]*)\\b/)?.[1]\n ?? text.match(/\\breturn\\s+[A-Za-z_][A-Za-z0-9_]*\\[\\s*[\"']([^\"']+)[\"']\\s*\\]/)?.[1]\n ?? null;\n}\n\nfunction callDefinitelyUsesBindingMode(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n context: RuleContext,\n): boolean {\n const parameterIndex = summary.bindingModeParameterIndex;\n if (parameterIndex === undefined || summary.bindingWhenTruthy === undefined) return false;\n\n const argument = context.callArguments(call)[parameterIndex];\n const value = argument?.text.trim() ?? \"nil\";\n let truthy: boolean | null = null;\n if (value === \"true\") truthy = true;\n else if (value === \"false\" || value === \"nil\") truthy = false;\n if (truthy === null) return false;\n\n return truthy === summary.bindingWhenTruthy;\n}\n\nfunction shouldRecommendImportedHook(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n localName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n if (!summary.external || callDefinitelyUsesBindingMode(summary, call, context)) return false;\n if (!hasAnyRead(localName, owner, declaration, context)) return false;\n\n // A hook that mirrors an externally changing Instance property through React state is\n // already a strong producer-side Binding candidate. Consumers may need Binding:map or a\n // binding-aware effect rather than a direct value substitution, so requiring every read to\n // already terminate at a host property creates widespread false negatives.\n if (summary.sourceKind === \"measurement\") return true;\n\n return stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps);\n}\n\n\ntype BindingUsageKind = \"compatible\" | \"custom-component\" | \"effect\" | \"structural\" | \"unknown\";\n\ninterface BindingUsageSummary {\n reads: number;\n compatible: number;\n customComponent: number;\n visualCustomComponent: number;\n effect: number;\n structural: number;\n unknown: number;\n}\n\nconst LIKELY_VISUAL_PROP = /(?:position|size|rotation|transparency|opacity|color|image|text|anchor|visible|enabled|layout|scale|offset|zindex|canvas|viewport|cframe|width|height|radius|stroke|padding|spacing|angle|alpha|progress)/i;\n\nfunction createElementPropUsage(node: SyntaxNode, context: RuleContext): { component: string; property: string } | null {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return null;\n if (parent.type === \"field\") {\n const value = fieldValue(parent);\n if (!value || !sameNode(value, current)) return null;\n const property = fieldName(parent);\n const table = parent.parent;\n const args = table?.parent;\n const call = args?.parent;\n if (!property || table?.type !== \"table_constructor\" || args?.type !== \"arguments\" || !call || !isCreateElementCall(call, context)) {\n return null;\n }\n if (!sameNode(context.callArguments(call)[1], table)) return null;\n const component = context.callArguments(call)[0]?.text.trim() ?? \"\";\n if (!component || /^(?:\"[^\"]+\"|'[^']+')$/.test(component)) return null;\n return { component, property };\n }\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return null;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return null;\n current = parent;\n }\n return null;\n}\n\nfunction isEffectUsage(node: SyntaxNode, context: RuleContext): boolean {\n const nearest = context.nearestFunction(node);\n if (nearest) {\n const parent = nearest.node.parent;\n if (parent?.type === \"arguments\" && parent.parent?.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(parent.parent) ?? \"\");\n if (/^React\\.use(?:Effect|LayoutEffect)$/.test(path)) return true;\n }\n }\n\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) break;\n if (parent.type === \"arguments\" && parent.parent?.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(parent.parent) ?? \"\");\n if (/^React\\.use(?:Effect|LayoutEffect)$/.test(path)) return true;\n }\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") break;\n current = parent;\n }\n return false;\n}\n\nfunction isStructuralUsage(node: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return false;\n if (parent.type === \"if_statement\" || parent.type === \"elseif_clause\" || parent.type === \"while_statement\"\n || parent.type === \"repeat_statement\" || parent.type === \"return_statement\") return true;\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return false;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return false;\n current = parent;\n }\n return false;\n}\n\nfunction classifyBindingUsage(\n node: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): BindingUsageKind {\n if (isTransparentUsage(node, context, compatibleComponentProps)) return \"compatible\";\n if (createElementPropUsage(node, context)) return \"custom-component\";\n if (isEffectUsage(node, context)) return \"effect\";\n if (isStructuralUsage(node)) return \"structural\";\n return \"unknown\";\n}\n\nfunction bindingUsageSummary(\n valueName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): BindingUsageSummary {\n const summary: BindingUsageSummary = {\n reads: 0,\n compatible: 0,\n customComponent: 0,\n visualCustomComponent: 0,\n effect: 0,\n structural: 0,\n unknown: 0,\n };\n if (!owner.body) return summary;\n\n for (const node of context.walk(owner.body)) {\n if (!isReadNode(node, valueName, owner, declaration)) continue;\n summary.reads += 1;\n const customComponentUsage = createElementPropUsage(node, context);\n const kind = classifyBindingUsage(node, context, compatibleComponentProps);\n if (kind === \"compatible\") summary.compatible += 1;\n else if (kind === \"custom-component\") {\n summary.customComponent += 1;\n if (customComponentUsage && LIKELY_VISUAL_PROP.test(customComponentUsage.property)) {\n summary.visualCustomComponent += 1;\n }\n } else if (kind === \"effect\") summary.effect += 1;\n else if (kind === \"structural\") summary.structural += 1;\n else summary.unknown += 1;\n }\n return summary;\n}\n\nfunction hasCandidatePresentationEvidence(summary: BindingUsageSummary): boolean {\n return summary.compatible > 0 || summary.visualCustomComponent > 0;\n}\n\nexport const preferBindingOverState: RuleDefinition = {\n id: \"react-luau/prefer-binding-over-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Prefer React.useBinding when externally updated values do not need React reconciliation on every change.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n\n const importedHooks = importedBindingCandidateHooks(context);\n const importedCallbacks = importedExternalCallbackFunctions(context);\n const compatibleComponentProps = importedBindingCompatibleComponentProps(context);\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedHooks.get(path);\n if (!summary) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner) continue;\n if (!shouldRecommendImportedHook(summary, call, localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const key = `imported:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const hasBindingMode = summary.bindingModeParameterIndex !== undefined && summary.bindingWhenTruthy !== undefined;\n const message = summary.sourceKind === \"measurement\"\n ? hasBindingMode\n ? `${path} is using its React state mode for an externally changing GUI measurement, so ${localName} rerenders this consumer when the measurement changes.`\n : `${path} returns React state for an externally changing GUI measurement, so ${localName} rerenders this consumer when the measurement changes.`\n : summary.sourceKind === \"derived-external-state\"\n ? `${path} derives React state from another externally updated reactive value, so ${localName} adds another rerendering state layer.`\n : `${path} returns state updated${summary.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"}, and ${localName} only flows into bindable host properties.`;\n const bindingModeInstruction = hasBindingMode\n ? `Use the hook's Binding-returning mode${summary.bindingModeParameterName ? ` by passing ${summary.bindingWhenTruthy ? \"true\" : \"false\"} for ${summary.bindingModeParameterName}` : \"\"}. `\n : \"Prefer a Binding-returning measurement hook. \";\n const help = summary.sourceKind === \"measurement\"\n ? `${bindingModeInstruction}Use Binding:map for derived visual values or a binding-aware effect for imperative reactions; keep React state only when the measurement truly needs to rebuild component structure.`\n : \"Prefer a Binding-returning hook API so host properties can update without rerendering the consumer.\";\n diagnostics.push({\n node: callNameNode(call),\n message,\n help,\n fixPreview: hasBindingMode ? bindingModeFixPreview(summary, call, context) : undefined,\n });\n }\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const member = path.split(/[.:]/).at(-1) ?? path;\n const bindingAlternative = context.project.bindingApiAlternatives.get(member);\n if (!bindingAlternative) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (!stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps)) continue;\n const field = selectorFieldName(call, context);\n\n const key = `state-api:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} subscribes ${localName} through React state${field ? ` for ${field}` : \"\"}, but ${bindingAlternative} is available and every use of the value only updates bindable host properties.`,\n help: `Use ${bindingAlternative} so the host property can update without rerendering the component.`,\n fixPreview: callMemberFixPreview(call, bindingAlternative),\n });\n }\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const updateKind = bindingHasExternalOrHighFrequencyUpdates(binding, importedCallbacks, context);\n if (!updateKind) continue;\n\n const localCompatible = stateReadsAreBindingCompatible(\n binding.valueName,\n owner,\n binding.declaration,\n context,\n compatibleComponentProps,\n );\n const hookCompatible = owner.isHook ? hookCallSitesAreBindingCompatible(binding, context, compatibleComponentProps) : false;\n if (owner.isHook ? !hookCompatible : !localCompatible) continue;\n\n const key = `${binding.call.startIndex}:${binding.call.endIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n if (owner.isHook && hookCompatible) {\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `Hook state ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"} and is only consumed by host properties at analyzed call sites.`,\n help: \"Consider returning a Binding, or adding a Binding-returning variant of this hook, so consumers can update host properties without rerendering.\",\n });\n } else {\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `State ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency callback\" : \" from an external callback\"} and is read by the component render path.`,\n help: \"Prefer React.useBinding when the update is visual and does not need React to rebuild component structure.\",\n fixPreview: useBindingFixPreview(binding.call),\n });\n }\n }\n\n return diagnostics;\n },\n};\n\n\nexport const preferBindingOverStateCandidate: RuleDefinition = {\n id: \"react-luau/prefer-binding-over-state-candidate\",\n category: \"Performance\",\n severity: \"suggestion\",\n description: \"Surface lower-confidence state-to-Binding opportunities that need developer review.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n const importedHooks = importedBindingCandidateHooks(context);\n const importedCallbacks = importedExternalCallbackFunctions(context);\n const compatibleComponentProps = importedBindingCompatibleComponentProps(context);\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedHooks.get(path);\n if (!summary || !summary.external || callDefinitelyUsesBindingMode(summary, call, context)) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (shouldRecommendImportedHook(summary, call, localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const usage = bindingUsageSummary(localName, owner, declaration, context, compatibleComponentProps);\n const hasPresentationEvidence = hasCandidatePresentationEvidence(usage)\n || (summary.sourceKind === \"derived-external-state\" && usage.effect > 0);\n if (!summary.highFrequency && !hasPresentationEvidence) continue;\n\n const key = `imported:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} updates ${localName} through React state when outside data changes. Some uses of ${localName} may need a rerender, so switching it entirely to a Binding could change behavior.`,\n help: \"Inspect whether the value can become a Binding, use Binding:map for visual derivation, or split visual updates from the smaller part of the value that truly needs React state.\",\n });\n }\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const member = path.split(/[.:]/).at(-1) ?? path;\n const bindingAlternative = context.project.bindingApiAlternatives.get(member);\n if (!bindingAlternative) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const key = `state-api:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} uses React state even though ${bindingAlternative} is available. Some uses of ${localName} may need a rerender, so replacing it entirely with the Binding API could change behavior.`,\n help: `Inspect whether ${bindingAlternative}, Binding:map, or splitting visual and structural consumers would avoid unnecessary rerenders.`,\n fixPreview: callMemberFixPreview(call, bindingAlternative),\n });\n }\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner || !owner.isComponent || !owner.body) continue;\n const updateKind = bindingHasExternalOrHighFrequencyUpdates(binding, importedCallbacks, context);\n if (!updateKind) continue;\n if (stateReadsAreBindingCompatible(binding.valueName, owner, binding.declaration, context, compatibleComponentProps)) continue;\n\n const usage = bindingUsageSummary(binding.valueName, owner, binding.declaration, context, compatibleComponentProps);\n if (!hasCandidatePresentationEvidence(usage)) continue;\n\n const key = `state:${binding.call.startIndex}:${binding.call.endIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `State ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"} and appears at least partly presentation-oriented, but some consumers may still require React state.`,\n help: \"Inspect whether visual consumers can move to React.useBinding while structural consumers keep a smaller state value. Splitting the responsibilities can remove rerenders without changing component behavior.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
37
37
|
"import type { RuleDefinition } from \"../types\";\nimport { callNameNode } from \"./helpers\";\n\nexport const noCreateRootInRender: RuleDefinition = {\n id: \"react-luau/no-create-root-in-render\",\n category: \"Roblox\",\n severity: \"error\",\n description: \"Do not create ReactRoblox roots during component render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"ReactRoblox.createRoot\") continue;\n const owner = context.containingComponent(call);\n if (!owner || !context.isDirectlyExecutedInFunction(call, owner)) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: \"ReactRoblox.createRoot() is called during component render.\",\n help: \"Own top-level roots outside component render. When a component intentionally creates a separate root, create it in an effect and unmount that exact root in cleanup.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
38
|
-
"import type {
|
|
39
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { RuleContext, RuleDefinition, SourceEffectModuleSummary } from \"../types\";\nimport { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport { knownYieldReason } from \"../roblox-semantics\";\nimport { callNameNode } from \"./helpers\";\n\ninterface SourceBinding<T> {\n declaration: SyntaxNode;\n value: T | null;\n}\n\ntype SourceBindings<T> = Map<string, SourceBinding<T>[]>;\n\ninterface EffectInstance {\n summary: SourceEffectModuleSummary;\n persistent: boolean;\n}\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variables = assignment?.namedChildren.find((child) => child.type === \"variable_list\")\n ?? node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction assignmentParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"assignment_statement\" || node.parent?.type === \"variable_declaration\") return { names: [], expressions: [] };\n const variables = node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = node.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction bindingParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n return node.type === \"variable_declaration\" ? declarationParts(node) : assignmentParts(node);\n}\n\nfunction addSourceBinding<T>(bindings: SourceBindings<T>, name: string, declaration: SyntaxNode, value: T | null): void {\n const existing = bindings.get(name) ?? [];\n existing.push({ declaration, value });\n bindings.set(name, existing);\n}\n\nfunction nearestScopeContainer(node: SyntaxNode, context: RuleContext): SyntaxNode {\n const owner = context.nearestFunction(node);\n let current = node.parent;\n while (current) {\n if (current.type === \"block\") return current;\n if (owner && current.id === owner.node.id) return owner.body ?? owner.node;\n current = current.parent;\n }\n return context.root;\n}\n\nfunction declarationVisibleAt(declaration: SyntaxNode, node: SyntaxNode, context: RuleContext): boolean {\n if (declaration.startIndex >= node.startIndex) return false;\n const container = nearestScopeContainer(declaration, context);\n return node.startIndex >= container.startIndex && node.endIndex <= container.endIndex;\n}\n\nfunction functionParameterNames(node: SyntaxNode): Set<string> {\n const result = new Set<string>();\n const parameters = node.childForFieldName(\"parameters\")\n ?? node.namedChildren.find((child) => child.type === \"parameters\");\n for (const parameter of parameters?.namedChildren ?? []) {\n if (parameter.type === \"identifier\") result.add(parameter.text);\n for (const child of parameter.namedChildren) {\n if (child.type === \"identifier\") result.add(child.text);\n }\n }\n return result;\n}\n\nfunction loopBindsName(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"for_statement\") return false;\n const header = node.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`^\\\\s*for\\\\s+(?:${escaped}\\\\s*=|[^\\\\n]*\\\\b${escaped}\\\\b[^\\\\n]*\\\\bin\\\\b)`, \"s\").test(header);\n}\n\nfunction bindingShadowedAfterDeclaration(declaration: SyntaxNode, node: SyntaxNode, name: string): boolean {\n let current = node.parent;\n while (current) {\n // Once we reach a scope that already contains the source binding, binders\n // outside that scope cannot shadow the binding at this use site.\n if (declaration.startIndex >= current.startIndex && declaration.endIndex <= current.endIndex) return false;\n if (\n (current.type === \"function_definition\" || current.type === \"function_declaration\")\n && functionParameterNames(current).has(name)\n ) return true;\n if (loopBindsName(current, name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction resolveSourceBinding<T>(\n bindings: SourceBindings<T>,\n name: string,\n node: SyntaxNode,\n context: RuleContext,\n): T | null {\n const candidates = bindings.get(name);\n if (!candidates) return null;\n\n for (let index = candidates.length - 1; index >= 0; index -= 1) {\n const candidate = candidates[index];\n if (!declarationVisibleAt(candidate.declaration, node, context)) continue;\n if (bindingShadowedAfterDeclaration(candidate.declaration, node, name)) return null;\n return candidate.value;\n }\n return null;\n}\n\nfunction sourceEffectImports(context: RuleContext): SourceBindings<SourceEffectModuleSummary> {\n const result: SourceBindings<SourceEffectModuleSummary> = new Map();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\" && node.type !== \"assignment_statement\") continue;\n if (node.type === \"assignment_statement\" && node.parent?.type === \"variable_declaration\") continue;\n const { names, expressions } = bindingParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n const requireMatch = expression?.type === \"function_call\"\n ? expression.text.match(/^\\s*require\\s*\\((.*?)\\)\\s*$/s)\n : null;\n const summary = requireMatch\n ? resolveModuleReference(normalizeRequireTarget(requireMatch[1]), context.project.sourceEffects)\n : null;\n addSourceBinding(result, names[index], node, summary);\n }\n }\n return result;\n}\n\nfunction factorySummaryFromCall(\n call: SyntaxNode,\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n): SourceEffectModuleSummary | null {\n const path = context.getCallPath(call)?.replace(/\\s+/g, \"\") ?? \"\";\n const match = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) return null;\n const summary = resolveSourceBinding(imports, match[1], call, context);\n if (!summary?.instanceFactories.has(match[2])) return null;\n return summary;\n}\n\nfunction returnedFactorySummary(\n callback: SyntaxNode,\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n): SourceEffectModuleSummary | null {\n for (const node of context.walk(callback)) {\n if (node !== callback && (node.type === \"function_definition\" || node.type === \"function_declaration\")) continue;\n if (node.type !== \"return_statement\") continue;\n const expressions = node.namedChildren.find((child) => child.type === \"expression_list\");\n const value = expressions?.namedChildren[0];\n if (value?.type === \"function_call\") return factorySummaryFromCall(value, context, imports);\n }\n return null;\n}\n\nfunction sourceEffectInstances(\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n): SourceBindings<EffectInstance> {\n const result: SourceBindings<EffectInstance> = new Map();\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\" && node.type !== \"assignment_statement\") continue;\n if (node.type === \"assignment_statement\" && node.parent?.type === \"variable_declaration\") continue;\n const { names, expressions } = bindingParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n let instance: EffectInstance | null = null;\n if (expression?.type === \"function_call\") {\n const directFactory = factorySummaryFromCall(expression, context, imports);\n if (directFactory) {\n // An instance created at module scope persists across renders. A fresh\n // factory result created inside render is local to that render and\n // receiver-only mutation is not externally observable by itself.\n instance = {\n summary: directFactory,\n persistent: context.nearestFunction(node) === null,\n };\n } else if (context.resolveCallPath(context.getCallPath(expression) ?? \"\") === \"React.useMemo\") {\n const callback = context.callArguments(expression)[0];\n if (callback?.type === \"function_definition\") {\n const memoizedFactory = returnedFactorySummary(callback, context, imports);\n if (memoizedFactory) instance = { summary: memoizedFactory, persistent: true };\n }\n }\n } else if (expression?.type === \"identifier\") {\n instance = resolveSourceBinding(result, expression.text, expression, context);\n }\n addSourceBinding(result, names[index], node, instance);\n }\n }\n\n return result;\n}\n\nfunction sourceInferredEffectCall(\n call: SyntaxNode,\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n instances: SourceBindings<EffectInstance>,\n): boolean {\n const path = context.getCallPath(call)?.replace(/\\s+/g, \"\") ?? \"\";\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(path)) {\n const direct = resolveSourceBinding(imports, path, call, context);\n if (direct?.effectfulExport) return true;\n }\n\n const member = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!member) return false;\n\n const instance = resolveSourceBinding(instances, member[1], call, context);\n if (instance) {\n if (instance.summary.effectfulMembers.has(member[2])) return true;\n return instance.persistent && instance.summary.mutatingMembers.has(member[2]);\n }\n\n const imported = resolveSourceBinding(imports, member[1], call, context);\n if (!imported) return false;\n // The imported module table is itself persistent project state, so a method\n // that mutates its receiver is observable even if it has no other effects.\n return imported.effectfulMembers.has(member[2]) || imported.mutatingMembers.has(member[2]);\n}\n\nconst RENDER_EFFECT_PATTERNS = [\n /^Instance\\.new$/,\n /tween[^:]*:(?:Create|Play)$/i,\n /:Connect$/,\n /:BindAction$/,\n /:BindActionAtPriority$/,\n /:BindActivate$/,\n /BindToRenderStep$/,\n /BindToSimulation$/,\n /:Destroy$/,\n /:unmount$/,\n];\n\nfunction hasNestedKnownRenderSideEffect(call: SyntaxNode, context: RuleContext): boolean {\n for (const node of context.walk(call)) {\n if (node.startIndex === call.startIndex && node.endIndex === call.endIndex) continue;\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"task.spawn\" || path === \"task.defer\" || path === \"task.delay\") return true;\n if (knownYieldReason(path, node, context) || RENDER_EFFECT_PATTERNS.some(pattern => pattern.test(path))) return true;\n }\n return false;\n}\n\nexport const noYieldInRender: RuleDefinition = {\n id: \"react-luau/no-yield-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"React render functions must not yield.\",\n run(context) {\n const diagnostics = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const reason = knownYieldReason(path, call, context);\n if (!reason) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} can yield during component render.`,\n help: `Move yielding work outside render, usually into an effect or an external data-loading boundary. The bundled Roblox yield metadata recognizes ${reason} as a yielding API.`,\n });\n }\n return diagnostics;\n },\n};\n\nexport const noTaskSpawnInRender: RuleDefinition = {\n id: \"react-luau/no-task-spawn-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Do not schedule asynchronous work during render.\",\n run(context) {\n const diagnostics = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.getCallPath(call);\n if (path !== \"task.spawn\" && path !== \"task.defer\" && path !== \"task.delay\") continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} schedules work during component render.`,\n help: \"Move the scheduled work into an effect or the event that actually owns the side effect.\",\n });\n }\n return diagnostics;\n },\n};\n\nexport const noSideEffectsInRender: RuleDefinition = {\n id: \"react-luau/no-side-effects-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Do not create Instances, start tweens, subscribe, or perform other externally observable side effects during component render.\",\n run(context) {\n const diagnostics = [];\n const effectImports = sourceEffectImports(context);\n const effectInstances = sourceEffectInstances(context, effectImports);\n\n\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const knownPattern = RENDER_EFFECT_PATTERNS.some((pattern) => pattern.test(path));\n let inferredFromSource = sourceInferredEffectCall(call, context, effectImports, effectInstances);\n // Report the inner operation rather than duplicating it on an inferred wrapper.\n if (inferredFromSource && hasNestedKnownRenderSideEffect(call, context)) inferredFromSource = false;\n if (!knownPattern && !inferredFromSource) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: inferredFromSource && !knownPattern\n ? `${path} runs during render, and code it calls eventually changes state outside the current render.`\n : `${path} performs a side effect directly during component render.`,\n help: inferredFromSource && !knownPattern\n ? \"Move this call into an effect, event handler, or another committed lifecycle boundary so an abandoned render cannot still change application state.\"\n : \"Move imperative work into an effect or event handler with explicit ownership and cleanup. Use React.createElement for React-owned Instances; destroy imperative Instances, cancel tweens, and disconnect subscriptions when their owner is cleaned up.\",\n fixPreview: inferredFromSource && !knownPattern\n ? {\n kind: \"pattern\" as const,\n before: call.text,\n after: `React.useEffect(function()\n\t${call.text}\nend, { -- dependencies })`,\n note: \"The exact owner depends on intent: use an effect for committed lifecycle work, or move the call into the event that actually triggers the mutation.\",\n }\n : undefined,\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
40
|
-
"import {\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n} from \"../module-resolution\";\nimport type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type {\n ConditionalHookModeSummary,\n DiagnosticInput,\n FixPreview,\n FunctionInfo,\n RuleContext,\n RuleDefinition,\n} from \"../types\";\nimport { nodeKey } from \"../ast/walk\";\nimport {\n callNameNode,\n CONDITIONAL_TYPES,\n declarationNames,\n findAncestorBetween,\n isHookPath,\n isNestedInsideFunction,\n} from \"./helpers\";\n\nfunction staticIterationImports(\n context: RuleContext,\n): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s,\n );\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.staticIterationTables,\n );\n if (summary) result.set(match[1], summary);\n }\n return result;\n}\n\nfunction conditionalHookModeImports(\n context: RuleContext,\n): Map<string, ConditionalHookModeSummary> {\n const result = new Map<string, ConditionalHookModeSummary>();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s,\n );\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.conditionalHookModes,\n );\n if (summary) result.set(match[1], summary);\n }\n return result;\n}\n\nfunction currentConditionalHookMode(\n context: RuleContext,\n): ConditionalHookModeSummary | null {\n for (const key of moduleKeys(context.relativePath)) {\n const summary = context.project.conditionalHookModes.get(key);\n if (summary) return summary;\n }\n return null;\n}\n\nfunction controlledParameterIndex(\n controlFlow: SyntaxNode,\n fn: FunctionInfo,\n summary: ConditionalHookModeSummary,\n): number | null {\n if (controlFlow.type !== \"if_statement\") return null;\n const header = (controlFlow.text.split(/\\bthen\\b/s, 1)[0] ?? \"\").trim();\n\n for (const [conditionName, index] of Object.entries(\n summary.conditionVariables,\n )) {\n const escaped = conditionName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = [\n new RegExp(`^if\\\\s+${escaped}\\\\s*$`),\n new RegExp(`^if\\\\s+not\\\\s+${escaped}\\\\s*$`),\n new RegExp(`^if\\\\s+${escaped}\\\\s*(?:==|~=)\\\\s*(?:true|false|nil)\\\\s*$`),\n new RegExp(`^if\\\\s+(?:true|false|nil)\\\\s*(?:==|~=)\\\\s*${escaped}\\\\s*$`),\n ];\n if (patterns.some((pattern) => pattern.test(header))) return index;\n }\n\n // Keep a direct parameter fallback for older or externally constructed summaries.\n for (const index of summary.parameterIndexes) {\n const name = fn.parameters[index];\n if (!name) continue;\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`^if\\\\s+(?:not\\\\s+)?${escaped}\\\\s*$`).test(header))\n return index;\n }\n return null;\n}\n\nfunction isStableModeArgument(\n node: SyntaxNode | undefined,\n context: RuleContext,\n): boolean {\n if (!node) return true;\n const text = node.text.trim();\n if ([\"true\", \"false\", \"nil\"].includes(text)) return true;\n if (\n [\n \"number\",\n \"string\",\n \"string_content\",\n \"table_constructor\",\n \"function_definition\",\n ].includes(node.type)\n )\n return true;\n if (\n /^[A-Za-z_][A-Za-z0-9_]*$/.test(text) &&\n context.model.stableVariables.has(text)\n )\n return true;\n return false;\n}\n\nfunction dynamicHookModeFixPreview(\n hookName: string,\n argumentText: string,\n): FixPreview {\n return {\n kind: \"pattern\",\n before: `local value = ${hookName}(${argumentText})`,\n after: `local value = ${hookName}(true) -- or false; keep this mode fixed for this call site`,\n note: \"A custom hook may choose different internal hooks only when this mode is stable for the lifetime of the component instance.\",\n };\n}\n\nfunction unwrapIteratorExpression(text: string): string {\n let current = text.trim();\n const wrapper = current.match(/^(?:pairs|ipairs)\\s*\\((.*)\\)$/s);\n if (wrapper) current = wrapper[1].trim();\n return current;\n}\n\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find(\n (child) => child.type === \"assignment_statement\",\n );\n const expressionList = assignment?.namedChildren.find(\n (child) => child.type === \"expression_list\",\n );\n return expressionList?.namedChildren ?? [];\n}\n\nfunction isEmptyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(\n node?.type === \"table_constructor\" &&\n node.namedChildren.every((child) => child.type !== \"field\"),\n );\n}\n\nfunction stableShapeVariablesByFunction(\n context: RuleContext,\n): Map<number, Set<string>> {\n const stable = new Map<number, Set<string>>();\n const functionsByName = new Map<string, FunctionInfo>();\n\n for (const fn of context.model.functions) {\n stable.set(nodeKey(fn.node), new Set<string>());\n if (fn.name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(fn.name))\n functionsByName.set(fn.name, fn);\n }\n\n const namesFor = (fn: FunctionInfo): Set<string> => {\n const key = nodeKey(fn.node);\n const names = stable.get(key) ?? new Set<string>();\n stable.set(key, names);\n return names;\n };\n\n // A table constructed in the function has a fixed literal shape. More importantly for\n // React code, an empty-dependency useMemo explicitly captures one value for the entire\n // component lifetime. If that captured value is later iterated to create hooks, the\n // iteration source itself does not change between renders unless user code mutates it.\n for (const declaration of context.walk(context.root)) {\n if (declaration.type !== \"variable_declaration\") continue;\n const owner = context.nearestFunction(declaration);\n if (!owner) continue;\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (!expression) continue;\n if (expression.type === \"table_constructor\") {\n namesFor(owner).add(names[index]);\n continue;\n }\n if (expression.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(expression);\n if (!rawPath || context.resolveCallPath(rawPath) !== \"React.useMemo\")\n continue;\n const args = context.callArguments(expression);\n if (isEmptyTable(args[1])) namesFor(owner).add(names[index]);\n }\n }\n\n const callsByLocalFunction = new Map<string, SyntaxNode[]>();\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath || !functionsByName.has(rawPath)) continue;\n const calls = callsByLocalFunction.get(rawPath) ?? [];\n calls.push(call);\n callsByLocalFunction.set(rawPath, calls);\n }\n\n const expressionIsStableShape = (\n expression: SyntaxNode | undefined,\n owner: FunctionInfo | null,\n ): boolean => {\n if (!expression) return false;\n if (expression.type === \"table_constructor\") return true;\n const text = expression.text.trim();\n if (!owner || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(text)) return false;\n return namesFor(owner).has(text);\n };\n\n let changed = true;\n while (changed) {\n changed = false;\n\n // Preserve stable-shape aliases such as `local copy = capturedDefaults`.\n for (const declaration of context.walk(context.root)) {\n if (declaration.type !== \"variable_declaration\") continue;\n const owner = context.nearestFunction(declaration);\n if (!owner) continue;\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (!expressionIsStableShape(expression, owner)) continue;\n const target = names[index];\n const ownerNames = namesFor(owner);\n if (!ownerNames.has(target)) {\n ownerNames.add(target);\n changed = true;\n }\n }\n }\n\n // Propagate the guarantee through local helpers only when every known call to that\n // helper supplies a stable-shape argument for the parameter. This is what makes a\n // pattern such as `getStateContainer(capturedDefaults)` safe without exempting all\n // parameter-driven loops.\n for (const [name, fn] of functionsByName) {\n const calls = callsByLocalFunction.get(name) ?? [];\n if (calls.length === 0) continue;\n for (let index = 0; index < fn.parameters.length; index += 1) {\n const allStable = calls.every((call) => {\n const caller = context.nearestFunction(call);\n return expressionIsStableShape(context.callArguments(call)[index], caller);\n });\n if (!allStable) continue;\n const parameter = fn.parameters[index];\n if (!parameter) continue;\n const fnNames = namesFor(fn);\n if (!fnNames.has(parameter)) {\n fnNames.add(parameter);\n changed = true;\n }\n }\n }\n }\n\n return stable;\n}\n\nfunction loopIterationIsProvablyStable(\n loop: SyntaxNode,\n imports: Map<string, Set<string>>,\n owner: FunctionInfo,\n stableShapes: Map<number, Set<string>>,\n): boolean {\n const numeric = loop.namedChildren.find(\n (child) => child.type === \"for_numeric_clause\",\n );\n if (numeric) {\n const text = numeric.text;\n const bounds = text.match(\n /^\\s*[A-Za-z_][A-Za-z0-9_]*\\s*=\\s*([^,]+)\\s*,\\s*([^,]+)(?:\\s*,\\s*([^,]+))?\\s*$/s,\n );\n if (\n bounds &&\n bounds\n .slice(1)\n .filter(Boolean)\n .every((value) => /^-?\\d+(?:\\.\\d+)?$/.test(value!.trim()))\n )\n return true;\n }\n\n const clause = loop.namedChildren.find(\n (child) => child.type === \"for_generic_clause\",\n );\n const match = clause?.text.match(/\\bin\\s+(.+)$/s);\n if (!match) return false;\n const expression = unwrapIteratorExpression(match[1]);\n const path = expression.match(\n /^([A-Za-z_][A-Za-z0-9_]*)(?:\\.([A-Za-z_][A-Za-z0-9_.]*))?$/,\n );\n if (!path) return false;\n if (\n !path[2] &&\n stableShapes.get(nodeKey(owner.node))?.has(path[1])\n )\n return true;\n const fields = imports.get(path[1]);\n if (!fields) return false;\n const propertyPath = path[2] ?? \"\";\n return fields.has(propertyPath);\n}\n\nfunction functionParameterTypes(fn: FunctionInfo): Map<string, string> {\n if (!fn.body) return new Map();\n const headerLength = Math.max(0, fn.body.startIndex - fn.node.startIndex);\n const header = fn.node.text.slice(0, headerLength);\n const result = new Map<string, string>();\n for (const match of header.matchAll(\n /\\b([A-Za-z_][A-Za-z0-9_]*)\\s*:\\s*([^,\\n)]+)/g,\n )) {\n result.set(match[1], match[2].trim());\n }\n return result;\n}\n\nfunction isNonOptionalParameterType(typeText: string | undefined): boolean {\n if (!typeText) return false;\n return !typeText.includes(\"?\") && !/(?:^|[| ])nil(?:$|[| ])/i.test(typeText);\n}\n\nfunction impossibleNilGuardReturn(\n node: SyntaxNode,\n fn: FunctionInfo,\n parameterTypes: Map<string, string>,\n): boolean {\n let current = node.parent;\n while (current && current !== fn.node) {\n if (current.type === \"if_statement\") {\n const header = (current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\").trim();\n const patterns = [\n /\\bif\\s+not\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/,\n /\\bif\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*==\\s*nil\\s*$/,\n /\\bif\\s+nil\\s*==\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/,\n ];\n for (const pattern of patterns) {\n const match = header.match(pattern);\n if (match && isNonOptionalParameterType(parameterTypes.get(match[1])))\n return true;\n }\n return false;\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction hasReachableReturnBefore(\n call: SyntaxNode,\n fn: FunctionInfo,\n context: RuleContext,\n cache: Map<number, SyntaxNode[]>,\n): boolean {\n if (!fn.body) return false;\n const key = nodeKey(fn.node);\n let returns = cache.get(key);\n if (!returns) {\n const parameterTypes = functionParameterTypes(fn);\n returns = [...context.walk(fn.body)].filter(\n (node) =>\n node.type === \"return_statement\" &&\n !isNestedInsideFunction(node, fn.node) &&\n !impossibleNilGuardReturn(node, fn, parameterTypes),\n );\n cache.set(key, returns);\n }\n return returns.some((node) => node.endIndex <= call.startIndex);\n}\n\nfunction conditionalFixPreview(kind: string, hookName: string): FixPreview {\n if (kind === \"for statement\") {\n return {\n kind: \"pattern\",\n before: `for _, item in items do\\n\\tlocal value = ${hookName}(item)\\nend`,\n after: `local function Item(props)\\n\\tlocal value = ${hookName}(props.item)\\n\\treturn renderItem(value)\\nend\\n\\nfor _, item in items do\\n\\tchildren[item.id] = React.createElement(Item, {\\n\\t\\titem = item,\\n\\t})\\nend`,\n note: \"When collection size can change, move the hook into a child component so each component instance owns a fixed hook sequence.\",\n };\n }\n if (kind === \"while statement\" || kind === \"repeat statement\") {\n return {\n kind: \"pattern\",\n before: `while condition do\\n\\tlocal value = ${hookName}()\\nend`,\n after: `local value = ${hookName}()\\n\\nwhile condition do\\n\\t-- use value without creating another hook call\\nend`,\n note: \"Hook count must not depend on how many times a runtime loop executes.\",\n };\n }\n return {\n kind: \"pattern\",\n before: `if enabled then\\n\\tlocal value = ${hookName}()\\nend`,\n after: `local value = ${hookName}()\\n\\nif enabled then\\n\\t-- use value here\\nend`,\n note: \"Keep the hook call unconditional, then branch on its result.\",\n };\n}\n\nfunction earlyReturnFixPreview(hookName: string): FixPreview {\n return {\n kind: \"pattern\",\n before: `if not ready then\\n\\treturn nil\\nend\\n\\nlocal value = ${hookName}()`,\n after: `local value = ${hookName}()\\n\\nif not ready then\\n\\treturn nil\\nend`,\n note: \"Call hooks before any reachable early return so every render executes the same hook sequence.\",\n };\n}\n\nexport const rulesOfHooks: RuleDefinition = {\n id: \"react-luau/rules-of-hooks\",\n category: \"Hooks\",\n severity: \"error\",\n description:\n \"Hooks must run in the same order on every render of a React component or custom hook.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n const staticImports = staticIterationImports(context);\n const stableShapes = stableShapeVariablesByFunction(context);\n const modeImports = conditionalHookModeImports(context);\n const currentModeSummary = currentConditionalHookMode(context);\n const reachableReturns = new Map<number, SyntaxNode[]>();\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (!isHookPath(path)) continue;\n\n const fn = context.nearestFunction(call);\n if (!fn || (!fn.isComponent && !fn.isHook)) {\n diagnostics.push({\n node: callNameNode(call),\n message: `Hook ${path} is called outside a React component or custom hook.`,\n help: \"Move the hook into a component or a custom hook whose name starts with use.\",\n fixPreview: {\n kind: \"pattern\",\n before: `local value = ${path}()\\n\\nlocal function helper()\\n\\treturn value\\nend`,\n after: `local function useHelper()\\n\\tlocal value = ${path}()\\n\\treturn value\\nend`,\n note: \"Hooks need a React-owned component or custom-hook call stack.\",\n },\n });\n continue;\n }\n\n const importedMode = modeImports.get(rawPath);\n if (importedMode) {\n const args = context.callArguments(call);\n const dynamicIndexes = importedMode.parameterIndexes.filter(\n (index) => !isStableModeArgument(args[index], context),\n );\n if (dynamicIndexes.length > 0) {\n const firstIndex = dynamicIndexes[0];\n const argument = args[firstIndex];\n const parameterOffset =\n importedMode.parameterIndexes.indexOf(firstIndex);\n const parameterName =\n importedMode.parameterNames[parameterOffset] ??\n `argument ${firstIndex + 1}`;\n const argumentText = argument?.text.trim() || \"<omitted>\";\n diagnostics.push({\n node: argument ?? callNameNode(call),\n highlights: dynamicIndexes\n .map((index) => args[index])\n .filter((node): node is SyntaxNode => Boolean(node)),\n message: `Hook ${rawPath} receives render-varying hook mode ${parameterName} from ${argumentText}; if it changes between renders, the custom hook can execute a different hook sequence.`,\n help: `Pass a stable mode at this call site, or refactor ${rawPath} so it always calls the same hooks regardless of ${parameterName}.`,\n fixPreview: dynamicHookModeFixPreview(rawPath, argumentText),\n });\n }\n }\n\n const controlFlow = findAncestorBetween(call, fn.node, (node) =>\n CONDITIONAL_TYPES.has(node.type),\n );\n if (controlFlow) {\n if (\n currentModeSummary &&\n currentModeSummary.knownCallSites > 0 &&\n controlledParameterIndex(controlFlow, fn, currentModeSummary) !== null\n )\n continue;\n if (\n controlFlow.type === \"for_statement\" &&\n loopIterationIsProvablyStable(\n controlFlow,\n staticImports,\n fn,\n stableShapes,\n )\n )\n continue;\n const kind = controlFlow.type.replaceAll(\"_\", \" \");\n const loopLike =\n controlFlow.type === \"for_statement\" ||\n controlFlow.type === \"while_statement\" ||\n controlFlow.type === \"repeat_statement\";\n diagnostics.push({\n node: callNameNode(call),\n message: loopLike\n ? `Hook ${path} is called inside ${kind} whose size or iteration order may change between renders. If that happens, React will see a different hook sequence.`\n : `Hook ${path} is called inside ${kind}, so the hook may be skipped on some renders.`,\n help: loopLike\n ? \"Keep hook count independent of runtime collection size or loop iterations. A common fix is to render a child component per item and call the hook inside that child.\"\n : \"Call the hook unconditionally at the top level, then branch on the returned value.\",\n fixPreview: conditionalFixPreview(kind, path),\n });\n continue;\n }\n\n if (hasReachableReturnBefore(call, fn, context, reachableReturns)) {\n diagnostics.push({\n node: callNameNode(call),\n message: `Hook ${path} may run after an earlier reachable return, so some renders can execute fewer hooks.`,\n help: \"Move the hook before reachable early returns so hook order cannot change between renders.\",\n fixPreview: earlyReturnFixPreview(path),\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
41
|
-
"import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { assignmentTargetNode, callNameNode, containsUnshadowedIdentifier, identifierNode, isBindingShadowedBetween, stateBindingsFor } from \"./helpers\";\nimport { mightMutateParameters, mutatedParameterIndexesForCall, mutationOriginForExpression } from \"./parameter-mutations\";\n\nconst TRIVIAL_INITIALIZER_PATHS = new Set([\n \"tostring\",\n \"tonumber\",\n \"type\",\n \"typeof\",\n \"math.abs\",\n \"math.ceil\",\n \"math.floor\",\n \"math.max\",\n \"math.min\",\n \"math.round\",\n \"string.lower\",\n \"string.upper\",\n \"string.format\",\n \"table.pack\",\n \"Vector2.new\",\n \"Vector3.new\",\n \"Vector2int16.new\",\n \"Vector3int16.new\",\n \"UDim.new\",\n \"UDim2.new\",\n \"UDim2.fromOffset\",\n \"UDim2.fromScale\",\n \"CFrame.new\",\n \"Color3.new\",\n \"Color3.fromRGB\",\n \"Color3.fromHSV\",\n \"Rect.new\",\n \"NumberRange.new\",\n \"TweenInfo.new\",\n]);\n\nfunction isTrivialInitializerPath(path: string): boolean {\n return TRIVIAL_INITIALIZER_PATHS.has(path) || /(?:^|[.:])getValue$/i.test(path);\n}\n\nfunction isNestedFunctionFromOwner(context: RuleContext, node: SyntaxNode, owner: FunctionInfo): boolean {\n const nearest = context.nearestFunction(node);\n return Boolean(nearest && nearest !== owner);\n}\n\nfunction callsSetter(context: RuleContext, owner: FunctionInfo, setterName: string): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type === \"function_call\" && context.getCallPath(call) === setterName) return true;\n }\n return false;\n}\n\nfunction isIdentifierRead(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"identifier\" || node.text !== name) return false;\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), node)) return false;\n if (parent?.type === \"method_index_expression\" && sameNode(parent.namedChildren.at(-1), node)) return false;\n return true;\n}\n\nfunction renderReachableNestedFunctions(context: RuleContext, owner: FunctionInfo): Set<FunctionInfo> {\n const reachable = new Set<FunctionInfo>();\n if (!owner.body) return reachable;\n\n const byName = new Map<string, FunctionInfo>();\n for (const fn of context.model.functions) {\n if (!fn.name || fn === owner) continue;\n let current = fn.node.parent;\n while (current) {\n const parentInfo = context.model.functionByNode.get(current.id);\n if (parentInfo) {\n if (parentInfo === owner) byName.set(fn.name, fn);\n break;\n }\n current = current.parent;\n }\n }\n\n const pending: FunctionInfo[] = [];\n const addByName = (name: string | undefined) => {\n if (!name) return;\n const fn = byName.get(name);\n if (!fn || reachable.has(fn)) return;\n reachable.add(fn);\n pending.push(fn);\n };\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\" || context.nearestFunction(call) !== owner) continue;\n const path = context.getCallPath(call) ?? \"\";\n const resolved = context.resolveCallPath(path);\n if (resolved === \"React.createElement\") addByName(context.callArguments(call)[0]?.text.trim());\n else addByName(path);\n }\n\n while (pending.length > 0) {\n const fn = pending.pop()!;\n if (!fn.body) continue;\n for (const call of context.walk(fn.body)) {\n if (call.type !== \"function_call\" || context.nearestFunction(call) !== fn) continue;\n const path = context.getCallPath(call) ?? \"\";\n const resolved = context.resolveCallPath(path);\n if (resolved === \"React.createElement\") addByName(context.callArguments(call)[0]?.text.trim());\n else addByName(path);\n }\n }\n\n return reachable;\n}\n\nfunction directlyReadsValue(context: RuleContext, owner: FunctionInfo, binding: StateBinding): boolean {\n if (!owner.body) return false;\n\n for (const node of context.walk(owner.body)) {\n if (!isIdentifierRead(node, binding.valueName)) continue;\n if (node.startIndex >= binding.declaration.startIndex && node.endIndex <= binding.declaration.endIndex) continue;\n if (isNestedFunctionFromOwner(context, node, owner)) continue;\n if (isBindingShadowedBetween(node, owner, binding.valueName, binding.declaration)) continue;\n return true;\n }\n\n for (const fn of renderReachableNestedFunctions(context, owner)) {\n if (!fn.body) continue;\n for (const node of context.walk(fn.body)) {\n if (isIdentifierRead(node, binding.valueName) && !isBindingShadowedBetween(node, owner, binding.valueName, binding.declaration)) return true;\n }\n }\n\n return false;\n}\n\nfunction isPlainTableState(binding: StateBinding, context: RuleContext): boolean {\n const initializer = binding.initializer;\n if (!initializer) return true;\n if (initializer.type === \"table_constructor\") return true;\n if (initializer.type !== \"function_call\") return false;\n const path = context.getCallPath(initializer) ?? \"\";\n return path === \"table.clone\" || path === \"table.create\" || path === \"table.pack\";\n}\n\ntype CallbackLifetime = \"long-lived\" | \"custom-hook\" | \"render-handler\" | \"unknown\";\n\nfunction callbackLifetime(context: RuleContext, call: SyntaxNode, owner: FunctionInfo): CallbackLifetime {\n const callback = context.nearestFunction(call);\n if (!callback || callback === owner) return \"unknown\";\n\n let current: SyntaxNode | null = callback.node;\n while (current && current.startIndex >= owner.node.startIndex && current.endIndex <= owner.node.endIndex) {\n if (current.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(current) ?? \"\");\n if (\n path === \"React.useEffect\"\n || path === \"React.useLayoutEffect\"\n || path === \"task.spawn\"\n || path === \"task.defer\"\n || path === \"task.delay\"\n || /:Connect$/.test(path)\n || /BindToRenderStep$/.test(path)\n || /:BindAction(?:AtPriority)?$/.test(path)\n || /:BindActivate$/.test(path)\n ) {\n return \"long-lived\";\n }\n if (path === \"React.createElement\") return \"render-handler\";\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n if (/^use[A-Z0-9_]/.test(final)) return \"custom-hook\";\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") {\n if (current.startIndex !== callback.node.startIndex || current.endIndex !== callback.node.endIndex) break;\n }\n current = current.parent;\n }\n\n return \"unknown\";\n}\n\nexport const rerenderFunctionalSetstate: RuleDefinition = {\n id: \"react-luau/rerender-functional-setstate\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Use the functional state setter form when deferred callbacks update from the previous state value.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner?.body) continue;\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\" || context.getCallPath(call) !== binding.setterName) continue;\n if (!isNestedFunctionFromOwner(context, call, owner)) continue;\n const argument = context.callArguments(call)[0];\n if (!argument || argument.type === \"function_definition\") continue;\n if (!containsUnshadowedIdentifier(argument, binding.valueName, context, owner)) continue;\n const lifetime = callbackLifetime(context, call, owner);\n if (lifetime === \"render-handler\" || lifetime === \"unknown\") continue;\n\n diagnostics.push({\n node: callNameNode(call),\n severity: lifetime === \"custom-hook\" ? \"suggestion\" : \"warning\",\n message: `${binding.setterName}() reads ${binding.valueName} from a captured callback value.`,\n help: lifetime === \"custom-hook\"\n ? `Use ${binding.setterName}(function(previous) return ... end) if the custom hook can retain this callback across renders.`\n : `Use ${binding.setterName}(function(previous) return ... end) when the next value depends on previous state.`,\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderLazyStateInit: RuleDefinition = {\n id: \"react-luau/rerender-lazy-state-init\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Expensive useState initializers should use React's lazy initializer form.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.useState\") continue;\n const initializer = context.callArguments(call)[0];\n if (!initializer || initializer.type === \"function_definition\") continue;\n\n const eagerCall = [...context.walk(initializer)].find((node) => node.type === \"function_call\");\n if (!eagerCall) continue;\n const eagerPath = context.resolveCallPath(context.getCallPath(eagerCall) ?? \"\");\n if (isTrivialInitializerPath(eagerPath) || /^React\\.use[A-Z0-9_]/.test(eagerPath)) continue;\n\n diagnostics.push({\n node: callNameNode(eagerCall),\n message: `${eagerPath || \"This initializer call\"} is evaluated every render before useState can reuse the existing state.`,\n help: \"Wrap expensive initial state creation in function() ... end so it only runs when the state is first initialized.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderLazyRefInit: RuleDefinition = {\n id: \"react-luau/rerender-lazy-ref-init\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Avoid eagerly rebuilding expensive values passed to useRef on every render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.useRef\") continue;\n const initializer = context.callArguments(call)[0];\n if (!initializer || initializer.type !== \"function_call\") continue;\n const eagerPath = context.resolveCallPath(context.getCallPath(initializer) ?? \"\");\n if (isTrivialInitializerPath(eagerPath) || /^React\\.use[A-Z0-9_]/.test(eagerPath)) continue;\n\n diagnostics.push({\n node: callNameNode(initializer),\n message: `${eagerPath || \"This initializer call\"} is rebuilt before useRef returns the existing ref on every render.`,\n help: \"Initialize the ref from a predictable nil-guarded render pattern when construction is pure, or create owned resources in an effect with cleanup. Do not put side-effectful resource creation into useRef just to silence this warning.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderStateOnlyInHandlers: RuleDefinition = {\n id: \"react-luau/rerender-state-only-in-handlers\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"State that is only read from callbacks may be mutable data rather than rendered state.\",\n run(context) {\n const diagnostics = [];\n\n for (const owner of context.model.functions) {\n if (!owner.isComponent) continue;\n for (const binding of stateBindingsFor(context, owner)) {\n if (binding.valueName === \"_\" || binding.valueName.startsWith(\"_\")) continue;\n if (/^(set)?(?:TriggerRender|ForceUpdate|Rerender|ForceRender|Tick|Bump|BumpVersion|InvalidateRender|Refresh|Repaint)$/i.test(binding.setterName)) continue;\n if (!callsSetter(context, owner, binding.setterName)) continue;\n if (directlyReadsValue(context, owner, binding)) continue;\n\n diagnostics.push({\n node: identifierNode(binding.declaration, binding.valueName) ?? binding.declaration,\n message: `${binding.valueName} is updated as React state but is never read by the component's render path or hook arguments.`,\n help: \"When a value is only read by event or signal callbacks, consider useRef so updates do not rerender the component. Keep useState when the update intentionally invalidates rendering or feeds a hook dependency.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noDirectStateMutation: RuleDefinition = {\n id: \"react-luau/no-direct-state-mutation\",\n category: \"Correctness\",\n severity: \"warning\",\n description: \"Do not mutate table state in place.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner?.body || !isPlainTableState(binding, context)) continue;\n const escaped = binding.valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n for (const node of context.walk(owner.body)) {\n if (node.startIndex >= binding.declaration.startIndex && node.endIndex <= binding.declaration.endIndex) continue;\n let mutates = false;\n\n if (node.type === \"assignment_statement\" || node.type === \"update_statement\") {\n mutates = new RegExp(`^\\\\s*${escaped}\\\\s*(?:\\\\.|\\\\[)`).test(node.text);\n } else if (node.type === \"function_call\" && mightMutateParameters(context, node)) {\n const arguments_ = context.callArguments(node);\n for (const index of mutatedParameterIndexesForCall(context, node, owner)) {\n const argument = arguments_[index];\n if (!argument) continue;\n const origin = mutationOriginForExpression(context, argument, owner);\n if (origin.kind === \"state\" && origin.binding === binding) {\n mutates = true;\n break;\n }\n }\n }\n\n if (!mutates || isBindingShadowedBetween(node, owner, binding.valueName, binding.declaration)) continue;\n const key = `${node.startIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: node.type === \"function_call\" ? callNameNode(node) : assignmentTargetNode(node),\n message: `${binding.valueName} is React state backed by a table and is mutated in place.`,\n help: `Create a new table and pass the new identity to ${binding.setterName}. In-place mutation can leave React with the same state identity and makes update ordering harder to reason about.`,\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
38
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { normalizeExpressionText, sameNode } from \"../ast/walk\";\nimport { assignmentLeft, assignmentTargetNode, declarationNames, isBindingShadowedBetween } from \"./helpers\";\n\nfunction refRootFromTarget(target: string, refs: Set<string>): string | null {\n const match = target.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\.\\s*current\\b/);\n if (!match || !refs.has(match[1])) return null;\n return match[1];\n}\n\nfunction isNilGuardedLazyInit(node: SyntaxNode, refName: string): boolean {\n let current = node.parent;\n while (current) {\n if (current.type === \"if_statement\") {\n const condition = current.childForFieldName(\"condition\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n const escaped = refName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`^(?:${escaped}\\.current==nil|nil==${escaped}\\.current)$`).test(condition)) return true;\n return false;\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return false;\n}\n\nfunction assignmentRight(text: string): string | null {\n const match = text.match(/^(?:.*?)(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|=)\\s*(.+)$/s);\n return match?.[1]?.trim() ?? null;\n}\n\nfunction refDeclaration(owner: FunctionInfo, refName: string, context: RuleContext): SyntaxNode | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const index = names.indexOf(refName);\n if (index === -1) continue;\n const assignment = statement.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\")?.namedChildren ?? [];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || expression.type !== \"function_call\") continue;\n if (context.resolveCallPath(context.getCallPath(expression) ?? \"\") === \"React.useRef\") return statement;\n }\n return null;\n}\n\nfunction refInitializer(owner: FunctionInfo, refName: string, context: RuleContext): string | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const index = names.indexOf(refName);\n if (index === -1) continue;\n const assignment = statement.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\")?.namedChildren ?? [];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || expression.type !== \"function_call\") return null;\n const path = context.resolveCallPath(context.getCallPath(expression) ?? \"\");\n if (path !== \"React.useRef\") return null;\n return context.callArguments(expression)[0]?.text.trim() ?? \"nil\";\n }\n return null;\n}\n\nfunction isTopLevelOwnerStatement(node: SyntaxNode, owner: FunctionInfo): boolean {\n let current = node.parent;\n while (current && !sameNode(current, owner.node)) {\n if (current.type === \"if_statement\" || current.type === \"for_statement\" || current.type === \"while_statement\" || current.type === \"repeat_statement\") {\n return false;\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return Boolean(current);\n}\n\n\nfunction exactRefCurrentTarget(node: SyntaxNode, refName: string): boolean {\n return normalizeExpressionText(assignmentLeft(node.text)) === `${refName}.current`;\n}\n\nfunction hasDirectRenderRead(owner: FunctionInfo, refName: string, context: RuleContext): boolean {\n if (!owner.body) return false;\n const target = `${refName}.current`;\n\n for (const candidate of context.walk(owner.body)) {\n if (candidate.type !== \"dot_index_expression\" || normalizeExpressionText(candidate.text) !== target) continue;\n if (!context.isDirectlyExecutedInFunction(candidate, owner)) continue;\n\n let current: SyntaxNode | null = candidate.parent;\n let isWrite = false;\n while (current && !sameNode(current, owner.node)) {\n if (current.type === \"assignment_statement\" || current.type === \"update_statement\") {\n isWrite = exactRefCurrentTarget(current, refName);\n break;\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") break;\n current = current.parent;\n }\n if (!isWrite) return true;\n }\n\n return false;\n}\n\nfunction isLatestValueMirror(node: SyntaxNode, owner: FunctionInfo, refName: string, context: RuleContext): boolean {\n if (node.type !== \"assignment_statement\" || !exactRefCurrentTarget(node, refName)) return false;\n const right = assignmentRight(node.text);\n if (!right) return false;\n\n const initializer = refInitializer(owner, refName, context);\n if (initializer !== null && normalizeExpressionText(right) === normalizeExpressionText(initializer)) return true;\n\n // A direct top-level `ref.current = renderValue` is the common use-latest\n // mirror pattern even when the ref used a neutral initial value such as false.\n // Nested writes remain warnings because they are usually imperative render work.\n if (isTopLevelOwnerStatement(node, owner)) {\n return /^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(normalizeExpressionText(right));\n }\n\n // A render-computed ref that is only written during render and read later by\n // effects/events is another use-latest mirror shape. The conditional/looped\n // write can still observe a pre-commit render, so keep it visible as a\n // suggestion rather than treating it as fully safe.\n return !hasDirectRenderRead(owner, refName, context);\n}\n\nexport const noRefCurrentInRender: RuleDefinition = {\n id: \"react-luau/no-ref-current-in-render\",\n category: \"Correctness\",\n severity: \"warning\",\n description: \"Avoid mutating ref.current during render except for predictable initialization or deliberate latest-value mirrors.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n\n for (const node of context.walk()) {\n if (node.type !== \"assignment_statement\" && node.type !== \"update_statement\") continue;\n const owner = context.nearestFunction(node);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n if (!context.isDirectlyExecutedInFunction(node, owner)) continue;\n const refs = context.model.refVariablesByFunction.get(owner.node.id) ?? new Set<string>();\n const target = assignmentLeft(node.text);\n const refName = refRootFromTarget(target, refs);\n if (!refName || isNilGuardedLazyInit(node, refName)) continue;\n const declaration = refDeclaration(owner, refName, context);\n if (isBindingShadowedBetween(node, owner, refName, declaration)) continue;\n\n const latestValueMirror = isLatestValueMirror(node, owner, refName, context);\n diagnostics.push({\n node: assignmentTargetNode(node),\n severity: latestValueMirror ? \"suggestion\" : \"warning\",\n message: latestValueMirror\n ? `${refName}.current mirrors its latest render value during render.`\n : `${refName}.current is mutated during ${owner.isHook ? \"hook\" : \"component\"} render.`,\n help: latestValueMirror\n ? \"A latest-value ref can expose an uncommitted render value to imperative callbacks. Update it after commit when that distinction matters.\"\n : \"Move ref writes into the event, effect, or ref callback that owns the mutation. A nil-guarded one-time lazy initialization pattern remains allowed for pure construction.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
39
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { RuleContext, RuleDefinition, SourceEffectModuleSummary } from \"../types\";\nimport { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport { knownYieldReason } from \"../roblox-semantics\";\nimport { callNameNode } from \"./helpers\";\n\ninterface SourceBinding<T> {\n declaration: SyntaxNode;\n value: T | null;\n}\n\ntype SourceBindings<T> = Map<string, SourceBinding<T>[]>;\n\ninterface EffectInstance {\n summary: SourceEffectModuleSummary;\n persistent: boolean;\n}\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variables = assignment?.namedChildren.find((child) => child.type === \"variable_list\")\n ?? node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction assignmentParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"assignment_statement\" || node.parent?.type === \"variable_declaration\") return { names: [], expressions: [] };\n const variables = node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = node.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction bindingParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n return node.type === \"variable_declaration\" ? declarationParts(node) : assignmentParts(node);\n}\n\nfunction addSourceBinding<T>(bindings: SourceBindings<T>, name: string, declaration: SyntaxNode, value: T | null): void {\n const existing = bindings.get(name) ?? [];\n existing.push({ declaration, value });\n bindings.set(name, existing);\n}\n\nfunction nearestScopeContainer(node: SyntaxNode, context: RuleContext): SyntaxNode {\n const owner = context.nearestFunction(node);\n let current = node.parent;\n while (current) {\n if (current.type === \"block\") return current;\n if (owner && current.id === owner.node.id) return owner.body ?? owner.node;\n current = current.parent;\n }\n return context.root;\n}\n\nfunction declarationVisibleAt(declaration: SyntaxNode, node: SyntaxNode, context: RuleContext): boolean {\n if (declaration.startIndex >= node.startIndex) return false;\n const container = nearestScopeContainer(declaration, context);\n return node.startIndex >= container.startIndex && node.endIndex <= container.endIndex;\n}\n\nfunction functionParameterNames(node: SyntaxNode): Set<string> {\n const result = new Set<string>();\n const parameters = node.childForFieldName(\"parameters\")\n ?? node.namedChildren.find((child) => child.type === \"parameters\");\n for (const parameter of parameters?.namedChildren ?? []) {\n if (parameter.type === \"identifier\") result.add(parameter.text);\n for (const child of parameter.namedChildren) {\n if (child.type === \"identifier\") result.add(child.text);\n }\n }\n return result;\n}\n\nfunction loopBindsName(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"for_statement\") return false;\n const header = node.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`^\\\\s*for\\\\s+(?:${escaped}\\\\s*=|[^\\\\n]*\\\\b${escaped}\\\\b[^\\\\n]*\\\\bin\\\\b)`, \"s\").test(header);\n}\n\nfunction bindingShadowedAfterDeclaration(declaration: SyntaxNode, node: SyntaxNode, name: string): boolean {\n let current = node.parent;\n while (current) {\n // Once we reach a scope that already contains the source binding, binders\n // outside that scope cannot shadow the binding at this use site.\n if (declaration.startIndex >= current.startIndex && declaration.endIndex <= current.endIndex) return false;\n if (\n (current.type === \"function_definition\" || current.type === \"function_declaration\")\n && functionParameterNames(current).has(name)\n ) return true;\n if (loopBindsName(current, name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction resolveSourceBinding<T>(\n bindings: SourceBindings<T>,\n name: string,\n node: SyntaxNode,\n context: RuleContext,\n): T | null {\n const candidates = bindings.get(name);\n if (!candidates) return null;\n\n for (let index = candidates.length - 1; index >= 0; index -= 1) {\n const candidate = candidates[index];\n if (!declarationVisibleAt(candidate.declaration, node, context)) continue;\n if (bindingShadowedAfterDeclaration(candidate.declaration, node, name)) return null;\n return candidate.value;\n }\n return null;\n}\n\nfunction sourceEffectImports(context: RuleContext): SourceBindings<SourceEffectModuleSummary> {\n const result: SourceBindings<SourceEffectModuleSummary> = new Map();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\" && node.type !== \"assignment_statement\") continue;\n if (node.type === \"assignment_statement\" && node.parent?.type === \"variable_declaration\") continue;\n const { names, expressions } = bindingParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n const requireMatch = expression?.type === \"function_call\"\n ? expression.text.match(/^\\s*require\\s*\\((.*?)\\)\\s*$/s)\n : null;\n const summary = requireMatch\n ? resolveModuleReference(normalizeRequireTarget(requireMatch[1]), context.project.sourceEffects)\n : null;\n addSourceBinding(result, names[index], node, summary);\n }\n }\n return result;\n}\n\nfunction factorySummaryFromCall(\n call: SyntaxNode,\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n): SourceEffectModuleSummary | null {\n const path = context.getCallPath(call)?.replace(/\\s+/g, \"\") ?? \"\";\n const match = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) return null;\n const summary = resolveSourceBinding(imports, match[1], call, context);\n if (!summary?.instanceFactories.has(match[2])) return null;\n return summary;\n}\n\nfunction returnedFactorySummary(\n callback: SyntaxNode,\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n): SourceEffectModuleSummary | null {\n for (const node of context.walk(callback)) {\n if (node !== callback && (node.type === \"function_definition\" || node.type === \"function_declaration\")) continue;\n if (node.type !== \"return_statement\") continue;\n const expressions = node.namedChildren.find((child) => child.type === \"expression_list\");\n const value = expressions?.namedChildren[0];\n if (value?.type === \"function_call\") return factorySummaryFromCall(value, context, imports);\n }\n return null;\n}\n\nfunction sourceEffectInstances(\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n): SourceBindings<EffectInstance> {\n const result: SourceBindings<EffectInstance> = new Map();\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\" && node.type !== \"assignment_statement\") continue;\n if (node.type === \"assignment_statement\" && node.parent?.type === \"variable_declaration\") continue;\n const { names, expressions } = bindingParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n let instance: EffectInstance | null = null;\n if (expression?.type === \"function_call\") {\n const directFactory = factorySummaryFromCall(expression, context, imports);\n if (directFactory) {\n // An instance created at module scope persists across renders. A fresh\n // factory result created inside render is local to that render and\n // receiver-only mutation is not externally observable by itself.\n instance = {\n summary: directFactory,\n persistent: context.nearestFunction(node) === null,\n };\n } else if (context.resolveCallPath(context.getCallPath(expression) ?? \"\") === \"React.useMemo\") {\n const callback = context.callArguments(expression)[0];\n if (callback?.type === \"function_definition\") {\n const memoizedFactory = returnedFactorySummary(callback, context, imports);\n if (memoizedFactory) instance = { summary: memoizedFactory, persistent: true };\n }\n }\n } else if (expression?.type === \"identifier\") {\n instance = resolveSourceBinding(result, expression.text, expression, context);\n }\n addSourceBinding(result, names[index], node, instance);\n }\n }\n\n return result;\n}\n\nfunction sourceInferredEffectCall(\n call: SyntaxNode,\n context: RuleContext,\n imports: SourceBindings<SourceEffectModuleSummary>,\n instances: SourceBindings<EffectInstance>,\n): boolean {\n const path = context.getCallPath(call)?.replace(/\\s+/g, \"\") ?? \"\";\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(path)) {\n const direct = resolveSourceBinding(imports, path, call, context);\n if (direct?.effectfulExport) return true;\n }\n\n const member = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!member) return false;\n\n const instance = resolveSourceBinding(instances, member[1], call, context);\n if (instance) {\n if (instance.summary.effectfulMembers.has(member[2])) return true;\n return instance.persistent && instance.summary.mutatingMembers.has(member[2]);\n }\n\n const imported = resolveSourceBinding(imports, member[1], call, context);\n if (!imported) return false;\n // The imported module table is itself persistent project state, so a method\n // that mutates its receiver is observable even if it has no other effects.\n return imported.effectfulMembers.has(member[2]) || imported.mutatingMembers.has(member[2]);\n}\n\nconst RENDER_EFFECT_PATTERNS = [\n /^Instance\\.new$/,\n /tween[^:]*:(?:Create|Play)$/i,\n /:Connect$/,\n /:BindAction$/,\n /:BindActionAtPriority$/,\n /:BindActivate$/,\n /BindToRenderStep$/,\n /BindToSimulation$/,\n /:Destroy$/,\n /:unmount$/,\n];\n\nfunction hasNestedKnownRenderSideEffect(call: SyntaxNode, context: RuleContext): boolean {\n for (const node of context.walk(call)) {\n if (node.startIndex === call.startIndex && node.endIndex === call.endIndex) continue;\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"task.spawn\" || path === \"task.defer\" || path === \"task.delay\") return true;\n if (knownYieldReason(path, node, context) || RENDER_EFFECT_PATTERNS.some(pattern => pattern.test(path))) return true;\n }\n return false;\n}\n\nexport const noYieldInRender: RuleDefinition = {\n id: \"react-luau/no-yield-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"React render functions must not yield.\",\n run(context) {\n const diagnostics = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const reason = knownYieldReason(path, call, context);\n if (!reason) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} can yield during component render.`,\n help: `Move yielding work outside render, usually into an effect or an external data-loading boundary. The bundled Roblox yield metadata recognizes ${reason} as a yielding API.`,\n });\n }\n return diagnostics;\n },\n};\n\nexport const noTaskSpawnInRender: RuleDefinition = {\n id: \"react-luau/no-task-spawn-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Do not schedule asynchronous work during render.\",\n run(context) {\n const diagnostics = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.getCallPath(call);\n if (path !== \"task.spawn\" && path !== \"task.defer\" && path !== \"task.delay\") continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} schedules work during component render.`,\n help: \"Move the scheduled work into an effect or the event that actually owns the side effect.\",\n });\n }\n return diagnostics;\n },\n};\n\nexport const noSideEffectsInRender: RuleDefinition = {\n id: \"react-luau/no-side-effects-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Do not create Instances, start tweens, subscribe, or perform other externally observable side effects during component render.\",\n run(context) {\n const diagnostics = [];\n const effectImports = sourceEffectImports(context);\n const effectInstances = sourceEffectInstances(context, effectImports);\n\n\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const knownPattern = RENDER_EFFECT_PATTERNS.some((pattern) => pattern.test(path));\n let inferredFromSource = sourceInferredEffectCall(call, context, effectImports, effectInstances);\n // Report the inner operation rather than duplicating it on an inferred wrapper.\n if (inferredFromSource && hasNestedKnownRenderSideEffect(call, context)) inferredFromSource = false;\n if (!knownPattern && !inferredFromSource) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: inferredFromSource && !knownPattern\n ? `${path} runs during render, and code it calls eventually changes state outside the current render.`\n : `${path} performs a side effect directly during component render.`,\n help: inferredFromSource && !knownPattern\n ? \"Move this call into an effect, event handler, or another committed lifecycle boundary so an abandoned render cannot still change application state.\"\n : \"Move imperative work into an effect or event handler with explicit ownership and cleanup. Use React.createElement for React-owned Instances; destroy imperative Instances, cancel tweens, and disconnect subscriptions when their owner is cleaned up.\",\n fixPreview: inferredFromSource && !knownPattern\n ? {\n kind: \"pattern\" as const,\n before: call.text,\n after: `React.useEffect(function()\n\t${call.text}\nend, { -- dependencies })`,\n note: \"The exact owner depends on intent: use an effect for committed lifecycle work, or move the call into the event that actually triggers the mutation.\",\n }\n : undefined,\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
40
|
+
"import {\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n} from \"../module-resolution\";\nimport type { SyntaxNode } from \"../syntax\";\nimport type {\n ConditionalHookModeSummary,\n DiagnosticInput,\n FixPreview,\n FunctionInfo,\n RuleContext,\n RuleDefinition,\n} from \"../types\";\nimport { nodeKey } from \"../ast/walk\";\nimport {\n callNameNode,\n CONDITIONAL_TYPES,\n declarationNames,\n findAncestorBetween,\n isHookPath,\n isNestedInsideFunction,\n} from \"./helpers\";\n\nfunction staticIterationImports(\n context: RuleContext,\n): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s,\n );\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.staticIterationTables,\n );\n if (summary) result.set(match[1], summary);\n }\n return result;\n}\n\nfunction conditionalHookModeImports(\n context: RuleContext,\n): Map<string, ConditionalHookModeSummary> {\n const result = new Map<string, ConditionalHookModeSummary>();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s,\n );\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.conditionalHookModes,\n );\n if (summary) result.set(match[1], summary);\n }\n return result;\n}\n\nfunction currentConditionalHookMode(\n context: RuleContext,\n): ConditionalHookModeSummary | null {\n for (const key of moduleKeys(context.relativePath)) {\n const summary = context.project.conditionalHookModes.get(key);\n if (summary) return summary;\n }\n return null;\n}\n\nfunction controlledParameterIndex(\n controlFlow: SyntaxNode,\n fn: FunctionInfo,\n summary: ConditionalHookModeSummary,\n): number | null {\n if (controlFlow.type !== \"if_statement\") return null;\n const header = (controlFlow.text.split(/\\bthen\\b/s, 1)[0] ?? \"\").trim();\n\n for (const [conditionName, index] of Object.entries(\n summary.conditionVariables,\n )) {\n const escaped = conditionName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = [\n new RegExp(`^if\\\\s+${escaped}\\\\s*$`),\n new RegExp(`^if\\\\s+not\\\\s+${escaped}\\\\s*$`),\n new RegExp(`^if\\\\s+${escaped}\\\\s*(?:==|~=)\\\\s*(?:true|false|nil)\\\\s*$`),\n new RegExp(`^if\\\\s+(?:true|false|nil)\\\\s*(?:==|~=)\\\\s*${escaped}\\\\s*$`),\n ];\n if (patterns.some((pattern) => pattern.test(header))) return index;\n }\n\n // Keep a direct parameter fallback for older or externally constructed summaries.\n for (const index of summary.parameterIndexes) {\n const name = fn.parameters[index];\n if (!name) continue;\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`^if\\\\s+(?:not\\\\s+)?${escaped}\\\\s*$`).test(header))\n return index;\n }\n return null;\n}\n\nfunction isStableModeArgument(\n node: SyntaxNode | undefined,\n context: RuleContext,\n): boolean {\n if (!node) return true;\n const text = node.text.trim();\n if ([\"true\", \"false\", \"nil\"].includes(text)) return true;\n if (\n [\n \"number\",\n \"string\",\n \"string_content\",\n \"table_constructor\",\n \"function_definition\",\n ].includes(node.type)\n )\n return true;\n if (\n /^[A-Za-z_][A-Za-z0-9_]*$/.test(text) &&\n context.model.stableVariables.has(text)\n )\n return true;\n return false;\n}\n\nfunction dynamicHookModeFixPreview(\n hookName: string,\n argumentText: string,\n): FixPreview {\n return {\n kind: \"pattern\",\n before: `local value = ${hookName}(${argumentText})`,\n after: `local value = ${hookName}(true) -- or false; keep this mode fixed for this call site`,\n note: \"A custom hook may choose different internal hooks only when this mode is stable for the lifetime of the component instance.\",\n };\n}\n\nfunction unwrapIteratorExpression(text: string): string {\n let current = text.trim();\n const wrapper = current.match(/^(?:pairs|ipairs)\\s*\\((.*)\\)$/s);\n if (wrapper) current = wrapper[1].trim();\n return current;\n}\n\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find(\n (child) => child.type === \"assignment_statement\",\n );\n const expressionList = assignment?.namedChildren.find(\n (child) => child.type === \"expression_list\",\n );\n return expressionList?.namedChildren ?? [];\n}\n\nfunction isEmptyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(\n node?.type === \"table_constructor\" &&\n node.namedChildren.every((child) => child.type !== \"field\"),\n );\n}\n\nfunction stableShapeVariablesByFunction(\n context: RuleContext,\n): Map<number, Set<string>> {\n const stable = new Map<number, Set<string>>();\n const functionsByName = new Map<string, FunctionInfo>();\n\n for (const fn of context.model.functions) {\n stable.set(nodeKey(fn.node), new Set<string>());\n if (fn.name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(fn.name))\n functionsByName.set(fn.name, fn);\n }\n\n const namesFor = (fn: FunctionInfo): Set<string> => {\n const key = nodeKey(fn.node);\n const names = stable.get(key) ?? new Set<string>();\n stable.set(key, names);\n return names;\n };\n\n // A table constructed in the function has a fixed literal shape. More importantly for\n // React code, an empty-dependency useMemo explicitly captures one value for the entire\n // component lifetime. If that captured value is later iterated to create hooks, the\n // iteration source itself does not change between renders unless user code mutates it.\n for (const declaration of context.walk(context.root)) {\n if (declaration.type !== \"variable_declaration\") continue;\n const owner = context.nearestFunction(declaration);\n if (!owner) continue;\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (!expression) continue;\n if (expression.type === \"table_constructor\") {\n namesFor(owner).add(names[index]);\n continue;\n }\n if (expression.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(expression);\n if (!rawPath || context.resolveCallPath(rawPath) !== \"React.useMemo\")\n continue;\n const args = context.callArguments(expression);\n if (isEmptyTable(args[1])) namesFor(owner).add(names[index]);\n }\n }\n\n const callsByLocalFunction = new Map<string, SyntaxNode[]>();\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath || !functionsByName.has(rawPath)) continue;\n const calls = callsByLocalFunction.get(rawPath) ?? [];\n calls.push(call);\n callsByLocalFunction.set(rawPath, calls);\n }\n\n const expressionIsStableShape = (\n expression: SyntaxNode | undefined,\n owner: FunctionInfo | null,\n ): boolean => {\n if (!expression) return false;\n if (expression.type === \"table_constructor\") return true;\n const text = expression.text.trim();\n if (!owner || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(text)) return false;\n return namesFor(owner).has(text);\n };\n\n let changed = true;\n while (changed) {\n changed = false;\n\n // Preserve stable-shape aliases such as `local copy = capturedDefaults`.\n for (const declaration of context.walk(context.root)) {\n if (declaration.type !== \"variable_declaration\") continue;\n const owner = context.nearestFunction(declaration);\n if (!owner) continue;\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (!expressionIsStableShape(expression, owner)) continue;\n const target = names[index];\n const ownerNames = namesFor(owner);\n if (!ownerNames.has(target)) {\n ownerNames.add(target);\n changed = true;\n }\n }\n }\n\n // Propagate the guarantee through local helpers only when every known call to that\n // helper supplies a stable-shape argument for the parameter. This is what makes a\n // pattern such as `getStateContainer(capturedDefaults)` safe without exempting all\n // parameter-driven loops.\n for (const [name, fn] of functionsByName) {\n const calls = callsByLocalFunction.get(name) ?? [];\n if (calls.length === 0) continue;\n for (let index = 0; index < fn.parameters.length; index += 1) {\n const allStable = calls.every((call) => {\n const caller = context.nearestFunction(call);\n return expressionIsStableShape(context.callArguments(call)[index], caller);\n });\n if (!allStable) continue;\n const parameter = fn.parameters[index];\n if (!parameter) continue;\n const fnNames = namesFor(fn);\n if (!fnNames.has(parameter)) {\n fnNames.add(parameter);\n changed = true;\n }\n }\n }\n }\n\n return stable;\n}\n\nfunction loopIterationIsProvablyStable(\n loop: SyntaxNode,\n imports: Map<string, Set<string>>,\n owner: FunctionInfo,\n stableShapes: Map<number, Set<string>>,\n): boolean {\n const numeric = loop.namedChildren.find(\n (child) => child.type === \"for_numeric_clause\",\n );\n if (numeric) {\n const text = numeric.text;\n const bounds = text.match(\n /^\\s*[A-Za-z_][A-Za-z0-9_]*\\s*=\\s*([^,]+)\\s*,\\s*([^,]+)(?:\\s*,\\s*([^,]+))?\\s*$/s,\n );\n if (\n bounds &&\n bounds\n .slice(1)\n .filter(Boolean)\n .every((value) => /^-?\\d+(?:\\.\\d+)?$/.test(value!.trim()))\n )\n return true;\n }\n\n const clause = loop.namedChildren.find(\n (child) => child.type === \"for_generic_clause\",\n );\n const match = clause?.text.match(/\\bin\\s+(.+)$/s);\n if (!match) return false;\n const expression = unwrapIteratorExpression(match[1]);\n const path = expression.match(\n /^([A-Za-z_][A-Za-z0-9_]*)(?:\\.([A-Za-z_][A-Za-z0-9_.]*))?$/,\n );\n if (!path) return false;\n if (\n !path[2] &&\n stableShapes.get(nodeKey(owner.node))?.has(path[1])\n )\n return true;\n const fields = imports.get(path[1]);\n if (!fields) return false;\n const propertyPath = path[2] ?? \"\";\n return fields.has(propertyPath);\n}\n\nfunction functionParameterTypes(fn: FunctionInfo): Map<string, string> {\n if (!fn.body) return new Map();\n const headerLength = Math.max(0, fn.body.startIndex - fn.node.startIndex);\n const header = fn.node.text.slice(0, headerLength);\n const result = new Map<string, string>();\n for (const match of header.matchAll(\n /\\b([A-Za-z_][A-Za-z0-9_]*)\\s*:\\s*([^,\\n)]+)/g,\n )) {\n result.set(match[1], match[2].trim());\n }\n return result;\n}\n\nfunction isNonOptionalParameterType(typeText: string | undefined): boolean {\n if (!typeText) return false;\n return !typeText.includes(\"?\") && !/(?:^|[| ])nil(?:$|[| ])/i.test(typeText);\n}\n\nfunction impossibleNilGuardReturn(\n node: SyntaxNode,\n fn: FunctionInfo,\n parameterTypes: Map<string, string>,\n): boolean {\n let current = node.parent;\n while (current && current !== fn.node) {\n if (current.type === \"if_statement\") {\n const header = (current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\").trim();\n const patterns = [\n /\\bif\\s+not\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/,\n /\\bif\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*==\\s*nil\\s*$/,\n /\\bif\\s+nil\\s*==\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/,\n ];\n for (const pattern of patterns) {\n const match = header.match(pattern);\n if (match && isNonOptionalParameterType(parameterTypes.get(match[1])))\n return true;\n }\n return false;\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction hasReachableReturnBefore(\n call: SyntaxNode,\n fn: FunctionInfo,\n context: RuleContext,\n cache: Map<number, SyntaxNode[]>,\n): boolean {\n if (!fn.body) return false;\n const key = nodeKey(fn.node);\n let returns = cache.get(key);\n if (!returns) {\n const parameterTypes = functionParameterTypes(fn);\n returns = [...context.walk(fn.body)].filter(\n (node) =>\n node.type === \"return_statement\" &&\n !isNestedInsideFunction(node, fn.node) &&\n !impossibleNilGuardReturn(node, fn, parameterTypes),\n );\n cache.set(key, returns);\n }\n return returns.some((node) => node.endIndex <= call.startIndex);\n}\n\nfunction conditionalFixPreview(kind: string, hookName: string): FixPreview {\n if (kind === \"for statement\") {\n return {\n kind: \"pattern\",\n before: `for _, item in items do\\n\\tlocal value = ${hookName}(item)\\nend`,\n after: `local function Item(props)\\n\\tlocal value = ${hookName}(props.item)\\n\\treturn renderItem(value)\\nend\\n\\nfor _, item in items do\\n\\tchildren[item.id] = React.createElement(Item, {\\n\\t\\titem = item,\\n\\t})\\nend`,\n note: \"When collection size can change, move the hook into a child component so each component instance owns a fixed hook sequence.\",\n };\n }\n if (kind === \"while statement\" || kind === \"repeat statement\") {\n return {\n kind: \"pattern\",\n before: `while condition do\\n\\tlocal value = ${hookName}()\\nend`,\n after: `local value = ${hookName}()\\n\\nwhile condition do\\n\\t-- use value without creating another hook call\\nend`,\n note: \"Hook count must not depend on how many times a runtime loop executes.\",\n };\n }\n return {\n kind: \"pattern\",\n before: `if enabled then\\n\\tlocal value = ${hookName}()\\nend`,\n after: `local value = ${hookName}()\\n\\nif enabled then\\n\\t-- use value here\\nend`,\n note: \"Keep the hook call unconditional, then branch on its result.\",\n };\n}\n\nfunction earlyReturnFixPreview(hookName: string): FixPreview {\n return {\n kind: \"pattern\",\n before: `if not ready then\\n\\treturn nil\\nend\\n\\nlocal value = ${hookName}()`,\n after: `local value = ${hookName}()\\n\\nif not ready then\\n\\treturn nil\\nend`,\n note: \"Call hooks before any reachable early return so every render executes the same hook sequence.\",\n };\n}\n\nexport const rulesOfHooks: RuleDefinition = {\n id: \"react-luau/rules-of-hooks\",\n category: \"Hooks\",\n severity: \"error\",\n description:\n \"Hooks must run in the same order on every render of a React component or custom hook.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n const staticImports = staticIterationImports(context);\n const stableShapes = stableShapeVariablesByFunction(context);\n const modeImports = conditionalHookModeImports(context);\n const currentModeSummary = currentConditionalHookMode(context);\n const reachableReturns = new Map<number, SyntaxNode[]>();\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (!isHookPath(path)) continue;\n\n const fn = context.nearestFunction(call);\n if (!fn || (!fn.isComponent && !fn.isHook)) {\n diagnostics.push({\n node: callNameNode(call),\n message: `Hook ${path} is called outside a React component or custom hook.`,\n help: \"Move the hook into a component or a custom hook whose name starts with use.\",\n fixPreview: {\n kind: \"pattern\",\n before: `local value = ${path}()\\n\\nlocal function helper()\\n\\treturn value\\nend`,\n after: `local function useHelper()\\n\\tlocal value = ${path}()\\n\\treturn value\\nend`,\n note: \"Hooks need a React-owned component or custom-hook call stack.\",\n },\n });\n continue;\n }\n\n const importedMode = modeImports.get(rawPath);\n if (importedMode) {\n const args = context.callArguments(call);\n const dynamicIndexes = importedMode.parameterIndexes.filter(\n (index) => !isStableModeArgument(args[index], context),\n );\n if (dynamicIndexes.length > 0) {\n const firstIndex = dynamicIndexes[0];\n const argument = args[firstIndex];\n const parameterOffset =\n importedMode.parameterIndexes.indexOf(firstIndex);\n const parameterName =\n importedMode.parameterNames[parameterOffset] ??\n `argument ${firstIndex + 1}`;\n const argumentText = argument?.text.trim() || \"<omitted>\";\n diagnostics.push({\n node: argument ?? callNameNode(call),\n highlights: dynamicIndexes\n .map((index) => args[index])\n .filter((node): node is SyntaxNode => Boolean(node)),\n message: `Hook ${rawPath} receives render-varying hook mode ${parameterName} from ${argumentText}; if it changes between renders, the custom hook can execute a different hook sequence.`,\n help: `Pass a stable mode at this call site, or refactor ${rawPath} so it always calls the same hooks regardless of ${parameterName}.`,\n fixPreview: dynamicHookModeFixPreview(rawPath, argumentText),\n });\n }\n }\n\n const controlFlow = findAncestorBetween(call, fn.node, (node) =>\n CONDITIONAL_TYPES.has(node.type),\n );\n if (controlFlow) {\n if (\n currentModeSummary &&\n currentModeSummary.knownCallSites > 0 &&\n controlledParameterIndex(controlFlow, fn, currentModeSummary) !== null\n )\n continue;\n if (\n controlFlow.type === \"for_statement\" &&\n loopIterationIsProvablyStable(\n controlFlow,\n staticImports,\n fn,\n stableShapes,\n )\n )\n continue;\n const kind = controlFlow.type.replaceAll(\"_\", \" \");\n const loopLike =\n controlFlow.type === \"for_statement\" ||\n controlFlow.type === \"while_statement\" ||\n controlFlow.type === \"repeat_statement\";\n diagnostics.push({\n node: callNameNode(call),\n message: loopLike\n ? `Hook ${path} is called inside ${kind} whose size or iteration order may change between renders. If that happens, React will see a different hook sequence.`\n : `Hook ${path} is called inside ${kind}, so the hook may be skipped on some renders.`,\n help: loopLike\n ? \"Keep hook count independent of runtime collection size or loop iterations. A common fix is to render a child component per item and call the hook inside that child.\"\n : \"Call the hook unconditionally at the top level, then branch on the returned value.\",\n fixPreview: conditionalFixPreview(kind, path),\n });\n continue;\n }\n\n if (hasReachableReturnBefore(call, fn, context, reachableReturns)) {\n diagnostics.push({\n node: callNameNode(call),\n message: `Hook ${path} may run after an earlier reachable return, so some renders can execute fewer hooks.`,\n help: \"Move the hook before reachable early returns so hook order cannot change between renders.\",\n fixPreview: earlyReturnFixPreview(path),\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
41
|
+
"import type { SyntaxNode } from \"../syntax\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { assignmentTargetNode, callNameNode, containsUnshadowedIdentifier, identifierNode, isBindingShadowedBetween, stateBindingsFor } from \"./helpers\";\nimport { mightMutateParameters, mutatedParameterIndexesForCall, mutationOriginForExpression } from \"./parameter-mutations\";\n\nconst TRIVIAL_INITIALIZER_PATHS = new Set([\n \"tostring\",\n \"tonumber\",\n \"type\",\n \"typeof\",\n \"math.abs\",\n \"math.ceil\",\n \"math.floor\",\n \"math.max\",\n \"math.min\",\n \"math.round\",\n \"string.lower\",\n \"string.upper\",\n \"string.format\",\n \"table.pack\",\n \"Vector2.new\",\n \"Vector3.new\",\n \"Vector2int16.new\",\n \"Vector3int16.new\",\n \"UDim.new\",\n \"UDim2.new\",\n \"UDim2.fromOffset\",\n \"UDim2.fromScale\",\n \"CFrame.new\",\n \"Color3.new\",\n \"Color3.fromRGB\",\n \"Color3.fromHSV\",\n \"Rect.new\",\n \"NumberRange.new\",\n \"TweenInfo.new\",\n]);\n\nfunction isTrivialInitializerPath(path: string): boolean {\n return TRIVIAL_INITIALIZER_PATHS.has(path) || /(?:^|[.:])getValue$/i.test(path);\n}\n\nfunction isNestedFunctionFromOwner(context: RuleContext, node: SyntaxNode, owner: FunctionInfo): boolean {\n const nearest = context.nearestFunction(node);\n return Boolean(nearest && nearest !== owner);\n}\n\nfunction callsSetter(context: RuleContext, owner: FunctionInfo, setterName: string): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type === \"function_call\" && context.getCallPath(call) === setterName) return true;\n }\n return false;\n}\n\nfunction isIdentifierRead(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"identifier\" || node.text !== name) return false;\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), node)) return false;\n if (parent?.type === \"method_index_expression\" && sameNode(parent.namedChildren.at(-1), node)) return false;\n return true;\n}\n\nfunction renderReachableNestedFunctions(context: RuleContext, owner: FunctionInfo): Set<FunctionInfo> {\n const reachable = new Set<FunctionInfo>();\n if (!owner.body) return reachable;\n\n const byName = new Map<string, FunctionInfo>();\n for (const fn of context.model.functions) {\n if (!fn.name || fn === owner) continue;\n let current = fn.node.parent;\n while (current) {\n const parentInfo = context.model.functionByNode.get(current.id);\n if (parentInfo) {\n if (parentInfo === owner) byName.set(fn.name, fn);\n break;\n }\n current = current.parent;\n }\n }\n\n const pending: FunctionInfo[] = [];\n const addByName = (name: string | undefined) => {\n if (!name) return;\n const fn = byName.get(name);\n if (!fn || reachable.has(fn)) return;\n reachable.add(fn);\n pending.push(fn);\n };\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\" || context.nearestFunction(call) !== owner) continue;\n const path = context.getCallPath(call) ?? \"\";\n const resolved = context.resolveCallPath(path);\n if (resolved === \"React.createElement\") addByName(context.callArguments(call)[0]?.text.trim());\n else addByName(path);\n }\n\n while (pending.length > 0) {\n const fn = pending.pop()!;\n if (!fn.body) continue;\n for (const call of context.walk(fn.body)) {\n if (call.type !== \"function_call\" || context.nearestFunction(call) !== fn) continue;\n const path = context.getCallPath(call) ?? \"\";\n const resolved = context.resolveCallPath(path);\n if (resolved === \"React.createElement\") addByName(context.callArguments(call)[0]?.text.trim());\n else addByName(path);\n }\n }\n\n return reachable;\n}\n\nfunction directlyReadsValue(context: RuleContext, owner: FunctionInfo, binding: StateBinding): boolean {\n if (!owner.body) return false;\n\n for (const node of context.walk(owner.body)) {\n if (!isIdentifierRead(node, binding.valueName)) continue;\n if (node.startIndex >= binding.declaration.startIndex && node.endIndex <= binding.declaration.endIndex) continue;\n if (isNestedFunctionFromOwner(context, node, owner)) continue;\n if (isBindingShadowedBetween(node, owner, binding.valueName, binding.declaration)) continue;\n return true;\n }\n\n for (const fn of renderReachableNestedFunctions(context, owner)) {\n if (!fn.body) continue;\n for (const node of context.walk(fn.body)) {\n if (isIdentifierRead(node, binding.valueName) && !isBindingShadowedBetween(node, owner, binding.valueName, binding.declaration)) return true;\n }\n }\n\n return false;\n}\n\nfunction isPlainTableState(binding: StateBinding, context: RuleContext): boolean {\n const initializer = binding.initializer;\n if (!initializer) return true;\n if (initializer.type === \"table_constructor\") return true;\n if (initializer.type !== \"function_call\") return false;\n const path = context.getCallPath(initializer) ?? \"\";\n return path === \"table.clone\" || path === \"table.create\" || path === \"table.pack\";\n}\n\ntype CallbackLifetime = \"long-lived\" | \"custom-hook\" | \"render-handler\" | \"unknown\";\n\nfunction callbackLifetime(context: RuleContext, call: SyntaxNode, owner: FunctionInfo): CallbackLifetime {\n const callback = context.nearestFunction(call);\n if (!callback || callback === owner) return \"unknown\";\n\n let current: SyntaxNode | null = callback.node;\n while (current && current.startIndex >= owner.node.startIndex && current.endIndex <= owner.node.endIndex) {\n if (current.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(current) ?? \"\");\n if (\n path === \"React.useEffect\"\n || path === \"React.useLayoutEffect\"\n || path === \"task.spawn\"\n || path === \"task.defer\"\n || path === \"task.delay\"\n || /:Connect$/.test(path)\n || /BindToRenderStep$/.test(path)\n || /:BindAction(?:AtPriority)?$/.test(path)\n || /:BindActivate$/.test(path)\n ) {\n return \"long-lived\";\n }\n if (path === \"React.createElement\") return \"render-handler\";\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n if (/^use[A-Z0-9_]/.test(final)) return \"custom-hook\";\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") {\n if (current.startIndex !== callback.node.startIndex || current.endIndex !== callback.node.endIndex) break;\n }\n current = current.parent;\n }\n\n return \"unknown\";\n}\n\nexport const rerenderFunctionalSetstate: RuleDefinition = {\n id: \"react-luau/rerender-functional-setstate\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Use the functional state setter form when deferred callbacks update from the previous state value.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner?.body) continue;\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\" || context.getCallPath(call) !== binding.setterName) continue;\n if (!isNestedFunctionFromOwner(context, call, owner)) continue;\n const argument = context.callArguments(call)[0];\n if (!argument || argument.type === \"function_definition\") continue;\n if (!containsUnshadowedIdentifier(argument, binding.valueName, context, owner)) continue;\n const lifetime = callbackLifetime(context, call, owner);\n if (lifetime === \"render-handler\" || lifetime === \"unknown\") continue;\n\n diagnostics.push({\n node: callNameNode(call),\n severity: lifetime === \"custom-hook\" ? \"suggestion\" : \"warning\",\n message: `${binding.setterName}() reads ${binding.valueName} from a captured callback value.`,\n help: lifetime === \"custom-hook\"\n ? `Use ${binding.setterName}(function(previous) return ... end) if the custom hook can retain this callback across renders.`\n : `Use ${binding.setterName}(function(previous) return ... end) when the next value depends on previous state.`,\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderLazyStateInit: RuleDefinition = {\n id: \"react-luau/rerender-lazy-state-init\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Expensive useState initializers should use React's lazy initializer form.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.useState\") continue;\n const initializer = context.callArguments(call)[0];\n if (!initializer || initializer.type === \"function_definition\") continue;\n\n const eagerCall = [...context.walk(initializer)].find((node) => node.type === \"function_call\");\n if (!eagerCall) continue;\n const eagerPath = context.resolveCallPath(context.getCallPath(eagerCall) ?? \"\");\n if (isTrivialInitializerPath(eagerPath) || /^React\\.use[A-Z0-9_]/.test(eagerPath)) continue;\n\n diagnostics.push({\n node: callNameNode(eagerCall),\n message: `${eagerPath || \"This initializer call\"} is evaluated every render before useState can reuse the existing state.`,\n help: \"Wrap expensive initial state creation in function() ... end so it only runs when the state is first initialized.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderLazyRefInit: RuleDefinition = {\n id: \"react-luau/rerender-lazy-ref-init\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Avoid eagerly rebuilding expensive values passed to useRef on every render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.useRef\") continue;\n const initializer = context.callArguments(call)[0];\n if (!initializer || initializer.type !== \"function_call\") continue;\n const eagerPath = context.resolveCallPath(context.getCallPath(initializer) ?? \"\");\n if (isTrivialInitializerPath(eagerPath) || /^React\\.use[A-Z0-9_]/.test(eagerPath)) continue;\n\n diagnostics.push({\n node: callNameNode(initializer),\n message: `${eagerPath || \"This initializer call\"} is rebuilt before useRef returns the existing ref on every render.`,\n help: \"Initialize the ref from a predictable nil-guarded render pattern when construction is pure, or create owned resources in an effect with cleanup. Do not put side-effectful resource creation into useRef just to silence this warning.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderStateOnlyInHandlers: RuleDefinition = {\n id: \"react-luau/rerender-state-only-in-handlers\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"State that is only read from callbacks may be mutable data rather than rendered state.\",\n run(context) {\n const diagnostics = [];\n\n for (const owner of context.model.functions) {\n if (!owner.isComponent) continue;\n for (const binding of stateBindingsFor(context, owner)) {\n if (binding.valueName === \"_\" || binding.valueName.startsWith(\"_\")) continue;\n if (/^(set)?(?:TriggerRender|ForceUpdate|Rerender|ForceRender|Tick|Bump|BumpVersion|InvalidateRender|Refresh|Repaint)$/i.test(binding.setterName)) continue;\n if (!callsSetter(context, owner, binding.setterName)) continue;\n if (directlyReadsValue(context, owner, binding)) continue;\n\n diagnostics.push({\n node: identifierNode(binding.declaration, binding.valueName) ?? binding.declaration,\n message: `${binding.valueName} is updated as React state but is never read by the component's render path or hook arguments.`,\n help: \"When a value is only read by event or signal callbacks, consider useRef so updates do not rerender the component. Keep useState when the update intentionally invalidates rendering or feeds a hook dependency.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noDirectStateMutation: RuleDefinition = {\n id: \"react-luau/no-direct-state-mutation\",\n category: \"Correctness\",\n severity: \"warning\",\n description: \"Do not mutate table state in place.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner?.body || !isPlainTableState(binding, context)) continue;\n const escaped = binding.valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n for (const node of context.walk(owner.body)) {\n if (node.startIndex >= binding.declaration.startIndex && node.endIndex <= binding.declaration.endIndex) continue;\n let mutates = false;\n\n if (node.type === \"assignment_statement\" || node.type === \"update_statement\") {\n mutates = new RegExp(`^\\\\s*${escaped}\\\\s*(?:\\\\.|\\\\[)`).test(node.text);\n } else if (node.type === \"function_call\" && mightMutateParameters(context, node)) {\n const arguments_ = context.callArguments(node);\n for (const index of mutatedParameterIndexesForCall(context, node, owner)) {\n const argument = arguments_[index];\n if (!argument) continue;\n const origin = mutationOriginForExpression(context, argument, owner);\n if (origin.kind === \"state\" && origin.binding === binding) {\n mutates = true;\n break;\n }\n }\n }\n\n if (!mutates || isBindingShadowedBetween(node, owner, binding.valueName, binding.declaration)) continue;\n const key = `${node.startIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: node.type === \"function_call\" ? callNameNode(node) : assignmentTargetNode(node),\n message: `${binding.valueName} is React state backed by a table and is mutated in place.`,\n help: `Create a new table and pass the new identity to ${binding.setterName}. In-place mutation can leave React with the same state identity and makes update ordering harder to reason about.`,\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
|
|
42
42
|
"import type { RuleDefinition } from \"../types\";\nimport { fieldName, fieldNameNode, fieldValue } from \"./helpers\";\n\nexport const unstableContextValue: RuleDefinition = {\n id: \"react-luau/unstable-context-value\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Avoid recreating context value tables on every provider render when identity matters.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.createElement\") continue;\n const args = context.callArguments(call);\n const element = args[0]?.text ?? \"\";\n const props = args[1];\n if (!/\\.Provider$/.test(element) || !props || props.type !== \"table_constructor\") continue;\n const valueField = props.namedChildren.find((field) =>\n field.type === \"field\" && fieldName(field) === \"value\" && fieldValue(field)?.type === \"table_constructor\"\n );\n if (!valueField) continue;\n\n diagnostics.push({\n node: fieldNameNode(valueField),\n message: \"Context Provider receives a new inline value table on every render.\",\n help: \"Memoize the provider value from its real dependencies when consumer updates depend on object identity.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
|
|
43
43
|
"import type { RuleDefinition } from \"../types\";\nimport { effectNeedsCleanup } from \"./effect-needs-cleanup\";\nimport {\n noDerivedStateEffect,\n noEffectWithFreshDeps,\n noMutableInDeps,\n noSelfUpdatingEffect,\n} from \"./effect-state-rules\";\nimport { exhaustiveDeps } from \"./exhaustive-deps\";\nimport { noArrayIndexAsKey } from \"./no-array-index-as-key\";\nimport { noCreateContextInRender } from \"./no-create-context-in-render\";\nimport { noNestedComponentDefinition } from \"./no-nested-component-definition\";\nimport { noPropMutation } from \"./no-prop-mutation\";\nimport { noRandomKey } from \"./no-random-key\";\nimport { noSetStateInRender } from \"./no-set-state-in-render\";\nimport { parseErrors } from \"./parse-errors\";\nimport {\n preferUseRefForMutableCell,\n rerenderHighFrequencyState,\n rerenderRepeatedCollectionScan,\n rerenderStaticDiscoveryInRender,\n rerenderStaticState,\n rerenderUnnecessaryUseCallback,\n rerenderUnnecessaryUseMemo,\n rerenderUnstableMemoProps,\n} from \"./performance-rules\";\nimport { preferBindingOverState, preferBindingOverStateCandidate } from \"./prefer-binding-over-state\";\nimport { noCreateRootInRender } from \"./react-roblox-lifecycle\";\nimport { noRefCurrentInRender } from \"./ref-rules\";\nimport {\n noSideEffectsInRender,\n noTaskSpawnInRender,\n noYieldInRender,\n} from \"./render-side-effects\";\nimport { rulesOfHooks } from \"./rules-of-hooks\";\nimport {\n noDirectStateMutation,\n rerenderFunctionalSetstate,\n rerenderLazyRefInit,\n rerenderLazyStateInit,\n rerenderStateOnlyInHandlers,\n} from \"./state-performance\";\nimport { unstableContextValue } from \"./unstable-context-value\";\n\nexport const rules: RuleDefinition[] = [\n parseErrors,\n rulesOfHooks,\n exhaustiveDeps,\n effectNeedsCleanup,\n noDerivedStateEffect,\n noSelfUpdatingEffect,\n noEffectWithFreshDeps,\n noMutableInDeps,\n preferBindingOverState,\n preferBindingOverStateCandidate,\n rerenderUnstableMemoProps,\n rerenderHighFrequencyState,\n rerenderUnnecessaryUseMemo,\n rerenderUnnecessaryUseCallback,\n rerenderStaticDiscoveryInRender,\n rerenderRepeatedCollectionScan,\n rerenderStaticState,\n preferUseRefForMutableCell,\n rerenderFunctionalSetstate,\n rerenderLazyStateInit,\n rerenderLazyRefInit,\n rerenderStateOnlyInHandlers,\n noSetStateInRender,\n noDirectStateMutation,\n noRefCurrentInRender,\n noCreateContextInRender,\n noNestedComponentDefinition,\n noRandomKey,\n noYieldInRender,\n noTaskSpawnInRender,\n noSideEffectsInRender,\n noCreateRootInRender,\n noPropMutation,\n noArrayIndexAsKey,\n unstableContextValue,\n];\n\nexport const rulesById = new Map(rules.map((rule) => [rule.id, rule]));\n",
|
|
44
44
|
"import { availableParallelism } from \"node:os\";\nimport { Worker } from \"node:worker_threads\";\nimport type { ReactFileAnalysisInput, ReactFileAnalysisResult } from \"./file-analysis\";\nimport type {\n AnalyzedEffectWorkerModule,\n EffectWorkerIndexInput,\n IndexedEffectWorkerModule,\n} from \"./project-effects\";\nimport type { SourceEffectModuleSummary } from \"./types\";\n\nexport const MIN_PARALLEL_FILES = 16;\nconst MAX_ANALYSIS_WORKERS = 8;\n\nexport interface ReactScanWorkerRequest {\n type: \"react-scan\";\n files: ReactFileAnalysisInput[];\n reportProgress?: boolean;\n}\n\nexport interface ReactScanWorkerResponse {\n type: \"react-scan\";\n results: ReactFileAnalysisResult[];\n}\n\nexport interface EffectIndexWorkerRequest {\n type: \"effect-index\";\n files: EffectWorkerIndexInput[];\n moduleAliases: Map<string, string>;\n}\n\nexport interface EffectIndexWorkerResponse {\n type: \"effect-index\";\n modules: IndexedEffectWorkerModule[];\n}\n\nexport interface EffectAnalyzeWorkerRequest {\n type: \"effect-analyze\";\n moduleSummaries: Map<string, SourceEffectModuleSummary>;\n exportedFunctions: Map<string, string>;\n}\n\nexport interface EffectAnalyzeWorkerResponse {\n type: \"effect-analyze\";\n modules: AnalyzedEffectWorkerModule[];\n}\n\nexport interface ReactScanWorkerProgress {\n type: \"react-scan-progress\";\n file: string;\n}\n\ninterface WorkerErrorResponse {\n type: \"error\";\n message: string;\n stack?: string;\n}\n\nexport type AnalysisWorkerRequest = ReactScanWorkerRequest | EffectIndexWorkerRequest | EffectAnalyzeWorkerRequest;\nexport type AnalysisWorkerResponse =\n | ReactScanWorkerResponse\n | ReactScanWorkerProgress\n | EffectIndexWorkerResponse\n | EffectAnalyzeWorkerResponse\n | WorkerErrorResponse;\n\nfunction workerUrl(): URL {\n const filename = import.meta.url.endsWith(\".ts\") ? \"scan-worker.ts\" : \"scan-worker.js\";\n return new URL(`./${filename}`, import.meta.url);\n}\n\nexport function analysisWorkerCount(fileCount: number): number {\n if (fileCount < MIN_PARALLEL_FILES) return 1;\n return Math.max(1, Math.min(MAX_ANALYSIS_WORKERS, availableParallelism(), Math.ceil(fileCount / 8)));\n}\n\nfunction balancedIndexes(files: Array<{ source: string }>, workerCount: number): number[] {\n const sizes = new Array<number>(workerCount).fill(0);\n const indexes = new Array<number>(files.length);\n const ordered = files.map((file, index) => ({ file, index })).sort((left, right) => right.file.source.length - left.file.source.length);\n\n for (const { file, index } of ordered) {\n let target = 0;\n for (let workerIndex = 1; workerIndex < workerCount; workerIndex += 1) {\n if (sizes[workerIndex] < sizes[target]) target = workerIndex;\n }\n indexes[index] = target;\n sizes[target] += file.source.length;\n }\n\n return indexes;\n}\n\nexport class AnalysisWorkerPool {\n private readonly workers: Worker[];\n private readonly effectOwners = new Map<string, number>();\n\n constructor(workerCount: number) {\n this.workers = Array.from({ length: workerCount }, () => new Worker(workerUrl()));\n }\n\n async indexEffectModules(\n files: EffectWorkerIndexInput[],\n moduleAliases: Map<string, string>,\n onBatchComplete?: (count: number, file?: string) => void,\n ): Promise<IndexedEffectWorkerModule[]> {\n if (files.length === 0) return [];\n const assignments = balancedIndexes(files, this.workers.length);\n const batches = Array.from({ length: this.workers.length }, () => [] as EffectWorkerIndexInput[]);\n for (let index = 0; index < files.length; index += 1) {\n const owner = assignments[index];\n const file = files[index];\n batches[owner].push(file);\n this.effectOwners.set(file.relativePath, owner);\n }\n\n const results = await Promise.all(batches.map(async (batch, index) => {\n if (batch.length === 0) return [];\n const response = await this.send(this.workers[index], {\n type: \"effect-index\",\n files: batch,\n moduleAliases,\n });\n if (response.type !== \"effect-index\") throw new Error(`Unexpected analysis worker response: ${response.type}`);\n onBatchComplete?.(batch.length, batch.at(-1)?.relativePath);\n return response.modules;\n }));\n return results.flat();\n }\n\n async analyzeEffectModules(\n moduleSummaries: Map<string, SourceEffectModuleSummary>,\n exportedFunctions: Map<string, string>,\n onBatchComplete?: (count: number) => void,\n ): Promise<AnalyzedEffectWorkerModule[]> {\n const results = await Promise.all(this.workers.map(async (worker) => {\n const response = await this.send(worker, { type: \"effect-analyze\", moduleSummaries, exportedFunctions });\n if (response.type !== \"effect-analyze\") throw new Error(`Unexpected analysis worker response: ${response.type}`);\n onBatchComplete?.(response.modules.length);\n return response.modules;\n }));\n return results.flat();\n }\n\n async scanReactFiles(\n files: ReactFileAnalysisInput[],\n onBatchComplete?: (count: number, file?: string) => void,\n ): Promise<ReactFileAnalysisResult[]> {\n if (files.length === 0) return [];\n const batches = Array.from({ length: this.workers.length }, () => [] as ReactFileAnalysisInput[]);\n const sizes = new Array<number>(this.workers.length).fill(0);\n const unassigned: ReactFileAnalysisInput[] = [];\n\n for (const file of files) {\n const owner = this.effectOwners.get(file.relativePath);\n if (owner === undefined) {\n unassigned.push(file);\n continue;\n }\n batches[owner].push(file);\n sizes[owner] += file.source.length;\n }\n\n for (const file of [...unassigned].sort((left, right) => right.source.length - left.source.length)) {\n let target = 0;\n for (let index = 1; index < this.workers.length; index += 1) {\n if (sizes[index] < sizes[target]) target = index;\n }\n batches[target].push(file);\n sizes[target] += file.source.length;\n }\n\n const results = await Promise.all(batches.map(async (batch, index) => {\n if (batch.length === 0) return [];\n const response = await this.send(\n this.workers[index],\n { type: \"react-scan\", files: batch, reportProgress: Boolean(onBatchComplete) },\n (progress) => onBatchComplete?.(1, progress.file),\n );\n if (response.type !== \"react-scan\") throw new Error(`Unexpected analysis worker response: ${response.type}`);\n return response.results;\n }));\n return results.flat();\n }\n\n close(): void {\n for (const worker of this.workers) {\n worker.unref();\n void worker.terminate().catch(() => {});\n }\n }\n\n private send(\n worker: Worker,\n request: AnalysisWorkerRequest,\n onProgress?: (progress: ReactScanWorkerProgress) => void,\n ): Promise<AnalysisWorkerResponse> {\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n worker.off(\"message\", onMessage);\n worker.off(\"error\", onError);\n worker.off(\"exit\", onExit);\n };\n const onMessage = (response: AnalysisWorkerResponse): void => {\n if (response.type === \"react-scan-progress\") {\n onProgress?.(response);\n return;\n }\n cleanup();\n if (response.type === \"error\") {\n const error = new Error(response.message);\n if (response.stack) error.stack = response.stack;\n reject(error);\n return;\n }\n resolve(response);\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n const onExit = (code: number): void => {\n if (code === 0) return;\n cleanup();\n reject(new Error(`Analysis worker exited with code ${code}`));\n };\n worker.on(\"message\", onMessage);\n worker.on(\"error\", onError);\n worker.on(\"exit\", onExit);\n worker.postMessage(request);\n });\n }\n}\n",
|
|
45
45
|
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildUniqueFeatureAliases,\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n type ModuleIdentity,\n} from \"./module-resolution\";\nimport { sourceHasHighFrequencyRunService } from \"./roblox-semantics\";\nimport type {\n BindingCandidateHookSummary,\n ConditionalHookModeSummary,\n ExternalCallbackFunctionSummary,\n ProjectModel,\n ScanFileInput,\n} from \"./types\";\n\nconst EXTERNAL_UPDATE_SOURCE =\n /(?::|\\.)(?:Connect|Once|Subscribe|Observe|Listen|Watch)\\s*\\(|\\b(?:subscribe|observe|listen|watch)[A-Za-z0-9_]*\\s*\\(|GetPropertyChangedSignal\\s*\\(|\\.Changed\\b/i;\nconst CALLBACK_PARAMETER_NAME =\n /^(?:callback|handler|listener|subscriber|observer|effect|fn)$/i;\n\ninterface SourceRecord extends ModuleIdentity {\n source: string;\n}\n\nexport interface ProjectModelModuleAnalysis {\n record: SourceRecord;\n memoized?: \"shallow\" | \"custom\";\n bindingHook?: BindingCandidateHookSummary;\n callbackFunction?: ExternalCallbackFunctionSummary;\n bindingCompatibleProps?: Set<string>;\n staticIterationTables?: Set<string>;\n conditionalHookMode?: ConditionalHookModeSummary;\n declaredMethods: Map<string, Set<string>>;\n}\n\nexport interface ProjectModelModuleCacheEntry {\n hash: string;\n analysis: ProjectModelModuleAnalysis;\n}\n\nexport interface ProjectModelBuildOptions {\n fileHashes?: Readonly<Record<string, string>>;\n moduleCache?: Map<string, ProjectModelModuleCacheEntry>;\n}\n\nfunction exportedFunctionName(source: string): string | null {\n return source.match(/\\breturn\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/)?.[1] ?? null;\n}\n\nfunction findFunctionParameters(\n source: string,\n functionName: string,\n): string | null {\n const escaped = functionName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = [\n new RegExp(\n `\\\\b(?:local\\\\s+)?function\\\\s+${escaped}(?:<[^>]*>)?\\\\s*\\\\(`,\n \"s\",\n ),\n new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*function(?:<[^>]*>)?\\\\s*\\\\(`, \"s\"),\n ];\n for (const pattern of patterns) {\n const match = pattern.exec(source);\n if (!match) continue;\n const open = match.index + match[0].lastIndexOf(\"(\");\n return extractCallArguments(source, open);\n }\n return null;\n}\n\nfunction splitTopLevelParameters(parameters: string): string[] {\n const result: string[] = [];\n let start = 0;\n let round = 0;\n let square = 0;\n let curly = 0;\n let angle = 0;\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < parameters.length; index += 1) {\n const char = parameters[index];\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"(\") round += 1;\n else if (char === \")\") round = Math.max(0, round - 1);\n else if (char === \"[\") square += 1;\n else if (char === \"]\") square = Math.max(0, square - 1);\n else if (char === \"{\") curly += 1;\n else if (char === \"}\") curly = Math.max(0, curly - 1);\n else if (char === \"<\") angle += 1;\n else if (char === \">\") angle = Math.max(0, angle - 1);\n else if (\n char === \",\" &&\n round === 0 &&\n square === 0 &&\n curly === 0 &&\n angle === 0\n ) {\n result.push(parameters.slice(start, index).trim());\n start = index + 1;\n }\n }\n result.push(parameters.slice(start).trim());\n return result.filter(Boolean);\n}\n\ninterface DualModeBindingStatePair {\n valueName: string;\n setterName: string;\n bindingModeParameterIndex: number;\n bindingModeParameterName: string;\n bindingWhenTruthy: boolean;\n}\n\nfunction findDualModeBindingStatePair(\n source: string,\n functionName: string,\n): DualModeBindingStatePair | null {\n const parametersText = findFunctionParameters(source, functionName);\n if (parametersText === null) return null;\n const parameterNames = splitTopLevelParameters(parametersText).map(\n (parameter) => parameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null,\n );\n\n const declarations = [\n ...source.matchAll(\n /^[ \\t]*local[ \\t]+([A-Za-z_][A-Za-z0-9_]*)[ \\t]*,[ \\t]*([A-Za-z_][A-Za-z0-9_]*)[ \\t]*(?:--[^\\n]*)?$/gm,\n ),\n ];\n for (const declaration of declarations) {\n const valueName = declaration[1];\n const setterName = declaration[2];\n const escapedValue = valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedSetter = setterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const bindingAssignment = `${escapedValue}\\\\s*,\\\\s*${escapedSetter}\\\\s*=\\\\s*(?:React\\\\.)?useBinding\\\\s*\\\\(`;\n const stateAssignment = `${escapedValue}\\\\s*,\\\\s*${escapedSetter}\\\\s*=\\\\s*(?:React\\\\.)?useState\\\\s*\\\\(`;\n\n for (const [parameterIndex, parameterName] of parameterNames.entries()) {\n if (!parameterName) continue;\n const escapedParameter = parameterName.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n \"\\\\$&\",\n );\n const patterns = [\n {\n regex: new RegExp(\n `\\\\bif\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${bindingAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${stateAssignment}`,\n ),\n bindingWhenTruthy: true,\n },\n {\n regex: new RegExp(\n `\\\\bif\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${stateAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${bindingAssignment}`,\n ),\n bindingWhenTruthy: false,\n },\n {\n regex: new RegExp(\n `\\\\bif\\\\s+not\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${stateAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${bindingAssignment}`,\n ),\n bindingWhenTruthy: true,\n },\n {\n regex: new RegExp(\n `\\\\bif\\\\s+not\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${bindingAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${stateAssignment}`,\n ),\n bindingWhenTruthy: false,\n },\n ];\n const match = patterns.find((pattern) => pattern.regex.test(source));\n if (!match) continue;\n return {\n valueName,\n setterName,\n bindingModeParameterIndex: parameterIndex,\n bindingModeParameterName: parameterName,\n bindingWhenTruthy: match.bindingWhenTruthy,\n };\n }\n }\n\n return null;\n}\n\nfunction exportedFunctionParameters(\n source: string,\n): { name?: string; parameters: string[] } | null {\n const name = exportedFunctionName(source);\n if (name) {\n const parameters = findFunctionParameters(source, name);\n if (parameters === null) return null;\n return { name, parameters: splitTopLevelParameters(parameters) };\n }\n\n const match = /^\\s*return\\s+function(?:<[^>]*>)?\\s*\\(/m.exec(source);\n if (!match || match.index === undefined) return null;\n const open = match.index + match[0].lastIndexOf(\"(\");\n const parameters = extractCallArguments(source, open);\n if (parameters === null) return null;\n return { parameters: splitTopLevelParameters(parameters) };\n}\n\nfunction parameterName(parameter: string): string | null {\n return parameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null;\n}\n\nfunction branchContainsHookCall(text: string): boolean {\n return /\\b(?:[A-Za-z_][A-Za-z0-9_]*[.:])?use[A-Z0-9_][A-Za-z0-9_]*\\s*\\(/.test(\n text,\n );\n}\n\nfunction conditionAliasesForParameter(\n source: string,\n parameter: string,\n): string[] {\n const aliases = new Set<string>([parameter]);\n const escaped = parameter.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const directPatterns = [\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*not\\\\s+${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*${escaped}\\\\s*(?:==|~=)\\\\s*(?:true|false|nil)\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*(?:true|false|nil)\\\\s*(?:==|~=)\\\\s*${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*if\\\\s+${escaped}\\\\s*(?:==|~=)\\\\s*nil\\\\s+then\\\\s+(?:true|false)\\\\s+else\\\\s+${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*if\\\\s+${escaped}\\\\s+then\\\\s+(?:true|false)\\\\s+else\\\\s+(?:true|false)\\\\s*$`,\n \"gm\",\n ),\n ];\n\n for (const pattern of directPatterns) {\n for (const match of source.matchAll(pattern)) aliases.add(match[1]);\n }\n return [...aliases];\n}\n\nfunction findConditionalHookMode(\n source: string,\n): ConditionalHookModeSummary | null {\n const exported = exportedFunctionParameters(source);\n if (!exported) return null;\n\n const parameterNames = exported.parameters.map(parameterName);\n const controlledIndexes: number[] = [];\n const controlledNames: string[] = [];\n const conditionVariables: Record<string, number> = {};\n\n for (const [index, name] of parameterNames.entries()) {\n if (!name) continue;\n const aliases = conditionAliasesForParameter(source, name);\n let controlsHook = false;\n\n for (const alias of aliases) {\n const escaped = alias.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = [\n new RegExp(\n `\\\\bif\\\\s+${escaped}\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n new RegExp(\n `\\\\bif\\\\s+not\\\\s+${escaped}\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n new RegExp(\n `\\\\bif\\\\s+${escaped}\\\\s*(?:==|~=)\\\\s*(?:true|false|nil)\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n new RegExp(\n `\\\\bif\\\\s+(?:true|false|nil)\\\\s*(?:==|~=)\\\\s*${escaped}\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n ];\n\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n if (!branchContainsHookCall(match[1] ?? \"\")) continue;\n controlsHook = true;\n conditionVariables[alias] = index;\n break;\n }\n if (controlsHook) break;\n }\n }\n\n if (!controlsHook) continue;\n controlledIndexes.push(index);\n controlledNames.push(name);\n }\n\n if (controlledIndexes.length === 0) return null;\n return {\n name: exported.name,\n parameterIndexes: controlledIndexes,\n parameterNames: controlledNames,\n conditionVariables,\n knownCallSites: 0,\n dynamicCallSites: 0,\n };\n}\n\nfunction maskLuauNonCode(source: string): string {\n let result = \"\";\n let index = 0;\n while (index < source.length) {\n const char = source[index];\n const next = source[index + 1] ?? \"\";\n\n if (char === \"-\" && next === \"-\") {\n if (source[index + 2] === \"[\" && source[index + 3] === \"[\") {\n const end = source.indexOf(\"]]\", index + 4);\n const stop = end >= 0 ? end + 2 : source.length;\n const chunk = source.slice(index, stop);\n result += chunk.replace(/[^\\n]/g, \" \");\n index = stop;\n continue;\n }\n const end = source.indexOf(\"\\n\", index + 2);\n const stop = end >= 0 ? end : source.length;\n result += \" \".repeat(stop - index);\n index = stop;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const quote = char;\n let end = index + 1;\n while (end < source.length) {\n if (source[end] === \"\\\\\") {\n end += 2;\n continue;\n }\n if (source[end] === quote) {\n end += 1;\n break;\n }\n end += 1;\n }\n result += source.slice(index, end).replace(/[^\\n]/g, \" \");\n index = end;\n continue;\n }\n\n if (char === \"[\" && next === \"[\") {\n const end = source.indexOf(\"]]\", index + 2);\n const stop = end >= 0 ? end + 2 : source.length;\n result += source.slice(index, stop).replace(/[^\\n]/g, \" \");\n index = stop;\n continue;\n }\n\n result += char;\n index += 1;\n }\n return result;\n}\n\nfunction stableLiteralConstants(source: string): Map<string, string> {\n const result = new Map<string, string>();\n for (const match of source.matchAll(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(true|false|nil)\\s*$/gm,\n )) {\n const name = match[1];\n const assignments = [\n ...source.matchAll(\n new RegExp(\n `\\\\b${name.replace(/[.*+?^${}()|[\\\\]\\\\\\\\]/g, \"\\\\\\\\$&\")}\\\\s*=`,\n \"g\",\n ),\n ),\n ];\n if (assignments.length === 1) result.set(name, match[2]);\n }\n return result;\n}\n\nfunction isStableHookModeArgument(\n text: string | undefined,\n constants: Map<string, string>,\n): boolean {\n if (text === undefined) return true;\n let value = text.trim();\n while (value.startsWith(\"(\") && value.endsWith(\")\"))\n value = value.slice(1, -1).trim();\n if (/^(?:true|false|nil)$/.test(value)) return true;\n return constants.has(value);\n}\n\nfunction collectConditionalHookModeCallSites(\n records: SourceRecord[],\n aliases: Map<string, ConditionalHookModeSummary>,\n): void {\n for (const record of records) {\n const imports = new Map<string, ConditionalHookModeSummary>();\n for (const match of record.source.matchAll(\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)/gs,\n )) {\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n aliases,\n );\n if (summary) imports.set(match[1], summary);\n }\n if (imports.size === 0) continue;\n\n const masked = maskLuauNonCode(record.source);\n const constants = stableLiteralConstants(masked);\n for (const [localName, summary] of imports) {\n const escaped = localName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const callPattern = new RegExp(`\\\\b${escaped}\\\\s*\\\\(`, \"g\");\n for (const match of masked.matchAll(callPattern)) {\n if (match.index === undefined) continue;\n const open = masked.indexOf(\"(\", match.index);\n const argumentsText = extractCallArguments(record.source, open);\n if (argumentsText === null) continue;\n const args = splitTopLevelParameters(argumentsText);\n summary.knownCallSites += 1;\n if (\n summary.parameterIndexes.some(\n (index) => !isStableHookModeArgument(args[index], constants),\n )\n ) {\n summary.dynamicCallSites += 1;\n }\n }\n }\n }\n}\n\nfunction findExternalCallbackFunction(\n source: string,\n): ExternalCallbackFunctionSummary | null {\n const name = exportedFunctionName(source);\n if (!name || !EXTERNAL_UPDATE_SOURCE.test(source)) return null;\n const parameters = findFunctionParameters(source, name);\n if (parameters === null) return null;\n\n const callbackParameterIndexes: number[] = [];\n for (const [index, parameter] of splitTopLevelParameters(\n parameters,\n ).entries()) {\n const parameterName = parameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!parameterName) continue;\n const functionTyped = /->/.test(parameter);\n const semanticallyNamed = CALLBACK_PARAMETER_NAME.test(parameterName);\n const used = new RegExp(\n `\\\\b${parameterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`,\n ).test(source);\n if (used && (functionTyped || semanticallyNamed))\n callbackParameterIndexes.push(index);\n }\n\n if (callbackParameterIndexes.length === 0) return null;\n return {\n name,\n callbackParameterIndexes,\n highFrequency: sourceHasHighFrequencyRunService(source),\n };\n}\n\nfunction findBindingCandidateHook(\n source: string,\n): BindingCandidateHookSummary | null {\n const exported = source.match(\n /\\breturn\\s+(use[A-Z0-9_][A-Za-z0-9_]*)\\s*$/,\n )?.[1];\n if (!exported) return null;\n\n const stateMatches = [\n ...source.matchAll(\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(?:React\\.)?useState\\s*\\(/g,\n ),\n ];\n const directState =\n stateMatches.length === 1\n ? { valueName: stateMatches[0][1], setterName: stateMatches[0][2] }\n : null;\n const dualMode = directState\n ? null\n : findDualModeBindingStatePair(source, exported);\n if (!directState && !dualMode) return null;\n\n const valueName = directState?.valueName ?? dualMode!.valueName;\n const setterName = directState?.setterName ?? dualMode!.setterName;\n const escapedValue = valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedSetter = setterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n if (!new RegExp(`\\\\breturn\\\\s+${escapedValue}\\\\b`).test(source)) return null;\n const setterCalled = new RegExp(`\\\\b${escapedSetter}\\\\s*\\\\(`).test(source);\n const setterPassedToSubscription = new RegExp(\n `(?::|\\\\.)(?:Connect|Once|Subscribe|Observe|Listen|Watch)\\\\s*\\\\(\\\\s*${escapedSetter}\\\\b`,\n \"i\",\n ).test(source);\n if (!setterCalled && !setterPassedToSubscription) return null;\n\n const highFrequency = sourceHasHighFrequencyRunService(source);\n const external = highFrequency || EXTERNAL_UPDATE_SOURCE.test(source);\n if (!external) return null;\n\n const propertySignal = source.match(\n /GetPropertyChangedSignal\\s*\\(\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\)/,\n );\n const observedPropertyName = propertySignal?.[1] ?? null;\n const measurement = Boolean(\n observedPropertyName &&\n new RegExp(\n `\\\\[\\\\s*${observedPropertyName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\s*\\\\]`,\n ).test(source),\n );\n\n return {\n name: exported,\n highFrequency,\n external,\n sourceKind: measurement ? \"measurement\" : \"external-state\",\n ...(dualMode\n ? {\n bindingModeParameterIndex: dualMode.bindingModeParameterIndex,\n bindingModeParameterName: dualMode.bindingModeParameterName,\n bindingWhenTruthy: dualMode.bindingWhenTruthy,\n }\n : {}),\n };\n}\n\nfunction findDerivedBindingCandidateHook(\n source: string,\n bindingCandidateHooks: Map<string, BindingCandidateHookSummary>,\n): BindingCandidateHookSummary | null {\n const exported = source.match(\n /\\breturn\\s+(use[A-Z0-9_][A-Za-z0-9_]*)\\s*$/,\n )?.[1];\n if (!exported) return null;\n\n const stateMatches = [\n ...source.matchAll(\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(?:React\\.)?useState\\s*\\(/g,\n ),\n ];\n if (stateMatches.length !== 1) return null;\n const valueName = stateMatches[0][1];\n const setterName = stateMatches[0][2];\n const escapedValue = valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedSetter = setterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\breturn\\\\s+${escapedValue}\\\\b`).test(source)) return null;\n if (!new RegExp(`\\\\b${escapedSetter}\\\\s*\\\\(`).test(source)) return null;\n\n const requirePattern =\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)/gs;\n for (const match of source.matchAll(requirePattern)) {\n const localName = match[1];\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n bindingCandidateHooks,\n );\n if (!summary) continue;\n const escapedLocal = localName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\b${escapedLocal}\\\\s*\\\\(`).test(source)) continue;\n return {\n name: exported,\n highFrequency: summary.highFrequency,\n external: true,\n sourceKind: \"derived-external-state\",\n };\n }\n\n return null;\n}\n\nfunction extractCallArguments(source: string, open: number): string | null {\n if (open < 0 || source[open] !== \"(\") return null;\n\n let depth = 0;\n let quote: string | null = null;\n let longStringDepth = 0;\n let escaped = false;\n\n for (let index = open; index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1] ?? \"\";\n\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n\n if (longStringDepth > 0) {\n if (char === \"]\" && next === \"]\") {\n longStringDepth -= 1;\n index += 1;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"[\" && next === \"[\") {\n longStringDepth += 1;\n index += 1;\n continue;\n }\n if (char === \"(\") depth += 1;\n else if (char === \")\") {\n depth -= 1;\n if (depth === 0) return source.slice(open + 1, index);\n }\n }\n\n return null;\n}\n\nfunction findMemoCall(source: string): string | null {\n const direct = /\\breturn\\s+(?:React\\.)?memo\\s*\\(/g.exec(source);\n if (direct)\n return extractCallArguments(source, source.indexOf(\"(\", direct.index));\n\n const assigned =\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(?:React\\.)?memo\\s*\\(/g;\n for (\n let match = assigned.exec(source);\n match;\n match = assigned.exec(source)\n ) {\n const name = match[1].replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\breturn\\\\s+${name}\\\\b`).test(source.slice(match.index)))\n continue;\n return extractCallArguments(source, source.indexOf(\"(\", match.index));\n }\n\n return null;\n}\n\nfunction hasTopLevelComma(argumentsText: string): boolean {\n let round = 0;\n let square = 0;\n let curly = 0;\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < argumentsText.length; index += 1) {\n const char = argumentsText[index];\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"(\") round += 1;\n else if (char === \")\") round -= 1;\n else if (char === \"[\") square += 1;\n else if (char === \"]\") square -= 1;\n else if (char === \"{\") curly += 1;\n else if (char === \"}\") curly -= 1;\n else if (char === \",\" && round === 0 && square === 0 && curly === 0)\n return true;\n }\n return false;\n}\n\nfunction bindingNameAlternative(name: string): string | null {\n if (!/state/i.test(name)) return null;\n return name.replace(/state/gi, (match) => {\n if (match === match.toUpperCase()) return \"BINDING\";\n if (match[0] === match[0].toUpperCase()) return \"Binding\";\n return \"binding\";\n });\n}\n\nfunction findDeclaredMethods(source: string): Map<string, Set<string>> {\n const methods = new Map<string, Set<string>>();\n const patterns = [\n /\\bfunction\\s+([A-Za-z_][A-Za-z0-9_.]*)\\s*[:.]\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*(?:<[^>]*>)?\\s*\\(/g,\n /\\b([A-Za-z_][A-Za-z0-9_.]*)\\s*[:.]\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*function\\b/g,\n ];\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n const owner = match[1].toLowerCase();\n const names = methods.get(owner) ?? new Set<string>();\n names.add(match[2]);\n methods.set(owner, names);\n }\n }\n return methods;\n}\n\nfunction findBindingApiAlternativesFromMethodMaps(\n methodMaps: Iterable<Map<string, Set<string>>>,\n): Map<string, string> {\n const pairedAlternatives = new Map<string, Set<string>>();\n const unpairedStateNames = new Set<string>();\n\n for (const methods of methodMaps) {\n for (const names of methods.values()) {\n const byLower = new Map(\n [...names].map((name) => [name.toLowerCase(), name]),\n );\n for (const stateName of names) {\n const expected = bindingNameAlternative(stateName);\n if (!expected) continue;\n const bindingName = byLower.get(expected.toLowerCase());\n if (!bindingName) {\n unpairedStateNames.add(stateName.toLowerCase());\n continue;\n }\n const alternatives =\n pairedAlternatives.get(stateName) ?? new Set<string>();\n alternatives.add(bindingName);\n pairedAlternatives.set(stateName, alternatives);\n }\n }\n }\n\n const result = new Map<string, string>();\n for (const [stateName, alternatives] of pairedAlternatives) {\n if (\n alternatives.size === 1 &&\n !unpairedStateNames.has(stateName.toLowerCase())\n ) {\n result.set(stateName, [...alternatives][0]);\n }\n }\n return result;\n}\n\nconst NON_BINDABLE_HOST_FIELDS = new Set([\"ref\", \"key\", \"children\"]);\n\ninterface SourceRange {\n start: number;\n end: number;\n}\n\nfunction matchingDelimiter(\n source: string,\n open: number,\n openChar: string,\n closeChar: string,\n): number | null {\n let depth = 0;\n let quote: string | null = null;\n let escaped = false;\n let lineComment = false;\n let longString = false;\n\n for (let index = open; index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1] ?? \"\";\n\n if (lineComment) {\n if (char === \"\\n\") lineComment = false;\n continue;\n }\n if (longString) {\n if (char === \"]\" && next === \"]\") {\n longString = false;\n index += 1;\n }\n continue;\n }\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n\n if (char === \"-\" && next === \"-\") {\n if (source[index + 2] === \"[\" && source[index + 3] === \"[\") {\n longString = true;\n index += 3;\n } else {\n lineComment = true;\n index += 1;\n }\n continue;\n }\n if (char === \"[\" && next === \"[\") {\n longString = true;\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n\n if (char === openChar) depth += 1;\n else if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return index;\n }\n }\n\n return null;\n}\n\nfunction topLevelFieldRanges(\n source: string,\n open: number,\n close: number,\n): Array<{ name: string; value: SourceRange }> {\n const fields: Array<{ name: string; value: SourceRange }> = [];\n let start = open + 1;\n let round = 0;\n let square = 0;\n let curly = 0;\n let quote: string | null = null;\n let escaped = false;\n\n const addField = (segmentStart: number, segmentEnd: number) => {\n const segment = source.slice(segmentStart, segmentEnd);\n let equals = -1;\n let r = 0;\n let sq = 0;\n let cu = 0;\n let q: string | null = null;\n let esc = false;\n for (let i = 0; i < segment.length; i += 1) {\n const char = segment[i];\n if (q) {\n if (esc) esc = false;\n else if (char === \"\\\\\") esc = true;\n else if (char === q) q = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n q = char;\n continue;\n }\n if (char === \"(\") r += 1;\n else if (char === \")\") r = Math.max(0, r - 1);\n else if (char === \"[\") sq += 1;\n else if (char === \"]\") sq = Math.max(0, sq - 1);\n else if (char === \"{\") cu += 1;\n else if (char === \"}\") cu = Math.max(0, cu - 1);\n else if (char === \"=\" && r === 0 && sq === 0 && cu === 0) {\n equals = i;\n break;\n }\n }\n if (equals < 0) return;\n const key = segment.slice(0, equals).trim();\n const name =\n key.match(/^([A-Za-z_][A-Za-z0-9_]*)$/)?.[1] ??\n key.match(/^\\[\\s*[\"']([^\"']+)[\"']\\s*\\]$/)?.[1] ??\n null;\n if (!name || NON_BINDABLE_HOST_FIELDS.has(name)) return;\n let valueStart = segmentStart + equals + 1;\n while (valueStart < segmentEnd && /\\s/.test(source[valueStart]))\n valueStart += 1;\n fields.push({ name, value: { start: valueStart, end: segmentEnd } });\n };\n\n for (let index = open + 1; index < close; index += 1) {\n const char = source[index];\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"(\") round += 1;\n else if (char === \")\") round = Math.max(0, round - 1);\n else if (char === \"[\") square += 1;\n else if (char === \"]\") square = Math.max(0, square - 1);\n else if (char === \"{\") curly += 1;\n else if (char === \"}\") curly = Math.max(0, curly - 1);\n else if (char === \",\" && round === 0 && square === 0 && curly === 0) {\n addField(start, index);\n start = index + 1;\n }\n }\n addField(start, close);\n return fields;\n}\n\nfunction hostPropValueRanges(source: string): SourceRange[] {\n const ranges: SourceRange[] = [];\n const hostCall =\n /\\b(?:React\\.)?createElement\\s*\\(\\s*(?:\"[^\"]+\"|'[^']+')\\s*,\\s*\\{/g;\n for (const match of source.matchAll(hostCall)) {\n const open = match.index + match[0].lastIndexOf(\"{\");\n const close = matchingDelimiter(source, open, \"{\", \"}\");\n if (close === null) continue;\n for (const field of topLevelFieldRanges(source, open, close))\n ranges.push(field.value);\n }\n return ranges;\n}\n\nfunction exportedComponentImplementationName(source: string): string | null {\n const directMemo = source.match(\n /\\breturn\\s+(?:React\\.)?memo\\s*\\(\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\)\\s*$/,\n )?.[1];\n if (directMemo) return directMemo;\n\n const exported = exportedFunctionName(source);\n if (!exported) return null;\n if (findFunctionParameters(source, exported) !== null) return exported;\n\n const escaped = exported.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return (\n source.match(\n new RegExp(\n `\\\\blocal\\\\s+${escaped}\\\\s*=\\\\s*(?:React\\\\.)?memo\\\\s*\\\\(\\\\s*([A-Za-z_][A-Za-z0-9_]*)`,\n ),\n )?.[1] ?? null\n );\n}\n\nfunction findBindingCompatibleComponentProps(\n source: string,\n): Set<string> | null {\n const exported = exportedComponentImplementationName(source);\n if (!exported) return null;\n const parametersText = findFunctionParameters(source, exported);\n if (parametersText === null) return null;\n const firstParameter = splitTopLevelParameters(parametersText)[0] ?? \"\";\n const propsName = firstParameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!propsName) return null;\n\n const ranges = hostPropValueRanges(source);\n if (ranges.length === 0) return null;\n const escapedProps = propsName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const readPattern = new RegExp(\n `\\\\b${escapedProps}\\\\.([A-Za-z_][A-Za-z0-9_]*)\\\\b|\\\\b${escapedProps}\\\\[\\\\s*[\"']([^\"']+)[\"']\\\\s*\\\\]`,\n \"g\",\n );\n const reads = new Map<string, number[]>();\n for (const match of source.matchAll(readPattern)) {\n const property = match[1] ?? match[2];\n if (!property || match.index === undefined) continue;\n const offsets = reads.get(property) ?? [];\n offsets.push(match.index);\n reads.set(property, offsets);\n }\n\n const compatible = new Set<string>();\n for (const [property, offsets] of reads) {\n if (\n offsets.length > 0 &&\n offsets.every((offset) =>\n ranges.some((range) => offset >= range.start && offset < range.end),\n )\n ) {\n compatible.add(property);\n }\n }\n return compatible.size > 0 ? compatible : null;\n}\n\nfunction findStaticIterationTables(source: string): Set<string> | null {\n const match = /^return\\s*\\{/m.exec(source);\n if (!match || match.index === undefined) return null;\n const open = match.index + match[0].lastIndexOf(\"{\");\n const close = matchingDelimiter(source, open, \"{\", \"}\");\n if (close === null) return null;\n\n const result = new Set<string>([\"\"]);\n for (const field of topLevelFieldRanges(source, open, close)) {\n const valueText = source\n .slice(field.value.start, field.value.end)\n .trimStart();\n if (!valueText.startsWith(\"{\")) continue;\n result.add(field.name);\n }\n return result;\n}\n\nexport function buildProjectModel(\n root: string,\n candidates: ScanFileInput[],\n options: ProjectModelBuildOptions = {},\n): ProjectModel {\n const analyses: ProjectModelModuleAnalysis[] = [];\n\n for (const candidate of candidates) {\n if (\n candidate.source === undefined &&\n !fs.existsSync(candidate.absolutePath)\n ) continue;\n\n const relativePath = (candidate.relativePath ?? path.relative(root, candidate.absolutePath))\n .split(path.sep)\n .join(\"/\");\n const hash = options.fileHashes?.[relativePath] ?? \"\";\n const cached = options.moduleCache?.get(relativePath);\n if (cached && hash && cached.hash === hash) {\n analyses.push(cached.analysis);\n continue;\n }\n\n const source = candidate.source ?? fs.readFileSync(candidate.absolutePath, \"utf8\");\n const id = relativePath.toLowerCase();\n const record: SourceRecord = { id, source, keys: moduleKeys(relativePath) };\n const memoArguments = findMemoCall(source);\n const analysis: ProjectModelModuleAnalysis = {\n record,\n memoized: memoArguments === null\n ? undefined\n : hasTopLevelComma(memoArguments) ? \"custom\" : \"shallow\",\n bindingHook: findBindingCandidateHook(source) ?? undefined,\n callbackFunction: findExternalCallbackFunction(source) ?? undefined,\n bindingCompatibleProps: findBindingCompatibleComponentProps(source) ?? undefined,\n staticIterationTables: findStaticIterationTables(source) ?? undefined,\n conditionalHookMode: findConditionalHookMode(source) ?? undefined,\n declaredMethods: findDeclaredMethods(source),\n };\n analyses.push(analysis);\n if (options.moduleCache && hash) options.moduleCache.set(relativePath, { hash, analysis });\n }\n\n const records = analyses.map((analysis) => analysis.record);\n const memoizedByModule = new Map<string, \"shallow\" | \"custom\">();\n const bindingHooksByModule = new Map<string, BindingCandidateHookSummary>();\n const callbackFunctionsByModule = new Map<string, ExternalCallbackFunctionSummary>();\n const bindingCompatibleComponentPropsByModule = new Map<string, Set<string>>();\n const staticIterationTablesByModule = new Map<string, Set<string>>();\n const conditionalHookModesByModule = new Map<string, ConditionalHookModeSummary>();\n\n for (const analysis of analyses) {\n const id = analysis.record.id;\n if (analysis.memoized) memoizedByModule.set(id, analysis.memoized);\n if (analysis.bindingHook) bindingHooksByModule.set(id, { ...analysis.bindingHook });\n if (analysis.callbackFunction) callbackFunctionsByModule.set(id, {\n ...analysis.callbackFunction,\n callbackParameterIndexes: [...analysis.callbackFunction.callbackParameterIndexes],\n });\n if (analysis.bindingCompatibleProps) bindingCompatibleComponentPropsByModule.set(id, new Set(analysis.bindingCompatibleProps));\n if (analysis.staticIterationTables) staticIterationTablesByModule.set(id, new Set(analysis.staticIterationTables));\n if (analysis.conditionalHookMode) conditionalHookModesByModule.set(id, {\n ...analysis.conditionalHookMode,\n parameterIndexes: [...analysis.conditionalHookMode.parameterIndexes],\n parameterNames: [...analysis.conditionalHookMode.parameterNames],\n conditionVariables: { ...analysis.conditionalHookMode.conditionVariables },\n knownCallSites: 0,\n dynamicCallSites: 0,\n });\n }\n\n const conditionalHookModes = buildUniqueFeatureAliases(\n records,\n conditionalHookModesByModule,\n );\n collectConditionalHookModeCallSites(records, conditionalHookModes);\n\n let changed = true;\n while (changed) {\n changed = false;\n const aliases = buildUniqueFeatureAliases(records, bindingHooksByModule);\n for (const record of records) {\n if (bindingHooksByModule.has(record.id)) continue;\n const derived = findDerivedBindingCandidateHook(record.source, aliases);\n if (!derived) continue;\n bindingHooksByModule.set(record.id, derived);\n changed = true;\n }\n }\n\n return {\n memoizedModules: buildUniqueFeatureAliases(records, memoizedByModule),\n bindingCandidateHooks: buildUniqueFeatureAliases(records, bindingHooksByModule),\n externalCallbackModules: buildUniqueFeatureAliases(records, callbackFunctionsByModule),\n bindingApiAlternatives: findBindingApiAlternativesFromMethodMaps(\n analyses.map((analysis) => analysis.declaredMethods),\n ),\n bindingCompatibleComponentProps: buildUniqueFeatureAliases(\n records,\n bindingCompatibleComponentPropsByModule,\n ),\n staticIterationTables: buildUniqueFeatureAliases(\n records,\n staticIterationTablesByModule,\n ),\n conditionalHookModes,\n sourceEffects: new Map(),\n };\n}\n",
|
|
46
|
-
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Node as SyntaxNode, Tree } from \"web-tree-sitter\";\nimport {\n buildUniqueFeatureAliases,\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n type ModuleIdentity,\n} from \"./module-resolution\";\nimport { parseLuau } from \"./parser\";\nimport type { AnalysisWorkerPool } from \"./parallel\";\nimport type { ScanFileInput, SourceEffectModuleSummary } from \"./types\";\n\n\nexport interface ProjectEffectParseCacheEntry {\n source: string;\n tree: Tree;\n}\n\nexport type CachedMutationOrigin =\n | { kind: \"receiver\" }\n | { kind: \"parameter\"; index: number }\n | { kind: \"external\" }\n | { kind: \"local\" };\n\nexport interface CachedMutationCall {\n targetId: string;\n receiverOrigin: CachedMutationOrigin | null;\n argumentOrigins: Array<CachedMutationOrigin | null>;\n}\n\nexport interface CachedSourceEffectFunction {\n id: string;\n moduleId: string;\n localName: string | null;\n memberName: string | null;\n exported: boolean;\n directEffect: boolean;\n mutatesReceiver: boolean;\n mutatedParameterIndexes: number[];\n dependencies: string[];\n mutationCalls: CachedMutationCall[];\n}\n\nexport interface CachedSourceEffectModule {\n hash: string;\n id: string;\n keys: string[];\n importedModuleIds: string[];\n functions: CachedSourceEffectFunction[];\n instanceFactories: string[];\n}\n\nexport interface ProjectSourceEffectsBuildResult {\n effects: Map<string, SourceEffectModuleSummary>;\n cacheModules: Record<string, CachedSourceEffectModule>;\n}\n\nexport interface EffectWorkerIndexInput extends ModuleIdentity {\n relativePath: string;\n source: string;\n}\n\nexport interface IndexedEffectWorkerModule {\n id: string;\n relativePath: string;\n importedModuleIds: string[];\n instanceFactories: string[];\n exportedFunctionId?: string;\n}\n\nexport interface AnalyzedEffectWorkerModule {\n id: string;\n functions: CachedSourceEffectFunction[];\n}\n\nexport type ProjectEffectsProgressPhase =\n | \"parse\"\n | \"index-functions\"\n | \"analyze-calls\"\n | \"assemble-graph\"\n | \"resolve\"\n | \"propagate\"\n | \"summarize\";\n\nexport interface ProjectEffectsProgress {\n phase: ProjectEffectsProgressPhase;\n current: number;\n total: number;\n file?: string;\n}\n\ninterface ParsedRecord extends ModuleIdentity {\n source: string;\n tree: Tree;\n exportName: string | null;\n imports: Map<string, string>;\n}\n\ninterface MutationCall {\n targetId: string;\n receiverRoot: string | null;\n argumentRoots: Array<string | null>;\n}\n\ninterface FunctionRecord {\n id: string;\n moduleId: string;\n localName: string | null;\n memberName: string | null;\n exported: boolean;\n method: boolean;\n node: SyntaxNode;\n body: SyntaxNode;\n parameters: string[];\n directEffect: boolean;\n mutatesReceiver: boolean;\n mutatedParameterIndexes: Set<number>;\n dependencies: Set<string>;\n mutationCalls: MutationCall[];\n parameterOrigins: Map<string, number>;\n externalRoots: Set<string>;\n ownedRoots: Set<string>;\n localNames: Set<string>;\n}\n\nexport interface EffectWorkerState {\n relativePath: string;\n source: string;\n record: ParsedRecord;\n functions: FunctionRecord[];\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction child(node: SyntaxNode, type: string): SyntaxNode | null {\n return node.namedChildren.find((candidate) => candidate.type === type) ?? null;\n}\n\nfunction topLevelReturnName(root: SyntaxNode): string | null {\n for (const node of [...root.namedChildren].reverse()) {\n if (node.type !== \"return_statement\") continue;\n const expressions = child(node, \"expression_list\");\n const value = expressions?.namedChildren[0];\n if (value?.type === \"identifier\") return value.text;\n return null;\n }\n return null;\n}\n\nfunction topLevelImports(root: SyntaxNode, moduleAliases: Map<string, string>): Map<string, string> {\n const imports = new Map<string, string>();\n for (const node of root.namedChildren) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_call\") continue;\n const text = expression.text.trim();\n const match = text.match(/^require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const moduleId = resolveModuleReference(normalizeRequireTarget(match[1]), moduleAliases);\n if (moduleId) imports.set(names[index], moduleId);\n }\n }\n return imports;\n}\n\nfunction parameterNames(node: SyntaxNode): string[] {\n const parameters = child(node, \"parameters\");\n if (!parameters) return [];\n const result: string[] = [];\n for (const parameter of parameters.namedChildren) {\n if (parameter.type !== \"parameter\") continue;\n const identifier = parameter.namedChildren.find((candidate) => candidate.type === \"identifier\");\n if (identifier) result.push(identifier.text);\n }\n return result;\n}\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = child(node, \"assignment_statement\");\n const variables = assignment ? child(assignment, \"variable_list\") : child(node, \"variable_list\");\n const expressions = assignment ? child(assignment, \"expression_list\") : null;\n return {\n names: variables?.namedChildren.filter((candidate) => candidate.type === \"identifier\").map((candidate) => candidate.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction assignmentSides(node: SyntaxNode): { left: SyntaxNode[]; right: SyntaxNode[] } {\n if (node.type !== \"assignment_statement\") return { left: [], right: [] };\n return {\n left: child(node, \"variable_list\")?.namedChildren ?? [],\n right: child(node, \"expression_list\")?.namedChildren ?? [],\n };\n}\n\nfunction callPath(node: SyntaxNode): string | null {\n if (node.type !== \"function_call\") return null;\n const name = node.childForFieldName(\"name\") ?? node.namedChildren[0];\n return name ? name.text.replace(/\\s+/g, \"\") : null;\n}\n\nfunction rootIdentifier(node: SyntaxNode | null | undefined): string | null {\n if (!node) return null;\n if (node.type === \"identifier\") return node.text;\n if (\n node.type === \"dot_index_expression\" ||\n node.type === \"bracket_index_expression\" ||\n node.type === \"method_index_expression\"\n ) {\n return rootIdentifier(node.namedChildren[0]);\n }\n const text = node.text.trim();\n return text.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null;\n}\n\nfunction callArguments(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"function_call\") return [];\n return node.childForFieldName(\"arguments\")?.namedChildren ?? [];\n}\n\nfunction builtinMutatedArgumentIndexes(path: string, argumentCount: number): number[] {\n switch (path.replace(/\\s+/g, \"\")) {\n case \"rawset\":\n case \"setmetatable\":\n case \"table.clear\":\n case \"table.freeze\":\n case \"table.insert\":\n case \"table.remove\":\n case \"table.sort\":\n return argumentCount > 0 ? [0] : [];\n case \"table.move\":\n // table.move writes into the optional destination table, or back into the\n // source table when the destination argument is omitted.\n return argumentCount >= 5 ? [4] : argumentCount > 0 ? [0] : [];\n default:\n return [];\n }\n}\n\nfunction expressionCreatesOwnedValue(node: SyntaxNode, owned: Set<string>): boolean {\n if (node.type === \"table_constructor\" || node.type === \"function_definition\") return true;\n if (node.type !== \"function_call\") return false;\n\n const path = callPath(node)?.replace(/\\s+/g, \"\") ?? \"\";\n if (path === \"table.clone\" || path === \"table.create\" || path === \"table.pack\") return true;\n if (path !== \"setmetatable\" && path !== \"table.freeze\") return false;\n\n const first = callArguments(node)[0];\n if (!first) return false;\n if (first.type === \"table_constructor\") return true;\n const root = rootIdentifier(first);\n return Boolean(root && owned.has(root));\n}\n\nfunction directNodes(body: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n const visit = (node: SyntaxNode): void => {\n if (node !== body && (node.type === \"function_definition\" || node.type === \"function_declaration\")) return;\n result.push(node);\n for (const candidate of node.namedChildren) visit(candidate);\n };\n visit(body);\n return result;\n}\n\nfunction topLevelFunctionRecords(record: ParsedRecord): FunctionRecord[] {\n const functions: FunctionRecord[] = [];\n let anonymousExportIndex = 0;\n\n const add = (\n node: SyntaxNode,\n body: SyntaxNode | null,\n localName: string | null,\n memberName: string | null,\n method: boolean,\n exported: boolean,\n ): void => {\n if (!body) return;\n const key = memberName ? `member:${memberName}` : localName ? `local:${localName}` : `export:${anonymousExportIndex++}`;\n functions.push({\n id: `${record.id}::${key}`,\n moduleId: record.id,\n localName,\n memberName,\n exported,\n method,\n node,\n body,\n parameters: parameterNames(node),\n directEffect: false,\n mutatesReceiver: false,\n mutatedParameterIndexes: new Set<number>(),\n dependencies: new Set<string>(),\n mutationCalls: [],\n parameterOrigins: new Map<string, number>(),\n externalRoots: new Set<string>(),\n ownedRoots: new Set<string>(),\n localNames: new Set<string>(),\n });\n };\n\n for (const node of record.tree.rootNode.namedChildren) {\n if (node.type === \"function_declaration\") {\n const nameNode = node.namedChildren.find((candidate) =>\n [\"identifier\", \"dot_index_expression\", \"method_index_expression\"].includes(candidate.type),\n );\n const body = child(node, \"block\");\n const text = nameNode?.text.replace(/\\s+/g, \"\") ?? \"\";\n const methodMatch = text.match(/^([A-Za-z_][A-Za-z0-9_]*)[:.]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (methodMatch && methodMatch[1] === record.exportName) {\n add(node, body, null, methodMatch[2], nameNode?.type === \"method_index_expression\", false);\n } else if (nameNode?.type === \"identifier\") {\n add(node, body, text, null, false, record.exportName === text);\n }\n continue;\n }\n\n if (node.type === \"variable_declaration\") {\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_definition\") continue;\n add(expression, child(expression, \"block\"), names[index], null, false, record.exportName === names[index]);\n }\n continue;\n }\n\n if (node.type === \"assignment_statement\") {\n const { left, right } = assignmentSides(node);\n for (let index = 0; index < left.length; index += 1) {\n const expression = right[index] ?? right[0];\n if (expression?.type !== \"function_definition\") continue;\n const text = left[index].text.replace(/\\s+/g, \"\");\n const memberMatch = text.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (memberMatch && memberMatch[1] === record.exportName) {\n add(expression, child(expression, \"block\"), null, memberMatch[2], text.includes(\":\"), false);\n }\n }\n continue;\n }\n\n if (node.type === \"return_statement\") {\n const expressions = child(node, \"expression_list\");\n const expression = expressions?.namedChildren[0];\n if (expression?.type === \"function_definition\") add(expression, child(expression, \"block\"), null, null, false, true);\n }\n }\n\n return functions;\n}\n\n\nfunction returnedFactoryMember(fn: FunctionRecord, moduleExportName: string | null): boolean {\n if (!fn.memberName || !moduleExportName) return false;\n const header = fn.node.text.slice(0, Math.max(0, fn.body.startIndex - fn.node.startIndex));\n const escaped = moduleExportName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`:\\\\s*${escaped}\\\\b`).test(header)) return true;\n\n for (const node of directNodes(fn.body)) {\n if (node.type !== \"return_statement\") continue;\n if (new RegExp(`\\\\bsetmetatable\\\\s*\\\\([\\\\s\\\\S]*?\\\\b${escaped}\\\\b`).test(node.text)) return true;\n }\n return false;\n}\n\nfunction moduleLevelInstanceAliases(record: ParsedRecord, summariesByModuleId: Map<string, SourceEffectModuleSummary>): Map<string, string> {\n const result = new Map<string, string>();\n for (const node of record.tree.rootNode.namedChildren) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_call\") continue;\n const path = callPath(expression);\n const match = path?.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) continue;\n const moduleId = record.imports.get(match[1]);\n const summary = moduleId ? summariesByModuleId.get(moduleId) : null;\n if (moduleId && summary?.instanceFactories.has(match[2])) result.set(names[index], moduleId);\n }\n }\n return result;\n}\n\nfunction analyzeFunction(\n fn: FunctionRecord,\n record: ParsedRecord,\n localFunctions: Map<string, string>,\n memberFunctions: Map<string, string>,\n moduleSummaries: Map<string, SourceEffectModuleSummary>,\n moduleInstances: Map<string, string>,\n exportedFunctions: Map<string, string>,\n): void {\n const parameters = new Set(fn.parameters);\n const parameterOrigins = new Map<string, number>(fn.parameters.map((name, index) => [name, index] as const));\n if (fn.method) {\n parameters.add(\"self\");\n parameterOrigins.set(\"self\", -1);\n }\n const locals = new Set<string>();\n const owned = new Set<string>();\n const externalAliases = new Set<string>();\n const refLocals = new Set<string>();\n const instanceAliases = new Map(moduleInstances);\n const nodes = directNodes(fn.body);\n\n for (const node of nodes) {\n if (node.type === \"function_declaration\" && node.id !== fn.node.id) {\n const declared = node.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(declared)) locals.add(declared);\n continue;\n }\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n locals.add(name);\n if (!expression) continue;\n const createsOwnedValue = expressionCreatesOwnedValue(expression, owned);\n if (createsOwnedValue) owned.add(name);\n const root = rootIdentifier(expression);\n const parameterOrigin = root ? parameterOrigins.get(root) : undefined;\n if (!createsOwnedValue && root && parameterOrigin !== undefined) {\n // Keep argument/receiver mutation conditional. A caller may pass a fresh\n // render-local value, so it must not become an unconditional effect.\n parameterOrigins.set(name, parameterOrigin);\n } else if (!createsOwnedValue && root && (externalAliases.has(root) || (!locals.has(root) && root !== name))) {\n // Module/global state is externally observable regardless of call-site\n // ownership, so aliases of it remain safe to classify as effects.\n externalAliases.add(name);\n } else if (root && owned.has(root)) {\n owned.add(name);\n }\n\n if (expression.type === \"function_call\") {\n const path = callPath(expression)?.replace(/\\s+/g, \"\") ?? \"\";\n if (path === \"React.useRef\") refLocals.add(name);\n const match = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (match) {\n const moduleId = record.imports.get(match[1]);\n const summary = moduleId ? moduleSummaries.get(moduleId) : null;\n if (moduleId && summary?.instanceFactories.has(match[2])) instanceAliases.set(name, moduleId);\n }\n }\n }\n }\n\n fn.parameterOrigins = parameterOrigins;\n fn.externalRoots = externalAliases;\n fn.ownedRoots = owned;\n fn.localNames = locals;\n\n // Luau locals are lexically scoped from their declaration onward, so the\n // source-order pass above is enough to propagate aliases through local\n // declarations. Repeated fixed-point rescans of every function body were\n // redundant and particularly expensive on large modules.\n for (const node of nodes) {\n if (node.type === \"assignment_statement\" && node.parent?.type !== \"variable_declaration\") {\n const { left } = assignmentSides(node);\n for (const target of left) {\n if (target.type === \"identifier\") {\n if (!locals.has(target.text) && !parameters.has(target.text)) fn.directEffect = true;\n continue;\n }\n const root = rootIdentifier(target);\n if (!root) continue;\n if (owned.has(root)) continue;\n if (refLocals.has(root) && target.text.replace(/\\s+/g, \"\") === `${root}.current`) continue;\n const parameterOrigin = parameterOrigins.get(root);\n if (parameterOrigin !== undefined) {\n if (parameterOrigin === -1) fn.mutatesReceiver = true;\n else fn.mutatedParameterIndexes.add(parameterOrigin);\n continue;\n }\n if (externalAliases.has(root) || !locals.has(root)) fn.directEffect = true;\n }\n continue;\n }\n\n if (node.type !== \"function_call\") continue;\n const path = callPath(node);\n if (!path) continue;\n const arguments_ = callArguments(node);\n\n for (const index of builtinMutatedArgumentIndexes(path, arguments_.length)) {\n markMutationThroughRoot(fn, rootIdentifier(arguments_[index]));\n }\n\n const localTarget = !locals.has(path) && !parameters.has(path) ? localFunctions.get(path) : null;\n if (localTarget) {\n fn.dependencies.add(localTarget);\n fn.mutationCalls.push({\n targetId: localTarget,\n receiverRoot: null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n\n const sameMember = path.match(/^([A-Za-z_][A-Za-z0-9_]*)([:.])([A-Za-z_][A-Za-z0-9_]*)$/);\n if (sameMember) {\n const receiver = sameMember[1];\n if (receiver === \"self\" || (receiver === record.exportName && !locals.has(receiver) && !parameters.has(receiver))) {\n const target = memberFunctions.get(sameMember[3]);\n if (target) {\n fn.dependencies.add(target);\n fn.mutationCalls.push({\n targetId: target,\n receiverRoot: sameMember[2] === \":\" ? receiver : null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n }\n }\n\n const importedMember = path.match(/^([A-Za-z_][A-Za-z0-9_]*)([.:])([A-Za-z_][A-Za-z0-9_]*)$/);\n if (importedMember) {\n const root = importedMember[1];\n const moduleId = instanceAliases.get(root)\n ?? (!locals.has(root) && !parameters.has(root) ? record.imports.get(root) : undefined);\n if (moduleId) {\n const target = `${moduleId}::member:${importedMember[3]}`;\n fn.dependencies.add(target);\n fn.mutationCalls.push({\n targetId: target,\n receiverRoot: importedMember[2] === \":\" ? root : null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n } else if (!locals.has(path) && !parameters.has(path)) {\n const moduleId = record.imports.get(path);\n const target = moduleId ? exportedFunctions.get(moduleId) : null;\n if (target) {\n fn.dependencies.add(target);\n fn.mutationCalls.push({\n targetId: target,\n receiverRoot: null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n }\n }\n}\n\nfunction markMutationThroughRoot(fn: FunctionRecord, root: string | null): boolean {\n if (!root) return false;\n const parameterOrigin = fn.parameterOrigins.get(root);\n if (parameterOrigin !== undefined) {\n if (parameterOrigin === -1) {\n if (fn.mutatesReceiver) return false;\n fn.mutatesReceiver = true;\n return true;\n }\n if (fn.mutatedParameterIndexes.has(parameterOrigin)) return false;\n fn.mutatedParameterIndexes.add(parameterOrigin);\n return true;\n }\n\n if (fn.ownedRoots.has(root)) return false;\n if (fn.externalRoots.has(root) || !fn.localNames.has(root)) {\n if (fn.directEffect) return false;\n fn.directEffect = true;\n return true;\n }\n if (fn.localNames.has(root)) return false;\n return false;\n}\n\nfunction propagateLocalMutationEffects(functions: FunctionRecord[]): void {\n const byId = new Map(functions.map((fn) => [fn.id, fn] as const));\n let changed = true;\n while (changed) {\n changed = false;\n for (const fn of functions) {\n for (const call of fn.mutationCalls) {\n const target = byId.get(call.targetId);\n if (!target) continue;\n if (target.mutatesReceiver && markMutationThroughRoot(fn, call.receiverRoot)) changed = true;\n for (const index of target.mutatedParameterIndexes) {\n if (markMutationThroughRoot(fn, call.argumentRoots[index] ?? null)) changed = true;\n }\n }\n }\n }\n}\n\nfunction mutationOriginForRoot(fn: FunctionRecord, root: string | null): CachedMutationOrigin | null {\n if (!root) return null;\n const parameterOrigin = fn.parameterOrigins.get(root);\n if (parameterOrigin === -1) return { kind: \"receiver\" };\n if (parameterOrigin !== undefined) return { kind: \"parameter\", index: parameterOrigin };\n if (fn.ownedRoots.has(root) || fn.localNames.has(root)) return { kind: \"local\" };\n if (fn.externalRoots.has(root) || !fn.localNames.has(root)) return { kind: \"external\" };\n return null;\n}\n\nfunction cachedMutationCalls(fn: FunctionRecord): CachedMutationCall[] {\n return fn.mutationCalls.map((call) => ({\n targetId: call.targetId,\n receiverOrigin: mutationOriginForRoot(fn, call.receiverRoot),\n argumentOrigins: call.argumentRoots.map((root) => mutationOriginForRoot(fn, root)),\n }));\n}\n\nfunction applyCachedMutationOrigin(fn: CachedSourceEffectFunction, origin: CachedMutationOrigin | null): boolean {\n if (!origin || origin.kind === \"local\") return false;\n if (origin.kind === \"external\") {\n if (fn.directEffect) return false;\n fn.directEffect = true;\n return true;\n }\n if (origin.kind === \"receiver\") {\n if (fn.mutatesReceiver) return false;\n fn.mutatesReceiver = true;\n return true;\n }\n if (fn.mutatedParameterIndexes.includes(origin.index)) return false;\n fn.mutatedParameterIndexes.push(origin.index);\n fn.mutatedParameterIndexes.sort((a, b) => a - b);\n return true;\n}\n\nfunction propagateMutationEffects(functions: CachedSourceEffectFunction[]): void {\n const byId = new Map(functions.map((fn) => [fn.id, fn] as const));\n let changed = true;\n while (changed) {\n changed = false;\n for (const fn of functions) {\n for (const call of fn.mutationCalls) {\n const target = byId.get(call.targetId);\n if (!target) continue;\n if (target.mutatesReceiver && applyCachedMutationOrigin(fn, call.receiverOrigin)) changed = true;\n for (const index of target.mutatedParameterIndexes) {\n if (applyCachedMutationOrigin(fn, call.argumentOrigins[index] ?? null)) changed = true;\n }\n }\n }\n }\n}\n\nexport async function indexEffectModuleForWorker(\n input: EffectWorkerIndexInput,\n moduleAliases: Map<string, string>,\n): Promise<{ indexed: IndexedEffectWorkerModule; state: EffectWorkerState; tree: Tree }> {\n const tree = await parseLuau(input.source);\n const imports = topLevelImports(tree.rootNode, moduleAliases);\n\n const record: ParsedRecord = {\n id: input.id,\n keys: input.keys,\n source: input.source,\n tree,\n exportName: topLevelReturnName(tree.rootNode),\n imports,\n };\n const functions = topLevelFunctionRecords(record);\n const instanceFactories: string[] = [];\n for (const fn of functions) {\n if (fn.memberName && returnedFactoryMember(fn, record.exportName)) instanceFactories.push(fn.memberName);\n }\n const exportedFunctionId = functions.find((fn) => fn.exported && !fn.memberName)?.id;\n\n return {\n indexed: {\n id: input.id,\n relativePath: input.relativePath,\n importedModuleIds: [...new Set(imports.values())].sort(),\n instanceFactories: instanceFactories.sort(),\n exportedFunctionId,\n },\n state: { relativePath: input.relativePath, source: input.source, record, functions },\n tree,\n };\n}\n\nexport function analyzeEffectModuleForWorker(\n state: EffectWorkerState,\n moduleSummaries: Map<string, SourceEffectModuleSummary>,\n exportedFunctions: Map<string, string>,\n): AnalyzedEffectWorkerModule {\n const localFunctions = new Map<string, string>();\n const memberFunctions = new Map<string, string>();\n for (const fn of state.functions) {\n if (fn.localName) localFunctions.set(fn.localName, fn.id);\n if (fn.memberName) memberFunctions.set(fn.memberName, fn.id);\n }\n const moduleInstances = moduleLevelInstanceAliases(state.record, moduleSummaries);\n for (const fn of state.functions) {\n analyzeFunction(fn, state.record, localFunctions, memberFunctions, moduleSummaries, moduleInstances, exportedFunctions);\n }\n propagateLocalMutationEffects(state.functions);\n return {\n id: state.record.id,\n functions: state.functions.map((fn) => ({\n id: fn.id,\n moduleId: fn.moduleId,\n localName: fn.localName,\n memberName: fn.memberName,\n exported: fn.exported,\n directEffect: fn.directEffect,\n mutatesReceiver: fn.mutatesReceiver,\n mutatedParameterIndexes: [...fn.mutatedParameterIndexes].sort((a, b) => a - b),\n dependencies: [...fn.dependencies].sort(),\n mutationCalls: cachedMutationCalls(fn),\n })),\n };\n}\n\nexport async function buildProjectSourceEffects(\n root: string,\n candidates: ScanFileInput[],\n parseCache?: Map<string, ProjectEffectParseCacheEntry>,\n onProgress?: (progress: ProjectEffectsProgress) => void,\n fileHashes: Readonly<Record<string, string>> = {},\n cachedModules: Readonly<Record<string, CachedSourceEffectModule>> = {},\n workerPool?: AnalysisWorkerPool,\n): Promise<ProjectSourceEffectsBuildResult> {\n interface CandidateIdentity extends ModuleIdentity {\n relativePath: string;\n candidate: ScanFileInput;\n hash: string;\n }\n\n const identities: CandidateIdentity[] = [];\n for (const candidate of candidates) {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n const id = relativePath.toLowerCase();\n identities.push({\n id,\n keys: moduleKeys(relativePath),\n relativePath,\n candidate,\n hash: fileHashes[relativePath] ?? \"\",\n });\n }\n\n const moduleIdFeatures = new Map(identities.map((record) => [record.id, record.id] as const));\n const moduleAliases = buildUniqueFeatureAliases(identities, moduleIdFeatures);\n const currentIds = new Set(identities.map((identity) => identity.id));\n const cachedIds = new Set(Object.values(cachedModules).map((module) => module.id));\n const sameFileSet = currentIds.size === cachedIds.size && [...currentIds].every((id) => cachedIds.has(id));\n\n const dirtyIds = new Set<string>();\n if (!sameFileSet) {\n for (const identity of identities) dirtyIds.add(identity.id);\n } else {\n for (const identity of identities) {\n const cached = cachedModules[identity.relativePath];\n if (!cached || cached.hash !== identity.hash) dirtyIds.add(identity.id);\n }\n\n // A changed module can alter whether one of its members is an instance\n // factory. Re-analyze direct importers so instance-method dependencies are\n // refreshed, while all other unchanged modules keep their cached graph.\n if (dirtyIds.size > 0) {\n for (const module of Object.values(cachedModules)) {\n if (module.importedModuleIds.some((moduleId) => dirtyIds.has(moduleId))) dirtyIds.add(module.id);\n }\n }\n }\n\n const cachedFunctionStates = new Map<string, CachedSourceEffectFunction[]>();\n const analyzedFunctionStatesByModule = new Map<string, CachedSourceEffectFunction[]>();\n const importedModuleIdsByModule = new Map<string, string[]>();\n const summariesByModuleId = new Map<string, SourceEffectModuleSummary>();\n const exportedFunctions = new Map<string, string>();\n\n if (workerPool && dirtyIds.size >= 16) {\n const workerInputs: EffectWorkerIndexInput[] = [];\n for (const identity of identities) {\n if (!dirtyIds.has(identity.id)) continue;\n const { candidate } = identity;\n if (candidate.source === undefined && !fs.existsSync(candidate.absolutePath)) continue;\n workerInputs.push({\n id: identity.id,\n keys: identity.keys,\n relativePath: identity.relativePath,\n source: candidate.source ?? fs.readFileSync(candidate.absolutePath, \"utf8\"),\n });\n }\n\n let parsedCount = identities.length - workerInputs.length;\n onProgress?.({ phase: \"parse\", current: parsedCount, total: candidates.length });\n const indexedModules = await workerPool.indexEffectModules(workerInputs, moduleAliases, (count, file) => {\n parsedCount += count;\n onProgress?.({ phase: \"parse\", current: Math.min(parsedCount, candidates.length), total: candidates.length, file });\n });\n onProgress?.({ phase: \"parse\", current: candidates.length, total: candidates.length });\n\n const indexedById = new Map(indexedModules.map((module) => [module.id, module] as const));\n const functionIndexTotal = Math.max(1, identities.length * 2);\n onProgress?.({ phase: \"index-functions\", current: 0, total: functionIndexTotal });\n\n for (let identityIndex = 0; identityIndex < identities.length; identityIndex += 1) {\n const identity = identities[identityIndex];\n const indexed = indexedById.get(identity.id);\n if (indexed) {\n importedModuleIdsByModule.set(identity.id, indexed.importedModuleIds);\n summariesByModuleId.set(identity.id, {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set(indexed.instanceFactories),\n });\n if (indexed.exportedFunctionId) exportedFunctions.set(identity.id, indexed.exportedFunctionId);\n } else {\n const cached = cachedModules[identity.relativePath];\n const functions = cached?.functions ?? [];\n cachedFunctionStates.set(identity.id, functions);\n importedModuleIdsByModule.set(identity.id, cached?.importedModuleIds ?? []);\n summariesByModuleId.set(identity.id, {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set(cached?.instanceFactories ?? []),\n });\n const exported = functions.find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n }\n if ((identityIndex & 63) === 63 || identityIndex + 1 === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: Math.min(functionIndexTotal, identityIndex + 1), total: functionIndexTotal });\n }\n }\n onProgress?.({ phase: \"index-functions\", current: functionIndexTotal, total: functionIndexTotal });\n\n const callAnalysisTotal = Math.max(1, indexedModules.length);\n let analyzedCount = 0;\n onProgress?.({ phase: \"analyze-calls\", current: 0, total: callAnalysisTotal });\n const analyzedModules = await workerPool.analyzeEffectModules(summariesByModuleId, exportedFunctions, (count) => {\n analyzedCount += count;\n onProgress?.({ phase: \"analyze-calls\", current: Math.min(analyzedCount, callAnalysisTotal), total: callAnalysisTotal });\n });\n for (const module of analyzedModules) analyzedFunctionStatesByModule.set(module.id, module.functions);\n onProgress?.({ phase: \"analyze-calls\", current: callAnalysisTotal, total: callAnalysisTotal });\n } else {\n const rawRecords = new Map<string, ParsedRecord>();\n onProgress?.({ phase: \"parse\", current: 0, total: candidates.length });\n for (let candidateIndex = 0; candidateIndex < identities.length; candidateIndex += 1) {\n const identity = identities[candidateIndex];\n const { candidate, relativePath } = identity;\n try {\n if (!dirtyIds.has(identity.id)) continue;\n if (candidate.source === undefined && !fs.existsSync(candidate.absolutePath)) continue;\n const source = candidate.source ?? fs.readFileSync(candidate.absolutePath, \"utf8\");\n const tree = await parseLuau(source);\n parseCache?.set(relativePath, { source, tree });\n const imports = topLevelImports(tree.rootNode, moduleAliases);\n rawRecords.set(identity.id, {\n id: identity.id,\n keys: identity.keys,\n source,\n tree,\n exportName: topLevelReturnName(tree.rootNode),\n imports,\n });\n } catch {\n // Parse diagnostics are handled by the normal scanner. An unparseable module\n // simply cannot contribute source-derived effect information.\n } finally {\n onProgress?.({ phase: \"parse\", current: candidateIndex + 1, total: candidates.length, file: relativePath });\n }\n }\n\n const functionIndexTotal = Math.max(1, identities.length * 2);\n onProgress?.({ phase: \"index-functions\", current: 0, total: functionIndexTotal });\n const functionsByModule = new Map<string, FunctionRecord[]>();\n\n for (const identity of identities) {\n const record = rawRecords.get(identity.id);\n if (record) {\n const functions = topLevelFunctionRecords(record);\n functionsByModule.set(identity.id, functions);\n importedModuleIdsByModule.set(identity.id, [...new Set(record.imports.values())].sort());\n const summary: SourceEffectModuleSummary = {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set<string>(),\n };\n for (const fn of functions) {\n if (fn.memberName && returnedFactoryMember(fn, record.exportName)) summary.instanceFactories.add(fn.memberName);\n }\n summariesByModuleId.set(identity.id, summary);\n } else {\n const cached = cachedModules[identity.relativePath];\n cachedFunctionStates.set(identity.id, cached?.functions ?? []);\n importedModuleIdsByModule.set(identity.id, cached?.importedModuleIds ?? []);\n summariesByModuleId.set(identity.id, {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set(cached?.instanceFactories ?? []),\n });\n }\n const indexedCount = summariesByModuleId.size;\n if ((indexedCount & 63) === 0 || indexedCount === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: indexedCount, total: functionIndexTotal });\n }\n }\n\n for (let identityIndex = 0; identityIndex < identities.length; identityIndex += 1) {\n const identity = identities[identityIndex];\n const parsedFunctions = functionsByModule.get(identity.id);\n if (parsedFunctions) {\n const exported = parsedFunctions.find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n } else {\n const exported = (cachedFunctionStates.get(identity.id) ?? []).find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n }\n if ((identityIndex & 63) === 63 || identityIndex + 1 === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: identities.length + identityIndex + 1, total: functionIndexTotal });\n }\n }\n\n const callAnalysisTotal = Math.max(1, rawRecords.size);\n onProgress?.({ phase: \"analyze-calls\", current: 0, total: callAnalysisTotal });\n let analyzedModuleCount = 0;\n for (const [moduleId, record] of rawRecords) {\n const localFunctions = new Map<string, string>();\n const memberFunctions = new Map<string, string>();\n const functions = functionsByModule.get(moduleId) ?? [];\n for (const fn of functions) {\n if (fn.localName) localFunctions.set(fn.localName, fn.id);\n if (fn.memberName) memberFunctions.set(fn.memberName, fn.id);\n }\n const moduleInstances = moduleLevelInstanceAliases(record, summariesByModuleId);\n for (const fn of functions) {\n analyzeFunction(fn, record, localFunctions, memberFunctions, summariesByModuleId, moduleInstances, exportedFunctions);\n }\n propagateLocalMutationEffects(functions);\n analyzedFunctionStatesByModule.set(moduleId, functions.map((fn) => ({\n id: fn.id,\n moduleId: fn.moduleId,\n localName: fn.localName,\n memberName: fn.memberName,\n exported: fn.exported,\n directEffect: fn.directEffect,\n mutatesReceiver: fn.mutatesReceiver,\n mutatedParameterIndexes: [...fn.mutatedParameterIndexes].sort((a, b) => a - b),\n dependencies: [...fn.dependencies].sort(),\n mutationCalls: cachedMutationCalls(fn),\n })));\n analyzedModuleCount += 1;\n if ((analyzedModuleCount & 31) === 0 || analyzedModuleCount === rawRecords.size) {\n onProgress?.({ phase: \"analyze-calls\", current: analyzedModuleCount, total: callAnalysisTotal });\n }\n }\n }\n\n const graphAssemblyTotal = Math.max(1, identities.length);\n onProgress?.({ phase: \"assemble-graph\", current: 0, total: graphAssemblyTotal });\n const functionStates = new Map<string, CachedSourceEffectFunction>();\n const cacheModulesResult: Record<string, CachedSourceEffectModule> = {};\n let assembledCount = 0;\n for (const identity of identities) {\n const states: CachedSourceEffectFunction[] = (analyzedFunctionStatesByModule.get(identity.id) ?? cachedFunctionStates.get(identity.id) ?? [])\n .map((fn) => ({\n ...fn,\n mutatesReceiver: fn.mutatesReceiver ?? false,\n mutatedParameterIndexes: [...(fn.mutatedParameterIndexes ?? [])],\n dependencies: [...fn.dependencies],\n mutationCalls: [...(fn.mutationCalls ?? [])],\n }));\n for (const fn of states) functionStates.set(fn.id, fn);\n const summary = summariesByModuleId.get(identity.id)!;\n cacheModulesResult[identity.relativePath] = {\n hash: identity.hash,\n id: identity.id,\n keys: identity.keys,\n importedModuleIds: importedModuleIdsByModule.get(identity.id) ?? [],\n functions: states,\n instanceFactories: [...summary.instanceFactories].sort(),\n };\n assembledCount += 1;\n if ((assembledCount & 63) === 0 || assembledCount === identities.length) {\n onProgress?.({ phase: \"assemble-graph\", current: assembledCount, total: graphAssemblyTotal });\n }\n }\n\n // Parameter/receiver mutation is conditional on what each caller passes.\n // Resolve that information across the complete project graph before seeding\n // unconditional side effects, so wrappers preserve precise parameter effects\n // instead of becoming globally impure.\n propagateMutationEffects([...functionStates.values()]);\n\n // Build a reverse dependency graph once, then propagate effectfulness only\n // through callers that can actually become affected. This avoids repeatedly\n // rescanning every function until a fixed point is reached.\n const reverseDependencies = new Map<string, string[]>();\n const functions = [...functionStates.values()];\n onProgress?.({ phase: \"resolve\", current: 0, total: functions.length });\n for (let index = 0; index < functions.length; index += 1) {\n const fn = functions[index];\n for (const dependency of fn.dependencies) {\n if (!functionStates.has(dependency)) continue;\n const dependents = reverseDependencies.get(dependency);\n if (dependents) dependents.push(fn.id);\n else reverseDependencies.set(dependency, [fn.id]);\n }\n if ((index & 127) === 127 || index + 1 === functions.length) {\n onProgress?.({ phase: \"resolve\", current: index + 1, total: functions.length });\n }\n }\n\n const effectful = new Set<string>();\n const queue: string[] = [];\n for (const fn of functions) {\n if (!fn.directEffect) continue;\n effectful.add(fn.id);\n queue.push(fn.id);\n }\n\n onProgress?.({ phase: \"propagate\", current: 0, total: Math.max(1, functions.length) });\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const effectfulId = queue[queueIndex++];\n for (const dependent of reverseDependencies.get(effectfulId) ?? []) {\n if (effectful.has(dependent)) continue;\n effectful.add(dependent);\n queue.push(dependent);\n }\n if ((queueIndex & 63) === 0 || queueIndex === queue.length) {\n onProgress?.({ phase: \"propagate\", current: Math.min(queueIndex, Math.max(1, functions.length)), total: Math.max(1, functions.length) });\n }\n }\n // The work queue may visit only the effectful subset of the graph. Explicitly\n // mark the phase complete once the queue is exhausted instead of leaving a\n // partially filled progress bar behind.\n onProgress?.({ phase: \"propagate\", current: Math.max(1, functions.length), total: Math.max(1, functions.length) });\n\n const summarizeTotal = Math.max(1, functions.length + 1);\n onProgress?.({ phase: \"summarize\", current: 0, total: summarizeTotal });\n for (const summary of summariesByModuleId.values()) {\n summary.effectfulMembers.clear();\n summary.effectfulExport = false;\n summary.mutatingMembers.clear();\n summary.mutatingExportParameters.clear();\n summary.mutatingMemberParameters.clear();\n summary.localMutatingParameters.clear();\n }\n for (let index = 0; index < functions.length; index += 1) {\n const fn = functions[index];\n const summary = summariesByModuleId.get(fn.moduleId);\n if (summary && fn.memberName && fn.mutatesReceiver) summary.mutatingMembers.add(fn.memberName);\n if (summary && fn.mutatedParameterIndexes.length > 0) {\n if (fn.exported && !fn.memberName) {\n for (const parameterIndex of fn.mutatedParameterIndexes) summary.mutatingExportParameters.add(parameterIndex);\n }\n if (fn.memberName) {\n summary.mutatingMemberParameters.set(fn.memberName, new Set(fn.mutatedParameterIndexes));\n }\n if (fn.localName) {\n summary.localMutatingParameters.set(fn.localName, new Set(fn.mutatedParameterIndexes));\n }\n }\n if (summary && effectful.has(fn.id)) {\n if (fn.memberName) summary.effectfulMembers.add(fn.memberName);\n if (fn.exported) summary.effectfulExport = true;\n }\n if ((index & 127) === 127 || index + 1 === functions.length) {\n onProgress?.({ phase: \"summarize\", current: index + 1, total: summarizeTotal });\n }\n }\n\n // Alias construction can still be noticeable on large projects, so reserve\n // the final progress unit until it is genuinely complete.\n const effects = buildUniqueFeatureAliases(identities, summariesByModuleId);\n onProgress?.({ phase: \"summarize\", current: summarizeTotal, total: summarizeTotal });\n\n return {\n effects,\n cacheModules: cacheModulesResult,\n };\n}\n\n",
|
|
46
|
+
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { SyntaxNode, SyntaxTree } from \"./syntax\";\nimport {\n buildUniqueFeatureAliases,\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n type ModuleIdentity,\n} from \"./module-resolution\";\nimport { parseLuau } from \"./parser\";\nimport type { AnalysisWorkerPool } from \"./parallel\";\nimport type { ScanFileInput, SourceEffectModuleSummary } from \"./types\";\n\n\nexport interface ProjectEffectParseCacheEntry {\n source: string;\n tree: SyntaxTree;\n}\n\nexport type CachedMutationOrigin =\n | { kind: \"receiver\" }\n | { kind: \"parameter\"; index: number }\n | { kind: \"external\" }\n | { kind: \"local\" };\n\nexport interface CachedMutationCall {\n targetId: string;\n receiverOrigin: CachedMutationOrigin | null;\n argumentOrigins: Array<CachedMutationOrigin | null>;\n}\n\nexport interface CachedSourceEffectFunction {\n id: string;\n moduleId: string;\n localName: string | null;\n memberName: string | null;\n exported: boolean;\n directEffect: boolean;\n mutatesReceiver: boolean;\n mutatedParameterIndexes: number[];\n dependencies: string[];\n mutationCalls: CachedMutationCall[];\n}\n\nexport interface CachedSourceEffectModule {\n hash: string;\n id: string;\n keys: string[];\n importedModuleIds: string[];\n functions: CachedSourceEffectFunction[];\n instanceFactories: string[];\n}\n\nexport interface ProjectSourceEffectsBuildResult {\n effects: Map<string, SourceEffectModuleSummary>;\n cacheModules: Record<string, CachedSourceEffectModule>;\n}\n\nexport interface EffectWorkerIndexInput extends ModuleIdentity {\n relativePath: string;\n source: string;\n}\n\nexport interface IndexedEffectWorkerModule {\n id: string;\n relativePath: string;\n importedModuleIds: string[];\n instanceFactories: string[];\n exportedFunctionId?: string;\n}\n\nexport interface AnalyzedEffectWorkerModule {\n id: string;\n functions: CachedSourceEffectFunction[];\n}\n\nexport type ProjectEffectsProgressPhase =\n | \"parse\"\n | \"index-functions\"\n | \"analyze-calls\"\n | \"assemble-graph\"\n | \"resolve\"\n | \"propagate\"\n | \"summarize\";\n\nexport interface ProjectEffectsProgress {\n phase: ProjectEffectsProgressPhase;\n current: number;\n total: number;\n file?: string;\n}\n\ninterface ParsedRecord extends ModuleIdentity {\n source: string;\n tree: SyntaxTree;\n exportName: string | null;\n imports: Map<string, string>;\n}\n\ninterface MutationCall {\n targetId: string;\n receiverRoot: string | null;\n argumentRoots: Array<string | null>;\n}\n\ninterface FunctionRecord {\n id: string;\n moduleId: string;\n localName: string | null;\n memberName: string | null;\n exported: boolean;\n method: boolean;\n node: SyntaxNode;\n body: SyntaxNode;\n parameters: string[];\n directEffect: boolean;\n mutatesReceiver: boolean;\n mutatedParameterIndexes: Set<number>;\n dependencies: Set<string>;\n mutationCalls: MutationCall[];\n parameterOrigins: Map<string, number>;\n externalRoots: Set<string>;\n ownedRoots: Set<string>;\n localNames: Set<string>;\n}\n\nexport interface EffectWorkerState {\n relativePath: string;\n source: string;\n record: ParsedRecord;\n functions: FunctionRecord[];\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction child(node: SyntaxNode, type: string): SyntaxNode | null {\n return node.namedChildren.find((candidate) => candidate.type === type) ?? null;\n}\n\nfunction topLevelReturnName(root: SyntaxNode): string | null {\n for (const node of [...root.namedChildren].reverse()) {\n if (node.type !== \"return_statement\") continue;\n const expressions = child(node, \"expression_list\");\n const value = expressions?.namedChildren[0];\n if (value?.type === \"identifier\") return value.text;\n return null;\n }\n return null;\n}\n\nfunction topLevelImports(root: SyntaxNode, moduleAliases: Map<string, string>): Map<string, string> {\n const imports = new Map<string, string>();\n for (const node of root.namedChildren) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_call\") continue;\n const text = expression.text.trim();\n const match = text.match(/^require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const moduleId = resolveModuleReference(normalizeRequireTarget(match[1]), moduleAliases);\n if (moduleId) imports.set(names[index], moduleId);\n }\n }\n return imports;\n}\n\nfunction parameterNames(node: SyntaxNode): string[] {\n const parameters = child(node, \"parameters\");\n if (!parameters) return [];\n const result: string[] = [];\n for (const parameter of parameters.namedChildren) {\n if (parameter.type !== \"parameter\") continue;\n const identifier = parameter.namedChildren.find((candidate) => candidate.type === \"identifier\");\n if (identifier) result.push(identifier.text);\n }\n return result;\n}\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = child(node, \"assignment_statement\");\n const variables = assignment ? child(assignment, \"variable_list\") : child(node, \"variable_list\");\n const expressions = assignment ? child(assignment, \"expression_list\") : null;\n return {\n names: variables?.namedChildren.filter((candidate) => candidate.type === \"identifier\").map((candidate) => candidate.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction assignmentSides(node: SyntaxNode): { left: SyntaxNode[]; right: SyntaxNode[] } {\n if (node.type !== \"assignment_statement\") return { left: [], right: [] };\n return {\n left: child(node, \"variable_list\")?.namedChildren ?? [],\n right: child(node, \"expression_list\")?.namedChildren ?? [],\n };\n}\n\nfunction callPath(node: SyntaxNode): string | null {\n if (node.type !== \"function_call\") return null;\n const name = node.childForFieldName(\"name\") ?? node.namedChildren[0];\n return name ? name.text.replace(/\\s+/g, \"\") : null;\n}\n\nfunction rootIdentifier(node: SyntaxNode | null | undefined): string | null {\n if (!node) return null;\n if (node.type === \"identifier\") return node.text;\n if (\n node.type === \"dot_index_expression\" ||\n node.type === \"bracket_index_expression\" ||\n node.type === \"method_index_expression\"\n ) {\n return rootIdentifier(node.namedChildren[0]);\n }\n const text = node.text.trim();\n return text.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null;\n}\n\nfunction callArguments(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"function_call\") return [];\n return node.childForFieldName(\"arguments\")?.namedChildren ?? [];\n}\n\nfunction builtinMutatedArgumentIndexes(path: string, argumentCount: number): number[] {\n switch (path.replace(/\\s+/g, \"\")) {\n case \"rawset\":\n case \"setmetatable\":\n case \"table.clear\":\n case \"table.freeze\":\n case \"table.insert\":\n case \"table.remove\":\n case \"table.sort\":\n return argumentCount > 0 ? [0] : [];\n case \"table.move\":\n // table.move writes into the optional destination table, or back into the\n // source table when the destination argument is omitted.\n return argumentCount >= 5 ? [4] : argumentCount > 0 ? [0] : [];\n default:\n return [];\n }\n}\n\nfunction expressionCreatesOwnedValue(node: SyntaxNode, owned: Set<string>): boolean {\n if (node.type === \"table_constructor\" || node.type === \"function_definition\") return true;\n if (node.type !== \"function_call\") return false;\n\n const path = callPath(node)?.replace(/\\s+/g, \"\") ?? \"\";\n if (path === \"table.clone\" || path === \"table.create\" || path === \"table.pack\") return true;\n if (path !== \"setmetatable\" && path !== \"table.freeze\") return false;\n\n const first = callArguments(node)[0];\n if (!first) return false;\n if (first.type === \"table_constructor\") return true;\n const root = rootIdentifier(first);\n return Boolean(root && owned.has(root));\n}\n\nfunction directNodes(body: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n const visit = (node: SyntaxNode): void => {\n if (node !== body && (node.type === \"function_definition\" || node.type === \"function_declaration\")) return;\n result.push(node);\n for (const candidate of node.namedChildren) visit(candidate);\n };\n visit(body);\n return result;\n}\n\nfunction topLevelFunctionRecords(record: ParsedRecord): FunctionRecord[] {\n const functions: FunctionRecord[] = [];\n let anonymousExportIndex = 0;\n\n const add = (\n node: SyntaxNode,\n body: SyntaxNode | null,\n localName: string | null,\n memberName: string | null,\n method: boolean,\n exported: boolean,\n ): void => {\n if (!body) return;\n const key = memberName ? `member:${memberName}` : localName ? `local:${localName}` : `export:${anonymousExportIndex++}`;\n functions.push({\n id: `${record.id}::${key}`,\n moduleId: record.id,\n localName,\n memberName,\n exported,\n method,\n node,\n body,\n parameters: parameterNames(node),\n directEffect: false,\n mutatesReceiver: false,\n mutatedParameterIndexes: new Set<number>(),\n dependencies: new Set<string>(),\n mutationCalls: [],\n parameterOrigins: new Map<string, number>(),\n externalRoots: new Set<string>(),\n ownedRoots: new Set<string>(),\n localNames: new Set<string>(),\n });\n };\n\n for (const node of record.tree.rootNode.namedChildren) {\n if (node.type === \"function_declaration\") {\n const nameNode = node.namedChildren.find((candidate) =>\n [\"identifier\", \"dot_index_expression\", \"method_index_expression\"].includes(candidate.type),\n );\n const body = child(node, \"block\");\n const text = nameNode?.text.replace(/\\s+/g, \"\") ?? \"\";\n const methodMatch = text.match(/^([A-Za-z_][A-Za-z0-9_]*)[:.]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (methodMatch && methodMatch[1] === record.exportName) {\n add(node, body, null, methodMatch[2], nameNode?.type === \"method_index_expression\", false);\n } else if (nameNode?.type === \"identifier\") {\n add(node, body, text, null, false, record.exportName === text);\n }\n continue;\n }\n\n if (node.type === \"variable_declaration\") {\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_definition\") continue;\n add(expression, child(expression, \"block\"), names[index], null, false, record.exportName === names[index]);\n }\n continue;\n }\n\n if (node.type === \"assignment_statement\") {\n const { left, right } = assignmentSides(node);\n for (let index = 0; index < left.length; index += 1) {\n const expression = right[index] ?? right[0];\n if (expression?.type !== \"function_definition\") continue;\n const text = left[index].text.replace(/\\s+/g, \"\");\n const memberMatch = text.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (memberMatch && memberMatch[1] === record.exportName) {\n add(expression, child(expression, \"block\"), null, memberMatch[2], text.includes(\":\"), false);\n }\n }\n continue;\n }\n\n if (node.type === \"return_statement\") {\n const expressions = child(node, \"expression_list\");\n const expression = expressions?.namedChildren[0];\n if (expression?.type === \"function_definition\") add(expression, child(expression, \"block\"), null, null, false, true);\n }\n }\n\n return functions;\n}\n\n\nfunction returnedFactoryMember(fn: FunctionRecord, moduleExportName: string | null): boolean {\n if (!fn.memberName || !moduleExportName) return false;\n const header = fn.node.text.slice(0, Math.max(0, fn.body.startIndex - fn.node.startIndex));\n const escaped = moduleExportName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`:\\\\s*${escaped}\\\\b`).test(header)) return true;\n\n for (const node of directNodes(fn.body)) {\n if (node.type !== \"return_statement\") continue;\n if (new RegExp(`\\\\bsetmetatable\\\\s*\\\\([\\\\s\\\\S]*?\\\\b${escaped}\\\\b`).test(node.text)) return true;\n }\n return false;\n}\n\nfunction moduleLevelInstanceAliases(record: ParsedRecord, summariesByModuleId: Map<string, SourceEffectModuleSummary>): Map<string, string> {\n const result = new Map<string, string>();\n for (const node of record.tree.rootNode.namedChildren) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_call\") continue;\n const path = callPath(expression);\n const match = path?.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) continue;\n const moduleId = record.imports.get(match[1]);\n const summary = moduleId ? summariesByModuleId.get(moduleId) : null;\n if (moduleId && summary?.instanceFactories.has(match[2])) result.set(names[index], moduleId);\n }\n }\n return result;\n}\n\nfunction analyzeFunction(\n fn: FunctionRecord,\n record: ParsedRecord,\n localFunctions: Map<string, string>,\n memberFunctions: Map<string, string>,\n moduleSummaries: Map<string, SourceEffectModuleSummary>,\n moduleInstances: Map<string, string>,\n exportedFunctions: Map<string, string>,\n): void {\n const parameters = new Set(fn.parameters);\n const parameterOrigins = new Map<string, number>(fn.parameters.map((name, index) => [name, index] as const));\n if (fn.method) {\n parameters.add(\"self\");\n parameterOrigins.set(\"self\", -1);\n }\n const locals = new Set<string>();\n const owned = new Set<string>();\n const externalAliases = new Set<string>();\n const refLocals = new Set<string>();\n const instanceAliases = new Map(moduleInstances);\n const nodes = directNodes(fn.body);\n\n for (const node of nodes) {\n if (node.type === \"function_declaration\" && node.id !== fn.node.id) {\n const declared = node.childForFieldName(\"name\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(declared)) locals.add(declared);\n continue;\n }\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n locals.add(name);\n if (!expression) continue;\n const createsOwnedValue = expressionCreatesOwnedValue(expression, owned);\n if (createsOwnedValue) owned.add(name);\n const root = rootIdentifier(expression);\n const parameterOrigin = root ? parameterOrigins.get(root) : undefined;\n if (!createsOwnedValue && root && parameterOrigin !== undefined) {\n // Keep argument/receiver mutation conditional. A caller may pass a fresh\n // render-local value, so it must not become an unconditional effect.\n parameterOrigins.set(name, parameterOrigin);\n } else if (!createsOwnedValue && root && (externalAliases.has(root) || (!locals.has(root) && root !== name))) {\n // Module/global state is externally observable regardless of call-site\n // ownership, so aliases of it remain safe to classify as effects.\n externalAliases.add(name);\n } else if (root && owned.has(root)) {\n owned.add(name);\n }\n\n if (expression.type === \"function_call\") {\n const path = callPath(expression)?.replace(/\\s+/g, \"\") ?? \"\";\n if (path === \"React.useRef\") refLocals.add(name);\n const match = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (match) {\n const moduleId = record.imports.get(match[1]);\n const summary = moduleId ? moduleSummaries.get(moduleId) : null;\n if (moduleId && summary?.instanceFactories.has(match[2])) instanceAliases.set(name, moduleId);\n }\n }\n }\n }\n\n fn.parameterOrigins = parameterOrigins;\n fn.externalRoots = externalAliases;\n fn.ownedRoots = owned;\n fn.localNames = locals;\n\n // Luau locals are lexically scoped from their declaration onward, so the\n // source-order pass above is enough to propagate aliases through local\n // declarations. Repeated fixed-point rescans of every function body were\n // redundant and particularly expensive on large modules.\n for (const node of nodes) {\n if (node.type === \"assignment_statement\" && node.parent?.type !== \"variable_declaration\") {\n const { left } = assignmentSides(node);\n for (const target of left) {\n if (target.type === \"identifier\") {\n if (!locals.has(target.text) && !parameters.has(target.text)) fn.directEffect = true;\n continue;\n }\n const root = rootIdentifier(target);\n if (!root) continue;\n if (owned.has(root)) continue;\n if (refLocals.has(root) && target.text.replace(/\\s+/g, \"\") === `${root}.current`) continue;\n const parameterOrigin = parameterOrigins.get(root);\n if (parameterOrigin !== undefined) {\n if (parameterOrigin === -1) fn.mutatesReceiver = true;\n else fn.mutatedParameterIndexes.add(parameterOrigin);\n continue;\n }\n if (externalAliases.has(root) || !locals.has(root)) fn.directEffect = true;\n }\n continue;\n }\n\n if (node.type !== \"function_call\") continue;\n const path = callPath(node);\n if (!path) continue;\n const arguments_ = callArguments(node);\n\n for (const index of builtinMutatedArgumentIndexes(path, arguments_.length)) {\n markMutationThroughRoot(fn, rootIdentifier(arguments_[index]));\n }\n\n const localTarget = !locals.has(path) && !parameters.has(path) ? localFunctions.get(path) : null;\n if (localTarget) {\n fn.dependencies.add(localTarget);\n fn.mutationCalls.push({\n targetId: localTarget,\n receiverRoot: null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n\n const sameMember = path.match(/^([A-Za-z_][A-Za-z0-9_]*)([:.])([A-Za-z_][A-Za-z0-9_]*)$/);\n if (sameMember) {\n const receiver = sameMember[1];\n if (receiver === \"self\" || (receiver === record.exportName && !locals.has(receiver) && !parameters.has(receiver))) {\n const target = memberFunctions.get(sameMember[3]);\n if (target) {\n fn.dependencies.add(target);\n fn.mutationCalls.push({\n targetId: target,\n receiverRoot: sameMember[2] === \":\" ? receiver : null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n }\n }\n\n const importedMember = path.match(/^([A-Za-z_][A-Za-z0-9_]*)([.:])([A-Za-z_][A-Za-z0-9_]*)$/);\n if (importedMember) {\n const root = importedMember[1];\n const moduleId = instanceAliases.get(root)\n ?? (!locals.has(root) && !parameters.has(root) ? record.imports.get(root) : undefined);\n if (moduleId) {\n const target = `${moduleId}::member:${importedMember[3]}`;\n fn.dependencies.add(target);\n fn.mutationCalls.push({\n targetId: target,\n receiverRoot: importedMember[2] === \":\" ? root : null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n } else if (!locals.has(path) && !parameters.has(path)) {\n const moduleId = record.imports.get(path);\n const target = moduleId ? exportedFunctions.get(moduleId) : null;\n if (target) {\n fn.dependencies.add(target);\n fn.mutationCalls.push({\n targetId: target,\n receiverRoot: null,\n argumentRoots: arguments_.map((argument) => rootIdentifier(argument)),\n });\n }\n }\n }\n}\n\nfunction markMutationThroughRoot(fn: FunctionRecord, root: string | null): boolean {\n if (!root) return false;\n const parameterOrigin = fn.parameterOrigins.get(root);\n if (parameterOrigin !== undefined) {\n if (parameterOrigin === -1) {\n if (fn.mutatesReceiver) return false;\n fn.mutatesReceiver = true;\n return true;\n }\n if (fn.mutatedParameterIndexes.has(parameterOrigin)) return false;\n fn.mutatedParameterIndexes.add(parameterOrigin);\n return true;\n }\n\n if (fn.ownedRoots.has(root)) return false;\n if (fn.externalRoots.has(root) || !fn.localNames.has(root)) {\n if (fn.directEffect) return false;\n fn.directEffect = true;\n return true;\n }\n if (fn.localNames.has(root)) return false;\n return false;\n}\n\nfunction propagateLocalMutationEffects(functions: FunctionRecord[]): void {\n const byId = new Map(functions.map((fn) => [fn.id, fn] as const));\n let changed = true;\n while (changed) {\n changed = false;\n for (const fn of functions) {\n for (const call of fn.mutationCalls) {\n const target = byId.get(call.targetId);\n if (!target) continue;\n if (target.mutatesReceiver && markMutationThroughRoot(fn, call.receiverRoot)) changed = true;\n for (const index of target.mutatedParameterIndexes) {\n if (markMutationThroughRoot(fn, call.argumentRoots[index] ?? null)) changed = true;\n }\n }\n }\n }\n}\n\nfunction mutationOriginForRoot(fn: FunctionRecord, root: string | null): CachedMutationOrigin | null {\n if (!root) return null;\n const parameterOrigin = fn.parameterOrigins.get(root);\n if (parameterOrigin === -1) return { kind: \"receiver\" };\n if (parameterOrigin !== undefined) return { kind: \"parameter\", index: parameterOrigin };\n if (fn.ownedRoots.has(root) || fn.localNames.has(root)) return { kind: \"local\" };\n if (fn.externalRoots.has(root) || !fn.localNames.has(root)) return { kind: \"external\" };\n return null;\n}\n\nfunction cachedMutationCalls(fn: FunctionRecord): CachedMutationCall[] {\n return fn.mutationCalls.map((call) => ({\n targetId: call.targetId,\n receiverOrigin: mutationOriginForRoot(fn, call.receiverRoot),\n argumentOrigins: call.argumentRoots.map((root) => mutationOriginForRoot(fn, root)),\n }));\n}\n\nfunction applyCachedMutationOrigin(fn: CachedSourceEffectFunction, origin: CachedMutationOrigin | null): boolean {\n if (!origin || origin.kind === \"local\") return false;\n if (origin.kind === \"external\") {\n if (fn.directEffect) return false;\n fn.directEffect = true;\n return true;\n }\n if (origin.kind === \"receiver\") {\n if (fn.mutatesReceiver) return false;\n fn.mutatesReceiver = true;\n return true;\n }\n if (fn.mutatedParameterIndexes.includes(origin.index)) return false;\n fn.mutatedParameterIndexes.push(origin.index);\n fn.mutatedParameterIndexes.sort((a, b) => a - b);\n return true;\n}\n\nfunction propagateMutationEffects(functions: CachedSourceEffectFunction[]): void {\n const byId = new Map(functions.map((fn) => [fn.id, fn] as const));\n let changed = true;\n while (changed) {\n changed = false;\n for (const fn of functions) {\n for (const call of fn.mutationCalls) {\n const target = byId.get(call.targetId);\n if (!target) continue;\n if (target.mutatesReceiver && applyCachedMutationOrigin(fn, call.receiverOrigin)) changed = true;\n for (const index of target.mutatedParameterIndexes) {\n if (applyCachedMutationOrigin(fn, call.argumentOrigins[index] ?? null)) changed = true;\n }\n }\n }\n }\n}\n\nexport async function indexEffectModuleForWorker(\n input: EffectWorkerIndexInput,\n moduleAliases: Map<string, string>,\n): Promise<{ indexed: IndexedEffectWorkerModule; state: EffectWorkerState; tree: SyntaxTree }> {\n const tree = await parseLuau(input.source);\n const imports = topLevelImports(tree.rootNode, moduleAliases);\n\n const record: ParsedRecord = {\n id: input.id,\n keys: input.keys,\n source: input.source,\n tree,\n exportName: topLevelReturnName(tree.rootNode),\n imports,\n };\n const functions = topLevelFunctionRecords(record);\n const instanceFactories: string[] = [];\n for (const fn of functions) {\n if (fn.memberName && returnedFactoryMember(fn, record.exportName)) instanceFactories.push(fn.memberName);\n }\n const exportedFunctionId = functions.find((fn) => fn.exported && !fn.memberName)?.id;\n\n return {\n indexed: {\n id: input.id,\n relativePath: input.relativePath,\n importedModuleIds: [...new Set(imports.values())].sort(),\n instanceFactories: instanceFactories.sort(),\n exportedFunctionId,\n },\n state: { relativePath: input.relativePath, source: input.source, record, functions },\n tree,\n };\n}\n\nexport function analyzeEffectModuleForWorker(\n state: EffectWorkerState,\n moduleSummaries: Map<string, SourceEffectModuleSummary>,\n exportedFunctions: Map<string, string>,\n): AnalyzedEffectWorkerModule {\n const localFunctions = new Map<string, string>();\n const memberFunctions = new Map<string, string>();\n for (const fn of state.functions) {\n if (fn.localName) localFunctions.set(fn.localName, fn.id);\n if (fn.memberName) memberFunctions.set(fn.memberName, fn.id);\n }\n const moduleInstances = moduleLevelInstanceAliases(state.record, moduleSummaries);\n for (const fn of state.functions) {\n analyzeFunction(fn, state.record, localFunctions, memberFunctions, moduleSummaries, moduleInstances, exportedFunctions);\n }\n propagateLocalMutationEffects(state.functions);\n return {\n id: state.record.id,\n functions: state.functions.map((fn) => ({\n id: fn.id,\n moduleId: fn.moduleId,\n localName: fn.localName,\n memberName: fn.memberName,\n exported: fn.exported,\n directEffect: fn.directEffect,\n mutatesReceiver: fn.mutatesReceiver,\n mutatedParameterIndexes: [...fn.mutatedParameterIndexes].sort((a, b) => a - b),\n dependencies: [...fn.dependencies].sort(),\n mutationCalls: cachedMutationCalls(fn),\n })),\n };\n}\n\nexport async function buildProjectSourceEffects(\n root: string,\n candidates: ScanFileInput[],\n parseCache?: Map<string, ProjectEffectParseCacheEntry>,\n onProgress?: (progress: ProjectEffectsProgress) => void,\n fileHashes: Readonly<Record<string, string>> = {},\n cachedModules: Readonly<Record<string, CachedSourceEffectModule>> = {},\n workerPool?: AnalysisWorkerPool,\n): Promise<ProjectSourceEffectsBuildResult> {\n interface CandidateIdentity extends ModuleIdentity {\n relativePath: string;\n candidate: ScanFileInput;\n hash: string;\n }\n\n const identities: CandidateIdentity[] = [];\n for (const candidate of candidates) {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n const id = relativePath.toLowerCase();\n identities.push({\n id,\n keys: moduleKeys(relativePath),\n relativePath,\n candidate,\n hash: fileHashes[relativePath] ?? \"\",\n });\n }\n\n const moduleIdFeatures = new Map(identities.map((record) => [record.id, record.id] as const));\n const moduleAliases = buildUniqueFeatureAliases(identities, moduleIdFeatures);\n const currentIds = new Set(identities.map((identity) => identity.id));\n const cachedIds = new Set(Object.values(cachedModules).map((module) => module.id));\n const sameFileSet = currentIds.size === cachedIds.size && [...currentIds].every((id) => cachedIds.has(id));\n\n const dirtyIds = new Set<string>();\n if (!sameFileSet) {\n for (const identity of identities) dirtyIds.add(identity.id);\n } else {\n for (const identity of identities) {\n const cached = cachedModules[identity.relativePath];\n if (!cached || cached.hash !== identity.hash) dirtyIds.add(identity.id);\n }\n\n // A changed module can alter whether one of its members is an instance\n // factory. Re-analyze direct importers so instance-method dependencies are\n // refreshed, while all other unchanged modules keep their cached graph.\n if (dirtyIds.size > 0) {\n for (const module of Object.values(cachedModules)) {\n if (module.importedModuleIds.some((moduleId) => dirtyIds.has(moduleId))) dirtyIds.add(module.id);\n }\n }\n }\n\n const cachedFunctionStates = new Map<string, CachedSourceEffectFunction[]>();\n const analyzedFunctionStatesByModule = new Map<string, CachedSourceEffectFunction[]>();\n const importedModuleIdsByModule = new Map<string, string[]>();\n const summariesByModuleId = new Map<string, SourceEffectModuleSummary>();\n const exportedFunctions = new Map<string, string>();\n\n if (workerPool && dirtyIds.size >= 16) {\n const workerInputs: EffectWorkerIndexInput[] = [];\n for (const identity of identities) {\n if (!dirtyIds.has(identity.id)) continue;\n const { candidate } = identity;\n if (candidate.source === undefined && !fs.existsSync(candidate.absolutePath)) continue;\n workerInputs.push({\n id: identity.id,\n keys: identity.keys,\n relativePath: identity.relativePath,\n source: candidate.source ?? fs.readFileSync(candidate.absolutePath, \"utf8\"),\n });\n }\n\n let parsedCount = identities.length - workerInputs.length;\n onProgress?.({ phase: \"parse\", current: parsedCount, total: candidates.length });\n const indexedModules = await workerPool.indexEffectModules(workerInputs, moduleAliases, (count, file) => {\n parsedCount += count;\n onProgress?.({ phase: \"parse\", current: Math.min(parsedCount, candidates.length), total: candidates.length, file });\n });\n onProgress?.({ phase: \"parse\", current: candidates.length, total: candidates.length });\n\n const indexedById = new Map(indexedModules.map((module) => [module.id, module] as const));\n const functionIndexTotal = Math.max(1, identities.length * 2);\n onProgress?.({ phase: \"index-functions\", current: 0, total: functionIndexTotal });\n\n for (let identityIndex = 0; identityIndex < identities.length; identityIndex += 1) {\n const identity = identities[identityIndex];\n const indexed = indexedById.get(identity.id);\n if (indexed) {\n importedModuleIdsByModule.set(identity.id, indexed.importedModuleIds);\n summariesByModuleId.set(identity.id, {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set(indexed.instanceFactories),\n });\n if (indexed.exportedFunctionId) exportedFunctions.set(identity.id, indexed.exportedFunctionId);\n } else {\n const cached = cachedModules[identity.relativePath];\n const functions = cached?.functions ?? [];\n cachedFunctionStates.set(identity.id, functions);\n importedModuleIdsByModule.set(identity.id, cached?.importedModuleIds ?? []);\n summariesByModuleId.set(identity.id, {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set(cached?.instanceFactories ?? []),\n });\n const exported = functions.find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n }\n if ((identityIndex & 63) === 63 || identityIndex + 1 === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: Math.min(functionIndexTotal, identityIndex + 1), total: functionIndexTotal });\n }\n }\n onProgress?.({ phase: \"index-functions\", current: functionIndexTotal, total: functionIndexTotal });\n\n const callAnalysisTotal = Math.max(1, indexedModules.length);\n let analyzedCount = 0;\n onProgress?.({ phase: \"analyze-calls\", current: 0, total: callAnalysisTotal });\n const analyzedModules = await workerPool.analyzeEffectModules(summariesByModuleId, exportedFunctions, (count) => {\n analyzedCount += count;\n onProgress?.({ phase: \"analyze-calls\", current: Math.min(analyzedCount, callAnalysisTotal), total: callAnalysisTotal });\n });\n for (const module of analyzedModules) analyzedFunctionStatesByModule.set(module.id, module.functions);\n onProgress?.({ phase: \"analyze-calls\", current: callAnalysisTotal, total: callAnalysisTotal });\n } else {\n const rawRecords = new Map<string, ParsedRecord>();\n onProgress?.({ phase: \"parse\", current: 0, total: candidates.length });\n for (let candidateIndex = 0; candidateIndex < identities.length; candidateIndex += 1) {\n const identity = identities[candidateIndex];\n const { candidate, relativePath } = identity;\n try {\n if (!dirtyIds.has(identity.id)) continue;\n if (candidate.source === undefined && !fs.existsSync(candidate.absolutePath)) continue;\n const source = candidate.source ?? fs.readFileSync(candidate.absolutePath, \"utf8\");\n const tree = await parseLuau(source);\n parseCache?.set(relativePath, { source, tree });\n const imports = topLevelImports(tree.rootNode, moduleAliases);\n rawRecords.set(identity.id, {\n id: identity.id,\n keys: identity.keys,\n source,\n tree,\n exportName: topLevelReturnName(tree.rootNode),\n imports,\n });\n } catch {\n // Parse diagnostics are handled by the normal scanner. An unparseable module\n // simply cannot contribute source-derived effect information.\n } finally {\n onProgress?.({ phase: \"parse\", current: candidateIndex + 1, total: candidates.length, file: relativePath });\n }\n }\n\n const functionIndexTotal = Math.max(1, identities.length * 2);\n onProgress?.({ phase: \"index-functions\", current: 0, total: functionIndexTotal });\n const functionsByModule = new Map<string, FunctionRecord[]>();\n\n for (const identity of identities) {\n const record = rawRecords.get(identity.id);\n if (record) {\n const functions = topLevelFunctionRecords(record);\n functionsByModule.set(identity.id, functions);\n importedModuleIdsByModule.set(identity.id, [...new Set(record.imports.values())].sort());\n const summary: SourceEffectModuleSummary = {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set<string>(),\n };\n for (const fn of functions) {\n if (fn.memberName && returnedFactoryMember(fn, record.exportName)) summary.instanceFactories.add(fn.memberName);\n }\n summariesByModuleId.set(identity.id, summary);\n } else {\n const cached = cachedModules[identity.relativePath];\n cachedFunctionStates.set(identity.id, cached?.functions ?? []);\n importedModuleIdsByModule.set(identity.id, cached?.importedModuleIds ?? []);\n summariesByModuleId.set(identity.id, {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n mutatingMembers: new Set<string>(),\n mutatingExportParameters: new Set<number>(),\n mutatingMemberParameters: new Map<string, Set<number>>(),\n localMutatingParameters: new Map<string, Set<number>>(),\n instanceFactories: new Set(cached?.instanceFactories ?? []),\n });\n }\n const indexedCount = summariesByModuleId.size;\n if ((indexedCount & 63) === 0 || indexedCount === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: indexedCount, total: functionIndexTotal });\n }\n }\n\n for (let identityIndex = 0; identityIndex < identities.length; identityIndex += 1) {\n const identity = identities[identityIndex];\n const parsedFunctions = functionsByModule.get(identity.id);\n if (parsedFunctions) {\n const exported = parsedFunctions.find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n } else {\n const exported = (cachedFunctionStates.get(identity.id) ?? []).find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n }\n if ((identityIndex & 63) === 63 || identityIndex + 1 === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: identities.length + identityIndex + 1, total: functionIndexTotal });\n }\n }\n\n const callAnalysisTotal = Math.max(1, rawRecords.size);\n onProgress?.({ phase: \"analyze-calls\", current: 0, total: callAnalysisTotal });\n let analyzedModuleCount = 0;\n for (const [moduleId, record] of rawRecords) {\n const localFunctions = new Map<string, string>();\n const memberFunctions = new Map<string, string>();\n const functions = functionsByModule.get(moduleId) ?? [];\n for (const fn of functions) {\n if (fn.localName) localFunctions.set(fn.localName, fn.id);\n if (fn.memberName) memberFunctions.set(fn.memberName, fn.id);\n }\n const moduleInstances = moduleLevelInstanceAliases(record, summariesByModuleId);\n for (const fn of functions) {\n analyzeFunction(fn, record, localFunctions, memberFunctions, summariesByModuleId, moduleInstances, exportedFunctions);\n }\n propagateLocalMutationEffects(functions);\n analyzedFunctionStatesByModule.set(moduleId, functions.map((fn) => ({\n id: fn.id,\n moduleId: fn.moduleId,\n localName: fn.localName,\n memberName: fn.memberName,\n exported: fn.exported,\n directEffect: fn.directEffect,\n mutatesReceiver: fn.mutatesReceiver,\n mutatedParameterIndexes: [...fn.mutatedParameterIndexes].sort((a, b) => a - b),\n dependencies: [...fn.dependencies].sort(),\n mutationCalls: cachedMutationCalls(fn),\n })));\n analyzedModuleCount += 1;\n if ((analyzedModuleCount & 31) === 0 || analyzedModuleCount === rawRecords.size) {\n onProgress?.({ phase: \"analyze-calls\", current: analyzedModuleCount, total: callAnalysisTotal });\n }\n }\n }\n\n const graphAssemblyTotal = Math.max(1, identities.length);\n onProgress?.({ phase: \"assemble-graph\", current: 0, total: graphAssemblyTotal });\n const functionStates = new Map<string, CachedSourceEffectFunction>();\n const cacheModulesResult: Record<string, CachedSourceEffectModule> = {};\n let assembledCount = 0;\n for (const identity of identities) {\n const states: CachedSourceEffectFunction[] = (analyzedFunctionStatesByModule.get(identity.id) ?? cachedFunctionStates.get(identity.id) ?? [])\n .map((fn) => ({\n ...fn,\n mutatesReceiver: fn.mutatesReceiver ?? false,\n mutatedParameterIndexes: [...(fn.mutatedParameterIndexes ?? [])],\n dependencies: [...fn.dependencies],\n mutationCalls: [...(fn.mutationCalls ?? [])],\n }));\n for (const fn of states) functionStates.set(fn.id, fn);\n const summary = summariesByModuleId.get(identity.id)!;\n cacheModulesResult[identity.relativePath] = {\n hash: identity.hash,\n id: identity.id,\n keys: identity.keys,\n importedModuleIds: importedModuleIdsByModule.get(identity.id) ?? [],\n functions: states,\n instanceFactories: [...summary.instanceFactories].sort(),\n };\n assembledCount += 1;\n if ((assembledCount & 63) === 0 || assembledCount === identities.length) {\n onProgress?.({ phase: \"assemble-graph\", current: assembledCount, total: graphAssemblyTotal });\n }\n }\n\n // Parameter/receiver mutation is conditional on what each caller passes.\n // Resolve that information across the complete project graph before seeding\n // unconditional side effects, so wrappers preserve precise parameter effects\n // instead of becoming globally impure.\n propagateMutationEffects([...functionStates.values()]);\n\n // Build a reverse dependency graph once, then propagate effectfulness only\n // through callers that can actually become affected. This avoids repeatedly\n // rescanning every function until a fixed point is reached.\n const reverseDependencies = new Map<string, string[]>();\n const functions = [...functionStates.values()];\n onProgress?.({ phase: \"resolve\", current: 0, total: functions.length });\n for (let index = 0; index < functions.length; index += 1) {\n const fn = functions[index];\n for (const dependency of fn.dependencies) {\n if (!functionStates.has(dependency)) continue;\n const dependents = reverseDependencies.get(dependency);\n if (dependents) dependents.push(fn.id);\n else reverseDependencies.set(dependency, [fn.id]);\n }\n if ((index & 127) === 127 || index + 1 === functions.length) {\n onProgress?.({ phase: \"resolve\", current: index + 1, total: functions.length });\n }\n }\n\n const effectful = new Set<string>();\n const queue: string[] = [];\n for (const fn of functions) {\n if (!fn.directEffect) continue;\n effectful.add(fn.id);\n queue.push(fn.id);\n }\n\n onProgress?.({ phase: \"propagate\", current: 0, total: Math.max(1, functions.length) });\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const effectfulId = queue[queueIndex++];\n for (const dependent of reverseDependencies.get(effectfulId) ?? []) {\n if (effectful.has(dependent)) continue;\n effectful.add(dependent);\n queue.push(dependent);\n }\n if ((queueIndex & 63) === 0 || queueIndex === queue.length) {\n onProgress?.({ phase: \"propagate\", current: Math.min(queueIndex, Math.max(1, functions.length)), total: Math.max(1, functions.length) });\n }\n }\n // The work queue may visit only the effectful subset of the graph. Explicitly\n // mark the phase complete once the queue is exhausted instead of leaving a\n // partially filled progress bar behind.\n onProgress?.({ phase: \"propagate\", current: Math.max(1, functions.length), total: Math.max(1, functions.length) });\n\n const summarizeTotal = Math.max(1, functions.length + 1);\n onProgress?.({ phase: \"summarize\", current: 0, total: summarizeTotal });\n for (const summary of summariesByModuleId.values()) {\n summary.effectfulMembers.clear();\n summary.effectfulExport = false;\n summary.mutatingMembers.clear();\n summary.mutatingExportParameters.clear();\n summary.mutatingMemberParameters.clear();\n summary.localMutatingParameters.clear();\n }\n for (let index = 0; index < functions.length; index += 1) {\n const fn = functions[index];\n const summary = summariesByModuleId.get(fn.moduleId);\n if (summary && fn.memberName && fn.mutatesReceiver) summary.mutatingMembers.add(fn.memberName);\n if (summary && fn.mutatedParameterIndexes.length > 0) {\n if (fn.exported && !fn.memberName) {\n for (const parameterIndex of fn.mutatedParameterIndexes) summary.mutatingExportParameters.add(parameterIndex);\n }\n if (fn.memberName) {\n summary.mutatingMemberParameters.set(fn.memberName, new Set(fn.mutatedParameterIndexes));\n }\n if (fn.localName) {\n summary.localMutatingParameters.set(fn.localName, new Set(fn.mutatedParameterIndexes));\n }\n }\n if (summary && effectful.has(fn.id)) {\n if (fn.memberName) summary.effectfulMembers.add(fn.memberName);\n if (fn.exported) summary.effectfulExport = true;\n }\n if ((index & 127) === 127 || index + 1 === functions.length) {\n onProgress?.({ phase: \"summarize\", current: index + 1, total: summarizeTotal });\n }\n }\n\n // Alias construction can still be noticeable on large projects, so reserve\n // the final progress unit until it is genuinely complete.\n const effects = buildUniqueFeatureAliases(identities, summariesByModuleId);\n onProgress?.({ phase: \"summarize\", current: summarizeTotal, total: summarizeTotal });\n\n return {\n effects,\n cacheModules: cacheModulesResult,\n };\n}\n\n",
|
|
47
47
|
"import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport packageJson from \"../package.json\";\nimport { cacheBaseDirectory } from \"./cache\";\n\nexport const UPDATE_CHECK_INTERVAL_MS = 2 * 60 * 60 * 1000;\nconst UPDATE_REQUEST_TIMEOUT_MS = 5_000;\nconst UPDATE_CACHE_FILENAME = \"update-check.json\";\n\ninterface UpdateCache {\n checkedAt: number;\n latest?: string;\n}\n\ninterface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nexport interface UpdateNotice {\n current: string;\n latest: string;\n}\n\nfunction updateCacheFilename(): string {\n return path.join(cacheBaseDirectory(), UPDATE_CACHE_FILENAME);\n}\n\nfunction readUpdateCache(): UpdateCache | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(updateCacheFilename(), \"utf8\")) as Partial<UpdateCache>;\n if (typeof parsed.checkedAt !== \"number\" || !Number.isFinite(parsed.checkedAt)) return null;\n if (parsed.latest !== undefined && typeof parsed.latest !== \"string\") return null;\n return {\n checkedAt: parsed.checkedAt,\n latest: parsed.latest,\n };\n } catch {\n return null;\n }\n}\n\nfunction writeUpdateCache(cache: UpdateCache): void {\n try {\n const filename = updateCacheFilename();\n fs.mkdirSync(path.dirname(filename), { recursive: true });\n fs.writeFileSync(filename, `${JSON.stringify(cache)}\\n`);\n } catch {\n // Update checks are advisory and should never make the analyzer fail.\n }\n}\n\nfunction parseVersion(value: string): ParsedVersion | null {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/.exec(value.trim());\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4]?.split(\".\") ?? [],\n };\n}\n\nfunction comparePrerelease(left: string[], right: string[]): number {\n if (left.length === 0 || right.length === 0) {\n if (left.length === right.length) return 0;\n return left.length === 0 ? 1 : -1;\n }\n\n const count = Math.max(left.length, right.length);\n for (let index = 0; index < count; index += 1) {\n const leftPart = left[index];\n const rightPart = right[index];\n if (leftPart === undefined) return -1;\n if (rightPart === undefined) return 1;\n if (leftPart === rightPart) continue;\n\n const leftNumber = /^\\d+$/.test(leftPart) ? Number(leftPart) : null;\n const rightNumber = /^\\d+$/.test(rightPart) ? Number(rightPart) : null;\n if (leftNumber !== null && rightNumber !== null) return leftNumber < rightNumber ? -1 : 1;\n if (leftNumber !== null) return -1;\n if (rightNumber !== null) return 1;\n return leftPart < rightPart ? -1 : 1;\n }\n return 0;\n}\n\nexport function compareVersions(left: string, right: string): number | null {\n const a = parseVersion(left);\n const b = parseVersion(right);\n if (!a || !b) return null;\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (a[key] !== b[key]) return a[key] < b[key] ? -1 : 1;\n }\n return comparePrerelease(a.prerelease, b.prerelease);\n}\n\nfunction updateRegistryUrl(): string {\n const registry = process.env.REACT_LUAU_DOCTOR_UPDATE_REGISTRY\n ?? process.env.npm_config_registry\n ?? process.env.NPM_CONFIG_REGISTRY\n ?? \"https://registry.npmjs.org/\";\n const base = registry.endsWith(\"/\") ? registry : `${registry}/`;\n return new URL(`${encodeURIComponent(packageJson.name)}/latest`, base).toString();\n}\n\nasync function fetchLatestVersion(): Promise<string> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), UPDATE_REQUEST_TIMEOUT_MS);\n timer.unref?.();\n try {\n const response = await fetch(updateRegistryUrl(), {\n headers: { accept: \"application/json\" },\n signal: controller.signal,\n });\n if (!response.ok) throw new Error(`npm registry returned HTTP ${response.status}`);\n const body = await response.json() as { version?: unknown };\n if (typeof body.version !== \"string\" || compareVersions(body.version, body.version) === null) {\n throw new Error(\"npm registry returned an invalid package version\");\n }\n return body.version;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function updateCacheIsStale(now = Date.now()): boolean {\n const cache = readUpdateCache();\n return !cache || now - cache.checkedAt >= UPDATE_CHECK_INTERVAL_MS;\n}\n\nexport async function refreshUpdateCache(options: { silent?: boolean; now?: number } = {}): Promise<string | null> {\n const now = options.now ?? Date.now();\n try {\n const latest = await fetchLatestVersion();\n writeUpdateCache({ checkedAt: now, latest });\n return latest;\n } catch (error) {\n const previous = readUpdateCache();\n writeUpdateCache({ checkedAt: now, latest: previous?.latest });\n if (options.silent) return null;\n throw error;\n }\n}\n\nexport function startBackgroundUpdateRefresh(): void {\n if (!updateCacheIsStale()) return;\n const script = process.argv[1];\n if (!script) return;\n try {\n const child = spawn(process.execPath, [script, \"__update-cache\"], {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n env: process.env,\n });\n child.unref();\n } catch {\n // A failed advisory update check should never affect a scan.\n }\n}\n\nexport function getCachedUpdateNotice(currentVersion: string): UpdateNotice | null {\n const cache = readUpdateCache();\n if (!cache?.latest) return null;\n const comparison = compareVersions(cache.latest, currentVersion);\n if (comparison === null || comparison <= 0) return null;\n return { current: currentVersion, latest: cache.latest };\n}\n\nexport async function checkForUpdatesNow(currentVersion: string): Promise<{ latest: string; updateAvailable: boolean }> {\n const latest = await refreshUpdateCache();\n if (!latest) throw new Error(\"Could not check npm for updates\");\n const comparison = compareVersions(latest, currentVersion);\n if (comparison === null) throw new Error(`Could not compare installed version ${currentVersion} with ${latest}`);\n return { latest, updateAvailable: comparison > 0 };\n}\n",
|
|
48
48
|
"import { spawnSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport packageJson from \"../package.json\";\n\nexport interface UpdateInstallCommand {\n manager: \"bun\" | \"npm\";\n command: string;\n args: string[];\n display: string;\n}\n\nfunction normalizedPath(filename: string): string {\n return filename.replaceAll(\"\\\\\", \"/\");\n}\n\nexport function updateInstallCommandForPath(filename: string): UpdateInstallCommand | null {\n const normalized = normalizedPath(filename);\n const spec = `${packageJson.name}@latest`;\n\n if (normalized.includes(\"/.bun/install/global/node_modules/\")) {\n return {\n manager: \"bun\",\n command: \"bun\",\n args: [\"add\", \"-g\", spec],\n display: `bun add -g ${spec}`,\n };\n }\n\n if (normalized.includes(\"/.bun/install/cache/\") || normalized.includes(\"/.npm/_npx/\")) return null;\n\n if (normalized.includes(\"/node_modules/\")) {\n return {\n manager: \"npm\",\n command: \"npm\",\n args: [\"install\", \"-g\", spec],\n display: `npm install -g ${spec}`,\n };\n }\n\n return null;\n}\n\nexport function currentUpdateInstallCommand(): UpdateInstallCommand | null {\n return updateInstallCommandForPath(fileURLToPath(import.meta.url));\n}\n\nexport function installLatestVersion(command: UpdateInstallCommand): void {\n const result = spawnSync(command.command, command.args, {\n stdio: \"inherit\",\n windowsHide: true,\n });\n if (result.error) throw result.error;\n if (result.status !== 0) throw new Error(`${command.display} exited with code ${result.status ?? \"unknown\"}`);\n}\n",
|
|
49
49
|
"import type { FixPreview } from \"./types\";\n\nconst examples: Record<string, FixPreview> = {\n \"react-luau/parse-error\": {\n before: `return React.createElement(\"Frame\", {\n\\tVisible = true,\n)`,\n after: `return React.createElement(\"Frame\", {\n\\tVisible = true,\n})`,\n note: \"Close the props table before closing the call. Parse errors can also come from unsupported syntax; inspect the reported location before applying a repair.\",\n },\n \"react-luau/rules-of-hooks\": {\n before: `if enabled then\n\\tlocal value = React.useMemo(function()\n\\t\\treturn computeValue()\n\\tend, {})\nend`,\n after: `local value = React.useMemo(function()\n\\treturn computeValue()\nend, {})\n\nif enabled then\n\\t-- use value here\nend`,\n note: \"Keep hook calls at the top level, then branch on their results.\",\n },\n \"react-luau/exhaustive-deps\": {\n before: `React.useEffect(function()\n\\tprint(value)\nend, {})`,\n after: `React.useEffect(function()\n\\tprint(value)\nend, { value })`,\n note: \"Make the dependency table match the reactive values captured by the hook callback.\",\n },\n \"react-luau/effect-needs-cleanup\": {\n before: `React.useEffect(function()\n\\tlocal connection = signal:Connect(onChanged)\nend, { signal, onChanged })`,\n after: `React.useEffect(function()\n\\tlocal connection = signal:Connect(onChanged)\n\\treturn function()\n\\t\\tconnection:Disconnect()\n\\tend\nend, { signal, onChanged })`,\n note: \"Return cleanup from the same effect that creates the owned resource.\",\n },\n \"react-luau/no-derived-state-effect\": {\n before: `local value, setValue = React.useState(0)\n\nReact.useEffect(function()\n\\tsetValue(input * scale)\nend, { input, scale })`,\n after: `local value = input * scale`,\n note: \"Compute render-known derived values during render instead of synchronizing another state cell.\",\n },\n \"react-luau/no-self-updating-effect\": {\n before: `React.useEffect(function()\n\\tsetCount(count + 1)\nend, { count })`,\n after: `local function increment()\n\\tsetCount(function(previous)\n\\t\\treturn previous + 1\n\\tend)\nend`,\n note: \"Move the update to the event that owns it, or add a real convergence guard when an effect is required.\",\n },\n \"react-luau/no-effect-with-fresh-deps\": {\n before: `local options = { enabled = enabled }\n\nReact.useEffect(function()\n\\tapplyOptions(options)\nend, { options })`,\n after: `React.useEffect(function()\n\\tlocal options = { enabled = enabled }\n\\tapplyOptions(options)\nend, { enabled })`,\n note: \"Depend on stable reactive inputs rather than an object or function recreated every render.\",\n },\n \"react-luau/no-mutable-in-deps\": {\n before: `React.useEffect(function()\n\\tuseValue(ref.current)\nend, { ref.current })`,\n after: `React.useEffect(function()\n\\tuseValue(ref.current)\nend, {})`,\n note: \"This effect reads the ref after mount only. A ref mutation cannot schedule another effect; use state or a subscription if changes must trigger work. Keep other reactive dependencies in the table.\",\n },\n \"react-luau/prefer-binding-over-state\": {\n before: `local value, setValue = React.useState(0)`,\n after: `local value, setValue = React.useBinding(0)`,\n note: \"Use a Binding when updates only need to flow into Binding-aware visual consumers.\",\n },\n \"react-luau/prefer-binding-over-state-candidate\": {\n before: `local value, setValue = React.useState(0)\n-- value drives both visual and structural work`,\n after: `local visualValue, setVisualValue = React.useBinding(0)\nlocal structuralValue, setStructuralValue = React.useState(0)`,\n note: \"A common fix is to split high-frequency visual updates from the smaller value that truly needs reconciliation.\",\n },\n \"react-luau/rerender-unstable-memo-props\": {\n before: `return React.createElement(MemoizedButton, {\n\\tonClick = function()\n\\t\\tdoSomething()\n\\tend,\n})`,\n after: `local onClick = React.useCallback(function()\n\\tdoSomething()\nend, {})\n\nreturn React.createElement(MemoizedButton, {\n\\tonClick = onClick,\n})`,\n note: \"Stabilize identity only when the memoized child is worth skipping. Moving construction into the child or removing ineffective memoization can also be better.\",\n },\n \"react-luau/rerender-high-frequency-state\": {\n before: `local transparency, setTransparency = React.useState(0)\nReact.useEffect(function()\n\\tlocal connection = RunService.RenderStepped:Connect(function()\n\\t\\tsetTransparency(readTransparency())\n\\tend)\n\\treturn function() connection:Disconnect() end\nend, { readTransparency })\nreturn React.createElement(\"Frame\", {\n\\tBackgroundTransparency = transparency,\n})`,\n after: `local transparency, setTransparency = React.useBinding(0)\nReact.useEffect(function()\n\\tlocal connection = RunService.RenderStepped:Connect(function()\n\\t\\tsetTransparency(readTransparency())\n\\tend)\n\\treturn function() connection:Disconnect() end\nend, { readTransparency })\nreturn React.createElement(\"Frame\", {\n\\tBackgroundTransparency = transparency,\n})`,\n note: \"A Binding updates this host property without scheduling component renders. Keep state for values that control child structure, and keep the subscription cleanup.\",\n },\n \"react-luau/rerender-unnecessary-usememo\": {\n before: `local doubled = React.useMemo(function()\n\\treturn value * 2\nend, { value })`,\n after: `local doubled = value * 2`,\n note: \"Compute cheap derived values directly when stable identity is not observed.\",\n },\n \"react-luau/rerender-unnecessary-usecallback\": {\n before: `local functionName = React.useCallback(function()\n\\tdoSomething()\nend, {})`,\n after: `local function functionName()\n\\tdoSomething()\nend`,\n note: \"Use a normal local function when nothing observes the callback's identity.\",\n },\n \"react-luau/rerender-static-discovery-in-render\": {\n before: `local function Component()\n\\tlocal modules = ReplicatedStorage.Modules:GetChildren()\n\\treturn renderModules(modules)\nend`,\n after: `local modules = ReplicatedStorage.Modules:GetChildren()\n\nlocal function Component()\n\\treturn renderModules(modules)\nend`,\n note: \"Move truly static discovery to module scope. If the source can change, cache or subscribe to the real changing input instead.\",\n },\n \"react-luau/rerender-repeated-collection-scan\": {\n before: `for _, item in items do\n\\tbuildRow(item)\nend\n\nfor _, item in items do\n\\tbuildLookup(item)\nend`,\n after: `for _, item in items do\n\\tbuildRow(item)\n\\tbuildLookup(item)\nend`,\n note: \"Combine passes when they iterate the same collection and can safely share one traversal.\",\n },\n \"react-luau/rerender-static-state\": {\n before: `local value, setValue = React.useState(computeValue())\n-- setValue is never used`,\n after: `local valueRef = React.useRef(nil)\nif valueRef.current == nil then\n\\tvalueRef.current = computeValue()\nend\nlocal value = valueRef.current`,\n note: \"This preserves a pure, non-nil initial value without a state setter. Derive a local value directly only when recomputing on every render is intended.\",\n },\n \"react-luau/prefer-use-ref-for-mutable-cell\": {\n before: `local cell = React.useMemo(function()\n\\treturn { current = initialValue }\nend, {})`,\n after: `local cell = React.useRef(initialValue)`,\n note: \"useRef directly expresses a stable mutable current cell.\",\n },\n \"react-luau/rerender-functional-setstate\": {\n before: `setCount(count + 1)`,\n after: `setCount(function(previous)\n\\treturn previous + 1\nend)`,\n note: \"Use the previous value supplied by React when a retained callback computes the next state from old state.\",\n },\n \"react-luau/rerender-lazy-state-init\": {\n before: `local value, setValue = React.useState(buildExpensiveValue())`,\n after: `local value, setValue = React.useState(function()\n\\treturn buildExpensiveValue()\nend)`,\n note: \"Pass a lazy initializer function so expensive construction only runs when the state is first created.\",\n },\n \"react-luau/rerender-lazy-ref-init\": {\n before: `local valueRef = React.useRef(buildExpensiveValue())`,\n after: `local valueRef = React.useRef(nil)\nif valueRef.current == nil then\n\\tvalueRef.current = buildExpensiveValue()\nend`,\n note: \"Use nil-guarded lazy initialization only for pure construction. Owned resources with cleanup usually belong in an effect.\",\n },\n \"react-luau/rerender-state-only-in-handlers\": {\n before: `local value, setValue = React.useState(0)\n\nlocal function onInput()\n\\tprint(value)\nend`,\n after: `local valueRef = React.useRef(0)\n\nlocal function onInput()\n\\tprint(valueRef.current)\nend`,\n note: \"Use a ref when updates do not need to participate in rendering or hook dependencies.\",\n },\n \"react-luau/no-set-state-in-render\": {\n before: `local value, setValue = React.useState(0)\nsetValue(nextValue)`,\n after: `local value, setValue = React.useState(0)\n\nReact.useEffect(function()\n\\tsetValue(nextValue)\nend, { nextValue })`,\n note: \"Move the update to the event or effect that owns it. Prefer deriving the value directly when no state synchronization is needed.\",\n },\n \"react-luau/no-direct-state-mutation\": {\n before: `items[index] = nextItem\nsetItems(items)`,\n after: `local nextItems = table.clone(items)\nnextItems[index] = nextItem\nsetItems(nextItems)`,\n note: \"Create a new table identity before updating React state.\",\n },\n \"react-luau/no-ref-current-in-render\": {\n before: `latest.current = value`,\n after: `React.useEffect(function()\n\\tlatest.current = value\nend, { value })`,\n note: \"When committed-versus-uncommitted values matter, update the latest-value ref after commit.\",\n },\n \"react-luau/no-create-context-in-render\": {\n before: `local function Component()\n\\tlocal Context = React.createContext(nil)\n\\treturn React.createElement(Context.Provider)\nend`,\n after: `local Context = React.createContext(nil)\n\nlocal function Component()\n\\treturn React.createElement(Context.Provider)\nend`,\n note: \"Create the Context once at module scope so its identity is stable.\",\n },\n \"react-luau/no-nested-component-definition\": {\n before: `local function Parent()\n\\tlocal function Child()\n\\t\\treturn React.createElement(\"Frame\")\n\\tend\n\\treturn React.createElement(Child)\nend`,\n after: `local function Child()\n\\treturn React.createElement(\"Frame\")\nend\n\nlocal function Parent()\n\\treturn React.createElement(Child)\nend`,\n note: \"Move component definitions out of render so React sees a stable component identity.\",\n },\n \"react-luau/no-random-key\": {\n before: `React.createElement(Row, {\n\\tkey = HttpService:GenerateGUID(false),\n})`,\n after: `React.createElement(Row, {\n\\tkey = item.id,\n})`,\n note: \"Use identity that remains stable for the lifetime of the logical item.\",\n },\n \"react-luau/no-yield-in-render\": {\n before: `local function Component(props)\n\\tlocal result = props.remote:InvokeServer()\n\\treturn React.createElement(\"TextLabel\", { Text = tostring(result) })\nend`,\n after: `local function Component(props)\n\\tlocal result, setResult = React.useState(\"Loading...\")\n\\tReact.useEffect(function()\n\\t\\tlocal active = true\n\\t\\ttask.spawn(function()\n\\t\\t\\tlocal ok, value = pcall(function()\n\\t\\t\\t\\treturn props.remote:InvokeServer()\n\\t\\t\\tend)\n\\t\\t\\tif active then\n\\t\\t\\t\\tsetResult(if ok then tostring(value) else \"Request failed\")\n\\t\\t\\tend\n\\t\\tend)\n\\t\\treturn function() active = false end\n\\tend, { props.remote })\n\\treturn React.createElement(\"TextLabel\", { Text = result })\nend`,\n note: \"Start yielding work after commit and ignore stale results after cleanup. This does not cancel the server request. Production data loading may also need retries or request deduplication.\",\n },\n \"react-luau/no-task-spawn-in-render\": {\n before: `local function Component()\n\\ttask.spawn(doWork)\n\\treturn React.createElement(\"Frame\")\nend`,\n after: `local function Component()\n\\tReact.useEffect(function()\n\\t\\tlocal thread = task.spawn(doWork)\n\\t\\treturn function()\n\\t\\t\\tif coroutine.status(thread) ~= \"dead\" then\n\\t\\t\\t\\ttask.cancel(thread)\n\\t\\t\\tend\n\\t\\tend\n\\tend, { doWork })\n\\treturn React.createElement(\"Frame\")\nend`,\n note: \"Schedule work from the effect or event that owns the side effect, not while rendering.\",\n },\n \"react-luau/no-side-effects-in-render\": {\n before: `local connection = signal:Connect(onChanged)`,\n after: `React.useEffect(function()\n\\tlocal connection = signal:Connect(onChanged)\n\\treturn function()\n\\t\\tconnection:Disconnect()\n\\tend\nend, { signal, onChanged })`,\n note: \"Move imperative work into an owned effect with cleanup. Disconnect subscriptions, destroy owned Instances, and cancel tweens. Prefer React.createElement for React-owned Instances.\",\n },\n \"react-luau/no-create-root-in-render\": {\n before: `local function Component()\n\\tlocal root = ReactRoblox.createRoot(container)\n\\troot:render(element)\nend`,\n after: `local root = ReactRoblox.createRoot(container)\nroot:render(element)`,\n note: \"Create and own roots outside component render. A component should not imperatively create another React root while rendering.\",\n },\n \"react-luau/no-prop-mutation\": {\n before: `props.value = normalize(props.value)`,\n after: `local value = normalize(props.value)`,\n note: \"Treat props as immutable and derive a local value or update state in the owner.\",\n },\n \"react-luau/no-array-index-as-key\": {\n before: `for index, item in items do\n\\tchildren[index] = React.createElement(Row, {\n\\t\\tkey = index,\n\\t})\nend`,\n after: `for _, item in items do\n\\tchildren[item.id] = React.createElement(Row, {\n\\t\\tkey = item.id,\n\\t})\nend`,\n note: \"Use stable item identity when items can move. Keep positional identity only when replacing the occupant of a slot is intentional.\",\n },\n \"react-luau/unstable-context-value\": {\n before: `return React.createElement(Context.Provider, {\n\\tvalue = { user = user, theme = theme },\n})`,\n after: `local contextValue = React.useMemo(function()\n\\treturn { user = user, theme = theme }\nend, { user, theme })\n\nreturn React.createElement(Context.Provider, {\n\\tvalue = contextValue,\n})`,\n note: \"Memoize the provider value when consumer updates depend on table identity.\",\n },\n};\n\nexport function fixExampleForRule(ruleId: string): FixPreview | undefined {\n const example = examples[ruleId];\n return example ? { ...example, kind: example.kind ?? \"pattern\" } : undefined;\n}\n",
|
|
50
50
|
"import type { ScanProgress } from \"./types\";\n\nconst ANSI = {\n reset: \"\\u001b[0m\",\n dim: \"\\u001b[2m\",\n magenta: \"\\u001b[35m\",\n green: \"\\u001b[32m\",\n};\n\nfunction paint(value: string, code: string): string {\n return `${code}${value}${ANSI.reset}`;\n}\n\nfunction visibleLength(value: string): number {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\").length;\n}\n\nfunction truncateMiddle(value: string, width: number): string {\n if (width <= 0) return \"\";\n if (value.length <= width) return value;\n if (width <= 3) return value.slice(0, width);\n const left = Math.ceil((width - 1) / 2);\n const right = Math.floor((width - 1) / 2);\n return `${value.slice(0, left)}…${value.slice(value.length - right)}`;\n}\n\nexport function formatScanProgress(progress: ScanProgress, terminalWidth = 120, colorized = false): string {\n const total = Math.max(0, progress.total);\n const current = Math.max(0, Math.min(progress.current, total || progress.current));\n const ratio = total === 0 ? 1 : current / total;\n const percent = Math.round(ratio * 100);\n const counter = `${current}/${total}`;\n const prefix = `${progress.label ?? `Scanning${progress.phase ? ` ${progress.phase}` : \"\"}`} `;\n const suffix = `${percent.toString().padStart(3)}% ${counter}`;\n const fileBudget = Math.max(0, terminalWidth - prefix.length - suffix.length - 38);\n const file = progress.file && fileBudget >= 8 ? ` ${truncateMiddle(progress.file, fileBudget)}` : \"\";\n const barWidth = Math.max(12, Math.min(28, terminalWidth - prefix.length - suffix.length - file.length - 8));\n const filled = Math.max(0, Math.min(barWidth, Math.round(ratio * barWidth)));\n const active = \"█\".repeat(filled);\n const remaining = \"░\".repeat(barWidth - filled);\n const coloredActive = active ? paint(active, progress.partial ? ANSI.magenta : current >= total ? ANSI.green : ANSI.magenta) : \"\";\n const coloredRemaining = remaining ? paint(remaining, ANSI.dim) : \"\";\n const bar = colorized ? `${coloredActive}${coloredRemaining}` : `${active}${remaining}`;\n const line = `${prefix}[${bar}] ${suffix}${file}`;\n return visibleLength(line) <= terminalWidth ? line : `${prefix}[${bar}] ${suffix}`;\n}\n\ninterface ProgressStream {\n isTTY?: boolean;\n columns?: number;\n write(value: string): unknown;\n}\n\nexport interface ProgressRenderer {\n update(progress: ScanProgress): void;\n clear(): void;\n}\n\nexport function createProgressRenderer(options: {\n stream?: ProgressStream;\n enabled?: boolean;\n colorized?: boolean;\n throttleMs?: number;\n} = {}): ProgressRenderer {\n const stream = options.stream ?? process.stdout;\n const enabled = options.enabled ?? Boolean(stream.isTTY && !process.env.CI);\n const colorized = options.colorized ?? false;\n const throttleMs = options.throttleMs ?? 40;\n let lastWriteAt = 0;\n let lastProgress: ScanProgress | null = null;\n let visible = false;\n\n function render(progress: ScanProgress, force = false): void {\n if (!enabled) return;\n lastProgress = progress;\n const now = performance.now();\n if (!force && progress.current < progress.total && now - lastWriteAt < throttleMs) return;\n lastWriteAt = now;\n const line = formatScanProgress(progress, stream.columns || 120, colorized);\n stream.write(`\\r\\u001b[2K${line}`);\n visible = true;\n }\n\n return {\n update(progress) {\n const phaseChanged = lastProgress?.phase !== progress.phase || lastProgress?.label !== progress.label;\n render(progress, phaseChanged || progress.current >= progress.total || Boolean(progress.partial));\n },\n clear() {\n if (!enabled || !visible) return;\n stream.write(\"\\r\\u001b[2K\");\n visible = false;\n },\n };\n}\n"
|
|
51
51
|
],
|
|
52
|
-
"mappings": "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",
|
|
53
|
-
"debugId": "
|
|
52
|
+
"mappings": "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",
|
|
53
|
+
"debugId": "32BB85E7FBDD457564756E2164756E21",
|
|
54
54
|
"names": []
|
|
55
55
|
}
|