]> code.delx.au - gnu-emacs-elpa/blob - gnome-c-snippet.el
snippet: Fix for older pcase
[gnu-emacs-elpa] / gnome-c-snippet.el
1 ;;; gnome-c-snippet.el --- GNOME-style code generation -*- lexical-binding: t; -*-
2 ;; Copyright (C) 2016 Free Software Foundation, Inc.
3
4 ;; Author: Daiki Ueno <ueno@gnu.org>
5 ;; Keywords: GNOME, C, coding style
6
7 ;; This file is part of GNU Emacs.
8
9 ;; GNU Emacs is free software: you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation, either version 3 of the License, or
12 ;; (at your option) any later version.
13
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
21
22 ;;; Commentary:
23
24 ;; FIXME: The snippets defined here could be rewritten in yasnippet
25
26 ;;; Code:
27
28 (require 'gnome-c-align)
29 (require 'subword)
30
31 (defvar gnome-c-snippet-package nil)
32 (make-variable-buffer-local 'gnome-c-snippet-package)
33
34 (defvar gnome-c-snippet-class nil)
35 (make-variable-buffer-local 'gnome-c-snippet-class)
36
37 (defvar gnome-c-snippet-parent-package nil)
38 (make-variable-buffer-local 'gnome-c-snippet-parent-package)
39
40 (defvar gnome-c-snippet-parent-class nil)
41 (make-variable-buffer-local 'gnome-c-snippet-parent-class)
42
43 (defconst gnome-c-snippet-guess-name-functions
44 '(gnome-c-snippet--guess-name-from-header-buffer
45 gnome-c-snippet--guess-name-from-declaration
46 gnome-c-snippet--guess-name-from-file-name))
47
48 (defcustom gnome-c-snippet-align-arglist t
49 "Whether to align argument list of the inserted snippet"
50 :type 'boolean
51 :group 'gnome-c-style)
52
53 (make-variable-buffer-local 'gnome-c-snippet-align-arglist)
54
55 (defun gnome-c-snippet--find-declaration ()
56 (save-excursion
57 (let (beg end)
58 (goto-char (point-min))
59 (when (re-search-forward
60 "^G_DECLARE_\\(?:FINAL\\|DERIVABLE\\)_TYPE\\s-*("
61 nil t)
62 (setq beg (match-beginning 0))
63 (goto-char (match-end 0))
64 (backward-char)
65 (condition-case nil
66 (progn
67 (c-forward-sexp)
68 (setq end (point)))
69 (error)))
70 (when (and beg end)
71 (list beg end)))))
72
73 (defun gnome-c-snippet--extract-names-from-declaration (beg end)
74 (save-excursion
75 (narrow-to-region beg end)
76 (goto-char (point-min))
77 (search-forward "(")
78 (c-forward-syntactic-ws)
79 (let ((capitalized-package-class
80 (buffer-substring-no-properties (point)
81 (progn
82 (c-forward-token-2)
83 (c-backward-syntactic-ws)
84 (point))))
85 uppercased-package uppercased-class
86 capitalized-package capitalized-class)
87 (c-forward-syntactic-ws)
88 (c-forward-token-2 3)
89 (setq uppercased-package (split-string
90 (buffer-substring (point)
91 (progn
92 (c-forward-token-2)
93 (c-backward-syntactic-ws)
94 (point)))
95 "_"))
96 (c-forward-syntactic-ws)
97 (c-forward-token-2)
98 (setq uppercased-class (split-string
99 (buffer-substring (point)
100 (progn
101 (c-forward-token-2)
102 (c-backward-syntactic-ws)
103 (point)))
104 "_"))
105 (catch 'error
106 (let ((index 0))
107 (dolist (uppercased uppercased-package)
108 (let* ((length (length uppercased))
109 (capitalized
110 (substring capitalized-package-class
111 index (+ index length))))
112 (unless (equal (upcase capitalized) uppercased)
113 (throw 'error nil))
114 (push capitalized capitalized-package)
115 (setq index (+ index length))))
116 (dolist (uppercased uppercased-class)
117 (let* ((length (length uppercased))
118 (capitalized
119 (substring capitalized-package-class
120 index (+ index length))))
121 (unless (equal (upcase capitalized) uppercased)
122 (throw 'error nil))
123 (push capitalized capitalized-class)
124 (setq index (+ index length))))))
125 (list (nreverse capitalized-package)
126 (nreverse capitalized-class)))))
127
128 (defun gnome-c-snippet--find-header-buffer ()
129 (pcase (file-name-extension buffer-file-name)
130 ("h"
131 (current-buffer))
132 ("c"
133 (let ((header-file-name
134 (concat (file-name-sans-extension buffer-file-name) ".h")))
135 (cl-find-if
136 (lambda (buffer)
137 (with-current-buffer buffer
138 (equal buffer-file-name header-file-name)))
139 (buffer-list))))))
140
141 (defun gnome-c-snippet--guess-name-from-header-buffer (symbol)
142 (let ((header-buffer (gnome-c-snippet--find-header-buffer)))
143 (when header-buffer
144 (with-current-buffer header-buffer
145 (symbol-value (intern (format "gnome-c-snippet-%S" symbol)))))))
146
147 (defun gnome-c-snippet--guess-name-from-declaration (symbol)
148 (when (memq symbol '(package class))
149 (let ((header-buffer (gnome-c-snippet--find-header-buffer)))
150 (when header-buffer
151 (with-current-buffer header-buffer
152 (let ((region (gnome-c-snippet--find-declaration))
153 names)
154 (when region
155 (setq names
156 (apply #'gnome-c-snippet--extract-names-from-declaration
157 region))
158 (when names
159 (pcase symbol
160 (`package (car names))
161 (`class (nth 1 names)))))))))))
162
163 (defun gnome-c-snippet--guess-name-from-file-name (symbol)
164 (when (memq symbol '(package class))
165 (let ((filename (file-name-sans-extension
166 (file-name-nondirectory buffer-file-name))))
167 (when (string-match-p "-" filename)
168 (let ((names (split-string filename "-")))
169 (pcase symbol
170 (`package (list (upcase-initials (car names))))
171 (`class (mapcar #'upcase-initials (cdr names)))))))))
172
173 (defun gnome-c-snippet--parse-name (name)
174 (with-temp-buffer
175 (let (words)
176 (insert (upcase-initials name))
177 (goto-char (point-min))
178 (while (not (eobp))
179 ;; Skip characters not recognized by subword-mode.
180 (if (looking-at "[^[:lower:][:upper:][:digit:]]+")
181 (goto-char (match-end 0)))
182 (push (buffer-substring (point) (progn (subword-forward 1)
183 (point)))
184 words))
185 (nreverse words))))
186
187 (defun gnome-c-snippet--read-name (prompt symbol &optional default)
188 (when (or current-prefix-arg
189 (not (symbol-value symbol)))
190 (set symbol
191 (gnome-c-snippet--parse-name
192 (read-string prompt
193 (or (if (symbol-value symbol)
194 (gnome-c-snippet--format-Package
195 (symbol-value symbol)))
196 default)))))
197 (symbol-value symbol))
198
199 (defun gnome-c-snippet--read-package-and-class (parent)
200 (append (list (gnome-c-snippet--read-name
201 "Package (CamelCase): "
202 'gnome-c-snippet-package
203 (gnome-c-snippet--format-Package
204 (run-hook-with-args-until-success
205 'gnome-c-snippet-guess-name-functions
206 'package)))
207 (gnome-c-snippet--read-name
208 "Class (CamelCase): "
209 'gnome-c-snippet-class
210 (gnome-c-snippet--format-Class
211 (run-hook-with-args-until-success
212 'gnome-c-snippet-guess-name-functions
213 'class))))
214 (when parent
215 (list (gnome-c-snippet--read-name
216 "Parent package (CamelCase): "
217 'gnome-c-snippet-parent-package
218 (gnome-c-snippet--format-Package
219 (run-hook-with-args-until-success
220 'gnome-c-snippet-guess-name-functions
221 'parent-package)))
222 (gnome-c-snippet--read-name
223 "Parent class (CamelCase): "
224 'gnome-c-snippet-parent-class
225 (gnome-c-snippet--format-Class
226 (run-hook-with-args-until-success
227 'gnome-c-snippet-guess-name-functions
228 'parent-class)))))))
229
230 (defun gnome-c-snippet--read-package-and-interface (parent)
231 (list (gnome-c-snippet--read-name
232 "Package (CamelCase): "
233 'gnome-c-snippet-package
234 (gnome-c-snippet--format-Package
235 (run-hook-with-args-until-success
236 'gnome-c-snippet-guess-name-functions
237 'package)))
238 (gnome-c-snippet--read-name
239 "Interface (CamelCase): "
240 'gnome-c-snippet-class
241 (gnome-c-snippet--format-Class
242 (run-hook-with-args-until-success
243 'gnome-c-snippet-guess-name-functions
244 'class)))
245 (when parent
246 (list (gnome-c-snippet--read-name
247 "Parent package (CamelCase): "
248 'gnome-c-snippet-parent-package
249 (gnome-c-snippet--format-Package
250 (run-hook-with-args-until-success
251 'gnome-c-snippet-guess-name-functions
252 'parent-package)))
253 (gnome-c-snippet--read-name
254 "Parent class (CamelCase): "
255 'gnome-c-snippet-parent-class
256 (gnome-c-snippet--format-Class
257 (run-hook-with-args-until-success
258 'gnome-c-snippet-guess-name-functions
259 'parent-class)))))))
260
261 (defun gnome-c-snippet--format-PACKAGE (package)
262 (mapconcat #'upcase package "_"))
263 (defalias 'gnome-c-snippet--format-CLASS 'gnome-c-snippet--format-PACKAGE)
264
265 (defun gnome-c-snippet--format-PACKAGE_CLASS (package class)
266 (concat (gnome-c-snippet--format-PACKAGE package)
267 "_"
268 (gnome-c-snippet--format-CLASS class)))
269
270 (defun gnome-c-snippet--format-package (package)
271 (mapconcat #'downcase package "_"))
272 (defalias 'gnome-c-snippet--format-class 'gnome-c-snippet--format-package)
273
274 (defun gnome-c-snippet--format-package_class (package class)
275 (concat (gnome-c-snippet--format-package package)
276 "_"
277 (gnome-c-snippet--format-class class)))
278
279 (defun gnome-c-snippet--format-Package (package)
280 (mapconcat #'identity package ""))
281 (defalias 'gnome-c-snippet--format-Class 'gnome-c-snippet--format-Package)
282
283 (defun gnome-c-snippet--format-PackageClass (package class)
284 (concat (gnome-c-snippet--format-Package package)
285 (gnome-c-snippet--format-Class class)))
286
287 ;;;###autoload
288 (defun gnome-c-snippet-insert-package_class (package class)
289 "Insert the class name before the current point."
290 (interactive (gnome-c-snippet--read-package-and-class nil))
291 (insert (gnome-c-snippet--format-package_class package class)))
292
293 ;;;###autoload
294 (defun gnome-c-snippet-insert-PACKAGE_CLASS (package class)
295 "Insert the class name before the current point."
296 (interactive (gnome-c-snippet--read-package-and-class nil))
297 (insert (gnome-c-snippet--format-PACKAGE_CLASS package class)))
298
299 ;;;###autoload
300 (defun gnome-c-snippet-insert-PackageClass (package class)
301 "Insert the class name (in CamelCase) before the current point."
302 (interactive (gnome-c-snippet--read-package-and-class nil))
303 (insert (gnome-c-snippet--format-PackageClass package class)))
304
305 (defun gnome-c-snippet-insert-interface-declaration (package iface
306 parent-package parent-class)
307 "Insert interface declaration for PACKAGE and IFACE"
308 (interactive (gnome-c-snippet--read-package-and-interface t))
309 (insert "\
310 #define " (gnome-c-snippet--format-PACKAGE package) "_TYPE_" (gnome-c-snippet--format-CLASS iface) " (" (gnome-c-snippet--format-package package) "_" (gnome-c-snippet--format-class iface) "_get_type ())
311 G_DECLARE_INTERFACE (" (gnome-c-snippet--format-PackageClass package iface) ", "
312 (gnome-c-snippet--format-package_class package iface) ", " (gnome-c-snippet--format-PACKAGE package) ", " (gnome-c-snippet--format-CLASS iface) ", " (gnome-c-snippet--format-PackageClass parent-package parent-class) ")
313 "))
314
315 (defun gnome-c-snippet--insert-class-declaration (package
316 class
317 parent-package
318 parent-class
319 derivable)
320 (insert "\
321 #define " (gnome-c-snippet--format-PACKAGE package) "_TYPE_" (gnome-c-snippet--format-CLASS class) " (" (gnome-c-snippet--format-package_class package class) "_get_type ())
322 G_DECLARE_" (if derivable "DERIVABLE" "FINAL") "_TYPE (" (gnome-c-snippet--format-PackageClass package class) ", "
323 (gnome-c-snippet--format-package_class package class) ", " (gnome-c-snippet--format-PACKAGE package) ", " (gnome-c-snippet--format-CLASS class) ", " (gnome-c-snippet--format-PackageClass parent-package parent-class) ")
324 "))
325
326 (defun gnome-c-snippet-insert-final-class-declaration (package
327 class
328 parent-package
329 parent-class)
330 "Insert final class declaration for PACKAGE and CLASS."
331 (interactive (gnome-c-snippet--read-package-and-class t))
332 (gnome-c-snippet--insert-class-declaration package
333 class
334 parent-package
335 parent-class
336 nil))
337
338 (defun gnome-c-snippet-insert-derivable-class-declaration (package
339 class
340 parent-package
341 parent-class)
342 "Insert derivable class declaration for PACKAGE and CLASS."
343 (interactive (gnome-c-snippet--read-package-and-class t))
344 (gnome-c-snippet--insert-class-declaration package
345 class
346 parent-package
347 parent-class
348 t))
349
350 (defun gnome-c-snippet-insert-interface-definition (package
351 iface
352 parent-package
353 parent-class)
354 "Insert class definition for PACKAGE and CLASS."
355 (interactive (gnome-c-snippet--read-package-and-interface t))
356 (insert "\
357 static void
358 " (gnome-c-snippet--format-package_class package iface) "_default_init (" (gnome-c-snippet--format-PackageClass package iface) "Interface *iface) {
359 }
360
361 G_DEFINE_INTERFACE (" (gnome-c-snippet--format-PackageClass package iface) ", "
362 (gnome-c-snippet--format-package_class package iface) ", " (gnome-c-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-c-snippet--format-CLASS parent-class) ")
363 "))
364
365 (defun gnome-c-snippet--insert-class-definition (package
366 class
367 parent-package
368 parent-class
369 abstract)
370 (insert "\
371 G_DEFINE_" (if abstract "ABSTRACT_" "") "TYPE (" (gnome-c-snippet--format-PackageClass package class) ", "
372 (gnome-c-snippet--format-package_class package class) ", " (gnome-c-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-c-snippet--format-CLASS parent-class) ")
373
374 static void
375 " (gnome-c-snippet--format-package_class package class) "_class_init (" (gnome-c-snippet--format-PackageClass package class) "Class *klass)
376 {
377 }
378
379 static void
380 " (gnome-c-snippet--format-package_class package class) "_init (" (gnome-c-snippet--format-PackageClass package class) " *self)
381 {
382 }
383 "))
384
385 (defun gnome-c-snippet-insert-class-definition (package
386 class
387 parent-package
388 parent-class)
389 "Insert class definition for PACKAGE and CLASS."
390 (interactive (gnome-c-snippet--read-package-and-class t))
391 (gnome-c-snippet--insert-class-definition package
392 class
393 parent-package
394 parent-class
395 nil))
396
397 (defun gnome-c-snippet-insert-abstract-class-definition (package
398 class
399 parent-package
400 parent-class)
401 "Insert abstract class definition for PACKAGE and CLASS."
402 (interactive (gnome-c-snippet--read-package-and-class t))
403 (gnome-c-snippet--insert-class-definition package
404 class
405 parent-package
406 parent-class
407 t))
408
409 (defun gnome-c-snippet-insert-constructor (package class)
410 "Insert 'constructor' vfunc of GObjectClass for PACKAGE and CLASS."
411 (interactive (gnome-c-snippet--read-package-and-class nil))
412 (let (arglist-start body-start)
413 (insert "\
414 static GObject *
415 " (gnome-c-snippet--format-package_class package class) "_constructor (")
416 (setq arglist-start (point-marker))
417 (insert "GType *object,
418 guint n_construct_properties,
419 GObjectConstructParam *construct_properties)\n")
420 (setq body-start (point-marker))
421 (if gnome-c-snippet-align-arglist
422 (progn
423 (goto-char arglist-start)
424 (gnome-c-align-arglist-at-point))
425 (indent-region arglist-start (point)))
426 (goto-char body-start)
427 (insert "{
428 " (gnome-c-snippet--format-PackageClass package class) " *self = "
429 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
430
431 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructor (type, n_construct_properties, construct_properties);
432 }
433 ")
434 (indent-region body-start (point))))
435
436 (defun gnome-c-snippet-insert-set_property (package class)
437 "Insert 'set_property' vfunc of GObjectClass for PACKAGE and CLASS."
438 (interactive (gnome-c-snippet--read-package-and-class nil))
439 (let (arglist-start body-start)
440 (insert "\
441 static void
442 " (gnome-c-snippet--format-package_class package class) "_set_property (")
443 (setq arglist-start (point-marker))
444 (insert "GObject *object,
445 guint prop_id,
446 const GValue *value,
447 GParamSpec *pspec)\n")
448 (setq body-start (point-marker))
449 (if gnome-c-snippet-align-arglist
450 (progn
451 (goto-char arglist-start)
452 (gnome-c-align-arglist-at-point))
453 (indent-region arglist-start (point)))
454 (goto-char body-start)
455 (insert "{
456 " (gnome-c-snippet--format-PackageClass package class) " *self = "
457 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
458
459 switch (prop_id)
460 {
461 default:
462 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
463 break;
464 }
465 }
466 ")
467 (indent-region body-start (point))))
468
469 (defun gnome-c-snippet-insert-get_property (package class)
470 "Insert 'get_property' vfunc of GObjectClass for PACKAGE and CLASS."
471 (interactive (gnome-c-snippet--read-package-and-class nil))
472 (let (arglist-start body-start)
473 (insert "\
474 static void
475 " (gnome-c-snippet--format-package_class package class) "_get_property (")
476 (setq arglist-start (point-marker))
477 (insert "GObject *object,
478 guint prop_id,
479 GValue *value,
480 GParamSpec *pspec)\n")
481 (setq body-start (point-marker))
482 (if gnome-c-snippet-align-arglist
483 (progn
484 (goto-char arglist-start)
485 (gnome-c-align-arglist-at-point))
486 (indent-region arglist-start (point)))
487 (goto-char body-start)
488 (insert "{
489 " (gnome-c-snippet--format-PackageClass package class) " *self = "
490 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
491
492 switch (prop_id)
493 {
494 default:
495 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
496 break;
497 }
498 }
499 ")
500 (indent-region body-start (point))))
501
502 (defun gnome-c-snippet-insert-dispose (package class)
503 "Insert 'dispose' vfunc of GObjectClass for PACKAGE and CLASS."
504 (interactive (gnome-c-snippet--read-package-and-class nil))
505 (let (body-start)
506 (insert "\
507 static void
508 " (gnome-c-snippet--format-package_class package class) "_dispose (GObject *object)\n")
509 (setq body-start (point-marker))
510 (insert "{
511 " (gnome-c-snippet--format-PackageClass package class) " *self = "
512 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
513
514 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->dispose (object);
515 }
516 ")
517 (indent-region body-start (point))))
518
519 (defun gnome-c-snippet-insert-finalize (package class)
520 "Insert 'finalize' vfunc of GObjectClass for PACKAGE and CLASS."
521 (interactive (gnome-c-snippet--read-package-and-class nil))
522 (let (body-start)
523 (insert "\
524 static void
525 " (gnome-c-snippet--format-package_class package class) "_finalize (GObject *object)\n")
526 (setq body-start (point-marker))
527 (insert "{
528 " (gnome-c-snippet--format-PackageClass package class) " *self = "
529 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
530
531 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->finalize (object);
532 }
533 ")
534 (indent-region body-start (point))))
535
536 (defun gnome-c-snippet-insert-dispatch_properties_changed (package class)
537 "Insert 'dispatch_properties_changed vfunc of GObjectClass for
538 PACKAGE and CLASS."
539 (interactive (gnome-c-snippet--read-package-and-class nil))
540 (let (arglist-start body-start)
541 (insert "\
542 static void
543 " (gnome-c-snippet--format-package_class package class) "_dispatch_properties_changed (")
544 (setq arglist-start (point-marker))
545 (insert "GObject *object,
546 guint n_pspecs,
547 GParamSpec **pspecs)\n")
548 (setq body-start (point-marker))
549 (if gnome-c-snippet-align-arglist
550 (progn
551 (goto-char arglist-start)
552 (gnome-c-align-arglist-at-point))
553 (indent-region arglist-start (point)))
554 (goto-char body-start)
555 (insert "{
556 " (gnome-c-snippet--format-PackageClass package class) " *self = "
557 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
558
559 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->dispatch_properties_changed (object, n_pspecs, pspecs);
560 }
561 ")
562 (indent-region body-start (point))))
563
564 (defun gnome-c-snippet-insert-notify (package class)
565 "Insert 'notify' vfunc of GObjectClass for PACKAGE and CLASS."
566 (interactive (gnome-c-snippet--read-package-and-class nil))
567 (let (arglist-start body-start)
568 (insert "\
569 static void
570 " (gnome-c-snippet--format-package_class package class) "_notify (")
571 (setq arglist-start (point-marker))
572 (insert "GObject *object,
573 GParamSpec *pspec)\n")
574 (setq body-start (point-marker))
575 (if gnome-c-snippet-align-arglist
576 (progn
577 (goto-char arglist-start)
578 (gnome-c-align-arglist-at-point))
579 (indent-region arglist-start (point)))
580 (insert "{
581 " (gnome-c-snippet--format-PackageClass package class) " *self = "
582 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
583
584 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->notify (object, pspec);
585 }
586 ")
587 (indent-region body-start (point))))
588
589 (defun gnome-c-snippet-insert-constructed (package class)
590 "Insert 'constructed' vfunc of GObjectClass for PACKAGE and CLASS."
591 (interactive (gnome-c-snippet--read-package-and-class nil))
592 (let (body-start)
593 (insert "\
594 static void
595 " (gnome-c-snippet--format-package_class package class) "_constructed (GObject *object)\n")
596 (setq body-start (point-marker))
597 (insert "{
598 " (gnome-c-snippet--format-PackageClass package class) " *self = "
599 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
600
601 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructed (object);
602 }
603 ")
604 (indent-region body-start (point))))
605
606 (defvar gnome-c-snippet-snippet-commands
607 '(("G_DECLARE_INTERFACE" . gnome-c-snippet-insert-interface-declaration)
608 ("G_DECLARE_FINAL_TYPE" . gnome-c-snippet-insert-final-class-declaration)
609 ("G_DECLARE_DERIVABLE_TYPE" .
610 gnome-c-snippet-insert-derivable-class-declaration)
611 ("G_DEFINE_INTERFACE" . gnome-c-snippet-insert-interface-definition)
612 ("G_DEFINE_TYPE" . gnome-c-snippet-insert-class-definition)
613 ("G_DEFINE_ABSTRACT_TYPE" .
614 gnome-c-snippet-insert-abstract-class-definition)
615 ("GObjectClass.constructor" . gnome-c-snippet-insert-constructor)
616 ("GObjectClass.set_property" . gnome-c-snippet-insert-set_property)
617 ("GObjectClass.get_property" . gnome-c-snippet-insert-get_property)
618 ("GObjectClass.dispose" . gnome-c-snippet-insert-dispose)
619 ("GObjectClass.finalize" . gnome-c-snippet-insert-finalize)
620 ("GObjectClass.dispatch_properties_changed" .
621 gnome-c-snippet-insert-dispatch_properties_changed)
622 ("GObjectClass.notify" . gnome-c-snippet-insert-notify)
623 ("GObjectClass.constructed" . gnome-c-snippet-insert-constructed)))
624
625 ;;;###autoload
626 (defun gnome-c-snippet-insert (snippet)
627 (interactive
628 (list (completing-read "Snippet: " gnome-c-snippet-snippet-commands nil t)))
629 (let ((entry (assoc snippet gnome-c-snippet-snippet-commands)))
630 (unless entry
631 (error "Unknown snippet: %s" snippet))
632 (call-interactively (cdr entry))))
633
634 (provide 'gnome-c-snippet)
635
636 ;;; gnome-c-snippet.el ends here