forked from enlightenment/efl
eolian/generator: add proper generation of references
Adds proper generation of automatic references in docs. For now events are missing. @feature
This commit is contained in:
parent
70b7043731
commit
e9688e63a5
|
@ -138,4 +138,6 @@ tests/eolian/data/override_ref.c \
|
||||||
tests/eolian/data/class_simple_ref_eo.h \
|
tests/eolian/data/class_simple_ref_eo.h \
|
||||||
tests/eolian/data/class_simple_ref_legacy.h \
|
tests/eolian/data/class_simple_ref_legacy.h \
|
||||||
tests/eolian/data/import_types_ref.h \
|
tests/eolian/data/import_types_ref.h \
|
||||||
|
tests/eolian/data/docs_ref.h \
|
||||||
|
tests/eolian/data/docs_ref_legacy.h \
|
||||||
$(EOLIAN_TESTS_EOS)
|
$(EOLIAN_TESTS_EOS)
|
||||||
|
|
|
@ -22,6 +22,98 @@ _indent_line(Eina_Strbuf *buf, int ind)
|
||||||
#define DOC_LIMIT(ind) ((ind > DOC_LINE_TEST) ? (ind + DOC_LINE_OVER) \
|
#define DOC_LIMIT(ind) ((ind > DOC_LINE_TEST) ? (ind + DOC_LINE_OVER) \
|
||||||
: DOC_LINE_LIMIT)
|
: DOC_LINE_LIMIT)
|
||||||
|
|
||||||
|
static void
|
||||||
|
_generate_ref(const char *refn, Eina_Strbuf *wbuf)
|
||||||
|
{
|
||||||
|
const Eolian_Declaration *decl = eolian_declaration_get_by_name(refn);
|
||||||
|
if (decl)
|
||||||
|
{
|
||||||
|
char *n = strdup(eolian_declaration_name_get(decl));
|
||||||
|
char *p = n;
|
||||||
|
while ((p = strchr(p, '.'))) *p = '_';
|
||||||
|
eina_strbuf_append(wbuf, n);
|
||||||
|
free(n);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* not a plain declaration, so it must be struct/enum field or func */
|
||||||
|
const char *sfx = strrchr(refn, '.');
|
||||||
|
if (!sfx) goto noref;
|
||||||
|
|
||||||
|
Eina_Stringshare *bname = eina_stringshare_add_length(refn, sfx - refn);
|
||||||
|
|
||||||
|
const Eolian_Type *tp = eolian_type_struct_get_by_name(bname);
|
||||||
|
if (tp)
|
||||||
|
{
|
||||||
|
if (!eolian_type_struct_field_get(tp, sfx + 1)) goto noref;
|
||||||
|
_generate_ref(bname, wbuf);
|
||||||
|
eina_strbuf_append(wbuf, sfx);
|
||||||
|
eina_stringshare_del(bname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tp = eolian_type_enum_get_by_name(bname);
|
||||||
|
if (tp)
|
||||||
|
{
|
||||||
|
const Eolian_Enum_Type_Field *efl = eolian_type_enum_field_get(tp, sfx + 1);
|
||||||
|
if (!efl) goto noref;
|
||||||
|
_generate_ref(bname, wbuf);
|
||||||
|
Eina_Stringshare *str = eolian_type_enum_field_c_name_get(efl);
|
||||||
|
eina_strbuf_append_char(wbuf, '.');
|
||||||
|
eina_strbuf_append(wbuf, str);
|
||||||
|
eina_stringshare_del(str);
|
||||||
|
eina_stringshare_del(bname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Eolian_Class *cl = eolian_class_get_by_name(bname);
|
||||||
|
const Eolian_Function *fn = NULL;
|
||||||
|
Eolian_Function_Type ftype = EOLIAN_UNRESOLVED;
|
||||||
|
if (!cl)
|
||||||
|
{
|
||||||
|
const char *mname;
|
||||||
|
if (!strcmp(sfx, ".get")) ftype = EOLIAN_PROP_GET;
|
||||||
|
else if (!strcmp(sfx, ".set")) ftype = EOLIAN_PROP_SET;
|
||||||
|
if (ftype != EOLIAN_UNRESOLVED)
|
||||||
|
{
|
||||||
|
eina_stringshare_del(bname);
|
||||||
|
mname = sfx - 1;
|
||||||
|
while ((mname != refn) && (*mname != '.')) --mname;
|
||||||
|
if (mname == refn) goto noref;
|
||||||
|
bname = eina_stringshare_add_length(refn, mname - refn);
|
||||||
|
cl = eolian_class_get_by_name(bname);
|
||||||
|
eina_stringshare_del(bname);
|
||||||
|
}
|
||||||
|
if (cl)
|
||||||
|
{
|
||||||
|
char *meth = strndup(mname + 1, sfx - mname - 1);
|
||||||
|
fn = eolian_class_function_get_by_name(cl, meth, ftype);
|
||||||
|
if (ftype == EOLIAN_UNRESOLVED)
|
||||||
|
ftype = eolian_function_type_get(fn);
|
||||||
|
free(meth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fn = eolian_class_function_get_by_name(cl, sfx + 1, ftype);
|
||||||
|
ftype = eolian_function_type_get(fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fn) goto noref;
|
||||||
|
|
||||||
|
Eina_Stringshare *fcn = eolian_function_full_c_name_get(fn);
|
||||||
|
eina_strbuf_append(wbuf, fcn);
|
||||||
|
eina_stringshare_del(fcn);
|
||||||
|
if ((ftype == EOLIAN_PROP_GET) || (ftype == EOLIAN_PROPERTY))
|
||||||
|
eina_strbuf_append(wbuf, "_get");
|
||||||
|
else if (ftype == EOLIAN_PROP_SET)
|
||||||
|
eina_strbuf_append(wbuf, "_set");
|
||||||
|
|
||||||
|
return;
|
||||||
|
noref:
|
||||||
|
eina_strbuf_append(wbuf, refn);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_append_section(const char *desc, int ind, int curl, Eina_Strbuf *buf,
|
_append_section(const char *desc, int ind, int curl, Eina_Strbuf *buf,
|
||||||
Eina_Strbuf *wbuf)
|
Eina_Strbuf *wbuf)
|
||||||
|
@ -40,9 +132,17 @@ _append_section(const char *desc, int ind, int curl, Eina_Strbuf *buf,
|
||||||
}
|
}
|
||||||
else if (*desc == '@')
|
else if (*desc == '@')
|
||||||
{
|
{
|
||||||
desc++;
|
const char *ref = ++desc;
|
||||||
if (isalpha(*desc))
|
if (isalpha(*desc) || (*desc == '_'))
|
||||||
eina_strbuf_append(wbuf, "@ref ");
|
{
|
||||||
|
eina_strbuf_append(wbuf, "@ref ");
|
||||||
|
while (isalnum(*desc) || (*desc == '.') || (*desc == '_'))
|
||||||
|
++desc;
|
||||||
|
if (*(desc - 1) == '.') --desc;
|
||||||
|
Eina_Stringshare *refn = eina_stringshare_add_length(ref, desc - ref);
|
||||||
|
_generate_ref(refn, wbuf);
|
||||||
|
eina_stringshare_del(refn);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
eina_strbuf_append_char(wbuf, '@');
|
eina_strbuf_append_char(wbuf, '@');
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,11 +35,18 @@ struct Opaque; [[Opaque struct docs. See @Foo for another struct.]]
|
||||||
class Docs {
|
class Docs {
|
||||||
[[Docs for class.
|
[[Docs for class.
|
||||||
|
|
||||||
More docs for class. @.prop.
|
More docs for class. Testing references now.
|
||||||
@Foo
|
@Foo
|
||||||
@Bar
|
@Bar
|
||||||
@Alias
|
@Alias
|
||||||
@pants
|
@pants
|
||||||
|
@.meth
|
||||||
|
@.prop
|
||||||
|
@.prop.get
|
||||||
|
@.prop.set
|
||||||
|
@Foo.field1
|
||||||
|
@Bar.foo
|
||||||
|
@Docs
|
||||||
]]
|
]]
|
||||||
methods {
|
methods {
|
||||||
meth {
|
meth {
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
#ifndef _EOLIAN_OUTPUT_H_
|
||||||
|
#define _EOLIAN_OUTPUT_H_
|
||||||
|
|
||||||
|
#ifndef _DOCS_EO_CLASS_TYPE
|
||||||
|
#define _DOCS_EO_CLASS_TYPE
|
||||||
|
|
||||||
|
typedef Eo Docs;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _DOCS_EO_TYPES
|
||||||
|
#define _DOCS_EO_TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This is struct Foo. It does stuff.
|
||||||
|
*
|
||||||
|
* This is a longer description for struct Foo.
|
||||||
|
*
|
||||||
|
* This is another paragraph.
|
||||||
|
*
|
||||||
|
* @since 1.66
|
||||||
|
*/
|
||||||
|
typedef struct _Foo
|
||||||
|
{
|
||||||
|
int field1; /** Field documentation. */
|
||||||
|
float field2;
|
||||||
|
short field3; /** Another field documentation. */
|
||||||
|
} Foo;
|
||||||
|
|
||||||
|
/** Docs for enum Bar. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
BAR_BLAH = 0,
|
||||||
|
BAR_FOO = 1, /** Docs for foo. */
|
||||||
|
BAR_BAR = 2 /** Docs for bar. */
|
||||||
|
} Bar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Docs for typedef.
|
||||||
|
*
|
||||||
|
* More docs for typedef. See @ref Bar.
|
||||||
|
*
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
typedef Bar Alias;
|
||||||
|
|
||||||
|
/** Opaque struct docs. See @ref Foo for another struct. */
|
||||||
|
typedef struct _Opaque Opaque;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @brief Docs for class.
|
||||||
|
*
|
||||||
|
* More docs for class. Testing references now. @ref Foo @ref Bar @ref Alias
|
||||||
|
* @ref pants @ref docs_meth @ref docs_prop_get @ref docs_prop_get
|
||||||
|
* @ref docs_prop_set @ref Foo.field1 @ref Bar.BAR_FOO @ref Docs
|
||||||
|
*/
|
||||||
|
#define DOCS_CLASS docs_class_get()
|
||||||
|
|
||||||
|
EAPI const Eo_Class *docs_class_get(void) EINA_CONST;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Property common documentation.
|
||||||
|
*
|
||||||
|
* Set documentation.
|
||||||
|
*
|
||||||
|
* @param[in] val Value documentation.
|
||||||
|
*
|
||||||
|
* @since 1.18
|
||||||
|
*/
|
||||||
|
EOAPI void docs_prop_set(int val);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Property common documentation.
|
||||||
|
*
|
||||||
|
* Get documentation.
|
||||||
|
*
|
||||||
|
* @return Value documentation.
|
||||||
|
*
|
||||||
|
* @since 1.18
|
||||||
|
*/
|
||||||
|
EOAPI int docs_prop_get(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Method documentation.
|
||||||
|
*
|
||||||
|
* @param[out] b
|
||||||
|
* @param[out] c Another param documentation.
|
||||||
|
*
|
||||||
|
* @return Return documentation.
|
||||||
|
*/
|
||||||
|
EOAPI int docs_meth(int a, float *b, long *c);
|
||||||
|
|
||||||
|
EOAPI extern const Eo_Event_Description _DOCS_EVENT_CLICKED;
|
||||||
|
|
||||||
|
/** Event docs. */
|
||||||
|
#define DOCS_EVENT_CLICKED (&(_DOCS_EVENT_CLICKED))
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,92 @@
|
||||||
|
#ifndef _EOLIAN_OUTPUT_H_
|
||||||
|
#define _EOLIAN_OUTPUT_H_
|
||||||
|
|
||||||
|
#ifndef _DOCS_EO_CLASS_TYPE
|
||||||
|
#define _DOCS_EO_CLASS_TYPE
|
||||||
|
|
||||||
|
typedef Eo Docs;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _DOCS_EO_TYPES
|
||||||
|
#define _DOCS_EO_TYPES
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This is struct Foo. It does stuff.
|
||||||
|
*
|
||||||
|
* This is a longer description for struct Foo.
|
||||||
|
*
|
||||||
|
* This is another paragraph.
|
||||||
|
*
|
||||||
|
* @since 1.66
|
||||||
|
*/
|
||||||
|
typedef struct _Foo
|
||||||
|
{
|
||||||
|
int field1; /** Field documentation. */
|
||||||
|
float field2;
|
||||||
|
short field3; /** Another field documentation. */
|
||||||
|
} Foo;
|
||||||
|
|
||||||
|
/** Docs for enum Bar. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
BAR_BLAH = 0,
|
||||||
|
BAR_FOO = 1, /** Docs for foo. */
|
||||||
|
BAR_BAR = 2 /** Docs for bar. */
|
||||||
|
} Bar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Docs for typedef.
|
||||||
|
*
|
||||||
|
* More docs for typedef. See @ref Bar.
|
||||||
|
*
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
typedef Bar Alias;
|
||||||
|
|
||||||
|
/** Opaque struct docs. See @ref Foo for another struct. */
|
||||||
|
typedef struct _Opaque Opaque;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @brief Docs for class.
|
||||||
|
*
|
||||||
|
* More docs for class. Testing references now. @ref Foo @ref Bar @ref Alias
|
||||||
|
* @ref pants @ref docs_meth @ref docs_prop_get @ref docs_prop_get
|
||||||
|
* @ref docs_prop_set @ref Foo.field1 @ref Bar.BAR_FOO @ref Docs
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Property common documentation.
|
||||||
|
*
|
||||||
|
* Set documentation.
|
||||||
|
*
|
||||||
|
* @param[in] val Value documentation.
|
||||||
|
*
|
||||||
|
* @since 1.18
|
||||||
|
*/
|
||||||
|
EAPI void docs_prop_set(Docs *obj, int val);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Property common documentation.
|
||||||
|
*
|
||||||
|
* Get documentation.
|
||||||
|
*
|
||||||
|
* @return Value documentation.
|
||||||
|
*
|
||||||
|
* @since 1.18
|
||||||
|
*/
|
||||||
|
EAPI int docs_prop_get(const Docs *obj);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Method documentation.
|
||||||
|
*
|
||||||
|
* @param[out] b
|
||||||
|
* @param[out] c Another param documentation.
|
||||||
|
*
|
||||||
|
* @return Return documentation.
|
||||||
|
*/
|
||||||
|
EAPI int docs_meth(Docs *obj, int a, float *b, long *c);
|
||||||
|
|
||||||
|
#endif
|
|
@ -192,6 +192,25 @@ START_TEST(eolian_import)
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(eolian_docs)
|
||||||
|
{
|
||||||
|
char output_filepath[PATH_MAX] = "";
|
||||||
|
snprintf(output_filepath, PATH_MAX, "%s/eolian_output.h",
|
||||||
|
#ifdef HAVE_EVIL
|
||||||
|
(char *)evil_tmpdir_get()
|
||||||
|
#else
|
||||||
|
"/tmp"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
remove(output_filepath);
|
||||||
|
fail_if(0 != _eolian_gen_execute(PACKAGE_DATA_DIR"/data/docs.eo", "--eo --gh", output_filepath));
|
||||||
|
fail_if(!_files_compare(PACKAGE_DATA_DIR"/data/docs_ref.h", output_filepath));
|
||||||
|
remove(output_filepath);
|
||||||
|
fail_if(0 != _eolian_gen_execute(PACKAGE_DATA_DIR"/data/docs.eo", "--legacy --gh", output_filepath));
|
||||||
|
fail_if(!_files_compare(PACKAGE_DATA_DIR"/data/docs_ref_legacy.h", output_filepath));
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
void eolian_generation_test(TCase *tc)
|
void eolian_generation_test(TCase *tc)
|
||||||
{
|
{
|
||||||
tcase_add_test(tc, eolian_types_generation);
|
tcase_add_test(tc, eolian_types_generation);
|
||||||
|
@ -200,5 +219,6 @@ void eolian_generation_test(TCase *tc)
|
||||||
tcase_add_test(tc, eolian_dev_impl_code);
|
tcase_add_test(tc, eolian_dev_impl_code);
|
||||||
tcase_add_test(tc, eolian_functions_descriptions);
|
tcase_add_test(tc, eolian_functions_descriptions);
|
||||||
tcase_add_test(tc, eolian_import);
|
tcase_add_test(tc, eolian_import);
|
||||||
|
tcase_add_test(tc, eolian_docs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1199,7 +1199,9 @@ START_TEST(eolian_docs)
|
||||||
fail_if(strcmp(eolian_documentation_summary_get(doc),
|
fail_if(strcmp(eolian_documentation_summary_get(doc),
|
||||||
"Docs for class."));
|
"Docs for class."));
|
||||||
fail_if(strcmp(eolian_documentation_description_get(doc),
|
fail_if(strcmp(eolian_documentation_description_get(doc),
|
||||||
"More docs for class. @Docs.prop. @Foo @Bar @Alias @pants"));
|
"More docs for class. Testing references now. "
|
||||||
|
"@Foo @Bar @Alias @pants @Docs.meth @Docs.prop "
|
||||||
|
"@Docs.prop.get @Docs.prop.set @Foo.field1 @Bar.foo @Docs"));
|
||||||
|
|
||||||
fail_if(!(fid = eolian_class_function_get_by_name(class, "meth", EOLIAN_METHOD)));
|
fail_if(!(fid = eolian_class_function_get_by_name(class, "meth", EOLIAN_METHOD)));
|
||||||
fail_if(!(doc = eolian_function_documentation_get(fid, EOLIAN_METHOD)));
|
fail_if(!(doc = eolian_function_documentation_get(fid, EOLIAN_METHOD)));
|
||||||
|
|
Loading…
Reference in New Issue