Permalink
Browse files

Landing 'enebo' branch. Most notable:

- Merge in fixes from original refactoring patch form Mirko and friends.
- Fixes many many positioning issues.
- Simplify and refactor portions of lexing and parsing.
- Reduce gratuitious object creation (like making a token which immediately
   becomes a node).
- Comments are now added to parser result as a list.  IDE people can 
  do a second pass to associate these nodes to the appropriate AST nodes.
- offsets in ISourcePosition now represent a position 'between' characters.


git-svn-id: http://svn.codehaus.org/jruby/trunk@2367 961051c9-f516-0410-bf72-c9f7e237a7b7
  • Loading branch information...
enebo committed Oct 22, 2006
1 parent 896fb93 commit a1608f03dadcfd27498cfba32601307031b25981
Showing with 8,187 additions and 7,634 deletions.
  1. +4 −0 jruby/src/org/jruby/ast/ArrayNode.java
  2. +15 −4 jruby/src/org/jruby/ast/BlockArgNode.java
  3. +2 −1 jruby/src/org/jruby/ast/CallNode.java
  4. +67 −0 jruby/src/org/jruby/ast/CommentNode.java
  5. +2 −1 jruby/src/org/jruby/ast/FCallNode.java
  6. +41 −7 jruby/src/org/jruby/ast/ListNode.java
  7. +9 −2 jruby/src/org/jruby/ast/LocalVarNode.java
  8. +107 −106 jruby/src/org/jruby/ast/NodeTypes.java
  9. +3 −2 jruby/src/org/jruby/ast/VCallNode.java
  10. +1 −1 jruby/src/org/jruby/evaluator/DefinedVisitor.java
  11. +1 −1 jruby/src/org/jruby/evaluator/EvaluationState.java
  12. +5 −2 jruby/src/org/jruby/lexer/yacc/HeredocTerm.java
  13. +53 −3 jruby/src/org/jruby/lexer/yacc/ISourcePosition.java
  14. +0 −1 jruby/src/org/jruby/lexer/yacc/ISourcePositionFactory.java
  15. +6 −10 jruby/src/org/jruby/lexer/yacc/LexerSource.java
  16. +270 −241 jruby/src/org/jruby/lexer/yacc/RubyYaccLexer.java
  17. +35 −8 jruby/src/org/jruby/lexer/yacc/SourcePosition.java
  18. +7 −18 jruby/src/org/jruby/lexer/yacc/SourcePositionFactory.java
  19. +20 −19 jruby/src/org/jruby/lexer/yacc/StringTerm.java
  20. +1,805 −2,091 jruby/src/org/jruby/parser/DefaultRubyParser.java
  21. +1,149 −1,420 jruby/src/org/jruby/parser/DefaultRubyParser.y
  22. +178 −243 jruby/src/org/jruby/parser/ParserSupport.java
  23. +10 −0 jruby/src/org/jruby/parser/RubyParserResult.java
  24. +4 −1 jruby/src/org/jruby/parser/Tokens.java
  25. +3,367 −3,327 jruby/src/org/jruby/parser/YyTables.java
  26. +27 −0 jruby/src/org/jruby/util/IdUtil.java
  27. +999 −125 jruby/test/testPositions.rb
@@ -44,6 +44,10 @@
*/
public class ArrayNode extends ListNode implements ILiteralNode {
static final long serialVersionUID = 6279246130032958596L;
+
+ public ArrayNode(ISourcePosition position, Node firstNode) {
+ super(position, NodeTypes.ARRAYNODE, firstNode);
+ }
public ArrayNode(ISourcePosition position) {
super(position, NodeTypes.ARRAYNODE);
@@ -32,6 +32,7 @@
import java.util.List;
+import org.jruby.ast.types.INameNode;
import org.jruby.ast.visitor.NodeVisitor;
import org.jruby.evaluator.Instruction;
import org.jruby.lexer.yacc.ISourcePosition;
@@ -45,14 +46,16 @@
* in this example c is a BlockArgNode
* @author jpetersen
*/
-public class BlockArgNode extends Node {
+public class BlockArgNode extends Node implements INameNode {
static final long serialVersionUID = 8374824536805365398L;
private final int count;
+ private String name;
- public BlockArgNode(ISourcePosition position, int count) {
+ public BlockArgNode(ISourcePosition position, int count, String name) {
super(position, NodeTypes.BLOCKARGNODE);
this.count = count;
+ this.name = name;
}
/**
@@ -70,9 +73,17 @@ public Instruction accept(NodeVisitor iVisitor) {
public int getCount() {
return count;
}
-
+
+ /**
+ * Get the name of this block argument
+ *
+ * @return it's name
+ */
+ public String getName() {
+ return name;
+ }
+
public List childNodes() {
return EMPTY_LIST;
}
-
}
@@ -34,6 +34,7 @@
import java.io.IOException;
import java.util.List;
+import org.jruby.ast.types.INameNode;
import org.jruby.ast.visitor.NodeVisitor;
import org.jruby.evaluator.Instruction;
import org.jruby.lexer.yacc.ISourcePosition;
@@ -43,7 +44,7 @@
*
* @author jpetersen
*/
-public final class CallNode extends Node {
+public final class CallNode extends Node implements INameNode {
static final long serialVersionUID = -1993752395320088525L;
private final Node receiverNode;
@@ -0,0 +1,67 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Thomas E Enebo <enebo@acm.org>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+package org.jruby.ast;
+
+import java.util.List;
+
+import org.jruby.ast.visitor.NodeVisitor;
+import org.jruby.evaluator.Instruction;
+import org.jruby.lexer.yacc.ISourcePosition;
+
+/**
+ * Representation of a comment. Note that comments are not part of evaluation so you do
+ * not get the ability to visit this node as part of evaluation. In theory we could add
+ * this if we envisioned some wacky annotation system, but we have no crazy ideas yet.
+ *
+ */
+public class CommentNode extends Node {
+ private static final long serialVersionUID = -8304070370230933044L;
+
+ // Textual data (this is missing newline as a single line comment and =begin..=end
+ // comments do contain the intermediary newlines.
+ String content;
+
+ public CommentNode(ISourcePosition position, String content) {
+ super(position, NodeTypes.COMMENTNODE);
+
+ this.content = content;
+ }
+
+ public Instruction accept(NodeVisitor visitor) {
+ return null;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public List childNodes() {
+ return EMPTY_LIST;
+ }
+
+}
@@ -34,6 +34,7 @@
import java.io.IOException;
import java.util.List;
+import org.jruby.ast.types.INameNode;
import org.jruby.ast.visitor.NodeVisitor;
import org.jruby.evaluator.Instruction;
import org.jruby.lexer.yacc.ISourcePosition;
@@ -42,7 +43,7 @@
*
* @author jpetersen
*/
-public class FCallNode extends Node {
+public class FCallNode extends Node implements INameNode {
static final long serialVersionUID = 3590332973770104094L;
private String name;
@@ -48,19 +48,33 @@
private List list = null;
+ /**
+ * Create a new ListNode.
+ *
+ * @param id type of listnode
+ * @param firstNode first element of the list
+ */
+ public ListNode(ISourcePosition position, int id, Node firstNode) {
+ this(position, id);
+
+ add(firstNode);
+ }
+
public ListNode(ISourcePosition position, int id) {
super(position, id);
}
public ListNode(ISourcePosition position) {
super(position, NodeTypes.LISTNODE);
}
-
+
public ListNode add(Node node) {
- if (list == null) {
- list = new ArrayList();
- }
+ // Ruby Grammar productions return plenty of nulls.
+ if (node == null) return this;
+ if (list == null) list = new ArrayList();
+
list.add(node);
+ setPosition(getPosition().union(node.getPosition()));
return this;
}
@@ -76,15 +90,35 @@ public int size() {
return list == null ? 0 : list.size();
}
+
+ /**
+ * Add all elements in other list to this list node.
+ *
+ * @param other list which has elements
+ * @return this instance for method chaining
+ */
public ListNode addAll(ListNode other) {
if (other != null) {
- for (Iterator iter = other.iterator(); iter.hasNext();) {
- add((Node) iter.next());
+ if (list == null) list = new ArrayList();
+ list.addAll(other.list);
+
+ if (list.size() > 0) {
+ setPosition(getPosition().union(getLast().getPosition()));
}
}
return this;
}
+ /**
+ * Add other element to this list
+ *
+ * @param other list which has elements
+ * @return this instance for method chaining
+ */
+ public ListNode addAll(Node other) {
+ return add(other);
+ }
+
public Node getLast() {
return list == null ? null : (Node) list.get(list.size() - 1);
}
@@ -105,7 +139,7 @@ public String toString() {
}
public List childNodes() {
- return list;
+ return list == null ? EMPTY_LIST : list;
}
public Instruction accept(NodeVisitor visitor) {
@@ -32,6 +32,7 @@
import java.util.List;
+import org.jruby.ast.types.INameNode;
import org.jruby.ast.visitor.NodeVisitor;
import org.jruby.evaluator.Instruction;
import org.jruby.lexer.yacc.ISourcePosition;
@@ -40,14 +41,16 @@
*
* @author jpetersen
*/
-public class LocalVarNode extends Node {
+public class LocalVarNode extends Node implements INameNode {
static final long serialVersionUID = 8562701804939317217L;
private final int count;
+ private final String name;
- public LocalVarNode(ISourcePosition position, int count) {
+ public LocalVarNode(ISourcePosition position, int count, String name) {
super(position, NodeTypes.LOCALVARNODE);
this.count = count;
+ this.name = name;
}
/**
@@ -66,6 +69,10 @@ public int getCount() {
return count;
}
+ public String getName() {
+ return name;
+ }
+
public List childNodes() {
return EMPTY_LIST;
}
Oops, something went wrong.

0 comments on commit a1608f0

Please sign in to comment.