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.
This commit is contained in:
Mikhail Golubev
2014-10-19 14:11:43 +04:00
parent a3ea01237b
commit 88a32db062
4 changed files with 44 additions and 4 deletions
@@ -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<TreeElement> childObjects = ContainerUtil.mapNotNull(array.getValueList(), new Function<JsonValue, TreeElement>() {
@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);
@@ -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
@@ -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() {
@@ -0,0 +1,20 @@
[
[
{
"nestedObject" : true
}
],
[
{
/* empty */
}
],
[
[
{"deepNestedObject": true}
]
],
{
"siblingObject" : true
}
]