3
3
*/
4
4
5
5
private import powershell
6
- private import Completion
6
+ private import Completion as Comp
7
+ private import Comp
7
8
private import ControlFlowGraphImpl
8
9
private import Cfg:: SuccessorTypes
9
10
private import semmle.code.powershell.controlflow.ControlFlowGraph as Cfg
10
11
11
12
cached
12
13
private module Cached {
13
14
cached
14
- newtype TSplitKind =
15
- TConditionalCompletionSplitKind ( )
15
+ newtype TSplitKind = TConditionalCompletionSplitKind ( )
16
16
17
17
cached
18
- newtype TSplit =
19
- TConditionalCompletionSplit ( ConditionalCompletion c )
18
+ newtype TSplit = TConditionalCompletionSplit ( ConditionalCompletion c )
20
19
}
21
20
22
21
import Cached
@@ -27,59 +26,57 @@ class Split extends TSplit {
27
26
string toString ( ) { none ( ) }
28
27
}
29
28
30
- private module ConditionalCompletionSplitting {
31
- /**
32
- * A split for conditional completions.
33
- */
29
+ module ConditionalCompletionSplitting {
34
30
class ConditionalCompletionSplit extends Split , TConditionalCompletionSplit {
35
31
ConditionalCompletion completion ;
36
32
37
33
ConditionalCompletionSplit ( ) { this = TConditionalCompletionSplit ( completion ) }
38
34
35
+ ConditionalCompletion getCompletion ( ) { result = completion }
36
+
39
37
override string toString ( ) { result = completion .toString ( ) }
40
38
}
41
39
42
- // private class ConditionalCompletionSplitKind extends SplitKind, TConditionalCompletionSplitKind {
43
- // override int getListOrder() { result = 0 }
44
-
45
- // override predicate isEnabled(Ast n) { this.appliesTo(n) }
46
-
47
- // override string toString() { result = "ConditionalCompletion" }
48
- // }
49
-
50
- int getNextListOrder ( ) { result = 1 }
51
-
52
- // private class ConditionalCompletionSplitImpl extends SplitImpl instanceof ConditionalCompletionSplit
53
- // {
54
- // ConditionalCompletion completion;
55
-
56
- // ConditionalCompletionSplitImpl() { this = TConditionalCompletionSplit(completion) }
40
+ private class ConditionalCompletionSplitKind_ extends SplitKind , TConditionalCompletionSplitKind {
41
+ override int getListOrder ( ) { result = 0 }
57
42
58
- // override ConditionalCompletionSplitKind getKind( ) { any( ) }
43
+ override predicate isEnabled ( Ast n ) { this . appliesTo ( n ) }
59
44
60
- // override predicate hasEntry(Ast pred, Ast succ, Completion c) {
61
- // succ(pred, succ, c) and
62
- // last(succ, _, completion) and
63
- // none() // TODO
64
- // }
65
-
66
- // override predicate hasEntryScope(Cfg::CfgScope scope, Ast succ) { none() }
67
-
68
- // override predicate hasExit(Ast pred, Ast succ, Completion c) {
69
- // this.appliesTo(pred) and
70
- // succ(pred, succ, c) and
71
- // if c instanceof ConditionalCompletion then completion = c else any()
72
- // }
73
-
74
- // override predicate hasExitScope(Cfg::CfgScope scope, Ast last, Completion c) {
75
- // this.appliesTo(last) and
76
- // succExit(scope, last, c) and
77
- // if c instanceof ConditionalCompletion then completion = c else any()
78
- // }
45
+ override string toString ( ) { result = "ConditionalCompletion" }
46
+ }
79
47
80
- // override predicate hasSuccessor(Ast pred, Ast succ, Completion c) { none() }
81
- // }
48
+ module ConditionalCompletionSplittingInput {
49
+ private import Completion as Comp
50
+
51
+ class ConditionalCompletion = Comp:: ConditionalCompletion ;
52
+
53
+ class ConditionalCompletionSplitKind extends ConditionalCompletionSplitKind_ , TSplitKind { }
54
+
55
+ class ConditionalCompletionSplit = ConditionalCompletionSplitting:: ConditionalCompletionSplit ;
56
+
57
+ bindingset [ parent, parentCompletion]
58
+ predicate condPropagateExpr (
59
+ Ast parent , ConditionalCompletion parentCompletion , Ast child ,
60
+ ConditionalCompletion childCompletion
61
+ ) {
62
+ child = parent .( NotExpr ) .getOperand ( ) and
63
+ childCompletion .( BooleanCompletion ) .getDual ( ) = parentCompletion
64
+ or
65
+ childCompletion = parentCompletion and
66
+ (
67
+ child = parent .( LogicalAndExpr ) .getAnOperand ( )
68
+ or
69
+ child = parent .( LogicalOrExpr ) .getAnOperand ( )
70
+ or
71
+ child = parent .( ConditionalExpr ) .getBranch ( _)
72
+ )
73
+ }
74
+
75
+ int getNextListOrder ( ) { result = 1 }
76
+
77
+ private class ConditionalCompletionSplitImpl extends SplitImplementations:: ConditionalCompletionSplitting:: ConditionalCompletionSplitImpl
78
+ { }
79
+ }
82
80
}
83
81
84
82
class ConditionalCompletionSplit = ConditionalCompletionSplitting:: ConditionalCompletionSplit ;
85
-
0 commit comments