@@ -115,149 +115,6 @@ domCreate(
115
115
return corpus.toStringFn (corpus, I);
116
116
}
117
117
118
- Info const *
119
- resolveTypedef (Corpus const & c, Info const & I)
120
- {
121
- if (I.Kind == InfoKind::Typedef)
122
- {
123
- TypedefInfo const & TI = dynamic_cast <TypedefInfo const &>(I);
124
- std::unique_ptr<TypeInfo> const & T = TI.Type ;
125
- MRDOCS_CHECK_OR (T && T->Kind == TypeKind::Named, &I);
126
- NamedTypeInfo const & NT = dynamic_cast <NamedTypeInfo const &>(*T);
127
- MRDOCS_CHECK_OR (NT.Name , &I);
128
- Info const * resolved = c.find (NT.Name ->id );
129
- MRDOCS_CHECK_OR (resolved, &I);
130
- if (resolved->Kind == InfoKind::Typedef)
131
- {
132
- return resolveTypedef (c, *resolved);
133
- }
134
- return resolved;
135
- }
136
- return &I;
137
- }
138
-
139
- Info const *
140
- findPrimarySiblingWithUrl (Corpus const & c, Info const & I, Info const & parent)
141
- {
142
- // Look for the primary sibling in the parent scope
143
- auto const * parentScope = dynamic_cast <ScopeInfo const *>(&parent);
144
- MRDOCS_CHECK_OR (parentScope, nullptr );
145
- for (auto & siblingIDs = parentScope->Lookups .at (I.Name );
146
- SymbolID const & siblingID: siblingIDs)
147
- {
148
- Info const * sibling = c.find (siblingID);
149
- if (!sibling ||
150
- !shouldGenerate (*sibling) ||
151
- sibling->Name != I.Name )
152
- {
153
- continue ;
154
- }
155
- bool const isPrimarySibling = visit (*sibling, [&](auto const & U)
156
- {
157
- if constexpr (requires { U.Template ; })
158
- {
159
- std::optional<TemplateInfo> const & Template = U.Template ;
160
- MRDOCS_CHECK_OR (Template, false );
161
- return !Template->Params .empty () && Template->Args .empty ();
162
- }
163
- return false ;
164
- });
165
- if (!isPrimarySibling)
166
- {
167
- continue ;
168
- }
169
- return sibling;
170
- }
171
- return nullptr ;
172
- }
173
-
174
- Info const *
175
- findPrimarySiblingWithUrl (Corpus const & c, Info const & I);
176
-
177
- Info const *
178
- findDirectPrimarySiblingWithUrl (Corpus const & c, Info const & I)
179
- {
180
- // If the parent is a scope, look for a primary sibling
181
- // in the parent scope for which we want to generate the URL
182
- Info const * parent = c.find (I.Parent );
183
- MRDOCS_CHECK_OR (parent, nullptr );
184
- if (!shouldGenerate (*parent))
185
- {
186
- parent = findPrimarySiblingWithUrl (c, *parent);
187
- MRDOCS_CHECK_OR (parent, nullptr );
188
- }
189
- return findPrimarySiblingWithUrl (c, I, *parent);
190
- }
191
-
192
- Info const *
193
- findResolvedPrimarySiblingWithUrl (Corpus const & c, Info const & I)
194
- {
195
- // Check if this info is a specialization or a typedef to
196
- // a specialization, otherwise there's nothing to resolve
197
- bool const isSpecialization = visit (I, [&]<typename InfoTy>(InfoTy const & U)
198
- {
199
- // The symbol is a specialization
200
- if constexpr (requires { U.Template ; })
201
- {
202
- std::optional<TemplateInfo> const & Template = U.Template ;
203
- if (Template &&
204
- !Template->Args .empty ())
205
- {
206
- return true ;
207
- }
208
- }
209
- // The symbol is a typedef to a specialization
210
- if constexpr (std::same_as<InfoTy, TypedefInfo>)
211
- {
212
- std::unique_ptr<TypeInfo> const & T = U.Type ;
213
- MRDOCS_CHECK_OR (T && T->Kind == TypeKind::Named, false );
214
- auto const & NT = dynamic_cast <NamedTypeInfo const &>(*T);
215
- MRDOCS_CHECK_OR (NT.Name , false );
216
- MRDOCS_CHECK_OR (NT.Name ->Kind == NameKind::Specialization, false );
217
- return true ;
218
- }
219
- return false ;
220
- });
221
- MRDOCS_CHECK_OR (isSpecialization, nullptr );
222
-
223
- // Find the parent scope containing the primary sibling
224
- // for which we want to generate the URL
225
- Info const * parent = c.find (I.Parent );
226
- MRDOCS_CHECK_OR (parent, nullptr );
227
-
228
- // If the parent is a typedef, resolve it
229
- // so we can iterate the members of this scope.
230
- // We can't find siblings in a typedef because
231
- // it's not a scope.
232
- if (parent->Kind == InfoKind::Typedef)
233
- {
234
- parent = resolveTypedef (c, *parent);
235
- MRDOCS_CHECK_OR (parent, nullptr );
236
- }
237
-
238
- // If the resolved parent is also a specialization or
239
- // a dependency for which there's no URL, we attempt to
240
- // find the primary sibling for the parent so we take
241
- // the URL from it.
242
- if (!shouldGenerate (*parent))
243
- {
244
- parent = findPrimarySiblingWithUrl (c, *parent);
245
- MRDOCS_CHECK_OR (parent, nullptr );
246
- }
247
-
248
- return findPrimarySiblingWithUrl (c, I, *parent);
249
- }
250
-
251
- Info const *
252
- findPrimarySiblingWithUrl (Corpus const & c, Info const & I)
253
- {
254
- if (Info const * primary = findDirectPrimarySiblingWithUrl (c, I))
255
- {
256
- return primary;
257
- }
258
- return findResolvedPrimarySiblingWithUrl (c, I);
259
- }
260
-
261
118
} // (anon)
262
119
263
120
dom::Object
@@ -275,7 +132,7 @@ construct(Info const& I) const
275
132
// If the URL is not available because it's a specialization
276
133
// or dependency, we still want to generate the URL and anchor
277
134
// for the primary template if it's part of the corpus.
278
- if (Info const * primaryInfo = findPrimarySiblingWithUrl (getCorpus (), I))
135
+ if (Info const * primaryInfo = findAlternativeURLInfo (getCorpus (), I))
279
136
{
280
137
obj.set (" url" , getURL (*primaryInfo));
281
138
obj.set (" anchor" , names_.getQualified (primaryInfo->id , ' -' ));
0 commit comments