+ (setq company-semantic--current-tags
+ (semantic-analyze-possible-completions context))
+ (all-completions prefix company-semantic--current-tags))))
+
+(defun company-semantic-completions-raw (prefix)
+ (setq company-semantic--current-tags nil)
+ (dolist (tag (semantic-analyze-find-tags-by-prefix prefix))
+ (unless (eq (semantic-tag-class tag) 'include)
+ (push tag company-semantic--current-tags)))
+ (delete "" (mapcar 'semantic-tag-name company-semantic--current-tags)))
+
+(defun company-semantic-annotation (argument tags)
+ (let* ((tag (assoc argument tags))
+ (kind (when tag (elt tag 1))))
+ (cl-case kind
+ (function (let* ((prototype (semantic-format-tag-prototype tag nil nil))
+ (par-pos (string-match "(" prototype)))
+ (when par-pos (substring prototype par-pos)))))))
+
+(defun company-semantic--pre-prefix-length (prefix-length)
+ "Sum up the length of all chained symbols before POS.
+Symbols are chained by \".\" or \"->\"."
+ (save-excursion
+ (let ((pos (point)))
+ (goto-char (- (point) prefix-length))
+ (while (looking-back "->\\|\\." (- (point) 2))
+ (goto-char (match-beginning 0))
+ (skip-syntax-backward "w_"))
+ (- pos (point)))))
+
+(defun company-semantic--grab ()
+ "Grab the semantic prefix, but return everything before -> or . as length."
+ (let ((symbol (company-grab-symbol)))
+ (when symbol
+ (cons symbol (company-semantic--pre-prefix-length (length symbol))))))