Hey Nick,
A somewhat simpler (and safer) fix is to move the "endCaptures" pattern into the outer rule.
I'm the Python bundle maintainer, so I'm glad someone is combing over the Python grammar looking for bugs. Please be sure to continue to note anything funny to the list, or just e-mail me directly.
–Alex
On 3/19/07, Fabry Nicholas F. nick@superb-sublime.com wrote:
Looking at the diff, the b was previously a <, so the intent was to convert < to \b (because of a change in the regexp library), but accidentally all <'s where converted to b's.
I have now reverted this part of r976, better late than never :)
Excellent! My first bug report and fix! Most exciting. Please forgive my enthusiasm; I only came to programming in a serious way about a year ago. I was 'inspired' to do so by a custom program my company rolled out that was so astonishingly awful that I felt that I had to demonstrate that better could be done. So, a year later, with 20+ newly purchased yet well worn O'Reilly titles on my shelf, it's nice to be able to start contributing back to projects I like.
In addition, I have found another small problem with the Python bundle - it has to do with the way it scopes 'meta.item-access.python' sections.
In particular, it gets confused by the end ], and does not recognize it as 'punctuation.definition.arguments.end.python', although it recognizes the lead [ correctly as 'punctuation.definition.arguments.start.python'. For instance, put the following in TextMate as Python, and note the scopes/coloring of the []'s.
pairing_name = findNextWord(packet[row])[0]
The regexes responsible are below, along with my explanation of the problem and proposed fix:
{ name = 'meta.item-access.python'; begin = '(?=[A-Za-z_][A-Za-z0-9_]*(?:.[a-zA-Z_][a-zA-Z_0-9]*)*\s*[)'; end = '(])'; patterns = ( { begin = '(?=[A-Za-z_][A-Za-z0-9_]*(?:.[A-Za-z_][A-Za-z0-9_]*)*\s*[)'; end = '(?=\s*[)'; patterns = ( { include = '#dotted_name'; } ); }, { begin = '([)'; end = '(?=])'; beginCaptures = { 1 = { name = 'punctuation.definition.arguments.begin.python'; }; }; endCaptures = { 1 = { name = 'punctuation.definition.arguments.end.python'; }; }; patterns = ( { include = '$base'; } ); contentName = 'meta.item-access.arguments.python'; },
The problem is that the 'meta.item-access.python' begin regex tags a LOCATION, specifically the location of the beginning of the first legit Python dotted name followed by a [, thus correctly allowing the [ itself to be matched within by 'punctuation.definition.arguments.begin.python'. However, the 'meta.item-access.python' end regex tags not the LOCATION of the end ], but the end ] itself, thus preventing 'punctuation.definition.arguments.end.python' from selecting the end ] as it should. In addition, the regex for 'punctuation.definition.arguments.end.python', instead of selecting the end ], selects the LOCATION followed by an end ], which gives it no characters in its scope!
My proposed fix swaps the two; both the start and end 'meta.item-access.python' regexes select for LOCATION, and both 'punctuation.definition.arguments.begin.python' and 'punctuation.definition.arguments.end.python' select for the actual CHARACTERS [ and ]. The code is below, and I have tested that it properly scopes the Python constructs now.
{ name = 'meta.item-access.python'; begin = '(?=[A-Za-z_][A-Za-z0-9_]*(?:.[a-zA-Z_][a-zA-Z_0-9]*)*\s*[)'; end = '(?<=])'; patterns = ( { begin = '(?=[A-Za-z_][A-Za-z0-9_]*(?:.[A-Za-z_][A-Za-z0-9_]*)*\s*[)'; end = '(?=\s*[)'; patterns = ( { include = '#dotted_name'; } ); }, { begin = '([)'; end = '(])'; beginCaptures = { 1 = { name = 'punctuation.definition.arguments.begin.python'; }; }; endCaptures = { 1 = { name = 'punctuation.definition.arguments.end.python'; }; }; patterns = ( { include = '$base'; } ); contentName = 'meta.item-access.arguments.python'; }, ); },
Hope this is helpful - I am (slowly!) looking through the rest of the Python language definition to see if there are any other glitches I can spot. Cheers,
Nick
For new threads USE THIS: textmate@lists.macromates.com (threading gets destroyed and the universe will collapse if you don't) http://lists.macromates.com/mailman/listinfo/textmate