From e8938fb4667ae2730e71aa82da17209464c7bfac Mon Sep 17 00:00:00 2001 From: Esben Sparre Andreasen Date: Mon, 17 Feb 2020 23:20:25 +0100 Subject: [PATCH] JS: introduce RegExpSequence::nextElement and previousElement --- .../ql/src/semmle/javascript/Regexp.qll | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/javascript/ql/src/semmle/javascript/Regexp.qll b/javascript/ql/src/semmle/javascript/Regexp.qll index c8118b20a62..d0b39ce59b6 100644 --- a/javascript/ql/src/semmle/javascript/Regexp.qll +++ b/javascript/ql/src/semmle/javascript/Regexp.qll @@ -76,40 +76,22 @@ class RegExpTerm extends Locatable, @regexpterm { /** Gets the regular expression term that is matched (textually) before this one, if any. */ RegExpTerm getPredecessor() { exists(RegExpTerm parent | parent = getParent() | - if parent instanceof RegExpSequence - then - exists(RegExpSequence seq, int i | - seq = parent and - seq.getChild(i) = this - | - seq.getChild(i - 1) = result - or - i = 0 and result = seq.getPredecessor() - ) - else ( - not parent instanceof RegExpSubPattern and - result = parent.getPredecessor() - ) + result = parent.(RegExpSequence).previousElement(this) + or + not exists(parent.(RegExpSequence).previousElement(this)) and + not parent instanceof RegExpSubPattern and + result = parent.getPredecessor() ) } /** Gets the regular expression term that is matched (textually) after this one, if any. */ RegExpTerm getSuccessor() { exists(RegExpTerm parent | parent = getParent() | - if parent instanceof RegExpSequence - then - exists(RegExpSequence seq, int i | - seq = parent and - seq.getChild(i) = this - | - seq.getChild(i + 1) = result - or - i = seq.getNumChild() - 1 and result = seq.getSuccessor() - ) - else ( - not parent instanceof RegExpSubPattern and - result = parent.getSuccessor() - ) + result = parent.(RegExpSequence).nextElement(this) + or + not exists(parent.(RegExpSequence).nextElement(this)) and + not parent instanceof RegExpSubPattern and + result = parent.getSuccessor() ) } @@ -328,6 +310,19 @@ class RegExpSequence extends RegExpTerm, @regexp_seq { or result = getChild(i).getConstantValue() + getConstantValue(i+1) } + + /** Gets the element preceding `element` in this sequence. */ + RegExpTerm previousElement(RegExpTerm element) { + element = nextElement(result) + } + + /** Gets the element following `element` in this sequence. */ + RegExpTerm nextElement(RegExpTerm element) { + exists(int i | + element = this.getChild(i) and + result = this.getChild(i + 1) + ) + } } /**