Skip to content

Commit

Permalink
switch to full parse and rebuild
Browse files Browse the repository at this point in the history
  • Loading branch information
mvorisek committed Aug 3, 2023
1 parent 2aec01d commit 027e725
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 48 deletions.
95 changes: 61 additions & 34 deletions sphinxcontrib/phpdomain.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,48 +207,75 @@ def handle_signature(self, sig, signode):
log_warning(signode, "Invalid signature: " + sig)
raise ValueError

visibility, modifiers, name_prefix, name, arglist, retann, enumtype = m.groups()
visibility, modifiers, classname, name, arglist, retann, enumtype = m.groups()

if not name_prefix:
name_prefix = ""

# determine namespace and class name (if applicable), as well as full name
namespace = self.options.get(
# parse & resolve classname and name
env_namespace = self.options.get(
"namespace", self.env.temp_data.get("php:namespace")
)
env_class = self.env.temp_data.get("php:class")
separator = separators[self.objtype]

if "::" in name_prefix:
classname = name_prefix.rstrip("::")
if (
self.objtype == "const"
and not classname
and (not env_class or name.startswith(NS))
):
separator = None
type_in_class = separator != None

if not classname:
# log_assert(signode, not name.startswith('$'))
if name.startswith("$"):
name = name[1:]
if type_in_class:
log_assert(signode, env_class)
classname = NS + env_class
else:
classname = name
name = None
else:
classname = self.env.temp_data.get("php:class")
log_assert(signode, type_in_class)
log_assert(signode, classname.endswith("::"))
classname = classname[:-2]
# log_assert(signode, name.startswith('$') == (separator and separator.endswith('$'))) # not strictly needed
if name.startswith("$"):
name = name[1:]

if self.objtype == "global":
namespace = None
name = "$" + classname
classname = None
elif classname.startswith(NS):
classname = classname[1:]
elif env_namespace:
classname = env_namespace + NS + classname

if not type_in_class and self.objtype != "global":
name = classname.split(NS)[-1]
classname = ""
elif classname and env_namespace and classname.startswith(env_namespace + NS):
classname = classname[len(env_namespace + NS) :]

if not classname:
fullname = name
elif not name:
fullname = classname
else:
if name_prefix:
fullname = name_prefix + name

# Currently in a class, but not creating another class,
elif classname and not self.objtype in [
"class",
"exception",
"interface",
"trait",
"enum",
"function",
]:
if not self.env.temp_data["php:in_class"]:
name_prefix = classname + separator

fullname = classname + separator + name
fullname = classname + separator + name

name_prefix = classname
if not name_prefix:
name_prefix = None
# elif type_in_class and not self.env.temp_data['php:in_class']:
elif type_in_class:
if not self.env.temp_data.get("php:in_class", False):
name_prefix = name_prefix + separator
else:
classname = ""
fullname = name
name_prefix = None

print([env_namespace, classname, name, fullname, name_prefix])
print()

signode["namespace"] = namespace
signode["namespace"] = env_namespace
signode["class"] = self.class_name = classname
signode["fullname"] = fullname

Expand All @@ -264,16 +291,16 @@ def handle_signature(self, sig, signode):
signode += addnodes.desc_annotation(sig_prefix, sig_prefix)

if name_prefix:
if namespace and not self.env.temp_data["php:in_class"]:
name_prefix = namespace + NS + name_prefix
if env_namespace and not self.env.temp_data["php:in_class"]:
name_prefix = env_namespace + NS + name_prefix
signode += addnodes.desc_addname(name_prefix, name_prefix)

elif (
namespace
env_namespace
and not self.env.temp_data.get("php:in_class", False)
and self.env.config.add_module_names
):
nodetext = namespace + NS
nodetext = env_namespace + NS
signode += addnodes.desc_addname(nodetext, nodetext)

signode += addnodes.desc_name(name, name)
Expand Down
19 changes: 8 additions & 11 deletions test/log.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
test/log.md:3: WARNING: Unknown directive type: 'php:namespacee' [myst.directive_unknown]
test/log.md:8: WARNING: [phpdomain] Invalid signature: x();
test/log.md:13: [phpdomain] Target Aa::simplify not found
test/log.md:15: [phpdomain] Target A::simplifyy not found
test/ns.md:48: [phpdomain] Target A2::simplify not found
test/ns.md:53: [phpdomain] Target Bar2\A::simplify not found
test/rst_doc.md:506: [phpdomain] Target OtherLibrary\int|string|ReturnedClass|\LibraryName\SubPackage\SubpackageInterface|null not found
test/rst_doc2.md:11: [phpdomain] Target Imagine\Image\ImageInterface::draw not found
test/rst_doc2.md:17: [phpdomain] Target Imagine\Image\PointInterface not found
test/rst_doc2.md:17: [phpdomain] Target Imagine\Image\BoxInterface not found
test/rst_doc2.md:17: [phpdomain] Target Imagine\Image\Color not found
test/ns.md:59: [phpdomain.info] Target A::simplify not found
test/ns.md:69: [phpdomain.info] Target A2::simplify not found
test/ns.md:74: [phpdomain.info] Target Bar2\A::simplify not found
test/rst_doc.md:506: [phpdomain.info] Target OtherLibrary\int|string|ReturnedClass|\LibraryName\SubPackage\SubpackageInterface|null not found
test/rst_doc2.md:11: [phpdomain.info] Target Imagine\Image\ImageInterface::draw not found
test/rst_doc2.md:17: [phpdomain.info] Target Imagine\Image\PointInterface not found
test/rst_doc2.md:17: [phpdomain.info] Target Imagine\Image\BoxInterface not found
test/rst_doc2.md:17: [phpdomain.info] Target Imagine\Image\Color not found
3 changes: 0 additions & 3 deletions test/rst_doc.html
Original file line number Diff line number Diff line change
Expand Up @@ -687,9 +687,6 @@ <h2>Namespaced elements<a class="headerlink" href="#namespace-LibraryName" title
<p>A class in a namespace</p>
<dl class="php method">
<dt class="sig sig-object php" id="LibraryName\LibraryClass::instanceMethod">
<span class="sig-prename descclassname">
<span class="pre">LibraryClass::</span>
</span>
<span class="sig-name descname">
<span class="pre">instanceMethod</span>
</span>
Expand Down

0 comments on commit 027e725

Please sign in to comment.