Skip to content

Commit 1849e6b

Browse files
authored
More type checking fixes (microsoft#786)
1 parent a88fef7 commit 1849e6b

24 files changed

+105
-593
lines changed

internal/checker/checker.go

+17-6
Original file line numberDiff line numberDiff line change
@@ -14504,7 +14504,7 @@ func (c *Checker) resolveQualifiedName(name *ast.Node, left *ast.Node, right *as
1450414504
}
1450514505
text := right.AsIdentifier().Text
1450614506
symbol := c.getMergedSymbol(c.getSymbol(c.getExportsOfSymbol(namespace), text, meaning))
14507-
if symbol != nil && namespace.Flags&ast.SymbolFlagsAlias != 0 {
14507+
if symbol == nil && namespace.Flags&ast.SymbolFlagsAlias != 0 {
1450814508
// `namespace` can be resolved further if there was a symbol merge with a re-export
1450914509
symbol = c.getMergedSymbol(c.getSymbol(c.getExportsOfSymbol(c.resolveAlias(namespace)), text, meaning))
1451014510
}
@@ -15200,16 +15200,26 @@ func (c *Checker) getTypeOfVariableOrParameterOrPropertyWorker(symbol *ast.Symbo
1520015200
if symbol == c.requireSymbol {
1520115201
return c.anyType
1520215202
}
15203-
// !!! Handle SymbolFlagsModuleExports
15203+
if symbol.Flags&ast.SymbolFlagsModuleExports != 0 && symbol.ValueDeclaration != nil {
15204+
fileSymbol := c.getSymbolOfDeclaration(ast.GetSourceFileOfNode(symbol.ValueDeclaration).AsNode())
15205+
result := c.newSymbol(fileSymbol.Flags, "exports")
15206+
result.Parent = symbol
15207+
result.Declarations = fileSymbol.Declarations
15208+
result.ValueDeclaration = fileSymbol.ValueDeclaration
15209+
result.Members = maps.Clone(fileSymbol.Members)
15210+
result.Exports = maps.Clone(fileSymbol.Exports)
15211+
members := make(ast.SymbolTable, 1)
15212+
members["exports"] = result
15213+
return c.newAnonymousType(symbol, members, nil, nil, nil)
15214+
}
1520415215
// Debug.assertIsDefined(symbol.valueDeclaration)
1520515216
declaration := symbol.ValueDeclaration
15206-
// !!! Handle export default expressions
1520715217
if ast.IsSourceFile(declaration) && ast.IsJsonSourceFile(declaration.AsSourceFile()) {
1520815218
statements := declaration.AsSourceFile().Statements.Nodes
1520915219
if len(statements) == 0 {
1521015220
return c.emptyObjectType
1521115221
}
15212-
return c.getWidenedType(c.getWidenedLiteralType(c.checkExpression(statements[0].AsExpressionStatement().Expression)))
15222+
return c.getWidenedType(c.getWidenedLiteralType(c.checkExpression(statements[0].Expression())))
1521315223
}
1521415224
// Handle variable, parameter or property
1521515225
if !c.pushTypeResolution(symbol, TypeSystemPropertyNameType) {
@@ -17995,8 +18005,9 @@ func (c *Checker) addInheritedMembers(symbols ast.SymbolTable, baseSymbols []*as
1799518005
func (c *Checker) resolveDeclaredMembers(t *Type) *InterfaceType {
1799618006
d := t.AsInterfaceType()
1799718007
if !d.declaredMembersResolved {
18008+
members := c.getMembersOfSymbol(t.symbol)
1799818009
d.declaredMembersResolved = true
17999-
d.declaredMembers = c.getMembersOfSymbol(t.symbol)
18010+
d.declaredMembers = members
1800018011
d.declaredCallSignatures = c.getSignaturesOfSymbol(d.declaredMembers[ast.InternalSymbolNameCall])
1800118012
d.declaredConstructSignatures = c.getSignaturesOfSymbol(d.declaredMembers[ast.InternalSymbolNameNew])
1800218013
d.declaredIndexInfos = c.getIndexInfosOfSymbol(t.symbol)
@@ -20641,7 +20652,7 @@ func (c *Checker) getObjectTypeInstantiation(t *Type, m *TypeMapper, alias *Type
2064120652
newAlias = c.instantiateTypeAlias(t.alias, m)
2064220653
}
2064320654
data := target.AsObjectType()
20644-
key := getTypeInstantiationKey(typeArguments, alias, t.objectFlags&ObjectFlagsSingleSignatureType != 0)
20655+
key := getTypeInstantiationKey(typeArguments, newAlias, t.objectFlags&ObjectFlagsSingleSignatureType != 0)
2064520656
if data.instantiations == nil {
2064620657
data.instantiations = make(map[string]*Type)
2064720658
data.instantiations[getTypeInstantiationKey(typeParameters, target.alias, false)] = target

internal/parser/parser.go

+16-13
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ func (p *Parser) parseSourceFileWorker() *ast.SourceFile {
343343
func (p *Parser) finishSourceFile(result *ast.SourceFile, isDeclarationFile bool) {
344344
result.CommentDirectives = p.scanner.CommentDirectives()
345345
result.Pragmas = getCommentPragmas(&p.factory, p.sourceText)
346-
processPragmasIntoFields(result)
346+
p.processPragmasIntoFields(result)
347347
result.SetDiagnostics(attachFileToDiagnostics(p.diagnostics, result))
348348
result.ExternalModuleIndicator = isFileProbablyExternalModule(result) // !!!
349349
result.IsDeclarationFile = isDeclarationFile
@@ -6434,16 +6434,16 @@ func extractPragmas(commentRange ast.CommentRange, text string) []ast.Pragma {
64346434
}
64356435
argName := extractName(text, pos)
64366436
if argName == "" {
6437-
return nil
6437+
break
64386438
}
64396439
pos = skipBlanks(text, pos+len(argName))
64406440
if !match(text, pos, "=") {
6441-
return nil
6441+
break
64426442
}
64436443
pos = skipBlanks(text, pos+1)
64446444
value, ok := extractQuotedString(text, pos)
64456445
if !ok {
6446-
return nil
6446+
break
64476447
}
64486448
args[argName] = ast.PragmaArgument{
64496449
Name: argName,
@@ -6483,6 +6483,9 @@ func extractPragmas(commentRange ast.CommentRange, text string) []ast.Pragma {
64836483
}
64846484
start := skipBlanks(text, pos+len(pragmaName)+1)
64856485
pos = skipNonBlanks(text, start)
6486+
if pos == start {
6487+
break
6488+
}
64866489
args := make(map[string]ast.PragmaArgument, 1)
64876490
args["factory"] = ast.PragmaArgument{
64886491
Name: "factory",
@@ -6553,7 +6556,7 @@ func extractQuotedString(text string, pos int) (string, bool) {
65536556
return text[start:pos], true
65546557
}
65556558

6556-
func processPragmasIntoFields(context *ast.SourceFile /* !!! reportDiagnostic func(*ast.Diagnostic)*/) {
6559+
func (p *Parser) processPragmasIntoFields(context *ast.SourceFile) {
65576560
context.CheckJsDirective = nil
65586561
context.ReferencedFiles = nil
65596562
context.TypeReferenceDirectives = nil
@@ -6569,10 +6572,10 @@ func processPragmasIntoFields(context *ast.SourceFile /* !!! reportDiagnostic fu
65696572
resolutionMode, resolutionModeOk := pragma.Args["resolution-mode"]
65706573
preserve, preserveOk := pragma.Args["preserve"]
65716574
noDefaultLib, noDefaultLibOk := pragma.Args["no-default-lib"]
6572-
6573-
if noDefaultLibOk && noDefaultLib.Value == "true" {
6575+
switch {
6576+
case noDefaultLibOk && noDefaultLib.Value == "true":
65746577
context.HasNoDefaultLib = true
6575-
} else if typesOk {
6578+
case typesOk:
65766579
var parsed core.ResolutionMode
65776580
if resolutionModeOk {
65786581
parsed = parseResolutionMode(resolutionMode.Value, types.Pos(), types.End() /*, reportDiagnostic*/)
@@ -6583,20 +6586,20 @@ func processPragmasIntoFields(context *ast.SourceFile /* !!! reportDiagnostic fu
65836586
ResolutionMode: parsed,
65846587
Preserve: preserveOk && preserve.Value == "true",
65856588
})
6586-
} else if libOk {
6589+
case libOk:
65876590
context.LibReferenceDirectives = append(context.LibReferenceDirectives, &ast.FileReference{
65886591
TextRange: types.TextRange,
65896592
FileName: lib.Value,
65906593
Preserve: preserveOk && preserve.Value == "true",
65916594
})
6592-
} else if pathOk {
6595+
case pathOk:
65936596
context.ReferencedFiles = append(context.ReferencedFiles, &ast.FileReference{
65946597
TextRange: types.TextRange,
65956598
FileName: path.Value,
65966599
Preserve: preserveOk && preserve.Value == "true",
65976600
})
6598-
} else {
6599-
// reportDiagnostic(argMap.Pos, argMap.End-argMap.Pos, "Invalid reference directive syntax")
6601+
default:
6602+
p.parseErrorAtRange(pragma.TextRange, diagnostics.Invalid_reference_directive_syntax)
66006603
}
66016604
case "ts-check", "ts-nocheck":
66026605
// _last_ of either nocheck or check in a file is the "winner"
@@ -6610,7 +6613,7 @@ func processPragmasIntoFields(context *ast.SourceFile /* !!! reportDiagnostic fu
66106613
}
66116614

66126615
case "jsx", "jsxfrag", "jsximportsource", "jsxruntime":
6613-
// !!!
6616+
// Nothing to do here
66146617
default:
66156618
panic("Unhandled pragma kind: " + pragma.Name)
66166619
}

testdata/baselines/reference/submodule/compiler/dynamicNames.errors.txt

-167
This file was deleted.

0 commit comments

Comments
 (0)