Hello Gisela,On 21 ao�t 2013, at 15:43, Gisela Decuzzi wrote:Hello, I'm trying to understand how to define a correct pattern and I'm lost with the cases where I use a method pattern and the desired code is inside a block.In the case where we search (methods) with metavariables and the code is inside a block.An Example:This pattern`a: `aa `b: `bb| `@temps |� ``@.Stats.�``@.some size ``@.more.��``@.Stats2.Putting a dot after the @ means that you want to match statements.So '``@.some size'��cannot match: �'arg1 size'.Does not match with:insideABlock: arg1 part2: arg2|temp1 �temp3|[arg1 size].temp1 := arg2 + 3.^arg2Then even if you remove the extra dots, the rule won't match the method you give.This is because this method has no statements matching '``@some size' (even if it has a block that has a statement that can).So here is a rule that can match your method:`a: `aa `b: `bb� `@.stms1.
| `@temps |�`@.stms2.�[ `@rcv size ].�After looking while I realize that is not matching withpart1: arg1 part2: arg2|temp1 temp2 temp3|arg1 size.temp1 := arg2 + 3.^arg2This one however can be matched by your rule (without the extra dots).I think that you should try to parse expressions instead of full methods (RBParseTreeSearcher>>#matches:do: instead of�RBParseTreeSearcher>>#matchesMethod:do:).�You could just try to match '`@rcv size': it would succeed in both methods.Until I understand:�``@.some size ``@.more.�
This should mean: anything that sends the message size, doesn't matter if we have something before or after, I think that this expression should match both cases.But maybe I'm missunderstanding the patterns (again).It should work like that (modulo bugs)
- ` denotes a metavariable
- adding @ means you're looking for a list of elements�
- ex: `receiver `@msg: `@arg matches every message
- adding a . means you're looking for a statement (or a list of statement if you combine it with @)
- adding # means you're looking for a literal
- adding another ` means that the pattern will be searched recursively in each subexpressions even if the top one already matched�
- it sometimes leads to infinite loops, but I don't remember exactly when�
- ex: in 'foo bar bar' :
- if you search for '`rcv bar' you'll find one match ('foo bar bar')
- if you search for '``rcv bar' you'll find two matches ('foo bar' and 'foo bar bar').
- and I think it's all
Any help with this will be really welcome!