diff --git a/src/frameforge/semantic.py b/src/frameforge/semantic.py index f07a899..e6153cd 100644 --- a/src/frameforge/semantic.py +++ b/src/frameforge/semantic.py @@ -19,7 +19,7 @@ def evaluate(root, rule): language = rule["language"] if language == "csharp": pattern = re.compile( - r'(?P@"(?:""|[^"])*"|"(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\')' + r'(?P(?P"{3,})[\s\S]*?(?P=raw_delimiter)|@"(?:""|[^"])*"|"(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\')' r'|(?P//[^\n]*|/\*[\s\S]*?\*/)' ) else: diff --git a/tests/test_semantic.py b/tests/test_semantic.py index d33487e..5e0f3aa 100644 --- a/tests/test_semantic.py +++ b/tests/test_semantic.py @@ -32,6 +32,16 @@ def test_csharp_comment_markers_inside_strings_do_not_hide_code(self): self.assertEqual([item["token"] for item in result["evidence"]], ["Event += OnEvent;"]) self.assertEqual(result["missing_tokens"], ["Event -= OnEvent;"]) + def test_csharp_raw_string_quotes_and_comment_markers_do_not_hide_following_code(self): + with tempfile.TemporaryDirectory() as d: + root = Path(d) + f = root/"RawString.cs" + f.write_text('var template = """text " quote // still string"""; Event += OnEvent; // Event -= OnEvent;\n') + result = evaluate(root, rule(["RawString.cs"])) + self.assertEqual(result["status"], "review_needed") + self.assertEqual([item["token"] for item in result["evidence"]], ["Event += OnEvent;"]) + self.assertEqual(result["missing_tokens"], ["Event -= OnEvent;"]) + def test_lua_comment_markers_inside_strings_do_not_hide_code(self): with tempfile.TemporaryDirectory() as d: root = Path(d)