@@ -67,14 +67,21 @@ abstract class ConditionalCompletion extends NormalCompletion {
67
67
abstract ConditionalCompletion getDual ( ) ;
68
68
}
69
69
70
+ /** Holds if node `n` has the Boolean constant value `value`. */
71
+ private predicate isBooleanConstant ( AstNode n , Boolean value ) {
72
+ n .( LiteralExpr ) .getTextValue ( ) = value .toString ( )
73
+ or
74
+ isBooleanConstant ( n .( ParenExpr ) .getExpr ( ) , value )
75
+ }
76
+
70
77
/**
71
78
* A completion that represents evaluation of an expression
72
79
* with a Boolean value.
73
80
*/
74
81
class BooleanCompletion extends ConditionalCompletion , TBooleanCompletion {
75
82
BooleanCompletion ( ) { this = TBooleanCompletion ( value ) }
76
83
77
- override predicate isValidForSpecific ( AstNode e ) {
84
+ private predicate isValidForSpecific0 ( AstNode e ) {
78
85
e = any ( IfExpr c ) .getCondition ( )
79
86
or
80
87
any ( MatchArm arm ) .getGuard ( ) = e
@@ -84,7 +91,7 @@ class BooleanCompletion extends ConditionalCompletion, TBooleanCompletion {
84
91
e = expr .getLhs ( )
85
92
)
86
93
or
87
- exists ( Expr parent | this .isValidForSpecific ( parent ) |
94
+ exists ( Expr parent | this .isValidForSpecific0 ( parent ) |
88
95
parent =
89
96
any ( PrefixExpr expr |
90
97
expr .getOperatorName ( ) = "!" and
@@ -103,6 +110,15 @@ class BooleanCompletion extends ConditionalCompletion, TBooleanCompletion {
103
110
)
104
111
}
105
112
113
+ override predicate isValidForSpecific ( AstNode e ) {
114
+ this .isValidForSpecific0 ( e ) and
115
+ (
116
+ isBooleanConstant ( e , value )
117
+ or
118
+ not isBooleanConstant ( e , _)
119
+ )
120
+ }
121
+
106
122
/** Gets the dual Boolean completion. */
107
123
override BooleanCompletion getDual ( ) { result = TBooleanCompletion ( value .booleanNot ( ) ) }
108
124
0 commit comments