summaryrefslogtreecommitdiff
path: root/valadoc
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2019-02-05 16:00:33 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2019-02-06 12:38:48 +0100
commitc5c6350e11fe029eb7f43cf0f49727f02958409a (patch)
treef3b5f37b582fc0d9f788deb3ac9f14e19f50b499 /valadoc
parentb1fc729bece306b0e97d681ff7d29c2d9b198333 (diff)
downloadvala-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.vala160
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);
}
}