mirror of
https://github.com/github/codeql.git
synced 2026-03-24 00:16:49 +01:00
Follow a naming structure similar to the data flow library: - `ControlFlowNode` -> `ControlFlow::Node`. - `CallableEntryNode` -> `ControlFlow::Nodes::EntryNode`. - `CallableExitNode` -> `ControlFlow::Nodes::ExitNode`. - `ControlFlowEdgeType` -> `ControlFlow::SuccessorType`. - `ControlFlowEdgeSuccessor` -> `ControlFlow::SuccessorTypes::NormalSuccessor`. - `ControlFlowEdgeConditional -> ControlFlow::SuccessorTypes::ConditionalSuccessor`. - `ControlFlowEdgeBoolean` -> `ControlFlow::SuccessorTypes::BooleanSuccessor`. - `ControlFlowEdgeNullness` -> `ControlFlow::SuccessorTypes::NullnessSuccessor`. - `ControlFlowEdgeMatching` -> `ControlFlow::SuccessorTypes::MatchingSuccessor`. - `ControlFlowEdgeEmptiness` -> `ControlFlow::SuccessorTypes::EmptinessSuccessor`. - `ControlFlowEdgeReturn` -> `ControlFlow::SuccessorTypes::ReturnSuccessor`. - `ControlFlowEdgeBreak` -> `ControlFlow::SuccessorTypes::BreakSuccessor`. - `ControlFlowEdgeContinue` -> `ControlFlow::SuccessorTypes::ContinueSuccessor`. - `ControlFlowEdgeGotoLabel` -> `ControlFlow::SuccessorTypes::GotoLabelSuccessor`. - `ControlFlowEdgeGotoCase` -> `ControlFlow::SuccessorTypes::GotoCaseSuccessor`. - `ControlFlowEdgeGotoDefault` -> `ControlFlow::SuccessorTypes::GotoDefaultSuccessor`. - `ControlFlowEdgeException` -> `ControlFlow::SuccessorTypes::ExceptionSuccessor`
21 lines
502 B
Plaintext
21 lines
502 B
Plaintext
import csharp
|
|
import ControlFlow
|
|
import Internal
|
|
import Nodes
|
|
|
|
class MyFinallySplitControlFlowNode extends ElementNode {
|
|
MyFinallySplitControlFlowNode() {
|
|
exists(FinallySplitting::FinallySplitType type |
|
|
type = this.getASplit().(FinallySplit).getType() |
|
|
not type instanceof SuccessorTypes::NormalSuccessor
|
|
)
|
|
}
|
|
|
|
TryStmt getTryStmt() {
|
|
this.getElement() = FinallySplitting::getAFinallyDescendant(result)
|
|
}
|
|
}
|
|
|
|
from MyFinallySplitControlFlowNode f
|
|
select f.getTryStmt(), f
|