diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokens.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokens.java index 4a2a06cfb..b847b1a5f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokens.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokens.java @@ -40,13 +40,14 @@ import org.springframework.ide.vscode.parser.hql.HqlLexer; import org.springframework.ide.vscode.parser.hql.HqlParser; import org.springframework.ide.vscode.parser.hql.HqlParser.EntityNameContext; import org.springframework.ide.vscode.parser.hql.HqlParser.IdentifierContext; +import org.springframework.ide.vscode.parser.hql.HqlParser.InstantiationTargetContext; import org.springframework.ide.vscode.parser.hql.HqlParser.ParameterContext; import org.springframework.ide.vscode.parser.hql.HqlParser.SimplePathElementContext; public class HqlSemanticTokens implements SemanticTokensDataProvider { private static List TOKEN_TYPES = List.of("keyword", "type", "class", "string", "number", "operator", - "variable", "method", "parameter"); + "variable", "method", "parameter", "property"); private final Optional optSpelTokens; @@ -128,10 +129,18 @@ public class HqlSemanticTokens implements SemanticTokensDataProvider { public void visitErrorNode(ErrorNode node) { processTerminalNode(node); } - + + @Override + public void exitInstantiationTarget(InstantiationTargetContext ctx) { + int offset = initialOffset + ctx.getStart().getStartIndex(); + int length = ctx.getText().length(); + tokens.add(new SemanticTokenData(offset, offset + length , "method", new String[0])); + AntlrUtils.getAllLeafs(ctx).forEach(semantics::remove); + } + @Override public void exitSimplePathElement(SimplePathElementContext ctx) { - semantics.put(ctx.identifier().getStart(), "method"); + semantics.put(ctx.identifier().getStart(), "property"); } @Override diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokensTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokensTest.java index bb9d9df16..e68781bcb 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokensTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/HqlSemanticTokensTest.java @@ -66,7 +66,7 @@ public class HqlSemanticTokensTest { assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(28, 30, "keyword", new String[0])); assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(31, 32, "variable", new String[0])); assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(32, 33, "operator", new String[0])); - assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(33, 37, "method", new String[0])); + assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(33, 37, "property", new String[0])); assertThat(tokens.size()).isEqualTo(10); } @@ -84,11 +84,11 @@ public class HqlSemanticTokensTest { assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(44, 48, "keyword", new String[0])); // join assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(50, 55, "variable", new String[0])); // owner assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(55, 56, "operator", new String[0])); // . - assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(56, 60, "method", new String[0])); // pets + assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(56, 60, "property", new String[0])); // pets assertThat(tokens.get(11)).isEqualTo(new SemanticTokenData(61, 66, "keyword", new String[0])); // WHERE assertThat(tokens.get(12)).isEqualTo(new SemanticTokenData(67, 72, "variable", new String[0])); // owner assertThat(tokens.get(13)).isEqualTo(new SemanticTokenData(72, 73, "operator", new String[0])); // . - assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(73, 81, "method", new String[0])); // lastName + assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(73, 81, "property", new String[0])); // lastName assertThat(tokens.get(15)).isEqualTo(new SemanticTokenData(82, 86, "keyword", new String[0])); // LIKE assertThat(tokens.get(16)).isEqualTo(new SemanticTokenData(87, 88, "operator", new String[0])); // : assertThat(tokens.get(17)).isEqualTo(new SemanticTokenData(88, 96, "parameter", new String[0])); // lastName @@ -110,11 +110,11 @@ public class HqlSemanticTokensTest { assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(40, 45, "keyword", new String[0])); // fetch assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(46, 51, "variable", new String[0])); // owner assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(51, 52, "operator", new String[0])); // . - assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(52, 56, "method", new String[0])); // pets + assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(52, 56, "property", new String[0])); // pets assertThat(tokens.get(11)).isEqualTo(new SemanticTokenData(57, 62, "keyword", new String[0])); // WHERE assertThat(tokens.get(12)).isEqualTo(new SemanticTokenData(63, 68, "variable", new String[0])); // owner assertThat(tokens.get(13)).isEqualTo(new SemanticTokenData(68, 69, "operator", new String[0])); // . - assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(69, 71, "method", new String[0])); // id + assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(69, 71, "property", new String[0])); // id assertThat(tokens.get(15)).isEqualTo(new SemanticTokenData(72, 73, "operator", new String[0])); // = assertThat(tokens.get(16)).isEqualTo(new SemanticTokenData(73, 74, "operator", new String[0])); // : assertThat(tokens.get(17)).isEqualTo(new SemanticTokenData(74, 76, "operator", new String[0])); // #{ @@ -138,11 +138,11 @@ public class HqlSemanticTokensTest { assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(40, 45, "keyword", new String[0])); // fetch assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(46, 51, "variable", new String[0])); // owner assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(51, 52, "operator", new String[0])); // . - assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(52, 56, "method", new String[0])); // pets + assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(52, 56, "property", new String[0])); // pets assertThat(tokens.get(11)).isEqualTo(new SemanticTokenData(57, 62, "keyword", new String[0])); // WHERE assertThat(tokens.get(12)).isEqualTo(new SemanticTokenData(63, 68, "variable", new String[0])); // owner assertThat(tokens.get(13)).isEqualTo(new SemanticTokenData(68, 69, "operator", new String[0])); // . - assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(69, 71, "method", new String[0])); // id + assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(69, 71, "property", new String[0])); // id assertThat(tokens.get(15)).isEqualTo(new SemanticTokenData(72, 73, "operator", new String[0])); // = assertThat(tokens.get(16)).isEqualTo(new SemanticTokenData(73, 74, "operator", new String[0])); // : assertThat(tokens.get(17)).isEqualTo(new SemanticTokenData(74, 76, "operator", new String[0])); // #{ @@ -166,11 +166,11 @@ public class HqlSemanticTokensTest { assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(40, 45, "keyword", new String[0])); // fetch assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(46, 51, "variable", new String[0])); // owner assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(51, 52, "operator", new String[0])); // . - assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(52, 56, "method", new String[0])); // pets + assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(52, 56, "property", new String[0])); // pets assertThat(tokens.get(11)).isEqualTo(new SemanticTokenData(57, 62, "keyword", new String[0])); // WHERE assertThat(tokens.get(12)).isEqualTo(new SemanticTokenData(63, 68, "variable", new String[0])); // owner assertThat(tokens.get(13)).isEqualTo(new SemanticTokenData(68, 69, "operator", new String[0])); // . - assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(69, 71, "method", new String[0])); // id + assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(69, 71, "property", new String[0])); // id assertThat(tokens.get(15)).isEqualTo(new SemanticTokenData(72, 73, "operator", new String[0])); // = assertThat(tokens.get(16)).isEqualTo(new SemanticTokenData(73, 74, "operator", new String[0])); // : assertThat(tokens.get(17)).isEqualTo(new SemanticTokenData(74, 76, "operator", new String[0])); // #{ @@ -189,4 +189,44 @@ public class HqlSemanticTokensTest { assertThat(tokens.size()).isEqualTo(30); } + + @Test + void instatiotation_1() { + provider = new HqlSemanticTokens(Optional.of(new SpelSemanticTokens())); + List tokens = provider.computeTokens("SELECT new com.example.ls.issue.SampleTableSizePojo(t.schemaName, sum(t.tableSize) ) FROM MTables t GROUP BY t.schemaName ORDER BY sum(t.tableSize) DESC", 0); + assertThat(tokens.size()).isEqualTo(32); + + assertThat(tokens.get(0)).isEqualTo(new SemanticTokenData(0, 6, "keyword", new String[0])); // SELECT + assertThat(tokens.get(1)).isEqualTo(new SemanticTokenData(7, 10, "keyword", new String[0])); // new + assertThat(tokens.get(2)).isEqualTo(new SemanticTokenData(11, 51, "method", new String[0])); // com.example.ls.issue.SampleTableSizePojo + assertThat(tokens.get(3)).isEqualTo(new SemanticTokenData(51, 52, "operator", new String[0])); // ( + assertThat(tokens.get(4)).isEqualTo(new SemanticTokenData(52, 53, "variable", new String[0])); // t + assertThat(tokens.get(5)).isEqualTo(new SemanticTokenData(53, 54, "operator", new String[0])); // . + assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(54, 64, "property", new String[0])); // schemaName + assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(64, 65, "operator", new String[0])); // , + assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(66, 69, "keyword", new String[0])); // sum + assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(69, 70, "operator", new String[0])); // ( + assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(70, 71, "variable", new String[0])); // t + assertThat(tokens.get(11)).isEqualTo(new SemanticTokenData(71, 72, "operator", new String[0])); // . + assertThat(tokens.get(12)).isEqualTo(new SemanticTokenData(72, 81, "property", new String[0])); // tableSize + assertThat(tokens.get(13)).isEqualTo(new SemanticTokenData(81, 82, "operator", new String[0])); // ) + assertThat(tokens.get(14)).isEqualTo(new SemanticTokenData(83, 84, "operator", new String[0])); // ) + assertThat(tokens.get(15)).isEqualTo(new SemanticTokenData(85, 89, "keyword", new String[0])); // FROM + assertThat(tokens.get(16)).isEqualTo(new SemanticTokenData(90, 97, "class", new String[0])); // MTables + assertThat(tokens.get(17)).isEqualTo(new SemanticTokenData(98, 99, "variable", new String[0])); // t + assertThat(tokens.get(18)).isEqualTo(new SemanticTokenData(100, 105, "keyword", new String[0])); // GROUP + assertThat(tokens.get(19)).isEqualTo(new SemanticTokenData(106, 108, "keyword", new String[0])); // BY + assertThat(tokens.get(20)).isEqualTo(new SemanticTokenData(109, 110, "variable", new String[0])); // t + assertThat(tokens.get(21)).isEqualTo(new SemanticTokenData(110, 111, "operator", new String[0])); // . + assertThat(tokens.get(22)).isEqualTo(new SemanticTokenData(111, 121, "property", new String[0])); // schemaName + assertThat(tokens.get(23)).isEqualTo(new SemanticTokenData(122, 127, "keyword", new String[0])); // ORDER + assertThat(tokens.get(24)).isEqualTo(new SemanticTokenData(128, 130, "keyword", new String[0])); // BY + assertThat(tokens.get(25)).isEqualTo(new SemanticTokenData(131, 134, "keyword", new String[0])); // sum + assertThat(tokens.get(26)).isEqualTo(new SemanticTokenData(134, 135, "operator", new String[0])); // ( + assertThat(tokens.get(27)).isEqualTo(new SemanticTokenData(135, 136, "variable", new String[0])); // t + assertThat(tokens.get(28)).isEqualTo(new SemanticTokenData(136, 137, "operator", new String[0])); // . + assertThat(tokens.get(29)).isEqualTo(new SemanticTokenData(137, 146, "property", new String[0])); // tableSize + assertThat(tokens.get(30)).isEqualTo(new SemanticTokenData(146, 147, "operator", new String[0])); // ) + assertThat(tokens.get(31)).isEqualTo(new SemanticTokenData(148, 152, "keyword", new String[0])); // DESC + } }