Bug 572862: [R-Editor] Add seperate text style type for pipe operator

Change-Id: I164618b44af710f61f18e3590fcb92199058b6b4
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RTerminal.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RTerminal.java
index 3173626..c4549d3 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RTerminal.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RTerminal.java
@@ -17,6 +17,8 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.LANG_VERSION_4_0;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.LANG_VERSION_4_1;
 
+import java.util.List;
+
 import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.util.Version;
@@ -181,10 +183,10 @@
 	public static final String S_INF= "Inf"; //$NON-NLS-1$
 	
 	
-	public static String[] textArray(final RTerminal[] list) {
-		final String[] texts= new @NonNull String[list.length];
+	public static @NonNull String[] textArray(final List<RTerminal> list) {
+		final var texts= new @NonNull String[list.size()];
 		for (int i= 0; i < texts.length; i++) {
-			texts[i]= list[i].text;
+			texts[i]= list.get(i).text;
 		}
 		return texts;
 	}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.java
index 23416d9..0618faa 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.java
@@ -63,6 +63,8 @@
 	public static String RSyntaxColoring_Assignment_description;
 	public static String RSyntaxColoring_Assignment_Equalsign_label;
 	public static String RSyntaxColoring_Assignment_Equalsign_description;
+	public static String RSyntaxColoring_Assignment_Pipe_label;
+	public static String RSyntaxColoring_Assignment_Pipe_description;
 	public static String RSyntaxColoring_Operators_label;
 	public static String RSyntaxColoring_Operators_description;
 	public static String RSyntaxColoring_Operators_Logical_label;
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.properties b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.properties
index 643eeee..4601b25 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.properties
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/Messages.properties
@@ -52,6 +52,8 @@
 RSyntaxColoring_Assignment_description=        The style used in the R editor for the assignment operators
 RSyntaxColoring_Assignment_Equalsign_label= Equal Sign
 RSyntaxColoring_Assignment_Equalsign_description= The extra style used optionally in the R editor for the \nsingle equal sign
+RSyntaxColoring_Assignment_Pipe_label= Pipe Operator
+RSyntaxColoring_Assignment_Pipe_description= The extra style used optionally in the R editor for the \npipe operators
 RSyntaxColoring_Operators_label= Common Operators
 RSyntaxColoring_Operators_description=         The style used in the R editor for arithmetic and \nother operators
 RSyntaxColoring_Operators_Logical_label= Logical Operators
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java
index 906c4db..bd9883e 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java
@@ -21,6 +21,8 @@
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.ui.editors.text.EditorsUI;
 
+import org.eclipse.statet.jcommons.collections.ImList;
+
 import org.eclipse.statet.ecommons.preferences.core.Preference;
 import org.eclipse.statet.ecommons.preferences.core.Preference.StringArrayPref;
 import org.eclipse.statet.ecommons.preferences.core.util.PreferenceUtils;
@@ -135,47 +137,62 @@
 								SyntaxNode.createUseNoExtraStyle(RUIPreferenceConstants.R.TS_NUMBERS_ROOT),
 								SyntaxNode.createUseCustomStyle() }, null ),
 				}),
-				new StyleNode(Messages.RSyntaxColoring_SpecialConstants_label, addListToTooltip(Messages.RSyntaxColoring_SpecialConstants_description, IRTextTokens.SPECIALCONST),
+				new StyleNode(Messages.RSyntaxColoring_SpecialConstants_label,
+						addListToTooltip(Messages.RSyntaxColoring_SpecialConstants_description, IRTextTokens.SPECIALCONST),
 						RUIPreferenceConstants.R.TS_SPECIAL_CONSTANTS_ROOT, new SyntaxNode.UseStyle[] {
 							SyntaxNode.createUseCustomStyle()
 						}, null ),
-				new StyleNode(Messages.RSyntaxColoring_LogicalConstants_label, addListToTooltip(Messages.RSyntaxColoring_LogicalConstants_description, IRTextTokens.LOGICALCONST),
+				new StyleNode(Messages.RSyntaxColoring_LogicalConstants_label,
+						addListToTooltip(Messages.RSyntaxColoring_LogicalConstants_description, IRTextTokens.LOGICALCONST),
 						RUIPreferenceConstants.R.TS_LOGICAL_CONSTANTS_ROOT, new SyntaxNode.UseStyle[] {
 							SyntaxNode.createUseCustomStyle()
 						}, null ),
-				new StyleNode(Messages.RSyntaxColoring_Flowcontrol_label, addListToTooltip(Messages.RSyntaxColoring_Flowcontrol_description, IRTextTokens.FLOWCONTROL),
+				new StyleNode(Messages.RSyntaxColoring_Flowcontrol_label,
+						addListToTooltip(Messages.RSyntaxColoring_Flowcontrol_description, IRTextTokens.FLOWCONTROL),
 						RUIPreferenceConstants.R.TS_FLOWCONTROL_ROOT, new SyntaxNode.UseStyle[] {
 							SyntaxNode.createUseCustomStyle()
 						}, null ),
-				new StyleNode(Messages.RSyntaxColoring_Separators_label, addListToTooltip(Messages.RSyntaxColoring_Separators_description, IRTextTokens.SEPARATOR),
+				new StyleNode(Messages.RSyntaxColoring_Separators_label,
+						addListToTooltip(Messages.RSyntaxColoring_Separators_description, IRTextTokens.SEPARATOR),
 						RUIPreferenceConstants.R.TS_SEPARATORS_ROOT, new SyntaxNode.UseStyle[] {
 							SyntaxNode.createUseCustomStyle()
 						}, null ),
-				new StyleNode(Messages.RSyntaxColoring_Assignment_label, addListToTooltip(Messages.RSyntaxColoring_Assignment_description, new String[] { "<-", "->", "<<-", "->>", addExtraStyleNoteToTooltip("= ({0})") }), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+				new StyleNode(Messages.RSyntaxColoring_Assignment_label,
+						addListToTooltip(Messages.RSyntaxColoring_Assignment_description, new String[] { "<-", "->", "<<-", "->>", addExtraStyleNoteToTooltip("= ({0})") }), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
 						RUIPreferenceConstants.R.TS_ASSIGNMENT_ROOT, new SyntaxNode.UseStyle[] {
 							SyntaxNode.createUseCustomStyle()
 						}, new SyntaxNode[] {
-					new StyleNode(Messages.RSyntaxColoring_Assignment_Equalsign_label, addListToTooltip(Messages.RSyntaxColoring_Assignment_Equalsign_description, new String[] { "=" }),  //$NON-NLS-1$
+					new StyleNode(Messages.RSyntaxColoring_Assignment_Equalsign_label,
+							addListToTooltip(Messages.RSyntaxColoring_Assignment_Equalsign_description, IRTextTokens.ASSIGN_SUB_EQUAL),
 							RUIPreferenceConstants.R.TS_ASSIGNMENT_SUB_EQUALSIGN_ROOT, new SyntaxNode.UseStyle[] {
 								SyntaxNode.createUseNoExtraStyle(RUIPreferenceConstants.R.TS_ASSIGNMENT_ROOT),
 								SyntaxNode.createUseCustomStyle()
 							}, null ),
+					new StyleNode(Messages.RSyntaxColoring_Assignment_Pipe_label,
+							addListToTooltip(Messages.RSyntaxColoring_Assignment_Pipe_description, IRTextTokens.ASSIGN_SUB_PIPE),
+							RUIPreferenceConstants.R.TS_ASSIGNMENT_SUB_PIPE_ROOT, new SyntaxNode.UseStyle[] {
+								SyntaxNode.createUseNoExtraStyle(RUIPreferenceConstants.R.TS_ASSIGNMENT_ROOT),
+								SyntaxNode.createUseCustomStyle()
+					}, null ),
 				}),
 				new StyleNode(Messages.RSyntaxColoring_Operators_label, Messages.RSyntaxColoring_Operators_description,
 						RUIPreferenceConstants.R.TS_OTHER_OPERATORS_ROOT, new SyntaxNode.UseStyle[] {
 							SyntaxNode.createUseCustomStyle()
 						}, new SyntaxNode[] {
-					new StyleNode(Messages.RSyntaxColoring_Operators_Logical_label, addListToTooltip(Messages.RSyntaxColoring_Operators_Logical_description, IRTextTokens.OP_SUB_LOGICAL),
+					new StyleNode(Messages.RSyntaxColoring_Operators_Logical_label,
+							addListToTooltip(Messages.RSyntaxColoring_Operators_Logical_description, IRTextTokens.OP_SUB_LOGICAL),
 							RUIPreferenceConstants.R.TS_OPERATORS_SUB_LOGICAL_ROOT, new SyntaxNode.UseStyle[] {
 								SyntaxNode.createUseNoExtraStyle(RUIPreferenceConstants.R.TS_OTHER_OPERATORS_ROOT),
 								SyntaxNode.createUseCustomStyle()
 							}, null ),
-					new StyleNode(Messages.RSyntaxColoring_Operators_Relational_label, addListToTooltip(Messages.RSyntaxColoring_Operators_Relational_description, IRTextTokens.OP_SUB_RELATIONAL),
+					new StyleNode(Messages.RSyntaxColoring_Operators_Relational_label,
+							addListToTooltip(Messages.RSyntaxColoring_Operators_Relational_description, IRTextTokens.OP_SUB_RELATIONAL),
 							RUIPreferenceConstants.R.TS_OPERATORS_SUB_RELATIONAL_ROOT, new SyntaxNode.UseStyle[] {
 								SyntaxNode.createUseNoExtraStyle(RUIPreferenceConstants.R.TS_OTHER_OPERATORS_ROOT),
 								SyntaxNode.createUseCustomStyle()
 							}, null ),
-					new StyleNode(Messages.RSyntaxColoring_Operators_Userdefined_label, addListToTooltip(Messages.RSyntaxColoring_Operators_Userdefined_description, new String[] { "%\u2026%" }),  //$NON-NLS-1$
+					new StyleNode(Messages.RSyntaxColoring_Operators_Userdefined_label,
+							addListToTooltip(Messages.RSyntaxColoring_Operators_Userdefined_description, new String[] { "%\u2026%" }),  //$NON-NLS-1$
 							RUIPreferenceConstants.R.TS_OPERATORS_SUB_USERDEFINED_ROOT, new SyntaxNode.UseStyle[] {
 								SyntaxNode.createUseNoExtraStyle(RUIPreferenceConstants.R.TS_OTHER_OPERATORS_ROOT),
 								SyntaxNode.createUseCustomStyle()
@@ -240,7 +257,7 @@
 				textStyles );
 	}
 	
-	protected String addListToTooltip(final String tooltip, final RTerminal[] listItems) {
+	protected String addListToTooltip(final String tooltip, final ImList<RTerminal> listItems) {
 		return addListToTooltip(tooltip, RTerminal.textArray(listItems));
 	}
 	
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreviewCode.txt b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreviewCode.txt
index c1c125b..5ac4b6b 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreviewCode.txt
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreviewCode.txt
@@ -1,24 +1,25 @@
-#' Compute the sample median.
+#' Computes the sample median.
 #' 
-#' @param x an object for which a method has been defined, or a numeric
-#'      vector containing the values whose median is to be computed.
+#' @param x a numeric vector containing the values whose median is to be
+#'     computed.
 #' @param na.rm a logical value indicating whether 'NA' values should be
-#'      stripped before the computation proceeds.
+#'     stripped before the computation proceeds.
 median <- function (x, na.rm = FALSE) {
-    if (is.factor(x) || mode(x) != "numeric") 
-        stop("need numeric data")     # TODO: Translate message
-    if (na.rm) 
-        x <- x[!is.na(x)]
-    else if (any(is.na(x))) 
-        return(NA)
-    n <- length(x)
-    if (n == 0) 
-        return(NA)
-    half <- (n + 1)/2
-    if (n%%2 == 1) {
-        sort(x, partial = half)[half]
-    }
-    else {
-        sum(sort(x, partial = c(half, half + 1))[c(half, half + 1)])/2
-    }
+	if (is.factor(x) || mode(x) != "numeric") 
+		stop("need numeric data")     # TODO: Translate message
+	if (na.rm) {
+		x <- x[!is.na(x)]
+	} else if (any(is.na(x))) {
+		return(NA)
+	}
+	n <- length(x)
+	if (n == 0) 
+		return(NA)
+	half <- (n + 1)/2
+	if (n %% 2 == 1) {
+		sort(x, partial = half)[half]
+	}
+	else {
+		sort(x, partial = c(half, half + 1))[c(half, half + 1)] |> sum() / 2
+	}
 }
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/RUIPreferenceConstants.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/RUIPreferenceConstants.java
index 0b461fc..eedb7e7 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/RUIPreferenceConstants.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/RUIPreferenceConstants.java
@@ -81,6 +81,7 @@
 		String TS_SEPARATORS_ROOT = IRTextTokens.SEPARATOR_KEY;
 		String TS_ASSIGNMENT_ROOT = IRTextTokens.ASSIGN_KEY;
 		String TS_ASSIGNMENT_SUB_EQUALSIGN_ROOT = IRTextTokens.ASSIGN_SUB_EQUAL_KEY;
+		String TS_ASSIGNMENT_SUB_PIPE_ROOT = IRTextTokens.ASSIGN_SUB_PIPE_KEY;
 		String TS_OTHER_OPERATORS_ROOT = IRTextTokens.OP_KEY;
 		String TS_OPERATORS_SUB_LOGICAL_ROOT = IRTextTokens.OP_SUB_LOGICAL_KEY;
 		String TS_OPERATORS_SUB_RELATIONAL_ROOT = IRTextTokens.OP_SUB_RELATIONAL_KEY;
@@ -249,6 +250,13 @@
 		pref.putBoolean(R.TS_ASSIGNMENT_SUB_EQUALSIGN_ROOT + TEXTSTYLE_UNDERLINE_SUFFIX, false);
 		pref.putBoolean(R.TS_ASSIGNMENT_SUB_EQUALSIGN_ROOT + TEXTSTYLE_STRIKETHROUGH_SUFFIX, false);
 		
+		pref.put(R.TS_ASSIGNMENT_SUB_PIPE_ROOT + TEXTSTYLE_USE_SUFFIX, R.TS_ASSIGNMENT_ROOT);
+		pref.put(R.TS_ASSIGNMENT_SUB_PIPE_ROOT + TEXTSTYLE_COLOR_SUFFIX, defaultColor);
+		pref.putBoolean(R.TS_ASSIGNMENT_SUB_PIPE_ROOT + TEXTSTYLE_BOLD_SUFFIX, false);
+		pref.putBoolean(R.TS_ASSIGNMENT_SUB_PIPE_ROOT + TEXTSTYLE_ITALIC_SUFFIX, false);
+		pref.putBoolean(R.TS_ASSIGNMENT_SUB_PIPE_ROOT + TEXTSTYLE_UNDERLINE_SUFFIX, false);
+		pref.putBoolean(R.TS_ASSIGNMENT_SUB_PIPE_ROOT + TEXTSTYLE_STRIKETHROUGH_SUFFIX, false);
+		
 		color = theme.getColorPrefValue(IWaThemeConstants.CODE_OPERATOR_COLOR);
 		pref.put(R.TS_OTHER_OPERATORS_ROOT + TEXTSTYLE_COLOR_SUFFIX, color);
 		pref.putBoolean(R.TS_OTHER_OPERATORS_ROOT + TEXTSTYLE_BOLD_SUFFIX, false);
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java
index 18b6a93..115a9d3 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java
@@ -14,6 +14,9 @@
 
 package org.eclipse.statet.r.ui.text.r;
 
+import org.eclipse.statet.jcommons.collections.ImCollections;
+import org.eclipse.statet.jcommons.collections.ImList;
+
 import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
@@ -23,148 +26,133 @@
  */
 public interface IRTextTokens {
 	
-	public static final RTerminal[] SYMBOL = new RTerminal[] {
-		RTerminal.SYMBOL,
-//		RTerminal.SYMBOL_G, // colored like a string because of partitioning
-	};
-	public static final RTerminal[] STRING = new RTerminal[] {
-		RTerminal.STRING_D,
-		RTerminal.STRING_S,
-		RTerminal.STRING_R,
-	};
-	public static final RTerminal[] NUM = new RTerminal[] {
-		RTerminal.NUM_NUM,
-	};
-	public static final RTerminal[] NUM_SUB_INT = new RTerminal[] {
-		RTerminal.NUM_INT,
-	};
-	public static final RTerminal[] NUM_SUB_CPLX = new RTerminal[] {
-		RTerminal.NUM_CPLX,
-	};
-	public static final RTerminal[] SPECIALCONST = new RTerminal[] {
-		RTerminal.NULL,
-		RTerminal.NA,
-		RTerminal.NA_REAL,
-		RTerminal.NA_INT,
-		RTerminal.NA_CPLX,
-		RTerminal.NA_CHAR,
-		RTerminal.INF,
-		RTerminal.NAN,
-	};
-	public static final RTerminal[] LOGICALCONST = new RTerminal[] {
-		RTerminal.TRUE,
-		RTerminal.FALSE,
-	};
+	static final ImList<RTerminal> SYMBOL= ImCollections.newList(
+			RTerminal.SYMBOL );
+//			RTerminal.SYMBOL_G ); // colored like a string because of partitioning
 	
-	public static final RTerminal[] FLOWCONTROL = new RTerminal[] {
-		RTerminal.IF,
-		RTerminal.ELSE,
-		RTerminal.FOR,
-		RTerminal.IN,
-		RTerminal.WHILE,
-		RTerminal.REPEAT,
-		RTerminal.NEXT,
-		RTerminal.BREAK,
-		RTerminal.FUNCTION,
-		RTerminal.FUNCTION_B,
-	};
-	public static final RTerminal[] GROUPING = new RTerminal[] {
-		RTerminal.BLOCK_OPEN,
-		RTerminal.BLOCK_CLOSE,
-		RTerminal.GROUP_OPEN,
-		RTerminal.GROUP_CLOSE,
-	};
-	public static final RTerminal[] SEPARATOR = new RTerminal[] {
-		RTerminal.COMMA,
-		RTerminal.SEMICOLON,
-	};
-	public static final RTerminal[] NSGET = new RTerminal[] {
-		RTerminal.NS_GET,
-		RTerminal.NS_GET_INT,
-	};
-	public static final RTerminal[] SUBACCESS = new RTerminal[] {
-		RTerminal.SUB_INDEXED_S_OPEN,
-		RTerminal.SUB_INDEXED_D_OPEN,
-		RTerminal.SUB_INDEXED_CLOSE,
-		RTerminal.SUB_NAMED_PART,
-		RTerminal.SUB_NAMED_SLOT,
-	};
-	public static final RTerminal[] ASSIGN = new RTerminal[] {
-		RTerminal.ARROW_LEFT_S,
-		RTerminal.ARROW_LEFT_D,
-		RTerminal.ARROW_RIGHT_S,
-		RTerminal.ARROW_RIGHT_D,
-		RTerminal.COLON_EQUAL,
-		RTerminal.PIPE_RIGHT,
-	};
-	public static final RTerminal[] ASSIGN_SUB_EQUAL = new RTerminal[] {
-		RTerminal.EQUAL,
-	};
-	public static final RTerminal[] OP = new RTerminal[] {
-		RTerminal.PLUS,
-		RTerminal.MINUS,
-		RTerminal.MULT,
-		RTerminal.DIV,
-		RTerminal.POWER,
-		RTerminal.SEQ,
-		RTerminal.TILDE,
-		RTerminal.QUESTIONMARK,
-	};
-	public static final RTerminal[] OP_SUB_LOGICAL = new RTerminal[] {
-		RTerminal.NOT,
-		RTerminal.AND,
-		RTerminal.AND_D,
-		RTerminal.OR,
-		RTerminal.OR_D,
-	};
-	public static final RTerminal[] OP_SUB_RELATIONAL = new RTerminal[] {
-		RTerminal.REL_EQ,
-		RTerminal.REL_GT,
-		RTerminal.REL_GE,
-		RTerminal.REL_LE,
-		RTerminal.REL_LT,
-		RTerminal.REL_NE,
-	};
+	static final ImList<RTerminal> STRING= ImCollections.newList(
+			RTerminal.STRING_D, RTerminal.STRING_S,
+			RTerminal.STRING_R );
 	
-	public static final RTerminal[] UNDEFINED = new RTerminal[] {
-		RTerminal.UNKNOWN,
-	};
-	public static final RTerminal[] COMMENT = new RTerminal[] {
-		RTerminal.COMMENT, RTerminal.ROXYGEN_COMMENT,
-	};
+	static final ImList<RTerminal> NUM= ImCollections.newList(
+			RTerminal.NUM_NUM );
+	
+	static final ImList<RTerminal> NUM_SUB_INT= ImCollections.newList(
+			RTerminal.NUM_INT );
+	
+	static final ImList<RTerminal> NUM_SUB_CPLX= ImCollections.newList(
+			RTerminal.NUM_CPLX );
+	
+	static final ImList<RTerminal> SPECIALCONST= ImCollections.newList(
+			RTerminal.NULL,
+			RTerminal.NA,
+			RTerminal.NA_REAL,
+			RTerminal.NA_INT,
+			RTerminal.NA_CPLX,
+			RTerminal.NA_CHAR,
+			RTerminal.INF,
+			RTerminal.NAN );
+	
+	static final ImList<RTerminal> LOGICALCONST= ImCollections.newList(
+			RTerminal.TRUE,
+			RTerminal.FALSE );
+	
+	static final ImList<RTerminal> FLOWCONTROL= ImCollections.newList(
+			RTerminal.IF, RTerminal.ELSE,
+			RTerminal.FOR, RTerminal.IN,
+			RTerminal.WHILE,
+			RTerminal.REPEAT,
+			RTerminal.NEXT, RTerminal.BREAK,
+			RTerminal.FUNCTION, RTerminal.FUNCTION_B );
+	
+	static final ImList<RTerminal> GROUPING= ImCollections.newList(
+			RTerminal.BLOCK_OPEN, RTerminal.BLOCK_CLOSE,
+			RTerminal.GROUP_OPEN, RTerminal.GROUP_CLOSE );
+	
+	static final ImList<RTerminal> SEPARATOR= ImCollections.newList(
+			RTerminal.COMMA,
+			RTerminal.SEMICOLON );
+	
+	static final ImList<RTerminal> NSGET= ImCollections.newList(
+			RTerminal.NS_GET,
+			RTerminal.NS_GET_INT );
+	
+	static final ImList<RTerminal> SUBACCESS= ImCollections.newList(
+			RTerminal.SUB_INDEXED_S_OPEN, RTerminal.SUB_INDEXED_D_OPEN, RTerminal.SUB_INDEXED_CLOSE,
+			RTerminal.SUB_NAMED_PART,
+			RTerminal.SUB_NAMED_SLOT );
+	
+	static final ImList<RTerminal> ASSIGN= ImCollections.newList(
+			RTerminal.ARROW_LEFT_S, RTerminal.ARROW_LEFT_D,
+			RTerminal.ARROW_RIGHT_S, RTerminal.ARROW_RIGHT_D,
+			RTerminal.COLON_EQUAL );
+			
+	static final ImList<RTerminal> ASSIGN_SUB_EQUAL= ImCollections.newList(
+			RTerminal.EQUAL );
+	
+	static final ImList<RTerminal> ASSIGN_SUB_PIPE= ImCollections.newList(
+			RTerminal.PIPE_RIGHT );
+	
+	static final ImList<RTerminal> OP= ImCollections.newList(
+			RTerminal.PLUS,
+			RTerminal.MINUS,
+			RTerminal.MULT,
+			RTerminal.DIV,
+			RTerminal.POWER,
+			RTerminal.SEQ,
+			RTerminal.TILDE,
+			RTerminal.QUESTIONMARK );
+	
+	static final ImList<RTerminal> OP_SUB_LOGICAL= ImCollections.newList(
+			RTerminal.NOT,
+			RTerminal.AND, RTerminal.AND_D,
+			RTerminal.OR, RTerminal.OR_D );
+	
+	static final ImList<RTerminal> OP_SUB_RELATIONAL= ImCollections.newList(
+			RTerminal.REL_EQ, RTerminal.REL_NE,
+			RTerminal.REL_GT, RTerminal.REL_GE,
+			RTerminal.REL_LT, RTerminal.REL_LE );
+	
+	public static final ImList<RTerminal> UNDEFINED= ImCollections.newList(
+			RTerminal.UNKNOWN );
+	
+	public static final ImList<RTerminal> COMMENT= ImCollections.newList(
+			RTerminal.COMMENT,
+			RTerminal.ROXYGEN_COMMENT );
 	
 	
-	public static final String ROOT = "text_R_"; //$NON-NLS-1$
+	public static final String ROOT= "text_R_"; //$NON-NLS-1$
 	
-	public static final String SYMBOL_KEY = ROOT+"rDefault"; //$NON-NLS-1$
-	public static final String SYMBOL_SUB_ASSIGN_KEY = SYMBOL_KEY + ".Assignment"; //$NON-NLS-1$
-	public static final String SYMBOL_SUB_LOGICAL_KEY = SYMBOL_KEY + ".Logical"; //$NON-NLS-1$
-	public static final String SYMBOL_SUB_FLOWCONTROL_KEY = SYMBOL_KEY + ".Flowcontrol"; //$NON-NLS-1$
-	public static final String SYMBOL_SUB_CUSTOM1_KEY = SYMBOL_KEY + ".Custom2"; //$NON-NLS-1$
-	public static final String SYMBOL_SUB_CUSTOM2_KEY = SYMBOL_KEY + ".Custom1"; //$NON-NLS-1$
+	public static final String SYMBOL_KEY= ROOT+"rDefault"; //$NON-NLS-1$
+	public static final String SYMBOL_SUB_ASSIGN_KEY= SYMBOL_KEY + ".Assignment"; //$NON-NLS-1$
+	public static final String SYMBOL_SUB_LOGICAL_KEY= SYMBOL_KEY + ".Logical"; //$NON-NLS-1$
+	public static final String SYMBOL_SUB_FLOWCONTROL_KEY= SYMBOL_KEY + ".Flowcontrol"; //$NON-NLS-1$
+	public static final String SYMBOL_SUB_CUSTOM1_KEY= SYMBOL_KEY + ".Custom2"; //$NON-NLS-1$
+	public static final String SYMBOL_SUB_CUSTOM2_KEY= SYMBOL_KEY + ".Custom1"; //$NON-NLS-1$
 	
-	public static final String STRING_KEY = ROOT+"rString"; //$NON-NLS-1$
-	public static final String NUM_KEY = ROOT+"rNumbers"; //$NON-NLS-1$
-	public static final String NUM_SUB_INT_KEY = NUM_KEY+".Integer"; //$NON-NLS-1$
-	public static final String NUM_SUB_CPLX_KEY = NUM_KEY+".Complex"; //$NON-NLS-1$
+	public static final String STRING_KEY= ROOT+"rString"; //$NON-NLS-1$
+	public static final String NUM_KEY= ROOT+"rNumbers"; //$NON-NLS-1$
+	public static final String NUM_SUB_INT_KEY= NUM_KEY+".Integer"; //$NON-NLS-1$
+	public static final String NUM_SUB_CPLX_KEY= NUM_KEY+".Complex"; //$NON-NLS-1$
 	
-	public static final String SPECIALCONST_KEY = ROOT+"rSpecialConstants"; //$NON-NLS-1$
-	public static final String LOGICALCONST_KEY = ROOT+"rLogicalConstants"; //$NON-NLS-1$
-	public static final String GROUPING_KEY = ROOT+"rGrouping"; //$NON-NLS-1$
-	public static final String SEPARATOR_KEY = ROOT+"rSeparators"; //$NON-NLS-1$
-	public static final String SUBACCESS_KEY = ROOT+"rIndexing";	 //$NON-NLS-1$
-	public static final String ASSIGN_KEY = ROOT+"rAssignment"; //$NON-NLS-1$
-	public static final String ASSIGN_SUB_EQUAL_KEY = ASSIGN_KEY + ".Equalsign"; //$NON-NLS-1$
-	public static final String FLOWCONTROL_KEY = ROOT+"rFlowcontrol"; //$NON-NLS-1$
-	public static final String OP_KEY = ROOT+"rOtherOperators"; //$NON-NLS-1$
-	public static final String OP_SUB_LOGICAL_KEY = OP_KEY + ".Logical"; //$NON-NLS-1$
-	public static final String OP_SUB_RELATIONAL_KEY = OP_KEY + ".Relational"; //$NON-NLS-1$
-	public static final String OP_SUB_USERDEFINED_KEY = OP_KEY + ".Userdefined"; //$NON-NLS-1$
+	public static final String SPECIALCONST_KEY= ROOT+"rSpecialConstants"; //$NON-NLS-1$
+	public static final String LOGICALCONST_KEY= ROOT+"rLogicalConstants"; //$NON-NLS-1$
+	public static final String GROUPING_KEY= ROOT+"rGrouping"; //$NON-NLS-1$
+	public static final String SEPARATOR_KEY= ROOT+"rSeparators"; //$NON-NLS-1$
+	public static final String SUBACCESS_KEY= ROOT+"rIndexing";	 //$NON-NLS-1$
+	public static final String ASSIGN_KEY= ROOT+"rAssignment"; //$NON-NLS-1$
+	public static final String ASSIGN_SUB_EQUAL_KEY= ASSIGN_KEY + ".Equalsign"; //$NON-NLS-1$
+	public static final String ASSIGN_SUB_PIPE_KEY= ASSIGN_KEY + ".Pipe"; //$NON-NLS-1$
+	public static final String FLOWCONTROL_KEY= ROOT+"rFlowcontrol"; //$NON-NLS-1$
+	public static final String OP_KEY= ROOT+"rOtherOperators"; //$NON-NLS-1$
+	public static final String OP_SUB_LOGICAL_KEY= OP_KEY + ".Logical"; //$NON-NLS-1$
+	public static final String OP_SUB_RELATIONAL_KEY= OP_KEY + ".Relational"; //$NON-NLS-1$
+	public static final String OP_SUB_USERDEFINED_KEY= OP_KEY + ".Userdefined"; //$NON-NLS-1$
 	
-	public static final String COMMENT_KEY = ROOT+"rComment"; //$NON-NLS-1$
-	public static final String TASK_TAG_KEY = ROOT+"taskTag"; //$NON-NLS-1$
-	public static final String ROXYGEN_KEY = ROOT + "rRoxygen"; //$NON-NLS-1$
-	public static final String ROXYGEN_TAG_KEY = ROOT + "rRoxygenTag"; //$NON-NLS-1$
-	public static final String UNDEFINED_KEY = ROOT+"rUndefined"; //$NON-NLS-1$
+	public static final String COMMENT_KEY= ROOT+"rComment"; //$NON-NLS-1$
+	public static final String TASK_TAG_KEY= ROOT+"taskTag"; //$NON-NLS-1$
+	public static final String ROXYGEN_KEY= ROOT + "rRoxygen"; //$NON-NLS-1$
+	public static final String ROXYGEN_TAG_KEY= ROOT + "rRoxygenTag"; //$NON-NLS-1$
+	public static final String UNDEFINED_KEY= ROOT+"rUndefined"; //$NON-NLS-1$
 	
 }
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java
index e3aeafa..c0ac619 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java
@@ -24,6 +24,8 @@
 import org.eclipse.jface.text.rules.ITokenScanner;
 import org.eclipse.jface.text.rules.Token;
 
+import org.eclipse.statet.jcommons.collections.ImList;
+
 import org.eclipse.statet.ecommons.text.core.input.DocumentParserInput;
 import org.eclipse.statet.ecommons.text.ui.presentation.ITextPresentationConstants;
 import org.eclipse.statet.ecommons.text.ui.settings.TextStyleManager;
@@ -50,9 +52,10 @@
 		}
 	}
 	
-	protected static void putAll(final Map<RTerminal, IToken> map, final RTerminal[] types, final IToken token) {
-		for (int i= 0; i < types.length; i++) {
-			map.put(types[i], token);
+	protected static void putAll(final Map<RTerminal, IToken> map, final ImList<RTerminal> types,
+			final IToken token) {
+		for (final RTerminal terminal : types) {
+			map.put(terminal, token);
 		}
 	}
 	
@@ -189,6 +192,7 @@
 		putAll(map, IRTextTokens.SEPARATOR, getToken(IRTextTokens.SEPARATOR_KEY));
 		putAll(map, IRTextTokens.ASSIGN, getToken(IRTextTokens.ASSIGN_KEY));
 		putAll(map, IRTextTokens.ASSIGN_SUB_EQUAL, getToken(IRTextTokens.ASSIGN_SUB_EQUAL_KEY));
+		putAll(map, IRTextTokens.ASSIGN_SUB_PIPE, getToken(IRTextTokens.ASSIGN_SUB_PIPE_KEY));
 		putAll(map, IRTextTokens.OP, getToken(IRTextTokens.OP_KEY));
 		putAll(map, IRTextTokens.OP_SUB_LOGICAL, getToken(IRTextTokens.OP_SUB_LOGICAL_KEY));
 		putAll(map, IRTextTokens.OP_SUB_RELATIONAL, getToken(IRTextTokens.OP_SUB_RELATIONAL_KEY));