diff --git a/info.plist b/info.plist
index 0b24830..97086a6 100644
--- a/info.plist
+++ b/info.plist
@@ -45,6 +45,8 @@
Identifier
me.bsago.bblm.rust.attribute
#[attribute]
+ me.bsago.bblm.rust.function
+ fn function
BBLMRunColors
@@ -54,6 +56,8 @@
rgb(177, 13, 201)
me.bsago.bblm.rust.identifier
rgb(61, 153, 112)
+ me.bsago.bblm.rust.function
+ rgb(219, 135, 2)
BBLMKeywords
diff --git a/rust.mm b/rust.mm
index cea72a9..22fcac6 100644
--- a/rust.mm
+++ b/rust.mm
@@ -1,6 +1,7 @@
#include
#include
+#include
#include
#include
@@ -12,6 +13,7 @@
static NSString* const identifierColour = @"me.bsago.bblm.rust.identifier";
static NSString* const attributeColour = @"me.bsago.bblm.rust.attribute";
static NSString* const lifetimeColour = @"me.bsago.bblm.rust.lifetime";
+static NSString* const functionColour = @"me.bsago.bblm.rust.function";
static bool addRun(NSString *kind, int start,int len , const BBLMCallbackBlock& bblm_callbacks)
{
@@ -491,6 +493,24 @@ OSErr calculateRuns(BBLMParamBlock ¶ms, const BBLMCallbackBlock *callbacks)
}
}
+ else if (ch == 'f')
+ {
+ ch = iter.GetNextChar();
+ if (ch == 'n')
+ {
+ if (!makeCodeRun(iter, runStart, *callbacks)) return noErr;
+ runStart = iter.Offset();
+ runLen = skipWhitespace(iter);
+ runLen += skipWord(iter);
+ if (!addRun(functionColour, runStart, runLen, *callbacks)) return noErr;
+ runStart = iter.Offset();
+ }
+ else if (ch)
+ {
+ iter--;
+ }
+ }
+
else if (ch == '/')
{
ch = iter.GetNextChar();
@@ -555,8 +575,29 @@ OSErr calculateRuns(BBLMParamBlock ¶ms, const BBLMCallbackBlock *callbacks)
return noErr;
}
+static bool isSpecialKind(NSString* kind)
+{
+ return [kBBLMBlockCommentRunKind isEqualToString:kind]
+ || [kBBLMLineCommentRunKind isEqualToString:kind]
+ || [identifierColour isEqualToString:kind]
+ || [attributeColour isEqualToString:kind]
+ || [lifetimeColour isEqualToString:kind];
+}
+
OSErr adjustRange(BBLMParamBlock ¶ms, const BBLMCallbackBlock &callbacks)
{
+ DescType language;
+ NSString* kind;
+ SInt32 charPos;
+ SInt32 length;
+ UInt32 index = params.fAdjustRangeParams.fStartIndex;
+
+ while (index > 0 && bblmGetRun(&callbacks, index, language, kind, charPos, length) && isSpecialKind(kind))
+ {
+ index--;
+ }
+
+ params.fAdjustRangeParams.fStartIndex = index;
return noErr;
}