diff --git a/ql/src/codeql_ruby/ast/Method.qll b/ql/src/codeql_ruby/ast/Method.qll index 39509c0103b..3040df238cc 100644 --- a/ql/src/codeql_ruby/ast/Method.qll +++ b/ql/src/codeql_ruby/ast/Method.qll @@ -1,7 +1,6 @@ private import codeql_ruby.AST private import codeql_ruby.controlflow.ControlFlowGraph private import internal.AST -private import internal.TreeSitter private import internal.Method /** A callable. */ diff --git a/ql/src/codeql_ruby/ast/Parameter.qll b/ql/src/codeql_ruby/ast/Parameter.qll index 88d77727488..e81c9c930f6 100644 --- a/ql/src/codeql_ruby/ast/Parameter.qll +++ b/ql/src/codeql_ruby/ast/Parameter.qll @@ -1,6 +1,5 @@ private import codeql_ruby.AST private import internal.Pattern -private import internal.TreeSitter private import internal.Variable private import internal.Parameter diff --git a/ql/src/codeql_ruby/ast/Pattern.qll b/ql/src/codeql_ruby/ast/Pattern.qll index 82ed5d1ff90..bb521bf60ba 100644 --- a/ql/src/codeql_ruby/ast/Pattern.qll +++ b/ql/src/codeql_ruby/ast/Pattern.qll @@ -1,7 +1,6 @@ private import codeql_ruby.AST private import codeql.Locations private import internal.Pattern -private import internal.TreeSitter private import internal.Variable /** A pattern. */ diff --git a/ql/src/codeql_ruby/ast/Variable.qll b/ql/src/codeql_ruby/ast/Variable.qll index 7ba2fa64d2a..d848763b71b 100644 --- a/ql/src/codeql_ruby/ast/Variable.qll +++ b/ql/src/codeql_ruby/ast/Variable.qll @@ -2,7 +2,6 @@ private import codeql_ruby.AST private import codeql.Locations -private import internal.TreeSitter private import internal.Variable /** A scope in which variables can be declared. */ diff --git a/ql/src/codeql_ruby/controlflow/BasicBlocks.qll b/ql/src/codeql_ruby/controlflow/BasicBlocks.qll index 2ecdd5bafd0..08001011625 100644 --- a/ql/src/codeql_ruby/controlflow/BasicBlocks.qll +++ b/ql/src/codeql_ruby/controlflow/BasicBlocks.qll @@ -1,7 +1,7 @@ /** Provides classes representing basic blocks. */ private import codeql.Locations -private import codeql_ruby.ast.internal.TreeSitter::Generated +private import codeql_ruby.AST private import codeql_ruby.controlflow.ControlFlowGraph private import internal.ControlFlowGraphImpl private import CfgNodes diff --git a/ql/src/codeql_ruby/controlflow/CfgNodes.qll b/ql/src/codeql_ruby/controlflow/CfgNodes.qll index 7f310b86bb1..1004e092d6a 100644 --- a/ql/src/codeql_ruby/controlflow/CfgNodes.qll +++ b/ql/src/codeql_ruby/controlflow/CfgNodes.qll @@ -1,7 +1,6 @@ /** Provides classes representing nodes in a control flow graph. */ private import codeql_ruby.AST -private import codeql_ruby.ast.internal.TreeSitter private import codeql_ruby.controlflow.BasicBlocks private import ControlFlowGraph private import internal.ControlFlowGraphImpl @@ -65,7 +64,7 @@ class ExitNode extends CfgNode, TExitNode { */ class AstCfgNode extends CfgNode, TAstNode { private Splits splits; - private Generated::AstNode n; + private AstNode n; AstCfgNode() { this = TAstNode(n, splits) } @@ -74,28 +73,7 @@ class AstCfgNode extends CfgNode, TAstNode { override Location getLocation() { result = n.getLocation() } final override string toString() { - exists(string s | - // TODO: Replace the two disjuncts below with `s = n.(AstNode).toString()` once - // `RemoveWhenFullCoverage` has been removed - s = n.(AstNode).toString() and - s != "AstNode" - or - n.(AstNode).toString() = "AstNode" and - s = n.toString() - or - n = any(Generated::For f).getValue() and - s = "In" - or - // TODO: Remove these nodes from the CFG - n = any(Generated::Class c).getName() and - s = n.toString() - or - n = any(Generated::Module m).getName() and - s = n.toString() - or - n = any(Generated::ScopeResolution sc).getName() and - s = n.toString() - | + exists(string s | s = n.(AstNode).toString() | result = "[" + this.getSplitsString() + "] " + s or not exists(this.getSplitsString()) and result = s @@ -145,10 +123,10 @@ abstract private class ExprChildMapping extends Expr { */ abstract predicate relevantChild(Expr child); - private Generated::AstNode getAChildStar() { + private AstNode getAChildStar() { result = this or - result.(Generated::AstNode).getParent() = this.getAChildStar() + result.getParent() = this.getAChildStar() } pragma[noinline] diff --git a/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll b/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll index a5026c6085f..5465e03e247 100644 --- a/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll +++ b/ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll @@ -2,7 +2,6 @@ private import codeql.Locations private import codeql_ruby.AST as AST -private import codeql_ruby.ast.internal.TreeSitter::Generated private import codeql_ruby.controlflow.BasicBlocks private import SuccessorTypes private import internal.ControlFlowGraphImpl @@ -15,8 +14,8 @@ class CfgScope extends AST::AstNode { /** Gets the CFG scope that this scope is nested under, if any. */ final CfgScope getOuterCfgScope() { - exists(AstNode parent | - parent.getAFieldOrChild() = this and + exists(AST::AstNode parent | + parent = this.getParent() and result = getCfgScope(parent) ) } diff --git a/ql/src/codeql_ruby/controlflow/internal/Consistency.qll b/ql/src/codeql_ruby/controlflow/internal/Consistency.qll index ccec52fd56e..0b8e07dd77c 100644 --- a/ql/src/codeql_ruby/controlflow/internal/Consistency.qll +++ b/ql/src/codeql_ruby/controlflow/internal/Consistency.qll @@ -1,4 +1,4 @@ -private import codeql_ruby.ast.internal.TreeSitter::Generated +private import codeql_ruby.AST private import codeql_ruby.CFG private import Completion private import Splitting diff --git a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll index 85d8f692401..8d7b67ce4a8 100644 --- a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -208,6 +208,12 @@ private predicate isHidden(ControlFlowTree t) { or t = any(Method m).getName() or + t = any(Class m).getName() + or + t = any(Module m).getName() + or + t = any(ScopeResolution m).getName() + or t = any(SingletonMethod m).getName() or t = any(Call c).getMethod() and diff --git a/ql/src/codeql_ruby/controlflow/internal/NonReturning.qll b/ql/src/codeql_ruby/controlflow/internal/NonReturning.qll index fb180487a70..f17158bc108 100644 --- a/ql/src/codeql_ruby/controlflow/internal/NonReturning.qll +++ b/ql/src/codeql_ruby/controlflow/internal/NonReturning.qll @@ -1,22 +1,22 @@ /** Provides a simple analysis for identifying calls that will not return. */ -private import codeql_ruby.ast.internal.TreeSitter::Generated +private import codeql_ruby.AST private import Completion /** A call that definitely does not return (conservative analysis). */ -abstract class NonReturningCall extends AstNode { +abstract class NonReturningCall extends MethodCall { /** Gets a valid completion for this non-returning call. */ abstract Completion getACompletion(); } -private class RaiseCall extends NonReturningCall, Call { - RaiseCall() { this.getMethod().toString() = "raise" } +private class RaiseCall extends NonReturningCall { + RaiseCall() { this.getMethodName() = "raise" } override RaiseCompletion getACompletion() { not result instanceof NestedCompletion } } -private class ExitCall extends NonReturningCall, Call { - ExitCall() { this.getMethod().toString() in ["abort", "exit"] } +private class ExitCall extends NonReturningCall { + ExitCall() { this.getMethodName() in ["abort", "exit"] } override ExitCompletion getACompletion() { not result instanceof NestedCompletion } } diff --git a/ql/src/codeql_ruby/controlflow/internal/Splitting.qll b/ql/src/codeql_ruby/controlflow/internal/Splitting.qll index 7ae682dd520..d56e1771af8 100644 --- a/ql/src/codeql_ruby/controlflow/internal/Splitting.qll +++ b/ql/src/codeql_ruby/controlflow/internal/Splitting.qll @@ -2,7 +2,7 @@ * Provides classes and predicates relevant for splitting the control flow graph. */ -private import codeql_ruby.ast.internal.TreeSitter::Generated +private import codeql_ruby.AST private import AstNodes private import Completion private import ControlFlowGraphImpl diff --git a/ql/test/library-tests/controlflow/graph/Cfg.expected b/ql/test/library-tests/controlflow/graph/Cfg.expected index 3a7801e77e9..d6f687ecb90 100644 --- a/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -723,9 +723,6 @@ cfg.rb: # 54| ?\x40 #-----| -> character -# 58| Silly -#-----| -> Silly - # 58| Silly #-----| -> Object @@ -1183,9 +1180,6 @@ cfg.rb: # 113| 10 #-----| -> ... > ... -# 115| C -#-----| -> C - # 115| C #-----| -> 42 @@ -1242,9 +1236,6 @@ cfg.rb: # 120| exit -> { ... } (normal) #-----| -> exit -> { ... } -# 122| M -#-----| -> M - # 122| M #-----| -> nil @@ -1405,9 +1396,6 @@ cfg.rb: # 137| M #-----| -> Constant -# 137| Constant -#-----| -> Constant - # 138| Constant #-----| -> class << ... @@ -1417,9 +1405,6 @@ cfg.rb: # 138| M #-----| -> call to itself -# 138| Constant -#-----| -> Constant - # 140| class << ... #-----| -> Silly @@ -2560,9 +2545,6 @@ raise.rb: # 1| enter raise.rb #-----| -> ExceptionA -# 1| ExceptionA -#-----| -> ExceptionA - # 1| ExceptionA #-----| -> Exception @@ -2574,9 +2556,6 @@ raise.rb: # 1| exit raise.rb (normal) #-----| -> exit raise.rb -# 4| ExceptionB -#-----| -> ExceptionB - # 4| ExceptionB #-----| -> Exception