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;