This refactoring is intended to be used as part of a legacy code modernization project. It is unlikely to be used on a day-to-day basis.
Although most Progress programmers recognize that NO-UNDO is important for application performance, it is not unusual to find legacy applications where NO-UNDO was not consistently added to DEFINE statements. This refactoring is intended to be run as a single pass through old code, in order to correct those statements.
This NO-UNDO refactoring has a few features which are worthy of note.
These features work nicely with Prolint. If ProRefactor's NO-UNDO Refactoring does not add NO-UNDO to a DEFINE statement, for whatever reason, Prolint will continue to warn about that DEFINE statement until you explicitly tell Prolint that it is intentional with a prolint-nowarn directive. (Or else of course you might review the code and decide to add NO-UNDO by hand.) Here is a snippet of code which is the output from the unit test used for the NO-UNDO refactoring. All of the NO-UNDO options on DEFINE statements were added by the NO-UNDO refactoring, but more interesting is to note where the NO-UNDO refactoring did not add NO-UNDO.
/* n o - u n d o . p
* This file contains tests for our N O - U N D O refactoring.
* IMPORTANT!! Comments containing "u n d o" (without the spaces)
* have an impact on the refactoring's behaviour!
*/
{&_proparse_ prolint-nowarn(noundo)}
DEFINE VARIABLE myInt AS INTEGER.
PROCEDURE myProc1:
DEFINE INPUT PARAMETER p1 AS LOGICAL NO-UNDO.
END.
PROCEDURE myProc2 EXTERNAL "whatever.dll":
DEFINE INPUT PARAMETER p2 AS LONG.
END.
/* Test for U N D O statement. */
DEFINE VARIABLE myChar AS CHARACTER.
DEFINE VARIABLE myChar2 AS CHARACTER NO-UNDO.
DEFINE VARIABLE myChar3 AS CHARACTER NO-UNDO.
DO:
myChar3 = "".
DO:
myChar = "".
UNDO, LEAVE.
myChar2 = "".
END.
END.
/* U N D O statement tests for named block and OUTPUT val */
DEFINE VARIABLE myChar10 AS CHARACTER.
DEFINE VARIABLE myChar11 AS CHARACTER.
my-block:
DO:
RUN changeVal(OUTPUT myChar10).
DO:
RUN changeVal(OUTPUT myChar11).
UNDO my-block, LEAVE.
END.
END.
PROCEDURE changeVal:
DEFINE OUTPUT PARAMETER changed AS CHARACTER NO-UNDO.
END.
/* This should remain UNDO */
DEFINE VARIABLE c1 AS CHARACTER.
/* This var should be UNDO */
/* with this two line comment. */
DEFINE VARIABLE c2 AS CHARACTER.
DEFINE /* UNDOable */ VARIABLE c3 AS CHARACTER.
DEFINE VARIABLE c4 AS CHARACTER. /* not no-undo */
/* This comment does not change UNDO for the next define,
because of the blank line between the comment and the statement.
*/
DEFINE VARIABLE c5 AS CHARACTER NO-UNDO.
DEFINE VARIABLE c6 AS CHARACTER NO-UNDO.
/* Comment on line after does not change UNDO for previous statement. */