From 88a32db0622e693d746b2a4ce00487ba80cb7c7d Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Sun, 19 Oct 2014 00:13:31 +0400 Subject: [PATCH] IDEA-131502 Show JSON arrays in structure view for deeply nested properties Additionally hide nodes for objects and arrays if they do not contain properties somewhere inside. --- .../JsonStructureViewElement.java | 13 +++++++++--- .../structureView/JsonStructureViewModel.java | 3 ++- .../intellij/json/JsonStructureViewTest.java | 12 +++++++++++ .../ArrayNodesAreShownIfNecessary.json | 20 +++++++++++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 json/tests/testData/structureView/ArrayNodesAreShownIfNecessary.json diff --git a/json/src/com/intellij/json/structureView/JsonStructureViewElement.java b/json/src/com/intellij/json/structureView/JsonStructureViewElement.java index db7e2c478ed1..f7a350ef9a7a 100644 --- a/json/src/com/intellij/json/structureView/JsonStructureViewElement.java +++ b/json/src/com/intellij/json/structureView/JsonStructureViewElement.java @@ -4,6 +4,7 @@ import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.util.treeView.smartTree.TreeElement; import com.intellij.json.psi.*; import com.intellij.navigation.ItemPresentation; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; @@ -18,7 +19,7 @@ public class JsonStructureViewElement implements StructureViewTreeElement { private final JsonElement myElement; public JsonStructureViewElement(@NotNull JsonElement element) { - assert element instanceof JsonFile || element instanceof JsonProperty || element instanceof JsonObject; + assert PsiTreeUtil.instanceOf(element, JsonFile.class, JsonProperty.class, JsonObject.class, JsonArray.class); myElement = element; } @@ -60,7 +61,7 @@ public class JsonStructureViewElement implements StructureViewTreeElement { else if (myElement instanceof JsonProperty) { value = ((JsonProperty)myElement).getValue(); } - else if (myElement instanceof JsonObject) { + else if (PsiTreeUtil.instanceOf(myElement, JsonObject.class, JsonArray.class)) { value = myElement; } if (value instanceof JsonObject) { @@ -77,7 +78,13 @@ public class JsonStructureViewElement implements StructureViewTreeElement { final List childObjects = ContainerUtil.mapNotNull(array.getValueList(), new Function() { @Override public TreeElement fun(JsonValue value) { - return value instanceof JsonObject ? new JsonStructureViewElement(value) : null; + if (value instanceof JsonObject && !((JsonObject)value).getPropertyList().isEmpty()) { + return new JsonStructureViewElement(value); + } + else if (value instanceof JsonArray && PsiTreeUtil.findChildOfType(value, JsonProperty.class) != null) { + return new JsonStructureViewElement(value); + } + return null; } }); return ArrayUtil.toObjectArray(childObjects, TreeElement.class); diff --git a/json/src/com/intellij/json/structureView/JsonStructureViewModel.java b/json/src/com/intellij/json/structureView/JsonStructureViewModel.java index 75c7fac3813d..19aca25684c1 100644 --- a/json/src/com/intellij/json/structureView/JsonStructureViewModel.java +++ b/json/src/com/intellij/json/structureView/JsonStructureViewModel.java @@ -3,6 +3,7 @@ package com.intellij.json.structureView; import com.intellij.ide.structureView.StructureViewModel; import com.intellij.ide.structureView.StructureViewModelBase; import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.json.psi.JsonArray; import com.intellij.json.psi.JsonFile; import com.intellij.json.psi.JsonObject; import com.intellij.json.psi.JsonProperty; @@ -18,7 +19,7 @@ public class JsonStructureViewModel extends StructureViewModelBase implements St public JsonStructureViewModel(@NotNull PsiFile psiFile, @Nullable Editor editor) { super(psiFile, editor, new JsonStructureViewElement((JsonFile)psiFile)); - withSuitableClasses(JsonFile.class, JsonProperty.class, JsonObject.class); + withSuitableClasses(JsonFile.class, JsonProperty.class, JsonObject.class, JsonArray.class); } @Override diff --git a/json/tests/test/com/intellij/json/JsonStructureViewTest.java b/json/tests/test/com/intellij/json/JsonStructureViewTest.java index ec8e650a2517..aa5e43cf89c5 100644 --- a/json/tests/test/com/intellij/json/JsonStructureViewTest.java +++ b/json/tests/test/com/intellij/json/JsonStructureViewTest.java @@ -59,6 +59,18 @@ public class JsonStructureViewTest extends JsonTestCase { " +object\n"); } + // IDEA-131502 + public void testArrayNodesAreShownIfNecessary() { + doTest("-ArrayNodesAreShownIfNecessary.json\n" + + " -array\n" + + " -object\n" + + " nestedObject\n" + + " -array\n" + + " +array\n" + + " -object\n" + + " siblingObject\n"); + } + // Moved from JavaScript public void testSimpleStructure() { diff --git a/json/tests/testData/structureView/ArrayNodesAreShownIfNecessary.json b/json/tests/testData/structureView/ArrayNodesAreShownIfNecessary.json new file mode 100644 index 000000000000..cbd5f7d943d6 --- /dev/null +++ b/json/tests/testData/structureView/ArrayNodesAreShownIfNecessary.json @@ -0,0 +1,20 @@ +[ + [ + { + "nestedObject" : true + } + ], + [ + { + /* empty */ + } + ], + [ + [ + {"deepNestedObject": true} + ] + ], + { + "siblingObject" : true + } +] \ No newline at end of file