|
|
@ -85,6 +85,20 @@ Return nil if no script can be found." |
|
|
|
(when-let ((sourcemap-url (indium-script-sourcemap-url script))) |
|
|
|
(not (seq-empty-p sourcemap-url)))) |
|
|
|
|
|
|
|
(defun indium-script-all-scripts-with-sourcemap () |
|
|
|
"Return all parsed scripts that contain a sourcemap." |
|
|
|
(seq-filter #'indium-script-has-sourcemap-p |
|
|
|
(map-values (map-elt indium-connection 'scripts)))) |
|
|
|
|
|
|
|
(defun indium-script-sourcemap-file (script) |
|
|
|
"Return the local sourcemap file associated with SCRIPT. |
|
|
|
If no sourcemap file can be found, return nil." |
|
|
|
(when (indium-script-has-sourcemap-p script) |
|
|
|
(when-let ((script-file (indium-script-get-file script))) |
|
|
|
(indium-workspace-lookup-file-safe |
|
|
|
(expand-file-name (indium-script-sourcemap-url script) |
|
|
|
(file-name-directory script-file)))))) |
|
|
|
|
|
|
|
(defun indium-script-get-frame-original-location (frame) |
|
|
|
"Return the location stack FRAME, possibly using sourcemaps." |
|
|
|
(let* ((script (indium-frame-script frame)) |
|
|
@ -97,32 +111,60 @@ Return nil if no script can be found." |
|
|
|
(defun indium-script-original-location (script location) |
|
|
|
"Use the sourcemap of SCRIPT to lookup its original LOCATION. |
|
|
|
If SCRIPT has no sourcemap, return LOCATION." |
|
|
|
(if (and indium-script-enable-sourcemaps |
|
|
|
(indium-script-has-sourcemap-p script)) |
|
|
|
(if-let ((script-file (indium-script-get-file script)) |
|
|
|
(sourcemap-file (indium-workspace-lookup-file-safe |
|
|
|
(expand-file-name (indium-script-sourcemap-url script) |
|
|
|
(file-name-directory script-file))))) |
|
|
|
(let* ((sourcemap (sourcemap-from-file sourcemap-file)) |
|
|
|
(original-location (indium-script--sourcemap-original-position-for |
|
|
|
(if indium-script-enable-sourcemaps |
|
|
|
(if-let ((sourcemap-file (indium-script-sourcemap-file script)) |
|
|
|
(sourcemap (sourcemap-from-file sourcemap-file)) |
|
|
|
(original-location (indium-script--sourcemap-original-position-for |
|
|
|
sourcemap |
|
|
|
:line (1+ (indium-location-line location)) |
|
|
|
:column (1+ (indium-location-column location)) |
|
|
|
:nearest t))) |
|
|
|
(if original-location |
|
|
|
(let ((file (expand-file-name (plist-get original-location :source) |
|
|
|
(file-name-directory script-file)))) |
|
|
|
(make-indium-location :file file |
|
|
|
:line (max 0 (1- (plist-get original-location :line))) |
|
|
|
:column (max 0 (1- (plist-get original-location :column))))) |
|
|
|
(progn |
|
|
|
(message "Could not locate original position from sourcemap!") |
|
|
|
location))) |
|
|
|
:nearest t)) |
|
|
|
(file (expand-file-name (plist-get original-location :source) |
|
|
|
(file-name-directory (indium-script-get-file script))))) |
|
|
|
(make-indium-location :file file |
|
|
|
:line (max 0 (1- (plist-get original-location :line))) |
|
|
|
:column (plist-get original-location :column)) |
|
|
|
(progn |
|
|
|
(message "The sourcemap file does not exist!") |
|
|
|
location)) |
|
|
|
location)) |
|
|
|
|
|
|
|
(defun indium-script-generated-location (location) |
|
|
|
"Return a generated location from the original LOCATION. |
|
|
|
|
|
|
|
If there is a parsed script for LOCATION's file, return LOCATION. |
|
|
|
Otherwise, if a sourcemap exists, generate a location using that |
|
|
|
sourcemap." |
|
|
|
(let ((file (indium-location-file location))) |
|
|
|
(if (indium-script-find-from-file file) |
|
|
|
location |
|
|
|
(if indium-script-enable-sourcemaps |
|
|
|
(or (seq-some (lambda (script) |
|
|
|
(if-let ((sourcemap-file (indium-script-sourcemap-file script)) |
|
|
|
(script-file (indium-script-get-file script)) |
|
|
|
(sourcemap (sourcemap-from-file sourcemap-file)) |
|
|
|
(generated-location (sourcemap-generated-position-for |
|
|
|
sourcemap |
|
|
|
:source (file-relative-name |
|
|
|
(indium-location-file location) |
|
|
|
(file-name-directory script-file)) |
|
|
|
:line (1+ (indium-location-line location)) |
|
|
|
:column 0 |
|
|
|
:nearest t))) |
|
|
|
(make-indium-location :file script-file |
|
|
|
:line (max 0 (1- (plist-get generated-location :line))) |
|
|
|
:column (plist-get generated-location :column)))) |
|
|
|
(indium-script-all-scripts-with-sourcemap)) |
|
|
|
location) |
|
|
|
location)))) |
|
|
|
|
|
|
|
(defun indium-script-generated-location-at-point () |
|
|
|
"Return a location for the position of POINT. |
|
|
|
If no location can be found, return nil." |
|
|
|
(indium-script-generated-location |
|
|
|
(make-indium-location :file buffer-file-name |
|
|
|
:line (1- (line-number-at-pos))))) |
|
|
|
|
|
|
|
;; TODO: wait for https://github.com/syohex/emacs-sourcemap/pull/6 to be merged |
|
|
|
(defun indium-script--sourcemap-original-position-for (sourcemap &rest props) |
|
|
|
"Lookup a position in SOURCEMAP based on PROPS. |
|
|
@ -136,7 +178,6 @@ PROPS should be a plist with a `:line' and `:column' key." |
|
|
|
:line (sourcemap-entry-original-line ret) |
|
|
|
:column (sourcemap-entry-original-column ret)))))) |
|
|
|
|
|
|
|
|
|
|
|
(memoize 'indium-script-original-location "2 minutes") |
|
|
|
|
|
|
|
(provide 'indium-script) |
|
|
|