|
1 | 1 | private import codeql.ruby.AST |
| 2 | +private import codeql.ruby.ast.internal.AST |
2 | 3 | private import codeql.ruby.ast.internal.Literal |
3 | 4 | private import codeql.ruby.ast.internal.Module |
| 5 | +private import codeql.ruby.ast.internal.TreeSitter |
4 | 6 | private import codeql.ruby.controlflow.CfgNodes |
5 | 7 | private import codeql.ruby.dataflow.SSA |
6 | 8 | private import ExprNodes |
@@ -559,3 +561,60 @@ private predicate isArrayExpr(Expr e, ArrayLiteralCfgNode arr) { |
559 | 561 | // results if the source is a phi node. |
560 | 562 | forex(ExprCfgNode n | n = e.getAControlFlowNode() | isArrayConstant(n, arr)) |
561 | 563 | } |
| 564 | + |
| 565 | +private class TokenConstantAccess extends ConstantAccess, TTokenConstantAccess { |
| 566 | + private Ruby::Constant g; |
| 567 | + |
| 568 | + TokenConstantAccess() { this = TTokenConstantAccess(g) } |
| 569 | + |
| 570 | + final override string getName() { result = g.getValue() } |
| 571 | +} |
| 572 | + |
| 573 | +/** |
| 574 | + * A constant access that has a scope resolution qualifier. |
| 575 | + */ |
| 576 | +class ScopeResolutionConstantAccess extends ConstantAccess, TScopeResolutionConstantAccess { |
| 577 | + private Ruby::ScopeResolution g; |
| 578 | + private Ruby::Constant constant; |
| 579 | + |
| 580 | + ScopeResolutionConstantAccess() { this = TScopeResolutionConstantAccess(g, constant) } |
| 581 | + |
| 582 | + /** |
| 583 | + * Gets the name of the constant. |
| 584 | + */ |
| 585 | + final override string getName() { result = constant.getValue() } |
| 586 | + |
| 587 | + /** Gets the scope resolution expression. */ |
| 588 | + final override Expr getScopeExpr() { toGenerated(result) = g.getScope() } |
| 589 | + |
| 590 | + /** Holds if this constant access has a global scope. */ |
| 591 | + final override predicate hasGlobalScope() { not exists(g.getScope()) } |
| 592 | +} |
| 593 | + |
| 594 | +private class ConstantReadAccessSynth extends ConstantAccess, TConstantReadAccessSynth { |
| 595 | + private string value; |
| 596 | + |
| 597 | + ConstantReadAccessSynth() { this = TConstantReadAccessSynth(_, _, value) } |
| 598 | + |
| 599 | + final override string getName() { |
| 600 | + if this.hasGlobalScope() then result = value.suffix(2) else result = value |
| 601 | + } |
| 602 | + |
| 603 | + final override Expr getScopeExpr() { synthChild(this, 0, result) } |
| 604 | + |
| 605 | + final override predicate hasGlobalScope() { value.matches("::%") } |
| 606 | +} |
| 607 | + |
| 608 | +private class ConstantWriteAccessSynth extends ConstantAccess, TConstantWriteAccessSynth { |
| 609 | + private string value; |
| 610 | + |
| 611 | + ConstantWriteAccessSynth() { this = TConstantWriteAccessSynth(_, _, value) } |
| 612 | + |
| 613 | + final override string getName() { |
| 614 | + if this.hasGlobalScope() then result = value.suffix(2) else result = value |
| 615 | + } |
| 616 | + |
| 617 | + final override Expr getScopeExpr() { synthChild(this, 0, result) } |
| 618 | + |
| 619 | + final override predicate hasGlobalScope() { value.matches("::%") } |
| 620 | +} |
0 commit comments