indent-ts.js 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439
  1. /**
  2. * @author Yosuke Ota
  3. * See LICENSE file in root directory for full license.
  4. */
  5. 'use strict'
  6. const {
  7. isClosingParenToken,
  8. isOpeningParenToken,
  9. isOpeningBraceToken,
  10. isNotClosingParenToken,
  11. isClosingBracketToken,
  12. isOpeningBracketToken
  13. } = require('@eslint-community/eslint-utils')
  14. const { isTypeNode } = require('./ts-ast-utils')
  15. /**
  16. * @typedef {import('../../typings/eslint-plugin-vue/util-types/indent-helper').TSNodeListener} TSNodeListener
  17. * @typedef {import('../../typings/eslint-plugin-vue/util-types/node').HasLocation} HasLocation
  18. * @typedef { { type: string } & HasLocation } MaybeNode
  19. */
  20. /**
  21. * @typedef {import('@typescript-eslint/types').TSESTree.Node} TSESTreeNode
  22. * @typedef {import('@typescript-eslint/types').TSESTree.ClassExpression} ClassExpression
  23. * @typedef {import('@typescript-eslint/types').TSESTree.ClassDeclaration} ClassDeclaration
  24. * @typedef {import('@typescript-eslint/types').TSESTree.TSTypeAliasDeclaration} TSTypeAliasDeclaration
  25. * @typedef {import('@typescript-eslint/types').TSESTree.TSCallSignatureDeclaration} TSCallSignatureDeclaration
  26. * @typedef {import('@typescript-eslint/types').TSESTree.TSConstructSignatureDeclaration} TSConstructSignatureDeclaration
  27. * @typedef {import('@typescript-eslint/types').TSESTree.TSImportEqualsDeclaration} TSImportEqualsDeclaration
  28. * @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractMethodDefinition} TSAbstractMethodDefinition
  29. * @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractPropertyDefinition} TSAbstractPropertyDefinition
  30. * @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractAccessorProperty} TSAbstractAccessorProperty
  31. * @typedef {import('@typescript-eslint/types').TSESTree.TSEnumMember} TSEnumMember
  32. * @typedef {import('@typescript-eslint/types').TSESTree.TSPropertySignature} TSPropertySignature
  33. * @typedef {import('@typescript-eslint/types').TSESTree.TSIndexSignature} TSIndexSignature
  34. * @typedef {import('@typescript-eslint/types').TSESTree.TSMethodSignature} TSMethodSignature
  35. * @typedef {import('@typescript-eslint/types').TSESTree.TSTypeParameterInstantiation} TSTypeParameterInstantiation
  36. * @typedef {import('@typescript-eslint/types').TSESTree.TSTypeParameterDeclaration} TSTypeParameterDeclaration
  37. * @typedef {import('@typescript-eslint/types').TSESTree.TSConstructorType} TSConstructorType
  38. * @typedef {import('@typescript-eslint/types').TSESTree.TSFunctionType} TSFunctionType
  39. * @typedef {import('@typescript-eslint/types').TSESTree.TSUnionType} TSUnionType
  40. * @typedef {import('@typescript-eslint/types').TSESTree.TSIntersectionType} TSIntersectionType
  41. * @typedef {import('@typescript-eslint/types').TSESTree.TSInterfaceHeritage} TSInterfaceHeritage
  42. * @typedef {import('@typescript-eslint/types').TSESTree.TSClassImplements} TSClassImplements
  43. * @typedef {import('@typescript-eslint/types').TSESTree.TSInterfaceBody} TSInterfaceBody
  44. * @typedef {import('@typescript-eslint/types').TSESTree.TSModuleBlock} TSModuleBlock
  45. * @typedef {import('@typescript-eslint/types').TSESTree.TSDeclareFunction} TSDeclareFunction
  46. * @typedef {import('@typescript-eslint/types').TSESTree.TSEmptyBodyFunctionExpression} TSEmptyBodyFunctionExpression
  47. * @typedef {import('@typescript-eslint/types').TSESTree.TSTypeOperator} TSTypeOperator
  48. * @typedef {import('@typescript-eslint/types').TSESTree.TSTypeQuery} TSTypeQuery
  49. * @typedef {import('@typescript-eslint/types').TSESTree.TSInferType} TSInferType
  50. * @typedef {import('@typescript-eslint/types').TSESTree.TSOptionalType} TSOptionalType
  51. * @typedef {import('@typescript-eslint/types').TSESTree.TSNonNullExpression} TSNonNullExpression
  52. * @typedef {import('@typescript-eslint/types').TSESTree.TSAsExpression} TSAsExpression
  53. * @typedef {import('@typescript-eslint/types').TSESTree.TSSatisfiesExpression} TSSatisfiesExpression
  54. * @typedef {import('@typescript-eslint/types').TSESTree.TSTypeReference} TSTypeReference
  55. * @typedef {import('@typescript-eslint/types').TSESTree.TSInstantiationExpression} TSInstantiationExpression
  56. * @typedef {import('@typescript-eslint/types').TSESTree.JSXChild} JSXChild
  57. * @typedef {import('@typescript-eslint/types').TSESTree.TypeNode} TypeNode
  58. *
  59. */
  60. /**
  61. * Deprecated in @typescript-eslint/parser v5
  62. * @typedef {import('@typescript-eslint/types').TSESTree.PropertyDefinition} ClassProperty
  63. * @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractPropertyDefinition} TSAbstractClassProperty
  64. */
  65. module.exports = {
  66. defineVisitor
  67. }
  68. /**
  69. * Process the given node list.
  70. * The first node is offsetted from the given left token.
  71. * Rest nodes are adjusted to the first node.
  72. * @callback ProcessNodeList
  73. * @param {(MaybeNode|null)[]} nodeList The node to process.
  74. * @param {MaybeNode|Token|null} left The left parenthesis token.
  75. * @param {MaybeNode|Token|null} right The right parenthesis token.
  76. * @param {number} offset The offset to set.
  77. * @param {boolean} [alignVertically=true] The flag to align vertically. If `false`, this doesn't align vertically even if the first node is not at beginning of line.
  78. * @returns {void}
  79. */
  80. /**
  81. * Set offset to the given tokens.
  82. * @callback SetOffset
  83. * @param {Token|Token[]|null|(Token|null)[]} token The token to set.
  84. * @param {number} offset The offset of the tokens.
  85. * @param {Token} baseToken The token of the base offset.
  86. * @returns {void}
  87. */
  88. /**
  89. *
  90. * Copy offset to the given tokens from srcToken.
  91. * @callback CopyOffset
  92. * @param {Token} token The token to set.
  93. * @param {Token} srcToken The token of the source offset.
  94. * @returns {void}
  95. */
  96. /**
  97. * Process semicolons of the given statement node.
  98. * @callback ProcessSemicolons
  99. * @param {MaybeNode} node The statement node to process.
  100. * @returns {void}
  101. */
  102. /**
  103. * Get the first and last tokens of the given node.
  104. * If the node is parenthesized, this gets the outermost parentheses.
  105. * @callback GetFirstAndLastTokens
  106. * @param {MaybeNode} node The node to get.
  107. * @param {number} [borderOffset] The least offset of the first token. Defailt is 0. This value is used to prevent false positive in the following case: `(a) => {}` The parentheses are enclosing the whole parameter part rather than the first parameter, but this offset parameter is needed to distinguish.
  108. * @returns {{firstToken:Token,lastToken:Token}} The gotten tokens.
  109. */
  110. /**
  111. * @typedef {object} DefineVisitorParam
  112. * @property {ProcessNodeList} processNodeList
  113. * @property {ParserServices.TokenStore | SourceCode} tokenStore
  114. * @property {SetOffset} setOffset
  115. * @property {CopyOffset} copyOffset
  116. * @property {ProcessSemicolons} processSemicolons
  117. * @property {GetFirstAndLastTokens} getFirstAndLastTokens
  118. */
  119. /**
  120. * @param {DefineVisitorParam} param
  121. * @returns {TSNodeListener}
  122. */
  123. function defineVisitor({
  124. processNodeList,
  125. tokenStore,
  126. setOffset,
  127. copyOffset,
  128. processSemicolons,
  129. getFirstAndLastTokens
  130. }) {
  131. /**
  132. * Check whether a given token is the first token of:
  133. *
  134. * - A parameter of TSTypeParameterInstantiation
  135. * - An element of TSTupleType
  136. *
  137. * @param {Token} token The token to check.
  138. * @param {TSUnionType | TSIntersectionType} belongingNode The node that the token is belonging to.
  139. * @returns {boolean} `true` if the token is the first token of an element.
  140. */
  141. function isBeginningOfElement(token, belongingNode) {
  142. /** @type {TSESTreeNode | null} */
  143. let node = belongingNode
  144. while (node != null && node.parent != null) {
  145. /** @type {TSESTreeNode} */
  146. const parent = node.parent
  147. if (parent.type === 'TSTypeParameterInstantiation') {
  148. return (
  149. parent.params.length >= 2 &&
  150. parent.params.some(
  151. (param) =>
  152. getFirstAndLastTokens(param).firstToken.range[0] ===
  153. token.range[0]
  154. )
  155. )
  156. }
  157. if (parent.type === 'TSTupleType') {
  158. return parent.elementTypes.some(
  159. (element) =>
  160. element != null &&
  161. getFirstAndLastTokens(element).firstToken.range[0] ===
  162. token.range[0]
  163. )
  164. }
  165. node = parent
  166. }
  167. return false
  168. }
  169. return {
  170. // Support TypeScript
  171. /** @param {ClassDeclaration | ClassExpression} node */
  172. ['ClassDeclaration[implements], ClassDeclaration[typeParameters], ClassDeclaration[superTypeParameters],' +
  173. 'ClassExpression[implements], ClassExpression[typeParameters], ClassExpression[superTypeParameters]'](
  174. node
  175. ) {
  176. if (node.typeParameters != null) {
  177. setOffset(
  178. tokenStore.getFirstToken(node.typeParameters),
  179. 1,
  180. tokenStore.getFirstToken(node.id || node)
  181. )
  182. }
  183. if (node.superTypeParameters != null && node.superClass != null) {
  184. setOffset(
  185. tokenStore.getFirstToken(node.superTypeParameters),
  186. 1,
  187. tokenStore.getFirstToken(node.superClass)
  188. )
  189. }
  190. if (node.implements != null && node.implements.length > 0) {
  191. const classToken = tokenStore.getFirstToken(node)
  192. const implementsToken = tokenStore.getTokenBefore(node.implements[0])
  193. setOffset(implementsToken, 1, classToken)
  194. processNodeList(node.implements, implementsToken, null, 1)
  195. }
  196. },
  197. // Process semicolons.
  198. /**
  199. * @param {TSTypeAliasDeclaration
  200. * | TSCallSignatureDeclaration
  201. * | TSConstructSignatureDeclaration
  202. * | TSImportEqualsDeclaration
  203. * | TSAbstractMethodDefinition
  204. * | TSAbstractPropertyDefinition
  205. * | TSAbstractAccessorProperty
  206. * | TSEnumMember
  207. * | TSPropertySignature
  208. * | TSIndexSignature
  209. * | TSMethodSignature
  210. * | ClassProperty
  211. * | TSAbstractClassProperty} node
  212. */
  213. ['TSTypeAliasDeclaration, TSCallSignatureDeclaration, TSConstructSignatureDeclaration, TSImportEqualsDeclaration,' +
  214. 'TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSAbstractAccessorProperty, TSEnumMember,' +
  215. 'TSPropertySignature, TSIndexSignature, TSMethodSignature,' +
  216. // Deprecated in @typescript-eslint/parser v5
  217. 'ClassProperty, TSAbstractClassProperty'](node) {
  218. processSemicolons(node)
  219. },
  220. /**
  221. * @param {TSESTreeNode} node
  222. */
  223. // eslint-disable-next-line complexity -- ignore
  224. '*[type=/^TS/]'(node) {
  225. if (!isTypeNode(node)) {
  226. return
  227. }
  228. const typeNode = node
  229. if (/** @type {any} */ (typeNode.parent).type === 'TSParenthesizedType') {
  230. return
  231. }
  232. // Process parentheses.
  233. let leftToken = tokenStore.getTokenBefore(node)
  234. let rightToken = tokenStore.getTokenAfter(node)
  235. let firstToken = tokenStore.getFirstToken(node)
  236. while (
  237. leftToken &&
  238. rightToken &&
  239. isOpeningParenToken(leftToken) &&
  240. isClosingParenToken(rightToken)
  241. ) {
  242. setOffset(firstToken, 1, leftToken)
  243. setOffset(rightToken, 0, leftToken)
  244. firstToken = leftToken
  245. leftToken = tokenStore.getTokenBefore(leftToken)
  246. rightToken = tokenStore.getTokenAfter(rightToken)
  247. }
  248. },
  249. /**
  250. * Process type annotation
  251. *
  252. * e.g.
  253. * ```
  254. * const foo: Type
  255. * // ^^^^^^
  256. * type foo = () => string
  257. * // ^^^^^^^^^
  258. * ```
  259. */
  260. TSTypeAnnotation(node) {
  261. const [colonOrArrowToken, secondToken] = tokenStore.getFirstTokens(node, {
  262. count: 2,
  263. includeComments: false
  264. })
  265. const baseToken = tokenStore.getFirstToken(
  266. /** @type {HasLocation} */ (node.parent)
  267. )
  268. setOffset([colonOrArrowToken, secondToken], 1, baseToken)
  269. // a ?: T
  270. const before = tokenStore.getTokenBefore(colonOrArrowToken)
  271. if (before && before.value === '?') {
  272. setOffset(before, 1, baseToken)
  273. }
  274. },
  275. /**
  276. * Process as expression or satisfies expression
  277. *
  278. * e.g.
  279. * ```
  280. * var foo = bar as boolean
  281. * // ^^^^^^^^^^^^^^
  282. * ```
  283. *
  284. * e.g.
  285. * ```
  286. * var foo = bar satisfies Bar
  287. * // ^^^^^^^^^^^^^^^^^
  288. * ```
  289. *
  290. * @param {TSAsExpression | TSSatisfiesExpression} node
  291. */
  292. 'TSAsExpression, TSSatisfiesExpression'(node) {
  293. const expressionTokens = getFirstAndLastTokens(node.expression)
  294. const asOrSatisfiesToken = tokenStore.getTokenAfter(
  295. expressionTokens.lastToken
  296. )
  297. setOffset(
  298. [
  299. asOrSatisfiesToken,
  300. getFirstAndLastTokens(node.typeAnnotation).firstToken
  301. ],
  302. 1,
  303. expressionTokens.firstToken
  304. )
  305. },
  306. /**
  307. * Process type reference and instantiation expression
  308. *
  309. * e.g.
  310. * ```
  311. * const foo: Type<P>
  312. * // ^^^^^^^
  313. * ```
  314. *
  315. * e.g.
  316. * ```
  317. * const ErrorMap = Map<string, Error>;
  318. * // ^^^^^^^^^^^^^^^^^^
  319. * ```
  320. *
  321. * @param {TSTypeReference | TSInstantiationExpression} node
  322. */
  323. 'TSTypeReference, TSInstantiationExpression'(node) {
  324. if (node.typeParameters) {
  325. const firstToken = tokenStore.getFirstToken(node)
  326. setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken)
  327. }
  328. },
  329. /**
  330. * Process type parameter instantiation and type parameter declaration
  331. *
  332. * e.g.
  333. * ```
  334. * const foo: Type<P>
  335. * // ^^^
  336. * ```
  337. *
  338. * e.g.
  339. * ```
  340. * type Foo<T>
  341. * // ^^^
  342. * ```
  343. * @param {TSTypeParameterInstantiation | TSTypeParameterDeclaration} node
  344. */
  345. 'TSTypeParameterInstantiation, TSTypeParameterDeclaration'(node) {
  346. // <T>
  347. processNodeList(
  348. node.params,
  349. tokenStore.getFirstToken(node),
  350. tokenStore.getLastToken(node),
  351. 1
  352. )
  353. },
  354. /**
  355. * Process type alias declaration
  356. *
  357. * e.g.
  358. * ```
  359. * type Foo
  360. * ```
  361. */
  362. TSTypeAliasDeclaration(node) {
  363. // type T = {}
  364. const typeToken = tokenStore.getFirstToken(node)
  365. const idToken = tokenStore.getFirstToken(node.id)
  366. setOffset(idToken, 1, typeToken)
  367. let eqToken
  368. if (node.typeParameters) {
  369. setOffset(tokenStore.getFirstToken(node.typeParameters), 1, idToken)
  370. eqToken = tokenStore.getTokenAfter(node.typeParameters)
  371. } else {
  372. eqToken = tokenStore.getTokenAfter(node.id)
  373. }
  374. const initToken = tokenStore.getTokenAfter(eqToken)
  375. setOffset([eqToken, initToken], 1, idToken)
  376. },
  377. /**
  378. * Process constructor type or function type
  379. *
  380. * e.g.
  381. * ```
  382. * type Foo = new () => T
  383. * // ^^^^^^^^^^^
  384. * type Foo = () => void
  385. * // ^^^^^^^^^^
  386. * ```
  387. * @param {TSConstructorType | TSFunctionType} node
  388. */
  389. 'TSConstructorType, TSFunctionType'(node) {
  390. // ()=>void
  391. const firstToken = tokenStore.getFirstToken(node)
  392. // new or < or (
  393. let currToken = firstToken
  394. if (node.type === 'TSConstructorType') {
  395. // currToken is new token
  396. // < or (
  397. currToken = tokenStore.getTokenAfter(currToken)
  398. setOffset(currToken, 1, firstToken)
  399. }
  400. if (node.typeParameters) {
  401. // currToken is < token
  402. // (
  403. currToken = tokenStore.getTokenAfter(node.typeParameters)
  404. setOffset(currToken, 1, firstToken)
  405. }
  406. const leftParenToken = currToken
  407. const rightParenToken = /**@type {Token} */ (
  408. tokenStore.getTokenAfter(
  409. node.params[node.params.length - 1] || leftParenToken,
  410. isClosingParenToken
  411. )
  412. )
  413. processNodeList(node.params, leftParenToken, rightParenToken, 1)
  414. const arrowToken = tokenStore.getTokenAfter(rightParenToken)
  415. setOffset(arrowToken, 1, leftParenToken)
  416. },
  417. /**
  418. * Process type literal
  419. *
  420. * e.g.
  421. * ```
  422. * const foo: { bar: string }
  423. * // ^^^^^^^^^^^^^^^
  424. * ```
  425. */
  426. TSTypeLiteral(node) {
  427. processNodeList(
  428. node.members,
  429. tokenStore.getFirstToken(node),
  430. tokenStore.getLastToken(node),
  431. 1
  432. )
  433. },
  434. /**
  435. * Process property signature
  436. *
  437. * e.g.
  438. * ```
  439. * const foo: { bar: string }
  440. * // ^^^^^^^^^^^
  441. * ```
  442. */
  443. TSPropertySignature(node) {
  444. const firstToken = tokenStore.getFirstToken(node)
  445. const keyTokens = getFirstAndLastTokens(node.key)
  446. let keyLast
  447. if (node.computed) {
  448. const closeBracket = tokenStore.getTokenAfter(keyTokens.lastToken)
  449. processNodeList([node.key], firstToken, closeBracket, 1)
  450. keyLast = closeBracket
  451. } else {
  452. keyLast = keyTokens.lastToken
  453. }
  454. if (node.typeAnnotation) {
  455. const typeAnnotationToken = tokenStore.getFirstToken(
  456. node.typeAnnotation
  457. )
  458. setOffset(
  459. [
  460. ...tokenStore.getTokensBetween(keyLast, typeAnnotationToken),
  461. typeAnnotationToken
  462. ],
  463. 1,
  464. firstToken
  465. )
  466. } else if (node.optional) {
  467. const qToken = tokenStore.getLastToken(node)
  468. setOffset(qToken, 1, firstToken)
  469. }
  470. },
  471. /**
  472. * Process index signature
  473. *
  474. * e.g.
  475. * ```
  476. * const foo: { [bar: string]: string }
  477. * // ^^^^^^^^^^^^^^^^^^^^^
  478. * ```
  479. */
  480. TSIndexSignature(node) {
  481. const leftBracketToken = tokenStore.getFirstToken(node)
  482. const rightBracketToken = /**@type {Token} */ (
  483. tokenStore.getTokenAfter(
  484. node.parameters[node.parameters.length - 1] || leftBracketToken,
  485. isClosingBracketToken
  486. )
  487. )
  488. processNodeList(node.parameters, leftBracketToken, rightBracketToken, 1)
  489. const keyLast = rightBracketToken
  490. if (node.typeAnnotation) {
  491. const typeAnnotationToken = tokenStore.getFirstToken(
  492. node.typeAnnotation
  493. )
  494. setOffset(
  495. [
  496. ...tokenStore.getTokensBetween(keyLast, typeAnnotationToken),
  497. typeAnnotationToken
  498. ],
  499. 1,
  500. leftBracketToken
  501. )
  502. }
  503. },
  504. /**
  505. * Process array type
  506. *
  507. * e.g.
  508. * ```
  509. * const foo: Type[]
  510. * // ^^^^^^
  511. * ```
  512. */
  513. TSArrayType(node) {
  514. const firstToken = tokenStore.getFirstToken(node)
  515. setOffset(
  516. tokenStore.getLastTokens(node, { count: 2, includeComments: false }),
  517. 0,
  518. firstToken
  519. )
  520. },
  521. TSTupleType(node) {
  522. // [T, U]
  523. processNodeList(
  524. node.elementTypes,
  525. tokenStore.getFirstToken(node),
  526. tokenStore.getLastToken(node),
  527. 1
  528. )
  529. },
  530. TSQualifiedName(node) {
  531. // A.B
  532. const objectToken = tokenStore.getFirstToken(node)
  533. const dotToken = tokenStore.getTokenBefore(node.right)
  534. const propertyToken = tokenStore.getTokenAfter(dotToken)
  535. setOffset([dotToken, propertyToken], 1, objectToken)
  536. },
  537. TSIndexedAccessType(node) {
  538. // A[B]
  539. const objectToken = tokenStore.getFirstToken(node)
  540. const leftBracketToken = tokenStore.getTokenBefore(
  541. node.indexType,
  542. isOpeningBracketToken
  543. )
  544. const rightBracketToken = tokenStore.getTokenAfter(
  545. node.indexType,
  546. isClosingBracketToken
  547. )
  548. setOffset(leftBracketToken, 1, objectToken)
  549. processNodeList([node.indexType], leftBracketToken, rightBracketToken, 1)
  550. },
  551. /** @param {TSUnionType | TSIntersectionType} node */
  552. 'TSUnionType, TSIntersectionType'(node) {
  553. // A | B
  554. // A & B
  555. const firstToken = tokenStore.getFirstToken(node)
  556. const prevToken = tokenStore.getTokenBefore(firstToken)
  557. const shouldIndent =
  558. prevToken == null ||
  559. prevToken.loc.end.line === firstToken.loc.start.line ||
  560. isBeginningOfElement(firstToken, node)
  561. const offset = shouldIndent ? 1 : 0
  562. const typeTokensList = node.types.map(getFirstAndLastTokens)
  563. const typeTokens = typeTokensList.shift()
  564. if (!typeTokens) {
  565. return
  566. }
  567. let lastToken
  568. if (typeTokens.firstToken === firstToken) {
  569. lastToken = typeTokens.lastToken
  570. } else {
  571. typeTokensList.unshift(typeTokens)
  572. lastToken = firstToken
  573. }
  574. for (const typeTokens of typeTokensList) {
  575. setOffset(
  576. tokenStore.getTokensBetween(lastToken, typeTokens.firstToken),
  577. offset,
  578. firstToken
  579. )
  580. setOffset(typeTokens.firstToken, offset, firstToken)
  581. }
  582. },
  583. TSMappedType(node) {
  584. // {[key in foo]: bar}
  585. const leftBraceToken = tokenStore.getFirstToken(node)
  586. const leftBracketToken = tokenStore.getTokenBefore(node.typeParameter)
  587. const rightBracketToken = tokenStore.getTokenAfter(
  588. node.nameType || node.typeParameter
  589. )
  590. setOffset(
  591. [
  592. ...tokenStore.getTokensBetween(leftBraceToken, leftBracketToken),
  593. leftBracketToken
  594. ],
  595. 1,
  596. leftBraceToken
  597. )
  598. processNodeList(
  599. [node.typeParameter, node.nameType],
  600. leftBracketToken,
  601. rightBracketToken,
  602. 1
  603. )
  604. const rightBraceToken = tokenStore.getLastToken(node)
  605. if (node.typeAnnotation) {
  606. const typeAnnotationToken = tokenStore.getFirstToken(
  607. node.typeAnnotation
  608. )
  609. setOffset(
  610. [
  611. ...tokenStore.getTokensBetween(
  612. rightBracketToken,
  613. typeAnnotationToken
  614. ),
  615. typeAnnotationToken
  616. ],
  617. 1,
  618. leftBraceToken
  619. )
  620. } else {
  621. setOffset(
  622. [...tokenStore.getTokensBetween(rightBracketToken, rightBraceToken)],
  623. 1,
  624. leftBraceToken
  625. )
  626. }
  627. setOffset(rightBraceToken, 0, leftBraceToken)
  628. },
  629. /**
  630. * Process type parameter
  631. *
  632. * e.g.
  633. * ```
  634. * type Foo<T, U extends T, V = U>
  635. * // ^ ^^^^^^^^^^^ ^^^^^
  636. * type Foo = {[key in foo]: bar}
  637. * // ^^^^^^^^^^
  638. * ```
  639. */
  640. TSTypeParameter(node) {
  641. const [firstToken, ...afterTokens] = tokenStore.getTokens(node)
  642. for (const child of [node.constraint, node.default]) {
  643. if (!child) {
  644. continue
  645. }
  646. const [, ...removeTokens] = tokenStore.getTokens(child)
  647. for (const token of removeTokens) {
  648. const i = afterTokens.indexOf(token)
  649. if (i >= 0) {
  650. afterTokens.splice(i, 1)
  651. }
  652. }
  653. }
  654. const secondToken = afterTokens.shift()
  655. if (!secondToken) {
  656. return
  657. }
  658. setOffset(secondToken, 1, firstToken)
  659. if (secondToken.value === 'extends') {
  660. let prevToken = null
  661. let token = afterTokens.shift()
  662. while (token) {
  663. if (token.value === '=') {
  664. break
  665. }
  666. setOffset(token, 1, secondToken)
  667. prevToken = token
  668. token = afterTokens.shift()
  669. }
  670. while (token) {
  671. setOffset(token, 1, prevToken || secondToken)
  672. token = afterTokens.shift()
  673. }
  674. } else {
  675. setOffset(afterTokens, 1, firstToken)
  676. }
  677. },
  678. /**
  679. * Process conditional type
  680. *
  681. * e.g.
  682. * ```
  683. * type Foo = A extends B ? Bar : Baz
  684. * // ^^^^^^^^^^^^^^^^^^^^^^^
  685. * ```
  686. */
  687. TSConditionalType(node) {
  688. // T extends Foo ? T : U
  689. const checkTypeToken = tokenStore.getFirstToken(node)
  690. const extendsToken = tokenStore.getTokenAfter(node.checkType)
  691. const extendsTypeToken = tokenStore.getFirstToken(node.extendsType)
  692. setOffset(extendsToken, 1, checkTypeToken)
  693. setOffset(extendsTypeToken, 1, extendsToken)
  694. const questionToken = /**@type {Token} */ (
  695. tokenStore.getTokenAfter(node.extendsType, isNotClosingParenToken)
  696. )
  697. const consequentToken = tokenStore.getTokenAfter(questionToken)
  698. const colonToken = /**@type {Token} */ (
  699. tokenStore.getTokenAfter(node.trueType, isNotClosingParenToken)
  700. )
  701. const alternateToken = tokenStore.getTokenAfter(colonToken)
  702. let baseNode = node
  703. let parent = baseNode.parent
  704. while (
  705. parent &&
  706. parent.type === 'TSConditionalType' &&
  707. parent.falseType === baseNode
  708. ) {
  709. baseNode = parent
  710. parent = baseNode.parent
  711. }
  712. const baseToken = tokenStore.getFirstToken(baseNode)
  713. setOffset([questionToken, colonToken], 1, baseToken)
  714. setOffset(consequentToken, 1, questionToken)
  715. setOffset(alternateToken, 1, colonToken)
  716. },
  717. /**
  718. * Process interface declaration
  719. *
  720. * e.g.
  721. * ```
  722. * interface Foo { }
  723. * ```
  724. */
  725. TSInterfaceDeclaration(node) {
  726. const interfaceToken = tokenStore.getFirstToken(node)
  727. setOffset(tokenStore.getFirstToken(node.id), 1, interfaceToken)
  728. if (node.typeParameters != null) {
  729. setOffset(
  730. tokenStore.getFirstToken(node.typeParameters),
  731. 1,
  732. tokenStore.getFirstToken(node.id)
  733. )
  734. }
  735. if (node.extends != null && node.extends.length > 0) {
  736. const extendsToken = tokenStore.getTokenBefore(node.extends[0])
  737. setOffset(extendsToken, 1, interfaceToken)
  738. processNodeList(node.extends, extendsToken, null, 1)
  739. }
  740. // It may not calculate the correct location because the visitor key is not provided.
  741. // if (node.implements != null && node.implements.length) {
  742. // const implementsToken = tokenStore.getTokenBefore(node.implements[0])
  743. // setOffset(implementsToken, 1, interfaceToken)
  744. // processNodeList(node.implements, implementsToken, null, 1)
  745. // }
  746. const bodyToken = tokenStore.getFirstToken(node.body)
  747. setOffset(bodyToken, 0, interfaceToken)
  748. },
  749. /**
  750. * Process interface body
  751. *
  752. * e.g.
  753. * ```
  754. * interface Foo { }
  755. * // ^^^
  756. * ```
  757. *
  758. * @param {TSInterfaceBody | TSModuleBlock} node
  759. */
  760. 'TSInterfaceBody, TSModuleBlock'(node) {
  761. processNodeList(
  762. node.body,
  763. tokenStore.getFirstToken(node),
  764. tokenStore.getLastToken(node),
  765. 1
  766. )
  767. },
  768. /**
  769. * Process interface heritage and class implements
  770. *
  771. * e.g.
  772. * ```
  773. * interface Foo<T> extends Bar<T> { }
  774. * // ^^^^^^
  775. * class Foo<T> implements Bar<T> { }
  776. * // ^^^^^^
  777. * ```
  778. * @param {TSInterfaceHeritage | TSClassImplements} node
  779. */
  780. 'TSClassImplements, TSInterfaceHeritage'(node) {
  781. if (node.typeParameters) {
  782. setOffset(
  783. tokenStore.getFirstToken(node.typeParameters),
  784. 1,
  785. tokenStore.getFirstToken(node)
  786. )
  787. }
  788. },
  789. /**
  790. * Process enum
  791. *
  792. * e.g.
  793. * ```
  794. * enum Foo { }
  795. * ```
  796. */
  797. TSEnumDeclaration(node) {
  798. const firstToken = tokenStore.getFirstToken(node)
  799. const idTokens = getFirstAndLastTokens(node.id)
  800. const prefixTokens = tokenStore.getTokensBetween(
  801. firstToken,
  802. idTokens.firstToken
  803. )
  804. setOffset(prefixTokens, 0, firstToken)
  805. setOffset(idTokens.firstToken, 1, firstToken)
  806. const leftBraceToken = tokenStore.getTokenAfter(idTokens.lastToken)
  807. const rightBraceToken = tokenStore.getLastToken(node)
  808. setOffset(leftBraceToken, 0, firstToken)
  809. processNodeList(node.members, leftBraceToken, rightBraceToken, 1)
  810. },
  811. TSModuleDeclaration(node) {
  812. const firstToken = tokenStore.getFirstToken(node)
  813. const idTokens = getFirstAndLastTokens(node.id)
  814. const prefixTokens = tokenStore.getTokensBetween(
  815. firstToken,
  816. idTokens.firstToken
  817. )
  818. setOffset(prefixTokens, 0, firstToken)
  819. setOffset(idTokens.firstToken, 1, firstToken)
  820. if (node.body) {
  821. const bodyFirstToken = tokenStore.getFirstToken(node.body)
  822. setOffset(
  823. bodyFirstToken,
  824. isOpeningBraceToken(bodyFirstToken) ? 0 : 1,
  825. firstToken
  826. )
  827. }
  828. },
  829. TSMethodSignature(node) {
  830. // fn(arg: A): R | null;
  831. const firstToken = tokenStore.getFirstToken(node)
  832. const keyTokens = getFirstAndLastTokens(node.key)
  833. let keyLast
  834. if (node.computed) {
  835. const closeBracket = tokenStore.getTokenAfter(keyTokens.lastToken)
  836. processNodeList([node.key], firstToken, closeBracket, 1)
  837. keyLast = closeBracket
  838. } else {
  839. keyLast = keyTokens.lastToken
  840. }
  841. const leftParenToken = /** @type {Token} */ (
  842. tokenStore.getTokenAfter(keyLast, isOpeningParenToken)
  843. )
  844. setOffset(
  845. [
  846. ...tokenStore.getTokensBetween(keyLast, leftParenToken),
  847. leftParenToken
  848. ],
  849. 1,
  850. firstToken
  851. )
  852. const rightParenToken = tokenStore.getTokenAfter(
  853. node.params[node.params.length - 1] || leftParenToken,
  854. isClosingParenToken
  855. )
  856. processNodeList(node.params, leftParenToken, rightParenToken, 1)
  857. if (node.returnType) {
  858. const typeAnnotationToken = tokenStore.getFirstToken(node.returnType)
  859. setOffset(
  860. [
  861. ...tokenStore.getTokensBetween(keyLast, typeAnnotationToken),
  862. typeAnnotationToken
  863. ],
  864. 1,
  865. firstToken
  866. )
  867. }
  868. },
  869. /**
  870. * Process call signature declaration and construct signature declaration
  871. *
  872. * e.g.
  873. * ```
  874. * interface Foo {
  875. * (): string;
  876. * //^^^^^^^^^^^
  877. * <T> (e: E): R
  878. * //^^^^^^^^^^^^^
  879. * }
  880. * ```
  881. *
  882. * e.g.
  883. * ```
  884. * interface Foo {
  885. * new ();
  886. * //^^^^^^^
  887. * }
  888. * interface A { new <T> (e: E): R }
  889. * // ^^^^^^^^^^^^^^^^^
  890. * ```
  891. * @param {TSCallSignatureDeclaration | TSConstructSignatureDeclaration} node
  892. */
  893. 'TSCallSignatureDeclaration, TSConstructSignatureDeclaration'(node) {
  894. const firstToken = tokenStore.getFirstToken(node)
  895. // new or < or (
  896. let currToken = firstToken
  897. if (node.type === 'TSConstructSignatureDeclaration') {
  898. // currToken is new token
  899. // < or (
  900. currToken = tokenStore.getTokenAfter(currToken)
  901. setOffset(currToken, 1, firstToken)
  902. }
  903. if (node.typeParameters) {
  904. // currToken is < token
  905. // (
  906. currToken = tokenStore.getTokenAfter(node.typeParameters)
  907. setOffset(currToken, 1, firstToken)
  908. }
  909. const leftParenToken = currToken
  910. const rightParenToken = /** @type {Token} */ (
  911. tokenStore.getTokenAfter(
  912. node.params[node.params.length - 1] || leftParenToken,
  913. isClosingParenToken
  914. )
  915. )
  916. processNodeList(node.params, leftParenToken, rightParenToken, 1)
  917. if (node.returnType) {
  918. const typeAnnotationToken = tokenStore.getFirstToken(node.returnType)
  919. setOffset(
  920. [
  921. ...tokenStore.getTokensBetween(
  922. rightParenToken,
  923. typeAnnotationToken
  924. ),
  925. typeAnnotationToken
  926. ],
  927. 1,
  928. firstToken
  929. )
  930. }
  931. },
  932. /**
  933. * Process declare function and empty body function
  934. *
  935. * e.g.
  936. * ```
  937. * declare function foo();
  938. * ```
  939. *
  940. * e.g.
  941. * ```
  942. * class Foo {
  943. * abstract fn();
  944. * // ^^^
  945. * }
  946. * ```
  947. * @param {TSDeclareFunction | TSEmptyBodyFunctionExpression} node
  948. */
  949. 'TSDeclareFunction, TSEmptyBodyFunctionExpression'(node) {
  950. const firstToken = tokenStore.getFirstToken(node)
  951. let leftParenToken, bodyBaseToken
  952. if (firstToken.type === 'Punctuator') {
  953. // method
  954. leftParenToken = firstToken
  955. bodyBaseToken = tokenStore.getFirstToken(
  956. /** @type {HasLocation} */ (node.parent)
  957. )
  958. } else {
  959. let nextToken = tokenStore.getTokenAfter(firstToken)
  960. let nextTokenOffset = 0
  961. while (
  962. nextToken &&
  963. !isOpeningParenToken(nextToken) &&
  964. nextToken.value !== '<'
  965. ) {
  966. if (
  967. nextToken.value === '*' ||
  968. (node.id && nextToken.range[0] === node.id.range[0])
  969. ) {
  970. nextTokenOffset = 1
  971. }
  972. setOffset(nextToken, nextTokenOffset, firstToken)
  973. nextToken = tokenStore.getTokenAfter(nextToken)
  974. }
  975. leftParenToken = nextToken
  976. bodyBaseToken = firstToken
  977. }
  978. if (!isOpeningParenToken(leftParenToken) && node.typeParameters) {
  979. leftParenToken = tokenStore.getTokenAfter(node.typeParameters)
  980. }
  981. const rightParenToken = tokenStore.getTokenAfter(
  982. node.params[node.params.length - 1] || leftParenToken,
  983. isClosingParenToken
  984. )
  985. setOffset(leftParenToken, 1, bodyBaseToken)
  986. processNodeList(node.params, leftParenToken, rightParenToken, 1)
  987. },
  988. /**
  989. * Process type operator, type query and infer type
  990. *
  991. * e.g.
  992. * ```
  993. * type Foo = keyof Bar
  994. * // ^^^^^^^^^
  995. * ```
  996. *
  997. * e.g.
  998. * ```
  999. * type T = typeof a
  1000. * // ^^^^^^^^
  1001. * ```
  1002. *
  1003. * e.g.
  1004. * ```
  1005. * type Foo<T> = T extends Bar<infer U> ? U : T;
  1006. * // ^^^^^^^
  1007. * ```
  1008. *
  1009. * @param {TSTypeOperator | TSTypeQuery | TSInferType} node
  1010. */
  1011. 'TSTypeOperator, TSTypeQuery, TSInferType'(node) {
  1012. // keyof T
  1013. // type T = typeof av
  1014. // infer U
  1015. const firstToken = tokenStore.getFirstToken(node)
  1016. const nextToken = tokenStore.getTokenAfter(firstToken)
  1017. setOffset(nextToken, 1, firstToken)
  1018. },
  1019. /**
  1020. * Process type predicate
  1021. *
  1022. * e.g.
  1023. * ```
  1024. * function foo(value): value is string;
  1025. * // ^^^^^^^^^^^^^^^
  1026. * ```
  1027. */
  1028. TSTypePredicate(node) {
  1029. const firstToken = tokenStore.getFirstToken(node)
  1030. const opToken = tokenStore.getTokenAfter(
  1031. node.parameterName,
  1032. isNotClosingParenToken
  1033. )
  1034. const rightToken =
  1035. node.typeAnnotation &&
  1036. getFirstAndLastTokens(node.typeAnnotation).firstToken
  1037. setOffset(
  1038. [opToken, rightToken],
  1039. 1,
  1040. getFirstAndLastTokens(firstToken).firstToken
  1041. )
  1042. },
  1043. /**
  1044. * Process abstract method definition, abstract class property, enum member and class property
  1045. *
  1046. * e.g.
  1047. * ```
  1048. * class Foo {
  1049. * abstract fn()
  1050. * //^^^^^^^^^^^^^
  1051. * abstract x
  1052. * //^^^^^^^^^^
  1053. * x
  1054. * //^
  1055. * }
  1056. * ```
  1057. *
  1058. * e.g.
  1059. * ```
  1060. * enum Foo { Bar = x }
  1061. * // ^^^^^^^
  1062. * ```
  1063. *
  1064. * @param {TSAbstractMethodDefinition | TSAbstractPropertyDefinition | TSAbstractAccessorProperty | TSEnumMember | TSAbstractClassProperty | ClassProperty} node
  1065. *
  1066. */
  1067. ['TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSAbstractAccessorProperty, TSEnumMember,' +
  1068. // Deprecated in @typescript-eslint/parser v5
  1069. 'ClassProperty, TSAbstractClassProperty'](node) {
  1070. const { keyNode, valueNode } =
  1071. node.type === 'TSEnumMember'
  1072. ? { keyNode: node.id, valueNode: node.initializer }
  1073. : { keyNode: node.key, valueNode: node.value }
  1074. const firstToken = tokenStore.getFirstToken(node)
  1075. const keyTokens = getFirstAndLastTokens(keyNode)
  1076. const prefixTokens = tokenStore.getTokensBetween(
  1077. firstToken,
  1078. keyTokens.firstToken
  1079. )
  1080. if (node.computed) {
  1081. prefixTokens.pop() // pop [
  1082. }
  1083. setOffset(prefixTokens, 0, firstToken)
  1084. let lastKeyToken
  1085. if (node.computed) {
  1086. const leftBracketToken = tokenStore.getTokenBefore(keyTokens.firstToken)
  1087. const rightBracketToken = (lastKeyToken = tokenStore.getTokenAfter(
  1088. keyTokens.lastToken
  1089. ))
  1090. setOffset(leftBracketToken, 0, firstToken)
  1091. processNodeList([keyNode], leftBracketToken, rightBracketToken, 1)
  1092. } else {
  1093. setOffset(keyTokens.firstToken, 0, firstToken)
  1094. lastKeyToken = keyTokens.lastToken
  1095. }
  1096. if (valueNode != null) {
  1097. const initToken = tokenStore.getFirstToken(valueNode)
  1098. setOffset(
  1099. [...tokenStore.getTokensBetween(lastKeyToken, initToken), initToken],
  1100. 1,
  1101. lastKeyToken
  1102. )
  1103. }
  1104. },
  1105. /**
  1106. * Process optional type, non-null expression and JSDocNonNullableType
  1107. *
  1108. * e.g.
  1109. * ```
  1110. * type Foo = [number?]
  1111. * // ^^^^^^^
  1112. * const a = v!
  1113. * // ^
  1114. * type T = U!
  1115. * // ^^
  1116. * ```
  1117. *
  1118. * @param {TSOptionalType | TSNonNullExpression} node
  1119. */
  1120. 'TSOptionalType, TSNonNullExpression, TSJSDocNonNullableType'(node) {
  1121. setOffset(
  1122. tokenStore.getLastToken(node),
  1123. 1,
  1124. tokenStore.getFirstToken(node)
  1125. )
  1126. },
  1127. TSTypeAssertion(node) {
  1128. // <const>
  1129. const firstToken = tokenStore.getFirstToken(node)
  1130. const expressionToken = getFirstAndLastTokens(node.expression).firstToken
  1131. processNodeList(
  1132. [node.typeAnnotation],
  1133. firstToken,
  1134. tokenStore.getTokenBefore(expressionToken),
  1135. 1
  1136. )
  1137. setOffset(expressionToken, 1, firstToken)
  1138. },
  1139. /**
  1140. * Process import type
  1141. *
  1142. * e.g.
  1143. * ```
  1144. * const foo: import('foo').Bar<T>
  1145. * // ^^^^^^^^^^^^^^^^^^^^
  1146. * ```
  1147. */
  1148. TSImportType(node) {
  1149. const firstToken = tokenStore.getFirstToken(node)
  1150. const leftParenToken = tokenStore.getTokenAfter(
  1151. firstToken,
  1152. isOpeningParenToken
  1153. )
  1154. setOffset(leftParenToken, 1, firstToken)
  1155. const rightParenToken = tokenStore.getTokenAfter(
  1156. node.parameter,
  1157. isClosingParenToken
  1158. )
  1159. processNodeList([node.parameter], leftParenToken, rightParenToken, 1)
  1160. if (node.qualifier) {
  1161. const dotToken = tokenStore.getTokenBefore(node.qualifier)
  1162. const propertyToken = tokenStore.getTokenAfter(dotToken)
  1163. setOffset([dotToken, propertyToken], 1, firstToken)
  1164. }
  1165. if (node.typeParameters) {
  1166. setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken)
  1167. }
  1168. },
  1169. TSParameterProperty(node) {
  1170. // constructor(private a)
  1171. const firstToken = tokenStore.getFirstToken(node)
  1172. const parameterToken = tokenStore.getFirstToken(node.parameter)
  1173. setOffset(
  1174. [
  1175. ...tokenStore.getTokensBetween(firstToken, parameterToken),
  1176. parameterToken
  1177. ],
  1178. 1,
  1179. firstToken
  1180. )
  1181. },
  1182. /**
  1183. * Process import equal
  1184. *
  1185. * e.g.
  1186. * ```
  1187. * import foo = require('foo')
  1188. * ```
  1189. */
  1190. TSImportEqualsDeclaration(node) {
  1191. const importToken = tokenStore.getFirstToken(node)
  1192. const idTokens = getFirstAndLastTokens(node.id)
  1193. setOffset(idTokens.firstToken, 1, importToken)
  1194. const opToken = tokenStore.getTokenAfter(idTokens.lastToken)
  1195. setOffset(
  1196. [opToken, tokenStore.getFirstToken(node.moduleReference)],
  1197. 1,
  1198. idTokens.lastToken
  1199. )
  1200. },
  1201. /**
  1202. * Process external module reference
  1203. *
  1204. * e.g.
  1205. * ```
  1206. * import foo = require('foo')
  1207. * // ^^^^^^^^^^^^^^
  1208. * ```
  1209. */
  1210. TSExternalModuleReference(node) {
  1211. const requireToken = tokenStore.getFirstToken(node)
  1212. const leftParenToken = tokenStore.getTokenAfter(
  1213. requireToken,
  1214. isOpeningParenToken
  1215. )
  1216. const rightParenToken = tokenStore.getLastToken(node)
  1217. setOffset(leftParenToken, 1, requireToken)
  1218. processNodeList([node.expression], leftParenToken, rightParenToken, 1)
  1219. },
  1220. /**
  1221. * Process export assignment
  1222. *
  1223. * e.g.
  1224. * ```
  1225. * export = foo
  1226. * ```
  1227. */
  1228. TSExportAssignment(node) {
  1229. const exportNode = tokenStore.getFirstToken(node)
  1230. const exprTokens = getFirstAndLastTokens(node.expression)
  1231. const opToken = tokenStore.getTokenBefore(exprTokens.firstToken)
  1232. setOffset([opToken, exprTokens.firstToken], 1, exportNode)
  1233. },
  1234. TSNamedTupleMember(node) {
  1235. // [a: string, ...b: string[]]
  1236. // ^^^^^^^^^
  1237. const labelToken = tokenStore.getFirstToken(node)
  1238. const elementTokens = getFirstAndLastTokens(node.elementType)
  1239. setOffset(
  1240. [
  1241. ...tokenStore.getTokensBetween(labelToken, elementTokens.firstToken),
  1242. elementTokens.firstToken
  1243. ],
  1244. 1,
  1245. labelToken
  1246. )
  1247. },
  1248. TSRestType(node) {
  1249. // [a: string, ...b: string[]]
  1250. // ^^^^^^^^^^^^^^
  1251. const firstToken = tokenStore.getFirstToken(node)
  1252. const nextToken = tokenStore.getTokenAfter(firstToken)
  1253. setOffset(nextToken, 1, firstToken)
  1254. },
  1255. TSNamespaceExportDeclaration(node) {
  1256. const firstToken = tokenStore.getFirstToken(node)
  1257. const idToken = tokenStore.getFirstToken(node.id)
  1258. setOffset(
  1259. [...tokenStore.getTokensBetween(firstToken, idToken), idToken],
  1260. 1,
  1261. firstToken
  1262. )
  1263. },
  1264. TSTemplateLiteralType(node) {
  1265. const firstToken = tokenStore.getFirstToken(node)
  1266. const quasiTokens = node.quasis
  1267. .slice(1)
  1268. .map((n) => tokenStore.getFirstToken(n))
  1269. const expressionToken = node.quasis
  1270. .slice(0, -1)
  1271. .map((n) => tokenStore.getTokenAfter(n))
  1272. setOffset(quasiTokens, 0, firstToken)
  1273. setOffset(expressionToken, 1, firstToken)
  1274. },
  1275. // ----------------------------------------------------------------------
  1276. // NON-STANDARD NODES
  1277. // ----------------------------------------------------------------------
  1278. Decorator(node) {
  1279. // @Decorator
  1280. const [atToken, secondToken] = tokenStore.getFirstTokens(node, {
  1281. count: 2,
  1282. includeComments: false
  1283. })
  1284. setOffset(secondToken, 0, atToken)
  1285. const parent = /** @type {any} */ (node.parent)
  1286. const { decorators, range } = parent
  1287. if (!decorators || decorators.length === 0) {
  1288. return
  1289. }
  1290. if (decorators[0] === node) {
  1291. if (range[0] === node.range[0]) {
  1292. const startParentToken = tokenStore.getTokenAfter(
  1293. decorators[decorators.length - 1]
  1294. )
  1295. setOffset(startParentToken, 0, atToken)
  1296. } else {
  1297. const startParentToken = tokenStore.getFirstToken(
  1298. parent.parent &&
  1299. (parent.parent.type === 'ExportDefaultDeclaration' ||
  1300. parent.parent.type === 'ExportNamedDeclaration') &&
  1301. node.range[0] < parent.parent.range[0]
  1302. ? parent.parent
  1303. : parent
  1304. )
  1305. copyOffset(atToken, startParentToken)
  1306. }
  1307. } else {
  1308. setOffset(atToken, 0, tokenStore.getFirstToken(decorators[0]))
  1309. }
  1310. },
  1311. AccessorProperty(node) {
  1312. const keyNode = node.key
  1313. const valueNode = node.value
  1314. const firstToken = tokenStore.getFirstToken(node)
  1315. const keyTokens = getFirstAndLastTokens(keyNode)
  1316. const prefixTokens = tokenStore.getTokensBetween(
  1317. firstToken,
  1318. keyTokens.firstToken
  1319. )
  1320. if (node.computed) {
  1321. prefixTokens.pop() // pop opening bracket character (`[`)
  1322. }
  1323. setOffset(prefixTokens, 0, firstToken)
  1324. let lastKeyToken
  1325. if (node.computed) {
  1326. const leftBracketToken = tokenStore.getTokenBefore(keyTokens.firstToken)
  1327. const rightBracketToken = (lastKeyToken = tokenStore.getTokenAfter(
  1328. keyTokens.lastToken
  1329. ))
  1330. setOffset(leftBracketToken, 0, firstToken)
  1331. processNodeList([keyNode], leftBracketToken, rightBracketToken, 1)
  1332. } else {
  1333. setOffset(keyTokens.firstToken, 0, firstToken)
  1334. lastKeyToken = keyTokens.lastToken
  1335. }
  1336. if (valueNode != null) {
  1337. const initToken = tokenStore.getFirstToken(valueNode)
  1338. setOffset(
  1339. [...tokenStore.getTokensBetween(lastKeyToken, initToken), initToken],
  1340. 1,
  1341. lastKeyToken
  1342. )
  1343. }
  1344. processSemicolons(node)
  1345. },
  1346. ImportAttribute(node) {
  1347. const firstToken = tokenStore.getFirstToken(node)
  1348. const keyTokens = getFirstAndLastTokens(node.key)
  1349. const prefixTokens = tokenStore.getTokensBetween(
  1350. firstToken,
  1351. keyTokens.firstToken
  1352. )
  1353. setOffset(prefixTokens, 0, firstToken)
  1354. setOffset(keyTokens.firstToken, 0, firstToken)
  1355. const initToken = tokenStore.getFirstToken(node.value)
  1356. setOffset(
  1357. [
  1358. ...tokenStore.getTokensBetween(keyTokens.lastToken, initToken),
  1359. initToken
  1360. ],
  1361. 1,
  1362. keyTokens.lastToken
  1363. )
  1364. },
  1365. // ----------------------------------------------------------------------
  1366. // DEPRECATED NODES
  1367. // ----------------------------------------------------------------------
  1368. /** @param {any} node */
  1369. TSParenthesizedType(node) {
  1370. // Deprecated in @typescript-eslint/parser v5
  1371. // (T)
  1372. processNodeList(
  1373. [node.typeAnnotation],
  1374. tokenStore.getFirstToken(node),
  1375. tokenStore.getLastToken(node),
  1376. 1
  1377. )
  1378. },
  1379. // ----------------------------------------------------------------------
  1380. // SINGLE TOKEN NODES
  1381. // ----------------------------------------------------------------------
  1382. TSPrivateIdentifier() {
  1383. // Perhaps this node will be deprecated in the future.
  1384. // It was present in @typescript-eslint/parser@4.1.0.
  1385. },
  1386. // VALUES KEYWORD
  1387. TSAnyKeyword() {},
  1388. TSBigIntKeyword() {},
  1389. TSBooleanKeyword() {},
  1390. TSNeverKeyword() {},
  1391. TSNullKeyword() {},
  1392. TSNumberKeyword() {},
  1393. TSObjectKeyword() {},
  1394. TSStringKeyword() {},
  1395. TSSymbolKeyword() {},
  1396. TSUndefinedKeyword() {},
  1397. TSUnknownKeyword() {},
  1398. TSVoidKeyword() {},
  1399. // MODIFIERS KEYWORD
  1400. TSAbstractKeyword() {},
  1401. TSAsyncKeyword() {},
  1402. TSPrivateKeyword() {},
  1403. TSProtectedKeyword() {},
  1404. TSPublicKeyword() {},
  1405. TSReadonlyKeyword() {},
  1406. TSStaticKeyword() {},
  1407. // OTHERS KEYWORD
  1408. TSDeclareKeyword() {},
  1409. TSExportKeyword() {},
  1410. TSIntrinsicKeyword() {},
  1411. // OTHERS
  1412. TSThisType() {},
  1413. // ----------------------------------------------------------------------
  1414. // WRAPPER NODES
  1415. // ----------------------------------------------------------------------
  1416. TSLiteralType() {}
  1417. }
  1418. }