Bug 572339: [R-Source] Mark invalid code points as error

Change-Id: I8d4546ff743892bce9910aa2edd82002cac949ec
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
index 6d3e81c..e33e032 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
@@ -55,6 +55,20 @@
 	
 	
 	@Test
+	public void StringS_invalidText() {
+		List<Problem> problems;
+		
+		problems= collectProblems("   'abc \\U{11F0F0} e' ");
+		assertEquals(1, problems.size());
+		assertProblem(Problem.SEVERITY_ERROR,
+				RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID,
+				"Syntax Error/Invalid Text: the specified code point U+11F0F0 is invalid.",
+				8, 10,
+				problems.get(0) );
+	}
+	
+	
+	@Test
 	public void StringR_incompleteOpening() {
 		List<Problem> problems;
 		
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java
index 5ec8834..fe28b5f 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java
@@ -16,6 +16,7 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED;
@@ -52,7 +53,6 @@
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \' \" ` \u0007 \u0008 \f \n \r \t \u000B \\ \n e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -64,7 +64,6 @@
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u0003 \u01FF \u01FF7 e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -76,7 +75,6 @@
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u00AA \u00FF \u000Ff e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -89,7 +87,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING, lexer.getFlags());
 		assertEquals("abc \\x e", lexer.getText());
 		assertDetail(6, 2, "\\x", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -101,7 +98,6 @@
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u0003 \uAAAA \uFFFa \u0FFFa e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -114,7 +110,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING, lexer.getFlags());
 		assertEquals("abc \\u e", lexer.getText());
 		assertDetail(6, 2, "\\uxxxx", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -126,7 +121,6 @@
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u0003 \uAAAA \uFFF0 e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -139,7 +133,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING, lexer.getFlags());
 		assertEquals("abc \\u{} e", lexer.getText());
 		assertDetail(6, 4, "\\u{xxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -152,6 +145,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED, lexer.getFlags());
 		assertEquals("abc \\u{1 e", lexer.getText());
 		assertDetail(6, 4, "\\u{xxxx}", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\u{FFFFF} e' ").init());
 		
@@ -159,7 +153,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED, lexer.getFlags());
 		assertEquals("abc \\u{FFFFF} e", lexer.getText());
 		assertDetail(6, 7, "\\u{xxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -171,7 +164,6 @@
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u0003 \uAAAA \uFFF0 \uD834\uDD1E \uD853\uDF5C \u0AAAa e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -184,7 +176,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING, lexer.getFlags());
 		assertEquals("abc \\U e", lexer.getText());
 		assertDetail(6, 2, "\\Uxxxxxxxx", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -196,7 +187,6 @@
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u0003 \uAAAA \uFFF0 \uD834\uDD1E \uD853\uDF5C e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -209,7 +199,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING, lexer.getFlags());
 		assertEquals("abc \\U{} e", lexer.getText());
 		assertDetail(6, 4, "\\U{xxxxxxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -222,6 +211,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED, lexer.getFlags());
 		assertEquals("abc \\U{1 e", lexer.getText());
 		assertDetail(6, 4, "\\U{xxxxxxxx}", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\U{FFFFFFFFF} e' ").init());
 		
@@ -229,19 +219,20 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED, lexer.getFlags());
 		assertEquals("abc \\U{FFFFFFFFF} e", lexer.getText());
 		assertDetail(6, 11, "\\U{xxxxxxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
 	@Test
 	public void matchStringS_with_NullChar() {
 		final RLexer lexer= new RLexer(RLexer.SKIP_WHITESPACE);
+		
 		lexer.reset(this.input.reset(" 'abc \u0000 e' ").init());
 		
 		assertEquals(RTerminal.STRING_S, lexer.next());
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \u0000 e", lexer.getText());
 		assertDetail(6, 1, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\0 e' ").init());
 		
@@ -249,6 +240,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\0 e", lexer.getText());
 		assertDetail(6, 2, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\x00 e' ").init());
 		
@@ -256,6 +248,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\x00 e", lexer.getText());
 		assertDetail(6, 4, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\u0 e' ").init());
 		
@@ -263,6 +256,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\u0 e", lexer.getText());
 		assertDetail(6, 3, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\u{0} e' ").init());
 		
@@ -270,6 +264,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\u{0} e", lexer.getText());
 		assertDetail(6, 5, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\U0 e' ").init());
 		
@@ -277,6 +272,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\U0 e", lexer.getText());
 		assertDetail(6, 3, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" 'abc \\U{0000} e' ").init());
 		
@@ -284,7 +280,27 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\U{0000} e", lexer.getText());
 		assertDetail(6, 8, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
+	}
+	
+	@Test
+	public void matchStringS_with_InvalidCodepoint() {
+		final RLexer lexer= new RLexer(RLexer.SKIP_WHITESPACE);
 		
+		lexer.reset(this.input.reset(" 'abc \\U110000 e' ").init());
+		
+		assertEquals(RTerminal.STRING_S, lexer.next());
+		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID, lexer.getFlags());
+		assertEquals("abc \\U110000 e", lexer.getText());
+		assertDetail(6, 8, "U+110000", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
+		
+		lexer.reset(this.input.reset(" 'abc \\U{110000} e' ").init());
+		
+		assertEquals(RTerminal.STRING_S, lexer.next());
+		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID, lexer.getFlags());
+		assertEquals("abc \\U{110000} e", lexer.getText());
+		assertDetail(6, 10, "U+110000", lexer.getStatusDetail());
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -297,7 +313,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNKOWN, lexer.getFlags());
 		assertEquals("abc \\c", lexer.getText());
 		assertDetail(6, 2, "\\c", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -310,7 +325,6 @@
 		assertEquals(RTerminal.STRING_D, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \' \" ` \u0007 \u0008 \f \n \r \t \u000B \\ \n e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -323,7 +337,6 @@
 		assertEquals(RTerminal.SYMBOL_G, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \' \" ` \u0007 \u0008 \f \n \r \t \u000B \\ \n e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -335,7 +348,6 @@
 		assertEquals(RTerminal.SYMBOL_G, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u0003 \u01FF e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -347,7 +359,6 @@
 		assertEquals(RTerminal.SYMBOL_G, lexer.next());
 		assertEquals(0, lexer.getFlags());
 		assertEquals("abc \u0001 \u0002 \u00AA \u00FF e", lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -360,7 +371,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\u1 \\u02 \\u003 \\uAAAA \\uFFF0 e", lexer.getText());
 		assertDetail(6, 3, "\\uxxxx", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -373,7 +383,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\u{1} \\u{02} \\u{003} \\u{AAAA} \\u{FFF0} e", lexer.getText());
 		assertDetail(6, 5, "\\u{xxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -386,6 +395,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\u{1 e", lexer.getText());
 		assertDetail(6, 4, "\\u{xxxx}", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\u{FFFFF} e` ").init());
 		
@@ -393,7 +403,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\u{FFFFF} e", lexer.getText());
 		assertDetail(6, 7, "\\u{xxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -406,7 +415,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\U1 \\U02 \\U003 \\UAAAA \\UFFF0 \\U1D11E \\U24F5C e", lexer.getText());
 		assertDetail(6, 3, "\\Uxxxxxxxx", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -419,7 +427,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\U{1} \\U{02} \\U{003} \\U{AAAA} \\U{FFF0} \\U{1D11E} \\U{24F5C} e", lexer.getText());
 		assertDetail(6, 5, "\\U{xxxxxxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -432,6 +439,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\U{1 e", lexer.getText());
 		assertDetail(6, 4, "\\U{xxxxxxxx}", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\U{FFFFFFFFF} e` ").init());
 		
@@ -439,7 +447,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\U{FFFFFFFFF} e", lexer.getText());
 		assertDetail(6, 11, "\\U{xxxxxxxx}", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -452,6 +459,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \u0000 e", lexer.getText());
 		assertDetail(6, 1, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\0 e` ").init());
 		
@@ -459,6 +467,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\0 e", lexer.getText());
 		assertDetail(6, 2, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\x00 e` ").init());
 		
@@ -466,6 +475,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_NULLCHAR, lexer.getFlags());
 		assertEquals("abc \\x00 e", lexer.getText());
 		assertDetail(6, 4, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\u0 e` ").init());
 		
@@ -473,6 +483,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\u0 e", lexer.getText());
 		assertDetail(6, 3, "\\uxxxx", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\u{0} e` ").init());
 		
@@ -480,6 +491,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\u{0} e", lexer.getText());
 		assertDetail(6, 5, "\\u{xxxx}", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\U0 e` ").init());
 		
@@ -487,6 +499,7 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\U0 e", lexer.getText());
 		assertDetail(6, 3, "\\Uxxxxxxxx", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 		
 		lexer.reset(this.input.reset(" `abc \\U{0000} e` ").init());
 		
@@ -494,7 +507,19 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
 		assertEquals("abc \\U{0000} e", lexer.getText());
 		assertDetail(6, 8, "\\U{xxxxxxxx}", lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
+	}
+	
+	@Test
+	public void matchSymbolG_with_InvalidCodepoint() {
+		final RLexer lexer= new RLexer(RLexer.SKIP_WHITESPACE);
 		
+		lexer.reset(this.input.reset(" `abc \\U{110000} e` ").init());
+		
+		assertEquals(RTerminal.SYMBOL_G, lexer.next());
+		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED, lexer.getFlags());
+		assertEquals("abc \\U{110000} e", lexer.getText());
+		assertDetail(6, 10, "\\U{xxxxxxxx}", lexer.getStatusDetail());
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -507,7 +532,6 @@
 		assertEquals(STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNKOWN, lexer.getFlags());
 		assertEquals("abc \\c", lexer.getText());
 		assertDetail(6, 2, "\\c", lexer.getStatusDetail());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -523,6 +547,7 @@
 		assertEquals(1, lexer.getOffset());
 		assertEquals(12, lexer.getLength());
 		assertDetail(8, 1, null, lexer.getStatusDetail());
+		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
 	@ParameterizedTest
@@ -540,7 +565,6 @@
 		assertEquals(1, lexer.getOffset());
 		assertEquals(text.length() - 2, lexer.getLength());
 		assertEquals(text.substring(1 + 3, text.length() - 2 - 1), lexer.getText());
-		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
@@ -554,6 +578,7 @@
 		assertEquals(1, lexer.getOffset());
 		assertEquals(46, lexer.getLength());
 		assertEquals("abc \\\' \\\" \\` \\a \\b \\f \\n \\r \\t \\v \\\\ \\\n e", lexer.getText());
+		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
 }
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.java
index 165d0ea..d043180 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.java
@@ -40,6 +40,7 @@
 	public static String Syntax_Number_IntWithDecPoint_message;
 	
 	public static String Syntax_Text_NullCharNotAllowed_message;
+	public static String Syntax_Text_CodePointInvalid_message;
 	public static String Syntax_Text_EscapeSeqHexDigitMissing_message;
 	public static String Syntax_Text_EscapeSeqNotClosed_message;
 	public static String Syntax_Text_QuotedSymbol_EscapeSeqUnexpected_message;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.properties b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.properties
index 66244b6..fb05c6f 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.properties
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/ProblemMessages.properties
@@ -24,6 +24,7 @@
 Syntax_Number_NonIntWithLLiteral_message= Misleading Number: non-integer literal is qualified with \u203A\u200AL\u200A\u2039 suffix.
 Syntax_Number_IntWithDecPoint_message= Misleading Number: integer literal is qualified with decimal point.
 Syntax_Text_NullCharNotAllowed_message= Syntax Error/Invalid Text: null character is not allowed.
+Syntax_Text_CodePointInvalid_message= Syntax Error/Invalid Text: the specified code point {0} is invalid.
 Syntax_Text_EscapeSeqHexDigitMissing_message= Syntax Error/Invalid Text: the escape sequence \u203A\u200A{0}\u200A\u2039 is invalid, digit 0-F expected.
 Syntax_Text_EscapeSeqNotClosed_message= Syntax Error/Invalid Text: the escape sequence \u203A\u200A{0}\u200A\u2039 is not closed, \u203A\u200A}\u200A\u2039 missing.
 Syntax_Text_QuotedSymbol_EscapeSeqUnexpected_message= Syntax Error/Invalid Text: escape sequences of type {0} are not supported in quoted symbols.
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
index cd2893e..f1c3eb1 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
@@ -22,6 +22,7 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_HEX_FLOAT_EXP_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_INT_WITH_DEC_POINT;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_NON_INT_WITH_L;
+import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNEXPECTED;
@@ -964,6 +965,12 @@
 					detail.getText() ),
 					detail.getStartOffset(), detail.getEndOffset() );
 			return;
+		case STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID:
+			addProblem(Problem.SEVERITY_ERROR, code, this.messageBuilder.bind(
+					ProblemMessages.Syntax_Text_CodePointInvalid_message,
+					detail.getText() ),
+					detail.getStartOffset(), detail.getEndOffset() );
+			return;
 		default:
 			handleUnknownCodes(node);
 			return;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java
index 971c45c..5b4133e 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java
@@ -19,6 +19,7 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_HEX_FLOAT_EXP_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_INT_WITH_DEC_POINT;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_NON_INT_WITH_L;
+import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNKOWN;
@@ -30,6 +31,7 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.string.StringFactory;
+import org.eclipse.statet.jcommons.string.StringUtils;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 import org.eclipse.statet.jcommons.text.core.input.TextParserInput;
 
@@ -2060,9 +2062,11 @@
 							continue ITER_CN;
 						}
 						else {
-							// warning?
-							++n;
-							continue ITER_CN;
+							readQuoted(in, type, cQuote, n + 1,
+									STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID,
+									createDetail(in, digitsStart - 3, n + 1,
+											StringUtils.formatCodePoint(c)) );
+							return;
 						}
 					}
 					else {
@@ -2130,8 +2134,11 @@
 							continue ITER_CN;
 						}
 						else {
-							// warning?
-							continue ITER_CN;
+							readQuoted(in, type, cQuote, n,
+									STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID,
+									createDetail(in, digitsStart - 2, n,
+											StringUtils.formatCodePoint(c)) );
+							return;
 						}
 					}
 					
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java
index 813136e..d1d32c8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java
@@ -51,7 +51,7 @@
 	int STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_NOT_CLOSED=            STATUS12_SYNTAX_TEXT_INVALID | 0x4;
 	int STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_HEX_DIGIT_MISSING=     STATUS12_SYNTAX_TEXT_INVALID | 0x5;
 	int STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_UNKOWN=                STATUS12_SYNTAX_TEXT_INVALID | 0x9;
-	int STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID= STATUS1_SYNTAX_INCORRECT_TOKEN | 0x60;
+	int STATUS123_SYNTAX_TEXT_ESCAPE_SEQ_CODEPOINT_INVALID=     STATUS12_SYNTAX_TEXT_INVALID | 0xB;
 	int STATUS12_SYNTAX_TOKEN_UNKNOWN=                      STATUS1_SYNTAX_INCORRECT_TOKEN | 0x90 | STATUSFLAG_REAL_ERROR;
 	int STATUS12_SYNTAX_TOKEN_UNEXPECTED=                   STATUS1_SYNTAX_INCORRECT_TOKEN | 0xA0 | STATUSFLAG_REAL_ERROR;
 	int STATUS123_SYNTAX_SEQREL_UNEXPECTED=                     STATUS12_SYNTAX_TOKEN_UNEXPECTED | 0x1;