Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
add resolve only pass
  • Loading branch information
ZacLN committed Jan 20, 2021
commit f243e955151b059b1254469b59adccbbb0f3327e
48 changes: 47 additions & 1 deletion src/StaticLint.jl
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ bindingof(m::Meta) = m.binding
abstract type State end
mutable struct Toplevel{T} <: State
file::T
targetfile::Union{Nothing,T}
included_files::Vector{String}
scope::Scope
delayed::Vector{EXPR}
Expand Down Expand Up @@ -112,6 +111,53 @@ function (state::Delayed)(x::EXPR)
return state.scope
end

mutable struct ResolveOnly <: State
scope::Scope
server
end

function (state::ResolveOnly)(x::EXPR)
if hasscope(x)
s0 = state.scope
state.scope = scopeof(x)
else
s0 = state.scope
end
resolve_ref(x, state)

traverse(x, state)
if state.scope != s0
state.scope = s0
end
return state.scope
end


function semantic_pass(file, target=nothing)
server = file.server
setscope!(getcst(file), Scope(nothing, getcst(file), Dict(), Dict{Symbol,Any}(:Base => getsymbolserver(server)[:Base], :Core => getsymbolserver(server)[:Core]), nothing))
state = Toplevel(file, [getpath(file)], scopeof(getcst(file)), EXPR[], server)
state(getcst(file))
for x in state.delayed
if target === nothing || x in target
if hasscope(x)
traverse(x, Delayed(scopeof(x), server))
for (k, b) in scopeof(x).names
infer_type_by_use(b, state.server)
end
else
traverse(x, Delayed(retrieve_delayed_scope(x), server))
end
else
if hasscope(x)
traverse(x, ResolveOnly(scopeof(x), server))
else
traverse(x, ResolveOnly(retrieve_delayed_scope(x), server))
end
end
end
end

"""
traverse(x, state)

Expand Down
17 changes: 0 additions & 17 deletions src/server.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,6 @@ end
getsymbolserver(server::FileServer) = server.symbolserver
getsymbolextendeds(server::FileServer) = server.symbol_extends

function semantic_pass(file, target=nothing)
server = file.server
setscope!(getcst(file), Scope(nothing, getcst(file), Dict(), Dict{Symbol,Any}(:Base => getsymbolserver(server)[:Base], :Core => getsymbolserver(server)[:Core]), nothing))
state = Toplevel(file, target, [getpath(file)], scopeof(getcst(file)), EXPR[], server)
state(getcst(file))
for x in state.delayed
if hasscope(x)
traverse(x, Delayed(scopeof(x), server))
for (k, b) in scopeof(x).names
infer_type_by_use(b, state.server)
end
else
ds = retrieve_delayed_scope(x)
traverse(x, Delayed(ds, server))
end
end
end

getpath(file::File) = file.path

Expand Down