8 Commits

Author SHA1 Message Date
Ruben
637478b1c3 feat: activate recompilation 2025-06-02 13:07:57 +02:00
Ruben
24c5cd823f feat: remove Diagnostic if it has been selected 2025-05-14 15:28:39 +02:00
Ruben
26eedc5b32 feat: remove Typehint if it has been selected 2025-05-14 15:18:19 +02:00
Ruben
c21f09496e feat: fix position of Hints when new Text is added to the same line 2025-05-14 14:27:49 +02:00
Ruben
39ae1d66bc feat: add compiler jar to LSP in libs Folder 2025-05-13 19:15:41 +02:00
Ruben
6ee0a74b22 feat: change Name and update jar 2025-05-12 19:51:15 +02:00
Ruben
ca6fa89e3f Merge remote-tracking branch 'origin/main' 2025-05-12 19:46:28 +02:00
Ruben
8cde997c15 feat: deactivate display if one Variable is beeing inserted 2025-05-12 19:46:17 +02:00
7 changed files with 120 additions and 81 deletions

View File

@@ -9,3 +9,7 @@ vsc-extension-quickstart.md
**/*.map
**/*.ts
**/.vscode-test.*
!JavaTXLanguageServer-1.0-SNAPSHOT-jar-with-dependencies.jar
!JavaTXLanguageServer-1.0-SNAPSHOT-jar-with-dependencies.jar

View File

@@ -1,71 +1,3 @@
# lspclient README
This is the README for your extension "lspclient". After writing up a brief description, we recommend including the following sections.
## Features
Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file.
For example if there is an image subfolder under your extension project workspace:
\!\[feature X\]\(images/feature-x.png\)
> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow.
## Requirements
If you have any requirements or dependencies, add a section describing those and how to install and configure them.
## Extension Settings
Include if your extension adds any VS Code settings through the `contributes.configuration` extension point.
For example:
This extension contributes the following settings:
* `myExtension.enable`: Enable/disable this extension.
* `myExtension.thing`: Set to `blah` to do something.
## Known Issues
Calling out known issues can help limit users opening duplicate issues against your extension.
## Release Notes
Users appreciate release notes as you update your extension.
### 1.0.0
Initial release of ...
### 1.0.1
Fixed issue #.
### 1.1.0
Added features X, Y, and Z.
---
## Following extension guidelines
Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension.
* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines)
## Working with Markdown
You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts:
* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux).
* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux).
* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets.
## For more information
* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown)
* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/)
**Enjoy!**
This is the README for the Java-TX LSP Client.

View File

@@ -1,12 +1,12 @@
{
"name": "lspclient",
"version": "0.0.1",
"version": "0.0.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "lspclient",
"version": "0.0.1",
"version": "0.0.2",
"dependencies": {
"vscode-languageclient": "^9.0.1"
},

View File

@@ -42,10 +42,11 @@ export function activate(context: vscode.ExtensionContext) {
revealOutputChannelOn: 4
};
// Language Client erstellen und starten
const client = new LanguageClient(
'javaLanguageServer', // ID des Clients
'Java Language Server', // Name des Clients
'javaTxLanguageServer', // ID des Clients
'Java-TX Language Server', // Name des Clients
serverOptions,
clientOptions
);

View File

@@ -14,6 +14,7 @@ import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.eclipse.lsp4j.*;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.eclipse.lsp4j.jsonrpc.messages.Message;
import org.eclipse.lsp4j.services.LanguageClient;
import org.eclipse.lsp4j.services.TextDocumentService;
@@ -26,6 +27,7 @@ import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
@@ -42,8 +44,10 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
HashMap<String, String> textDocuments = new HashMap<>();
CodeSnippetOptions codeSnippetOptions = new CodeSnippetOptions();
TextHelper textHelper = new TextHelper();
Boolean dontShowHints = false;
TypeResolver typeResolver = new TypeResolver();
Path fileRoot = null;
Boolean singleFileOpened = false;
public void setClient(LanguageClient client) {
this.client = client;
@@ -51,6 +55,9 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
public void setFileRoot(List<WorkspaceFolder> root) {
if (root == null) {
singleFileOpened = true;
}
//TODO: Nicht nur das erste Element nehmen sondern alle beachten
fileRoot = Path.of(URI.create(root.get(0).getUri()));
}
@@ -91,6 +98,36 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
textDocuments.put(params.getTextDocument().getUri(), params.getTextDocument().getText());
}
public ArrayList<String> difference(String first, String second) {
ArrayList<String> result = new ArrayList<>();
int i = 0, j = 0;
int startDiff = -1;
while (j < second.length()) {
if (i < first.length() && first.charAt(i) == second.charAt(j)) {
if (startDiff != -1) {
result.add(second.substring(startDiff, j));
startDiff = -1;
}
i++;
j++;
} else {
if (startDiff == -1) {
startDiff = j;
}
j++;
}
}
if (startDiff != -1) {
result.add(second.substring(startDiff));
}
return result;
}
/**
* Handles didChange-Event.
* updates textDocument-State on Server and run Syntax-Check. If an Error is found it will get displayed as a Diagnostic.
@@ -101,6 +138,30 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
public void didChange(DidChangeTextDocumentParams params) {
log("[didChange] Client triggered didChange Event.", MessageType.Info);
//TODO: Regenerate if Line-Count does not match -> Return new AST and see where the Positions are instead of calculating them from changes in Text-Document. Even possible?
String currentText = textDocuments.get(params.getTextDocument().getUri());
ArrayList<String> currentTextLines = new ArrayList<>(Arrays.stream(currentText.split("\n")).toList());
String newText = params.getContentChanges().getFirst().getText();
ArrayList<String> newTextLines = new ArrayList<>(Arrays.stream(newText.split("\n")).toList());
ArrayList<Integer> offsetPerLine = new ArrayList<>();
HashMap<Integer, List<String>> textChanges = new HashMap<>();
int index = 0;
for (String newTextLine : newTextLines) {
if (!(currentTextLines.size() > index)) {
offsetPerLine.add(0);
} else {
textChanges.put(index, difference(currentTextLines.get(index), newTextLine).stream().map(el -> el.replaceAll(" ", "")).toList());
offsetPerLine.add(newTextLine.length() - currentTextLines.get(index).length());
}
index++;
}
AtomicReference<String> summedUp = new AtomicReference<>("");
params.getContentChanges().forEach(el -> summedUp.set(summedUp.get() + el.getText()));
textDocuments.put(params.getTextDocument().getUri(), summedUp.get());
@@ -125,9 +186,37 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
}).toList();
PublishDiagnosticsParams diagnosticsParams = new PublishDiagnosticsParams(params.getTextDocument().getUri(), diagnostics);
client.publishDiagnostics(diagnosticsParams);
// PublishDiagnosticsParams diagnosticsParams = new PublishDiagnosticsParams(params.getTextDocument().getUri(), diagnostics);
// client.publishDiagnostics(diagnosticsParams);
for (var inlayHint : globalInlayHintMap.get(params.getTextDocument().getUri())) {
inlayHint.getPosition().setCharacter(inlayHint.getPosition().getCharacter() + offsetPerLine.get(inlayHint.getPosition().getLine()));
}
for (var inlayHint : globalDiagnosticsMap.get(params.getTextDocument().getUri())) {
inlayHint.getRange().getStart().setCharacter(inlayHint.getRange().getStart().getCharacter() + offsetPerLine.get(inlayHint.getRange().getStart().getLine()));
inlayHint.getRange().getEnd().setCharacter(inlayHint.getRange().getEnd().getCharacter() + offsetPerLine.get(inlayHint.getRange().getEnd().getLine()));
}
for (var textChangeLine : textChanges.entrySet()) {
log(textChangeLine.getKey() + " - " + String.join(",", textChangeLine.getValue()), MessageType.Info);
}
globalInlayHintMap.put(params.getTextDocument().getUri(), globalInlayHintMap.get(params.getTextDocument().getUri()).stream().filter(el -> {
//TODO: Hier das Label aufspalten an | weil die Typehints immer mit und getrennt sind und so jeder Typhint für sich durchlaufen werden kann.
log(el.getLabel().getLeft().replaceAll(" ", "") + "<>" + String.join(",", textChanges.get(el.getPosition().getLine())) + ": " + (!textChanges.get(el.getPosition().getLine()).contains(el.getLabel().getLeft().replaceAll(" ", ""))? "true" : "false"), MessageType.Info);
return !textChanges.get(el.getPosition().getLine()).contains(el.getLabel().getLeft().replaceAll(" ", ""));
}).toList());
globalDiagnosticsMap.put(params.getTextDocument().getUri(), globalDiagnosticsMap.get(params.getTextDocument().getUri()).stream().filter(el -> {
log(el.getMessage().replaceAll(" ", "") + "<>" + String.join(",", textChanges.get(el.getRange().getStart().getLine())) + ": " + (!textChanges.get(el.getRange().getStart().getLine()).contains(el.getMessage().replaceAll(" ", ""))? "true" : "false"), MessageType.Info);
return !textChanges.get(el.getRange().getStart().getLine()).contains(el.getMessage().replaceAll(" ", ""));
}).toList());
updateClient(client);
client.publishDiagnostics(new PublishDiagnosticsParams(params.getTextDocument().getUri(), globalDiagnosticsMap.get(params.getTextDocument().getUri())));
}
/**
@@ -283,6 +372,8 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
} catch (Exception e) {
log("[didSave] Error trying to get Inlay-Hints and Diagnostics for Client: " + e.getMessage(), MessageType.Error);
client.showMessage(new MessageParams(MessageType.Error, e.getMessage()));
updateGlobalMaps(new ArrayList<>(), new ArrayList<>(), didSaveTextDocumentParams.getTextDocument().getUri());
} finally {
currentlyCalculating = false;
@@ -295,21 +386,24 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
stopLoading("compile-task", "Types successfully inferred", client);
dontShowHints = false;
updateClient(client);
ArrayList<File> files = new ArrayList<>();
if (fileRoot != null) {
try (Stream<Path> stream = Files.walk(Paths.get(fileRoot.toUri()))) {
stream.filter(Files::isRegularFile)
.forEach(el -> files.add(el.toFile()));
} catch (IOException e) {
}
}
}
@Override
public CompletableFuture<List<InlayHint>> inlayHint(InlayHintParams params) {
log("[inlayHint] The Client requested Inlay-Hints.", MessageType.Info);
return CompletableFuture.supplyAsync(() -> globalInlayHintMap.get(params.getTextDocument().getUri()) == null ? Collections.emptyList() : globalInlayHintMap.get(params.getTextDocument().getUri()));
return CompletableFuture.supplyAsync(() -> dontShowHints ? Collections.emptyList() : globalInlayHintMap.get(params.getTextDocument().getUri()) == null ? Collections.emptyList() : globalInlayHintMap.get(params.getTextDocument().getUri()));
}
@Override
@@ -441,7 +535,11 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
@Override
public CompletableFuture<List<Either<Command, CodeAction>>> codeAction(CodeActionParams params) {
log("[codeAction] Client requested Insert at Line [" + params.getRange().getStart().getLine() + "] and from Char [" + params.getRange().getStart().getCharacter() + "] to [" + params.getRange().getEnd().getCharacter() + "].", MessageType.Info);
log("Code-Action Context was: " + params.getContext().getTriggerKind().name(), MessageType.Info);
List<Either<Command, CodeAction>> actions = new ArrayList<>();
@@ -453,6 +551,8 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
.filter(diagnostic -> rangesOverlap(diagnostic.getRange(), requestedRange)).toList();
Range rangeOfInsert = params.getRange();
String documentUri = params.getTextDocument().getUri();
@@ -515,7 +615,9 @@ public class JavaTXTextDocumentService implements org.eclipse.lsp4j.services.Tex
}
}
return CompletableFuture.completedFuture(actions);
return CompletableFuture.supplyAsync(() -> {
return actions;
});
}