2
0
mirror of https://github.com/boostorg/docca.git synced 2026-01-19 04:12:08 +00:00

work around repeated members of template specializations

This commit is contained in:
Dmitry Arkhipov
2025-04-11 13:27:59 +03:00
parent b7755ed36f
commit a658a96deb
2 changed files with 30 additions and 6 deletions

View File

@@ -782,12 +782,14 @@ class Scope(Entity):
'enum': Enum,
}[kind]
member = factory(member_def, section, self, index)
if member is None:
continue
if type(member) is OverloadSet:
key = (member.name, member.access, member.kind)
self.members[key] = member
else:
if member and member.name in self.members:
member = work_around_repeated_member(self, member)
if member is None:
continue
assert member.name not in self.members
self.members[member.name] = member
@@ -1146,6 +1148,28 @@ class TypeAlias(Member, Type):
delattr(self, '_aliased')
def work_around_repeated_member(scope, member):
scope_loc = scope.location
member_loc = member.location
old_member = scope.members[member.name]
old_member_loc = old_member.location
if (scope.is_specialization and
scope_loc and
member_loc and
old_member_loc and
member_loc.file == scope_loc.file and
member_loc.line >= scope_loc.line and
(old_member_loc.file != scope_loc.file or
old_member_loc.line < scope_loc.line)):
# the new member's declaration is in the same file as the
# specialization's declaration and follows it; the old member's
# declarattion is either in a different file or preceeds the
# specialization's declaration
del scope.members[member.name]
return member
return None
class AcceptOneorNone(argparse.Action):
def __init__(self, option_strings, dest, **kwargs):
if kwargs.get('nargs') is not None:

View File

@@ -135,10 +135,10 @@ class Section(Block): # A sequence of blocks with an optional title
def __getitem__(self, pos) -> Block
class ParameterList(Block):
parameters = 'param'
return_values = 'retval'
exceptions = 'exception'
template_parameters = 'templateparam'
Parameters = 'param'
ReturnValues = 'retval'
Exceptions = 'exception'
TemplateParameters = 'templateparam'
self.kind -> str # 'param', 'templateparam', etc