]> code.delx.au - gnu-emacs/blobdiff - lisp/cedet/srecode/java.el
Update copyright year to 2015
[gnu-emacs] / lisp / cedet / srecode / java.el
index 69534e053f1ef39a485ffa7d1aeb2cf13982f875..d812df1c935bb5cef2566ef978ba9f511a7e8b84 100644 (file)
@@ -1,6 +1,6 @@
-;;; srecode-java.el --- Srecode Java support
+;;; srecode/java.el --- Srecode Java support
 
-;; Copyright (C) 2009-2011 Free Software Foundation, Inc.
+;; Copyright (C) 2009-2015 Free Software Foundation, Inc.
 
 ;; Author: Eric M. Ludlam <eric@siege-engine.com>
 
@@ -26,6 +26,8 @@
 ;;; Code:
 
 (require 'srecode/dictionary)
+(require 'semantic/find)
+(require 'ede)
 
 ;;;###autoload
 (defun srecode-semantic-handle-:java (dict)
 Adds the following:
 FILENAME_AS_PACKAGE - file/dir converted into a java package name.
 FILENAME_AS_CLASS - file converted to a Java class name."
-  ;; A symbol representing
+  ;; Symbols needed by empty files.
   (let* ((fsym (file-name-nondirectory (buffer-file-name)))
         (fnox (file-name-sans-extension fsym))
         (dir (file-name-directory (buffer-file-name)))
         (fpak fsym)
+        (proj (ede-current-project))
+        (pths (ede-source-paths proj 'java-mode))
         )
     (while (string-match "\\.\\| " fpak)
       (setq fpak (replace-match "_" t t fpak)))
-    (if (string-match "src/" dir)
-       (setq dir (substring dir (match-end 0)))
-      (setq dir (file-name-nondirectory (directory-file-name dir))))
+    ;; We can extract package from:
+    ;; 1) a java EDE project source paths,
+    (cond ((and proj pths)
+           (let* ((pth) (res))
+             (while (and (not res)
+                         (setq pth (expand-file-name (car pths))))
+               (when (string-match pth dir)
+                 (setq res (substring dir (match-end 0))))
+               (setq pths (cdr pths)))
+             (setq dir res)))
+          ;; 2) a simple heuristic
+          ((string-match "src/" dir)
+           (setq dir (substring dir (match-end 0))))
+          ;; 3) outer directory as a fallback
+          (t (setq dir (file-name-nondirectory (directory-file-name dir)))))
+    (setq dir (directory-file-name dir))
     (while (string-match "/" dir)
-      (setq dir (replace-match "_" t t dir)))
-    (srecode-dictionary-set-value dict "FILENAME_AS_PACKAGE"
-                                 (concat dir "." fpak))
+      (setq dir (replace-match "." t t dir)))
+    (srecode-dictionary-set-value dict "FILENAME_AS_PACKAGE" dir)
     (srecode-dictionary-set-value dict "FILENAME_AS_CLASS" fnox)
-    ))
+    )
+  ;; Symbols needed for most other files with stuff in them.
+  (let ((pkg (semantic-find-tags-by-class 'package (current-buffer))))
+    (when pkg
+      (srecode-dictionary-set-value dict "CURRENT_PACKAGE" (semantic-tag-name (car pkg)))
+      ))
+  )
 
 (provide 'srecode/java)