diff --git a/headless-services/bosh-language-server/pom.xml b/headless-services/bosh-language-server/pom.xml index ad5bd9c6b..741a2b41b 100644 --- a/headless-services/bosh-language-server/pom.xml +++ b/headless-services/bosh-language-server/pom.xml @@ -18,6 +18,12 @@ + + + org.springframework.ide.vscode + commons-yaml + ${dependencies.version} + org.springframework.ide.vscode @@ -30,12 +36,6 @@ commons-language-server ${dependencies.version} - - - org.springframework.ide.vscode - commons-yaml - ${dependencies.version} - org.springframework.boot diff --git a/headless-services/commons/commons-yaml/pom.xml b/headless-services/commons/commons-yaml/pom.xml index b0bf82322..f2e0ca2b6 100644 --- a/headless-services/commons/commons-yaml/pom.xml +++ b/headless-services/commons/commons-yaml/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 commons-yaml @@ -13,6 +14,10 @@ + + org.yaml + snakeyaml + org.springframework.ide.vscode commons-util @@ -23,10 +28,6 @@ commons-language-server ${project.version} - - org.yaml - snakeyaml - javax.inject javax.inject diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java index 27095e559..ce637e116 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java @@ -40,13 +40,11 @@ public class YamlFileAST { private static final List> NO_CHILDREN = Collections.emptyList(); private final List nodes; - private final Set anchoredNodes; private final IDocument doc; - public YamlFileAST(IDocument doc, List nodes, Set anchoredNodes) { + public YamlFileAST(IDocument doc, List nodes) { this.doc = doc; this.nodes = nodes; - this.anchoredNodes = anchoredNodes; } public List> findPath(int offset) { @@ -173,7 +171,7 @@ public class YamlFileAST { public boolean isAnchored(NodeTuple entry) { if (entry!=null) { Node v = entry.getValueNode(); - return v!=null && anchoredNodes.contains(v); + return v!=null && v.getAnchor()!=null; } return false; } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java index 1fec1ae7e..b1834517c 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java @@ -11,22 +11,11 @@ package org.springframework.ide.vscode.commons.yaml.ast; -import java.io.Reader; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.function.BiConsumer; - import org.springframework.ide.vscode.commons.util.text.IDocument; -import org.springframework.ide.vscode.commons.yaml.util.AnchorTrackingComposer; -import org.yaml.snakeyaml.composer.Composer; +import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.nodes.Node; -import org.yaml.snakeyaml.parser.ParserImpl; -import org.yaml.snakeyaml.reader.StreamReader; -import org.yaml.snakeyaml.resolver.Resolver; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import javolution.io.CharSequenceReader; @@ -39,33 +28,8 @@ public class YamlParser implements YamlASTProvider { public YamlFileAST getAST(IDocument doc) throws Exception { CharSequenceReader reader = new CharSequenceReader(); reader.setInput(doc.get()); - ImmutableSet.Builder anchoredNodes = ImmutableSet.builder(); - ImmutableList nodes = composeAll(reader, (a, n) -> anchoredNodes.add(n)); - return new YamlFileAST(doc, nodes, anchoredNodes.build()); + Iterable nodes = new Yaml().composeAll(reader); + return new YamlFileAST(doc, ImmutableList.copyOf(nodes)); } - private ImmutableList composeAll(Reader yaml, BiConsumer anchorListener) { - Resolver resolver = new Resolver(); - AnchorTrackingComposer composer = new AnchorTrackingComposer(new ParserImpl(new StreamReader(yaml)), resolver, anchorListener); - ImmutableList.Builder nodes = ImmutableList.builder(); - while (composer.checkNode()) { - nodes.add(composer.getNode()); - } - return nodes.build(); - } - - private static class NodeIterable implements Iterable { - private Iterator iterator; - - public NodeIterable(Iterator iterator) { - this.iterator = iterator; - } - - @Override - public Iterator iterator() { - return iterator; - } - } - - } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/AnchorTrackingComposer.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/AnchorTrackingComposer.java deleted file mode 100644 index 87050518a..000000000 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/AnchorTrackingComposer.java +++ /dev/null @@ -1,233 +0,0 @@ -package org.springframework.ide.vscode.commons.yaml.util; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.BiConsumer; - -import org.yaml.snakeyaml.events.AliasEvent; -import org.yaml.snakeyaml.events.Event; -import org.yaml.snakeyaml.events.MappingStartEvent; -import org.yaml.snakeyaml.events.NodeEvent; -import org.yaml.snakeyaml.events.ScalarEvent; -import org.yaml.snakeyaml.events.SequenceStartEvent; -import org.yaml.snakeyaml.nodes.MappingNode; -import org.yaml.snakeyaml.nodes.Node; -import org.yaml.snakeyaml.nodes.NodeId; -import org.yaml.snakeyaml.nodes.NodeTuple; -import org.yaml.snakeyaml.nodes.ScalarNode; -import org.yaml.snakeyaml.nodes.SequenceNode; -import org.yaml.snakeyaml.nodes.Tag; -import org.yaml.snakeyaml.parser.Parser; -import org.yaml.snakeyaml.resolver.Resolver; - -/** - * Creates a node graph from parser events. - *

- * Corresponds to the 'Compose' step as described in chapter 3.1 of the - * YAML Specification. - *

- */ -public class AnchorTrackingComposer { - protected final Parser parser; - private final Resolver resolver; - private final Map _anchors; - private final Set recursiveNodes; - private BiConsumer anchorListener; - - public AnchorTrackingComposer(Parser parser, Resolver resolver, BiConsumer anchorListener) { - this.parser = parser; - this.resolver = resolver; - this._anchors = new HashMap(); - this.recursiveNodes = new HashSet(); - this.anchorListener = anchorListener; - } - - /** - * Checks if further documents are available. - * - * @return true if there is at least one more document. - */ - public boolean checkNode() { - // Drop the STREAM-START event. - if (parser.checkEvent(Event.ID.StreamStart)) { - parser.getEvent(); - } - // If there are more documents available? - return !parser.checkEvent(Event.ID.StreamEnd); - } - - /** - * Reads and composes the next document. - * - * @return The root node of the document or null if no more - * documents are available. - */ - public Node getNode() { - // Drop the DOCUMENT-START event. - parser.getEvent(); - // Compose the root node. - Node node = composeNode(null); - // Drop the DOCUMENT-END event. - parser.getEvent(); - this._anchors.clear(); - recursiveNodes.clear(); - return node; - } - - /** - * Reads a document from a source that contains only one document. - *

- * If the stream contains more than one document an exception is thrown. - *

- * - * @return The root node of the document or null if no document - * is available. - */ - public Node getSingleNode() { - // Drop the STREAM-START event. - parser.getEvent(); - // Compose a document if the stream is not empty. - Node document = null; - if (!parser.checkEvent(Event.ID.StreamEnd)) { - document = getNode(); - } - // Ensure that the stream contains no more documents. - if (!parser.checkEvent(Event.ID.StreamEnd)) { - Event event = parser.getEvent(); - throw new ComposerException("expected a single document in the stream", - document.getStartMark(), "but found another document", event.getStartMark()); - } - // Drop the STREAM-END event. - parser.getEvent(); - return document; - } - - private Node composeNode(Node parent) { - if (parent != null) recursiveNodes.add(parent); - final Node node; - if (parser.checkEvent(Event.ID.Alias)) { - AliasEvent event = (AliasEvent) parser.getEvent(); - String anchor = event.getAnchor(); - if (!_anchors.containsKey(anchor)) { - throw new ComposerException(null, null, "found undefined alias " + anchor, - event.getStartMark()); - } - node = _anchors.get(anchor); - if (recursiveNodes.remove(node)) { - node.setTwoStepsConstruction(true); - } - } else { - NodeEvent event = (NodeEvent) parser.peekEvent(); - String anchor = event.getAnchor(); - // the check for duplicate anchors has been removed (issue 174) - if (parser.checkEvent(Event.ID.Scalar)) { - node = composeScalarNode(anchor); - } else if (parser.checkEvent(Event.ID.SequenceStart)) { - node = composeSequenceNode(anchor); - } else { - node = composeMappingNode(anchor); - } - } - recursiveNodes.remove(parent); - return node; - } - - protected Node composeScalarNode(String anchor) { - ScalarEvent ev = (ScalarEvent) parser.getEvent(); - String tag = ev.getTag(); - boolean resolved = false; - Tag nodeTag; - if (tag == null || tag.equals("!")) { - nodeTag = resolver.resolve(NodeId.scalar, ev.getValue(), - ev.getImplicit().canOmitTagInPlainScalar()); - resolved = true; - } else { - nodeTag = new Tag(tag); - } - Node node = new ScalarNode(nodeTag, resolved, ev.getValue(), ev.getStartMark(), - ev.getEndMark(), ev.getScalarStyle()); - if (anchor != null) { - anchors_put(anchor, node); - } - return node; - } - - protected void anchors_put(String anchor, Node node) { - _anchors.put(anchor, node); - if (anchorListener!=null) { - anchorListener.accept(anchor, node); - } - } - - protected Node composeSequenceNode(String anchor) { - SequenceStartEvent startEvent = (SequenceStartEvent) parser.getEvent(); - String tag = startEvent.getTag(); - Tag nodeTag; - boolean resolved = false; - if (tag == null || tag.equals("!")) { - nodeTag = resolver.resolve(NodeId.sequence, null, startEvent.getImplicit()); - resolved = true; - } else { - nodeTag = new Tag(tag); - } - final ArrayList children = new ArrayList(); - SequenceNode node = new SequenceNode(nodeTag, resolved, children, startEvent.getStartMark(), - null, startEvent.getFlowStyle()); - if (anchor != null) { - anchors_put(anchor, node); - } - while (!parser.checkEvent(Event.ID.SequenceEnd)) { - children.add(composeNode(node)); - } - Event endEvent = parser.getEvent(); - node.setEndMark(endEvent.getEndMark()); - return node; - } - - protected Node composeMappingNode(String anchor) { - MappingStartEvent startEvent = (MappingStartEvent) parser.getEvent(); - String tag = startEvent.getTag(); - Tag nodeTag; - boolean resolved = false; - if (tag == null || tag.equals("!")) { - nodeTag = resolver.resolve(NodeId.mapping, null, startEvent.getImplicit()); - resolved = true; - } else { - nodeTag = new Tag(tag); - } - - final List children = new ArrayList(); - MappingNode node = new MappingNode(nodeTag, resolved, children, startEvent.getStartMark(), - null, startEvent.getFlowStyle()); - if (anchor != null) { - anchors_put(anchor, node); - } - while (!parser.checkEvent(Event.ID.MappingEnd)) { - composeMappingChildren(children, node); - } - Event endEvent = parser.getEvent(); - node.setEndMark(endEvent.getEndMark()); - return node; - } - - protected void composeMappingChildren(List children, MappingNode node) { - Node itemKey = composeKeyNode(node); - if (itemKey.getTag().equals(Tag.MERGE)) { - node.setMerged(true); - } - Node itemValue = composeValueNode(node); - children.add(new NodeTuple(itemKey, itemValue)); - } - - protected Node composeKeyNode(MappingNode node) { - return composeNode(node); - } - - protected Node composeValueNode(MappingNode node) { - return composeNode(node); - } -} diff --git a/headless-services/commons/pom.xml b/headless-services/commons/pom.xml index 9ba26a4bf..299a14ee4 100644 --- a/headless-services/commons/pom.xml +++ b/headless-services/commons/pom.xml @@ -17,6 +17,18 @@ + + + + + org.yaml + snakeyaml + 1.25-SNAPSHOT + + + + commons-language-server commons-lsp-extensions diff --git a/headless-services/concourse-language-server/.factorypath b/headless-services/concourse-language-server/.factorypath index 859fe7680..1b511bcf5 100644 --- a/headless-services/concourse-language-server/.factorypath +++ b/headless-services/concourse-language-server/.factorypath @@ -1,7 +1,20 @@ + + + + + + + + + + + + + + - @@ -20,19 +33,6 @@ - - - - - - - - - - - - - diff --git a/headless-services/concourse-language-server/pom.xml b/headless-services/concourse-language-server/pom.xml index 087f3b5e7..8508cb747 100644 --- a/headless-services/concourse-language-server/pom.xml +++ b/headless-services/concourse-language-server/pom.xml @@ -26,6 +26,12 @@ + + + org.springframework.ide.vscode + commons-yaml + ${dependencies.version} + org.springframework.boot @@ -38,12 +44,6 @@ language-server-starter ${dependencies.version} - - - org.springframework.ide.vscode - commons-yaml - ${dependencies.version} - org.kohsuke diff --git a/headless-services/manifest-yaml-language-server/pom.xml b/headless-services/manifest-yaml-language-server/pom.xml index 7aff612a2..a1dbec8eb 100644 --- a/headless-services/manifest-yaml-language-server/pom.xml +++ b/headless-services/manifest-yaml-language-server/pom.xml @@ -35,6 +35,12 @@ + + + org.springframework.ide.vscode + commons-yaml + ${dependencies.version} + org.springframework.ide.vscode @@ -47,12 +53,6 @@ commons-language-server ${dependencies.version} - - - org.springframework.ide.vscode - commons-yaml - ${dependencies.version} - io.projectreactor diff --git a/headless-services/spring-boot-language-server/.factorypath b/headless-services/spring-boot-language-server/.factorypath index 9fa3745cd..2564dc77c 100644 --- a/headless-services/spring-boot-language-server/.factorypath +++ b/headless-services/spring-boot-language-server/.factorypath @@ -1,4 +1,13 @@ + + + + + + + + + @@ -10,13 +19,6 @@ - - - - - - - @@ -67,8 +69,6 @@ - - diff --git a/headless-services/spring-boot-language-server/pom.xml b/headless-services/spring-boot-language-server/pom.xml index b0f1bdf06..fa9f9443f 100644 --- a/headless-services/spring-boot-language-server/pom.xml +++ b/headless-services/spring-boot-language-server/pom.xml @@ -34,6 +34,11 @@ + + org.springframework.ide.vscode + commons-yaml + ${dependencies.version} + org.springframework.ide.vscode @@ -72,11 +77,6 @@ commons-language-server ${dependencies.version} - - org.springframework.ide.vscode - commons-yaml - ${dependencies.version} - org.springframework.ide.vscode commons-boot-app-cli