[vala/staging: 2/2] Revert "valadoc: Drop duplicated code to add source files and use CodeContext API"



commit 676bfde90e911720fecb10e266373b1331218c9b
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Tue Feb 5 16:00:33 2019 +0100

    Revert "valadoc: Drop duplicated code to add source files and use CodeContext API"
    
    This reverts commit 54ba304eddd05264cbb9eacd734914938f50c7e4.
    
    Fixes https://gitlab.gnome.org/GNOME/vala/issues/748

 valadoc/treebuilder.vala | 160 +++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 142 insertions(+), 18 deletions(-)
---
diff --git a/valadoc/treebuilder.vala b/valadoc/treebuilder.vala
index 183c07aa3..921a72d33 100644
--- a/valadoc/treebuilder.vala
+++ b/valadoc/treebuilder.vala
@@ -347,6 +347,127 @@ public class Valadoc.Drivers.TreeBuilder : Vala.CodeVisitor {
                return file_name.substring (0, file_name.last_index_of_char ('.'));
        }
 
+       private bool add_package (Vala.CodeContext context, string pkg) {
+               // ignore multiple occurences of the same package
+               if (context.has_package (pkg)) {
+                       return true;
+               }
+
+               string vapi_name = pkg + ".vapi";
+               string gir_name = pkg + ".gir";
+               foreach (string source_file in settings.source_files) {
+                       string basename = Path.get_basename (source_file);
+                       if (basename == vapi_name || basename == gir_name) {
+                               return true;
+                       }
+               }
+
+
+               var package_path = context.get_vapi_path (pkg) ?? context.get_gir_path (pkg);
+               if (package_path == null) {
+                       Vala.Report.error (null, "Package `%s' not found in specified Vala API directories or 
GObject-Introspection GIR directories".printf (pkg));
+                       return false;
+               }
+
+               context.add_package (pkg);
+
+               var vfile = new Vala.SourceFile (context, Vala.SourceFileType.PACKAGE, package_path);
+               context.add_source_file (vfile);
+               Package vdpkg = new Package (pkg, true, null);
+               register_source_file (register_package (vdpkg), vfile);
+
+               add_deps (context, Path.build_filename (Path.get_dirname (package_path), "%s.deps".printf 
(pkg)), pkg);
+               return true;
+       }
+
+       private void add_deps (Vala.CodeContext context, string file_path, string pkg_name) {
+               if (FileUtils.test (file_path, FileTest.EXISTS)) {
+                       try {
+                               string deps_content;
+                               ulong deps_len;
+                               FileUtils.get_contents (file_path, out deps_content, out deps_len);
+                               foreach (string dep in deps_content.split ("\n")) {
+                                       dep = dep.strip ();
+                                       if (dep != "") {
+                                               if (!add_package (context, dep)) {
+                                                       Vala.Report.error (null, "%s, dependency of %s, not 
found in specified Vala API directories".printf (dep, pkg_name));
+                                               }
+                                       }
+                               }
+                       } catch (FileError e) {
+                               Vala.Report.error (null, "Unable to read dependency file: %s".printf 
(e.message));
+                       }
+               }
+       }
+
+       /**
+        * Adds the specified packages to the list of used packages.
+        *
+        * @param context The code context
+        * @param packages a list of package names
+        */
+       private void add_depencies (Vala.CodeContext context, string[] packages) {
+               foreach (string package in packages) {
+                       if (!add_package (context, package)) {
+                               Vala.Report.error (null, "Package `%s' not found in specified Vala API 
directories or GObject-Introspection GIR directories".printf (package));
+                       }
+               }
+       }
+
+       /**
+        * Add the specified source file to the context. Only .vala, .vapi, .gs,
+        * and .c files are supported.
+        */
+       private void add_documented_files (Vala.CodeContext context, string[] sources) {
+               if (sources == null) {
+                       return;
+               }
+
+               foreach (string source in sources) {
+                       if (FileUtils.test (source, FileTest.EXISTS)) {
+                               var rpath = Vala.CodeContext.realpath (source);
+                               if (source.has_suffix (".vala") || source.has_suffix (".gs")) {
+                                       var source_file = new Vala.SourceFile (context, 
Vala.SourceFileType.SOURCE, rpath);
+
+                                       if (source_package == null) {
+                                               source_package = register_package (new Package 
(settings.pkg_name, false, null));
+                                       }
+
+                                       register_source_file (source_package, source_file);
+
+                                       if (context.profile == Vala.Profile.GOBJECT) {
+                                               // import the GLib namespace by default (namespace of 
backend-specific standard library)
+                                               var ns_ref = new Vala.UsingDirective (new 
Vala.UnresolvedSymbol (null, "GLib", null));
+                                               source_file.add_using_directive (ns_ref);
+                                               context.root.add_using_directive (ns_ref);
+                                       }
+
+                                       context.add_source_file (source_file);
+                               } else if (source.has_suffix (".vapi") || source.has_suffix (".gir")) {
+                                       string file_name = get_package_name (source);
+
+                                       var vfile = new Vala.SourceFile (context, 
Vala.SourceFileType.PACKAGE, rpath);
+                                       context.add_source_file (vfile);
+
+                                       if (source_package == null) {
+                                               source_package = register_package (new Package 
(settings.pkg_name, false, null));
+                                       }
+
+                                       register_source_file (source_package, vfile);
+
+                                       add_deps (context, Path.build_filename (Path.get_dirname (source), 
"%s.deps".printf (file_name)), file_name);
+                               } else if (source.has_suffix (".c")) {
+                                       context.add_c_source_file (rpath);
+                                       tree.add_external_c_files (rpath);
+                               } else {
+                                       Vala.Report.error (null, "%s is not a supported source file type. 
Only .vala, .vapi, .gs, and .c files are supported.".printf (source));
+                               }
+                       } else {
+                               Vala.Report.error (null, "%s not found".printf (source));
+                       }
+               }
+       }
+
        private void create_valac_tree (Vala.CodeContext context, Settings settings) {
                // settings:
                context.experimental = settings.experimental;
@@ -388,18 +509,23 @@ public class Valadoc.Drivers.TreeBuilder : Vala.CodeVisitor {
                        }
 
                        // default packages
-                       context.add_external_package ("glib-2.0");
-                       context.add_external_package ("gobject-2.0");
+                       if (!this.add_package (context, "glib-2.0")) { //
+                               Vala.Report.error (null, "glib-2.0 not found in specified Vala API 
directories");
+                       }
+
+                       if (!this.add_package (context, "gobject-2.0")) { //
+                               Vala.Report.error (null, "gobject-2.0 not found in specified Vala API 
directories");
+                       }
                }
 
                // add user defined files:
-               foreach (string package in settings.packages) {
-                       context.add_external_package (package);
-               }
-               foreach (string source in settings.source_files) {
-                       context.add_source_filename (source, false, true);
+               add_depencies (context, settings.packages);
+               if (reporter.errors > 0) {
+                       return;
                }
-               if (context.report.get_errors () > 0) {
+
+               add_documented_files (context, settings.source_files);
+               if (reporter.errors > 0) {
                        return;
                }
 
@@ -867,17 +993,15 @@ public class Valadoc.Drivers.TreeBuilder : Vala.CodeVisitor {
                reporter.warnings_offset = context.report.get_warnings ();
                reporter.errors_offset = context.report.get_errors ();
 
+               // TODO: Register all packages here
+               // register packages included by gir-files
                foreach (Vala.SourceFile vfile in context.get_source_files ()) {
-                       if (vfile.get_nodes ().size > 0) {
-                               if (vfile.file_type == Vala.SourceFileType.SOURCE) {
-                                       if (source_package == null) {
-                                               source_package = register_package (new Package 
(settings.pkg_name, false, null));
-                                       }
-                                       register_source_file (source_package, vfile);
-                               } else if (vfile.file_type == Vala.SourceFileType.PACKAGE) {
-                                       Package vdpkg = new Package (get_package_name (vfile.filename), true, 
null);
-                                       register_source_file (register_package (vdpkg), vfile);
-                               }
+                       if (vfile.file_type == Vala.SourceFileType.PACKAGE
+                               && vfile.get_nodes ().size > 0
+                               && files.contains (vfile) == false)
+                       {
+                               Package vdpkg = new Package (get_package_name (vfile.filename), true, null);
+                               register_source_file (register_package (vdpkg), vfile);
                        }
                }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]