Merge pull request #6235 from tk0miya/refactor_stddomain

Add data accessors to StandardDomain
This commit is contained in:
Takeshi KOMIYA 2019-04-06 14:16:09 +09:00 committed by GitHub
commit 9ed0bd2e5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -539,14 +539,35 @@ class StandardDomain(Domain):
for node, settings in env.app.registry.enumerable_nodes.items(): for node, settings in env.app.registry.enumerable_nodes.items():
self.enumerable_nodes[node] = settings self.enumerable_nodes[node] = settings
@property
def objects(self):
# type: () -> Dict[Tuple[str, str], Tuple[str, str]]
return self.data.setdefault('objects', {}) # (objtype, name) -> docname, labelid
@property
def progoptions(self):
# type: () -> Dict[Tuple[str, str], Tuple[str, str]]
return self.data.setdefault('progoptions', {}) # (program, name) -> docname, labelid
@property
def labels(self):
# type: () -> Dict[str, Tuple[str, str, str]]
return self.data.setdefault('labels', {}) # labelname -> docname, labelid, sectionname
@property
def anonlabels(self):
# type: () -> Dict[str, Tuple[str, str]]
return self.data.setdefault('anonlabels', {}) # labelname -> docname, labelid
def clear_doc(self, docname): def clear_doc(self, docname):
# type: (str) -> None # type: (str) -> None
for key, (fn, _l) in list(self.data['progoptions'].items()): key = None # type: Any
for key, (fn, _l) in list(self.progoptions.items()):
if fn == docname: if fn == docname:
del self.data['progoptions'][key] del self.progoptions[key]
for key, (fn, _l) in list(self.data['objects'].items()): for key, (fn, _l) in list(self.objects.items()):
if fn == docname: if fn == docname:
del self.data['objects'][key] del self.objects[key]
for key, (fn, _l, lineno) in list(self.data['citations'].items()): for key, (fn, _l, lineno) in list(self.data['citations'].items()):
if fn == docname: if fn == docname:
del self.data['citations'][key] del self.data['citations'][key]
@ -555,22 +576,22 @@ class StandardDomain(Domain):
del self.data['citation_refs'][key] del self.data['citation_refs'][key]
elif docname in docnames: elif docname in docnames:
docnames.remove(docname) docnames.remove(docname)
for key, (fn, _l, _l) in list(self.data['labels'].items()): for key, (fn, _l, _l) in list(self.labels.items()):
if fn == docname: if fn == docname:
del self.data['labels'][key] del self.labels[key]
for key, (fn, _l) in list(self.data['anonlabels'].items()): for key, (fn, _l) in list(self.anonlabels.items()):
if fn == docname: if fn == docname:
del self.data['anonlabels'][key] del self.anonlabels[key]
def merge_domaindata(self, docnames, otherdata): def merge_domaindata(self, docnames, otherdata):
# type: (List[str], Dict) -> None # type: (List[str], Dict) -> None
# XXX duplicates? # XXX duplicates?
for key, data in otherdata['progoptions'].items(): for key, data in otherdata['progoptions'].items():
if data[0] in docnames: if data[0] in docnames:
self.data['progoptions'][key] = data self.progoptions[key] = data
for key, data in otherdata['objects'].items(): for key, data in otherdata['objects'].items():
if data[0] in docnames: if data[0] in docnames:
self.data['objects'][key] = data self.objects[key] = data
for key, data in otherdata['citations'].items(): for key, data in otherdata['citations'].items():
if data[0] in docnames: if data[0] in docnames:
self.data['citations'][key] = data self.data['citations'][key] = data
@ -581,10 +602,10 @@ class StandardDomain(Domain):
citation_refs.append(docname) citation_refs.append(docname)
for key, data in otherdata['labels'].items(): for key, data in otherdata['labels'].items():
if data[0] in docnames: if data[0] in docnames:
self.data['labels'][key] = data self.labels[key] = data
for key, data in otherdata['anonlabels'].items(): for key, data in otherdata['anonlabels'].items():
if data[0] in docnames: if data[0] in docnames:
self.data['anonlabels'][key] = data self.anonlabels[key] = data
def process_doc(self, env, docname, document): def process_doc(self, env, docname, document):
# type: (BuildEnvironment, str, nodes.document) -> None # type: (BuildEnvironment, str, nodes.document) -> None
@ -613,7 +634,6 @@ class StandardDomain(Domain):
def note_labels(self, env, docname, document): def note_labels(self, env, docname, document):
# type: (BuildEnvironment, str, nodes.document) -> None # type: (BuildEnvironment, str, nodes.document) -> None
labels, anonlabels = self.data['labels'], self.data['anonlabels']
for name, explicit in document.nametypes.items(): for name, explicit in document.nametypes.items():
if not explicit: if not explicit:
continue continue
@ -631,11 +651,11 @@ class StandardDomain(Domain):
# ignore footnote labels, labels automatically generated from a # ignore footnote labels, labels automatically generated from a
# link and object descriptions # link and object descriptions
continue continue
if name in labels: if name in self.labels:
logger.warning(__('duplicate label %s, other instance in %s'), logger.warning(__('duplicate label %s, other instance in %s'),
name, env.doc2path(labels[name][0]), name, env.doc2path(self.labels[name][0]),
location=node) location=node)
anonlabels[name] = docname, labelid self.anonlabels[name] = docname, labelid
if node.tagname in ('section', 'rubric'): if node.tagname in ('section', 'rubric'):
title = cast(nodes.title, node[0]) title = cast(nodes.title, node[0])
sectname = clean_astext(title) sectname = clean_astext(title)
@ -652,15 +672,15 @@ class StandardDomain(Domain):
else: else:
# anonymous-only labels # anonymous-only labels
continue continue
labels[name] = docname, labelid, sectname self.labels[name] = docname, labelid, sectname
def add_object(self, objtype, name, docname, labelid): def add_object(self, objtype, name, docname, labelid):
# type: (str, str, str, str) -> None # type: (str, str, str, str) -> None
self.data['objects'][objtype, name] = (docname, labelid) self.objects[objtype, name] = (docname, labelid)
def add_program_option(self, program, name, docname, labelid): def add_program_option(self, program, name, docname, labelid):
# type: (str, str, str, str) -> None # type: (str, str, str, str) -> None
self.data['progoptions'][program, name] = (docname, labelid) self.progoptions[program, name] = (docname, labelid)
def check_consistency(self): def check_consistency(self):
# type: () -> None # type: () -> None
@ -719,13 +739,12 @@ class StandardDomain(Domain):
if node['refexplicit']: if node['refexplicit']:
# reference to anonymous label; the reference uses # reference to anonymous label; the reference uses
# the supplied link caption # the supplied link caption
docname, labelid = self.data['anonlabels'].get(target, ('', '')) docname, labelid = self.anonlabels.get(target, ('', ''))
sectname = node.astext() sectname = node.astext()
else: else:
# reference to named label; the final node will # reference to named label; the final node will
# contain the section name after the label # contain the section name after the label
docname, labelid, sectname = self.data['labels'].get(target, docname, labelid, sectname = self.labels.get(target, ('', '', ''))
('', '', ''))
if not docname: if not docname:
return None return None
@ -734,10 +753,10 @@ class StandardDomain(Domain):
def _resolve_numref_xref(self, env, fromdocname, builder, typ, target, node, contnode): def _resolve_numref_xref(self, env, fromdocname, builder, typ, target, node, contnode):
# type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA # type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA
if target in self.data['labels']: if target in self.labels:
docname, labelid, figname = self.data['labels'].get(target, ('', '', '')) docname, labelid, figname = self.labels.get(target, ('', '', ''))
else: else:
docname, labelid = self.data['anonlabels'].get(target, ('', '')) docname, labelid = self.anonlabels.get(target, ('', ''))
figname = None figname = None
if not docname: if not docname:
@ -796,7 +815,7 @@ class StandardDomain(Domain):
def _resolve_keyword_xref(self, env, fromdocname, builder, typ, target, node, contnode): def _resolve_keyword_xref(self, env, fromdocname, builder, typ, target, node, contnode):
# type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA # type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA
# keywords are oddballs: they are referenced by named labels # keywords are oddballs: they are referenced by named labels
docname, labelid, _ = self.data['labels'].get(target, ('', '', '')) docname, labelid, _ = self.labels.get(target, ('', '', ''))
if not docname: if not docname:
return None return None
return make_refnode(builder, fromdocname, docname, return make_refnode(builder, fromdocname, docname,
@ -822,7 +841,7 @@ class StandardDomain(Domain):
# type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA # type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA
progname = node.get('std:program') progname = node.get('std:program')
target = target.strip() target = target.strip()
docname, labelid = self.data['progoptions'].get((progname, target), ('', '')) docname, labelid = self.progoptions.get((progname, target), ('', ''))
if not docname: if not docname:
commands = [] commands = []
while ws_re.search(target): while ws_re.search(target):
@ -830,8 +849,7 @@ class StandardDomain(Domain):
commands.append(subcommand) commands.append(subcommand)
progname = "-".join(commands) progname = "-".join(commands)
docname, labelid = self.data['progoptions'].get((progname, target), docname, labelid = self.progoptions.get((progname, target), ('', ''))
('', ''))
if docname: if docname:
break break
else: else:
@ -865,8 +883,8 @@ class StandardDomain(Domain):
# type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA # type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA
objtypes = self.objtypes_for_role(typ) or [] objtypes = self.objtypes_for_role(typ) or []
for objtype in objtypes: for objtype in objtypes:
if (objtype, target) in self.data['objects']: if (objtype, target) in self.objects:
docname, labelid = self.data['objects'][objtype, target] docname, labelid = self.objects[objtype, target]
break break
else: else:
docname, labelid = '', '' docname, labelid = '', ''
@ -890,8 +908,8 @@ class StandardDomain(Domain):
key = (objtype, target) key = (objtype, target)
if objtype == 'term': if objtype == 'term':
key = (objtype, ltarget) key = (objtype, ltarget)
if key in self.data['objects']: if key in self.objects:
docname, labelid = self.data['objects'][key] docname, labelid = self.objects[key]
results.append(('std:' + self.role_for_objtype(objtype), results.append(('std:' + self.role_for_objtype(objtype),
make_refnode(builder, fromdocname, docname, make_refnode(builder, fromdocname, docname,
labelid, contnode))) labelid, contnode)))
@ -902,22 +920,22 @@ class StandardDomain(Domain):
# handle the special 'doc' reference here # handle the special 'doc' reference here
for doc in self.env.all_docs: for doc in self.env.all_docs:
yield (doc, clean_astext(self.env.titles[doc]), 'doc', doc, '', -1) yield (doc, clean_astext(self.env.titles[doc]), 'doc', doc, '', -1)
for (prog, option), info in self.data['progoptions'].items(): for (prog, option), info in self.progoptions.items():
if prog: if prog:
fullname = ".".join([prog, option]) fullname = ".".join([prog, option])
yield (fullname, fullname, 'cmdoption', info[0], info[1], 1) yield (fullname, fullname, 'cmdoption', info[0], info[1], 1)
else: else:
yield (option, option, 'cmdoption', info[0], info[1], 1) yield (option, option, 'cmdoption', info[0], info[1], 1)
for (type, name), info in self.data['objects'].items(): for (type, name), info in self.objects.items():
yield (name, name, type, info[0], info[1], yield (name, name, type, info[0], info[1],
self.object_types[type].attrs['searchprio']) self.object_types[type].attrs['searchprio'])
for name, info in self.data['labels'].items(): for name, (docname, labelid, sectionname) in self.labels.items():
yield (name, info[2], 'label', info[0], info[1], -1) yield (name, sectionname, 'label', docname, labelid, -1)
# add anonymous-only labels as well # add anonymous-only labels as well
non_anon_labels = set(self.data['labels']) non_anon_labels = set(self.labels)
for name, info in self.data['anonlabels'].items(): for name, (docname, labelid) in self.anonlabels.items():
if name not in non_anon_labels: if name not in non_anon_labels:
yield (name, name, 'label', info[0], info[1], -1) yield (name, name, 'label', docname, labelid, -1)
def get_type_name(self, type, primary=False): def get_type_name(self, type, primary=False):
# type: (ObjType, bool) -> str # type: (ObjType, bool) -> str