Thanks to visit codestin.com
Credit goes to github.com

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

6 files changed

Lines changed: 651 additions & 10 deletions

File tree

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)