q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=70b70437317fbefd19270eb5fb11ca09dd90c92b

commit 70b70437317fbefd19270eb5fb11ca09dd90c92b
Author: Daniel Kolesa <d.kol...@osg.samsung.com>
Date:   Tue Jul 7 15:21:45 2015 +0100

    eolian: initial work on doc syntax validation (disabled for now)
---
 src/lib/eolian/database_validate.c | 89 ++++++++++++++++++++++++++++++++++++++
 src/lib/eolian/eo_lexer.c          | 13 +++++-
 src/tests/eolian/data/docs.eo      |  2 +-
 src/tests/eolian/eolian_parsing.c  |  2 +-
 4 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/src/lib/eolian/database_validate.c 
b/src/lib/eolian/database_validate.c
index c5d3609..8231664 100644
--- a/src/lib/eolian/database_validate.c
+++ b/src/lib/eolian/database_validate.c
@@ -1,9 +1,59 @@
+#include <ctype.h>
+
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
 #include "eo_lexer.h"
 
+static Eina_Bool
+_validate_docstr(Eina_Stringshare *str)
+{
+   if (!str) return EINA_TRUE;
+
+#if 0
+   const char *p;
+   for (p = strchr(str, '@'); p; p = strchr(p, '@'))
+     {
+        ++p;
+        /* escaped refs */
+        if ((p > (str + 1)) && (*(p - 2) == '\\'))
+          continue;
+        /* are we starting a reference? */
+        const char *ref = p;
+        if (!isalpha(*p) && (*p != '_'))
+          continue;
+        ++p;
+        /* check the rest of the reference */
+        while (isalnum(*p) || (*p == '.') || (*p == '_'))
+          ++p;
+        if (*(p - 1) == '.') --p;
+        Eina_Stringshare *refs = eina_stringshare_add_length(ref, (p - ref));
+        if (!eolian_declaration_get_by_name(refs))
+          {
+             printf("unknown doc reference: '%s'\n", refs);
+             return EINA_FALSE;
+          }
+        eina_stringshare_del(refs);
+     }
+#endif
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_validate_doc(const Eolian_Documentation *doc)
+{
+   if (!doc) return EINA_TRUE;
+
+   if (!_validate_docstr(doc->summary))
+     return EINA_FALSE;
+   if (!_validate_docstr(doc->description))
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
 static Eina_Bool _validate_type(const Eolian_Type *tp);
 static Eina_Bool _validate_expr(const Eolian_Expression *expr,
                                 const Eolian_Type *tp,
@@ -14,6 +64,12 @@ _sf_map_cb(const Eina_Hash *hash EINA_UNUSED, const void 
*key EINA_UNUSED,
            const Eolian_Struct_Type_Field *sf, Eina_Bool *success)
 {
    *success = _validate_type(sf->type);
+
+   if (!*success)
+     return EINA_FALSE;
+
+   *success = _validate_doc(sf->doc);
+
    return *success;
 }
 
@@ -25,6 +81,12 @@ _ef_map_cb(const Eina_Hash *hash EINA_UNUSED, const void 
*key EINA_UNUSED,
      *success = _validate_expr(ef->value, NULL, EOLIAN_MASK_INT);
    else
      *success = EINA_TRUE;
+
+   if (!*success)
+     return EINA_FALSE;
+
+   *success = _validate_doc(ef->doc);
+
    return *success;
 }
 
@@ -39,6 +101,9 @@ _type_error(const Eolian_Type *tp, const char *msg)
 static Eina_Bool
 _validate_type(const Eolian_Type *tp)
 {
+   if (!_validate_doc(tp->doc))
+     return EINA_FALSE;
+
    switch (tp->type)
      {
       case EOLIAN_TYPE_VOID:
@@ -124,6 +189,9 @@ _validate_param(const Eolian_Function_Parameter *param)
    if (!_validate_type(param->type))
      return EINA_FALSE;
 
+   if (!_validate_doc(param->doc))
+     return EINA_FALSE;
+
    return EINA_TRUE;
 }
 
@@ -161,6 +229,17 @@ _validate_function(const Eolian_Function *func)
 
 #undef EOLIAN_PARAMS_VALIDATE
 
+   if (!_validate_doc(func->common_doc))
+     return EINA_FALSE;
+   if (!_validate_doc(func->get_doc))
+     return EINA_FALSE;
+   if (!_validate_doc(func->set_doc))
+     return EINA_FALSE;
+   if (!_validate_doc(func->get_return_doc))
+     return EINA_FALSE;
+   if (!_validate_doc(func->set_return_doc))
+     return EINA_FALSE;
+
    return EINA_TRUE;
 }
 
@@ -169,6 +248,10 @@ _validate_event(const Eolian_Event *event)
 {
    if (event->type && !_validate_type(event->type))
      return EINA_FALSE;
+
+   if (!_validate_doc(event->doc))
+     return EINA_FALSE;
+
    return EINA_TRUE;
 }
 
@@ -191,6 +274,9 @@ _validate_class(const Eolian_Class *cl)
      if (!_validate_event(event))
        return EINA_FALSE;
 
+   if (!_validate_doc(cl->doc))
+     return EINA_FALSE;
+
    return EINA_TRUE;
 }
 
@@ -203,6 +289,9 @@ _validate_variable(const Eolian_Variable *var)
    if (var->value && !_validate_expr(var->value, var->base_type, 0))
      return EINA_FALSE;
 
+   if (!_validate_doc(var->doc))
+     return EINA_FALSE;
+
    return EINA_TRUE;
 }
 
diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c
index d97c9c6..cc6531d 100644
--- a/src/lib/eolian/eo_lexer.c
+++ b/src/lib/eolian/eo_lexer.c
@@ -320,7 +320,18 @@ doc_lex(Eo_Lexer *ls, Eina_Bool *term)
         eina_strbuf_append_char(ls->buff, '@');
         next_char(ls);
         if (contdoc)
-          continue;
+          {
+             /* in-class references */
+             if (ls->tmp.kls && ls->current == '.')
+               {
+                  next_char(ls);
+                  if (isalpha(ls->current) || ls->current == '_')
+                    eina_strbuf_append(ls->buff, ls->tmp.kls->full_name);
+                  eina_strbuf_append_char(ls->buff, '.');
+                  continue;
+               }
+             continue;
+          }
         while (ls->current && isalpha(ls->current))
           {
              eina_strbuf_append_char(ls->buff, ls->current);
diff --git a/src/tests/eolian/data/docs.eo b/src/tests/eolian/data/docs.eo
index c7c8622..339998c 100644
--- a/src/tests/eolian/data/docs.eo
+++ b/src/tests/eolian/data/docs.eo
@@ -35,7 +35,7 @@ struct Opaque; [[Opaque struct docs. See @Foo for another 
struct.]]
 class Docs {
     [[Docs for class.
 
-      More docs for class.
+      More docs for class. @.prop.
       @Foo
       @Bar
       @Alias
diff --git a/src/tests/eolian/eolian_parsing.c 
b/src/tests/eolian/eolian_parsing.c
index 3be48ac..fa6681a 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -1199,7 +1199,7 @@ START_TEST(eolian_docs)
    fail_if(strcmp(eolian_documentation_summary_get(doc),
                   "Docs for class."));
    fail_if(strcmp(eolian_documentation_description_get(doc),
-                  "More docs for class. @Foo @Bar @Alias @pants"));
+                  "More docs for class. @Docs.prop. @Foo @Bar @Alias @pants"));
 
    fail_if(!(fid = eolian_class_function_get_by_name(class, "meth", 
EOLIAN_METHOD)));
    fail_if(!(doc = eolian_function_documentation_get(fid, EOLIAN_METHOD)));

-- 


Reply via email to