|
1 | | -function isfuncexpr(ex, name=nothing) |
2 | | - checkname(fdef::Expr, name) = checkname(fdef.args[1], name) |
3 | | - checkname(fname::Symbol, name::Symbol) = begin |
4 | | - fname === name && return true |
5 | | - startswith(string(name), string('#', fname, '#')) && return true |
6 | | - return false |
| 1 | +function checkname(fdef::Expr, name) |
| 2 | + fproto = fdef.args[1] |
| 3 | + fdef.head === :where && return checkname(fproto, name) |
| 4 | + if fproto isa Expr |
| 5 | + # Is the check below redundant? |
| 6 | + fproto.head === :. || return false |
| 7 | + # E.g. `function Mod.bar.foo(a, b)` |
| 8 | + return checkname(fproto.args[end], name) |
7 | 9 | end |
8 | | - checkname(fname::Symbol, ::Nothing) = true |
| 10 | + return checkname(fproto, name) |
| 11 | +end |
| 12 | +checkname(fname::Symbol, name::Symbol) = begin |
| 13 | + fname === name && return true |
| 14 | + startswith(string(name), string('#', fname, '#')) && return true |
| 15 | + return false |
| 16 | +end |
| 17 | +checkname(fname::Symbol, ::Nothing) = true |
| 18 | +checkname(fname::QuoteNode, name) = checkname(fname.value, name) |
9 | 19 |
|
| 20 | +function isfuncexpr(ex, name=nothing) |
10 | 21 | # Strip any macros that wrap the method definition |
11 | | - while isexpr(ex, :macrocall) && length(ex.args) == 3 |
| 22 | + while ex isa Expr && ex.head === :macrocall && length(ex.args) == 3 |
12 | 23 | ex = ex.args[3] |
13 | 24 | end |
14 | 25 | isa(ex, Expr) || return false |
15 | | - ex.head == :function && return checkname(ex, name) |
16 | | - if ex.head == :(=) |
17 | | - a = ex.args[1] |
18 | | - if isa(a, Expr) |
19 | | - while a.head == :where |
20 | | - a = a.args[1] |
21 | | - isa(a, Expr) || return false |
22 | | - end |
23 | | - a.head == :call && return checkname(a, name) |
24 | | - end |
| 26 | + if ex.head === :function || ex.head === :(=) |
| 27 | + return checkname(ex.args[1], name) |
25 | 28 | end |
26 | 29 | return false |
27 | 30 | end |
|
35 | 38 | linerange(arg) = linerange(convert(Expr, arg)) # Handle Revise's RelocatableExpr |
36 | 39 |
|
37 | 40 | function findline(ex, order) |
38 | | - ex.head == :line && return ex.args[1], true |
| 41 | + ex.head === :line && return ex.args[1], true |
39 | 42 | for a in order(ex.args) |
40 | 43 | a isa LineNumberNode && return a.line, true |
41 | 44 | if a isa Expr |
|
0 commit comments