Skip to content

Commit

Permalink
feat: support alias names
Browse files Browse the repository at this point in the history
  • Loading branch information
mxsdev committed Oct 13, 2022
1 parent 23737cb commit 1174b6d
Show file tree
Hide file tree
Showing 17 changed files with 84 additions and 54 deletions.
2 changes: 2 additions & 0 deletions packages/api/src/tree.ts
Expand Up @@ -69,6 +69,8 @@ function _generateTypeTree({ symbol, type }: SymbolOrType, ctx: TypeTreeContext,
const typeInfoId = typeInfo as TypeInfo

typeInfoId.symbolMeta = wrapSafe(getSymbolInfo)(symbol, isAnonymousSymbol, options)
typeInfoId.aliasSymbolMeta = wrapSafe(getSymbolInfo)(type.aliasSymbol)

typeInfoId.id = getTypeId(type)

ctx.depth--
Expand Down
2 changes: 2 additions & 0 deletions packages/api/src/types.ts
@@ -1,6 +1,7 @@
import ts from "typescript"

// TODO: support class instances with generics, like Map<string, number>
// TODO: support classes in general as separate tree types

export type SymbolInfo = {
name: string,
Expand Down Expand Up @@ -40,6 +41,7 @@ export type TypeInfo = TypeInfoNoId & { id: TypeId }
export type TypeInfoNoId =
({
symbolMeta?: SymbolInfo,
aliasSymbolMeta?: SymbolInfo,
} & (
|{
kind: 'primitive',
Expand Down
2 changes: 1 addition & 1 deletion packages/typescript-explorer/src/localization.ts
Expand Up @@ -21,7 +21,7 @@ type Kind = Exclude<TypeInfo['kind'], 'reference'>
export const KindText: Record<Kind, string> = {
"bigint_literal": "$1n",
"boolean_literal": "$1",
"enum_literal": "$1",
"enum_literal": "enum",
"number_literal": "$1",
"conditional": "conditional",
"index": "keyof",
Expand Down
74 changes: 50 additions & 24 deletions packages/typescript-explorer/src/view/typeTreeView.ts
Expand Up @@ -309,20 +309,11 @@ function generateTypeNodeMeta(info: ResolvedTypeInfo, dimension: number, {purpos
const isOptional = info.symbolMeta?.optional || optional || ((info.symbolMeta?.flags ?? 0) & ts.SymbolFlags.Optional)
const isRest = info.symbolMeta?.rest

let description = getBaseDescription()
description += "[]".repeat(dimension)

if(isOptional) {
description += '?'
}

if(isRest) {
description = "..." + description
}
const label = getLabel()
const description = getDescription(label)

return {
label: getLabel(),
description,
label, description,
isCollapsible: kindHasChildren(info.kind)
}

Expand All @@ -347,15 +338,58 @@ function generateTypeNodeMeta(info: ResolvedTypeInfo, dimension: number, {purpos
return !info.symbolMeta?.anonymous ? (info.symbolMeta?.name ?? "") : ""
}

function getBaseDescription() {
function getDescription(label: string) {
const baseDescription = getDescriptionFromBase(getBaseDescription())

const aliasDescriptionBase = getAliasDescription()
const aliasDescription = (aliasDescriptionBase && aliasDescriptionBase !== label) && getDescriptionFromBase(aliasDescriptionBase, false)

return aliasDescription ? `${aliasDescription} (${baseDescription})` : baseDescription

function getDescriptionFromBase(base: string, includeRest = true) {
base += "[]".repeat(dimension)

if(isOptional) {
base += '?'
}

if(isRest && includeRest) {
base = "..." + base
}

return base
}
}

function getAliasDescription(): string|undefined {
switch(info.kind) {
case "type_parameter": {
const name = info.symbolMeta?.name
const kindText = getKindText('type_parameter')
return info.symbolMeta?.name
}

case "bigint_literal":
case "number_literal":
case "string_literal":
case "boolean_literal": {
return undefined
}

return name ? `${name} (${kindText})` : kindText
case "enum_literal": {
let text = info.symbol.name
if(info.parentSymbol) {
text = `${info.parentSymbol.name}.${text}`
}
return text
}

default: {
return info.aliasSymbolMeta?.name
}
}
}

function getBaseDescription(): string {
switch(info.kind) {
case "string_mapping": {
const { symbol } = info
return symbol.name
Expand All @@ -373,14 +407,6 @@ function generateTypeNodeMeta(info: ResolvedTypeInfo, dimension: number, {purpos
return getKindText(info.kind, info.value.toString())
}

case "enum_literal": {
let text = info.symbol.name
if(info.parentSymbol) {
text = `${info.parentSymbol.name}.${text}`
}
return text
}

case "string_literal": {
return getKindText(info.kind, info.value)
}
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/array.tree
@@ -1,4 +1,4 @@
=== array.ts ===

type arrayOfStrings = string[]
> arrayOfStrings --- {"kind":"array","type":{"kind":"primitive","primitive":"string","id":15},"symbolMeta":{"name":"arrayOfStrings","flags":524288},"id":86}
> arrayOfStrings --- {"kind":"array","type":{"kind":"primitive","primitive":"string","id":15},"symbolMeta":{"name":"arrayOfStrings","flags":524288},"aliasSymbolMeta":{"name":"arrayOfStrings","flags":524288},"id":86}
6 changes: 3 additions & 3 deletions tests/baselines/reference/arrayObjectAlias.tree
@@ -1,7 +1,7 @@
=== arrayObjectAlias.ts ===

type Obj = { a: string, b: number }
> Obj --- {"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":4},"id":16}],"indexInfos":[],"symbolMeta":{"name":"Obj","flags":524288},"id":86}
> Obj --- {"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":4},"id":16}],"indexInfos":[],"symbolMeta":{"name":"Obj","flags":524288},"aliasSymbolMeta":{"name":"Obj","flags":524288},"id":86}
> { a: string, b: number }
> a: string, b: number
> a: string,
Expand All @@ -10,7 +10,7 @@ type Obj = { a: string, b: number }
> b --- {"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":4},"id":16}

type arrObj = Obj[]
> arrObj --- {"kind":"array","type":{"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":4},"id":16}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"id":86},"symbolMeta":{"name":"arrObj","flags":524288},"id":87}
> arrObj --- {"kind":"array","type":{"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":4},"id":16}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"aliasSymbolMeta":{"name":"Obj","flags":524288},"id":86},"symbolMeta":{"name":"arrObj","flags":524288},"aliasSymbolMeta":{"name":"arrObj","flags":524288},"id":87}
> Obj[]
> Obj
> Obj --- {"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":4},"id":16}],"indexInfos":[],"symbolMeta":{"name":"Obj","flags":524288},"id":86}
> Obj --- {"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":4},"id":16}],"indexInfos":[],"symbolMeta":{"name":"Obj","flags":524288},"aliasSymbolMeta":{"name":"Obj","flags":524288},"id":86}
2 changes: 1 addition & 1 deletion tests/baselines/reference/conditional.tree
@@ -1,7 +1,7 @@
=== conditional.ts ===

type Conditional<T> = T extends string ? "a" : "b"
> Conditional --- {"kind":"conditional","checkType":{"kind":"type_parameter","symbolMeta":{"name":"T","flags":262144},"id":86},"extendsType":{"kind":"primitive","primitive":"string","id":15},"trueType":{"kind":"string_literal","value":"a","id":88},"falseType":{"kind":"string_literal","value":"b","id":90},"symbolMeta":{"name":"Conditional","flags":524288},"id":87}
> Conditional --- {"kind":"conditional","checkType":{"kind":"type_parameter","symbolMeta":{"name":"T","flags":262144},"id":86},"extendsType":{"kind":"primitive","primitive":"string","id":15},"trueType":{"kind":"string_literal","value":"a","id":88},"falseType":{"kind":"string_literal","value":"b","id":90},"symbolMeta":{"name":"Conditional","flags":524288},"aliasSymbolMeta":{"name":"Conditional","flags":524288},"id":87}
> T
> T
> T --- {"kind":"type_parameter","symbolMeta":{"name":"T","flags":262144},"id":86}
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/consoleLog.tree

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion tests/baselines/reference/indexedAccess.tree
@@ -1,7 +1,7 @@
=== indexedAccess.ts ===

type IndexedAccess<P, T extends keyof P> = P[T]
> IndexedAccess --- {"kind":"indexed_access","indexType":{"kind":"type_parameter","symbolMeta":{"name":"T","flags":262144},"id":87},"objectType":{"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":86},"symbolMeta":{"name":"IndexedAccess","flags":524288},"id":88}
> IndexedAccess --- {"kind":"indexed_access","indexType":{"kind":"type_parameter","symbolMeta":{"name":"T","flags":262144},"id":87},"objectType":{"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":86},"symbolMeta":{"name":"IndexedAccess","flags":524288},"aliasSymbolMeta":{"name":"IndexedAccess","flags":524288},"id":88}
> P, T extends keyof P
> P
> P --- {"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":86}
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/lambda.tree
@@ -1,7 +1,7 @@
=== lambda.ts ===

type f = (arg1: string, arg2: boolean) => void
> f --- {"kind":"function","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1","flags":1},"id":15},{"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2","flags":1},"id":22}],"returnType":{"kind":"primitive","primitive":"void","id":24}}],"symbolMeta":{"name":"f","flags":524288},"id":86}
> f --- {"kind":"function","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1","flags":1},"id":15},{"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2","flags":1},"id":22}],"returnType":{"kind":"primitive","primitive":"void","id":24}}],"symbolMeta":{"name":"f","flags":524288},"aliasSymbolMeta":{"name":"f","flags":524288},"id":86}
> (arg1: string, arg2: boolean) => void
> arg1: string, arg2: boolean
> arg1: string
Expand All @@ -11,12 +11,12 @@ type f = (arg1: string, arg2: boolean) => void
> => --- {"kind":"primitive","primitive":"any","symbolMeta":{"name":"__type","flags":2048},"id":4}

type t = { a: string } | f
> t --- {"kind":"union","types":[{"kind":"function","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1","flags":1},"id":15},{"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2","flags":1},"id":22}],"returnType":{"kind":"primitive","primitive":"void","id":24}}],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"id":86},{"kind":"object","properties":[{"kind":"reference","symbolMeta":{"name":"a","flags":4},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"id":87}],"symbolMeta":{"name":"t","flags":524288},"id":88}
> t --- {"kind":"union","types":[{"kind":"function","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1","flags":1},"id":15},{"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2","flags":1},"id":22}],"returnType":{"kind":"primitive","primitive":"void","id":24}}],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"aliasSymbolMeta":{"name":"f","flags":524288},"id":86},{"kind":"object","properties":[{"kind":"reference","symbolMeta":{"name":"a","flags":4},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"id":87}],"symbolMeta":{"name":"t","flags":524288},"aliasSymbolMeta":{"name":"t","flags":524288},"id":88}
> { a: string } | f
> { a: string } | f
> { a: string }
> a: string
> a: string
> a --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15}
> f
> f --- {"kind":"function","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1","flags":1},"id":15},{"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2","flags":1},"id":22}],"returnType":{"kind":"primitive","primitive":"void","id":24}}],"symbolMeta":{"name":"f","flags":524288},"id":86}
> f --- {"kind":"function","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1","flags":1},"id":15},{"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2","flags":1},"id":22}],"returnType":{"kind":"primitive","primitive":"void","id":24}}],"symbolMeta":{"name":"f","flags":524288},"aliasSymbolMeta":{"name":"f","flags":524288},"id":86}
2 changes: 1 addition & 1 deletion tests/baselines/reference/mapped.tree
@@ -1,7 +1,7 @@
=== mapped.ts ===

type mapped = { [index: string]: number }
> mapped --- {"kind":"object","properties":[],"indexInfos":[{"keyType":{"kind":"primitive","primitive":"string","id":15},"type":{"kind":"primitive","primitive":"number","id":16},"parameterSymbol":{"name":"index","flags":1}}],"symbolMeta":{"name":"mapped","flags":524288},"id":86}
> mapped --- {"kind":"object","properties":[],"indexInfos":[{"keyType":{"kind":"primitive","primitive":"string","id":15},"type":{"kind":"primitive","primitive":"number","id":16},"parameterSymbol":{"name":"index","flags":1}}],"symbolMeta":{"name":"mapped","flags":524288},"aliasSymbolMeta":{"name":"mapped","flags":524288},"id":86}
> { [index: string]: number }
> [index: string]: number
> [index: string]: number
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/mappedParam.tree
@@ -1,7 +1,7 @@
=== mappedParam.ts ===

type mappedType2 = { [P in 'a'|'b'|'c']: P}
> mappedType2 --- {"kind":"object","properties":[{"kind":"string_literal","value":"a","symbolMeta":{"name":"a","flags":33554436},"id":88},{"kind":"string_literal","value":"b","symbolMeta":{"name":"b","flags":33554436},"id":90},{"kind":"string_literal","value":"c","symbolMeta":{"name":"c","flags":33554436},"id":92}],"indexInfos":[{"keyType":{"kind":"union","types":[{"kind":"reference","id":88},{"kind":"reference","id":90},{"kind":"reference","id":92}],"id":94},"type":{"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":87},"parameterSymbol":{"name":"P","flags":262144}}],"symbolMeta":{"name":"mappedType2","flags":524288},"id":86}
> mappedType2 --- {"kind":"object","properties":[{"kind":"string_literal","value":"a","symbolMeta":{"name":"a","flags":33554436},"id":88},{"kind":"string_literal","value":"b","symbolMeta":{"name":"b","flags":33554436},"id":90},{"kind":"string_literal","value":"c","symbolMeta":{"name":"c","flags":33554436},"id":92}],"indexInfos":[{"keyType":{"kind":"union","types":[{"kind":"reference","id":88},{"kind":"reference","id":90},{"kind":"reference","id":92}],"id":94},"type":{"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":87},"parameterSymbol":{"name":"P","flags":262144}}],"symbolMeta":{"name":"mappedType2","flags":524288},"aliasSymbolMeta":{"name":"mappedType2","flags":524288},"id":86}
> { [P in 'a'|'b'|'c']: P}
> P in 'a'|'b'|'c'
> P --- {"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":87}
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/partial.tree
@@ -1,9 +1,9 @@
=== partial.ts ===

type partialUnion = Partial<{a: string}|{b: string}>
> partialUnion --- {"kind":"union","types":[{"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":50331652},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"id":93},{"kind":"object","properties":[{"kind":"reference","symbolMeta":{"name":"b","flags":50331652},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"id":95}],"symbolMeta":{"name":"partialUnion","flags":524288},"id":97}
> partialUnion --- {"kind":"union","types":[{"kind":"object","properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":50331652},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"aliasSymbolMeta":{"name":"Partial","flags":524288},"id":93},{"kind":"object","properties":[{"kind":"reference","symbolMeta":{"name":"b","flags":50331652},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048,"anonymous":true},"aliasSymbolMeta":{"name":"Partial","flags":524288},"id":95}],"symbolMeta":{"name":"partialUnion","flags":524288},"aliasSymbolMeta":{"name":"partialUnion","flags":524288},"id":97}
> Partial<{a: string}|{b: string}>
> Partial --- {"kind":"object","properties":[],"indexInfos":[{"keyType":{"kind":"index","keyOf":{"kind":"type_parameter","symbolMeta":{"name":"T","flags":262144},"id":87},"id":89},"type":{"kind":"indexed_access","indexType":{"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":88},"objectType":{"kind":"reference","symbolMeta":{"name":"T","flags":262144},"id":87},"id":99},"parameterSymbol":{"name":"P","flags":262144}}],"symbolMeta":{"name":"Partial","flags":524288},"id":86}
> Partial --- {"kind":"object","properties":[],"indexInfos":[{"keyType":{"kind":"index","keyOf":{"kind":"type_parameter","symbolMeta":{"name":"T","flags":262144},"id":87},"id":89},"type":{"kind":"indexed_access","indexType":{"kind":"type_parameter","symbolMeta":{"name":"P","flags":262144},"id":88},"objectType":{"kind":"reference","symbolMeta":{"name":"T","flags":262144},"id":87},"id":99},"parameterSymbol":{"name":"P","flags":262144}}],"symbolMeta":{"name":"Partial","flags":524288},"aliasSymbolMeta":{"name":"Partial","flags":524288},"id":86}
> {a: string}|{b: string}
> {a: string}|{b: string}
> {a: string}|{b: string}
Expand Down

0 comments on commit 1174b6d

Please sign in to comment.