Skip to content

Commit

Permalink
Add implement interface [#1 state:resolved]
Browse files Browse the repository at this point in the history
  • Loading branch information
espenhw committed Feb 26, 2009
1 parent 5f14db4 commit 8e53565
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 12 deletions.
2 changes: 0 additions & 2 deletions TODO.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ Short term
- goto-type-at-point (with disassembly if needed)
- create if necessary

- Implement interface

- Code generation
- getters/setters
- delegation
Expand Down
45 changes: 35 additions & 10 deletions src/main/lisp/malabar-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,11 @@ in the list")
(or (semantic-current-tag-of-class 'type)
(car (semantic-find-tags-by-class 'type (current-buffer)))))

(defun malabar-goto-start-of-class ()
(interactive)
(let ((class-tag (malabar-get-class-tag-at-point)))
(goto-char (semantic-tag-start class-tag))))

(defun malabar-goto-end-of-class ()
(interactive)
(let ((class-tag (malabar-get-class-tag-at-point)))
Expand Down Expand Up @@ -754,9 +759,9 @@ in the list")
(unless (bolp)
(forward-line 1)))

(defun malabar-prompt-for-and-qualify-class (&optional class)
(defun malabar-prompt-for-and-qualify-class (prompt &optional class)
(let* ((class (or class
(read-from-minibuffer "Class to extend: ")))
(read-from-minibuffer prompt)))
(qualified-class (or (malabar-import-find-import class)
(malabar-qualify-class-name-in-buffer class)))
(class-info (malabar-get-class-info qualified-class)))
Expand All @@ -769,25 +774,45 @@ in the list")
(defun malabar-implement-interface (&optional interface)
(interactive)
(destructuring-bind (interface qualified-interface interface-info)
(malabar-prompt-for-and-qualify-class interface)
(unless (malabar--class-accessible-p qualified-interface interface-info)
(error "You cannot implement %s, it is not accessible from %s"
qualified-interface (malabar-get-package-name)))
(malabar-prompt-for-and-qualify-class "Interface to implement: " interface)
(unless (malabar--interface-p interface-info)
(error "You cannot implement %s, it is not an interface"
qualified-interface))
;; Move to correct insertion point
;; insert "implements" and indent if first interface, insert ", " if not
(insert qualified-interface)
(unless (malabar--class-accessible-p qualified-interface interface-info)
(error "You cannot implement %s, it is not accessible from %s"
qualified-interface (malabar-get-package-name)))
(malabar--implement-interface-move-to-insertion-point)
(if (semantic-tag-type-interfaces (malabar-get-class-tag-at-point))
(insert ", ")
(unless (bolp)
(newline))
(insert "implements ")
(indent-according-to-mode))
(insert interface)
(when (malabar--get-type-parameters interface-info)
(insert (concat "<"
(mapconcat #'identity (malabar--get-type-parameters interface-info)
", ")
">")))
(unless (eolp)
(newline-and-indent))
(mapc #'malabar-override-method (malabar--get-abstract-methods interface-info))))

(defun malabar--implement-interface-move-to-insertion-point ()
(malabar-goto-start-of-class)
(skip-chars-forward "^{")
(when (semantic-tag-type-interfaces (malabar-get-class-tag-at-point))
(search-backward
(car (last (semantic-tag-type-interfaces (malabar-get-class-tag-at-point)))))
(goto-char (match-end 0))))

(defun malabar-extend-class (&optional class)
(interactive)
(unless (equal "java.lang.Object" (malabar-get-superclass-at-point))
(error "Java is limited to single inheritance, class already extends %s"
(malabar-get-superclass-at-point)))
(destructuring-bind (class qualified-class class-info)
(malabar-prompt-for-and-qualify-class class)
(malabar-prompt-for-and-qualify-class "Class to extend: " class)
(when (equal qualified-class "java.lang.Enum")
(error "You cannot extend %s, see the Java Language Specification" qualified-class))
(unless (malabar--class-accessible-p qualified-class class-info)
Expand Down

0 comments on commit 8e53565

Please sign in to comment.