From 657d496d713e3d2bce246c6092b6975a609aa644 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Wed, 15 Jan 2014 14:32:34 -0600 Subject: [PATCH] Prevent XPath from returning the same node multiple times (fixes #370) --- .../Java/src/org/antlr/v4/runtime/tree/xpath/XPath.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/xpath/XPath.java b/runtime/Java/src/org/antlr/v4/runtime/tree/xpath/XPath.java index b04c6a857..5ffa080e3 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/xpath/XPath.java +++ b/runtime/Java/src/org/antlr/v4/runtime/tree/xpath/XPath.java @@ -12,6 +12,8 @@ import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; /** Represent a subset of XPath XML path syntax for use in identifying nodes in @@ -176,14 +178,14 @@ loop: */ public Collection evaluate(final ParseTree t) { ParserRuleContext dummyRoot = new ParserRuleContext(); - dummyRoot.children = new ArrayList() {{add(t);}}; // don't set t's parent. + dummyRoot.children = Collections.singletonList(t); // don't set t's parent. - Collection work = new ArrayList(); + Collection work = Collections.singleton(dummyRoot); work.add(dummyRoot); int i = 0; while ( i < elements.length ) { - Collection next = new ArrayList(); + Collection next = new LinkedHashSet(); for (ParseTree node : work) { if ( node.getChildCount()>0 ) { // only try to match next element if it has children