сбой cldoc при частичной специализации шаблона

Этот вопрос был помечен как неясный, что я спрашиваю. Для ясности я прошу обходной путь, чтобы этот генератор документов работал должным образом против моей кодовой базы. (возможно, разделение работы на партии? Возможно ли это с помощью cldocs? Возможно, выдача различных параметров командной строки? Возможно, мой вызов неверен или неверен?)

Я подал ошибку в проекте, которую вы можете найти здесь с некоторой дополнительной информацией о моей среде (включая полную командную строку, расположенную здесь: http://pastebin.com/JxWf9hRB).

https://github.com/jessevdk/cldoc/issues/73

Оригинальный вопрос:

Я исследую использование cldocs для автоматической документации. Однако, это терпит крах на моей кодовой базе со следующей ошибкой:

Traceback (most recent call last):
File "/usr/local/bin/cldoc", line 9, in <module>
load_entry_point('cldoc==1.6', 'console_scripts', 'cldoc')()
File "/usr/local/lib/python2.7/site-packages/cldoc/__init__.py", line 57, in run
run_generate(rest)
File "/usr/local/lib/python2.7/site-packages/cldoc/__init__.py", line 27, in run_generate
cmdgenerate.run(args)
File "/usr/local/lib/python2.7/site-packages/cldoc/cmdgenerate.py", line 151, in run
run_generate(t, opts)
File "/usr/local/lib/python2.7/site-packages/cldoc/cmdgenerate.py", line 33, in run_generate
generator.generate(xmlout)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 55, in generate
Generator.generate(self, outdir)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/generator.py", line 22, in generate
self.generate_node(node)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 543, in generate_node
self.generate_page(node)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 510, in generate_page
elem = self.node_to_xml(node)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 496, in node_to_xml
chelem = self.node_to_xml(child)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 485, in node_to_xml
self.call_type_specific(node, elem, 'to_xml')
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 465, in call_type_specific
getattr(self, nm)(node, elem)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 273, in method_to_xml
if len(node.override) > 0:
File "/usr/local/lib/python2.7/site-packages/cldoc/nodes/method.py", line 43, in override
bases = list(self.parent.bases)
AttributeError: 'Namespace' object has no attribute 'bases'

РЕДАКТИРОВАТЬ:

После долгого времени я смог свести это к минимальному примеру.

template<typename T>
struct Foo {
int baz(T const& t) const { }
};

template<typename T, int N>
class Bar { };

template<typename T, int N>
struct Foo<Bar<T, N>> {
int baz(Bar<T, N> const& a) const;
};

template<typename T, int N>
int Foo<Bar<T, N>>::baz(Bar<T, N> const& a) const { }

Тогда как это работает:

template<typename T>
struct Foo {
int baz(T const& t) const { }
};

template<typename T, int N>
class Bar { };

template<typename T, int N>
struct Foo<Bar<T, N>> {
int baz(Bar<T, N> const& a) const { }
};

4

Решение

Прежде всего cldoc при синтаксическом анализе исходных текстов использует clang, для этого требуются соответствующие флаги C / C ++ (например, -std=c++11) работать правильно.

Затем, даже с правильными флагами, он взрывается на определенных конструкциях, которые выглядят правильными. В частности, он пытается обработать определения метода класса шаблона с, казалось бы, неправильным контекстом. Особенно проблема с Foo<Bar<T, N>>::baz() определение заключается в том, что во время обработки его self.parent равно Root или же Namespace объекты (которые, очевидно, не имеют атрибута «база» и не должны иметь), не Class или похожий объект, для которого bases используются для отслеживания списка переопределений для определенного метода.

Я подготовил обход проблемы, которая просто «ослабляет» манипуляции с self.parent атрибуты в точке взрыва и выложили это как комментарий к проблеме. Но, конечно, это не решение проблемы. Возможно, правильное решение должно сначала решить, должны ли такие определения методов вне класса вообще обрабатываться таким образом, вероятно, правильный способ — это обрабатывать список переопределений в методах. декларации только.

Вот патч:

diff --git a/cldoc/nodes/method.py b/cldoc/nodes/method.py
index f910241..3e1208f 100644
--- a/cldoc/nodes/method.py
+++ b/cldoc/nodes/method.py
@@ -40,7 +40,7 @@ class Method(Function):
return self._override

# Lookup in bases, recursively
-        bases = list(self.parent.bases)
+        bases = list(getattr(self.parent, "bases", []))
mname = self.name

self._override = []
1

Другие решения


По вопросам рекламы [email protected]