Skip to content

Commit 869519d

Browse files
authored
Implement getJSSyntacticDiagnosticsForFile (#1723)
1 parent f3f42e7 commit 869519d

File tree

144 files changed

+1725
-2636
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+1725
-2636
lines changed

internal/ast/ast.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,26 @@ func (n *Node) ClassName() *Node {
11071107
panic("Unhandled case in Node.ClassName: " + n.Kind.String())
11081108
}
11091109

1110+
func (n *Node) PostfixToken() *Node {
1111+
switch n.Kind {
1112+
case KindParameter:
1113+
return n.AsParameterDeclaration().QuestionToken
1114+
case KindMethodDeclaration:
1115+
return n.AsMethodDeclaration().PostfixToken
1116+
case KindShorthandPropertyAssignment:
1117+
return n.AsShorthandPropertyAssignment().PostfixToken
1118+
case KindMethodSignature:
1119+
return n.AsMethodSignatureDeclaration().PostfixToken
1120+
case KindPropertySignature:
1121+
return n.AsPropertySignatureDeclaration().PostfixToken
1122+
case KindPropertyAssignment:
1123+
return n.AsPropertyAssignment().PostfixToken
1124+
case KindPropertyDeclaration:
1125+
return n.AsPropertyDeclaration().PostfixToken
1126+
}
1127+
return nil
1128+
}
1129+
11101130
// Determines if `n` contains `descendant` by walking up the `Parent` pointers from `descendant`. This method panics if
11111131
// `descendant` or one of its ancestors is not parented except when that node is a `SourceFile`.
11121132
func (n *Node) Contains(descendant *Node) bool {
@@ -10382,6 +10402,7 @@ type SourceFile struct {
1038210402

1038310403
// Fields set by parser
1038410404
diagnostics []*Diagnostic
10405+
jsDiagnostics []*Diagnostic
1038510406
jsdocDiagnostics []*Diagnostic
1038610407
LanguageVariant core.LanguageVariant
1038710408
ScriptKind core.ScriptKind
@@ -10469,6 +10490,14 @@ func (node *SourceFile) SetDiagnostics(diags []*Diagnostic) {
1046910490
node.diagnostics = diags
1047010491
}
1047110492

10493+
func (node *SourceFile) JSDiagnostics() []*Diagnostic {
10494+
return node.jsDiagnostics
10495+
}
10496+
10497+
func (node *SourceFile) SetJSDiagnostics(diags []*Diagnostic) {
10498+
node.jsDiagnostics = diags
10499+
}
10500+
1047210501
func (node *SourceFile) JSDocDiagnostics() []*Diagnostic {
1047310502
return node.jsdocDiagnostics
1047410503
}

internal/ast/modifierflags.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,17 @@ const (
1313
// Syntactic-only modifiers
1414
ModifierFlagsExport ModifierFlags = 1 << 5 // Declarations
1515
ModifierFlagsAbstract ModifierFlags = 1 << 6 // Class/Method/ConstructSignature
16-
ModifierFlagsAmbient ModifierFlags = 1 << 7 // Declarations
16+
ModifierFlagsAmbient ModifierFlags = 1 << 7 // Declarations (declare keyword)
1717
ModifierFlagsStatic ModifierFlags = 1 << 8 // Property/Method
1818
ModifierFlagsAccessor ModifierFlags = 1 << 9 // Property
1919
ModifierFlagsAsync ModifierFlags = 1 << 10 // Property/Method/Function
2020
ModifierFlagsDefault ModifierFlags = 1 << 11 // Function/Class (export default declaration)
2121
ModifierFlagsConst ModifierFlags = 1 << 12 // Const enum
2222
ModifierFlagsIn ModifierFlags = 1 << 13 // Contravariance modifier
2323
ModifierFlagsOut ModifierFlags = 1 << 14 // Covariance modifier
24-
ModifierFlagsDecorator ModifierFlags = 1 << 15 // Contains a decorator.
25-
ModifierFlagsImmediate ModifierFlags = 1 << 16 // Parameter
24+
ModifierFlagsDecorator ModifierFlags = 1 << 15 // Contains a decorator
2625
// JSDoc-only modifiers
27-
ModifierFlagsDeprecated ModifierFlags = 1 << 17 // Deprecated tag.
28-
ModifierFlagsJSDocImmediate ModifierFlags = 1 << 18 // Parameter
26+
ModifierFlagsDeprecated ModifierFlags = 1 << 16 // Deprecated tag
2927
// Cache-only JSDoc-modifiers. Should match order of Syntactic/JSDoc modifiers, above.
3028
ModifierFlagsJSDocPublic ModifierFlags = 1 << 23 // if this value changes, `selectEffectiveModifierFlags` must change accordingly
3129
ModifierFlagsJSDocPrivate ModifierFlags = 1 << 24
@@ -36,19 +34,20 @@ const (
3634
ModifierFlagsHasComputedFlags ModifierFlags = 1 << 29 // Modifier flags have been computed
3735

3836
ModifierFlagsSyntacticOrJSDocModifiers = ModifierFlagsPublic | ModifierFlagsPrivate | ModifierFlagsProtected | ModifierFlagsReadonly | ModifierFlagsOverride
39-
ModifierFlagsSyntacticOnlyModifiers = ModifierFlagsExport | ModifierFlagsAmbient | ModifierFlagsAbstract | ModifierFlagsStatic | ModifierFlagsAccessor | ModifierFlagsAsync | ModifierFlagsDefault | ModifierFlagsConst | ModifierFlagsIn | ModifierFlagsOut | ModifierFlagsDecorator | ModifierFlagsImmediate
37+
ModifierFlagsSyntacticOnlyModifiers = ModifierFlagsExport | ModifierFlagsAmbient | ModifierFlagsAbstract | ModifierFlagsStatic | ModifierFlagsAccessor | ModifierFlagsAsync | ModifierFlagsDefault | ModifierFlagsConst | ModifierFlagsIn | ModifierFlagsOut | ModifierFlagsDecorator
4038
ModifierFlagsSyntacticModifiers = ModifierFlagsSyntacticOrJSDocModifiers | ModifierFlagsSyntacticOnlyModifiers
4139
ModifierFlagsJSDocCacheOnlyModifiers = ModifierFlagsJSDocPublic | ModifierFlagsJSDocPrivate | ModifierFlagsJSDocProtected | ModifierFlagsJSDocReadonly | ModifierFlagsJSDocOverride
42-
ModifierFlagsJSDocOnlyModifiers = ModifierFlagsDeprecated | ModifierFlagsJSDocImmediate
40+
ModifierFlagsJSDocOnlyModifiers = ModifierFlagsDeprecated
4341
ModifierFlagsNonCacheOnlyModifiers = ModifierFlagsSyntacticOrJSDocModifiers | ModifierFlagsSyntacticOnlyModifiers | ModifierFlagsJSDocOnlyModifiers
4442

4543
ModifierFlagsAccessibilityModifier = ModifierFlagsPublic | ModifierFlagsPrivate | ModifierFlagsProtected
4644
// Accessibility modifiers and 'readonly' can be attached to a parameter in a constructor to make it a property.
4745
ModifierFlagsParameterPropertyModifier = ModifierFlagsAccessibilityModifier | ModifierFlagsReadonly | ModifierFlagsOverride
4846
ModifierFlagsNonPublicAccessibilityModifier = ModifierFlagsPrivate | ModifierFlagsProtected
4947

50-
ModifierFlagsTypeScriptModifier = ModifierFlagsAmbient | ModifierFlagsPublic | ModifierFlagsPrivate | ModifierFlagsProtected | ModifierFlagsReadonly | ModifierFlagsAbstract | ModifierFlagsConst | ModifierFlagsOverride | ModifierFlagsIn | ModifierFlagsOut | ModifierFlagsImmediate
48+
ModifierFlagsTypeScriptModifier = ModifierFlagsAmbient | ModifierFlagsPublic | ModifierFlagsPrivate | ModifierFlagsProtected | ModifierFlagsReadonly | ModifierFlagsAbstract | ModifierFlagsConst | ModifierFlagsOverride | ModifierFlagsIn | ModifierFlagsOut
5149
ModifierFlagsExportDefault = ModifierFlagsExport | ModifierFlagsDefault
52-
ModifierFlagsAll = ModifierFlagsExport | ModifierFlagsAmbient | ModifierFlagsPublic | ModifierFlagsPrivate | ModifierFlagsProtected | ModifierFlagsStatic | ModifierFlagsReadonly | ModifierFlagsAbstract | ModifierFlagsAccessor | ModifierFlagsAsync | ModifierFlagsDefault | ModifierFlagsConst | ModifierFlagsDeprecated | ModifierFlagsOverride | ModifierFlagsIn | ModifierFlagsOut | ModifierFlagsImmediate | ModifierFlagsDecorator
50+
ModifierFlagsAll = ModifierFlagsExport | ModifierFlagsAmbient | ModifierFlagsPublic | ModifierFlagsPrivate | ModifierFlagsProtected | ModifierFlagsStatic | ModifierFlagsReadonly | ModifierFlagsAbstract | ModifierFlagsAccessor | ModifierFlagsAsync | ModifierFlagsDefault | ModifierFlagsConst | ModifierFlagsDeprecated | ModifierFlagsOverride | ModifierFlagsIn | ModifierFlagsOut | ModifierFlagsDecorator
5351
ModifierFlagsModifier = ModifierFlagsAll & ^ModifierFlagsDecorator
52+
ModifierFlagsJavaScript = ModifierFlagsExport | ModifierFlagsStatic | ModifierFlagsAccessor | ModifierFlagsAsync | ModifierFlagsDefault
5453
)

internal/ast/utilities.go

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,8 +1015,6 @@ func ModifierToFlag(token Kind) ModifierFlags {
10151015
return ModifierFlagsIn
10161016
case KindOutKeyword:
10171017
return ModifierFlagsOut
1018-
case KindImmediateKeyword:
1019-
return ModifierFlagsImmediate
10201018
case KindDecorator:
10211019
return ModifierFlagsDecorator
10221020
}
@@ -2086,10 +2084,7 @@ func IsComputedNonLiteralName(name *Node) bool {
20862084
}
20872085

20882086
func IsQuestionToken(node *Node) bool {
2089-
if node == nil {
2090-
return false
2091-
}
2092-
return node.Kind == KindQuestionToken
2087+
return node != nil && node.Kind == KindQuestionToken
20932088
}
20942089

20952090
func GetTextOfPropertyName(name *Node) string {
@@ -3552,23 +3547,7 @@ func ShouldTransformImportCall(fileName string, options *core.CompilerOptions, i
35523547
}
35533548

35543549
func HasQuestionToken(node *Node) bool {
3555-
switch node.Kind {
3556-
case KindParameter:
3557-
return node.AsParameterDeclaration().QuestionToken != nil
3558-
case KindMethodDeclaration:
3559-
return IsQuestionToken(node.AsMethodDeclaration().PostfixToken)
3560-
case KindShorthandPropertyAssignment:
3561-
return IsQuestionToken(node.AsShorthandPropertyAssignment().PostfixToken)
3562-
case KindMethodSignature:
3563-
return IsQuestionToken(node.AsMethodSignatureDeclaration().PostfixToken)
3564-
case KindPropertySignature:
3565-
return IsQuestionToken(node.AsPropertySignatureDeclaration().PostfixToken)
3566-
case KindPropertyAssignment:
3567-
return IsQuestionToken(node.AsPropertyAssignment().PostfixToken)
3568-
case KindPropertyDeclaration:
3569-
return IsQuestionToken(node.AsPropertyDeclaration().PostfixToken)
3570-
}
3571-
return false
3550+
return IsQuestionToken(node.PostfixToken())
35723551
}
35733552

35743553
func IsJsxOpeningLikeElement(node *Node) bool {
@@ -3877,3 +3856,7 @@ func IsJSDocNameReferenceContext(node *Node) bool {
38773856
return IsJSDocNameReference(node) || IsJSDocLinkLike(node)
38783857
}) != nil
38793858
}
3859+
3860+
func IsImportOrImportEqualsDeclaration(node *Node) bool {
3861+
return IsImportDeclaration(node) || IsImportEqualsDeclaration(node)
3862+
}

internal/checker/checker.go

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,7 +2097,6 @@ func (c *Checker) checkSourceFile(ctx context.Context, sourceFile *ast.SourceFil
20972097
c.renamedBindingElementsInTypes = nil
20982098
c.checkSourceElements(sourceFile.Statements.Nodes)
20992099
c.checkDeferredNodes(sourceFile)
2100-
c.checkJSDocNodes(sourceFile)
21012100
if ast.IsExternalOrCommonJSModule(sourceFile) {
21022101
c.checkExternalModuleExports(sourceFile.AsNode())
21032102
c.registerForUnusedIdentifiersCheck(sourceFile.AsNode())
@@ -2139,6 +2138,16 @@ func (c *Checker) checkSourceElement(node *ast.Node) bool {
21392138
}
21402139

21412140
func (c *Checker) checkSourceElementWorker(node *ast.Node) {
2141+
if node.Flags&ast.NodeFlagsHasJSDoc != 0 {
2142+
for _, jsdoc := range node.JSDoc(nil) {
2143+
c.checkJSDocComments(jsdoc)
2144+
if tags := jsdoc.AsJSDoc().Tags; tags != nil {
2145+
for _, tag := range tags.Nodes {
2146+
c.checkJSDocComments(tag)
2147+
}
2148+
}
2149+
}
2150+
}
21422151
kind := node.Kind
21432152
if kind >= ast.KindFirstStatement && kind <= ast.KindLastStatement {
21442153
flowNode := node.FlowNodeData().FlowNode
@@ -2331,48 +2340,29 @@ func (c *Checker) checkDeferredNode(node *ast.Node) {
23312340
c.currentNode = saveCurrentNode
23322341
}
23332342

2334-
func (c *Checker) checkJSDocNodes(sourceFile *ast.SourceFile) {
2335-
// !!!
2336-
// This performs minimal checking of JSDoc nodes to ensure that @link references to entities are recorded
2337-
// for purposes of checking unused identifiers. We pass down a location node because the binder doesn't currently
2338-
// set parent references in JSDoc nodes.
2339-
for location, jsdocs := range sourceFile.JSDocCache() {
2340-
for _, jsdoc := range jsdocs {
2341-
if c.isCanceled() {
2342-
return
2343-
}
2344-
c.checkJSDocComments(jsdoc, location)
2345-
tags := jsdoc.AsJSDoc().Tags
2346-
if tags != nil {
2347-
for _, tag := range tags.Nodes {
2348-
c.checkJSDocComments(tag, location)
2349-
}
2350-
}
2351-
}
2352-
}
2353-
}
2354-
2355-
func (c *Checker) checkJSDocComments(node *ast.Node, location *ast.Node) {
2343+
func (c *Checker) checkJSDocComments(node *ast.Node) {
23562344
for _, comment := range node.Comments() {
2357-
c.checkJSDocComment(comment, location)
2345+
c.checkJSDocComment(comment)
23582346
}
23592347
}
23602348

2361-
func (c *Checker) checkJSDocComment(node *ast.Node, location *ast.Node) {
2349+
func (c *Checker) checkJSDocComment(node *ast.Node) {
2350+
// This performs minimal checking of JSDoc nodes to ensure that @link references to entities are recorded
2351+
// for purposes of checking unused identifiers.
23622352
switch node.Kind {
23632353
case ast.KindJSDocLink, ast.KindJSDocLinkCode, ast.KindJSDocLinkPlain:
2364-
c.resolveJSDocMemberName(node.Name(), location)
2354+
c.resolveJSDocMemberName(node.Name())
23652355
}
23662356
}
23672357

2368-
func (c *Checker) resolveJSDocMemberName(name *ast.Node, location *ast.Node) *ast.Symbol {
2358+
func (c *Checker) resolveJSDocMemberName(name *ast.Node) *ast.Symbol {
23692359
if name != nil && ast.IsEntityName(name) {
23702360
meaning := ast.SymbolFlagsType | ast.SymbolFlagsNamespace | ast.SymbolFlagsValue
2371-
if symbol := c.resolveEntityName(name, meaning, true /*ignoreErrors*/, true /*dontResolveAlias*/, location); symbol != nil {
2361+
if symbol := c.resolveEntityName(name, meaning, true /*ignoreErrors*/, true /*dontResolveAlias*/, nil); symbol != nil {
23722362
return symbol
23732363
}
23742364
if ast.IsQualifiedName(name) {
2375-
if symbol := c.resolveJSDocMemberName(name.AsQualifiedName().Left, location); symbol != nil {
2365+
if symbol := c.resolveJSDocMemberName(name.AsQualifiedName().Left); symbol != nil {
23762366
var t *Type
23772367
if symbol.Flags&ast.SymbolFlagsValue != 0 {
23782368
proto := c.getPropertyOfType(c.getTypeOfSymbol(symbol), "prototype")
@@ -6410,6 +6400,36 @@ func (c *Checker) checkAliasSymbol(node *ast.Node) {
64106400
// otherwise it will conflict with some local declaration). Note that in addition to normal flags we include matching SymbolFlags.Export*
64116401
// in order to prevent collisions with declarations that were exported from the current module (they still contribute to local names).
64126402
symbol = c.getMergedSymbol(core.OrElse(symbol.ExportSymbol, symbol))
6403+
// A type-only import/export will already have a grammar error in a JS file, so no need to issue more errors within
6404+
if ast.IsInJSFile(node) && target.Flags&ast.SymbolFlagsValue == 0 && !ast.IsTypeOnlyImportOrExportDeclaration(node) {
6405+
errorNode := core.OrElse(node.PropertyNameOrName(), node)
6406+
debug.Assert(node.Kind != ast.KindNamespaceExport)
6407+
if ast.IsExportSpecifier(node) {
6408+
diag := c.error(errorNode, diagnostics.Types_cannot_appear_in_export_declarations_in_JavaScript_files)
6409+
if sourceSymbol := ast.GetSourceFileOfNode(node).AsNode().Symbol(); sourceSymbol != nil {
6410+
if alreadyExportedSymbol := sourceSymbol.Exports[node.PropertyNameOrName().Text()]; alreadyExportedSymbol == target {
6411+
if exportingDeclaration := core.Find(alreadyExportedSymbol.Declarations, ast.IsJSTypeAliasDeclaration); exportingDeclaration != nil {
6412+
diag.AddRelatedInfo(NewDiagnosticForNode(exportingDeclaration, diagnostics.X_0_is_automatically_exported_here, alreadyExportedSymbol.Name))
6413+
}
6414+
}
6415+
}
6416+
} else {
6417+
debug.Assert(node.Kind != ast.KindVariableDeclaration)
6418+
specifierText := "..."
6419+
if importDeclaration := ast.FindAncestor(node, ast.IsImportOrImportEqualsDeclaration); importDeclaration != nil {
6420+
if moduleSpecifier := TryGetModuleSpecifierFromDeclaration(importDeclaration); moduleSpecifier != nil {
6421+
specifierText = moduleSpecifier.Text()
6422+
}
6423+
}
6424+
identifierText := symbol.Name
6425+
if ast.IsIdentifier(errorNode) {
6426+
identifierText = errorNode.Text()
6427+
}
6428+
importText := "import(\"" + specifierText + "\")." + identifierText
6429+
c.error(errorNode, diagnostics.X_0_is_a_type_and_cannot_be_imported_in_JavaScript_files_Use_1_in_a_JSDoc_type_annotation, identifierText, importText)
6430+
}
6431+
return
6432+
}
64136433
targetFlags := c.getSymbolFlags(target)
64146434
excludedMeanings := core.IfElse(symbol.Flags&(ast.SymbolFlagsValue|ast.SymbolFlagsExportValue) != 0, ast.SymbolFlagsValue, 0) |
64156435
core.IfElse(symbol.Flags&ast.SymbolFlagsType != 0, ast.SymbolFlagsType, 0) |
@@ -30460,7 +30480,7 @@ func (c *Checker) getSymbolOfNameOrPropertyAccessExpression(name *ast.Node) *ast
3046030480
c.checkQualifiedName(name, CheckModeNormal)
3046130481
}
3046230482
if links.resolvedSymbol == nil && isJSDoc && ast.IsQualifiedName(name) {
30463-
return c.resolveJSDocMemberName(name, nil)
30483+
return c.resolveJSDocMemberName(name)
3046430484
}
3046530485
return links.resolvedSymbol
3046630486
}

internal/compiler/program.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ func (p *Program) getOptionsDiagnosticsOfConfigFile() []*ast.Diagnostic {
990990
}
991991

992992
func (p *Program) getSyntacticDiagnosticsForFile(ctx context.Context, sourceFile *ast.SourceFile) []*ast.Diagnostic {
993-
return sourceFile.Diagnostics()
993+
return core.Concatenate(sourceFile.Diagnostics(), sourceFile.JSDiagnostics())
994994
}
995995

996996
func (p *Program) getBindDiagnosticsForFile(ctx context.Context, sourceFile *ast.SourceFile) []*ast.Diagnostic {

internal/execute/tsc/diagnostics.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,20 @@ func getFormatOptsOfSys(sys System) *diagnosticwriter.FormattingOptions {
2424
type DiagnosticReporter = func(*ast.Diagnostic)
2525

2626
func QuietDiagnosticReporter(diagnostic *ast.Diagnostic) {}
27+
2728
func CreateDiagnosticReporter(sys System, w io.Writer, options *core.CompilerOptions) DiagnosticReporter {
2829
if options.Quiet.IsTrue() {
2930
return QuietDiagnosticReporter
3031
}
31-
3232
formatOpts := getFormatOptsOfSys(sys)
33-
writeDiagnostic := core.IfElse(shouldBePretty(sys, options), diagnosticwriter.FormatDiagnosticWithColorAndContext, diagnosticwriter.WriteFormatDiagnostic)
33+
if shouldBePretty(sys, options) {
34+
return func(diagnostic *ast.Diagnostic) {
35+
diagnosticwriter.FormatDiagnosticWithColorAndContext(w, diagnostic, formatOpts)
36+
fmt.Fprint(w, formatOpts.NewLine)
37+
}
38+
}
3439
return func(diagnostic *ast.Diagnostic) {
35-
writeDiagnostic(w, diagnostic, formatOpts)
36-
fmt.Fprint(w, formatOpts.NewLine)
40+
diagnosticwriter.WriteFormatDiagnostic(w, diagnostic, formatOpts)
3741
}
3842
}
3943

internal/ls/diagnostics.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,14 @@ import (
1313
func (l *LanguageService) ProvideDiagnostics(ctx context.Context, uri lsproto.DocumentUri) (lsproto.DocumentDiagnosticResponse, error) {
1414
program, file := l.getProgramAndFile(uri)
1515

16-
diagnostics := make([][]*ast.Diagnostic, 0, 3)
17-
if syntaxDiagnostics := program.GetSyntacticDiagnostics(ctx, file); len(syntaxDiagnostics) != 0 {
18-
diagnostics = append(diagnostics, syntaxDiagnostics)
19-
} else {
20-
diagnostics = append(diagnostics, program.GetSemanticDiagnostics(ctx, file))
21-
// !!! user preference for suggestion diagnostics; keep only unnecessary/deprecated?
22-
// See: https://github.com/microsoft/vscode/blob/3dbc74129aaae102e5cb485b958fa5360e8d3e7a/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts#L114
23-
diagnostics = append(diagnostics, program.GetSuggestionDiagnostics(ctx, file))
24-
if program.Options().GetEmitDeclarations() {
25-
diagnostics = append(diagnostics, program.GetDeclarationDiagnostics(ctx, file))
26-
}
16+
diagnostics := make([][]*ast.Diagnostic, 0, 4)
17+
diagnostics = append(diagnostics, program.GetSyntacticDiagnostics(ctx, file))
18+
diagnostics = append(diagnostics, program.GetSemanticDiagnostics(ctx, file))
19+
// !!! user preference for suggestion diagnostics; keep only unnecessary/deprecated?
20+
// See: https://github.com/microsoft/vscode/blob/3dbc74129aaae102e5cb485b958fa5360e8d3e7a/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts#L114
21+
diagnostics = append(diagnostics, program.GetSuggestionDiagnostics(ctx, file))
22+
if program.Options().GetEmitDeclarations() {
23+
diagnostics = append(diagnostics, program.GetDeclarationDiagnostics(ctx, file))
2724
}
2825

2926
return lsproto.RelatedFullDocumentDiagnosticReportOrUnchangedDocumentDiagnosticReport{

0 commit comments

Comments
 (0)