Skip to content

Commit 1ba6f44

Browse files
committed
compute concatenated string and offset at the same time
1 parent be46c1f commit 1ba6f44

File tree

1 file changed

+13
-30
lines changed

1 file changed

+13
-30
lines changed

javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -600,48 +600,30 @@ private boolean isOctalDigit(char ch) {
600600
return '0' <= ch && ch <= '7';
601601
}
602602

603-
private String getStringConcatResult(Expression exp) {
603+
private Pair<String, OffsetTranslation> getStringConcatResult(Expression exp) {
604604
if (exp instanceof BinaryExpression) {
605605
BinaryExpression be = (BinaryExpression) exp;
606606
if (be.getOperator().equals("+")) {
607-
String left = getStringConcatResult(be.getLeft());
608-
String right = getStringConcatResult(be.getRight());
607+
Pair<String, OffsetTranslation> left = getStringConcatResult(be.getLeft());
608+
Pair<String, OffsetTranslation> right = getStringConcatResult(be.getRight());
609609
if (left != null && right != null) {
610-
return left + right;
610+
String str = left.fst() + right.fst();
611+
612+
int delta = be.getRight().getLoc().getStart().getOffset() - be.getLeft().getLoc().getStart().getOffset();
613+
int offset = left.fst().length();
614+
return Pair.make(str, left.snd().append(right.snd(), offset, delta));
611615
}
612616
}
613617
} else if (exp instanceof Literal) {
614618
Literal lit = (Literal) exp;
615619
if (!lit.isStringLiteral()) {
616620
return null;
617621
}
618-
return lit.getStringValue();
622+
return Pair.make(lit.getStringValue(), makeStringLiteralOffsets(lit.getRaw()));
619623
}
620624
return null;
621625
}
622626

623-
private OffsetTranslation computeStringConcatOffset(Expression exp) {
624-
if (exp instanceof Literal && ((Literal)exp).isStringLiteral()) {
625-
String raw = ((Literal) exp).getRaw();
626-
return makeStringLiteralOffsets(raw);
627-
}
628-
629-
if (exp instanceof BinaryExpression) {
630-
BinaryExpression be = (BinaryExpression) exp;
631-
OffsetTranslation left = computeStringConcatOffset(be.getLeft());
632-
OffsetTranslation right = computeStringConcatOffset(be.getRight());
633-
634-
if (left == null || right == null) {
635-
return null;
636-
}
637-
int delta = be.getRight().getLoc().getStart().getOffset() - be.getLeft().getLoc().getStart().getOffset();
638-
int offset = getStringConcatResult(be.getLeft()).length();
639-
return left.append(right, offset, delta);
640-
}
641-
642-
return null;
643-
}
644-
645627
/**
646628
* Builds a translation from offsets in a string value back to its original raw literal text
647629
* (including quotes).
@@ -848,14 +830,15 @@ public Label visit(BinaryExpression nd, Context c) {
848830
if (extractedAsRegexp.contains(nd)) {
849831
return key;
850832
}
851-
String rawString = getStringConcatResult(nd);
852-
if (rawString == null) {
833+
Pair<String, OffsetTranslation> concatResult = getStringConcatResult(nd);
834+
if (concatResult == null) {
853835
return key;
854836
}
837+
String rawString = concatResult.fst();
855838
if (rawString.length() > 1000 && !rawString.trim().isEmpty()) {
856839
return key;
857840
}
858-
OffsetTranslation offsets = computeStringConcatOffset(nd);
841+
OffsetTranslation offsets = concatResult.snd();
859842
Position start = nd.getLoc().getStart();
860843
com.semmle.util.locations.Position startPos = new com.semmle.util.locations.Position(start.getLine(), start.getColumn(), start.getOffset());
861844
SourceMap sourceMap = SourceMap.legacyWithStartPos(SourceMap.fromString(nd.getLoc().getSource()).offsetBy(0, offsets), startPos);

0 commit comments

Comments
 (0)