Get rid of some byte-compile messages

There are still a lot of issues, like global variables that should be
buffer-local.
This commit is contained in:
Gergely Polonkai 2016-09-28 08:19:30 +02:00
parent bb4469313a
commit 9881fde2f8

332
gobgen.el
View File

@ -1,4 +1,4 @@
;;; gobgen.el --- Generate GObject descendants using a detailed form -*- lexical-binding: t; -*- ;;; gobgen.el --- Generate GObject descendants using a detailed form -*- lexical-binding: nil; -*-
;; Copyright (C) 2015 Gergely Polonkai ;; Copyright (C) 2015 Gergely Polonkai
@ -30,19 +30,26 @@
(eval-when-compile (require 'wid-edit)) (eval-when-compile (require 'wid-edit))
(defvar gobgen-widget-name) (defvar-local gobgen-widget-name nil
(defvar gobgen-widget-prefix) "Widget for the class name.")
(defvar gobgen-widget-parent-name) (defvar-local gobgen-widget-prefix nil
(defvar gobgen-widget-parent-prefix) "Widget for the class prefix. It is auto-filled, but changeable.")
(defvar gobgen-widget-recent) (defvar-local gobgen-widget-parent-name nil
(defvar gobgen-widget-private) "Widget for the name of the parent class.")
(defvar-local gobgen-widget-parent-prefix nil
"Widget for the prefix of the parent class. It is auto-filled, but changeable.")
(defvar-local gobgen-widget-recent nil
"Checkbox field for the recent GLib option.")
(defvar-local gobgen-widget-private nil
"Checkbox field for the private structure option.")
(defun string-join (list separator) (defun string-join (list separator)
"Takes a list of string and joins them using delimiter." "Takes a list of strings and joins them using delimiter."
(mapconcat (lambda (x) x) list separator)) (mapconcat (lambda (x) x) list separator))
(defun string-has-prefix (full-str prefix-str) (defun string-has-prefix (full-str prefix-str)
"Check if full-str has the prefix prefix-str" "Check if FULL-STR has the prefix PREFIX-STR"
(let* ((prefix-length (length prefix-str))) (let* ((prefix-length (length prefix-str)))
(string-equal prefix-str (substring full-str 0 prefix-length)))) (string-equal prefix-str (substring full-str 0 prefix-length))))
@ -50,7 +57,18 @@
(defun get-gobject-prefix (class-name) (defun get-gobject-prefix (class-name)
(car (split-string class-name "_"))) (car (split-string class-name "_")))
(defun gobgen-gen-header () (defun gobgen-gen-header (CLASS_FULL_NAME
CLASS_PREFIX
CLASS_NAME
ClassFullName
func-prefix
parent_prefix
ParentPrefix
ParentName
parent-header
recent-glib
need-private)
"Generate the contents of a GObject header file."
(concat (concat
"#ifndef __" "#ifndef __"
@ -58,90 +76,102 @@
"_H__\n" "_H__\n"
"#define __" "#define __"
CLASS_FULL_NAME CLASS_FULL_NAME
"_H__\n" "_H__\n"
"\n" "\n"
(if (string-equal "g" parent_prefix) (if (string-equal "g" parent_prefix)
"#include <glib-object.h>" "#include <glib-object.h>"
(if (string-equal "gtk" parent_prefix) (if (string-equal "gtk" parent_prefix)
"#include <gtk/gtk.h>" "#include <gtk/gtk.h>"
(concat "// You might want to revise this\n" (concat "// You might want to revise this\n"
"#include <" "#include <"
parent-header parent-header
">"))) ">")))
"\n" "\n"
"\n" "\n"
"G_BEGIN_DECLS\n" "G_BEGIN_DECLS\n"
"\n" "\n"
"#define " CLASS_PREFIX "_TYPE_" CLASS_NAME " (" func-prefix "_get_type())\n" "#define " CLASS_PREFIX "_TYPE_" CLASS_NAME " (" func-prefix "_get_type())\n"
"#define " CLASS_FULL_NAME "(o) (G_TYPE_CHECK_INSTANCE_CAST((o), " CLASS_PREFIX "_TYPE_" CLASS_NAME ", " ClassFullName "))\n" "#define " CLASS_FULL_NAME "(o) (G_TYPE_CHECK_INSTANCE_CAST((o), " CLASS_PREFIX "_TYPE_" CLASS_NAME ", " ClassFullName "))\n"
"#define " CLASS_FULL_NAME "_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), " CLASS_PREFIX "_TYPE_" CLASS_NAME ", " ClassFullName "Class))\n" "#define " CLASS_FULL_NAME "_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), " CLASS_PREFIX "_TYPE_" CLASS_NAME ", " ClassFullName "Class))\n"
"#define " CLASS_PREFIX "_IS_" CLASS_NAME "(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), " CLASS_PREFIX "_TYPE_" CLASS_NAME "))\n" "#define " CLASS_PREFIX "_IS_" CLASS_NAME "(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), " CLASS_PREFIX "_TYPE_" CLASS_NAME "))\n"
"#define " CLASS_PREFIX "_IS_" CLASS_NAME "_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), " CLASS_PREFIX "_TYPE_" CLASS_NAME "))\n" "#define " CLASS_PREFIX "_IS_" CLASS_NAME "_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), " CLASS_PREFIX "_TYPE_" CLASS_NAME "))\n"
"#define " CLASS_FULL_NAME"_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), " CLASS_PREFIX "_TYPE_" CLASS_NAME ", " ClassFullName "Class))\n" "#define " CLASS_FULL_NAME"_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), " CLASS_PREFIX "_TYPE_" CLASS_NAME ", " ClassFullName "Class))\n"
"\n" "\n"
"typedef struct _" ClassFullName " " ClassFullName ";\n" "typedef struct _" ClassFullName " " ClassFullName ";\n"
"typedef struct _" ClassFullName "Class " ClassFullName "Class;\n" "typedef struct _" ClassFullName "Class " ClassFullName "Class;\n"
(if (and (not recent-glib) need-private) (if (and (not recent-glib) need-private)
(concat "typedef struct _" ClassFullName "Private " ClassFullName "Private;\n")) (concat "typedef struct _" ClassFullName "Private " ClassFullName "Private;\n"))
"\n" "\n"
"struct _" ClassFullName " {\n" "struct _" ClassFullName " {\n"
" /* Parent instance structure */\n" " /* Parent instance structure */\n"
" " ParentPrefix ParentName " parent_instance;\n" " " ParentPrefix ParentName " parent_instance;\n"
"\n" "\n"
" /* Instance members */\n" " /* Instance members */\n"
(if (and (not recent-glib) need-private) (if (and (not recent-glib) need-private)
(concat "\n" (concat "\n"
" /*< private >*/\n" " /*< private >*/\n"
" " ClassFullName "Private *priv;\n")) " " ClassFullName "Private *priv;\n"))
"};\n" "};\n"
"\n" "\n"
"struct _" ClassFullName "Class {\n" "struct _" ClassFullName "Class {\n"
" " ParentPrefix ParentName "Class parent_class;\n" " " ParentPrefix ParentName "Class parent_class;\n"
"};\n" "};\n"
"\n" "\n"
"GType " func-prefix "_get_type(void) G_GNUC_CONST;\n" "GType " func-prefix "_get_type(void) G_GNUC_CONST;\n"
"\n" "\n"
"G_END_DECLS\n" "G_END_DECLS\n"
"\n" "\n"
"#endif /* __" "#endif /* __"
CLASS_FULL_NAME CLASS_FULL_NAME
"_H__ */\n")) "_H__ */\n"))
(defun gobgen-gen-code (CLASS_FULL_NAME
CLASS_PREFIX
CLASS_NAME
class_name
ClassFullName
func-prefix
file-name-header
PARENT_PREFIX
PARENT_NAME
recent-glib
need-private)
"Generate the contents of a GObject source file."
(defun gobgen-gen-code ()
(concat (concat
"#include \"" file-name-header "\"\n" "#include \"" file-name-header "\"\n"
@ -149,26 +179,26 @@
(if need-private (if need-private
(concat (concat
(if (not recent-glib) (if (not recent-glib)
(concat (concat
"#define " CLASS_FULL_NAME "_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE( \\\n" "#define " CLASS_FULL_NAME "_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE( \\\n"
" (o), \\\n" " (o), \\\n"
" " CLASS_PREFIX "_TYPE_" CLASS_NAME ", \\\n" " " CLASS_PREFIX "_TYPE_" CLASS_NAME ", \\\n"
" " ClassFullName "Private \\\n" " " ClassFullName "Private \\\n"
" ))\n" " ))\n"
"\n")) "\n"))
(if recent-glib "typedef ") (if recent-glib "typedef ")
"struct _" ClassFullName "Private {\n" "struct _" ClassFullName "Private {\n"
" /* TODO: You must add something here, or GLib will produce warnings! */\n" " /* TODO: You must add something here, or GLib will produce warnings! */\n"
"}" "}"
(if recent-glib (if recent-glib
(concat " " ClassFullName "Private")) (concat " " ClassFullName "Private"))
";\n" ";\n"
"\n")) "\n"))
"G_DEFINE_TYPE" "G_DEFINE_TYPE"
@ -196,8 +226,8 @@
(if (and (not recent-glib) need-private) (if (and (not recent-glib) need-private)
(concat (concat
" g_type_class_add_private(klass, sizeof(" ClassFullName "Private));\n" " g_type_class_add_private(klass, sizeof(" ClassFullName "Private));\n"
"\n")) "\n"))
" gobject_class->finalize = " func-prefix "_finalize;\n" " gobject_class->finalize = " func-prefix "_finalize;\n"
@ -211,15 +241,18 @@
(if (and (not recent-glib) need-private) (if (and (not recent-glib) need-private)
(concat (concat
" " class_name "->priv = " CLASS_FULL_NAME "_GET_PRIVATE(" class_name ");\n")) " " class_name "->priv = " CLASS_FULL_NAME "_GET_PRIVATE(" class_name ");\n"))
"}\n")) "}\n"))
(defun gobgen-generator () (defun gobgen-generator (class-prefix
"Generate the header definition for a GObject derived clas. class-name
parent-prefix
parent-name
recent-glib
need-private)
"Generate the header definition for a GObject derived clas."
Parameters:
"
(let* ((parent-prefix (downcase parent-prefix)) (let* ((parent-prefix (downcase parent-prefix))
(parent-name (downcase parent-name)) (parent-name (downcase parent-name))
(class-prefix (downcase class-prefix)) (class-prefix (downcase class-prefix))
@ -233,46 +266,68 @@ Parameters:
(if (not (string-has-prefix class-name (concat class-prefix "_"))) (if (not (string-has-prefix class-name (concat class-prefix "_")))
(message (concat "Class (" class-name ") and class prefix (" class-prefix ") don't match")) (message (concat "Class (" class-name ") and class prefix (" class-prefix ") don't match"))
(let* ((parent-name (substring parent-name (+ parent-prefix-length 1))) (let* ((parent-name (substring parent-name (+ parent-prefix-length 1)))
(class-name (substring class-name (+ class-prefix-length 1))) (class-name (substring class-name (+ class-prefix-length 1)))
(parent-prefix-pcs (split-string parent-prefix "_")) (parent-prefix-pcs (split-string parent-prefix "_"))
(parent-name-pcs (split-string parent-name "_")) (parent-name-pcs (split-string parent-name "_"))
(class-prefix-pcs (split-string class-prefix "_")) (class-prefix-pcs (split-string class-prefix "_"))
(class-name-pcs (split-string class-name "_")) (class-name-pcs (split-string class-name "_"))
(parent_prefix (string-join parent-prefix-pcs "_")) (parent_prefix (string-join parent-prefix-pcs "_"))
(ParentPrefix (mapconcat 'capitalize parent-prefix-pcs "")) (ParentPrefix (mapconcat 'capitalize parent-prefix-pcs ""))
(PARENT_PREFIX (upcase parent_prefix)) (PARENT_PREFIX (upcase parent_prefix))
(parent_name (string-join parent-name-pcs "_")) (parent_name (string-join parent-name-pcs "_"))
(ParentName (mapconcat 'capitalize parent-name-pcs "")) (ParentName (mapconcat 'capitalize parent-name-pcs ""))
(PARENT_NAME (upcase parent_name)) (PARENT_NAME (upcase parent_name))
(class_prefix (string-join class-prefix-pcs "_")) (class_prefix (string-join class-prefix-pcs "_"))
(ClassPrefix (mapconcat 'capitalize class-prefix-pcs "")) (ClassPrefix (mapconcat 'capitalize class-prefix-pcs ""))
(CLASS_PREFIX (upcase class_prefix)) (CLASS_PREFIX (upcase class_prefix))
(class_name (string-join class-name-pcs "_")) (class_name (string-join class-name-pcs "_"))
(ClassName (mapconcat 'capitalize class-name-pcs "")) (ClassName (mapconcat 'capitalize class-name-pcs ""))
(CLASS_NAME (upcase class_name)) (CLASS_NAME (upcase class_name))
(func-prefix (concat class_prefix "_" class_name)) (func-prefix (concat class_prefix "_" class_name))
(ClassFullName (concat ClassPrefix ClassName)) (ClassFullName (concat ClassPrefix ClassName))
(CLASS_FULL_NAME (concat CLASS_PREFIX "_" CLASS_NAME)) (CLASS_FULL_NAME (concat CLASS_PREFIX "_" CLASS_NAME))
(parent-header (concat (string-join (append parent-prefix-pcs parent-name-pcs) "-") ".h")) (parent-header (concat (string-join (append parent-prefix-pcs parent-name-pcs) "-") ".h"))
(file-name-base (string-join (append class-prefix-pcs class-name-pcs) "-")) (file-name-base (string-join (append class-prefix-pcs class-name-pcs) "-"))
(file-name-code (concat file-name-base ".c")) (file-name-code (concat file-name-base ".c"))
(file-name-header (concat file-name-base ".h"))) (file-name-header (concat file-name-base ".h")))
(delete-other-windows) (delete-other-windows)
(split-window-vertically) (split-window-vertically)
(other-window 1) (other-window 1)
(find-file file-name-header) (find-file file-name-header)
(insert (gobgen-gen-header)) (insert (gobgen-gen-header CLASS_FULL_NAME
CLASS_PREFIX
CLASS_NAME
ClassFullName
func-prefix
parent_prefix
ParentPrefix
ParentName
parent-header
recent-glib
need-private))
(split-window-vertically) (split-window-vertically)
(other-window 1) (other-window 1)
(find-file file-name-code) (find-file file-name-code)
(insert (gobgen-gen-code))))))) (insert (gobgen-gen-code CLASS_FULL_NAME
CLASS_PREFIX
CLASS_NAME
class_name
ClassFullName
func-prefix
file-name-header
PARENT_PREFIX
PARENT_NAME
recent-glib
need-private)))))))
(defun gobgen () (defun gobgen ()
"Create widgets window for GObject creation" "Create widgets window for GObject creation"
(interactive) (interactive)
(switch-to-buffer "*GObject Creator*") (switch-to-buffer "*GObject Creator*")
(kill-all-local-variables) (kill-all-local-variables)
@ -290,10 +345,11 @@ Parameters:
(widget-create 'editable-field (widget-create 'editable-field
:size 25 :size 25
:format "Name: %v" :format "Name: %v"
:notify (lambda (widget &rest ignore) :notify (lambda (widget _child &optional event)
(save-excursion (save-excursion
(widget-value-set gobgen-widget-prefix (get-gobject-prefix (widget-value widget))))) (widget-value-set gobgen-widget-prefix
:doc "The name of the new class, with its prefix included" (get-gobject-prefix (widget-value widget)))))
:doc "The name of the new class, with its prefix included"
"gtk_example_object")) "gtk_example_object"))
(widget-insert " ") (widget-insert " ")
@ -302,17 +358,18 @@ Parameters:
(widget-create 'editable-field (widget-create 'editable-field
:size 10 :size 10
:format "Prefix: %v\n" :format "Prefix: %v\n"
:doc "Prefix of the new class. It updates automatically based on the name, so unless you need a namespace that consists of multiple parts (like my_ns), you should not touch this." :doc "Prefix of the new class. It updates automatically based on the name, so unless you need a namespace that consists of multiple parts (like my_ns), you should not touch this."
"gtk")) "gtk"))
(setq gobgen-widget-parent-name (setq gobgen-widget-parent-name
(widget-create 'editable-field (widget-create 'editable-field
:size 25 :size 25
:format "Parent: %v" :format "Parent: %v"
:notify (lambda (widget &rest ignore) :notify (lambda (widget _child &optional event)
(save-excursion (save-excursion
(widget-value-set gobgen-widget-parent-prefix (get-gobject-prefix (widget-value widget))))) (widget-value-set gobgen-widget-parent-prefix
:doc "Name of the parent class. Use g_object if you don't want to derive from something specific." (get-gobject-prefix (widget-value widget)))))
:doc "Name of the parent class. Use g_object if you don't want to derive from something specific."
"g_object")) "g_object"))
(widget-insert " ") (widget-insert " ")
@ -321,21 +378,21 @@ Parameters:
(widget-create 'editable-field (widget-create 'editable-field
:size 10 :size 10
:format "Prefix: %v\n" :format "Prefix: %v\n"
:doc "Prefix of the parent class. Its automatically set value should suffice most of the time" :doc "Prefix of the parent class. Its automatically set value should suffice most of the time"
"g")) "g"))
(widget-insert "\n") (widget-insert "\n")
(setq gobgen-widget-recent (setq gobgen-widget-recent
(widget-create 'checkbox (widget-create 'checkbox
:doc "Use recent GLib's features, like defining a class with a private struct. Usually you would want this on." :doc "Use recent GLib's features, like defining a class with a private struct. Usually you would want this on."
t)) t))
(widget-insert " GLib >= 2.38\n") (widget-insert " GLib >= 2.38\n")
(setq gobgen-widget-private (setq gobgen-widget-private
(widget-create 'checkbox (widget-create 'checkbox
:doc "Add a private struct for the object." :doc "Add a private struct for the object."
nil)) nil))
(widget-insert " Has private members\n") (widget-insert " Has private members\n")
@ -343,14 +400,19 @@ Parameters:
(widget-insert "\n\n") (widget-insert "\n\n")
(widget-create 'push-button (widget-create 'push-button
:notify (lambda (&rest ignore) :notify (lambda (widget _child &optional event)
(let ((class-name (widget-value gobgen-widget-name)) (let ((class-name (widget-value gobgen-widget-name))
(class-prefix (widget-value gobgen-widget-prefix)) (class-prefix (widget-value gobgen-widget-prefix))
(parent-name (widget-value gobgen-widget-parent-name)) (parent-name (widget-value gobgen-widget-parent-name))
(parent-prefix (widget-value gobgen-widget-parent-prefix)) (parent-prefix (widget-value gobgen-widget-parent-prefix))
(recent-glib (widget-value gobgen-widget-recent)) (recent-glib (widget-value gobgen-widget-recent))
(need-private (widget-value gobgen-widget-private))) (need-private (widget-value gobgen-widget-private)))
(gobgen-generator))) (gobgen-generator class-prefix
class-name
parent-prefix
parent-name
recent-glib
need-private)))
"Generate") "Generate")
(widget-insert " ") (widget-insert " ")
@ -368,11 +430,11 @@ Parameters:
(widget-insert " ") (widget-insert " ")
(widget-create 'push-button (widget-create 'push-button
:notify (lambda (&rest ignore) :notify (lambda (widget _child &optional event)
(kill-buffer "*GObject Creator*")) (kill-buffer "*GObject Creator*"))
"Close") "Close")
(beginning-of-buffer) (goto-char (point-min))
(use-local-map widget-keymap) (use-local-map widget-keymap)
(widget-setup)) (widget-setup))