From 35d76b0d384be90a4497a860140969f0d1fcf1bc Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 20 Jan 2023 15:37:29 -0800 Subject: [PATCH] Export more Node tests for use in public API (#52284) --- src/compiler/factory/nodeTests.ts | 7 ---- src/compiler/factory/utilities.ts | 38 ++++++++++--------- src/compiler/utilitiesPublic.ts | 23 +---------- .../reference/api/tsserverlibrary.d.ts | 30 +++++++++++++++ tests/baselines/reference/api/typescript.d.ts | 30 +++++++++++++++ 5 files changed, 82 insertions(+), 46 deletions(-) diff --git a/src/compiler/factory/nodeTests.ts b/src/compiler/factory/nodeTests.ts index 1e2a505830c..54cbe50462c 100644 --- a/src/compiler/factory/nodeTests.ts +++ b/src/compiler/factory/nodeTests.ts @@ -292,27 +292,22 @@ export function isAsteriskToken(node: Node): node is AsteriskToken { return node.kind === SyntaxKind.AsteriskToken; } -/** @internal */ export function isExclamationToken(node: Node): node is ExclamationToken { return node.kind === SyntaxKind.ExclamationToken; } -/** @internal */ export function isQuestionToken(node: Node): node is QuestionToken { return node.kind === SyntaxKind.QuestionToken; } -/** @internal */ export function isColonToken(node: Node): node is ColonToken { return node.kind === SyntaxKind.ColonToken; } -/** @internal */ export function isQuestionDotToken(node: Node): node is QuestionDotToken { return node.kind === SyntaxKind.QuestionDotToken; } -/** @internal */ export function isEqualsGreaterThanToken(node: Node): node is EqualsGreaterThanToken { return node.kind === SyntaxKind.EqualsGreaterThanToken; } @@ -344,12 +339,10 @@ export function isAsyncModifier(node: Node): node is AsyncKeyword { return node.kind === SyntaxKind.AsyncKeyword; } -/** @internal */ export function isAssertsKeyword(node: Node): node is AssertsKeyword { return node.kind === SyntaxKind.AssertsKeyword; } -/** @internal */ export function isAwaitKeyword(node: Node): node is AwaitKeyword { return node.kind === SyntaxKind.AwaitKeyword; } diff --git a/src/compiler/factory/utilities.ts b/src/compiler/factory/utilities.ts index 6cfb47451ac..61cbc7dffc7 100644 --- a/src/compiler/factory/utilities.ts +++ b/src/compiler/factory/utilities.ts @@ -111,8 +111,6 @@ import { isSpreadElement, isStringLiteral, isThisTypeNode, - isTypeNode, - isTypeParameterDeclaration, isVariableDeclarationList, JSDocNamespaceBody, JSDocTypeAssertion, @@ -143,7 +141,6 @@ import { NumericLiteral, ObjectLiteralElementLike, ObjectLiteralExpression, - or, OuterExpression, OuterExpressionKinds, outFile, @@ -178,7 +175,6 @@ import { ThisTypeNode, Token, TypeNode, - TypeParameterDeclaration, } from "../_namespaces/ts"; // Compound nodes @@ -629,7 +625,7 @@ export function isJSDocTypeAssertion(node: Node): node is JSDocTypeAssertion { } /** @internal */ -export function getJSDocTypeAssertionType(node: JSDocTypeAssertion) { +export function getJSDocTypeAssertionType(node: JSDocTypeAssertion): TypeNode { const type = getJSDocType(node); Debug.assertIsDefined(type); return type; @@ -1160,18 +1156,25 @@ export function canHaveIllegalModifiers(node: Node): node is HasIllegalModifiers || kind === SyntaxKind.NamespaceExportDeclaration; } -/** @internal */ -export const isTypeNodeOrTypeParameterDeclaration = or(isTypeNode, isTypeParameterDeclaration) as (node: Node) => node is TypeNode | TypeParameterDeclaration; -/** @internal */ -export const isQuestionOrExclamationToken = or(isQuestionToken, isExclamationToken) as (node: Node) => node is QuestionToken | ExclamationToken; -/** @internal */ -export const isIdentifierOrThisTypeNode = or(isIdentifier, isThisTypeNode) as (node: Node) => node is Identifier | ThisTypeNode; -/** @internal */ -export const isReadonlyKeywordOrPlusOrMinusToken = or(isReadonlyKeyword, isPlusToken, isMinusToken) as (node: Node) => node is ReadonlyKeyword | PlusToken | MinusToken; -/** @internal */ -export const isQuestionOrPlusOrMinusToken = or(isQuestionToken, isPlusToken, isMinusToken) as (node: Node) => node is QuestionToken | PlusToken | MinusToken; -/** @internal */ -export const isModuleName = or(isIdentifier, isStringLiteral) as (node: Node) => node is ModuleName; +export function isQuestionOrExclamationToken(node: Node): node is QuestionToken | ExclamationToken { + return isQuestionToken(node) || isExclamationToken(node); +} + +export function isIdentifierOrThisTypeNode(node: Node): node is Identifier | ThisTypeNode { + return isIdentifier(node) || isThisTypeNode(node); +} + +export function isReadonlyKeywordOrPlusOrMinusToken(node: Node): node is ReadonlyKeyword | PlusToken | MinusToken { + return isReadonlyKeyword(node) || isPlusToken(node) || isMinusToken(node); +} + +export function isQuestionOrPlusOrMinusToken(node: Node): node is QuestionToken | PlusToken | MinusToken { + return isQuestionToken(node) || isPlusToken(node) || isMinusToken(node); +} + +export function isModuleName(node: Node): node is ModuleName { + return isIdentifier(node) || isStringLiteral(node); +} /** @internal */ export function isLiteralTypeLikeExpression(node: Node): node is NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression { @@ -1278,7 +1281,6 @@ function isBinaryOperator(kind: SyntaxKind): kind is BinaryOperator { || kind === SyntaxKind.CommaToken; } -/** @internal */ export function isBinaryOperatorToken(node: Node): node is BinaryOperatorToken { return isBinaryOperator(node.kind); } diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index 4d0106e9185..8a11f5f0f97 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -1790,7 +1790,6 @@ export function isAssignmentPattern(node: Node): node is AssignmentPattern { } -/** @internal */ export function isArrayBindingElement(node: Node): node is ArrayBindingElement { const kind = node.kind; return kind === SyntaxKind.BindingElement @@ -1930,7 +1929,6 @@ export function isTemplateLiteral(node: Node): node is TemplateLiteral { || kind === SyntaxKind.NoSubstitutionTemplateLiteral; } -/** @internal */ export function isLeftHandSideExpression(node: Node): node is LeftHandSideExpression { return isLeftHandSideExpressionKind(skipPartiallyEmittedExpressions(node).kind); } @@ -2007,13 +2005,8 @@ export function isUnaryExpressionWithWrite(expr: Node): expr is PrefixUnaryExpre } } -/** - * See isExpression; not for use in transforms. - * @internal - */ export function isLiteralTypeLiteral(node: Node): node is NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression { - node = skipPartiallyEmittedExpressions(node); - switch (skipPartiallyEmittedExpressions(node).kind) { + switch (node.kind) { case SyntaxKind.NullKeyword: case SyntaxKind.TrueKeyword: case SyntaxKind.FalseKeyword: @@ -2026,9 +2019,6 @@ export function isLiteralTypeLiteral(node: Node): node is NullLiteral | BooleanL /** * Determines whether a node is an expression based only on its kind. - * Use `isExpressionNode` if not in transforms. - * - * @internal */ export function isExpression(node: Node): node is Expression { return isExpressionKind(skipPartiallyEmittedExpressions(node).kind); @@ -2111,7 +2101,6 @@ export function isForInOrOfStatement(node: Node): node is ForInOrOfStatement { // Element -/** @internal */ export function isConciseBody(node: Node): node is ConciseBody { return isBlock(node) || isExpression(node); @@ -2122,13 +2111,11 @@ export function isFunctionBody(node: Node): node is FunctionBody { return isBlock(node); } -/** @internal */ export function isForInitializer(node: Node): node is ForInitializer { return isVariableDeclarationList(node) || isExpression(node); } -/** @internal */ export function isModuleBody(node: Node): node is ModuleBody { const kind = node.kind; return kind === SyntaxKind.ModuleBlock @@ -2150,7 +2137,6 @@ export function isJSDocNamespaceBody(node: Node): node is JSDocNamespaceBody { || kind === SyntaxKind.ModuleDeclaration; } -/** @internal */ export function isNamedImportBindings(node: Node): node is NamedImportBindings { const kind = node.kind; return kind === SyntaxKind.NamedImports @@ -2376,7 +2362,6 @@ export function isStatementButNotDeclaration(node: Node): node is Statement { return isStatementKindButNotDeclarationKind(node.kind); } -/** @internal */ export function isStatement(node: Node): node is Statement { const kind = node.kind; return isStatementKindButNotDeclarationKind(kind) @@ -2394,6 +2379,7 @@ function isBlockStatement(node: Node): node is Block { return !isFunctionBlock(node); } +// TODO(jakebailey): should we be exporting this function and not isStatement? /** * NOTE: This is similar to `isStatement` but does not access parent pointers. * @@ -2408,7 +2394,6 @@ export function isStatementOrBlock(node: Node): node is Statement | Block { // Module references -/** @internal */ export function isModuleReference(node: Node): node is ModuleReference { const kind = node.kind; return kind === SyntaxKind.ExternalModuleReference @@ -2418,7 +2403,6 @@ export function isModuleReference(node: Node): node is ModuleReference { // JSX -/** @internal */ export function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression { const kind = node.kind; return kind === SyntaxKind.ThisKeyword @@ -2426,7 +2410,6 @@ export function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression || kind === SyntaxKind.PropertyAccessExpression; } -/** @internal */ export function isJsxChild(node: Node): node is JsxChild { const kind = node.kind; return kind === SyntaxKind.JsxElement @@ -2436,14 +2419,12 @@ export function isJsxChild(node: Node): node is JsxChild { || kind === SyntaxKind.JsxFragment; } -/** @internal */ export function isJsxAttributeLike(node: Node): node is JsxAttributeLike { const kind = node.kind; return kind === SyntaxKind.JsxAttribute || kind === SyntaxKind.JsxSpreadAttribute; } -/** @internal */ export function isStringLiteralOrJsxExpression(node: Node): node is StringLiteral | JsxExpression { const kind = node.kind; return kind === SyntaxKind.StringLiteral diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index ee4e4ed0131..9c70638b6fe 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -8640,13 +8640,30 @@ declare namespace ts { */ function isTypeNode(node: Node): node is TypeNode; function isFunctionOrConstructorTypeNode(node: Node): node is FunctionTypeNode | ConstructorTypeNode; + function isArrayBindingElement(node: Node): node is ArrayBindingElement; function isPropertyAccessOrQualifiedName(node: Node): node is PropertyAccessExpression | QualifiedName; function isCallLikeExpression(node: Node): node is CallLikeExpression; function isCallOrNewExpression(node: Node): node is CallExpression | NewExpression; function isTemplateLiteral(node: Node): node is TemplateLiteral; + function isLeftHandSideExpression(node: Node): node is LeftHandSideExpression; + function isLiteralTypeLiteral(node: Node): node is NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; + /** + * Determines whether a node is an expression based only on its kind. + */ + function isExpression(node: Node): node is Expression; function isAssertionExpression(node: Node): node is AssertionExpression; function isIterationStatement(node: Node, lookInLabeledStatements: false): node is IterationStatement; function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement | LabeledStatement; + function isConciseBody(node: Node): node is ConciseBody; + function isForInitializer(node: Node): node is ForInitializer; + function isModuleBody(node: Node): node is ModuleBody; + function isNamedImportBindings(node: Node): node is NamedImportBindings; + function isStatement(node: Node): node is Statement; + function isModuleReference(node: Node): node is ModuleReference; + function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression; + function isJsxChild(node: Node): node is JsxChild; + function isJsxAttributeLike(node: Node): node is JsxAttributeLike; + function isStringLiteralOrJsxExpression(node: Node): node is StringLiteral | JsxExpression; function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; /** True if node is of a kind that may contain comment text. */ @@ -8765,8 +8782,15 @@ declare namespace ts { function isPlusToken(node: Node): node is PlusToken; function isMinusToken(node: Node): node is MinusToken; function isAsteriskToken(node: Node): node is AsteriskToken; + function isExclamationToken(node: Node): node is ExclamationToken; + function isQuestionToken(node: Node): node is QuestionToken; + function isColonToken(node: Node): node is ColonToken; + function isQuestionDotToken(node: Node): node is QuestionDotToken; + function isEqualsGreaterThanToken(node: Node): node is EqualsGreaterThanToken; function isIdentifier(node: Node): node is Identifier; function isPrivateIdentifier(node: Node): node is PrivateIdentifier; + function isAssertsKeyword(node: Node): node is AssertsKeyword; + function isAwaitKeyword(node: Node): node is AwaitKeyword; function isQualifiedName(node: Node): node is QualifiedName; function isComputedPropertyName(node: Node): node is ComputedPropertyName; function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; @@ -8957,6 +8981,12 @@ declare namespace ts { function isJSDocImplementsTag(node: Node): node is JSDocImplementsTag; function isJSDocSatisfiesTag(node: Node): node is JSDocSatisfiesTag; function isJSDocThrowsTag(node: Node): node is JSDocThrowsTag; + function isQuestionOrExclamationToken(node: Node): node is QuestionToken | ExclamationToken; + function isIdentifierOrThisTypeNode(node: Node): node is Identifier | ThisTypeNode; + function isReadonlyKeywordOrPlusOrMinusToken(node: Node): node is ReadonlyKeyword | PlusToken | MinusToken; + function isQuestionOrPlusOrMinusToken(node: Node): node is QuestionToken | PlusToken | MinusToken; + function isModuleName(node: Node): node is ModuleName; + function isBinaryOperatorToken(node: Node): node is BinaryOperatorToken; function setTextRange(range: T, location: TextRange | undefined): T; function canHaveModifiers(node: Node): node is HasModifiers; function canHaveDecorators(node: Node): node is HasDecorators; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 1706cbd164f..659436296ca 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4661,13 +4661,30 @@ declare namespace ts { */ function isTypeNode(node: Node): node is TypeNode; function isFunctionOrConstructorTypeNode(node: Node): node is FunctionTypeNode | ConstructorTypeNode; + function isArrayBindingElement(node: Node): node is ArrayBindingElement; function isPropertyAccessOrQualifiedName(node: Node): node is PropertyAccessExpression | QualifiedName; function isCallLikeExpression(node: Node): node is CallLikeExpression; function isCallOrNewExpression(node: Node): node is CallExpression | NewExpression; function isTemplateLiteral(node: Node): node is TemplateLiteral; + function isLeftHandSideExpression(node: Node): node is LeftHandSideExpression; + function isLiteralTypeLiteral(node: Node): node is NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; + /** + * Determines whether a node is an expression based only on its kind. + */ + function isExpression(node: Node): node is Expression; function isAssertionExpression(node: Node): node is AssertionExpression; function isIterationStatement(node: Node, lookInLabeledStatements: false): node is IterationStatement; function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement | LabeledStatement; + function isConciseBody(node: Node): node is ConciseBody; + function isForInitializer(node: Node): node is ForInitializer; + function isModuleBody(node: Node): node is ModuleBody; + function isNamedImportBindings(node: Node): node is NamedImportBindings; + function isStatement(node: Node): node is Statement; + function isModuleReference(node: Node): node is ModuleReference; + function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression; + function isJsxChild(node: Node): node is JsxChild; + function isJsxAttributeLike(node: Node): node is JsxAttributeLike; + function isStringLiteralOrJsxExpression(node: Node): node is StringLiteral | JsxExpression; function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; /** True if node is of a kind that may contain comment text. */ @@ -4786,8 +4803,15 @@ declare namespace ts { function isPlusToken(node: Node): node is PlusToken; function isMinusToken(node: Node): node is MinusToken; function isAsteriskToken(node: Node): node is AsteriskToken; + function isExclamationToken(node: Node): node is ExclamationToken; + function isQuestionToken(node: Node): node is QuestionToken; + function isColonToken(node: Node): node is ColonToken; + function isQuestionDotToken(node: Node): node is QuestionDotToken; + function isEqualsGreaterThanToken(node: Node): node is EqualsGreaterThanToken; function isIdentifier(node: Node): node is Identifier; function isPrivateIdentifier(node: Node): node is PrivateIdentifier; + function isAssertsKeyword(node: Node): node is AssertsKeyword; + function isAwaitKeyword(node: Node): node is AwaitKeyword; function isQualifiedName(node: Node): node is QualifiedName; function isComputedPropertyName(node: Node): node is ComputedPropertyName; function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; @@ -4978,6 +5002,12 @@ declare namespace ts { function isJSDocImplementsTag(node: Node): node is JSDocImplementsTag; function isJSDocSatisfiesTag(node: Node): node is JSDocSatisfiesTag; function isJSDocThrowsTag(node: Node): node is JSDocThrowsTag; + function isQuestionOrExclamationToken(node: Node): node is QuestionToken | ExclamationToken; + function isIdentifierOrThisTypeNode(node: Node): node is Identifier | ThisTypeNode; + function isReadonlyKeywordOrPlusOrMinusToken(node: Node): node is ReadonlyKeyword | PlusToken | MinusToken; + function isQuestionOrPlusOrMinusToken(node: Node): node is QuestionToken | PlusToken | MinusToken; + function isModuleName(node: Node): node is ModuleName; + function isBinaryOperatorToken(node: Node): node is BinaryOperatorToken; function setTextRange(range: T, location: TextRange | undefined): T; function canHaveModifiers(node: Node): node is HasModifiers; function canHaveDecorators(node: Node): node is HasDecorators;