Skip to content

Commit

Permalink
always fully resolve classname
Browse files Browse the repository at this point in the history
  • Loading branch information
mvorisek committed Aug 3, 2023
1 parent a9d65e1 commit 464e964
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 44 deletions.
101 changes: 67 additions & 34 deletions sphinxcontrib/phpdomain.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,48 +216,81 @@ def handle_signature(self, sig, signode):
if m is None:
throw_if_false(signode, False, "Invalid signature")

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:
# throw_if_false(signode, not name.startswith('$'))
if name.startswith("$"):
name = name[1:]
if type_in_class:
throw_if_false(signode, env_class, "In-class type requires class")
classname = NS + env_class
else:
classname = name
name = None
else:
classname = self.env.temp_data.get("php:class")
throw_if_false(
signode, type_in_class, "Unexpected name in non in-class type"
)
throw_if_false(
signode,
classname.endswith("::"),
"Separator between class and name is required",
)
classname = classname[:-2]
# throw_if_false(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 @@ -273,16 +306,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
22 changes: 22 additions & 0 deletions test/log.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,28 @@
<section id="invalid-domain-type">
<h1>Invalid domain type<a class="headerlink" href="#invalid-domain-type" title="Permalink to this heading">&#xB6;</a></h1>
</section>
<section id="in-class-type-without-class">
<h1>In-class type without class<a class="headerlink" href="#in-class-type-without-class" title="Permalink to this heading">&#xB6;</a></h1>
<dl class="php method">
<dt class="sig sig-object php">
<span class="sig-name descname">
<span class="pre">x()</span>
</span>
</dt>
<dd/>
</dl>
</section>
<section id="not-in-class-type-with-class">
<h1>Not In-class type with class<a class="headerlink" href="#not-in-class-type-with-class" title="Permalink to this heading">&#xB6;</a></h1>
<dl class="php class">
<dt class="sig sig-object php">
<span class="sig-name descname">
<span class="pre">A::A</span>
</span>
</dt>
<dd/>
</dl>
</section>
<section id="invalid-signature">
<h1>Invalid signature<a class="headerlink" href="#invalid-signature" title="Permalink to this heading">&#xB6;</a></h1>
<dl class="php method">
Expand Down
10 changes: 10 additions & 0 deletions test/log.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
:::{php:namespacee} Foo
:::

# In-class type without class

:::{php:method} x()
:::

# Not In-class type with class

:::{php:class} A::A
:::

# Invalid signature

:::{php:method} x();
Expand Down
17 changes: 10 additions & 7 deletions test/log.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
test/log.md:3: WARNING: Unknown directive type: 'php:namespacee' [myst.directive_unknown]
test/log.md:8: WARNING: [phpdomain] Invalid signature
test/log.md:13: [phpdomain] Target Foo\Aa not found
test/log.md:15: [phpdomain] Target Foo\A::simplifyy not found
test/log.md:20: [phpdomain] Target Foo\Foo\A::simplify not found - did you mean to write A::simplify?
test/log.md:25: [phpdomain] Target Fooo\Foo\A::simplify not found - did you mean to write \Foo\A::simplify?
test/ns.md:48: [phpdomain] Target A2::simplify not found
test/ns.md:53: [phpdomain] Target Bar2\A::simplify not found
test/log.md:8: WARNING: [phpdomain] In-class type requires class
test/log.md:13: WARNING: [phpdomain] Unexpected name in non in-class type
test/log.md:18: WARNING: [phpdomain] Invalid signature
test/log.md:23: [phpdomain] Target Foo\Aa not found
test/log.md:25: [phpdomain] Target Foo\A::simplifyy not found
test/log.md:30: [phpdomain] Target Foo\Foo\A::simplify not found - did you mean to write A::simplify?
test/log.md:35: [phpdomain] Target Fooo\Foo\A::simplify not found - did you mean to write \Foo\A::simplify?
test/ns.md:59: [phpdomain] Target A::simplify not found
test/ns.md:69: [phpdomain] Target A2::simplify not found
test/ns.md:74: [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
Expand Down
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 464e964

Please sign in to comment.