sts4 icon indicating copy to clipboard operation
sts4 copied to clipboard

Support JPQL syntax

Open cassis163 opened this issue 2 years ago • 1 comments

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.

cassis163 avatar Sep 28 '23 11:09 cassis163

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.

BoykoAlex avatar Sep 28 '23 19:09 BoykoAlex

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.

martinlippert avatar Mar 28 '24 09:03 martinlippert

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).

martinlippert avatar Mar 28 '24 09:03 martinlippert

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.

martinlippert avatar Mar 28 '24 10:03 martinlippert

Here is how sytax highlighting for JPQL looks like in VSCode

Inside Java code: Screenshot 2024-04-14 at 19 31 04

Inside jpa-named-queries.properties file: Screenshot 2024-04-14 at 19 31 11

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 :-
Screenshot 2024-04-14 at 19 32 05

@martinlippert I'm thinking of folding in what I have at the moment. No SPEL syntax highlighting (embedded SPEL) and limitations for Eclipse.

BoykoAlex avatar Apr 14 '24 23:04 BoykoAlex

@BoykoAlex Looks great and yes, let's fold that in.

martinlippert avatar Apr 15 '24 06:04 martinlippert

JPQL part went in with: 95b8e2f5bd8b1b7fcdf517124f6d7df5c420fe75

Left:

  1. SPEL inside queries.
  2. HQL if hibernate core is on the classpath
  3. SPEL for HQL queries.

BoykoAlex avatar Apr 15 '24 20:04 BoykoAlex

HQL support: 8b4abbcfd24fd57faf00bfbec2f08a6b8f821fa8

Only SPEL support left

BoykoAlex avatar Apr 16 '24 21:04 BoykoAlex

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

martinlippert avatar Apr 17 '24 09:04 martinlippert

NPE fix is included in 2543bdf1e0918f7aa87a10cd4980b593eaebe99b

BoykoAlex avatar Apr 17 '24 18:04 BoykoAlex

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.

martinlippert avatar Apr 18 '24 07:04 martinlippert

SPEL syntax highlighting moved to #1234. Closing this.

BoykoAlex avatar Apr 18 '24 16:04 BoykoAlex