Add quickfix for missing properties in concourse editor

This commit is contained in:
Kris De Volder
2017-04-11 17:08:03 -07:00
parent 7e2f6a6c9c
commit aee00fb487
40 changed files with 721 additions and 165 deletions

View File

@@ -18,7 +18,6 @@ import org.eclipse.lsp4j.DiagnosticSeverity;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.TextDocumentSyncKind;
import org.springframework.ide.vscode.commons.languageserver.LanguageIds;
import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngine;
import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter;
import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider;
import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter;
@@ -32,6 +31,7 @@ import org.springframework.ide.vscode.commons.yaml.ast.YamlASTProvider;
import org.springframework.ide.vscode.commons.yaml.completion.SchemaBasedYamlAssistContextProvider;
import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngine;
import org.springframework.ide.vscode.commons.yaml.hover.YamlHoverInfoProvider;
import org.springframework.ide.vscode.commons.yaml.reconcile.YamlQuickfixes;
import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaBasedReconcileEngine;
import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems;
import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema;
@@ -47,6 +47,7 @@ public class ConcourseLanguageServer extends SimpleLanguageServer {
YamlASTProvider currentAsts = models.getAstProvider(false);
private SchemaSpecificPieces forPipelines;
private SchemaSpecificPieces forTasks;
private final YamlQuickfixes yamlQuickfixes;
private class SchemaSpecificPieces {
@@ -62,7 +63,7 @@ public class ConcourseLanguageServer extends SimpleLanguageServer {
HoverInfoProvider infoProvider = new YamlHoverInfoProvider(currentAsts, structureProvider, contextProvider);
this.hoverEngine = new VscodeHoverEngineAdapter(ConcourseLanguageServer.this, infoProvider);
this.reconcileEngine = new YamlSchemaBasedReconcileEngine(currentAsts, schema);
this.reconcileEngine = new YamlSchemaBasedReconcileEngine(currentAsts, schema, yamlQuickfixes);
reconcileEngine.setTypeCollector(models.getAstTypeCache());
}
@@ -73,6 +74,7 @@ public class ConcourseLanguageServer extends SimpleLanguageServer {
public ConcourseLanguageServer() {
PipelineYmlSchema pipelineSchema = new PipelineYmlSchema(models);
this.yamlQuickfixes = new YamlQuickfixes(getQuickfixRegistry(), documents, structureProvider);
this.forPipelines = new SchemaSpecificPieces(pipelineSchema);
this.forTasks = new SchemaSpecificPieces(pipelineSchema.getTaskSchema());
@@ -158,6 +160,8 @@ public class ConcourseLanguageServer extends SimpleLanguageServer {
c.setDefinitionProvider(true);
c.setCodeActionProvider(true);
return c;
}

View File

@@ -13,6 +13,8 @@ package org.springframework.ide.vscode.concourse;
import java.util.function.Function;
import org.springframework.ide.vscode.commons.util.RegexpParser;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.ValueParseException;
import org.springframework.ide.vscode.commons.util.ValueParser;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.yaml.schema.SchemaContextAware;
@@ -53,13 +55,24 @@ public class ConcourseValueParsers {
public static SchemaContextAware<ValueParser> acceptOnlyUniqueNames(
Function<IDocument, Multiset<String>> getDefinedNameCounts,
String typeName
) {
return acceptOnlyUniqueNames(getDefinedNameCounts, typeName, false);
}
public static SchemaContextAware<ValueParser> acceptOnlyUniqueNames(
Function<IDocument, Multiset<String>> getDefinedNameCounts,
String typeName,
boolean allowEmptyName
) {
return (dc) -> {
Multiset<String> resourceNames = getDefinedNameCounts.apply(dc.getDocument());
return (String input) -> {
if (!allowEmptyName && !StringUtil.hasText(input)) {
throw new ValueParseException("'"+typeName +"' should not be blank");
}
Multiset<String> resourceNames = getDefinedNameCounts.apply(dc.getDocument());
if (resourceNames.count(input)<=1) {
//okay
return resourceNames;
return input;
}
throw new IllegalArgumentException("Duplicate "+typeName+" '"+input+"'");
};