From 8fa77ac6c2f185bc45a08ff320316270cc312d65 Mon Sep 17 00:00:00 2001 From: jkohnlein Date: Thu, 3 Jul 2008 15:25:56 +0000 Subject: [PATCH] calculating AbstrctNode.length() in NodeContentAdapter now --- .../org.eclipse.xtext/model/parsetree.ecore | 7 +-- .../impl/EnclosingCompositeNodeFinder.java | 2 +- .../xtext/parser/impl/PartialParsingUtil.java | 12 +++-- .../xtext/parsetree/NodeContentAdapter.java | 13 +++-- .../org/eclipse/xtext/parsetree/NodeUtil.java | 2 +- .../xtext/parsetree/impl/ParsetreeUtil.java | 17 ------ .../eclipse/xtext/resource/XtextResource.java | 4 +- .../ParseErrorHandlingTest.java | 4 +- .../parser/PartialParsingPerformanceTest.java | 52 ++++++++++--------- .../xtext/parsetree/LengthOffsetLineTest.java | 2 +- .../xtext/reference/LeafNodeBug_234132.java | 6 +-- 11 files changed, 56 insertions(+), 65 deletions(-) diff --git a/plugins/org.eclipse.xtext/model/parsetree.ecore b/plugins/org.eclipse.xtext/model/parsetree.ecore index 4d971b09c..23cdacc96 100755 --- a/plugins/org.eclipse.xtext/model/parsetree.ecore +++ b/plugins/org.eclipse.xtext/model/parsetree.ecore @@ -10,11 +10,6 @@ eType="#//LeafNode"/> - - -
- -
@@ -49,6 +44,8 @@ containment="true" eOpposite="#//SyntaxError/node"/> + diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/EnclosingCompositeNodeFinder.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/EnclosingCompositeNodeFinder.java index e81c28db2..79edb9090 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/EnclosingCompositeNodeFinder.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/EnclosingCompositeNodeFinder.java @@ -49,7 +49,7 @@ public class EnclosingCompositeNodeFinder { EList children = parentNode.getChildren(); for (AbstractNode child : children) { if (child instanceof LeafNode) { - currentOffset += child.length(); + currentOffset += child.getLength(); if (isLookingForStartToken && currentOffset > offset) { isLookingForStartToken = false; startTokenParentIndex = currentParentIndex; diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/PartialParsingUtil.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/PartialParsingUtil.java index b8dff66c2..f42ee5463 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/PartialParsingUtil.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/impl/PartialParsingUtil.java @@ -133,7 +133,10 @@ public class PartialParsingUtil { private static void collectNodesEnclosingChangeRegion(CompositeNode parent, int offset, int length, List nodesEnclosingRegion) { nodesEnclosingRegion.add(parent); - for (AbstractNode child : parent.getChildren()) { + EList children = parent.getChildren(); + // Hack: iterate children backward, so we evaluate the node.length() function less often + for (int i=children.size()-1; i>=0; --i) { + AbstractNode child = children.get(i); if (child instanceof CompositeNode) { CompositeNode childCompositeNode = (CompositeNode) child; if (nodeEnclosesRegion(childCompositeNode, offset, length)) { @@ -145,7 +148,10 @@ public class PartialParsingUtil { } private static boolean nodeEnclosesRegion(CompositeNode node, int offset, int length) { - return node.getOffset() <= offset && node.getOffset() + node.length() >= offset + length; + if(node.getOffset() <= offset) { + return node.getOffset() + node.getLength() >= offset + length; + } + return false; } /** @@ -225,7 +231,7 @@ public class PartialParsingUtil { } private static boolean nodeIsBeforeRegion(LeafNode node, int offset) { - return node.getOffset() + node.length() <= offset; + return node.getOffset() + node.getLength() <= offset; } } \ No newline at end of file diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeContentAdapter.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeContentAdapter.java index 507fcf4fd..ed16f65c0 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeContentAdapter.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeContentAdapter.java @@ -37,7 +37,7 @@ public class NodeContentAdapter extends EContentAdapter { } else { AbstractNode predecessor = parent.getChildren().get(position - 1); - updateOffsetAndLine(child, new NodeInfo((predecessor.getOffset() + predecessor.length()), predecessor.endLine())); + updateOffsetAndLine(child, new NodeInfo((predecessor.getOffset() + predecessor.getLength()), predecessor.endLine())); } break; case Notification.REMOVE: @@ -74,7 +74,7 @@ public class NodeContentAdapter extends EContentAdapter { } else { AbstractNode predecessor = siblings.get(index - 1); - updateOffsetAndLine(targetNode, new NodeInfo((predecessor.getOffset() + predecessor.length()), predecessor.endLine())); + updateOffsetAndLine(targetNode, new NodeInfo((predecessor.getOffset() + predecessor.getLength()), predecessor.endLine())); } } else { @@ -97,13 +97,16 @@ public class NodeContentAdapter extends EContentAdapter { node.setOffset(info.offset); node.setLine(info.line); if (node instanceof LeafNode) { - info.offset += node.length(); + node.setLength(((LeafNode)node).getText().length()); + info.offset += node.getLength(); info.line = node.endLine(); - } - if (node instanceof CompositeNode) { + } else if (node instanceof CompositeNode) { + int length = 0; for (AbstractNode child : ((CompositeNode) node).getChildren()) { info = updateOffsetAndLineInContents(child, info); + length += child.getLength(); } + node.setLength(length); } return info; } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeUtil.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeUtil.java index f34fc0ae3..f5b329b01 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeUtil.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/NodeUtil.java @@ -106,7 +106,7 @@ public class NodeUtil { for (LeafNode lookaheadNode : node.getLookaheadLeafNodes()) { System.out.print("\""+ lookaheadNode.getText() +"\" "); } - System.out.print(" (" + node.getOffset() + ", " + node.length() + ")"); + System.out.print(" (" + node.getOffset() + ", " + node.getLength() + ")"); System.out.println("}"); } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/impl/ParsetreeUtil.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/impl/ParsetreeUtil.java index f4a7267c2..2d3c076d3 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/impl/ParsetreeUtil.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parsetree/impl/ParsetreeUtil.java @@ -24,23 +24,6 @@ import org.eclipse.xtext.parsetree.SyntaxError; */ public class ParsetreeUtil { - public static int length(CompositeNodeImpl compositeNodeImpl) { - int length = 0; - for (AbstractNode node : compositeNodeImpl.getChildren()) { - length += node.length(); - } - return length; - } - - public static int length(LeafNodeImpl leafNodeImpl) { - return leafNodeImpl.getText().length(); - } - - public static int length(AbstractNodeImpl abstractParserNode) { - throw new IllegalArgumentException("Illegal subtype of AbstarctParserNode " - + abstractParserNode.eClass().getName()); - } - private static void checkArgument(AbstractNodeImpl abstractParserNode) { int classifierID = abstractParserNode.eClass().getClassifierID(); if (classifierID != ParsetreePackage.COMPOSITE_NODE && classifierID != ParsetreePackage.LEAF_NODE) { diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java index 855077982..a1089fa42 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/XtextResource.java @@ -56,7 +56,7 @@ public class XtextResource extends ResourceImpl { public void update(int offset, String change) { CompositeNode rootNode = parseResult.getRootNode(); int length = change.length(); - int documentGrowth = length - rootNode.length(); + int documentGrowth = length - rootNode.getLength(); int originalLength = length - documentGrowth; // unloading is required to ensure that any EObjects hanging around (e.g. in the outline) get a proxied URI @@ -70,7 +70,7 @@ public class XtextResource extends ResourceImpl { addNodeContentAdapter(); } } - + private void addNodeContentAdapter() { parseResult.getRootNode().eAdapters().add(new NodeContentAdapter()); } diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parseerrorhandling/ParseErrorHandlingTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parseerrorhandling/ParseErrorHandlingTest.java index ce6cfd326..6c29ef742 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parseerrorhandling/ParseErrorHandlingTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parseerrorhandling/ParseErrorHandlingTest.java @@ -33,7 +33,7 @@ public class ParseErrorHandlingTest extends AbstractGeneratorTest { assertEquals("%", ((LeafNode)errors.get(0).getNode()).getText()); assertEquals(1, errors.get(0).getNode().getLine()); assertEquals(15, errors.get(0).getNode().getOffset()); - assertEquals(1, errors.get(0).getNode().length()); + assertEquals(1, errors.get(0).getNode().getLength()); assertEquals(1, errors.size()); } @@ -43,7 +43,7 @@ public class ParseErrorHandlingTest extends AbstractGeneratorTest { assertEquals("::", ((LeafNode)errors.get(0).getNode()).getText()); assertEquals(1, errors.get(0).getNode().getLine()); assertEquals(31, errors.get(0).getNode().getOffset()); - assertEquals(2, errors.get(0).getNode().length()); + assertEquals(2, errors.get(0).getNode().getLength()); assertEquals(1, errors.size()); } diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/PartialParsingPerformanceTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/PartialParsingPerformanceTest.java index 6ab993ed3..139f5336d 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/PartialParsingPerformanceTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/PartialParsingPerformanceTest.java @@ -10,6 +10,7 @@ package org.eclipse.xtext.parser; import org.eclipse.xtext.parser.impl.PartialParsingUtil; import org.eclipse.xtext.parsetree.CompositeNode; +import org.eclipse.xtext.testlanguages.ReferenceGrammarStandaloneSetup; import org.eclipse.xtext.testlanguages.SimpleExpressionsStandaloneSetup; /** @@ -18,7 +19,8 @@ import org.eclipse.xtext.testlanguages.SimpleExpressionsStandaloneSetup; */ public class PartialParsingPerformanceTest extends AbstractPartialParserTest { - private static final int NUM_ELEMENTS = 200; + private static final int NUM_ELEMENTS = 1; + public void testExpression() throws Exception { with(SimpleExpressionsStandaloneSetup.class); StringBuffer modelBuffer = new StringBuffer(); @@ -35,29 +37,29 @@ public class PartialParsingPerformanceTest extends AbstractPartialParserTest { assertTrue(reparse.getParseErrors() == null || reparse.getParseErrors().isEmpty()); } -// public void testReference() throws Exception { -// with(ReferenceGrammarStandaloneSetup.class); -// StringBuffer modelBuffer = new StringBuffer(); -// modelBuffer.append("spielplatz 17 {\n"); -// for(int i=0; i