[Prolint-cvs] SF.net SVN: prolint: [269] trunk/prolint/rules/findstate.p
Brought to you by:
johnallengreen,
jurjen
From: <ju...@us...> - 2006-07-17 21:54:16
|
Revision: 269 Author: jurjen Date: 2006-07-17 14:54:09 -0700 (Mon, 17 Jul 2006) ViewCVS: http://svn.sourceforge.net/prolint/?rev=269&view=rev Log Message: ----------- rule findstate.p: removed false positives for using NOT in the where-clause Modified Paths: -------------- trunk/prolint/rules/findstate.p Modified: trunk/prolint/rules/findstate.p =================================================================== --- trunk/prolint/rules/findstate.p 2006-03-16 23:37:43 UTC (rev 268) +++ trunk/prolint/rules/findstate.p 2006-07-17 21:54:09 UTC (rev 269) @@ -293,17 +293,38 @@ END. parserQueryClear ("findstatewhere":U). - /* the WHERE clause must not contain OR or NOT */ + /* the WHERE clause must not contain OR */ numresults = parserQueryCreate(wherenode, "findstategarbage":U, "OR":U). parserQueryClear ("findstategarbage":U). - numresults = numresults + parserQueryCreate(wherenode, "findstategarbage":U, "NOT":U). - parserQueryClear ("findstategarbage":U). IF numresults>0 THEN DO: parserReleaseHandle(childnode). parserReleaseHandle(wherenode). RETURN FALSE. END. + /* the WHERE clause must not contain NOT, but there are exceptions: + where a.logicalfield = (NOT logicalvariable) + so the case is: NOT is fine when it is a (grand)child of EQ */ + + DEFINE VARIABLE validNot AS LOGICAL NO-UNDO. + numresults = parserQueryCreate(wherenode, "findstategarbage":U, "NOT":U). + /* for each "NOT", check if it is a (grand) child of "EQ" */ + DO i=1 TO numresults : + parserQueryGetResult("findstategarbage":U, i, childnode). + /* move up the tree until you find EQ (good) or WHERE (bad) */ + validNot = FALSE. + DO WHILE parserGetNodeType(childnode) <> "WHERE":U : + IF parserNodeParent(childnode,childnode)="EQ":U THEN + validNot = TRUE. + END. + END. + parserQueryClear ("findstategarbage":U). + IF numresults>0 AND validNot=FALSE THEN DO: + parserReleaseHandle(childnode). + parserReleaseHandle(wherenode). + RETURN FALSE. + END. + /* now find all Field_ref nodes in the WHERE clause */ idnode = parserGetHandle(). numresults = parserQueryCreate(wherenode, "findstatefields":U, "Field_ref":U). This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |