diff --git a/info.plist b/info.plist
index f5a9716..6c5f92c 100644
--- a/info.plist
+++ b/info.plist
@@ -153,7 +153,7 @@
BBLMScansFunctions
BBLMFunctionScannerDoesFoldsToo
-
+
BBLMSuffixMap
diff --git a/rust.mm b/rust.mm
index b5d03ef..eddbfbb 100644
--- a/rust.mm
+++ b/rust.mm
@@ -386,37 +386,60 @@ SInt32 scanForSymbol(BBLMTextIterator &iter,
BBLMParamBlock ¶ms,
const BBLMCallbackBlock *callbacks)
{
- SInt32 whitespaceLen, wordLen = 0;
+ SInt32 whitespaceLen, wordLen = 0, parametersLen = 0;
UniChar ch;
int keywordLen = strlen(keyword);
if (iter.strcmp(keyword, keywordLen) == 0)
{
iter += keywordLen;
- whitespaceLen = skipWhitespace(iter);
- if (whitespaceLen == 0)
+ // Check for end of word, so 'enum' doesn't also match 'enumerate'.
+ // But also check for '<', so 'impl<'a>' is a legit statement, even with no whitespace.
+ whitespaceLen = skipWhitespace(iter);
+ if (whitespaceLen == 0 && iter.strcmp("<", 1) != 0)
{
iter -= keywordLen + whitespaceLen;
return 0;
}
- bool is_test = iter.strcmp("test", 4) == 0;
-
+ SInt32 start_of_name = iter.Offset();
+ SInt32 start_of_function;
while ((ch = iter.GetNextChar()))
{
- if (ch == '{' || ch == '(' || ch == ';')
+ if (ch == '{' || ch == ';')
{
iter--;
+ start_of_function = iter.Offset();
+ break;
+ }
+ else if (ch == '(')
+ {
+ while ((ch = iter.GetNextChar()))
+ {
+ whitespaceLen++;
+ if (ch == '{' || ch == ';')
+ {
+ break;
+ }
+ }
+
+ iter--;
+ start_of_function = iter.Offset();
break;
}
else if (ch == '\n')
{
+ start_of_function = iter.Offset();
break;
}
+ else if (ch)
+ {
+ whitespaceLen++;
+ }
else
{
- whitespaceLen++;
+ return 0;
}
}
@@ -427,12 +450,6 @@ SInt32 scanForSymbol(BBLMTextIterator &iter,
{
return 0;
}
-
- // Ignore modules called 'test'
- if (strcmp(keyword, "mod") == 0 && is_test)
- {
- return 0;
- }
UInt32 tokenOffset, funIndex;
UInt32 nameLen;
@@ -449,17 +466,23 @@ SInt32 scanForSymbol(BBLMTextIterator &iter,
iter -= (keywordLen + whitespaceLen);
BBLMProcInfo info;
- info.fFirstChar = info.fFunctionStart = iter.Offset();
- info.fSelStart = iter.Offset() + keywordLen + whitespaceLen;
- info.fSelEnd = info.fSelStart + wordLen;
- info.fFunctionEnd = info.fSelEnd + funLen;
- info.fIndentLevel = indentLevel;
- info.fKind = typeIfSo;
- info.fFlags = 0;
- info.fNameStart = tokenOffset;
- info.fNameLength = nameLen;
+ info.fFirstChar = info.fFunctionStart = iter.Offset();
+ info.fSelStart = iter.Offset() + keywordLen + whitespaceLen;
+ info.fSelEnd = info.fSelStart + wordLen;
+ info.fFunctionStart = start_of_function;
+ info.fFunctionEnd = info.fSelEnd + funLen;
+ info.fIndentLevel = indentLevel;
+ info.fKind = typeIfSo;
+ info.fFlags = 0;
+ info.fNameStart = tokenOffset;
+ info.fNameLength = nameLen;
+
bblmAddFunctionToList(callbacks, params.fFcnParams.fFcnList, info, &funIndex);
- bblmAddFoldRange(callbacks, info.fFunctionStart, funLen, kBBLMFunctionAutoFold);
+
+ // But still allow the user to fold them
+ // (the length changes here are to cut off the opening { and closing } from the fold range
+ bblmAddFoldRange(callbacks, start_of_function + 1, funLen - 2, kBBLMFunctionAutoFold);
+
iter += (keywordLen + whitespaceLen);
return info.fFunctionEnd;
}