From a16cd8967bf0558d8cf4270bb55df35cd3979570 Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Thu, 5 Aug 2021 14:54:38 +0100 Subject: [PATCH] Ignore synthesised reads for jump-to-definition We synthesise variables for things like tuple patterns. For example, this Ruby code: a, b = ... becomes: __synth__0 = ... a = __synth__0[0] b = __synth__0[1] The `__synth__` variables should be ignored when calculating jump-to-definition information, since they don't appear in the original source code. --- ql/src/queries/analysis/Definitions.ql | 4 +++- ql/test/query-tests/analysis/Definitions.expected | 11 ++++++----- ql/test/query-tests/analysis/Definitions.rb | 5 +++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ql/src/queries/analysis/Definitions.ql b/ql/src/queries/analysis/Definitions.ql index e586c4b8e35..70906b79719 100644 --- a/ql/src/queries/analysis/Definitions.ql +++ b/ql/src/queries/analysis/Definitions.ql @@ -43,7 +43,9 @@ newtype DefLoc = exists(Ssa::WriteDefinition w | write = w.getWriteAccess() and read = w.getARead().getExpr() and - not read.getLocation() = write.getLocation() + not read.getLocation() = write.getLocation() and + not read.isSynthesized() + ) ) } diff --git a/ql/test/query-tests/analysis/Definitions.expected b/ql/test/query-tests/analysis/Definitions.expected index 3417ff4a457..c09cf864199 100644 --- a/ql/test/query-tests/analysis/Definitions.expected +++ b/ql/test/query-tests/analysis/Definitions.expected @@ -1,8 +1,9 @@ | Definitions.rb:4:7:4:9 | call to g | Definitions.rb:7:5:9:7 | g | method | | Definitions.rb:8:7:8:7 | x | Definitions.rb:7:11:7:11 | x | variable | | Definitions.rb:12:7:12:7 | call to f | Definitions.rb:3:5:5:7 | f | method | -| Definitions.rb:20:7:20:7 | A | Definitions.rb:1:1:15:3 | A | constant | -| Definitions.rb:20:7:20:10 | B | Definitions.rb:2:3:14:5 | B | constant | -| Definitions.rb:20:18:20:18 | y | Definitions.rb:19:11:19:11 | y | variable | -| Definitions.rb:26:1:26:1 | C | Definitions.rb:17:1:24:3 | C | constant | -| Definitions.rb:26:1:26:4 | D | Definitions.rb:18:3:23:5 | D | constant | +| Definitions.rb:21:7:21:7 | y | Definitions.rb:20:10:20:10 | y | variable | +| Definitions.rb:25:7:25:7 | A | Definitions.rb:1:1:15:3 | A | constant | +| Definitions.rb:25:7:25:10 | B | Definitions.rb:2:3:14:5 | B | constant | +| Definitions.rb:25:18:25:18 | y | Definitions.rb:24:11:24:11 | y | variable | +| Definitions.rb:31:1:31:1 | C | Definitions.rb:17:1:29:3 | C | constant | +| Definitions.rb:31:1:31:4 | D | Definitions.rb:18:3:28:5 | D | constant | diff --git a/ql/test/query-tests/analysis/Definitions.rb b/ql/test/query-tests/analysis/Definitions.rb index 350ae469e89..9d7a6a50543 100644 --- a/ql/test/query-tests/analysis/Definitions.rb +++ b/ql/test/query-tests/analysis/Definitions.rb @@ -16,6 +16,11 @@ end module C class D + def initialize + x, y = [1, 2] + y + end + def h y A::B.new.g y UnknownClass.some_method