src/Palete/VapiParser.vala
authorAlan Knowles <alan@roojs.com>
Wed, 6 May 2015 07:41:44 +0000 (15:41 +0800)
committerAlan Knowles <alan@roojs.com>
Wed, 6 May 2015 07:41:44 +0000 (15:41 +0800)
src/Palete/VapiParser.vala

index 0f08cd5..2f52322 100644 (file)
-/* valadoc.vala
- *
- * Copyright (C) 2008-2014 Florian Brosch
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
- *
- * Author:
- *     Florian Brosch <flo.brosch@gmail.com>
- */
 
-// compile? valac --pkg  valadoc-1.0 VapiParser.vala -o /tmp/vdoc
 
-
-using GLib.Path;
-using Valadoc.Importer;
-using Valadoc;
-//using Config;
-using Gee;
-
-
-
-public class ValaDoc : Object {
-       private static string wikidirectory = null;
-       private static string pkg_version = null;
-       private static string docletpath = null;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] pluginargs;
-       private static string gir_directory = null;
-       private static string directory = null;
-       private static string pkg_name = null;
-       private static string gir_name = null;
-       private static string gir_namespace = null;
-       private static string gir_version = null;
-       private static string driverpath = null;
-
-       private static bool add_inherited = false;
-       private static bool _protected = true;
-       private static bool _internal = false;
-       private static bool with_deps = false;
-       private static bool _private = false;
-       private static bool version = false;
-
-       private static bool verbose = false;
-       private static bool force = false;
-
-       private static string basedir = null;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] defines;
-       private static bool experimental;
-       private static bool experimental_non_null = false;
-       private static string profile;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] import_packages;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] import_directories;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] vapi_directories;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] metadata_directories;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] gir_directories;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] tsources;
-       [CCode (array_length = false, array_null_terminated = true)]
-       private static string[] packages;
-       static string target_glib;
-
-       private const GLib.OptionEntry[] options = {
-               { "directory", 'o', 0, OptionArg.FILENAME, ref directory, "Output directory", "DIRECTORY" },
-
-               { "basedir", 'b', 0, OptionArg.FILENAME, ref basedir, "Base source directory", "DIRECTORY" },
-               { "define", 'D', 0, OptionArg.STRING_ARRAY, ref defines, "Define SYMBOL", "SYMBOL..." },
-               { "profile", 0, 0, OptionArg.STRING, ref profile, "Use the given profile instead of the default", "PROFILE" },
-
-               { "enable-experimental", 0, 0, OptionArg.NONE, ref experimental, "Enable experimental features", null },
-               { "enable-experimental-non-null", 0, 0, OptionArg.NONE, ref experimental_non_null, "Enable experimental enhancements for non-null types", null },
-
-               { "metadatadir", 0, 0, OptionArg.FILENAME_ARRAY, ref metadata_directories, "Look for GIR .metadata files in DIRECTORY", "DIRECTORY..." },
-               { "girdir", 0, 0, OptionArg.FILENAME_ARRAY, ref gir_directories, "Look for .gir files in DIRECTORY", "DIRECTORY..." },
-               { "vapidir", 0, 0, OptionArg.FILENAME_ARRAY, ref vapi_directories, "Look for package bindings in DIRECTORY", "DIRECTORY..." },
-               { "pkg", 0, 0, OptionArg.STRING_ARRAY, ref packages, "Include binding for PACKAGE", "PACKAGE..." },
-
-               { "driver", 0, 0, OptionArg.STRING, ref driverpath, "Name of an driver or path to a custom driver", null },
-
-               { "importdir", 0, 0, OptionArg.FILENAME_ARRAY, ref import_directories, "Look for external documentation in DIRECTORY", "DIRECTORY..." },
-               { "import", 0, 0, OptionArg.STRING_ARRAY, ref import_packages, "Include binding for PACKAGE", "PACKAGE..." },
-
-               { "wiki", 0, 0, OptionArg.FILENAME, ref wikidirectory, "Wiki directory", "DIRECTORY" },
-
-               { "deps", 0, 0, OptionArg.NONE, ref with_deps, "Adds packages to the documentation", null },
-
-               { "doclet", 0, 0, OptionArg.STRING, ref docletpath, "Name of an included doclet or path to custom doclet", "PLUGIN"},
-               { "doclet-arg", 'X', 0, OptionArg.STRING_ARRAY, ref pluginargs, "Pass arguments to the doclet", "ARG" },
-
-               { "no-protected", 0, OptionFlags.REVERSE, OptionArg.NONE, ref _protected, "Removes protected elements from documentation", null },
-               { "internal", 0, 0, OptionArg.NONE, ref _internal, "Adds internal elements to documentation", null },
-               { "private", 0, 0, OptionArg.NONE, ref _private, "Adds private elements to documentation", null },
-
-               { "package-name", 0, 0, OptionArg.STRING, ref pkg_name, "package name", "NAME" },
-               { "package-version", 0, 0, OptionArg.STRING, ref pkg_version, "package version", "VERSION" },
-               { "gir", 0, 0, OptionArg.STRING, ref gir_name, "GObject-Introspection repository file name", "NAME-VERSION.gir" },
-
-               { "version", 0, 0, OptionArg.NONE, ref version, "Display version number", null },
-
-               { "force", 0, 0, OptionArg.NONE, ref force, "force", null },
-               { "verbose", 0, 0, OptionArg.NONE, ref verbose, "Show all warnings", null },
-               { "target-glib", 0, 0, OptionArg.STRING, ref target_glib, "Target version of glib for code generation", "MAJOR.MINOR" },
-               { "", 0, 0, OptionArg.FILENAME_ARRAY, ref tsources, null, "FILE..." },
-
-               { null }
-       };
-
-       private static int quit (ErrorReporter reporter) {
-               if (reporter.errors == 0) {
-                       stdout.printf ("Succeeded - %d warning(s)\n", reporter.warnings);
-                       return 0;
-               } else {
-                       stdout.printf ("Failed: %d error(s), %d warning(s)\n", reporter.errors, reporter.warnings);
-                       return 1;
-               }
-       }
-
-       private static bool check_pkg_name () {
-               if (pkg_name == null) {
-                       return true;
-               }
-
-               if (pkg_name == "glib-2.0" || pkg_name == "gobject-2.0") {
-                       return false;
-               }
-
-               foreach (string package in tsources) {
-                       if (pkg_name == package) {
-                               return false;
+// valac VapiParser.vala --pkg libvala-0.24 --pkg posix -o /tmp/treebuilder
+
+namespace Palete {
+        
+        
+        
+
+       public class VapiParser : Vala.CodeVisitor {
+               Vala.CodeContext context;
+               public VapiParser() {
+                       base();
+                       
+               }
+               private PackageMetaData register_package (Package package) {
+                       PackageMetaData meta_data = new PackageMetaData (package);
+                       tree.add_package (package);
+                       packages.add (meta_data);
+                       return meta_data;
+               }
+
+               
+               public void checkPackage(string name)
+               {
+                       // init context:
+                       context = new Vala.CodeContext ();
+                       Vala.CodeContext.push (context);
+               
+                       context.experimental = false;
+                       context.experimental_non_null = false;
+                       
+#if VALA_0_28
+                       var ver=28;
+#elif VALA_0_26        
+                       var ver=26;
+#elif VALA_0_24
+                       var ver=24;
+#elif VALA_0_22        
+                       var ver=22;
+#endif
+                       
+                       for (int i = 2; i <= ver; i += 2) {
+                               context.add_define ("VALA_0_%d".printf (i));
                        }
-               }
-               return true;
-       }
-
-       private string get_pkg_name () {
-               if (ValaDoc.pkg_name == null) {
-                       if (ValaDoc.directory.has_suffix ("/")) {
-                               ValaDoc.pkg_name = GLib.Path.get_dirname (ValaDoc.directory);
-                       } else {
-                               ValaDoc.pkg_name = GLib.Path.get_basename (ValaDoc.directory);
+                       
+                        
+                       //var vapidirs = ((Project.Gtk)this.file.project).vapidirs();
+                       // what's the current version of vala???
+                       
+                       
+                       //vapidirs +=  Path.get_dirname (context.get_vapi_path("glib-2.0")) ;
+                       
+                       //for(var i =0 ; i < vapidirs.length; i++) {
+                       //      valac += " --vapidir=" + vapidirs[i];
+                       //}
+                               
+                       
+                       // or context.get_vapi_path("glib-2.0"); // should return path..
+                       //context.vapi_directories = vapidirs;
+                       context.report.enable_warnings = true;
+                       context.metadata_directories = { };
+                       context.gir_directories = {};
+                       context.thread = true;
+                       
+                       
+                       //this.report = new ValaSourceReport(this.file);
+                       //context.report = this.report;
+                       
+                       
+                       context.basedir = "/tmp"; //Posix.realpath (".");
+               
+                       context.directory = context.basedir;
+               
+
+                       // add default packages:
+                       //if (settings.profile == "gobject-2.0" || settings.profile == "gobject" || settings.profile == null) {
+                       context.profile = Vala.Profile.GOBJECT;
+                        
+                       var ns_ref = new Vala.UsingDirective (new Vala.UnresolvedSymbol (null, "GLib", null));
+                       context.root.add_using_directive (ns_ref);
+                       // default.. packages..
+                       context.add_external_package ("glib-2.0"); 
+                       context.add_external_package ("gobject-2.0");
+                       // user defined ones..
+                       context.add_package ("Gtk");
+                 
+                       var vfile = new Vala.SourceFile (context, Vala.SourceFileType.PACKAGE, "/usr/share/vala-0.26/vapi/gtk+-3.0.vapi");
+                       context.add_source_file (vfile);
+                       Package vdpkg = new Package (pkg, true, null);
+                       register_source_file (register_package (vdpkg), vfile);
+                       
+                       //context.add_external_package ("libvala-0.24");
+                       
+                        
+               
+                       //add_documented_files (context, settings.source_files);
+               
+                       Vala.Parser parser = new Vala.Parser ();
+                       parser.parse (context);
+                       //gir_parser.parse (context);
+                       if (context.report.get_errors () > 0) {
+                               print("parse got errors");
+                                
+                               
+                               Vala.CodeContext.pop ();
+                               return ;
                        }
-               }
-
-               return ValaDoc.pkg_name;
-       }
 
-       private ModuleLoader? create_module_loader (ErrorReporter reporter, out Doclet? doclet, out Driver? driver) {
-               ModuleLoader modules = ModuleLoader.get_instance ();
-
-               doclet = null;
-               driver = null;
-               print("docletpath %s", docletpath);
-               // doclet:
-               string? pluginpath = ModuleLoader.get_doclet_path (null, reporter);
-               if (pluginpath == null) {
-                       return null;
-               }
-               doclet = modules.create_doclet (pluginpath);
-               if (doclet == null) {
-                       reporter.simple_error ("error: failed to load doclet");
-                       return null;
-               }
-
-
-               // driver:
-               pluginpath = ModuleLoader.get_driver_path (driverpath, reporter);
-               if (pluginpath == null) {
-                       return null;
-               }
-
-               driver = modules.create_driver (pluginpath);
-               if (driver == null) {
-                       reporter.simple_error ("error: failed to load driver");
-                       return null;
-               }
 
-               assert (driver != null && doclet != null);
-
-               return modules;
-       }
-
-       private int run (ErrorReporter reporter) {
-               // settings:
-               var settings = new Valadoc.Settings ();
-               reporter.settings = settings;
-
-               settings.pkg_name = this.get_pkg_name ();
-               settings.gir_namespace = ValaDoc.gir_namespace;
-               settings.gir_version = ValaDoc.gir_version;
+                       
+                       // check context:
+                       context.check ();
+                       if (context.report.get_errors () > 0) {
+                               print("check got errors");
+                                
+                               Vala.CodeContext.pop ();
+                                
+                               return;
+                               
+                       }
+                        
+                       Vala.CodeContext.pop ();
+                        
+                       print("%s\n", valac);
+                       print("ALL OK?\n");
                 
-               settings.pkg_version = ValaDoc.pkg_version;
-               settings.add_inherited = ValaDoc.add_inherited;
-               settings._protected = ValaDoc._protected;
-               settings._internal = ValaDoc._internal;
-               settings.with_deps = ValaDoc.with_deps;
-               settings._private = ValaDoc._private;
-               settings.path = "/dev/null";
-               settings.verbose = ValaDoc.verbose;
-               settings.wiki_directory = ValaDoc.wikidirectory;
-               settings.pluginargs = ValaDoc.pluginargs;
-
-               settings.experimental = experimental;
-               settings.experimental_non_null = experimental_non_null;
-               settings.basedir = basedir;
-               settings.directory = directory;
-               settings.vapi_directories = vapi_directories;
-               settings.metadata_directories = metadata_directories;
-               settings.gir_directories = gir_directories;
-               settings.target_glib = target_glib;
-
-               settings.source_files = tsources;
-               settings.packages = packages;
-
-               settings.profile = profile;
-               settings.defines = defines;
-
-
-               // load plugins:
-               Doclet? doclet = null;
-               Driver? driver = null;
-
-               ModuleLoader? modules = create_module_loader (reporter, out doclet, out driver);
-               if (reporter.errors > 0 || modules == null) {
-                       return quit (reporter);
                }
-
-
-               // Create tree:
-               Valadoc.Api.Tree doctree = driver.build (settings, reporter);
-               if (reporter.errors > 0) {
-                       driver = null;
-                       doclet = null;
-                       return quit (reporter);
-               }
-
-               // register child symbols:
-               Valadoc.Api.ChildSymbolRegistrar registrar = new Valadoc.Api.ChildSymbolRegistrar ();
-               doctree.accept (registrar);
-
-               // process documentation
-               Valadoc.DocumentationParser docparser = new Valadoc.DocumentationParser (settings, reporter, doctree, modules);
-               if (!doctree.create_tree()) {
-                       return quit (reporter);
-               }
-
-               DocumentationImporter[] importers = {
-                       new ValadocDocumentationImporter (doctree, docparser, modules, settings, reporter),
-                       new GirDocumentationImporter (doctree, docparser, modules, settings, reporter)
-               };
-
-                 
-               doclet.process (settings, doctree, reporter);
-               return quit (reporter);
+       //
+               // startpoint:
+               //
+        
        }
-
-       static int main (string[] args) {
-               ErrorReporter reporter = new ErrorReporter();
-
-               try {
-                       var opt_context = new OptionContext ("- Vala Documentation Tool");
-                       opt_context.set_help_enabled (true);
-                       opt_context.add_main_entries (options, null);
-                       opt_context.parse (ref args);
-               } catch (OptionError e) {
-                       reporter.simple_error ("error: %s", e.message);
-                       stdout.printf ("Run '%s --help' to see a full list of available command line options.\n", args[0]);
-                       return quit (reporter);
-               }
-
-               if (version) {
-                       //stdout.printf ("Valadoc %s\n", Config.version);
-                       return 0;
-               }
+}
  
-               if (!check_pkg_name ()) {
-                       reporter.simple_error ("error: File already exists");
-                       return quit (reporter);
-               }
-/*
-               if (FileUtils.test (directory, FileTest.EXISTS)) {
-                       if (force == true) {
-                               bool tmp = remove_directory (directory);
-                               if (tmp == false) {
-                                       reporter.simple_error ("error: Can't remove directory.");
-                                       return quit (reporter);
-                               }
-                       } else {
-                               reporter.simple_error ("error: File already exists");
-                               return quit (reporter);
-                       }
-               }
-*/
-       
-               if (gir_name != null) {
-                       long gir_len = gir_name.length;
-                       int last_hyphen = gir_name.last_index_of_char ('-');
-
-                       if (last_hyphen == -1 || !gir_name.has_suffix (".gir")) {
-                               reporter.simple_error ("error: GIR file name `%s' is not well-formed, expected NAME-VERSION.gir", gir_name);
-                               return quit (reporter);
-                       }
+int main (string[] args) {
 
-                       gir_namespace = gir_name.substring (0, last_hyphen);
-                       gir_version = gir_name.substring (last_hyphen + 1, gir_len - last_hyphen - 5);
-                       gir_version.canon ("0123456789.", '?');
-
-                       if (gir_namespace == "" || gir_version == "" || !gir_version[0].isdigit () || gir_version.contains ("?")) {
-                               reporter.simple_error ("error: GIR file name `%s' is not well-formed, expected NAME-VERSION.gir", gir_name);
-                               return quit (reporter);
-                       }
-
-
-                       bool report_warning = true;
-                       foreach (string source in tsources) {
-                               if (source.has_suffix (".vala") || source.has_suffix (".gs")) {
-                                       report_warning = false;
-                                       break;
-                               }
-                       }
-
-                       if (report_warning == true) {
-                               reporter.simple_error ("error: No source file specified to be compiled to gir.");
-                               return quit (reporter);
-                       }
-               }
-
-               var valadoc = new ValaDoc( );
-               return valadoc.run (reporter);
-       }
+       var a = new VapiParser(file);
+       a.create_valac_tree();
+       return 0;
 }
+*/
+