Skip to content

Commit 13d40be

Browse files
authored
Total ordering of types (#200)
1 parent 2013d07 commit 13d40be

File tree

7 files changed

+478
-91
lines changed

7 files changed

+478
-91
lines changed

internal/ast/ast.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5654,14 +5654,14 @@ type SourceFile struct {
56545654
IsDeclarationFile bool
56555655
IsBound bool
56565656
ModuleReferencesProcessed bool
5657+
HasNoDefaultLib bool
56575658
UsesUriStyleNodeCoreModules core.Tristate
56585659
SymbolCount int
56595660
ClassifiableNames core.Set[string]
56605661
Imports []*LiteralLikeNode // []LiteralLikeNode
56615662
ModuleAugmentations []*ModuleName // []ModuleName
56625663
PatternAmbientModules []PatternAmbientModule
56635664
AmbientModuleNames []string
5664-
HasNoDefaultLib bool
56655665
jsdocCache map[*Node][]*Node
56665666
Pragmas []Pragma
56675667
ReferencedFiles []*FileReference

internal/ast/utilities.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -821,15 +821,13 @@ func WalkUpParenthesizedTypes(node *TypeNode) *Node {
821821

822822
// Walks up the parents of a node to find the containing SourceFile
823823
func GetSourceFileOfNode(node *Node) *SourceFile {
824-
for {
825-
if node == nil {
826-
return nil
827-
}
828-
if node.Kind == KindSourceFile {
829-
return node.AsSourceFile()
830-
}
824+
for node.Parent != nil {
831825
node = node.Parent
832826
}
827+
if node.Kind == KindSourceFile {
828+
return node.AsSourceFile()
829+
}
830+
return nil
833831
}
834832

835833
// Walks up the parents of a node to find the ancestor that matches the callback

internal/compiler/checker.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,8 @@ type Checker struct {
487487
host CompilerHost
488488
compilerOptions *core.CompilerOptions
489489
files []*ast.SourceFile
490+
fileIndexMap map[*ast.SourceFile]int
491+
compareSymbols func(*ast.Symbol, *ast.Symbol) int
490492
typeCount uint32
491493
symbolCount uint32
492494
totalInstantiationCount uint32
@@ -733,6 +735,8 @@ func NewChecker(program *Program) *Checker {
733735
c.host = program.host
734736
c.compilerOptions = program.compilerOptions
735737
c.files = program.files
738+
c.fileIndexMap = createFileIndexMap(c.files)
739+
c.compareSymbols = c.compareSymbolsWorker // Closure optimization
736740
c.languageVersion = c.compilerOptions.GetEmitScriptTarget()
737741
c.moduleKind = c.compilerOptions.GetEmitModuleKind()
738742
c.legacyDecorators = c.compilerOptions.ExperimentalDecorators == core.TSTrue
@@ -863,7 +867,7 @@ func NewChecker(program *Program) *Checker {
863867
c.emptyStringType = c.getStringLiteralType("")
864868
c.zeroType = c.getNumberLiteralType(0)
865869
c.zeroBigIntType = c.getBigIntLiteralType(PseudoBigInt{negative: false, base10Value: "0"})
866-
c.typeofType = c.getUnionType(core.Map(slices.Collect(maps.Keys(typeofNEFacts)), c.getStringLiteralType))
870+
c.typeofType = c.getUnionType(core.Map(slices.Sorted(maps.Keys(typeofNEFacts)), c.getStringLiteralType))
867871
c.flowLoopCache = make(map[FlowLoopKey]*Type)
868872
c.flowNodeReachable = make(map[*ast.FlowNode]bool)
869873
c.flowNodePostSuper = make(map[*ast.FlowNode]bool)
@@ -904,6 +908,14 @@ func NewChecker(program *Program) *Checker {
904908
return c
905909
}
906910

911+
func createFileIndexMap(files []*ast.SourceFile) map[*ast.SourceFile]int {
912+
result := make(map[*ast.SourceFile]int, len(files))
913+
for i, file := range files {
914+
result[file] = i
915+
}
916+
return result
917+
}
918+
907919
func (c *Checker) reportUnreliableWorker(t *Type) *Type {
908920
if c.outofbandVarianceMarkerHandler != nil && (t == c.markerSuperType || t == c.markerSubType || t == c.markerOtherType) {
909921
c.outofbandVarianceMarkerHandler(true /*onlyUnreliable*/)
@@ -15110,7 +15122,7 @@ func (c *Checker) getNamedMembers(members ast.SymbolTable) []*ast.Symbol {
1511015122
result = append(result, symbol)
1511115123
}
1511215124
}
15113-
sortSymbols(result)
15125+
c.sortSymbols(result)
1511415126
return result
1511515127
}
1511615128

@@ -17862,6 +17874,7 @@ func (c *Checker) newType(flags TypeFlags, objectFlags ObjectFlags, data TypeDat
1786217874
t.flags = flags
1786317875
t.objectFlags = objectFlags &^ (ObjectFlagsCouldContainTypeVariablesComputed | ObjectFlagsCouldContainTypeVariables | ObjectFlagsMembersResolved)
1786417876
t.id = TypeId(c.typeCount)
17877+
t.checker = c
1786517878
t.data = data
1786617879
return t
1786717880
}
@@ -18602,14 +18615,7 @@ func (c *Checker) addTypeToUnion(typeSet []*Type, includes TypeFlags, t *Type) (
1860218615
includes |= TypeFlagsIncludesNonWideningType
1860318616
}
1860418617
} else {
18605-
var index int
18606-
var ok bool
18607-
if len(typeSet) != 0 && t.id > typeSet[len(typeSet)-1].id {
18608-
index = len(typeSet)
18609-
} else {
18610-
index, ok = slices.BinarySearchFunc(typeSet, t, compareTypeIds)
18611-
}
18612-
if !ok {
18618+
if index, ok := slices.BinarySearchFunc(typeSet, t, compareTypes); !ok {
1861318619
typeSet = slices.Insert(typeSet, index, t)
1861418620
}
1861518621
}
@@ -19351,12 +19357,12 @@ func (c *Checker) removeType(t *Type, targetType *Type) *Type {
1935119357
}
1935219358

1935319359
func containsType(types []*Type, t *Type) bool {
19354-
_, ok := slices.BinarySearchFunc(types, t, compareTypeIds)
19360+
_, ok := slices.BinarySearchFunc(types, t, compareTypes)
1935519361
return ok
1935619362
}
1935719363

1935819364
func insertType(types []*Type, t *Type) ([]*Type, bool) {
19359-
if i, ok := slices.BinarySearchFunc(types, t, compareTypeIds); !ok {
19365+
if i, ok := slices.BinarySearchFunc(types, t, compareTypes); !ok {
1936019366
return slices.Insert(types, i, t), true
1936119367
}
1936219368
return types, false

internal/compiler/mapper.go

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,31 @@ package compiler
22

33
import "github.com/microsoft/typescript-go/internal/core"
44

5+
// TypeMapperKind
6+
7+
type TypeMapperKind int32
8+
9+
const (
10+
TypeMapperKindUnknown TypeMapperKind = iota
11+
TypeMapperKindSimple
12+
TypeMapperKindArray
13+
TypeMapperKindMerged
14+
)
15+
516
// TypeMapper
617

718
type TypeMapper struct {
819
data TypeMapperData
920
}
1021

11-
func (m *TypeMapper) Map(t *Type) *Type { return m.data.Map(t) }
22+
func (m *TypeMapper) Map(t *Type) *Type { return m.data.Map(t) }
23+
func (m *TypeMapper) Kind() TypeMapperKind { return m.data.Kind() }
1224

1325
// TypeMapperData
1426

1527
type TypeMapperData interface {
1628
Map(t *Type) *Type
29+
Kind() TypeMapperKind
1730
}
1831

1932
// Factory functions
@@ -70,10 +83,19 @@ func (c *Checker) newBackreferenceMapper(context *InferenceContext, index int) *
7083
return newArrayToSingleTypeMapper(typeParameters, c.unknownType)
7184
}
7285

86+
// TypeMapperBase
87+
88+
type TypeMapperBase struct {
89+
TypeMapper
90+
}
91+
92+
func (m *TypeMapperBase) Map(t *Type) *Type { return t }
93+
func (m *TypeMapperBase) Kind() TypeMapperKind { return TypeMapperKindUnknown }
94+
7395
// SimpleTypeMapper
7496

7597
type SimpleTypeMapper struct {
76-
TypeMapper
98+
TypeMapperBase
7799
source *Type
78100
target *Type
79101
}
@@ -93,10 +115,14 @@ func (m *SimpleTypeMapper) Map(t *Type) *Type {
93115
return t
94116
}
95117

118+
func (m *SimpleTypeMapper) Kind() TypeMapperKind {
119+
return TypeMapperKindSimple
120+
}
121+
96122
// ArrayTypeMapper
97123

98124
type ArrayTypeMapper struct {
99-
TypeMapper
125+
TypeMapperBase
100126
sources []*Type
101127
targets []*Type
102128
}
@@ -118,10 +144,14 @@ func (m *ArrayTypeMapper) Map(t *Type) *Type {
118144
return t
119145
}
120146

147+
func (m *ArrayTypeMapper) Kind() TypeMapperKind {
148+
return TypeMapperKindArray
149+
}
150+
121151
// ArrayToSingleTypeMapper
122152

123153
type ArrayToSingleTypeMapper struct {
124-
TypeMapper
154+
TypeMapperBase
125155
sources []*Type
126156
target *Type
127157
}
@@ -146,7 +176,7 @@ func (m *ArrayToSingleTypeMapper) Map(t *Type) *Type {
146176
// DeferredTypeMapper
147177

148178
type DeferredTypeMapper struct {
149-
TypeMapper
179+
TypeMapperBase
150180
sources []*Type
151181
targets []func() *Type
152182
}
@@ -171,7 +201,7 @@ func (m *DeferredTypeMapper) Map(t *Type) *Type {
171201
// FunctionTypeMapper
172202

173203
type FunctionTypeMapper struct {
174-
TypeMapper
204+
TypeMapperBase
175205
fn func(*Type) *Type
176206
}
177207

@@ -189,7 +219,7 @@ func (m *FunctionTypeMapper) Map(t *Type) *Type {
189219
// MergedTypeMapper
190220

191221
type MergedTypeMapper struct {
192-
TypeMapper
222+
TypeMapperBase
193223
m1 *TypeMapper
194224
m2 *TypeMapper
195225
}
@@ -206,10 +236,14 @@ func (m *MergedTypeMapper) Map(t *Type) *Type {
206236
return m.m2.Map(m.m1.Map(t))
207237
}
208238

239+
func (m *MergedTypeMapper) Kind() TypeMapperKind {
240+
return TypeMapperKindMerged
241+
}
242+
209243
// CompositeTypeMapper
210244

211245
type CompositeTypeMapper struct {
212-
TypeMapper
246+
TypeMapperBase
213247
c *Checker
214248
m1 *TypeMapper
215249
m2 *TypeMapper
@@ -235,7 +269,7 @@ func (m *CompositeTypeMapper) Map(t *Type) *Type {
235269
// InferenceTypeMapper
236270

237271
type InferenceTypeMapper struct {
238-
TypeMapper
272+
TypeMapperBase
239273
c *Checker
240274
n *InferenceContext
241275
fixing bool

internal/compiler/printer.go

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ func (p *Printer) printType(t *Type) {
116116
}
117117

118118
func (p *Printer) printTypeNoAlias(t *Type) {
119+
p.depth++
119120
switch {
120121
case t.flags&TypeFlagsIntrinsic != 0:
121122
p.print(t.AsIntrinsicType().intrinsicName)
@@ -142,14 +143,13 @@ func (p *Printer) printTypeNoAlias(t *Type) {
142143
case t.flags&TypeFlagsSubstitution != 0:
143144
p.printType(t.AsSubstitutionType().baseType)
144145
}
146+
p.depth--
145147
}
146148

147149
func (p *Printer) printRecursive(t *Type, f func(*Printer, *Type)) {
148150
if !p.printing.Has(t) && p.depth < 10 {
149151
p.printing.Add(t)
150-
p.depth++
151152
f(p, t)
152-
p.depth--
153153
p.printing.Delete(t)
154154
} else {
155155
p.print("???")
@@ -286,22 +286,37 @@ func (p *Printer) printTupleType(t *Type) {
286286
tail := false
287287
p.print("[")
288288
elementInfos := t.TargetTupleType().elementInfos
289-
for i, t := range p.c.getTypeArguments(t) {
289+
typeArguments := p.c.getTypeArguments(t)
290+
for i, info := range elementInfos {
291+
t := typeArguments[i]
290292
if tail {
291293
p.print(", ")
292294
}
293-
info := elementInfos[i]
294295
if info.flags&ElementFlagsVariable != 0 {
295296
p.print("...")
296297
}
297-
if info.flags&ElementFlagsOptional != 0 {
298-
p.printTypeEx(t, ast.TypePrecedencePostfix)
299-
p.print("?")
300-
} else if info.flags&ElementFlagsRest != 0 {
301-
p.printTypeEx(t, ast.TypePrecedencePostfix)
302-
p.print("[]")
298+
if info.labeledDeclaration != nil {
299+
p.print(info.labeledDeclaration.Name().Text())
300+
if info.flags&ElementFlagsOptional != 0 {
301+
p.print("?")
302+
}
303+
p.print(": ")
304+
if info.flags&ElementFlagsRest != 0 {
305+
p.printTypeEx(t, ast.TypePrecedencePostfix)
306+
p.print("[]")
307+
} else {
308+
p.printType(t)
309+
}
303310
} else {
304-
p.printType(t)
311+
if info.flags&ElementFlagsOptional != 0 {
312+
p.printTypeEx(t, ast.TypePrecedencePostfix)
313+
p.print("?")
314+
} else if info.flags&ElementFlagsRest != 0 {
315+
p.printTypeEx(t, ast.TypePrecedencePostfix)
316+
p.print("[]")
317+
} else {
318+
p.printType(t)
319+
}
305320
}
306321
tail = true
307322
}

0 commit comments

Comments
 (0)