Skip to content

recursiveTypeRelatedTo_DepthLimit - diagnosing poor performance in TS 4.5+ #47208

Closed
@JeongJuhyeon

Description

@JeongJuhyeon

Bug Report

🔎 Search Terms

RangeError: Maximum call stack size exceeded

recursiveTypeRelatedTo_DepthLimit

Vincit/objection.js#2177

Vincit/objection.js#2178

🕗 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.

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptDuplicateAn existing issue was already createdRescheduledThis issue was previously scheduled to an earlier milestone

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions