@@ -241,6 +241,7 @@ lhsExprs x = concatMap lhsOfStmt (universeBi x)
241241 lhsOfStmt (StExpressionAssign _ _ e e') = e : onExprs e'
242242 lhsOfStmt (StCall _ _ _ (Just aexps)) = filter isLExpr argExps ++ concatMap onExprs argExps
243243 where argExps = map argExtractExpr . aStrip $ aexps
244+ lhsOfStmt (StDo _ _ _ _ (Just dospec)) = lhsOfStmt $ dospecAsStmt dospec
244245 lhsOfStmt s = onExprs s
245246
246247 onExprs :: (Data a , Data (c a )) => c a -> [Expression a ]
@@ -285,10 +286,17 @@ allLhsVars :: Data a => Block (Analysis a) -> [Name]
285286allLhsVars = allLhsVarsAnn . getAnnotation
286287
287288allLhsVarsDoSpec :: Data a => DoSpecification (Analysis a ) -> [Name ]
288- allLhsVarsDoSpec = computeAllLhsVars
289+ allLhsVarsDoSpec = computeAllLhsVars . dospecAsStmt
290+
291+ dospecAsStmt :: DoSpecification a -> Statement a
292+ dospecAsStmt (DoSpecification a ss lhs rhs _e1 _me2) =
293+ StExpressionAssign a ss lhs rhs
289294
290295-- | Set of names found in the parts of an AST that are the target of
291296-- an assignment statement.
297+ --
298+ -- TODO now that dospecs don't store a Statement explicitly, they won't get
299+ -- caught here. urgh
292300computeAllLhsVars :: forall a b . (Data a , Data (b (Analysis a ))) => b (Analysis a ) -> [Name ]
293301computeAllLhsVars = concatMap lhsOfStmt . universeBi
294302 where
@@ -298,6 +306,7 @@ computeAllLhsVars = concatMap lhsOfStmt . universeBi
298306 lhsOfStmt (StCall _ _ f@ (ExpValue _ _ (ValIntrinsic _)) _)
299307 | Just defs <- intrinsicDefs f = defs
300308 lhsOfStmt (StCall _ _ _ (Just aexps)) = concatMap (match'' . argExtractExpr) (aStrip aexps)
309+ lhsOfStmt (StDo _ _ _ _ (Just dospec)) = lhsOfStmt $ dospecAsStmt dospec
301310 lhsOfStmt s = onExprs s
302311
303312 lhsOfDecls (Declarator _ _ e _ _ (Just e')) = match' e : onExprs e'
@@ -308,6 +317,7 @@ computeAllLhsVars = concatMap lhsOfStmt . universeBi
308317
309318 lhsOfExp :: Expression (Analysis a ) -> [Name ]
310319 lhsOfExp (ExpFunctionCall _ _ _ (Just aexps)) = concatMap (match . argExtractExpr) (aStrip aexps)
320+ -- TODO do I need to handle ExpImpliedDo here? (shouldn't do, right)
311321 lhsOfExp _ = []
312322
313323 -- Match and give the varname for LHS of statement
@@ -331,7 +341,7 @@ computeAllLhsVars = concatMap lhsOfStmt . universeBi
331341-- | Set of expressions used -- not defined -- by an AST-block.
332342blockRhsExprs :: Data a => Block a -> [Expression a ]
333343blockRhsExprs (BlStatement _ _ _ s) = statementRhsExprs s
334- blockRhsExprs (BlDo _ _ _ _ _ (Just (DoSpecification _ _ ( StExpressionAssign _ _ lhs rhs) e1 e2)) _ _)
344+ blockRhsExprs (BlDo _ _ _ _ _ (Just (DoSpecification _ _ lhs rhs e1 e2)) _ _)
335345 | ExpSubscript _ _ _ subs <- lhs = universeBi (rhs, e1, e2) ++ universeBi subs
336346 | otherwise = universeBi (rhs, e1, e2)
337347blockRhsExprs (BlDoWhile _ _ e1 _ _ e2 _ _) = universeBi (e1, e2)
@@ -346,8 +356,8 @@ statementRhsExprs (StExpressionAssign _ _ lhs rhs)
346356statementRhsExprs StDeclaration {} = []
347357statementRhsExprs (StIfLogical _ _ _ s) = statementRhsExprs s
348358statementRhsExprs (StDo _ _ _ l s') = universeBi l ++ doSpecRhsExprs s'
349- where doSpecRhsExprs (Just (DoSpecification _ _ s e1 e2)) =
350- (e1 : universeBi e2) ++ statementRhsExprs s
359+ where doSpecRhsExprs (Just dospec @ (DoSpecification _ _ _lhs _rhs e1 e2)) =
360+ (e1 : universeBi e2) ++ statementRhsExprs (dospecAsStmt dospec)
351361 doSpecRhsExprs Nothing = []
352362statementRhsExprs s = universeBi s
353363
@@ -356,7 +366,7 @@ blockVarUses :: forall a. Data a => Block (Analysis a) -> [Name]
356366blockVarUses (BlStatement _ _ _ (StExpressionAssign _ _ lhs rhs))
357367 | ExpSubscript _ _ _ subs <- lhs = allVars rhs ++ concatMap allVars (aStrip subs)
358368 | otherwise = allVars rhs
359- blockVarUses (BlDo _ _ _ _ _ (Just (DoSpecification _ _ ( StExpressionAssign _ _ lhs rhs) e1 e2)) _ _)
369+ blockVarUses (BlDo _ _ _ _ _ (Just (DoSpecification _ _ lhs rhs e1 e2)) _ _)
360370 | ExpSubscript _ _ _ subs <- lhs = allVars rhs ++ allVars e1 ++ maybe [] allVars e2 ++ concatMap allVars (aStrip subs)
361371 | otherwise = allVars rhs ++ allVars e1 ++ maybe [] allVars e2
362372blockVarUses (BlStatement _ _ _ st@ StDeclaration {}) = concat [ rhsOfDecls d | d <- universeBi st ]
0 commit comments