Lines Matching refs:self
18 def __init__(self, *args, **kwargs):
23 def __init__(self,
44 self.generator = generator
45 self.conventions = generator.genOpts.conventions
46 self.filename = filename
47 self.interface = interface
48 self.name = name
49 self.number = number
50 self.ext_type = ext_type
51 self.depends = depends
52 self.contact = contact
53 self.promotedTo = promotedTo
54 self.deprecatedBy = deprecatedBy
55 self.obsoletedBy = obsoletedBy
56 self.provisional = provisional
57 self.revision = revision
58 self.specialuse = specialuse
59 self.ratified = ratified
61 self.deprecationType = None
62 self.supercedingAPIVersion = None
63 self.supercedingExtension = None
68 self.promotedFrom = set()
70 if self.promotedTo is not None and self.deprecatedBy is not None and self.obsoletedBy is not None:
71 self.generator.logMsg('warn', 'All \'promotedto\', \'deprecatedby\' and \'obsoletedby\' attributes used on extension ' + self.name + '! Ignoring \'promotedto\' and \'deprecatedby\'.')
72 elif self.promotedTo is not None and self.deprecatedBy is not None:
73 self.generator.logMsg('warn', 'Both \'promotedto\' and \'deprecatedby\' attributes used on extension ' + self.name + '! Ignoring \'deprecatedby\'.')
74 elif self.promotedTo is not None and self.obsoletedBy is not None:
75 self.generator.logMsg('warn', 'Both \'promotedto\' and \'obsoletedby\' attributes used on extension ' + self.name + '! Ignoring \'promotedto\'.')
76 elif self.deprecatedBy is not None and self.obsoletedBy is not None:
77 self.generator.logMsg('warn', 'Both \'deprecatedby\' and \'obsoletedby\' attributes used on extension ' + self.name + '! Ignoring \'deprecatedby\'.')
80 if self.promotedTo is not None:
81 self.deprecationType = 'promotion'
83 elif self.deprecatedBy is not None:
84 self.deprecationType = 'deprecation'
86 elif self.obsoletedBy is not None:
87 self.deprecationType = 'obsoletion'
91 if supercededBy == '' and not self.deprecationType == 'promotion':
93 elif supercededBy.startswith(self.conventions.api_version_prefix):
94 self.supercedingAPIVersion = supercededBy
95 elif supercededBy.startswith(self.conventions.extension_name_prefix):
96 self.supercedingExtension = supercededBy
98 self.generator.logMsg('error', 'Unrecognized ' + self.deprecationType + ' attribute value \'' + supercededBy + '\'!')
100 def __str__(self):
101 return self.name
102 def __eq__(self, other):
103 return self.name == other.name
104 def __ne__(self, other):
105 return self.name != other.name
107 def __lt__(self, other):
108 self_is_KHR = self.name.startswith(self.conventions.KHR_prefix)
109 self_is_EXT = self.name.startswith(self.conventions.EXT_prefix)
110 other_is_KHR = other.name.startswith(self.conventions.KHR_prefix)
111 other_is_EXT = other.name.startswith(self.conventions.EXT_prefix)
123 return self.name < other.name
125 def typeToStr(self):
126 if self.ext_type == 'instance':
128 if self.ext_type == 'device':
131 if self.ext_type is not None:
132 self.generator.logMsg('warn', 'The type attribute of ' + self.name + ' extension is neither \'instance\' nor \'device\'. That is invalid (at the time this script was written).')
134 self.generator.logMsg('error', 'Logic error in typeToStr(): Missing type attribute!')
137 def specLink(self, xrefName, xrefText, isRefpage = False):
148 specURL = self.conventions.specURL('api')
153 def conditionalLinkCoreAPI(self, apiVersion, linkSuffix, isRefpage):
154 versionMatch = re.match(self.conventions.api_version_prefix + r'(\d+)_(\d+)', apiVersion)
161 xrefText = self.conventions.api_name() + ' ' + dottedVersion
164 doc += ' ' + self.specLink(xrefName, xrefText, isRefpage) + '\n'
167 doc += ' ' + self.conventions.api_name() + ' ' + dottedVersion + '\n'
172 def conditionalLinkExt(self, extName, indent = ' '):
174 doc += indent + self.conventions.formatExtension(extName) + '\n'
182 def resolveDeprecationChain(self, extensions, succeededBy, isRefpage, file):
185 self.generator.logMsg('warn', f'resolveDeprecationChain: {self.name} defines a superseding interface {succeededBy} which is not in the supported extensions list')
214 self.generator.logMsg('error', 'Logic error in resolveDeprecationChain(): deprecationType is neither \'promotion\', \'deprecation\' nor \'obsoletion\'!')
217 def writeTag(self, tag, value, isRefpage, fp):
248 def makeMetafile(self, extensions, SPV_deps, isRefpage = False):
260 filename = self.filename.replace('meta/', 'meta/refpage.')
262 filename = self.filename
264 fp = self.generator.newFile(filename)
267 write('[[' + self.name + ']]', file=fp)
268 write('=== ' + self.name, file=fp)
271 self.writeTag('Name String', '`' + self.name + '`', isRefpage, fp)
272 if self.conventions.write_extension_type:
273 self.writeTag('Extension Type', self.typeToStr(), isRefpage, fp)
275 if self.conventions.write_extension_number:
276 self.writeTag('Registered Extension Number', self.number, isRefpage, fp)
277 if self.conventions.write_extension_revision:
278 self.writeTag('Revision', self.revision, isRefpage, fp)
280 if self.conventions.xml_api_name in self.ratified.split(','):
284 self.writeTag('Ratification Status', ratstatus, isRefpage, fp)
287 self.writeTag('Extension and Version Dependencies', None, isRefpage, fp)
291 if self.depends is not None:
297 dependencyMarkup(self.depends) +
302 self.writeTag(None, 'None', isRefpage, fp)
304 if self.provisional == 'true' and self.conventions.provisional_extension_warning:
307 self.specLink(xrefName = 'boilerplate-provisional-header',
316 for elem in self.interface.findall('require[@depends]'):
321 self.writeTag('API Interactions', None, isRefpage, fp)
331 if self.name in SPV_deps:
332 self.writeTag('SPIR-V Dependencies', None, isRefpage, fp)
334 for spvname in sorted(SPV_deps[self.name]):
335 write(f' * {self.conventions.formatSPIRVlink(spvname)}', file=fp)
339 if self.deprecationType:
340 self.writeTag('Deprecation State', None, isRefpage, fp)
342 if self.deprecationType == 'promotion':
343 if self.supercedingAPIVersion:
344 write(' * _Promoted_ to\n' + self.conditionalLinkCoreAPI(self.supercedingAPIVersion, '-promotions', isRefpage), file=fp)
346 write(' * _Promoted_ to\n' + self.conditionalLinkExt(self.supercedingExtension) + ' extension', file=fp)
347 self.resolveDeprecationChain(extensions, self.supercedingExtension, isRefpage, fp)
348 elif self.deprecationType == 'deprecation':
349 if self.supercedingAPIVersion:
350 write(' * _Deprecated_ by\n' + self.conditionalLinkCoreAPI(self.supercedingAPIVersion, '-new-features', isRefpage), file=fp)
351 elif self.supercedingExtension:
352 write(' * _Deprecated_ by\n' + self.conditionalLinkExt(self.supercedingExtension) + ' extension' , file=fp)
353 self.resolveDeprecationChain(extensions, self.supercedingExtension, isRefpage, fp)
356 elif self.deprecationType == 'obsoletion':
357 if self.supercedingAPIVersion:
358 write(' * _Obsoleted_ by\n' + self.conditionalLinkCoreAPI(self.supercedingAPIVersion, '-new-features', isRefpage), file=fp)
359 elif self.supercedingExtension:
360 write(' * _Obsoleted_ by\n' + self.conditionalLinkExt(self.supercedingExtension) + ' extension' , file=fp)
361 self.resolveDeprecationChain(extensions, self.supercedingExtension, isRefpage, fp)
367 self.generator.logMsg('error', 'Logic error in makeMetafile(): deprecationType is neither \'promotion\', \'deprecation\' nor \'obsoletion\'!')
370 if self.specialuse is not None:
371 specialuses = self.specialuse.split(',')
376 self.writeTag(header, None, isRefpage, fp)
383 self.specLink(
384 xrefName = self.conventions.special_use_section_anchor,
389 if self.conventions.write_contacts:
390 self.writeTag('Contact', None, isRefpage, fp)
392 contacts = self.contact.split(',')
400 issuePlaceholderText = f'[{self.name}] {handle}'
401 issuePlaceholderText += f'%0A*Here describe the issue or question you have about the {self.name} extension*'
433 path = checkProposal(self.name)
435 proposals.append([self.name, path])
437 for name in self.promotedFrom:
445 self.writeTag(tag,
455 if isRefpage and self.conventions.include_extension_appendix_in_refpage:
478 def __init__(self, *args, **kwargs):
480 self.extensions = {}
482 self.vendor_tags = []
483 self.file_suffix = ''
485 self.SPV_deps = {}
487 def newFile(self, filename):
488 self.logMsg('diag', '# Generating include file:', filename)
490 write(self.genOpts.conventions.warning_comment, file=fp)
493 def beginFile(self, genOpts):
494 OutputGenerator.beginFile(self, genOpts)
496 self.directory = self.genOpts.directory
497 self.file_suffix = self.genOpts.conventions.file_suffix
501 root = self.registry.tree.getroot()
503 self.vendor_tags.append(tag.get('name'))
522 add_dep(self.SPV_deps, version_name, spvname)
525 add_dep(self.SPV_deps, ext_name, spvname)
528 self.makeDir(self.directory)
530 def conditionalExt(self, extName, content, ifdef = None, condition = None):
559 def makeExtensionInclude(self, extname):
560 return self.conventions.extension_include_string(extname)
562 def endFile(self):
566 for (extname, ext) in self.extensions.items():
569 if promotedTo in self.extensions:
571 self.extensions[promotedTo].promotedFrom.add(extname)
572 #print(f'setting self.extensions[{promotedTo}].promotedFrom = {self.extensions[promotedTo].promotedFrom}')
573 elif not self.conventions.is_api_version_name(promotedTo):
574 self.logMsg('warn', f'{extname} is promoted to {promotedTo} which is not in the extension map')
577 for ext in self.extensions.values():
578 ext.makeMetafile(self.extensions, self.SPV_deps, isRefpage = False)
579 if self.conventions.write_refpage_include:
580 ext.makeMetafile(self.extensions, self.SPV_deps, isRefpage = True)
586 prefixes = self.conventions.extension_index_prefixes
594 for ext in self.extensions.values():
599 promoted_extensions_fp = self.newFile(self.directory + '/promoted_extensions_' + coreVersion + self.file_suffix)
609 with self.newFile(self.directory + '/current_extensions_appendix' + self.file_suffix) as current_extensions_appendix_fp, \
610 self.newFile(self.directory + '/deprecated_extensions_appendix' + self.file_suffix) as deprecated_extensions_appendix_fp, \
611 self.newFile(self.directory + '/current_extension_appendices' + self.file_suffix) as current_extension_appendices_fp, \
612 self.newFile(self.directory + '/current_extension_appendices_toc' + self.file_suffix) as current_extension_appendices_toc_fp, \
613 self.newFile(self.directory + '/deprecated_extension_appendices' + self.file_suffix) as deprecated_extension_appendices_fp, \
614 self.newFile(self.directory + '/deprecated_extension_appendices_toc' + self.file_suffix) as deprecated_extension_appendices_toc_fp, \
615 self.newFile(self.directory + '/deprecated_extensions_guard_macro' + self.file_suffix) as deprecated_extensions_guard_macro_fp, \
616 self.newFile(self.directory + '/provisional_extensions_appendix' + self.file_suffix) as provisional_extensions_appendix_fp, \
617 self.newFile(self.directory + '/provisional_extension_appendices' + self.file_suffix) as provisional_extension_appendices_fp, \
618 self.newFile(self.directory + '/provisional_extension_appendices_toc' + self.file_suffix) as provisional_extension_appendices_toc_fp, \
619 self.newFile(self.directory + '/provisional_extensions_guard_macro' + self.file_suffix) as provisional_extensions_guard_macro_fp:
628 write('include::{generated}/meta/deprecated_extensions_guard_macro' + self.file_suffix + '[]', file=current_extensions_appendix_fp)
639 write('include::{generated}/meta/current_extension_appendices_toc' + self.file_suffix + '[]', file=current_extensions_appendix_fp)
641 write('include::{generated}/meta/current_extension_appendices' + self.file_suffix + '[]', file=current_extensions_appendix_fp)
644 write('include::{generated}/meta/deprecated_extensions_guard_macro' + self.file_suffix + '[]', file=deprecated_extensions_appendix_fp)
649 write('include::{generated}/meta/deprecated_extension_appendices_toc' + self.file_suffix + '[]', file=deprecated_extensions_appendix_fp)
651 write('include::{generated}/meta/deprecated_extension_appendices' + self.file_suffix + '[]', file=deprecated_extensions_appendix_fp)
661 write('include::{generated}/meta/provisional_extensions_guard_macro' + self.file_suffix + '[]', file=provisional_extensions_appendix_fp)
666 write('include::{generated}/meta/provisional_extension_appendices_toc' + self.file_suffix + '[]', file=provisional_extensions_appendix_fp)
668 write('include::{generated}/meta/provisional_extension_appendices' + self.file_suffix + '[]', file=provisional_extensions_appendix_fp)
672 sorted_keys = sorted(self.extensions.keys(), key=makeSortKey)
674 ext = self.extensions[name]
676 include = self.makeExtensionInclude(ext.name)
677 link = ' * ' + self.conventions.formatExtension(ext.name)
679 write(self.conditionalExt(ext.name, include), file=provisional_extension_appendices_fp)
680 write(self.conditionalExt(ext.name, link), file=provisional_extension_appendices_toc_fp)
681 write(self.conditionalExt(ext.name, ':HAS_PROVISIONAL_EXTENSIONS:'), file=provisional_extensions_guard_macro_fp)
683 write(self.conditionalExt(ext.name, include), file=current_extension_appendices_fp)
684 write(self.conditionalExt(ext.name, link), file=current_extension_appendices_toc_fp)
688 write(self.conditionalExt(ext.name, include, 'ifndef', condition), file=current_extension_appendices_fp)
689 write(self.conditionalExt(ext.name, link, 'ifndef', condition), file=current_extension_appendices_toc_fp)
691 write(self.conditionalExt(ext.name, include, 'ifdef', condition), file=deprecated_extension_appendices_fp)
692 write(self.conditionalExt(ext.name, link, 'ifdef', condition), file=deprecated_extension_appendices_toc_fp)
694 write(self.conditionalExt(ext.name, ':HAS_DEPRECATED_EXTENSIONS:', 'ifdef', condition), file=deprecated_extensions_guard_macro_fp)
699 OutputGenerator.endFile(self)
701 def beginFeature(self, interface, emit):
703 OutputGenerator.beginFeature(self, interface, emit)
706 self.logMsg('diag', 'beginFeature: ignoring non-extension feature', self.featureName)
709 name = self.featureName
712 number = self.getAttrib(interface, 'number',
713 self.conventions.write_extension_number)
714 ext_type = self.getAttrib(interface, 'type',
715 self.conventions.write_extension_type)
716 if self.conventions.write_extension_revision:
717 revision = self.getSpecVersion(interface, name)
723 depends = self.getAttrib(interface, 'depends', OPTIONAL) # TODO should default to base API version 1.0?
724 contact = self.getAttrib(interface, 'contact', OPTIONAL)
725 promotedTo = self.getAttrib(interface, 'promotedto', OPTIONAL)
726 deprecatedBy = self.getAttrib(interface, 'deprecatedby', OPTIONAL)
727 obsoletedBy = self.getAttrib(interface, 'obsoletedby', OPTIONAL)
728 provisional = self.getAttrib(interface, 'provisional', OPTIONAL, 'false')
729 specialuse = self.getAttrib(interface, 'specialuse', OPTIONAL)
730 ratified = self.getAttrib(interface, 'ratified', OPTIONAL, '')
732 filename = self.directory + '/' + name + self.file_suffix
735 generator = self,
750 self.extensions[name] = extdata
752 def endFeature(self):
754 OutputGenerator.endFeature(self)
756 def getAttrib(self, elem, attribute, required=True, default=None):
766 self.logMsg('error', 'While processing \'' + self.featureName + ', <' + elem.tag + '> \'' + name + '\' does not contain required attribute \'' + attribute + '\'')
769 def numbersToWords(self, name):
784 def getSpecVersion(self, elem, extname, default=None):
793 versioningEnumName = self.numbersToWords(extname.upper()) + '_SPEC_VERSION'
796 enumName = self.getAttrib(enum, 'name')
798 return self.getAttrib(enum, 'value')
802 enumName = self.getAttrib(enum, 'name')
804 self.logMsg('diag', 'Missing ' + versioningEnumName + '! Potential misnamed candidate ' + enumName + '.')
805 return self.getAttrib(enum, 'value')
807 self.logMsg('error', 'Missing ' + versioningEnumName + '!')