Skip to content

Commit

Permalink
feat(api): support optional parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
mxsdev committed Oct 8, 2022
1 parent 9d18f22 commit 7dfbeb8
Show file tree
Hide file tree
Showing 11 changed files with 81 additions and 38 deletions.
10 changes: 8 additions & 2 deletions packages/api/src/merge.ts
Expand Up @@ -68,7 +68,7 @@ function _recursivelyExpandType(typeChecker: ts.TypeChecker, types: ts.Type[], s
return createObjectType(typeChecker, ts.ObjectFlags.Anonymous)
}

// TODO: move to type.getProperties()
// TODO: move to using type.getProperties() on the intersection type
function recursiveMergeObjectIntersection(types: ts.ObjectType[], newType?: ObjectType) {
newType ||= createAnonymousObjectType()
const nameToSymbols = new Map<SymbolName, TSSymbol[]>()
Expand All @@ -93,7 +93,13 @@ function _recursivelyExpandType(typeChecker: ts.TypeChecker, types: ts.Type[], s
}

function mergeIntersectedPropertySymbols(symbols: TSSymbol[], name: SymbolName): TSSymbol {
const propertySymbol = createSymbol(ts.SymbolFlags.Property, name, 1 << 18)
let symbolFlags = ts.SymbolFlags.Property

if(symbols.every(s => s.flags & ts.SymbolFlags.Optional)) {
symbolFlags |= ts.SymbolFlags.Optional
}

const propertySymbol = createSymbol(symbolFlags, name, 1 << 18)

const types = symbols.map(s => getSymbolType(typeChecker, s))

Expand Down
1 change: 1 addition & 0 deletions packages/api/src/tree.ts
Expand Up @@ -158,6 +158,7 @@ function getIndexInfo(indexInfo: ts.IndexInfo, ctx: TypeTreeContext): IndexInfo
function getSymbolInfo(symbol: ts.Symbol): SymbolInfo {
return {
name: symbol.getName(),
flags: symbol.getFlags()
}
}

Expand Down
3 changes: 2 additions & 1 deletion packages/api/src/types.ts
@@ -1,7 +1,8 @@
import ts from "typescript"

export type SymbolInfo = {
name?: string,
name: string,
flags: number
}

export type IndexInfo = {
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/function.tree
Expand Up @@ -3,10 +3,10 @@
function func(a: string, b: number) {
return "asd"
}
> function --- {"kind":"object","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a"},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b"},"id":16}],"returnType":{"kind":"reference","id":15}}],"properties":[],"indexInfos":[],"symbolMeta":{"name":"func"},"id":86}
> func --- {"kind":"object","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a"},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b"},"id":16}],"returnType":{"kind":"reference","id":15}}],"properties":[],"indexInfos":[],"symbolMeta":{"name":"func"},"id":86}
> function --- {"kind":"object","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":1},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":1},"id":16}],"returnType":{"kind":"reference","id":15}}],"properties":[],"indexInfos":[],"symbolMeta":{"name":"func","flags":16},"id":86}
> func --- {"kind":"object","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":1},"id":15},{"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":1},"id":16}],"returnType":{"kind":"reference","id":15}}],"properties":[],"indexInfos":[],"symbolMeta":{"name":"func","flags":16},"id":86}
> a: string, b: number
> a: string
> a --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"a"},"id":15}
> a --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":1},"id":15}
> b: number
> b --- {"kind":"primitive","primitive":"number","symbolMeta":{"name":"b"},"id":16}
> b --- {"kind":"primitive","primitive":"number","symbolMeta":{"name":"b","flags":1},"id":16}
14 changes: 7 additions & 7 deletions tests/baselines/reference/lambda.tree
@@ -1,22 +1,22 @@
=== lambda.ts ===

type f = (arg1: string, arg2: boolean) => void
> f --- {"kind":"object","signatures":[{"parameters":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1"},"id":15},{"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2"},"id":22}],"returnType":{"kind":"primitive","primitive":"void","id":24}}],"properties":[],"indexInfos":[],"symbolMeta":{"name":"f"},"id":86}
> f --- {"kind":"object","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}}],"properties":[],"indexInfos":[],"symbolMeta":{"name":"f","flags":524288},"id":86}
> (arg1: string, arg2: boolean) => void
> arg1: string, arg2: boolean
> arg1: string
> arg1 --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1"},"id":15}
> arg1 --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"arg1","flags":1},"id":15}
> arg2: boolean
> arg2 --- {"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2"},"id":22}
> => --- {"kind":"primitive","primitive":"any","symbolMeta":{"name":"__type"},"id":4}
> arg2 --- {"kind":"primitive","primitive":"boolean","symbolMeta":{"name":"arg2","flags":1},"id":22}
> => --- {"kind":"primitive","primitive":"any","symbolMeta":{"name":"__type","flags":2048},"id":4}

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

type mapped = { [index: string]: number }
> mapped --- {"kind":"object","signatures":[],"properties":[],"indexInfos":[{"keyType":{"kind":"primitive","primitive":"string","id":15},"type":{"kind":"primitive","primitive":"number","id":16}}],"symbolMeta":{"name":"mapped"},"id":86}
> mapped --- {"kind":"object","signatures":[],"properties":[],"indexInfos":[{"keyType":{"kind":"primitive","primitive":"string","id":15},"type":{"kind":"primitive","primitive":"number","id":16}}],"symbolMeta":{"name":"mapped","flags":524288},"id":86}
> { [index: string]: number }
> [index: string]: number
> [index: string]: number
> index: string
> index: string
> index --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"index"},"id":15}
> index --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"index","flags":1},"id":15}
17 changes: 17 additions & 0 deletions tests/baselines/reference/partial.merged.types
@@ -0,0 +1,17 @@
=== partial.ts ===

type partialUnion = Partial<{a: string}|{b: string}>
> partialUnion --- { a?: string; } | { b?: string; }
> Partial<{a: string}|{b: string}>
> Partial --- {}
> {a: string}|{b: string}
> {a: string}|{b: string}
> {a: string}|{b: string}
> {a: string}
> a: string
> a: string
> a --- string
> {b: string}
> b: string
> b: string
> b --- string
17 changes: 17 additions & 0 deletions tests/baselines/reference/partial.tree
@@ -0,0 +1,17 @@
=== partial.ts ===

type partialUnion = Partial<{a: string}|{b: string}>
> partialUnion --- {"kind":"union","types":[{"kind":"object","signatures":[],"properties":[{"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":50331652},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048},"id":93},{"kind":"object","signatures":[],"properties":[{"kind":"reference","symbolMeta":{"name":"b","flags":50331652},"id":15}],"indexInfos":[],"symbolMeta":{"name":"__type","flags":2048},"id":95}],"symbolMeta":{"name":"partialUnion","flags":524288},"id":97}
> Partial<{a: string}|{b: string}>
> Partial --- {"kind":"object","signatures":[],"properties":[],"indexInfos":[],"symbolMeta":{"name":"Partial","flags":524288},"id":86}
> {a: string}|{b: string}
> {a: string}|{b: string}
> {a: string}|{b: string}
> {a: string}
> a: string
> a: string
> a --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"a","flags":4},"id":15}
> {b: string}
> b: string
> b: string
> b --- {"kind":"primitive","primitive":"string","symbolMeta":{"name":"b","flags":4},"id":15}
36 changes: 18 additions & 18 deletions tests/baselines/reference/pick.tree
@@ -1,58 +1,58 @@
=== pick.ts ===

type t = { a: "b", c: "d", d: { a: "b" } }
> t --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"d","symbolMeta":{"name":"c"},"id":89},{"kind":"object","signatures":[],"properties":[{"kind":"reference","symbolMeta":{"name":"a"},"id":87}],"indexInfos":[],"symbolMeta":{"name":"d"},"id":91}],"indexInfos":[],"symbolMeta":{"name":"t"},"id":86}
> t --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87},{"kind":"string_literal","value":"d","symbolMeta":{"name":"c","flags":4},"id":89},{"kind":"object","signatures":[],"properties":[{"kind":"reference","symbolMeta":{"name":"a","flags":4},"id":87}],"indexInfos":[],"symbolMeta":{"name":"d","flags":4},"id":91}],"indexInfos":[],"symbolMeta":{"name":"t","flags":524288},"id":86}
> { a: "b", c: "d", d: { a: "b" } }
> a: "b", c: "d", d: { a: "b" }
> a: "b",
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87}
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87}
> c: "d",
> c --- {"kind":"string_literal","value":"d","symbolMeta":{"name":"c"},"id":89}
> c --- {"kind":"string_literal","value":"d","symbolMeta":{"name":"c","flags":4},"id":89}
> d: { a: "b" }
> d --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87}],"indexInfos":[],"symbolMeta":{"name":"d"},"id":91}
> d --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87}],"indexInfos":[],"symbolMeta":{"name":"d","flags":4},"id":91}
> { a: "b" }
> a: "b"
> a: "b"
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87}
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87}

type p = Pick<t, "a"|"d"> & {b: "asd", d: { b: "c" }}
> p --- {"kind":"object","properties":[{"kind":"object","properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b"},"id":107}],"symbolMeta":{"name":"d"},"id":106},{"kind":"reference","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"asd","symbolMeta":{"name":"b"},"id":109}],"symbolMeta":{"name":"p"},"id":103}
> p --- {"kind":"object","properties":[{"kind":"object","properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b","flags":4},"id":107}],"symbolMeta":{"name":"d","flags":33554436},"id":106},{"kind":"reference","symbolMeta":{"name":"a","flags":33554436},"id":87},{"kind":"string_literal","value":"asd","symbolMeta":{"name":"b","flags":4},"id":109}],"symbolMeta":{"name":"p","flags":524288},"id":103}
> Pick<t, "a"|"d"> & {b: "asd", d: { b: "c" }}
> Pick<t, "a"|"d"> & {b: "asd", d: { b: "c" }}
> Pick<t, "a"|"d">
> Pick --- {"kind":"object","signatures":[],"properties":[],"indexInfos":[],"symbolMeta":{"name":"Pick"},"id":92}
> Pick --- {"kind":"object","signatures":[],"properties":[],"indexInfos":[],"symbolMeta":{"name":"Pick","flags":524288},"id":92}
> t, "a"|"d"
> t
> t --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"d","symbolMeta":{"name":"c"},"id":89},{"kind":"object","signatures":[],"properties":[{"kind":"reference","symbolMeta":{"name":"a"},"id":87}],"indexInfos":[],"symbolMeta":{"name":"d"},"id":91}],"indexInfos":[],"symbolMeta":{"name":"t"},"id":86}
> t --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87},{"kind":"string_literal","value":"d","symbolMeta":{"name":"c","flags":4},"id":89},{"kind":"object","signatures":[],"properties":[{"kind":"reference","symbolMeta":{"name":"a","flags":4},"id":87}],"indexInfos":[],"symbolMeta":{"name":"d","flags":4},"id":91}],"indexInfos":[],"symbolMeta":{"name":"t","flags":524288},"id":86}
> {b: "asd", d: { b: "c" }}
> b: "asd", d: { b: "c" }
> b: "asd",
> b --- {"kind":"string_literal","value":"asd","symbolMeta":{"name":"b"},"id":109}
> b --- {"kind":"string_literal","value":"asd","symbolMeta":{"name":"b","flags":4},"id":109}
> d: { b: "c" }
> d --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"c","symbolMeta":{"name":"b"},"id":107}],"indexInfos":[],"symbolMeta":{"name":"d"},"id":105}
> d --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"c","symbolMeta":{"name":"b","flags":4},"id":107}],"indexInfos":[],"symbolMeta":{"name":"d","flags":4},"id":105}
> { b: "c" }
> b: "c"
> b: "c"
> b --- {"kind":"string_literal","value":"c","symbolMeta":{"name":"b"},"id":107}
> b --- {"kind":"string_literal","value":"c","symbolMeta":{"name":"b","flags":4},"id":107}

const test3: p = {a: "b", b: "asd", d: { a: "b", b: "c" }}
> const test3: p = {a: "b", b: "asd", d: { a: "b", b: "c" }}
> test3: p = {a: "b", b: "asd", d: { a: "b", b: "c" }}
> test3: p = {a: "b", b: "asd", d: { a: "b", b: "c" }}
> test3 --- {"kind":"object","properties":[{"kind":"object","properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b"},"id":107}],"symbolMeta":{"name":"d"},"id":106},{"kind":"reference","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"asd","symbolMeta":{"name":"b"},"id":109}],"symbolMeta":{"name":"test3"},"id":103}
> test3 --- {"kind":"object","properties":[{"kind":"object","properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b","flags":4},"id":107}],"symbolMeta":{"name":"d","flags":33554436},"id":106},{"kind":"reference","symbolMeta":{"name":"a","flags":33554436},"id":87},{"kind":"string_literal","value":"asd","symbolMeta":{"name":"b","flags":4},"id":109}],"symbolMeta":{"name":"test3","flags":2},"id":103}
> p
> p --- {"kind":"object","properties":[{"kind":"object","properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b"},"id":107}],"symbolMeta":{"name":"d"},"id":106},{"kind":"reference","symbolMeta":{"name":"a"},"id":87},{"kind":"string_literal","value":"asd","symbolMeta":{"name":"b"},"id":109}],"symbolMeta":{"name":"p"},"id":103}
> p --- {"kind":"object","properties":[{"kind":"object","properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":87},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b","flags":4},"id":107}],"symbolMeta":{"name":"d","flags":33554436},"id":106},{"kind":"reference","symbolMeta":{"name":"a","flags":33554436},"id":87},{"kind":"string_literal","value":"asd","symbolMeta":{"name":"b","flags":4},"id":109}],"symbolMeta":{"name":"p","flags":524288},"id":103}
> {a: "b", b: "asd", d: { a: "b", b: "c" }}
> a: "b", b: "asd", d: { a: "b", b: "c" }
> a: "b"
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":88}
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":88}
> b: "asd"
> b --- {"kind":"string_literal","value":"asd","symbolMeta":{"name":"b"},"id":110}
> b --- {"kind":"string_literal","value":"asd","symbolMeta":{"name":"b","flags":4},"id":110}
> d: { a: "b", b: "c" }
> d --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":88},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b"},"id":108}],"indexInfos":[],"symbolMeta":{"name":"d"},"id":111}
> d --- {"kind":"object","signatures":[],"properties":[{"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":33554436},"id":88},{"kind":"string_literal","value":"c","symbolMeta":{"name":"b","flags":33554436},"id":108}],"indexInfos":[],"symbolMeta":{"name":"d","flags":4},"id":111}
> { a: "b", b: "c" }
> a: "b", b: "c"
> a: "b"
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a"},"id":88}
> a --- {"kind":"string_literal","value":"b","symbolMeta":{"name":"a","flags":4},"id":88}
> b: "c"
> b --- {"kind":"string_literal","value":"c","symbolMeta":{"name":"b"},"id":108}
> b --- {"kind":"string_literal","value":"c","symbolMeta":{"name":"b","flags":4},"id":108}

0 comments on commit 7dfbeb8

Please sign in to comment.