[geany/geany] 756344: Rust: Parse character literals.
SiegeLord
git-noreply at xxxxx
Tue Jul 29 14:51:36 UTC 2014
Branch: refs/heads/master
Author: SiegeLord <slabode at aim.com>
Committer: SiegeLord <slabode at aim.com>
Date: Tue, 29 Jul 2014 14:51:36 UTC
Commit: 756344d901afba9e5a51ae099aa7c1fe9ecef019
https://github.com/geany/geany/commit/756344d901afba9e5a51ae099aa7c1fe9ecef019
Log Message:
-----------
Rust: Parse character literals.
These were omitted by mistake. Caused bugs like '"' being interpreted as a
start/end of a string, '}' as the end of a block etc.
Modified Paths:
--------------
tagmanager/ctags/rust.c
Modified: tagmanager/ctags/rust.c
40 lines changed, 40 insertions(+), 0 deletions(-)
===================================================================
@@ -292,6 +292,41 @@ static void scanRawString (lexerState *lexer)
}
}
+/* This deals with character literals: 'n', '\n', '\uFFFF'; and lifetimes:
+ * 'lifetime. We'll use this approximate regexp for the literals:
+ * \' \\ [^']+ \' or \' [^'] \' or \' \\ \' \'. Either way, we'll treat this
+ * token as a string, so it gets preserved as is for function signatures with
+ * lifetimes. */
+static void scanCharacterOrLifetime (lexerState *lexer)
+{
+ vStringClear(lexer->token_str);
+ advanceAndStoreChar(lexer);
+
+ if (lexer->cur_c == '\\')
+ {
+ advanceAndStoreChar(lexer);
+ /* The \' \\ \' \' (literally '\'') case */
+ if (lexer->cur_c == '\'' && lexer->next_c == '\'')
+ {
+ advanceAndStoreChar(lexer);
+ advanceAndStoreChar(lexer);
+ }
+ /* The \' \\ [^']+ \' case */
+ else
+ {
+ while (lexer->cur_c != EOF && lexer->cur_c != '\'')
+ advanceAndStoreChar(lexer);
+ }
+ }
+ /* The \' [^'] \' case */
+ else if (lexer->cur_c != '\'' && lexer->next_c == '\'')
+ {
+ advanceAndStoreChar(lexer);
+ advanceAndStoreChar(lexer);
+ }
+ /* Otherwise it is malformed, or a lifetime */
+}
+
/* Advances the parser one token, optionally skipping whitespace
* (otherwise it is concatenated and returned as a single whitespace token).
* Whitespace is needed to properly render function signatures. Unrecognized
@@ -334,6 +369,11 @@ static int advanceToken (lexerState *lexer, boolean skip_whitspace)
scanRawString(lexer);
return lexer->cur_token = TOKEN_STRING;
}
+ else if (lexer->cur_c == '\'')
+ {
+ scanCharacterOrLifetime(lexer);
+ return lexer->cur_token = TOKEN_STRING;
+ }
else if (isIdentifierStart(lexer->cur_c))
{
scanIdentifier(lexer);
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list