Support JPQL syntax
Expected Behavior IntelliJ has built-in support for JPQL that comes with type-safety. I would expect this feature to be included in the Spring Boot extension pack, since JPQL is used extensively in most Spring Boot projects. What I expect the extension pack to do is to add syntax highlighting, linting and intellisense (copy what IntelliJ does).
Current Behavior JPQL queries are shown as plain strings at the moment. There is not much to be said about it.
Context I really like coding in VSCode, but writing JPQL queries has been a pain due to lack of support compared to IntelliJ. Not being able to see type-safety related errors and overal highlighting makes writing JPQL a lot harder than it should be.
The only difficulty is creating from scratch a TextMate grammar for JPQL. Alternatively, we'd need to find one out there on the web as it is likely someone has created it. I have only managed to find the ANTLR grammar for JPQL but this serves a different purpose and doesn't look like it can be converted to TextMate grammar. In any case if we are to implement support for JPQL it'd be in a dedicated VSCode extension.
Step one here would be to do syntax highlighting. Once we figured out how to do this, we should probably apply this solution to even more cases where some other "language" is embedded in annotation params, like SpEL.
The Spring Data JPA project itself contains parser implementations for all the various query languages: https://github.com/spring-projects/spring-data-jpa/tree/main/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query
Probably worth to re-use parts of this if we dive into deeper "language" support here, like auto-completion, syntax checking, etc.
For SpEL, we already use the Spring built-in SpEL parser to check syntax (but not to do syntax highlighting yet).
Another pointer: I saw the Java support in VSCode supports syntax highlighting for the content of text blocks in Java, e.g. highlighting the string inside a text block as YAML.
Here is how sytax highlighting for JPQL looks like in VSCode
Inside Java code:
Inside jpa-named-queries.properties file:
Eclipse support for Semantic Tokens from LSP is very limited and buggy... Only the jpa-named-queries.properties file syntax is supported but there are limitations bugs :-
@martinlippert I'm thinking of folding in what I have at the moment. No SPEL syntax highlighting (embedded SPEL) and limitations for Eclipse.
@BoykoAlex Looks great and yes, let's fold that in.
JPQL part went in with: 95b8e2f5bd8b1b7fcdf517124f6d7df5c420fe75
Left:
- SPEL inside queries.
- HQL if hibernate core is on the classpath
- SPEL for HQL queries.
HQL support: 8b4abbcfd24fd57faf00bfbec2f08a6b8f821fa8
Only SPEL support left
I tried the latest Spring Boot Tools pre-release on VSCode with an older petclinic project, and I am seeing this a lot in the output view of VSCode:
[Error - 11:24:26] Request textDocument/semanticTokens/full failed.
Message: Internal error.
Code: -32603
java.util.concurrent.CompletionException: java.lang.NullPointerException: Cannot invoke "org.springframework.ide.vscode.commons.util.text.TextDocument.getLanguageId()" because "doc" is null
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$Completion.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.ide.vscode.commons.util.text.TextDocument.getLanguageId()" because "doc" is null
at org.springframework.ide.vscode.commons.languageserver.composable.CompositeLanguageServerComponents$7.findHandler(CompositeLanguageServerComponents.java:261)
at org.springframework.ide.vscode.commons.languageserver.composable.CompositeLanguageServerComponents$7.semanticTokensFull(CompositeLanguageServerComponents.java:245)
at org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService.lambda$semanticTokensFull$11(SimpleTextDocumentService.java:464)
... 5 more
NPE fix is included in 2543bdf1e0918f7aa87a10cd4980b593eaebe99b
I can see the syntax highlighting showing up nicely after updating to the latest pre-release build of the Spring Boot Tools extension in VSCode. Great work.
We should probably close this issue as done as soon as the syntax highlighting parts are complete and create additional issues around diagnostics, enabling the semantic token highlighting for java files in Eclipse, auto-completion, etc.
SPEL syntax highlighting moved to #1234. Closing this.