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.