2121
2222(require 'dash )
2323(require 'ht )
24-
2524(require 'lsp-mode )
2625
26+ (require 'lsp-dart-protocol )
27+
2728(defcustom lsp-dart-flutter-widget-guides t
2829 " Enable showing ui guides for flutter widgets hierarchy."
2930 :type 'boolean
6465 (end-of-line )
6566 (current-column )))
6667
67- (defun lsp-dart-flutter-widget-guide--outline->guide (outline )
68+ (lsp-defun lsp-dart-flutter-widget-guide--outline->guide ((&FlutterOutline :kind :children :range
69+ (&Range :start
70+ (&Position :line parent-line))))
6871 " Build a widget guide from an OUTLINE.
6972Return nil if the widget guilde does not apply."
70- (-let* (((&hash " children" " kind" " range" ) outline))
71- (when (string= kind " NEW_INSTANCE" )
72- (-let* ((parent-line (->> range (gethash " start" ) (gethash " line" )))
73- (children-start (unless (seq-empty-p children)
74- (->> children
75- (--map (->> it
76- (gethash " range" )
77- (gethash " start" )
78- (gethash " line" )))
79- (--filter (> it parent-line))))))
80- (when children-start
81- (let ((start-pos (lsp-dart-flutter-widget-guide--first-non-whitespace-pos parent-line)))
82- (->> children-start
83- (--map (ht (" start" start-pos)
84- (" end" (lsp-dart-flutter-widget-guide--first-non-whitespace-pos it))))
85- (-flatten))))))))
86-
87- (defun lsp-dart-flutter-widget-guide--outline->guides (outline )
73+ (when (string= kind " NEW_INSTANCE" )
74+ (-let* ((children-start (unless (seq-empty-p children)
75+ (->> children
76+ (-map (-lambda ((&Outline :range (&Range :start (&Position :line ))))
77+ line))
78+ (--filter (> it parent-line))))))
79+ (when children-start
80+ (let ((start-pos (lsp-dart-flutter-widget-guide--first-non-whitespace-pos parent-line)))
81+ (->> children-start
82+ (--map (ht (" start" start-pos)
83+ (" end" (lsp-dart-flutter-widget-guide--first-non-whitespace-pos it))))
84+ (-flatten)))))))
85+
86+ (lsp-defun lsp-dart-flutter-widget-guide--outline->guides ((outline &as &FlutterOutline :children ))
8887 " Build the widget guides from OUTLINE recursively."
89- (-let* (((&hash " children" ) outline))
90- (unless (seq-empty-p children)
91- (let ((ext-children (->> children
92- (--map (lsp-dart-flutter-widget-guide--outline->guides it))
93- (-non-nil)
94- (-flatten)))
95- (ext-outline (lsp-dart-flutter-widget-guide--outline->guide outline)))
96- (if ext-outline
97- (-concat ext-outline ext-children)
98- ext-children)))))
88+ (unless (seq-empty-p children)
89+ (let ((ext-children (->> children
90+ (--map (lsp-dart-flutter-widget-guide--outline->guides it))
91+ (-non-nil)
92+ (-flatten)))
93+ (ext-outline (lsp-dart-flutter-widget-guide--outline->guide outline)))
94+ (if ext-outline
95+ (-concat ext-outline ext-children)
96+ ext-children))))
9997
10098(defun lsp-dart-flutter-widget-guide--guides->guides-by-line (guides )
10199 " Convert a widget guide GUIDES to a map by line."
102100 (let ((guides-by-line (ht-create)))
103101 (seq-doseq (guide guides)
104- (-let* (((&hash " start" (&hash " line" start-line)
105- " end" (&hash " line" end-line)) guide))
102+ (-let (((&Range : start (&Position : line start-line)
103+ : end (&Position : line end-line)) guide))
106104 (while (<= start-line end-line)
107105 (if-let ((cur-guides (ht-get guides-by-line start-line)))
108106 (ht-set! guides-by-line start-line (append cur-guides (list guide)))
@@ -117,8 +115,8 @@ LAST-LINE-CHAR is the last column position of LINE.
117115ANCHOR is the anchor point of the widget guide at LINE."
118116 (let ((chars (make-list size lsp-dart-flutter-widget-guide-space)))
119117 (seq-doseq (guide guide-lines)
120- (-let* (((&hash " start" (&hash " character" start-char)
121- " end" (&hash " line" end-line " character" end-char)) guide)
118+ (-let* (((&Range : start (&Position : character start-char)
119+ : end (&Position : line end-line : character end-char)) guide)
122120 (start-char-at (nth start-char chars)))
123121 (if (not (= line end-line))
124122 (if (string= lsp-dart-flutter-widget-guide-space start-char-at)
@@ -133,31 +131,30 @@ ANCHOR is the anchor point of the widget guide at LINE."
133131 (setf (nth char chars) lsp-dart-flutter-widget-guide-horizontal-line)
134132 (setq chars (append chars (list lsp-dart-flutter-widget-guide-horizontal-line)))))
135133 (setq char (1+ char)))))))
136- (-let (((&hash " character" first-non-whitespace-index) (lsp-dart-flutter-widget-guide--first-non-whitespace-pos line)))
134+ (-let (((&Position : character first-non-whitespace-index) (lsp-dart-flutter-widget-guide--first-non-whitespace-pos line)))
137135 (->> chars
138136 (--map-indexed (if (and (>= it-index first-non-whitespace-index)
139137 (<= it-index last-line-char)) lsp-dart-flutter-widget-guide-space it))
140138 (--map-indexed (if (>= it-index anchor) it " " ))
141139 (--filter (not (string= " " it)))))))
142140
143- (defun lsp-dart-flutter-widget-guide-check (outline-params )
141+ (lsp- defun lsp-dart-flutter-widget-guide-check ((&FlutterOutlineNotification :uri : outline) )
144142 " Check if there is any widget guide on buffer from uri of OUTLINE-PARAMS."
145- (let* ((buffer (lsp--buffer-for-file (lsp--uri-to-path (gethash " uri" outline-params)))))
146- (when buffer
147- (with-current-buffer buffer
148- (remove-overlays (point-min ) (point-max ) 'category 'lsp-dart-flutter-widget-guide )
149- (let* ((guides (lsp-dart-flutter-widget-guide--outline->guides (gethash " outline" outline-params)))
150- (guides-by-line (lsp-dart-flutter-widget-guide--guides->guides-by-line guides)))
151- (ht-each (lambda (line guide-lines )
152- (let* ((first-guide-char (-min (--map (min (gethash " character" (gethash " start" it))
153- (gethash " character" (gethash " end" it))) guide-lines)))
154- (last-guide-char (-max (--map (max (gethash " character" (gethash " start" it))
155- (gethash " character" (gethash " end" it))) guide-lines)))
156- (last-line-char (lsp-dart-flutter-widget-guide--last-col-at line))
157- (anchor (max 0 (if (< last-line-char first-guide-char) 0 first-guide-char)))
158- (chars (lsp-dart-flutter-widget-guide--build-chars line guide-lines last-guide-char last-line-char anchor)))
159- (--each-indexed chars (lsp-dart-flutter-widget-guide--add-overlay-to buffer line (+ it-index anchor) it))))
160- guides-by-line))))))
143+ (-when-let (buffer (lsp--buffer-for-file (lsp--uri-to-path uri)))
144+ (with-current-buffer buffer
145+ (remove-overlays (point-min ) (point-max ) 'category 'lsp-dart-flutter-widget-guide )
146+ (let* ((guides (lsp-dart-flutter-widget-guide--outline->guides outline))
147+ (guides-by-line (lsp-dart-flutter-widget-guide--guides->guides-by-line guides)))
148+ (ht-each (lambda (line guide-lines )
149+ (let* ((first-guide-char (-min (--map (min (-> it lsp:range-start lsp:position-character)
150+ (-> it lsp:range-end lsp:position-character)) guide-lines)))
151+ (last-guide-char (-max (--map (max (-> it lsp:range-start lsp:position-character)
152+ (-> it lsp:range-end lsp:position-character)) guide-lines)))
153+ (last-line-char (lsp-dart-flutter-widget-guide--last-col-at line))
154+ (anchor (max 0 (if (< last-line-char first-guide-char) 0 first-guide-char)))
155+ (chars (lsp-dart-flutter-widget-guide--build-chars line guide-lines last-guide-char last-line-char anchor)))
156+ (--each-indexed chars (lsp-dart-flutter-widget-guide--add-overlay-to buffer line (+ it-index anchor) it))))
157+ guides-by-line)))))
161158
162159(provide 'lsp-dart-flutter-widget-guide )
163160; ;; lsp-dart-flutter-widget-guide.el ends here
0 commit comments