Skip to content

Commit 4dd548b

Browse files
author
AndreiDiaconu1
committed
Foreach stmt
Addded support for the foreach stmt (for now only the "canonical" desugaring). Added a test and updated the expected output.
1 parent a5ec763 commit 4dd548b

File tree

6 files changed

+651
-10
lines changed

6 files changed

+651
-10
lines changed

csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedElement.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,11 @@ newtype TTranslatedElement =
269269
)
270270
} or
271271
// A local declaration
272-
TTranslatedDeclaration(LocalVariableDeclExpr entry) or
272+
TTranslatedDeclaration(LocalVariableDeclExpr entry) {
273+
// foreach var decl and init is treated separately,
274+
// because foreach needs desugaring
275+
not entry.getParent() instanceof ForeachStmt
276+
} or
273277
// A compiler generated element, generated by `generatedBy` during the
274278
// desugaring process
275279
TTranslatedCompilerGeneratedElement(Element generatedBy, int index) {

csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedStmt.qll

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private import TranslatedInitialization
1111
private import common.TranslatedConditionBlueprint
1212
private import IRInternal
1313
private import semmle.code.csharp.ir.internal.IRUtilities
14+
private import desugar.Foreach
1415

1516
TranslatedStmt getTranslatedStmt(Stmt stmt) { result.getAST() = stmt }
1617

@@ -853,3 +854,35 @@ class TranslatedSwitchStmt extends TranslatedStmt {
853854
)
854855
}
855856
}
857+
858+
class TranslatedEnumeratorForeach extends TranslatedLoop {
859+
override ForeachStmt stmt;
860+
861+
override TranslatedElement getChild(int id) {
862+
id = 0 and result = getTempEnumDecl() or
863+
id = 1 and result = getTry()
864+
}
865+
866+
override Instruction getFirstInstruction() {
867+
result = getTempEnumDecl().getFirstInstruction()
868+
}
869+
870+
override Instruction getChildSuccessor(TranslatedElement child) {
871+
(
872+
child = getTempEnumDecl() and
873+
result = getTry().getFirstInstruction()
874+
) or
875+
(
876+
child = getTry() and
877+
result = getParent().getChildSuccessor(this)
878+
)
879+
}
880+
881+
private TranslatedElement getTry() {
882+
result = ForeachElements::getTry(stmt)
883+
}
884+
885+
private TranslatedElement getTempEnumDecl() {
886+
result = ForeachElements::getEnumDecl(stmt)
887+
}
888+
}

0 commit comments

Comments
 (0)