This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
lara:docs:specs3 [2017/06/02 15:15] joaobispo |
lara:docs:specs3 [2018/07/27 14:22] joaobispo |
||
---|---|---|---|
Line 14: | Line 14: | ||
===== Joinpoint Actions ===== | ===== Joinpoint Actions ===== | ||
- | (recommended syntax: $jp.exec <action_name>. Could it be $jp.action <action_name> instead?) | + | Previous syntax: |
+ | |||
+ | <code lara> | ||
+ | $jp.exec result : <action_name>; | ||
+ | </code> | ||
+ | |||
+ | |||
+ | New syntax: | ||
+ | |||
+ | <code lara> | ||
+ | var result = $jp.exec <action_name>; | ||
+ | </code> | ||
+ | |||
+ | If 'result' is a variable that already exists, 'var' can be omitted: | ||
+ | |||
+ | |||
+ | <code lara> | ||
+ | result = $jp.exec <action_name>; | ||
+ | </code> | ||
+ | |||
+ | The keyword '.exec' can be omitted if you prefix the name of the action with the target join point, and add parenthesis: | ||
+ | |||
+ | <code lara> | ||
+ | result = $jp.<action_name>(); | ||
+ | </code> | ||
+ | |||
+ | /* (recommended syntax: $jp.exec <action_name>. Could it be $jp.action <action_name> instead?) */ | ||
==== Default Actions ==== | ==== Default Actions ==== | ||
Line 32: | Line 58: | ||
===== Aspect Calls ===== | ===== Aspect Calls ===== | ||
- | (recommended syntax: var a = new Aspect(); call a;) | + | Previous syntax: |
+ | |||
+ | <code lara> | ||
+ | call result : AnAspect(); | ||
+ | </code> | ||
+ | |||
+ | |||
+ | New syntax: | ||
+ | |||
+ | <code lara> | ||
+ | var result = call AnAspect(); | ||
+ | </code> | ||
===== Tools ('run') ===== | ===== Tools ('run') ===== | ||
Line 104: | Line 142: | ||
| | ||
| | ||
+ | /* | ||
==== String Literals ==== | ==== String Literals ==== | ||
Line 115: | Line 154: | ||
We can 1) normalize on the LARAC side and escape the quote or 2) identify the type of String (' or ") and generate code accordingly | We can 1) normalize on the LARAC side and escape the quote or 2) identify the type of String (' or ") and generate code accordingly | ||
+ | */ | ||
Line 123: | Line 162: | ||
Possible problems: | Possible problems: | ||
- | - When a scope does not explicitly return (equivalent to the $body.insert when $body is empty); | + | * When a scope does not explicitly return (equivalent to the $body.insert when $body is empty); |
- | - We cannot detect dynamic exits, from exceptions, for instance (is this relevant?) | + | * We cannot detect dynamic exits such as exceptions (is this relevant?) |
- | - When a return statement has computation (e.g., return a+2), the $exit.insert before does not have this computation into account (possible solution, LARA action that extracts computation from returns to a variable, e.g., lara_temp_1 = a + 2; return lara_temp_1;) | + | * When a return statement has computation (e.g., return a+2), the $exit.insert before does not have this computation into account (possible solution, LARA action that extracts computation from returns to a variable, e.g., lara_temp_1 = a + 2; return lara_temp_1;) |
==== Insert Begin/End in 'scope'/'body' ==== | ==== Insert Begin/End in 'scope'/'body' ==== | ||
+ | |||
+ | Joinpoint 'scope' is being used in Clava as the base joinpoint for the 'body' joinpoint. While $body.insert before/after conceptually inserts before/after the first/last statement of the body, when it is a 'scope' we want to be able to insert before/after it. | ||
+ | |||
+ | |||
+ | === *Tentative Solution* === | ||
+ | |||
+ | $scope.insert before/after inserts before/after the scope, as expected. Add two new actions, insertBegin and insertEnd, that behaves like $body.insert before/after. | ||
+ | |||
+ | If 'body' is also used as an alias of 'scope', for compatibility reasons, $body.insert before/after must continue to be supported. 'scope' can detect if it is being used as a 'body', and in case of insert before/after, issue a warning telling that insertBegin/End should be used instead. | ||
+ |