From e53e2dafce343ce207cc27d5bd4a489b68d3b422 Mon Sep 17 00:00:00 2001 From: "Irina.Chernushina" Date: Thu, 12 Oct 2017 11:59:40 +0200 Subject: [PATCH] json schema: correct tree traverse passing (parent, leaf-child) pair WEB-29164 JSON schema: correctly resolve between oneOf/anyOf variants --- .../jsonSchema/impl/MatchResult.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/json/src/com/jetbrains/jsonSchema/impl/MatchResult.java b/json/src/com/jetbrains/jsonSchema/impl/MatchResult.java index 4140232d2414..fbee241f487f 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/MatchResult.java +++ b/json/src/com/jetbrains/jsonSchema/impl/MatchResult.java @@ -15,9 +15,9 @@ */ package com.jetbrains.jsonSchema.impl; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.Pair; +import com.intellij.util.Consumer; import com.intellij.util.PairProcessor; -import com.intellij.util.containers.JBTreeTraverser; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -55,20 +55,20 @@ public class MatchResult { public static void iterateTree(@NotNull JsonSchemaTreeNode root, @NotNull final PairProcessor parentChildConsumer) { - final Ref parentRef = new Ref<>(root); - JBTreeTraverser.from(node -> node.getChildren()) - .withRoot(root) - .preOrderDfsTraversal() - .processEach(node -> { - if (!node.getChildren().isEmpty()) { - parentRef.set(node); - return true; + final ArrayDeque> queue = new ArrayDeque<>(); + final Consumer queueChildren = node -> node.getChildren().forEach(child -> queue.add(Pair.create(node, child))); + queueChildren.consume(root); + while (!queue.isEmpty()) { + final Pair pair = queue.removeFirst(); + final JsonSchemaTreeNode node = pair.getSecond(); + if (node.getChildren().isEmpty()) { + if (!node.isNothing() && SchemaResolveState.normal.equals(node.getResolveState()) && + !parentChildConsumer.process(pair.getFirst(), node)) { + break; } - if (node.getChildren().isEmpty() && !node.isNothing() && SchemaResolveState.normal.equals(node.getResolveState())) { - assert !parentRef.isNull(); - return parentChildConsumer.process(parentRef.get(), node); - } - return true; - }); + } else { + queueChildren.consume(node); + } + } } }