22
22
from docutils .parsers .rst import directives
23
23
24
24
from sphinx import addnodes
25
- from sphinx .addnodes import desc_signature , pending_xref
25
+ from sphinx .addnodes import desc_signature , pending_xref , pending_xref_condition
26
26
from sphinx .application import Sphinx
27
27
from sphinx .builders import Builder
28
28
from sphinx .deprecation import RemovedInSphinx50Warning
37
37
from sphinx .util .docfields import Field , GroupedField , TypedField
38
38
from sphinx .util .docutils import SphinxDirective
39
39
from sphinx .util .inspect import signature_from_str
40
- from sphinx .util .nodes import make_id , make_refnode
40
+ from sphinx .util .nodes import find_pending_xref_condition , make_id , make_refnode
41
41
from sphinx .util .typing import TextlikeNode
42
42
43
43
logger = logging .getLogger (__name__ )
@@ -92,7 +92,17 @@ def type_to_xref(text: str, env: BuildEnvironment = None) -> addnodes.pending_xr
92
92
else :
93
93
kwargs = {}
94
94
95
- return pending_xref ('' , nodes .Text (text ),
95
+ if env .config .python_use_unqualified_type_names :
96
+ # Note: It would be better to use qualname to describe the object to support support
97
+ # nested classes. But python domain can't access the real python object because this
98
+ # module should work not-dynamically.
99
+ shortname = text .split ('.' )[- 1 ]
100
+ contnodes = [pending_xref_condition ('' , shortname , condition = 'resolved' ),
101
+ pending_xref_condition ('' , text , condition = '*' )] # type: List[Node]
102
+ else :
103
+ contnodes = [nodes .Text (text )]
104
+
105
+ return pending_xref ('' , * contnodes ,
96
106
refdomain = 'py' , reftype = reftype , reftarget = text , ** kwargs )
97
107
98
108
@@ -1209,7 +1219,15 @@ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder
1209
1219
if obj [2 ] == 'module' :
1210
1220
return self ._make_module_refnode (builder , fromdocname , name , contnode )
1211
1221
else :
1212
- return make_refnode (builder , fromdocname , obj [0 ], obj [1 ], contnode , name )
1222
+ # determine the content of the reference by conditions
1223
+ content = find_pending_xref_condition (node , 'resolved' )
1224
+ if content :
1225
+ children = content .children
1226
+ else :
1227
+ # if not found, use contnode
1228
+ children = [contnode ]
1229
+
1230
+ return make_refnode (builder , fromdocname , obj [0 ], obj [1 ], children , name )
1213
1231
1214
1232
def resolve_any_xref (self , env : BuildEnvironment , fromdocname : str , builder : Builder ,
1215
1233
target : str , node : pending_xref , contnode : Element
@@ -1226,9 +1244,17 @@ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Bui
1226
1244
self ._make_module_refnode (builder , fromdocname ,
1227
1245
name , contnode )))
1228
1246
else :
1247
+ # determine the content of the reference by conditions
1248
+ content = find_pending_xref_condition (node , 'resolved' )
1249
+ if content :
1250
+ children = content .children
1251
+ else :
1252
+ # if not found, use contnode
1253
+ children = [contnode ]
1254
+
1229
1255
results .append (('py:' + self .role_for_objtype (obj [2 ]),
1230
1256
make_refnode (builder , fromdocname , obj [0 ], obj [1 ],
1231
- contnode , name )))
1257
+ children , name )))
1232
1258
return results
1233
1259
1234
1260
def _make_module_refnode (self , builder : Builder , fromdocname : str , name : str ,
@@ -1295,6 +1321,7 @@ def setup(app: Sphinx) -> Dict[str, Any]:
1295
1321
app .setup_extension ('sphinx.directives' )
1296
1322
1297
1323
app .add_domain (PythonDomain )
1324
+ app .add_config_value ('python_use_unqualified_type_names' , False , 'env' )
1298
1325
app .connect ('object-description-transform' , filter_meta_fields )
1299
1326
app .connect ('missing-reference' , builtin_resolver , priority = 900 )
1300
1327
0 commit comments