Bug 570738: [R-Source] Improve RAst
  - Remove RAstNode.getChildren (no longer required, inefficient)
  - Remove SpecList (no longer required)
  - Change Arg lists to ImList for easier access
  - Add SubIndexed.Args.separatorOffsets
  - Correct return type of SubIndexed.Args.getChild
  - Remove abandoned AST node type C_IN

Change-Id: Id4d4a5101bc784d2f1da19552351de28c8f197e4
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java
index b58224e..12c1b93 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java
@@ -83,11 +83,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.varSymbol, this.condExpr.node, this.loopExpr.node };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.varSymbol == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java
index 4bb2bfd..4d1a762 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java
@@ -94,16 +94,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		if (this.withElse) {
-			return new RAstNode[] { this.condExpr.node, this.thenExpr.node, this.elseExpr.node };
-		}
-		else {
-			return new RAstNode[] { this.condExpr.node, this.thenExpr.node };
-		}
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.condExpr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java
index 9c13316..7b188b1 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java
@@ -107,11 +107,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return NO_CHILDREN;
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		return -1;
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java
index a6489f8..85cd880 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java
@@ -73,11 +73,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.loopExpr.node };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.loopExpr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java
index e9bb0c8..10ff440 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java
@@ -79,11 +79,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.condExpr.node, this.loopExpr.node };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.condExpr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java
index f1ad05a..3a3b553 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java
@@ -62,11 +62,6 @@
 		}
 		
 		@Override
-		public final RAstNode[] getChildren() {
-			return NO_CHILDREN;
-		}
-		
-		@Override
 		public final int getChildIndex(final AstNode child) {
 			return -1;
 		}
@@ -118,11 +113,6 @@
 		}
 		
 		@Override
-		public final RAstNode[] getChildren() {
-			return NO_CHILDREN;
-		}
-		
-		@Override
 		public final int getChildIndex(final AstNode child) {
 			return -1;
 		}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java
index d4d03c9..2dcdc0a 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java
@@ -18,7 +18,6 @@
 import java.util.List;
 
 import org.eclipse.statet.jcommons.collections.ImList;
-import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -81,13 +80,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		final RAstNode[] children= new @NonNull RAstNode[this.lines.length];
-		System.arraycopy(this.lines, 0, children, 0, this.lines.length);
-		return children;
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		for (int i= 0; i < this.lines.length; i++) {
 			if (this.lines[i] == child) {
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java
index a7dfbf7..434ee11 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java
@@ -17,7 +17,6 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Objects;
 
-import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -56,13 +55,6 @@
 	
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		final RAstNode[] children= new @NonNull RAstNode[this.fragments.length];
-		System.arraycopy(this.fragments, 0, children, 0, this.fragments.length);
-		return children;
-	}
-	
-	@Override
 	public final boolean hasChildren() {
 		return (this.fragments.length > 0);
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java
index 03bfed1..2874393 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java
@@ -54,11 +54,6 @@
 	
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return NO_CHILDREN;
-	}
-	
-	@Override
 	public final boolean hasChildren() {
 		return false;
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java
index 6b3b7f1..184cd24 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java
@@ -76,11 +76,6 @@
 		}
 		
 		@Override
-		public final RAstNode[] getChildren() {
-			return NO_CHILDREN;
-		}
-		
-		@Override
 		public final int getChildIndex(final AstNode child) {
 			return -1;
 		}
@@ -163,11 +158,6 @@
 		}
 		
 		@Override
-		public final RAstNode[] getChildren() {
-			return new RAstNode[] { this.leftExpr.node, this.rightExpr.node };
-		}
-		
-		@Override
 		public final int getChildIndex(final AstNode child) {
 			if (this.leftExpr.node == child) {
 				return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/ExpressionList.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/ExpressionList.java
index d4eafe4..7ffe800 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/ExpressionList.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/ExpressionList.java
@@ -20,7 +20,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -48,16 +47,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		final int n= this.expressions.size();
-		final RAstNode[] children= new @NonNull RAstNode[n];
-		for (int i= 0; i < n; i++) {
-			children[i]= this.expressions.get(i).node;
-		}
-		return children;
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		for (int i= this.expressions.size() - 1; i >= 0; i--) {
 			if (this.expressions.get(i).node == child) {
@@ -79,7 +68,9 @@
 	
 	@Override
 	public final void acceptInRChildren(final RAstVisitor visitor) throws InvocationTargetException {
-		acceptChildrenExpr(visitor, this.expressions);
+		for (final Expression expr : this.expressions) {
+			expr.node.acceptInR(visitor);
+		}
 	}
 	
 	@Override
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java
index f1b238d..1130b80 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java
@@ -17,12 +17,10 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_EXPR_AS_REF_MISSING;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
 
-import org.eclipse.statet.jcommons.collections.IntArrayList;
-import org.eclipse.statet.jcommons.collections.IntList;
-import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.collections.ImIntList;
+import org.eclipse.statet.jcommons.collections.ImList;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -41,21 +39,25 @@
 	public static final class Args extends RAstNode {
 		
 		
-		final List<Arg> specs;
-		final IntList sepList;
+		private ImList<Arg> args;
+		private ImIntList sepOffsets;
 		
 		
+		@SuppressWarnings("null")
 		Args(final FCall parent) {
 			this.rParent= parent;
-			this.specs= new ArrayList<>(1);
-			this.sepList= new IntArrayList(1);
 		}
 		
 //		Args(final List<Arg> args) {
-//			rParent= null;
-//			specs= args;
+//			this.rParent= null;
+//			this.args= args;
 //		}
 		
+		void finish(final RParser.ArgsBuilder<Arg> argsBuilder) {
+			this.args= ImCollections.toList(argsBuilder.args);
+			this.sepOffsets= ImCollections.toIntList(argsBuilder.sepOffsets);
+		}
+		
 		
 		@Override
 		public final NodeType getNodeType() {
@@ -67,13 +69,8 @@
 			return null;
 		}
 		
-		public int getSeparatorOffset(final int index) {
-			return this.sepList.getAt(index);
-		}
-		
-		@Override
-		public final void acceptInR(final RAstVisitor visitor) throws InvocationTargetException {
-			visitor.visit(this);
+		public ImIntList getSeparatorOffsets() {
+			return this.sepOffsets;
 		}
 		
 		
@@ -84,42 +81,48 @@
 		
 		@Override
 		public final boolean hasChildren() {
-			return (!this.specs.isEmpty());
+			return (!this.args.isEmpty());
 		}
 		
 		@Override
 		public final int getChildCount() {
-			return this.specs.size();
+			return this.args.size();
 		}
 		
 		@Override
 		public final Arg getChild(final int index) {
-			return this.specs.get(index);
-		}
-		
-		@Override
-		public final Arg[] getChildren() {
-			return this.specs.toArray(new @NonNull Arg[this.specs.size()]);
+			return this.args.get(index);
 		}
 		
 		@Override
 		public final int getChildIndex(final AstNode child) {
-			for (int i= this.specs.size() - 1; i >= 0; i--) {
-				if (this.specs.get(i) == child) {
+			for (int i= this.args.size() - 1; i >= 0; i--) {
+				if (this.args.get(i) == child) {
 					return i;
 				}
 			}
 			return -1;
 		}
 		
+		public ImList<Arg> getArgChildren() {
+			return this.args;
+		}
+		
+		@Override
+		public final void acceptInR(final RAstVisitor visitor) throws InvocationTargetException {
+			visitor.visit(this);
+		}
+		
 		@Override
 		public final void acceptInRChildren(final RAstVisitor visitor) throws InvocationTargetException {
-			acceptChildren(visitor, this.specs);
+			for (final RAstNode arg : this.args) {
+				arg.acceptInR(visitor);
+			}
 		}
 		
 		@Override
 		public final void acceptInChildren(final AstVisitor visitor) throws InvocationTargetException {
-			for (final RAstNode child : this.specs) {
+			for (final RAstNode child : this.args) {
 				visitor.visit(child);
 			}
 		}
@@ -230,11 +233,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.refExpr.node, this.args };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.refExpr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java
index ad7684c..91af465 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java
@@ -19,10 +19,9 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS3_FDEF;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
 
-import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.collections.ImList;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -79,12 +78,25 @@
 	public static final class Args extends RAstNode {
 		
 		
-		final List<Arg> specs;
+		private ImList<Arg> args;
+//		private ImIntList sepOffsets;
 		
 		
+		@SuppressWarnings("null")
 		Args(final FDef parent) {
 			this.rParent= parent;
-			this.specs= new ArrayList<>(0);
+		}
+		
+		void finish(final RParser.ArgsBuilder<Arg> argsBuilder) {
+			this.args= ImCollections.toList(argsBuilder.args);
+//			this.sepOffsets= ImCollections.toIntList(argsBuilder.sepOffsets);
+		}
+		
+		void finishMissing(final int offset) {
+			this.startOffset= offset;
+			this.endOffset= offset;
+			this.args= ImCollections.emptyList();
+//			this.sepOffsets= ImCollections.toIntList(argsBuilder.sepOffsets);
 		}
 		
 		
@@ -106,34 +118,33 @@
 		
 		@Override
 		public final boolean hasChildren() {
-			return (!this.specs.isEmpty());
+			return (!this.args.isEmpty());
 		}
 		
 		@Override
 		public final int getChildCount() {
-			return this.specs.size();
+			return this.args.size();
 		}
 		
 		@Override
 		public final Arg getChild(final int index) {
-			return this.specs.get(index);
-		}
-		
-		@Override
-		public final Arg[] getChildren() {
-			return this.specs.toArray(new @NonNull Arg[this.specs.size()]);
+			return this.args.get(index);
 		}
 		
 		@Override
 		public final int getChildIndex(final AstNode child) {
-			for (int i= this.specs.size() - 1; i >= 0; i--) {
-				if (this.specs.get(i) == child) {
+			for (int i= this.args.size() - 1; i >= 0; i--) {
+				if (this.args.get(i) == child) {
 					return i;
 				}
 			}
 			return -1;
 		}
 		
+		public ImList<Arg> getArgChildren() {
+			return this.args;
+		}
+		
 		@Override
 		public final void acceptInR(final RAstVisitor visitor) throws InvocationTargetException {
 			visitor.visit(this);
@@ -141,12 +152,14 @@
 		
 		@Override
 		public final void acceptInRChildren(final RAstVisitor visitor) throws InvocationTargetException {
-			acceptChildren(visitor, this.specs);
+			for (final RAstNode arg : this.args) {
+				arg.acceptInR(visitor);
+			}
 		}
 		
 		@Override
 		public final void acceptInChildren(final AstVisitor visitor) throws InvocationTargetException {
-			for (final RAstNode child : this.specs) {
+			for (final RAstNode child : this.args) {
 				visitor.visit(child);
 			}
 		}
@@ -236,16 +249,6 @@
 		}
 		
 		@Override
-		public final RAstNode[] getChildren() {
-			if (this.withDefault) {
-				return new RAstNode[] { this.argName, this.defaultExpr.node };
-			}
-			else {
-				return new RAstNode[] { this.argName };
-			}
-		}
-		
-		@Override
 		public final int getChildIndex(final AstNode child) {
 			if (this.argName == child) {
 				return 0;
@@ -331,7 +334,7 @@
 	
 	
 	int argsOpenOffset= NA_OFFSET;
-	Args args= new Args(this);
+	final Args args= new Args(this);
 	int argsCloseOffset= NA_OFFSET;
 	final Expression expr= new Expression();
 	
@@ -374,11 +377,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.args, this.expr.node };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.args == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java
index 0614c1f..a0a2fe7 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java
@@ -73,11 +73,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.expr.node };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.expr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java
index 0dca0bb..cc26445 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java
@@ -83,15 +83,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		final RAstNode typeNode= this.leftExpr.node;
-		if (typeNode != null) {
-			return new RAstNode[] { typeNode, this.rightExpr.node };
-		}
-		return new RAstNode[] { this.rightExpr.node };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.leftExpr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java
index 50812f8..2e555a6 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java
@@ -81,15 +81,6 @@
 		throw new IndexOutOfBoundsException();
 	}
 	
-	@Override
-	public final RAstNode[] getChildren() {
-		final RAstNode leftNode= this.leftExpr.node;
-		if (leftNode != null) {
-			return new RAstNode[] { leftNode, this.rightExpr.node };
-		}
-		return new RAstNode[] { this.rightExpr.node };
-	}
-	
 	public final boolean hasLeft() {
 		return (this.leftExpr.node != null);
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java
index 1ee86c8..311a3e8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java
@@ -106,11 +106,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.namespace, this.element };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.namespace == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NodeType.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NodeType.java
index c419d02..acc08ec 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NodeType.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NodeType.java
@@ -73,7 +73,6 @@
 	
 	C_IF ("if", 100001, Assoc.RIGHTSTD), //$NON-NLS-1$
 	C_FOR ("for", 100002, Assoc.LEFTSTD), //$NON-NLS-1$
-	C_IN ("in", 100002, Assoc.LEFTSTD), //$NON-NLS-1$
 	C_WHILE ("while", 100002, Assoc.LEFTSTD), //$NON-NLS-1$
 	C_REPEAT ("repeat", 100002, Assoc.LEFTSTD), //$NON-NLS-1$
 	C_NEXT ("next", 1, Assoc.TERM), //$NON-NLS-1$
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java
index 695ae99..7aa44b5 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java
@@ -62,11 +62,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return NO_CHILDREN;
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		return -1;
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java
index 107d17f..9b47a1c 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java
@@ -17,7 +17,6 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS_OK;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.List;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
@@ -99,7 +98,6 @@
 	public abstract int getChildCount();
 	@Override
 	public abstract RAstNode getChild(int index);
-	public abstract RAstNode[] getChildren();
 	@Override
 	public abstract int getChildIndex(AstNode child);
 	
@@ -121,9 +119,10 @@
 	
 	
 	int getEqualsIndex(final RAstNode element) {
-		final RAstNode[] children= getChildren();
 		int index= 0;
-		for (final RAstNode child : children) {
+		final int n= getChildCount();
+		for (int i= 0; i < n; i++) {
+			final RAstNode child= getChild(i);
 			if (child == element) {
 				return index;
 			}
@@ -139,18 +138,6 @@
 	
 	public abstract void acceptInRChildren(RAstVisitor visitor) throws InvocationTargetException;
 	
-	protected final void acceptChildren(final RAstVisitor visitor, final List<? extends RAstNode> children) throws InvocationTargetException {
-		for (final RAstNode child : children) {
-			child.acceptInR(visitor);
-		}
-	}
-	
-	protected final void acceptChildrenExpr(final RAstVisitor visitor, final List<Expression> children) throws InvocationTargetException {
-		for (final Expression expr : children) {
-			expr.node.acceptInR(visitor);
-		}
-	}
-	
 	
 	abstract @Nullable Expression getExpr(RAstNode child);
 	abstract @Nullable Expression getLeftExpr();
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java
index a1ef0be..857aacc 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAsts.java
@@ -690,7 +690,6 @@
 				topdown.add(parent.getChildIndex(node) + 3);
 				node= parent.getRParent();
 				continue;
-			case C_IN:
 			case F_CALL_ARGS:
 				if (parent == baseNode) {
 					continue;
@@ -771,7 +770,6 @@
 			
 			// part of parent element
 			case SUB_INDEXED_ARGS:
-			case C_IN:
 			case F_CALL_ARGS:
 			
 			case SUB_INDEXED_ARG: // -> ARGS
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java
index 1d9465b..7daada6 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java
@@ -50,6 +50,8 @@
 import java.util.Collections;
 import java.util.List;
 
+import org.eclipse.statet.jcommons.collections.IntArrayList;
+import org.eclipse.statet.jcommons.collections.IntList;
 import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
@@ -83,6 +85,14 @@
 	public static final int LEXER_CONFIG= RLexer.SKIP_WHITESPACE;
 	
 	
+	static final class ArgsBuilder<T> {
+		
+		final ArrayList<T> args= new ArrayList<>(8);
+		
+		final IntList sepOffsets= new IntArrayList(8);
+		
+	}
+	
 	private static final class ExprContext {
 		final RAstNode rootNode;
 		final Expression rootExpr;
@@ -317,6 +327,7 @@
 	}
 	
 	private void init() {
+		clearArgsBuilder();
 		if (this.roxygen != null) {
 			this.roxygen.init();
 		}
@@ -1087,7 +1098,7 @@
 			}
 		}
 		else {
-			node.args.startOffset= node.args.endOffset= node.endOffset;
+			node.args.finishMissing(node.endOffset);
 			if ((node.status & STATUSFLAG_REAL_ERROR) == 0) {
 				node.status= STATUS12_SYNTAX_FDEF_ARGS_MISSING;
 			}
@@ -1126,6 +1137,7 @@
 	}
 	
 	final void scanInFDefArgs(final FDef.Args args) {
+		final var builder= this.<FDef.Arg>getArgsBuilder();
 		args.startOffset= args.endOffset= args.rParent.endOffset;
 		ITER_ARGS : while (true) {
 			final FDef.Arg arg= new FDef.Arg(args);
@@ -1142,8 +1154,8 @@
 				arg.startOffset= arg.endOffset= this.lexer.getOffset();
 				break;
 			default:
-				if (args.specs.isEmpty()) {
-					return;
+				if (builder.args.isEmpty()) {
+					break ITER_ARGS;
 				}
 				arg.startOffset= arg.endOffset= args.endOffset;
 				break;
@@ -1162,7 +1174,7 @@
 				arg.endOffset= arg.defaultExpr.node.endOffset;
 			}
 			
-			args.specs.add(arg);
+			builder.args.add(arg);
 			args.status= POST_VISITOR.checkTerminal(arg);
 			if (this.nextType == RTerminal.COMMA) {
 				args.endOffset= this.lexer.getOffset() + 1;
@@ -1171,14 +1183,17 @@
 				continue ITER_ARGS;
 			}
 			else {
-				args.startOffset= args.specs.get(0).startOffset;
+				args.startOffset= builder.args.get(0).startOffset;
 				args.endOffset= arg.endOffset;
-				return;
+				break ITER_ARGS;
 			}
 		}
+		args.finish(builder);
+		returnArgsBuilder(builder);
 	}
 	
 	final void scanInSpecArgs(final FCall.Args args) {
+		final var builder= this.<FCall.Arg>getArgsBuilder();
 		args.startOffset= args.endOffset= args.rParent.endOffset;
 		ITER_ARGS : while (true) {
 			final FCall.Arg arg= new FCall.Arg(args);
@@ -1242,27 +1257,30 @@
 			}
 			
 			if (this.nextType == RTerminal.COMMA) {
-				args.specs.add(arg);
+				builder.args.add(arg);
 				args.status= POST_VISITOR.checkTerminal(arg);
-				args.sepList.add(this.lexer.getOffset());
+				builder.sepOffsets.add(this.lexer.getOffset());
 				args.endOffset= this.lexer.getOffset() + 1;
 				consumeToken();
 				readLines();
 				continue ITER_ARGS;
 			}
-			// last arg before )
-			if (args.specs.isEmpty() && !arg.hasChildren()) {
-				return;
+			else {
+				if (arg.hasChildren() || !builder.args.isEmpty()) {
+					builder.args.add(arg);
+					args.status= POST_VISITOR.checkTerminal(arg);
+					args.startOffset= builder.args.get(0).startOffset;
+					args.endOffset= arg.endOffset;
+				}
+				break ITER_ARGS;
 			}
-			args.specs.add(arg);
-			args.status= POST_VISITOR.checkTerminal(arg);
-			args.startOffset= args.specs.get(0).startOffset;
-			args.endOffset= arg.endOffset;
-			return;
 		}
+		args.finish(builder);
+		returnArgsBuilder(builder);
 	}
 	
 	final void scanInSpecArgs(final SubIndexed.Args args) {
+		final var builder= this.<SubIndexed.Arg>getArgsBuilder();
 		args.startOffset= args.endOffset= args.rParent.endOffset;
 		ITER_ARGS : while (true) {
 			final SubIndexed.Arg arg= new SubIndexed.Arg(args);
@@ -1326,23 +1344,26 @@
 			}
 			
 			if (this.nextType == RTerminal.COMMA) {
-				args.specs.add(arg);
+				builder.args.add(arg);
 				args.status= POST_VISITOR.checkTerminal(arg);
+				builder.sepOffsets.add(this.lexer.getOffset());
 				args.endOffset= this.lexer.getOffset() + 1;
 				consumeToken();
 				readLines();
 				continue ITER_ARGS;
 			}
-			// last arg before )
-			if (args.specs.isEmpty() && !arg.hasChildren()) {
-				return;
+			else {
+				if (arg.hasChildren() || !builder.args.isEmpty()) {
+					builder.args.add(arg);
+					args.status= POST_VISITOR.checkTerminal(arg);
+					args.startOffset= builder.args.get(0).startOffset;
+					args.endOffset= arg.endOffset;
+				}
+				break ITER_ARGS;
 			}
-			args.specs.add(arg);
-			args.status= POST_VISITOR.checkTerminal(arg);
-			args.startOffset= args.specs.get(0).startOffset;
-			args.endOffset= arg.endOffset;
-			return;
 		}
+		args.finish(builder);
+		returnArgsBuilder(builder);
 	}
 	
 	final boolean recoverCCont() {
@@ -1830,4 +1851,38 @@
 		}
 	}
 	
+	
+	private List<ArgsBuilder<?>> argBuilders= new ArrayList<>(16);
+	private int argBuildersIdx;
+	
+	private void clearArgsBuilder() {
+		int idx= this.argBuildersIdx;
+		while (idx > 0) {
+			final var builder= this.argBuilders.get(--idx);
+			builder.args.clear();
+			builder.sepOffsets.clear();
+		}
+		this.argBuildersIdx= 0;
+	}
+	
+	@SuppressWarnings("unchecked")
+	private <TArg> ArgsBuilder<TArg> getArgsBuilder() {
+		final ArgsBuilder<TArg> builder;
+		if (this.argBuildersIdx < this.argBuilders.size()) {
+			builder= (ArgsBuilder<TArg>)this.argBuilders.get(this.argBuildersIdx);
+		}
+		else {
+			builder= new ArgsBuilder<>();
+			this.argBuilders.add(builder);
+		}
+		this.argBuildersIdx++;
+		return builder;
+	}
+	
+	private void returnArgsBuilder(final ArgsBuilder<?> builder) {
+		builder.args.clear();
+		builder.sepOffsets.clear();
+		this.argBuildersIdx--;
+	}
+	
 }
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java
index 7ffb30f..0975a23 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java
@@ -134,11 +134,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.rightExpr.node };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.rightExpr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SingleValue.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SingleValue.java
index 246c6fd..cbe5c51 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SingleValue.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SingleValue.java
@@ -61,11 +61,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return NO_CHILDREN;
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		return -1;
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java
index e6a0485..e7ef3a0 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java
@@ -113,26 +113,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		final RAstNode nameNode= this.argName;
-		final RAstNode valueNode= this.valueExpr.node;
-		if (nameNode != null) {
-			if (valueNode != null) {
-				return new RAstNode[] { nameNode, valueNode };
-			}
-			else {
-				return new RAstNode[] { nameNode };
-			}
-		}
-		else if (valueNode != null) {
-			return new RAstNode[] { valueNode };
-		}
-		else {
-			return NO_CHILDREN;
-		}
-	}
-	
-	@Override
 	public int getChildIndex(final AstNode child) {
 		if (this.argName == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecList.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecList.java
deleted file mode 100644
index 6879a22..0000000
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecList.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2007, 2021 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.r.core.rsource.ast;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.statet.jcommons.lang.NonNull;
-import org.eclipse.statet.jcommons.lang.NonNullByDefault;
-import org.eclipse.statet.jcommons.lang.Nullable;
-
-import org.eclipse.statet.ltk.ast.core.AstNode;
-import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rsource.RTerminal;
-
-
-/**
- * Comma separated list
- */
-@NonNullByDefault
-abstract class SpecList extends RAstNode {
-	
-	
-	final List<SpecItem> specs= new ArrayList<>(0);
-	
-	
-	SpecList() {
-	}
-	
-	
-	@Override
-	public final @Nullable RTerminal getOperator(final int index) {
-		return null;
-	}
-	
-	
-	@Override
-	public final boolean hasChildren() {
-		return (!this.specs.isEmpty());
-	}
-	
-	@Override
-	public final int getChildCount() {
-		return this.specs.size();
-	}
-	
-	@Override
-	public final RAstNode getChild(final int index) {
-		return this.specs.get(index);
-	}
-	
-	@Override
-	public final RAstNode[] getChildren() {
-		return this.specs.toArray(new @NonNull RAstNode[this.specs.size()]);
-	}
-	
-	@Override
-	public final int getChildIndex(final AstNode child) {
-		for (int i= this.specs.size() - 1; i >= 0; i--) {
-			if (this.specs.get(i) == child) {
-				return i;
-			}
-		}
-		return -1;
-	}
-	
-	@Override
-	public final void acceptInRChildren(final RAstVisitor visitor) throws InvocationTargetException {
-		acceptChildren(visitor, this.specs);
-	}
-	
-	@Override
-	public final void acceptInChildren(final AstVisitor visitor) throws InvocationTargetException {
-		for (final RAstNode child : this.specs) {
-			visitor.visit(child);
-		}
-	}
-	
-	
-	@Override
-	final @Nullable Expression getExpr(final RAstNode child) {
-		return null;
-	}
-	
-	@Override
-	final @Nullable Expression getLeftExpr() {
-		return null;
-	}
-	
-	@Override
-	final @Nullable Expression getRightExpr() {
-		return null;
-	}
-	
-	abstract SpecItem createItem();
-	
-	void appendItem(final SpecItem item) {
-		this.specs.add(item);
-	}
-	
-	
-	@Override
-	final int getMissingExprStatus(final Expression expr) {
-		throw new IllegalArgumentException();
-	}
-	
-}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StdBinary.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StdBinary.java
index b2c35da..204562b 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StdBinary.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StdBinary.java
@@ -63,11 +63,6 @@
 		}
 	}
 	
-	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.leftExpr.node, this.rightExpr.node };
-	}
-	
 	public final RAstNode getLeftChild() {
 		return this.leftExpr.node;
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java
index c4c478b..49f28c8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java
@@ -17,10 +17,10 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_EXPR_AS_REF_MISSING;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
 
-import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.collections.ImIntList;
+import org.eclipse.statet.jcommons.collections.ImList;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -78,14 +78,21 @@
 	public static final class Args extends RAstNode {
 		
 		
-		final List<Arg> specs;
+		private ImList<Arg> args;
+		private ImIntList sepOffsets;
 		
 		
+		@SuppressWarnings("null")
 		Args(final SubIndexed parent) {
 			this.rParent= parent;
-			this.specs= new ArrayList<>();
 		}
 		
+		void finish(final RParser.ArgsBuilder<Arg> argsBuilder) {
+			this.args= ImCollections.toList(argsBuilder.args);
+			this.sepOffsets= ImCollections.toIntList(argsBuilder.sepOffsets);
+		}
+		
+		
 		@Override
 		public final NodeType getNodeType() {
 			return NodeType.SUB_INDEXED_ARGS;
@@ -96,37 +103,40 @@
 			return null;
 		}
 		
+		public ImIntList getSeparatorOffsets() {
+			return this.sepOffsets;
+		}
+		
 		
 		@Override
 		public final boolean hasChildren() {
-			return (!this.specs.isEmpty());
+			return (!this.args.isEmpty());
 		}
 		
 		@Override
 		public final int getChildCount() {
-			return this.specs.size();
+			return this.args.size();
 		}
 		
 		@Override
-		public final RAstNode getChild(final int index) {
-			return this.specs.get(index);
-		}
-		
-		@Override
-		public final RAstNode[] getChildren() {
-			return this.specs.toArray(new @NonNull RAstNode[this.specs.size()]);
+		public final Arg getChild(final int index) {
+			return this.args.get(index);
 		}
 		
 		@Override
 		public final int getChildIndex(final AstNode child) {
-			for (int i= this.specs.size() - 1; i >= 0; i--) {
-				if (this.specs.get(i) == child) {
+			for (int i= this.args.size() - 1; i >= 0; i--) {
+				if (this.args.get(i) == child) {
 					return i;
 				}
 			}
 			return -1;
 		}
 		
+		public ImList<Arg> getArgChildren() {
+			return this.args;
+		}
+		
 		@Override
 		public final void acceptInR(final RAstVisitor visitor) throws InvocationTargetException {
 			visitor.visit(this);
@@ -134,12 +144,14 @@
 		
 		@Override
 		public final void acceptInRChildren(final RAstVisitor visitor) throws InvocationTargetException {
-			acceptChildren(visitor, this.specs);
+			for (final RAstNode arg : this.args) {
+				arg.acceptInR(visitor);
+			}
 		}
 		
 		@Override
 		public final void acceptInChildren(final AstVisitor visitor) throws InvocationTargetException {
-			for (final RAstNode child : this.specs) {
+			for (final RAstNode child : this.args) {
 				visitor.visit(child);
 			}
 		}
@@ -240,11 +252,6 @@
 		}
 	}
 	
-	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.expr.node, this.sublist };
-	}
-	
 	public final RAstNode getRefChild() {
 		return this.expr.node;
 	}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java
index e80fb59..035d7af 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java
@@ -104,11 +104,6 @@
 	}
 	
 	@Override
-	public final RAstNode[] getChildren() {
-		return new RAstNode[] { this.expr.node, this.subname };
-	}
-	
-	@Override
 	public final int getChildIndex(final AstNode child) {
 		if (this.expr.node == child) {
 			return 0;
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java
index f4e28d3..3dd9add 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/RContextInformationValidator.java
@@ -192,7 +192,7 @@
 			return 0;
 		}
 		for (int i= 0; i < last; i++) {
-			if (offset <= args.getSeparatorOffset(i)) {
+			if (offset <= args.getSeparatorOffsets().getAt(i)) {
 				return i;
 			}
 		}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAssistInvocationContext.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAssistInvocationContext.java
index a5ba1bf..0b3f63a 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAssistInvocationContext.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAssistInvocationContext.java
@@ -137,7 +137,7 @@
 				return 0;
 			}
 			for (int argIdx= 0; argIdx < last; argIdx++) {
-				if (args.getSeparatorOffset(argIdx) >= offset) {
+				if (args.getSeparatorOffsets().getAt(argIdx) >= offset) {
 					return argIdx;
 				}
 			}
@@ -150,7 +150,7 @@
 			}
 			final int sep= (argIdx == 0) ?
 					this.node.getArgsOpenOffset() :
-					this.node.getArgsChild().getSeparatorOffset(argIdx - 1);
+					this.node.getArgsChild().getSeparatorOffsets().getAt(argIdx - 1);
 			return sep + 1;
 		}
 		
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAutoEditStrategy.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAutoEditStrategy.java
index 44e16f5..d4cdff7 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAutoEditStrategy.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RAutoEditStrategy.java
@@ -98,7 +98,20 @@
 	
 	private static final char[] CURLY_BRACKETS= new char[] { '{', '}' };
 	
-	private static final StringParserInput DEFAULT_PARSER_INPUT= new StringParserInput();
+	
+	private static final StringParserInput DISPLAY_PARSER_INPUT= new StringParserInput();
+	
+	private static final StringParserInput getParserInput(final String text) {
+		return (Display.getCurrent() == Display.getDefault()) ?
+				DISPLAY_PARSER_INPUT.reset(text) : new StringParserInput(text);
+	}
+	
+	private static final RParser DISPLAY_R_PARSER= new RParser(AstInfo.LEVEL_MINIMAL);
+	
+	private static final RParser getRParser() {
+		return (Display.getCurrent() == Display.getDefault()) ?
+				DISPLAY_R_PARSER : new RParser(AstInfo.LEVEL_MINIMAL);
+	}
 	
 	
 	private class RealTypeListener implements VerifyKeyListener {
@@ -761,8 +774,7 @@
 		int dummyCoffset= c.offset-shift;
 		int dummyCend= dummyCoffset+c.text.length();
 		final AbstractDocument dummyDoc= new Document(text);
-		final TextParserInput parserInput= (Display.getCurrent() == Display.getDefault()) ?
-				DEFAULT_PARSER_INPUT.reset(text) : new StringParserInput(text);
+		final TextParserInput parserInput= getParserInput(text);
 		
 		// Lines to indent
 		int dummyFirstLine= dummyDoc.getLineOfOffset(dummyCoffset);
@@ -775,7 +787,7 @@
 		}
 		
 		// Compute indent
-		final RParser rParser= new RParser(AstInfo.LEVEL_MINIMAL);
+		final RParser rParser= getRParser();
 		final RAstNode rootNode= rParser.scanSourceUnit(parserInput.init());
 		final RSourceIndenter indenter= getIndenter();
 		indenter.setup(this.rCoreAccess);
diff --git a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/AlphaType.java b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/AlphaType.java
index 92cf18a..e775b3d 100644
--- a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/AlphaType.java
+++ b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/AlphaType.java
@@ -37,7 +37,6 @@
 import org.eclipse.statet.ecommons.ui.components.DoubleText;
 import org.eclipse.statet.ecommons.ui.components.ObjValueEvent;
 
-import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.r.core.model.RGraphicFunctions;
 import org.eclipse.statet.r.core.rsource.ast.RParser;
 import org.eclipse.statet.r.ui.graphics.RAlphaChooser;
@@ -87,7 +86,7 @@
 		Float newValue= null;
 		try {
 			if (newExpr != null && newExpr.getTypeKey() == RTypedExpr.R) {
-				final RParser rParser= new RParser(AstInfo.LEVEL_MODEL_DEFAULT);
+				final RParser rParser= RExprWidget.getDisplayRParser();
 				newValue= this.rGraphicFunctions.parseAlpha(rParser.scanExpr(
 						new StringParserInput(newExpr.getExpr()).init() ));
 			}
diff --git a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/ColorType.java b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/ColorType.java
index 2448b08..c854f7f 100644
--- a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/ColorType.java
+++ b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/ColorType.java
@@ -42,7 +42,6 @@
 import org.eclipse.statet.ecommons.ui.components.DoubleText;
 import org.eclipse.statet.ecommons.ui.components.ObjValueEvent;
 
-import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.r.core.model.RGraphicFunctions;
 import org.eclipse.statet.r.core.rsource.ast.RParser;
 import org.eclipse.statet.r.ui.graphics.RAlphaChooser;
@@ -92,7 +91,7 @@
 		ColorDef newValue= null;
 		if (newExpr != null && newExpr.getTypeKey() == RTypedExpr.R) {
 			try {
-				final RParser rParser= new RParser(AstInfo.LEVEL_MODEL_DEFAULT);
+				final RParser rParser= RExprWidget.getDisplayRParser();
 				newValue= this.rGraphicFunctions.parseColorDef(rParser.scanExpr(
 						new StringParserInput(newExpr.getExpr()).init() ));
 			}
diff --git a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/FontFamilyType.java b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/FontFamilyType.java
index c7f7b34..03be6c6 100644
--- a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/FontFamilyType.java
+++ b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/FontFamilyType.java
@@ -34,7 +34,6 @@
 
 import org.eclipse.statet.ecommons.ui.components.ObjValueEvent;
 
-import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.r.core.model.RGraphicFunctions;
 import org.eclipse.statet.r.core.rsource.ast.RParser;
 import org.eclipse.statet.r.ui.graphics.RFontFamilyChooser;
@@ -84,7 +83,7 @@
 		String newValue= null;
 		try {
 			if (newExpr != null && newExpr.getTypeKey() == RTypedExpr.R) {
-				final RParser rParser= new RParser(AstInfo.LEVEL_MODEL_DEFAULT);
+				final RParser rParser= RExprWidget.getDisplayRParser();
 				newValue= this.rGraphicFunctions.parseFontFamily(rParser.scanExpr(
 						new StringParserInput(newExpr.getExpr()).init() ));
 			}
diff --git a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/RExprWidget.java b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/RExprWidget.java
index 64cb146..ba71ffc 100644
--- a/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/RExprWidget.java
+++ b/rtm/org.eclipse.statet.rtm.base.ui/src/org/eclipse/statet/rtm/base/ui/rexpr/RExprWidget.java
@@ -49,6 +49,8 @@
 import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
 import org.eclipse.statet.ecommons.ui.util.MenuUtils;
 
+import org.eclipse.statet.ltk.ast.core.AstInfo;
+import org.eclipse.statet.r.core.rsource.ast.RParser;
 import org.eclipse.statet.rtm.base.ui.RtModelUIPlugin;
 import org.eclipse.statet.rtm.base.util.RExprType;
 import org.eclipse.statet.rtm.base.util.RExprTypes;
@@ -58,6 +60,13 @@
 public class RExprWidget extends Composite implements IObjValueWidget<RTypedExpr> {
 	
 	
+	private static final RParser DISPLAY_R_PARSER= new RParser(AstInfo.LEVEL_MODEL_DEFAULT);
+	
+	protected static final RParser getDisplayRParser() {
+		return DISPLAY_R_PARSER;
+	}
+	
+	
 	public static class TypeDef implements IObjValueListener<RTypedExpr> {