emacs/lisp/cedet/semantic/chart.el
Stefan Monnier 371fdd4f1b * lisp/cedet: Convert remaining files to lexical-binding
Remove a few more redundant `:group` args.
Make use of lexical scoping to replace `(lambda...) with proper closures.

* lisp/cedet/ede/custom.el (ede-project-sort-targets-list):
Use `dotimes` and replace `(lambda..) with closures.

* lisp/cedet/ede/proj-comp.el (proj-comp-insert-variable-once):
* lisp/cedet/ede/pmake.el (ede-pmake-insert-variable-once):
Remove unused var `addcr`.

* lisp/cedet/semantic/complete.el: Use lexical-binding.
(semantic-displayer-show-request): Remove unused var `typing-count`.
Use `equal` instead of `stringp+string=`.

* lisp/cedet/semantic/db-ebrowse.el: Use lexical-binding.
(semanticdb-create-ebrowse-database): Remove unused vars `mma` and `regexp`.
(semanticdb-ebrowse-strip-trees): Remove unused var `class` and `filename`.
(semanticdb-ebrowse-add-globals-to-table): Remove unused var `fname`.

* lisp/cedet/semantic/db-find.el: Use lexical-binding.
(semanticdb-find-adebug-insert-scanned-tag-cons): Remove always-nil var
`tip`.

* lisp/cedet/semantic/db-global.el: Use lexical-binding.
(semanticdb-enable-gnu-global-databases): Access local var
`semantic--ih` by sticking its value in the code passed to `eval`
rather than by dynamic scoping.

* lisp/cedet/semantic/db-typecache.el: Use lexical-binding.
(semanticdb-db-typecache-dump): Remove unused var `junk`.

* lisp/cedet/semantic/debug.el: Use lexical-binding.

* lisp/cedet/semantic/dep.el: Use lexical-binding.
(semantic-add-system-include): Avoid `add-to-list` on a local variable.
Access local var `value` by sticking its value in the code passed to
`eval` rather than by dynamic scoping.
(semantic-remove-system-include): Don't use `delete` on a list received
from elsewhere.
Access local var `value` by sticking its value in the code passed to
`eval` rather than by dynamic scoping.
(semantic-reset-system-include): Simplify a bit.

* lisp/cedet/semantic/ede-grammar.el: Use lexical-binding.
(project-compile-target): Remove unused vars `csrc` and `cb`.
Use `cl-incf`.  Remove apparently unneeded `with-no-warnings`.

* lisp/cedet/semantic/edit.el: Use lexical-binding.
(semantic-edits-change-over-tags): Remove unused var `inner-start`.
(semantic-edits-incremental-parser-1): Silence warnings about
intentionally unused var `last-cond`.

* lisp/cedet/semantic/fw.el: Use lexical-binding.
(recentf-exclude, semantic-init-hook, ede-auto-add-method)
(flymake-start-syntax-check-on-find-file, auto-insert): Declare vars.

* lisp/cedet/semantic/ia-sb.el: Use lexical-binding.
(semantic-ia-sb-key-map): Move initialization into declaration.
(semantic-ia-sb-more-buttons): Remove unused var `idx`.
(semantic-ia-sb-line-path): Simplify `if` -> `or`.

* lisp/cedet/semantic/idle.el (semantic-idle-breadcrumbs--tag-function):
Make it a function returning a closure.

* lisp/cedet/semantic/senator.el: Use lexical-binding.
(senator-search-set-tag-class-filter): Replace `(lambda..) with a closure.

* lisp/cedet/semantic/sort.el: Use lexical-binding.
(semanticdb-search-system-databases): Declare var.
(semantic-tag-external-member-children-default): Replace `(lambda..)
with a closure.

* lisp/cedet/semantic/tag-ls.el: Use lexical-binding.
(semantic-tag-protection-default, semantic-tag-abstract-p-default):
Simplify with `member`.

* lisp/cedet/semantic/util.el: Use lexical-binding.
(semantic-something-to-tag-table): Declare function
`semanticdb-abstract-table--eieio-childp` called via `cl-typep`.

* lisp/cedet/semantic/bovine/scm.el (semantic-default-scheme-setup):
Remove duplicate setting of `imenu-create-index-function`.

* lisp/cedet/semantic/decorate/mode.el (semantic-decoration-build-style-menu):
Replace `(lambda..) with a closure.

* lisp/cedet/srecode/cpp.el (srecode-semantic-apply-tag-to-dict):
Remove always-t variable `member`.

* lisp/cedet/srecode/mode.el (srecode-minor-mode-templates-menu):
Replace `(lambda..) with a closure.  Use `push`.

* lisp/cedet/semantic/chart.el: Use lexical-binding.
* lisp/cedet/semantic/db-debug.el: Use lexical-binding.
* lisp/cedet/semantic/db-el.el: Use lexical-binding.
* lisp/cedet/semantic/db-file.el: Use lexical-binding.
* lisp/cedet/semantic/db-javascript.el: Use lexical-binding.
* lisp/cedet/semantic/db-mode.el: Use lexical-binding.
* lisp/cedet/semantic/db-ref.el: Use lexical-binding.
* lisp/cedet/semantic/decorate.el: Use lexical-binding.
* lisp/cedet/semantic/doc.el: Use lexical-binding.
* lisp/cedet/semantic/find.el: Use lexical-binding.
* lisp/cedet/semantic/format.el: Use lexical-binding.
* lisp/cedet/semantic/html.el: Use lexical-binding.
* lisp/cedet/semantic/ia.el: Use lexical-binding.
* lisp/cedet/semantic/imenu.el: Use lexical-binding.
* lisp/cedet/semantic/java.el: Use lexical-binding.
* lisp/cedet/semantic/mru-bookmark.el: Use lexical-binding.
* lisp/cedet/semantic/symref.el: Use lexical-binding.
* lisp/cedet/semantic/tag-file.el: Use lexical-binding.
* lisp/cedet/semantic/tag-write.el: Use lexical-binding.
* lisp/cedet/semantic/texi.el: Use lexical-binding.
* lisp/cedet/semantic/util-modes.el: Use lexical-binding.
2021-03-15 00:08:34 -04:00

168 lines
5.4 KiB
EmacsLisp

;;; semantic/chart.el --- Utilities for use with semantic tag tables -*- lexical-binding: t; -*-
;; Copyright (C) 1999-2001, 2003, 2005, 2008-2021 Free Software
;; Foundation, Inc.
;; Author: Eric M. Ludlam <zappo@gnu.org>
;; This file is part of GNU Emacs.
;; GNU Emacs 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 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs 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. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;;
;; A set of simple functions for charting details about a file based on
;; the output of the semantic parser.
;;
(require 'chart)
(require 'semantic/db)
(require 'semantic/find)
(require 'semantic/db-typecache)
(require 'semantic/scope)
;;; Code:
(defun semantic-chart-tags-by-class (&optional tagtable)
"Create a bar chart representing the number of tags for a given tag class.
Each bar represents how many toplevel tags in TAGTABLE
exist with a given class. See `semantic-symbol->name-assoc-list'
for tokens which will be charted.
TAGTABLE is passed to `semantic-something-to-tag-table'."
(interactive)
(let* ((stream (semantic-something-to-tag-table
(or tagtable (current-buffer))))
(names (mapcar #'cdr semantic-symbol->name-assoc-list))
(nums (mapcar
(lambda (symname)
(length
(semantic-brute-find-tag-by-class (car symname)
stream)
))
semantic-symbol->name-assoc-list)))
(chart-bar-quickie 'vertical
"Semantic Toplevel Tag Volume"
names "Tag Class"
nums "Volume")
))
(defun semantic-chart-database-size (&optional _tagtable)
"Create a bar chart representing the size of each file in semanticdb.
Each bar represents how many toplevel tags in TAGTABLE
exist in each database entry.
TAGTABLE is passed to `semantic-something-to-tag-table'."
(interactive)
(unless (and (fboundp 'semanticdb-minor-mode-p)
(semanticdb-minor-mode-p))
(error "Semanticdb is not enabled"))
(let* ((db semanticdb-current-database)
(dbt (semanticdb-get-database-tables db))
(names (mapcar #'car
(object-assoc-list
'file
dbt)))
(numnuts (mapcar (lambda (dba)
(prog1
(cons
(if (slot-boundp dba 'tags)
(length (oref dba tags))
1)
(car names))
(setq names (cdr names))))
dbt))
(nums nil)
(fh (/ (- (frame-height) 7) 4)))
(setq numnuts (sort numnuts (lambda (a b) (> (car a) (car b)))))
(setq names (mapcar #'cdr numnuts)
nums (mapcar #'car numnuts))
(if (> (length names) fh)
(progn
(setcdr (nthcdr fh names) nil)
(setcdr (nthcdr fh nums) nil)))
(chart-bar-quickie 'horizontal
"Semantic DB Toplevel Tag Volume"
names "File"
nums "Volume")
))
(defun semantic-chart-token-complexity (tok)
"Calculate the `complexity' of token TOK."
(count-lines
(semantic-tag-end tok)
(semantic-tag-start tok)))
(defun semantic-chart-tag-complexity
(&optional class tagtable)
"Create a bar chart representing the complexity of some tags.
Complexity is calculated for tags of CLASS. Each bar represents
the complexity of some tag in TAGTABLE. Only the most complex
items are charted. TAGTABLE is passed to
`semantic-something-to-tag-table'."
(interactive)
(let* ((sym (if (not class) 'function))
(stream
(semantic-find-tags-by-class
sym (semantic-something-to-tag-table (or tagtable
(current-buffer)))
))
(name (cond ((semantic-tag-with-position-p (car stream))
(buffer-name (semantic-tag-buffer (car stream))))
(t "")))
(cplx (mapcar (lambda (tok)
(cons tok (semantic-chart-token-complexity tok)))
stream))
(namelabel (cdr (assoc 'function semantic-symbol->name-assoc-list)))
(names nil)
(nums nil))
(setq cplx (sort cplx (lambda (a b) (> (cdr a) (cdr b)))))
(while (and cplx (<= (length names) (/ (- (frame-height) 7) 4)))
(setq names (cons (semantic-tag-name (car (car cplx)))
names)
nums (cons (cdr (car cplx)) nums)
cplx (cdr cplx)))
;; ;; (setq names (mapcar (lambda (str)
;; ;; (substring str (- (length str) 10)))
;; ;; names))
(chart-bar-quickie 'horizontal
(format "%s Complexity in %s"
(capitalize (symbol-name sym))
name)
names namelabel
nums "Complexity (Lines of code)")
))
(defun semantic-chart-analyzer ()
"Chart the extent of the context analysis."
(interactive)
(let* ((p (semanticdb-find-translate-path nil nil))
(plen (length p))
(tab semanticdb-current-table)
(tc (semanticdb-get-typecache tab))
(tclen (+ (length (oref tc filestream))
(length (oref tc includestream))))
(scope (semantic-calculate-scope))
(fslen (length (oref scope fullscope)))
(lvarlen (length (oref scope localvar)))
)
(chart-bar-quickie 'vertical
(format "Analyzer Overhead in %s" (buffer-name))
'("includes" "typecache" "scopelen" "localvar")
"Overhead Entries"
(list plen tclen fslen lvarlen)
"Number of tags")
))
(provide 'semantic/chart)
;;; semantic/chart.el ends here