10 Commits

Author SHA1 Message Date
Ruben
254edf25af feat: update jar and Version 2025-09-19 19:20:16 +02:00
RubenKraft
fc628f7547 Update README.md 2025-09-18 16:05:45 +00:00
Ruben
33d5fbb01d feat: update jar and Version 2025-09-18 17:55:45 +02:00
Ruben
6332daf2ad feat: update Compiler Jar 2025-09-18 17:54:17 +02:00
Ruben
01616ee985 feat: update vscode client 2025-09-17 19:11:55 +02:00
Ruben
29f0e6a05a Merge remote-tracking branch 'origin/main'
# Conflicts:
#	Clients/VisualStudioCode/JavaTXLanguageServer-1.0-SNAPSHOT-jar-with-dependencies.jar
#	Clients/VisualStudioCode/package.json
2025-09-17 19:08:53 +02:00
Ruben
ed26f869c3 feat #40: only insert Type as normal name without package reference as it is implicitly imported 2025-09-17 14:29:46 +02:00
Ruben
ee0b51868c feat: move compilation into compiler 2025-09-17 11:32:46 +02:00
Ruben
98b32fd418 feat #40: remove Diagnostic if it has been selected 2025-09-17 11:08:07 +02:00
Ruben
7bc07d9ac1 feat: update vscode client 2025-09-15 18:51:24 +02:00
13 changed files with 80 additions and 60 deletions

View File

@@ -1,3 +1,3 @@
# lspclient README # Java-TX Language Server
This is the README for the Java-TX LSP Client. This is the official Plugin for Java-TX.

View File

@@ -3,7 +3,7 @@
"name": "java-tx-language-extension", "name": "java-tx-language-extension",
"displayName": "Java-TX Language Extension", "displayName": "Java-TX Language Extension",
"description": "The Language Extension for Java-TX with Typehints and Syntax Checks", "description": "The Language Extension for Java-TX with Typehints and Syntax Checks",
"version": "0.0.5", "version": "0.0.9",
"engines": { "engines": {
"vscode": "^1.94.0" "vscode": "^1.94.0"
}, },

View File

@@ -13,12 +13,12 @@ function createClient(context: vscode.ExtensionContext): LanguageClient {
const serverOptions: ServerOptions = { const serverOptions: ServerOptions = {
run: { run: {
command: 'java', command: 'java',
args: ['-Xss2m', '-jar', workspaceFolder + "/JavaTXLanguageServer-1.0-SNAPSHOT-jar-with-dependencies.jar"], args: ['-Xss10m', '-jar', workspaceFolder + "/JavaTXLanguageServer-1.0-SNAPSHOT-jar-with-dependencies.jar"],
}, },
debug: { debug: {
command: 'java', command: 'java',
args: [ args: [
'-Xss2m', '-Xss10m',
'-jar', '-jar',
workspaceFolder + '/JavaTXLanguageServer-1.0-SNAPSHOT-jar-with-dependencies.jar', workspaceFolder + '/JavaTXLanguageServer-1.0-SNAPSHOT-jar-with-dependencies.jar',
], ],
@@ -26,7 +26,7 @@ function createClient(context: vscode.ExtensionContext): LanguageClient {
}; };
const clientOptions: LanguageClientOptions = { const clientOptions: LanguageClientOptions = {
documentSelector: [{ scheme: 'file', language: 'java' }], documentSelector: [{ scheme: 'file', pattern: '**/*.jav' }],
synchronize: { synchronize: {
fileEvents: vscode.workspace.createFileSystemWatcher('**/*.jav') fileEvents: vscode.workspace.createFileSystemWatcher('**/*.jav')
}, },

View File

@@ -55,7 +55,7 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
this.logService = new LogService(clientService); this.logService = new LogService(clientService);
this.formattingHandler = new FormattingHandler(textDocumentService); this.formattingHandler = new FormattingHandler(textDocumentService);
this.parserService = new ParserService(conversionHelper, clientService, cacheService); this.parserService = new ParserService(conversionHelper, clientService, cacheService);
this.codeActionHandler = new CodeActionHandler(textHelper, textDocumentService, cacheService, typeResolver, logService); this.codeActionHandler = new CodeActionHandler(textHelper, textDocumentService, cacheService, typeResolver, logService, conversionHelper);
this.saveHandler = new SaveHandler(typeResolver, textDocumentService, logService, cacheService, conversionHelper, clientService, parserService); this.saveHandler = new SaveHandler(typeResolver, textDocumentService, logService, cacheService, conversionHelper, clientService, parserService);
this.changeHandler = new ChangeHandler(textDocumentService, parserService, conversionHelper, clientService, typeResolver, cacheService, logService); this.changeHandler = new ChangeHandler(textDocumentService, parserService, conversionHelper, clientService, typeResolver, cacheService, logService);
} }

View File

@@ -13,6 +13,8 @@ import org.eclipse.lsp4j.*;
import java.io.BufferedWriter; import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.net.URI;
import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@@ -93,7 +95,7 @@ public class ChangeHandler {
logService.log("Type is here: " + type); logService.log("Type is here: " + type);
for (LSPVariable variable : cacheService.getVariables()) { for (LSPVariable variable : cacheService.getVariables()) {
for (Type variableType : variable.getPossibleTypes()) { for (Type variableType : variable.getPossibleTypes()) {
logService.log(variableType.getType() + " <> "+ type.replaceAll(" ", "") + ": " + type.replaceAll(" ", "").contains(variableType.getType().replaceAll(" ", ""))); logService.log(variableType.getType() + " <> " + type.replaceAll(" ", "") + ": " + type.replaceAll(" ", "").contains(variableType.getType().replaceAll(" ", "")));
shouldCalculate = shouldCalculate || type.replaceAll(" ", "").contains(variableType.getType().replaceAll(" ", "")); shouldCalculate = shouldCalculate || type.replaceAll(" ", "").contains(variableType.getType().replaceAll(" ", ""));
if (shouldCalculate) { if (shouldCalculate) {
break; break;
@@ -154,28 +156,37 @@ public class ChangeHandler {
try { try {
try { try {
File tempDir2 = new File(System.getProperty("java.io.tmpdir")); File tempDir2 = Path.of(new URI(params.getTextDocument().getUri())).getParent().toFile();
File tempFile2 = File.createTempFile("newText", ".tmp", tempDir2); File tempFile2 = File.createTempFile("jtx_temp", ".tmp", tempDir2);
FileWriter fileWriter = new FileWriter(tempFile2, true); FileWriter fileWriter = new FileWriter(tempFile2, true);
BufferedWriter bw = new BufferedWriter(fileWriter); BufferedWriter bw = new BufferedWriter(fileWriter);
bw.write(input); bw.write(input);
bw.close(); bw.close();
ArrayList<LSPVariable> variables = typeResolver.infereInput(tempFile2.toURI().toString(), input, false); try {
cacheService.setVariables(variables); ArrayList<LSPVariable> variables = typeResolver.infereInput(tempFile2.toURI().toString(), input, true);
cacheService.setVariables(variables);
DiagnosticsAndTypehints diagnosticsAndTypehints = conversionHelper.variablesToDiagnosticsAndTypehintsWithInput(variables, input); DiagnosticsAndTypehints diagnosticsAndTypehints = conversionHelper.variablesToDiagnosticsAndTypehintsWithInput(variables, input);
List<InlayHint> typeHint = diagnosticsAndTypehints.getInlayHints(); List<InlayHint> typeHint = diagnosticsAndTypehints.getInlayHints();
List<Diagnostic> diagnostics = diagnosticsAndTypehints.getDiagnostics(); List<Diagnostic> diagnostics = diagnosticsAndTypehints.getDiagnostics();
cacheService.updateGlobalMaps(diagnostics, typeHint, params.getTextDocument().getUri()); cacheService.updateGlobalMaps(diagnostics, typeHint, params.getTextDocument().getUri());
List<Diagnostic> allDiagnostics = new ArrayList<>(diagnostics); List<Diagnostic> allDiagnostics = new ArrayList<>(diagnostics);
allDiagnostics.addAll(parserService.getDiagnosticsOfErrors(input, params.getTextDocument().getUri())); allDiagnostics.addAll(parserService.getDiagnosticsOfErrors(input, params.getTextDocument().getUri()));
clientService.publishDiagnostics(params.getTextDocument().getUri(), allDiagnostics); clientService.publishDiagnostics(params.getTextDocument().getUri(), allDiagnostics);
} catch (Exception f) {
logService.log("[didSave] Error trying to get Inlay-Hints and Diagnostics for Client: " + f.getMessage(), MessageType.Error);
for (StackTraceElement elem : f.getStackTrace()) {
logService.log(elem.toString());
}
clientService.showMessage(MessageType.Error, f.getMessage() == null ? "null" : f.getMessage());
cacheService.updateGlobalMaps(new ArrayList<>(), new ArrayList<>(), params.getTextDocument().getUri());
}
tempFile2.delete(); tempFile2.delete();
} catch (Exception e) { } catch (Exception e) {
logService.log("[didSave] Error trying to get Inlay-Hints and Diagnostics for Client: " + e.getMessage(), MessageType.Error); logService.log("[didSave] Error trying to get Inlay-Hints and Diagnostics for Client: " + e.getMessage(), MessageType.Error);

View File

@@ -1,5 +1,6 @@
package de.dhbw.handler; package de.dhbw.handler;
import de.dhbw.helper.ConversionHelper;
import de.dhbw.helper.TextHelper; import de.dhbw.helper.TextHelper;
import de.dhbw.helper.TypeResolver; import de.dhbw.helper.TypeResolver;
import de.dhbw.service.CacheService; import de.dhbw.service.CacheService;
@@ -22,13 +23,15 @@ public class CodeActionHandler {
private final CacheService cacheService; private final CacheService cacheService;
private final TypeResolver typeResolver; private final TypeResolver typeResolver;
private final LogService logService; private final LogService logService;
private final ConversionHelper conversionHelper;
public CodeActionHandler(TextHelper textHelper, TextDocumentService textDocumentService, CacheService cacheService, TypeResolver typeResolver, LogService logService) { public CodeActionHandler(TextHelper textHelper, TextDocumentService textDocumentService, CacheService cacheService, TypeResolver typeResolver, LogService logService, ConversionHelper conversionHelper) {
this.textHelper = textHelper; this.textHelper = textHelper;
this.textDocumentService = textDocumentService; this.textDocumentService = textDocumentService;
this.cacheService = cacheService; this.cacheService = cacheService;
this.typeResolver = typeResolver; this.typeResolver = typeResolver;
this.logService = logService; this.logService = logService;
this.conversionHelper = conversionHelper;
} }
public static Range wholeDocumentRange(String text) { public static Range wholeDocumentRange(String text) {
@@ -103,7 +106,7 @@ public class CodeActionHandler {
Range rangeOfInsert = params.getRange(); Range rangeOfInsert = params.getRange();
//All Diagnostics that are in range of the hover -> All Diagnostics of the selected Variable and thus all Types of the Variable //All Diagnostics that are in range of the hover -> All Diagnostics of the selected Variable and thus all Types of the Variable
Map<String, List<PlaceholderVariable>> typeInsertsOverlapping = getOverlapping(typeResolver.getInserts(), rangeOfInsert.getStart().getLine()+1, rangeOfInsert.getStart().getCharacter(), rangeOfInsert.getEnd().getCharacter()); Map<String, List<PlaceholderVariable>> typeInsertsOverlapping = getOverlapping(typeResolver.getInserts(), rangeOfInsert.getStart().getLine() + 1, rangeOfInsert.getStart().getCharacter(), rangeOfInsert.getEnd().getCharacter());
logService.log("Inserts are:"); logService.log("Inserts are:");
typeResolver.getInserts().forEach((key, value) -> logService.log(key)); typeResolver.getInserts().forEach((key, value) -> logService.log(key));
logService.log("Size is: " + typeInsertsOverlapping.size()); logService.log("Size is: " + typeInsertsOverlapping.size());
@@ -113,6 +116,8 @@ public class CodeActionHandler {
for (var typeInsertList : typeInsertsOverlapping.values()) { for (var typeInsertList : typeInsertsOverlapping.values()) {
for (var typeInsert : typeInsertList) { for (var typeInsert : typeInsertList) {
try { try {
logService.log("NEW TEXT OF FILE BEFORE INSERT IS:");
logService.log(textDocumentService.getFileOfUri(documentUri));
String typeWithReplacedVariable = typeInsert.insert(textDocumentService.getFileOfUri(documentUri)); String typeWithReplacedVariable = typeInsert.insert(textDocumentService.getFileOfUri(documentUri));
ArrayList<TextEdit> listOfChanges = new ArrayList<>(); ArrayList<TextEdit> listOfChanges = new ArrayList<>();
@@ -127,7 +132,7 @@ public class CodeActionHandler {
WorkspaceEdit edit = new WorkspaceEdit(); WorkspaceEdit edit = new WorkspaceEdit();
edit.setChanges(changes); edit.setChanges(changes);
CodeAction action = new CodeAction("Insert " + typeInsert.getInsertString()); CodeAction action = new CodeAction("Insert " + conversionHelper.cleanType(typeInsert.getInsertString()));
action.setKind(CodeActionKind.QuickFix); action.setKind(CodeActionKind.QuickFix);
action.setEdit(edit); action.setEdit(edit);
actions.add(Either.forRight(action)); actions.add(Either.forRight(action));

View File

@@ -20,12 +20,16 @@ public class ConversionHelper {
this.textDocumentService = textDocumentService; this.textDocumentService = textDocumentService;
} }
public String cleanType(String type){
return type.replaceAll("java.lang.", "").replaceAll("java.util.", "");
}
public InlayHint getInlayHint(LSPVariable variable) { public InlayHint getInlayHint(LSPVariable variable) {
InlayHint inlayHint = new InlayHint(); InlayHint inlayHint = new InlayHint();
String typeDisplay = ""; String typeDisplay = "";
for (Type type : variable.getPossibleTypes()) { for (Type type : variable.getPossibleTypes()) {
typeDisplay += " | " + type.getType().replaceAll("GTV ", ""); typeDisplay += " | " + cleanType(type.getType().replaceAll("GTV ", ""));
} }
@@ -45,7 +49,7 @@ public class ConversionHelper {
Diagnostic diagnostic = new Diagnostic( Diagnostic diagnostic = new Diagnostic(
errorRange, errorRange,
//TODO: REMOVE! Temporary Fix because GTV, like TPH can be thrown away in the TypeResolver //TODO: REMOVE! Temporary Fix because GTV, like TPH can be thrown away in the TypeResolver
type.getType().replaceAll("GTV ", ""), cleanType(type.getType().replaceAll("GTV ", "")),
DiagnosticSeverity.Hint, DiagnosticSeverity.Hint,
"JavaTX Language Server" "JavaTX Language Server"
); );
@@ -62,7 +66,7 @@ public class ConversionHelper {
Diagnostic diagnostic = new Diagnostic( Diagnostic diagnostic = new Diagnostic(
errorRange, errorRange,
//TODO: REMOVE! Temporary Fix because GTV, like TPH can be thrown away in the TypeResolver //TODO: REMOVE! Temporary Fix because GTV, like TPH can be thrown away in the TypeResolver
type.getType().replaceAll("GTV ", ""), cleanType(type.getType().replaceAll("GTV ", "")),
DiagnosticSeverity.Hint, DiagnosticSeverity.Hint,
"JavaTX Language Server" "JavaTX Language Server"
); );
@@ -71,7 +75,7 @@ public class ConversionHelper {
return diagnostic; return diagnostic;
} }
public List<Diagnostic> parseErrorToDiagnostic(List<ParserError> parserErrors){ public List<Diagnostic> parseErrorToDiagnostic(List<ParserError> parserErrors) {
return parserErrors.stream().map(el -> { return parserErrors.stream().map(el -> {
Range errorRange = new Range( Range errorRange = new Range(
new Position(el.getLine() - 1, el.getCharPositionInLine()), // Startposition new Position(el.getLine() - 1, el.getCharPositionInLine()), // Startposition
@@ -86,7 +90,7 @@ public class ConversionHelper {
}).toList(); }).toList();
} }
public DiagnosticsAndTypehints variablesToDiagnosticsAndTypehints(ArrayList<LSPVariable> typesOfMethodAndParameters, String uri){ public DiagnosticsAndTypehints variablesToDiagnosticsAndTypehints(ArrayList<LSPVariable> typesOfMethodAndParameters, String uri) {
List<InlayHint> typeHint = new ArrayList<>(); List<InlayHint> typeHint = new ArrayList<>();
ArrayList<Diagnostic> diagnostics = new ArrayList<>(); ArrayList<Diagnostic> diagnostics = new ArrayList<>();
@@ -103,7 +107,8 @@ public class ConversionHelper {
return new DiagnosticsAndTypehints(diagnostics, typeHint); return new DiagnosticsAndTypehints(diagnostics, typeHint);
} }
public DiagnosticsAndTypehints variablesToDiagnosticsAndTypehintsWithInput(ArrayList<LSPVariable> typesOfMethodAndParameters, String input){
public DiagnosticsAndTypehints variablesToDiagnosticsAndTypehintsWithInput(ArrayList<LSPVariable> typesOfMethodAndParameters, String input) {
List<InlayHint> typeHint = new ArrayList<>(); List<InlayHint> typeHint = new ArrayList<>();
ArrayList<Diagnostic> diagnostics = new ArrayList<>(); ArrayList<Diagnostic> diagnostics = new ArrayList<>();

View File

@@ -19,6 +19,7 @@ public class PlaceholderPlacer extends AbstractASTWalker {
this.genericsResult = genericsResult; this.genericsResult = genericsResult;
pkgName = forSourceFile.getPkgName(); pkgName = forSourceFile.getPkgName();
forSourceFile.accept(this); forSourceFile.accept(this);
inserts.forEach(el -> el.reducePackage());
return inserts; return inserts;
} }

View File

@@ -143,38 +143,20 @@ public class TypeResolver {
public ArrayList<LSPVariable> infereInput(String pathString, String input, boolean a) throws IOException, ClassNotFoundException, URISyntaxException { public ArrayList<LSPVariable> infereInput(String pathString, String input, boolean a) throws IOException, ClassNotFoundException, URISyntaxException {
System.setOut(new PrintStream(OutputStream.nullOutputStream())); System.setOut(new PrintStream(OutputStream.nullOutputStream()));
var uri = new URI(pathString); LanguageServerInterface languageServerInterface = new LanguageServerInterface();
var path = Path.of(uri); LanguageServerTransferObject lsTransfer = languageServerInterface.getResultSetAndAbstractSyntax(pathString);
logger.info("Path is for calculation: " + path.toString()); var parsedSource = lsTransfer.getAst();
var file = path.toFile(); var tiResults = lsTransfer.getResultSets();
Files.createDirectories(path.getParent().resolve("out"));
var compiler = new JavaTXCompiler(List.of(file), List.of(path.getParent().toFile()), path.getParent().resolve("out").toFile());
var parsedSource = compiler.sourceFiles.get(file);
var tiResults = compiler.typeInference(file);
Set<PlaceholderVariable> tips = new HashSet<>(); Set<PlaceholderVariable> tips = new HashSet<>();
// for (var sf : compiler.sourceFiles.values()) { generatedGenerics = lsTransfer.getGeneratedGenerics().get(lsTransfer.getAst());
// Map<JavaClassName, byte[]> bytecode = compiler.generateBytecode(sf, tiResults);
// logger.info("Path for Class-File is: " + path.getParent().resolve("out").toFile());
// Files.createDirectories(path.getParent().resolve("out"));
// compiler.writeClassFile(bytecode, path.getParent().resolve("out").toFile(), false);
//
// }
Map<JavaClassName, byte[]> bytecode = compiler.generateBytecode(parsedSource, tiResults);
logger.info("Path for Class-File is: " + path.getParent().resolve("out").toFile());
Files.createDirectories(path.getParent().resolve("out"));
compiler.writeClassFile(bytecode, path.getParent().resolve("out").toFile(), false);
generatedGenerics = compiler.getGeneratedGenerics().get(compiler.sourceFiles.get(file));
for (int i = 0; i < tiResults.size(); i++) { for (int i = 0; i < tiResults.size(); i++) {
ResultSet tiResult = tiResults.get(i); ResultSet tiResult = tiResults.get(i);
tips.addAll(ASTTransformationHelper.createTypeInsertPoints(parsedSource, tiResult, compiler.getGeneratedGenerics().get(compiler.sourceFiles.get(file)).get(i))); tips.addAll(ASTTransformationHelper.createTypeInsertPoints(parsedSource, tiResult, lsTransfer.getGeneratedGenerics().get(lsTransfer.getAst()).get(i)));
} }
System.setOut(System.out); System.setOut(System.out);
this.current = new LanguageServerTransferObject(tiResults, parsedSource, "", compiler.getGeneratedGenerics()); this.current = lsTransfer;
HashMap<String, List<PlaceholderVariable>> insertsOnLines = new HashMap<>(); HashMap<String, List<PlaceholderVariable>> insertsOnLines = new HashMap<>();

View File

@@ -12,6 +12,10 @@ public class PlaceholderPoint {
private int extraOffset = 0; private int extraOffset = 0;
private PlaceholderType kind; private PlaceholderType kind;
public void setInsertString(String insertString){
this.insertString = insertString;
}
public PlaceholderPoint(Token point, String toInsert, PlaceholderType kind){ public PlaceholderPoint(Token point, String toInsert, PlaceholderType kind){
this.point = point; this.point = point;
this.kind = kind; this.kind = kind;
@@ -37,12 +41,12 @@ public class PlaceholderPoint {
public int getPositionInCode() { public int getPositionInCode() {
return point.getStartIndex() + extraOffset; return point.getStartIndex() + extraOffset;
} }
/* PL 2018-06-19
* Zwei TypeInsertPoint's sind gleich, wenn ihre point's gleich sind public PlaceholderType getKind() {
* eingefuegt damit man TypeReplaceMarker vergleichen kann return kind;
* @see java.lang.Object#equals(java.lang.Object) }
*/
public boolean equals(Object obj) { public boolean equals(Object obj) {
return this == obj; return this == obj;
/* /*

View File

@@ -12,6 +12,7 @@ public class PlaceholderVariable {
Set<PlaceholderPoint> inserts; Set<PlaceholderPoint> inserts;
ResultPair<?, ?> resultPair; ResultPair<?, ?> resultPair;
public PlaceholderVariable(PlaceholderPoint point, Set<PlaceholderPoint> additionalPoints, ResultPair<?, ?> resultPair) { public PlaceholderVariable(PlaceholderPoint point, Set<PlaceholderPoint> additionalPoints, ResultPair<?, ?> resultPair) {
this.point = point; this.point = point;
inserts = additionalPoints; inserts = additionalPoints;
@@ -24,7 +25,10 @@ public class PlaceholderVariable {
List<PlaceholderPoint> insertsSorted = new ArrayList<>(); List<PlaceholderPoint> insertsSorted = new ArrayList<>();
insertsSorted.add(point); insertsSorted.add(point);
insertsSorted.addAll(inserts);
if (!point.getInsertString().contains("void")) {
insertsSorted.addAll(inserts);
}
Collections.sort(insertsSorted, new PlaceholderPoint.TypeInsertPointPositionComparator().reversed()); Collections.sort(insertsSorted, new PlaceholderPoint.TypeInsertPointPositionComparator().reversed());
for (PlaceholderPoint insertPoint : insertsSorted) { for (PlaceholderPoint insertPoint : insertsSorted) {
@@ -38,6 +42,10 @@ public class PlaceholderVariable {
return point.getInsertString(); return point.getInsertString();
} }
public void reducePackage() {
point.setInsertString(point.getInsertString().replaceAll("java\\.lang\\.", "").replaceAll("java\\.util\\.", ""));
}
public ResultPair<?, ?> getResultPair() { public ResultPair<?, ?> getResultPair() {
return this.resultPair; return this.resultPair;
} }

View File

@@ -55,6 +55,10 @@ The Language Server in itself can be used for any Client. The Clients task is to
![Diagram](docs/diagram.png) ![Diagram](docs/diagram.png)
## Additional Information
- Uses the [LSP-Interface](https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore/src/branch/LSP-Interface) Branch of the Java-TX Compiler Repository
## Update JavaTX Compiler Dependency as Maven Package ## Update JavaTX Compiler Dependency as Maven Package
If you make changes in the Compiler Interface, you have to change the jar and therefore the Dependency in the Java TX Language Server If you make changes in the Compiler Interface, you have to change the jar and therefore the Dependency in the Java TX Language Server
You can follow this steps: You can follow this steps: