Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix domain detection when rendering groups. #365

Merged
merged 1 commit into from
May 22, 2018
Merged
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
53 changes: 37 additions & 16 deletions breathe/renderer/sphinxrenderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,23 @@
import textwrap


class WithContext(object):
def __init__(self, parent, context):
self.context = context
self.parent = parent
self.previous = None

def __enter__(self):
assert self.previous is None
self.previous = self.parent.context
self.parent.set_context(self.context)
return self

def __exit__(self, et, ev, bt):
self.parent.context = self.previous
self.previous = None


class DomainDirectiveFactory(object):
# A mapping from node kinds to cpp domain classes and directive names.
cpp_classes = {
Expand Down Expand Up @@ -375,7 +392,9 @@ def visit_compound(self, node, render_empty_node=True, **kwargs):
# Read in the corresponding xml file and process
file_data = self.compound_parser.parse(node.refid)

rendered_data = self.render(file_data)
parent_context = self.context.create_child_context(file_data)
new_context = parent_context.create_child_context(file_data.compounddef)
rendered_data = self.render(file_data, parent_context)

if not rendered_data and not render_empty_node:
return []
Expand Down Expand Up @@ -406,11 +425,13 @@ def render_signature(file_data, doxygen_target, name, kind):

refid = self.get_refid(node.refid)
render_sig = kwargs.get('render_signature', render_signature)
nodes, contentnode = render_sig(file_data, self.target_handler.create_target(refid),
name, kind)
with WithContext(self, new_context):
# Pretend that the signature is being rendered in context of the
# definition, for proper domain detection
nodes, contentnode = render_sig(
file_data, self.target_handler.create_target(refid),
name, kind)

parent_context = self.context.create_child_context(file_data)
new_context = parent_context.create_child_context(file_data.compounddef)
if file_data.compounddef.includes:
for include in file_data.compounddef.includes:
contentnode.extend(self.render(include, new_context.create_child_context(include)))
Expand Down Expand Up @@ -1191,17 +1212,17 @@ def dispatch_memberdef(self, node):
}

def render(self, node, context=None):
saved_context = self.context
self.set_context(context if context else self.context.create_child_context(node))
result = []
if not self.filter_.allow(self.context.node_stack):
pass
elif isinstance(node, six.string_types):
result = self.visit_unicode(node)
else:
method = SphinxRenderer.methods.get(node.node_type, SphinxRenderer.visit_unknown)
result = method(self, node)
self.context = saved_context
if context is None:
context = self.context.create_child_context(node)
with WithContext(self, context):
result = []
if not self.filter_.allow(self.context.node_stack):
pass
elif isinstance(node, six.string_types):
result = self.visit_unicode(node)
else:
method = SphinxRenderer.methods.get(node.node_type, SphinxRenderer.visit_unknown)
result = method(self, node)
return result

def render_optional(self, node):
Expand Down