Skip to content

Server crashes on large pattern matches #305

Closed
@alarbada

Description

@alarbada

I don't exactly know why, but the following code crashes 5 times my rescript language server:

module Typescript = {
  type project

  @module("ts-morph") @new
  external createProject: unit => project = "Project"

  type sourceFile

  @send
  external createSourceFile: (project, string, string) => sourceFile = ""

  type node

  @send
  external getChildren: (sourceFile, unit) => array<node> = ""

  @unboxed
  type kindNumber = KindNumber(int)

  @send
  external getKind: (node, unit) => kindNumber = ""

  @send
  external getKindName: (node, unit) => string = ""

  type syntaxKind =
    | Unknown
    | EndOfFileToken
    | SingleLineCommentTrivia
    | MultiLineCommentTrivia
    | NewLineTrivia
    | WhitespaceTrivia
    | ShebangTrivia
    | ConflictMarkerTrivia
    | NumericLiteral
    | BigIntLiteral
    | StringLiteral
    | JsxText
    | JsxTextAllWhiteSpaces
    | RegularExpressionLiteral
    | NoSubstitutionTemplateLiteral
    | TemplateHead
    | TemplateMiddle
    | TemplateTail
    | OpenBraceToken
    | CloseBraceToken
    | OpenParenToken
    | CloseParenToken
    | OpenBracketToken
    | CloseBracketToken
    | DotToken
    | DotDotDotToken
    | SemicolonToken
    | CommaToken
    | QuestionDotToken
    | LessThanToken
    | LessThanSlashToken
    | GreaterThanToken
    | LessThanEqualsToken
    | GreaterThanEqualsToken
    | EqualsEqualsToken
    | ExclamationEqualsToken
    | EqualsEqualsEqualsToken
    | ExclamationEqualsEqualsToken
    | EqualsGreaterThanToken
    | PlusToken
    | MinusToken
    | AsteriskToken
    | AsteriskAsteriskToken
    | SlashToken
    | PercentToken
    | PlusPlusToken
    | MinusMinusToken
    | LessThanLessThanToken
    | GreaterThanGreaterThanToken
    | GreaterThanGreaterThanGreaterThanToken
    | AmpersandToken
    | BarToken
    | CaretToken
    | ExclamationToken
    | TildeToken
    | AmpersandAmpersandToken
    | BarBarToken
    | QuestionToken
    | ColonToken
    | AtToken
    | QuestionQuestionToken
    | BacktickToken
    | HashToken
    | EqualsToken
    | PlusEqualsToken
    | MinusEqualsToken
    | AsteriskEqualsToken
    | AsteriskAsteriskEqualsToken
    | SlashEqualsToken
    | PercentEqualsToken
    | LessThanLessThanEqualsToken
    | GreaterThanGreaterThanEqualsToken
    | GreaterThanGreaterThanGreaterThanEqualsToken
    | AmpersandEqualsToken
    | BarEqualsToken
    | BarBarEqualsToken
    | AmpersandAmpersandEqualsToken
    | QuestionQuestionEqualsToken
    | CaretEqualsToken
    | Identifier
    | PrivateIdentifier
    | BreakKeyword
    | CaseKeyword
    | CatchKeyword
    | ClassKeyword
    | ConstKeyword
    | ContinueKeyword
    | DebuggerKeyword
    | DefaultKeyword
    | DeleteKeyword
    | DoKeyword
    | ElseKeyword
    | EnumKeyword
    | ExportKeyword
    | ExtendsKeyword
    | FalseKeyword
    | FinallyKeyword
    | ForKeyword
    | FunctionKeyword
    | IfKeyword
    | ImportKeyword
    | InKeyword
    | InstanceOfKeyword
    | NewKeyword
    | NullKeyword
    | ReturnKeyword
    | SuperKeyword
    | SwitchKeyword
    | ThisKeyword
    | ThrowKeyword
    | TrueKeyword
    | TryKeyword
    | TypeOfKeyword
    | VarKeyword
    | VoidKeyword
    | WhileKeyword
    | WithKeyword
    | ImplementsKeyword
    | InterfaceKeyword
    | LetKeyword
    | PackageKeyword
    | PrivateKeyword
    | ProtectedKeyword
    | PublicKeyword
    | StaticKeyword
    | YieldKeyword
    | AbstractKeyword
    | AsKeyword
    | AssertsKeyword
    | AnyKeyword
    | AsyncKeyword
    | AwaitKeyword
    | BooleanKeyword
    | ConstructorKeyword
    | DeclareKeyword
    | GetKeyword
    | InferKeyword
    | IntrinsicKeyword
    | IsKeyword
    | KeyOfKeyword
    | ModuleKeyword
    | NamespaceKeyword
    | NeverKeyword
    | ReadonlyKeyword
    | RequireKeyword
    | NumberKeyword
    | ObjectKeyword
    | SetKeyword
    | StringKeyword
    | SymbolKeyword
    | TypeKeyword
    | UndefinedKeyword
    | UniqueKeyword
    | UnknownKeyword
    | FromKeyword
    | GlobalKeyword
    | BigIntKeyword
    | OverrideKeyword
    | OfKeyword
    | QualifiedName
    | ComputedPropertyName
    | TypeParameter
    | Parameter
    | Decorator
    | PropertySignature
    | PropertyDeclaration
    | MethodSignature
    | MethodDeclaration
    | ClassStaticBlockDeclaration
    | Constructor
    | GetAccessor
    | SetAccessor
    | CallSignature
    | ConstructSignature
    | IndexSignature
    | TypePredicate
    | TypeReference
    | FunctionType
    | ConstructorType
    | TypeQuery
    | TypeLiteral
    | ArrayType
    | TupleType
    | OptionalType
    | RestType
    | UnionType
    | IntersectionType
    | ConditionalType
    | InferType
    | ParenthesizedType
    | ThisType
    | TypeOperator
    | IndexedAccessType
    | MappedType
    | LiteralType
    | NamedTupleMember
    | TemplateLiteralType
    | TemplateLiteralTypeSpan
    | ImportType
    | ObjectBindingPattern
    | ArrayBindingPattern
    | BindingElement
    | ArrayLiteralExpression
    | ObjectLiteralExpression
    | PropertyAccessExpression
    | ElementAccessExpression
    | CallExpression
    | NewExpression
    | TaggedTemplateExpression
    | TypeAssertionExpression
    | ParenthesizedExpression
    | FunctionExpression
    | ArrowFunction
    | DeleteExpression
    | TypeOfExpression
    | VoidExpression
    | AwaitExpression
    | PrefixUnaryExpression
    | PostfixUnaryExpression
    | BinaryExpression
    | ConditionalExpression
    | TemplateExpression
    | YieldExpression
    | SpreadElement
    | ClassExpression
    | OmittedExpression
    | ExpressionWithTypeArguments
    | AsExpression
    | NonNullExpression
    | MetaProperty
    | SyntheticExpression
    | TemplateSpan
    | SemicolonClassElement
    | Block
    | EmptyStatement
    | VariableStatement
    | ExpressionStatement
    | IfStatement
    | DoStatement
    | WhileStatement
    | ForStatement
    | ForInStatement
    | ForOfStatement
    | ContinueStatement
    | BreakStatement
    | ReturnStatement
    | WithStatement
    | SwitchStatement
    | LabeledStatement
    | ThrowStatement
    | TryStatement
    | DebuggerStatement
    | VariableDeclaration
    | VariableDeclarationList
    | FunctionDeclaration
    | ClassDeclaration
    | InterfaceDeclaration
    | TypeAliasDeclaration
    | EnumDeclaration
    | ModuleDeclaration
    | ModuleBlock
    | CaseBlock
    | NamespaceExportDeclaration
    | ImportEqualsDeclaration
    | ImportDeclaration
    | ImportClause
    | NamespaceImport
    | NamedImports
    | ImportSpecifier
    | ExportAssignment
    | ExportDeclaration
    | NamedExports
    | NamespaceExport
    | ExportSpecifier
    | MissingDeclaration
    | ExternalModuleReference
    | JsxElement
    | JsxSelfClosingElement
    | JsxOpeningElement
    | JsxClosingElement
    | JsxFragment
    | JsxOpeningFragment
    | JsxClosingFragment
    | JsxAttribute
    | JsxAttributes
    | JsxSpreadAttribute
    | JsxExpression
    | CaseClause
    | DefaultClause
    | HeritageClause
    | CatchClause
    | PropertyAssignment
    | ShorthandPropertyAssignment
    | SpreadAssignment
    | EnumMember
    | UnparsedPrologue
    | UnparsedPrepend
    | UnparsedText
    | UnparsedInternalText
    | UnparsedSyntheticReference
    | SourceFile
    | Bundle
    | UnparsedSource
    | InputFiles
    | JSDocTypeExpression
    | JSDocNameReference
    | JSDocMemberName
    | JSDocAllType
    | JSDocUnknownType
    | JSDocNullableType
    | JSDocNonNullableType
    | JSDocOptionalType
    | JSDocFunctionType
    | JSDocVariadicType
    | JSDocNamepathType
    | JSDocComment
    | JSDocText
    | JSDocTypeLiteral
    | JSDocSignature
    | JSDocLink
    | JSDocLinkCode
    | JSDocLinkPlain
    | JSDocTag
    | JSDocAugmentsTag
    | JSDocImplementsTag
    | JSDocAuthorTag
    | JSDocDeprecatedTag
    | JSDocClassTag
    | JSDocPublicTag
    | JSDocPrivateTag
    | JSDocProtectedTag
    | JSDocReadonlyTag
    | JSDocOverrideTag
    | JSDocCallbackTag
    | JSDocEnumTag
    | JSDocParameterTag
    | JSDocReturnTag
    | JSDocThisTag
    | JSDocTypeTag
    | JSDocTemplateTag
    | JSDocTypedefTag
    | JSDocSeeTag
    | JSDocPropertyTag
    | SyntaxList
    | NotEmittedStatement
    | PartiallyEmittedExpression
    | CommaListExpression
    | MergeDeclarationMarker
    | EndOfDeclarationMarker
    | SyntheticReferenceExpression
    | Count
    | FirstAssignment
    | LastAssignment
    | FirstCompoundAssignment
    | LastCompoundAssignment
    | FirstReservedWord
    | LastReservedWord
    | FirstKeyword
    | LastKeyword
    | FirstFutureReservedWord
    | LastFutureReservedWord
    | FirstTypeNode
    | LastTypeNode
    | FirstPunctuation
    | LastPunctuation
    | FirstToken
    | LastToken
    | FirstTriviaToken
    | LastTriviaToken
    | FirstLiteralToken
    | LastLiteralToken
    | FirstTemplateToken
    | LastTemplateToken
    | FirstBinaryOperator
    | LastBinaryOperator
    | FirstStatement
    | LastStatement
    | FirstNode
    | FirstJSDocNode
    | LastJSDocNode
    | FirstJSDocTagNode
    | LastJSDocTagNode

  exception UnknownSyntaxKind

  let getSyntaxKind = (KindNumber(syntaxKind)) =>
    switch syntaxKind {
    | 0 => Unknown
    | 1 => EndOfFileToken
    | 2 => SingleLineCommentTrivia
    | 3 => MultiLineCommentTrivia
    | 4 => NewLineTrivia
    | 5 => WhitespaceTrivia
    | 6 => ShebangTrivia
    | 7 => ConflictMarkerTrivia
    | 8 => NumericLiteral
    | 9 => BigIntLiteral
    | 10 => StringLiteral
    | 11 => JsxText
    | 12 => JsxTextAllWhiteSpaces
    | 13 => RegularExpressionLiteral
    | 14 => NoSubstitutionTemplateLiteral
    | 15 => TemplateHead
    | 16 => TemplateMiddle
    | 17 => TemplateTail
    | 18 => OpenBraceToken
    | 19 => CloseBraceToken
    | 20 => OpenParenToken
    | 21 => CloseParenToken
    | 22 => OpenBracketToken
    | 23 => CloseBracketToken
    | 24 => DotToken
    | 25 => DotDotDotToken
    | 26 => SemicolonToken
    | 27 => CommaToken
    | 28 => QuestionDotToken
    | 29 => LessThanToken
    | 30 => LessThanSlashToken
    | 31 => GreaterThanToken
    | 32 => LessThanEqualsToken
    | 33 => GreaterThanEqualsToken
    | 34 => EqualsEqualsToken
    | 35 => ExclamationEqualsToken
    | 36 => EqualsEqualsEqualsToken
    | 37 => ExclamationEqualsEqualsToken
    | 38 => EqualsGreaterThanToken
    | 39 => PlusToken
    | 40 => MinusToken
    | 41 => AsteriskToken
    | 42 => AsteriskAsteriskToken
    | 43 => SlashToken
    | 44 => PercentToken
    | 45 => PlusPlusToken
    | 46 => MinusMinusToken
    | 47 => LessThanLessThanToken
    | 48 => GreaterThanGreaterThanToken
    | 49 => GreaterThanGreaterThanGreaterThanToken
    | 50 => AmpersandToken
    | 51 => BarToken
    | 52 => CaretToken
    | 53 => ExclamationToken
    | 54 => TildeToken
    | 55 => AmpersandAmpersandToken
    | 56 => BarBarToken
    | 57 => QuestionToken
    | 58 => ColonToken
    | 59 => AtToken
    | 60 => QuestionQuestionToken
    | 61 => BacktickToken
    | 62 => HashToken
    | 63 => EqualsToken
    | 64 => PlusEqualsToken
    | 65 => MinusEqualsToken
    | 66 => AsteriskEqualsToken
    | 67 => AsteriskAsteriskEqualsToken
    | 68 => SlashEqualsToken
    | 69 => PercentEqualsToken
    | 70 => LessThanLessThanEqualsToken
    | 71 => GreaterThanGreaterThanEqualsToken
    | 72 => GreaterThanGreaterThanGreaterThanEqualsToken
    | 73 => AmpersandEqualsToken
    | 74 => BarEqualsToken
    | 75 => BarBarEqualsToken
    | 76 => AmpersandAmpersandEqualsToken
    | 77 => QuestionQuestionEqualsToken
    | 78 => CaretEqualsToken
    | 79 => Identifier
    | 80 => PrivateIdentifier
    | 81 => BreakKeyword
    | 82 => CaseKeyword
    | 83 => CatchKeyword
    | 84 => ClassKeyword
    | 85 => ConstKeyword
    | 86 => ContinueKeyword
    | 87 => DebuggerKeyword
    | 88 => DefaultKeyword
    | 89 => DeleteKeyword
    | 90 => DoKeyword
    | 91 => ElseKeyword
    | 92 => EnumKeyword
    | 93 => ExportKeyword
    | 94 => ExtendsKeyword
    | 95 => FalseKeyword
    | 96 => FinallyKeyword
    | 97 => ForKeyword
    | 98 => FunctionKeyword
    | 99 => IfKeyword
    | 100 => ImportKeyword
    | 101 => InKeyword
    | 102 => InstanceOfKeyword
    | 103 => NewKeyword
    | 104 => NullKeyword
    | 105 => ReturnKeyword
    | 106 => SuperKeyword
    | 107 => SwitchKeyword
    | 108 => ThisKeyword
    | 109 => ThrowKeyword
    | 110 => TrueKeyword
    | 111 => TryKeyword
    | 112 => TypeOfKeyword
    | 113 => VarKeyword
    | 114 => VoidKeyword
    | 115 => WhileKeyword
    | 116 => WithKeyword
    | 117 => ImplementsKeyword
    | 118 => InterfaceKeyword
    | 119 => LetKeyword
    | 120 => PackageKeyword
    | 121 => PrivateKeyword
    | 122 => ProtectedKeyword
    | 123 => PublicKeyword
    | 124 => StaticKeyword
    | 125 => YieldKeyword
    | 126 => AbstractKeyword
    | 127 => AsKeyword
    | 128 => AssertsKeyword
    | 129 => AnyKeyword
    | 130 => AsyncKeyword
    | 131 => AwaitKeyword
    | 132 => BooleanKeyword
    | 133 => ConstructorKeyword
    | 134 => DeclareKeyword
    | 135 => GetKeyword
    | 136 => InferKeyword
    | 137 => IntrinsicKeyword
    | 138 => IsKeyword
    | 139 => KeyOfKeyword
    | 140 => ModuleKeyword
    | 141 => NamespaceKeyword
    | 142 => NeverKeyword
    | 143 => ReadonlyKeyword
    | 144 => RequireKeyword
    | 145 => NumberKeyword
    | 146 => ObjectKeyword
    | 147 => SetKeyword
    | 148 => StringKeyword
    | 149 => SymbolKeyword
    | 150 => TypeKeyword
    | 151 => UndefinedKeyword
    | 152 => UniqueKeyword
    | 153 => UnknownKeyword
    | 154 => FromKeyword
    | 155 => GlobalKeyword
    | 156 => BigIntKeyword
    | 157 => OverrideKeyword
    | 158 => OfKeyword
    | 159 => QualifiedName
    | 160 => ComputedPropertyName
    | 161 => TypeParameter
    | 162 => Parameter
    | 163 => Decorator
    | 164 => PropertySignature
    | 165 => PropertyDeclaration
    | 166 => MethodSignature
    | 167 => MethodDeclaration
    | 168 => ClassStaticBlockDeclaration
    | 169 => Constructor
    | 170 => GetAccessor
    | 171 => SetAccessor
    | 172 => CallSignature
    | 173 => ConstructSignature
    | 174 => IndexSignature
    | 175 => TypePredicate
    | 176 => TypeReference
    | 177 => FunctionType
    | 178 => ConstructorType
    | 179 => TypeQuery
    | 180 => TypeLiteral
    | 181 => ArrayType
    | 182 => TupleType
    | 183 => OptionalType
    | 184 => RestType
    | 185 => UnionType
    | 186 => IntersectionType
    | 187 => ConditionalType
    | 188 => InferType
    | 189 => ParenthesizedType
    | 190 => ThisType
    | 191 => TypeOperator
    | 192 => IndexedAccessType
    | 193 => MappedType
    | 194 => LiteralType
    | 195 => NamedTupleMember
    | 196 => TemplateLiteralType
    | 197 => TemplateLiteralTypeSpan
    | 198 => ImportType
    | 199 => ObjectBindingPattern
    | 200 => ArrayBindingPattern
    | 201 => BindingElement
    | 202 => ArrayLiteralExpression
    | 203 => ObjectLiteralExpression
    | 204 => PropertyAccessExpression
    | 205 => ElementAccessExpression
    | 206 => CallExpression
    | 207 => NewExpression
    | 208 => TaggedTemplateExpression
    | 209 => TypeAssertionExpression
    | 210 => ParenthesizedExpression
    | 211 => FunctionExpression
    | 212 => ArrowFunction
    | 213 => DeleteExpression
    | 214 => TypeOfExpression
    | 215 => VoidExpression
    | 216 => AwaitExpression
    | 217 => PrefixUnaryExpression
    | 218 => PostfixUnaryExpression
    | 219 => BinaryExpression
    | 220 => ConditionalExpression
    | 221 => TemplateExpression
    | 222 => YieldExpression
    | 223 => SpreadElement
    | 224 => ClassExpression
    | 225 => OmittedExpression
    | 226 => ExpressionWithTypeArguments
    | 227 => AsExpression
    | 228 => NonNullExpression
    | 229 => MetaProperty
    | 230 => SyntheticExpression
    | 231 => TemplateSpan
    | 232 => SemicolonClassElement
    | 233 => Block
    | 234 => EmptyStatement
    | 235 => VariableStatement
    | 236 => ExpressionStatement
    | 237 => IfStatement
    | 238 => DoStatement
    | 239 => WhileStatement
    | 240 => ForStatement
    | 241 => ForInStatement
    | 242 => ForOfStatement
    | 243 => ContinueStatement
    | 244 => BreakStatement
    | 245 => ReturnStatement
    | 246 => WithStatement
    | 247 => SwitchStatement
    | 248 => LabeledStatement
    | 249 => ThrowStatement
    | 250 => TryStatement
    | 251 => DebuggerStatement
    | 252 => VariableDeclaration
    | 253 => VariableDeclarationList
    | 254 => FunctionDeclaration
    | 255 => ClassDeclaration
    | 256 => InterfaceDeclaration
    | 257 => TypeAliasDeclaration
    | 258 => EnumDeclaration
    | 259 => ModuleDeclaration
    | 260 => ModuleBlock
    | 261 => CaseBlock
    | 262 => NamespaceExportDeclaration
    | 263 => ImportEqualsDeclaration
    | 264 => ImportDeclaration
    | 265 => ImportClause
    | 266 => NamespaceImport
    | 267 => NamedImports
    | 268 => ImportSpecifier
    | 269 => ExportAssignment
    | 270 => ExportDeclaration
    | 271 => NamedExports
    | 272 => NamespaceExport
    | 273 => ExportSpecifier
    | 274 => MissingDeclaration
    | 275 => ExternalModuleReference
    | 276 => JsxElement
    | 277 => JsxSelfClosingElement
    | 278 => JsxOpeningElement
    | 279 => JsxClosingElement
    | 280 => JsxFragment
    | 281 => JsxOpeningFragment
    | 282 => JsxClosingFragment
    | 283 => JsxAttribute
    | 284 => JsxAttributes
    | 285 => JsxSpreadAttribute
    | 286 => JsxExpression
    | 287 => CaseClause
    | 288 => DefaultClause
    | 289 => HeritageClause
    | 290 => CatchClause
    | 291 => PropertyAssignment
    | 292 => ShorthandPropertyAssignment
    | 293 => SpreadAssignment
    | 294 => EnumMember
    | 295 => UnparsedPrologue
    | 296 => UnparsedPrepend
    | 297 => UnparsedText
    | 298 => UnparsedInternalText
    | 299 => UnparsedSyntheticReference
    | 300 => SourceFile
    | 301 => Bundle
    | 302 => UnparsedSource
    | 303 => InputFiles
    | 304 => JSDocTypeExpression
    | 305 => JSDocNameReference
    | 306 => JSDocMemberName
    | 307 => JSDocAllType
    | 308 => JSDocUnknownType
    | 309 => JSDocNullableType
    | 310 => JSDocNonNullableType
    | 311 => JSDocOptionalType
    | 312 => JSDocFunctionType
    | 313 => JSDocVariadicType
    | 314 => JSDocNamepathType
    | 315 => JSDocComment
    | 316 => JSDocText
    | 317 => JSDocTypeLiteral
    | 318 => JSDocSignature
    | 319 => JSDocLink
    | 320 => JSDocLinkCode
    | 321 => JSDocLinkPlain
    | 322 => JSDocTag
    | 323 => JSDocAugmentsTag
    | 324 => JSDocImplementsTag
    | 325 => JSDocAuthorTag
    | 326 => JSDocDeprecatedTag
    | 327 => JSDocClassTag
    | 328 => JSDocPublicTag
    | 329 => JSDocPrivateTag
    | 330 => JSDocProtectedTag
    | 331 => JSDocReadonlyTag
    | 332 => JSDocOverrideTag
    | 333 => JSDocCallbackTag
    | 334 => JSDocEnumTag
    | 335 => JSDocParameterTag
    | 336 => JSDocReturnTag
    | 337 => JSDocThisTag
    | 338 => JSDocTypeTag
    | 339 => JSDocTemplateTag
    | 340 => JSDocTypedefTag
    | 341 => JSDocSeeTag
    | 342 => JSDocPropertyTag
    | 343 => SyntaxList
    | 344 => NotEmittedStatement
    | 345 => PartiallyEmittedExpression
    | 346 => CommaListExpression
    | 347 => MergeDeclarationMarker
    | 348 => EndOfDeclarationMarker
    | 349 => SyntheticReferenceExpression
    | 350 => Count
    | _ => raise(UnknownSyntaxKind)
    }
}

let program = Typescript.createProject()

Typescript. // Calling intellisense completion crashes the server. I have mapped it to Ctrl + splace.

After that I have to reload the plugin. Is this expected?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions