diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java index 175135de9..14930d2e4 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java @@ -76,7 +76,7 @@ public class YamlStructureParser { * Pattern that matches a line starting with a 'simple key' */ public static final Pattern SIMPLE_KEY_LINE = Pattern.compile( - "^(\\w(\\.|\\w|-)*):( .*|$)"); + "^((\\w(\\.|\\w|-)*)|(\\'(\\.|\\w|-|\\[|\\])*\\')):( .*|$)"); //TODO: the parrern above is too selective (e.g. in real yaml one can have //spaces in simple keys and lots of other characters that this pattern does not //allow. For now it is good enough because we are only interested in spring property diff --git a/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/YamlStructureParserTest.java b/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/YamlStructureParserTest.java index 50fcad0c1..c14dfc551 100644 --- a/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/YamlStructureParserTest.java +++ b/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/YamlStructureParserTest.java @@ -33,6 +33,39 @@ import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser public class YamlStructureParserTest { + @Test public void escapedStringKey() throws Exception { + MockYamlEditor editor; + + editor = new MockYamlEditor( + "my:\n" + + " map:\n"+ + " foobar:\n" + + " name: jeff" + ); + assertParseOneDoc(editor, + "DOC(0): ", + " KEY(0): my:", + " KEY(2): map:", + " KEY(4): foobar:", + " KEY(6): name: jeff" + ); + + editor = new MockYamlEditor( + "my:\n" + + " map:\n"+ + " '[foo.bar]':\n" + + " name: jeff" + ); + assertParseOneDoc(editor, + "DOC(0): ", + " KEY(0): my:", + " KEY(2): map:", + " KEY(4): '[foo.bar]':", + " KEY(6): name: jeff" + ); + + } + @Test public void ignoreLeadingYamlCruftBeforeLeadingDocumentSeparator() throws Exception { String[] stuffToIgnore = { "#comment", diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java index 48d3a602b..c40512b25 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java @@ -90,6 +90,46 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { //////////////////////////////////////////////////////////////////////////////////////// + + @Test public void test_GH_534() throws Exception { + //See: https://www.pivotaltracker.com/n/projects/1346850/stories/174872660 + IJavaProject p = createPredefinedMavenProject("map-of-pojo"); + useProject(p); + data("my.props", "java.util.Properties", null, "Properties in java.util.Properties"); + data("my.arr", "java.lang.String[]", null, "Array"); + + Editor editor = newEditor( + "my:\n" + + " arr:\n" + + " index: something\n" + + " props:\n" + + " '[foo.bar]': something\n" + + " map:\n" + + " '[foo.bar]':\n" + + " name: Freddy\n" + + " age: the-age\n" + + " bad: 123" + ); + editor.assertProblems( + "index|'int'", + "the-age|'int'", + "bad|Person" + ); + + //Also check if completion engine understands the convention + editor = newEditor( + "my:\n" + + " map:\n"+ + " '[foo.bar]':\n" + + " <*>" + ); + editor.assertContextualCompletions("<*>", + // ==> + "age: <*>", + "name: <*>" + ); + } + @Test public void handleAsKey() throws Exception { //See: https://www.pivotaltracker.com/story/show/174954118 useProject(createPredefinedMavenProject("justauth-example"));