From 06aef68b753bcbd8225bbc3331a3f741f36ac04a Mon Sep 17 00:00:00 2001 From: llibarona Date: Mon, 11 Mar 2019 15:41:19 -0300 Subject: [PATCH] ALS-732: Array value suggestions won't force brackets for single value arrays --- .../KnownPropertyValuesCompletionPlugin.scala | 12 ++--- .../TemplateReferencesCompletionPlugin.scala | 52 ++++++++++++------- .../raml10/jira-tests/als-732/test01.raml | 14 +++++ .../raml10/jira-tests/als-732/test02.raml | 14 +++++ .../raml10/jira-tests/als-732/test03.raml | 14 +++++ .../raml10/jira-tests/als-732/test04.raml | 16 ++++++ .../raml10/jira-tests/als-732/test05.raml | 14 +++++ .../test/raml10/JiraSuggestionsTests.scala | 21 ++++++++ .../test/raml10/TraitReferenceTests.scala | 2 +- 9 files changed, 134 insertions(+), 25 deletions(-) create mode 100644 als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test01.raml create mode 100644 als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test02.raml create mode 100644 als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test03.raml create mode 100644 als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test04.raml create mode 100644 als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test05.raml diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/KnownPropertyValuesCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/KnownPropertyValuesCompletionPlugin.scala index 054f38bc9b..d6b9a96225 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/KnownPropertyValuesCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/KnownPropertyValuesCompletionPlugin.scala @@ -24,7 +24,7 @@ class KnownPropertyValuesCompletionPlugin extends ICompletionPlugin { if (request.astNode.isEmpty) { false } else { - var prop = request.astNode.get.property + val prop = request.astNode.get.property if (request.actualYamlLocation.isEmpty) { false } else if (request.kind == LocationKind.KEY_COMPLETION @@ -48,7 +48,7 @@ class KnownPropertyValuesCompletionPlugin extends ICompletionPlugin { parentNode = astNode.parent } else if (request.actualYamlLocation.get.hasSameValue(request.yamlLocation.get)) { if (astNode.isElement) { - var valueLocation = request.yamlLocation.get.value.get + val valueLocation = request.yamlLocation.get.value.get var propName: Option[String] = None valueLocation.yPart match { case yMap: YMap => @@ -146,11 +146,11 @@ object KnownPropertyValuesCompletionPlugin { } } - val ID = "known.property.values.completion"; + val ID = "known.property.values.completion" - val supportedLanguages: List[Vendor] = List(Raml10, Oas, Oas20, Aml); + val supportedLanguages: List[Vendor] = List(Raml10, Oas, Oas20, Aml) - def apply(): KnownPropertyValuesCompletionPlugin = new KnownPropertyValuesCompletionPlugin(); + def apply(): KnownPropertyValuesCompletionPlugin = new KnownPropertyValuesCompletionPlugin() def isSequence(n: IHighLevelNode, pName: String): Boolean = { var pm = n.astUnit.positionsMapper @@ -161,7 +161,7 @@ object KnownPropertyValuesCompletionPlugin { me.entries.find(x => x.key.isThisKey(pName)) match { case Some(me) => me.value.value match { - case s: YSequence => true + case _: YSequence => true case _ => false } case _ => false diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/raml/TemplateReferencesCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/raml/TemplateReferencesCompletionPlugin.scala index 29c3277a98..618bfaec40 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/raml/TemplateReferencesCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/raml/TemplateReferencesCompletionPlugin.scala @@ -56,15 +56,15 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { case "type" => refYamlKind = templateRefYamlKind(request, owner, "type") readableName = "Resource type" - Search.getDeclarations(n.astUnit, "ResourceType"); + Search.getDeclarations(n.astUnit, "ResourceType") case "is" => squareBracketsRequired = true refYamlKind = templateRefYamlKind(request, owner, "is") readableName = "Trait" - Search.getDeclarations(n.astUnit, "Trait"); + Search.getDeclarations(n.astUnit, "Trait") - case _ => Seq(); + case _ => Seq() } declarations = declarations.filter(x => { val nameOpt = x.node @@ -98,12 +98,12 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { .getOrElse(Nil) } else { declarations.map(declaration => { - val ts = toTemplateSuggestion(declaration, refYamlKind.get) + val ts = toTemplateSuggestion(declaration, refYamlKind.get, request.prefix) Suggestion(ts.get.text, readableName, ts.get.name, request.prefix) }) } - case _ => Seq(); + case _ => Seq() } val response = CompletionResponse(result, LocationKind.VALUE_COMPLETION, request) @@ -145,7 +145,21 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { def templateRefYamlKind(request: ICompletionRequest, owner: IHighLevelNode, propName: String): Option[RefYamlKind] = { request.astNode.flatMap(node => { - var pos = request.position + + var openBracket = false + + def isEntry(entry: YMapEntry, propName: String): Boolean = { + if (entry.key.value.toString == propName) true + else + entry.value.value.asInstanceOf[YMap].entries.head match { + case h if h.key.value.toString == propName => + openBracket = true + true + case _ => false + } + } + + val pos = request.position val pm = node.astUnit.positionsMapper Option(owner).flatMap(pNode => { val si = pNode.sourceInfo @@ -153,9 +167,13 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { .filter(_.isInstanceOf[YMapEntry]) .map(_.asInstanceOf[YMapEntry].value.value) .filter(_.isInstanceOf[YMap]) - .flatMap(_.asInstanceOf[YMap].entries.find(e => e.key.value.toString == propName)) + .flatMap(_.asInstanceOf[YMap].entries.find(e => isEntry(e, propName))) .flatMap(propNode => { - var line = YRange(propNode, Option(pm)).start.line + val pNode = openBracket match { + case true if propNode.value.isInstanceOf[YMapEntry] => propNode.value.asInstanceOf[YMapEntry] + case _ => propNode + } + val line = YRange(propNode, Option(pm)).start.line val lineStr = pm.lineString(line) val offset = lineStr.map(pm.lineOffset).getOrElse(-1) propNode.value.value match { @@ -173,7 +191,7 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { wrappedFlow = isFlow(x.value, pm) } }) - Some(RefYamlKind.sequence(fl, wrappedInMap, wrappedFlow, off)) + Some(RefYamlKind.sequence(fl || openBracket, wrappedInMap, wrappedFlow, off)) case map: YMap => val fl = isFlow(map, pm) val off = if (fl) -1 else offset @@ -187,7 +205,7 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { wrappedFlow = isFlow(x.value.value, pm) } }) - Some(RefYamlKind.map(fl, wrappedInMap, wrappedFlow, off)) + Some(RefYamlKind.map(fl || openBracket, wrappedInMap, wrappedFlow, off)) case _ => None } }) @@ -195,7 +213,7 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { }) } - def toTemplateSuggestion(decl: Declaration, kind: RefYamlKind): Option[TemplateSuggestion] = { + def toTemplateSuggestion(decl: Declaration, kind: RefYamlKind, prefix: String): Option[TemplateSuggestion] = { val declNode = decl.node val nameOpt = declNode.attribute("name").flatMap(_.value).map(_.toString) if (nameOpt.isEmpty) { @@ -211,12 +229,10 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { val params = declNode.attributes("parameters").flatMap(_.value).map(_.toString) if (isTrait) { if (params.isEmpty) { - if (kind.inSequence) { - Some(TemplateSuggestion(name, name, kind)) - } else if (kind.inMap && !kind.flow) { + if (kind.inMap && !kind.flow) { Some(TemplateSuggestion(name, s"- $name", kind)) } else { - Some(TemplateSuggestion(name, s"[ $name ]", kind)) + Some(TemplateSuggestion(name, name, kind)) } } else { if (kind.inMap && !kind.flow) { @@ -307,11 +323,11 @@ class TemplateReferencesCompletionPlugin extends ICompletionPlugin { } object TemplateReferencesCompletionPlugin { - val ID = "templateRef.completion"; + val ID = "templateRef.completion" - val supportedLanguages: List[Vendor] = List(Raml10); + val supportedLanguages: List[Vendor] = List(Raml10) - def apply(): TemplateReferencesCompletionPlugin = new TemplateReferencesCompletionPlugin(); + def apply(): TemplateReferencesCompletionPlugin = new TemplateReferencesCompletionPlugin() } case class RefYamlKind(inSequence: Boolean, diff --git a/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test01.raml b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test01.raml new file mode 100644 index 0000000000..7b9c6e42ec --- /dev/null +++ b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test01.raml @@ -0,0 +1,14 @@ +#%RAML 1.0 +title: test API + +traits: + trait1: + queryParameters: + qp1: + trait2: + queryParameters: + qp2: + +/resource: + get: + is: tr* \ No newline at end of file diff --git a/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test02.raml b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test02.raml new file mode 100644 index 0000000000..c3b39b6701 --- /dev/null +++ b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test02.raml @@ -0,0 +1,14 @@ +#%RAML 1.0 +title: test API + +traits: + trait1: + queryParameters: + qp1: + trait2: + queryParameters: + qp2: + +/resource: + get: + is: [ trait1, tr* ] \ No newline at end of file diff --git a/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test03.raml b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test03.raml new file mode 100644 index 0000000000..7b1d002034 --- /dev/null +++ b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test03.raml @@ -0,0 +1,14 @@ +#%RAML 1.0 +title: test API + +traits: + trait1: + queryParameters: + qp1: + trait2: + queryParameters: + qp2: + +/resource: + get: + is: [ tr* \ No newline at end of file diff --git a/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test04.raml b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test04.raml new file mode 100644 index 0000000000..dff089d371 --- /dev/null +++ b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test04.raml @@ -0,0 +1,16 @@ +#%RAML 1.0 +title: test API + +traits: + trait1: + queryParameters: + qp1: + trait2: + queryParameters: + qp2: + +/resource: + get: + is: + - trait1 + - tr* \ No newline at end of file diff --git a/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test05.raml b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test05.raml new file mode 100644 index 0000000000..df5841811e --- /dev/null +++ b/als-suggestions/shared/src/test/resources/test/raml10/jira-tests/als-732/test05.raml @@ -0,0 +1,14 @@ +#%RAML 1.0 +title: test API + +traits: + trait1: + queryParameters: + qp1: + trait2: + queryParameters: + qp2: + +/resource: + get: + is: [ trait1, tr* \ No newline at end of file diff --git a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/JiraSuggestionsTests.scala b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/JiraSuggestionsTests.scala index d6c158a7f0..413f3fc83a 100644 --- a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/JiraSuggestionsTests.scala +++ b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/JiraSuggestionsTests.scala @@ -68,4 +68,25 @@ class JiraSuggestionsTests extends RAML10Test { test("ALS-722 check prefix in included directory") { this.runTest("jira-tests/als-722/api.raml", Set("dataType.raml")) } + + test("ALS-732 Single") { + this.runTest("jira-tests/als-732/test01.raml", Set("trait1", "trait2")) + } + + test("ALS-732 Sequence") { + this.runTest("jira-tests/als-732/test02.raml", Set("trait2")) + } + + test("ALS-732 Open Sequence") { + this.runTest("jira-tests/als-732/test03.raml", Set("trait1", "trait2")) + } + + test("ALS-732 Flow Sequence") { + this.runTest("jira-tests/als-732/test04.raml", Set("trait2")) + } + + //TODO: Check written values in non valid array + ignore("ALS-732 Open Sequence with trait") { + this.runTest("jira-tests/als-732/test04.raml", Set("trait2")) + } } diff --git a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/TraitReferenceTests.scala b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/TraitReferenceTests.scala index c8295677e6..06058651d2 100644 --- a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/TraitReferenceTests.scala +++ b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/raml10/TraitReferenceTests.scala @@ -3,7 +3,7 @@ package org.mulesoft.als.suggestions.test.raml10 class TraitReferenceTests extends RAML10Test { test("test001") { - this.runTest("traitReferences/test001.raml", Set("[ trait1 ]", "[ trait2 ]")) + this.runTest("traitReferences/test001.raml", Set("trait1", "trait2")) } test("test002") {