[HQL] Semantic tokens adjustment

This commit is contained in:
aboyko
2024-10-09 23:09:05 -04:00
parent ec8b9ea019
commit 1d02a04a21
2 changed files with 61 additions and 12 deletions

View File

@@ -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<String> TOKEN_TYPES = List.of("keyword", "type", "class", "string", "number", "operator",
"variable", "method", "parameter");
"variable", "method", "parameter", "property");
private final Optional<SpelSemanticTokens> 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

View File

@@ -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<SemanticTokenData> 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
}
}