use of org.eclipse.lsp4j.Diagnostic in project sts4 by spring-projects.
the class SimpleLanguageServer method validateWith.
/**
* Convenience method. Subclasses can call this to use a {@link IReconcileEngine} ported
* from old STS codebase to validate a given {@link TextDocument} and publish Diagnostics.
*/
public void validateWith(TextDocumentIdentifier docId, IReconcileEngine engine) {
CompletableFuture<Void> reconcileSession = this.busyReconcile = new CompletableFuture<Void>();
// Log.debug("Reconciling BUSY");
SimpleTextDocumentService documents = getTextDocumentService();
int requestedVersion = documents.getDocument(docId.getUri()).getVersion();
// Avoid running in the same thread as lsp4j as it can result
// in long "hangs" for slow reconcile providers
Mono.fromRunnable(() -> {
TextDocument doc = documents.getDocument(docId.getUri()).copy();
if (requestedVersion != doc.getVersion()) {
// Do not bother reconciling if document contents is already stale.
return;
}
if (testListener != null) {
testListener.reconcileStarted(docId.getUri(), doc.getVersion());
}
IProblemCollector problems = new IProblemCollector() {
private LinkedHashSet<Diagnostic> diagnostics = new LinkedHashSet<>();
private List<Quickfix> quickfixes = new ArrayList<>();
@Override
public void endCollecting() {
documents.setQuickfixes(docId, quickfixes);
documents.publishDiagnostics(docId, diagnostics);
}
@Override
public void beginCollecting() {
diagnostics.clear();
}
@Override
public void checkPointCollecting() {
// publish what has been collected so far
documents.publishDiagnostics(docId, diagnostics);
}
@Override
public void accept(ReconcileProblem problem) {
try {
DiagnosticSeverity severity = getDiagnosticSeverity(problem);
if (severity != null) {
Diagnostic d = new Diagnostic();
d.setCode(problem.getCode());
d.setMessage(problem.getMessage());
Range rng = doc.toRange(problem.getOffset(), problem.getLength());
d.setRange(rng);
d.setSeverity(severity);
List<QuickfixData<?>> fixes = problem.getQuickfixes();
if (CollectionUtil.hasElements(fixes)) {
for (QuickfixData<?> fix : fixes) {
quickfixes.add(new Quickfix<>(CODE_ACTION_COMMAND_ID, d, fix));
}
}
diagnostics.add(d);
}
} catch (BadLocationException e) {
Log.warn("Invalid reconcile problem ignored", e);
}
}
};
// try {
// Thread.sleep(2000);
// } catch (InterruptedException e) {
// }
engine.reconcile(doc, problems);
}).onErrorResume(error -> {
Log.log(error);
return Mono.empty();
}).doFinally(ignore -> {
reconcileSession.complete(null);
// Log.debug("Reconciler DONE : "+this.busyReconcile.isDone());
}).subscribeOn(RECONCILER_SCHEDULER).subscribe();
}
use of org.eclipse.lsp4j.Diagnostic in project sts4 by spring-projects.
the class ConcourseEditorTest method reconcileUnusedResources.
@Test
public void reconcileUnusedResources() throws Exception {
Editor editor;
editor = harness.newEditor("resources:\n" + "- name: version\n" + " type: semver\n" + "- name: source-repo\n" + " type: git\n" + "jobs:\n" + "- name: build-it\n" + " plan:\n" + " - get: version\n");
Diagnostic p = editor.assertProblems("source-repo|Unused 'Resource'").get(0);
assertEquals(DiagnosticSeverity.Error, p.getSeverity());
editor = harness.newEditor("resources:\n" + "- name: not-used\n" + " type: pool\n" + "- name: version\n" + " type: semver\n" + "- name: source-repo\n" + " type: git\n" + " source:\n" + " branch: master\n" + " uri: git@someplace.com:blah/blah.git\n" + "jobs:\n" + "- name: build-it\n" + " plan:\n" + " - aggregate:\n" + // <-- This isn't a real use but looks like one!
" - get: not-used\n" + " resource: version\n" + " - put: source-repo\n");
editor.assertProblems("not-used|Unused 'Resource'");
}
use of org.eclipse.lsp4j.Diagnostic in project sts4 by spring-projects.
the class ConcourseEditorTest method addSingleRequiredPropertiesQuickfix.
@Test
public void addSingleRequiredPropertiesQuickfix() throws Exception {
Editor editor = harness.newEditor("resources:\n" + "- name: foo\n" + " source:\n" + " username: someone\n" + "# Confuse");
Diagnostic problem = editor.assertProblems("-|'type' is required", "foo|Unused").get(0);
CodeAction quickfix = editor.assertCodeAction(problem);
assertEquals("Add property 'type'", quickfix.getLabel());
quickfix.perform();
editor.assertText("resources:\n" + "- name: foo\n" + " source:\n" + " username: someone\n" + " type: <*>\n" + "# Confuse");
}
use of org.eclipse.lsp4j.Diagnostic in project sts4 by spring-projects.
the class ConcourseEditorTest method addMultipleRequiredPropertiesQuickfix.
@Test
public void addMultipleRequiredPropertiesQuickfix() throws Exception {
Editor editor = harness.newEditor("resources:\n" + "- name: foo\n" + " type: pool\n" + " source:\n" + " username: someone\n");
Diagnostic problem = editor.assertProblems("foo|Unused", "source|[branch, pool, uri] are required").get(1);
CodeAction quickfix = editor.assertCodeAction(problem);
assertEquals("Add properties: [branch, pool, uri]", quickfix.getLabel());
quickfix.perform();
editor.assertText("resources:\n" + "- name: foo\n" + " type: pool\n" + " source:\n" + " username: someone\n" + " uri: <*>\n" + " branch: \n" + " pool: \n");
}
use of org.eclipse.lsp4j.Diagnostic in project sts4 by spring-projects.
the class ConcourseEditorTest method resourceInEmbeddedTaskConfigDeprecated.
@Test
public void resourceInEmbeddedTaskConfigDeprecated() throws Exception {
Editor editor = harness.newEditor("resources:\n" + "- name: my-docker-image\n" + " type: docker-image\n" + " source:\n" + " username: {{docker_hub_username}}\n" + " password: {{docker_hub_password}}\n" + " repository: kdvolder/sts3-build-env\n" + "jobs:\n" + "- name: build-commons-update-site\n" + " plan:\n" + " - task: hello-world\n" + " image: my-docker-image\n" + " config:\n" + " rootfs_uri: blah\n" + " image_resource:\n" + " type: docker-image\n" + " inputs:\n" + " - name: commons-git\n" + " platform: linux\n" + " run:\n" + " path: which\n" + " args:\n" + " - mvn");
List<Diagnostic> problems = editor.assertProblems("rootfs_uri|Deprecated", "image_resource|Deprecated");
for (Diagnostic d : problems) {
assertEquals(DiagnosticSeverity.Warning, d.getSeverity());
}
}
Aggregations