diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-02-05 16:00:33 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-02-06 12:38:48 +0100 |
commit | c5c6350e11fe029eb7f43cf0f49727f02958409a (patch) | |
tree | f3b5f37b582fc0d9f788deb3ac9f14e19f50b499 /valadoc | |
parent | b1fc729bece306b0e97d681ff7d29c2d9b198333 (diff) | |
download | vala-c5c6350e11fe029eb7f43cf0f49727f02958409a.tar.gz |
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
Diffstat (limited to 'valadoc')
-rw-r--r-- | valadoc/treebuilder.vala | 160 |
1 files 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); } } |