Skip to content

Commit

Permalink
feat: support named tuples
Browse files Browse the repository at this point in the history
  • Loading branch information
mxsdev committed Oct 13, 2022
1 parent 79b7634 commit f87a0ab
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 6 deletions.
3 changes: 2 additions & 1 deletion packages/api/src/tree.ts
Expand Up @@ -69,6 +69,7 @@ function _generateTypeTree({ symbol, type }: SymbolOrType, ctx: TypeTreeContext,
const typeInfoId = typeInfo as TypeInfo

typeInfoId.symbolMeta = wrapSafe(getSymbolInfo)(symbol, isAnonymousSymbol, options)
// TODO: only do this if alias symbol is different than normal symbol
typeInfoId.aliasSymbolMeta = wrapSafe(getSymbolInfo)(type.aliasSymbol)

typeInfoId.id = getTypeId(type)
Expand Down Expand Up @@ -139,7 +140,7 @@ function _generateTypeTree({ symbol, type }: SymbolOrType, ctx: TypeTreeContext,
return {
kind: 'tuple',
types: parseTypes(getTypeArguments(typeChecker, type)),
// names: (type as ts.TupleType).labeledElementDeclarations?.map(s => s.name.getText()),
names: (type.target as ts.TupleType).labeledElementDeclarations?.map(s => s.name.getText()),
}
} else {
return {
Expand Down
2 changes: 1 addition & 1 deletion packages/api/src/types.ts
Expand Up @@ -66,7 +66,7 @@ export type TypeInfoNoId =
}
|{ kind: 'function', signatures: SignatureInfo[] }
|{ kind: 'array', type: TypeInfo }
|{ kind: 'tuple', types: TypeInfo[] }
|{ kind: 'tuple', types: TypeInfo[], names?: string[] }
|{
kind: 'union',
types: TypeInfo[],
Expand Down
12 changes: 8 additions & 4 deletions packages/typescript-explorer/src/view/typeTreeView.ts
Expand Up @@ -166,8 +166,8 @@ class TypeNode extends TypeTreeItem {
}

case "tuple": {
const { types } = this.typeTree
return types.map(toTreeNode)
const { types, names } = this.typeTree
return types.map((t, i) => toTreeNodeArgs(t, { name: names?.[i] }))
}

case "conditional": {
Expand Down Expand Up @@ -295,6 +295,7 @@ class IndexNode extends TypeTreeItem {
type TypeNodeArgs = {
purpose?: 'return'|'index_type'|'index_value_type'|'conditional_check'|'conditional_extends'|'conditional_true'|'conditional_false'|'keyof'|'indexed_access_index'|'indexed_access_base'|'parameter_default'|'parameter_base_constraint',
optional?: boolean,
name?: string,
}

class TypeNodeGroup extends TypeTreeItem {
Expand All @@ -312,8 +313,7 @@ class TypeNodeGroup extends TypeTreeItem {
}
}

// TODO: include type aliases; e.g.: <label> Alias (kind)
function generateTypeNodeMeta(info: ResolvedTypeInfo, dimension: number, {purpose, optional}: TypeNodeArgs = {}) {
function generateTypeNodeMeta(info: ResolvedTypeInfo, dimension: number, {purpose, optional, name: forceName}: TypeNodeArgs = {}) {
const isOptional = info.symbolMeta?.optional || optional || ((info.symbolMeta?.flags ?? 0) & ts.SymbolFlags.Optional)
const isRest = info.symbolMeta?.rest

Expand All @@ -326,6 +326,10 @@ function generateTypeNodeMeta(info: ResolvedTypeInfo, dimension: number, {purpos
}

function getLabel() {
if(forceName !== undefined) {
return forceName
}

const nameByPurpose: Partial<Record<NonNullable<TypeNodeArgs['purpose']>, string>> = {
return: "return",
index_type: "constraint",
Expand Down
4 changes: 4 additions & 0 deletions tests/baselines/reference/tupleNamed.merged.types
@@ -0,0 +1,4 @@
=== tupleNamed.ts ===

type namedTuple = [param: "a", param2: string, param3: number]
> namedTuple --- [param: "a", param2: string, param3: number]
4 changes: 4 additions & 0 deletions tests/baselines/reference/tupleNamed.tree
@@ -0,0 +1,4 @@
=== tupleNamed.ts ===

type namedTuple = [param: "a", param2: string, param3: number]
> namedTuple --- {"kind":"tuple","types":[{"kind":"string_literal","value":"a","id":93},{"kind":"primitive","primitive":"string","id":15},{"kind":"primitive","primitive":"number","id":16}],"names":["param","param2","param3"],"symbolMeta":{"name":"namedTuple","flags":524288},"aliasSymbolMeta":{"name":"namedTuple","flags":524288},"id":92}
1 change: 1 addition & 0 deletions tests/cases/tupleNamed.ts
@@ -0,0 +1 @@
type namedTuple = [param: "a", param2: string, param3: number]

0 comments on commit f87a0ab

Please sign in to comment.