1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
module PatternAnalysis
where
import List(delete)
import Analysis.ProgInfo
import Analysis.Types
import Analysis.TotallyDefined ( siblingCons )
import FlatCurry.Types
data Completeness =
Complete
| InComplete
showComplete :: AOutFormat -> Completeness -> String
showComplete AText Complete = "complete"
showComplete ANote Complete = ""
showComplete _ InComplete = "incomplete"
analysePatternComplete :: ProgInfo [(QName,Int)] -> FuncDecl -> Completeness
analysePatternComplete consinfo fdecl = anaFun fdecl
where
anaFun (Func _ _ _ _ (Rule _ e)) = isComplete consinfo e
anaFun (Func _ _ _ _ (External _)) = Complete
isComplete :: ProgInfo [(QName,Int)] -> Expr -> Completeness
isComplete _ (Var _) = Complete
isComplete _ (Lit _) = Complete
isComplete consinfo (Comb _ f es) =
if f==("Prelude","commit") && length es == 1
then isComplete consinfo (head es)
else Complete
isComplete _ (Free _ _) = Complete
isComplete _ (Let _ _) = Complete
isComplete consinfo (Or e1 e2) =
combineAndResults (isComplete consinfo e1) (isComplete consinfo e2)
isComplete _ (Case _ _ []) = InComplete
isComplete _ (Case _ _ (Branch (LPattern _) _ : _)) = InComplete
isComplete consinfo (Case _ _ (Branch (Pattern cons _) bexp : ces)) =
combineAndResults
(checkAllCons (maybe [] (map fst) (lookupProgInfo cons consinfo)) ces)
(isComplete consinfo bexp)
where
checkAllCons [] _ = Complete
checkAllCons (_:_) [] = InComplete
checkAllCons (_:_) (Branch (LPattern _) _ : _) = InComplete
checkAllCons (c:cs) (Branch (Pattern i _) e : ps) =
combineAndResults (checkAllCons (delete i (c:cs)) ps)
(isComplete consinfo e)
isComplete consinfo (Typed e _) = isComplete consinfo e
combineAndResults :: Completeness -> Completeness -> Completeness
combineAndResults Complete Complete = Complete
combineAndResults Complete InComplete = InComplete
combineAndResults InComplete _ = InComplete
|