Support other (new) literal types in jsdoc

This commit is contained in:
Nathan Shively-Sanders
2016-08-04 13:01:17 -07:00
parent 4c3529680d
commit 3c32478b8f
9 changed files with 63 additions and 47 deletions

View File

@@ -5529,8 +5529,8 @@ namespace ts {
return getTypeFromThisTypeNode(node);
case SyntaxKind.LiteralType:
return getTypeFromLiteralTypeNode(<LiteralTypeNode>node);
case SyntaxKind.JSDocStringLiteralType:
return getTypeFromStringLiteralTypeNode((<JSDocStringLiteralType>node).stringLiteral);
case SyntaxKind.JSDocLiteralType:
return getTypeFromLiteralTypeNode((<JSDocLiteralType>node).literal);
case SyntaxKind.TypeReference:
case SyntaxKind.JSDocTypeReference:
return getTypeFromTypeReference(<TypeReferenceNode>node);

View File

@@ -417,6 +417,8 @@ namespace ts {
case SyntaxKind.JSDocPropertyTag:
return visitNode(cbNode, (<JSDocPropertyTag>node).typeExpression) ||
visitNode(cbNode, (<JSDocPropertyTag>node).name);
case SyntaxKind.JSDocLiteralType:
return visitNode(cbNode, (<JSDocLiteralType>node).literal);
}
}
@@ -5890,7 +5892,10 @@ namespace ts {
case SyntaxKind.VoidKeyword:
return parseTokenNode<JSDocType>();
case SyntaxKind.StringLiteral:
return parseJSDocStringLiteralType();
case SyntaxKind.NumericLiteral:
case SyntaxKind.TrueKeyword:
case SyntaxKind.FalseKeyword:
return parseJSDocLiteralType();
}
return parseJSDocTypeReference();
@@ -6071,9 +6076,9 @@ namespace ts {
return finishNode(result);
}
function parseJSDocStringLiteralType(): JSDocStringLiteralType {
const result = <JSDocStringLiteralType>createNode(SyntaxKind.JSDocStringLiteralType);
result.stringLiteral = parseStringLiteralTypeNode();
function parseJSDocLiteralType(): JSDocLiteralType {
const result = <JSDocLiteralType>createNode(SyntaxKind.JSDocLiteralType);
result.literal = parseLiteralTypeNode();
return finishNode(result);
}

View File

@@ -346,7 +346,7 @@ namespace ts {
JSDocTypedefTag,
JSDocPropertyTag,
JSDocTypeLiteral,
JSDocStringLiteralType,
JSDocLiteralType,
// Synthesized list
SyntaxList,
@@ -377,9 +377,9 @@ namespace ts {
LastBinaryOperator = CaretEqualsToken,
FirstNode = QualifiedName,
FirstJSDocNode = JSDocTypeExpression,
LastJSDocNode = JSDocStringLiteralType,
LastJSDocNode = JSDocLiteralType,
FirstJSDocTagNode = JSDocComment,
LastJSDocTagNode = JSDocStringLiteralType
LastJSDocTagNode = JSDocLiteralType
}
export const enum NodeFlags {
@@ -1493,8 +1493,8 @@ namespace ts {
type: JSDocType;
}
export interface JSDocStringLiteralType extends JSDocType {
stringLiteral: StringLiteralTypeNode;
export interface JSDocLiteralType extends JSDocType {
literal: LiteralTypeNode;
}
export type JSDocTypeReferencingNode = JSDocThisType | JSDocConstructorType | JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType;

View File

@@ -4,9 +4,10 @@
* @param {"literal"} p2
* @param {'literal' | 'other'} p3
* @param {'literal' | number} p4
* @param {12 | true | 'str'} p5
*/
function f(p1, p2, p3, p4) {
return p1 + p2 + p3 + p4 + '.';
function f(p1, p2, p3, p4, p5) {
return p1 + p2 + p3 + p4 + p5 + '.';
}
@@ -16,7 +17,8 @@ function f(p1, p2, p3, p4) {
* @param {"literal"} p2
* @param {'literal' | 'other'} p3
* @param {'literal' | number} p4
* @param {12 | true | 'str'} p5
*/
function f(p1, p2, p3, p4) {
return p1 + p2 + p3 + p4 + '.';
function f(p1, p2, p3, p4, p5) {
return p1 + p2 + p3 + p4 + p5 + '.';
}

View File

@@ -0,0 +1,24 @@
=== tests/cases/conformance/jsdoc/in.js ===
/**
* @param {'literal'} p1
* @param {"literal"} p2
* @param {'literal' | 'other'} p3
* @param {'literal' | number} p4
* @param {12 | true | 'str'} p5
*/
function f(p1, p2, p3, p4, p5) {
>f : Symbol(f, Decl(in.js, 0, 0))
>p1 : Symbol(p1, Decl(in.js, 7, 11))
>p2 : Symbol(p2, Decl(in.js, 7, 14))
>p3 : Symbol(p3, Decl(in.js, 7, 18))
>p4 : Symbol(p4, Decl(in.js, 7, 22))
>p5 : Symbol(p5, Decl(in.js, 7, 26))
return p1 + p2 + p3 + p4 + p5 + '.';
>p1 : Symbol(p1, Decl(in.js, 7, 11))
>p2 : Symbol(p2, Decl(in.js, 7, 14))
>p3 : Symbol(p3, Decl(in.js, 7, 18))
>p4 : Symbol(p4, Decl(in.js, 7, 22))
>p5 : Symbol(p5, Decl(in.js, 7, 26))
}

View File

@@ -4,23 +4,27 @@
* @param {"literal"} p2
* @param {'literal' | 'other'} p3
* @param {'literal' | number} p4
* @param {12 | true | 'str'} p5
*/
function f(p1, p2, p3, p4) {
>f : (p1: "literal", p2: "literal", p3: "literal" | "other", p4: "literal" | number) => string
function f(p1, p2, p3, p4, p5) {
>f : (p1: "literal", p2: "literal", p3: "literal" | "other", p4: number | "literal", p5: true | 12 | "str") => string
>p1 : "literal"
>p2 : "literal"
>p3 : "literal" | "other"
>p4 : "literal" | number
>p4 : number | "literal"
>p5 : true | 12 | "str"
return p1 + p2 + p3 + p4 + '.';
>p1 + p2 + p3 + p4 + '.' : string
return p1 + p2 + p3 + p4 + p5 + '.';
>p1 + p2 + p3 + p4 + p5 + '.' : string
>p1 + p2 + p3 + p4 + p5 : string
>p1 + p2 + p3 + p4 : string
>p1 + p2 + p3 : string
>p1 + p2 : string
>p1 : "literal"
>p2 : "literal"
>p3 : "literal" | "other"
>p4 : "literal" | number
>p4 : number | "literal"
>p5 : true | 12 | "str"
>'.' : string
}

View File

@@ -1,21 +0,0 @@
=== tests/cases/conformance/jsdoc/in.js ===
/**
* @param {'literal'} p1
* @param {"literal"} p2
* @param {'literal' | 'other'} p3
* @param {'literal' | number} p4
*/
function f(p1, p2, p3, p4) {
>f : Symbol(f, Decl(in.js, 0, 0))
>p1 : Symbol(p1, Decl(in.js, 6, 11))
>p2 : Symbol(p2, Decl(in.js, 6, 14))
>p3 : Symbol(p3, Decl(in.js, 6, 18))
>p4 : Symbol(p4, Decl(in.js, 6, 22))
return p1 + p2 + p3 + p4 + '.';
>p1 : Symbol(p1, Decl(in.js, 6, 11))
>p2 : Symbol(p2, Decl(in.js, 6, 14))
>p3 : Symbol(p3, Decl(in.js, 6, 18))
>p4 : Symbol(p4, Decl(in.js, 6, 22))
}

View File

@@ -6,7 +6,8 @@
* @param {"literal"} p2
* @param {'literal' | 'other'} p3
* @param {'literal' | number} p4
* @param {12 | true | 'str'} p5
*/
function f(p1, p2, p3, p4) {
return p1 + p2 + p3 + p4 + '.';
function f(p1, p2, p3, p4, p5) {
return p1 + p2 + p3 + p4 + p5 + '.';
}

View File

@@ -6,15 +6,16 @@
//// * @param {"literal"} p2
//// * @param {'other1' | 'other2'} p3
//// * @param {'literal' | number} p4
//// * @param {12 | true} p5
//// */
////function f(p1, p2, p3, p4) {
//// return p1 + p2 + p3 + p4 + '.';
////function f(p1, p2, p3, p4, p5) {
//// return p1 + p2 + p3 + p4 + p5 + '.';
////}
////f/*1*/('literal', 'literal', "o/*2*/ther1", 12);
goTo.marker('1');
verify.quickInfoExists();
verify.quickInfoIs('function f(p1: "literal", p2: "literal", p3: "other1" | "other2", p4: "literal" | number): string', 'I am documentation');
verify.quickInfoIs('function f(p1: "literal", p2: "literal", p3: "other1" | "other2", p4: number | "literal", p5: true | 12): string', 'I am documentation');
goTo.marker('2');
verify.completionListContains("other1");