From 2265a51465a82e55075815f94bd400ab737ba668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Wed, 23 Jan 2019 18:18:22 +0800 Subject: [PATCH 01/10] expose jsdoc factory --- src/compiler/factory.ts | 100 ++++++++++++++++-- .../reference/api/tsserverlibrary.d.ts | 21 ++++ tests/baselines/reference/api/typescript.d.ts | 21 ++++ 3 files changed, 136 insertions(+), 6 deletions(-) diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index ec19d2c906c12..db4d47f608823 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -2181,14 +2181,12 @@ namespace ts { // JSDoc - /* @internal */ export function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression { const node = createSynthesizedNode(SyntaxKind.JSDocTypeExpression) as JSDocTypeExpression; node.type = type; return node; } - /* @internal */ export function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocTypeTag { const tag = createJSDocTag(SyntaxKind.JSDocTypeTag, "type"); tag.typeExpression = typeExpression; @@ -2196,7 +2194,6 @@ namespace ts { return tag; } - /* @internal */ export function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag { const tag = createJSDocTag(SyntaxKind.JSDocReturnTag, "returns"); tag.typeExpression = typeExpression; @@ -2204,7 +2201,6 @@ namespace ts { return tag; } - /* @internal */ export function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag { const tag = createJSDocTag(SyntaxKind.JSDocParameterTag, "param"); tag.typeExpression = typeExpression; @@ -2214,7 +2210,6 @@ namespace ts { return tag; } - /* @internal */ export function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined) { const node = createSynthesizedNode(SyntaxKind.JSDocComment) as JSDoc; node.comment = comment; @@ -2222,13 +2217,106 @@ namespace ts { return node; } - /* @internal */ function createJSDocTag(kind: T["kind"], tagName: string): T { const node = createSynthesizedNode(kind) as T; node.tagName = createIdentifier(tagName); return node; } + export function createJSDocUnknownTag() { + return createSynthesizedNode(SyntaxKind.JSDocTag) as JSDocUnknownTag; + } + + export function createJSDocAugmentsTag(tagName: string, classExpression: ExpressionWithTypeArguments & { expression: Identifier | PropertyAccessEntityNameExpression }, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocAugmentsTag, tagName); + node.class = classExpression; + node.comment = comment; + return node; + } + + export function createJSDocClassTag(tagName: string) { + return createJSDocTag(SyntaxKind.JSDocClassTag, tagName); + } + + export function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocEnumTag, tagName); + node.typeExpression = typeExpression; + node.comment = comment; + return node; + } + + export function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocThisTag, tagName); + node.typeExpression = typeExpression; + node.comment = comment; + return node; + } + + export function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocTemplateTag, tagName); + node.constraint = constraint; + node.typeParameters = typeParameters; + node.comment = comment; + return node; + } + + export function createJSDocTypedefTag(tagName: string, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocTypedefTag, tagName); + node.fullName = fullName; + node.name = name; + node.typeExpression = typeExpression; + node.comment = comment; + return node; + } + + export function createJSDocCallbackTag(tagName: string, typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocCallbackTag, tagName); + node.typeExpression = typeExpression; + node.fullName = fullName; + node.name = name; + node.comment = comment; + return node; + } + + export function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray) { + const node = createSynthesizedNode(SyntaxKind.JSDocSignature) as JSDocSignature; + node.parameters = parameters; + node.typeParameters = typeParameters; + node.type = type; + return node; + } + + export function createJSDocPropertyLikeTag(kind: T["kind"], tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { + const node = createSynthesizedNode(kind) as T; + node.tagName = tagName; + node.name = name; + node.isNameFirst = isNameFirst; + node.isBracketed = isBracketed; + node.typeExpression = typeExpression; + node.comment = comment; + return node; + } + + export function createJSDocPropertyTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { + return createJSDocPropertyLikeTag(SyntaxKind.JSDocPropertyTag, tagName, name, isNameFirst, isBracketed, typeExpression, comment); + } + + export function createJSDocParameterTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { + return createJSDocPropertyLikeTag(SyntaxKind.JSDocParameterTag, tagName, name, isNameFirst, isBracketed, typeExpression, comment); + } + + export function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean) { + const node = createSynthesizedNode(SyntaxKind.JSDocTypeLiteral) as JSDocTypeLiteral; + node.jsDocPropertyTags = jsDocPropertyTags; + node.isArrayType = isArrayType; + return node; + } + + export function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc) { + node.jsDoc = append(node.jsDoc, jsdoc); + return node; + } + // JSX export function createJsxElement(openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement) { diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f71dbc9aa504e..f31b96361bc9c 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -3918,6 +3918,27 @@ declare namespace ts { function updateExportSpecifier(node: ExportSpecifier, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier; function createExternalModuleReference(expression: Expression): ExternalModuleReference; function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference; + function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression; + function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocTypeTag; + function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; + function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; + function createJSDocUnknownTag(): JSDocUnknownTag; + function createJSDocAugmentsTag(tagName: string, classExpression: ExpressionWithTypeArguments & { + expression: Identifier | PropertyAccessEntityNameExpression; + }, comment?: string): JSDocAugmentsTag; + function createJSDocClassTag(tagName: string): JSDocClassTag; + function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; + function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; + function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(tagName: string, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; + function createJSDocCallbackTag(tagName: string, typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; + function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray): JSDocSignature; + function createJSDocPropertyLikeTag(kind: T["kind"], tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): T; + function createJSDocPropertyTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; + function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: ReadonlyArray | undefined, attributes: JsxAttributes): JsxSelfClosingElement; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 03f24988ed355..4284859dd5908 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3918,6 +3918,27 @@ declare namespace ts { function updateExportSpecifier(node: ExportSpecifier, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier; function createExternalModuleReference(expression: Expression): ExternalModuleReference; function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference; + function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression; + function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocTypeTag; + function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; + function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; + function createJSDocUnknownTag(): JSDocUnknownTag; + function createJSDocAugmentsTag(tagName: string, classExpression: ExpressionWithTypeArguments & { + expression: Identifier | PropertyAccessEntityNameExpression; + }, comment?: string): JSDocAugmentsTag; + function createJSDocClassTag(tagName: string): JSDocClassTag; + function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; + function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; + function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(tagName: string, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; + function createJSDocCallbackTag(tagName: string, typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; + function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray): JSDocSignature; + function createJSDocPropertyLikeTag(kind: T["kind"], tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): T; + function createJSDocPropertyTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; + function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: ReadonlyArray | undefined, attributes: JsxAttributes): JsxSelfClosingElement; From 868fce5f1d679b903414af559f37d2f949cfe494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Thu, 24 Jan 2019 15:02:54 +0800 Subject: [PATCH 02/10] refactor jsdoc factory --- src/compiler/factory.ts | 67 +++++++------------ .../reference/api/tsserverlibrary.d.ts | 7 +- tests/baselines/reference/api/typescript.d.ts | 7 +- 3 files changed, 29 insertions(+), 52 deletions(-) diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index db4d47f608823..d2fcc001b6e9e 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -2181,6 +2181,19 @@ namespace ts { // JSDoc + function createJSDocTag(kind: T["kind"], tagName: string, comment?: string): T { + const node = createSynthesizedNode(kind) as T; + node.tagName = createIdentifier(tagName); + node.comment = comment; + return node; + } + + function createJSDocTagWithTypeExpression(kind: T["kind"], tagName: string, typeExpression?: TypeNode, comment?: string) { + const node = createJSDocTag(kind, tagName, comment); + node.typeExpression = typeExpression; + return node; + } + export function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression { const node = createSynthesizedNode(SyntaxKind.JSDocTypeExpression) as JSDocTypeExpression; node.type = type; @@ -2188,25 +2201,17 @@ namespace ts { } export function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocTypeTag { - const tag = createJSDocTag(SyntaxKind.JSDocTypeTag, "type"); - tag.typeExpression = typeExpression; - tag.comment = comment; - return tag; + return createJSDocTagWithTypeExpression(SyntaxKind.JSDocTypeTag, "type", typeExpression, comment); } export function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag { - const tag = createJSDocTag(SyntaxKind.JSDocReturnTag, "returns"); - tag.typeExpression = typeExpression; - tag.comment = comment; - return tag; + return createJSDocTagWithTypeExpression(SyntaxKind.JSDocReturnTag, "returns", typeExpression, comment); } export function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag { - const tag = createJSDocTag(SyntaxKind.JSDocParameterTag, "param"); - tag.typeExpression = typeExpression; + const tag = createJSDocTagWithTypeExpression(SyntaxKind.JSDocParameterTag, "param", typeExpression, comment); tag.name = name; tag.isBracketed = isBracketed; - tag.comment = comment; return tag; } @@ -2217,64 +2222,42 @@ namespace ts { return node; } - function createJSDocTag(kind: T["kind"], tagName: string): T { - const node = createSynthesizedNode(kind) as T; - node.tagName = createIdentifier(tagName); - return node; - } - - export function createJSDocUnknownTag() { - return createSynthesizedNode(SyntaxKind.JSDocTag) as JSDocUnknownTag; - } - - export function createJSDocAugmentsTag(tagName: string, classExpression: ExpressionWithTypeArguments & { expression: Identifier | PropertyAccessEntityNameExpression }, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocAugmentsTag, tagName); + export function createJSDocAugmentsTag(tagName: string, classExpression: JSDocAugmentsTag["class"], comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocAugmentsTag, tagName, comment); node.class = classExpression; - node.comment = comment; return node; } - export function createJSDocClassTag(tagName: string) { - return createJSDocTag(SyntaxKind.JSDocClassTag, tagName); + export function createJSDocClassTag(tagName: string, comment?: string) { + return createJSDocTag(SyntaxKind.JSDocClassTag, tagName, comment); } export function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocEnumTag, tagName); - node.typeExpression = typeExpression; - node.comment = comment; - return node; + return createJSDocTagWithTypeExpression(SyntaxKind.JSDocEnumTag, tagName, typeExpression, comment); } export function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocThisTag, tagName); - node.typeExpression = typeExpression; - node.comment = comment; - return node; + return createJSDocTagWithTypeExpression(SyntaxKind.JSDocThisTag, tagName, typeExpression, comment); } export function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocTemplateTag, tagName); + const node = createJSDocTag(SyntaxKind.JSDocTemplateTag, tagName, comment); node.constraint = constraint; node.typeParameters = typeParameters; - node.comment = comment; return node; } export function createJSDocTypedefTag(tagName: string, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocTypedefTag, tagName); + const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocTypedefTag, tagName, typeExpression, comment); node.fullName = fullName; node.name = name; - node.typeExpression = typeExpression; - node.comment = comment; return node; } export function createJSDocCallbackTag(tagName: string, typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocCallbackTag, tagName); - node.typeExpression = typeExpression; + const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocCallbackTag, tagName, typeExpression, comment); node.fullName = fullName; node.name = name; - node.comment = comment; return node; } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f31b96361bc9c..10fa23bf04b01 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -3923,11 +3923,8 @@ declare namespace ts { function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; - function createJSDocUnknownTag(): JSDocUnknownTag; - function createJSDocAugmentsTag(tagName: string, classExpression: ExpressionWithTypeArguments & { - expression: Identifier | PropertyAccessEntityNameExpression; - }, comment?: string): JSDocAugmentsTag; - function createJSDocClassTag(tagName: string): JSDocClassTag; + function createJSDocAugmentsTag(tagName: string, classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; + function createJSDocClassTag(tagName: string, comment?: string): JSDocClassTag; function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 4284859dd5908..de91d612da1a3 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3923,11 +3923,8 @@ declare namespace ts { function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; - function createJSDocUnknownTag(): JSDocUnknownTag; - function createJSDocAugmentsTag(tagName: string, classExpression: ExpressionWithTypeArguments & { - expression: Identifier | PropertyAccessEntityNameExpression; - }, comment?: string): JSDocAugmentsTag; - function createJSDocClassTag(tagName: string): JSDocClassTag; + function createJSDocAugmentsTag(tagName: string, classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; + function createJSDocClassTag(tagName: string, comment?: string): JSDocClassTag; function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; From 6ea241839c395814e670dd4804e6263e59f0e0fe Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 24 Jan 2019 21:11:51 +0800 Subject: [PATCH 03/10] correctly jsdoc factory types --- src/compiler/factory.ts | 36 +++++++++---------- .../reference/api/tsserverlibrary.d.ts | 19 +++++----- tests/baselines/reference/api/typescript.d.ts | 19 +++++----- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index d2fcc001b6e9e..370dc85ebfc41 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -2222,40 +2222,40 @@ namespace ts { return node; } - export function createJSDocAugmentsTag(tagName: string, classExpression: JSDocAugmentsTag["class"], comment?: string) { + export function createJSDocAugmentsTag(tagName: "augments" | "extends", classExpression: JSDocAugmentsTag["class"], comment?: string) { const node = createJSDocTag(SyntaxKind.JSDocAugmentsTag, tagName, comment); node.class = classExpression; return node; } - export function createJSDocClassTag(tagName: string, comment?: string) { + export function createJSDocClassTag(tagName: "class" | "constructor", comment?: string) { return createJSDocTag(SyntaxKind.JSDocClassTag, tagName, comment); } - export function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string) { - return createJSDocTagWithTypeExpression(SyntaxKind.JSDocEnumTag, tagName, typeExpression, comment); + export function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string) { + return createJSDocTagWithTypeExpression(SyntaxKind.JSDocEnumTag, "enum", typeExpression, comment); } - export function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string) { - return createJSDocTagWithTypeExpression(SyntaxKind.JSDocThisTag, tagName, typeExpression, comment); + export function createJSDocThisTag(typeExpression?: JSDocTypeExpression, comment?: string) { + return createJSDocTagWithTypeExpression(SyntaxKind.JSDocThisTag, "this", typeExpression, comment); } - export function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocTemplateTag, tagName, comment); + export function createJSDocTemplateTag(typeParameters: ReadonlyArray, constraint?: JSDocTypeExpression, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocTemplateTag, "template", comment); node.constraint = constraint; - node.typeParameters = typeParameters; + node.typeParameters = asNodeArray(typeParameters); return node; } - export function createJSDocTypedefTag(tagName: string, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string) { - const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocTypedefTag, tagName, typeExpression, comment); + export function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string) { + const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocTypedefTag, "typedef", typeExpression, comment); node.fullName = fullName; node.name = name; return node; } - export function createJSDocCallbackTag(tagName: string, typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string) { - const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocCallbackTag, tagName, typeExpression, comment); + export function createJSDocCallbackTag(typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string) { + const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocCallbackTag, "callback", typeExpression, comment); node.fullName = fullName; node.name = name; return node; @@ -2269,22 +2269,20 @@ namespace ts { return node; } - export function createJSDocPropertyLikeTag(kind: T["kind"], tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { - const node = createSynthesizedNode(kind) as T; - node.tagName = tagName; + function createJSDocPropertyLikeTag(kind: T["kind"], tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { + const node = createJSDocTagWithTypeExpression(kind, tagName, typeExpression); node.name = name; node.isNameFirst = isNameFirst; node.isBracketed = isBracketed; - node.typeExpression = typeExpression; node.comment = comment; return node; } - export function createJSDocPropertyTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { + export function createJSDocPropertyTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { return createJSDocPropertyLikeTag(SyntaxKind.JSDocPropertyTag, tagName, name, isNameFirst, isBracketed, typeExpression, comment); } - export function createJSDocParameterTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { + export function createJSDocParameterTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { return createJSDocPropertyLikeTag(SyntaxKind.JSDocParameterTag, tagName, name, isNameFirst, isBracketed, typeExpression, comment); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 10fa23bf04b01..fb2892c164371 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -3923,17 +3923,16 @@ declare namespace ts { function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; - function createJSDocAugmentsTag(tagName: string, classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; - function createJSDocClassTag(tagName: string, comment?: string): JSDocClassTag; - function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; - function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; - function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; - function createJSDocTypedefTag(tagName: string, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; - function createJSDocCallbackTag(tagName: string, typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; + function createJSDocAugmentsTag(tagName: "augments" | "extends", classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; + function createJSDocClassTag(tagName: "class" | "constructor", comment?: string): JSDocClassTag; + function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; + function createJSDocThisTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; + function createJSDocTemplateTag(typeParameters: ReadonlyArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; + function createJSDocCallbackTag(typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray): JSDocSignature; - function createJSDocPropertyLikeTag(kind: T["kind"], tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): T; - function createJSDocPropertyTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; - function createJSDocParameterTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocPropertyTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index de91d612da1a3..7810c962d495e 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3923,17 +3923,16 @@ declare namespace ts { function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; - function createJSDocAugmentsTag(tagName: string, classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; - function createJSDocClassTag(tagName: string, comment?: string): JSDocClassTag; - function createJSDocEnumTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; - function createJSDocThisTag(tagName: string, typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; - function createJSDocTemplateTag(tagName: string, typeParameters: NodeArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; - function createJSDocTypedefTag(tagName: string, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; - function createJSDocCallbackTag(tagName: string, typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; + function createJSDocAugmentsTag(tagName: "augments" | "extends", classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; + function createJSDocClassTag(tagName: "class" | "constructor", comment?: string): JSDocClassTag; + function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; + function createJSDocThisTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; + function createJSDocTemplateTag(typeParameters: ReadonlyArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; + function createJSDocCallbackTag(typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray): JSDocSignature; - function createJSDocPropertyLikeTag(kind: T["kind"], tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): T; - function createJSDocPropertyTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; - function createJSDocParameterTag(tagName: Identifier, name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocPropertyTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; From 1cfa651d90944a4374011ce7248ca6db6d21898b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Fri, 25 Jan 2019 11:45:22 +0800 Subject: [PATCH 04/10] update jsdoc factory --- src/compiler/factory.ts | 77 ++++++++++--------- src/services/codefixes/inferFromUsage.ts | 4 +- .../reference/api/tsserverlibrary.d.ts | 13 ++-- tests/baselines/reference/api/typescript.d.ts | 13 ++-- 4 files changed, 56 insertions(+), 51 deletions(-) diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 370dc85ebfc41..5947c1323cd58 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -2181,16 +2181,9 @@ namespace ts { // JSDoc - function createJSDocTag(kind: T["kind"], tagName: string, comment?: string): T { + function createJSDocTag(kind: T["kind"], tagName: string): T { const node = createSynthesizedNode(kind) as T; node.tagName = createIdentifier(tagName); - node.comment = comment; - return node; - } - - function createJSDocTagWithTypeExpression(kind: T["kind"], tagName: string, typeExpression?: TypeNode, comment?: string) { - const node = createJSDocTag(kind, tagName, comment); - node.typeExpression = typeExpression; return node; } @@ -2201,18 +2194,17 @@ namespace ts { } export function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocTypeTag { - return createJSDocTagWithTypeExpression(SyntaxKind.JSDocTypeTag, "type", typeExpression, comment); + const node = createJSDocTag(SyntaxKind.JSDocTypeTag, "type"); + node.typeExpression = typeExpression; + node.comment = comment; + return node; } export function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag { - return createJSDocTagWithTypeExpression(SyntaxKind.JSDocReturnTag, "returns", typeExpression, comment); - } - - export function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag { - const tag = createJSDocTagWithTypeExpression(SyntaxKind.JSDocParameterTag, "param", typeExpression, comment); - tag.name = name; - tag.isBracketed = isBracketed; - return tag; + const node = createJSDocTag(SyntaxKind.JSDocReturnTag, "returns"); + node.typeExpression = typeExpression; + node.comment = comment; + return node; } export function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined) { @@ -2223,54 +2215,69 @@ namespace ts { } export function createJSDocAugmentsTag(tagName: "augments" | "extends", classExpression: JSDocAugmentsTag["class"], comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocAugmentsTag, tagName, comment); + const node = createJSDocTag(SyntaxKind.JSDocAugmentsTag, tagName); node.class = classExpression; + node.comment = comment; return node; } export function createJSDocClassTag(tagName: "class" | "constructor", comment?: string) { - return createJSDocTag(SyntaxKind.JSDocClassTag, tagName, comment); + const node = createJSDocTag(SyntaxKind.JSDocClassTag, tagName); + node.comment = comment; + return node; } export function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string) { - return createJSDocTagWithTypeExpression(SyntaxKind.JSDocEnumTag, "enum", typeExpression, comment); + const node = createJSDocTag(SyntaxKind.JSDocEnumTag, "enum"); + node.typeExpression = typeExpression; + node.comment = comment; + return node; } export function createJSDocThisTag(typeExpression?: JSDocTypeExpression, comment?: string) { - return createJSDocTagWithTypeExpression(SyntaxKind.JSDocThisTag, "this", typeExpression, comment); + const node = createJSDocTag(SyntaxKind.JSDocThisTag, "this"); + node.typeExpression = typeExpression; + node.comment = comment; + return node; } - export function createJSDocTemplateTag(typeParameters: ReadonlyArray, constraint?: JSDocTypeExpression, comment?: string) { - const node = createJSDocTag(SyntaxKind.JSDocTemplateTag, "template", comment); + export function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string) { + const node = createJSDocTag(SyntaxKind.JSDocTemplateTag, "template"); node.constraint = constraint; node.typeParameters = asNodeArray(typeParameters); + node.comment = comment; return node; } - export function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string) { - const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocTypedefTag, "typedef", typeExpression, comment); + export function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral) { + const node = createJSDocTag(SyntaxKind.JSDocTypedefTag, "typedef"); node.fullName = fullName; node.name = name; + node.comment = comment; + node.typeExpression = typeExpression; return node; } - export function createJSDocCallbackTag(typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string) { - const node = createJSDocTagWithTypeExpression(SyntaxKind.JSDocCallbackTag, "callback", typeExpression, comment); + export function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature) { + const node = createJSDocTag(SyntaxKind.JSDocCallbackTag, "callback"); node.fullName = fullName; node.name = name; + node.comment = comment; + node.typeExpression = typeExpression; return node; } - export function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray) { + export function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag) { const node = createSynthesizedNode(SyntaxKind.JSDocSignature) as JSDocSignature; - node.parameters = parameters; node.typeParameters = typeParameters; + node.parameters = parameters; node.type = type; return node; } - function createJSDocPropertyLikeTag(kind: T["kind"], tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { - const node = createJSDocTagWithTypeExpression(kind, tagName, typeExpression); + function createJSDocPropertyLikeTag(kind: T["kind"], tagName: "arg" | "argument" | "param", typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string) { + const node = createJSDocTag(kind, tagName); + node.typeExpression = typeExpression; node.name = name; node.isNameFirst = isNameFirst; node.isBracketed = isBracketed; @@ -2278,12 +2285,12 @@ namespace ts { return node; } - export function createJSDocPropertyTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { - return createJSDocPropertyLikeTag(SyntaxKind.JSDocPropertyTag, tagName, name, isNameFirst, isBracketed, typeExpression, comment); + export function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string) { + return createJSDocPropertyLikeTag(SyntaxKind.JSDocPropertyTag, "param", typeExpression, name, isNameFirst, isBracketed, comment); } - export function createJSDocParameterTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string) { - return createJSDocPropertyLikeTag(SyntaxKind.JSDocParameterTag, tagName, name, isNameFirst, isBracketed, typeExpression, comment); + export function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string) { + return createJSDocPropertyLikeTag(SyntaxKind.JSDocParameterTag, "param", typeExpression, name, isNameFirst, isBracketed, comment); } export function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean) { diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index 8e5b962116def..731da6aeea8a3 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -260,7 +260,7 @@ namespace ts.codefix { const typeNode = inference.type && getTypeNodeIfAccessible(inference.type, param, program, host); const name = getSynthesizedClone(param.name); setEmitFlags(name, EmitFlags.NoComments | EmitFlags.NoNestedComments); - return typeNode && createJSDocParamTag(name, !!inference.isOptional, createJSDocTypeExpression(typeNode), ""); + return typeNode && createJSDocParameterTag(createJSDocTypeExpression(typeNode), name, /* isNameFirst */ false, !!inference.isOptional, ""); }); addJSDocTags(changes, sourceFile, signature, paramTags); } @@ -286,7 +286,7 @@ namespace ts.codefix { const oldParam = oldTag as JSDocParameterTag; const newParam = newTag as JSDocParameterTag; return isIdentifier(oldParam.name) && isIdentifier(newParam.name) && oldParam.name.escapedText === newParam.name.escapedText - ? createJSDocParamTag(newParam.name, newParam.isBracketed, newParam.typeExpression, oldParam.comment) + ? createJSDocParameterTag(newParam.typeExpression, newParam.name, newParam.isNameFirst, newParam.isBracketed, oldParam.comment) : undefined; } case SyntaxKind.JSDocReturnTag: diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index fb2892c164371..c550813637796 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -3921,18 +3921,17 @@ declare namespace ts { function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression; function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocTypeTag; function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; - function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; function createJSDocAugmentsTag(tagName: "augments" | "extends", classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; function createJSDocClassTag(tagName: "class" | "constructor", comment?: string): JSDocClassTag; function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; function createJSDocThisTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; - function createJSDocTemplateTag(typeParameters: ReadonlyArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; - function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; - function createJSDocCallbackTag(typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; - function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray): JSDocSignature; - function createJSDocPropertyTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; - function createJSDocParameterTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag; + function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag; + function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag): JSDocSignature; + function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 7810c962d495e..ae0246ef8b303 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3921,18 +3921,17 @@ declare namespace ts { function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression; function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocTypeTag; function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; - function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; function createJSDocAugmentsTag(tagName: "augments" | "extends", classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; function createJSDocClassTag(tagName: "class" | "constructor", comment?: string): JSDocClassTag; function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; function createJSDocThisTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocThisTag; - function createJSDocTemplateTag(typeParameters: ReadonlyArray, constraint?: JSDocTypeExpression, comment?: string): JSDocTemplateTag; - function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, comment?: string): JSDocTypedefTag; - function createJSDocCallbackTag(typeExpression: JSDocSignature, fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string): JSDocCallbackTag; - function createJSDocSignature(parameters: ReadonlyArray, type?: JSDocReturnTag, typeParameters?: ReadonlyArray): JSDocSignature; - function createJSDocPropertyTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocPropertyTag; - function createJSDocParameterTag(tagName: "arg" | "argument" | "param", name: EntityName, isNameFirst: boolean, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag; + function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag; + function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag): JSDocSignature; + function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: ReadonlyArray, closingElement: JsxClosingElement): JsxElement; From 76937c3b1a5c3acbb3da8e449f5f88978be4eed0 Mon Sep 17 00:00:00 2001 From: kingwl Date: Mon, 13 Apr 2020 11:25:02 +0800 Subject: [PATCH 05/10] Add check for delete expression must be optional --- src/compiler/checker.ts | 17 +++- src/compiler/diagnosticMessages.json | 4 + .../controlFlowDeleteOperator.errors.txt | 5 +- .../reference/deleteChain.errors.txt | 66 +++++++++++++ ...ionMustBeOptional(strict=false).errors.txt | 30 ++++++ ...eExpressionMustBeOptional(strict=false).js | 37 +++++++ ...essionMustBeOptional(strict=false).symbols | 84 ++++++++++++++++ ...pressionMustBeOptional(strict=false).types | 96 +++++++++++++++++++ ...sionMustBeOptional(strict=true).errors.txt | 36 +++++++ ...teExpressionMustBeOptional(strict=true).js | 38 ++++++++ ...ressionMustBeOptional(strict=true).symbols | 84 ++++++++++++++++ ...xpressionMustBeOptional(strict=true).types | 96 +++++++++++++++++++ .../reference/privateNamesNoDelete.errors.txt | 5 +- .../deleteExpressionMustBeOptional.ts | 26 +++++ 14 files changed, 620 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/deleteChain.errors.txt create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols create mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types create mode 100644 tests/cases/compiler/deleteExpressionMustBeOptional.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5cab127293b72..24f3bc96c3e46 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -27564,14 +27564,27 @@ namespace ts { if (expr.kind === SyntaxKind.PropertyAccessExpression && isPrivateIdentifier((expr as PropertyAccessExpression).name)) { error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } + const links = getNodeLinks(expr); const symbol = getExportSymbolOfValueSymbolIfExported(links.resolvedSymbol); - if (symbol && isReadonlySymbol(symbol)) { - error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property); + if (symbol) { + if (isReadonlySymbol(symbol)) { + error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property); + } + + checkDeleteExpressionMustBeOptional(expr, getTypeOfSymbol(symbol)); } + return booleanType; } + function checkDeleteExpressionMustBeOptional(expr: AccessExpression, type: Type) { + const AnyOrUnknownOrNeverFlags = TypeFlags.AnyOrUnknown | TypeFlags.Never; + if (strictNullChecks && !(type.flags & AnyOrUnknownOrNeverFlags) && !(getFalsyFlags(type) & TypeFlags.Undefined)) { + error(expr, Diagnostics.The_operand_of_a_delete_operator_must_be_optional); + } + } + function checkTypeOfExpression(node: TypeOfExpression): Type { checkExpression(node.expression); return typeofType; diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 29bf61b2f752b..2982160f2f778 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2963,6 +2963,10 @@ "category": "Error", "code": 2789 }, + "The operand of a 'delete' operator must be optional.": { + "category": "Error", + "code": 2790 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/controlFlowDeleteOperator.errors.txt b/tests/baselines/reference/controlFlowDeleteOperator.errors.txt index 91ec2aa0de8db..f5a6823a778b0 100644 --- a/tests/baselines/reference/controlFlowDeleteOperator.errors.txt +++ b/tests/baselines/reference/controlFlowDeleteOperator.errors.txt @@ -1,7 +1,8 @@ +tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts(10,12): error TS2790: The operand of a 'delete' operator must be optional. tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts(14,12): error TS2703: The operand of a 'delete' operator must be a property reference. -==== tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts (1 errors) ==== +==== tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts (2 errors) ==== function f() { let x: { a?: number | string, b: number | string } = { b: 1 }; x.a; @@ -12,6 +13,8 @@ tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts(14,12): error T x.b; delete x.a; delete x.b; + ~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. x.a; x.b; x; diff --git a/tests/baselines/reference/deleteChain.errors.txt b/tests/baselines/reference/deleteChain.errors.txt new file mode 100644 index 0000000000000..dd71641957338 --- /dev/null +++ b/tests/baselines/reference/deleteChain.errors.txt @@ -0,0 +1,66 @@ +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(2,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(3,9): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(6,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(7,9): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(10,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(11,9): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(14,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(15,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(16,9): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(19,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(20,9): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(23,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(24,9): error TS2790: The operand of a 'delete' operator must be optional. + + +==== tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts (13 errors) ==== + declare const o1: undefined | { b: string }; + delete o1?.b; + ~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete (o1?.b); + ~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + + declare const o2: undefined | { b: { c: string } }; + delete o2?.b.c; + ~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete (o2?.b.c); + ~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + + declare const o3: { b: undefined | { c: string } }; + delete o3.b?.c; + ~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete (o3.b?.c); + ~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + + declare const o4: { b?: { c: { d?: { e: string } } } }; + delete o4.b?.c.d?.e; + ~~~~~~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete (o4.b?.c.d)?.e; + ~~~~~~~~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete (o4.b?.c.d?.e); + ~~~~~~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + + declare const o5: { b?(): { c: { d?: { e: string } } } }; + delete o5.b?.().c.d?.e; + ~~~~~~~~~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete (o5.b?.().c.d?.e); + ~~~~~~~~~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + + declare const o6: { b?: { c: { d?: { e: string } } } }; + delete o6.b?.['c'].d?.['e']; + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete (o6.b?.['c'].d?.['e']); + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt new file mode 100644 index 0000000000000..e6697b2b02d78 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt @@ -0,0 +1,30 @@ +tests/cases/compiler/deleteExpressionMustBeOptional.ts(24,10): error TS2339: Property 'j' does not exist on type 'Foo'. + + +==== tests/cases/compiler/deleteExpressionMustBeOptional.ts (1 errors) ==== + interface Foo { + a: number + b: number | undefined + c: number | null + d?: number + e: number | undefined | null + f?: number | undefined | null + g: unknown + h: any + i: never + } + + declare const f: Foo + + delete f.a + delete f.b + delete f.c + delete f.d + delete f.e + delete f.f + delete f.g + delete f.h + delete f.i + delete f.j + ~ +!!! error TS2339: Property 'j' does not exist on type 'Foo'. \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js new file mode 100644 index 0000000000000..0e674d2112d19 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js @@ -0,0 +1,37 @@ +//// [deleteExpressionMustBeOptional.ts] +interface Foo { + a: number + b: number | undefined + c: number | null + d?: number + e: number | undefined | null + f?: number | undefined | null + g: unknown + h: any + i: never +} + +declare const f: Foo + +delete f.a +delete f.b +delete f.c +delete f.d +delete f.e +delete f.f +delete f.g +delete f.h +delete f.i +delete f.j + +//// [deleteExpressionMustBeOptional.js] +delete f.a; +delete f.b; +delete f.c; +delete f.d; +delete f.e; +delete f.f; +delete f.g; +delete f.h; +delete f.i; +delete f.j; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols new file mode 100644 index 0000000000000..891a72d546ba3 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols @@ -0,0 +1,84 @@ +=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === +interface Foo { +>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) + + a: number +>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) + + b: number | undefined +>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) + + c: number | null +>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) + + d?: number +>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) + + e: number | undefined | null +>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) + + f?: number | undefined | null +>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) + + g: unknown +>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) + + h: any +>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) + + i: never +>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) +} + +declare const f: Foo +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) + +delete f.a +>f.a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) + +delete f.b +>f.b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) + +delete f.c +>f.c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) + +delete f.d +>f.d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) + +delete f.e +>f.e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) + +delete f.f +>f.f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) + +delete f.g +>f.g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) + +delete f.h +>f.h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) + +delete f.i +>f.i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) + +delete f.j +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) + diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types new file mode 100644 index 0000000000000..de73ba8d1bb0e --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types @@ -0,0 +1,96 @@ +=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === +interface Foo { + a: number +>a : number + + b: number | undefined +>b : number + + c: number | null +>c : number +>null : null + + d?: number +>d : number + + e: number | undefined | null +>e : number +>null : null + + f?: number | undefined | null +>f : number +>null : null + + g: unknown +>g : unknown + + h: any +>h : any + + i: never +>i : never +} + +declare const f: Foo +>f : Foo + +delete f.a +>delete f.a : boolean +>f.a : number +>f : Foo +>a : number + +delete f.b +>delete f.b : boolean +>f.b : number +>f : Foo +>b : number + +delete f.c +>delete f.c : boolean +>f.c : number +>f : Foo +>c : number + +delete f.d +>delete f.d : boolean +>f.d : number +>f : Foo +>d : number + +delete f.e +>delete f.e : boolean +>f.e : number +>f : Foo +>e : number + +delete f.f +>delete f.f : boolean +>f.f : number +>f : Foo +>f : number + +delete f.g +>delete f.g : boolean +>f.g : unknown +>f : Foo +>g : unknown + +delete f.h +>delete f.h : boolean +>f.h : any +>f : Foo +>h : any + +delete f.i +>delete f.i : boolean +>f.i : never +>f : Foo +>i : never + +delete f.j +>delete f.j : boolean +>f.j : any +>f : Foo +>j : any + diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt new file mode 100644 index 0000000000000..63c4c5955936d --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt @@ -0,0 +1,36 @@ +tests/cases/compiler/deleteExpressionMustBeOptional.ts(15,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/compiler/deleteExpressionMustBeOptional.ts(17,8): error TS2790: The operand of a 'delete' operator must be optional. +tests/cases/compiler/deleteExpressionMustBeOptional.ts(24,10): error TS2339: Property 'j' does not exist on type 'Foo'. + + +==== tests/cases/compiler/deleteExpressionMustBeOptional.ts (3 errors) ==== + interface Foo { + a: number + b: number | undefined + c: number | null + d?: number + e: number | undefined | null + f?: number | undefined | null + g: unknown + h: any + i: never + } + + declare const f: Foo + + delete f.a + ~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete f.b + delete f.c + ~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + delete f.d + delete f.e + delete f.f + delete f.g + delete f.h + delete f.i + delete f.j + ~ +!!! error TS2339: Property 'j' does not exist on type 'Foo'. \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js new file mode 100644 index 0000000000000..df83f1f6a8288 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js @@ -0,0 +1,38 @@ +//// [deleteExpressionMustBeOptional.ts] +interface Foo { + a: number + b: number | undefined + c: number | null + d?: number + e: number | undefined | null + f?: number | undefined | null + g: unknown + h: any + i: never +} + +declare const f: Foo + +delete f.a +delete f.b +delete f.c +delete f.d +delete f.e +delete f.f +delete f.g +delete f.h +delete f.i +delete f.j + +//// [deleteExpressionMustBeOptional.js] +"use strict"; +delete f.a; +delete f.b; +delete f.c; +delete f.d; +delete f.e; +delete f.f; +delete f.g; +delete f.h; +delete f.i; +delete f.j; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols new file mode 100644 index 0000000000000..891a72d546ba3 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols @@ -0,0 +1,84 @@ +=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === +interface Foo { +>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) + + a: number +>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) + + b: number | undefined +>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) + + c: number | null +>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) + + d?: number +>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) + + e: number | undefined | null +>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) + + f?: number | undefined | null +>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) + + g: unknown +>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) + + h: any +>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) + + i: never +>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) +} + +declare const f: Foo +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) + +delete f.a +>f.a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) + +delete f.b +>f.b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) + +delete f.c +>f.c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) + +delete f.d +>f.d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) + +delete f.e +>f.e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) + +delete f.f +>f.f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) + +delete f.g +>f.g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) + +delete f.h +>f.h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) + +delete f.i +>f.i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) +>i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) + +delete f.j +>f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) + diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types new file mode 100644 index 0000000000000..be9da977d93e2 --- /dev/null +++ b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types @@ -0,0 +1,96 @@ +=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === +interface Foo { + a: number +>a : number + + b: number | undefined +>b : number | undefined + + c: number | null +>c : number | null +>null : null + + d?: number +>d : number | undefined + + e: number | undefined | null +>e : number | null | undefined +>null : null + + f?: number | undefined | null +>f : number | null | undefined +>null : null + + g: unknown +>g : unknown + + h: any +>h : any + + i: never +>i : never +} + +declare const f: Foo +>f : Foo + +delete f.a +>delete f.a : boolean +>f.a : number +>f : Foo +>a : number + +delete f.b +>delete f.b : boolean +>f.b : number | undefined +>f : Foo +>b : number | undefined + +delete f.c +>delete f.c : boolean +>f.c : number | null +>f : Foo +>c : number | null + +delete f.d +>delete f.d : boolean +>f.d : number | undefined +>f : Foo +>d : number | undefined + +delete f.e +>delete f.e : boolean +>f.e : number | null | undefined +>f : Foo +>e : number | null | undefined + +delete f.f +>delete f.f : boolean +>f.f : number | null | undefined +>f : Foo +>f : number | null | undefined + +delete f.g +>delete f.g : boolean +>f.g : unknown +>f : Foo +>g : unknown + +delete f.h +>delete f.h : boolean +>f.h : any +>f : Foo +>h : any + +delete f.i +>delete f.i : boolean +>f.i : never +>f : Foo +>i : never + +delete f.j +>delete f.j : boolean +>f.j : any +>f : Foo +>j : any + diff --git a/tests/baselines/reference/privateNamesNoDelete.errors.txt b/tests/baselines/reference/privateNamesNoDelete.errors.txt index d593fe107a181..e2fc11cb4ac73 100644 --- a/tests/baselines/reference/privateNamesNoDelete.errors.txt +++ b/tests/baselines/reference/privateNamesNoDelete.errors.txt @@ -1,12 +1,15 @@ +tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts(4,16): error TS2790: The operand of a 'delete' operator must be optional. tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts(4,16): error TS18011: The operand of a 'delete' operator cannot be a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts (1 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts (2 errors) ==== class A { #v = 1; constructor() { delete this.#v; // Error: The operand of a delete operator cannot be a private name. ~~~~~~~ +!!! error TS2790: The operand of a 'delete' operator must be optional. + ~~~~~~~ !!! error TS18011: The operand of a 'delete' operator cannot be a private identifier. } } diff --git a/tests/cases/compiler/deleteExpressionMustBeOptional.ts b/tests/cases/compiler/deleteExpressionMustBeOptional.ts new file mode 100644 index 0000000000000..348f09ae5fc34 --- /dev/null +++ b/tests/cases/compiler/deleteExpressionMustBeOptional.ts @@ -0,0 +1,26 @@ +// @strict: true, false + +interface Foo { + a: number + b: number | undefined + c: number | null + d?: number + e: number | undefined | null + f?: number | undefined | null + g: unknown + h: any + i: never +} + +declare const f: Foo + +delete f.a +delete f.b +delete f.c +delete f.d +delete f.e +delete f.f +delete f.g +delete f.h +delete f.i +delete f.j \ No newline at end of file From 5a76afe44e6c3296b5a07963d3545b4b11a3cf51 Mon Sep 17 00:00:00 2001 From: kingwl Date: Tue, 14 Apr 2020 13:53:13 +0800 Subject: [PATCH 06/10] accept new basseline --- .../reference/api/tsserverlibrary.d.ts | 24 +++++++++++++++++++ tests/baselines/reference/api/typescript.d.ts | 24 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 5e91796d88019..f01da8513ea80 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4246,6 +4246,30 @@ declare namespace ts { function updateExportSpecifier(node: ExportSpecifier, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier; function createExternalModuleReference(expression: Expression): ExternalModuleReference; function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference; + function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression; + function createJSDocTypeTag(typeExpression: JSDocTypeExpression, comment?: string): JSDocTypeTag; + function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; + function createJSDocThisTag(typeExpression?: JSDocTypeExpression): JSDocThisTag; + function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocClassTag(comment?: string): JSDocClassTag; + function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; + function createJSDocTag(kind: T["kind"], tagName: string, comment?: string): T; + function createJSDocAugmentsTag(classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; + function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; + function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag; + function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag; + function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag): JSDocSignature; + function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; + function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; + function createJSDocImplementTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; + function createJSDocAuthorTag(comment?: string): JSDocTag; + function createJSDocPublicTag(): JSDocTag; + function createJSDocPrivateTag(): JSDocTag; + function createJSDocProtectedTag(): JSDocTag; + function createJSDocReadonlyTag(): JSDocTag; + function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement; function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement; function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index bca7c4c4ab7f4..c61b74c5848f3 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4246,6 +4246,30 @@ declare namespace ts { function updateExportSpecifier(node: ExportSpecifier, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier; function createExternalModuleReference(expression: Expression): ExternalModuleReference; function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference; + function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression; + function createJSDocTypeTag(typeExpression: JSDocTypeExpression, comment?: string): JSDocTypeTag; + function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; + function createJSDocThisTag(typeExpression?: JSDocTypeExpression): JSDocThisTag; + function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; + function createJSDocClassTag(comment?: string): JSDocClassTag; + function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; + function createJSDocTag(kind: T["kind"], tagName: string, comment?: string): T; + function createJSDocAugmentsTag(classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; + function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; + function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string): JSDocTemplateTag; + function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag; + function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag; + function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag): JSDocSignature; + function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; + function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; + function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; + function createJSDocImplementTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; + function createJSDocAuthorTag(comment?: string): JSDocTag; + function createJSDocPublicTag(): JSDocTag; + function createJSDocPrivateTag(): JSDocTag; + function createJSDocProtectedTag(): JSDocTag; + function createJSDocReadonlyTag(): JSDocTag; + function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer; function createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement; function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement; function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement; From 2285fa3abca6cd897b2609ea99e58ef2740d7ded Mon Sep 17 00:00:00 2001 From: kingwl Date: Tue, 14 Apr 2020 14:06:42 +0800 Subject: [PATCH 07/10] Revert "Add check for delete expression must be optional" This reverts commit 76937c3b1a5c3acbb3da8e449f5f88978be4eed0. --- src/compiler/checker.ts | 17 +--- src/compiler/diagnosticMessages.json | 4 - .../controlFlowDeleteOperator.errors.txt | 5 +- .../reference/deleteChain.errors.txt | 66 ------------- ...ionMustBeOptional(strict=false).errors.txt | 30 ------ ...eExpressionMustBeOptional(strict=false).js | 37 ------- ...essionMustBeOptional(strict=false).symbols | 84 ---------------- ...pressionMustBeOptional(strict=false).types | 96 ------------------- ...sionMustBeOptional(strict=true).errors.txt | 36 ------- ...teExpressionMustBeOptional(strict=true).js | 38 -------- ...ressionMustBeOptional(strict=true).symbols | 84 ---------------- ...xpressionMustBeOptional(strict=true).types | 96 ------------------- .../reference/privateNamesNoDelete.errors.txt | 5 +- .../deleteExpressionMustBeOptional.ts | 26 ----- 14 files changed, 4 insertions(+), 620 deletions(-) delete mode 100644 tests/baselines/reference/deleteChain.errors.txt delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols delete mode 100644 tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types delete mode 100644 tests/cases/compiler/deleteExpressionMustBeOptional.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 24f3bc96c3e46..5cab127293b72 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -27564,27 +27564,14 @@ namespace ts { if (expr.kind === SyntaxKind.PropertyAccessExpression && isPrivateIdentifier((expr as PropertyAccessExpression).name)) { error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } - const links = getNodeLinks(expr); const symbol = getExportSymbolOfValueSymbolIfExported(links.resolvedSymbol); - if (symbol) { - if (isReadonlySymbol(symbol)) { - error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property); - } - - checkDeleteExpressionMustBeOptional(expr, getTypeOfSymbol(symbol)); + if (symbol && isReadonlySymbol(symbol)) { + error(expr, Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property); } - return booleanType; } - function checkDeleteExpressionMustBeOptional(expr: AccessExpression, type: Type) { - const AnyOrUnknownOrNeverFlags = TypeFlags.AnyOrUnknown | TypeFlags.Never; - if (strictNullChecks && !(type.flags & AnyOrUnknownOrNeverFlags) && !(getFalsyFlags(type) & TypeFlags.Undefined)) { - error(expr, Diagnostics.The_operand_of_a_delete_operator_must_be_optional); - } - } - function checkTypeOfExpression(node: TypeOfExpression): Type { checkExpression(node.expression); return typeofType; diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 2982160f2f778..29bf61b2f752b 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2963,10 +2963,6 @@ "category": "Error", "code": 2789 }, - "The operand of a 'delete' operator must be optional.": { - "category": "Error", - "code": 2790 - }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/controlFlowDeleteOperator.errors.txt b/tests/baselines/reference/controlFlowDeleteOperator.errors.txt index f5a6823a778b0..91ec2aa0de8db 100644 --- a/tests/baselines/reference/controlFlowDeleteOperator.errors.txt +++ b/tests/baselines/reference/controlFlowDeleteOperator.errors.txt @@ -1,8 +1,7 @@ -tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts(10,12): error TS2790: The operand of a 'delete' operator must be optional. tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts(14,12): error TS2703: The operand of a 'delete' operator must be a property reference. -==== tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts (2 errors) ==== +==== tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts (1 errors) ==== function f() { let x: { a?: number | string, b: number | string } = { b: 1 }; x.a; @@ -13,8 +12,6 @@ tests/cases/conformance/controlFlow/controlFlowDeleteOperator.ts(14,12): error T x.b; delete x.a; delete x.b; - ~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. x.a; x.b; x; diff --git a/tests/baselines/reference/deleteChain.errors.txt b/tests/baselines/reference/deleteChain.errors.txt deleted file mode 100644 index dd71641957338..0000000000000 --- a/tests/baselines/reference/deleteChain.errors.txt +++ /dev/null @@ -1,66 +0,0 @@ -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(2,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(3,9): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(6,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(7,9): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(10,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(11,9): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(14,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(15,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(16,9): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(19,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(20,9): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(23,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts(24,9): error TS2790: The operand of a 'delete' operator must be optional. - - -==== tests/cases/conformance/expressions/optionalChaining/delete/deleteChain.ts (13 errors) ==== - declare const o1: undefined | { b: string }; - delete o1?.b; - ~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete (o1?.b); - ~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - - declare const o2: undefined | { b: { c: string } }; - delete o2?.b.c; - ~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete (o2?.b.c); - ~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - - declare const o3: { b: undefined | { c: string } }; - delete o3.b?.c; - ~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete (o3.b?.c); - ~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - - declare const o4: { b?: { c: { d?: { e: string } } } }; - delete o4.b?.c.d?.e; - ~~~~~~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete (o4.b?.c.d)?.e; - ~~~~~~~~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete (o4.b?.c.d?.e); - ~~~~~~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - - declare const o5: { b?(): { c: { d?: { e: string } } } }; - delete o5.b?.().c.d?.e; - ~~~~~~~~~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete (o5.b?.().c.d?.e); - ~~~~~~~~~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - - declare const o6: { b?: { c: { d?: { e: string } } } }; - delete o6.b?.['c'].d?.['e']; - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete (o6.b?.['c'].d?.['e']); - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt deleted file mode 100644 index e6697b2b02d78..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).errors.txt +++ /dev/null @@ -1,30 +0,0 @@ -tests/cases/compiler/deleteExpressionMustBeOptional.ts(24,10): error TS2339: Property 'j' does not exist on type 'Foo'. - - -==== tests/cases/compiler/deleteExpressionMustBeOptional.ts (1 errors) ==== - interface Foo { - a: number - b: number | undefined - c: number | null - d?: number - e: number | undefined | null - f?: number | undefined | null - g: unknown - h: any - i: never - } - - declare const f: Foo - - delete f.a - delete f.b - delete f.c - delete f.d - delete f.e - delete f.f - delete f.g - delete f.h - delete f.i - delete f.j - ~ -!!! error TS2339: Property 'j' does not exist on type 'Foo'. \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js deleted file mode 100644 index 0e674d2112d19..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).js +++ /dev/null @@ -1,37 +0,0 @@ -//// [deleteExpressionMustBeOptional.ts] -interface Foo { - a: number - b: number | undefined - c: number | null - d?: number - e: number | undefined | null - f?: number | undefined | null - g: unknown - h: any - i: never -} - -declare const f: Foo - -delete f.a -delete f.b -delete f.c -delete f.d -delete f.e -delete f.f -delete f.g -delete f.h -delete f.i -delete f.j - -//// [deleteExpressionMustBeOptional.js] -delete f.a; -delete f.b; -delete f.c; -delete f.d; -delete f.e; -delete f.f; -delete f.g; -delete f.h; -delete f.i; -delete f.j; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols deleted file mode 100644 index 891a72d546ba3..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).symbols +++ /dev/null @@ -1,84 +0,0 @@ -=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === -interface Foo { ->Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) - - a: number ->a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) - - b: number | undefined ->b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) - - c: number | null ->c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) - - d?: number ->d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) - - e: number | undefined | null ->e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) - - f?: number | undefined | null ->f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) - - g: unknown ->g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) - - h: any ->h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) - - i: never ->i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) -} - -declare const f: Foo ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) - -delete f.a ->f.a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) - -delete f.b ->f.b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) - -delete f.c ->f.c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) - -delete f.d ->f.d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) - -delete f.e ->f.e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) - -delete f.f ->f.f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) - -delete f.g ->f.g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) - -delete f.h ->f.h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) - -delete f.i ->f.i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) - -delete f.j ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) - diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types deleted file mode 100644 index de73ba8d1bb0e..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=false).types +++ /dev/null @@ -1,96 +0,0 @@ -=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === -interface Foo { - a: number ->a : number - - b: number | undefined ->b : number - - c: number | null ->c : number ->null : null - - d?: number ->d : number - - e: number | undefined | null ->e : number ->null : null - - f?: number | undefined | null ->f : number ->null : null - - g: unknown ->g : unknown - - h: any ->h : any - - i: never ->i : never -} - -declare const f: Foo ->f : Foo - -delete f.a ->delete f.a : boolean ->f.a : number ->f : Foo ->a : number - -delete f.b ->delete f.b : boolean ->f.b : number ->f : Foo ->b : number - -delete f.c ->delete f.c : boolean ->f.c : number ->f : Foo ->c : number - -delete f.d ->delete f.d : boolean ->f.d : number ->f : Foo ->d : number - -delete f.e ->delete f.e : boolean ->f.e : number ->f : Foo ->e : number - -delete f.f ->delete f.f : boolean ->f.f : number ->f : Foo ->f : number - -delete f.g ->delete f.g : boolean ->f.g : unknown ->f : Foo ->g : unknown - -delete f.h ->delete f.h : boolean ->f.h : any ->f : Foo ->h : any - -delete f.i ->delete f.i : boolean ->f.i : never ->f : Foo ->i : never - -delete f.j ->delete f.j : boolean ->f.j : any ->f : Foo ->j : any - diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt deleted file mode 100644 index 63c4c5955936d..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).errors.txt +++ /dev/null @@ -1,36 +0,0 @@ -tests/cases/compiler/deleteExpressionMustBeOptional.ts(15,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/compiler/deleteExpressionMustBeOptional.ts(17,8): error TS2790: The operand of a 'delete' operator must be optional. -tests/cases/compiler/deleteExpressionMustBeOptional.ts(24,10): error TS2339: Property 'j' does not exist on type 'Foo'. - - -==== tests/cases/compiler/deleteExpressionMustBeOptional.ts (3 errors) ==== - interface Foo { - a: number - b: number | undefined - c: number | null - d?: number - e: number | undefined | null - f?: number | undefined | null - g: unknown - h: any - i: never - } - - declare const f: Foo - - delete f.a - ~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete f.b - delete f.c - ~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - delete f.d - delete f.e - delete f.f - delete f.g - delete f.h - delete f.i - delete f.j - ~ -!!! error TS2339: Property 'j' does not exist on type 'Foo'. \ No newline at end of file diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js deleted file mode 100644 index df83f1f6a8288..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).js +++ /dev/null @@ -1,38 +0,0 @@ -//// [deleteExpressionMustBeOptional.ts] -interface Foo { - a: number - b: number | undefined - c: number | null - d?: number - e: number | undefined | null - f?: number | undefined | null - g: unknown - h: any - i: never -} - -declare const f: Foo - -delete f.a -delete f.b -delete f.c -delete f.d -delete f.e -delete f.f -delete f.g -delete f.h -delete f.i -delete f.j - -//// [deleteExpressionMustBeOptional.js] -"use strict"; -delete f.a; -delete f.b; -delete f.c; -delete f.d; -delete f.e; -delete f.f; -delete f.g; -delete f.h; -delete f.i; -delete f.j; diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols deleted file mode 100644 index 891a72d546ba3..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).symbols +++ /dev/null @@ -1,84 +0,0 @@ -=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === -interface Foo { ->Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) - - a: number ->a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) - - b: number | undefined ->b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) - - c: number | null ->c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) - - d?: number ->d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) - - e: number | undefined | null ->e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) - - f?: number | undefined | null ->f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) - - g: unknown ->g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) - - h: any ->h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) - - i: never ->i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) -} - -declare const f: Foo ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->Foo : Symbol(Foo, Decl(deleteExpressionMustBeOptional.ts, 0, 0)) - -delete f.a ->f.a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->a : Symbol(Foo.a, Decl(deleteExpressionMustBeOptional.ts, 0, 15)) - -delete f.b ->f.b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->b : Symbol(Foo.b, Decl(deleteExpressionMustBeOptional.ts, 1, 13)) - -delete f.c ->f.c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->c : Symbol(Foo.c, Decl(deleteExpressionMustBeOptional.ts, 2, 25)) - -delete f.d ->f.d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->d : Symbol(Foo.d, Decl(deleteExpressionMustBeOptional.ts, 3, 20)) - -delete f.e ->f.e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->e : Symbol(Foo.e, Decl(deleteExpressionMustBeOptional.ts, 4, 14)) - -delete f.f ->f.f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->f : Symbol(Foo.f, Decl(deleteExpressionMustBeOptional.ts, 5, 32)) - -delete f.g ->f.g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->g : Symbol(Foo.g, Decl(deleteExpressionMustBeOptional.ts, 6, 33)) - -delete f.h ->f.h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->h : Symbol(Foo.h, Decl(deleteExpressionMustBeOptional.ts, 7, 14)) - -delete f.i ->f.i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) ->i : Symbol(Foo.i, Decl(deleteExpressionMustBeOptional.ts, 8, 10)) - -delete f.j ->f : Symbol(f, Decl(deleteExpressionMustBeOptional.ts, 12, 13)) - diff --git a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types b/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types deleted file mode 100644 index be9da977d93e2..0000000000000 --- a/tests/baselines/reference/deleteExpressionMustBeOptional(strict=true).types +++ /dev/null @@ -1,96 +0,0 @@ -=== tests/cases/compiler/deleteExpressionMustBeOptional.ts === -interface Foo { - a: number ->a : number - - b: number | undefined ->b : number | undefined - - c: number | null ->c : number | null ->null : null - - d?: number ->d : number | undefined - - e: number | undefined | null ->e : number | null | undefined ->null : null - - f?: number | undefined | null ->f : number | null | undefined ->null : null - - g: unknown ->g : unknown - - h: any ->h : any - - i: never ->i : never -} - -declare const f: Foo ->f : Foo - -delete f.a ->delete f.a : boolean ->f.a : number ->f : Foo ->a : number - -delete f.b ->delete f.b : boolean ->f.b : number | undefined ->f : Foo ->b : number | undefined - -delete f.c ->delete f.c : boolean ->f.c : number | null ->f : Foo ->c : number | null - -delete f.d ->delete f.d : boolean ->f.d : number | undefined ->f : Foo ->d : number | undefined - -delete f.e ->delete f.e : boolean ->f.e : number | null | undefined ->f : Foo ->e : number | null | undefined - -delete f.f ->delete f.f : boolean ->f.f : number | null | undefined ->f : Foo ->f : number | null | undefined - -delete f.g ->delete f.g : boolean ->f.g : unknown ->f : Foo ->g : unknown - -delete f.h ->delete f.h : boolean ->f.h : any ->f : Foo ->h : any - -delete f.i ->delete f.i : boolean ->f.i : never ->f : Foo ->i : never - -delete f.j ->delete f.j : boolean ->f.j : any ->f : Foo ->j : any - diff --git a/tests/baselines/reference/privateNamesNoDelete.errors.txt b/tests/baselines/reference/privateNamesNoDelete.errors.txt index e2fc11cb4ac73..d593fe107a181 100644 --- a/tests/baselines/reference/privateNamesNoDelete.errors.txt +++ b/tests/baselines/reference/privateNamesNoDelete.errors.txt @@ -1,15 +1,12 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts(4,16): error TS2790: The operand of a 'delete' operator must be optional. tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts(4,16): error TS18011: The operand of a 'delete' operator cannot be a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts (2 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesNoDelete.ts (1 errors) ==== class A { #v = 1; constructor() { delete this.#v; // Error: The operand of a delete operator cannot be a private name. ~~~~~~~ -!!! error TS2790: The operand of a 'delete' operator must be optional. - ~~~~~~~ !!! error TS18011: The operand of a 'delete' operator cannot be a private identifier. } } diff --git a/tests/cases/compiler/deleteExpressionMustBeOptional.ts b/tests/cases/compiler/deleteExpressionMustBeOptional.ts deleted file mode 100644 index 348f09ae5fc34..0000000000000 --- a/tests/cases/compiler/deleteExpressionMustBeOptional.ts +++ /dev/null @@ -1,26 +0,0 @@ -// @strict: true, false - -interface Foo { - a: number - b: number | undefined - c: number | null - d?: number - e: number | undefined | null - f?: number | undefined | null - g: unknown - h: any - i: never -} - -declare const f: Foo - -delete f.a -delete f.b -delete f.c -delete f.d -delete f.e -delete f.f -delete f.g -delete f.h -delete f.i -delete f.j \ No newline at end of file From 6c4b439147f32a482f49e671a50a67cf84c6bee7 Mon Sep 17 00:00:00 2001 From: kingwl Date: Tue, 14 Apr 2020 14:08:24 +0800 Subject: [PATCH 08/10] remove newline --- src/compiler/factoryPublic.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/factoryPublic.ts b/src/compiler/factoryPublic.ts index f02ad8b3d79b9..0dcdf3a3a80e8 100644 --- a/src/compiler/factoryPublic.ts +++ b/src/compiler/factoryPublic.ts @@ -2611,7 +2611,6 @@ namespace ts { node.jsDoc = append(node.jsDoc, jsdoc); return node; } - // JSX From 61e16d4c9525c45420c0c21481ffeab6a9e9fdbb Mon Sep 17 00:00:00 2001 From: kingwl Date: Tue, 14 Apr 2020 17:04:17 +0800 Subject: [PATCH 09/10] make linter happy --- src/compiler/factoryPublic.ts | 6 +++--- tests/baselines/reference/api/tsserverlibrary.d.ts | 6 +++--- tests/baselines/reference/api/typescript.d.ts | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/compiler/factoryPublic.ts b/src/compiler/factoryPublic.ts index 0dcdf3a3a80e8..c742f40805b32 100644 --- a/src/compiler/factoryPublic.ts +++ b/src/compiler/factoryPublic.ts @@ -2526,7 +2526,7 @@ namespace ts { return tag; } - export function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string) { + export function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string) { const tag = createJSDocTag(SyntaxKind.JSDocTemplateTag, "template", comment); tag.constraint = constraint; tag.typeParameters = asNodeArray(typeParameters); @@ -2549,7 +2549,7 @@ namespace ts { return tag; } - export function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag) { + export function createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag) { const tag = createSynthesizedNode(SyntaxKind.JSDocSignature) as JSDocSignature; tag.typeParameters = typeParameters; tag.parameters = parameters; @@ -2574,7 +2574,7 @@ namespace ts { return createJSDocPropertyLikeTag(SyntaxKind.JSDocParameterTag, "param", typeExpression, name, isNameFirst, isBracketed, comment); } - export function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean) { + export function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean) { const tag = createSynthesizedNode(SyntaxKind.JSDocTypeLiteral) as JSDocTypeLiteral; tag.jsDocPropertyTags = jsDocPropertyTags; tag.isArrayType = isArrayType; diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f01da8513ea80..61b3a54895c9e 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4256,13 +4256,13 @@ declare namespace ts { function createJSDocTag(kind: T["kind"], tagName: string, comment?: string): T; function createJSDocAugmentsTag(classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; - function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string): JSDocTemplateTag; + function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string): JSDocTemplateTag; function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag; function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag; - function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag): JSDocSignature; + function createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag): JSDocSignature; function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; - function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; + function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean): JSDocTypeLiteral; function createJSDocImplementTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; function createJSDocAuthorTag(comment?: string): JSDocTag; function createJSDocPublicTag(): JSDocTag; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index c61b74c5848f3..7ad7d97a5f086 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4256,13 +4256,13 @@ declare namespace ts { function createJSDocTag(kind: T["kind"], tagName: string, comment?: string): T; function createJSDocAugmentsTag(classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag; function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag; - function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: ReadonlyArray, comment?: string): JSDocTemplateTag; + function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string): JSDocTemplateTag; function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag; function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag; - function createJSDocSignature(typeParameters: ReadonlyArray | undefined, parameters: ReadonlyArray, type?: JSDocReturnTag): JSDocSignature; + function createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag): JSDocSignature; function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; - function createJSDocTypeLiteral(jsDocPropertyTags?: ReadonlyArray, isArrayType?: boolean): JSDocTypeLiteral; + function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean): JSDocTypeLiteral; function createJSDocImplementTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; function createJSDocAuthorTag(comment?: string): JSDocTag; function createJSDocPublicTag(): JSDocTag; From e577f7e021e811e62f28cc0615cb776a58f4dc3d Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 16 Apr 2020 14:14:26 +0800 Subject: [PATCH 10/10] Add deprecated comment --- src/compiler/factoryPublic.ts | 5 ++++- tests/baselines/reference/api/tsserverlibrary.d.ts | 5 ++++- tests/baselines/reference/api/typescript.d.ts | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/compiler/factoryPublic.ts b/src/compiler/factoryPublic.ts index c742f40805b32..77cf0d98ed3fb 100644 --- a/src/compiler/factoryPublic.ts +++ b/src/compiler/factoryPublic.ts @@ -2487,6 +2487,9 @@ namespace ts { return tag; } + /** + * @deprecated Use `createJSDocParameterTag` to create jsDoc param tag. + */ export function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag { const tag = createJSDocTag(SyntaxKind.JSDocParameterTag, "param", comment); tag.typeExpression = typeExpression; @@ -2581,7 +2584,7 @@ namespace ts { return tag; } - export function createJSDocImplementTag(classExpression: JSDocImplementsTag["class"], comment?: string) { + export function createJSDocImplementsTag(classExpression: JSDocImplementsTag["class"], comment?: string) { const tag = createJSDocTag(SyntaxKind.JSDocImplementsTag, "implements", comment); tag.class = classExpression; return tag; diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 61b3a54895c9e..442df6421d33e 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4250,6 +4250,9 @@ declare namespace ts { function createJSDocTypeTag(typeExpression: JSDocTypeExpression, comment?: string): JSDocTypeTag; function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; function createJSDocThisTag(typeExpression?: JSDocTypeExpression): JSDocThisTag; + /** + * @deprecated Use `createJSDocParameterTag` to create jsDoc param tag. + */ function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocClassTag(comment?: string): JSDocClassTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; @@ -4263,7 +4266,7 @@ declare namespace ts { function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean): JSDocTypeLiteral; - function createJSDocImplementTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; + function createJSDocImplementsTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; function createJSDocAuthorTag(comment?: string): JSDocTag; function createJSDocPublicTag(): JSDocTag; function createJSDocPrivateTag(): JSDocTag; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 7ad7d97a5f086..233535081d384 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4250,6 +4250,9 @@ declare namespace ts { function createJSDocTypeTag(typeExpression: JSDocTypeExpression, comment?: string): JSDocTypeTag; function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag; function createJSDocThisTag(typeExpression?: JSDocTypeExpression): JSDocThisTag; + /** + * @deprecated Use `createJSDocParameterTag` to create jsDoc param tag. + */ function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag; function createJSDocClassTag(comment?: string): JSDocClassTag; function createJSDocComment(comment?: string | undefined, tags?: NodeArray | undefined): JSDoc; @@ -4263,7 +4266,7 @@ declare namespace ts { function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag; function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag; function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean): JSDocTypeLiteral; - function createJSDocImplementTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; + function createJSDocImplementsTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag; function createJSDocAuthorTag(comment?: string): JSDocTag; function createJSDocPublicTag(): JSDocTag; function createJSDocPrivateTag(): JSDocTag;