@@ -14,14 +14,22 @@ class LiveLiteral extends MethodAccess {
14
14
not this .getEnclosingCallable ( ) instanceof LiveLiteralMethod
15
15
}
16
16
17
- /** Gets the constant value that backs this live literal. */
17
+ /**
18
+ * Live literal classes consist of the following:
19
+ * - A private field holding the constant value that backs this live literal.
20
+ * - A private getter to access the constant value.
21
+ * - A public getter that either calls the private getter and returns its result or,
22
+ * if live literals are activated, returns the value of a dynamic state object that is initialized with
23
+ * the constant value.
24
+ *
25
+ * This predicate gets the constant value held by the private field.
26
+ */
18
27
CompileTimeConstantExpr getValue ( ) {
19
- result =
20
- any ( ReturnStmt r | this .getMethod ( ) .calls * ( r .getEnclosingCallable ( ) ) )
21
- .getResult ( )
22
- .( VarAccess )
23
- .getVariable ( )
24
- .getInitializer ( )
28
+ exists ( MethodAccess getterCall , VarAccess va |
29
+ methodReturns ( this .getMethod ( ) , getterCall ) and
30
+ methodReturns ( getterCall .getMethod ( ) , va ) and
31
+ result = va .getVariable ( ) .getInitializer ( )
32
+ )
25
33
}
26
34
27
35
override string toString ( ) { result = this .getValue ( ) .toString ( ) }
@@ -31,3 +39,10 @@ class LiveLiteral extends MethodAccess {
31
39
class LiveLiteralMethod extends Method {
32
40
LiveLiteralMethod ( ) { this .getDeclaringType ( ) .getName ( ) .matches ( "LiveLiterals$%" ) }
33
41
}
42
+
43
+ private predicate methodReturns ( Method m , Expr res ) {
44
+ exists ( ReturnStmt r |
45
+ r .getResult ( ) = res and
46
+ r .getEnclosingCallable ( ) = m
47
+ )
48
+ }
0 commit comments