Skip to content

Commit fe48803

Browse files
committed
Resurrect diagnostics for missing nodes
This seems useful, even though tree sitter usually do not report these in more complicated docs.
1 parent 02849c8 commit fe48803

File tree

3 files changed

+47
-4
lines changed

3 files changed

+47
-4
lines changed

server/src/__tests__/analyzer.test.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,30 @@ describe('analyze', () => {
4646
expect(loggerWarn).not.toHaveBeenCalled()
4747
})
4848

49-
it('parses files with a missing node', () => {
49+
it('parses files with a missing nodes and return relevant diagnostics', () => {
5050
const diagnostics = analyzer.analyze({
5151
uri: CURRENT_URI,
5252
document: FIXTURE_DOCUMENT.MISSING_NODE,
5353
})
54-
expect(diagnostics).toEqual([])
54+
expect(diagnostics).toMatchInlineSnapshot(`
55+
Array [
56+
Object {
57+
"message": "Syntax error: \\"fi\\" missing",
58+
"range": Object {
59+
"end": Object {
60+
"character": 0,
61+
"line": 12,
62+
},
63+
"start": Object {
64+
"character": 0,
65+
"line": 12,
66+
},
67+
},
68+
"severity": 2,
69+
"source": "bash-language-server",
70+
},
71+
]
72+
`)
5573
expect(loggerWarn).toHaveBeenCalledWith(
5674
'Error while parsing dummy-uri.sh: syntax error',
5775
)

server/src/analyser.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,11 @@ export default class Analyzer {
116116
logger.warn(`Error while parsing ${uri}: syntax error`)
117117
}
118118

119-
return diagnostics
119+
const missingNodesDiagnostics = TreeSitterUtil.getDiagnosticsForMissingNodes(
120+
tree.rootNode,
121+
)
122+
123+
return diagnostics.concat(missingNodesDiagnostics)
120124
}
121125

122126
/**

server/src/util/tree-sitter.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Range } from 'vscode-languageserver/node'
1+
import { Diagnostic, DiagnosticSeverity, Range } from 'vscode-languageserver/node'
22
import { SyntaxNode } from 'web-tree-sitter'
33

44
/**
@@ -56,3 +56,24 @@ export function findParent(
5656
}
5757
return null
5858
}
59+
60+
export function getDiagnosticsForMissingNodes(node: SyntaxNode) {
61+
const diagnostics: Diagnostic[] = []
62+
63+
forEach(node, (node) => {
64+
if (node.isMissing()) {
65+
diagnostics.push(
66+
Diagnostic.create(
67+
range(node),
68+
`Syntax error: "${node.type}" missing`,
69+
DiagnosticSeverity.Warning,
70+
undefined,
71+
'bash-language-server',
72+
),
73+
)
74+
}
75+
return node.hasError()
76+
})
77+
78+
return diagnostics
79+
}

0 commit comments

Comments
 (0)