mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-30 01:04:49 -05:00
Jsdoc property description (#50269)
* jsdocPropertyDescription * jsdocPropertyDescription * jsdocPropertyDescription * Fixes #47933 * added additional test * added additional example * fixed bug * changed function to only grab the literal type * added additional condition for literals and symbols * added additional test cases * Update src/services/symbolDisplay.ts Co-authored-by: Andrew Branch <andrewbranch@users.noreply.github.com> * addressed PR review * addressed new PR review Co-authored-by: Danay Fernandez Alfonso <t-danayf@microsoft.com> Co-authored-by: Andrew Branch <andrewbranch@users.noreply.github.com>
This commit is contained in:
@@ -439,6 +439,7 @@ namespace ts {
|
||||
getTypeOfPropertyOfType: (type, name) => getTypeOfPropertyOfType(type, escapeLeadingUnderscores(name)),
|
||||
getIndexInfoOfType: (type, kind) => getIndexInfoOfType(type, kind === IndexKind.String ? stringType : numberType),
|
||||
getIndexInfosOfType,
|
||||
getIndexInfosOfIndexSymbol,
|
||||
getSignaturesOfType,
|
||||
getIndexTypeOfType: (type, kind) => getIndexTypeOfType(type, kind === IndexKind.String ? stringType : numberType),
|
||||
getIndexType: type => getIndexType(type),
|
||||
@@ -42615,6 +42616,35 @@ namespace ts {
|
||||
|
||||
if (name.kind === SyntaxKind.PropertyAccessExpression) {
|
||||
checkPropertyAccessExpression(name, CheckMode.Normal);
|
||||
if (!links.resolvedSymbol) {
|
||||
const expressionType = checkExpressionCached(name.expression);
|
||||
const infos = getApplicableIndexInfos(expressionType, getLiteralTypeFromPropertyName(name.name));
|
||||
if (infos.length && (expressionType as ObjectType).members) {
|
||||
const resolved = resolveStructuredTypeMembers(expressionType as ObjectType);
|
||||
const symbol = resolved.members.get(InternalSymbolName.Index);
|
||||
if (infos === getIndexInfosOfType(expressionType)) {
|
||||
links.resolvedSymbol = symbol;
|
||||
}
|
||||
else if (symbol) {
|
||||
const symbolLinks = getSymbolLinks(symbol);
|
||||
const declarationList = mapDefined(infos, i => i.declaration);
|
||||
const nodeListId = map(declarationList, getNodeId).join(",");
|
||||
if (!symbolLinks.filteredIndexSymbolCache) {
|
||||
symbolLinks.filteredIndexSymbolCache = new Map();
|
||||
}
|
||||
if (symbolLinks.filteredIndexSymbolCache.has(nodeListId)) {
|
||||
links.resolvedSymbol = symbolLinks.filteredIndexSymbolCache.get(nodeListId)!;
|
||||
}
|
||||
else {
|
||||
const copy = createSymbol(SymbolFlags.Signature, InternalSymbolName.Index);
|
||||
copy.declarations = mapDefined(infos, i => i.declaration);
|
||||
copy.parent = expressionType.aliasSymbol ? expressionType.aliasSymbol : expressionType.symbol ? expressionType.symbol : getSymbolAtLocation(copy.declarations[0].parent);
|
||||
symbolLinks.filteredIndexSymbolCache.set(nodeListId, copy);
|
||||
links.resolvedSymbol = symbolLinks.filteredIndexSymbolCache.get(nodeListId)!;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
checkQualifiedName(name, CheckMode.Normal);
|
||||
|
||||
@@ -4557,6 +4557,7 @@ namespace ts {
|
||||
/* @internal */ getTypeOfPropertyOfType(type: Type, propertyName: string): Type | undefined;
|
||||
getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined;
|
||||
getIndexInfosOfType(type: Type): readonly IndexInfo[];
|
||||
getIndexInfosOfIndexSymbol: (indexSymbol: Symbol) => IndexInfo[];
|
||||
getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[];
|
||||
getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined;
|
||||
/* @internal */ getIndexType(type: Type): Type;
|
||||
@@ -5373,6 +5374,7 @@ namespace ts {
|
||||
isConstructorDeclaredProperty?: boolean; // Property declared through 'this.x = ...' assignment in constructor
|
||||
tupleLabelDeclaration?: NamedTupleMember | ParameterDeclaration; // Declaration associated with the tuple's label
|
||||
accessibleChainCache?: ESMap<string, Symbol[] | undefined>;
|
||||
filteredIndexSymbolCache?: ESMap<string, Symbol> //Symbol with applicable declarations
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
|
||||
@@ -64,6 +64,7 @@ namespace ts.SymbolDisplay {
|
||||
if (flags & SymbolFlags.SetAccessor) return ScriptElementKind.memberSetAccessorElement;
|
||||
if (flags & SymbolFlags.Method) return ScriptElementKind.memberFunctionElement;
|
||||
if (flags & SymbolFlags.Constructor) return ScriptElementKind.constructorImplementationElement;
|
||||
if (flags & SymbolFlags.Signature) return ScriptElementKind.indexSignatureElement;
|
||||
|
||||
if (flags & SymbolFlags.Property) {
|
||||
if (flags & SymbolFlags.Transient && (symbol as TransientSymbol).checkFlags & CheckFlags.Synthetic) {
|
||||
@@ -506,7 +507,6 @@ namespace ts.SymbolDisplay {
|
||||
else {
|
||||
addPrefixForAnyFunctionOrVar(symbol, symbolKind);
|
||||
}
|
||||
|
||||
// For properties, variables and local vars: show the type
|
||||
if (symbolKind === ScriptElementKind.memberVariableElement ||
|
||||
symbolKind === ScriptElementKind.memberGetAccessorElement ||
|
||||
@@ -514,11 +514,12 @@ namespace ts.SymbolDisplay {
|
||||
symbolKind === ScriptElementKind.jsxAttribute ||
|
||||
symbolFlags & SymbolFlags.Variable ||
|
||||
symbolKind === ScriptElementKind.localVariableElement ||
|
||||
symbolKind === ScriptElementKind.indexSignatureElement ||
|
||||
isThisExpression) {
|
||||
displayParts.push(punctuationPart(SyntaxKind.ColonToken));
|
||||
displayParts.push(spacePart());
|
||||
// If the type is type parameter, format it specially
|
||||
if (type.symbol && type.symbol.flags & SymbolFlags.TypeParameter) {
|
||||
if (type.symbol && type.symbol.flags & SymbolFlags.TypeParameter && symbolKind !== ScriptElementKind.indexSignatureElement) {
|
||||
const typeParameterParts = mapToDisplayParts(writer => {
|
||||
const param = typeChecker.typeParameterToDeclaration(type as TypeParameter, enclosingDeclaration, symbolDisplayNodeBuilderFlags)!;
|
||||
getPrinter().writeNode(EmitHint.Unspecified, param, getSourceFileOfNode(getParseTreeNode(enclosingDeclaration)), writer);
|
||||
@@ -639,13 +640,38 @@ namespace ts.SymbolDisplay {
|
||||
}
|
||||
|
||||
function addFullSymbolName(symbolToDisplay: Symbol, enclosingDeclaration?: Node) {
|
||||
let indexInfos;
|
||||
|
||||
if (alias && symbolToDisplay === symbol) {
|
||||
symbolToDisplay = alias;
|
||||
}
|
||||
const fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbolToDisplay, enclosingDeclaration || sourceFile, /*meaning*/ undefined,
|
||||
SymbolFormatFlags.WriteTypeParametersOrArguments | SymbolFormatFlags.UseOnlyExternalAliasing | SymbolFormatFlags.AllowAnyNodeKind);
|
||||
addRange(displayParts, fullSymbolDisplayParts);
|
||||
if (symbolKind === ScriptElementKind.indexSignatureElement) {
|
||||
indexInfos = typeChecker.getIndexInfosOfIndexSymbol(symbolToDisplay);
|
||||
}
|
||||
|
||||
let fullSymbolDisplayParts: SymbolDisplayPart[] = [];
|
||||
if (symbolToDisplay.flags & SymbolFlags.Signature && indexInfos) {
|
||||
if (symbolToDisplay.parent) {
|
||||
fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbolToDisplay.parent);
|
||||
}
|
||||
fullSymbolDisplayParts.push(punctuationPart(SyntaxKind.OpenBracketToken));
|
||||
//Needed to handle more than one type of index
|
||||
indexInfos.forEach((info, i) => {
|
||||
//Needed to handle template literals
|
||||
fullSymbolDisplayParts.push(...typeToDisplayParts(typeChecker, info.keyType));
|
||||
if (i !== indexInfos.length - 1) {
|
||||
fullSymbolDisplayParts.push(spacePart());
|
||||
fullSymbolDisplayParts.push(punctuationPart(SyntaxKind.BarToken));
|
||||
fullSymbolDisplayParts.push(spacePart());
|
||||
}
|
||||
});
|
||||
fullSymbolDisplayParts.push(punctuationPart(SyntaxKind.CloseBracketToken));
|
||||
}
|
||||
else {
|
||||
fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbolToDisplay, enclosingDeclaration || sourceFile, /*meaning*/ undefined,
|
||||
SymbolFormatFlags.WriteTypeParametersOrArguments | SymbolFormatFlags.UseOnlyExternalAliasing | SymbolFormatFlags.AllowAnyNodeKind);
|
||||
}
|
||||
addRange(displayParts, fullSymbolDisplayParts);
|
||||
if (symbol.flags & SymbolFlags.Optional) {
|
||||
displayParts.push(punctuationPart(SyntaxKind.QuestionToken));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user