FG42/conf/emacs.d/ecb/ecb-cedet-wrapper.el

369 lines
16 KiB
EmacsLisp
Executable File

;;; ecb-cedet-wrapper.el -- define wrappers for all cedet funcs/vars
;; Copyright (C) 2000 - 2009 Klaus Berndl,
;; Free Software Foundation, Inc.
;; Author: Klaus Berndl <klaus.berndl@sdm.de>
;; Maintainer: Klaus Berndl <klaus.berndl@sdm.de>
;; Keywords: browser, code, programming, tools
;; Created: 2009
;; This program is free software; you can redistribute it and/or modify it under
;; the terms of the GNU General Public License as published by the Free Software
;; Foundation; either version 2, or (at your option) any later version.
;; This program 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 General Public License for more
;; details.
;; You should have received a copy of the GNU General Public License along with
;; GNU Emacs; see the file COPYING. If not, write to the Free Software
;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;; $Id$
;;; Commentary:
;; This file contains wrappers for every cedet-function and -variable used
;; by ECB independent which cedet version is used. So the ECB-code is
;; independent from the fact, if cedet offers backward-compatibility or
;; not. This library offers for each used variable V of cedet a getter-function
;; named "ecb--V" and for each function F an alias named "ecb--F". V and F
;; follow the naming conventiones of cedet 1.0 but the resulting functions
;; always point to the correct variable or function of cedet independent
;; which cedet version is loaded. ECB only uses the functions exported from
;; ecb-cedet-wrapper.el!
;;
;; In addition this file defines all requirements ECB needs of CEDET.
(eval-when-compile
(require 'silentcomp))
(eval-when-compile
;; to avoid compiler grips
(require 'cl))
(require 'ecb-util)
(defconst ecb-cedet-old-sourcetree-structure-detected-p
(locate-library "semantic-ctxt")
"Not nil if old cedet sourcetree-structure is detected.")
;; Additonal cedet libraries needed by ecb must be added here!!
;; TODO: Klaus Berndl <klaus.berndl@sdm.de>: We have to pay attention if there
;; are changes when Eric marriages the two styles for his CVS-repository
(defconst ecb-cedet-lib-registry '((cedet . cedet)
(semantic . semantic)
(semantic-ctxt . semantic/ctxt)
(semantic-analyze . semantic/analyze)
(semanticdb . semantic/db)
(semanticdb-find . semantic/db-find)
(semanticdb-mode . semantic/db-mode)
(semantic-el . semantic/bovine/el)
(eieio . eieio)
(speedbar . speedbar))
"Maps the old library-structure of cedet to the equivalent libs
of Emacs >= 23.2. The value is an assoc list where the car is the
lib-symbol of an old-style cedet-library and the cdr is the
corresponding lib-symbol of the new style library \(as with the
cedet-suite integrated into Emacs >= 23.2).
ALL CEDET-LIBRARIES NEEDED BY ECB MUST BE REGISTERED HERE!")
(defconst ecb-cedet-required-version-min '(1 0 2 6)
"Minimum version of cedet needed by ECB.
The meaning is as follows:
1. Major-version
2. Minor-version
3. 0 = alpha, 1 = beta, 2 = pre, 3 = nothing \(e.g. \"1.4\"), 4 = . \(e.g. \"1.4.3\"
4. Subversion after the alpha, beta, pre or .")
(defconst ecb-cedet-required-version-max '(10 0 0 0)
"Maximum version of CEDET currently accepted by ECB.
See `ecb-required-cedet-version-min' for an explanation.")
(defun ecb-cedet-missing-libs ()
"Return a list of names of missing cedet-libs.
If no cedet libs are missing nil is returned."
(let ((missing-libs-list nil)
(lib nil))
(dolist (l-elem ecb-cedet-lib-registry)
(setq lib (symbol-name (if ecb-cedet-old-sourcetree-structure-detected-p
(car l-elem)
(cdr l-elem))))
(when (not (locate-library lib))
(push lib missing-libs-list)))
missing-libs-list))
(defun ecb-cedet-require (old-style-lib)
"Loads a cedet-library CVS-LIB into Emacs.
OLD-STYLE-LIB is the symbol-name of the cedet-library as in the cvs-version of
cedet in feb 2010 \(ie. there is a lib semantic-ctxt instead of semantic/ctxt).
All cedet libaryies needed by ECB must be loaded with this function! Do not
use `require' for looading a cedet-library into Emacs!"
(require (if ecb-cedet-old-sourcetree-structure-detected-p
old-style-lib
(cdr (assoc old-style-lib ecb-cedet-lib-registry)))))
;; With old style CEDET-load-mechanism cedet.el must be loaded "by
;; hand" to setup load-path correctly for cedet.
;; + Old-style CEDET-loader: The following require for 'cedet fails if
;; cedet.el is either not loaded or cedet/common is not contained in the
;; load-path. For these cases we encapsulate it with ignore-errors.
;; + New-style CEDET-loader (as in Emacs >= 23.2): cedet.el is not needed to
;; setup the load-path but it contains the costant `cedet-version' which is
;; needed by ECB.
(ignore-errors (ecb-cedet-require 'cedet))
(defconst ecb-cedet-missing-libraries
(ecb-cedet-missing-libs)
"List of library-names of CEDET missed by ECB.
Nil if all libs needed by ECB are found.")
(unless ecb-cedet-missing-libraries
(ecb-cedet-require 'semantic)
(ecb-cedet-require 'semantic-ctxt)
(ecb-cedet-require 'semantic-analyze)
(ecb-cedet-require 'semanticdb)
(ecb-cedet-require 'semanticdb-find)
(ecb-cedet-require 'semanticdb-mode)
(ecb-cedet-require 'eieio))
(defconst ecb-compiled-in-semantic-version
(eval-when-compile (ignore-errors semantic-version))
"Semantic-version used for byte-compiling ECB. Either nil when no semantic
is loaded or the value of `semantic-version' at ECB-compilation time.")
(defconst ecb-compiled-in-cedet-version
(eval-when-compile (ignore-errors cedet-version))
"Cedet-version used for byte-compiling ECB. Either nil when no semantic
is loaded or the value of `cedet-version' at ECB-compilation time.")
(defun ecb-check-semantic-load ()
"Checks if cedet is correctly loaded if semantic 2.X is used and if the same
semantic-version has been used for byte-compiling ECB and loading into Emacs.
If ECB detects a problem it is reported and then an error is thrown."
(when (boundp 'semantic-version)
(let ((err-msg
(cond ;; Different semantic-version used for byte-compiling ECB and
;; loading into Emacs.
((not (string= semantic-version ecb-compiled-in-semantic-version))
(concat "ECB has been byte-compiled with another semantic-version than currently\n"
"loaded into Emacs:\n"
(format " + Semantic used for byte-compiling ECB: %s\n"
ecb-compiled-in-semantic-version)
(format " + Semantic currently loaded into Emacs: %s\n"
semantic-version)
"Please ensure that ECB is byte-compiled with the same semantic-version as you\n"
"you load into your Emacs. Check if you have byte-compiled ECB with the cedet-\n"
"suite but loaded old semantic 1.X into Emacs or vice versa.\n\n"
"In general it is recommended to start ECB first-time not byte-compiled\n"
"and then call the command `ecb-byte-compile'. This ensures you byte-compile ECB\n"
"with the same library-versions \(semantic etc.) as you load into Emacs.\n"
"If you use the Makefile check the variables CEDET before compiling!\n"
))
(t ""))))
(unless (= 0 (length err-msg))
(with-output-to-temp-buffer "*ECB semantic-load problems*"
(princ "Currently ECB can not be activated cause of the following reason:\n\n")
(princ err-msg)
(princ "\n\nPlease fix the reported problem and restart Emacs\n"))
(ecb-error "Please fix the reported problem and restart Emacs!")))))
(defun ecb-check-cedet-load ()
"Checks if cedet is correctly loaded if semantic 2.X is used and if the same
semantic-version has been used for byte-compiling ECB and loading into Emacs.
If ECB detects a problem it is reported and then an error is thrown."
(when (boundp 'cedet-version)
(let ((err-msg
(cond ;; cedet was not compiled into ECB
((null ecb-compiled-in-cedet-version)
(concat (format "Currently CEDET %s is loaded but ECB has been byte-compiled without\n"
cedet-version)
"any CEDET. Please either use ECB un-byte-compiled \(remove all *.elc\n"
"files from the ECB-directory) or byte-compile ECB correctly with CEDET!\n"
"In the later case it is recommended to start ECB first-time not byte-compiled\n"
"and then call the command `ecb-byte-compile'. This ensures you byte-compile ECB\n"
"with the same CEDET-library-version as you load into Emacs.\n"
"If you use the Makefile check the variable CEDET before compiling!\n"
))
;; Different cedet-version used for byte-compiling ECB and
;; loading into Emacs.
((not (string= cedet-version ecb-compiled-in-cedet-version))
(concat "ECB has been byte-compiled with another cedet-version than currently\n"
"loaded into Emacs:\n"
(format " + CECET used for byte-compiling ECB: %s\n"
ecb-compiled-in-cedet-version)
(format " + CEDET currently loaded into Emacs: %s\n"
cedet-version)
"Please ensure that ECB is byte-compiled with the same cedet-version as you\n"
"you load into your Emacs.\n\n"
"In general it is recommended to start ECB first-time not byte-compiled\n"
"and then call the command `ecb-byte-compile'. This ensures you byte-compile ECB\n"
"with the same CEDET-library-version as you load into Emacs.\n"
"If you use the Makefile check the variable CEDET before compiling!\n"))
(t ""))))
(unless (= 0 (length err-msg))
(with-output-to-temp-buffer "*ECB cedet-load problems*"
(princ "Currently ECB can not be activated cause of the following reason:\n\n")
(princ err-msg)
(princ "\n\nPlease fix the reported problem and restart Emacs\n"))
(ecb-error "Please fix the reported problem and restart Emacs!")))))
(defconst ecb-semantic-2-loaded (ignore-errors
(string-match "^2" semantic-version)))
;; -- getter functions for all variables of cedet currently used by ECB ---
(defsubst ecb--semantic-symbol->name-assoc-list ()
"Return the value of `semantic-symbol->name-assoc-list'."
(symbol-value 'semantic-symbol->name-assoc-list))
(defsubst ecb--semantic-symbol->name-assoc-list-for-type-parts ()
"Return the value of `semantic-symbol->name-assoc-list-for-type-parts'."
(symbol-value 'semantic-symbol->name-assoc-list-for-type-parts))
(defsubst ecb--semantic-format-tag-functions ()
"Return value of `semantic-format-tag-functions'."
(symbol-value 'semantic-format-tag-functions))
(defsubst ecb--semantic-orphaned-member-metaparent-type ()
"Return the value of `semantic-orphaned-member-metaparent-type'."
(symbol-value 'semantic-orphaned-member-metaparent-type))
(defsubst ecb--semantic-uml-colon-string ()
"Return the value of `semantic-uml-colon-string'."
(symbol-value 'semantic-uml-colon-string))
(defsubst ecb--semantic-format-face-alist ()
"Return the value of `semantic-format-face-alist'."
(symbol-value 'semantic-format-face-alist))
(defsubst ecb--semantic-after-toplevel-cache-change-hook ()
"Return the hook-symbol `semantic-after-toplevel-cache-change-hook'."
'semantic-after-toplevel-cache-change-hook)
(defsubst ecb--semantic-after-partial-cache-change-hook ()
"Return the hook-symbol `semantic-after-partial-cache-change-hook'."
'semantic-after-partial-cache-change-hook)
(defsubst ecb--semantic--before-fetch-tags-hook ()
"Return the hook-symbol `semantic--before-fetch-tags-hook'."
'semantic--before-fetch-tags-hook)
(defsubst ecb--ezimage-use-images ()
(if (boundp 'ezimage-use-images)
ezimage-use-images))
(defsubst ecb--semantic-format-use-images-flag ()
(if (boundp 'semantic-format-use-images-flag)
semantic-format-use-images-flag))
;; -- an alias for all functions of cedet currently used by ECB ---
;; (delq nil (mapcar (function (lambda (f)
;; (if (not (fboundp f))
;; f)))
;; ecb--cedet-function-list))
(defconst ecb--cedet-function-list
'(
semantic--format-colorize-text
semantic--tag-get-property
semantic--tag-overlay-cdr
semantic--tag-put-property
semantic--tag-set-overlay
semantic-active-p
semantic-adopt-external-members
semantic-analyze-current-context
semantic-analyze-find-tag
semantic-analyze-possible-completions
semantic-analyze-tag-type
semantic-brute-find-first-tag-by-name
semantic-bucketize
semantic-c-template-string
semantic-calculate-scope
semantic-clear-toplevel-cache
semantic-current-tag
semantic-current-tag-parent
semantic-dependency-tag-file
semantic-documentation-for-tag
semantic-equivalent-tag-p
semantic-fetch-available-tags
semantic-fetch-tags
semantic-find-tag-by-overlay
semantic-find-tags-by-class
semantic-find-tags-by-name
semantic-flatten-tags-table
semantic-get-local-arguments
semantic-go-to-tag
semantic-lex-token-start
semantic-overlay-live-p
semantic-overlay-p
semantic-something-to-tag-table
semantic-tag
semantic-tag-abstract-p
semantic-tag-bounds
semantic-tag-buffer
semantic-tag-calculate-parent
semantic-tag-children-compatibility
semantic-tag-class
semantic-tag-components
semantic-tag-components-with-overlays
semantic-tag-end
semantic-tag-faux-p
semantic-tag-function-arguments
semantic-tag-function-constructor-p
semantic-tag-function-destructor-p
semantic-tag-function-parent
semantic-tag-get-attribute
semantic-tag-name
semantic-tag-named-parent
semantic-tag-new-variable
semantic-tag-overlay
semantic-tag-p
semantic-tag-protection
semantic-tag-prototype-p
semantic-tag-start
semantic-tag-static-p
semantic-tag-type
semantic-tag-type-interfaces
semantic-tag-type-members
semantic-tag-type-superclasses
semantic-tag-with-position-p
semanticdb-brute-deep-find-tags-by-name
semanticdb-deep-find-tags-by-name
semanticdb-find-result-length
semanticdb-find-result-nth
semanticdb-find-tags-by-name
semanticdb-full-filename
semanticdb-minor-mode-p
semanticdb-strip-find-results
)
)
(defconst ecb--semantic-format-function-list
'(
semantic-format-tag-abbreviate
semantic-format-tag-concise-prototype
semantic-format-tag-name
semantic-format-tag-prin1
semantic-format-tag-prototype
semantic-format-tag-summarize
semantic-format-tag-uml-abbreviate
semantic-format-tag-uml-concise-prototype
semantic-format-tag-uml-prototype
))
;; new let us create the aliase. Each alias has the name "ecb--"<function of
;; cedet >= 1.0
(unless ecb-cedet-missing-libraries
(dolist (f-elem (append ecb--cedet-function-list ecb--semantic-format-function-list))
(defalias (intern (concat "ecb--" (symbol-name f-elem))) f-elem)))
(silentcomp-provide 'ecb-cedet-wrapper)
;;; ecb-cedet-wrapper.el end here