Warn about non-public resources in Clownfish URIs
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/04a18321 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/04a18321 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/04a18321 Branch: refs/heads/master Commit: 04a18321eee563d6dcb85b0fe6300a5054a74675 Parents: 1a6ff50 Author: Nick Wellnhofer <[email protected]> Authored: Sun Jul 26 23:13:14 2015 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Thu Aug 6 18:19:19 2015 +0200 ---------------------------------------------------------------------- compiler/src/CFCCHtml.c | 41 ++++++++++++++++++++--------------------- compiler/src/CFCUri.c | 23 +++++++++++++++++++++-- 2 files changed, 41 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/04a18321/compiler/src/CFCCHtml.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCCHtml.c b/compiler/src/CFCCHtml.c index c51da80..e36cb10 100644 --- a/compiler/src/CFCCHtml.c +++ b/compiler/src/CFCCHtml.c @@ -174,9 +174,6 @@ static char* S_cfc_uri_to_url(CFCUri *uri_obj, CFCClass *base, int dir_level); static char* -S_struct_sym_to_url(const char *struct_sym, CFCClass *base, int dir_level); - -static char* S_class_to_url(CFCClass *klass, CFCClass *base, int dir_level); static char* @@ -1058,26 +1055,40 @@ S_transform_link(cmark_node *link, CFCClass *doc_class, int dir_level) { } static char* -S_type_to_html(CFCClass *klass, CFCType *type) { +S_type_to_html(CFCClass *doc_class, CFCType *type) { const char *type_c = CFCType_to_c(type); if (CFCType_is_object(type)) { - const char *struct_sym = CFCClass_full_struct_sym(klass); - const char *specifier = CFCType_get_specifier(type); const char *underscore = strchr(type_c, '_'); if (underscore) { + const char *doc_struct_sym = CFCClass_full_struct_sym(doc_class); + const char *specifier = CFCType_get_specifier(type); + CFCClass *klass = NULL; + + // Don't link to doc class. + if (strcmp(specifier, doc_struct_sym) != 0) { + klass = CFCClass_fetch_by_struct_sym(specifier); + if (!klass) { + CFCUtil_warn("Class '%s' not found", specifier); + } + else if (!CFCClass_public(klass)) { + CFCUtil_warn("Non-public class '%s' used in public method", + specifier); + klass = NULL; + } + } + size_t offset = underscore + 1 - type_c; char *prefix = CFCUtil_strndup(specifier, offset); char *retval; - if (strcmp(specifier, struct_sym) == 0) { - // Don't link types of the same class. + if (!klass) { retval = CFCUtil_sprintf("<span class=\"prefix\">%s</span>%s", prefix, type_c + offset); } else { - char *url = S_struct_sym_to_url(specifier, klass, 0); + char *url = S_class_to_url(klass, doc_class, 0); const char *pattern = "<span class=\"prefix\">%s</span>" "<a href=\"%s\">%s</a>"; @@ -1130,21 +1141,9 @@ S_cfc_uri_to_url(CFCUri *uri_obj, CFCClass *doc_class, int dir_level) { return url; } -// Return a relative URL to the class with full struct sym `struct_sym`. -static char* -S_struct_sym_to_url(const char *struct_sym, CFCClass *base, int dir_level) { - if (!struct_sym) { return CFCUtil_strdup("not_found.html"); } - - CFCClass *klass = CFCClass_fetch_by_struct_sym(struct_sym); - - return S_class_to_url(klass, base, dir_level); -} - // Return a relative URL to a class. static char* S_class_to_url(CFCClass *klass, CFCClass *base, int dir_level) { - if (!klass) { return CFCUtil_strdup("not_found.html"); } - const char *class_name = CFCClass_get_name(klass); char *path = CFCUtil_global_replace(class_name, "::", CHY_DIR_SEP); char *url = CFCUtil_sprintf("%s.html", path); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/04a18321/compiler/src/CFCUri.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCUri.c b/compiler/src/CFCUri.c index 2a7cd5d..7ac8a7e 100644 --- a/compiler/src/CFCUri.c +++ b/compiler/src/CFCUri.c @@ -23,6 +23,8 @@ #include "CFCUri.h" #include "CFCClass.h" #include "CFCDocument.h" +#include "CFCFunction.h" +#include "CFCMethod.h" #include "CFCUtil.h" struct CFCUri { @@ -167,25 +169,42 @@ S_resolve(CFCUri *self, const char *parcel, const char *struct_sym, } if (klass) { + if (!CFCClass_public(klass)) { + CFCUtil_warn("Non-public class '%s' in Clownfish URI: %s", + CFCClass_get_struct_sym(klass), self->string); + } + self->type = CFC_URI_CLASS; self->klass = klass; CFCBase_incref((CFCBase*)klass); if (callable) { if (islower(callable[0])) { - if (!CFCClass_function(klass, callable)) { + CFCFunction *function = CFCClass_function(klass, callable); + + if (!function) { CFCUtil_warn("Unknown function '%s' in Clownfish URI: %s", callable, self->string); } + else if (!CFCFunction_public(function)) { + CFCUtil_warn("Non-public function '%s' in Clownfish URI:" + " %s", callable, self->string); + } self->type = CFC_URI_FUNCTION; self->callable = CFCUtil_strdup(callable); } else { - if (!CFCClass_method(klass, callable)) { + CFCMethod *method = CFCClass_method(klass, callable); + + if (!method) { CFCUtil_warn("Unknown method '%s' in Clownfish URI: %s", callable, self->string); } + else if (!CFCMethod_public(method)) { + CFCUtil_warn("Non-public method '%s' in Clownfish URI:" + " %s", callable, self->string); + } self->type = CFC_URI_METHOD; self->callable = CFCUtil_strdup(callable);
