Updated D TextMate bundle for D2 and TM2
biozic via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Mon Apr 13 13:40:29 PDT 2015
On Monday, 13 April 2015 at 15:08:47 UTC, Jacob Carlborg wrote:
> On 2015-04-13 13:39, biozic wrote:
>
>> Awesome!
>>
>> The only quirk I can see so far is that `xxx yyy(` is always
>> parsed so
>> that yyy is considered to be the symbol of a function, is
>> highlighted as
>> such, and appears in the symbol tree. Is it a limitation of
>> Textmate?
>
> No, it's more the order of how rules implemented. I know I had
> this problem with "static assert". The solution I used was to
> added the rule for "static assert" before the rule for a
> method. What particular code is there a problem with?
For example:
---
version (all)
{
struct foo { int i; }
auto bar()
{
static if (true) {}
static assert(true);
return foo(1);
}
}
---
In the body of the bar function, `if`, `assert` and `foo` are
parsed as a method definition and appear in the symbol tree.
> Perhaps I should just move the rule for a method to be the last
> rule.
Not enough I think. Rather, the method rule shouldn't match if
the method name is a keyword or if it starts with `return`. This
seems to work around these problems:
{ name = 'meta.definition.method.d';
begin = '(?x)^\s*(?!\breturn\b)
((?:\b(?:public|private|protected|package|static|final|synchronized|abstract|export|override|auto|nothrow|immutable|const|inout|ref|shared)\b\s*)*)
# modifier
(?:([^\s]+))\s+ # return type
((?!\bif\b)(?!\bassert\b)\w+)\s* # identifier
(?=\()';
end = '(?={|;)';
beginCaptures = {
1 = { name = 'storage.modifier.d'; };
2 = { patterns = ( { include = '$base'; } ); };
3 = { name = 'entity.name.function.d'; };
};
patterns = (
{ include = '$base'; },
{ include = '#block'; },
);
},
Also, you forgot the `package` protection keyword (plus optional
identifier list) in several places.
More information about the Digitalmars-d-announce
mailing list