-
Notifications
You must be signed in to change notification settings - Fork 13.3k
recursiveTypeRelatedTo_DepthLimit - diagnosing poor performance in TS 4.5+ #47208
Description
Bug Report
🔎 Search Terms
RangeError: Maximum call stack size exceeded
recursiveTypeRelatedTo_DepthLimit
🕗 Version & Regression Information
- This is a crash/degraded performance
- This changed between versions 4,4.4 and 4.5.1
💻 Code
package.json
{
"name": "node-sandbox",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"knex": "^0.95.14",
"objection": "^3.0.0",
"typescript": "^4.5"
}
}
code
import { Model } from 'objection';
export class User extends Model {
static tableName = 'user';
name!: string;
}
async function getUser() {
const k = await User.query().orWhere('id', 5).
}Default tsconfig.
🙁 Actual behavior
Open VS Code. Place cursor after the period on the query line. Invoke suggestions. "Loading.." takes about 5 seconds. At times hovering over "k" to look at the type also shows the same slow "Loading.." behavior. TS Server log shows this:
{"seq":5182,"type":"request","command":"completionEntryDetails","arguments":{"file":"c:/Users/JJH/Developer/node-sandbox/PersonModel.ts","line":38,"offset":49,"entryNames":["at"]}}
Info 16907[11:25:14.112] getCompletionData: Get current token: 0.01269996166229248
Info 16908[11:25:14.112] getCompletionData: Is inside comment: 0.02090001106262207
Info 16909[11:25:14.112] getCompletionData: Get previous token: 0.014299988746643066
Info 16910[11:25:14.112] getCompletionsAtPosition: isCompletionListBlocker: 0.003000020980834961
Info 16911[11:25:14.117] getCompletionData: Semantic work: 5.484899997711182
Info 16912[11:25:14.149] response:
{"seq":0,"type":"response","command":"completionEntryDetails","request_seq":5182,"success":true,"body":{"canceled":true}}
At other times it shows something like this
Perf 73 [16:28:04.912] 8::geterr: async elapsed time (in milliseconds) 0.6479
Info 74 [16:28:04.913] event:
{"seq":0,"type":"event","event":"syntaxDiag","body":{"file":"c:/Users/JJH/Developer/node-sandbox/BaseModel.ts","diagnostics":[]}}
Err 75 [16:28:05.852] Exception on executing command delayed processing of request 8:
Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded
at compareSignaturesRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62465:42)
at signatureRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64812:24)
at signaturesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64746:39)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64202:39)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at isPropertySymbolTypeRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64436:24)
at propertyRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64469:31)
at propertiesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64670:43)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64200:34)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at isPropertySymbolTypeRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64436:24)
at propertyRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64469:31)
at propertiesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64670:43)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63720:28)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63243:31)
at typeRelatedToSomeType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63460:35)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63732:32)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63191:30)
at checkTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62809:26)
at isTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62760:24)
at isTypeAssignableTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:61966:20)
at getConditionalType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:60775:77)
at getConditionalTypeInstantiation (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:61748:25)
at getConstraintOfDistributiveConditionalType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:57146:40)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64121:54)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at eachTypeRelatedToType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63527:35)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63729:29)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63191:30)
at isRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63095:24)
at compareSignaturesRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62578:25)
at signatureRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64812:24)
at signaturesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64746:39)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64202:39)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at isPropertySymbolTypeRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64436:24)
at propertyRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64469:31)
at propertiesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64670:43)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64200:34)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at isRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63095:24)
at compareSignaturesRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62578:25)
at signatureRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64812:24)
at signaturesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64746:39)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64202:39)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at isPropertySymbolTypeRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64436:24)
at propertyRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64469:31)
at propertiesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64670:43)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64200:34)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at isPropertySymbolTypeRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64436:24)
at propertyRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64469:31)
at propertiesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64670:43)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63720:28)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63243:31)
at typeRelatedToSomeType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63460:35)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63732:32)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63191:30)
at checkTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62809:26)
at isTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62760:24)
at isTypeAssignableTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:61966:20)
at getConditionalType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:60775:77)
at getConditionalTypeInstantiation (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:61748:25)
at getConstraintOfDistributiveConditionalType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:57146:40)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64121:54)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at recursiveTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63681:64)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63197:34)
at eachTypeRelatedToType (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63527:35)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63729:29)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
at isRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63191:30)
at isRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63095:24)
at compareSignaturesRelated (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:62578:25)
at signatureRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64812:24)
at signaturesRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64746:39)
at structuredTypeRelatedToWorker (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:64202:39)
at structuredTypeRelatedTo (c:\Users\JJH\Developer\node-sandbox\node_modules\typescript\lib\tsserver.js:63714:30)
Info 76 [16:28:05.852] event:
{"seq":0,"type":"event","event":"requestCompleted","body":{"request_seq":8}}
I've used --generateTrace and had a look at it. There is a "recursiveTypeRelatedTo_DepthLimit" event during structuredTypeRelatedTo which I'm guessing may be the underlying issue. Is this the likely culprit? What would be the best way to diagnose this? Also, why is TSC fast while tsserver inference is slow? The type-checking part of the compliation (checkSourceFile in the trace) only takes 1.5 seconds.