@@ -567,3 +567,88 @@ private module CmdArguments {
567
567
}
568
568
}
569
569
}
570
+
571
+ /**
572
+ * Synthesize literals from known constant strings.
573
+ */
574
+ private module LiteralSynth {
575
+ private class LiteralSynth extends Synthesis {
576
+ final override predicate isRelevant ( Raw:: Ast a ) {
577
+ exists ( Raw:: VarAccess va | a = va |
578
+ va .getUserPath ( ) .toLowerCase ( ) = "true"
579
+ or
580
+ va .getUserPath ( ) .toLowerCase ( ) = "false"
581
+ or
582
+ va .getUserPath ( ) .toLowerCase ( ) = "null"
583
+ or
584
+ Raw:: isEnvVariableAccess ( va , _)
585
+ or
586
+ Raw:: isAutomaticVariableAccess ( va , _)
587
+ )
588
+ }
589
+
590
+ final override Expr getResultAstImpl ( Raw:: Ast r ) {
591
+ exists ( Raw:: Ast parent , ChildIndex i | this .child ( parent , i , _, r ) |
592
+ result = TBoolLiteral ( parent , i ) or
593
+ result = TNullLiteral ( parent , i ) or
594
+ result = TEnvVariable ( parent , i ) or
595
+ result = TAutomaticVariable ( parent , i )
596
+ )
597
+ }
598
+
599
+ private predicate child ( Raw:: Ast parent , ChildIndex i , Child child , Raw:: VarAccess va ) {
600
+ exists ( string s |
601
+ parent .getChild ( toRawChildIndex ( i ) ) = va and
602
+ va .getUserPath ( ) .toLowerCase ( ) = s
603
+ |
604
+ s = "true" and
605
+ child = SynthChild ( BoolLiteralKind ( true ) )
606
+ or
607
+ s = "false" and
608
+ child = SynthChild ( BoolLiteralKind ( false ) )
609
+ or
610
+ s = "null" and
611
+ child = SynthChild ( NullLiteralKind ( ) )
612
+ or
613
+ Raw:: isEnvVariableAccess ( va , s ) and
614
+ child = SynthChild ( EnvVariableKind ( s ) )
615
+ or
616
+ Raw:: isAutomaticVariableAccess ( va , s ) and
617
+ child = SynthChild ( AutomaticVariableKind ( s ) )
618
+ )
619
+ }
620
+
621
+ override predicate child ( Raw:: Ast parent , ChildIndex i , Child child ) {
622
+ this .child ( parent , i , child , _)
623
+ }
624
+
625
+ final override predicate booleanValue ( BoolLiteral b , boolean value ) {
626
+ exists ( Raw:: Ast parent , ChildIndex i |
627
+ b = TBoolLiteral ( parent , i ) and
628
+ this .child ( parent , i , SynthChild ( BoolLiteralKind ( value ) ) )
629
+ )
630
+ }
631
+
632
+ final override predicate envVariableName ( EnvVariable var , string name ) {
633
+ exists ( Raw:: Ast parent , ChildIndex i |
634
+ var = TEnvVariable ( parent , i ) and
635
+ this .child ( parent , i , SynthChild ( EnvVariableKind ( name ) ) )
636
+ )
637
+ }
638
+
639
+ final override predicate automaticVariableName ( AutomaticVariable var , string name ) {
640
+ exists ( Raw:: Ast parent , ChildIndex i |
641
+ var = TAutomaticVariable ( parent , i ) and
642
+ this .child ( parent , i , SynthChild ( AutomaticVariableKind ( name ) ) )
643
+ )
644
+ }
645
+
646
+ final override Location getLocation ( Ast n ) {
647
+ exists ( Raw:: VarAccess va |
648
+ this .child ( _, _, _, va ) and
649
+ n = getResultAst ( va ) and
650
+ result = va .getLocation ( )
651
+ )
652
+ }
653
+ }
654
+ }
0 commit comments