mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user