📄 node-utils¶
📊 Analysis Summary¶
| Metric | Count |
|---|---|
| 🔧 Functions | 43 |
| 🧱 Classes | 1 |
| 📦 Imports | 6 |
| 📊 Variables & Constants | 5 |
| 📐 Interfaces | 1 |
| 📑 Type Aliases | 5 |
📚 Table of Contents¶
🛠️ File Location:¶
📂 packages/typescript-estree/src/node-utils.ts
📦 Imports¶
| Name | Source |
|---|---|
TSESTree |
./ts-estree |
getModifiers |
./getModifiers |
xhtmlEntities |
./jsx/xhtml-entities |
AST_NODE_TYPES |
./ts-estree |
AST_TOKEN_TYPES |
./ts-estree |
typescriptVersionIsAtLeast |
./version-check |
Variables & Constants¶
| Name | Type | Kind | Value | Exported |
|---|---|---|---|---|
isAtLeast50 |
boolean |
const | typescriptVersionIsAtLeast['5.0'] |
✗ |
SyntaxKind |
any |
const | ts.SyntaxKind |
✗ |
LOGICAL_OPERATORS |
ReadonlySet<LogicalOperatorKind> |
const | new Set([ SyntaxKind.AmpersandAmpersandToken, SyntaxKind.BarBarToken, SyntaxK... |
✗ |
ASSIGNMENT_OPERATORS |
ReadonlySet<AssignmentOperatorKind> |
const | new Set([ ts.SyntaxKind.AmpersandAmpersandEqualsToken, ts.SyntaxKind.Ampersan... |
✗ |
BINARY_OPERATORS |
ReadonlySet<BinaryOperatorKind> |
const | new Set([ SyntaxKind.AmpersandAmpersandToken, SyntaxKind.AmpersandToken, Synt... |
✗ |
Functions¶
isLogicalOperator(operator: ts.BinaryOperatorToken): operator is ts.Token<LogicalOperatorKind>¶
Returns true if the given ts.Token is a logical operator
Calls:
(LOGICAL_OPERATORS as ReadonlySet<ts.SyntaxKind>).has
Code
isESTreeBinaryOperator(operator: ts.BinaryOperatorToken): operator is ts.Token<BinaryOperatorKind>¶
Parameters:
operatorts.BinaryOperatorToken
Returns: operator is ts.Token<BinaryOperatorKind>
Calls:
(BINARY_OPERATORS as ReadonlySet<ts.SyntaxKind>).has
Code
getTextForTokenKind(kind: T): TokenForTokenKind<T>¶
Returns the string form of the given TSToken SyntaxKind
Calls:
ts.tokenToString
Code
isESTreeClassMember(node: ts.Node): boolean¶
Returns true if the given ts.Node is a valid ESTree class member
Code
hasModifier(modifierKind: ts.KeywordSyntaxKind, node: ts.Node): boolean¶
Checks if a ts.Node has a modifier
Calls:
getModifiers (from ./getModifiers)modifiers?.some
Code
getLastModifier(node: ts.Node): ts.Modifier | null¶
Get last last modifier in ast
Returns: undefined
returns last modifier if present or null
Raw JSDoc
Calls:
getModifiers (from ./getModifiers)
Code
isComma(token: ts.Node): token is ts.Token<ts.SyntaxKind.CommaToken>¶
Returns true if the given ts.Token is a comma
Code
isComment(node: ts.Node): boolean¶
Returns true if the given ts.Node is a comment
Code
getBinaryExpressionType(operator: ts.BinaryOperatorToken): | { operator: TokenForTokenKind<AssignmentOperatorKind>; ty…¶
Returns the binary expression type of the given ts.Token
Calls:
isAssignmentOperatorgetTextForTokenKindisLogicalOperatorisESTreeBinaryOperatorts.tokenToString
Code
export function getBinaryExpressionType(operator: ts.BinaryOperatorToken):
| {
operator: TokenForTokenKind<AssignmentOperatorKind>;
type: AST_NODE_TYPES.AssignmentExpression;
}
| {
operator: TokenForTokenKind<BinaryOperatorKind>;
type: AST_NODE_TYPES.BinaryExpression;
}
| {
operator: TokenForTokenKind<LogicalOperatorKind>;
type: AST_NODE_TYPES.LogicalExpression;
} {
if (isAssignmentOperator(operator)) {
return {
type: AST_NODE_TYPES.AssignmentExpression,
operator: getTextForTokenKind(operator.kind),
};
}
if (isLogicalOperator(operator)) {
return {
type: AST_NODE_TYPES.LogicalExpression,
operator: getTextForTokenKind(operator.kind),
};
}
if (isESTreeBinaryOperator(operator)) {
return {
type: AST_NODE_TYPES.BinaryExpression,
operator: getTextForTokenKind(operator.kind),
};
}
throw new Error(
`Unexpected binary operator ${ts.tokenToString(operator.kind)}`,
);
}
getLineAndCharacterFor(pos: number, ast: ts.SourceFile): TSESTree.Position¶
Returns line and column data for the given positions
Calls:
ast.getLineAndCharacterOfPosition
Code
getLocFor(range: TSESTree.Range, ast: ts.SourceFile): TSESTree.SourceLocation¶
Returns line and column data for the given start and end positions, for the given AST
Raw JSDoc
Calls:
range.mapgetLineAndCharacterFor
Code
canContainDirective(node: ts.Block | ts.ClassStaticBlockDeclarati…): boolean¶
Check whatever node can contain directive
Code
export function canContainDirective(
node:
ts.Block | ts.ClassStaticBlockDeclaration | ts.ModuleBlock | ts.SourceFile,
): boolean {
if (node.kind === ts.SyntaxKind.Block) {
switch (node.parent.kind) {
case ts.SyntaxKind.Constructor:
case ts.SyntaxKind.GetAccessor:
case ts.SyntaxKind.SetAccessor:
case ts.SyntaxKind.ArrowFunction:
case ts.SyntaxKind.FunctionExpression:
case ts.SyntaxKind.FunctionDeclaration:
case ts.SyntaxKind.MethodDeclaration:
return true;
default:
return false;
}
}
return true;
}
getRange(node: Pick<ts.Node, 'getEnd' | 'getStart'>, ast: ts.SourceFile): [number, number]¶
Returns range for the given ts.Node
Calls:
node.getStartnode.getEnd
Code
isJSXToken(node: ts.Node): boolean¶
Returns true if a given ts.Node is a JSX token
Code
getDeclarationKind(node: ts.VariableDeclarationList): DeclarationKind¶
Returns the declaration kind of the given ts.Node
Internal Comments:
Code
export function getDeclarationKind(
node: ts.VariableDeclarationList,
): DeclarationKind {
if (node.flags & ts.NodeFlags.Let) {
return 'let';
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
if ((node.flags & ts.NodeFlags.AwaitUsing) === ts.NodeFlags.AwaitUsing) {
return 'await using';
}
if (node.flags & ts.NodeFlags.Const) {
return 'const';
}
if (node.flags & ts.NodeFlags.Using) {
return 'using';
}
return 'var';
}
getTSNodeAccessibility(node: ts.Node): 'private' | 'protected' | 'public' | undefined¶
Gets a ts.Node's accessibility level
Calls:
getModifiers (from ./getModifiers)
Code
export function getTSNodeAccessibility(
node: ts.Node,
): 'private' | 'protected' | 'public' | undefined {
const modifiers = getModifiers(node);
if (modifiers == null) {
return undefined;
}
for (const modifier of modifiers) {
switch (modifier.kind) {
case SyntaxKind.PublicKeyword:
return 'public';
case SyntaxKind.ProtectedKeyword:
return 'protected';
case SyntaxKind.PrivateKeyword:
return 'private';
default:
break;
}
}
return undefined;
}
findNextToken(previousToken: ts.TextRange, parent: ts.Node, ast: ts.SourceFile): ts.Node | undefined¶
Finds the next token based on the previous one and its parent Had to copy this from TS instead of using TS's version because theirs doesn't pass the ast to getChildren
Raw JSDoc
Calls:
findts.isTokenfirstDefinedn.getChildrennodeHasTokens
Internal Comments:
// this is token that starts at the end of previous token - return it
// previous token is enclosed somewhere in the child (x2)
// previous token ends exactly at the beginning of child (x3)
Code
export function findNextToken(
previousToken: ts.TextRange,
parent: ts.Node,
ast: ts.SourceFile,
): ts.Node | undefined {
return find(parent);
function find(n: ts.Node): ts.Node | undefined {
if (ts.isToken(n) && n.pos === previousToken.end) {
// this is token that starts at the end of previous token - return it
return n;
}
return firstDefined(n.getChildren(ast), (child: ts.Node) => {
const shouldDiveInChildNode =
// previous token is enclosed somewhere in the child
(child.pos <= previousToken.pos && child.end > previousToken.end) ||
// previous token ends exactly at the beginning of child
child.pos === previousToken.end;
return shouldDiveInChildNode && nodeHasTokens(child, ast)
? find(child)
: undefined;
});
}
}
findFirstMatchingAncestor(node: ts.Node, predicate: (node: ts.Node) => boolean): ts.Node | undefined¶
Find the first matching ancestor based on the given predicate function.
Parameters:
nodeany: The current ts.Nodepredicateany: The predicate function to apply to each checked ancestor
Returns: undefined
a matching parent ts.Node
Raw JSDoc
Calls:
predicate
Code
hasJSXAncestor(node: ts.Node): boolean¶
Returns true if a given ts.Node has a JSX token within its hierarchy
Calls:
findFirstMatchingAncestor
Code
unescapeStringLiteralText(text: string): string¶
Unescape the text content of string literals, e.g. & -> &
Parameters:
textany: The escaped string literal text.
Returns: undefined
The unescaped string literal text.
Raw JSDoc
Calls:
text.replaceAllentity.sliceparseIntitem.sliceString.fromCodePoint
Code
export function unescapeStringLiteralText(text: string): string {
return text.replaceAll(/&(?:#\d+|#x[\da-fA-F]+|[0-9a-zA-Z]+);/g, entity => {
const item = entity.slice(1, -1);
if (item[0] === '#') {
const codePoint =
item[1] === 'x'
? parseInt(item.slice(2), 16)
: parseInt(item.slice(1), 10);
return codePoint > 0x10ffff // RangeError: Invalid code point
? entity
: String.fromCodePoint(codePoint);
}
return xhtmlEntities[item] || entity;
});
}
isComputedProperty(node: ts.Node): node is ts.ComputedPropertyName¶
Returns true if a given ts.Node is a computed property
Code
isOptional(node: { questionToken?: ts.QuestionToken; }): boolean¶
Returns true if a given ts.Node is optional (has QuestionToken)
Parameters:
nodeany: ts.Node to be checked
Raw JSDoc
Code
isChainExpression(node: TSESTree.Node): node is TSESTree.ChainExpression¶
Returns true if the node is an optional chain node
Code
isChildUnwrappableOptionalChain(node: | ts.CallExpression | ts.ElementAccessE…, child: TSESTree.Node): boolean¶
Returns true of the child of property access expression is an optional chain
Calls:
isChainExpression
Internal Comments:
Code
export function isChildUnwrappableOptionalChain(
node:
| ts.CallExpression
| ts.ElementAccessExpression
| ts.NonNullExpression
| ts.PropertyAccessExpression,
child: TSESTree.Node,
): boolean {
return (
isChainExpression(child) &&
// (x?.y).z is semantically different, and as such .z is no longer optional
node.expression.kind !== ts.SyntaxKind.ParenthesizedExpression
);
}
getTokenType(token: ts.Identifier | ts.Token<ts.SyntaxKind>): Exclude<AST_TOKEN_TYPES, AST_TOKEN_TYPES.Block | AST_TOKEN_…¶
Returns the type of a given ts.Token
Raw JSDoc
Calls:
isJSXTokenhasJSXAncestor
Internal Comments:
// A TypeScript-StringLiteral token with a TypeScript-JsxAttribute or TypeScript-JsxElement parent,
// must actually be an ESTree-JSXText token
// intentional fallthrough
// Some JSX tokens have to be determined based on their parent
Code
export function getTokenType(
token: ts.Identifier | ts.Token<ts.SyntaxKind>,
): Exclude<AST_TOKEN_TYPES, AST_TOKEN_TYPES.Block | AST_TOKEN_TYPES.Line> {
if (token.kind === SyntaxKind.NullKeyword) {
return AST_TOKEN_TYPES.Null;
}
if (
token.kind >= SyntaxKind.FirstKeyword &&
token.kind <= SyntaxKind.LastFutureReservedWord
) {
if (
token.kind === SyntaxKind.FalseKeyword ||
token.kind === SyntaxKind.TrueKeyword
) {
return AST_TOKEN_TYPES.Boolean;
}
return AST_TOKEN_TYPES.Keyword;
}
if (
token.kind >= SyntaxKind.FirstPunctuation &&
token.kind <= SyntaxKind.LastPunctuation
) {
return AST_TOKEN_TYPES.Punctuator;
}
if (
token.kind >= SyntaxKind.NoSubstitutionTemplateLiteral &&
token.kind <= SyntaxKind.TemplateTail
) {
return AST_TOKEN_TYPES.Template;
}
switch (token.kind) {
case SyntaxKind.NumericLiteral:
case SyntaxKind.BigIntLiteral:
return AST_TOKEN_TYPES.Numeric;
case SyntaxKind.PrivateIdentifier:
return AST_TOKEN_TYPES.PrivateIdentifier;
case SyntaxKind.JsxText:
return AST_TOKEN_TYPES.JSXText;
case SyntaxKind.StringLiteral:
// A TypeScript-StringLiteral token with a TypeScript-JsxAttribute or TypeScript-JsxElement parent,
// must actually be an ESTree-JSXText token
if (
token.parent.kind === SyntaxKind.JsxAttribute ||
token.parent.kind === SyntaxKind.JsxElement
) {
return AST_TOKEN_TYPES.JSXText;
}
return AST_TOKEN_TYPES.String;
case SyntaxKind.RegularExpressionLiteral:
return AST_TOKEN_TYPES.RegularExpression;
case SyntaxKind.Identifier:
case SyntaxKind.ConstructorKeyword:
case SyntaxKind.GetKeyword:
case SyntaxKind.SetKeyword:
// intentional fallthrough
default:
}
// Some JSX tokens have to be determined based on their parent
if (token.kind === SyntaxKind.Identifier) {
if (isJSXToken(token.parent)) {
return AST_TOKEN_TYPES.JSXIdentifier;
}
if (
token.parent.kind === SyntaxKind.PropertyAccessExpression &&
hasJSXAncestor(token)
) {
return AST_TOKEN_TYPES.JSXIdentifier;
}
}
return AST_TOKEN_TYPES.Identifier;
}
convertToken(token: ts.Token<ts.TokenSyntaxKind>, ast: ts.SourceFile): TSESTree.Token¶
Extends and formats a given ts.Token, for a given AST
Calls:
token.getFullStarttoken.getStarttoken.getEndast.text.slicegetTokenTypegetLocForvalue.slicevalue.lastIndexOf
Internal Comments:
Code
export function convertToken(
token: ts.Token<ts.TokenSyntaxKind>,
ast: ts.SourceFile,
): TSESTree.Token {
const start =
token.kind === SyntaxKind.JsxText
? token.getFullStart()
: token.getStart(ast);
const end = token.getEnd();
const value = ast.text.slice(start, end);
const tokenType = getTokenType(token);
const range: TSESTree.Range = [start, end];
const loc = getLocFor(range, ast);
if (tokenType === AST_TOKEN_TYPES.RegularExpression) {
return {
type: tokenType,
loc,
range,
regex: {
flags: value.slice(value.lastIndexOf('/') + 1),
pattern: value.slice(1, value.lastIndexOf('/')),
},
value,
};
}
if (tokenType === AST_TOKEN_TYPES.PrivateIdentifier) {
return {
type: tokenType,
loc,
range,
value: value.slice(1),
};
}
// @ts-expect-error TS is complaining about `value` not being the correct
// type but it is
return {
type: tokenType,
loc,
range,
value,
};
}
convertTokens(ast: ts.SourceFile): TSESTree.Token[]¶
Converts all tokens for the given AST
Parameters:
astany: the AST object
Returns: undefined
the converted Tokens
Raw JSDoc
Calls:
isCommentisJSDocCommentisTokenresult.pushconvertTokennode.getChildren(ast).forEachwalk
Internal Comments:
/**
* @param node the ts.Node
*/
// TypeScript generates tokens for types in JSDoc blocks. Comment tokens
// and their children should not be walked or added to the resulting tokens list.
Code
export function convertTokens(ast: ts.SourceFile): TSESTree.Token[] {
const result: TSESTree.Token[] = [];
/**
* @param node the ts.Node
*/
function walk(node: ts.Node): void {
// TypeScript generates tokens for types in JSDoc blocks. Comment tokens
// and their children should not be walked or added to the resulting tokens list.
if (isComment(node) || isJSDocComment(node)) {
return;
}
if (isToken(node) && node.kind !== SyntaxKind.EndOfFileToken) {
result.push(convertToken(node, ast));
} else {
node.getChildren(ast).forEach(walk);
}
}
walk(ast);
return result;
}
createError(node: ts.Node, message: string): TSError¶
Parameters:
nodets.Nodemessagestring
Returns: TSError
nodeHasTokens(n: ts.Node, ast: ts.SourceFile): boolean¶
Parameters:
nts.Nodeastts.SourceFile
Returns: boolean
Calls:
n.getWidth
Internal Comments:
// If we have a token or node that has a non-zero width, it must have tokens.
// Note: getWidth() does not take trivia into account.
Code
export function nodeHasTokens(n: ts.Node, ast: ts.SourceFile): boolean {
// If we have a token or node that has a non-zero width, it must have tokens.
// Note: getWidth() does not take trivia into account.
return n.kind === SyntaxKind.EndOfFileToken
? !!(n as ts.JSDocContainer).jsDoc
: n.getWidth(ast) !== 0;
}
firstDefined(array: readonly T[] | undefined, callback: (element: T, index: number) => U | unde…): U | undefined¶
Like forEach, but suitable for use with numbers and strings (which may be falsy).
Raw JSDoc
Calls:
callback
Internal Comments:
Code
export function firstDefined<T, U>(
array: readonly T[] | undefined,
callback: (element: T, index: number) => U | undefined,
): U | undefined {
// eslint-disable-next-line @typescript-eslint/internal/eqeq-nullish
if (array === undefined) {
return undefined;
}
for (let i = 0; i < array.length; i++) {
const result = callback(array[i], i);
// eslint-disable-next-line @typescript-eslint/internal/eqeq-nullish
if (result !== undefined) {
return result;
}
}
return undefined;
}
identifierIsThisKeyword(id: ts.Identifier): boolean¶
Parameters:
idts.Identifier
Returns: boolean
Calls:
ts.identifierToKeywordKind
Code
isThisIdentifier(node: ts.Node | undefined): node is ts.Identifier¶
Parameters:
nodets.Node | undefined
Returns: node is ts.Identifier
Calls:
identifierIsThisKeyword
Code
isThisInTypeQuery(node: ts.Node): boolean¶
Parameters:
nodets.Node
Returns: boolean
Calls:
isThisIdentifierts.isQualifiedName
Code
isValidAssignmentTarget(node: ts.Node): boolean¶
Parameters:
nodets.Node
Returns: boolean
Calls:
isValidAssignmentTarget
Code
export function isValidAssignmentTarget(node: ts.Node): boolean {
switch (node.kind) {
case SyntaxKind.Identifier:
return true;
case SyntaxKind.PropertyAccessExpression:
case SyntaxKind.ElementAccessExpression:
if (node.flags & ts.NodeFlags.OptionalChain) {
return false;
}
return true;
case SyntaxKind.ParenthesizedExpression:
case SyntaxKind.TypeAssertionExpression:
case SyntaxKind.AsExpression:
case SyntaxKind.SatisfiesExpression:
case SyntaxKind.ExpressionWithTypeArguments:
case SyntaxKind.NonNullExpression:
return isValidAssignmentTarget(
(
node as
| ts.AssertionExpression
| ts.ExpressionWithTypeArguments
| ts.NonNullExpression
| ts.ParenthesizedExpression
| ts.SatisfiesExpression
).expression,
);
default:
return false;
}
}
getNamespaceModifiers(node: ts.ModuleDeclaration): ts.Modifier[] | undefined¶
Parameters:
nodets.ModuleDeclaration
Returns: ts.Modifier[] | undefined
Calls:
getModifiers (from ./getModifiers)ts.isModuleDeclaration
Internal Comments:
// For following nested namespaces, use modifiers given to the topmost namespace (x2)
// export declare namespace foo.bar.baz {} (x2)
Code
export function getNamespaceModifiers(
node: ts.ModuleDeclaration,
): ts.Modifier[] | undefined {
// For following nested namespaces, use modifiers given to the topmost namespace
// export declare namespace foo.bar.baz {}
let modifiers = getModifiers(node);
let moduleDeclaration = node;
while (
(!modifiers || modifiers.length === 0) &&
ts.isModuleDeclaration(moduleDeclaration.parent)
) {
const parentModifiers = getModifiers(moduleDeclaration.parent);
if (parentModifiers?.length) {
modifiers = parentModifiers;
}
moduleDeclaration = moduleDeclaration.parent;
}
return modifiers;
}
declarationNameToString(node: ts.Node): string¶
Parameters:
nodets.Node
Returns: string
Calls:
node.getSourceFile().text.slice(node.pos, node.end).trimStart
Code
isEntityNameExpression(node: ts.Node): node is ts.EntityNameExpression¶
Parameters:
nodets.Node
Returns: node is ts.EntityNameExpression
Calls:
isPropertyAccessEntityNameExpression
Code
isAssignmentOperator(operator: ts.BinaryOperatorToken): operator is ts.Token<AssignmentOperatorKind>¶
Returns true if the given ts.Token is the assignment operator
Calls:
(ASSIGNMENT_OPERATORS as ReadonlySet<ts.SyntaxKind>).has
Code
isJSDocComment(node: ts.Node): node is ts.JSDoc¶
Returns true if the given ts.Node is a JSDoc comment
Internal Comments:
// eslint-disable-next-line @typescript-eslint/no-deprecated -- SyntaxKind.JSDoc was only added in TS4.7 so we can't use it yet
Code
isToken(node: ts.Node): node is ts.Token<ts.TokenSyntaxKind>¶
Returns true if a given ts.Node is a token
Code
isPropertyAccessEntityNameExpression(node: ts.Node): node is ts.PropertyAccessEntityNameExpression¶
Parameters:
nodets.Node
Returns: node is ts.PropertyAccessEntityNameExpression
Calls:
ts.isPropertyAccessExpressionts.isIdentifierisEntityNameExpression
Code
Internal helpers¶
Declared inside another function in this file.
find(n: ts.Node): ts.Node | undefined¶
Parameters:
nts.Node
Returns: ts.Node | undefined
Calls:
ts.isTokenfirstDefinedn.getChildrennodeHasTokensfind
Internal Comments:
// this is token that starts at the end of previous token - return it
// previous token is enclosed somewhere in the child (x2)
// previous token ends exactly at the beginning of child (x3)
Code
function find(n: ts.Node): ts.Node | undefined {
if (ts.isToken(n) && n.pos === previousToken.end) {
// this is token that starts at the end of previous token - return it
return n;
}
return firstDefined(n.getChildren(ast), (child: ts.Node) => {
const shouldDiveInChildNode =
// previous token is enclosed somewhere in the child
(child.pos <= previousToken.pos && child.end > previousToken.end) ||
// previous token ends exactly at the beginning of child
child.pos === previousToken.end;
return shouldDiveInChildNode && nodeHasTokens(child, ast)
? find(child)
: undefined;
});
}
walk(node: ts.Node): void¶
Parameters:
nodeany: the ts.Node
Calls:
isCommentisJSDocCommentisTokenresult.pushconvertTokennode.getChildren(ast).forEach
Internal Comments:
// TypeScript generates tokens for types in JSDoc blocks. Comment tokens
// and their children should not be walked or added to the resulting tokens list.
Code
function walk(node: ts.Node): void {
// TypeScript generates tokens for types in JSDoc blocks. Comment tokens
// and their children should not be walked or added to the resulting tokens list.
if (isComment(node) || isJSDocComment(node)) {
return;
}
if (isToken(node) && node.kind !== SyntaxKind.EndOfFileToken) {
result.push(convertToken(node, ast));
} else {
node.getChildren(ast).forEach(walk);
}
}
Classes¶
TSError¶
Extends: Error
Class Code
export class TSError extends Error {
override name = 'TSError';
constructor(
message: string,
public readonly fileName: string,
public readonly location: {
end: {
column: number;
line: number;
offset: number;
};
start: {
column: number;
line: number;
offset: number;
};
},
) {
super(message);
}
// For old version of ESLint https://github.com/typescript-eslint/typescript-eslint/pull/6556#discussion_r1123237311
get index(): number {
return this.location.start.offset;
}
// https://github.com/eslint/eslint/blob/b09a512107249a4eb19ef5a37b0bd672266eafdb/lib/linter/linter.js#L853
get lineNumber(): number {
return this.location.start.line;
}
// https://github.com/eslint/eslint/blob/b09a512107249a4eb19ef5a37b0bd672266eafdb/lib/linter/linter.js#L854
get column(): number {
return this.location.start.column;
}
}
Interfaces¶
TokenToText¶
Interface Code
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
[SyntaxKind.ImportKeyword] |
'import' |
✗ | not shown |
[SyntaxKind.KeyOfKeyword] |
'keyof' |
✗ | not shown |
[SyntaxKind.NewKeyword] |
'new' |
✗ | not shown |
[SyntaxKind.ReadonlyKeyword] |
'readonly' |
✗ | not shown |
[SyntaxKind.UniqueKeyword] |
'unique' |
✗ | not shown |
Type Aliases¶
LogicalOperatorKind¶
type LogicalOperatorKind = | ts.SyntaxKind.AmpersandAmpersandToken
| ts.SyntaxKind.BarBarToken
| ts.SyntaxKind.QuestionQuestionToken;
AssignmentOperatorKind¶
BinaryOperatorKind¶
DeclarationKind¶
TokenForTokenKind<T extends ts.SyntaxKind>¶
type TokenForTokenKind<T extends ts.SyntaxKind> = T extends keyof TokenToText
? TokenToText[T]
: string | undefined;
Generated by Syntax Scribe