diff --git a/eclipse-language-servers/org.springframework.tooling.boot.java.ls/.project b/eclipse-language-servers/org.springframework.tooling.boot.java.ls/.project new file mode 100644 index 000000000..17dc13dae --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.boot.java.ls/.project @@ -0,0 +1,28 @@ + + + org.springframework.tooling.boot.java.ls + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/eclipse-language-servers/org.springframework.tooling.properties.ls/.project b/eclipse-language-servers/org.springframework.tooling.properties.ls/.project new file mode 100644 index 000000000..f455d5529 --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.properties.ls/.project @@ -0,0 +1,28 @@ + + + org.springframework.tooling.properties.ls + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java index e4fb52e18..fb37add51 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java @@ -27,10 +27,10 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeParser; import org.springframework.ide.vscode.boot.metadata.types.TypeUtil; import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode; import org.springframework.ide.vscode.boot.properties.reconcile.PropertyNavigator; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.CollectionUtil; import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -69,7 +69,7 @@ public class CommonLanguageTools { public static Collection getValueHints(FuzzyMap index, TypeUtil typeUtil, String query, String propertyName, EnumCaseMode caseMode) { Type type = getValueType(index, typeUtil, propertyName); - if (TypeUtil.isArray(type) || TypeUtil.isList(type)) { + if (TypeUtil.isSequencable(type)) { //It is useful to provide content assist for the values in the list when entering a list type = TypeUtil.getDomainType(type); } diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java index 60823e48b..3878448ad 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java @@ -26,9 +26,9 @@ import org.eclipse.lsp4j.SymbolKind; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.boot.java.utils.ASTUtils; import org.springframework.ide.vscode.boot.java.utils.FunctionUtils; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java index 40ed758bd..b50524866 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java @@ -20,9 +20,9 @@ import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolKind; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.boot.java.utils.ASTUtils; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java index 6512b57e4..dcd1fef7d 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java @@ -37,10 +37,10 @@ import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.TextDocument; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java index 53052c42c..8c8694c91 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java @@ -33,9 +33,9 @@ import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBean; import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.StringUtil; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java index 0e3fa7755..0e2d5c584 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java @@ -17,8 +17,8 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import com.google.common.base.Supplier; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java index 7f2c9ec7b..2280851a0 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java @@ -15,8 +15,8 @@ import java.util.regex.Pattern; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.IndentUtil; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import com.google.common.base.Supplier; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java index bf3eb74c2..f7214a88c 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java @@ -17,10 +17,10 @@ import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.boot.java.jdt.imports.ImportRewrite; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder; import org.springframework.ide.vscode.commons.util.Renderable; import org.springframework.ide.vscode.commons.util.Renderables; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import com.google.common.base.Supplier; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java index ed6f7fdc8..bbfd6d5bc 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java @@ -17,10 +17,10 @@ import java.util.List; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder; import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import com.google.common.base.Supplier; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java index 96f9172e5..c7394b8e2 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java @@ -31,9 +31,9 @@ import org.eclipse.jdt.core.dom.SingleMemberAnnotation; import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.lsp4j.Range; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.CollectorUtil; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java index 223eed5e9..6314795ad 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java @@ -18,7 +18,7 @@ import java.util.function.Supplier; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; import reactor.util.function.Tuple3; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/DelimitedStringParser.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/DelimitedStringParser.java new file mode 100644 index 000000000..0dc8a4405 --- /dev/null +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/DelimitedStringParser.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.metadata.types; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.springframework.ide.vscode.commons.util.ExceptionUtil; +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 com.google.common.collect.ImmutableList; + +/** + * Parser that is capable of parsing comma-separated lists. The parser + * is constructed from another parser which is used to parse the elements. + */ +public class DelimitedStringParser implements ValueParser { + + private static final Pattern COMMA = Pattern.compile("(\\s)*\\,(\\s)*");; + private Pattern SEPARATOR = COMMA; + + private ValueParser elementParser; + + public DelimitedStringParser(ValueParser elementParser) { + super(); + this.elementParser = elementParser; + } + + @Override + public Object parse(String str) throws Exception { + if (!StringUtil.hasText(str)) { + return ImmutableList.of(); + } + int offset = 0; + Matcher matcher = SEPARATOR.matcher(str); + ArrayList parsed = new ArrayList<>(); + while (matcher.find()) { + parseOne(str, offset, matcher.start(), parsed); + offset = matcher.end(); + } + //parse last piece too! + parseOne(str, offset, str.length(), parsed); + return parsed; + } + + private void parseOne(String input, int start, int end, ArrayList parsed) throws Exception { + String piece = input.substring(start, end); + try { + Object parsedPiece = elementParser.parse(piece); + parsed.add(parsedPiece); + } catch (Exception e) { + if (e instanceof ValueParseException) { + ((ValueParseException) e).adjustHighlight(start, end, piece); + } else { + e = new ValueParseException(ExceptionUtil.getMessage(e), start, end, piece); + } + throw e; + } + } + +} diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java index 7e2635f14..f8ba0024e 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java @@ -254,6 +254,17 @@ public class TypeUtil { // provide a parser that allows throws return new AlwaysFailingParser(niceTypeName(type)); } + if (isSequencable(type)) { + //Trying to parse list from scalars is possible if the domain type is parseable. Spring boot + // will try to interpret the string as a comma-separated list + Type elType = getDomainType(type); + if (elType!=null) { + ValueParser elParser = getValueParser(elType); + if (elParser!=null) { + return new DelimitedStringParser(elParser); + } + } + } return null; } @@ -418,11 +429,13 @@ public class TypeUtil { //However... //Seems that in Boot 1.3 arrays are now 'Bracketable' and funcion much equivalnt to list (even including 'autogrowing' them). //This is actually more logical too. - //So '[' notation in props file can be used for either list or arrays (at leats in recent versions of boot). - return isArray(type) || isList(type); + //So '[' notation in props file can be used for either list or arrays (at least in recent versions of boot). + //Note also 'Set' are now considered bracketable. See: https://www.pivotaltracker.com/story/show/154644992 + return isArray(type) || isCollection(List.class, type) || isCollection(Set.class, type); } - public static boolean isList(Type type) { + @SuppressWarnings("rawtypes") + private static boolean isCollection( Class klass, Type type) { //Note: to be really correct we should use JDT infrastructure to resolve //type in project classpath instead of using Java reflection. //However, use reflection here is okay assuming types we care about @@ -432,7 +445,7 @@ public class TypeUtil { String erasure = type.getErasure(); try { Class erasureClass = Class.forName(erasure); - return List.class.isAssignableFrom(erasureClass); + return klass.isAssignableFrom(erasureClass); } catch (Exception e) { //type not resolveable assume its not 'array like' } @@ -444,10 +457,10 @@ public class TypeUtil { * Check if type can be treated / represented as a sequence node in .yml file */ public static boolean isSequencable(Type type) { - return isList(type) || isArray(type); + return isBracketable(type); } - public static boolean isArray(Type type) { + private static boolean isArray(Type type) { return type!=null && type.getErasure().endsWith("[]"); } @@ -518,12 +531,10 @@ public class TypeUtil { public boolean isAssignableType(Type type) { return ASSIGNABLE_TYPES.contains(type.getErasure()) || isEnum(type) - || isAssignableList(type); + || isAssignableCollection(type); } - private boolean isAssignableList(Type type) { - //TODO: isBracketable means 'isList' right now, but this may not be - // the case in the future. + private boolean isAssignableCollection(Type type) { if (isBracketable(type)) { Type domainType = getDomainType(type); return isAtomic(domainType); diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java index 7ca069404..f365aa12a 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java @@ -39,7 +39,6 @@ import org.springframework.ide.vscode.boot.properties.reconcile.PropertyNavigato import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.completion.LazyProposalApplier; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.CollectionUtil; @@ -47,6 +46,7 @@ import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.FuzzyMap.Match; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser; import org.springframework.ide.vscode.java.properties.parser.ParseResults; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java index 5cf64c59e..e6840dd3e 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java @@ -30,10 +30,10 @@ import org.springframework.ide.vscode.boot.metadata.types.Type; import org.springframework.ide.vscode.boot.metadata.types.TypeUtil; import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.IRegion; import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser; @@ -103,7 +103,7 @@ class PropertiesHoverCalculator { String valueString = valueRegion.toString(); String propertyName = value.getParent().getKey().decode(); Type type = getValueType(index, typeUtil, propertyName); - if (TypeUtil.isArray(type) || TypeUtil.isList(type)) { + if (TypeUtil.isSequencable(type)) { //It is useful to provide content assist for the values in the list when entering a list type = TypeUtil.getDomainType(type); } diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/DelimitedListReconciler.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/DelimitedListReconciler.java deleted file mode 100644 index 8af2673b6..000000000 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/DelimitedListReconciler.java +++ /dev/null @@ -1,63 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016-2017 Pivotal, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Pivotal, Inc. - initial API and implementation - *******************************************************************************/ - -package org.springframework.ide.vscode.boot.properties.reconcile; - -import java.util.Arrays; -import java.util.regex.Pattern; - -import org.springframework.ide.vscode.boot.metadata.types.Type; -import org.springframework.ide.vscode.boot.metadata.types.TypeUtil; -import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; - -/** - * Helper class to reconcile text contained in a document region as a comma-separated list. - * - * @author Kris De Volder - */ -public class DelimitedListReconciler { - - interface TypeBasedReconciler { - void reconcile(DocumentRegion region, Type expectType, IProblemCollector problems); - } - - private final TypeBasedReconciler valueReconciler; - private final Pattern delimiter; - - public DelimitedListReconciler(Pattern delimiter, TypeBasedReconciler valueReconciler) { - this.valueReconciler = valueReconciler; - this.delimiter = delimiter; - } - - public void reconcile(DocumentRegion region, Type listType, IProblemCollector problems) { - Type elType = getElementType(listType); - //Its pointless to reconcile list of we can't determine value type. - if (elType!=null) { - Arrays.stream(region.split(delimiter)).forEach(entry -> { - valueReconciler.reconcile(entry, elType, problems); - }); - } - } - - private Type getElementType(Type listType) { - Type elType = TypeUtil.getDomainType(listType); - if (elType!=null) { - Type nestedElType = getElementType(elType); - if (nestedElType!=null) { - return nestedElType; - } - return elType; - } - return null; - } - -} diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/DuplicateNameChecker.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/DuplicateNameChecker.java index 7da36d745..0941b6f8f 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/DuplicateNameChecker.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/DuplicateNameChecker.java @@ -18,7 +18,7 @@ import java.util.HashMap; import java.util.Map; import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.java.properties.parser.PropertiesFileEscapes; /** diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/PropertyNavigator.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/PropertyNavigator.java index 463d44549..432ea3b17 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/PropertyNavigator.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/PropertyNavigator.java @@ -23,10 +23,10 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.BeanPropertyN import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode; import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.StringUtil; import org.springframework.ide.vscode.commons.util.ValueParser; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; /** diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertiesReconcileEngine.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertiesReconcileEngine.java index 3fe538e4b..7eeff9ac6 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertiesReconcileEngine.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertiesReconcileEngine.java @@ -27,11 +27,13 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeUtil; import org.springframework.ide.vscode.boot.metadata.types.TypeUtilProvider; import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.BadLocationException; +import org.springframework.ide.vscode.commons.util.ExceptionUtil; import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.ValueParseException; import org.springframework.ide.vscode.commons.util.ValueParser; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser; import org.springframework.ide.vscode.java.properties.parser.ParseResults; @@ -64,7 +66,6 @@ public class SpringPropertiesReconcileEngine implements IReconcileEngine { private SpringPropertyIndexProvider fIndexProvider; private TypeUtilProvider typeUtilProvider; - private final DelimitedListReconciler commaListReconciler = new DelimitedListReconciler(COMMA, this::reconcileType); private Parser parser = new AntlrParser(); public SpringPropertiesReconcileEngine(SpringPropertyIndexProvider provider, TypeUtilProvider typeUtilProvider) { @@ -171,23 +172,26 @@ public class SpringPropertiesReconcileEngine implements IReconcileEngine { return new DocumentRegion(doc, value.getOffset(), value.getOffset() + length); } - private void reconcileType(DocumentRegion region, Type expectType, IProblemCollector problems) { - TypeUtil typeUtil = typeUtilProvider.getTypeUtil(region.getDocument()); + private void reconcileType(DocumentRegion escapedValue, Type expectType, IProblemCollector problems) { + TypeUtil typeUtil = typeUtilProvider.getTypeUtil(escapedValue.getDocument()); ValueParser parser = typeUtil.getValueParser(expectType); if (parser!=null) { try { - String valueStr = PropertiesFileEscapes.unescape(region.toString()); + String valueStr = PropertiesFileEscapes.unescape(escapedValue.toString()); if (!valueStr.contains("${")) { //Don't check strings that look like they use variable substitution. parser.parse(valueStr); } + } catch (ValueParseException e) { + problems.accept(problem(ApplicationPropertiesProblemType.PROP_VALUE_TYPE_MISMATCH, + ExceptionUtil.getMessage(e), + e.getHighlightRegion(escapedValue))); + } catch (Exception e) { problems.accept(problem(ApplicationPropertiesProblemType.PROP_VALUE_TYPE_MISMATCH, "Expecting '"+typeUtil.niceTypeName(expectType)+"'", - region)); + escapedValue)); } - } else if (TypeUtil.isList(expectType)||TypeUtil.isArray(expectType)) { - commaListReconciler.reconcile(region, expectType, problems); } } diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertyProblem.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertyProblem.java index 358483861..da1c21138 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertyProblem.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/reconcile/SpringPropertyProblem.java @@ -15,7 +15,7 @@ import org.springframework.ide.vscode.boot.metadata.PropertyInfo; //import org.springframework.ide.vscode.commons.languageserver.quickfix.ProblemFixer; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; // TODO: Move to a common project shared between YAML and Properties diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java index 432d33a18..8696654d9 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java @@ -41,10 +41,10 @@ import org.springframework.ide.vscode.commons.languageserver.completion.Document import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.completion.LazyProposalApplier; import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.CollectionUtil; import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.FuzzyMap.Match; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.Renderable; diff --git a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java index 2b23be7eb..677fad81c 100644 --- a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java +++ b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java @@ -1180,7 +1180,7 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { "test-map.test-list-object.color-list[2]=GREEN\n" ); editor.assertProblems( - "not-a-color|Expecting 'com.wellsfargo.lendingplatform.web.config.Color" + "not-a-color|com.wellsfargo.lendingplatform.web.config.Color" ); editor = newEditor( @@ -1402,21 +1402,37 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { } @Test public void testCommaListReconcile() throws Exception { + doCommaCollectionReconcileTest("java.util.List"); + } + + @Test public void testCommaSetReconcile() throws Exception { + doCommaCollectionReconcileTest("java.util.Set"); + } + + private void doCommaCollectionReconcileTest(String collectionType) throws Exception { Editor editor; IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app"); useProject(p); assertNotNull(p.getClasspath().findType("demo.Color")); - data("my.colors", "java.util.List", null, "Ooh! nice colors!"); + data("my.colors", collectionType+"", null, "Ooh! nice colors!"); -// editor = newEditor( -// "#comment\n" + -// "my.colors=RED, green, not-a-color , BLUE" -// ); -// editor.assertProblems( -// "not-a-color|demo.Color" -// ); + editor = newEditor( + "#comment\n" + + "my.colors=RED, green, not-a-color , BLUE" + ); + editor.assertProblems( + "not-a-color|demo.Color" + ); + + editor = newEditor( + "my.colors=\\\n" + + " red , \\\n" + + " green,\\\n" + + " bad\n" + ); + editor.assertProblems( "bad|demo.Color"); editor = newEditor( "my.colors=\\\n" + @@ -1442,14 +1458,6 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { ); editor.assertProblems( "bad|demo.Color"); - editor = newEditor( - "my.colors=\\\n" + - " red , \\\n" + - " green,\\\n" + - " bad\n" - ); - editor.assertProblems( "bad|demo.Color"); - editor = newEditor( "my.colors=\\\n" + " red , \\\n" + @@ -1589,6 +1597,28 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { editor.assertHoverExactText("debug", "**debug** \n[java.lang.String](null)"); } + @Test public void testSetOfEnumsCompletions() throws Exception { + useProject(createPredefinedMavenProject("enums-boot-1.3.2-app")); + data("my.color-set", "java.util.Set", null, "Set of colors that can be used."); + + assertCompletions("my.colos<*>", + "my.color-set=<*>" + ); + assertCompletions("my.color-set=<*>", + "my.color-set=blue<*>", + "my.color-set=green<*>", + "my.color-set=red<*>" + ); + assertCompletions("my.color-set=B<*>", + "my.color-set=BLUE<*>" + ); + assertCompletions("my.color-set=red,B<*>", + "my.color-set=red,BLUE<*>" + ); + } + + ////////////// harness code below ///////////////////////// + @Override protected SimpleLanguageServer newLanguageServer() { ComposableLanguageServer server = BootLanguageServer.create( diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/IndentUtil.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/IndentUtil.java index 64bad92eb..ff24c9428 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/IndentUtil.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/IndentUtil.java @@ -10,8 +10,8 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.languageserver.completion; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.Assert; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.IRegion; diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/SimpleCompletionFactory.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/SimpleCompletionFactory.java index cced6fd95..17c8aec4f 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/SimpleCompletionFactory.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/SimpleCompletionFactory.java @@ -11,8 +11,8 @@ package org.springframework.ide.vscode.commons.languageserver.completion; import org.eclipse.lsp4j.CompletionItemKind; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; public class SimpleCompletionFactory { diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java index 76fa061ec..0dda269f5 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/ReconcileProblemImpl.java @@ -15,7 +15,7 @@ import java.util.ArrayList; import java.util.List; import org.springframework.ide.vscode.commons.languageserver.quickfix.Quickfix.QuickfixData; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; /** * An implementation of {@link ReconcileProblem} that is just a simple data object. diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/PrefixFinder.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/PrefixFinder.java index 9674f0041..f2ce8414a 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/PrefixFinder.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/PrefixFinder.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.commons.languageserver.util; import org.springframework.ide.vscode.commons.util.BadLocationException; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; public abstract class PrefixFinder { diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ExceptionUtil.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ExceptionUtil.java index d12fcefb4..97d405bee 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ExceptionUtil.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ExceptionUtil.java @@ -78,12 +78,12 @@ public class ExceptionUtil { // The message of nested exception is usually more interesting than the // one on top. Throwable cause = getDeepestCause(e); - if (cause != null) { - String msg = getSimpleError(cause) + ": " + cause.getMessage(); + String errorType = cause.getClass().getSimpleName(); + String msg = cause.getMessage(); + if (ValueParseException.class.isInstance(cause) && msg!=null) { return msg; - } else { - return "An error occurred: " + getSimpleError(e); } + return errorType + ": " + msg; } public static String getMessageNoAppendedInformation(Throwable e) { diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ValueParseException.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ValueParseException.java index 8e4d0ffaf..1b75c8e7b 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ValueParseException.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/ValueParseException.java @@ -1,15 +1,17 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Spring IDE Developers * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Pivotal, Inc. - initial API and implementation + * Spring IDE Developers - initial API and implementation *******************************************************************************/ package org.springframework.ide.vscode.commons.util; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; + /** * Exception if there is a failure when parsing a value. It does not wrap * other exceptions such that when thrown, the parse exception is the "deepest" @@ -20,16 +22,22 @@ public class ValueParseException extends Exception { private int startIndex = -1; private int endIndex = -1; - + private String highightString; + /** - * + * */ private static final long serialVersionUID = 1L; - + public ValueParseException(String message) { super(message); } - + + public ValueParseException(String message, int startIndex, int endIndex, String highlightString) { + this(message, startIndex, endIndex); + this.highightString = highlightString; + } + public ValueParseException(String message, int startIndex, int endIndex) { this(message); this.startIndex = startIndex; @@ -44,4 +52,42 @@ public class ValueParseException extends Exception { return endIndex; } + public DocumentRegion getHighlightRegion(DocumentRegion containingRegion) { + int start = startIndex>=0 ? startIndex : 0; + int end = endIndex>=0 ? endIndex : containingRegion.length(); + if (highightString!=null) { + //Make a 'best effort' adjusting start and end to highlight the correct string, + // even if positions are screwy because of handling escape sequences before parsing. + String actualHighlight = containingRegion.subSequence(start, end).toString(); + if (!actualHighlight.equals(highightString)) { + String containingString = containingRegion.toString(); + //Search 'close' to start position first + int found = containingString.indexOf(highightString, start); + if (found>=0) { + return containingRegion.subSequence(found, found+highightString.length()); + } + //Second... search whole string + found = containingString.indexOf(highightString); + if (found>=0) { + return containingRegion.subSequence(found, found+highightString.length()); + } + //Give up, couldn't find the highlight string... highlight everything + return containingRegion; + } + } + return containingRegion.subSequence(start, end); + } + + public void adjustHighlight(int start, int end, String piece) { + if (this.highightString==null || this.highightString.length()>piece.length()) { + this.highightString = piece; + } + if (this.startIndex>=0) { + this.startIndex += start; + } else { + this.startIndex = start; + } + this.endIndex = this.startIndex+this.highightString.length(); + } + } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentRegion.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/DocumentRegion.java similarity index 97% rename from headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentRegion.java rename to headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/DocumentRegion.java index 915732199..015bb237f 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentRegion.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/DocumentRegion.java @@ -9,7 +9,7 @@ * Pivotal, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.commons.languageserver.util; +package org.springframework.ide.vscode.commons.util.text; import java.util.ArrayList; import java.util.List; @@ -19,9 +19,6 @@ import java.util.regex.Pattern; import org.eclipse.lsp4j.Range; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.BadLocationException; -import org.springframework.ide.vscode.commons.util.text.IDocument; -import org.springframework.ide.vscode.commons.util.text.IRegion; -import org.springframework.ide.vscode.commons.util.text.Region; /** * A non-sucky alternative to {@link IRegion}. Represents a region of text in a document. diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentUtil.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/DocumentUtil.java similarity index 92% rename from headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentUtil.java rename to headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/DocumentUtil.java index ff3140ebf..4e8aef546 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentUtil.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/DocumentUtil.java @@ -9,11 +9,10 @@ * Pivotal, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.commons.languageserver.util; +package org.springframework.ide.vscode.commons.util.text; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.BadLocationException; -import org.springframework.ide.vscode.commons.util.text.IDocument; public class DocumentUtil { diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/NodeUtil.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/NodeUtil.java index 43d12b476..1ab1fecc2 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/NodeUtil.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/NodeUtil.java @@ -14,7 +14,7 @@ package org.springframework.ide.vscode.commons.yaml.ast; import java.util.Collections; import java.util.Set; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/AbstractYamlAssistContext.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/AbstractYamlAssistContext.java index af771b00e..3e775681e 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/AbstractYamlAssistContext.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/AbstractYamlAssistContext.java @@ -10,9 +10,9 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.yaml.completion; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder; import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.path.YamlPath; import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SDocNode; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/TopLevelAssistContext.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/TopLevelAssistContext.java index 1cb7f7daf..a37a4f466 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/TopLevelAssistContext.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/TopLevelAssistContext.java @@ -14,8 +14,8 @@ import java.util.Collection; import java.util.Collections; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.path.YamlPathSegment; import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SNode; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java index f0a801180..b933cf9ac 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java @@ -26,7 +26,6 @@ import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.CollectionUtil; import org.springframework.ide.vscode.commons.util.ExceptionUtil; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; @@ -34,6 +33,7 @@ import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.PartialCollection; import org.springframework.ide.vscode.commons.util.Renderable; import org.springframework.ide.vscode.commons.util.ValueParseException; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.completion.DefaultCompletionFactory.ValueProposal; import org.springframework.ide.vscode.commons.yaml.hover.YPropertyInfoTemplates; import org.springframework.ide.vscode.commons.yaml.path.YamlPath; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlAssistContext.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlAssistContext.java index 68e306059..f0f194893 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlAssistContext.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlAssistContext.java @@ -13,8 +13,8 @@ package org.springframework.ide.vscode.commons.yaml.completion; import java.util.Collection; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.path.YamlNavigable; import org.springframework.ide.vscode.commons.yaml.path.YamlPathSegment; import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java index f213f8573..3c5643647 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java @@ -26,10 +26,10 @@ import org.springframework.ide.vscode.commons.languageserver.completion.Document import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.Unicodes; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.commons.yaml.path.YamlPath; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YamlHoverInfoProvider.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YamlHoverInfoProvider.java index 9b1e811c5..91584a85d 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YamlHoverInfoProvider.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YamlHoverInfoProvider.java @@ -13,9 +13,9 @@ package org.springframework.ide.vscode.commons.yaml.hover; import java.util.List; import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.IRegion; import org.springframework.ide.vscode.commons.util.text.Region; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/ReplaceStringData.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/ReplaceStringData.java index da2c1cccc..43ff173d2 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/ReplaceStringData.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/ReplaceStringData.java @@ -11,8 +11,8 @@ package org.springframework.ide.vscode.commons.yaml.reconcile; import org.eclipse.lsp4j.TextEdit; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.BadLocationException; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; public class ReplaceStringData { diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java index 6a70e86c1..9e798d42d 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java @@ -30,7 +30,6 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTy import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileException; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReplacementQuickfix; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder; import org.springframework.ide.vscode.commons.util.CollectorUtil; import org.springframework.ide.vscode.commons.util.ExceptionUtil; @@ -39,6 +38,7 @@ import org.springframework.ide.vscode.commons.util.Log; 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.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.yaml.ast.NodeUtil; import org.springframework.ide.vscode.commons.yaml.ast.YamlFileAST; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java index e4ab8e752..92e952a83 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java @@ -19,12 +19,12 @@ import org.eclipse.lsp4j.DocumentSymbolParams; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolKind; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.commons.yaml.ast.NodeUtil; import org.springframework.ide.vscode.commons.yaml.schema.YType; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java index 045a04e88..81833a114 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java @@ -22,9 +22,9 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTy import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTypes; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.CollectionUtil; import org.springframework.ide.vscode.commons.util.CollectorUtil; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.yaml.ast.NodeUtil; import org.springframework.ide.vscode.commons.yaml.path.YamlPath; diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/ISubCompletionEngine.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/ISubCompletionEngine.java index e9c59fb79..63a854e66 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/ISubCompletionEngine.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/ISubCompletionEngine.java @@ -14,7 +14,7 @@ import java.util.List; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.completion.CompletionFactory; /** diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlDocument.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlDocument.java index cf01d4412..4b2034849 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlDocument.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlDocument.java @@ -10,8 +10,8 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.yaml.structure; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentUtil; import org.springframework.ide.vscode.commons.util.BadLocationException; +import org.springframework.ide.vscode.commons.util.text.DocumentUtil; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.IRegion; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SRootNode; diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubRepoContentAssistant.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubRepoContentAssistant.java index bbc64b107..284022626 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubRepoContentAssistant.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubRepoContentAssistant.java @@ -17,9 +17,9 @@ import java.util.List; import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.completion.SimpleCompletionFactory; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.ExceptionUtil; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.completion.CompletionFactory; import org.springframework.ide.vscode.commons.yaml.schema.ISubCompletionEngine; diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubValueParsers.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubValueParsers.java index 063306929..6f0c95837 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubValueParsers.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/github/GithubValueParsers.java @@ -13,9 +13,9 @@ package org.springframework.ide.vscode.concourse.github; import java.util.Collection; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileException; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.ValueParseException; import org.springframework.ide.vscode.commons.util.ValueParser; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.concourse.PipelineYmlSchemaProblems; diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/RouteContentAssistant.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/RouteContentAssistant.java index 5422d892d..cf0878271 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/RouteContentAssistant.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/RouteContentAssistant.java @@ -19,9 +19,9 @@ import java.util.regex.Pattern; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.completion.CompletionFactory; import org.springframework.ide.vscode.commons.yaml.schema.ISubCompletionEngine; import org.springframework.ide.vscode.commons.yaml.schema.YValueHint;