Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
35 changes: 22 additions & 13 deletions src/docs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,39 @@ handle("searchdocs") do data
exportedonly = exportedOnly || false,
allPackages || false
] = data
searchdocs′(
needle;
return searchdocs′(
needle,
# kwargs to be passed to `DocSeeker.searchdocs`:
# TODO: configuration for `maxreturns`
loaded = !allPackages, mod = getmodule(mod), exportedonly = exportedonly, name_only = name_only
!allPackages, mod, exportedonly, name_only
)
end

function searchdocs′(needle; kwargs...)
items = _searchdocs(needle; kwargs...)
return processdocs(items)
function searchdocs′(needle, loaded = true, mod = "Main", exportedonly = false, name_only = false)
searchmod = getmodule(mod)

items, actualmod = _searchdocs(needle, loaded, searchmod, exportedonly, name_only)
results = processdocs(items)

# erase module input if the actual searched module has been changed
push!(results, :shoulderase => searchmod ≠ actualmod)

return results
end

function _searchdocs(needle; kwargs...)
function _searchdocs(needle, loaded = true, mod = Main, exportedonly = false, name_only = false)
identifiers = split(needle, '.')
head = string(identifiers[1])
mod = get(kwargs, :mod, Main)
if head ≠ needle && (nextmod = getfield′(mod, head)) isa Module
if loaded && head ≠ needle && (nextmod = getfield′(mod, head)) isa Module
# if `head` is a module, update `needle` and `mod`
nextneedle = join(identifiers[2:end], '.')
nextkwargs = Dict(k => (k === :mod ? nextmod : v) for (k, v) in kwargs)
return _searchdocs(nextneedle; nextkwargs...)
return _searchdocs(nextneedle, loaded, nextmod, exportedonly, name_only)
end

return @errs searchdocs(needle; kwargs...)
return @errs searchdocs(
needle;
loaded = loaded, mod = mod, exportedonly = exportedonly, name_only = name_only
), mod
end

function processdocs(items)
Expand Down Expand Up @@ -91,7 +99,8 @@ ispackage(mod) = Base.find_package(mod) ≠ nothing
function packageinfo(mod)
path = DocSeeker.readmepath(mod)
readme = ispath(path) ? String(read(path)) : ""
description = Markdown.parse(mod ∈ values(Pkg.Types.stdlib()) ? "## Standard library package `$(mod)`" : readme)
stdlibs = @static isdefined(Pkg.Types, :stdlibs) ? Pkg.Types.stdlibs() : Pkg.Types.stdlib()
description = Markdown.parse(mod ∈ values(stdlibs) ? "## Standard library package `$(mod)`" : readme)

return Hiccup.div(
renderMD(description),
Expand Down
16 changes: 7 additions & 9 deletions test/docs.jl
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
@testset "docs" begin
@testset "searchdocs" begin
using Atom: searchdocs′, _searchdocs
using Atom: searchdocs′

# don't error on fallback case
@test !searchdocs′("sin")[:error]
# module awareness
@test all(_searchdocs("getfield′"; mod = "Atom")) do (score, docobj)
docobj.mod == "Atom"
end
# strip module accessor
@test all(_searchdocs("Atom.getfield′"; mod = "Main")) do (score, docobj)
docobj.mod == "Atom"
end

# don't erase module input when it's used
@test !searchdocs′("getfield′", true, "Atom")[:shoulderase]
# erase module input when it's replaced by module prefix in search text
@test searchdocs′("Atom.getfield′", true, "Main")[:shoulderase]
end

@testset "moduleinfo" begin
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,4 @@ include("completions.jl")
include("goto.jl")
include("datatip.jl")
include("workspace.jl")
include("docs.jl")