Skip to content

Commit d9ba2ce

Browse files
committed
Migrate widget guide
1 parent 975bed6 commit d9ba2ce

File tree

1 file changed

+49
-52
lines changed

1 file changed

+49
-52
lines changed

lsp-dart-flutter-widget-guide.el

Lines changed: 49 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
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
@@ -64,45 +65,42 @@
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.
6972
Return 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.
117115
ANCHOR 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

Comments
 (0)