@@ -419,6 +419,352 @@ module Trees {
419419 }
420420 }
421421
422+ private class CaseMatchTree extends PreOrderTree , CaseExpr , ASTInternal:: TCaseMatch {
423+ final override predicate propagatesAbnormal ( AstNode child ) {
424+ child = this .getValue ( ) or child = this .getABranch ( )
425+ }
426+
427+ final override predicate last ( AstNode last , Completion c ) {
428+ last ( this .getABranch ( ) , last , c ) and
429+ not c .( MatchingCompletion ) .getValue ( ) = false
430+ or
431+ not exists ( this .getElseBranch ( ) ) and
432+ exists ( Completion lc , Expr lastBranch |
433+ lastBranch = max ( int i | | this .getBranch ( i ) order by i ) and
434+ lc .( MatchingCompletion ) .getValue ( ) = false and
435+ last ( lastBranch , last , lc ) and
436+ c .getInnerCompletion ( ) = lc and
437+ c instanceof RaiseCompletion
438+ )
439+ }
440+
441+ final override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
442+ pred = this and
443+ first ( this .getValue ( ) , succ ) and
444+ c instanceof SimpleCompletion
445+ or
446+ last ( this .getValue ( ) , pred , c ) and
447+ first ( this .getBranch ( 0 ) , succ ) and
448+ c instanceof SimpleCompletion
449+ or
450+ exists ( int i , Expr branch | branch = this .getBranch ( i ) |
451+ last ( branch , pred , c ) and
452+ first ( this .getBranch ( i + 1 ) , succ ) and
453+ c .( MatchingCompletion ) .getValue ( ) = false
454+ )
455+ }
456+ }
457+
458+ private class PatternVariableAccessTree extends LocalVariableAccessTree , CasePattern {
459+ final override predicate last ( AstNode last , Completion c ) {
460+ super .last ( last , c ) and
461+ c .( MatchingCompletion ) .getValue ( ) = true
462+ }
463+ }
464+
465+ private class ArrayPatternTree extends ControlFlowTree , ArrayPattern {
466+ final override predicate propagatesAbnormal ( AstNode child ) {
467+ child = this .getClass ( ) or
468+ child = this .getPrefixElement ( _) or
469+ child = this .getRestVariableAccess ( ) or
470+ child = this .getSuffixElement ( _)
471+ }
472+
473+ final override predicate first ( AstNode first ) {
474+ first ( this .getClass ( ) , first )
475+ or
476+ not exists ( this .getClass ( ) ) and first = this
477+ }
478+
479+ final override predicate last ( AstNode last , Completion c ) {
480+ c .( MatchingCompletion ) .getValue ( ) = false and
481+ (
482+ last = this
483+ or
484+ exists ( AstNode node |
485+ node = this .getClass ( ) or
486+ node = this .getPrefixElement ( _) or
487+ node = this .getSuffixElement ( _)
488+ |
489+ last ( node , last , c )
490+ )
491+ )
492+ or
493+ c .( MatchingCompletion ) .getValue ( ) = true and
494+ last = this and
495+ not exists ( this .getPrefixElement ( _) ) and
496+ not exists ( this .getRestVariableAccess ( ) )
497+ or
498+ c .( MatchingCompletion ) .getValue ( ) = true and
499+ last ( max ( int i | | this .getPrefixElement ( i ) order by i ) , last , c ) and
500+ not exists ( this .getRestVariableAccess ( ) )
501+ or
502+ last ( this .getRestVariableAccess ( ) , last , c ) and
503+ not exists ( this .getSuffixElement ( _) )
504+ or
505+ c .( MatchingCompletion ) .getValue ( ) = true and
506+ last ( max ( int i | | this .getSuffixElement ( i ) order by i ) , last , c )
507+ }
508+
509+ final override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
510+ last ( this .getClass ( ) , pred , c ) and
511+ succ = this and
512+ c .( MatchingCompletion ) .getValue ( ) = true
513+ or
514+ pred = this and
515+ first ( this .getPrefixElement ( 0 ) , succ ) and
516+ c .( MatchingCompletion ) .getValue ( ) = true
517+ or
518+ not exists ( this .getPrefixElement ( _) ) and
519+ pred = this and
520+ first ( this .getRestVariableAccess ( ) , succ ) and
521+ c .( MatchingCompletion ) .getValue ( ) = true
522+ or
523+ last ( max ( int i | | this .getPrefixElement ( i ) order by i ) , pred , c ) and
524+ first ( this .getRestVariableAccess ( ) , succ ) and
525+ c .( MatchingCompletion ) .getValue ( ) = true
526+ or
527+ exists ( int i |
528+ last ( this .getPrefixElement ( i ) , pred , c ) and
529+ first ( this .getPrefixElement ( i + 1 ) , succ ) and
530+ c .( MatchingCompletion ) .getValue ( ) = true
531+ )
532+ or
533+ last ( this .getRestVariableAccess ( ) , pred , c ) and
534+ first ( this .getSuffixElement ( 0 ) , succ ) and
535+ c instanceof SimpleCompletion
536+ or
537+ exists ( int i |
538+ last ( this .getSuffixElement ( i ) , pred , c ) and
539+ first ( this .getSuffixElement ( i + 1 ) , succ ) and
540+ c .( MatchingCompletion ) .getValue ( ) = true
541+ )
542+ }
543+ }
544+
545+ private class FindPatternTree extends ControlFlowTree , FindPattern {
546+ final override predicate propagatesAbnormal ( AstNode child ) {
547+ child = this .getClass ( ) or
548+ child = this .getPrefixVariableAccess ( ) or
549+ child = this .getElement ( _) or
550+ child = this .getSuffixVariableAccess ( )
551+ }
552+
553+ final override predicate first ( AstNode first ) {
554+ first ( this .getClass ( ) , first )
555+ or
556+ not exists ( this .getClass ( ) ) and first = this
557+ }
558+
559+ final override predicate last ( AstNode last , Completion c ) {
560+ last ( this .getSuffixVariableAccess ( ) , last , c )
561+ or
562+ last ( max ( int i | | this .getElement ( i ) order by i ) , last , c ) and
563+ not exists ( this .getSuffixVariableAccess ( ) )
564+ or
565+ c .( MatchingCompletion ) .getValue ( ) = false and
566+ (
567+ last = this
568+ or
569+ exists ( AstNode node | node = this .getClass ( ) or node = this .getElement ( _) |
570+ last ( node , last , c )
571+ )
572+ )
573+ }
574+
575+ final override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
576+ last ( this .getClass ( ) , pred , c ) and
577+ succ = this and
578+ c .( MatchingCompletion ) .getValue ( ) = true
579+ or
580+ pred = this and
581+ first ( this .getPrefixVariableAccess ( ) , succ ) and
582+ c .( MatchingCompletion ) .getValue ( ) = true
583+ or
584+ pred = this and
585+ first ( this .getElement ( 0 ) , succ ) and
586+ not exists ( this .getPrefixVariableAccess ( ) ) and
587+ c .( MatchingCompletion ) .getValue ( ) = true
588+ or
589+ last ( this .getPrefixVariableAccess ( ) , pred , c ) and
590+ first ( this .getElement ( 0 ) , succ ) and
591+ c instanceof SimpleCompletion
592+ or
593+ c .( MatchingCompletion ) .getValue ( ) = true and
594+ exists ( int i |
595+ last ( this .getElement ( i ) , pred , c ) and
596+ first ( this .getElement ( i + 1 ) , succ )
597+ )
598+ or
599+ c .( MatchingCompletion ) .getValue ( ) = true and
600+ last ( max ( int i | | this .getElement ( i ) order by i ) , pred , c ) and
601+ first ( this .getSuffixVariableAccess ( ) , succ )
602+ }
603+ }
604+
605+ private class HashPatternTree extends ControlFlowTree , HashPattern {
606+ final override predicate propagatesAbnormal ( AstNode child ) {
607+ child = this .getClass ( ) or
608+ child = this .getValue ( _) or
609+ child = this .getRestVariableAccess ( )
610+ }
611+
612+ final override predicate first ( AstNode first ) {
613+ first ( this .getClass ( ) , first )
614+ or
615+ not exists ( this .getClass ( ) ) and first = this
616+ }
617+
618+ final override predicate last ( AstNode last , Completion c ) {
619+ c .( MatchingCompletion ) .getValue ( ) = false and
620+ (
621+ last = this
622+ or
623+ exists ( AstNode node |
624+ node = this .getClass ( ) or
625+ node = this .getValue ( _)
626+ |
627+ last ( node , last , c )
628+ )
629+ )
630+ or
631+ c .( MatchingCompletion ) .getValue ( ) = true and
632+ last = this and
633+ not exists ( this .getValue ( _) ) and
634+ not exists ( this .getRestVariableAccess ( ) )
635+ or
636+ c .( MatchingCompletion ) .getValue ( ) = true and
637+ last ( max ( int i | | this .getValue ( i ) order by i ) , last , c ) and
638+ not exists ( this .getRestVariableAccess ( ) )
639+ or
640+ last ( this .getRestVariableAccess ( ) , last , c )
641+ }
642+
643+ final override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
644+ last ( this .getClass ( ) , pred , c ) and
645+ succ = this and
646+ c .( MatchingCompletion ) .getValue ( ) = true
647+ or
648+ pred = this and
649+ first ( this .getValue ( 0 ) , succ ) and
650+ c .( MatchingCompletion ) .getValue ( ) = true
651+ or
652+ not exists ( this .getValue ( _) ) and
653+ pred = this and
654+ first ( this .getRestVariableAccess ( ) , succ ) and
655+ c .( MatchingCompletion ) .getValue ( ) = true
656+ or
657+ last ( max ( int i | | this .getValue ( i ) order by i ) , pred , c ) and
658+ first ( this .getRestVariableAccess ( ) , succ ) and
659+ c .( MatchingCompletion ) .getValue ( ) = true
660+ or
661+ exists ( int i |
662+ last ( this .getValue ( i ) , pred , c ) and
663+ first ( this .getValue ( i + 1 ) , succ ) and
664+ c .( MatchingCompletion ) .getValue ( ) = true
665+ )
666+ }
667+ }
668+
669+ private class LineLiteralTree extends LeafTree , LineLiteral { }
670+
671+ private class FileLiteralTree extends LeafTree , FileLiteral { }
672+
673+ private class EncodingLiteralTree extends LeafTree , EncodingLiteral { }
674+
675+ private class AlternativePatternTree extends PreOrderTree , AlternativePattern {
676+ final override predicate propagatesAbnormal ( AstNode child ) { child = this .getAnAlternative ( ) }
677+
678+ final override predicate last ( AstNode last , Completion c ) {
679+ last ( this .getAnAlternative ( ) , last , c ) and
680+ c .( MatchingCompletion ) .getValue ( ) = true
681+ or
682+ last ( max ( int i | | this .getAlternative ( i ) order by i ) , last , c ) and
683+ c .( MatchingCompletion ) .getValue ( ) = false
684+ }
685+
686+ final override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
687+ pred = this and
688+ first ( this .getAlternative ( 0 ) , succ ) and
689+ c instanceof SimpleCompletion
690+ or
691+ exists ( int i |
692+ last ( this .getAlternative ( i ) , pred , c ) and
693+ first ( this .getAlternative ( i + 1 ) , succ ) and
694+ c .( MatchingCompletion ) .getValue ( ) = false
695+ )
696+ }
697+ }
698+
699+ private class AsPatternTree extends StandardPreOrderTree , AsPattern {
700+ override ControlFlowTree getChildElement ( int i ) {
701+ result = this .getPattern ( ) and i = 0
702+ or
703+ result = this .getVariableAccess ( ) and i = 1
704+ }
705+ }
706+
707+ private class ParenthesizedPatternTree extends StandardPreOrderTree , ParenthesizedPattern {
708+ override ControlFlowTree getChildElement ( int i ) { result = this .getPattern ( ) and i = 0 }
709+ }
710+
711+ private class VariableReferencePatternTree extends StandardPostOrderTree , VariableReferencePattern {
712+ override ControlFlowTree getChildElement ( int i ) { result = this .getVariableAccess ( ) and i = 0 }
713+ }
714+
715+ private class InClauseTree extends PreOrderTree , InClause {
716+ final override predicate propagatesAbnormal ( AstNode child ) {
717+ child = this .getPattern ( ) or
718+ child = this .getCondition ( )
719+ }
720+
721+ final override predicate last ( AstNode last , Completion c ) {
722+ last ( this .getPattern ( ) , last , c ) and
723+ c .( MatchingCompletion ) .getValue ( ) = false
724+ or
725+ exists ( Completion pc |
726+ last ( this .getCondition ( ) , last , pc ) and
727+ pc .( ConditionalCompletion ) .getValue ( ) = false and
728+ c .( MatchingCompletion ) .getValue ( ) = false
729+ )
730+ or
731+ last ( this .getBody ( ) , last , c )
732+ or
733+ not exists ( this .getBody ( ) ) and last ( this .getCondition ( ) , last , c )
734+ or
735+ not exists ( this .getBody ( ) ) and
736+ not exists ( this .getCondition ( ) ) and
737+ last ( this .getPattern ( ) , last , c )
738+ }
739+
740+ final override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
741+ pred = this and
742+ first ( this .getPattern ( ) , succ ) and
743+ c instanceof SimpleCompletion
744+ or
745+ exists ( Expr next |
746+ last ( this .getPattern ( ) , pred , c ) and
747+ c .( MatchingCompletion ) .getValue ( ) = true and
748+ first ( next , succ )
749+ |
750+ next = this .getCondition ( )
751+ or
752+ not exists ( this .getCondition ( ) ) and next = this .getBody ( )
753+ )
754+ or
755+ exists ( Completion pc , boolean flag |
756+ flag = true and this .hasIfCondition ( )
757+ or
758+ flag = false and this .hasUnlessCondition ( )
759+ |
760+ last ( this .getCondition ( ) , pred , pc ) and
761+ pc .( ConditionalCompletion ) .getValue ( ) = flag and
762+ first ( this .getBody ( ) , succ ) and
763+ c .( MatchingCompletion ) .getValue ( ) = true
764+ )
765+ }
766+ }
767+
422768 private class CharacterTree extends LeafTree , CharacterLiteral { }
423769
424770 private class ClassDeclarationTree extends NamespaceTree , ClassDeclaration {
0 commit comments