mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-11-15 13:56:34 +08:00
The vendored vbnet scanner lexes a whole VB XML literal as one external token, and the parser offers it a '<' wherever a declaration or member starts. There, in valid VB, '<' opens an attribute block (`<Serializable()> _`), never an XML literal. The scanner nevertheless took `<Serializable` for an element start and read the rest of the file looking for a closing tag before giving up: O(rest of file) per attribute, O(n^2) per file. Generated proxies and designer code put an attribute on every member: 2,500 attributes in a 77 KB file advanced 38.5 M characters, and a 1.35 MB synthetic file took 21 s to parse. The scan now fails at the first character well-formed XML cannot contain: inside a tag, outside a quoted value, anything other than name characters, blanks, '=', quotes, '/>', '>' and '<%='; in element text, a '<' that starts no tag, closing tag, comment, PI or embedded expression, and an '&' that starts no reference. No valid XML literal lexes differently: parse trees are byte-identical before and after on all 25 sample and synthetic files tried, XML literals of every shape included. The 1.35 MB file now parses in 0.08 s. Residual, recorded in MANIFEST.md: an attribute without an argument list (`<Fact>`) is a well-formed start tag, so its scan still runs until a character that cannot be XML, or the end of the file. The change is kept as tools/tree-sitter-vbnet/patches/ xml-literal-tag-syntax.patch (CodeGraph's scanner8334fdb->b3473d1) and in MANIFEST.md's local-patch table. The new complexity_vbnet_attribute_lexing_is_linear counts the bytes the lexer pulls through a chunked TSInput for k and 2k attribute-decorated classes: ratio 3.99 before the fix, 2.0 after. Refs #1178, #1179 Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>